[truetype] Fix return values of GETINFO bytecode instruction.

* src/truetype/ttinterp.h (TT_ExecContextRec): New fields
`vertical_lcd' and `gray_cleartype'.

* src/truetype/ttgload.c (tt_loader_init): Initialize new fields.
Change `symmetrical smoothing' to TRUE, since FreeType produces
exactly this.

* src/truetype/ttinterp.c (Ins_GETINFO): Fix selector/return bit
values for symmetrical smoothing, namely 11/18.
Handle bits for vertical LCD subpixels (8/15) and Gray ClearType
(12/19).
This commit is contained in:
Werner Lemberg 2015-05-24 09:50:24 +02:00
parent 25a9bd9be0
commit 7f0994820b
4 changed files with 60 additions and 4 deletions

View File

@ -1,3 +1,19 @@
2015-05-23 Werner Lemberg <wl@gnu.org>
[truetype] Fix return values of GETINFO bytecode instruction.
* src/truetype/ttinterp.h (TT_ExecContextRec): New fields
`vertical_lcd' and `gray_cleartype'.
* src/truetype/ttgload.c (tt_loader_init): Initialize new fields.
Change `symmetrical smoothing' to TRUE, since FreeType produces
exactly this.
* src/truetype/ttinterp.c (Ins_GETINFO): Fix selector/return bit
values for symmetrical smoothing, namely 11/18.
Handle bits for vertical LCD subpixels (8/15) and Gray ClearType
(12/19).
2015-05-23 Werner Lemberg <wl@gnu.org>
[truetype] Minor.

View File

@ -2143,7 +2143,9 @@
FT_Bool compatible_widths;
FT_Bool symmetrical_smoothing;
FT_Bool bgr;
FT_Bool vertical_lcd;
FT_Bool subpixel_positioned;
FT_Bool gray_cleartype;
#endif
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
@ -2194,9 +2196,11 @@
#if 1
exec->compatible_widths = SPH_OPTION_SET_COMPATIBLE_WIDTHS;
exec->symmetrical_smoothing = FALSE;
exec->symmetrical_smoothing = TRUE;
exec->bgr = FALSE;
exec->vertical_lcd = FALSE;
exec->subpixel_positioned = TRUE;
exec->gray_cleartype = FALSE;
#else /* 0 */
exec->compatible_widths =
FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
@ -2207,9 +2211,15 @@
exec->bgr =
FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
TT_LOAD_BGR );
exec->vertical_lcd =
FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
TT_LOAD_VERTICAL_LCD );
exec->subpixel_positioned =
FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
TT_LOAD_SUBPIXEL_POSITIONED );
exec->gray_cleartype =
FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
TT_LOAD_GRAY_CLEARTYPE );
#endif /* 0 */
}

View File

@ -7286,6 +7286,14 @@
/* Opcode range: 0x88 */
/* Stack: uint32 --> uint32 */
/* */
/* XXX: UNDOCUMENTED: Selector bits higher than 9 are currently (May */
/* 2015) not documented in the OpenType specification. */
/* */
/* Selector bit 11 is incorrectly described as bit 8, while the */
/* real meaning of bit 8 (vertical LCD subpixels) stays */
/* undocumented. The same mistake can be found in Greg Hitchcock's */
/* whitepaper. */
/* */
static void
Ins_GETINFO( TT_ExecContext exc,
FT_Long* args )
@ -7371,12 +7379,12 @@
K |= 1 << 14;
/********************************/
/* SYMMETRICAL SMOOTHING */
/* VERTICAL LCD SUBPIXELS? */
/* Selector Bit: 8 */
/* Return Bit(s): 15 */
/* */
/* Functionality still needs to be added */
if ( ( args[0] & 256 ) != 0 && exc->symmetrical_smoothing )
if ( ( args[0] & 256 ) != 0 && exc->vertical_lcd )
K |= 1 << 15;
/********************************/
@ -7398,6 +7406,24 @@
/* Functionality still needs to be added */
if ( ( args[0] & 1024 ) != 0 && exc->subpixel_positioned )
K |= 1 << 17;
/********************************/
/* SYMMETRICAL SMOOTHING */
/* Selector Bit: 11 */
/* Return Bit(s): 18 */
/* */
/* Functionality still needs to be added */
if ( ( args[0] & 2048 ) != 0 && exc->symmetrical_smoothing )
K |= 1 << 18;
/********************************/
/* GRAY CLEARTYPE */
/* Selector Bit: 12 */
/* Return Bit(s): 19 */
/* */
/* Functionality still needs to be added */
if ( ( args[0] & 4096 ) != 0 && exc->gray_cleartype )
K |= 1 << 19;
}
}
}

View File

@ -257,13 +257,17 @@ FT_BEGIN_HEADER
/* subpixel hinting. On if gray */
/* or subpixel hinting is on. */
/* The following 4 aren't fully implemented but here for MS rasterizer */
/* The following 6 aren't fully implemented but here for MS rasterizer */
/* compatibility. */
FT_Bool compatible_widths; /* compatible widths? */
FT_Bool symmetrical_smoothing; /* symmetrical_smoothing? */
FT_Bool bgr; /* bgr instead of rgb? */
FT_Bool vertical_lcd; /* long side of LCD subpixel */
/* rectangles is horizontal */
FT_Bool subpixel_positioned; /* subpixel positioned */
/* (DirectWrite ClearType)? */
FT_Bool gray_cleartype; /* ClearType hinting but */
/* grayscale rendering */
FT_Int rasterizer_version; /* MS rasterizer version */