From 355e9197462d03dc798117b6037cff681ab8a1c7 Mon Sep 17 00:00:00 2001 From: Hugh McMaster Date: Thu, 6 Jul 2023 21:07:16 +1000 Subject: [PATCH 01/28] [gzip] Don't compile internal zlib development files when using system zlib. `src/gzip/rules.mk` compiles the internal zlib sources even when using the zlib development files provided by a host system. If the internal zlib development files are not present, FreeType fails to build from source. This patch ensures the internal zlib development files are only prerequisites when not using zlib development files on a host system. * src/gzip/rules.mk (GZIP_DRV_SRCS): Define conditionally. --- src/gzip/rules.mk | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/gzip/rules.mk b/src/gzip/rules.mk index 050e14705..c76eacb1a 100644 --- a/src/gzip/rules.mk +++ b/src/gzip/rules.mk @@ -36,24 +36,23 @@ endif # # All source and header files get loaded by `ftgzip.c' only if SYSTEM_ZLIB # is not defined (regardless whether we have a `single' or a `multi' build). -# However, it doesn't harm if we add everything as a dependency -# unconditionally. # -GZIP_DRV_SRCS := $(GZIP_DIR)/adler32.c \ - $(GZIP_DIR)/crc32.c \ - $(GZIP_DIR)/crc32.h \ - $(GZIP_DIR)/ftzconf.h \ - $(GZIP_DIR)/inffast.c \ - $(GZIP_DIR)/inffast.h \ - $(GZIP_DIR)/inffixed.h \ - $(GZIP_DIR)/inflate.c \ - $(GZIP_DIR)/inflate.h \ - $(GZIP_DIR)/inftrees.c \ - $(GZIP_DIR)/inftrees.h \ - $(GZIP_DIR)/zlib.h \ - $(GZIP_DIR)/zutil.c \ - $(GZIP_DIR)/zutil.h - +ifeq ($(SYSTEM_ZLIB),) + GZIP_DRV_SRCS := $(GZIP_DIR)/adler32.c \ + $(GZIP_DIR)/crc32.c \ + $(GZIP_DIR)/crc32.h \ + $(GZIP_DIR)/ftzconf.h \ + $(GZIP_DIR)/inffast.c \ + $(GZIP_DIR)/inffast.h \ + $(GZIP_DIR)/inffixed.h \ + $(GZIP_DIR)/inflate.c \ + $(GZIP_DIR)/inflate.h \ + $(GZIP_DIR)/inftrees.c \ + $(GZIP_DIR)/inftrees.h \ + $(GZIP_DIR)/zlib.h \ + $(GZIP_DIR)/zutil.c \ + $(GZIP_DIR)/zutil.h +endif # gzip driver object(s) # From dec2743e6a2a40cddfc8a9892895cb4f861e1eeb Mon Sep 17 00:00:00 2001 From: Hin-Tak Leung Date: Fri, 7 Jul 2023 19:24:48 +0100 Subject: [PATCH 02/28] * src/truetype/ttgload.c (TT_Hint_Glyph): More mostly cosmetic update. This is a follow-up to commit 49c74ac02, which creates a new local variable "exec = loader->exec", and shortening a lot of "loader->exec". This commit does two more such changes missed in that first commit. Signed-off-by: Hin-Tak Leung --- src/truetype/ttgload.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c index 5f15a7f4d..d538e8ee8 100644 --- a/src/truetype/ttgload.c +++ b/src/truetype/ttgload.c @@ -820,7 +820,7 @@ FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points ); /* Reset graphics state. */ - loader->exec->GS = loader->size->GS; + exec->GS = loader->size->GS; /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */ /* completely refer to the (already) hinted subglyphs. */ @@ -860,7 +860,7 @@ exec->is_composite = is_composite; exec->pts = *zone; - error = TT_Run_Context( loader->exec ); + error = TT_Run_Context( exec ); if ( error && exec->pedantic_hinting ) return error; From 26a7f0478b95a4da3551072a6c70a77187556f8c Mon Sep 17 00:00:00 2001 From: Skef Iterum Date: Tue, 11 Jul 2023 01:40:25 -0700 Subject: [PATCH 03/28] [cff] Make blend operator work with floats in private dicts. The CFF2 blend operator takes N default values and corresponding sets of deltas and pushes N values specific to a designspace location. CFF has a floating point numeric type and the FreeType blending code was not converting those into its internal 16.16 Fixed type format. Fixes #1243. * src/cff/cffparse.c (do_fixed): Handle floating point numbers. Also fix scaling overflow check for integer-to-fixed conversion. * src/cff/cffload.c (cff_blend_doBlend): Updated. --- src/cff/cffload.c | 7 ++++--- src/cff/cffparse.c | 20 +++++++++++++++++++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/cff/cffload.c b/src/cff/cffload.c index f96002ec0..bee89f0c6 100644 --- a/src/cff/cffload.c +++ b/src/cff/cffload.c @@ -1364,11 +1364,12 @@ FT_UInt32 sum; - /* convert inputs to 16.16 fixed-point */ - sum = cff_parse_num( parser, &parser->stack[i + base] ) * 0x10000; + /* convert inputs to 16.16 fixed point */ + sum = cff_parse_fixed( parser, &parser->stack[i + base] ); for ( j = 1; j < blend->lenBV; j++ ) - sum += cff_parse_num( parser, &parser->stack[delta++] ) * *weight++; + sum += FT_MulFix( cff_parse_fixed( parser, &parser->stack[delta++] ), + *weight++ ); /* point parser stack to new value on blend_stack */ parser->stack[i + base] = subFont->blend_top; diff --git a/src/cff/cffparse.c b/src/cff/cffparse.c index c850dfc61..f8270aa52 100644 --- a/src/cff/cffparse.c +++ b/src/cff/cffparse.c @@ -499,6 +499,24 @@ { if ( **d == 30 ) return cff_parse_real( *d, parser->limit, scaling, NULL ); + else if ( **d == 255 ) + { + FT_Fixed val = ( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) | + ( (FT_UInt32)*( d[0] + 2 ) << 16 ) | + ( (FT_UInt32)*( d[0] + 3 ) << 8 ) | + (FT_UInt32)*( d[0] + 4 ) ) ); + + if ( scaling ) + { + if ( FT_ABS( val ) > power_ten_limits[scaling] ) + { + FT_TRACE4(( "!!!OVERFLOW:!!!" )); + return val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL; + } + val *= power_tens[scaling]; + } + return val; + } else { FT_Long val = cff_parse_integer( *d, parser->limit ); @@ -506,7 +524,7 @@ if ( scaling ) { - if ( FT_ABS( val ) > power_ten_limits[scaling] ) + if ( ( FT_ABS( val ) << 16 ) > power_ten_limits[scaling] ) { val = val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL; goto Overflow; From 85167dbd508c95cc923d36c0be8a602991c6e43a Mon Sep 17 00:00:00 2001 From: Ben Wagner Date: Thu, 13 Jul 2023 16:49:34 -0400 Subject: [PATCH 04/28] [woff2] Remove sfnt size guess check In WOFF the `totalSfntSize` must be correct, however in WOFF2 this value is now just a hint and a conforming implementation must not reject otherwise valid data if the `totalSfntSize` turns out not to be exact. * src/sfnt/sfwoff2.c (woff2_open_font): remove check that uncompressed woff2 data would fit in the sfnt size guess. Fixes: #1235 --- src/sfnt/sfwoff2.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/sfnt/sfwoff2.c b/src/sfnt/sfwoff2.c index 49ad5cc81..fecae276c 100644 --- a/src/sfnt/sfwoff2.c +++ b/src/sfnt/sfwoff2.c @@ -2257,13 +2257,6 @@ goto Exit; } - if ( woff2.uncompressed_size > sfnt_size ) - { - FT_ERROR(( "woff2_open_font: SFNT table lengths are too large.\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - /* Allocate memory for uncompressed table data. */ if ( FT_QALLOC( uncompressed_buf, woff2.uncompressed_size ) || FT_FRAME_ENTER( woff2.totalCompressedSize ) ) From 3c92e7bfc21289a53a748469f6c420bdd6a8941d Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Fri, 14 Jul 2023 18:58:55 +0200 Subject: [PATCH 05/28] [cff] Fix compiler warning. * src/cff/cffparse.c, src/cff/cffparse.h: Make `cff_parse_fixed` a local function. --- src/cff/cffparse.c | 2 +- src/cff/cffparse.h | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cff/cffparse.c b/src/cff/cffparse.c index f8270aa52..3b076704c 100644 --- a/src/cff/cffparse.c +++ b/src/cff/cffparse.c @@ -554,7 +554,7 @@ /* read a floating point number, either integer or real */ - static FT_Fixed + FT_LOCAL_DEF( FT_Fixed ) cff_parse_fixed( CFF_Parser parser, FT_Byte** d ) { diff --git a/src/cff/cffparse.h b/src/cff/cffparse.h index b6378a8e8..418caacc6 100644 --- a/src/cff/cffparse.h +++ b/src/cff/cffparse.h @@ -76,6 +76,10 @@ FT_BEGIN_HEADER cff_parse_num( CFF_Parser parser, FT_Byte** d ); + FT_LOCAL( FT_Fixed ) + cff_parse_fixed( CFF_Parser parser, + FT_Byte** d ); + FT_LOCAL( FT_Error ) cff_parser_init( CFF_Parser parser, FT_UInt code, From 336503dfd73d0370b3c90f12582d86d832ddedc1 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Sun, 16 Jul 2023 07:36:01 +0200 Subject: [PATCH 06/28] [woff2] Avoid allocation bomb. This is a fix for commit 85167dbd5, reported as https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=60615 * src/sfnt/sfwoff2.c (MAX_SFNT_SIZE): New macro. (woff2_open_font): Use it to limit the maximum size of an uncompressed WOFF2 font. --- src/sfnt/sfwoff2.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/sfnt/sfwoff2.c b/src/sfnt/sfwoff2.c index fecae276c..7dec540b4 100644 --- a/src/sfnt/sfwoff2.c +++ b/src/sfnt/sfwoff2.c @@ -36,6 +36,8 @@ #undef FT_COMPONENT #define FT_COMPONENT sfwoff2 + /* An arbitrary, heuristic size limit (67MByte) for expanded WOFF2 data. */ +#define MAX_SFNT_SIZE ( 1 << 26 ) #define READ_255USHORT( var ) FT_SET_ERROR( Read255UShort( stream, &var ) ) @@ -2180,9 +2182,8 @@ else sfnt_size = woff2.totalSfntSize; - /* Value 1<<26 = 67108864 is heuristic. */ - if (sfnt_size >= (1 << 26)) - sfnt_size = 1 << 26; + if ( sfnt_size >= MAX_SFNT_SIZE ) + sfnt_size = MAX_SFNT_SIZE; #ifdef FT_DEBUG_LEVEL_TRACE if ( sfnt_size != woff2.totalSfntSize ) @@ -2257,6 +2258,17 @@ goto Exit; } + /* We must not blindly trust `uncompressed_size` since its */ + /* value might be corrupted. If it is too large, reject the */ + /* font. In other words, we don't accept a WOFF2 font that */ + /* expands to something larger than MAX_SFNT_SIZE. If ever */ + /* necessary, this limit can be easily adjusted. */ + if ( woff2.uncompressed_size > MAX_SFNT_SIZE ) + { + FT_ERROR(( "Uncompressed font too large.\n" )); + return FT_THROW( Array_Too_Large ); + } + /* Allocate memory for uncompressed table data. */ if ( FT_QALLOC( uncompressed_buf, woff2.uncompressed_size ) || FT_FRAME_ENTER( woff2.totalCompressedSize ) ) From dd3c9c5fecb163b7aa06ef115adb9274d4c9192a Mon Sep 17 00:00:00 2001 From: Ben Wagner Date: Tue, 18 Jul 2023 13:25:57 -0400 Subject: [PATCH 07/28] [woff2] Clean up on large brotli expansion * src/sfnt/sfwoff2.c (woff2_open_font): set error and goto cleanup Fixes: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=60711 --- src/sfnt/sfwoff2.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sfnt/sfwoff2.c b/src/sfnt/sfwoff2.c index 7dec540b4..2be44a347 100644 --- a/src/sfnt/sfwoff2.c +++ b/src/sfnt/sfwoff2.c @@ -2266,7 +2266,8 @@ if ( woff2.uncompressed_size > MAX_SFNT_SIZE ) { FT_ERROR(( "Uncompressed font too large.\n" )); - return FT_THROW( Array_Too_Large ); + error = FT_THROW( Array_Too_Large ); + goto Exit; } /* Allocate memory for uncompressed table data. */ From e8aa5af936e55ab301b056ea6322571b65e845cf Mon Sep 17 00:00:00 2001 From: Jouk Jansen Date: Wed, 19 Jul 2023 13:34:45 +0200 Subject: [PATCH 08/28] vms_make.com: Add `/warn=noinfo` to `CFLAGS`. This reduces enormously the informationals while compiling on x86_64 (i.e., which `.h` file is inluded form where). --- vms_make.com | 96 ++++++++++++++++++++++++++-------------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/vms_make.com b/vms_make.com index a7696e3bf..2c792145e 100644 --- a/vms_make.com +++ b/vms_make.com @@ -268,10 +268,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + cc$(CFLAGS)/warn=noinfo/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -310,10 +310,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.autofit]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -351,10 +351,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.builds.vms],[--.include],[--.src.base]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -427,7 +427,7 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.bdf]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map cc$(CFLAGS)/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ @@ -468,7 +468,7 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cache])/nowarn .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map cc$(CFLAGS)/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ @@ -512,10 +512,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cff]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -553,10 +553,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cid]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -594,10 +594,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.gxvalid]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -638,10 +638,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.gzip]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -684,10 +684,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.bzip2]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -728,10 +728,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.lzw]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -769,10 +769,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.otvalid]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -822,10 +822,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.pcf]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -863,10 +863,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.pfr]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -904,10 +904,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psaux]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -945,10 +945,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psnames]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -986,10 +986,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psnames]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -1027,10 +1027,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.raster]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -1068,10 +1068,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.sfnt]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -1109,7 +1109,7 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.smooth]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map cc$(CFLAGS)/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ @@ -1150,7 +1150,7 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.svg]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map cc$(CFLAGS)/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ @@ -1191,10 +1191,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.truetype]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -1232,10 +1232,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type1]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -1275,10 +1275,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type1]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -1318,10 +1318,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type42]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* @@ -1359,10 +1359,10 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.winfonts]) .c.obj : - cc$(CFLAGS)/point=32/list/show=all $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=disable=(MAYLOSEDATA3)/point=64\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* From 5769f13a6b9fafa3840726f06dde07e755501a16 Mon Sep 17 00:00:00 2001 From: Jouk Jansen Date: Wed, 19 Jul 2023 13:37:48 +0200 Subject: [PATCH 09/28] vms_make.com: Make use of additional libraries optional. Check whether `.olb` files are present. Also check for the HarfBuzz library. --- vms_make.com | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/vms_make.com b/vms_make.com index 2c792145e..8d761d264 100644 --- a/vms_make.com +++ b/vms_make.com @@ -74,16 +74,26 @@ $! $! $! Pull in external libraries $! +$ have_png = f$search("sys$library:libpng.olb/lib") .nes. "" +$ have_bz2 = f$search("sys$library:libbz2.olb") .nes. "" +$ have_z = f$search("sys$library:libpng.olb") .nes. "" +$ have_harfbuzz = f$search("") .nes. "sys$library:libharfbuzz.olb/lib" +$! $ create libs.opt $ open/write libsf libs.opt -$ write libsf "sys$library:libpng.olb/lib" -$ write libsf "sys$library:libbz2.olb/lib" -$ write libsf "sys$library:libz.olb/lib" +$ if ( have_harfbuzz ) then write libsf "sys$library:libharfbuzz.olb/lib" +$ if ( have_png ) then write libsf "sys$library:libpng.olb/lib" +$ if ( have_bz2 ) then write libsf "sys$library:libbz2.olb/lib" +$ if ( have_z ) then write libsf "sys$library:libz.olb/lib" $ close libsf $! $! Create objects $! -$ libdefs = "FT2_BUILD_LIBRARY,FT_CONFIG_OPTION_OLD_INTERNALS,FT_CONFIG_OPTION_USE_BZIP2=1,FT_CONFIG_OPTION_USE_PNG=1,FT_CONFIG_OPTION_SYSTEM_ZLIB=1" +$ libdefs = "FT2_BUILD_LIBRARY,FT_CONFIG_OPTION_OLD_INTERNALS" +$ if ( have_bz2 ) then libdef=libdefs+",FT_CONFIG_OPTION_USE_BZIP2=1" +$ if ( have_png ) then libdef=libdefs+",FT_CONFIG_OPTION_USE_PNG=1" +$ if ( have_z ) then libdef=libdefs+",FT_CONFIG_OPTION_USE_ZLIB=1" +$ if ( have_harfbuzz ) then libdef=libdefs+",FT_CONFIG_OPTION_USE_HARFBUZZ=1" $ if libdefs .nes. "" $ then $ ccopt = ccopt + "/define=(" + f$extract(0,f$length(libdefs)-1,libdefs) + ")" From 7c542d02bf9c58b37e314f9227a36b53ad508cb4 Mon Sep 17 00:00:00 2001 From: Jouk Jansen Date: Fri, 21 Jul 2023 21:31:28 +0200 Subject: [PATCH 10/28] * src/smooth/ftgrays.c (FT_SSE2): Fix definition for VMS. --- src/smooth/ftgrays.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c index 6252df98a..55628af9e 100644 --- a/src/smooth/ftgrays.c +++ b/src/smooth/ftgrays.c @@ -1006,10 +1006,11 @@ typedef ptrdiff_t FT_PtrDist; * * For other cases, using binary splits is actually slightly faster. */ -#if defined( __SSE2__ ) || \ - ( defined( __x86_64__ ) && !defined( __VMS ) ) || \ - defined( _M_AMD64 ) || \ - ( defined( _M_IX86_FP ) && _M_IX86_FP >= 2 ) +#if ( defined( __SSE2__ ) || \ + defined( __x86_64__ ) || \ + defined( _M_AMD64 ) || \ + ( defined( _M_IX86_FP ) && _M_IX86_FP >= 2 ) ) && \ + !defined( __VMS ) # define FT_SSE2 1 #else # define FT_SSE2 0 From f7ae7e88e9fde4fccbe7bbd03d72e411fb0e4db3 Mon Sep 17 00:00:00 2001 From: Jouk Jansen Date: Fri, 21 Jul 2023 21:33:20 +0200 Subject: [PATCH 11/28] * vms_make.com: Fix typos. --- vms_make.com | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vms_make.com b/vms_make.com index 8d761d264..52a607599 100644 --- a/vms_make.com +++ b/vms_make.com @@ -74,10 +74,10 @@ $! $! $! Pull in external libraries $! -$ have_png = f$search("sys$library:libpng.olb/lib") .nes. "" +$ have_png = f$search("sys$library:libpng.olb") .nes. "" $ have_bz2 = f$search("sys$library:libbz2.olb") .nes. "" -$ have_z = f$search("sys$library:libpng.olb") .nes. "" -$ have_harfbuzz = f$search("") .nes. "sys$library:libharfbuzz.olb/lib" +$ have_z = f$search("sys$library:libz.olb") .nes. "" +$ have_harfbuzz = f$search("sys$library:libharfbuzz.olb") .nes. "" $! $ create libs.opt $ open/write libsf libs.opt From 9e3c5d7e183c1a8d5ed8868d7d28ef18d3ec9ec8 Mon Sep 17 00:00:00 2001 From: Jouk Jansen Date: Fri, 21 Jul 2023 21:36:57 +0200 Subject: [PATCH 12/28] * vms_make.com: Provide separate library compiled with C++. Some types on OpenVMS x86_64 (for example, `long') have different sizes depending on whether compiled with either C or C++. In particular, X-Windows applications crash if linked with the C++ version. This patch makes `vms_make.com` create a second version of the FreeType library compiled with C++ if OpenVMS is running on the x86_64 platform. --- vms_make.com | 704 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 653 insertions(+), 51 deletions(-) diff --git a/vms_make.com b/vms_make.com index 52a607599..2c85a016a 100644 --- a/vms_make.com +++ b/vms_make.com @@ -34,6 +34,13 @@ $! 0.01 20040401 First version to receive a number $! 0.02 20041030 Add error handling, FreeType 2.1.9 $! $ on error then goto err_exit +$! +$! Get platform +$ vax = f$getsyi("ARCH_NAME").eqs. "VAX" +$ axp = f$getsyi("ARCH_NAME").eqs. "Alpha" +$ ia64 = f$getsyi("ARCH_NAME").eqs. "IA64" +$ x86_64 = f$getsyi("ARCH_NAME").eqs. "x86_64" +$! $ true = 1 $ false = 0 $ tmpnam = "temp_" + f$getjpi("","pid") @@ -48,6 +55,7 @@ $! Setup variables holding "config" information $! $ Make = "" $ ccopt = "/name=(as_is,short)/float=ieee" +$ if ( x86_64 ) then cxxopt = "/name=(as_is,short)" $ lopts = "" $ dnsrl = "" $ aconf_in_file = "config.hin" @@ -86,34 +94,45 @@ $ if ( have_png ) then write libsf "sys$library:libpng.olb/lib" $ if ( have_bz2 ) then write libsf "sys$library:libbz2.olb/lib" $ if ( have_z ) then write libsf "sys$library:libz.olb/lib" $ close libsf +$ open/write libsf libs_cxx.opt +$ if ( have_harfbuzz ) then write libsf "sys$library:libharfbuzz.olb/lib" +$ if ( have_png ) then write libsf "sys$library:libpng_cxx.olb/lib" +$ if ( have_bz2 ) then write libsf "sys$library:libbz2_cxx.olb/lib" +$ if ( have_z ) then write libsf "sys$library:libz_cxx.olb/lib" +$ close libsf $! $! Create objects $! $ libdefs = "FT2_BUILD_LIBRARY,FT_CONFIG_OPTION_OLD_INTERNALS" -$ if ( have_bz2 ) then libdef=libdefs+",FT_CONFIG_OPTION_USE_BZIP2=1" -$ if ( have_png ) then libdef=libdefs+",FT_CONFIG_OPTION_USE_PNG=1" -$ if ( have_z ) then libdef=libdefs+",FT_CONFIG_OPTION_USE_ZLIB=1" -$ if ( have_harfbuzz ) then libdef=libdefs+",FT_CONFIG_OPTION_USE_HARFBUZZ=1" +$ if ( have_bz2 ) then libdefs=libdefs+",FT_CONFIG_OPTION_USE_BZIP2=1" +$ if ( have_png ) then libdefs=libdefs+",FT_CONFIG_OPTION_USE_PNG=1" +$ if ( have_z ) then libdefs=libdefs+",FT_CONFIG_OPTION_SYSTEM_ZLIB=1" +$ if ( have_harfbuzz ) then libdefs=libdefs+",FT_CONFIG_OPTION_USE_HARFBUZZ=1" $ if libdefs .nes. "" $ then -$ ccopt = ccopt + "/define=(" + f$extract(0,f$length(libdefs)-1,libdefs) + ")" +$ ccopt = ccopt + "/define=(" + libdefs + ")" +$ if ( x86_64 ) then cxxopt = cxxopt + "/define=(" + libdefs + ")" $ endif $! $ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - then s_case = true $ gosub crea_mms $! -$ 'Make' /macro=(comp_flags="''ccopt'") +$ if x86_64 +$ then +$ 'Make' /macro=(comp_flags="''ccopt'",cxxcomp_flags="''cxxopt'","X86=1") +$ else +$ 'Make' /macro=(comp_flags="''ccopt'") +$ endif $ purge/nolog [...]descrip.mms $! $! $! Alpha & Itanium get a shareable image $! -$ If f$getsyi("HW_MODEL") .gt. 1024 .or. f$getsyi("HW_MODEL") .eq. 0 +$ If .not. vax $ Then $ write sys$output "Creating freetype2shr.exe" $ library/extract=* [.lib]freetype.olb -$ pipe link/nodeb/noshare/noexe/map=libfreetype.map/full freetype.obj | copy sys$input nl: $ set def [.src.tools] $ cc apinames.c $ link apinames @@ -134,6 +153,22 @@ $ link/nodeb/share=[.lib]freetype2shr.exe/map=libfreetype.map/full - libfreetype/opt,freetype_vms/opt,libs/opt $ delete freetype.obj;* $ endif +$ if x86_64 +$ then +$ write sys$output "Creating freetype2shr_cxx.exe" +$ library/extract=* [.lib]freetype_cxx.olb +$ open/write file libfreetype_cxx.opt +$ write file "!" +$ write file "! libfreetype_cxx.opt generated by vms_make.com" +$ write file "!" +$ write file "IDENTIFICATION=""freetype2 2.0""" +$ write file "GSMATCH=LEQUAL,2,0 +$ write file "freetype_cxx.obj" +$ close file +$ link/nodeb/share=[.lib]freetype2shr_cxx.exe/map=libfreetype_cxx.map/full - + libfreetype_cxx/opt,freetype_vms/opt,libs_cxx/opt +$ delete freetype_cxx.obj;* +$ endif $! $ exit $! @@ -175,6 +210,7 @@ $ deck # fully. $ EOD $ write out "CFLAGS = ", ccopt +$ if x86_64 then write out "CXXFLAGS = ", cxxopt $ copy sys$input: out $ deck @@ -276,22 +312,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map cc$(CFLAGS)/warn=noinfo/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=noinfo/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=ftsystem.obj OBJS64=ftsystem_64.obj +OBJSCXX=ftsystem_cxx.obj + all : $(OBJS) library/create [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library/create [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif ftsystem.obj : ftsystem.c ftconfig.h @@ -318,22 +375,43 @@ $ deck # fully. CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.autofit]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: - mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map nl: exclude hb_ cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=autofit.obj OBJS64=autofit_64.obj +OBJSCXX=autofit_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -359,14 +437,29 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.builds.vms],[--.include],[--.src.base]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=ftbase.obj,\ ftbbox.obj,\ @@ -402,9 +495,30 @@ OBJS64=ftbase_64.obj,\ fttype1_64.obj,\ ftwinfnt_64.obj,ftpatent_64.obj,ftgxval_64.obj,ftotval_64.obj +OBJSCXX=ftbase_cxx.obj,\ + ftbbox_cxx.obj,\ + ftbdf_cxx.obj,\ + ftbitmap_cxx.obj,\ + ftcid_cxx.obj,\ + ftdebug_cxx.obj,\ + ftfstype_cxx.obj,\ + ftgasp_cxx.obj,\ + ftglyph_cxx.obj,\ + ftinit_cxx.obj,\ + ftmm_cxx.obj,\ + ftpfr_cxx.obj,\ + ftstroke_cxx.obj,\ + ftsynth_cxx.obj,\ + fttype1_cxx.obj,\ + ftwinfnt_cxx.obj,ftpatent_cxx.obj,ftgxval_cxx.obj,ftotval_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif ftbase.obj : ftbase.c ftadvanc.c ftcalc.c ftcolor.c ftdbgmem.c fterrors.c\ ftfntfmt.c ftgloadr.c fthash.c ftlcdfil.c ftmac.c ftobjs.c ftoutln.c\ @@ -435,22 +549,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.bdf]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 +.c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=noinfo/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else .c.obj : cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=bdf.obj OBJS64=bdf_64.obj +OBJSCXX=bdf_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -476,22 +611,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cache])/nowarn +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 +.c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=noinfo/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else .c.obj : cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=ftcache.obj OBJS64=ftcache_64.obj +OBJSCXX=ftcache_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif ftcache.obj : ftcache.c ftcbasic.c ftccache.c ftccmap.c ftcglyph.c ftcimage.c \ ftcmanag.c ftcmru.c ftcsbits.c @@ -520,22 +676,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cff]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=cff.obj OBJS64=cff_64.obj +OBJSCXX=cff_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -561,22 +738,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cid]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=type1cid.obj OBJS64=type1cid_64.obj +OBJSCXX=type1cid_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -602,22 +800,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.gxvalid]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=gxvalid.obj OBJS64=gxvalid_64.obj +OBJSCXX=gxvalid_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -642,26 +861,48 @@ $ deck # fully. $EOD $ write out "COMP_FLAGS = ", ccopt +$ if x86_64 then write out "CXXFLAGS = ", cxxopt $ copy sys$input: out $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.gzip]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=ftgzip.obj OBJS64=ftgzip_64.obj +OBJSCXX=ftgzip_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -688,26 +929,48 @@ $ deck # fully. $EOD $ write out "COMP_FLAGS = ", ccopt +$ if x86_64 then write out "CXXFLAGS = ", cxxopt $ copy sys$input: out $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.bzip2]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=ftbzip2.obj OBJS64=ftbzip2_64.obj +OBJSCXX=ftbzip2_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -732,26 +995,48 @@ $ deck # fully. $EOD $ write out "COMP_FLAGS = ", ccopt +$ if x86_64 then write out "CXXFLAGS = ", cxxopt $ copy sys$input: out $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.lzw]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=ftlzw.obj OBJS64=ftlzw_64.obj +OBJSCXX=ftlzw_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -777,22 +1062,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.otvalid]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=otvalid.obj OBJS64=otvalid_64.obj +OBJSCXX=otvalid_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -830,22 +1136,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.pcf]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=noinfo/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=pcf.obj OBJS64=pcf_64.obj +OBJSCXX=pcf_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -871,22 +1198,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.pfr]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=pfr.obj OBJS64=pfr_64.obj +OBJSCXX=pfr_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -912,22 +1260,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psaux]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=psaux.obj OBJS64=psaux_64.obj +OBJSCXX=psaux_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -953,22 +1322,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psnames]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=pshinter.obj OBJS64=pshinter_64.obj +OBJSCXX=pshinter_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -994,22 +1384,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psnames]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=psnames.obj OBJS64=psnames_64.obj +OBJSCXX=psnames_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -1035,22 +1446,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.raster]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=raster.obj OBJS64=raster_64.obj +OBJSCXX=raster_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -1076,22 +1508,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.sfnt]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=sfnt.obj OBJS64=sfnt_64.obj +OBJSCXX=sfnt_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -1117,22 +1570,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.smooth]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 +.c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=noinfo/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else .c.obj : cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=smooth.obj OBJS64=smooth_64.obj +OBJSCXX=smooth_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -1158,22 +1632,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.svg]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + cc$(CFLAGS)/warn=noinfo/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=svg.obj OBJS64=svg_64.obj +OBJSCXX=svg_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -1199,22 +1694,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.truetype]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=truetype.obj OBJS64=truetype_64.obj +OBJSCXX=truetype_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -1240,22 +1756,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type1]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=type1.obj OBJS64=type1_64.obj +OBJSCXX=type1_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif type1.obj : type1.c t1parse.c t1load.c t1objs.c t1driver.c t1gload.c t1afm.c @@ -1283,22 +1820,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type1]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=noinfo/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=sdf.obj OBJS64=sdf_64.obj +OBJSCXX=sdf_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif sdf.obj : sdf.c ftbsdf.c ftsdf.c ftsdfcommon.c ftsdfrend.c @@ -1326,22 +1884,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type42]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=type42.obj OBJS64=type42_64.obj +OBJSCXX=type42_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -1367,22 +1946,43 @@ $ deck CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.winfonts]) +.ifdef X86 +CXXFLAGS=$(CXXCOMP_FLAGS)$(DEBUG)/list/show=all/include=([],[--.include],[--.src.base]) +.endif +.ifdef X86 .c.obj : + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_cxx.obj $(MMS$TARGET_NAME).c cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map - cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64\ - /obj=$(MMS$TARGET_NAME)_64.obj $(MMS$TARGET_NAME)_64.c + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c + cxx$(CXXFLAGS)/warn=noinfo/obj=$(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c + delete $(MMS$TARGET_NAME)_64.c;* +.else +.c.obj : + cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c + pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl: + mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map + cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\ + $(MMS$TARGET_NAME)_64.c delete $(MMS$TARGET_NAME)_64.c;* +.endif OBJS=winfnt.obj OBJS64=winfnt_64.obj +OBJSCXX=winfnt_cxx.obj + all : $(OBJS) library [--.lib]freetype.olb $(OBJS) library [--.lib]freetype.olb $(OBJS64) +.ifdef X86 + library [--.lib]freetype_cxx.olb $(OBJSCXX) + library [--.lib]freetype_cxx.olb $(OBJS64) +.endif # EOF $ eod @@ -1401,6 +2001,7 @@ $ cparm = f$edit(p'i',"upcase") $ if cparm .eqs. "DEBUG" $ then $ ccopt = ccopt + "/noopt/deb" +$ if x86_64 then cxxopt = cxxopt + "/noopt/deb" $ lopts = lopts + "/deb" $ endif $ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) @@ -1408,6 +2009,7 @@ $ then $ start = f$locate("=",cparm) + 1 $ len = f$length(cparm) - start $ ccopt = ccopt + f$extract(start,len,cparm) +$ if x86_64 then cxxopt = cxxopt + f$extract(start,len,cparm) $ endif $ if cparm .eqs. "LINK" then linkonly = true $ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) From 5b7e45ac3488a688d08a57d0db5db907e032c6d4 Mon Sep 17 00:00:00 2001 From: Alexei Podtelezhnikov Date: Thu, 27 Jul 2023 15:06:38 +0000 Subject: [PATCH 13/28] [truetype] Remove Infinality for good. Remove everything `#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY`, which was undefined for a while now. * include/freetype/internal/tttypes.h: Ditto. * src/truetype/truetype.c: Ditto. * src/truetype/ttdriver.c: Ditto. * src/truetype/ttgload.c: Ditto. * src/truetype/ttinterp.c: Ditto. * src/truetype/ttinterp.h: Ditto. * src/truetype/ttobjs.c: Ditto. * src/truetype/ttsubpix.[ch]: Remove files. * src/truetype/rules.mk: Don't mention "ttsubpix.c". --- include/freetype/internal/tttypes.h | 7 - src/truetype/rules.mk | 3 +- src/truetype/truetype.c | 1 - src/truetype/ttdriver.c | 5 - src/truetype/ttgload.c | 218 +----- src/truetype/ttinterp.c | 832 +--------------------- src/truetype/ttinterp.h | 74 -- src/truetype/ttobjs.c | 3 - src/truetype/ttsubpix.c | 1013 --------------------------- src/truetype/ttsubpix.h | 110 --- 10 files changed, 23 insertions(+), 2243 deletions(-) delete mode 100644 src/truetype/ttsubpix.c delete mode 100644 src/truetype/ttsubpix.h diff --git a/include/freetype/internal/tttypes.h b/include/freetype/internal/tttypes.h index 984121a0e..c821741f8 100644 --- a/include/freetype/internal/tttypes.h +++ b/include/freetype/internal/tttypes.h @@ -1597,13 +1597,6 @@ FT_BEGIN_HEADER FT_ULong horz_metrics_offset; FT_ULong vert_metrics_offset; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* since 2.4.12 */ - FT_ULong sph_found_func_flags; /* special functions found */ - /* for this face */ - FT_Bool sph_compatibility_mode; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS /* since 2.7 */ FT_ULong ebdt_start; /* either `CBDT', `EBDT', or `bdat' */ diff --git a/src/truetype/rules.mk b/src/truetype/rules.mk index 23f6f006d..dde26de1c 100644 --- a/src/truetype/rules.mk +++ b/src/truetype/rules.mk @@ -33,8 +33,7 @@ TT_DRV_SRC := $(TT_DIR)/ttdriver.c \ $(TT_DIR)/ttgxvar.c \ $(TT_DIR)/ttinterp.c \ $(TT_DIR)/ttobjs.c \ - $(TT_DIR)/ttpload.c \ - $(TT_DIR)/ttsubpix.c + $(TT_DIR)/ttpload.c # TrueType driver headers # diff --git a/src/truetype/truetype.c b/src/truetype/truetype.c index c5faa9627..fcc0ea334 100644 --- a/src/truetype/truetype.c +++ b/src/truetype/truetype.c @@ -24,7 +24,6 @@ #include "ttinterp.c" #include "ttobjs.c" /* object manager */ #include "ttpload.c" /* tables loader */ -#include "ttsubpix.c" /* END */ diff --git a/src/truetype/ttdriver.c b/src/truetype/ttdriver.c index 7151e8207..d1496fec7 100644 --- a/src/truetype/ttdriver.c +++ b/src/truetype/ttdriver.c @@ -100,11 +100,6 @@ break; case TT_INTERPRETER_VERSION_38: -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - driver->interpreter_version = TT_INTERPRETER_VERSION_38; - break; -#endif - case TT_INTERPRETER_VERSION_40: #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL driver->interpreter_version = TT_INTERPRETER_VERSION_40; diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c index d538e8ee8..5eedb5331 100644 --- a/src/truetype/ttgload.c +++ b/src/truetype/ttgload.c @@ -35,7 +35,6 @@ #endif #include "tterrors.h" -#include "ttsubpix.h" /************************************************************************** @@ -152,9 +151,6 @@ FT_UInt glyph_index ) { TT_Face face = loader->face; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); -#endif FT_Error error; FT_Stream stream = loader->stream; @@ -183,20 +179,6 @@ loader->top_bearing = top_bearing; loader->vadvance = advance_height; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 && - loader->exec ) - { - loader->exec->sph_tweak_flags = 0; - - /* This may not be the right place for this, but it works... */ - /* Note that we have to unconditionally load the tweaks since */ - /* it is possible that glyphs individually switch ClearType's */ - /* backward compatibility mode on and off. */ - sph_set_tweaks( loader, glyph_index ); - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - #ifdef FT_CONFIG_OPTION_INCREMENTAL /* With the incremental interface, these values are set by */ /* a call to `tt_get_metrics_incremental'. */ @@ -798,8 +780,7 @@ TT_Hint_Glyph( TT_Loader loader, FT_Bool is_composite ) { -#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \ - defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL TT_Face face = loader->face; TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); #endif @@ -887,17 +868,6 @@ } #endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) - { - if ( exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN ) - FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 ); - - else if ( exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN ) - FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 ); - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - return FT_Err_Ok; } @@ -960,16 +930,6 @@ } { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - TT_Face face = loader->face; - TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); - - FT_String* family = face->root.family_name; - FT_UInt ppem = loader->size->metrics->x_ppem; - FT_String* style = face->root.style_name; - FT_UInt x_scale_factor = 1000; -#endif - FT_Vector* vec = outline->points; FT_Vector* limit = outline->points + n_points; @@ -979,52 +939,6 @@ FT_Bool do_scale = FALSE; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) - { - /* scale, but only if enabled and only if TT hinting is being used */ - if ( IS_HINTED( loader->load_flags ) ) - x_scale_factor = sph_test_tweak_x_scaling( face, - family, - ppem, - style, - loader->glyph_index ); - /* scale the glyph */ - if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 || - x_scale_factor != 1000 ) - { - x_scale = FT_MulDiv( loader->size->metrics->x_scale, - (FT_Long)x_scale_factor, 1000 ); - y_scale = loader->size->metrics->y_scale; - - /* compensate for any scaling by de/emboldening; */ - /* the amount was determined via experimentation */ - if ( x_scale_factor != 1000 && ppem > 11 ) - { -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_Vector* orig_points = outline->points; - - - if ( !IS_DEFAULT_INSTANCE( FT_FACE( loader->face ) ) ) - outline->points = unrounded; -#endif - FT_Outline_EmboldenXY( outline, - FT_MulFix( 1280 * ppem, - 1000 - x_scale_factor ), - 0 ); -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - if ( !IS_DEFAULT_INSTANCE( FT_FACE( loader->face ) ) ) - outline->points = orig_points; -#endif - } - do_scale = TRUE; - } - } - else - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - { /* scale the glyph */ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) @@ -1460,15 +1374,6 @@ #endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) - { - subpixel_hinting = loader->exec ? loader->exec->subpixel_hinting - : 0; - grayscale = loader->exec ? loader->exec->grayscale - : 0; - } -#endif #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) { @@ -2277,8 +2182,7 @@ #ifdef TT_USE_BYTECODE_INTERPRETER FT_Error error; FT_Bool pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); -#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \ - defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( glyph->face ); #endif #endif @@ -2298,20 +2202,6 @@ FT_Bool grayscale_cleartype; #endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - FT_Bool subpixel_hinting = FALSE; - -#if 0 - /* not used yet */ - 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_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - FT_Bool reexecute = FALSE; @@ -2356,65 +2246,6 @@ } #endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) - { - subpixel_hinting = FT_BOOL( ( FT_LOAD_TARGET_MODE( load_flags ) != - FT_RENDER_MODE_MONO ) && - SPH_OPTION_SET_SUBPIXEL ); - - if ( subpixel_hinting ) - grayscale = FALSE; - else if ( SPH_OPTION_SET_GRAYSCALE ) - { - grayscale = TRUE; - subpixel_hinting = FALSE; - } - else - grayscale = FALSE; - - if ( FT_IS_TRICKY( glyph->face ) ) - subpixel_hinting = FALSE; - - exec->ignore_x_mode = subpixel_hinting || grayscale; - exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION; - if ( exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 ) - exec->rasterizer_version = TT_INTERPRETER_VERSION_35; - -#if 1 - exec->compatible_widths = SPH_OPTION_SET_COMPATIBLE_WIDTHS; - 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 ) != - TT_LOAD_COMPATIBLE_WIDTHS ); - exec->symmetrical_smoothing = - FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != - TT_LOAD_SYMMETRICAL_SMOOTHING ); - 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 */ - - } - else - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) grayscale = FT_BOOL( !subpixel_hinting_lean && @@ -2429,36 +2260,6 @@ if ( error ) return error; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) - { - /* a change from mono to subpixel rendering (and vice versa) */ - /* requires a re-execution of the CVT program */ - if ( subpixel_hinting != exec->subpixel_hinting ) - { - FT_TRACE4(( "tt_loader_init: subpixel hinting change," - " re-executing `prep' table\n" )); - - exec->subpixel_hinting = subpixel_hinting; - reexecute = TRUE; - } - - /* a change from mono to grayscale rendering (and vice versa) */ - /* requires a re-execution of the CVT program */ - if ( grayscale != exec->grayscale ) - { - FT_TRACE4(( "tt_loader_init: grayscale hinting change," - " re-executing `prep' table\n" )); - - exec->grayscale = grayscale; - reexecute = TRUE; - } - } - else - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - { #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL @@ -2518,14 +2319,6 @@ if ( exec->GS.instruct_control & 2 ) exec->GS = tt_default_graphics_state; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* check whether we have a font hinted for ClearType -- */ - /* note that this flag can also be modified in a glyph's bytecode */ - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 && - exec->GS.instruct_control & 4 ) - exec->ignore_x_mode = FALSE; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL /* * Toggle backward compatibility according to what font wants, except @@ -2561,13 +2354,6 @@ #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && exec->backward_compatibility ) && -#endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - !( driver->interpreter_version == TT_INTERPRETER_VERSION_38 && - !SPH_OPTION_BITMAP_WIDTHS && - FT_LOAD_TARGET_MODE( loader->load_flags ) != - FT_RENDER_MODE_MONO && - exec->compatible_widths ) && #endif !face->postscript.isFixedPitch ) { diff --git a/src/truetype/ttinterp.c b/src/truetype/ttinterp.c index 34c3e6c92..93e89691d 100644 --- a/src/truetype/ttinterp.c +++ b/src/truetype/ttinterp.c @@ -29,7 +29,6 @@ #include "ttinterp.h" #include "tterrors.h" -#include "ttsubpix.h" #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT #include "ttgxvar.h" #endif @@ -52,12 +51,6 @@ ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \ TT_INTERPRETER_VERSION_35 ) -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY -#define SUBPIXEL_HINTING_INFINALITY \ - ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \ - TT_INTERPRETER_VERSION_38 ) -#endif - #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL #define SUBPIXEL_HINTING_MINIMAL \ ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \ @@ -1685,17 +1678,6 @@ if ( v != 0 ) { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - ( !exc->ignore_x_mode || - ( exc->sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) ) - zone->cur[point].x = ADD_LONG( zone->cur[point].x, - FT_MulDiv( distance, - v, - exc->F_dot_P ) ); - else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL /* Exception to the post-IUP curfew: Allow the x component of */ /* diagonal moves, but only post-IUP. DejaVu tries to adjust */ @@ -1801,12 +1783,6 @@ FT_UShort point, FT_F26Dot6 distance ) { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && !exc->ignore_x_mode ) - zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance ); - else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility ) zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance ); @@ -3010,28 +2986,7 @@ args[0] = 0; } else - { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* subpixel hinting - avoid Typeman Dstroke and */ - /* IStroke and Vacuform rounds */ - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - ( ( I == 24 && - ( exc->face->sph_found_func_flags & - ( SPH_FDEF_SPACING_1 | - SPH_FDEF_SPACING_2 ) ) ) || - ( I == 22 && - ( exc->sph_in_func_flags & - SPH_FDEF_TYPEMAN_STROKES ) ) || - ( I == 8 && - ( exc->face->sph_found_func_flags & - SPH_FDEF_VACUFORM_ROUND_1 ) && - exc->iup_called ) ) ) - args[0] = 0; - else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - args[0] = exc->storage[I]; - } + args[0] = exc->storage[I]; } @@ -3545,107 +3500,6 @@ TT_DefRecord* rec; TT_DefRecord* limit; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* arguments to opcodes are skipped by `SKIP_Code' */ - FT_Byte opcode_pattern[9][12] = - { - /* #0 inline delta function 1 */ - { - 0x4B, /* PPEM */ - 0x53, /* GTEQ */ - 0x23, /* SWAP */ - 0x4B, /* PPEM */ - 0x51, /* LTEQ */ - 0x5A, /* AND */ - 0x58, /* IF */ - 0x38, /* SHPIX */ - 0x1B, /* ELSE */ - 0x21, /* POP */ - 0x21, /* POP */ - 0x59 /* EIF */ - }, - /* #1 inline delta function 2 */ - { - 0x4B, /* PPEM */ - 0x54, /* EQ */ - 0x58, /* IF */ - 0x38, /* SHPIX */ - 0x1B, /* ELSE */ - 0x21, /* POP */ - 0x21, /* POP */ - 0x59 /* EIF */ - }, - /* #2 diagonal stroke function */ - { - 0x20, /* DUP */ - 0x20, /* DUP */ - 0xB0, /* PUSHB_1 */ - /* 1 */ - 0x60, /* ADD */ - 0x46, /* GC_cur */ - 0xB0, /* PUSHB_1 */ - /* 64 */ - 0x23, /* SWAP */ - 0x42 /* WS */ - }, - /* #3 VacuFormRound function */ - { - 0x45, /* RCVT */ - 0x23, /* SWAP */ - 0x46, /* GC_cur */ - 0x60, /* ADD */ - 0x20, /* DUP */ - 0xB0 /* PUSHB_1 */ - /* 38 */ - }, - /* #4 TTFautohint bytecode (old) */ - { - 0x20, /* DUP */ - 0x64, /* ABS */ - 0xB0, /* PUSHB_1 */ - /* 32 */ - 0x60, /* ADD */ - 0x66, /* FLOOR */ - 0x23, /* SWAP */ - 0xB0 /* PUSHB_1 */ - }, - /* #5 spacing function 1 */ - { - 0x01, /* SVTCA_x */ - 0xB0, /* PUSHB_1 */ - /* 24 */ - 0x43, /* RS */ - 0x58 /* IF */ - }, - /* #6 spacing function 2 */ - { - 0x01, /* SVTCA_x */ - 0x18, /* RTG */ - 0xB0, /* PUSHB_1 */ - /* 24 */ - 0x43, /* RS */ - 0x58 /* IF */ - }, - /* #7 TypeMan Talk DiagEndCtrl function */ - { - 0x01, /* SVTCA_x */ - 0x20, /* DUP */ - 0xB0, /* PUSHB_1 */ - /* 3 */ - 0x25, /* CINDEX */ - }, - /* #8 TypeMan Talk Align */ - { - 0x06, /* SPVTL */ - 0x7D, /* RDTG */ - }, - }; - FT_UShort opcode_patterns = 9; - FT_UShort opcode_pointer[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - FT_UShort opcode_size[9] = { 12, 8, 8, 6, 7, 4, 5, 4, 2 }; - FT_UShort i; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - /* FDEF is only allowed in `prep' or `fpgm' */ if ( exc->iniRange == tt_coderange_glyph ) @@ -3696,130 +3550,11 @@ if ( n > exc->maxFunc ) exc->maxFunc = (FT_UInt16)n; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* We don't know for sure these are typeman functions, */ - /* however they are only active when RS 22 is called */ - if ( n >= 64 && n <= 66 ) - rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_STROKES; -#endif - /* Now skip the whole function definition. */ /* We don't allow nested IDEFS & FDEFs. */ while ( SkipCode( exc ) == SUCCESS ) { - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - if ( SUBPIXEL_HINTING_INFINALITY ) - { - for ( i = 0; i < opcode_patterns; i++ ) - { - if ( opcode_pointer[i] < opcode_size[i] && - exc->opcode == opcode_pattern[i][opcode_pointer[i]] ) - { - opcode_pointer[i] += 1; - - if ( opcode_pointer[i] == opcode_size[i] ) - { - FT_TRACE6(( "sph: Function %d, opcode ptrn: %ld, %s %s\n", - i, n, - exc->face->root.family_name, - exc->face->root.style_name )); - - switch ( i ) - { - case 0: - rec->sph_fdef_flags |= SPH_FDEF_INLINE_DELTA_1; - exc->face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_1; - break; - - case 1: - rec->sph_fdef_flags |= SPH_FDEF_INLINE_DELTA_2; - exc->face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_2; - break; - - case 2: - switch ( n ) - { - /* needs to be implemented still */ - case 58: - rec->sph_fdef_flags |= SPH_FDEF_DIAGONAL_STROKE; - exc->face->sph_found_func_flags |= SPH_FDEF_DIAGONAL_STROKE; - } - break; - - case 3: - switch ( n ) - { - case 0: - rec->sph_fdef_flags |= SPH_FDEF_VACUFORM_ROUND_1; - exc->face->sph_found_func_flags |= SPH_FDEF_VACUFORM_ROUND_1; - } - break; - - case 4: - /* probably not necessary to detect anymore */ - rec->sph_fdef_flags |= SPH_FDEF_TTFAUTOHINT_1; - exc->face->sph_found_func_flags |= SPH_FDEF_TTFAUTOHINT_1; - break; - - case 5: - switch ( n ) - { - case 0: - case 1: - case 2: - case 4: - case 7: - case 8: - rec->sph_fdef_flags |= SPH_FDEF_SPACING_1; - exc->face->sph_found_func_flags |= SPH_FDEF_SPACING_1; - } - break; - - case 6: - switch ( n ) - { - case 0: - case 1: - case 2: - case 4: - case 7: - case 8: - rec->sph_fdef_flags |= SPH_FDEF_SPACING_2; - exc->face->sph_found_func_flags |= SPH_FDEF_SPACING_2; - } - break; - - case 7: - rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; - exc->face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; - break; - - case 8: -#if 0 - rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; - exc->face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; -#endif - break; - } - opcode_pointer[i] = 0; - } - } - - else - opcode_pointer[i] = 0; - } - - /* Set sph_compatibility_mode only when deltas are detected */ - exc->face->sph_compatibility_mode = - ( ( exc->face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_1 ) | - ( exc->face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ); - } - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - switch ( exc->opcode ) { case 0x89: /* IDEF */ @@ -3847,10 +3582,6 @@ TT_CallRec* pRec; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - exc->sph_in_func_flags = 0x0000; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - if ( exc->callTop <= 0 ) /* We encountered an ENDF without a call */ { exc->error = FT_THROW( ENDF_In_Exec_Stream ); @@ -3938,17 +3669,6 @@ if ( !def->active ) goto Fail; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - ( ( exc->iup_called && - ( exc->sph_tweak_flags & SPH_TWEAK_NO_CALL_AFTER_IUP ) ) || - ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) ) ) - goto Fail; - else - exc->sph_in_func_flags = def->sph_fdef_flags; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - /* check the call stack */ if ( exc->callTop >= exc->callSize ) { @@ -4026,15 +3746,6 @@ if ( !def->active ) goto Fail; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) ) - goto Fail; - else - exc->sph_in_func_flags = def->sph_fdef_flags; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - /* check stack */ if ( exc->callTop >= exc->callSize ) { @@ -4940,14 +4651,6 @@ } } -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */ - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - ( D < 0 ? NEG_LONG( D ) : D ) == 64 ) - D += 1; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - args[0] = D; } @@ -5209,13 +4912,6 @@ /* except to change the subpixel flags temporarily */ else if ( exc->iniRange == tt_coderange_glyph && K == 3 ) { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* INSTCTRL modifying flag 3 also has an effect */ - /* outside of the CVT program */ - if ( SUBPIXEL_HINTING_INFINALITY ) - exc->ignore_x_mode = !FT_BOOL( L == 4 ); -#endif - #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL /* Native ClearType fonts sign a waiver that turns off all backward */ /* compatibility hacks and lets them program points to the grid like */ @@ -5547,12 +5243,6 @@ } } else -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* doesn't follow Cleartype spec but produces better result */ - if ( SUBPIXEL_HINTING_INFINALITY && exc->ignore_x_mode ) - Move_Zp2_Point( exc, point, 0, dy, TRUE ); - else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ Move_Zp2_Point( exc, point, dx, dy, TRUE ); exc->GS.loop--; @@ -5713,76 +5403,6 @@ } } else -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode ) - { - FT_Int B1, B2; - - - /* If not using ignore_x_mode rendering, allow ZP2 move. */ - /* If inline deltas aren't allowed, skip ZP2 move. */ - /* If using ignore_x_mode rendering, allow ZP2 point move if: */ - /* - freedom vector is y and sph_compatibility_mode is off */ - /* - the glyph is composite and the move is in the Y direction */ - /* - the glyph is specifically set to allow SHPIX moves */ - /* - the move is on a previously Y-touched point */ - - /* save point for later comparison */ - B1 = exc->zp2.cur[point].y; - - if ( exc->face->sph_compatibility_mode ) - { - if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) - dy = FT_PIX_ROUND( B1 + dy ) - B1; - - /* skip post-iup deltas */ - if ( exc->iup_called && - ( ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) || - ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) ) - goto Skip; - - if ( !( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) && - ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || - ( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y ) || - ( exc->sph_tweak_flags & SPH_TWEAK_DO_SHPIX ) ) ) - Move_Zp2_Point( exc, point, 0, dy, TRUE ); - - /* save new point */ - if ( exc->GS.freeVector.y != 0 ) - { - B2 = exc->zp2.cur[point].y; - - /* reverse any disallowed moves */ - if ( ( B1 & 63 ) == 0 && - ( B2 & 63 ) != 0 && - B1 != B2 ) - Move_Zp2_Point( exc, point, 0, NEG_LONG( dy ), TRUE ); - } - } - else if ( exc->GS.freeVector.y != 0 ) - { - Move_Zp2_Point( exc, point, dx, dy, TRUE ); - - /* save new point */ - B2 = exc->zp2.cur[point].y; - - /* reverse any disallowed moves */ - if ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) && - ( B1 & 63 ) != 0 && - ( B2 & 63 ) != 0 && - B1 != B2 ) - Move_Zp2_Point( exc, - point, - NEG_LONG( dx ), - NEG_LONG( dy ), - TRUE ); - } - else if ( exc->sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL ) - Move_Zp2_Point( exc, point, dx, dy, TRUE ); - } - else -#endif #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL if ( SUBPIXEL_HINTING_MINIMAL && exc->backward_compatibility ) @@ -5802,9 +5422,6 @@ #endif Move_Zp2_Point( exc, point, dx, dy, TRUE ); -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - Skip: -#endif exc->GS.loop--; } @@ -5849,28 +5466,6 @@ distance = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 ); -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* subpixel hinting - make MSIRP respect CVT cut-in; */ - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 ) - { - FT_F26Dot6 control_value_cutin = exc->GS.control_value_cutin; - FT_F26Dot6 delta; - - - if ( !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - control_value_cutin = 0; - - delta = SUB_LONG( distance, args[1] ); - if ( delta < 0 ) - delta = NEG_LONG( delta ); - - if ( delta >= control_value_cutin ) - distance = args[1]; - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - exc->func_move( exc, &exc->zp1, point, @@ -5911,14 +5506,7 @@ if ( ( exc->opcode & 1 ) != 0 ) { cur_dist = FAST_PROJECT( &exc->zp0.cur[point] ); -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 ) - distance = SUB_LONG( Round_None( exc, cur_dist, 3 ), cur_dist ); - else -#endif - distance = SUB_LONG( exc->func_round( exc, cur_dist, 3 ), cur_dist ); + distance = SUB_LONG( exc->func_round( exc, cur_dist, 3 ), cur_dist ); } else distance = 0; @@ -5981,27 +5569,12 @@ if ( exc->GS.gep0 == 0 ) /* If in twilight zone */ { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */ - /* Determined via experimentation and may be incorrect... */ - if ( !( SUBPIXEL_HINTING_INFINALITY && - ( exc->ignore_x_mode && - exc->face->sph_compatibility_mode ) ) ) -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - exc->zp0.org[point].x = TT_MulFix14( distance, + exc->zp0.org[point].x = TT_MulFix14( distance, exc->GS.freeVector.x ); exc->zp0.org[point].y = TT_MulFix14( distance, exc->GS.freeVector.y ); exc->zp0.cur[point] = exc->zp0.org[point]; } -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - ( exc->sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) && - distance > 0 && - exc->GS.freeVector.y != 0 ) - distance = 0; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ org_dist = FAST_PROJECT( &exc->zp0.cur[point] ); @@ -6011,15 +5584,6 @@ FT_F26Dot6 delta; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - exc->GS.freeVector.y == 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - control_value_cutin = 0; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - delta = SUB_LONG( distance, org_dist ); if ( delta < 0 ) delta = NEG_LONG( delta ); @@ -6027,14 +5591,7 @@ if ( delta > control_value_cutin ) distance = org_dist; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 ) - distance = Round_None( exc, distance, 3 ); - else -#endif - distance = exc->func_round( exc, distance, 3 ); + distance = exc->func_round( exc, distance, 3 ); } exc->func_move( exc, &exc->zp0, point, SUB_LONG( distance, org_dist ) ); @@ -6127,14 +5684,7 @@ if ( ( exc->opcode & 4 ) != 0 ) { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 ) - distance = Round_None( exc, org_dist, exc->opcode & 3 ); - else -#endif - distance = exc->func_round( exc, org_dist, exc->opcode & 3 ); + distance = exc->func_round( exc, org_dist, exc->opcode & 3 ); } else distance = Round_None( exc, org_dist, exc->opcode & 3 ); @@ -6146,14 +5696,6 @@ FT_F26Dot6 minimum_distance = exc->GS.minimum_distance; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - minimum_distance = 0; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - if ( org_dist >= 0 ) { if ( distance < minimum_distance ) @@ -6296,41 +5838,7 @@ distance = exc->func_round( exc, cvt_dist, exc->opcode & 3 ); } else - { - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* do cvt cut-in always in MIRP for sph */ - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.gep0 == exc->GS.gep1 ) - { - FT_F26Dot6 control_value_cutin = exc->GS.control_value_cutin; - - - if ( exc->GS.freeVector.x != 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - control_value_cutin = 0; - - if ( exc->GS.freeVector.y != 0 && - ( exc->sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) ) - { - if ( cur_dist < -64 ) - cvt_dist -= 16; - else if ( cur_dist > 64 && cur_dist < 84 ) - cvt_dist += 32; - } - - delta = SUB_LONG( cvt_dist, org_dist ); - if ( delta < 0 ) - delta = NEG_LONG( delta ); - - if ( delta > control_value_cutin ) - cvt_dist = org_dist; - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - distance = Round_None( exc, cvt_dist, exc->opcode & 3 ); - } /* minimum distance test */ @@ -6339,14 +5847,6 @@ FT_F26Dot6 minimum_distance = exc->GS.minimum_distance; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - minimum_distance = 0; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - if ( org_dist >= 0 ) { if ( distance < minimum_distance ) @@ -6359,51 +5859,10 @@ } } -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.y != 0 ) - { - FT_Int B1, B2; - - - B1 = exc->zp1.cur[point].y; - - /* Round moves if necessary */ - if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) - distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist; - - if ( ( exc->opcode & 16 ) == 0 && - ( exc->opcode & 8 ) == 0 && - ( exc->sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) ) - distance += 64; - - exc->func_move( exc, - &exc->zp1, - point, - SUB_LONG( distance, cur_dist ) ); - - B2 = exc->zp1.cur[point].y; - - /* Reverse move if necessary */ - if ( ( exc->face->sph_compatibility_mode && - ( B1 & 63 ) == 0 && - ( B2 & 63 ) != 0 ) || - ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) && - ( B1 & 63 ) != 0 && - ( B2 & 63 ) != 0 ) ) - exc->func_move( exc, - &exc->zp1, - point, - SUB_LONG( cur_dist, distance ) ); - } - else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - - exc->func_move( exc, - &exc->zp1, - point, - SUB_LONG( distance, cur_dist ) ); + exc->func_move( exc, + &exc->zp1, + point, + SUB_LONG( distance, cur_dist ) ); Fail: exc->GS.rp1 = exc->GS.rp0; @@ -6428,17 +5887,6 @@ FT_F26Dot6 distance; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->iup_called && - ( exc->sph_tweak_flags & SPH_TWEAK_NO_ALIGNRP_AFTER_IUP ) ) - { - exc->error = FT_THROW( Invalid_Reference ); - goto Fail; - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - if ( exc->top < exc->GS.loop || BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) { @@ -6997,16 +6445,6 @@ contour = 0; point = 0; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode ) - { - exc->iup_called = TRUE; - if ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_IUP ) - return; - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - do { end_point = exc->pts.contours[contour] - exc->pts.first_point; @@ -7079,14 +6517,6 @@ FT_Long B; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->iup_called && - ( exc->sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) ) - goto Fail; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - P = (FT_ULong)exc->func_cur_ppem( exc ); nump = (FT_ULong)args[0]; /* some points theoretically may occur more than once, thus UShort isn't enough */ @@ -7139,87 +6569,21 @@ B++; B *= 1L << ( 6 - exc->GS.delta_shift ); -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY ) +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* See `ttinterp.h' for details on backward compatibility */ + /* mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) { - /* - * Allow delta move if - * - * - not using ignore_x_mode rendering, - * - glyph is specifically set to allow it, or - * - glyph is composite and freedom vector is not in subpixel - * direction. - */ - if ( !exc->ignore_x_mode || - ( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) || - ( exc->is_composite && exc->GS.freeVector.y != 0 ) ) + if ( !( exc->iupx_called && exc->iupy_called ) && + ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || + ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) ) exc->func_move( exc, &exc->zp0, A, B ); - - /* Otherwise, apply subpixel hinting and compatibility mode */ - /* rules, always skipping deltas in subpixel direction. */ - else if ( exc->ignore_x_mode && exc->GS.freeVector.y != 0 ) - { - FT_UShort B1, B2; - - - /* save the y value of the point now; compare after move */ - B1 = (FT_UShort)exc->zp0.cur[A].y; - - /* Standard subpixel hinting: Allow y move for y-touched */ - /* points. This messes up DejaVu ... */ - if ( !exc->face->sph_compatibility_mode && - ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) - exc->func_move( exc, &exc->zp0, A, B ); - - /* compatibility mode */ - else if ( exc->face->sph_compatibility_mode && - !( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) ) - { - if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) - B = FT_PIX_ROUND( B1 + B ) - B1; - - /* Allow delta move if using sph_compatibility_mode, */ - /* IUP has not been called, and point is touched on Y. */ - if ( !exc->iup_called && - ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) - exc->func_move( exc, &exc->zp0, A, B ); - } - - B2 = (FT_UShort)exc->zp0.cur[A].y; - - /* Reverse this move if it results in a disallowed move */ - if ( exc->GS.freeVector.y != 0 && - ( ( exc->face->sph_compatibility_mode && - ( B1 & 63 ) == 0 && - ( B2 & 63 ) != 0 ) || - ( ( exc->sph_tweak_flags & - SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) && - ( B1 & 63 ) != 0 && - ( B2 & 63 ) != 0 ) ) ) - exc->func_move( exc, &exc->zp0, A, NEG_LONG( B ) ); - } } else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - - { - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - /* See `ttinterp.h' for details on backward compatibility */ - /* mode. */ - if ( SUBPIXEL_HINTING_MINIMAL && - exc->backward_compatibility ) - { - if ( !( exc->iupx_called && exc->iupy_called ) && - ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || - ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) ) - exc->func_move( exc, &exc->zp0, A, B ); - } - else #endif - exc->func_move( exc, &exc->zp0, A, B ); - } + exc->func_move( exc, &exc->zp0, A, B ); } } else @@ -7333,31 +6697,8 @@ K = 0; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /********************************* - * RASTERIZER VERSION - * Selector Bit: 0 - * Return Bit(s): 0-7 - */ - if ( SUBPIXEL_HINTING_INFINALITY && - ( args[0] & 1 ) != 0 && - exc->subpixel_hinting ) - { - if ( exc->ignore_x_mode ) - { - /* if in ClearType backward compatibility mode, */ - /* we sometimes change the TrueType version dynamically */ - K = exc->rasterizer_version; - FT_TRACE6(( "Setting rasterizer version %d\n", - exc->rasterizer_version )); - } - else - K = TT_INTERPRETER_VERSION_38; - } - else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - if ( ( args[0] & 1 ) != 0 ) - K = driver->interpreter_version; + if ( ( args[0] & 1 ) != 0 ) + K = driver->interpreter_version; /********************************* * GLYPH ROTATED @@ -7454,89 +6795,6 @@ } #endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - if ( SUBPIXEL_HINTING_INFINALITY && - exc->rasterizer_version >= TT_INTERPRETER_VERSION_35 ) - { - - if ( exc->rasterizer_version >= 37 ) - { - /********************************* - * HINTING FOR SUBPIXEL - * Selector Bit: 6 - * Return Bit(s): 13 - */ - if ( ( args[0] & 64 ) != 0 && exc->subpixel_hinting ) - K |= 1 << 13; - - /********************************* - * COMPATIBLE WIDTHS ENABLED - * Selector Bit: 7 - * Return Bit(s): 14 - * - * Functionality still needs to be added - */ - if ( ( args[0] & 128 ) != 0 && exc->compatible_widths ) - K |= 1 << 14; - - /********************************* - * VERTICAL LCD SUBPIXELS? - * Selector Bit: 8 - * Return Bit(s): 15 - * - * Functionality still needs to be added - */ - if ( ( args[0] & 256 ) != 0 && exc->vertical_lcd ) - K |= 1 << 15; - - /********************************* - * HINTING FOR BGR? - * Selector Bit: 9 - * Return Bit(s): 16 - * - * Functionality still needs to be added - */ - if ( ( args[0] & 512 ) != 0 && exc->bgr ) - K |= 1 << 16; - - if ( exc->rasterizer_version >= 38 ) - { - /********************************* - * SUBPIXEL POSITIONED? - * Selector Bit: 10 - * Return Bit(s): 17 - * - * 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; - } - } - } - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - args[0] = K; } @@ -7679,20 +6937,6 @@ FT_ULong num_twilight_points; FT_UShort i; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - FT_Byte opcode_pattern[1][2] = - { - /* #8 TypeMan Talk Align */ - { - 0x06, /* SPVTL */ - 0x7D, /* RDTG */ - }, - }; - FT_UShort opcode_patterns = 1; - FT_UShort opcode_pointer[1] = { 0 }; - FT_UShort opcode_size[1] = { 1 }; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - /* We restrict the number of twilight points to a reasonable, */ /* heuristic value to avoid slow execution of malformed bytecode. */ @@ -7770,9 +7014,6 @@ Compute_Round( exc, (FT_Byte)exc->GS.round_state ); /* These flags cancel execution of some opcodes after IUP is called */ -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - exc->iup_called = FALSE; -#endif #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL exc->iupx_called = FALSE; exc->iupy_called = FALSE; @@ -7862,39 +7103,6 @@ exc->step_ins = TRUE; exc->error = FT_Err_Ok; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - if ( SUBPIXEL_HINTING_INFINALITY ) - { - for ( i = 0; i < opcode_patterns; i++ ) - { - if ( opcode_pointer[i] < opcode_size[i] && - exc->opcode == opcode_pattern[i][opcode_pointer[i]] ) - { - opcode_pointer[i] += 1; - - if ( opcode_pointer[i] == opcode_size[i] ) - { - FT_TRACE6(( "sph: opcode ptrn: %d, %s %s\n", - i, - exc->face->root.family_name, - exc->face->root.style_name )); - - switch ( i ) - { - case 0: - break; - } - opcode_pointer[i] = 0; - } - } - else - opcode_pointer[i] = 0; - } - } - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - { FT_Long* args = exc->stack + exc->args; FT_Byte opcode = exc->opcode; diff --git a/src/truetype/ttinterp.h b/src/truetype/ttinterp.h index 48d493af8..e98e258fe 100644 --- a/src/truetype/ttinterp.h +++ b/src/truetype/ttinterp.h @@ -98,48 +98,6 @@ FT_BEGIN_HEADER } TT_CallRec, *TT_CallStack; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - /************************************************************************** - * - * These structures define rules used to tweak subpixel hinting for - * various fonts. "", 0, "", NULL value indicates to match any value. - */ - -#define SPH_MAX_NAME_SIZE 32 -#define SPH_MAX_CLASS_MEMBERS 100 - - typedef struct SPH_TweakRule_ - { - const char family[SPH_MAX_NAME_SIZE]; - const FT_UInt ppem; - const char style[SPH_MAX_NAME_SIZE]; - const FT_ULong glyph; - - } SPH_TweakRule; - - - typedef struct SPH_ScaleRule_ - { - const char family[SPH_MAX_NAME_SIZE]; - const FT_UInt ppem; - const char style[SPH_MAX_NAME_SIZE]; - const FT_ULong glyph; - const FT_ULong scale; - - } SPH_ScaleRule; - - - typedef struct SPH_Font_Class_ - { - const char name[SPH_MAX_NAME_SIZE]; - const char member[SPH_MAX_CLASS_MEMBERS][SPH_MAX_NAME_SIZE]; - - } SPH_Font_Class; - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - - /************************************************************************** * * The main structure for the interpreter which collects all necessary @@ -399,38 +357,6 @@ FT_BEGIN_HEADER FT_Bool grayscale_cleartype; #endif /* TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL */ -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - TT_Round_Func func_round_sphn; /* subpixel rounding function */ - - FT_Bool subpixel_hinting; /* Using subpixel hinting? */ - FT_Bool ignore_x_mode; /* Standard rendering mode for */ - /* subpixel hinting. On if gray */ - /* or subpixel hinting is on. */ - - /* 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 */ - - FT_Bool iup_called; /* IUP called for glyph? */ - - FT_ULong sph_tweak_flags; /* flags to control */ - /* hint tweaks */ - - FT_ULong sph_in_func_flags; /* flags to indicate if in */ - /* special functions */ - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - /* We maintain two counters (in addition to the instruction counter) */ /* that act as loop detectors for LOOPCALL and jump opcodes with */ /* negative arguments. */ diff --git a/src/truetype/ttobjs.c b/src/truetype/ttobjs.c index 958fa54d4..5b56af711 100644 --- a/src/truetype/ttobjs.c +++ b/src/truetype/ttobjs.c @@ -1481,9 +1481,6 @@ TT_Driver driver = (TT_Driver)ttdriver; driver->interpreter_version = TT_INTERPRETER_VERSION_35; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - driver->interpreter_version = TT_INTERPRETER_VERSION_38; -#endif #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL driver->interpreter_version = TT_INTERPRETER_VERSION_40; #endif diff --git a/src/truetype/ttsubpix.c b/src/truetype/ttsubpix.c deleted file mode 100644 index aed4a1a27..000000000 --- a/src/truetype/ttsubpix.c +++ /dev/null @@ -1,1013 +0,0 @@ -/**************************************************************************** - * - * ttsubpix.c - * - * TrueType Subpixel Hinting. - * - * Copyright (C) 2010-2023 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "ttsubpix.h" - - -#if defined( TT_USE_BYTECODE_INTERPRETER ) && \ - defined( TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY ) - - /************************************************************************** - * - * These rules affect how the TT Interpreter does hinting, with the - * goal of doing subpixel hinting by (in general) ignoring x moves. - * Some of these rules are fixes that go above and beyond the - * stated techniques in the MS whitepaper on Cleartype, due to - * artifacts in many glyphs. So, these rules make some glyphs render - * better than they do in the MS rasterizer. - * - * "" string or 0 int/char indicates to apply to all glyphs. - * "-" used as dummy placeholders, but any non-matching string works. - * - * Some of this could arguably be implemented in fontconfig, however: - * - * - Fontconfig can't set things on a glyph-by-glyph basis. - * - The tweaks that happen here are very low-level, from an average - * user's point of view and are best implemented in the hinter. - * - * The goal is to make the subpixel hinting techniques as generalized - * as possible across all fonts to prevent the need for extra rules such - * as these. - * - * The rule structure is designed so that entirely new rules can easily - * be added when a new compatibility feature is discovered. - * - * The rule structures could also use some enhancement to handle ranges. - * - * ****************** WORK IN PROGRESS ******************* - */ - - /* These are `classes' of fonts that can be grouped together and used in */ - /* rules below. A blank entry "" is required at the end of these! */ -#define FAMILY_CLASS_RULES_SIZE 7 - - static const SPH_Font_Class FAMILY_CLASS_Rules - [FAMILY_CLASS_RULES_SIZE] = - { - { "MS Legacy Fonts", - { "Aharoni", - "Andale Mono", - "Andalus", - "Angsana New", - "AngsanaUPC", - "Arabic Transparent", - "Arial Black", - "Arial Narrow", - "Arial Unicode MS", - "Arial", - "Batang", - "Browallia New", - "BrowalliaUPC", - "Comic Sans MS", - "Cordia New", - "CordiaUPC", - "Courier New", - "DFKai-SB", - "David Transparent", - "David", - "DilleniaUPC", - "Estrangelo Edessa", - "EucrosiaUPC", - "FangSong_GB2312", - "Fixed Miriam Transparent", - "FrankRuehl", - "Franklin Gothic Medium", - "FreesiaUPC", - "Garamond", - "Gautami", - "Georgia", - "Gulim", - "Impact", - "IrisUPC", - "JasmineUPC", - "KaiTi_GB2312", - "KodchiangUPC", - "Latha", - "Levenim MT", - "LilyUPC", - "Lucida Console", - "Lucida Sans Unicode", - "MS Gothic", - "MS Mincho", - "MV Boli", - "Mangal", - "Marlett", - "Microsoft Sans Serif", - "Mingliu", - "Miriam Fixed", - "Miriam Transparent", - "Miriam", - "Narkisim", - "Palatino Linotype", - "Raavi", - "Rod Transparent", - "Rod", - "Shruti", - "SimHei", - "Simplified Arabic Fixed", - "Simplified Arabic", - "Simsun", - "Sylfaen", - "Symbol", - "Tahoma", - "Times New Roman", - "Traditional Arabic", - "Trebuchet MS", - "Tunga", - "Verdana", - "Webdings", - "Wingdings", - "", - }, - }, - { "Core MS Legacy Fonts", - { "Arial Black", - "Arial Narrow", - "Arial Unicode MS", - "Arial", - "Comic Sans MS", - "Courier New", - "Garamond", - "Georgia", - "Impact", - "Lucida Console", - "Lucida Sans Unicode", - "Microsoft Sans Serif", - "Palatino Linotype", - "Tahoma", - "Times New Roman", - "Trebuchet MS", - "Verdana", - "", - }, - }, - { "Apple Legacy Fonts", - { "Geneva", - "Times", - "Monaco", - "Century", - "Chalkboard", - "Lobster", - "Century Gothic", - "Optima", - "Lucida Grande", - "Gill Sans", - "Baskerville", - "Helvetica", - "Helvetica Neue", - "", - }, - }, - { "Legacy Sans Fonts", - { "Andale Mono", - "Arial Unicode MS", - "Arial", - "Century Gothic", - "Comic Sans MS", - "Franklin Gothic Medium", - "Geneva", - "Lucida Console", - "Lucida Grande", - "Lucida Sans Unicode", - "Lucida Sans Typewriter", - "Microsoft Sans Serif", - "Monaco", - "Tahoma", - "Trebuchet MS", - "Verdana", - "", - }, - }, - - { "Misc Legacy Fonts", - { "Dark Courier", "", }, }, - { "Verdana Clones", - { "DejaVu Sans", - "Bitstream Vera Sans", "", }, }, - { "Verdana and Clones", - { "DejaVu Sans", - "Bitstream Vera Sans", - "Verdana", "", }, }, - }; - - - /* Define this to force natural (i.e. not bitmap-compatible) widths. */ - /* The default leans strongly towards natural widths except for a few */ - /* legacy fonts where a selective combination produces nicer results. */ -/* #define FORCE_NATURAL_WIDTHS */ - - - /* Define `classes' of styles that can be grouped together and used in */ - /* rules below. A blank entry "" is required at the end of these! */ -#define STYLE_CLASS_RULES_SIZE 5 - - static const SPH_Font_Class STYLE_CLASS_Rules - [STYLE_CLASS_RULES_SIZE] = - { - { "Regular Class", - { "Regular", - "Book", - "Medium", - "Roman", - "Normal", - "", - }, - }, - { "Regular/Italic Class", - { "Regular", - "Book", - "Medium", - "Italic", - "Oblique", - "Roman", - "Normal", - "", - }, - }, - { "Bold/BoldItalic Class", - { "Bold", - "Bold Italic", - "Black", - "", - }, - }, - { "Bold/Italic/BoldItalic Class", - { "Bold", - "Bold Italic", - "Black", - "Italic", - "Oblique", - "", - }, - }, - { "Regular/Bold Class", - { "Regular", - "Book", - "Medium", - "Normal", - "Roman", - "Bold", - "Black", - "", - }, - }, - }; - - - /* Force special legacy fixes for fonts. */ -#define COMPATIBILITY_MODE_RULES_SIZE 1 - - static const SPH_TweakRule COMPATIBILITY_MODE_Rules - [COMPATIBILITY_MODE_RULES_SIZE] = - { - { "Verdana Clones", 0, "", 0 }, - }; - - - /* Don't do subpixel (ignore_x_mode) hinting; do normal hinting. */ -#define PIXEL_HINTING_RULES_SIZE 2 - - static const SPH_TweakRule PIXEL_HINTING_Rules - [PIXEL_HINTING_RULES_SIZE] = - { - /* these characters are almost always safe */ - { "Courier New", 12, "Italic", 'z' }, - { "Courier New", 11, "Italic", 'z' }, - }; - - - /* Subpixel hinting ignores SHPIX rules on X. Force SHPIX for these. */ -#define DO_SHPIX_RULES_SIZE 1 - - static const SPH_TweakRule DO_SHPIX_Rules - [DO_SHPIX_RULES_SIZE] = - { - { "-", 0, "", 0 }, - }; - - - /* Skip Y moves that start with a point that is not on a Y pixel */ - /* boundary and don't move that point to a Y pixel boundary. */ -#define SKIP_NONPIXEL_Y_MOVES_RULES_SIZE 4 - - static const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_Rules - [SKIP_NONPIXEL_Y_MOVES_RULES_SIZE] = - { - /* fix vwxyz thinness */ - { "Consolas", 0, "", 0 }, - /* Fix thin middle stems */ - { "Core MS Legacy Fonts", 0, "Regular", 0 }, - /* Cyrillic small letter I */ - { "Legacy Sans Fonts", 0, "", 0 }, - /* Fix artifacts with some Regular & Bold */ - { "Verdana Clones", 0, "", 0 }, - }; - - -#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1 - - static const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions - [SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] = - { - /* Fixes < and > */ - { "Courier New", 0, "Regular", 0 }, - }; - - - /* Skip Y moves that start with a point that is not on a Y pixel */ - /* boundary and don't move that point to a Y pixel boundary. */ -#define SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE 2 - - static const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_DELTAP_Rules - [SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE] = - { - /* Maintain thickness of diagonal in 'N' */ - { "Times New Roman", 0, "Regular/Bold Class", 'N' }, - { "Georgia", 0, "Regular/Bold Class", 'N' }, - }; - - - /* Skip Y moves that move a point off a Y pixel boundary. */ -#define SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE 1 - - static const SPH_TweakRule SKIP_OFFPIXEL_Y_MOVES_Rules - [SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE] = - { - { "-", 0, "", 0 }, - }; - - -#define SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1 - - static const SPH_TweakRule SKIP_OFFPIXEL_Y_MOVES_Rules_Exceptions - [SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] = - { - { "-", 0, "", 0 }, - }; - - - /* Round moves that don't move a point to a Y pixel boundary. */ -#define ROUND_NONPIXEL_Y_MOVES_RULES_SIZE 2 - - static const SPH_TweakRule ROUND_NONPIXEL_Y_MOVES_Rules - [ROUND_NONPIXEL_Y_MOVES_RULES_SIZE] = - { - /* Droid font instructions don't snap Y to pixels */ - { "Droid Sans", 0, "Regular/Italic Class", 0 }, - { "Droid Sans Mono", 0, "", 0 }, - }; - - -#define ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1 - - static const SPH_TweakRule ROUND_NONPIXEL_Y_MOVES_Rules_Exceptions - [ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] = - { - { "-", 0, "", 0 }, - }; - - - /* Allow a Direct_Move along X freedom vector if matched. */ -#define ALLOW_X_DMOVE_RULES_SIZE 1 - - static const SPH_TweakRule ALLOW_X_DMOVE_Rules - [ALLOW_X_DMOVE_RULES_SIZE] = - { - /* Fixes vanishing diagonal in 4 */ - { "Verdana", 0, "Regular", '4' }, - }; - - - /* Return MS rasterizer version 35 if matched. */ -#define RASTERIZER_35_RULES_SIZE 8 - - static const SPH_TweakRule RASTERIZER_35_Rules - [RASTERIZER_35_RULES_SIZE] = - { - /* This seems to be the only way to make these look good */ - { "Times New Roman", 0, "Regular", 'i' }, - { "Times New Roman", 0, "Regular", 'j' }, - { "Times New Roman", 0, "Regular", 'm' }, - { "Times New Roman", 0, "Regular", 'r' }, - { "Times New Roman", 0, "Regular", 'a' }, - { "Times New Roman", 0, "Regular", 'n' }, - { "Times New Roman", 0, "Regular", 'p' }, - { "Times", 0, "", 0 }, - }; - - - /* Don't round to the subpixel grid. Round to pixel grid. */ -#define NORMAL_ROUND_RULES_SIZE 1 - - static const SPH_TweakRule NORMAL_ROUND_Rules - [NORMAL_ROUND_RULES_SIZE] = - { - /* Fix serif thickness for certain ppems */ - /* Can probably be generalized somehow */ - { "Courier New", 0, "", 0 }, - }; - - - /* Skip IUP instructions if matched. */ -#define SKIP_IUP_RULES_SIZE 1 - - static const SPH_TweakRule SKIP_IUP_Rules - [SKIP_IUP_RULES_SIZE] = - { - { "Arial", 13, "Regular", 'a' }, - }; - - - /* Skip MIAP Twilight hack if matched. */ -#define MIAP_HACK_RULES_SIZE 1 - - static const SPH_TweakRule MIAP_HACK_Rules - [MIAP_HACK_RULES_SIZE] = - { - { "Geneva", 12, "", 0 }, - }; - - - /* Skip DELTAP instructions if matched. */ -#define ALWAYS_SKIP_DELTAP_RULES_SIZE 23 - - static const SPH_TweakRule ALWAYS_SKIP_DELTAP_Rules - [ALWAYS_SKIP_DELTAP_RULES_SIZE] = - { - { "Georgia", 0, "Regular", 'k' }, - /* fix various problems with e in different versions */ - { "Trebuchet MS", 14, "Regular", 'e' }, - { "Trebuchet MS", 13, "Regular", 'e' }, - { "Trebuchet MS", 15, "Regular", 'e' }, - { "Trebuchet MS", 0, "Italic", 'v' }, - { "Trebuchet MS", 0, "Italic", 'w' }, - { "Trebuchet MS", 0, "Regular", 'Y' }, - { "Arial", 11, "Regular", 's' }, - /* prevent problems with '3' and others */ - { "Verdana", 10, "Regular", 0 }, - { "Verdana", 9, "Regular", 0 }, - /* Cyrillic small letter short I */ - { "Legacy Sans Fonts", 0, "", 0x438 }, - { "Legacy Sans Fonts", 0, "", 0x439 }, - { "Arial", 10, "Regular", '6' }, - { "Arial", 0, "Bold/BoldItalic Class", 'a' }, - /* Make horizontal stems consistent with the rest */ - { "Arial", 24, "Bold", 'a' }, - { "Arial", 25, "Bold", 'a' }, - { "Arial", 24, "Bold", 's' }, - { "Arial", 25, "Bold", 's' }, - { "Arial", 34, "Bold", 's' }, - { "Arial", 35, "Bold", 's' }, - { "Arial", 36, "Bold", 's' }, - { "Arial", 25, "Regular", 's' }, - { "Arial", 26, "Regular", 's' }, - }; - - - /* Always do DELTAP instructions if matched. */ -#define ALWAYS_DO_DELTAP_RULES_SIZE 1 - - static const SPH_TweakRule ALWAYS_DO_DELTAP_Rules - [ALWAYS_DO_DELTAP_RULES_SIZE] = - { - { "-", 0, "", 0 }, - }; - - - /* Don't allow ALIGNRP after IUP. */ -#define NO_ALIGNRP_AFTER_IUP_RULES_SIZE 1 - - static const SPH_TweakRule NO_ALIGNRP_AFTER_IUP_Rules - [NO_ALIGNRP_AFTER_IUP_RULES_SIZE] = - { - /* Prevent creation of dents in outline */ - { "-", 0, "", 0 }, - }; - - - /* Don't allow DELTAP after IUP. */ -#define NO_DELTAP_AFTER_IUP_RULES_SIZE 1 - - static const SPH_TweakRule NO_DELTAP_AFTER_IUP_Rules - [NO_DELTAP_AFTER_IUP_RULES_SIZE] = - { - { "-", 0, "", 0 }, - }; - - - /* Don't allow CALL after IUP. */ -#define NO_CALL_AFTER_IUP_RULES_SIZE 1 - - static const SPH_TweakRule NO_CALL_AFTER_IUP_Rules - [NO_CALL_AFTER_IUP_RULES_SIZE] = - { - /* Prevent creation of dents in outline */ - { "-", 0, "", 0 }, - }; - - - /* De-embolden these glyphs slightly. */ -#define DEEMBOLDEN_RULES_SIZE 9 - - static const SPH_TweakRule DEEMBOLDEN_Rules - [DEEMBOLDEN_RULES_SIZE] = - { - { "Courier New", 0, "Bold", 'A' }, - { "Courier New", 0, "Bold", 'W' }, - { "Courier New", 0, "Bold", 'w' }, - { "Courier New", 0, "Bold", 'M' }, - { "Courier New", 0, "Bold", 'X' }, - { "Courier New", 0, "Bold", 'K' }, - { "Courier New", 0, "Bold", 'x' }, - { "Courier New", 0, "Bold", 'z' }, - { "Courier New", 0, "Bold", 'v' }, - }; - - - /* Embolden these glyphs slightly. */ -#define EMBOLDEN_RULES_SIZE 2 - - static const SPH_TweakRule EMBOLDEN_Rules - [EMBOLDEN_RULES_SIZE] = - { - { "Courier New", 0, "Regular", 0 }, - { "Courier New", 0, "Italic", 0 }, - }; - - - /* This is a CVT hack that makes thick horizontal stems on 2, 5, 7 */ - /* similar to Windows XP. */ -#define TIMES_NEW_ROMAN_HACK_RULES_SIZE 12 - - static const SPH_TweakRule TIMES_NEW_ROMAN_HACK_Rules - [TIMES_NEW_ROMAN_HACK_RULES_SIZE] = - { - { "Times New Roman", 16, "Italic", '2' }, - { "Times New Roman", 16, "Italic", '5' }, - { "Times New Roman", 16, "Italic", '7' }, - { "Times New Roman", 16, "Regular", '2' }, - { "Times New Roman", 16, "Regular", '5' }, - { "Times New Roman", 16, "Regular", '7' }, - { "Times New Roman", 17, "Italic", '2' }, - { "Times New Roman", 17, "Italic", '5' }, - { "Times New Roman", 17, "Italic", '7' }, - { "Times New Roman", 17, "Regular", '2' }, - { "Times New Roman", 17, "Regular", '5' }, - { "Times New Roman", 17, "Regular", '7' }, - }; - - - /* This fudges distance on 2 to get rid of the vanishing stem issue. */ - /* A real solution to this is certainly welcome. */ -#define COURIER_NEW_2_HACK_RULES_SIZE 15 - - static const SPH_TweakRule COURIER_NEW_2_HACK_Rules - [COURIER_NEW_2_HACK_RULES_SIZE] = - { - { "Courier New", 10, "Regular", '2' }, - { "Courier New", 11, "Regular", '2' }, - { "Courier New", 12, "Regular", '2' }, - { "Courier New", 13, "Regular", '2' }, - { "Courier New", 14, "Regular", '2' }, - { "Courier New", 15, "Regular", '2' }, - { "Courier New", 16, "Regular", '2' }, - { "Courier New", 17, "Regular", '2' }, - { "Courier New", 18, "Regular", '2' }, - { "Courier New", 19, "Regular", '2' }, - { "Courier New", 20, "Regular", '2' }, - { "Courier New", 21, "Regular", '2' }, - { "Courier New", 22, "Regular", '2' }, - { "Courier New", 23, "Regular", '2' }, - { "Courier New", 24, "Regular", '2' }, - }; - - -#ifndef FORCE_NATURAL_WIDTHS - - /* Use compatible widths with these glyphs. Compatible widths is always */ - /* on when doing B/W TrueType instructing, but is used selectively here, */ - /* typically on glyphs with 3 or more vertical stems. */ -#define COMPATIBLE_WIDTHS_RULES_SIZE 38 - - static const SPH_TweakRule COMPATIBLE_WIDTHS_Rules - [COMPATIBLE_WIDTHS_RULES_SIZE] = - { - { "Arial Unicode MS", 12, "Regular Class", 'm' }, - { "Arial Unicode MS", 14, "Regular Class", 'm' }, - /* Cyrillic small letter sha */ - { "Arial", 10, "Regular Class", 0x448 }, - { "Arial", 11, "Regular Class", 'm' }, - { "Arial", 12, "Regular Class", 'm' }, - /* Cyrillic small letter sha */ - { "Arial", 12, "Regular Class", 0x448 }, - { "Arial", 13, "Regular Class", 0x448 }, - { "Arial", 14, "Regular Class", 'm' }, - /* Cyrillic small letter sha */ - { "Arial", 14, "Regular Class", 0x448 }, - { "Arial", 15, "Regular Class", 0x448 }, - { "Arial", 17, "Regular Class", 'm' }, - { "DejaVu Sans", 15, "Regular Class", 0 }, - { "Microsoft Sans Serif", 11, "Regular Class", 0 }, - { "Microsoft Sans Serif", 12, "Regular Class", 0 }, - { "Segoe UI", 11, "Regular Class", 0 }, - { "Monaco", 0, "Regular Class", 0 }, - { "Segoe UI", 12, "Regular Class", 'm' }, - { "Segoe UI", 14, "Regular Class", 'm' }, - { "Tahoma", 11, "Regular Class", 0 }, - { "Times New Roman", 16, "Regular Class", 'c' }, - { "Times New Roman", 16, "Regular Class", 'm' }, - { "Times New Roman", 16, "Regular Class", 'o' }, - { "Times New Roman", 16, "Regular Class", 'w' }, - { "Trebuchet MS", 11, "Regular Class", 0 }, - { "Trebuchet MS", 12, "Regular Class", 0 }, - { "Trebuchet MS", 14, "Regular Class", 0 }, - { "Trebuchet MS", 15, "Regular Class", 0 }, - { "Ubuntu", 12, "Regular Class", 'm' }, - /* Cyrillic small letter sha */ - { "Verdana", 10, "Regular Class", 0x448 }, - { "Verdana", 11, "Regular Class", 0x448 }, - { "Verdana and Clones", 12, "Regular Class", 'i' }, - { "Verdana and Clones", 12, "Regular Class", 'j' }, - { "Verdana and Clones", 12, "Regular Class", 'l' }, - { "Verdana and Clones", 12, "Regular Class", 'm' }, - { "Verdana and Clones", 13, "Regular Class", 'i' }, - { "Verdana and Clones", 13, "Regular Class", 'j' }, - { "Verdana and Clones", 13, "Regular Class", 'l' }, - { "Verdana and Clones", 14, "Regular Class", 'm' }, - }; - - - /* Scaling slightly in the x-direction prior to hinting results in */ - /* more visually pleasing glyphs in certain cases. */ - /* This sometimes needs to be coordinated with compatible width rules. */ - /* A value of 1000 corresponds to a scaled value of 1.0. */ - -#define X_SCALING_RULES_SIZE 50 - - static const SPH_ScaleRule X_SCALING_Rules[X_SCALING_RULES_SIZE] = - { - { "DejaVu Sans", 12, "Regular Class", 'm', 950 }, - { "Verdana and Clones", 12, "Regular Class", 'a', 1100 }, - { "Verdana and Clones", 13, "Regular Class", 'a', 1050 }, - { "Arial", 11, "Regular Class", 'm', 975 }, - { "Arial", 12, "Regular Class", 'm', 1050 }, - /* Cyrillic small letter el */ - { "Arial", 13, "Regular Class", 0x43B, 950 }, - { "Arial", 13, "Regular Class", 'o', 950 }, - { "Arial", 13, "Regular Class", 'e', 950 }, - { "Arial", 14, "Regular Class", 'm', 950 }, - /* Cyrillic small letter el */ - { "Arial", 15, "Regular Class", 0x43B, 925 }, - { "Bitstream Vera Sans", 10, "Regular/Italic Class", 0, 1100 }, - { "Bitstream Vera Sans", 12, "Regular/Italic Class", 0, 1050 }, - { "Bitstream Vera Sans", 16, "Regular Class", 0, 1050 }, - { "Bitstream Vera Sans", 9, "Regular/Italic Class", 0, 1050 }, - { "DejaVu Sans", 12, "Regular Class", 'l', 975 }, - { "DejaVu Sans", 12, "Regular Class", 'i', 975 }, - { "DejaVu Sans", 12, "Regular Class", 'j', 975 }, - { "DejaVu Sans", 13, "Regular Class", 'l', 950 }, - { "DejaVu Sans", 13, "Regular Class", 'i', 950 }, - { "DejaVu Sans", 13, "Regular Class", 'j', 950 }, - { "DejaVu Sans", 10, "Regular/Italic Class", 0, 1100 }, - { "DejaVu Sans", 12, "Regular/Italic Class", 0, 1050 }, - { "Georgia", 10, "", 0, 1050 }, - { "Georgia", 11, "", 0, 1100 }, - { "Georgia", 12, "", 0, 1025 }, - { "Georgia", 13, "", 0, 1050 }, - { "Georgia", 16, "", 0, 1050 }, - { "Georgia", 17, "", 0, 1030 }, - { "Liberation Sans", 12, "Regular Class", 'm', 1100 }, - { "Lucida Grande", 11, "Regular Class", 'm', 1100 }, - { "Microsoft Sans Serif", 11, "Regular Class", 'm', 950 }, - { "Microsoft Sans Serif", 12, "Regular Class", 'm', 1050 }, - { "Segoe UI", 12, "Regular Class", 'H', 1050 }, - { "Segoe UI", 12, "Regular Class", 'm', 1050 }, - { "Segoe UI", 14, "Regular Class", 'm', 1050 }, - { "Tahoma", 11, "Regular Class", 'i', 975 }, - { "Tahoma", 11, "Regular Class", 'l', 975 }, - { "Tahoma", 11, "Regular Class", 'j', 900 }, - { "Tahoma", 11, "Regular Class", 'm', 918 }, - { "Verdana", 10, "Regular/Italic Class", 0, 1100 }, - { "Verdana", 12, "Regular Class", 'm', 975 }, - { "Verdana", 12, "Regular/Italic Class", 0, 1050 }, - { "Verdana", 13, "Regular/Italic Class", 'i', 950 }, - { "Verdana", 13, "Regular/Italic Class", 'j', 950 }, - { "Verdana", 13, "Regular/Italic Class", 'l', 950 }, - { "Verdana", 16, "Regular Class", 0, 1050 }, - { "Verdana", 9, "Regular/Italic Class", 0, 1050 }, - { "Times New Roman", 16, "Regular Class", 'm', 918 }, - { "Trebuchet MS", 11, "Regular Class", 'm', 800 }, - { "Trebuchet MS", 12, "Regular Class", 'm', 800 }, - }; - -#else - -#define COMPATIBLE_WIDTHS_RULES_SIZE 1 - - static const SPH_TweakRule COMPATIBLE_WIDTHS_Rules - [COMPATIBLE_WIDTHS_RULES_SIZE] = - { - { "-", 0, "", 0 }, - }; - - -#define X_SCALING_RULES_SIZE 1 - - static const SPH_ScaleRule X_SCALING_Rules - [X_SCALING_RULES_SIZE] = - { - { "-", 0, "", 0, 1000 }, - }; - -#endif /* FORCE_NATURAL_WIDTHS */ - - - static FT_Bool - is_member_of_family_class( const FT_String* detected_font_name, - const FT_String* rule_font_name ) - { - FT_UInt i, j; - - - /* Does font name match rule family? */ - if ( ft_strcmp( detected_font_name, rule_font_name ) == 0 ) - return TRUE; - - /* Is font name a wildcard ""? */ - if ( ft_strcmp( rule_font_name, "" ) == 0 ) - return TRUE; - - /* Is font name contained in a class list? */ - for ( i = 0; i < FAMILY_CLASS_RULES_SIZE; i++ ) - { - if ( ft_strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 ) - { - for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ ) - { - if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 ) - continue; - if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j], - detected_font_name ) == 0 ) - return TRUE; - } - } - } - - return FALSE; - } - - - static FT_Bool - is_member_of_style_class( const FT_String* detected_font_style, - const FT_String* rule_font_style ) - { - FT_UInt i, j; - - - /* Does font style match rule style? */ - if ( ft_strcmp( detected_font_style, rule_font_style ) == 0 ) - return TRUE; - - /* Is font style a wildcard ""? */ - if ( ft_strcmp( rule_font_style, "" ) == 0 ) - return TRUE; - - /* Is font style contained in a class list? */ - for ( i = 0; i < STYLE_CLASS_RULES_SIZE; i++ ) - { - if ( ft_strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 ) - { - for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ ) - { - if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 ) - continue; - if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j], - detected_font_style ) == 0 ) - return TRUE; - } - } - } - - return FALSE; - } - - - FT_LOCAL_DEF( FT_Bool ) - sph_test_tweak( TT_Face face, - const FT_String* family, - FT_UInt ppem, - const FT_String* style, - FT_UInt glyph_index, - const SPH_TweakRule* rule, - FT_UInt num_rules ) - { - FT_UInt i; - - - /* rule checks may be able to be optimized further */ - for ( i = 0; i < num_rules; i++ ) - { - if ( family && - ( is_member_of_family_class ( family, rule[i].family ) ) ) - if ( rule[i].ppem == 0 || - rule[i].ppem == ppem ) - if ( style && - is_member_of_style_class ( style, rule[i].style ) ) - if ( rule[i].glyph == 0 || - FT_Get_Char_Index( (FT_Face)face, - rule[i].glyph ) == glyph_index ) - return TRUE; - } - - return FALSE; - } - - - static FT_UInt - scale_test_tweak( TT_Face face, - const FT_String* family, - FT_UInt ppem, - const FT_String* style, - FT_UInt glyph_index, - const SPH_ScaleRule* rule, - FT_UInt num_rules ) - { - FT_UInt i; - - - /* rule checks may be able to be optimized further */ - for ( i = 0; i < num_rules; i++ ) - { - if ( family && - ( is_member_of_family_class ( family, rule[i].family ) ) ) - if ( rule[i].ppem == 0 || - rule[i].ppem == ppem ) - if ( style && - is_member_of_style_class( style, rule[i].style ) ) - if ( rule[i].glyph == 0 || - FT_Get_Char_Index( (FT_Face)face, - rule[i].glyph ) == glyph_index ) - return rule[i].scale; - } - - return 1000; - } - - - FT_LOCAL_DEF( FT_UInt ) - sph_test_tweak_x_scaling( TT_Face face, - const FT_String* family, - FT_UInt ppem, - const FT_String* style, - FT_UInt glyph_index ) - { - return scale_test_tweak( face, family, ppem, style, glyph_index, - X_SCALING_Rules, X_SCALING_RULES_SIZE ); - } - - -#define TWEAK_RULES( x ) \ - if ( sph_test_tweak( face, family, ppem, style, glyph_index, \ - x##_Rules, x##_RULES_SIZE ) ) \ - loader->exec->sph_tweak_flags |= SPH_TWEAK_##x - -#define TWEAK_RULES_EXCEPTIONS( x ) \ - if ( sph_test_tweak( face, family, ppem, style, glyph_index, \ - x##_Rules_Exceptions, x##_RULES_EXCEPTIONS_SIZE ) ) \ - loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x - - - FT_LOCAL_DEF( void ) - sph_set_tweaks( TT_Loader loader, - FT_UInt glyph_index ) - { - TT_Face face = loader->face; - FT_String* family = face->root.family_name; - FT_UInt ppem = loader->size->metrics->x_ppem; - FT_String* style = face->root.style_name; - - - /* don't apply rules if style isn't set */ - if ( !face->root.style_name ) - return; - -#ifdef SPH_DEBUG_MORE_VERBOSE - printf( "%s,%d,%s,%c=%d ", - family, ppem, style, glyph_index, glyph_index ); -#endif - - TWEAK_RULES( PIXEL_HINTING ); - - if ( loader->exec->sph_tweak_flags & SPH_TWEAK_PIXEL_HINTING ) - { - loader->exec->ignore_x_mode = FALSE; - return; - } - - TWEAK_RULES( ALLOW_X_DMOVE ); - TWEAK_RULES( ALWAYS_DO_DELTAP ); - TWEAK_RULES( ALWAYS_SKIP_DELTAP ); - TWEAK_RULES( DEEMBOLDEN ); - TWEAK_RULES( DO_SHPIX ); - TWEAK_RULES( EMBOLDEN ); - TWEAK_RULES( MIAP_HACK ); - TWEAK_RULES( NORMAL_ROUND ); - TWEAK_RULES( NO_ALIGNRP_AFTER_IUP ); - TWEAK_RULES( NO_CALL_AFTER_IUP ); - TWEAK_RULES( NO_DELTAP_AFTER_IUP ); - TWEAK_RULES( RASTERIZER_35 ); - TWEAK_RULES( SKIP_IUP ); - - TWEAK_RULES( SKIP_OFFPIXEL_Y_MOVES ); - TWEAK_RULES_EXCEPTIONS( SKIP_OFFPIXEL_Y_MOVES ); - - TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES_DELTAP ); - - TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES ); - TWEAK_RULES_EXCEPTIONS( SKIP_NONPIXEL_Y_MOVES ); - - TWEAK_RULES( ROUND_NONPIXEL_Y_MOVES ); - TWEAK_RULES_EXCEPTIONS( ROUND_NONPIXEL_Y_MOVES ); - - if ( loader->exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 ) - { - if ( loader->exec->rasterizer_version != TT_INTERPRETER_VERSION_35 ) - { - loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35; - loader->exec->size->cvt_ready = -1; - - tt_size_ready_bytecode( - loader->exec->size, - FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) ); - } - else - loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35; - } - else - { - if ( loader->exec->rasterizer_version != - SPH_OPTION_SET_RASTERIZER_VERSION ) - { - loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION; - loader->exec->size->cvt_ready = -1; - - tt_size_ready_bytecode( - loader->exec->size, - FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) ); - } - else - loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION; - } - - if ( IS_HINTED( loader->load_flags ) ) - { - TWEAK_RULES( TIMES_NEW_ROMAN_HACK ); - TWEAK_RULES( COURIER_NEW_2_HACK ); - } - - if ( sph_test_tweak( face, family, ppem, style, glyph_index, - COMPATIBILITY_MODE_Rules, COMPATIBILITY_MODE_RULES_SIZE ) ) - loader->exec->face->sph_compatibility_mode = TRUE; - - - if ( IS_HINTED( loader->load_flags ) ) - { - if ( sph_test_tweak( face, family, ppem, style, glyph_index, - COMPATIBLE_WIDTHS_Rules, COMPATIBLE_WIDTHS_RULES_SIZE ) ) - loader->exec->compatible_widths |= TRUE; - } - } - -#else /* !(TT_USE_BYTECODE_INTERPRETER && */ - /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */ - - /* ANSI C doesn't like empty source files */ - typedef int tt_subpix_dummy_; - -#endif /* !(TT_USE_BYTECODE_INTERPRETER && */ - /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */ - - -/* END */ diff --git a/src/truetype/ttsubpix.h b/src/truetype/ttsubpix.h deleted file mode 100644 index 62af4c272..000000000 --- a/src/truetype/ttsubpix.h +++ /dev/null @@ -1,110 +0,0 @@ -/**************************************************************************** - * - * ttsubpix.h - * - * TrueType Subpixel Hinting. - * - * Copyright (C) 2010-2023 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - -#ifndef TTSUBPIX_H_ -#define TTSUBPIX_H_ - -#include "ttobjs.h" -#include "ttinterp.h" - - -FT_BEGIN_HEADER - - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - /************************************************************************** - * - * ID flags to identify special functions at FDEF and runtime. - * - */ -#define SPH_FDEF_INLINE_DELTA_1 0x0000001 -#define SPH_FDEF_INLINE_DELTA_2 0x0000002 -#define SPH_FDEF_DIAGONAL_STROKE 0x0000004 -#define SPH_FDEF_VACUFORM_ROUND_1 0x0000008 -#define SPH_FDEF_TTFAUTOHINT_1 0x0000010 -#define SPH_FDEF_SPACING_1 0x0000020 -#define SPH_FDEF_SPACING_2 0x0000040 -#define SPH_FDEF_TYPEMAN_STROKES 0x0000080 -#define SPH_FDEF_TYPEMAN_DIAGENDCTRL 0x0000100 - - - /************************************************************************** - * - * Tweak flags that are set for each glyph by the below rules. - * - */ -#define SPH_TWEAK_ALLOW_X_DMOVE 0x0000001UL -#define SPH_TWEAK_ALWAYS_DO_DELTAP 0x0000002UL -#define SPH_TWEAK_ALWAYS_SKIP_DELTAP 0x0000004UL -#define SPH_TWEAK_COURIER_NEW_2_HACK 0x0000008UL -#define SPH_TWEAK_DEEMBOLDEN 0x0000010UL -#define SPH_TWEAK_DO_SHPIX 0x0000020UL -#define SPH_TWEAK_EMBOLDEN 0x0000040UL -#define SPH_TWEAK_MIAP_HACK 0x0000080UL -#define SPH_TWEAK_NORMAL_ROUND 0x0000100UL -#define SPH_TWEAK_NO_ALIGNRP_AFTER_IUP 0x0000200UL -#define SPH_TWEAK_NO_CALL_AFTER_IUP 0x0000400UL -#define SPH_TWEAK_NO_DELTAP_AFTER_IUP 0x0000800UL -#define SPH_TWEAK_PIXEL_HINTING 0x0001000UL -#define SPH_TWEAK_RASTERIZER_35 0x0002000UL -#define SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES 0x0004000UL -#define SPH_TWEAK_SKIP_IUP 0x0008000UL -#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES 0x0010000UL -#define SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES 0x0020000UL -#define SPH_TWEAK_TIMES_NEW_ROMAN_HACK 0x0040000UL -#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP 0x0080000UL - - - FT_LOCAL( FT_Bool ) - sph_test_tweak( TT_Face face, - const FT_String* family, - FT_UInt ppem, - const FT_String* style, - FT_UInt glyph_index, - const SPH_TweakRule* rule, - FT_UInt num_rules ); - - FT_LOCAL( FT_UInt ) - sph_test_tweak_x_scaling( TT_Face face, - const FT_String* family, - FT_UInt ppem, - const FT_String* style, - FT_UInt glyph_index ); - - FT_LOCAL( void ) - sph_set_tweaks( TT_Loader loader, - FT_UInt glyph_index ); - - - /* These macros are defined absent a method for setting them */ -#define SPH_OPTION_BITMAP_WIDTHS FALSE -#define SPH_OPTION_SET_SUBPIXEL TRUE -#define SPH_OPTION_SET_GRAYSCALE FALSE -#define SPH_OPTION_SET_COMPATIBLE_WIDTHS FALSE -#define SPH_OPTION_SET_RASTERIZER_VERSION 38 - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - - -FT_END_HEADER - -#endif /* TTSUBPIX_H_ */ - - -/* END */ From 1ecfd2199012edb403605c7f68618a761eaf1193 Mon Sep 17 00:00:00 2001 From: Alexei Podtelezhnikov Date: Thu, 27 Jul 2023 16:12:28 +0000 Subject: [PATCH 14/28] [truetype] Remove Infinality for good (remaining bits). * src/truetype/ttobjs.h: Remove remaining fields. * src/truetype/ttinterp.c: Do not initialize them. * include/freetype/internal/tttypes.h: Remove descriptions. --- include/freetype/internal/tttypes.h | 8 -------- src/truetype/ttinterp.c | 2 -- src/truetype/ttobjs.h | 2 -- 3 files changed, 12 deletions(-) diff --git a/include/freetype/internal/tttypes.h b/include/freetype/internal/tttypes.h index c821741f8..b9788c783 100644 --- a/include/freetype/internal/tttypes.h +++ b/include/freetype/internal/tttypes.h @@ -1394,14 +1394,6 @@ FT_BEGIN_HEADER * vert_metrics_offset :: * The file offset of the 'vmtx' table. * - * sph_found_func_flags :: - * Flags identifying special bytecode functions (used by the v38 - * implementation of the bytecode interpreter). - * - * sph_compatibility_mode :: - * This flag is set if we are in ClearType backward compatibility mode - * (used by the v38 implementation of the bytecode interpreter). - * * ebdt_start :: * The file offset of the sbit data table (CBDT, bdat, etc.). * diff --git a/src/truetype/ttinterp.c b/src/truetype/ttinterp.c index 93e89691d..79df4555d 100644 --- a/src/truetype/ttinterp.c +++ b/src/truetype/ttinterp.c @@ -3544,8 +3544,6 @@ rec->opc = (FT_UInt16)n; rec->start = exc->IP + 1; rec->active = TRUE; - rec->inline_delta = FALSE; - rec->sph_fdef_flags = 0x0000; if ( n > exc->maxFunc ) exc->maxFunc = (FT_UInt16)n; diff --git a/src/truetype/ttobjs.h b/src/truetype/ttobjs.h index d1834c046..40eb37b4c 100644 --- a/src/truetype/ttobjs.h +++ b/src/truetype/ttobjs.h @@ -162,8 +162,6 @@ FT_BEGIN_HEADER FT_Long end; /* where does it end? */ FT_UInt opc; /* function #, or instruction code */ FT_Bool active; /* is it active? */ - FT_Bool inline_delta; /* is function that defines inline delta? */ - FT_ULong sph_fdef_flags; /* flags to identify special functions */ } TT_DefRecord, *TT_DefArray; From b2584c738f1a92e6369890cff0504cc044315b38 Mon Sep 17 00:00:00 2001 From: Alexei Podtelezhnikov Date: Fri, 28 Jul 2023 22:35:58 -0400 Subject: [PATCH 15/28] [truetype] Reduce v40 footprint. * src/truetype/ttgload.c (TT_HInt_Glyph, tt_loader_set_pp, tt_loader_init): Refactor code. --- src/truetype/ttgload.c | 75 +++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 44 deletions(-) diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c index 5eedb5331..dc427e8a1 100644 --- a/src/truetype/ttgload.c +++ b/src/truetype/ttgload.c @@ -852,22 +852,21 @@ #endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL /* Save possibly modified glyph phantom points unless in v40 backward */ /* compatibility mode, where no movement on the x axis means no reason */ /* to change bearings or advance widths. */ - if ( !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && - exec->backward_compatibility ) ) - { -#endif - loader->pp1 = zone->cur[zone->n_points - 4]; - loader->pp2 = zone->cur[zone->n_points - 3]; - loader->pp3 = zone->cur[zone->n_points - 2]; - loader->pp4 = zone->cur[zone->n_points - 1]; + #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - } + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && + exec->backward_compatibility ) + return FT_Err_Ok; #endif + loader->pp1 = zone->cur[zone->n_points - 4]; + loader->pp2 = zone->cur[zone->n_points - 3]; + loader->pp3 = zone->cur[zone->n_points - 2]; + loader->pp4 = zone->cur[zone->n_points - 1]; + return FT_Err_Ok; } @@ -1365,36 +1364,31 @@ static void tt_loader_set_pp( TT_Loader loader ) { - FT_Bool subpixel_hinting = 0; - FT_Bool grayscale = 0; - FT_Bool use_aw_2 = 0; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( loader->face ); -#endif - - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) - { - subpixel_hinting = loader->exec ? loader->exec->subpixel_hinting_lean - : 0; - grayscale = loader->exec ? loader->exec->grayscale_cleartype - : 0; - } -#endif - - use_aw_2 = FT_BOOL( subpixel_hinting && grayscale ); - loader->pp1.x = loader->bbox.xMin - loader->left_bearing; loader->pp1.y = 0; loader->pp2.x = loader->pp1.x + loader->advance; loader->pp2.y = 0; - loader->pp3.x = use_aw_2 ? loader->advance / 2 : 0; + loader->pp3.x = 0; loader->pp3.y = loader->bbox.yMax + loader->top_bearing; - loader->pp4.x = use_aw_2 ? loader->advance / 2 : 0; + loader->pp4.x = 0; loader->pp4.y = loader->pp3.y - loader->vadvance; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + { + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( loader->face ); + + + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && + loader->exec && + loader->exec->subpixel_hinting_lean && + loader->exec->grayscale_cleartype ) + { + loader->pp3.x = loader->advance / 2; + loader->pp4.x = loader->advance / 2; + } + } +#endif } @@ -2221,6 +2215,9 @@ if ( !exec ) return FT_THROW( Could_Not_Find_Context ); + grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != + FT_RENDER_MODE_MONO ); + #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) { @@ -2237,6 +2234,7 @@ FT_BOOL( subpixel_hinting_lean && ( load_flags & FT_LOAD_TARGET_LCD_V ) ); + grayscale = FT_BOOL( grayscale && !subpixel_hinting_lean ); } else { @@ -2246,22 +2244,11 @@ } #endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) - grayscale = FT_BOOL( !subpixel_hinting_lean && - FT_LOAD_TARGET_MODE( load_flags ) != - FT_RENDER_MODE_MONO ); - else -#endif - grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != - FT_RENDER_MODE_MONO ); - error = TT_Load_Context( exec, face, size ); if ( error ) return error; { - #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) { From 95a872085e5a79cf710acf6389dbd55b6e728aac Mon Sep 17 00:00:00 2001 From: Alexei Podtelezhnikov Date: Tue, 1 Aug 2023 22:48:31 -0400 Subject: [PATCH 16/28] * src/base/ftobjs.c (open_face_from_buffer): Silence `maybe-uninitialized`. We never call this function without a `driver_name` (#1245). --- src/base/ftobjs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index abfa3ab0e..89a25bc73 100644 --- a/src/base/ftobjs.c +++ b/src/base/ftobjs.c @@ -1747,7 +1747,8 @@ FT_Memory memory = library->memory; - args.flags = 0; + args.driver = NULL; + args.flags = 0; if ( driver_name ) { From 3829fdaae5f12590f93807e9bcb866be131a201a Mon Sep 17 00:00:00 2001 From: Ben Wagner Date: Fri, 4 Aug 2023 11:41:23 -0400 Subject: [PATCH 17/28] Avoid overflow in COLR bounds checks. The values read into `base_glyphs_offset_v1` and `layer_offset_v1` may be in the range 0xFFFFFFFD-0xFFFFFFFF. On systems where `unsigned long` is 32 bits adding 4 to such values will wrap and pass bounds checks but accessing values at such offsets will be out of bounds. On the other hand `table_size` has already been tested to be at least `COLRV1_HEADER_SIZE` (34) so it is safe to subtract 4 from it. * src/sfnt/ttcolr.c (tt_face_load_colr): subtract 4 from `table_size` instead of adding 4 to font data offsets in bounds checks Fixes: https://crbug.com/1469348 --- src/sfnt/ttcolr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sfnt/ttcolr.c b/src/sfnt/ttcolr.c index 69ccf0ee7..281e7135e 100644 --- a/src/sfnt/ttcolr.c +++ b/src/sfnt/ttcolr.c @@ -229,7 +229,7 @@ base_glyphs_offset_v1 = FT_NEXT_ULONG( p ); - if ( base_glyphs_offset_v1 + 4 >= table_size ) + if ( base_glyphs_offset_v1 >= table_size - 4 ) goto InvalidTable; p1 = (FT_Byte*)( table + base_glyphs_offset_v1 ); @@ -249,7 +249,7 @@ if ( layer_offset_v1 ) { - if ( layer_offset_v1 + 4 >= table_size ) + if ( layer_offset_v1 >= table_size - 4 ) goto InvalidTable; p1 = (FT_Byte*)( table + layer_offset_v1 ); From a20de84e1608f9eb1d0391d7322b2e0e0f235aba Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Sat, 12 Aug 2023 11:47:41 +0200 Subject: [PATCH 18/28] Fix warnings in tracing messages for 32bit compilation. Since we now require C99, use `%td` for `ptrdiff_t` and `%zu` for `size_t`. --- src/autofit/afcjk.c | 6 +++--- src/autofit/aflatin.c | 38 +++++++++++++++++++------------------- src/psaux/cffdecode.c | 6 +++--- src/psaux/pshints.c | 2 +- src/psaux/t1decode.c | 4 ++-- src/smooth/ftgrays.c | 2 +- src/type1/t1load.c | 4 ++-- src/type42/t42parse.c | 2 +- 8 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/autofit/afcjk.c b/src/autofit/afcjk.c index af775b190..f414289ad 100644 --- a/src/autofit/afcjk.c +++ b/src/autofit/afcjk.c @@ -1634,7 +1634,7 @@ stem_edge->pos = base_edge->pos + fitted_width; - FT_TRACE5(( " CJKLINK: edge %ld @%d (opos=%.2f) linked to %.2f," + FT_TRACE5(( " CJKLINK: edge %td @%d (opos=%.2f) linked to %.2f," " dist was %.2f, now %.2f\n", stem_edge - hints->axis[dim].edges, stem_edge->fpos, (double)stem_edge->opos / 64, @@ -1858,7 +1858,7 @@ continue; #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " CJKBLUE: edge %ld @%d (opos=%.2f) snapped to %.2f," + FT_TRACE5(( " CJKBLUE: edge %td @%d (opos=%.2f) snapped to %.2f," " was %.2f\n", edge1 - edges, edge1->fpos, (double)edge1->opos / 64, (double)blue->fit / 64, (double)edge1->pos / 64 )); @@ -1922,7 +1922,7 @@ /* this should not happen, but it's better to be safe */ if ( edge2->blue_edge ) { - FT_TRACE5(( "ASSERTION FAILED for edge %ld\n", edge2-edges )); + FT_TRACE5(( "ASSERTION FAILED for edge %td\n", edge2 - edges )); af_cjk_align_linked_edge( hints, dim, edge2, edge ); edge->flags |= AF_EDGE_DONE; diff --git a/src/autofit/aflatin.c b/src/autofit/aflatin.c index 46c6e450a..b86367aa9 100644 --- a/src/autofit/aflatin.c +++ b/src/autofit/aflatin.c @@ -1022,7 +1022,7 @@ { *a = *b; FT_TRACE5(( "blue zone overlap:" - " adjusting %s %ld to %ld\n", + " adjusting %s %td to %ld\n", a_is_top ? "overshoot" : "reference", blue_sorted[i] - axis->blues, *a )); @@ -2960,7 +2960,7 @@ stem_edge->pos = base_edge->pos + fitted_width; - FT_TRACE5(( " LINK: edge %ld (opos=%.2f) linked to %.2f," + FT_TRACE5(( " LINK: edge %td (opos=%.2f) linked to %.2f," " dist was %.2f, now %.2f\n", stem_edge - hints->axis[dim].edges, (double)stem_edge->opos / 64, (double)stem_edge->pos / 64, @@ -3085,13 +3085,13 @@ #ifdef FT_DEBUG_LEVEL_TRACE if ( !anchor ) - FT_TRACE5(( " BLUE_ANCHOR: edge %ld (opos=%.2f) snapped to %.2f," - " was %.2f (anchor=edge %ld)\n", + FT_TRACE5(( " BLUE_ANCHOR: edge %td (opos=%.2f) snapped to %.2f," + " was %.2f (anchor=edge %td)\n", edge1 - edges, (double)edge1->opos / 64, (double)blue->fit / 64, (double)edge1->pos / 64, edge - edges )); else - FT_TRACE5(( " BLUE: edge %ld (opos=%.2f) snapped to %.2f," + FT_TRACE5(( " BLUE: edge %td (opos=%.2f) snapped to %.2f," " was %.2f\n", edge1 - edges, (double)edge1->opos / 64, (double)blue->fit / 64, @@ -3141,7 +3141,7 @@ /* this should not happen, but it's better to be safe */ if ( edge2->blue_edge ) { - FT_TRACE5(( " ASSERTION FAILED for edge %ld\n", edge2 - edges )); + FT_TRACE5(( " ASSERTION FAILED for edge %td\n", edge2 - edges )); af_latin_align_linked_edge( hints, dim, edge2, edge ); edge->flags |= AF_EDGE_DONE; @@ -3209,7 +3209,7 @@ anchor = edge; edge->flags |= AF_EDGE_DONE; - FT_TRACE5(( " ANCHOR: edge %ld (opos=%.2f) and %ld (opos=%.2f)" + FT_TRACE5(( " ANCHOR: edge %td (opos=%.2f) and %td (opos=%.2f)" " snapped to %.2f and %.2f\n", edge - edges, (double)edge->opos / 64, edge2 - edges, (double)edge2->opos / 64, @@ -3238,7 +3238,7 @@ if ( edge2->flags & AF_EDGE_DONE ) { - FT_TRACE5(( " ADJUST: edge %ld (pos=%.2f) moved to %.2f\n", + FT_TRACE5(( " ADJUST: edge %td (pos=%.2f) moved to %.2f\n", edge - edges, (double)edge->pos / 64, (double)( edge2->pos - cur_len ) / 64 )); @@ -3279,7 +3279,7 @@ edge->pos = cur_pos1 - cur_len / 2; edge2->pos = cur_pos1 + cur_len / 2; - FT_TRACE5(( " STEM: edge %ld (opos=%.2f) linked to %ld (opos=%.2f)" + FT_TRACE5(( " STEM: edge %td (opos=%.2f) linked to %td (opos=%.2f)" " snapped to %.2f and %.2f\n", edge - edges, (double)edge->opos / 64, edge2 - edges, (double)edge2->opos / 64, @@ -3310,7 +3310,7 @@ edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2; edge2->pos = edge->pos + cur_len; - FT_TRACE5(( " STEM: edge %ld (opos=%.2f) linked to %ld (opos=%.2f)" + FT_TRACE5(( " STEM: edge %td (opos=%.2f) linked to %td (opos=%.2f)" " snapped to %.2f and %.2f\n", edge - edges, (double)edge->opos / 64, edge2 - edges, (double)edge2->opos / 64, @@ -3333,7 +3333,7 @@ if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) { #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %ld (pos=%.2f) moved to %.2f\n", + FT_TRACE5(( " BOUND: edge %td (pos=%.2f) moved to %.2f\n", edge - edges, (double)edge->pos / 64, (double)edge[-1].pos / 64 )); @@ -3435,7 +3435,7 @@ if ( delta < 64 + 16 ) { af_latin_align_serif_edge( hints, edge->serif, edge ); - FT_TRACE5(( " SERIF: edge %ld (opos=%.2f) serif to %ld (opos=%.2f)" + FT_TRACE5(( " SERIF: edge %td (opos=%.2f) serif to %td (opos=%.2f)" " aligned to %.2f\n", edge - edges, (double)edge->opos / 64, edge->serif - edges, (double)edge->serif->opos / 64, @@ -3445,9 +3445,9 @@ { edge->pos = FT_PIX_ROUND( edge->opos ); anchor = edge; - FT_TRACE5(( " SERIF_ANCHOR: edge %ld (opos=%.2f)" + FT_TRACE5(( " SERIF_ANCHOR: edge %td (opos=%.2f)" " snapped to %.2f\n", - edge-edges, + edge - edges, (double)edge->opos / 64, (double)edge->pos / 64 )); } else @@ -3474,8 +3474,8 @@ after->pos - before->pos, after->opos - before->opos ); - FT_TRACE5(( " SERIF_LINK1: edge %ld (opos=%.2f) snapped to %.2f" - " from %ld (opos=%.2f)\n", + FT_TRACE5(( " SERIF_LINK1: edge %td (opos=%.2f) snapped to %.2f" + " from %td (opos=%.2f)\n", edge - edges, (double)edge->opos / 64, (double)edge->pos / 64, before - edges, (double)before->opos / 64 )); @@ -3484,7 +3484,7 @@ { edge->pos = anchor->pos + ( ( edge->opos - anchor->opos + 16 ) & ~31 ); - FT_TRACE5(( " SERIF_LINK2: edge %ld (opos=%.2f)" + FT_TRACE5(( " SERIF_LINK2: edge %td (opos=%.2f)" " snapped to %.2f\n", edge - edges, (double)edge->opos / 64, (double)edge->pos / 64 )); @@ -3505,7 +3505,7 @@ if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) { #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %ld (pos=%.2f) moved to %.2f\n", + FT_TRACE5(( " BOUND: edge %td (pos=%.2f) moved to %.2f\n", edge - edges, (double)edge->pos / 64, (double)edge[-1].pos / 64 )); @@ -3526,7 +3526,7 @@ if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) { #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %ld (pos=%.2f) moved to %.2f\n", + FT_TRACE5(( " BOUND: edge %td (pos=%.2f) moved to %.2f\n", edge - edges, (double)edge->pos / 64, (double)edge[1].pos / 64 )); diff --git a/src/psaux/cffdecode.c b/src/psaux/cffdecode.c index 2cd91c96f..562d17d22 100644 --- a/src/psaux/cffdecode.c +++ b/src/psaux/cffdecode.c @@ -2153,7 +2153,7 @@ decoder->locals_bias ); - FT_TRACE4(( " callsubr (idx %d, entering level %ld)\n", + FT_TRACE4(( " callsubr (idx %d, entering level %td)\n", idx, zone - decoder->zones + 1 )); @@ -2197,7 +2197,7 @@ decoder->globals_bias ); - FT_TRACE4(( " callgsubr (idx %d, entering level %ld)\n", + FT_TRACE4(( " callgsubr (idx %d, entering level %td)\n", idx, zone - decoder->zones + 1 )); @@ -2236,7 +2236,7 @@ break; case cff_op_return: - FT_TRACE4(( " return (leaving level %ld)\n", + FT_TRACE4(( " return (leaving level %td)\n", decoder->zone - decoder->zones )); if ( decoder->zone <= decoder->zones ) diff --git a/src/psaux/pshints.c b/src/psaux/pshints.c index 6f44d0adb..7bd08a9c9 100644 --- a/src/psaux/pshints.c +++ b/src/psaux/pshints.c @@ -310,7 +310,7 @@ CF2_Hint hint = &hintmap->edge[i]; - FT_TRACE6(( " %3ld %7.2f %7.2f %5d %s%s%s%s\n", + FT_TRACE6(( " %3zu %7.2f %7.2f %5d %s%s%s%s\n", hint->index, hint->csCoord / 65536.0, hint->dsCoord / ( hint->scale * 1.0 ), diff --git a/src/psaux/t1decode.c b/src/psaux/t1decode.c index bfed45b53..4b6b969bc 100644 --- a/src/psaux/t1decode.c +++ b/src/psaux/t1decode.c @@ -520,7 +520,7 @@ #ifdef FT_DEBUG_LEVEL_TRACE if ( bol ) { - FT_TRACE5(( " (%ld)", decoder->top - decoder->stack )); + FT_TRACE5(( " (%td)", decoder->top - decoder->stack )); bol = FALSE; } #endif @@ -1165,7 +1165,7 @@ if ( top - decoder->stack != num_args ) FT_TRACE0(( "t1_decoder_parse_charstrings:" " too much operands on the stack" - " (seen %ld, expected %d)\n", + " (seen %td, expected %d)\n", top - decoder->stack, num_args )); break; } diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c index 55628af9e..0918272f8 100644 --- a/src/smooth/ftgrays.c +++ b/src/smooth/ftgrays.c @@ -1934,7 +1934,7 @@ typedef ptrdiff_t FT_PtrDist; if ( continued ) FT_Trace_Enable(); - FT_TRACE7(( "band [%d..%d]: %ld cell%s remaining/\n", + FT_TRACE7(( "band [%d..%d]: %td cell%s remaining/\n", ras.min_ey, ras.max_ey, ras.cell_null - ras.cell_free, diff --git a/src/type1/t1load.c b/src/type1/t1load.c index b292a3cc0..be7cd0fd5 100644 --- a/src/type1/t1load.c +++ b/src/type1/t1load.c @@ -1773,7 +1773,7 @@ */ FT_TRACE0(( "parse_subrs: adjusting number of subroutines" - " (from %d to %ld)\n", + " (from %d to %zu)\n", num_subrs, ( parser->root.limit - parser->root.cursor ) >> 3 )); num_subrs = ( parser->root.limit - parser->root.cursor ) >> 3; @@ -1948,7 +1948,7 @@ if ( num_glyphs > ( limit - cur ) >> 3 ) { FT_TRACE0(( "parse_charstrings: adjusting number of glyphs" - " (from %d to %ld)\n", + " (from %d to %zu)\n", num_glyphs, ( limit - cur ) >> 3 )); num_glyphs = ( limit - cur ) >> 3; } diff --git a/src/type42/t42parse.c b/src/type42/t42parse.c index 764bbd4c4..f96a43b14 100644 --- a/src/type42/t42parse.c +++ b/src/type42/t42parse.c @@ -872,7 +872,7 @@ if ( loader->num_glyphs > ( limit - parser->root.cursor ) >> 2 ) { FT_TRACE0(( "t42_parse_charstrings: adjusting number of glyphs" - " (from %d to %ld)\n", + " (from %d to %zu)\n", loader->num_glyphs, ( limit - parser->root.cursor ) >> 2 )); loader->num_glyphs = ( limit - parser->root.cursor ) >> 2; From a9793feacefac6d44b761bed12566029f5811063 Mon Sep 17 00:00:00 2001 From: Ben Wagner Date: Tue, 15 Aug 2023 11:30:26 -0400 Subject: [PATCH 19/28] [base] Avoid UB with memcpy `FT_NEW_ARRAY(p, 0)` sets `p` to `NULL`. `FT_Stream_ReadAt` with a memory based stream uses `FT_MEM_COPY` which is `memcpy` which specifies that it is undefined behavior for either the `src` or `dst` to be `NULL`. Instead of forcing all callers work around calling `FT_Stream_Read` when `buffer == NULL && count == 0` do the check in `FT_StreamRead`. This allows any call with `count == 0` to succesfully read zero bytes without UB. * src/base/ftstream.c (FT_Stream_ReadAt): skip `FT_MEM_COPY` when `count == 0`. (FT_Stream_TryRead): ditto Fixes: #1250 --- src/base/ftstream.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/base/ftstream.c b/src/base/ftstream.c index 05c563757..64826aceb 100644 --- a/src/base/ftstream.c +++ b/src/base/ftstream.c @@ -141,7 +141,9 @@ if ( read_bytes > count ) read_bytes = count; - FT_MEM_COPY( buffer, stream->base + pos, read_bytes ); + /* Allow "reading" zero bytes without UB even if buffer is NULL */ + if ( count ) + FT_MEM_COPY( buffer, stream->base + pos, read_bytes ); } stream->pos = pos + read_bytes; @@ -178,7 +180,9 @@ if ( read_bytes > count ) read_bytes = count; - FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes ); + /* Allow "reading" zero bytes without UB even if buffer is NULL */ + if ( count ) + FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes ); } stream->pos += read_bytes; From e907eef6b2d1a2606748598a4736d054dd3ef34f Mon Sep 17 00:00:00 2001 From: Hugh McMaster Date: Sat, 19 Aug 2023 22:02:14 +1000 Subject: [PATCH 20/28] builds/freetype.mk: Invoke `mkdocs` as a Python module FreeType's `refdoc` target currently allows users to override the default Python path, which is useful for testing and development. In contrast, `mkdocs` is invoked via the default Python path. Invoking `mkdocs` via Python's module syntax allows for greater flexibility, although there is no change for the default use case. --- builds/freetype.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builds/freetype.mk b/builds/freetype.mk index d96ded072..b3fac80fd 100644 --- a/builds/freetype.mk +++ b/builds/freetype.mk @@ -299,7 +299,7 @@ refdoc: $(PUBLIC_DIR)/config/*.h \ $(PUBLIC_DIR)/cache/*.h @echo Building static site... - cd $(DOC_DIR) && mkdocs build + cd $(DOC_DIR) && $(PYTHON) -m mkdocs build @echo Done. # Variables for running `refdoc' with Python's `virtualenv'. The From a3f44aadbc5797b3e7a5a9f38473985eaf23d4cb Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Tue, 22 Aug 2023 12:20:56 +0200 Subject: [PATCH 21/28] builds/toplevel.mk: Don't use `\#` in functions. The behaviour changed in GNU make 4.3, where `#` (without the backslash) would be necessary. Using a variable instead the code works with both older and newer GNU make versions. Fixes #1252. --- builds/toplevel.mk | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/builds/toplevel.mk b/builds/toplevel.mk index 5a3ff2abd..7530be753 100644 --- a/builds/toplevel.mk +++ b/builds/toplevel.mk @@ -201,21 +201,23 @@ include $(TOP_DIR)/builds/modules.mk # get FreeType version string, using a # poor man's `sed' emulation with make's built-in string functions # +hash := \# + work := $(strip $(shell $(CAT) \ $(subst /,$(SEP),$(TOP_DIR)/include/freetype/freetype.h))) work := $(subst |,x,$(work)) work := $(subst $(space),|,$(work)) -work := $(subst \#define|FREETYPE_MAJOR|,$(space),$(work)) +work := $(subst $(hash)define|FREETYPE_MAJOR|,$(space),$(work)) work := $(word 2,$(work)) major := $(subst |,$(space),$(work)) major := $(firstword $(major)) -work := $(subst \#define|FREETYPE_MINOR|,$(space),$(work)) +work := $(subst $(hash)define|FREETYPE_MINOR|,$(space),$(work)) work := $(word 2,$(work)) minor := $(subst |,$(space),$(work)) minor := $(firstword $(minor)) -work := $(subst \#define|FREETYPE_PATCH|,$(space),$(work)) +work := $(subst $(hash)define|FREETYPE_PATCH|,$(space),$(work)) work := $(word 2,$(work)) patch := $(subst |,$(space),$(work)) patch := $(firstword $(patch)) From 97251fd5aa2a90041cf4f397a5e887b8d60ab0c2 Mon Sep 17 00:00:00 2001 From: Alexei Podtelezhnikov Date: Mon, 21 Aug 2023 23:23:22 -0400 Subject: [PATCH 22/28] [base] Improve the matrix degeneracy check. Also fixes #1251. * src/base/ftcalc.c (FT_Matrix_Check): To avoid overflow, scale by shifting. * include/freetype/internal/ftcalc.h (FT_Matrix_Check): Update description. --- include/freetype/internal/ftcalc.h | 4 +- src/base/ftcalc.c | 70 ++++++++++-------------------- 2 files changed, 26 insertions(+), 48 deletions(-) diff --git a/include/freetype/internal/ftcalc.h b/include/freetype/internal/ftcalc.h index d1baa392b..d9aea2360 100644 --- a/include/freetype/internal/ftcalc.h +++ b/include/freetype/internal/ftcalc.h @@ -332,9 +332,9 @@ FT_BEGIN_HEADER * Based on geometric considerations we use the following inequality to * identify a degenerate matrix. * - * 50 * abs(xx*yy - xy*yx) < xx^2 + xy^2 + yx^2 + yy^2 + * 32 * abs(xx*yy - xy*yx) < xx^2 + xy^2 + yx^2 + yy^2 * - * Value 50 is heuristic. + * Value 32 is heuristic. */ FT_BASE( FT_Bool ) FT_Matrix_Check( const FT_Matrix* matrix ); diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c index 442b08ddf..9e87abd09 100644 --- a/src/base/ftcalc.c +++ b/src/base/ftcalc.c @@ -749,65 +749,43 @@ FT_BASE_DEF( FT_Bool ) FT_Matrix_Check( const FT_Matrix* matrix ) { - FT_Matrix m; - FT_Fixed val[4]; - FT_Fixed nonzero_minval, maxval; - FT_Fixed temp1, temp2; - FT_UInt i; + FT_Fixed xx, xy, yx, yy; + FT_Fixed val; + FT_Int shift; + FT_ULong temp1, temp2; if ( !matrix ) return 0; - val[0] = FT_ABS( matrix->xx ); - val[1] = FT_ABS( matrix->xy ); - val[2] = FT_ABS( matrix->yx ); - val[3] = FT_ABS( matrix->yy ); - - /* - * To avoid overflow, we ensure that each value is not larger than - * - * int(sqrt(2^31 / 4)) = 23170 ; - * - * we also check that no value becomes zero if we have to scale. - */ - - maxval = 0; - nonzero_minval = FT_LONG_MAX; + xx = matrix->xx; + xy = matrix->xy; + yx = matrix->yx; + yy = matrix->yy; + val = FT_ABS( xx ) | FT_ABS( xy ) | FT_ABS( yx ) | FT_ABS( yy ); - for ( i = 0; i < 4; i++ ) - { - if ( val[i] > maxval ) - maxval = val[i]; - if ( val[i] && val[i] < nonzero_minval ) - nonzero_minval = val[i]; - } - - /* we only handle 32bit values */ - if ( maxval > 0x7FFFFFFFL ) + /* we only handle non-zero 32-bit values */ + if ( !val || val > 0x7FFFFFFFL ) return 0; - if ( maxval > 23170 ) - { - FT_Fixed scale = FT_DivFix( maxval, 23170 ); - + /* Scale matrix to avoid the temp1 overflow, which is */ + /* more stringent than avoiding the temp2 overflow. */ - if ( !FT_DivFix( nonzero_minval, scale ) ) - return 0; /* value range too large */ + shift = FT_MSB( val ) - 12; - m.xx = FT_DivFix( matrix->xx, scale ); - m.xy = FT_DivFix( matrix->xy, scale ); - m.yx = FT_DivFix( matrix->yx, scale ); - m.yy = FT_DivFix( matrix->yy, scale ); + if ( shift > 0 ) + { + xx >>= shift; + xy >>= shift; + yx >>= shift; + yy >>= shift; } - else - m = *matrix; - temp1 = FT_ABS( m.xx * m.yy - m.xy * m.yx ); - temp2 = m.xx * m.xx + m.xy * m.xy + m.yx * m.yx + m.yy * m.yy; + temp1 = 32U * (FT_ULong)FT_ABS( xx * yy - xy * yx ); + temp2 = (FT_ULong)( xx * xx ) + (FT_ULong)( xy * xy ) + + (FT_ULong)( yx * yx ) + (FT_ULong)( yy * yy ); - if ( temp1 == 0 || - temp2 / temp1 > 50 ) + if ( temp1 <= temp2 ) return 0; return 1; From 00b07598d96f7c6c96d2d32dbbb9cd11b3adeacd Mon Sep 17 00:00:00 2001 From: Alexei Podtelezhnikov Date: Thu, 24 Aug 2023 08:13:18 -0400 Subject: [PATCH 23/28] * builds/toplevel.mk: Simplify version extraction. --- builds/toplevel.mk | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/builds/toplevel.mk b/builds/toplevel.mk index 7530be753..8d5063ebb 100644 --- a/builds/toplevel.mk +++ b/builds/toplevel.mk @@ -198,29 +198,22 @@ modules: include $(TOP_DIR)/builds/modules.mk -# get FreeType version string, using a -# poor man's `sed' emulation with make's built-in string functions +# get FreeType version string using built-in string functions # hash := \# work := $(strip $(shell $(CAT) \ $(subst /,$(SEP),$(TOP_DIR)/include/freetype/freetype.h))) -work := $(subst |,x,$(work)) -work := $(subst $(space),|,$(work)) -work := $(subst $(hash)define|FREETYPE_MAJOR|,$(space),$(work)) -work := $(word 2,$(work)) -major := $(subst |,$(space),$(work)) -major := $(firstword $(major)) - -work := $(subst $(hash)define|FREETYPE_MINOR|,$(space),$(work)) -work := $(word 2,$(work)) -minor := $(subst |,$(space),$(work)) -minor := $(firstword $(minor)) - -work := $(subst $(hash)define|FREETYPE_PATCH|,$(space),$(work)) -work := $(word 2,$(work)) -patch := $(subst |,$(space),$(work)) -patch := $(firstword $(patch)) + +work := $(subst $(hash)define$(space)FREETYPE_MAJOR$(space),MAjOR=,$(work)) +work := $(subst $(hash)define$(space)FREETYPE_MINOR$(space),MInOR=,$(work)) +work := $(subst $(hash)define$(space)FREETYPE_PATCH$(space),PAtCH=,$(work)) + +major := $(subst MAjOR=,,$(filter MAjOR=%,$(work))) +minor := $(subst MInOR=,,$(filter MInOR=%,$(work))) +patch := $(subst PAtCH=,,$(filter PAtCH=%,$(work))) + +work := # ifneq ($(findstring x0x,x$(patch)x),) # version := $(major).$(minor) From e3ada2f70d9ca1f43f29f0e895136266499e55e0 Mon Sep 17 00:00:00 2001 From: Hugh McMaster Date: Mon, 21 Aug 2023 14:33:24 +1000 Subject: [PATCH 24/28] builds/unix/configure.raw: Use variable to specify minimum Python version. --- builds/unix/configure.raw | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/builds/unix/configure.raw b/builds/unix/configure.raw index 2c152022f..e3bacef9b 100644 --- a/builds/unix/configure.raw +++ b/builds/unix/configure.raw @@ -966,14 +966,14 @@ esac AX_PTHREAD([have_pthread=yes], [have_pthread=no]) # Check for Python and docwriter - +PYTHON_MIN_VERSION=3.5 have_py3=no have_docwriter=no PIP=pip AC_CHECK_PROGS([PYTHON], [python3 python], [missing]) if test "x$PYTHON" != "xmissing"; then - AX_PROG_PYTHON_VERSION([3.5], [have_py3=yes], []) + AX_PROG_PYTHON_VERSION([$PYTHON_MIN_VERSION], [have_py3=yes], []) if test "x$have_py3" = "xyes"; then PIP="$PYTHON -m $PIP" @@ -1162,7 +1162,7 @@ if test $have_docwriter = no; then `make refdoc' will fail since pip package `docwriter' is not installed. To install, run `$PIP install docwriter', or to use a Python virtual environment, run `make refdoc-venv' (requires pip package - `virtualenv'). These operations require Python >= 3.5. + `virtualenv'). These operations require Python >= $PYTHON_MIN_VERSION. ]) fi From aa5f00187491f839bbeec32706afb9f32e4a0879 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Thu, 24 Aug 2023 20:46:48 +0200 Subject: [PATCH 25/28] * subprojects/*.wrap: Updated. --- subprojects/libpng.wrap | 18 +++++++++--------- subprojects/zlib.wrap | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/subprojects/libpng.wrap b/subprojects/libpng.wrap index 68abec897..eb0785d9d 100644 --- a/subprojects/libpng.wrap +++ b/subprojects/libpng.wrap @@ -1,13 +1,13 @@ [wrap-file] -directory = libpng-1.6.39 -source_url = https://github.com/glennrp/libpng/archive/v1.6.39.tar.gz -source_filename = libpng-1.6.39.tar.gz -source_hash = a00e9d2f2f664186e4202db9299397f851aea71b36a35e74910b8820e380d441 -patch_filename = libpng_1.6.39-3_patch.zip -patch_url = https://wrapdb.mesonbuild.com/v2/libpng_1.6.39-3/get_patch -patch_hash = 6af2a8d464e3f1d2e2832580896323ac7b0b786806c75f0eff0c8ec82dd603ec -source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/libpng_1.6.39-3/libpng-1.6.39.tar.gz -wrapdb_version = 1.6.39-3 +directory = libpng-1.6.40 +source_url = https://github.com/glennrp/libpng/archive/v1.6.40.tar.gz +source_filename = libpng-1.6.40.tar.gz +source_hash = 62d25af25e636454b005c93cae51ddcd5383c40fa14aa3dae8f6576feb5692c2 +patch_filename = libpng_1.6.40-1_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/libpng_1.6.40-1/get_patch +patch_hash = bad558070e0a82faa5c0ae553bcd12d49021fc4b628f232a8e58c3fbd281aae1 +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/libpng_1.6.40-1/libpng-1.6.40.tar.gz +wrapdb_version = 1.6.40-1 [provide] libpng = libpng_dep diff --git a/subprojects/zlib.wrap b/subprojects/zlib.wrap index 4f19672e4..f9f118038 100644 --- a/subprojects/zlib.wrap +++ b/subprojects/zlib.wrap @@ -1,13 +1,13 @@ [wrap-file] -directory = zlib-1.2.13 -source_url = http://zlib.net/fossils/zlib-1.2.13.tar.gz -source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/zlib_1.2.13-4/zlib-1.2.13.tar.gz -source_filename = zlib-1.2.13.tar.gz -source_hash = b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30 -patch_filename = zlib_1.2.13-4_patch.zip -patch_url = https://wrapdb.mesonbuild.com/v2/zlib_1.2.13-4/get_patch -patch_hash = 19636b7807e679b92240bc7a99aed85d1be908a45430b12c7687a825cb499d5e -wrapdb_version = 1.2.13-4 +directory = zlib-1.3 +source_url = http://zlib.net/fossils/zlib-1.3.tar.gz +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/zlib_1.3-1/zlib-1.3.tar.gz +source_filename = zlib-1.3.tar.gz +source_hash = ff0ba4c292013dbc27530b3a81e1f9a813cd39de01ca5e0f8bf355702efa593e +patch_filename = zlib_1.3-1_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/zlib_1.3-1/get_patch +patch_hash = ab9d6b8167bb34a7c52b60b0cd6138aa4e0c2d31f997343a5f506f3b97b32008 +wrapdb_version = 1.3-1 [provide] zlib = zlib_dep From d42679b93d5e77fe769591cd1d04522225940556 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Fri, 25 Aug 2023 18:05:01 +0200 Subject: [PATCH 26/28] Fix clang warnings. * src/cffload.c (cff_blend_doBlend): Fix type of `sum`. * src/truetype/ttgxvar.c (tt_var_load_item_variation_store): Fix type of `word_delta_count`. --- src/cff/cffload.c | 2 +- src/truetype/ttgxvar.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cff/cffload.c b/src/cff/cffload.c index bee89f0c6..af79082e9 100644 --- a/src/cff/cffload.c +++ b/src/cff/cffload.c @@ -1361,7 +1361,7 @@ for ( i = 0; i < numBlends; i++ ) { const FT_Int32* weight = &blend->BV[1]; - FT_UInt32 sum; + FT_Fixed sum; /* convert inputs to 16.16 fixed point */ diff --git a/src/truetype/ttgxvar.c b/src/truetype/ttgxvar.c index 8c713f1b6..ad4f266b2 100644 --- a/src/truetype/ttgxvar.c +++ b/src/truetype/ttgxvar.c @@ -621,10 +621,10 @@ { GX_ItemVarData varData = &itemStore->varData[i]; - FT_UInt item_count; - FT_UInt word_delta_count; - FT_UInt region_idx_count; - FT_UInt per_region_size; + FT_UInt item_count; + FT_UShort word_delta_count; + FT_UInt region_idx_count; + FT_UInt per_region_size; if ( FT_STREAM_SEEK( offset + dataOffsetArray[i] ) ) From 0c817334b708a83425ce5b86448c4d6a26ebbc76 Mon Sep 17 00:00:00 2001 From: Alexei Podtelezhnikov Date: Fri, 25 Aug 2023 17:57:47 +0000 Subject: [PATCH 27/28] * src/base/ftcalc.c (FT_MulAddFix): Simplify 32-bit rounding. --- src/base/ftcalc.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c index 9e87abd09..c5bc7e3b1 100644 --- a/src/base/ftcalc.c +++ b/src/base/ftcalc.c @@ -1070,9 +1070,6 @@ { FT_UInt i; FT_Int64 temp; -#ifndef FT_INT64 - FT_Int64 halfUnit; -#endif #ifdef FT_INT64 @@ -1117,13 +1114,10 @@ FT_Add64( &temp, &multResult, &temp ); } - /* Round value. */ - halfUnit.hi = 0; - halfUnit.lo = 0x8000; - FT_Add64( &temp, &halfUnit, &temp ); + /* Shift and round value. */ + return (FT_Int32)( ( ( temp.hi << 16 ) | ( temp.lo >> 16 ) ) + + ( 1 & ( temp.lo >> 15 ) ) ); - return (FT_Int32)( ( (FT_Int32)( temp.hi & 0xFFFF ) << 16 ) | - ( temp.lo >> 16 ) ); #endif /* !FT_INT64 */ From 920c5502cc3ddda88f6c7d85ee834ac611bb11cc Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Fri, 25 Aug 2023 19:51:30 +0200 Subject: [PATCH 28/28] * Version 2.13.2 released. ========================== Tag sources with `VER-2-13-2'. * docs/VERSION.TXT: Add entry for version 2.13.2. * docs/CHANGES: Updated. * docs/release, docs/README, builds/macs/README: Updated. * README, src/base/ftver.rc, builds/windows/vc2010/index.html, builds/windows/visualc/index.html, builds/windows/visualce/index.html, builds/wince/vc2005-ce/index.html, builds/wince/vc2008-ce/index.html, docs/freetype-config.1: s/2.13.1/2.13.2/, s/2131/2132/. * include/freetype/freetype.h (FREETYPE_PATCH): Set to 2. * builds/unix/configure.raw (version_info): Set to 26:1:20. * CMakeLists.txt (VERSION_PATCH): Set to 2. --- CMakeLists.txt | 2 +- README | 8 ++++---- builds/unix/configure.raw | 2 +- builds/wince/vc2005-ce/index.html | 2 +- builds/wince/vc2008-ce/index.html | 2 +- builds/windows/vc2010/index.html | 2 +- builds/windows/visualc/index.html | 2 +- builds/windows/visualce/index.html | 2 +- docs/CHANGES | 14 ++++++++++++++ docs/VERSIONS.TXT | 1 + docs/freetype-config.1 | 2 +- include/freetype/freetype.h | 2 +- src/base/ftver.rc | 4 ++-- 13 files changed, 30 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d31ab175d..8dbca01e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -164,7 +164,7 @@ project(freetype C) set(VERSION_MAJOR "2") set(VERSION_MINOR "13") -set(VERSION_PATCH "1") +set(VERSION_PATCH "2") # Generate LIBRARY_VERSION and LIBRARY_SOVERSION. set(LIBTOOL_REGEX "version_info='([0-9]+):([0-9]+):([0-9]+)'") diff --git a/README b/README index eb48e7e18..cd4c1d7d1 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -FreeType 2.13.1 +FreeType 2.13.2 =============== Homepage: https://www.freetype.org @@ -32,9 +32,9 @@ sites. Go to and download one of the following files. - freetype-doc-2.13.1.tar.xz - freetype-doc-2.13.1.tar.gz - ftdoc2131.zip + freetype-doc-2.13.2.tar.xz + freetype-doc-2.13.2.tar.gz + ftdoc2132.zip To view the documentation online, go to diff --git a/builds/unix/configure.raw b/builds/unix/configure.raw index e3bacef9b..dc7426ee0 100644 --- a/builds/unix/configure.raw +++ b/builds/unix/configure.raw @@ -17,7 +17,7 @@ AC_CONFIG_SRCDIR([ftconfig.h.in]) # Don't forget to update `docs/VERSIONS.TXT'! -version_info='26:0:20' +version_info='26:1:20' AC_SUBST([version_info]) ft_version=`echo $version_info | tr : .` AC_SUBST([ft_version]) diff --git a/builds/wince/vc2005-ce/index.html b/builds/wince/vc2005-ce/index.html index cef32c12e..8ea6cfded 100644 --- a/builds/wince/vc2005-ce/index.html +++ b/builds/wince/vc2005-ce/index.html @@ -21,7 +21,7 @@

  • PPC/SP WM6 (Windows Mobile 6)
  • -It compiles the following libraries from the FreeType 2.13.1 sources:

    +It compiles the following libraries from the FreeType 2.13.2 sources:

      diff --git a/builds/wince/vc2008-ce/index.html b/builds/wince/vc2008-ce/index.html
      index 1d36f6021..a6e74f893 100644
      --- a/builds/wince/vc2008-ce/index.html
      +++ b/builds/wince/vc2008-ce/index.html
      @@ -21,7 +21,7 @@ 

    • PPC/SP WM6 (Windows Mobile 6)
    -It compiles the following libraries from the FreeType 2.13.1 sources:

    +It compiles the following libraries from the FreeType 2.13.2 sources:

      diff --git a/builds/windows/vc2010/index.html b/builds/windows/vc2010/index.html
      index 95e27e628..ee9b59a2b 100644
      --- a/builds/windows/vc2010/index.html
      +++ b/builds/windows/vc2010/index.html
      @@ -12,7 +12,7 @@ 

      This directory contains solution and project files for Visual C++ 2010 or newer, named freetype.sln, and freetype.vcxproj. It compiles the following libraries -from the FreeType 2.13.1 sources:

      +from the FreeType 2.13.2 sources:

      • freetype.dll using 'Release' or 'Debug' configurations
      • diff --git a/builds/windows/visualc/index.html b/builds/windows/visualc/index.html index de957a61a..816605e07 100644 --- a/builds/windows/visualc/index.html +++ b/builds/windows/visualc/index.html @@ -12,7 +12,7 @@

        This directory contains project files freetype.dsp for Visual C++ 6.0, and freetype.vcproj for Visual C++ 2002 through 2008, which you might need to upgrade automatically. -It compiles the following libraries from the FreeType 2.13.1 sources:

        +It compiles the following libraries from the FreeType 2.13.2 sources:

        • freetype.dll using 'Release' or 'Debug' configurations
        • diff --git a/builds/windows/visualce/index.html b/builds/windows/visualce/index.html index 706924a74..d9c8fe475 100644 --- a/builds/windows/visualce/index.html +++ b/builds/windows/visualce/index.html @@ -21,7 +21,7 @@

        • PPC/SP WM6 (Windows Mobile 6)
        -It compiles the following libraries from the FreeType 2.13.1 sources:

        +It compiles the following libraries from the FreeType 2.13.2 sources:

          diff --git a/docs/CHANGES b/docs/CHANGES
          index b6ad1ce5d..96cf607d7 100644
          --- a/docs/CHANGES
          +++ b/docs/CHANGES
          @@ -1,3 +1,17 @@
          +CHANGES BETWEEN 2.13.1 and 2.13.2 (2023-Aug-25)
          +
          +  I. MISCELLANEOUS
          +
          +  - Better support for CFF2 variation fonts.
          +
          +  - TrueType interpreter  version 38 (also known  as 'Infinality') has
          +    been removed.
          +
          +  - Improved OpenVMS support.
          +
          +
          +======================================================================
          +
           CHANGES BETWEEN 2.13.0 and 2.13.1 (2023-Jun-24)
           
             I. MISCELLANEOUS
          diff --git a/docs/VERSIONS.TXT b/docs/VERSIONS.TXT
          index eb71fd051..8b43c1583 100644
          --- a/docs/VERSIONS.TXT
          +++ b/docs/VERSIONS.TXT
          @@ -60,6 +60,7 @@ found on _most_ systems, but not all of them:
           
               release     libtool     so
             -------------------------------
          +     2.13.2     26.1.20   6.20.1
                2.13.1     26.0.20   6.20.0
                2.13.0     25.0.19   6.19.0
                2.12.1     24.3.18   6.18.3
          diff --git a/docs/freetype-config.1 b/docs/freetype-config.1
          index cc6f3006d..6ef1ac8f3 100644
          --- a/docs/freetype-config.1
          +++ b/docs/freetype-config.1
          @@ -1,4 +1,4 @@
          -.TH FREETYPE-CONFIG 1 "June 2023" "FreeType 2.13.1"
          +.TH FREETYPE-CONFIG 1 "August 2023" "FreeType 2.13.2"
           .
           .
           .SH NAME
          diff --git a/include/freetype/freetype.h b/include/freetype/freetype.h
          index 4a074a444..92acf3794 100644
          --- a/include/freetype/freetype.h
          +++ b/include/freetype/freetype.h
          @@ -5222,7 +5222,7 @@ FT_BEGIN_HEADER
              */
           #define FREETYPE_MAJOR  2
           #define FREETYPE_MINOR  13
          -#define FREETYPE_PATCH  1
          +#define FREETYPE_PATCH  2
           
           
             /**************************************************************************
          diff --git a/src/base/ftver.rc b/src/base/ftver.rc
          index c7155d53d..137a6334b 100644
          --- a/src/base/ftver.rc
          +++ b/src/base/ftver.rc
          @@ -18,8 +18,8 @@
           
           #include
           
          -#define FT_VERSION      2,13,1,0
          -#define FT_VERSION_STR  "2.13.1"
          +#define FT_VERSION      2,13,2,0
          +#define FT_VERSION_STR  "2.13.2"
           
           VS_VERSION_INFO      VERSIONINFO
           FILEVERSION          FT_VERSION