* src/base/ftbitmap.c (FT_Bitmap_Convert): small improvements to the

conversion function (mainly stupid optimization, because I like
	these... shame on me)

	* src/base/Jamfile: adding ftbitmap.c to the list of compiled files
This commit is contained in:
David Turner 2005-02-10 16:11:29 +00:00
parent adc7dd6ace
commit a61857a8e7
3 changed files with 157 additions and 126 deletions

View File

@ -4,6 +4,12 @@
dynamic array when loading a glyph from a PFR font. This fixes
bug #11921
* src/base/ftbitmap.c (FT_Bitmap_Convert): small improvements to the
conversion function (mainly stupid optimization, because I like
these... shame on me)
* src/base/Jamfile: adding ftbitmap.c to the list of compiled files
2005-02-10 Werner Lemberg <wl@gnu.org>
* builds/unix/freetype-config.in: Add new flag `--ftversion' to

View File

@ -10,7 +10,7 @@ SubDir FT2_TOP $(FT2_SRC_DIR) base ;
if $(FT2_MULTI)
{
_sources = ftutil ftdbgmem ftstream ftcalc fttrigon ftgloadr ftoutln
ftobjs ftnames ftrfork ;
ftobjs ftnames ftrfork ;
}
else
{
@ -24,7 +24,7 @@ SubDir FT2_TOP $(FT2_SRC_DIR) base ;
#
Library $(FT2_LIB) : ftsystem.c ftinit.c ftglyph.c ftmm.c ftbdf.c
ftbbox.c ftdebug.c ftxf86.c fttype1.c ftpfr.c
ftstroke.c ftwinfnt.c ftotval.c ;
ftstroke.c ftwinfnt.c ftotval.c ftbitmap.c ;
# Add Macintosh-specific file to the library when necessary.
#

View File

@ -46,8 +46,6 @@
{
FT_Error error = FT_Err_Ok;
FT_Memory memory;
FT_Int i, j, old_size;
FT_Byte *s, *ss, *t, *tt;
if ( !library )
@ -61,174 +59,201 @@
case FT_PIXEL_MODE_GRAY:
case FT_PIXEL_MODE_GRAY2:
case FT_PIXEL_MODE_GRAY4:
old_size = target->rows * target->pitch;
{
FT_Int pad;
FT_Long old_size;
target->pixel_mode = FT_PIXEL_MODE_GRAY;
target->rows = source->rows;
target->width = source->width;
target->pitch = ( source->width + alignment - 1 )
/ alignment * alignment;
old_size = target->rows * target->pitch;
if ( old_size < 0 )
old_size = -old_size;
if ( target->rows * target->pitch > old_size )
if ( FT_QREALLOC( target->buffer,
target->pixel_mode = FT_PIXEL_MODE_GRAY;
target->rows = source->rows;
target->width = source->width;
pad = 0;
if ( alignment > 0 )
{
pad = source->width % alignment;
if ( pad != 0 )
pad = alignment - pad;
}
target->pitch = source->width + pad;
if ( target->rows * target->pitch > old_size &&
FT_QREALLOC( target->buffer,
old_size, target->rows * target->pitch ) )
return error;
}
break;
default:
error = FT_Err_Invalid_Argument;
}
s = source->buffer;
t = target->buffer;
switch ( source->pixel_mode )
{
case FT_PIXEL_MODE_MONO:
target->num_grays = 2;
for ( i = 0; i < source->rows; i++ )
{
ss = s;
tt = t;
FT_Byte* s = source->buffer;
FT_Byte* t = target->buffer;
FT_Int i;
/* get the full bytes */
for ( j = 0; j < ( source->width >> 3 ); j++ )
target->num_grays = 2;
for ( i = source->rows; i > 0; i-- )
{
*(tt++) = (FT_Byte)( ( *ss & 0x80 ) >> 7 );
*(tt++) = (FT_Byte)( ( *ss & 0x40 ) >> 6 );
*(tt++) = (FT_Byte)( ( *ss & 0x20 ) >> 5 );
*(tt++) = (FT_Byte)( ( *ss & 0x10 ) >> 4 );
*(tt++) = (FT_Byte)( ( *ss & 0x08 ) >> 3 );
*(tt++) = (FT_Byte)( ( *ss & 0x04 ) >> 2 );
*(tt++) = (FT_Byte)( ( *ss & 0x02 ) >> 1 );
*(tt++) = (FT_Byte)( *ss & 0x01 );
FT_Byte* ss = s;
FT_Byte* tt = t;
FT_Int j;
ss++;
/* get the full bytes */
for ( j = source->width >> 3; j > 0; j-- )
{
FT_Int val = ss[0]; /* avoid a byte->int cast on each line */
tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 );
tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 );
tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 );
tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 );
tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 );
tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 );
tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 );
tt[7] = (FT_Byte)( val & 0x01 );
tt += 8;
ss += 1;
}
/* get remaining pixels (if any) */
j = source->width & 7;
if ( j > 0 )
{
FT_Int val = *ss;
for ( ; j > 0; j-- )
{
tt[0] = (FT_Byte)(( val & 0x80 ) >> 7);
val <<= 1;
tt += 1;
}
}
s += source->pitch;
t += target->pitch;
}
/* get remaining pixels (if any) */
switch ( source->width & 7 )
{
case 7:
*(tt++) = (FT_Byte)( ( *ss & 0x80 ) >> 7 );
/* fall through */
case 6:
*(tt++) = (FT_Byte)( ( *ss & 0x40 ) >> 6 );
/* fall through */
case 5:
*(tt++) = (FT_Byte)( ( *ss & 0x20 ) >> 5 );
/* fall through */
case 4:
*(tt++) = (FT_Byte)( ( *ss & 0x10 ) >> 4 );
/* fall through */
case 3:
*(tt++) = (FT_Byte)( ( *ss & 0x08 ) >> 3 );
/* fall through */
case 2:
*(tt++) = (FT_Byte)( ( *ss & 0x04 ) >> 2 );
/* fall through */
case 1:
*(tt++) = (FT_Byte)( ( *ss & 0x02 ) >> 1 );
/* fall through */
case 0:
break;
}
s += source->pitch;
t += target->pitch;
}
break;
case FT_PIXEL_MODE_GRAY:
target->num_grays = 256;
for ( i = 0; i < source->rows; i++ )
{
ss = s;
tt = t;
FT_Int width = source->width;
FT_Byte* s = source->buffer;
FT_Byte* t = target->buffer;
FT_Int s_pitch = source->pitch;
FT_Int t_pitch = target->pitch;
FT_Int i;
for ( j = 0; j < source->width; j++ )
*(tt++) = *(ss++);
target->num_grays = 256;
s += source->pitch;
t += target->pitch;
for ( i = source->rows; i > 0; i-- )
{
FT_ARRAY_COPY( t, s, width );
s += s_pitch;
t += t_pitch;
}
}
break;
case FT_PIXEL_MODE_GRAY2:
target->num_grays = 4;
for ( i = 0; i < source->rows; i++ )
{
ss = s;
tt = t;
FT_Byte* s = source->buffer;
FT_Byte* t = target->buffer;
FT_Int i;
/* get the full bytes */
for ( j = 0; j < ( source->width >> 2 ); j++ )
target->num_grays = 4;
for ( i = source->rows; i > 0; i-- )
{
*(tt++) = (FT_Byte)( ( *ss & 0xC0 ) >> 6 );
*(tt++) = (FT_Byte)( ( *ss & 0x30 ) >> 4 );
*(tt++) = (FT_Byte)( ( *ss & 0x0C ) >> 2 );
*(tt++) = (FT_Byte)( *ss & 0x03 );
FT_Byte* ss = s;
FT_Byte* tt = t;
FT_Int j;
ss++;
/* get the full bytes */
for ( j = source->width >> 2; j > 0; j-- )
{
FT_Int val = ss[0];
tt[0] = (FT_Byte)( (val & 0xC0) >> 6 );
tt[1] = (FT_Byte)( (val & 0x30) >> 4 );
tt[2] = (FT_Byte)( (val & 0x0C) >> 2 );
tt[3] = (FT_Byte)( (val & 0x03) );
ss += 1;
tt += 4;
}
j = source->width & 3;
if ( j > 0 )
{
FT_Int val = ss[0];
for ( ; j > 0; j-- )
{
tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 );
val <<= 2;
tt += 1;
}
}
s += source->pitch;
t += target->pitch;
}
/* get remaining pixels (if any) */
switch ( source->width & 3 )
{
case 3:
*(tt++) = (FT_Byte)( ( *ss & 0xC0 ) >> 6 );
/* fall through */
case 2:
*(tt++) = (FT_Byte)( ( *ss & 0x30 ) >> 4 );
/* fall through */
case 1:
*(tt++) = (FT_Byte)( ( *ss & 0x0C ) >> 2 );
/* fall through */
case 0:
break;
}
s += source->pitch;
t += target->pitch;
}
break;
case FT_PIXEL_MODE_GRAY4:
target->num_grays = 16;
for ( i = 0; i < source->rows; i++ )
{
ss = s;
tt = t;
FT_Byte* s = source->buffer;
FT_Byte* t = target->buffer;
FT_Int i;
/* get the full bytes */
for ( j = 0; j < ( source->width >> 1 ); j++ )
target->num_grays = 16;
for ( i = source->rows; i > 0; i-- )
{
*(tt++) = (FT_Byte)( ( *ss & 0xF0 ) >> 4 );
*(tt++) = (FT_Byte)( *ss & 0x0F );
FT_Byte* ss = s;
FT_Byte* tt = t;
FT_Int j;
ss++;
/* get the full bytes */
for ( j = source->width >> 1; j > 0; j-- )
{
FT_Int val = ss[0];
tt[0] = (FT_Byte)( (val & 0xF0) >> 4 );
tt[1] = (FT_Byte)( (val & 0x0F) );
ss += 1;
tt += 2;
}
if ( source->width & 1 )
tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 );
s += source->pitch;
t += target->pitch;
}
/* get remaining pixels (if any) */
switch ( source->width & 1 )
{
case 1:
*(tt++) = (FT_Byte)( ( *ss & 0xF0 ) >> 4 );
/* fall through */
case 0:
break;
}
s += source->pitch;
t += target->pitch;
}
break;
default:
;
}
return error;