* src/base/ftbitmap.c (FT_Bitmap_Convert): Improve.

This commit completes argument checks and adds support for different
flow directions.
This commit is contained in:
Werner Lemberg 2014-11-21 07:28:50 +01:00
parent 6de761744c
commit 644d6fab7e
2 changed files with 41 additions and 35 deletions

View File

@ -1,3 +1,10 @@
2014-11-21 Werner Lemberg <wl@gnu.org>
* src/base/ftbitmap.c (FT_Bitmap_Convert): Improve.
This commit completes argument checks and adds support for different
flow directions.
2014-11-21 Werner Lemberg <wl@gnu.org> 2014-11-21 Werner Lemberg <wl@gnu.org>
* src/base/ftbitmap.c (FT_Bitmap_Copy): Improve. * src/base/ftbitmap.c (FT_Bitmap_Copy): Improve.

View File

@ -471,12 +471,16 @@
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
FT_Memory memory; FT_Memory memory;
FT_Int source_pitch, target_pitch; FT_Byte* s;
FT_Byte* t;
if ( !library ) if ( !library )
return FT_THROW( Invalid_Library_Handle ); return FT_THROW( Invalid_Library_Handle );
if ( !source || !target )
return FT_THROW( Invalid_Argument );
memory = library->memory; memory = library->memory;
switch ( source->pixel_mode ) switch ( source->pixel_mode )
@ -489,7 +493,7 @@
case FT_PIXEL_MODE_LCD_V: case FT_PIXEL_MODE_LCD_V:
case FT_PIXEL_MODE_BGRA: case FT_PIXEL_MODE_BGRA:
{ {
FT_Int pad, old_target_pitch; FT_Int pad, old_target_pitch, target_pitch;
FT_ULong old_size; FT_ULong old_size;
@ -530,17 +534,20 @@
error = FT_THROW( Invalid_Argument ); error = FT_THROW( Invalid_Argument );
} }
source_pitch = source->pitch; s = source->buffer;
if ( source_pitch < 0 ) t = target->buffer;
source_pitch = -source_pitch;
/* take care of bitmap flow */
if ( source->pitch < 0 )
s -= source->pitch * ( source->rows - 1 );
if ( target->pitch < 0 )
t -= target->pitch * ( target->rows - 1 );
switch ( source->pixel_mode ) switch ( source->pixel_mode )
{ {
case FT_PIXEL_MODE_MONO: case FT_PIXEL_MODE_MONO:
{ {
FT_Byte* s = source->buffer; FT_UInt i;
FT_Byte* t = target->buffer;
FT_Int i;
target->num_grays = 2; target->num_grays = 2;
@ -549,7 +556,7 @@
{ {
FT_Byte* ss = s; FT_Byte* ss = s;
FT_Byte* tt = t; FT_Byte* tt = t;
FT_Int j; FT_UInt j;
/* get the full bytes */ /* get the full bytes */
@ -586,8 +593,8 @@
} }
} }
s += source_pitch; s += source->pitch;
t += target_pitch; t += target->pitch;
} }
} }
break; break;
@ -597,10 +604,8 @@
case FT_PIXEL_MODE_LCD: case FT_PIXEL_MODE_LCD:
case FT_PIXEL_MODE_LCD_V: case FT_PIXEL_MODE_LCD_V:
{ {
FT_Int width = source->width; FT_Int width = source->width;
FT_Byte* s = source->buffer; FT_UInt i;
FT_Byte* t = target->buffer;
FT_Int i;
target->num_grays = 256; target->num_grays = 256;
@ -609,8 +614,8 @@
{ {
FT_ARRAY_COPY( t, s, width ); FT_ARRAY_COPY( t, s, width );
s += source_pitch; s += source->pitch;
t += target_pitch; t += target->pitch;
} }
} }
break; break;
@ -618,9 +623,7 @@
case FT_PIXEL_MODE_GRAY2: case FT_PIXEL_MODE_GRAY2:
{ {
FT_Byte* s = source->buffer; FT_UInt i;
FT_Byte* t = target->buffer;
FT_Int i;
target->num_grays = 4; target->num_grays = 4;
@ -629,7 +632,7 @@
{ {
FT_Byte* ss = s; FT_Byte* ss = s;
FT_Byte* tt = t; FT_Byte* tt = t;
FT_Int j; FT_UInt j;
/* get the full bytes */ /* get the full bytes */
@ -661,8 +664,8 @@
} }
} }
s += source_pitch; s += source->pitch;
t += target_pitch; t += target->pitch;
} }
} }
break; break;
@ -670,9 +673,7 @@
case FT_PIXEL_MODE_GRAY4: case FT_PIXEL_MODE_GRAY4:
{ {
FT_Byte* s = source->buffer; FT_UInt i;
FT_Byte* t = target->buffer;
FT_Int i;
target->num_grays = 16; target->num_grays = 16;
@ -681,7 +682,7 @@
{ {
FT_Byte* ss = s; FT_Byte* ss = s;
FT_Byte* tt = t; FT_Byte* tt = t;
FT_Int j; FT_UInt j;
/* get the full bytes */ /* get the full bytes */
@ -700,8 +701,8 @@
if ( source->width & 1 ) if ( source->width & 1 )
tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 ); tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 );
s += source_pitch; s += source->pitch;
t += target_pitch; t += target->pitch;
} }
} }
break; break;
@ -709,9 +710,7 @@
case FT_PIXEL_MODE_BGRA: case FT_PIXEL_MODE_BGRA:
{ {
FT_Byte* s = source->buffer; FT_UInt i;
FT_Byte* t = target->buffer;
FT_Int i;
target->num_grays = 256; target->num_grays = 256;
@ -720,7 +719,7 @@
{ {
FT_Byte* ss = s; FT_Byte* ss = s;
FT_Byte* tt = t; FT_Byte* tt = t;
FT_Int j; FT_UInt j;
for ( j = source->width; j > 0; j-- ) for ( j = source->width; j > 0; j-- )
@ -731,8 +730,8 @@
tt += 1; tt += 1;
} }
s += source_pitch; s += source->pitch;
t += target_pitch; t += target->pitch;
} }
} }
break; break;