[sfnt] Support sbix graphicType 'flip'.
* src/sfnt/ttsbit.c (tt_face_load_sbix_image): Currently undocumented by Apple, this flips the bitmap data horizontally. It is used on macOS in Apple Color Emoji; 19.4d6e1; 2024-02-05 (file `Apple Color Emoji.ttc`). Fixes issue #1282.
This commit is contained in:
parent
aaa559eaca
commit
98283cb30f
@ -1462,6 +1462,7 @@
|
||||
FT_Int originOffsetX, originOffsetY;
|
||||
FT_Tag graphicType;
|
||||
FT_Int recurse_depth = 0;
|
||||
FT_Bool flipped = FALSE;
|
||||
|
||||
FT_Error error;
|
||||
FT_Byte* p;
|
||||
@ -1517,12 +1518,17 @@
|
||||
|
||||
switch ( graphicType )
|
||||
{
|
||||
case FT_MAKE_TAG( 'f', 'l', 'i', 'p' ):
|
||||
case FT_MAKE_TAG( 'd', 'u', 'p', 'e' ):
|
||||
if ( recurse_depth < 4 )
|
||||
{
|
||||
glyph_index = FT_GET_USHORT();
|
||||
FT_FRAME_EXIT();
|
||||
recurse_depth++;
|
||||
|
||||
if ( graphicType == FT_MAKE_TAG( 'f', 'l', 'i', 'p' ) )
|
||||
flipped = TRUE;
|
||||
|
||||
goto retry;
|
||||
}
|
||||
error = FT_THROW( Invalid_File_Format );
|
||||
@ -1540,6 +1546,42 @@
|
||||
glyph_end - glyph_start - 8,
|
||||
TRUE,
|
||||
metrics_only );
|
||||
if ( !error && flipped )
|
||||
{
|
||||
FT_UInt32* curr_pos = (FT_UInt32*)map->buffer;
|
||||
|
||||
/* `Load_SBit_Png` always returns a pixmap with 32 bits per pixel */
|
||||
/* and no extra pitch bytes. */
|
||||
FT_UInt32 width = (FT_UInt32)( map->width );
|
||||
FT_UInt32 half_width = (FT_UInt32)( map->width / 2 );
|
||||
|
||||
FT_UInt y;
|
||||
|
||||
|
||||
for ( y = 0; y < map->rows; y++ )
|
||||
{
|
||||
FT_UInt32* left = curr_pos;
|
||||
FT_UInt32* right = curr_pos + width - 1;
|
||||
|
||||
FT_UInt32 x;
|
||||
|
||||
|
||||
for ( x = 0; x < half_width; x++ )
|
||||
{
|
||||
FT_UInt32 value;
|
||||
|
||||
|
||||
value = *right;
|
||||
*right = *left;
|
||||
*left = value;
|
||||
|
||||
left++;
|
||||
right--;
|
||||
}
|
||||
|
||||
curr_pos += width;
|
||||
}
|
||||
}
|
||||
#else
|
||||
error = FT_THROW( Unimplemented_Feature );
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user