905 final_ury = FT_MAX( source_ury, target_ury );
906
907 final_width = ( final_urx - final_llx ) >> 6;
908 final_rows = ( final_ury - final_lly ) >> 6;
909
910 #ifdef FT_DEBUG_LEVEL_TRACE
911 FT_TRACE5(( "FT_Bitmap_Blend:\n"
912 " source bitmap: (%d, %d) -- (%d, %d); %d x %d\n",
913 source_llx / 64, source_lly / 64,
914 source_urx / 64, source_ury / 64,
915 source_->width, source_->rows ));
916
917 if ( target->width && target->rows )
918 FT_TRACE5(( " target bitmap: (%d, %d) -- (%d, %d); %d x %d\n",
919 target_llx / 64, target_lly / 64,
920 target_urx / 64, target_ury / 64,
921 target->width, target->rows ));
922 else
923 FT_TRACE5(( " target bitmap: empty\n" ));
924
925 FT_TRACE5(( " final bitmap: (%d, %d) -- (%d, %d); %d x %d\n",
926 final_llx / 64, final_lly / 64,
927 final_urx / 64, final_ury / 64,
928 final_width, final_rows ));
929 #endif /* FT_DEBUG_LEVEL_TRACE */
930
931 /* for blending, set offset vector of final bitmap */
932 /* temporarily to (0,0) */
933 source_llx -= final_llx;
934 source_lly -= final_lly;
935
936 if ( target->width && target->rows )
937 {
938 target_llx -= final_llx;
939 target_lly -= final_lly;
940 }
941
942 /* set up target bitmap */
943 if ( target->pixel_mode == FT_PIXEL_MODE_NONE )
944 {
945 /* create new empty bitmap */
946 target->width = final_width;
947 target->rows = final_rows;
948 target->pixel_mode = FT_PIXEL_MODE_BGRA;
949 target->pitch = (int)final_width * 4;
950 target->num_grays = 256;
954 FT_TRACE5(( "FT_Blend_Bitmap: target bitmap too large (%d x %d)\n",
955 final_width, final_rows ));
956 return FT_THROW( Invalid_Argument );
957 }
958
959 if ( FT_ALLOC( target->buffer, target->pitch * (int)target->rows ) )
960 return error;
961
962 free_target_bitmap_on_error = 1;
963 }
964 else if ( target->width != final_width ||
965 target->rows != final_rows )
966 {
967 /* adjust old bitmap to enlarged size */
968 int pitch, new_pitch;
969
970 unsigned char* buffer = NULL;
971
972
973 pitch = target->pitch;
974 if ( pitch < 0 )
975 pitch = -pitch;
976
977 new_pitch = (int)final_width * 4;
978
979 if ( FT_LONG_MAX / new_pitch < (int)final_rows )
980 {
981 FT_TRACE5(( "FT_Blend_Bitmap: target bitmap too large (%d x %d)\n",
982 final_width, final_rows ));
983 return FT_THROW( Invalid_Argument );
984 }
985
986 /* TODO: provide an in-buffer solution for large bitmaps */
987 /* to avoid allocation of a new buffer */
988 if ( FT_ALLOC( buffer, new_pitch * (int)final_rows ) )
989 goto Error;
990
991 /* copy data to new buffer */
992 x = target_llx >> 6;
993 y = target_lly >> 6;
|
905 final_ury = FT_MAX( source_ury, target_ury );
906
907 final_width = ( final_urx - final_llx ) >> 6;
908 final_rows = ( final_ury - final_lly ) >> 6;
909
910 #ifdef FT_DEBUG_LEVEL_TRACE
911 FT_TRACE5(( "FT_Bitmap_Blend:\n"
912 " source bitmap: (%d, %d) -- (%d, %d); %d x %d\n",
913 source_llx / 64, source_lly / 64,
914 source_urx / 64, source_ury / 64,
915 source_->width, source_->rows ));
916
917 if ( target->width && target->rows )
918 FT_TRACE5(( " target bitmap: (%d, %d) -- (%d, %d); %d x %d\n",
919 target_llx / 64, target_lly / 64,
920 target_urx / 64, target_ury / 64,
921 target->width, target->rows ));
922 else
923 FT_TRACE5(( " target bitmap: empty\n" ));
924
925 if ( final_width && final_rows )
926 FT_TRACE5(( " final bitmap: (%d, %d) -- (%d, %d); %d x %d\n",
927 final_llx / 64, final_lly / 64,
928 final_urx / 64, final_ury / 64,
929 final_width, final_rows ));
930 else
931 FT_TRACE5(( " final bitmap: empty\n" ));
932 #endif /* FT_DEBUG_LEVEL_TRACE */
933
934 if ( !( final_width && final_rows ) )
935 return FT_Err_Ok; /* nothing to do */
936
937 /* for blending, set offset vector of final bitmap */
938 /* temporarily to (0,0) */
939 source_llx -= final_llx;
940 source_lly -= final_lly;
941
942 if ( target->width && target->rows )
943 {
944 target_llx -= final_llx;
945 target_lly -= final_lly;
946 }
947
948 /* set up target bitmap */
949 if ( target->pixel_mode == FT_PIXEL_MODE_NONE )
950 {
951 /* create new empty bitmap */
952 target->width = final_width;
953 target->rows = final_rows;
954 target->pixel_mode = FT_PIXEL_MODE_BGRA;
955 target->pitch = (int)final_width * 4;
956 target->num_grays = 256;
960 FT_TRACE5(( "FT_Blend_Bitmap: target bitmap too large (%d x %d)\n",
961 final_width, final_rows ));
962 return FT_THROW( Invalid_Argument );
963 }
964
965 if ( FT_ALLOC( target->buffer, target->pitch * (int)target->rows ) )
966 return error;
967
968 free_target_bitmap_on_error = 1;
969 }
970 else if ( target->width != final_width ||
971 target->rows != final_rows )
972 {
973 /* adjust old bitmap to enlarged size */
974 int pitch, new_pitch;
975
976 unsigned char* buffer = NULL;
977
978
979 pitch = target->pitch;
980
981 if ( pitch < 0 )
982 pitch = -pitch;
983
984 new_pitch = (int)final_width * 4;
985
986 if ( FT_LONG_MAX / new_pitch < (int)final_rows )
987 {
988 FT_TRACE5(( "FT_Blend_Bitmap: target bitmap too large (%d x %d)\n",
989 final_width, final_rows ));
990 return FT_THROW( Invalid_Argument );
991 }
992
993 /* TODO: provide an in-buffer solution for large bitmaps */
994 /* to avoid allocation of a new buffer */
995 if ( FT_ALLOC( buffer, new_pitch * (int)final_rows ) )
996 goto Error;
997
998 /* copy data to new buffer */
999 x = target_llx >> 6;
1000 y = target_lly >> 6;
|