diff --git a/3party/freetype/.mailmap b/3party/freetype/.mailmap deleted file mode 100644 index a3c5f94517..0000000000 --- a/3party/freetype/.mailmap +++ /dev/null @@ -1,7 +0,0 @@ -Alexei Podtelezhnikov (Алексей Подтележников) -Behdad Esfahbod -Bram Tassyns bram tassyns -Bram Tassyns -Suzuki, Toshiya (鈴木俊哉) -Suzuki, Toshiya (鈴木俊哉) sssa -Suzuki, Toshiya (鈴木俊哉) suzuki toshiya diff --git a/3party/freetype/CMakeLists.txt b/3party/freetype/CMakeLists.txt deleted file mode 100644 index a7e59c4fff..0000000000 --- a/3party/freetype/CMakeLists.txt +++ /dev/null @@ -1,125 +0,0 @@ -project(freetype) - -add_definitions(-DFT2_BUILD_LIBRARY) - -if (PLATFORM_LINUX AND CMAKE_COMPILER_IS_GNUCXX) - add_definitions(-DOMIM_FULL_FREETYPE) -endif () - -add_compile_options("-Wall") - -add_clang_compile_options("-Wno-unused-function") -add_gcc_compile_options( - "-Wno-pointer-to-int-cast" - "-Wno-unused-function" -) - -include_directories(include) - -set( - SRC - src/autofit/afangles.c - src/autofit/afblue.c - src/autofit/afcjk.c - src/autofit/afdummy.c - src/autofit/afglobal.c - src/autofit/afhints.c - src/autofit/afindic.c - src/autofit/aflatin.c - src/autofit/afloader.c - src/autofit/afmodule.c - src/autofit/afranges.c - src/autofit/afwarp.c - src/autofit/hbshim.c - src/base/ftadvanc.c - src/base/ftbitmap.c - src/base/ftcalc.c - src/base/ftgloadr.c - src/base/ftglyph.c - src/base/ftinit.c - src/base/ftobjs.c - src/base/ftoutln.c - src/base/ftrfork.c - src/base/ftstream.c - src/base/ftstroke.c - src/base/ftsystem.c - src/base/fttrigon.c - src/base/ftutil.c - src/bdf/bdfdrivr.c - src/bdf/bdflib.c - src/cache/ftcbasic.c - src/cache/ftccache.c - src/cache/ftccmap.c - src/cache/ftcglyph.c - src/cache/ftcimage.c - src/cache/ftcmanag.c - src/cache/ftcmru.c - src/cache/ftcsbits.c - src/cache/ftstrokedcache.c - src/cff/cf2arrst.c - src/cff/cf2blues.c - src/cff/cf2error.c - src/cff/cf2font.c - src/cff/cf2ft.c - src/cff/cf2hints.c - src/cff/cf2intrp.c - src/cff/cf2read.c - src/cff/cf2stack.c - src/cff/cffcmap.c - src/cff/cffdrivr.c - src/cff/cffgload.c - src/cff/cffload.c - src/cff/cffobjs.c - src/cff/cffparse.c - src/cid/cidgload.c - src/cid/cidload.c - src/cid/cidobjs.c - src/cid/cidparse.c - src/cid/cidriver.c - src/gzip/ftgzip.c - src/lzw/ftlzw.c - src/pcf/pcfdrivr.c - src/pcf/pcfread.c - src/pcf/pcfutil.c - src/pfr/pfrcmap.c - src/pfr/pfrdrivr.c - src/pfr/pfrgload.c - src/pfr/pfrload.c - src/pfr/pfrobjs.c - src/pfr/pfrsbit.c - src/psaux/afmparse.c - src/psaux/psauxmod.c - src/psaux/psconv.c - src/psaux/psobjs.c - src/psaux/t1cmap.c - src/psaux/t1decode.c - src/pshinter/pshalgo.c - src/pshinter/pshglob.c - src/pshinter/pshmod.c - src/pshinter/pshrec.c - src/psnames/psmodule.c - src/raster/ftraster.c - src/raster/ftrend1.c - src/sfnt/sfdriver.c - src/sfnt/sfobjs.c - src/sfnt/ttbdf.c - src/sfnt/ttcmap.c - src/sfnt/ttkern.c - src/sfnt/ttload.c - src/sfnt/ttmtx.c - src/sfnt/ttpost.c - src/sfnt/ttsbit.c - src/smooth/ftgrays.c - src/smooth/ftsmooth.c - src/truetype/truetype.c - src/type1/t1afm.c - src/type1/t1driver.c - src/type1/t1gload.c - src/type1/t1load.c - src/type1/t1objs.c - src/type1/t1parse.c - src/type42/type42.c - src/winfonts/winfnt.c -) - -add_library(${PROJECT_NAME} ${SRC}) diff --git a/3party/freetype/ChangeLog b/3party/freetype/ChangeLog deleted file mode 100644 index 2fa714001f..0000000000 --- a/3party/freetype/ChangeLog +++ /dev/null @@ -1,7329 +0,0 @@ -2015-08-18 Werner Lemberg - - [raster] Remove last remnants of `raster5' driver. - - * src/raster/ftrend1.h (ft_raster5_renderer_class): Removed. - - * src/raster/rastpic.c, src/raster/rastpic.h - (ft_raster5_renderer_class_pic_init, - ft_raster5_renderer_class_pic_free): Removed. - -2015-08-17 Alexei Podtelezhnikov - - [base] Improve emboldener (#45596). - - * src/base/ftoutln.c (FT_Outline_EmboldenXY): Correct displacement - of zero-lenght segments. - -2015-08-16 Alexei Podtelezhnikov - - [base] Reoptimize arithmetic. - - * src/base/ftcalc.c (FT_MulDiv, FT_MulFix) [!FT_LONG64]: Remove - special cases that slow down the general use. - -2015-08-15 pazer - - Fix C++ compilation (#45762). - - * src/base/ftstroke.c (ft_outline_glyph_class): Use - FT_CALLBACK_TABLE. - -2015-08-14 Alexei Podtelezhnikov - - [truetype] Clean up. - - * src/truetype/ttgload.c (TT_Process_Composite_Component): Use - `FT_Outline_Transform' and `FT_Outline_Translate'. - (translate_array): Dropped. - -2015-08-14 Andreas Enge - - * builds/unix/detect.mk (CONFIG_SHELL): Don't handle it (#44261). - -2015-08-13 Werner Lemberg - - [truetype] Introduce named instance access to GX fonts. - - For functions querying a face, bits 16-30 of the face index can hold - the named instance index if we have a GX font. The indices start - with value 1; value 0 indicates font access without GX variation - data. - - * include/freetype/freetype.h (FT_FaceRec): Update documentation. - * include/freetype/internal/sfnt.h: Ditto. - - * src/sfnt/sfobjs.c (sfnt_init_face) - [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Get number of named instances and - do argument checks. - (sfnt_load_face): Updated. - - * src/truetype/ttobjs.c (tt_face_init) - [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Use named instance, overwriting - the style name. - - * src/base/ftobjs.c (open_face_from_buffer, - open_face_PS_from_sfnt_stream): Updated. - * src/bdf/bdfdrivr.c (BDF_Face_Init): Updated. - * src/cff/cffload.c (cff_font_load): Updated. - - * src/cff/cffobjs.c (cff_face_init): Make function exit early for - pure CFF fonts if `font_index < 0'. - Updated. - - * src/cid/cidobjs.c (cid_face_init): Updated. - * src/pcf/pcfdrivr.c (PCF_Face_Init): Updated. - * src/pfr/pfrobjs.c (pfr_face_init): Updated. - * src/type1/t1objs.c (T1_Face_Init): Updated. - * src/type42/t42objs.c (T42_Face_Init): Updated. - * src/winfonts/winfnt.c (fnt_face_get_dll_font, FNT_Face_Init): - Updated. - - * docs/CHANGES: Updated. - -2015-08-12 Alexei Podtelezhnikov - - [type1,cff,cid] Streamline font matrix application. - - * src/type1/t1gload.c (T1_Load_Glyph): Directly modify advances only - if font matrix is not trivial. - * src/cff/cffgload.c (cff_slot_load): Ditto. - * sff/cid/cidgload.c (cid_slot_load_glyph): Ditto for advances and the - entire outline. - -2015-08-11 Werner Lemberg - - [builds/unix] Minor. - - * builds/unix/configure.raw: - s/lib{priv,staticconf}/libs{priv,staticconf}/ for orthogonality with - similarly named uppercase variables. - -2015-08-10 Alexei Podtelezhnikov - - [type1,cid,type42] Minor improvements. - - * src/type1/t1load.c (t1_parse_font_matrix): Scale units per EM only - when necessary. Refresh comments. - * src/cid/cidload.c (cid_parse_font_matrix): Ditto. - * src/type42/t42parse.c (t42_parse_font_matrix): Refresh comments. - -2015-08-08 Werner Lemberg - - [type42] Fix glyph access. - - This is a severe bug: We've missed one level of indirection, as - described in the Type 42 specification. As a result, ftview - sometimes showed incorrect glyphs for given glyph names, and even - displayed `error 0x0006' (invalid argument!) in case the number of - glyph indices differed between the Type 42 font and the embedded - TTF. - - Apparently, noone ever noticed it; this shows how much Type 42 fonts - are in use... - - * src/type42/t42objs.c (T42_GlyphSlot_Load): Map Type 42 glyph index - to embedded TTF's glyph index. - -2015-08-08 Werner Lemberg - - [type42] Minor clean-up. - - * src/type42/t42parse.c (t42_parse_font_matrix): Remove unused - variable. - -2015-08-06 Alexei Podtelezhnikov - - [type42] Parse FontMatrix according to specifications. - - * src/type42/t42parse.c (t42_parse_font_matrix): Type 42 FontMatrix - does not need scaling by 1000. Units_per_EM are taken from the - embedded TrueType. - -2015-08-06 Werner Lemberg - - [autofit] Improve Arabic hinting. - - Problem reported by Titus Nemeth (by using - ttfautohint). - - * src/autofit/afblue.dat: Add neutral blue zone for the tatweel - character. - - * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated. - -2015-08-05 Alexei Podtelezhnikov - - [truetype] Clean up types. - - * src/truetype/ttobjs.c (TT_Size): Move declaration from here. - * include/freetype/internal/tttypes.h (TT_Size): ... to here. - (TT_LoaderRec): Switch to appropriate types for `face' and `size'. - * src/truetype/ttgload.c: Remove corresponding type casts. - * src/truetype/ttsubpix.c: Ditto. - -2015-08-05 Werner Lemberg - - [autofit] Improve recognition of flat vs. rounded segments. - - Lower the flatness threshold from upem/8 to upem/14, making the - auto-hinter accept shorter elements. - - Synchronize flat/round stem selection algorithm with blue zone code. - - * src/autofit/aflatin.c (FLAT_THRESHOLD): New macro. - (af_latin_metrics_init_blues): Use it. - (af_latin_hints_compute_segments): Collect information on maximum - and minimum coordinates of `on' points; use this to add a constraint - for the flat/round decision similar to - `af_latin_metrics_init_blues'. - -2015-08-04 Werner Lemberg - - Another left-shift bug (#45681). - - * src/base/ftobjs.c (IsMacBinary): Only accept positive values for - `dlen'. - -2015-08-03 Alexei Podtelezhnikov - - [base] Fix `ft_corner_orientation'. - - Remove casting from `FT_Long' to `FT_Int' that might change the sign - of the return value and make it faster too. - - * src/base/ftcalc.c (ft_corner_orientation): On 32-bit systems, stay - with 32-bit arithmetic when safe. Use plain math on 64-bit systems. - * src/pshinter/pshalgo.c: Remove old unused code. - -2015-08-03 Werner Lemberg - - * src/truetype/ttgload.c (load_truetype_glyph) - [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Fix crash for composite glyphs - having a depth greater than 1. - -2015-08-03 Werner Lemberg - - Fix typo in clang bug from 2015-07-31 (#45678). - - * src/base/ftrfork.c (FT_Raccess_Get_HeaderInfo): Fix inequality. - -2015-08-02 Werner Lemberg - - * CMakeLists.txt: Improve shared library support. - - Based on a patch from John Cary . - -2015-08-02 Werner Lemberg - - * builds/unix/freetype-config.in (enable_shared): Remove. Unused. - -2015-08-02 Werner Lemberg - - Fix more invalid left-shifts. - - * src/pfr/pfrgload.c (pfr_glyph_load_compound): Use multiplication, - not left-shift. - - * src/truetype/ttgxvar.c (ft_var_load_avar, ft_var_load_gvar, - tt_face_vary_cvt, TT_Vary_Apply_Glyph_Deltas): Use multiplication, - not left-shift. - -2015-07-31 Werner Lemberg - - Fix some bugs found by clang's `-fsanitize=undefined' (#45661). - - * src/base/ftrfork.c (FT_Raccess_Get_HeaderInfo): Only accept - positive values from header. - Check overflow. - - * src/base/ftoutln.c (SCALED): Correctly handle left-shift of - negative values. - - * src/bdf/bdf.h (_bdf_glyph_modified, _bdf_set_glyph_modified, - _bdf_clear_glyph_modified): Use unsigned long constant. - - * src/bdf/bdfdrivr.c (BDF_Size_Select, BDF_Glyph_Load): Don't - left-shift values that can be negative. - - * src/pcf/pcfdrivr.c (PCF_Size_Select, PCF_Glyph_Load): Don't - left-shift values that can be negative. - - * src/raster/ftraster.c (SCALED): Correctly handle left-shift of - negative values. - - * src/sfnt/ttsbit.c (tt_face_load_strike_metrics): Don't left-shift - values that can be negative. - - * src/truetype/ttgload.c (TT_Load_Composite_Glyph, - compute_glyph_metrics, load_sbit_image): Don't left-shift values - that can be negative. - -2015-07-31 Werner Lemberg - - Define FT_LONG_MAX. - - * include/freetype/config/ftstdlib.h (FT_LONG_MAX): New macro. - * src/cff/cf2arrst.c (cf2_arrstack_setNumElements): Use it. - -2015-07-28 Alexei Podtelezhnikov - - * src/base/ftcalc.c (FT_Vector_NormLen): Clarify. - -2015-07-27 Alexei Podtelezhnikov - - * src/base/ftcalc.c (FT_Vector_NormLen): Explicate type conversions. - -2015-07-26 Matthias Clasen - - [cff] Don't use `hmtx' table for LSB (#45520). - - * src/cff/cffgload.c (cff_slot_load): Use `htmx' table for advance - width only. Bug introduced 2015-04-10. - -2015-07-09 Werner Lemberg - - Better support of user-supplied C++ namespaces. - - See - - http://lists.nongnu.org/archive/html/freetype-devel/2015-07/msg00008.html - - for a rationale. - - * src/autofit/afpic.h, src/base/basepic.h, src/cff/cffpic.h, - src/pshinter/pshpic.h, src/psnames/pspic.h, src/raster/rastpic.h, - src/sfnt/sfntpic.h, src/smooth/ftspic.h, src/truetype/ttpic.h - (FT_BEGIN_HEADER, FT_END_HEADER): Move macro calls to not enclose - header files that contain FT_{BEGIN,END}_HEADER macros by - themselves. - - * src/autofit/aftypes.h [FT_DEBUG_AUTOFIT]: Include - FT_CONFIG_STANDARD_LIBRARY_H earlier. - - * src/truetype/ttpic.h: Include FT_INTERNL_PIC_H. - -2015-07-07 Werner Lemberg - - [sfnt] Make `tt_face_get_name' member of the SFNT interface. - - * include/freetype/internal/sfnt.h (TT_Get_Name_Func): New - prototype. - (SFNT_Interface, FT_DEFINE_SFNT_INTERFACE): New member `get_name'. - - * src/sfnt/sfdriver.c (sfnt_interface): Updated. - - * src/sfnt/sfobjs.c (tt_face_get_name): Tag it with `LOCAL_DEF'. - * src/sfnt/sfobjs.h: Add prototype for it. - -2015-06-30 Werner Lemberg - - Fix some clang compiler warnings. - - * src/base/ftoutln.c (FT_Outline_EmboldenXY), src/cff/cf2intrp.c - (cf2_interpT2CharString), src/truetype/ttgload.c - (load_truetype_glyph), src/truetype/ttgxvar.c (tt_handle_deltas), - src/truetype/ttinterp.c (Ins_INSTCTRL): Fix signedness issues. - -2015-06-29 Alexei Podtelezhnikov - - [truetype] Speed up bytecode interpreter. - - * src/truetype/ttinterp.c (Normalize): Use `FT_Vector_NormLen'. - -2015-06-29 Alexei Podtelezhnikov - - [base] Speed up emboldening. - - * src/base/ftoutln.c (FT_Outline_EmboldenXY): Use - `FT_Vector_NormLen'. - -2015-06-29 Alexei Podtelezhnikov - - [base] Implement fast vector normalization. - - The function uses Newton's iterations instead of dividing vector - components by its length, which needs a square root. This is, - literally, a bit less accurate but a lot faster. - - * src/base/ftcalc.c (FT_Vector_NormLen): New function. - -2015-06-28 Werner Lemberg - - * CMakeLists.txt: Always create `ftconfig.h'. - - For non-UNIX builds, the file stays unmodified. However, it's - better to have the main configuration files at the same place - regardless of the OS. - -2015-06-28 Werner Lemberg - - * CMakeLists.txt: Improve MSVC support (#43737). - -2015-06-28 Werner Lemberg - - [cmake] Check for libraries and create `ftoption.h'. - - * builds/FindHarfBuzz.cmake: New file, taken from - - https://trac.webkit.org/browser/trunk/Source/cmake/FindHarfBuzz.cmake - - * CMakeLists.Txt: Add path to local cmake modules. - Find dependencies for zlib, bzip2, libpng, and harfbuzz. - Create `ftoption.h' file. - Set up include and linker stuff for libraries. - -2015-06-28 Werner Lemberg - - * CMakeLists.txt: Fix creation of `ftconfig.h'. - Check for UNIX header files using `check_include_file'. - Set up correct header include directories. - -2015-06-28 Werner Lemberg - - * CMakeLists.txt: Disallow in-source builds. - -2015-06-27 Werner Lemberg - - * src/tools/docmaker/utils.py (check_output): Add missing `\n'. - -2015-06-26 Werner Lemberg - - * CMakeLists.txt: Select platform-dependent `ftdebug.c'. - -2015-06-25 Werner Lemberg - - * CMakeLists.txt: Use cmake functions for generating `ftconfig.h'. - Additionally, do this for UNIX only. - -2015-06-25 Werner Lemberg - - * CMakeLists.txt (BASE_SRCS): Use `ftbase.c' and `psnames.c'. - -2015-06-25 Werner Lemberg - - Another adjustment to header locations. - - This change is a result of a discussion thread on freetype-devel - - http://lists.nongnu.org/archive/html/freetype-devel/2015-06/msg00041.html - - Re-introduce the `freetype2' subdirectory for all FreeType header - files after installation, and rename the `freetype2' subdirectory in - the git repository to `freetype'. - - * include/freetype2: Renamed to... - * include/freetype: This. - - * CMakeLists.txt (PUBLIC_HEADERS, PUBLIC_CONFIG_HEADERS, - PRIVATE_HEADERS): Updated. - Update creation of `ftconfig.h'. - Install generated `ftconfig.h'. - - * Jamfile (HDRMACRO, RefDoc), autogen.sh: Updated. - - * builds/amiga/include/config/ftconfig.h, builds/freetype.mk - (PUBLIC_DIR), builds/symbian/bld.inf, builds/toplevel.mk (work), - builds/unix/freetype2.in: Updated. - - * builds/unix/freetype-config.in: Updated. - * builds/unix/configure.raw: Don't check for `rmdir'. - * builds/unix/unix-def.in (DELDIR): Use `rm -rf', which is portable - according to the autoconf info manual. - * builds/unix/install.mk (install, uninstall, - distclean_project_unix): Update and simplify. - - * builds/wince/*, builds/windows/*: Updated. - - * devel/ft2build.h, include/ft2build.h: Updated. - - * include/freetype2/config/ftheader.h, - include/freetype2/internal/ftserv.h, - include/freetype2/internal/internal.h: Update all header file - macros. - - * src/tools/chktrcmp.py (TRACE_DEF_FILES): Updated. - - * docs/*: Updated. - -2015-06-24 Alexei Podtelezhnikov - - * src/bdf/bdflib.c (_bdf_parse_start): Disallow 0 bpp. - -2015-06-24 Alexei Podtelezhnikov - - * src/bdf/bdflib.c (_bdf_parse_start): Simplify bpp parsing. - -2015-06-23 Werner Lemberg - - s/TYPEOF/FT_TYPEOF/ (#45376). - - * builds/unix/ftconfig.in, builds/vms/ftconfig.in, - include/freetype2/config/ftconfig.h, - include/freetype2/internal/ftobjs.h, src/autofit/afwarp.h: Do it. - -2015-06-22 Werner Lemberg - - Fix Savannah bug #45097. - - We no longer `pollute' the namespace of possible header file names; - instead we move `ft2build.h' up by one level so that it gets - installed in the default include directory (e.g., - /usr/local/include). After this commit, only `ft2build.h' stays in - the compiler's include path. - - No visible changes for the user who follows the standard FreeType - header inclusion rules. - - * include/*: Move to ... - * include/freetype2/*: This directory, except `ft2build.h'. - - * CMakeLists.txt (PUBLIC_HEADERS, PUBLIC_CONFIG_HEADERS, - PRIVATE_HEADERS), Jamfile (HDRMACRO, RefDoc), autogen.sh: Updated. - - * builds/amiga/include/config/ftconfig.h, builds/freetype.mk - (PUBLIC_DIR), builds/symbian/bld.inf, builds/toplevel.mk (work), - builds/unix/install.mk (install, uninstall), - builds/unix/freetype2.in: Updated. - - * builds/unix/freetype-config.in: Updated. - Emit -I directory only if it is not `/usr/include'. - - * builds/wince/*, builds/windows/*: Updated. - - * devel/ft2build.h, include/ft2build.h: Updated. - - * include/freetype2/config/ftheader.h, - include/freetype2/internal/ftserv.h, - include/freetype2/internal/internal.h: Update all header file - macros. - - * src/tools/chktrcmp.py (TRACE_DEF_FILES): Updated. - -2015-06-21 Werner Lemberg - - Make Jam support work again. - - This is just very basic stuff and just a little bit tested on - GNU/Linux only. I won't delve into this since I'm not a Jam user. - - * Jamfile: Call `HDRMACRO' for `ftserv.h' also. - (DEFINES): Replace with... - (CCFLAGS): ... this. - - * src/Jamfile: Don't call `HDRMACRO' for `internal.h'; this is - already handled in the top-level Jamfile. - - * src/autofit/Jamfile (DEFINES): Replace with... - (CCFLAGS): ... this. - (_sources): Add missing files. - - * src/cache/Jamfile: Don't call `HDRMACRO' for `ftcache.h'; it no - longer contains macro header definitions. - - * src/base/Jamfile, src/cff/Jamfile, src/sfnt/Jamfile, - src/truetype/Jamfile (_sources): Add missing files. - -2015-06-16 Werner Lemberg - - Fix Savannah bug #45326. - - * src/sfnt/sfntpic.h (SFNT_SERVICES_GET): Remove duplicate - definitions. - -2015-06-07 Werner Lemberg - - * Version 2.6 released. - ======================= - - - Tag sources with `VER-2-6'. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.6. - - * README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj, - builds/windows/vc2005/index.html, - builds/windows/vc2008/freetype.vcproj, - builds/windows/vc2008/index.html, - builds/windows/vc2010/freetype.vcxproj, - builds/windows/vc2010/index.html, - builds/windows/visualc/freetype.dsp, - builds/windows/visualc/freetype.vcproj, - builds/windows/visualc/index.html, - builds/windows/visualce/freetype.dsp, - builds/windows/visualce/freetype.vcproj, - builds/windows/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.5.5/2.6/, s/255/26/. - - * include/freetype/freetype.h (FREETYPE_MINOR): Set to 6. - (FREETYPE_PATCH): Set to 0. - - * builds/unix/configure.raw (version_info): Set to 18:0:12. - * CMakeLists.txt (VERSION_MINOR): Set to 0. - (VERSION_PATCH): Set to 6. - - * src/autofit/afmodule.c [!FT_MAKE_OPTION_SINGLE_OBJECT]: Add - declarations for dumping functions. - - * src/truetype/ttinterp.c (TT_New_Context): Pacify compiler. - - * builds/toplevel.mk: Use `freetype.mk's code to compute the version - string. - Don't include a zero patch level in version string. - * builds/freetype.mk: Remove code for computing the version string. - -2015-06-06 Ashish Azad - - Fix Savannah bug #45260. - - * src/pfr/pfrdrivr.c (pfr_get_kerning): Fix typo. - -2015-06-03 Werner Lemberg - - [truetype] Fix memory leak. - - Problem reported by Grissiom ; in - - http://lists.nongnu.org/archive/html/freetype/2015-05/msg00013.html - - there is an example code to trigger the bug. - - * src/truetype/ttobjs.c (tt_size_init_bytecode): Free old `size' - data before allocating again. Bug most probably introduced four - years ago in version 2.4.3. - -2015-06-02 Werner Lemberg - - [raster] Add more tracing. - - * src/raster/ftraster.c (FT_TRACE7) [_STANDALONE_]: Define. - (Vertical_Sweep_Span, Vertical_Sweep_Drop, Horizontal_Sweep_Span, - Horizontal_Sweep_Drop, Render_Glyph): Add tracing calls. - -2015-06-01 Werner Lemberg - - [truetype] While tracing opcodes, show code position and stack. - - * src/truetype/ttinterp.c: Change all existing TRACE7 calls to - TRACE6. - (opcode_name): Add string lengths. - (TT_RunIns): Implement display of code position and stack. - -2015-05-31 Werner Lemberg - - [truetype] In GX, make private point numbers work correctly. - - This is completely missing in Apple's documentation: If a `gvar' - tuple uses private point numbers (this is, deltas are specified for - some points only), the uncovered points must be interpolated for - this tuple similar to the IUP bytecode instruction. Examples that - need this functionality are glyphs `Oslash' and `Q' in Skia.ttf. - - * src/truetype/ttgxvar.c (tt_delta_shift, tt_delta_interpolate, - tt_handle_deltas): New functions. - (TT_Vary_Get_Glyph_Deltas): Renamed to... - (TT_Vary_Apply_Glyph_Deltas): ... this; it directly processes the - points and does no longer return an array of deltas. - Add tracing information. - Call `tt_handle_deltas' to interpolate missing deltas. - Also fix a minor memory leak in case of error. - - * src/truetype/ttgxvar.h: Updated. - - * src/truetype/ttgload.c (TT_Process_Simple_Glyph, - load_truetype_glyph): Updated. - -2015-05-31 Werner Lemberg - - [truetype] In GX, make intermediate tuplets work at extrema. - - * src/truetype/ttgxvar.c (ft_var_apply_tuple): Fix range condition. - -2015-05-31 Werner Lemberg - - [truetype] Add tracing information to GX code. - - * src/truetype/ttgxvar.c (ft_var_load_avar, ft_var_load_gvar, - ft_var_apply_tuple, TT_Get_MM_Var, TT_Set_MM_Blend, - TT_Set_Var_Design, tt_face_vary_cvt): Do it. - -2015-05-28 Werner Lemberg - - * src/tools/apinames.c (names_dump): Fix invalid reference. - - Problem reported by Guzman Mosqueda, Jose R - . - -2015-05-24 Werner Lemberg - - [truetype] Fix commit from 2015-05-22. - - * src/truetype/ttgload.c, src/truetype/ttinterp.c: Guard new code - with `TT_CONFIG_OPTION_SUBPIXEL_HINTING'. - - Problem reported by Nikolaus Waxweiler . - -2015-05-23 Werner Lemberg - - [truetype] Fix return values of GETINFO bytecode instruction. - - * src/truetype/ttinterp.h (TT_ExecContextRec): New fields - `vertical_lcd' and `gray_cleartype'. - - * src/truetype/ttgload.c (tt_loader_init): Initialize new fields. - Change `symmetrical smoothing' to TRUE, since FreeType produces - exactly this. - - * src/truetype/ttinterp.c (Ins_GETINFO): Fix selector/return bit - values for symmetrical smoothing, namely 11/18. - Handle bits for vertical LCD subpixels (8/15) and Gray ClearType - (12/19). - -2015-05-23 Werner Lemberg - - [truetype] Minor. - - * src/truetype/ttinterp.h (TT_ExecContext): - s/subpixel/subpixel_hinting. - - * src/truetype/ttgload.c, src/truetype/ttgload.h: Updated. - -2015-05-22 Werner Lemberg - - [truetype] Support selector index 3 of the INSTCTRL instruction. - - This flag activates `native ClearType hinting', disabling backwards - compatibility mode as described in Greg Hitchcocks whitepaper. In - other words, it enables unrestricted functionality of all TrueType - instructions in ClearType. - - * src/truetype/ttgload.c (tt_get_metrics): Call `sph_set_tweaks' - unconditionally. - (tt_loader_init): Unset `ignore_x_mode' flag if bit 2 of - `GS.instruct_control' is active. - - * src/truetype/ttinterp.c (Ins_INSTCTRL): Handle selector index 3. - (Ins_GETINFO): Updated. - - * docs/CHANGES: Document it. - -2015-05-20 Werner Lemberg - - [truetype] Minor. - - * src/truetype/ttinterp.h (SetSuperRound): Fix type of `GridPeriod' - argument. - -2015-05-17 Werner Lemberg - - [truetype] Fix loading of composite glyphs. - - * src/truetype/ttgload.c (TT_Load_Composite_Glyph): If the - ARGS_ARE_XY_VALUES flag is not set, handle argument values as - unsigned. I trust `ttx' (which has exactly such code) that it does - the right thing here... - - The reason that noone has ever noticed this bug is probably the fact - that point-aligned subglyphs are rare, as are subglyphs with a - number of points in the range [128;255], which is quite large (or - even in the range [32768;65535], which is extremely unlikely). - -2015-05-12 Chris Liddell - - [cff] Make the `*curveto' operators more tolerant. - - * src/cff/cf2intrp.c (cf2_interpT2CharString): The opcodes - `vvcurveto', `hhcurveto', `vhcurveto', and `hvcurveto' all iterate, - pulling values off the stack until the stack is exhausted. - Implicitly the stack must be a multiple (or for subtly different - behaviour) a multiple plus a specific number of extra values deep. - If that's not the case, enforce it (as the old code did). - -2015-05-12 Chris Liddell - - [cff] fix incremental interface with new cff code. - - * src/cff/cf2ft.c (cf2_getSeacComponent): When using the incremental - interface to retrieve glyph data for a SEAC, it be left to the - incremental interface callback to apply the encoding to raw - character index (as it was in the previous code). - -2015-04-29 Alexei Podtelezhnikov - - [autofit] Speed up IUP. - - * src/autofit/afhints.c (af_iup_interp): Separate trivial snapping to - the same position from true interpolation, use `scale' to reduce - divisions. - -2015-04-28 Werner Lemberg - - [cff] Use `name' table for PS name if we have a SFNT-CFF. - - This follows the OpenType 1.7 specification. See - - http://tug.org/pipermail/tex-live/2015-April/036634.html - - for a discussion. - - * src/cff/cffdrivr.c (cff_get_ps_name): Use the `sfnt' service if we - have an SFNT. - -2015-04-27 Alexei Podtelezhnikov - - [truetype] Speed up IUP. - - * src/truetype/ttinterp.c (_iup_worker_interpolate): Separate trivial - snapping to the same position from true interpolation. - -2015-04-21 Werner Lemberg - - [autofit] By default, enable warping code but switch off warping. - - Suggested by Behdad. - - * include/config/ftoption.h: Define AF_CONFIG_OPTION_USE_WARPER. - - * src/autofit/afmodule.c (af_autofitter_init): Initialize `warping' - with `false'. - -2015-04-21 Werner Lemberg - - * docs/CHANGES: Updated. - -2015-04-21 Werner Lemberg - - [autofit] Introduce `warping' property. - - This code replaces the debugging hook from the previous commit with - a better, more generic solution. - - * include/ftautoh.h: Document it. - - * src/autofit/afmodule.h (AF_ModuleRec) - [AF_CONFIG_OPTION_USE_WARPER]: Add `warping' field. - - * src/autofit/afmodule.c (_af_debug_disable_warper): Remove. - (af_property_set, af_property_get, af_autofitter_init) - [AF_CONFIG_OPTION_USE_WARPER]: Handle `warping' option. - - * src/autofit/afhints.h (AF_HINTS_DO_WARP): Remove use of the no - longer existing `_af_debug_disable_warper'. - - * src/autofit/afcjk.c (af_cjk_hints_init), src/autofit/aflatin.c - (af_latin_hints_init), src/autofit/aflatin2.c (af_latin2_hints_init) - [AF_CONFIG_OPTION_USE_WARPER]: Add `AF_SCALER_FLAG_NO_WARPER' to the - scaler flags if warping is off. - - * src/autofit/aftypes.h: Updated. - -2015-04-16 Werner Lemberg - - [autofit] Add debugging hook to disable warper. - - * src/autofit/afmodule.c (_af_debug_disable_warper) - [FT_DEBUG_AUTOFIT]: New global variable. - - * src/autofit/aftypes.h: Updated. - (AF_SCALER_FLAG_NO_WARPER): New macro (not actively used yet). - - * src/autofit/afhints.h (AF_HINTS_DO_WARP): New macro. - - * src/autofi/aflatin.c (af_latin_hints_apply) - [AF_CONFIG_OPTION_USE_WARPER]: Use `AF_HINTS_DO_WARP' to control use - of warper. - - * src/autofit/afcjk.c (af_cjk_hints_init, af_cjk_hints_apply) - [AF_CONFIG_OPTION_USE_WARPER]: Synchronize with `aflatin.c'. - - * src/autofit/aflatin2.c (af_latin2_hints_apply) - [AF_CONFIG_OPTION_USE_WARPER]: Synchronize with `aflatin.c'. - -2015-04-10 Werner Lemberg - - [cff] Update advance width handling to OpenType 1.7. - - Problem reported by Behdad. - - * src/cff/cffdrivr.c (cff_get_advances): Handle SFNT case - separately. - - * src/cff/cffgload.c (cff_slot_load): Use advance width and side - bearing values from `hmtx' table if present. - -2015-04-03 Alexei Podtelezhnikov - - * src/autofit/afhints.c (af_glyph_hints_reload): Use do-while loop. - -2015-04-02 Alexei Podtelezhnikov - - * src/autofit/aflatin.c (af_latin_hint_edges): Reduce logic. - -2015-04-01 Alexei Podtelezhnikov - - [autofit] Finish the thought. - - * src/autofit/afhints.c (af_direction_compute): make sure the long arm - is never negative so that its `FT_ABS' is not necessary. - -2015-04-01 Werner Lemberg - - [autofit] Call dumper functions for tracing. - - * src/autofit/afcjk.c (af_cjk_hints_apply): Remove dead code. - * src/autofit/afhints.c (af_glyph_hints_dump_points): Minor - improvement. - * src/autofit/afmodule.c (af_autofitter_load_glyph): Implement it. - -2015-04-01 Werner Lemberg - - [autofit] Make debugging stuff work again. - - The interface to ftgrid was broken in the series of commits starting - with - - [autofit] Allocate AF_Loader on the stack instead of AF_Module. - - from 2015-01-14. - - * src/autofit/afmodule.c (_af_debug_hints_rec) [FT_DEBUG_AUTOFIT]: - Use a global AF_GlyphHintsRec object for debugging. - (af_autofitter_done, af_autofitter_load_glyph): Updated. - - * src/autofit/afloader.c (af_loader_init, af_loader_done): Updated. - -2015-04-01 Werner Lemberg - - * src/autofit/afhints.c (af_glyph_hints_done): Fix minor thinko. - -2015-03-29 Werner Lemberg - - [cff] Fix Savannah bug #44629. - - * src/cff/cf2font.h (CF2_MAX_SUBR), src/cff/cffgload.h - (CFF_MAX_SUBRS_CALLS): Set to 16. - -2015-03-29 Werner Lemberg - - [type1, truetype] Make the MM API more flexible w.r.t. `num_coords'. - - This commit allows `num_coords' to be larger or smaller than the - number of available axes while selecting a design instance, either - ignoring excess data or using defaults if data is missing. - - * src/truetype/ttgxvar.c (TT_Set_MM_Blend, TT_Set_Var_Design): - Implement it. - - * src/type1/t1load.c (T1_Set_MM_Blend, T1_Set_MM_Design, - T1_Set_Var_Design): Ditto. - -2015-03-29 Werner Lemberg - - [type1] Minor. - - * src/type1/t1load.c (T1_Set_MM_Blend, T1_Set_MM_Design): Use - FT_THROW. - (T1_Set_Var_Design): Use T1_MAX_MM_AXIS and FT_THROW. - -2015-03-27 Werner Lemberg - - [cff] Trace charstring nesting levels. - - * src/cff/cf2intrp.c (cf2_interpT2CharString) : Implement it. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - : Ditto. - -2015-03-21 Alexei Podtelezhnikov - - [base] Optimize `FT_Angle_Diff'. - - Under normal circumstances we are usually close to the desired range - of angle values, so that the remainder is not really necessary. - - * src/base/fttrigon.c (FT_Angle_Diff): Use loops instead of remainder. - - * src/autofit/aftypes.h (AF_ANGLE_DIFF): Ditto in the unused macro. - -2015-03-21 Werner Lemberg - - [truetype] Improve `gvar' handling. - - * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Correctly handle - single-element runs. Cf. glyph `Q' in Skia.ttf with weights larger - than the default. - -2015-03-20 Alexei Podtelezhnikov - - * src/base/fttrigon.c (FT_Vector_Rotate): Minor refactoring. - -2015-03-17 Alexei Podtelezhnikov - - Fix Savannah bug #44412 (part 2). - - * src/base/fttrigon.c (FT_Sin, FT_Cos, FT_Tan): Call `FT_Vector_Unit'. - -2015-03-11 Werner Lemberg - - [autofit] Add support for Arabic script. - - Thanks to Titus Nemeth for guidance! - - * src/autofit/afblue.dat: Add blue zone data for Arabic. - - * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated. - - * src/autofit/afscript.h: Add Arabic standard characters. - - * src/autofit/afranges.c: Add Arabic data. - - * src/autofit/afstyles.h: Add Arabic data. - - * docs/CHANGES: Document it. - -2015-03-11 Werner Lemberg - - Rename `svxf86nm.h' to `svfntfmt.h'; update related symbols. - - * include/internal/ftserv.h (FT_SERVICE_XFREE86_NAME_H): Renamed - to... - (FT_SERVICE_FONT_FORMAT_H): This. - - * include/internal/services/svfntfmt.h (FT_XF86_FORMAT_*): Renamed - to ... - (FT_FONT_FORMAT_*): This. - - src/base/ftfntfmt.c, src/bdf/bdfdrivr.c, src/cff/cffdrivr.c, - src/cid/cidriver.c, src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, - src/truetype/ttdriver.c, src/type1/t1driver.c, - src/type42/t42drivr.c, src/winfonts/winfnt.c: Updated. - -2015-03-11 Werner Lemberg - - [base] Rename `FT_XFREE86_H' to `FT_FONT_FORMATS_H'. - - * include/config/ftheader.h: Implement it. - * src/base/ftfntfmt.c, docs/CHANGES: Updated. - -2015-03-11 Werner Lemberg - - [base] Rename `FT_Get_X11_Font_Format' to `FT_Get_Font_Format'. - - * include/ftfntfmt.h, src/base/ftfntfmt.c: Implement it. - - * docs/CHANGES: Updated. - -2015-03-11 Werner Lemberg - - Fix automatic copyright updating. - - * src/tools/update-copyright: Make scanning of `no-copyright' - actually work. - - * src/tools/no-copyright: Don't include README in general. - -2015-03-11 Werner Lemberg - - Rename `ftxf86.[ch]' to `ftfntfmt.[ch]'. - - CMakeLists.txt, builds/amiga/makefile, builds/amiga/makefile.os4, - builds/amiga/smakefile, builds/mac/FreeType.m68k_cfm.make.txt, - builds/mac/FreeType.m68k_far.make.txt, - builds/mac/FreeType.ppc_carbon.make.txt, - builds/mac/FreeType.ppc_classic.make.txt, builds/symbian/bld.inf, - builds/symbian/freetype.mmp, builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2008-ce/freetype.vcproj, - builds/windows/vc2005/freetype.vcproj, - builds/windows/vc2008/freetype.vcproj, - builds/windows/vc2010/freetype.vcxproj, - builds/windows/vc2010/freetype.vcxproj.filters, - builds/windows/visualc/freetype.dsp, - builds/windows/visualc/freetype.vcproj, - builds/windows/visualce/freetype.dsp, - builds/windows/visualce/freetype.vcproj, docs/INSTALL.ANY, - include/config/ftheader.h, include/ftfntfmt.h, modules.cfg, - src/base/ftfntfmt.c, vms_make.com: Updated. - -2015-03-10 Alexei Podtelezhnikov - - Fix Savannah bug #44412 (part 1). - - * src/base/ftstroke.c (ft_stroker_inside): Handle near U-turns. - -2015-03-10 Werner Lemberg - - [base] Rename `FT_Bitmap_New' to `FT_Bitmap_Init'. - - * include/ftbitmap.h, src/base/ftbitmap.c: Implement it. - Update all callers. - - * docs/CHANGES: Updated. - -2015-03-06 Werner Lemberg - - * src/sfnt/ttload.c (tt_face_load_font_dir): Fix compiler warning. - - Found by Alexei. - -2015-03-05 Alexei Podtelezhnikov - - * src/base/ftstroke.c: Simplify. - -2015-03-04 Werner Lemberg - - [truetype] Some fixes and code refactoring in `ttgxvar.c'. - - * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Fix return value - of `point_cnt' if two bytes are read. - Use a more vertical coding style. - (ft_var_readpackeddeltas): Use FT_UInt for `delta_cnt' parameter. - Use a more vertical coding style. - -2015-03-03 Werner Lemberg - - [autofit] Fix Savannah bug #44241. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Reject glyphs - with less than 3 points. - -2015-03-02 Werner Lemberg - - Simplify `TYPEOF' macro. - - No need for two arguments. - - * include/config/ftconfig.h, builds/unix/ftconfig.in, - builds/vms/ftconfig.h (TYPEOF): Updated. - - * include/internal/ftobjs.h (FT_PAD_FLOOR, FT_PIX_FLOOR), - src/autofit/afwarp.h (AF_WARPER_FLOOR): Updated. - -2015-03-01 Werner Lemberg - - Various compiler warning fixes for `make multi'. - - * src/autofit/afcjk.c (af_cjk_hints_compute_blue_edges), - src/autofit/aflatin.c (af_latin_hint_compute_blue_edges, - af_latin_hint_edges), src/autofit/aflatin2.c - (af_latin2_hints_compute_blue_edges, af_latin2_hint_edges): Declare - as `static'. - - * src/cache/ftccmap.c (FTC_CMAP_QUERY_HASH, FTC_CMAP_NODE_HASH): - Removed. Unused. - * src/cache/ftcimage.c: Include FT_INTERNAL_OBJECTS_H. - * src/cache/ftcmanag.c (FTC_LRU_GET_MANAGER): Removed. Unused. - - * src/cff/cf2intrp.c: Include `cf2intrp.h'. - * src/cff/cffdrivr.c (PAIR_TAG): Removed. Unused. - - * src/gzip/ftgzip.c (NO_DUMMY_DECL): Removed. Unused. - - * src/psaux/afmparse.c (afm_parser_read_int): Declare as `static'. - - * src/pshinter/pshalgo.c (STRONGER, PSH_ZONE_MIN, PSH_ZONE_MAX): - Removed. Unused. - - * src/raster/ftraster.c (Render_Glyph): Declare as `static'. - - * src/sfnt/ttpost.c (load_format_20): Fix signedness warning. - - * src/truetype/ttdriver.c (PAIR_TAG): Removed. Unused. - * src/truetype/ttsubpix.c (is_member_of_family_class, - is_member_of_style_class): Declare as `static'. - - * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Declare - as `static'. - * src/type1/t1load.c (mm_axis_unmap, mm_weights_unmap): Declare as - `static'. - (T1_FIELD_COUNT): Removed. Unused. - * src/type1/t1parse.h (T1_Done_Table): Removed. Unused. - - * src/type42/t42parse.c (T1_Done_Table): Removed. Unused. - -2015-02-25 Werner Lemberg - - [psaux] Signedness fixes. - - * include/internal/psaux.h, src/psaux/afmparse.c, - src/psaux/afmparse.h, src/psaux/psconv.c, src/psaux/psobjs.c, - src/psaux/t1cmap.c, src/psaux/t1decode.c: Apply. - -2015-02-25 Werner Lemberg - - [otvalid] Signedness fixes. - - * src/otvalid/otvcommn.c, src/otvalid/otvgdef.c, - src/otvalid/otvgpos.c, src/otvalid/otvgsub.c, src/otvalid/otvmath.c: - Apply. - -2015-02-25 Werner Lemberg - - * src/bzip2/ftbzip2.c (ft_bzip2_alloc): Signedness fix. - -2015-02-25 Werner Lemberg - - [lzw] Signedness fixes. - - * src/lzw/ftzopen.c, src/lzw/ftzopen.h: Apply. - -2015-02-25 Werner Lemberg - - [gxvalid] Signedness fixes. - - * src/gxvalid/gxvbsln.c, src/gxvalid/gxvcommn.c, - src/gxvalid/gxvcommn.h, src/gxvalid/gxvjust.c, - src/gxvalid/gxvkern.c, src/gxvalid/gxvlcar.c, src/gxvalid/gxvmort.c, - src/gxvalid/gxvmort1.c, src/gxvalid/gxvmort2.c, - src/gxvalid/gxvmorx.c, src/gxvalid/gxvmorx1.c, - src/gxvalid/gxvmorx2.c, src/gxvalid/gxvopbd.c, - src/gxvalid/gxvprop.c, src/gxvalid/gxvtrak.c: Apply. - -2015-02-25 Werner Lemberg - - [cache] Signedness fixes. - - * src/cache/ftcbasic.c, src/cache/ftccmap.c, src/cache/ftcimage.c, - src/cache/ftcmanag.c, src/cache/ftcsbits.c: Apply. - -2015-02-25 Werner Lemberg - - Change dimension fields in `FTC_ImageTypeRec' to unsigned type. - - This doesn't break ABI. - - * include/ftcache.h (FTC_ImageTypeRec): Use unsigned types for - `width' and `height'. - - * docs/CHANGES: Document it. - -2015-02-25 Werner Lemberg - - [cache] Don't use `labs'. - - This is the only place in FreeType where this function was used. - - * include/config/ftstdlib.h (ft_labs): Remove. - - * src/cache/ftcimage.c (ftc_inode_weight): Replace `ft_labs' with - `FT_ABS'. - -2015-02-23 Werner Lemberg - - [cache] Replace `FT_PtrDist' with `FT_Offset'. - - * src/cache/ftccache.h (FTC_NodeRec): `FT_Offset' (a.k.a. `size_t') - is a better choice for `hash' to hold a pointer than `FT_PtrDist' - (a.k.a. `ptrdiff_t'), especially since the latter is signed, - causing zillions of signedness warnings. [Note that `hash' was of - type `FT_UInt32' before the change to `FT_PtrDist'.] - Update all users. - - * src/cache/ftcbasic.c, src/cache/ftccache.c, src/cache/ftccmap.c, - src/cache/ftcglyph.c, src/cache/ftcglyph.h: Updated. - -2015-02-23 Werner Lemberg - - [smooth, raster] Re-enable standalone compilation. - - * src/raster/ftraster.c (FT_RENDER_POOL_SIZE, FT_MAX) - [_STANDALONE_]: Define macros. - - * src/smooth/ftgrays.c (FT_RENDER_POOL_SIZE, FT_MAX, FT_ABS, - FT_HYPOT) [_STANDALONE_]: Define macros. - -2015-02-22 Werner Lemberg - - [smooth] Signedness fixes. - - * src/smooth/ftgrays.c, src/smooth/ftsmooth.c: Apply. - -2015-02-22 Werner Lemberg - - * src/raster/ftraster.c: Use the file's typedefs everywhere. - -2015-02-22 Werner Lemberg - - * src/sfnt/ttpost.c (load_format_20): Fix error tracing message. - - Bug introduced 6 commits earlier. - -2015-02-22 Werner Lemberg - - [pshinter] Fix thinko. - - * src/pshinter/pshalgo.c (psh_glyph_find_strong_points): Correctly - check `count'. - Bug introduced two commits earlier. - -2015-02-22 Werner Lemberg - - [raster] Signedness fixes. - - * src/raster/ftraster.c, src/raster/ftrend1.c: Apply. - -2015-02-22 Werner Lemberg - - [pshinter] Signedness fixes. - - * src/pshinter/pshalgo.c, src/pshinter/pshglob.c, - src/pshinter/pshrec.c: Apply. - -2015-02-22 Werner Lemberg - - [pshinter] Use macros for (unsigned) flags, not enumerations. - - * src/pshinter/pshalgo.h (PSH_Hint_Flags): Replace with macros. - Updated. - * src/pshinter/pshrec.h (PS_Hint_Flags): Replace with macros. - -2015-02-22 Werner Lemberg - - * src/pshinter/pshrec.c: Simplify. - (ps_hints_open, ps_hints_stem): Remove switch statement. - -2015-02-22 Werner Lemberg - - [sfnt] Signedness fixes. - - * src/sfnt/pngshim.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap.c, - src/sfnt/ttkern.c, src/sfnt/ttload.c, src/sfnt/ttpost.c, - src/sfnt/ttsbit.c: Apply. - * src/sfnt/sfdriver.c: Apply. - (sfnt_get_ps_name): Simplify. - -2015-02-22 Werner Lemberg - - [bdf] Signedness fixes. - - * src/bdf/bdf.h, src/bdf/bdfdrivr.c, src/bdf/bdfdrivr.h, - src/bdf/bdflib.c: Apply. - -2015-02-22 Werner Lemberg - - * src/bdf/bdflib.c (_bdf_atous): New function. - (_bdf_parse_glyphs, _bdf_parse_start): Use it. - -2015-02-22 Werner Lemberg - - [pcf] Signedness fixes. - - * src/pcf/pcf.h, src/pcf/pcfdrivr.c: Apply. - * src/pcf/pcfread.c: Apply. - (pcf_get_encodings): Ignore invalid negative encoding offsets. - -2015-02-21 Werner Lemberg - - * src/winfonts/winfnt.c: Signedness fixes. - -2015-02-21 Werner Lemberg - - [type42] Signedness fixes. - - * src/type42/t42parse.c, src/type42/t42parse.h, - src/type42/t42types.h: Apply. - -2015-02-21 Werner Lemberg - - [pfr] Signedness fixes. - - * src/pfr/pfrdrivr.c, src/pfr/pfrgload.c, src/pfr/pfrload.c, - src/pfr/pfrload.h, src/pfr/pfrobjs.c, src/pfr/pfrsbit.c, - src/pfr/pfrtypes.h: Apply. - -2015-02-21 Werner Lemberg - - [cff] Minor signedness fixes related to last commit. - - * src/cff/cf2ft.c, src/cff/cf2intrp.c, src/cff/cffgload.c: Apply. - -2015-02-20 Werner Lemberg - - [cff] Thinkos in bias handling. - - Only the final result is always positive. - - Bug introduced three commits earlier. - - * src/cff/cffgload.c, src/cff/cffgload.h: Apply. - -2015-02-20 Werner Lemberg - - [cid] Fix signedness issues and emit some better error codes. - - * src/cid/cidgload.c, src/cid/cidload.h, src/cid/cidobjs.c, - src/cid/cidparse.h: Apply. - * src/cid/cidload.c: Apply. - (parse_fd_array): Reject negative values for number of dictionaries. - * src/cid/cidparse.c: Apply. - (cid_parser_new): Reject negative values for hex data length. - -2015-02-20 Werner Lemberg - - [cff] Signedness fixes for new engine. - - * src/cff/cf2arrst.c, src/cff/cf2fixed.h, src/cff/cf2ft.c, - src/cff/cf2ft.h, src/cff/cf2hints.c, src/cff/cf2intrp.c: Apply. - -2015-02-20 Werner Lemberg - - [cff] Signedness fixes for basic infrastructure and old engine. - - * include/internal/pshints.h, src/cff/cffdrivr.c, - src/cff/cffgload.c, src/cff/cffgload.h, src/cff/cffload.c, - src/cff/cffobjs.c, src/cff/cffparse.c, src/pshinter/pshrec.c: Apply. - -2015-02-19 Werner Lemberg - - * src/truetype/ttgxvar.c (TT_Get_MM_Var): Ignore `countSizePairs'. - - This is hard-coded to value 2 in `fvar' version 1.0 (and no newer - version exists), but some fonts set it incorrectly. - - Problem reported by Adam Twardoch . - -2015-02-19 Werner Lemberg - - [cff] Emit better error code for invalid private dict size. - - * src/cff/cffparse.c (cff_parse_private_dict): Reject negative - values for size and offset. - -2015-02-19 Werner Lemberg - - [autofit] Fix signedness issues. - - * src/autofit/afangles.c, src/autofit/afcjk.c, - src/autofit/afglobal.c, src/autofit/afhints.c, - src/autofit/aflatin.c, src/autofit/aflatin2.c, src/autofit/afwarp.c, - src/autofit/hbshim.c: Apply. - -2015-02-19 Werner Lemberg - - [autofit] Use macros for (unsigned) flags, not enumerations. - - This harmonizes with other code in FreeType (and reduces the number - of necessary casts to avoid compiler warnings). - - * src/autofit/afblue.hin: Make flag macros unsigned. - * src/autofit/afblue.h: Regenerated. - - * src/autofit/afcjk.h: Replace flag enumeration with macros. - * src/autofit/afcjk.c: Updated. - - * src/autofit/afhints.h (AF_Flags, AF_Edge_Flags): Replace with - macros. - * src/autofit/afhints.c: Updated. - - * src/autofit/aflatin.h: Replace flag enumerations with macros. - * src/autofit/aflatin.c, src/autofit/aflatin2.c: Updated. - - * src/autofit/aftypes.h (AF_ScalerFlags): Replace with macros. - -2015-02-18 Werner Lemberg - - [type1] Fix signedness issues. - - * include/internal/psaux.h, include/internal/t1types.h, - src/psaux/psobjs.c, src/psaux/psobjs.h, src/psaux/t1decode.c, - src/type1/t1gload.c, src/type1/t1load.c, src/type1/t1parse.c: Apply. - -2015-02-18 Werner Lemberg - - [psaux, type1] Fix minor AFM issues. - - * include/internal/t1types.h (AFM_KernPairRec): Make indices - unsigned. - Update users. - (AFM_FontInfoRec): Make element counters unsigned. - Update users. - * src/psaux/afmparse.h (AFM_ValueRec): Add union member for unsigned - int. - - * src/psaux/afmparse.c (afm_parse_track_kern, afm_parse_kern_pairs): - Reject negative values for number of kerning elements. - - * src/type1/t1afm.c, src/tools/test_afm.c: Updated. - -2015-02-18 Werner Lemberg - - Don't use `FT_PtrDist' for lengths. - - Use FT_UInt instead. - - * include/internal/psaux.h (PS_Table_FuncsRec, PS_TableRec, - T1_DecoderRec): Do it. - - * include/internal/t1types.h (T1_FontRec): Ditto. - - * src/cid/cidload.c (cid_parse_dict): Updated. - * src/pfr/pfrload.c (pfr_extra_item_load_font_id): Ditto. - * src/psaux/psobjs.c (ps_table_add), src/psaux/psobjs.h: Ditto. - * src/type1/t1load.c (parse_blend_axis_types, parse_encoding, - parse_chharstrings, parse_dict): Ditto. - * src/type42/t42parse.c (t42_parse_encoding, t42_parse_charstrings, - t42_parse_dict): Ditto. - -2015-02-18 Werner Lemberg - - * src/type1/t1driver.c (t1_ps_get_font_value): Clean up. - This handles negative values better, avoiding many casts. - -2015-02-17 Werner Lemberg - - [base] Fix Savannah bug #44284. - - * src/base/ftcalc.c (FT_MulFix): Typos. - -2015-02-17 Werner Lemberg - - [truetype] Finish compiler warning fixes for signedness issues. - - * src/truetype/ttgxvar.c, src/truetype/ttsubpix.c, - src/truetype/ttsubpix.h: Apply. - -2015-02-17 Werner Lemberg - - * src/truetype/ttsubpix.c: Adding missing `static' keywords. - -2015-02-17 Werner Lemberg - - [truetype] More signedness fixes. - - * include/internal/tttypes.h, src/truetype/ttinterp.h, - src/truetype/ttobjs.h, src/truetype/ttinterp.c, - src/truetype/ttobjs.c: Apply. - -2015-02-17 Werner Lemberg - - [truetype] Various signedness fixes. - - * include/internal/ftgloadr.h, src/truetype/ttpload.c: Apply. - - * src/truetype/ttgload.c: Apply. - (TT_Get_VMetrics): Protect against invalid ascenders and descenders - while constructing advance height. - -2015-02-16 Werner Lemberg - - [base] Finish compiler warning fixes for signedness issues. - - * src/base/ftglyph.c, src/base/ftlcdfil.c, src/base/ftstroke.c: - Apply. - -2015-02-16 Werner Lemberg - - * include/tttables.h (TT_OS2): `fsType' must be FT_UShort. - -2015-02-16 Werner Lemberg - - More minor signedness warning fixes. - - * src/base/ftbbox.c, src/base/ftbitmap.c, src/base/fttrigon.c, - src/base/ftutil.c: Apply. - -2015-02-16 Werner Lemberg - - Next round of minor compiler warning fixes. - - * include/internal/ftrfork.h (FT_RFork_Ref): Change `offset' member - type to `FT_Long'. - (CONST_FT_RFORK_RULE_ARRAY_BEGIN): Add `static' keyword. - - * include/internal/ftstream.h (FT_Stream_Pos): Return `FT_ULong'. - - * src/base/ftoutln.c, src/base/ftrfork.c, src/base/ftstream.c: - Signedess fixes. - -2015-02-16 Werner Lemberg - - Various minor signedness fixes. - - * include/ftadvanc.h, include/internal/ftobjs.h, - src/base/ftgloadr.c, src/base/ftobjs.c: Apply. - -2015-02-16 Werner Lemberg - - New `TYPEOF' macro. - - This helps suppress signedness warnings, avoiding issues with - implicit conversion changes. - - * include/config/ftconfig.h, builds/unix/ftconfig.in, - builds/vms/ftconfig.h (TYPEOF): Define. - - * include/internal/ftobjs.h (FT_PAD_FLOOR, FT_PIX_FLOOR), - src/autofit/afwarp.h (AF_WARPER_FLOOR): Use it. - -2015-02-16 Werner Lemberg - - * src/base/ftsystem.c: Use casts in standard C function wrappers. - (ft_alloc, ft_realloc, ft_ansi_stream_io, FT_Stream_Open): Do it. - -2015-02-16 Werner Lemberg - - Fix Savannah bug #44261. - - * builds/unix/detect.mk (setup) [unix]: Set `CONFIG_SHELL' in the - environment also while calling the configure script. - -2015-02-16 Werner Lemberg - - * include/internal/ftmemory.h: Add some `FT_Offset' casts. - (FT_MEM_SET, FT_MEM_COPY, FT_MEM_MOVE, FT_ARRAY_ZERO, FT_ARRAY_COPY, - FT_MEM_MOVE): Do it. - -2015-02-15 Werner Lemberg - - [base] Clean up signedness issues in `ftdbgmem.c'. - - Also fix other minor issues. - - * src/base/ftdbgmem.c (FT_MemTableRec): Replace all FT_ULong types - with FT_Long for consistency. - (ft_mem_primes): Change type to `FT_Int'. - (ft_mem_closest_prime, ft_mem_table_set): Updated. - - (ft_mem_debug_panic, ft_mem_debug_alloc, ft_mem_debug_free, - ft_mem_debug_realloc): Use `static' keyword and fix signedness - warnings where necessary. - - (ft_mem_table_resize, ft_mem_table_new, ft_mem_table_destroy, - ft_mem_table_get_nodep, ft_mem_debug_init, FT_DumpMemory): Fix types - and add or remove casts to avoid signedness warnings. - -2015-02-15 Werner Lemberg - - [base] Clean up signedness in arithmetic functions. - - This makes the code more readable and reduces compiler warnings. - - * src/base/ftcalc.c (FT_MulDiv, FT_MulDiv_No_Round, FT_MulFix, - FT_DivFix): Convert input parameters to unsigned, do the - computation, then convert the result back to signed. - (ft_corner_orientation): Fix casts. - -2015-02-07 Werner Lemberg - - [sfnt] Fix Savannah bug #44184. - - * src/sfnt/ttload.c (check_table_dir, tt_face_load_font_dir): No - longer reject `htmx' and `vmtx' tables with invalid length but - sanitize them. - -2015-02-06 Jon Anderson - - [truetype] Fix regression in the incremental glyph loader. - - * src/truetype/ttgload.c (load_truetype_glyph): For incremental - fonts, the glyph index may be greater than the number of glyphs - indicated, so guard the check with a preprocessor conditional. - -2015-02-06 Werner Lemberg - - [autofit] Fix potential memory leak. - - While this doesn't show up with FreeType, exactly the same code - leaks with ttfautohint's modified auto-hinter code (which gets used - in a slightly different way). - - It certainly doesn't harm since it is similar to already existing - checks in the code for embedded arrays. - - * src/autofit/afhints.c (af_glyph_hints_reload): Set `max_contours' - and `max_points' for all cases. - -2015-01-31 Werner Lemberg - - [autofit] Add support for Thai script. - - Thanks to Ben Mitchell for guidance with blue - zone characters! - - * src/autofit/afblue.dat: Add blue zone data for Thai. - - * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated. - - * src/autofit/afscript.h: Add Thai standard characters. - - * src/autofit/afranges.c: Add Thai data. - - * src/autofit/afstyles.h: Add Thai data. - -2015-01-23 Behdad Esfahbod - - [raster] Handle `FT_RASTER_FLAG_AA' correctly. - - This fixes a breakage caused by the commit `[raster] Remove - 5-level gray AA mode from monochrome rasterizer.'. - - Problem reported by Markus Trippelsdorf . - - * src/raster/ftraster.c (ft_black_render): Handle - `FT_RASTER_FLAG_AA'. - - * src/raster/ftrend1.c (ft_raster1_render): Remove gray AA mode - remnants. - -2015-01-18 Werner Lemberg - - * src/base/ftobjs.c (FT_New_Library): Fix compiler warning. - -2015-01-18 Chris Liddell - - [raster] Fix Savannah bug #44022. - - Add fallback for glyphs with degenerate bounding boxes. - - If a glyph has only one very narrow feature, the bbox can end up - with either the width or height of the bbox being 0, in which case - no raster memory is allocated and no attempt is made to render the - glyph. This is less than ideal when the drop-out compensation in - the rendering code would actually result in the glyph being - rendered. - - This problem can be observed with the `I' glyph (gid 47) in the - Autodesk RomanS TrueType font. - - * src/raster/ftrend1.c (ft_raster1_render): Add a fallback if either - dimension is zero to explicitly round up/down (instead of simply - round). - -2015-01-17 Werner Lemberg - - Add some tools to handle yearly copyright notice updates. - - We are now following the GNU guidelines: A new release automatically - means that the copyright year of all affected files gets updated; it - is no longer used to track years of modification changes. - - * src/tools/update-copyright-year: New Perl script. - * src/tools/update-copyright: New shell script that calls - `update-copyright-year' on all files. - * src/tools/no-copyright: Exceptions that should not be handled by - `update-copyright' - -2015-01-14 Werner Lemberg - - * docs/CHANGES: Updated, using a description from Behdad. - -2015-01-14 Behdad Esfahbod - - * src/autofit/afmodule.c (af_autofitter_done): Fix compiler warning. - -2015-01-14 Behdad Esfahbod - - [autofit] Add embedded array of segments and edges. - - Avoids multiple mallocs per typical glyphs. - - With this and recent changes to avoid mallocs, the thread-safe - stack-based loader is now as fast as the previous model that had one - cached singleton. - - * src/autofit/afhints.h (AF_SEGMENTS_EMBEDDED, AF_EDGES_EMBEDDED): - New macros. - (AF_AxisHintsRec): Add two arrays for segments and edges. - - * src/autofit/afhints.c (af_axis_hints_new_segment): Only allocate - data if number of segments exceeds given threshold value. - (af_axis_hints_new_edge): Only allocate data if number of edges - exceeds given threshold value. - (af_glyph_hints_done): Updated. - -2015-01-14 Behdad Esfahbod - - [autofit] Add embedded arrays for points and contours. - - This avoids at least two malloc calls for typical glyphs. - - * src/autofit/afhints.h (AF_POINTS_EMBEDDED, AF_CONTOURS_EMBEDDED): - New macros. - (AF_GlyphHintsRec): Add two arrays for contours and points. - - * src/autofit/afhints.c (af_glyph_hints_init, af_glyph_hints_done): - Updated. - (af_glyph_hints_reload): Only allocate data if number of contours or - points exceeds given threshold values. - -2015-01-14 Behdad Esfahbod - - [autofit] Allocate hints object on the stack. - - This avoids one malloc per load. - - * src/autofit/afloader.h (AF_LoaderRec): Change type of `hints' to - `AF_GlyphHints'. - Update prototype. - - * src/autofit/afloader.c (af_loader_init): Use `AF_GlyphHints' - parameter instead of `FT_Memory'. - (af_loader_done): Directly reset `load_hints'. - (af_loader_load_g): Updated. - - * src/autofit/afmodule.c (af_autofitter_load_glyph): Use local - `hints' object. - -2015-01-14 Behdad Esfahbod - - [autofit] Reuse slot glyph loader. - - No need to create a new glyph loader; we can reuse the one from - `slot->internal->loader'. It's hard to tell why it was written that - way originally, but new code looks sound and correct to me, and - avoids lots of allocations. - - * src/autofit/afloader.c (af_loader_init): Change return type to - `void'. - Don't call `FT_GlyphLoader_New'. - (af_loader_reset): Don't call `FT_GlyphLoader_Rewind'. - (af_loader_load_g): Update code to use `internal->loader', which - doesn't need copying of data. - - * src/autofit/afloader.h (AF_LoaderRec): Remove `gloader' member. - Update prototype. - - * src/autofit/afmodule.c (af_autofitter_load_glyph): Updated. - -2015-01-14 Behdad Esfahbod - - [autofit] Remove (unused) support for composite glyphs. - - We never have to deal with composite glyphs in the autohinter, as - those will be loaded into FORMAT_OUTLINE by the recursed - `FT_Load_Glyph' function. - - In the rare cases that FT_LOAD_NO_RECURSE is set, it will imply - FT_LOAD_NO_SCALE as per `FT_Load_Glyph', which then implies - FT_LOAD_NO_HINTING: - - /* resolve load flags dependencies */ - - if ( load_flags & FT_LOAD_NO_RECURSE ) - load_flags |= FT_LOAD_NO_SCALE | - FT_LOAD_IGNORE_TRANSFORM; - - if ( load_flags & FT_LOAD_NO_SCALE ) - { - load_flags |= FT_LOAD_NO_HINTING | - FT_LOAD_NO_BITMAP; - - load_flags &= ~FT_LOAD_RENDER; - } - - and as such the auto-hinter is never called. Thus, the recursion in - `af_loader_load_g' never actually happens. So remove the depth - counter as well. - - * src/autofit/afloader.c (af_loader_load_g): Remove `depth' - parameter. - : Remove associated code. - (af_loader_load_glyph): Updated. - -2015-01-14 Behdad Esfahbod - - [raster] Fix uninitialized memory access. - - Apparently `ras.cProfile' might be uninitialized. This will be the - case if `ras.top == ras.cProfile->offset', as can be seen in - `End_Profile'. The overshoot code introduced in a change `Fix B/W - rasterization of subglyphs with different drop-out modes.' (from - 2009-06-18) violated this, accessing `ras.cProfile->flags' - unconditionally just before calling `End_Profile' (which then - detected that `cProfile' is uninitialized and didn't touch it). - - This was harmless, and was not detected by valgrind before because - the objects were allocated on the `raster_pool', which was always - initialized. With recent change to allocate raster buffers on the - stack, valgrind now reported this invalid access. - - * src/raster/ftraster.c (Convert_Glyph): Don't access an - uninitialized `cProfile'. - -2015-01-14 Behdad Esfahbod - - [smooth] Fix uninitialized memory access. - - Looks like `ras.span_y' could always be used without initialization. - This was never detected by valgrind before because the library-wide - `raster_pool' was used for the worker object and `raster_pool' was - originally zero'ed. But subsequent reuses of it were using `span_y' - uninitialized. With the recent change to not use `render_pool' and - allocate worker and buffer on the stack, valgrind now detects this - uninitialized access. - - * src/smooth/ftgrays.c (gray_raster_render): Initialize - `ras.span_y'. - -2015-01-14 Behdad Esfahbod - - [base] Don't initialize unused `driver->glyph_loader'. - - * src/base/ftobjs.c (Destroy_Driver): Don't call - `FT_GlyphLoader_Done'. - (FT_Add_Module): Don't call `FT_GlyphLoader_New'. - -2015-01-14 Behdad Esfahbod - - [base] Don't allocate `library->raster_pool' anymore. - - It's unused after the following commits: - - [raster] Allocate render pool for mono rasterizer on the stack. - [raster] Remove 5-level gray AA mode from monochrome rasterizer. - - The value of FT_RENDER_POOL_SIZE still serves the purpose it used to - serve, which is, to adjust the pool size. But the pool is now - allocated on the stack on demand. - - * src/base/ftobjs.c (FT_New_Library, FT_Done_Library): Implement. - -2015-01-14 Behdad Esfahbod - - [base] Do not reorder library->renderers upon use. - - Instead of keeping `library->renderers' in a MRU order, just leave - it as-is. The MRU machinery wasn't thread-safe. - - With this patch, rasterizing glyphs from different faces from - different threads doesn't fail choosing rasterizer - (FT_Err_Cannot_Render_Glyph). - - Easiest to see that crash was to add a `printf' (or otherwise let - thread yield in FT_Throw with debugging enabled). - - * src/base/ftobjs.c (FT_Render_Glyph_Internal), src/base/ftoutln.c - (FT_Outline_Render): Don't call `FT_Set_Renderer'. - -2015-01-14 Behdad Esfahbod - - [raster] Allocate render pool for mono rasterizer on the stack. - - Instead of using the `render_pool' member of `FT_Library' that is - provided down to the rasterizer, completely ignore that and allocate - needed objects on the stack instead. - - With this patch, rasterizing glyphs from different faces from - different threads doesn't crash in the monochrome rasterizer. - - * src/raster/ftraster.c (black_TRaster): Remove `buffer', - `buffer_size', and `worker' members. - - (ft_black_render): Create `buffer' locally. - (ft_black_reset): Updated. - -2015-01-14 Behdad Esfahbod - - [raster] Remove 5-level gray AA mode from monochrome rasterizer. - - It was off by default and couldn't be turned on at runtime. And the - smooth rasterizer superceded it over ten years ago. No point in - keeping. Comments suggested that it was there for compatibility - with FreeType 1. - - 550 lines down. - - * src/raster/ftraster.c (FT_RASTER_OPTION_ANTI_ALIASING, - RASTER_GRAY_LINES): Remove macros and all associated code. - - (black_TWorker): Remove `gray_min_x' and `gray_max_x'. - (black_TRaster): Remove `grays' and `gray_width'. - - (Vertical_Sweep_Init, Vertical_Sweep_Span, Vertical_Sweep_Drop, - ft_black_render): Updated. - - * src/raster/ftrend1.c (ft_raster1_render): Simplify code. - (ft_raster5_renderer_class): Removed. - -2015-01-14 Behdad Esfahbod - - [smooth] Allocate render pool for smooth rasterizer on the stack. - - Instead of using the `render_pool' member of `FT_Library' that is - provided down to the rasterizer, completely ignore that and allocate - needed objects on the stack instead. - - With this patch, rasterizing glyphs from different faces from - different threads doesn't crash in the smooth rasterizer. - - Bugs: - - https://bugzilla.redhat.com/show_bug.cgi?id=678397 - https://bugzilla.redhat.com/show_bug.cgi?id=1004315 - https://bugzilla.redhat.com/show_bug.cgi?id=1165471 - https://bugs.freedesktop.org/show_bug.cgi?id=69034 - - * src/smooth/ftgrays.c (gray_TRaster): Remove `buffer', - `buffer_size', `band_size', and `worker' members. - - (gray_raster_render): Create `buffer', `buffer_size', and - `band_size' locally. - (gray_raster_reset): Updated. - -2015-01-14 Behdad Esfahbod - - [truetype] Allocate TT_ExecContext in TT_Size instead of TT_Driver. - - Previously the code had stipulation for using a per-TT_Size exec - context if `size->debug' was true. But there was no way that - `size->debug' could *ever* be true. As such, the code was always - using the singleton `TT_ExecContext' that was stored in `TT_Driver'. - This was, clearly, not threadsafe. - - With this patch, loading glyphs from different faces from different - threads doesn't crash in the bytecode loader code. - - * src/truetype/ttobjs.h (TT_SizeRec): Remove `debug' member. - (TT_DriverRec): Remove `context' member. - - * src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): Remove - `TT_ExecContext' code related to a global `TT_Driver' object. - - (tt_driver_done): Don't remove `TT_ExecContext' object here but ... - (tt_size_done_bytecode): ... here. - - (tt_driver_init): Don't create `TT_ExecContext' object here but ... - (tt_size_init_bytecode): ... here, only on demand. - - * src/truetype/ttinterp.c (TT_Run_Context): Remove defunct debug - code. - (TT_New_Context): Remove `TT_ExecContext' code related to a global - `TT_Driver' object. - - * src/truetype/ttinterp.h: Updated. - - * src/truetype/ttgload.c (TT_Hint_Glyph, tt_loader_init): Updated. - -2015-01-14 Behdad Esfahbod - - [autofit] Allocate AF_Loader on the stack instead of AF_Module. - - Stop sharing a global `AF_Loader'. Allocate one on the stack during - glyph load. - - Right now this results in about 25% slowdown, to be fixed in a - following commit. - - With this patch loading glyphs from different faces from different - threads doesn't immediately crash in the autohinting loader code. - - Bugs: - - https://bugzilla.redhat.com/show_bug.cgi?id=1164941 - - * src/autofit/afloader.c (af_loader_init): Pass - `AF_Loader' and `FT_Memory' instead of `AF_Module' as arguments. - (af_loader_reset, af_loader_load_glyph): Also pass `loader' as - argument. - (af_loader_done): Use `AF_Loader' instead of `AF_Module' as - argument. - - * src/autofit/afmodule.c (af_autofitter_init): Don't call - `af_loader_init'. - (af_autofitter_done): Don't call `af_loader_done'. - (af_autofitter_load_glyph): Use a local `AF_Loader' object. - - * src/autofit/afloader.h: Include `afmodule.h'. - Update prototypes. - Move typedef for `AF_Module' to... - - * src/autofit/afmodule.h: ... this place. - No longer include `afloader.h'. - -2015-01-14 Behdad Esfahbod - - * src/type42/t42objs.h (T42_DriverRec): Remove unused member. - -2015-01-12 Werner Lemberg - - Fix Savannah bug #43976. - - Assure that FreeType's internal include directories are found before - `CPPFLAGS' (which might be set by the user in the environment), and - `CPPFLAGS' before `CFLAGS'. - - * builds/freetype.mk (FT_CFLAGS): Don't add `INCLUDE_FLAGS'. - (FT_COMPILE): Make this a special variable for compiling only the - files handled in `freetype.mk'. - (.c.$O): Removed, unused. - - * src/*/rules.mk (*_COMPILE): Fix order of include directories. - -2015-01-11 Werner Lemberg - - [truetype] Prettyfing. - - * src/truetype/ttinterp.c (project, dualproj, fast_project, - fast_dualproj): Rename to... - (PROJECT, DUALPROJ, FAST_PROJECT, FAST_DUALPROJ): ... this. - -2015-01-11 Werner Lemberg - - * src/truetype/ttinterp.c (Ins_JROT, Ins_JROF): Simplify. - - Based on a patch from Behdad. - -2015-01-11 Werner Lemberg - - * src/truetype/ttinterp.c (Ins_SxVTL): Simplify function call. - -2015-01-11 Werner Lemberg - - * src/truetype/ttinterp.c (Normalize): Remove unused argument. - -2015-01-11 Werner Lemberg - - [truetype] More macro expansions. - - * src/truetype/ttinterp.c (FT_UNUSED_EXEC): Remove macro by - expansion. - -2015-01-11 Werner Lemberg - - [truetype] More macro expansions. - - * src/truetype/ttinterp.c (INS_ARG): Remove macro by expansion, - adjusting funtion calls where necessary. - (FT_UNUSED_ARG): Removed, no longer needed. - -2015-01-10 Werner Lemberg - - [truetype] More macro expansions. - - Based on a patch from Behdad. - - * src/truetype/ttinterp.c (DO_*): Expand macros into corresponding - `Ins_*' functions. - (TT_RunIns): Replace `DO_*' macros with `Ins_*' function calls. - (ARRAY_BOUND_ERROR): Remove second definition, which is no longer - needed. - (Ins_SVTCA, Ins_SPVTCA, Ins_SFVTCA): Replaced with... - (Ins_SxyTCA): New function. - -2015-01-10 Werner Lemberg - - [truetype] Remove TT_CONFIG_OPTION_INTERPRETER_SWITCH. - - Behdad suggested this code simplification, and nobody objected... - - * include/config/ftoption.h, devel/ftoption.h - (TT_CONFIG_OPTION_INTERPRETER_SWITCH): Remove. - - * src/truetype/ttinterp.c [TT_CONFIG_OPTION_INTERPRETER_SWITCH]: - Remove related code. - (ARRAY_BOUND_ERROR): Use do-while loop. - -2015-01-10 Werner Lemberg - - [truetype] More macro expansions. - - * src/truetype/ttinterp.c, src/truetype/ttinterp.h (EXEC_ARG_, - EXEC_ARG): Remove by replacing with expansion. - -2015-01-10 Werner Lemberg - - [truetype] More macro expansions. - - Based on a patch from Behdad. - - * src/truetype/ttinterp.c (SKIP_Code, GET_ShortIns, NORMalize, - SET_SuperRound, ROUND_None, INS_Goto_CodeRange, CUR_Func_move, - CUR_Func_move_orig, CUR_Func_round, CUR_Func_cur_ppem, - CUR_Func_read_cvt, CUR_Func_write_cvt, CUR_Func_move_cvt, - CURRENT_Ratio, INS_SxVTL, COMPUTE_Funcs, COMPUTE_Round, - COMPUTE_Point_Displacement, MOVE_Zp2_Point): Remove by replacing - with expansion. - - (Cur_Func_project, CUR_Func_dualproj, CUR_fast_project, - CUR_fast_dualproj): Replace with macros `project', `dualproj', - `fast_project', `fast_dualproj'. - -2015-01-10 Werner Lemberg - - [truetype] More macro expansions. - - * src/truetype/ttinterp.c (EXEC_OP_, EXEC_OP): Remove by replacing - with expansion. - -2015-01-10 Werner Lemberg - - [truetype] Remove code for static TrueType interpreter. - - This is a follow-up patch. - - * src/truetype/ttinterp.c, src/truetype/ttinterp.h - [TT_CONFIG_OPTION_STATIC_INTERPRETER, - TT_CONFIG_OPTION_STATIC_RASTER]: Remove macros and related code. - -2015-01-10 Werner Lemberg - - * src/truetype/ttinterp.c (CUR): Remove by replacing with expansion. - - This starts a series of patches that simplifies the code of the - bytecode interpreter. - -2014-12-30 Werner Lemberg - - * Version 2.5.5 released. - ========================= - - - Tag sources with `VER-2-5-5'. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.5.5. - - * README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj, - builds/windows/vc2005/index.html, - builds/windows/vc2008/freetype.vcproj, - builds/windows/vc2008/index.html, - builds/windows/vc2010/freetype.vcxproj, - builds/windows/vc2010/index.html, - builds/windows/visualc/freetype.dsp, - builds/windows/visualc/freetype.vcproj, - builds/windows/visualc/index.html, - builds/windows/visualce/freetype.dsp, - builds/windows/visualce/freetype.vcproj, - builds/windows/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.5.4/2.5.5/, s/254/255/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5. - - * builds/unix/configure.raw (version_info): Set to 17:4:11. - * CMakeLists.txt (VERSION_PATCH): Set to 5. - * docs/CHANGES: Updated. - - * builds/toplevel.mk (dist): Fix typos. - -2014-12-24 Alexei Podtelezhnikov - - [base] Formatting and nanooptimizations. - - * src/base/ftcalc.c, - * src/base/fttrigon.c: Revise sign restoration. - -2014-12-13 Werner Lemberg - - * src/pcf/pcfread.c (pcf_read_TOC): Improve fix from 2014-12-08. - -2014-12-11 Werner Lemberg - - * builds/toplevel.mk (dist): Use older POSIX standard for `tar'. - - Apparently, BSD tar isn't capable yet of handling POSIX-1.2001 - (contrary to GNU tar), so force the POSIX-1.1988 format. - - Problem reported by Stephen Fisher . - -2014-12-11 Werner Lemberg - - * src/type42/t42parse.c (t42_parse_sfnts): Reject invalid TTF size. - -2014-12-11 Werner Lemberg - - * src/base/ftobjs.c (FT_Get_Glyph_Name): Fix off-by-one check. - - Problem reported by Dennis Felsing . - -2014-12-11 Werner Lemberg - - * src/type42/t42parse.c (t42_parse_sfnts): Check `string_size'. - - Problem reported by Dennis Felsing . - -2014-12-09 suzuki toshiya - - [gxvalid] Fix a naming convention conflicting with ftvalid. - - See previous changeset for otvalid. - - * src/gxvalid/{gxvcommn.h, gxvmort.h, gxvmorx.h}: Replace - `valid' by `gxvalid'. - * src/gxvalid/{gxvbsln.c, gxvcommn.c, gxvfeat.c, gxvjust.c, - gxvkern.c, gxvlcar.c, gxvmort.c, gxvmort0.c, gxvmort1.c, - gxvmort2.c, gxvmort4.c, gxvmort5.c, gxvmorx.c, gxvmorx0.c, - gxvmorx1.c, gxvmorx2.c, gxvmorx4.c, gxvmorx5.c, gxvopbd.c, - gxvprop.c, gxvtrak.c}: Replace `valid' by `gxvalid' if - it is typed as GXV_Validator. - -2014-12-09 suzuki toshiya - - [otvalid] Fix a naming convention conflicting with ftvalid. - - Some prototypes in ftvalid.h use `valid' for the variables - typed as FT_Validator. Their implementations in src/base/ - ftobjs.c and utilizations in src/sfnt/ttcmap.c do similar. - - Some macros in otvcommn.h assume the exist of the variable - `valid' typed as OTV_Validator in the caller. - - Mixing these two conventions cause invalid pointer conversion - and unexpected SEGV in longjmp. To prevent it, all variables - typed as OTV_Validator are renamed to `otvalid'. - - * src/otvalid/otvcommn.h: Replace `valid' by `otvalid'. - * src/otvalid/{otvcommn.c, otvbase.c, otvgdef.c, otvgpos.c, - otvgsub.c, otvjstf.c, otvmath.c}: Replace `valid' by `otvalid' - if it is typed as OTV_Validator. - -2014-12-09 suzuki toshiya - - [ftvalid] Introduce FT_THROW() in FT_INVALID_XXX macros. - - Original patch is designed by Werner Lemberg. Extra part - for otvalid and gxvalid are added by suzuki toshiya, see - discussion: - http://lists.nongnu.org/archive/html/freetype-devel/2014-12/msg00002.html - http://lists.nongnu.org/archive/html/freetype-devel/2014-12/msg00007.html - - * include/internal/ftvalid.h: Introduce FT_THROW() in FT_INVALID_(). - * src/gxvalid/gxvcommn.h: Ditto. - * src/otvalid/otvcommn.h: Ditto. - -2014-12-08 Werner Lemberg - - [pcf] Fix Savannah bug #43774. - - Work around `features' of X11's `pcfWriteFont' and `pcfReadFont' - functions. Since the PCF format doesn't have an official - specification, we have to exactly follow these functions' behaviour. - - The problem was unveiled with a patch from 2014-11-06, fixing issue - #43547. - - * src/pcf/pcfread.c (pcf_read_TOC): Don't check table size for last - element. Instead, assign real size. - -2014-12-07 Werner Lemberg - - Work around a bug in Borland's C++ compiler. - - See - - http://qc.embarcadero.com/wc/qcmain.aspx?d=118998 - - for Borland's bug tracker entry. - - Reported by Yuliana Zigangirova , - http://lists.gnu.org/archive/html/freetype-devel/2014-04/msg00001.html. - - * include/internal/ftvalid.h (FT_ValidatorRec), src/smooth/ftgrays.c - (gray_TWorker_): Move `ft_jmp_buf' field to be the first element. - -2014-12-07 Werner Lemberg - - */*: Decorate hex constants with `U' and `L' where appropriate. - -2014-12-07 Werner Lemberg - - [truetype] Prevent memory leak for buggy fonts. - - * src/truetype/ttobjs.c (tt_size_done): Unconditionally call - `tt_size_done_bytecode'. - -2014-12-06 Werner Lemberg - - * Version 2.5.4 released. - ========================= - - - Tag sources with `VER-2-5-4'. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.5.4. - - * README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj, - builds/windows/vc2005/index.html, - builds/windows/vc2008/freetype.vcproj, - builds/windows/vc2008/index.html, - builds/windows/vc2010/freetype.vcxproj, - builds/windows/vc2010/index.html, - builds/windows/visualc/freetype.dsp, - builds/windows/visualc/freetype.vcproj, - builds/windows/visualc/index.html, - builds/windows/visualce/freetype.dsp, - builds/windows/visualce/freetype.vcproj, - builds/windows/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.5.3/2.5.4/, s/253/254/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4. - - * builds/unix/configure.raw (version_info): Set to 17:3:11. - * CMakeLists.txt (VERSION_PATCH): Set to 4. - * docs/CHANGES: Updated. - -2014-12-04 Werner Lemberg - - docs/CHANGES: Updated, formatted. - -2014-12-04 Dave Arnold - - [cff] Modify an FT_ASSERT. - - * src/cff/cf2hints.c (cf2_hintmap_map): After the fix for Savannah - bug #43661, the test font `...aspartam.otf' still triggers an - FT_ASSERT. Since hintmap still works with count==0, ... - (cf2_glyphpath_lineTo, cf2_glyphpath_curveTo): ... add that term to - suppress the assert. - -2014-12-04 Dave Arnold - - [cff] Fix Savannah bug #43661. - - * src/cff/cf2intrp.c (cf2_interpT2CharString) : Don't append to stem arrays after - hintmask is constructed. - - * src/cff/cf2hints.c (cf2_hintmap_build): Add defensive code to - avoid reading past end of hintmask. - -2014-12-03 Werner Lemberg - - docs/CHANGES: Updated. - -2014-12-03 Werner Lemberg - - [autofit] Better fix for conversion specifiers in debug messages. - - Using `%ld' for pointer differences causes warnings on 32bit - platforms. The correct type would be (the relatively new) `%td', - however, this is missing on some important platforms. - - This patch improves the change from 2014-11-28. - - * src/autofit/afhints.c (AF_INDEX_NUM): Use `int' typecast. Our - pointer differences are always sufficiently small. - (af_glyph_hints_dump_points, af_glyph_hints_dump_segments, - af_glyph_hints_dump_edge): Revert to `%d' and use `AF_INDEX_NUM'. - -2014-12-03 Werner Lemberg - - FT_Sfnt_Tag: s/ft_sfnt_xxx/FT_SFNT_XXX/ for orthogonality. - - All public FreeType enumeration and flag values are uppercase... - - * include/tttables.h (FT_Sfnt_Tag): Implement it. For backwards - compatilibity, retain the old values as macros. - - * src/base/ftfstype.c (FT_Get_FSType_Flags), src/sfnt/sfdriver.c - (get_sfnt_table): Updated. - -2014-12-02 Werner Lemberg - - * include/*: Improve structure of documentation. - - . Add and update many `' tags. - . Apply various documentation fixes. - . Remove details to deprecated (or never implemented) data. - -2014-12-02 Werner Lemberg - - [docmaker] Always handle `' section elements. - - Previously, those elements were handled only for sections present in - a `' chapter element. - - * src/tools/docmaker/content.py (ContentProcessor::finish): - Implement it. - -2014-12-02 Werner Lemberg - - [docmaker] Properly handle empty rows in Synopsis. - - * src/tools/docmaker/tohtml.py (HtmlFormatter::section_enter): Emit - ` ' for empty fields. - -2014-12-02 Werner Lemberg - - [docmaker] Thinko. - - * src/tools/docmaker/content.py (DocBlock::get_markup_words_all): - Emit `/empty/' string for first element also. - -2014-12-02 Werner Lemberg - - [docmaker] Honour empty lines in `' section element. - - This greatly improves the readability of the `Synopsis' links. - - * src/tools/docmaker/content.py (DocBlock::get_markup_words_all): - Insert string `/empty/' between items. - - * src/tools/docmaker/formatter.py (Formatter::section_dump): Make it - robust against nonexistent keys. - - * src/tools/docmaker/tohtml.py (HtmlFormatter::section_enter): Emit - empty elements for `/empty/'. - -2014-12-02 Werner Lemberg - - [docmaker] Ensure Python 3 compatibility. - - * src/tools/docmaker/content.py (ContentProcessor::set_section, - ContentProcessor::finish): Replace `has_key' function with `in' - keyword. - - * src/tools/docmaker/formatter.py (Formatter::__init__): Replace - sorting function with a key generator. - (Formatter::add_identifier): Replace `has_key' function with `in' - keyword. - - * src/tools/docmaker/tohtml.py (HtmlFormatter::html_source_quote): - Replace `has_key' function with `in' keyword. - (HtmlFormatter::index_exit, HtmlFormatter::section_enter): Use - integer division. - s/<>/>/. - - * src/tools/docmaker/utils.py: Import `itertools'. - (index_sort): Replaced by... - (index_key): ... this new key generator (doing exactly the same). - -2014-11-29 Werner Lemberg - - [docmaker] Don't output a block multiple times. - - This bug was hidden by not processing all lines of `' blocks. - - * src/tools/docmaker/formatter.py (Formatter::section_dump): Filter - out field names. - -2014-11-29 Werner Lemberg - - [docmaker] Use field values as HTML link targets where possible. - - * src/tools/docmaker/tohtml.py (HtmlFormatter::make_block_url): - Accept second, optional argument to specify a name. - (HtmlFormatter::html_source_quote): Link to field ID if possible. - (HtmlFormatter::print_html_field_list): Emit `id' attribute. - -2014-11-29 Werner Lemberg - - [docmaker] Allow empty lines in `' blocks. - - Before this patch, the suggested order of entries stopped at the - first empty line. - - Obviously, nobody noticed that this problem caused a much reduced - set of links in the `Synopsis' sections; in particular, the - `' blocks contain a lot of entries that wouldn't be listed - otherwise... - - * src/tools/docmaker/content.py (DocBlock::get_markup_words_all): - New function to iterate over all items. - (DocSection::process): Use it. - -2014-11-29 Werner Lemberg - - * src/tools/docmaker/sources.py (column) [Format 2]: Fix regexp. - - After the single asterisk there must be no other immediately following - asterisk. - -2014-11-29 Werner Lemberg - - * src/tools/docmaker/tohtml.py: Improve CSS for vertical spacing. - -2014-11-29 Werner Lemberg - - [docmaker] Improve HTML code for table of contents. - - * src/tools/docmaker/tohtml.py: Introduce a new table class `toc', - together with proper CSS. - -2014-11-29 Werner Lemberg - - [docmaker] Provide higher-level markup and simplify HTML. - - * src/tools/docmaker/tohtml.py: Instead of using extraneous `
' - elements, use CSS descendants (of class `section') to format the - data. - - Also remove reduntant

and
elements, replacing them with - proper CSS. - - Globally reduce page width to 75%. - - (block_header): Rename

class to `section'. - -2014-11-29 Werner Lemberg - - [docmaker] Add `top' links after blocks. - - * src/tools/docmaker/tohtml.py (block_footer_middle): Implement it. - -2014-11-29 Werner Lemberg - - * src/tools/docmaker/tohtml.py: Improve CSS for fields. - - Make fields align horizontally relative to full line width. - -2014-11-29 Werner Lemberg - - * src/tools/docmaker/tohtml.py: Fix index and TOC templates. - - This thinko was introduced 2014-11-27. - -2014-11-28 Werner Lemberg - - [docmaker] Format field lists with CSS. - - This also simplifies the inserted HTML code. - - * src/tools/docmaker/tohtml.py - (HtmlFormatter::print_html_field_list): Do it. - -2014-11-28 suzuki toshiya - - Fix compiler warning to the comparison between signed and - unsigned variable. - - * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Fix the comparison - between `ypos + ysize' and FT_INT_{MAX,MIN}. - -2014-11-28 Werner Lemberg - - [docmaker] Replace empty `' with CSS. - - * src/tools/docmaker/tohtml.py (HtmlFormatter::section_enter): Do - it. - -2014-11-28 Werner Lemberg - - [docmaker] Replace some `' tags with `

' and `
'. - - * src/tools/docmaker/tohtml.py (marker_*): Use `

'. - (source_*): Use `
'. - (HtmlFormatter::block_enter): s/

/

/. - -2014-11-28 suzuki toshiya - - Fix compiler warning to conversion specifiers in debug messages. - - * src/autofit/afhints.c (af_glyph_hints_dump_points): Add length - modifier to dump long integers. - (af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Ditto. - -2014-11-27 Werner Lemberg - - * src/tools/docmaker/tohtml.py: Use more CSS for index. - -2014-11-27 Werner Lemberg - - [docmaker] Replace `name' attribute of `' with `id'. - - * src/tools/docmaker/tohtml.py (HtmlFormatter::block_enter): Do it. - -2014-11-27 Werner Lemberg - - * src/tools/docmaker/tohtml.py: Remove remaining `width' attributes. - - For `Index' and `TOC' links, we now simply use the `text-align' CSS - property of `

' to enforce flush-left and flush-right, - eliminating the hack with an empty, full-width `' element - inbetween. - - The change also enforces the same (smaller) size for all index and - TOC links. - -2014-11-27 suzuki toshiya - - * src/cff/cf2font.c: Include `ftcalc.h' to use FT_MSB(), - cf2font.c could not find it under `make multi' build. - -2014-11-27 suzuki toshiya - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Remove - unrequired negative value check for `width' and `height'. - -2014-11-27 Werner Lemberg - - * src/tools/docmaker/tohtml.py: More HTML table refactoring. - - Replace some `' tags with `
' to simplify structure. - - Move `bgcolor' attribute to CSS. - - Replace most `width' attributes with CSS. The remaining instances - (providing a similar effect as LaTeX's `\hfill' command) are removed - in a later patch. - -2014-11-27 Werner Lemberg - - * src/tools/docmaker/tohtml.py: Replace with CSS. - -2014-11-27 Werner Lemberg - - * src/tools/docmaker/tohtml.py: Center
with CSS. - -2014-11-27 Werner Lemberg - - * src/tools/docmaker/tohtml.py: Replace `
' with `
'. - -2014-11-27 Werner Lemberg - - * src/tools/docmaker/tohtml.py: Remove redundant `
' tags. - - This starts a series of commits into the direction of generating - valid HTML 5 code, especially using much more CSS. - -2014-11-27 suzuki toshiya - - Prevent too negative values (< FT_INT_MIN) in bitmap metrics, - suggested by Alexei. - - * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Prevent too - negative values in `xpos' and `ypos + ysize'. - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Prevent - too negative values in `x_left' and `y_top'. Either negative - values in `width' and `height' are checked. - -2014-11-27 Werner Lemberg - - [docmaker] Produce better HTML code. - - * src/tools/docmaker/tohtml.py: Always use double quotes for - attribute values. - (source_footer): Close `td' and `tr' groups. - -2014-11-27 Werner Lemberg - - Use better way to disable creation of .pyc files for `make refdoc'. - - Python 2.6 was released in 2008... - - * builds/freetype.mk (refdoc): Use python's `-B' option. - - * builds/detect.mk (std_setup, dos_setup): Mention required python - version for `refdoc' target. - -2014-11-27 Werner Lemberg - - * src/tools/docmaker/sources.py (re_bold, re_italic): Use - non-grouping parentheses. - * src/tools/docmaker/tohtml.py (HtmlFormatter::make_html_word): - Updated. - -2014-11-27 Werner Lemberg - - * src/base/ftobjs.c (FT_Get_Glyph_Name): Fix compiler warning. - - Introdruced in previous change. Reported by Alexei. - -2014-11-26 Werner Lemberg - - * src/*: Add checks for parameters of API functions where missing. - - `API functions' are functions tagged with `FT_EXPORT_DEF'. - - Besides trivial fixes, the following changes are included, too. - - * src/base/ftbdf.c (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): Set - error code if no service is available. - - * src/base/ftinit.c (FT_Done_FreeType): Change return value for - invalid `library' parameter to `Invalid_Library_Handle'. - - * src/base/ftobjs.c (FT_New_Size): Change return value for invalid - `asize' parameter to `Invalid_Argument'. - - * src/base/ftoutln.c (FT_Outline_Copy): Change return value for - invalid `source' and `target' parameters to `Invalid_Outline'. - (FT_Outline_Done_Internal): Change return value for invalid - `outline' parameter to `Invalid_Outline'. - -2014-11-26 Werner Lemberg - - * src/cache/ftcbasic.c: Use single calls to `FT_TRACE'. - -2014-11-26 suzuki toshiya - - * src/base/ftobj.c (Mac_Read_POST_Resource): Additional - overflow check in the summation of POST fragment lengths, - suggested by Mateusz Jurczyk . - -2014-11-26 suzuki toshiya - - * src/base/ftobjs.c (Mac_Read_POST_Resource): Insert comments - and fold too long tracing messages. - -2014-11-26 suzuki toshiya - - Fix Savannah bug #43540. - - * src/base/ftmac.c (parse_fond): Prevent a buffer overrun - caused by a font including too many (> 63) strings to store - names[] table. - -2014-11-26 suzuki toshiya - - * src/base/ftobjs.c (Mac_Read_POST_Resource): Use unsigned long - variables to read the lengths in POST fragments. Suggested by - Mateusz Jurczyk . - -2014-11-26 suzuki toshiya - - Fix Savannah bug #43539. - - * src/base/ftobjs.c (Mac_Read_POST_Resource): Fix integer overflow - by a broken POST table in resource-fork. - -2014-11-26 suzuki toshiya - - Fix Savannah bug #43538. - - * src/base/ftobjs.c (Mac_Read_POST_Resource): Fix integer overflow - by a broken POST table in resource-fork. - -2014-11-26 suzuki toshiya - - * src/base/ftobjs.c (Mac_Read_POST_Resource): Avoid memory leak - by a broken POST table in resource-fork. Return after freeing - the buffered POST table when it is found to be broken. - -2014-11-25 Werner Lemberg - - */*: s/Invalid_Argument/Invalid_Size_Handle/ where appropriate. - -2014-11-25 Werner Lemberg - - */*: s/Invalid_Argument/Invalid_Stream_Handle/ where appropriate. - -2014-11-25 Werner Lemberg - - */*: s/Invalid_Argument/Invalid_Library_Handle/ where appropriate. - -2014-11-25 Werner Lemberg - - */*: s/Invalid_Argument/Invalid_Outline/ where appropriate. - -2014-11-25 Werner Lemberg - - */*: s/Invalid_Argument/Invalid_Face_Handle/ where appropriate. - -2014-11-24 Werner Lemberg - - [Savannah bug #43682] Adjust some renderer callbacks. - - * src/raster/ftraster.c (ft_black_set_mode): Change return type to - `int' to stay in sync with `FT_Renderer_SetModeFunc' prototype. - - * src/smooth/ftgrays.c (gray_raster_set_mode): New dummy function - for orthogonality. - (ft_grays_raster): Use it. - -2014-11-25 Werner Lemberg - - [Savannah bug #43682] Properly handle missing return errors. - - The functions in this patch *do* return non-trivial errors that must - be taken care of. - - * src/autofit/afloader.c (af_loader_load_g), src/base/ftobjs.c - (FT_Render_Glyph_Internal), src/base/ftoutln.c (FT_Outline_Render), - src/cff/cffgload.c (cff_decoder_parse_charstrings) , - src/psaux/psobjs.c (ps_parser_load_field_table), src/psaux/t1decode - (t1_decoder_parse_charstrings) , src/truetype/ttgload.c - (load_truetype_glyph , tt_loader_init, - TT_Load_Glyph), src/truetype/ttgxvar.c (TT_Set_MM_Blend), - src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): Do it. - -2014-11-25 Werner Lemberg - - [Savannah bug #43682] Add/remove `void' casts to some functions. - - We use a cast to indicate that we intentionally ignore a function's - return value. However, this doesn't apply to API functions where - errors can only happen for trivially invalid input. - - * src/base/ftstroke.c (FT_Glyph_Stroke, FT_Glyph_StrokeBorder), - src/base/ftsynth.c (FT_GlyphSlot_Embolden), src/cff/cffgload.c - (cff_slot_load), src/pfr/pfrdrivr.c (pfr_get_kerning), - src/type1/t1load.c (parse_encoding), src/type42/t42parse.c - (t42_parse_encoding): Do it. - -2014-11-25 Werner Lemberg - - [Savannah bug #43682] Change some signatures to `void' return type. - - * include/internal/pshints.h (PSH_Globals_SetScaleFunc), - include/internal/sfnt.h (TT_Get_Metrics_Func), - src/pshinter/pshglob.c (psh_globals_set_scale), - src/pshinter/pshrec.c (ps_hints_init), src/sfnt/ttmtx.c - (tt_face_get_metrics), src/truetype/ttinterp.c (TT_Goto_CodeRange, - TT_Set_CodeRange, TT_Clear_CodeRange, TT_Done_Context, - TT_Save_Context): Do it. - - * src/pshinter/pshglob.h, src/pshinter/pshrec.h, src/sfnt/ttmtx.h, - src/truetype/ttgload.c (TT_Hint_Glyph), src/truetype/ttinterp.c - (TT_Run_Context), src/truetype/ttinterp.h, src/truetype/ttobjs.c - (tt_size_run_fpgm, tt_size_run_prep): Updated. - -2014-11-24 Werner Lemberg - - Remove all code related to FT_MAX_CHARMAP_CACHEABLE. - - This is no longer used. - - * src/base/ftobjs.c, src/cache/ftccmap.c, src/cff/cffobjs.c, - src/sfnt/ttcmap.c: Do it. - -2014-11-24 Werner Lemberg - - [sfnt] Fix Savannah bug #43680. - - This adds an additional constraint to make the fix from 2013-01-25 - really work. - - * src/sfnt/ttsbit.c (tt_sbit_decoder_load_image) : - Check `p' before `num_glyphs'. - -2014-11-24 Werner Lemberg - - [truetype] Fix Savannah bug #43679. - - * src/truetype/ttpload.c (tt_face_load_hdmx): Check minimum size of - `record_size'. - -2014-11-24 Jarkko Pöyry - - [cff, pfr, psaux, winfonts] Fix Savannah bug #43676. - - Don't cast cmap init function pointers to an incompatible type. - - Without this patch, the number of parameters between declaration and - the real signature differs. Calling such a function results in - undefined behavior. - - ISO/IEC 9899:TC3 (Committee Draft September 7, 2007) - 6.5.2.2 Function calls - 9 If the function is defined with a type that is not - compatible with the type (of the expression) pointed to by - the expression that denotes the called function, the - behavior is undefined. - - On certain platforms (c -> js with emscripten) this causes - termination of execution or invalid calls because in the emscripten - implementation, function pointers of different types are stored in - different pointer arrays. Incorrect pointer type here results in - indexing of an incorrect array. - - * src/cff/cffcmap.c (cff_cmap_encoding_init, cff_cmap_unicode_init), - src/pfr/pfrcmap.c (pfr_cmap_init), src/psaux/t1cmap.c - t1_cmap_standard_init, t1_cmap_expert_init, t1_cmap_custom_init, - t1_cmap_unicode_init), src/winfonts/winfnt.c (fnt_cmap_init): Fix - signature. - -2014-11-24 Werner Lemberg - - [sfnt] Fix Savannah bug #43672. - - * src/sfnt/ttkern.c (tt_face_load_kern): Use correct value for - minimum table length test. - -2014-11-24 Werner Lemberg - - [type1, type42] Another fix for Savannah bug #43655. - - * src/type1/t1load.c (parse_charstrings), src/type42/t42parse.c - (t42_parse_charstrings): Add another boundary testing. - -2014-11-24 Werner Lemberg - - [docmaker] Formatting, copyright, improved documentation. - - * src/tools/docmaker/*: No code changes besides trivial - modifications. - -2014-11-22 Werner Lemberg - - [bdf] Fix Savannah bug #43660. - - * src/bdf/bdflib.c (_bdf_parse_glyphs) <"ENDFONT">: Check - `_BDF_GLYPH_BITS'. - -2014-11-22 Werner Lemberg - - [type42] Allow only embedded TrueType fonts. - - This is a follow-up to Savannah bug #43659. - - * src/type42/t42objs.c (T42_Face_Init): Exclusively use the - `truetype' font driver for loading the font contained in the `sfnts' - array. - -2014-11-22 Werner Lemberg - - [type42] Fix Savannah bug #43659. - - * src/type42/t42objs.c (T42_Open_Face): Initialize `face->ttf_size'. - - * src/type42/t42parse.c (t42_parse_sfnts): Always set - `face->ttf_size' directly. This ensures a correct stream size in - the call to `FT_Open_Face', which follows after parsing, even for - buggy input data. - Fix error messages. - -2014-11-22 Werner Lemberg - - [cff] Fix Savannah bug #43658. - - * src/cff/cf2ft.c (cf2_builder_lineTo, cf2_builder_cubeTo): Handle - return values of point allocation routines. - -2014-11-22 Werner Lemberg - - [sfnt] Fix Savannah bug #43656. - - * src/sfnt/ttcmap.c (tt_cmap4_validate): Fix order of validity - tests. - -2014-11-21 Werner Lemberg - - [type1, type42] Fix Savannah bug #43655. - - * src/type1/t1load.c (parse_charstrings), src/type42/t42parse.c - (t42_parse_charstrings): Fix boundary testing. - -2014-11-21 Werner Lemberg - - * src/pcf/pcfread.c (pcf_get_metrics): Sanitize invalid metrics. - -2014-11-21 Werner Lemberg - - [ftlcdfil] Obey flow direction. - - * src/base/ftlcdfil.c (_ft_lcd_filter_fir, _ft_lcd_filter_legacy): - Handle `up' flow. - -2014-11-21 Werner Lemberg - - * src/base/ftbitmap.c (FT_Bitmap_Convert): Improve. - - This commit completes argument checks and adds support for different - flow directions. - -2014-11-21 Werner Lemberg - - * src/base/ftbitmap.c (FT_Bitmap_Copy): Improve. - - This commit adds argument checks and support for different flow - directions. - -2014-11-20 Werner Lemberg - - * src/base/ftbitmap.c (FT_Bitmap_New): Check argument. - -2014-11-19 Werner Lemberg - - Change some fields in `FT_Bitmap' to unsigned type. - - This doesn't break ABI. - - * include/ftimage.h (FT_Bitmap): Make `rows', `width', `num_grays', - `pixel_mode', and `palette_mode' unsigned types. - - * src/base/ftbitmap.c: Updated. - (FT_Bitmap_Copy): Fix casts. - - * src/cache/ftcsbits.c, src/raster/ftraster.c, src/sfnt/pngshim.c: - Updated. - -2014-11-19 Werner Lemberg - - Make `FT_Bitmap_Convert' correctly handle negative `pitch' values. - - * src/base/ftbitmap.c (FT_Bitmap_Convert): Always use positive value - for the pitch while copying data. - Correctly set pitch sign in target bitmap. - -2014-11-19 Werner Lemberg - - Minor code improvement in `FT_Bitmap_Embolden'. - - * src/base/ftbitmap.c (FT_Bitmap_Embolden) : - Fix thinko. - -2014-11-19 Alexei Podtelezhnikov - - * src/base/fttrigon.c: Use dedicated `FT_Angle' for arctan table. - -2014-11-19 Behdad Esfahbod - - Avoid compiler warnings on x86-64 for `FT_MulFix'. - - `FT_MulFix' takes `FT_Long' parameters as defined in `freetype.h', - but several inline implementations of it in `ftcalc.h' take - `FT_Int32' arguments. This is causing compiler warnings on x86-64: - If parameters of type `FT_Fixed' (= `FT_Long') are passed to the - inline implementation of this function, integer values are truncated - from 64bit to 32bit. - - * include/internal/ftcalc.h (FT_MulFix) [FT_MULFIX_ASSEMBLER]: Add - casts. - -2014-11-15 Werner Lemberg - - [sfnt] Fix Savannah bug #43597. - - * src/sfnt/pngshim.c (Load_SBit_Png): Protect against too large - bitmaps. - -2014-11-12 Werner Lemberg - - [sfnt] Fix Savannah bug #43591. - - * src/sfnt/ttsbit.c (tt_sbit_decoder_init): Protect against addition - and multiplication overflow. - -2014-11-12 Werner Lemberg - - [sfnt] Fix Savannah bug #43590. - - * src/sfnt/ttload.c (check_table_dir, tt_face_load_font_dir): - Protect against addition overflow. - -2014-11-12 Werner Lemberg - - [sfnt] Fix Savannah bug #43589. - - * src/sfnt/sfobjs.c (woff_open_font): Protect against addition - overflow. - -2014-11-12 Werner Lemberg - - [sfnt] Fix Savannah bug #43588. - - * src/sfnt/ttcmap.c (tt_cmap8_validate, tt_cmap10_validate, - tt_cmap12_validate, tt_cmap13_validate, tt_cmap14_validate): Protect - against overflow in additions and multiplications. - -2014-11-10 Alexei Podtelezhnikov - - [base] CORDIC improvements. - - The scaling between the hypotenuse and its CORDIC approximation is - based on regression analysis. The smaller padding for `theta' is - justifed by its maximum error of less than 6. - - * src/base/fttrigon.c (ft_trig_downscale): Borrow code from - ./ftcalc.c (ft_multo64), change linear intercept. - (ft_trig_pseudo_polarize): Decrease `theta' padding. - -2014-11-09 Werner Lemberg - - * src/base/ftstroke.c (ft_stroker_inside): Fix border intersections. - - One more place to check whether `radius' is zero. - - Problem reported by Marco Wertz . - -2014-11-07 Werner Lemberg - - [bdf] Fix Savannah bug #43535. - - * src/bdf/bdflib.c (_bdf_strncmp): New macro that checks one - character more than `strncmp'. - s/ft_strncmp/_bdf_strncmp/ everywhere. - -2014-11-06 Werner Lemberg - - [pcf] Fix Savannah bug #43548. - - * src/pcf/pcfread.c (pcf_get_encodings): Add sanity checks for row - and column values. - -2014-11-06 Werner Lemberg - - [pcf] Fix Savannah bug #43547. - - * src/pcf/pcfread.c (pcf_read_TOC): Check `size' and `offset' - values. - -2014-11-06 Werner Lemberg - - * src/pcf/pcfread.c (pcf_read_TOC): Avoid memory leak. - -2014-11-03 Infinality - - * src/truetype/ttsubpix.c (COMPATIBILITY_MODE_Rules): Updated. - - The previous commit deteriorates rendering of DejaVu and similar - fonts; this gets compensated with this rule. - -2014-11-03 Werner Lemberg - - * src/truetype/ttinterp.c (Ins_DELTAP): Fix subpixel hinting. - - Before this patch, it was impossible to ever call DELTAP[123] in - subpixel hinting mode as described in the ClearType whitepaper; it - only worked if in `compatibility mode'. However, compatibility mode - essentially disables SHPIX, completely ruining hinting of - ttfautohint output, for example. - - We now follow the whitepaper more closely so that DELTAP[123] - instructions for touched points in the non-subpixel direction are - executed. - -2014-10-31 Alexei Podtelezhnikov - - [smooth] Improve code readability. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Rearrange code. - -2014-10-31 Alexei Podtelezhnikov - - [smooth] Reduce outline translations during rendering. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Translate origin - virtually by modifying cbox, actually translate outline if cumulative - shift is not zero. - -2014-10-30 Alexei Podtelezhnikov - - [smooth] Fix Savannah bug #35604 (cont'd). - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Remove checks and - casts that became unnecessary after the variable type upgrades. - -2014-10-29 Alexei Podtelezhnikov - - [smooth] Improve code readability. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Rearrange code. - -2014-10-29 Alexei Podtelezhnikov - - Unify hypotenuse approximations. - - * include/internal/ftcalc.h (FT_HYPOT): Move macro from here... - * include/internal/ftobjs.h: ... to here, next to required `FT_ABS'. - * src/smooth/ftgrays.c (gray_render_cubic): Use it here. - -2014-10-25 Werner Lemberg - - [cff] Test valid darkening parameter macros in `ftoption.h'. - - We no longer need an otherwise unused typedef that can cause a gcc - warning. - Problem reported by Alexei. - - * src/cff/cffobjs.c (cff_driver_init): Use - `CFF_CONFIG_OPTION_DARKENING_PARAMETER_XXX' macros directly. - (SET_DARKENING_PARAMETERS): Removed. - Compile time tests are now ... - - * devel/ftoption.h, include/config/ftoption.h: ... here. - -2014-10-25 Alexei Podtelezhnikov - - Improve flat corner definition. - - * include/internal/ftcalc.h (FT_HYPOT): Macro to approximate Euclidean - distance with the alpha max plus beta min algorithm. - * src/base/ftcalc.c (ft_corner_is_flat): Use it instead of Taxicab - metric. - -2014-10-23 David Weiß - - [build] Improve property file for vc2010. - - User-defined properties should be empty by default to prevent linker - failures. - - * builds/windows/vc2010/freetype.user.props, - builds/windows/vc2010/freetype.vcxproj: - s/OptionsDirectory/UserOptionDirectory/. - Comment out all user options. - -2014-10-23 Werner Lemberg - - [cff] Work around bug in preprocessor of MSVC 2010. - - We have been hit by - - https://connect.microsoft.com/VisualStudio/feedback/details/718976/msvc-pr - - * devel/ftoption.h, include/config/ftoption.h: Replace - `CFF_CONFIG_OPTION_DARKENING_PARAMETERS' with eight macros - `CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4}'. - - * src/cff/cffobjs.c (SET_DARKENING_PARAMETERS): Removed. We no - longer need double expansion. - (SET_DARKENING_PARAMETERS_0): Renamed to ... - (SET_DARKENING_PARAMETERS): ... this. - Update call. - -2014-10-20 Werner Lemberg - - [sbit] Minor fixes. - - * src/sfnt/ttsbit.c (tt_face_load_sbit) [TT_SBIT_TABLE_TYPE_SBIX]: - Accept overlay format also, but emit warning message in that case. - (tt_sbit_decoder_load_metrics): Add missing newline to error - message. - (tt_sbit_load_sbix_image): Add `rgbl' graphic type (as used on iOS - 7.1) to the list of unsupported formats. - -2014-10-19 Alexei Podtelezhnikov - - [truetype] Clean up bytecode rounding. - - Zero distance does not have to be treated specially if you follow - specifications and check the sign as the very last step of rounding. - - * src/truetype/ttinterp.c (Round_None, Round_To_Grid, - Round_Down_To_Grid, Round_Up_To_Grid, Round_To_Double_Grid): Use - macros when available, do not check for non-zero distance. - (Round_To_Half_Grid, Round_Super, Round_Super_45): Ditto, return phase - if sign changed. - -2014-10-18 Alexei Podtelezhnikov - - [truetype] Unwrap engine compensation settings. - - * src/truetype/ttobjs.c (tt_size_init_bytecode): Updated. - -2014-10-18 David Weiß - - [build] Add property file to vc2010 project. - - This simplifies custom build configurations, especially for - automated build environments. - - * builds/windows/vc2010/freetype.user.props: New configuration file. - - * builds/windows/vc2010/freetype.vcxproj: Include - `freetype.user.props' and use its data fields. - - * builds/windows/vc2010/index.html: Updated. - -2014-10-18 Werner Lemberg - - [autofit] Add blue-zone support for Telugu. - - This essentially moves the Telugu script from the `Indic' hinter to - the `Latin' hinter. - - Note that this is a first shot and quite certainly needs - refinements. - - * src/autofit/afblue.dat: Add blue zone data for Telugu. - - * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated. - - * src/autofit/afscript.h: Add Telugu standard characters and move - data out of AF_CONFIG_OPTION_INDIC block. - - * src/autofit/afranges.c: Move Telugu data out of - AF_CONFIG_OPTION_INDIC block. - - * src/autofit/afstyles.h: Update Telugu data; in particular, use - AF_WRITING_SYSTEM_LATIN. - -2014-10-18 David Wimsey - - [cmake] Add iOS build support. - From Savannah patch #8497. - - * builds/cmake/iOS.cmake: New file. Universal binaries are built - with both 32 and 64 bit arm architectures. - - * CMakeLists.txt (IOS_PLATFORM): New variable for running the iOS - toolchain. Possible values are `OS' to build on iOS, or - `SIMULATOR' to build on APPLE. - -2014-10-16 Behdad Esfahbod - Werner Lemberg - - [cff] Add `CFF_CONFIG_OPTION_DARKENING_PARAMETERS' config macro. - - * devel/ftoption.h, include/config/ftoption.h - (CFF_CONFIG_OPTION_DARKENING_PARAMETERS): New macro. - - * src/cff/cffobjs.c (SET_DARKENING_PARAMETERS, - SET_DARKENING_PARAMETERS_0): New macros. - (cff_driver_init): Use new macros. - -2014-10-14 Alexei Podtelezhnikov - - [truetype] Limit delta shift range. - - The valid range for delta shift is zero through six. Negative values - are invalid according to - - https://developer.apple.com/fonts/TrueType-Reference-Manual/RM04/Chap4.html#delta%20shift - - * src/truetype/ttobjs.h (delta_shift, delta_base): Make unsigned. - * src/truetype/ttinterp.h (DO_SDS): Throw an error if `delta_shift' - is out of range. - (Ins_DELTAP, Ins_DELTAC): Optimize for valid `delta_shift'. - -2014-10-16 Werner Lemberg - - A better fix for Savannah bug #43392. - Suggested by Doug Felt . - - * src/sfnt/ttsbit.c (tt_sbit_decoder_load_metrics): Set - `vertAdvance' to zero... - - * src/truetype/ttgload.c (TT_Load_Glyph): ... and set here a default - value for `vertAdvance' based on `linearVertAdvance' in case - `vertAdvance' is zero. Note that the previous computed ad-hoc value - for `linearVertAdvance' was apparently not tested in a real-life - situation. - -2014-10-14 David Weiß - - [build] Better optimization settings for vc2010 solution file. - - * builds/windows/vc2010/freetype.sln, - builds/windows/vc2010/freetype.vcxproj: Updated. - -2014-10-14 Werner Lemberg - - [autofit] Adjust Devenagari character range. - - * src/autofit/afranges.c (af_deva_uniranges): Omit characters that - are common to all other Indic scripts. - -2014-10-12 Werner Lemberg - - [sfnt] Fix Savannah bug #43392. - - * src/sfnt/ttsbit.c (tt_sbit_decoder_load_metrics): Don't let - vertical metrics uninitialized. - -2014-10-11 Alexei Podtelezhnikov - - [base] Small bbox correction. - - * src/base/ftbbox.c (FT_Outline_Get_BBox): Start from nonsense bbox - instead of initial point that could be `off' in conic outlines. - -2014-10-08 Alexei Podtelezhnikov - - [base] Fix Savannah bug #43356. - - * src/base/ftbbox.c (BBox_Move_To, BBox_Conic_To): Update bbox in case - of implicit `to'. - (BBox_Line_To): New emitter that does not update bbox. - -2014-10-08 Alexei Podtelezhnikov - - [base] Introduce and use new macro `FT_UPDATE_BBOX' - - * src/base/ftbbox.c (FT_UPDATE_BBOX): New macro. - (FT_Outline_Get_BBox): Use it here. - -2014-10-02 Alexei Podtelezhnikov - - [base] Significant optimization of `ft_div64by32' - - We shift as many bits as we can into the high register, perform - 32-bit division with modulo there, then work through the remaining - bits with long division. This optimization is especially noticeable - for smaller dividends that barely use the high register. - - * src/base/ftcalc.c (ft_div64by32): Updated. - -2014-10-02 Dave Arnold - - [cff] Fix Savannah bug #43271. - - * src/cff/cf2font.c (cf2_computeDarkening): Change overflow - detection to use logarithms and clamp `scaledStem'. - -2014-10-01 Alexei Podtelezhnikov - - * src/base/ftcalc.c: Remove miscellaneous type casts. - -2014-10-01 Alexei Podtelezhnikov - - [base] Use more common `FT_MSB' implementation with masks. - - * src/base/ftcalc.c (FT_MSB): Updated. - -2014-09-30 Alexei Podtelezhnikov - - [base] Clean up. - - * src/base/ftcalc.c (FT_MOVE_SIGN): New macro for frequently used - code. - -2014-09-25 Alexei Podtelezhnikov - - [base] Avoid unnecessary long division. - - This applies to `FT_MulDiv' but not to `FT_DivFix', where overflows or - lack thereof are predicted accurately. - - * src/base/ftcalc.c (ft_div64by32): Improve readability. - (FT_MulDiv, FT_MulDiv_No_Round) [!FT_LONG64]: Use straight division - when multiplication stayed within 32 bits. - -2014-09-24 Werner Lemberg - - [autofit] Minor clean-ups. - - * src/autofit/afhints.c (AF_FLAGS): Remove obsolete values. - - * src/autofit/afhints.c (af_glyph_hints_dump_points, - af_glyph_hints_align_strong_points): Updated. - - * src/autofit/aflatin.c (af_latin_hints_link_segments, - af_latin_hints_compute_segments), src/autofit/afcjk.c - (af_cjk_hints_link_segments), src/autofit/aflatin2.c - (af_latin2_hints_link_segments, af_latin2_hints_compute_segments): - There are no longer fake segments since more than 10 years... - -2014-09-22 Werner Lemberg - - [autofit] Minor code streamlining. - - * src/autofit/afhints.c (af_axis_hints_new_edge): Remove redundant - initialization. - -2014-09-19 Alexei Podtelezhnikov - - * src/base/ftcalc.c: Harmonize code. - -2014-09-15 Alexei Podtelezhnikov - - [base] Tighten the overflow check in `FT_MulDiv'. - - * src/base/ftcalc.c (FT_MulDiv) [!FT_LONG64]: Updated. - -2014-09-08 Alexei Podtelezhnikov - - Fix Savannah bug #43153. - - * src/psaux/psconv.c (PS_Conv_ToFixed): Add protection against - overflow in `divider'. - -2014-09-03 Alexei Podtelezhnikov - - [base] Tighten the overflow check in `FT_DivFix'. - - This fixes a 13-year old bug. The original overflow check should have - been updated when rounding was introduced into this function - (c2cd00443b). - - * src/base/ftcalc.c (FT_DivFix) [!FT_LONG64]: Updated. - * include/freetype.h (FT_DivFix): Updated documentation. - -2014-09-03 Alexei Podtelezhnikov - - [base] Tighten the overflow check in `FT_MulFix'. - - * src/base/ftcalc.c (FT_MulFix) [!FT_LONG64]: Updated. - -2014-09-02 Alexei Podtelezhnikov - - [truetype] Shortcut ppem calculations for square pixels. - - * src/truetype/ttinterp.h (TT_ExecContextRec): New field - `cur_ppem_func' with a function pointer. - * src/truetype/ttinterp.c (TT_RunIns): Initialize `cur_ppem_func' - depending on the pixel geometry to either... - (Current_Ppem_Stretched): ... this for stretched pixels. - (Current_Ppem): ... or this for square pixels. - (DO_MPPEM, DO_MPS, Ins_DELTAP, Ins_DELTAC): Use `cur_ppem_func'. - -2014-08-31 Behdad Esfahbod - - Don't use `register' keyword. Fixes compiler warnings. - - * src/base/ftcalc.c (FT_Add64) [!FT_LONG64]: Do it. - * src/gzip/inftrees.c (huft_build): Ditto. - * src/truetype/ttinterp.c (TT_MulFix14_arm): Ditto. - -2014-08-24 Alexei Podtelezhnikov - - [truetype] Optimize DELTAP and DELTAC. - - * src/truetype/ttinterp.c (Ins_DELTAP, Ins_DELTAC): Move ppem - calculations outside of the loop. - -2014-08-21 Alexei Podtelezhnikov - - Fix Savannah bug #43033. - - * include/config/ftconfig.h, builds/unix/ftconfig.in, - builds/vms/ftconfig.h [FT_LONG64]: Do not disable the macro when - 64-bit type is `long'. - -2014-08-20 Alexei Podtelezhnikov - - [base] Small optimization of `FT_MulFix'. - - * src/base/ftcalc.c (FT_MulFix): Loosen up the condition for direct - 32-bit calculations. - -2014-08-19 Alexei Podtelezhnikov - - [base] Use unsigned calculation in `FT_MulDiv'. - - * src/base/ftcalc.c (FT_MulDiv): Updated to expand 32-bit range. - -2014-08-18 Alexei Podtelezhnikov - - [base] Remove truncation in `FT_DivFix'. - - * src/base/ftcalc.c (FT_DivFix): Updated. - -2014-08-14 Alexei Podtelezhnikov - - Minor refactoring. - - * src/base/ftcalc.c (FT_MulDiv, FT_MulDiv_No_Round): Updated. - -2014-08-14 Alexei Podtelezhnikov - - Turn FT_MSB into a macro when using gcc builtins. - - * src/base/ftcalc.c, include/internal/ftcalc.h: Updated. - -2014-08-12 Alexei Podtelezhnikov - - [base] Avoid undefined FT_MSB in `BBox_Cubic_Check'. - - * src/base/ftbbox.c (BBox_Cubic_Check): Update. - (update_cubic_max): Repalce with... - (cubic_peak): ... this, which now handles upscaling. - -2014-08-11 Alexei Podtelezhnikov - - [base] Handle collapsed outlines to avoid undefined FT_MSB. - - * src/base/ftoutln.c (FT_Outline_Get_Orientation): Update. - -2014-08-11 Alexei Podtelezhnikov - - [base] Restore FT_MulFix inlining. - - * include/freetype.h (FT_MulFix): Unconditionally defined. - - * src/base/ftcalc.c [FT_MULFIX_ASSEMBLER]: Move code from here... - - * include/internal/ftcalc.h [FT_MULFIX_ASSEMBLER]: ... to here, - which conditionally replaces the function with an inline version - through the macro. - -2014-08-08 Alexei Podtelezhnikov - - * src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra): Refactor. - -2014-07-26 Werner Lemberg - - [cff] Fix typo. - - * src/cff/cf2hints.c (cf2_glyphpath_computeOffset): Use correct - offsets in third quadrant. - - Reported by maks . - -2014-07-17 Werner Lemberg - - Fix Savannah bug #42788. - - * src/pfr/pfrobjs.c: Include `ftcalc.h'. - -2014-07-16 Alexei Podtelezhnikov - - Replace `ft_highpow2' function. - - * src/pfr/pfrobjs.c (pfr_face_get_kerning): Use `FT_MSB' instead of - `ft_highpow2'. - - * src/base/ftutil.c, include/internal/ftobjs.h (ft_highpow2): Remove - it. - -2014-07-15 Alexei Podtelezhnikov - - * src/base/ftcalc.c (FT_MSB): Utilize gcc builtins. - -2014-07-15 Alexei Podtelezhnikov - - [base] Move assembler code back in the source file. - - FT_MulFix assembler used to reside in ftcalc.c before f47d263f1b. - - * include/config/ftconfig.h, builds/unix/ftconfig.in, - builds/vms/ftconfig.h [FT_MULFIX_ASSEMBLER]: Move code from here... - - * src/base/ftcalc.c [FT_MULFIX_ASSEMBLER]: ... to here. - -2014-07-14 Alexei Podtelezhnikov - - [base] Further clean up color bitmap conversion. - - * src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra): Stop - using FT_MulFix and FT_DivFix since all calculations fit into 32 bits. - -2014-07-13 Werner Lemberg - - [truetype] Improve handling of buggy `prep' tables. - - In case of an error in the `prep' table, no longer try to execute it - again and again. This makes FreeType handle endless loops in buggy - fonts much faster. - - * src/truetype/ttobjs.h (TT_SizeRec): The fields `bytecode_ready' - and `cvt_ready' are now negative if not initialized yet, otherwise - they indicate the error code of the last run. - - * src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep, - tt_size_done_bytecode, tt_size_init_bytecode, - tt_size_ready_bytecode, tt_size_init, tt_size_done, tt_size_reset): - Updated. - - * src/truetype/ttgload.c (tt_loader_init): Updated. - * src/truetype/ttinterp.c (TT_RunIns): Force reexecution of `fpgm' - and `prep' only if we are in the `glyf' table. - -2014-07-12 Werner Lemberg - - * builds/vms/ftconfig.h: Synchronize. - Problem reported by Alexei. - -2014-07-11 Alexei Podtelezhnikov - - [base] Clean up bitmap conversion. - - * src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra): Use - appropriate FT_DivFix and remove superfluous upscaling. - -2014-07-04 Alexei Podtelezhnikov - - [base] Small optimization of the ancient code. - - * src/base/ftcalc.c (FT_MulDiv, FT_MulDiv_No_Round): Loosen up the - condition for direct 32-bit calculations. - -2014-06-27 Werner Lemberg - - Fix Apple standard glyph names. - - * src/sfnt/ttpost.c (tt_post_default_names): Synchronize with - `tools/glnames.py' - - Problem reported by Adam Twardoch . - -2014-06-17 Werner Lemberg - - Partially revert commit from 2014-06-13. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Move - declaration of `p_first' and `p_last' out of the loop. - -2014-06-17 Werner Lemberg - - * builds/unix/freetype2.m4: s/AC_PATH_PROG/AC_PATH_TOOL/. - - This simplifies cross-compiling. - -2014-06-13 Werner Lemberg - - Fix more compiler warnings. - Reported by Wojciech Mamrak . - - * src/autofit/afglobal.c (af_face_globals_compute_style_coverage): - Make integer constant unsigned. - - * src/sfnt/ttsbit.c (tt_face_load_strike_metrics) - : Fix types. - (tt_sbit_decoder_load_compound, tt_face_load_sbix_image): Add proper - casts. - -2014-06-13 Werner Lemberg - - Fix compiler warnings. - Reported by Wojciech Mamrak . - - * src/autofit/afglobal.c (af_face_globals_compute_style_coverage), - src/autofit/afmodule.c (af_property_set): Fix `signed' vs. - `unsigned' issues. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Make compiler - happy. - - * src/base/ftlcdfil.c (_ft_lcd_filter_fir): Use only four elements - for `fir'. - Fix `signed' vs. `unsigned' issues. - - * src/sfnt/sfobjs.c (WRITE_BYTE): Removed, unused. - (WRITE_USHORT, WRITE_ULONG): Add proper casts. - - * src/truetype/ttgload.c (TT_Get_VMetrics): Add proper casts. - - * src/truetype/ttinterp.c (Ins_DELTAP): Add proper casts for `B1' - and `B2'. - -2014-05-16 Alexey Petruchik - - [cmake] Add option to build OS X framework. - - * CMakeLists.txt: Update accordingly. - - * builds/mac/freetype-Info.plist: New file. - -2014-05-13 Pavel Koshevoy - - * CMakeLists.txt (BASE_SRCS): Add missing `ftbdf.c'. - -2014-05-11 Werner Lemberg - - [autofit] Fix variable initializations. - - * src/autofit/afhints.c (af_glyph_hints_reload): Assign default - values to `in_dir' and `out_dir' for all points. - -2014-05-11 Werner Lemberg - - [autofit] Fix crash with font `CabinSketch-Bold.ttf'. - - Problem reported by Ralf S. Engelschall . - - * src/autofit/afhints.c (af_glyph_hints_reload): Fix threshold for - finding first non-near point. - Properly initialize non-near point deltas. - -2014-05-01 Werner Lemberg - - [autofit] Add blue-zone support for Devanagari. - - This essentially moves the Devanagari script from the `Indic' hinter - to the `Latin' hinter. Thanks to Girish Dalvi - for guidance with blue zone characters! - - * src/autofit/afblue.dat: Add blue zone data for Devanagari. - - * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated. - - * src/autofit/afscript.h: Add Devanagari standard characters and - move data out of AF_CONFIG_OPTION_INDIC block. - - * src/autofit/afranges.c: Move Devanagari data out of - AF_CONFIG_OPTION_INDIC block. - Move U+20B9, (new) Rupee sign, from Latin to Devanagari. - - * src/autofit/afstyles.h: Update Devanagari data; in particular, use - AF_WRITING_SYSTEM_LATIN. - -2014-05-01 Werner Lemberg - - [autofit] Fix handling of neutral blue zones in stems. - - * src/autofit/afhints.h (AF_Edge_Flags): New value - `AF_EDGE_NEUTRAL'. - - * src/autofit/aflatin.c (af_latin_hints_compute_blue_edges): Trace - neutral blue zones with AF_EDGE_NEUTRAL. - (af_latin_hint_edges): Skip neutral blue zones if necessary. - -2014-04-28 Werner Lemberg - - [autofit] Introduce neutral blue zones to the latin module. - - Such blue zones match either the top or the bottom of a contour. We - need them for scripts where accent-like elements directly touch the - base character (for example, some vowel signs in Devanagari, cf. - U+0913 or U+0914). - - * src/autofit/afblue.hin (AF_BLUE_PROPERTY_LATIN_NEUTRAL): New - property. - - * src/autofit/afblue.h: Regenerated. - - * src/autofit/aflatin.h (AF_LATIN_IS_NEUTRAL_BLUE): New macro. - (AF_LATIN_BLUE_NEUTRAL): New enumeration value. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues, - af_latin_hints_compute_blue_edges): Handle neutral blue zones. - -2014-04-25 Werner Lemberg - - * src/autofit/hbshim.c: Partially revert commit from 2014-04-17. - - Using input glyph coverage data is simply wrong. - - Problem reported by Nikolaus Waxweiler and - Mantas Mikulėnas . - -2014-04-23 Werner Lemberg - - * src/raster/ftraster.c (Vertical_Sweep_Span): Use drop-out mode. - - This spot has been missed while introducing support for various - drop-out modes years ago (including no drop-out mode, which this - commit fixes). - - Problem reported by Patrick Thomas . - -2014-04-22 Werner Lemberg - - * src/sfnt/pngshim.c (error_callback): s/longjmp/ft_longjmp/. - -2014-04-20 Werner Lemberg - - [autofit] Fix Savannah bug #42148. - - The adaptation of the cjk auto-hinter module to blue stringsets in - 2013-08-25 had three severe bugs. Mea culpa. - - 1. Contrary to the latin auto-hinter, characters for reference and - overshoot values of a blue zone are specified separately. Due to - the screwed-up change it didn't work at all. - - 2. A boolean comparison was erroneously replaced with a cast, - causing invalid results with the `^' operator later on. The - visual artifact caused by this problem is the topic of the bug - report. - - 3. Two flag values were inverted, causing incorrect assignment of - reference and overshoot values. - - * src/autofit/afblue.dat: Fix CJK bluestrings, introducing a new - syntax to have both reference and overshoot characters in a single - string. This is error #1. - Add extensive comments. - - * src/autofit/afblue.hin (AF_BLUE_PROPERTY_CJK_FILL): Removed, no - longer used. - (AF_BLUE_PROPERTY_CJK_TOP, AF_BLUE_PROPERTY_CJK_HORIZ): Fix values. - This is error #3. - - * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated. - - * src/autofit/afcjk.c (af_cjk_metrics_init_blues): Correct error #1. - Use character `|' to separate characters for reference and overshoot - values. - Improve tracing messages, synchronizing them with the latin - auto-hinter. - (af_cjk_hints_compute_blue_edges): Fix value of `is_top_right_blue'. - This is error #2. - (af_cjk_align_linked_edge): Add tracing message. - - * src/autofit/afcjk.h (AF_CJK_IS_FILLED_BLUE): Removed, no longer - used. - -2014-04-17 Werner Lemberg - - [autofit] More coverage fixes for complex scripts. - - * src/autofit/hbshim.c (af_get_coverage): Merge input glyph coverage - of GSUB lookups into output coverage. Otherwise, ligatures are not - handled properly. - Don't check blue zone characters for default coverage. - -2014-04-17 Werner Lemberg - - Make `FT_Get_SubGlyph_Info' actually work. - - * src/base/ftobjs.c (FT_Get_SubGlyph_Info): Return FT_Err_Ok - if there is no error. - -2014-04-15 Werner Lemberg - - [afblue.pl]: Minor improvements. - - * src/tools/afblue.pl: Allow whitespace before comments. - Ignore whitespace in strings. - -2014-04-14 Werner Lemberg - - [autofit] Improve coverage handling. - - * src/autofit/hbshim.c (af_get_coverage): Don't exclude glyphs - appearing in the GPOS table if we are processing the default - coverage. - -2014-04-13 David Weber - - [smooth] Fix stand-alone compilation. - - * src/smooth/ftgrays.c (FT_BEGIN_STMNT, FT_END_STMNT): Define. - -2014-04-12 Werner Lemberg - - [autofit] Redesign the recognition algorithm of strong points. - - In particular, local extrema without horizontal or vertical segments - are better recognized: - - + A + D - \ / - \ / - \ / - \ / - \ + C - \ / - B +/ - - If the distances AB and CD are large, point B wasn't previously - detected as an extremum since the `ft_corner_is_flat' function - `swallowed' BC regardless of its direction, tagging point B as weak. - The next iteration started at B and made `ft_corner_is_flat' swallow - point C, tagging it as weak also, et voilà. - - To improve that, another pass gets now performed before calling - `ft_corner_is_flat' to improve the `topology' of an outline: A - sequence of non-horizontal or non-vertical vectors that point into - the same quadrant are handled as a single, large vector. - - Additionally, distances of near points are now accumulated, which - makes the auto-hinter handle them as if they were prepended to the - next non-near vector. - - This generally improves the auto-hinter's rendering results. - - * src/autofit/afhints.c (af_glyph_hints_reload): Implement it. - - * src/autofit/afhints.h (AF_FLAGS): Remove no longer used flag - `AF_FLAG_NEAR'. - -2014-04-05 Werner Lemberg - - [autofit] Improve scoring algorithm for identifying stems. - - Problem reported by Karsten Lücke . - - The new algorithm takes care of the width of stems: If the distance - between two segments is larger than the largest stem width, the - demerits quickly increase for larger distances. This improves - hinting of slanted fonts (especially if the inner parts of serifs - have non-horizontal `shoulders'), avoiding false stem links. - - * src/autofit/aflatin.c (af_latin_hints_link_segments): Use largest - stem width (if available) to compute better demerits for distances - between stems. - (af_latin_hints_detect_features): Pass stem width array and array - size. - (af_latin_metrics_init_widths): Updated to use original algorithm. - (af_latin_hints_apply): Updated to use new algorithm. - - * src/autofit/aflatin.h: Updated. - * src/autofit/afcjk.c: Updated. - -2014-04-03 Werner Lemberg - - Don't require `gzip' module for `sfnt'. - - Reported by Preet . - - * src/sfnt/sfobjs.c (woff_open_font): Guard use of - FT_Gzip_Uncompress with FT_CONFIG_OPTION_USE_ZLIB. - -2014-03-27 Werner Lemberg - - Fix Savannah bug #38235. - - Work around a bug in pkg-config version 0.28 and earlier: If a - variable value gets surrounded by doublequotes (in particular values - for the `prefix' variable), the prefix override mechanism fails. - - * builds/unix/freetype2.in: Don't use doublequotes. - * builds/unix/unix-def.in (freetype.pc): Escape spaces in directory - names with backslashes. - -2014-03-24 Werner Lemberg - - Fix Savannah bug #41946. - - Based on a patch from Marek Kašík . - - * builds/unix/configure.raw (LIBS_CONFIG): Remove. - * builds/unix/freetype-config.in (libs): Hard-code value. - * builds/unix/unix-def.in: Updated. - -2014-03-22 Werner Lemberg - - Another revert for the change from 2014-03-18. - - Problem reported by Nikolaus Waxweiler . - - * src/base/ftcalc.c (FT_MulFix): Ensure that an `FT_MulFix' symbol - gets always exported. - -2014-03-20 Werner Lemberg - - CMakeLists.txt: Another fix for include directories. - - Problem reported by Taylor Holberton . - -2014-03-19 Werner Lemberg - - CMakeLists.txt: Fix include directories. - - Problem reported by Taylor Holberton . - -2014-03-19 Werner Lemberg - - Partially revert last commit. - - Found by Alexei. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Initializing - those variables is plain wrong, since we are in a loop. - -2014-03-18 Sean McBride - Werner Lemberg - - Fix clang warnings. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Initialize - some variables. - - * src/base/ftcalc.c (FT_MulFix): Only use code if - `FT_MULFIX_INLINED' is not defined. - - * src/bdf/bdfdrivr.c (bdf_cmap_class), src/cache/ftcbasic.c - (ftc_basic_image_family_class, ftc_basic_image_cache_class, - ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class), - src/cache/ftccmap.c (ftc_cmap_cache_class), src/cache/ftcmanag.c - (ftc_size_list_class, ftc_face_list_class), src/pcf/pcfdrivr.c - (pcf_cmap_class), src/pfr/pfrdrivr.c (pfr_metrics_service_rec): Make - function static. - - * src/type1/t1driver.c (t1_ps_get_font_value): Remove redundant - code. - -2014-03-17 Werner Lemberg - - Fix Savannah bug #41869. - - This works around a problem with HarfBuzz (<= 0.9.26), which doesn't - validate glyph indices returned by - `hb_ot_layout_lookup_collect_glyphs'. - - * src/autofit/hbshim.c (af_get_coverage): Guard `idx'. - - * docs/CHANGES: Updated. - -2014-03-14 Werner Lemberg - - * builds/unix/configure.raw: Don't show error messages of `which'. - -2014-03-09 Alan Coopersmith - - Fix cppcheck 1.64 warning. - - * src/autofit/afglobal.c (af_face_globals_new): Catch NULL pointer - dereference in case of error. - -2014-03-09 Sean McBride - - * src/sfnt/ttcmap.c (tt_face_build_cmaps): Remove clang warning. - -2014-03-06 Werner Lemberg - - * Version 2.5.3 released. - ========================= - - - Tag sources with `VER-2-5-3'. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.5.3. - - * README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj, - builds/windows/vc2005/index.html, - builds/windows/vc2008/freetype.vcproj, - builds/windows/vc2008/index.html, - builds/windows/vc2010/freetype.vcxproj, - builds/windows/vc2010/index.html, - builds/windows/visualc/freetype.dsp, - builds/windows/visualc/freetype.vcproj, - builds/windows/visualc/index.html, - builds/windows/visualce/freetype.dsp, - builds/windows/visualce/freetype.vcproj, - builds/windows/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.5.2/2.5.3/, s/252/253/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3. - - * builds/unix/configure.raw (version_info): Set to 17:2:11. - * CMakeLists.txt (VERSION_PATCH): Set to 3. - * docs/CHANGES: Updated. - -2014-03-06 Werner Lemberg - - Fixes for compilation with C++. - - * src/autofit/hbshim.c (scripts): Change type to `hb_script_t'. - (af_get_coverage): Updated. - (COVERAGE): Add cast. - -2014-03-06 Sean McBride - - Remove more clang analyzer warnings. - - * src/bdf/bdflib.c (_bdf_readstream), src/truetype/ttgload.c - (TT_Load_Glyph): Remove dead stores. - -2014-03-05 Werner Lemberg - - * builds/unix/configure.raw: Simplify. - -2014-03-05 suzuki toshiya - - Fix a bug in configure in library dependency setting - Reported in https://bugs.freedesktop.org/show_bug.cgi?id=75652. - - * builds/unix/configure.raw: Use `x"${xxx}" != xno' style. - -2014-03-04 Werner Lemberg - - Minor fix for `make devel'. - - * builds/freetype.mk (INCLUDE_FLAGS) [DEVEL_DIR]: Don't use - pkg-config for bzip2 since not all GNU/Linux distributions have - `bzip2.pc' (and the header file `bzlib.h' is located in /usr/include - normally). - -2014-03-04 Sean McBride - - Fix several clang static analyzer dead store warnings. - - * src/autofit/afhints.c (af_glyph_hints_reload, - af_glyph_hints_align_weak_points): Remove unnecessary assignments. - - * src/bdf/bdflib.c (bdf_font_load): Ditto. - - * src/pshinter/pshalgo.c (psh_glyph_compute_extrema, - psh_glyph_interpolate_other_points): Ditto. - - * src/type1/t1load.c (T1_Set_MM_Blend): Ditto. - -2014-03-03 Werner Lemberg - - Rewrite library option handling in `configure'. - - o Introduce `auto' value for `--with-XXX' library options; this is - now the default. - - o First use `pkg-config' for library detection, then fall back to - other tests. - - * builds/unix/configure.raw (--with-zlib, --with-bzip2, --with-png, - --with-harfbuzz): Rewrite. - Use new `xxx_reqpriv', `xxx_libpriv', and `xxx_libstaticconf' - variables to collect data for `freetype2.pc' and `freetype-config'. - (FT2_EXTRA_LIBS): Renamed to ... - (ft2_extra_libs): This since it gets no longer substituted. - (REQUIRES_PRIVATE, LIBS_PRIVATE, LIBS_CONFIG, LIBSSTATIC_CONFIG): - New output variables, replacing `XXX_PKG' and `LIBXXX'. - Add notice at the end of `configure' showing the library - configuration. - - * builds/unix/freetype-config.in (--static): New command line - option. - (libs): Updated. - (staticlibs): New variable, to be used if `--static' is given. - * docs/freetype-config.1: Document `--static'. - - * builds/unix/freetype2.in, builds/unix/unix-def.in: Updated. - -2014-03-01 Werner Lemberg - - Avoid `long long' warnings with older gcc compilers. - Problem reported by Hin-Tak Leung . - - * builds/unix/configure.raw: Don't use gcc's `-pedantic' flag for - versions < 4.6. This is especially needed for Max OS X since this - OS runs a gcc variant (or emulation) based on version 4.2.1. - -2014-03-01 Werner Lemberg - - * docs/INSTALL.CROSS: Revised and updated. - -2014-03-01 Werner Lemberg - - Make `make clean' remove `freetype2.pc'. - - This is a generated file at build time, not configure time. - - * builds/unix/unix-def.in (DISTCLEAN): Move `freetype2.pc' to ... - (CLEAN): This variable. - -2014-03-01 Werner Lemberg - - Use pkg-config for detecting libpng and libbz2 also. - - * builds/unix/configure.raw (HAVE_PKG): New variable. - Search for libbz2 using `pkg-config'; s/BZ2/BZIP2/. - Search for libpng using `pkg-config'. - Fix definition of `LIBHARFBUZZ' variable. - * builds/unix/freetype-config.in ($libs): Updated. - * builds/unix/freetype2.in: Add `URL' field. - Update `Requires.private' and `Libs.private'. - * builds/unix/unix-def.in: Updated. - -2014-03-01 Werner Lemberg - - Add configure support for HarfBuzz. - - * builds/unix/pkg.m4: New file. - * builds/unix/configure.raw: Search for libharfbuzz using - `pkg-config'. - Add `--without-harfbuzz' option. - * builds/unix/freetype-config.in, builds/unix/freetype2.in, - builds/unix/unix-def.in (freetype-config, freetype2.pc): Handle - HarfBuzz. - - * docs/INSTALL.UNIX: Document interdependency of Freetype with - HarfBuzz. - -2014-02-28 Alexei Podtelezhnikov - - [cff] Math simplifications. - - * src/cf2blues.c (cf2_blues_init): Use `FT_MulDiv'. - * src/cf2ft.c (cf2_getScaleAndHintFlag): Use simple division. - -2014-02-28 Dave Arnold - - [cff] Fix Savannah bug #41697, part 2. - - * src/cff/cf2ft.c (cf2_initLocalRegionBuffer, - cf2_initGlobalRegionBuffer): It is possible for a charstring to call - a subroutine if no subroutines exist. This is an error but should - not trigger an assert. Split the assert to account for this. - -2014-02-28 Dave Arnold - - [cff] Fix Savannah bug #41697, part 1. - - * src/cff/cf2hints.c (cf2_hintmap_build): Return when `hintMask' is - invalid. In this case, it is not safe to use the length of - `hStemHintArray'; the exception has already been recorded in - `hintMask'. - -2014-02-26 Werner Lemberg - - [sfnt] Fix Savannah bug #41696. - - * src/sfnt/ttcmap.c (tt_cmap0_validate, tt_cmap2_validate, - tt_cmap4_validate, tt_cmap14_validate): Fix limit tests. - -2014-02-26 Werner Lemberg - - [winfnt] Fix Savannah bug #41694. - - * src/winfonts/winfnt.c (FNT_Load_Glyph): Check glyph offset. - -2014-02-26 Werner Lemberg - - [cff] Fix Savannah bug #41693. - - * src/cff/cffload.c (CFF_Load_FD_Select): Reject empty array. - -2014-02-26 Werner Lemberg - - [bdf] Fix Savannah bug #41692. - - bdflib puts data from the input stream into a buffer in chunks of - 1024 bytes. The data itself gets then parsed line by line, simply - increasing the current pointer into the buffer; if the search for - the final newline character exceeds the buffer size, more data gets - read. - - However, in case the current line's end is very near to the buffer - end, and the keyword to compare with is longer than the current - line's length, an out-of-bounds read might happen since `memcmp' - doesn't stop properly at the string end. - - * src/bdf/bdflib.c: s/ft_memcmp/ft_strncmp/ to make comparisons - stop at string ends. - -2014-02-17 suzuki toshiya - - [autofit] Fix `make multi' compilation. - - * src/autofit/hbshim.c: Include `afglobal.h' and `aftypes.h'. - -2014-02-19 Werner Lemberg - Simon Bünzli - - Fix Savannah bug #32902. - - Patch taken from - - https://code.google.com/p/sumatrapdf/source/browse/trunk/ext/_patches/freetype2.patch?spec=svn8620&r=8620#87 - - with slight modifications. - - * src/type1/t1parse.c (T1_Get_Private_Dict): Add heuristic test to - handle fonts that incorrectly use \r at the beginning of an eexec - block. - -2014-02-19 Simon Bünzli - - Fix Savannah bug #41590. - - * src/type1/t1load.c (parse_encoding): Protect against invalid - number. - -2014-02-12 Dave Arnold - - [cff] Optimize by using `FT_MulDiv'. - Suggested by Alexei. - - * src/cff/cf2font.c (cf2_computeDarkening): Do it. - -2014-02-12 Werner Lemberg - - Fix Savannah bug #41465. - - * builds/unix/unix-def.in (CLEAN): Add `freetype-config'. - (DISTCLEAN): Remove `freetype-config'. - -2014-02-08 Sean McBride - - Fix clang static analyzer and compiler warnings. - - * src/autofit/afhints.c (af_glyph_hints_align_weak_points), - src/autofit/afloader (af_loader_load_g) , - src/base/ftcalc.c (FT_MSB), src/base/ftoutln.c - (FT_Outline_Decompose), src/bdf/bdfdrivr.c (bdf_interpret_style), - src/cff/cffparse.c (cff_parse_integer), src/cid/cidparse.c - (cid_parser_new), src/pfr/pfrload.c (pfr_phy_font_load), - src/raster/ftraster.c (Decompose_Curve), src/sfnt/sfdriver.c - (sfnt_get_ps_name), src/sfnt/ttcmap.c (tt_cmap12_next, - tt_cmap13_next), src/smooth/ftgrays.c (gray_hline): Remove dead - code. - - * src/autofit/afmodule.c (af_property_get_face_globals, - af_property_set, af_property_get), src/base/ftbitmap.c - (ft_gray_for_premultiplied_srgb_bgra): Make functions static. - - * src/base/ftobjs.c (ft_remove_renderer): Protect against - library == NULL. - (ft_property_do): Make function static. - - * src/base/ftrfork.c: Include `ftbase.h'. - - * src/sfnt/ttsbit.c (tt_face_load_sbix_image) - [!FT_CONFIG_OPTION_USE_PNG], src/type1/t1gload.c - (T1_Compute_Max_Advance): Avoid compiler warning. - - * src/truetype/ttinterp.c (TT_New_Context): Reduce scope of - variable. - -2014-02-08 Werner Lemberg - - Fix Windows build directories. - - The build target is now `windows' instead of `win32'. - - Problem reported by Nickolas George . - - * builds/modules.mk: Don't use `win32' and `win16' (!) but - `windows'. - - * builds/windows/detect.mk, builds/windows/win32-def.mk: - s/win32/windows/. - -2014-02-08 Eugen Sawin - - Fix Savannah bug #41507. - - * src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap) - [!FT_CONFIG_OPTION_USE_PNG] <17, 17, 19>: Fix error handling. - -2014-02-08 Dave Arnold - - [cff] Fix minor performance bug. - - * src/cff/cf2font.c (cf2_font_setup): Darkening amount and blue zone - calculations are now cached and not recomputed on each glyph. - -2014-02-05 Werner Lemberg - - Fix problems with perl 5.8.8 as distributed with current MinGW. - - * src/tools/afblue.pl: Work-around for Perl bug #63402. - (string_re): Avoid `possessive quantifiers', which have been - introduced in Perl version 5.10. - -2014-02-04 Werner Lemberg - - Fix compilation with MinGW. - - Right now, compilation out of the box with latest MinGW is broken - due to bugs in header files of mingwrt 4.0.3 in strict ANSI mode, - cf. - - https://sourceforge.net/p/mingw/bugs/2024/ - https://sourceforge.net/p/mingw/bugs/2046/ - - * builds/unix/configure.raw: Don't set `-ansi' flag for MinGW. - -2014-02-04 Werner Lemberg - - [autofit] Minor fix. - - * src/autofit/afcjk.c (af_cjk_metrics_init_widths), - src/autofit/aflatin.c (af_latin_metrics_init_widths): Fix handling - of alternative standard characters. - This also fixes a compilation warning in non-debug mode. - -2014-02-03 Werner Lemberg - - [cff] Fix Savannah bug #41363. - - * src/cff/cf2ft.c (cf2_checkTransform): Convert assertion into - parameter check. - (cf2_decoder_parse_charstrings): Call `cf2_checkTransform' only if - we are scaling the outline. - (cf2_getPpemY): Remove problematic assertion. - -2014-01-26 Werner Lemberg - - [autofit] Introduce two more slots for standard characters. - - This is useful for OpenType features like `c2sc' (caps to small - caps) that don't have lowercase letters by definition, or other - features that mainly operate on numerals. - - * src/autofit/afscript.h: Add more standard characters. - - * src/autofit/aftypes.h: Update use of `SCRIPT' macro. - (AF_ScriptClassRec): Add members to hold two more standard - characters. - (AF_DEFINE_SCRIPT_CLASS): Updated. - - * src/autofit/afglobal.c, src/autofit/afglobal.h, - * src/autofit/afpic.c, src/autofit/afranges.h, src/autofit/hbshim.c: - Update use of `SCRIPT' macro. - - * src/autofit/afcjk.c (af_cjk_metrics_init_widths), - src/autofit/aflatin.c (af_latin_metrics_init_widths): Scan two more - standard characters. - -2014-01-24 Werner Lemberg - - Fix Savannah bug #41320. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues) - : Avoid negative index of `last'. - -2014-01-23 Werner Lemberg - - Fix Savannah bug #41310. - - * src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap) : - Don't check metrics, which this format doesn't have. - This is another correction to the commit from 2013-11-21. - -2014-01-23 Werner Lemberg - - Fix Savannah bug #41309. - - * src/type1/t1load.c (t1_parse_font_matrix): Properly handle result - of `T1_ToFixedArray'. - - * src/cid/cidload.c (cid_parse_font_matrix): Synchronize with - `t1_parse_font_matrix'. - - * src/type42/t42parse.c (t42_parse_font_matrix): Synchronize with - `t1_parse_font_matrix'. - (t42_parse_encoding): Synchronize with `t1_parse_encoding'. - - * src/psaux/psobjs.c (ps_parser_load_field) , - : Properly handle result of `ps_tofixedarray'. - -2014-01-22 Werner Lemberg - - * src/autofit/hbshim.c (af_get_coverage): Fix memory leaks. - -2014-01-16 Werner Lemberg - - [autofit] Improve tracing of style coverages. - - * include/internal/fttrace.h: Add `afglobal' for tracing style - coverages. - - * src/autofit/afglobal.c: Include FT_INTERNAL_DEBUG_H. - (FT_COMPONENT): Define. - (af_face_globals_compute_style_coverage): Trace `gstyles' array - data. - -2014-01-09 Werner Lemberg - - Fix Savannah bug #41158. - - * builds/unix/install.mk (install): Create man page directory. - -2014-01-08 Chongyu Zhu - - [arm] Fix Savannah bug #41138, part 2. - - * builds/unix/ftconfig.in (FT_MulFix_arm), include/config/ftconfig.h - (FT_MulFix_arm), src/truetype/ttinterp.c (TT_MulFix14_arm): Fix - preprocessor conditionals for `add.w'. - -2014-01-08 Werner Lemberg - - [autofit] Fix Savannah bug #41138, part 1. - - * src/tools/afblue.pl : Produce correct auxiliary - enumeration names for generated `#else'. - - * src/autofit/afblue.h: Regenerated. - -2014-01-06 Werner Lemberg - - Add manual page for `freetype-config'. - Contributed by Nis Martensen . - - * docs/freetype-config.1: New file. - - * builds/unix/unix-def.in (mandir): Define. - * builds/unix/install.mk (install, uninstall): Handle manpage. - -2014-01-05 Werner Lemberg - - [autofit] Minor fixes for `afblue.pl'. - - * src/tools/afblue.pl (aux_name): Don't use `reverse'. - : Use proper indentation for generated `#else'. - - * src/autofit/afblue.h: Regenerated. - -2014-01-04 Werner Lemberg - - [autofit] Fix Indic scripts. - - Split the single, incorrect Indic entry into separate scripts so - that the covered ranges are the same: Bengali, Devanagari, Gujarati, - Gurmukhi, Kannada, Limbu, Malayalam, Oriya, Sinhala, Sundanese, - Syloti Nagri, Tamil, Telugu, and Tibetan. At the same time, remove - entries for Meetai Mayak and Sharada – the Unicode ranges were - incorrect (and nobody has complained about that), fonts are scarce - for those scripts, and the Indic auto-hinter support is rudimentary - anyways. - - * src/autofit/afscript.h: Updated, using AF_CONFIG_OPTION_INDIC and - AF_CONFIG_OPTION_CJK. - - * src/autofit/afstyles.h (STYLE_DEFAULT_INDIC): New auxiliary macro. - Use it, together with AF_CONFIG_OPTION_INDIC and - AF_CONFIG_OPTION_CJK, to update. - - * src/autofit/afranges.c [AF_CONFIG_OPTION_INDIC]: Updated. - [!AF_CONFIG_OPTION_INDIC, !AF_CONFIG_OPTION_CJK]: Removed. - Sort entries by tags. - -2014-01-03 Werner Lemberg - - [autofit] Thinko. - - * src/autofit/hbshim.c (af_get_char_index): Similar to - `af_get_coverage', reject glyphs which are not substituted. - -2014-01-03 Werner Lemberg - - [autofit] Fix handling of default coverages. - - With this commit, the implementation of coverage handling is - completed. - - * src/autofit/hbshim.c (af_get_coverage): Exit early if nothing to - do. - Reject coverages which don't contain appropriate glyphs for blue - zones. - -2014-01-03 Werner Lemberg - - [autofit] Fix handling of default coverages. - - * src/autofit/afglobal.c (af_face_globals_compute_style_coverage): - First handle non-default coverages, then the default coverage of the - default script, and finally the other default coverages. - -2014-01-03 Werner Lemberg - - [autofit] Fix scaling of HarfBuzz shaping. - - * src/autofit/hbshim.c (af_get_char_index): Scale to units per EM. - -2014-01-03 Werner Lemberg - - [autofit] Better ftgrid support. - - * src/autofit/afhints.c (af_glyph_hints_get_segment_offset): Add - parameters `is_blue' and `blue_offset'. - -2014-01-01 Werner Lemberg - - [autofit] Remove some styles. - - * src/autofit/afcover.h: Remove coverages for alternative fractions, - denominators, numerators, and fractions. - - * src/autofit/afstyles.h (META_STYLE_LATIN): Updated. - -2014-01-01 Werner Lemberg - - [autofit] Add more styles. - - * src/autofit/afstyles.h (STYLE_LATIN, META_STYLE_LATIN): New - auxiliary macros; use them to define styles for Cyrillic, Greek, and - Latin. - - * src/autofit/afcover.h: Remove coverage for oldstyle figures. - Since those digits are used in combination with ordinary letters, it - makes no sense to handle them separately. - - * src/autofit/afglobal.c (af_face_globals_get_metrics): Don't limit - `options' parameter to 4 bits. - -2014-01-01 Werner Lemberg - - [autofit] Fix style assignments to glyphs. - - * src/autofit/hbshim.c (af_get_coverage) - [FT_CONFIG_OPTION_USE_HARFBUZZ]: Scan GPOS coverage of features also - so that we can skip glyphs that have both GSUB and GPOS data. - -2014-01-01 Werner Lemberg - - * src/autofit/hbshim.c: s/{lookups,glyphs}/gsub_{lookups,glyphs}/. - -2014-01-01 Werner Lemberg - - [autofit] Implement and use `af_get_char_index' with HarfBuzz. - - * src/autofit/hbshim.c (COVERAGE) [FT_CONFIG_OPTION_USE_HARFBUZZ]: - Redefine to construct HarfBuzz features. - (af_get_char_index) [FT_CONFIG_OPTION_USE_HARFBUZZ]: Rewritten. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Use - `y_offset' to adjust `best_y'. - -2013-12-31 Werner Lemberg - - [autofit] s/AF_STYLE_...._DEFAULT/AF_STYLE_...._DFLT/i. - -2013-12-31 Werner Lemberg - - [autofit] Fix interface of `af_get_char_index'. - - * src/autofit/hbshim.c (af_get_char_index): Return error value. - Add argument for y offset (to be used in a yet-to-come patch). - - * src/autofit/hbshim.h, src/autofit/afcjk.c, - src/autofit/aflatin.c: Updated. - -2013-12-30 Werner Lemberg - - [autofit] Don't combine multiple features into one set. - - Combining them, as originally envisioned, would lead to much more - complicated code, as investigations have shown meanwhile. The major - drawback is that we run out of available style slots much earlier. - However, this is only a theoretical issue since we don't support a - large number of scripts currently. - - * src/autofit/afcover.h: Replace `COVERAGE_{1,2,3}' macros with - a single-element `COVERAGE' macro, sort the elements by the feature - tags, and add entry for `ruby'. - - * src/autofit/aftypes.h: Updated. - * src/autofit/hbshim.c: Updated. - -2013-12-28 Werner Lemberg - - [autofit] Code shuffling to reduce use of cpp macros. - - * src/autofit/afglobal.c (af_face_globals_compute_style_coverage): - Call `af_get_coverage' unconditionally. - - * src/autofit/autofit.c: Include `hbshim.c' unconditionally. - - * src/autofit/hbshim.c (af_get_coverage) - [!FT_CONFIG_OPTION_USE_HARFBUZZ]: Provide dummy function. - - * src/autofit/hbshim.h: Provide function declarations - unconditionally. - -2013-12-28 Werner Lemberg - - [autofit] Add wrapper function for `FT_Get_Char_Index'. - - Yet-to-come changes will provide HarfBuzz functionality for the new - function. - - * src/autofit/hbshim.c (af_get_char_index): New function. - * src/autofit/hbshim.h: Updated. - - * src/autofit/afcjk.c (af_cjk_metrics_init_widths, - af_cjk_metrics_init_blues, af_cjk_metrics_check_digits): Updated. - - * src/autofit/aflatin.c (af_latin_metrics_init_widths, - af_latin_metrics_init_blues, af_latin_metrics_check_digits): - Updated. - -2013-12-28 Werner Lemberg - - [autofit] Use `global' HarfBuzz font object. - - We now use `hb_font' instead of `hb_face' since yet-to-come changes - need this. - - * src/autofit/afglobal.h: Include `hbshim.h'. - (AF_FaceGlobalsRec) [FT_CONFIG_OPTION_USE_HARFBUZZ]: New member - `hb_font'. - - * src/autofit/afglobal.c (af_face_globals_new) - [FT_CONFIG_OPTION_USE_HARFBUZZ]: Create `hb_font'. - (af_face_globals_free) [FT_CONFIG_OPTION_USE_HARFBUZZ]: Destroy - `hb_font'. - - * src/autofit/hbshim.h: Include HarfBuzz headers. - - * src/autofit/hbshim.c: Include `hbshim.h' instead of HarfBuzz - headers. - (af_get_coverage): Updated. - -2013-12-27 Werner Lemberg - - [autofit] Handle `DFLT' OpenType script for coverages. - - * include/ftautoh.h: Document new `default-script' property. - - * src/autofit/hbshim.c (af_get_coverage): Use `AF_FaceGlobals' for - type of first parameter. - (script_tags): Add one more element. - (af_get_coverage): Adjust `script_tags' to handle `DFLT' script tag. - - * src/autofit/hbshim.h: Updated. - - * src/autofit/afglobal.c (af_face_globals_compute_style_coverage): - Updated. - - * src/autofit/afglobal.h (AF_SCRIPT_DEFAULT): New macro. - - * src/autofit/afmodule.h (AF_ModuleRec): New `default_script' - member. - - * src/autofit/afmodule.c (af_property_set, af_property_get): Handle - `default-script' property. - (af_autofitter_init): Updated. - -2013-12-27 suzuki toshiya - - [ftrfork] Fix the face order difference between POSIX and Carbon. - - The fragmented resources in Suitcase and .dfont should be reordered - when `POST' resource for Type1 is being restored, but reordering of - sfnt resources induces the different face order. Now the ordering - is restricted to `POST' resource only, to prevent the different - order issue (e.g. the face index in the fontconfig cache generated - with Carbon framework is incompatible with that by FreeType 2 - without Carbon framework.) Found by Khaled Hosny and Hin-Tak Leung. - - http://lists.gnu.org/archive/html/freetype-devel/2013-02/msg00035.html - http://lists.gnu.org/archive/html/freetype-devel/2013-12/msg00027.html - - * src/base/ftrfork.c (FT_Raccess_Get_DataOffsets): Add a switch - `sort_by_res_id' to control the fragmented resource ordering. - * include/internal/ftrfork.h: Declare new switch. - * src/base/ftobjs.c (IsMacResource): Enable the sorting for `POST' - resource, and disable the sorting for `sfnt' resource. - -2013-12-25 Werner Lemberg - - Fix Savannah bug #40997. - - * src/bdf/bdfdrivr.c (BDF_Face_Init): Only use OR operator to - adjust face flags since FT_FACE_FLAG_EXTERNAL_STREAM might already - be set. - * src/cff/cffobjs.c (cff_face_init): Ditto. - * src/cid/cidobjs.c (cid_face_init): Ditto. - * src/pcf/pcfread.c (pcf_load_font): Ditto. - * src/pfr/pfrobjs.c (pfr_face_init): Ditto. - * src/type1/t1objs.c (T1_Face_Init): Ditto. - * src/type42/t42objs.c (T42_Face_Init): Ditto. - * src/winfonts/winfnt.c (FNT_Face_Init): Ditto. - -2013-12-21 Werner Lemberg - - [autofit] Introduce `coverages'. - - Coverages are the interface to the HarfBuzz library to acces - OpenType features for handling glyphs not addressable by the cmap. - - Right now, compilation of HarfBuzz is only added to the development - build. A solution for standard build mode will be delayed until - HarfBuzz gets split into two libraries to avoid mutual dependencies - between FreeType and HarfBuzz. - - Note that this is only a first step in handling coverages, basically - providing the framework only. Code for handling selected OpenType - features (this is, actually using the data in `afcover.h') will - follow. - - * devel/ftoption.h, include/config/ftoption.h - (FT_CONFIG_OPTION_USE_HARFBUZZ): New macro. - - * src/autofit/hbshim.c, src/autofit/hbshim.h, src/autofit/afcover.h: - New files. - - * src/autofit/afscript.h: Add HarfBuzz script name tags. - - * src/autofit/afstyles.h: Add default coverage enumeration values. - - * src/autofit/aftypes.h: Update use of `SCRIPT' and `STYLE' macros. - (AF_Coverage): New enumeration (generated by `afcover.h'). - (AF_StyleClassRec): New member `coverage'. - (AF_DEFINE_STYLE_CLASS): Updated. - - * include/internal/fttrace.h: Add `afharfbuzz' for tracing coverage - data. - - * src/autofit/afglobal.h: Update use of `SCRIPT' and `STYLE' macros. - (AF_SCRIPT_FALLBACK): Renamed to ... - (AF_STYLE_FALLBACK): ... this. - - * src/autofit/afglobal.c: Include `hbshim.c'. - Update use of `SCRIPT' and `STYLE' macros. - (af_face_globals_compute_style_coverage) - [FT_CONFIG_OPTION_USE_HARFBUZZ]: Call `af_get_coverage'. - Update. - - * src/autofit/afmodule.h (AF_ModuleRec): - s/fallback_script/fallback_style/. - - * src/autofit/afmodule.c (af_property_set): Adapt handling of - `fallback-script' property to set a fallback style. - (af_property_get, af_autofitter_init): Updated. - - * src/autofit/afpic.c: Update use of `SCRIPT' and `STYLE' macros. - - * src/autofit/afranges.h: Update use of `SCRIPT' macro. - - * src/autofit/autofit.c [FT_CONFIG_OPTION_USE_HARFBUZZ]: Include - `hbshim.c'. - - * src/autofit/rules.mk (AUTOF_DRV_SRC): Add `hbshim.c'. - (AUTOF_DRV_H): Add `afcover.h'. - - * builds/freetype.mk (INCLUDE_FLAGS) [DEVEL_DIR]: Use pkg-config for - all libraries needed by FreeType. - -2013-12-21 Werner Lemberg - - Fix Savannah bug #40975 (sort of). - - * src/truetype/ttinterp.c (Ins_IP): Fix sign typo to make FreeType - behave the same as the Windows TrueType engine for the invalid case. - -2013-12-21 Werner Lemberg - - [autofit] Make PIC mode work actually. - - * src/autofit/afpic.h (AFModulePIC): Fix array sizes to fit the - enumeration values automatically generated by including `afscript.h' - and friends. - - * src/autofit/afpic.c (autofit_module_class_pic_init): Updated. - -2013-12-21 Werner Lemberg - - Fix PIC linking. - - * include/internal/ftrfork.h (CONST_FT_RFORK_RULE_ARRAY_BEGIN): Fix - generated function name. - - * src/base/basepic.c (FT_Init_Table_raccess_guess_table): Rename - to ... - (FT_Init_Table_ft_raccess_guess_table): ... this so that the - function name correctly corresponds to what the macro framework - expects. - - * src/psnames/rules.mk (PSNAMES_DRV_SRC_S): Use correct file name so - that PIC functions are compiled also. - -2013-12-21 Werner Lemberg - - [base] Add missing dependencies to Makefile. - - * src/base/rules.mk (BASE_SRC): Add `basepic.c' and `ftpic.c'. - (BASE_H): Add `basepic.h'. - -2013-12-20 Werner Lemberg - - [autofit] Fix PIC compilation. - - * src/autofit/afcjk.c (af_cjk_metrics_init_widths), - src/autofit/aflatin.c (af_latin_metrics_init_widths) - [FT_CONFIG_OPTION_PIC]: Declare `globals'. - - * src/autofit/afglobal.c: Always call AF_DEFINE_SCRIPT_CLASS, and - AF_DEFINE_STYLE_CLASS. - - * src/autofit/afpic.c: Include `afglobal.h'. - (autofit_module_class_pic_init): Typo. - - * src/autofit/aftypes.h (AF_DEFINE_SCRIPT_CLASS, - AF_DEFINE_STYLE_CLASS): Don't use the same identifier for macro - parameter and structure member. - -2013-12-20 Werner Lemberg - - [autofit] Introduce `styles'. - - This is the new top-level structure for handling glyph input data; - scripts are now defined separately. - - * src/autofit/aftypes.h (SCRIPT): Updated. - (AF_ScriptClassRec): Move `blue_stringset' and `writing_system' - members to ... - (AF_Style_ClassRec): ... this new structure. - (AF_Style): New enumeration. - (AF_StyleMetricsRec): Replace `script' enumeration with - `style_class' pointer. - (AF_DEFINE_SCRIPT_CLASS, AF_DECLARE_SCRIPT_CLASS): Updated. - (AF_DEFINE_STYLE_CLASS, AF_DECLARE_STYLE_CLASS): New macros. - - * src/autofit/afstyles.h: New file, using data from `afscript.h'. - * src/autofit/afscript.h: Updated. - - * src/autofit/afcjk.c (af_cjk_metrics_init_widths, - af_cjk_metrics_init_blues, af_cjk_hint_edges): Updated. - - * src/autofit/afglobal.c (SCRIPT): Updated. - (STYLE): Redefine macro to load `afstyles.h'. - (af_script_names) [FT_DEBUG_LEVEL_TRACE]: Replace with... - (af_style_names): ... this array. - (af_face_globals_compute_script_coverage): Renamed to... - (af_face_globals_compute_style_coverage): ... this. - Updated. - (af_face_globals_new, af_face_globals_free, - af_face_globals_get_metrics): Updated. - - * src/autofit/afglobal.h (SCRIPT): Updated. - (STYLE): Redefine macro to load `afstyles.h'. - (AF_SCRIPT_FALLBACK): Update definition. This will get more - refinements with later on. - (AF_SCRIPT_UNASSIGNED): Replace with... - (AF_STYLE_UNASSIGNED): ... this macro. - (AF_FaceGlobalsRec): Updated. - - * src/autofit/aflatin.c (af_latin_metrics_init_widths, - af_latin_metrics_init_blues, af_latin_metrics_scale_dim, - af_latin_hint_edges): Updated. - - * src/autofit/aflatin2.c (af_latin2_metrics_init_widths): Updated. - (af_ltn2_uniranges): Removed. - - * src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph): - Updated. - - * src/autofit/afpic.c (autofit_module_class_pic_init): Updated. - * src/autofit/afpic.h (AF_STYLE_CLASSES_GET): New macro. - (AFModulePIC): Add `af_style_classes' and `af_style_classes_rec' - members. - - * src/autofit/afranges.h: Updated. - - * src/autofit/rules.mk (AUTOF_DRV_H): Add `afstyles.h'. - -2013-12-19 Werner Lemberg - - [autofit] Factor scripts and uniranges out of writing system files. - - * src/autofit/afranges.c, src/autofit/afranges.h: New files. - - * src/autofit/afscript.h: Extend `SCRIPT' macro with more - parameters, taking data from the writing system files. - - * src/autofit/aftypes.h: Updated. - - * src/autofit/afglobal.c: Include `afranges.h'. - Load `afscript.h' to call AF_DEFINE_SCRIPT_CLASS. - * src/autofit/afglobal.c: Include `afranges.h'. - Load `afscript.h' to call AF_DECLARE_SCRIPT_CLASS. - - * src/autofit/afcjk.c, src/autofit/afcjk.h: Updated. - * src/autofit/afdummy.c, src/autofit/afdummy.h: Updated. - * src/autofit/afindic.c, src/autofit/afindic.h: Updated. - * src/autofit/aflatin.c, src/autofit/aflatin.h: Updated. - * src/autofit/aflatn2.c, src/autofit/aflatn2.h: Updated. - - * src/autofit/afpic.c: Updated. - - * src/autofir/autofit.c: Include `afranges.c'. - * src/autofit/rules.mk (AUTOF_DRV_SRC): Add `afranges.c'. - -2013-12-18 Werner Lemberg - - [autofit] More code orthogonality. - - * src/autofit/aftypes.h (AF_StyleMetrics): Replace `script_class' - pointer to an `AF_ScriptClass' structure with `script' index of type - `AF_Script'. - Move some code around. - - * src/autofit/afcjk.c: Include `afpic.h'. - (af_cjk_metrics_init_widths, af_cjk_metrics_init_blues, - af_cjk_hint_edges): Updated. - - * src/autofit/aflatin.c: Include `afpic.h'. - (af_latin_metrics_init_widths, af_latin_metrics_init_blues, - af_latin_metrics_scale_dim, af_latin_hint_edges): Updated. - - * src/autofit/afglobal.c (af_face_globals_get_metrics): Updated. - - * src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph): - Updated. - -2013-12-18 Werner Lemberg - - [autofit] s/ScriptMetrics/StyleMetrics/. - -2013-12-18 Werner Lemberg - - [autofit] s/script_{metrics,hints}/style_{metrics,hints}/ - -2013-12-18 Werner Lemberg - - [autofit] s/gscripts/gstyles/. - -2013-12-18 Werner Lemberg - - [autofit] s/glyph_scripts/glyph_styles/. - - This is the first commit of a series to create a new top-level - structure (a `style') for handling scripts, writing_systems, and - soon-to-be-added coverages. - -2013-12-17 Werner Lemberg - - [autofit] s/AF_Script_/AF_WritingSystem_/ where appropriate. - -2013-12-11 Infinality - - [truetype] Simplify logic of rendering modes. - - This patch unifies the subpixel and non-subpixel cases. - - * src/truetype/ttinterp.h (TT_ExecContextRec): Remove - `grayscale_hinting'; all code should refer to `grayscale' instead. - Remove unused `native_hinting' member. - Rename `subpixel_hinting' member to `subpixel. - - * src/truetype/ttgload.c (TT_LOADER_SET_PP): Updated. - (tt_loader_init): Updated. - - * src/truetype/ttinterp.c (Ins_GETINFO): Simplify. - Updated. - -2013-12-11 Werner Lemberg - - [documentation] Add section how to include FreeType header files. - Problem reported by David Kastrup . - - Surprisingly, a description how to do that was completely missing in - the API reference. - - * include/freetype.h, include/ftchapters.h: New documentation - section `header_inclusion'. - -2013-12-10 Werner Lemberg - - [autofit] s/DFLT/NONE/, s/dflt/none/. - -2013-12-10 Werner Lemberg - - [autofit] s/AF_SCRIPT_NONE/AF_SCRIPT_UNASSIGNED/. - -2013-12-10 Werner Lemberg - - [truetype] Fix scaling of vertical phantom points. - - * src/truetype/ttgload.c (load_truetype_glyph): Scale pp3.x and - pp4.x also. - -2013-12-10 Werner Lemberg - - [truetype] Fix positioning of composite glyphs. - Problem reported by Nigel Tao . - - * src/truetype/ttgload.c (TT_Hint_Glyph): Remove code that shifts - the glyph (component) by a fractional value computed from the LSB - phantom point. This is wrong, since the horizontal phantom points - get rounded horizontally later on. - -2013-12-08 Werner Lemberg - - * Version 2.5.2 released. - ========================= - - - Tag sources with `VER-2-5-2'. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.5.2. - - * README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj, - builds/windows/vc2005/index.html, - builds/windows/vc2008/freetype.vcproj, - builds/windows/vc2008/index.html, - builds/windows/vc2010/freetype.vcxproj, - builds/windows/vc2010/index.html, - builds/windows/visualc/freetype.dsp, - builds/windows/visualc/freetype.vcproj, - builds/windows/visualc/index.html, - builds/windows/visualce/freetype.dsp, - builds/windows/visualce/freetype.vcproj, - builds/windows/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.5.1/2.5.2/, s/251/252/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 2. - - * builds/unix/configure.raw (version_info): Set to 17:1:11. - * CMakeLists.txt (VERSION_PATCH): Set to 2. - * docs/CHANGES: Updated. - -2013-12-07 Werner Lemberg - - [truetype] Next round in phantom point handling. - - Greg Hitchcock provided very interesting insights into the - complicated history of the horizontal positions of the TSB and BSB - phantom points. - - * src/truetype/ttgload.c (TT_LOADER_SET_PP) - [TT_CONFIG_OPTION_SUBPIXEL_HINTING]: Use `subpixel_hinting' and - `grayscale_hinting' flags as conditionals for the x position of TSB - and BSB. - -2013-12-05 Werner Lemberg - - * builds/freetype.mk (FT_CC): Removed. Unused. - -2013-12-04 Werner Lemberg - - [sfnt] Fix handling of embedded bitmap strikes. - - This corrects the commit from 2013-11-21. Problem reported by - Andrey Panov . - - * src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap): Fix logic to - detect excessive bytes for bit-aligned bitmaps. - -2013-12-03 Werner Lemberg - - [truetype] Remove dead code. - - Reported by Nigel Tao . - - * include/internal/tttypes.h (TT_LoaderRec): Remove unused - `preserve_pps' field. - * src/truetype/ttgload.c (TT_Hint_Glyph): Updated. - -2013-12-03 Werner Lemberg - - [truetype] Fix phantom point handling. - - This is a further improvement to the changes from 2013-11-06. - - * src/truetype/ttgload.c (TT_Hint_Glyph): Horizontal phantom points - are rounded horizontally, vertical ones are rounded vertically. - (TT_LOADER_SET_PP): The horizontal position of vertical phantom - points in pre-ClearType mode is zero, as shown in the OpenType - specification. - -2013-12-02 Werner Lemberg - - [truetype] Fix change from 2013-11-20. - - Problem reported by Akira Kakuto . - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Protect call to - `Update_Max' with both a TT_USE_BYTECODE_INTERPRETER guard and a - `IS_HINTED' clause. - Also remove redundant check using `maxSizeOfInstructions' – in - simple glyphs, the bytecode data comes before the outline data, and - a validity test for this is already present. - -2013-11-27 Werner Lemberg - - [autofit] Fix use of dumping functions in `ftgrid' demo program. - - * src/autofit/afhints.c (AF_DUMP) [FT_DEBUG_AUTOFIT]: New macro. - (af_glyph_hints_dump_points, af_glyph_hints_dump_segments, - af_glyph_hints_dump_edges) [FT_DEBUG_AUTOFIT]: Add parameter to - handle output to stdout. - Use AF_DUMP. - (af_glyph_hints_dump_points, af_glyph_hints_dump_segments, - af_glyph_hints_dump_edges) [!FT_DEBUG_AUTOFIT]: Removed. - -2013-11-25 Werner Lemberg - - * Version 2.5.1 released. - ========================= - - - Tag sources with `VER-2-5-1'. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.5.1. - - * README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj, - builds/windows/vc2005/index.html, - builds/windows/vc2008/freetype.vcproj, - builds/windows/vc2008/index.html, - builds/windows/vc2010/freetype.vcxproj, - builds/windows/vc2010/index.html, - builds/windows/visualc/freetype.dsp, - builds/windows/visualc/freetype.vcproj, - builds/windows/visualc/index.html, - builds/windows/visualce/freetype.dsp, - builds/windows/visualce/freetype.vcproj, - builds/windows/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.5.0/2.5.1/, s/250/251/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1. - - * builds/unix/configure.raw (version_info): Set to 17:0:11. - * CMakeLists.txt (VERSION_PATCH): Set to 1. - * docs/CHANGES, docs/release: Updated. - -2013-11-23 Werner Lemberg - - [truetype]: Add tricky font names `hkscsiic.ttf' and `iicore.ttf'. - - * src/truetype/ttobjs.c (TRICK_NAMES_MAX_CHARACTERS, - TRICK_NAMES_COUNT): Updated. - (trick_names): Add family name for the two fonts. - -2013-11-23 Werner Lemberg - - * src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap): Typo. - -2013-11-21 Werner Lemberg - - [sfnt] Typo. - - Problem reported by Hin-Tak Leung . - - * src/sfnt/sfobjs.c (sfnt_load_face): Return correct `bsize->width' - value if the font lacks an `OS/2' table. - -2013-11-21 Werner Lemberg - - [sfnt] Improve handling of buggy embedded bitmap strikes. - - We are now able to successfully load `AppleMyoungJo.ttf'. - Problem reported by Hin-Tak Leung . - - * src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap): Don't trust glyph - format. - -2013-11-20 Werner Lemberg - - [truetype] Don't trust `maxp's `maxSizeOfInstructions'. - - Problem reported by Hin-Tak Leung ; see - - http://lists.nongnu.org/archive/html/freetype-devel/2013-08/msg00005.html - - for details. - - * src/base/ftobjs.c (FT_Load_Glyph): Check size of `fpgm' and `prep' - tables also for setting `autohint'. - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Use code from - `TT_Process_Composite_Glyph' for handling unreliable values of - `maxSizeOfInstructions'. - -2013-11-16 Werner Lemberg - - [sfnt] Fix `OS/2' table version 5 support. - - We now follow the `official' announcement from Microsoft (on the - OpenType mailing list, which unfortunately hasn't a public archive). - - * include/freetype/tttables.h (TT_OS2): - s/usLowerPointSize/usLowerOpticalPointSize/, - s/usUpperPointSize/usUpperOpticalPointSize/. - - * src/sfnt/ttload.c (tt_face_load_os2): Update, and set correct - default values. - -2013-11-13 Werner Lemberg - - * builds/unix/ft2unix.h: Remove. No longer necessary. - - * builds/unix/install.mk (install): Updated. - -2013-11-13 Werner Lemberg - - Simplify header file hierarchy. - - This large patch changes the header file directory layout from - `include/freetype/...' to `include/...', effectively removing one - level. Since the file `ft2build.h' is also located in `include' - (and it stays there even after installation), all FreeType header - files are now in a single directory. - - Applications that use (a) `freetype-config' or FreeType's - `pkg-config' file to get the include directory for the compiler, and - (b) the documented way for header inclusion like - - #include - #include FT_FREETYPE_H - ... - - don't need any change to the source code. - - * include/freetype/*: Move up to... - * include/*: ... this directory. - - * builds/amiga/include/freetype/*: Move up to... - * builds/amiga/include/*: ... this directory. - - */*: Essentially do `s@/freetype/@/@' where appropriate. - - * CMakeList.txt: Simplify. - * builds/unix/freetype-config.in, builds/unix/freetype2.in: For - `--cflags', return a single directory. - * builds/unix/install.mk (install): No longer try to remove `cache' - and `internal' subdirectories; instead, remove the `freetype' - subdirectory. - -2013-11-12 Werner Lemberg - - [truetype] Fix last `truetype' commit. - - * src/truetype/ttgload.c (tt_get_metrics): Preserve stream position. - Return error value. - (load_truetype_glyph): Updated. - -2013-11-10 Werner Lemberg - - * docs/CMAKE: New dummy file. - -2013-11-08 Dave Arnold - - [cff] Fix for hints that touch. - - * src/cff/cf2hints.c (cf2_hintmap_insertHint): Fix condition for - finding index value of insertion point. - -2013-11-06 Werner Lemberg - - [truetype] Fix handling of phantom points in composite glyphs. - Problem reported by Nigel Tao . - - This is a follow-up commit to the previous one. - - * src/truetype/ttgload.c (load_truetype_glyph): Call - `tt_get_metrics' after loading the glyph header. - -2013-11-06 Werner Lemberg - - [truetype] Improve emulation of vertical metrics. - - This commit also improves the start values of vertical phantom - points. Kudos to Greg Hitchcock for help. - - * src/truetype/ttgload.c (TT_Get_VMetrics): Add parameter to pass - `yMax' value. Replace code with fixed Microsoft definition. - (tt_get_metrics): Updated. - (TT_LOADER_SET_PP): Add explanation how to initialize phantom - points, taken from both the OpenType specification and private - communication with Greg (which will eventually be added to the - standard). - Fix horizontal position of `pp3' and `pp4'. - - * src/truetype/ttgload.h: Updated. - - * src/truetype/ttdriver.c (tt_get_advances): Updated. - - * docs/CHANGES: Updated. - -2013-11-05 Werner Lemberg - - * builds/windows/vc2010/freetype.vcxproj: s/v110/v100/. - PlatformToolSet version 110 is for VC2012. - - Problem reported (with solution) by Dave Arnold . - -2013-11-05 Werner Lemberg - - [truetype] Correctly reset point tags for glyph components. - Problem reported by Nigel Tao . - - * src/truetype/ttgload.c (TT_Process_Composite_Glyph): Fix loop. - -2013-11-02 Werner Lemberg - - [truetype] Fix GETINFO opcode handling of subpixel hinting bits. - - * src/truetype/ttinterp.c (Ins_GETINFO): Don't request bit 6 set to - get info on subpixel hinting. - - * docs/CHANGES: Updated. - -2013-11-02 Werner Lemberg - - Fix Savannah bug #40451. - - Simply apply the patch from the bug report. - - * builds/unix/ftconfig.in, builds/vms/ftconfig.h, - include/freetype/config/ftconfig.h: The used #pragma directives only - work with gcc versions 4.6 and higher. - -2013-11-01 Werner Lemberg - - * docs/CHANGES: Updated. - -2013-11-01 Werner Lemberg - - [truetype] Minor code refactoring. - - Two benefits: The allocated FDEF (and IDEF) array gets slightly - smaller, and the `ttdebug' demo program has access to function - numbers without additional costs. - - Fortunately, no changes to FontForge are necessary – this is the - only external TrueType debugger I know of, but others may exist and - should check the code accordingly. - - * src/truetype/ttinterp.h (TT_CallRec): Replace `Cur_Restart' and - `Cur_End' with a pointer to the corresponding `TT_DefRecord' - structure. - - * src/truetype/ttinterp.c (DO_JROT, DO_JMPR, DO_JROF, Ins_ENDF, - Ins_CALL, Ins_LOOPCALL, Ins_UNKNOWN, TT_RunIns ): - Updated. - -2013-10-27 Werner Lemberg - - [sfnt] Implement support for `OS/2' table version 5. - - See - - http://typedrawers.com/discussion/470/new-microsoft-size-specific-design-selection-mechanism - - for the announcement. - - * include/freetype/tttables.h (TT_OS2): Add fields - `usLowerPointSize' and `usUpperPointSize'. Since FreeType returns - this structure only as a pointer through `FT_Get_Sfnt_Table', there - shouldn't be any ABI problems. - - * src/sfnt/ttload.c (tt_face_load_os2): Implement it. - - * docs/CHANGES: Updated. - -2013-10-24 Werner Lemberg - - * README.git, docs/CHANGES, docs/INSTALL: Updated. - -2013-10-24 John Cary - - Provide cmake support. - - * CMakeLists.txt: New file. - -2013-10-23 Kenneth Miller - Werner Lemberg - - Provide support for x64 builds in Visual C++ project files. - - * src/builds/win32: Renamed to... - * src/builds/windows: This. - - * src/builds/windows/vc2010/*: Updated to handle x64 target. - - * src/builds/windows/*.mk, docs/INSTALL.GNU: s/win32/windows/ where - appropriate. - -2013-10-22 Werner Lemberg - - * src/base/md5.c, src/base/md5.h: Updated to recent version. - - * src/base/ftobjs.c: Updated; `md5.c' no longer uses `free'. - - The canonical URL to get updates for this file is - - http://cvsweb.openwall.com/cgi/cvsweb.cgi/Owl/packages/popa3d/popa3d/md5/ - - as the author told me in private communication. - -2013-10-19 Werner Lemberg - - [autofit] s/SMALL_TOP/X_HEIGHT/. - - * src/autofit/afblue.dat: Updated. - - * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated. - - * src/autofit/aflatin.c, src/autofit/aflatin.h, - src/autofit/atlatin2.c: Updated. - -2013-10-19 Werner Lemberg - - * src/autofit/afblue.dat: s/MINOR/DESCENDER/. - - * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated. - -2013-10-16 Werner Lemberg - - [autofit] Add description strings to script entries. - - Currently, this is unused. - - * src/autofit/afscript.h: Do it. - * src/autofit/afglobal.c, src/autofit/afpic.c, - src/autofit/aftypes.h: Updated. - -2013-10-16 Werner Lemberg - - [autofit] Improve tracing message for extra light flag. - - * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Do it. - -2013-10-15 Chongyu Zhu - - [arm] Fix thumb2 inline assembly under LLVM. - - When using `ADD' with an immediate operand, the instruction is - actually `ADD Rd, Rn, #', that is, the maximum of the - immediate operand cannot exceed 4095. It will fail to compile with - LLVM. - - However, in GCC, due to some legacy compatibility considerations, - `ADD.W' will be automatically emitted when the immediate operand is - larger than 4095. - - * builds/unix/ftconfig.in, include/freetype/config/ftconfig.h - (FT_MulFix_arm) [__GNUC__]: Support clang compiler. - - * src/truetype/ttinterp.c (TT_MulFix14_arm) [__GNUC__]: Ditto. - -2013-10-12 Werner Lemberg - - [autofit] Improve tracing of `latin' hinter. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Report blue - zone types. - (af_latin_metrics_scale_dim): Report scaling changes due to x height - alignment. - Report scaled stroke width and blue zone values. - -2013-10-03 Dave Arnold - - * src/cff/cf2font.c (cf2_computeDarkening): Avoid division by zero. - - Note that the old code avoided using a region of the piecewise - linear function where the slope was zero. The recovery was to use a - different section of the function, which produced a different, - incorrect amount of darkening. - -2013-10-02 Darrell Bellert - - * src/sfnt/ttload.c (tt_face_load_pclt): Fix `pclt_fields'. - -2013-10-02 Dave Arnold - - * src/cff/cf2font.c (cf2_computeDarkening): Initialize darkenAmount. - - This line was lost in commit 89ca1fd6 (from 2013-06-25). The effect - is to use a previous darkening amount when producing an unhinted, - unscaled outline. This can cause autohint samples in ftgrid and - ftview to be based on darkened CFF outlines instead of unhinted, - undarkened ones. - -2013-09-29 Dave Arnold - - Fix Savannah bug #39295. - - The bug was caused by switching to the initial hintmap (the one in - effect when `moveto' executes) just before drawing the final element - in the charstring. This ensured that the path was closed (in both - Character Space and Device Space). But if the final element was a - curve and if the final hintmap was different enough from the initial - one, then the curve was visibly distorted. - - The first part of the fix is to draw the final curve using the final - hintmap as specified by the charstring. This corrects the - distortion but does not ensure closing in Device Space. It may - require the rasterizer to automatically generate an extra closing - line. Depending on the hintmap differences, this line could be from - zero to a couple pixels in length. - - The second part of the fix covers the case where the charstring - subpath is closed with an explicit line. We now modify that line's - end point to avoid the distortion. - - Some glyphs in the bug report font (TexGyreHeros-Regular) that show - the change are: - - 25ppem S (98) - 24ppem eight (52) - 25.5ppem p (85) - - Curves at the *end* of a subpath are no longer distorted. However, - some of these glyphs have bad hint substitutions in the middle of a - subpath, and these are not affected. - - The patch has been tested with a set of 106 fonts that shipped with - Adobe Creative Suite 4, together with 756 Open Source CFF fonts from - Google Fonts. There are 1.5 million glyphs, of which some 20k are - changed with the fix. A sampling of a few hundred of these changes - have been examined more closely, and the changes look good (or at - least acceptable). - - * src/cff/cf2hints.h (CF2_GlyphPathRec): New element `pathIsClosing' - to indicate that we synthesize a closepath line. - - * src/cff/cf2hints.c (cf2_glyphpath_init): Updated. - (cf2_glyphpath_pushPrevElem): If closing, use first hint map (for - `lineto' operator) and adjust hint zone. - For synthesized closing lines, use end point in first hint zone. - (cf2_glyphpath_lineTo): Take care of synthesized closing lines. In - particular, shift the detection of zero-length lines from character - space to device space. - (cf2_glyphpath_closeOpenPath): Remove assertion. - Updated. - -2013-09-25 Werner Lemberg - - * src/autofit/aflatin.c (af_{grek,cyrl}_uniranges): Fix arrays. - -2013-09-25 suzuki toshiya - - [bdf, pcf] Refuse non-zero face_index. - - Suggested by Akira Tagoh, see - - http://lists.gnu.org/archive/html/freetype/2013-09/msg00030.html - - * src/bdf/bdfdrivr.c (BDF_Face_Init): Return `Invalid_Argument' - error if the font could be opened but non-zero `face_index' is - given. - * src/pcf/pcfdrivr.c (PCF_Face_Init): Ditto. - - * src/type42/t42objs.c (T42_Face_Init): Remove unrequired FT_UNUSED - macro for `face_index' because it is validated later. - -2013-09-23 Werner Lemberg - - Fix Savannah bug #40090. - - * src/autofit/afcjk.c (af_cjk_metrics_scale): Revert commit - 306f8c5d (from 2013-08-25) affecting this function. - -2013-09-22 Werner Lemberg - - [autofit] Disunify Cyrillic and Greek handling from Latin. - - * src/autofit/afscript.h: Add Cyrillic and Greek. - - * src/autofit/afblue.dat (AF_BLUE_STRINGSET_GREK, - AF_BLUE_STRINGSET_CYRL): Add blue zones for Greek and Cyrillic. - (AF_BLUE_STRINGSET_LATN): Fix typo. - * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated. - - * src/autofit/aflatin.c (af_grek_uniranges, af_cyrl_uniranges): New - arrays. - (af_grek_script_class, af_cyrl_script_class): New scripts. - * src/autofit/aflatin.h: Updated. - -2013-09-20 Werner Lemberg - - * docs/CHANGES: Updated. - -2013-09-20 Behdad Esfahbod - - Fix vertical size of emboldened glyphs. - - Cf. https://bugzilla.gnome.org/show_bug.cgi?id=686709 - - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Adjust `horiBearingY' - also. - -2013-09-11 Alexei Podtelezhnikov - - * include/freetype/ftoutln.h: Correct FT_Outline_Get_Orientation - algorithm description. - -2013-09-11 Werner Lemberg - - [autofit] Improve Hebrew rendering. - - This change introduces a new blue zone property - `AF_BLUE_PROPERTY_LATIN_LONG' to make the auto-hinter ignore short - top segments. - - * src/autofit/afblue.dat: Fix Hebrew blue strings. - Use AF_BLUE_PROPERTY_LATIN_LONG for AF_BLUE_STRING_HEBREW_TOP. - - * src/autofit/afblue.hin (AF_BLUE_PROPERTY_LATIN_LONG): New macro. - - * src/autofit/afblue.c, src/autofit/afblue.h: Updated. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Handle - `AF_LATIN_IS_LONG_BLUE'. - - * src/autofit/aflatin.h (AF_LATIN_IS_LONG_BLUE): New macro. - -2013-08-28 Behdad Esfahbod - - [sfnt] Fix frame access while reading WOFF table directory. - - * src/sfnt/sfobjs.c (woff_open_font): Using single memory frame - while reading the directory entries for the whole loop. - -2013-08-29 Werner Lemberg - Behdad Esfahbod - - Implement support for WOFF containers. - - We simply synthesize a SFNT from the WOFF, create a memory stream - for the new data, and load the SFNT as usual. - - Does NOT add any API to access WOFF metadata or private blocks. - - * include/freetype/internal/tttypes.h (WOFF_HeaderRec, - WOFF_TableRec): New structures. - - * include/freetype/tttags.h (TTAG_wOFF): New macro. - - * src/base/ftobjs.c (FT_Open_Face): Set `stream' after calling - `open_face'. - - * src/sfnt/sfobjs.c [FT_CONFIG_OPTION_SYSTEM_ZLIB]: Include - `FT_GZIP_H'. - (WRITE_BYTE, WRITE_USHORT, WRITE_ULONG): New temporary macros for - writing to a stream. - (sfnt_stream_close, compare_offsets, woff_open_font): New functions. - (sfnt_open_font): Handle `TTAG_wOFF'. - (sfnt_init_face): Set `stream' after calling `sfnt_open_font'. - - * src/truetype/ttobjs.c (tt_face_init): Set `stream' after calling - `sfnt->init_face'. - - * src/base/ftobjs.c (open_face): Use a pointer to FT_Stream as an - argument so that a changed stream survives. - Update callers. - -2013-08-28 Werner Lemberg - - [gzip] New function `FT_Gzip_Uncompress'. - - This is modeled after zlib's `uncompress' function. We need this - for WOFF support. - - * include/freetype/ftgzip.h, src/gzip/ftgzip.c (FT_Gzip_Uncompress): - New function. - - * src/gzip/rules.mk: Rewrite to better reflect dependencies. - -2013-08-28 Werner Lemberg - - [autofit] Fix `make multi' compilation. - - * src/autofit/afblue.cin, src/autofit/afblue.c: Don't include - `afblue.h' but `aftypes.h'. - * src/autofit/afcjk.c: Don't include `aftypes.h' but `afglobal.h'. - -2013-08-28 Werner Lemberg - - [autofit] Fix C++ compilation. - - * src/autofit/afglobal.c (af_face_globals_get_metrics), - src/autofit/afdummy.c (af_dflt_script_class), src/autofit/afindic.c - (af_deva_script_class): Use proper casts. - -2013-08-27 Behdad Esfahbod - - * src/sfnt/ttload.c (tt_face_load_font_dir): Fix sign typos. - -2013-08-27 Behdad Esfahbod - - FT_Open_Face: Improve external stream handling. - - If the font's `clazz->init_face' function wants to swap to new - stream, handling of whether original stream was external could - result to either memory leak or double free. Mark externality into - face flags before calling `init_face' such that the clazz can handle - external streams properly. - - * src/base/ftobjs.c (FT_Open_Face): Move code to set - FT_FACE_FLAG_EXTERNAL_STREAM to... - (open_face): This function. - -2013-08-27 Werner Lemberg - - Remove `FT_SqrtFixed' function. - - It's no longer used. - - * include/freetype/internal/ftcalc.h, src/base/ftcalc.c: Do it. - -2013-08-27 Werner Lemberg - - [autofit] While tracing, report script names instead of ID values. - - * src/autofit/afglobal.c (af_script_names) [FT_DEBUG_LEVEL_TRACE]: - New array. - * src/autofit/afglobal.h: Updated. - - * src/autofit/afcjk.c (af_cjk_metrics_init_widths, - af_cjk_hint_edges): Use `af_script_names'. - * src/autofit/aflatin.c (af_latin_metrics_init_widths, - af_latin_hint_edges): Ditto. - -2013-08-26 Werner Lemberg - - [autofit] Report used script while hinting a glyph. - - * src/autofit/afcjk.c (af_cjk_hint_edges), src/autofit/aflatin.c - (af_latin_hint_edges): Implement it. - -2013-08-26 Werner Lemberg - - [autofit] Add support for Hebrew script. - - * src/autofit/afblue.dat: Add blue strings for Hebrew. - * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated. - - * src/autofit/aflatin.c (af_hebr_uniranges): New array. - (af_hebr_script_class): New script. - * src/autofit/aflatin.h, src/autofit/afscript.h: Updated. - -2013-08-26 Werner Lemberg - - [autofit] Improve tracing messages. - - * src/autofit/afcjk.c (af_cjk_metrics_init_widths): Mention script - ID in tracing message. - (af_cjk_metrics_init_blues): Initialize `axis' outside of the inner - loop. - Improve tracing messages. - (af_cjk_hint_edges) [FT_DEBUG_LEVEL_TRACE]: New variable - `num_actions' to count hinting actions. - Improve tracing messages. - - * src/autofit/aflatin.c (af_latin_metrics_init_widths): Mention - script ID in tracing message. - (af_latin_metrics_init_blues, af_latin_hint_edges): Improve tracing - messages. - -2013-08-26 Werner Lemberg - - Better tracing of loaded glyphs. - - Previously, the loading of a glyph was traced at level 4, if at all. - With this change, all font loading routines emit a tracing message - at level 1, making it easier to select tracing output (for example - using F2_DEBUG="any:1 afhints:7 aflatin:7"). - - * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Add tracing message. - * src/cff/cffdrivr.c (cff_glyph_load): Ditto. - * src/cff/cffgload.c (cff_decoder_prepare): Improve tracing - messages. - * src/cid/cidgload.c (cid_load_glyph): Use level 1 for tracing - message. - * src/pcf/pcfdrivr.c (PCF_Glyph_Load): Ditto. - * src/pfr/pfrobjs.c (pfr_slot_load): Add tracing message. - * src/truetype/ttgload.c (TT_Load_Glyph): Ditto. - * src/type1/t1gload.c (T1_Load_Glyph): Ditto. - * src/type42/t42objs.c (T42_GlyphSlot_Load): Ditto. - * src/winfonts/winfnt.c (FNT_Load_Glyph): Ditto. - -2013-08-26 Werner Lemberg - - [autofit] Fix script selection. - - * src/autofit/afglobal.c (af_face_globals_get_metrics): Use - `AF_SCRIPT_DFLT', not value 0. - Simplify code. - - * src/autofit/afscript.h: Sort by script name. - -2013-08-26 Werner Lemberg - - [autofit] Make `dummy' hinter work as expected. - - * src/autofit/afdummy.c (af_dummy_hints_init): Properly set scaling - information. - (af_dummy_hints_apply): Scale the glyphs. - -2013-08-25 Werner Lemberg - - [autofit] Make `cjk' module use blue stringsets. - - * src/autofit/afcjk.c (AF_CJK_MAX_TEST_CHARACTERS): Removed. - (af_cjk_hani_blue_chars): Removed. - (AF_CJK_BLUE_TYPE_*): Removed. - (af_cjk_metrics_init_blues): Replace AF_CJK_MAX_TEST_CHARACTERS with - AF_BLUE_STRING_MAX_LEN. - Change loops to use offsets (in file `afblue.h') into the new arrays - `af_blue_stringsets' and `af_blue_strings' (in file `afblue.c'). - Instead of three dimensions (as used in the old blue string array) - we now use properties to do the same, saving one loop nesting level. - - * src/autofit/afcjk.h: Remove old enumeration values superseded by - the new data in `afblue.h'. - (AF_CJK_IS_TOP_BLUE, AF_CJK_IS_HORIZ_BLUE, AF_CJK_IS_FILLED_BLUE, - AF_CJK_IS_RIGHT_BLUE): New macros, to be used in - `af_cjk_metrics_init_blues'. - (AF_CJK_BLUE_IS_RIGHT): Remove this now redundant enum value. - (AF_CJK_BLUE_IS_TOP): Renamed to... - (AF_CJK_BLUE_TOP): This. - (AF_CJK_MAX_BLUES): Remove. - (AF_CJKAxisRec): Updated. - -2013-08-25 Werner Lemberg - - [autofit] Typo. - - * src/autofit/afblue.hin, src/autofit/afblue.c (GET_UTF8_CHAR): Use - cast. - -2013-08-25 Werner Lemberg - - [autofit] Synchronize `cjk' with `latin' module (and vice versa). - - * src/autofit/afcjk.c (af_cjk_metrics_init_widths): Add tracing - messages. - (af_cjk_metrics_init_blues): Don't pass blue string array as - argument but use the global array directly. - Use `outline' directly. - Update and add tracing messages. - (af_cjk_metrics_init): Simplify code. - (af_cjk_metrics_scale_dim): Improve tracing message. - (af_cjk_metrics_scale): Synchronize. - - * src/autofit/aflatin.c (af_latin_metrics_init_widths, - af_latin_metrics_init_blues): Improve and add tracing messages. - -2013-08-25 Werner Lemberg - - [autofit] Make `latin' module use blue stringsets. - - * src/autofit/aflatin.c (AF_LATIN_MAX_TEST_CHARACTERS): Removed. - (af_latin_blue_chars): Removed. - (af_latin_metrics_init_blues): Replace AF_LATIN_MAX_TEST_CHARACTERS - with AF_BLUE_STRING_MAX_LEN. - Change loops to use offsets (in file `afblue.h') into the new arrays - `af_blue_stringsets' and `af_blue_strings' (in file `afblue.c'). - Use `AF_LATIN_IS_SMALL_TOP_BLUE' macro. - - * src/autofit/aflatin.h: Remove old enumeration values superseded by - the new data in `afblue.h'. - (AF_LATIN_IS_TOP_BLUE): Updated definition. - (AF_LATIN_IS_SMALL_TOP_BLUE): New macro. - (AF_LATIN_MAX_BLUES): Remove. - (AF_LatinAxisRec): Updated. - -2013-08-25 Werner Lemberg - - [autofit] Add blue stringsets. - - * src/autofit/aftypes.h: Include `afblue.h'. - (AF_ScriptClassRec): Add `blue_stringset' field. - (AF_DEFINE_SCRIPT_CLASS): Updated. - - * src/autofit/autofit.c: Include `afblue.c'. - - * src/autofit/afcjk.c (af_hani_script_class), src/autofit/afdummy.c - (af_dflt_script_class), src/autofit/afindic.c - (af_deva_script_class), src/autofit/aflatin.c - (af_latn_script_class), src/autofit/aflatin2.c - (af_ltn2_script_class): Updated. - - * src/autofit/rules.mk (AUTOF_DRV_SRC): Add `afblue.c'. - -2013-08-25 Werner Lemberg - - [autofit] Introduce data file for blue strings. - - The idea is to have a central file which gets processed by a Perl - script to create proper `.c' and `.h' files using templates. There - are two other reasons to do that: - - . The data file should be easily readable. We use UTF-8 encoding - which then gets converted to single bytes. - - . Since the number of supported scripts will increase soon, the - current usage of blue string arrays is a waste of space. Using - the Perl script it is possible to imitate jagged arrays, - defining enumeration constants as offsets into the arrays. - - This commit only adds files without changing any functionality. - - * src/autofit/afblue.dat: New data file. - * src/tools/afblue.pl: New Perl script for processing `afblue.dat'. - - * src/autofit/afblue.cin, src/autofit/afblue.hin: New template files - for... - * src/autofit/afblue.c, src/autofit/afblue.c: New source files. - To avoid a dependency on Perl, we add them too. - -2013-08-19 Alexei Podtelezhnikov - - [base] Enable new algorithm for `BBox_Cubic_Check'. - - * src/base/ftbbox.c: Enable new BBox_Cubic_Check algorithm, remove - the old one. - Improve comments. - -2013-08-18 Werner Lemberg - - * builds/unix/unix-def.in (freetype2.pc): Don't set executable bit. - -2013-08-18 Werner Lemberg - - Fix Savannah bug #39804. - - * builds/unix/configure.raw (LIBPNG): Define and export. - * builds/unix/freetype-config.in, builds/unix/freetype2.in: Handle - libpng. - -2013-08-17 Alexei Podtelezhnikov - - [base] Clean up BBox_Conic_Check. - - * src/base/ftbbox.c (BBox_Conic_Check): Remove redundant checks for - extremum at the segment ends, which are already within the bbox. - Slightly modify calculations. - -2013-08-15 Alexei Podtelezhnikov - - [base] Finish experimental (disabled) BBox_Cubic_Check implementation. - - * src/base/ftbbox.c (BBox_Cubic_Check): Scale arguments to improve - accuracy and avoid overflows. - -2013-08-13 Alexei Podtelezhnikov - - [base] Refactor experimental (disabled) BBox_Cubic_Check. - - * src/base/ftbbox.c (BBox_Cubic_Check): Implement the minimum search - as the mirror image of the maximum search implemented here... - (update_max): New function. - -2013-08-06 John Tytgat - - Fix Savannah bug #39702. - - * src/cff/cffload.c (cff_index_get_pointers): Check for `cur_offset - != 0'; this stronger test is mandated by the CFF specification. - Fix test for INDEX structures which have one or more empty entries - at the end. - -2013-08-05 Werner Lemberg - - Fix gcc pragmas, part 2. - - * src/truetype/ttinterp.c (TT_MulFix14_long_long, - TT_DotFix14_long_long): `#pragma gcc diagnostic {push,pop}' has been - introduced with gcc version 4.6. - -2013-08-05 Werner Lemberg - - Fix gcc pragmas. - - * src/truetype/ttinterp.c (TT_MulFix14_long_long, - TT_DotFix14_long_long): Older gcc versions don't accept diagnostic - pragmas within a function body. - -2013-08-05 Werner Lemberg - - Fix Savannah bug #39700. - - * builds/unix/ftconfig.h: Synchronize with - `include/freetype/config/ftconfig.h'. - - * builds/vms/ftconfig.h: Ditto. - Make the differences to the master `ftconfig.h' file as small as - possible for easier maintainance. - -2013-08-05 Werner Lemberg - - [autofit] Improve handling of `near' points. - - Points which are very near to each other are now marked as such. - The `weak' flag is then computed by using the `in' vector of the - first and the `out' vector of the last point of a group of near - points. - - For example, this fixes the rendering of glyph `Oslash' in - `Roboto-Thin.ttf'. - - * src/autofit/afhints.h (AF_Flags): New value `AF_FLAGS_NEAR'. - - * src/autofit/afhints.c (af_glyph_hints_reload): Introduce - the heuristic value `near_limit' to decide whether the current point - is near to the previous one, then set `AF_FLAG_NEAR' accordingly. - Store good `in' vector (of last non-near point) in - `last_good_in_{x,y}' and use it as an argument to - `ft_corner_is_flat' if necessary. - -2013-08-02 Werner Lemberg - - * include/freetype/ftcffdrv.h: Improve documentation. - This is based on blog entries from David Lemon and Dave Arnold (both - from Adobe) with kind permission. Dave also helped in - proof-reading. - -2013-08-02 Werner Lemberg - - [autofit] Move declaration of scripts into separate file. - - This has the benefit that we don't need to duplicate the data at - different places. - - * src/autofit/afscript.h: New file. - - * src/autofit/aftypes.h (AF_Script): Include `afscript.h' to define - the enumeration values. - - * src/autofit/afglobal.c: Include `afscript.h' to get the script - specific header files. - (af_script_classes): Include `afscript.h' to fill this array. - - * src/autofit/afpic.c: Include `afscript.h' to get the script - specific header files. - (autofit_module_class_pic_init): Include `afscript.h' for - initialization. - * src/autofit/afpic.h (AF_SCRIPT_CLASSES_COUNT, - AF_SCRIPT_CLASSES_REC_COUNT): Removed. Use `AF_SCRIPT_MAX' instead. - - * src/autofit/rules.mk (AUTOF_DRV_H): Updated. - -2013-08-02 Werner Lemberg - - [autofit] Move declaration of writing systems into separate file. - - This has the benefit that we don't need to duplicate the data at - different places. - - * src/autofit/afwrtsys.h: New file. - - * src/autofit/aftypes.h (AF_WritingSystem): Include `afwrtsys.h' to - define the enumeration values. - - * src/autofit/afglobal.c: Include `afwrtsys.h' to get the writing - system specific header files. - Include `afpic.h'. - (af_writing_system_classes): Include `afwrtsys.h' to fill this - array. - - * src/autofit/afpic.c: Include `afwrtsys.h' to get the writing - system specific header files. - (autofit_module_class_pic_init): Include `afwrtsys.h' for - initialization. - * src/autofit/afpic.h (AF_WRITING_SYSTEM_CLASSES_COUNT, - AF_WRITING_SYSTEM_CLASSES_REC_COUNT): Removed. Use - `AF_WRITING_SYSTEM_MAX' instead. - -2013-08-02 Werner Lemberg - - [sfnt] Fix compilation with g++. - - * src/sfnt/pngshim.c (error_callback, read_data_from_FT_stream): Use - cast. - (Load_SBit_Png): Pacify compiler. - -2013-08-02 suzuki toshiya - Werner Lemberg - - [autofit] Fix `make multi'. - - * include/freetype/config/ftconfig.h (FT_LOCAL_ARRAY, - FT_LOCAL_ARRAY_DEF): New macros. - - * src/autofit/afglobal.c (af_writing_system_classes, - af_script_classes): Use FT_LOCAL_ARRAY_DEF. - * src/autofit/afglobal.h: Declare `af_writing_system_classes' and - `af_script_classes'. - * src/autofit/afloader.c: Include `afpic.h'. - -2013-08-01 Werner Lemberg - - Another round of cppcheck nitpicks. - - The call was (from the top-level of the FreeType tree): - - cppcheck --force \ - --enable=all \ - -I /usr/include \ - -I /usr/local/include \ - -I /usr/lib/gcc/i586-suse-linux/4.7/include \ - -I include \ - -I include/freetype \ - -I include/freetype/config \ - -I include/freetype/internal \ - -DFT2_BUILD_LIBRARY \ - . &> cppcheck.log - - using cppcheck git commit f7e93f99. - - Note that cppcheck still can't handle `#include FOO' (with `FOO' a - macro). - - */* Improve variable scopes. - */* Remove redundant initializations which get overwritten. - - * src/gxvalid/*: Comment out redundant code or guard it with - FT_DEBUG_LEVEL_TRACE. - -2013-07-30 Werner Lemberg - - [autofit] Introduce `writing systems'. - - This patch adds a new top level to the auto-hinter's script class - hierarchy. It defines `writing systems' which can contain multiple - scripts. - - For example, the `latin' writing system (in file `aflatin.c') is - able to support scripts like Latin, Cyrillic, Armenian, etc., which - can be handled similarly. - - Scripts are now named using four-letter OpenType tags. - - * src/autofit/aftypes.h (AF_ScriptClassRec): Move relevant members - to... - (AF_WritingSystemClassRec): This new structure. It holds pointers - to functions which can be shared among related scripts. - (AF_WritingSystem): New enumeration. - (AF_Script): Revised values using four-letter tags. - (AF_DEFINE_WRITING_SYSTEM_CLASS): New macro. - (AF_DEFINE_SCRIPT_CLASS): Updated. - - * src/autofit/afglobal.c (af_writing_system_classes): New global, - constant array. - (af_script_classes): Updated. - (af_face_globals_free): Updated. - Remove assertion. - (af_face_globals_get_metrics): Updated. - - * src/autofit/afglobal.h (AF_SCRIPT_FALLBACK) - [!AF_CONFIG_OPTION_CJK]: Handle this case. - - * src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph): - Updated. - - * src/autofit/afpic.c (autofit_module_class_pic_init): Updated; - initialize structures for both writing systems and scripts. - * src/autofit/afpic.h: Updated. - (AF_WRITING_SYSTEM_CLASSES_GET): New macro. - - * src/autofit/afcjk.c (af_cjk_writing_system_class): New writing - system. - (af_cjk_uniranges): Renamed to... - (af_hani_uniranges): This. - (af_cjk_script_class): Reduced and renamed to... - (af_hani_script_class): This. - * src/autofit/afcjk.h: Updated. - - * src/autofit/afdummy.c (af_dummy_writing_system_class): New writing - system. - (af_dummy_script_class): Reduced and renamed to... - (af_dflt_script_class): This. - * src/autofit/afdummy.h: Updated. - - * src/autofit/afindic.c (af_indic_writing_system_class): New writing - system. - (af_indic_uniranges): Renamed to... - (af_deva_uniranges): This. - (af_indic_script_class): Reduced and renamed to... - (af_deva_script_class): This. - * src/autofit/afcjk.h: Updated. - - * src/autofit/aflatin.c (af_latin_writing_system_class): New writing - system. - (af_latin_uniranges): Renamed to... - (af_latn_uniranges): This. - (af_latin_script_class): Reduced and renamed to... - (af_latn_script_class): This. - * src/autofit/aflatin.h: Updated. - - * src/autofit/aflatin2.c (af_latin2_writing_system_class): New - writing system. - (af_latin2_uniranges): Renamed to... - (af_ltn2_uniranges): This. - Synchronize ranges with `latin'. - (af_latin2_script_class): Reduced and renamed to... - (af_ltn2_script_class): This. - * src/autofit/aflatin2.h: Updated. - -2013-07-30 Werner Lemberg - - [autofit] Variable renaming. - - * src/autofit/aftypes.h (AF_ScriptMetricsRec): - s/clazz/script_class/. - Update all users. - -2013-07-30 suzuki toshiya - - Ignore libpng-config under cross-building configuration, - because it will return the flags for the hosting environment. - - * builds/unix/configure.raw: Ignore libpng-config when - `cross_compiling' == yes. - -2013-07-30 Behdad Esfahbod - - Prevent division by zero by a transparent color. - - * src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra): - Return 0 immediately, when alpha channel is zero. - -2013-07-25 Behdad Esfahbod - - Add FT_FACE_FLAG_COLOR and FT_HAS_COLOR. - - Also disambiguate Google's color bitmap tables. - - * include/freetype/freetype.h (FT_FACE_FLAG_COLOR, FT_HAS_COLOR): - New macros. - - * include/freetype/internal/tttypes.h (TT_SbitTableType): Add - TT_SBIT_TABLE_TYPE_CBLC. - - * src/sfnt/sfobjs.c (sfnt_load_face): Handle FT_FACE_FLAG_COLOR. - - * src/sfnt/ttsbit.c (tt_face_load_sbit, - tt_face_load_strike_metrics, tt_face_load_sbit_image): Handle - TT_SBIT_TABLE_TYPE_CBLC. - -2013-07-24 suzuki toshiya - - [sfnt] Fix for `make multi' target. - - * src/sfnt/pngshim.c (Load_SBit_Png): Use FT_LOCAL_DEF(). - -2013-07-20 Werner Lemberg - - * docs/INSTALL.GNU: Updated. - -2013-07-20 Behdad Esfahbod - - [sfnt] Fix `sbix' table version handling. - - * src/sfnt/ttsbit.c (tt_face_load_sbit) [TT_SBIT_TABLE_TYPE_SBIX]: - USHORT version numbers are to be considered as `minor'. - -2013-07-19 Werner Lemberg - - [autofit] Fix segment classification for blue zones. - - The old code (essentially unchanged since the very beginning) - incorrectly handled this configuration - - x -o- x - / \ - / \ - / \ - o o - - as flat and this - - o o - / / - x| x| - | | - o---------------o - - as round. (`o' and `x' are on and off points, respectively). - - This is a major change which should improve the rendering results - enormously for many TrueType fonts, especially in the range approx. - 20-40ppem, fixing the appearance of many overshoots. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Look at the - first and last points of the segment, not the points right before - and after. - -2013-07-19 Behdad Esfahbod - - [sfnt] `sbix' fix-ups. - - * src/sfnt/sfobjs.c (sfnt_load_face): Apple's `sbix' color bitmaps - are rendered scaled and then the `glyf' outline rendered on top. We - don't support that yet, so just ignore the `glyf' outline and - advertise it as a bitmap-only font. - - * src/sfnt/ttsbit.c (tt_face_load_strike_metrics) - [TT_SBIT_TABLE_TYPE_SBIX]: Return metrics in 26.6 units. - (tt_face_load_sbix_image): Typo. - -2013-07-18 Behdad Esfahbod - - [sfnt] Add support for Apple's `sbix' color bitmap table. - - * include/freetype/internal/tttypes.h (TT_SBit_MetricsRec): Widen - fields to FT_Short and FT_UShort, respectively. - (TT_SBitTableType): New enumeration. - (TT_FaceRec): Add `sbit_table_type' field. - - * include/freetype/tttags.h (TTAG_sbix): New macro. - - * src/sfnt/pngshim.c (Load_SBit_Png): Pass a more generic - FT_GlyphSlot argument instead FT_Bitmap. - Add flag to control map and metrics handling. - Update all users. - - * src/sfnt/ttsbit.c: Include `ttmtx.h'. - (tt_face_load_eblc): Renamed to... - (tt_face_load_sbit): This. - Handlic `sbix' bitmaps. - (tt_face_free_eblc): Renamed to... - (tt_face_load_sbit): This. - Updated. - (tt_face_load_strike_metrics): Handle `sbix' bitmaps. - (tt_face_load_sbix_image): New function. - (tt_sbit_decoder_alloc_bitmap, tt_sbit_decoder_load_image, - tt_sbit_decoder_load_byte_aligned, tt_sbit_decoder_load_bit_aligned, - tt_sbit_decoder_load_compound, tt_sbit_decoder_load_png, - tt_sbit_decoder_load_image, tt_sbit_decoder_load_bitmap): Don't pass - and handle load flags. - (tt_sbit_decoder_load_bitmap) [!FT_CONFIG_OPTION_USE_PNG]: Better - handle formats 17-19. - Move color to grayscale conversion to... - (tt_face_load_sbit_image): Here. - Handle `sbix' bitmaps. - - * src/sfnt/pngshim.h: Updated. - * src/sfnt/ttsbit.h: Updated. - * src/sfnt/sfdriver.c: Updated. - -2013-07-18 Werner Lemberg - - [sfnt] Ignore invalid magic number in `head' or `bhed'. - - Other font engines seem to ignore it also. Problem reported by - Hin-Tak Leung . - - * src/sfnt/ttload.c (check_table_dir): Don't abort but warn only if - we have an invalid magic number. - -2013-07-16 Werner Lemberg - - [smooth] Fix segfault caused by previous commit. - - * src/smooth/ftgrays.c (gray_set_cell): Always compute - `ras.invalid'. - -2013-07-16 David Turner - - [smooth] Improve performance. - - Provide a work-around for an ARM-specific performance bug in GCC. - This speeds up the rasterizer by more than 5%. - - Also slightly optimize `set_gray_cell' and `gray_record_cell' (which - also improves performance on other platforms by a tiny bit (<1%). - - * src/smooth/ftgrays.c (FT_DIV_MOD): New macro. - Use it where appropriate. - - (gray_record_cell, gray_set_cell, gray_move_to, - gray_convert_glyph_inner): Streamline condition handling. - -2013-07-16 David Turner - - [truetype] Add assembler code for TT_MulFix14 and TT_DotFix14. - - This patch provides slightly optimized versions for ARM, x86, and - x86_64 CPUs if built with GCC. - - Also remove some dead code. - - * src/truetype/ttinterp.c (TT_MulFix14_arm, TT_MulFix14_long_long, - TT_DotFix14_long_long): New functions. - -2013-07-16 David Turner - - Optimize FT_MulFix for x86_64 GCC builds. - - This patch provides an optimized `FT_MulFix' implementation for - x86_64 machines when FreeType is built with GCC, or compatible - compilers like Clang. - - Example: - bin/ftbench -p -t 5 -s 14 -f 0008 Arial.ttf - - Before: - - Load 4.863 us/op - Load_Advances (Normal) 4.816 us/op - Load_Advances (Fast) 0.028 us/op - Render 2.753 us/op - Get_Glyph 0.463 us/op - Get_CBox 0.077 us/op - Get_Char_Index 0.023 us/op - Iterate CMap 13.898 us/op - New_Face 12.368 us/op - Embolden 0.028 us/op - Get_BBox 0.302 us/op - - After: - - Load 4.617 us/op - Load_Advances (Normal) 4.645 us/op - Load_Advances (Fast) 0.027 us/op - Render 2.789 us/op - Get_Glyph 0.460 us/op - Get_CBox 0.077 us/op - Get_Char_Index 0.024 us/op - Iterate CMap 13.403 us/op - New_Face 12.278 us/op - Embolden 0.028 us/op - Get_BBox 0.301 us/op - - * builds/unix/ftconfig.in, include/freetype/config/ftconfig.h - (FT_MulFix_x86_64): New function. - -2013-07-16 David Turner - - Speed up ARMv7 support. - - When building for ARMv7 with thumb2 instructions, the optimized - `FT_MulFix_arm' assembly routine was not being used. - - The reason for this is in the `ftconfig.h' header, namely: - - - The assembly routine uses the `smull' instruction which is not - available when generating Thumb-1 machine code. It is available - in Thumb-2 mode, though. - - - The header was written a long time ago before Thumb-2 became - widely popular (e.g. with Android). So it simply doesn't use the - assembly routine if the `__thumb__' built-in macro is defined. - - - When compiling in Thumb-2 mode, the compiler will define both - `__thumb__' and `__thumb2__'. - - By checking for `(__thumb2__ || !__thumb__)', we ensure that the - assembly routine is only avoided when generating Thumb-1 code. - - Given that this is performance-sensitive function, this improves - `ftbench' as follows on a Galaxy Nexus: - - Before (us/op) After (us/op) - - - loading Arial.ttf glyphs at 14 ppem [1] - - Load 34.285 33.098 - - - same operation with the light auto-hinter [2] - - Load 31.317 29.590 - - - same operation without hinting [3] - - Load 6.143 5.376 - - - loading Arial.ttf advances at 14 ppem [4] - - Load_Advances (normal) 34.216 33.016 - Load_Advances (fast) 0.176 0.176 - - [1] ftbench -t 5 -p -s 14 -b a -f 0008 Arial.ttf - [2] ftbench -t 5 -p -s 14 -b a -r 1 -f 0028 Arial.ttf - [3] ftbench -t 5 -p -s 14 -b a -f 000a Arial.ttf - [4] ftbench -t 5 -p -s 14 -b b -f 0008 Arial.ttf - - * builds/unix/ftconfig.in, include/freetype/config/ftconfig.h - (FT_MULFIX_ASSEMBLER): Fix handling for ARMv7. - -2013-06-28 Werner Lemberg - - * docs/CHANGES: Updated. - -2013-06-27 Werner Lemberg - - * src/winfonts/winfnt.c (FNT_Load_Glyph): Fix bitmap width guard. - -2013-06-25 Werner Lemberg - - [cff] Add darkening limit to `darkening-parameters'. - - * src/cff/cffdrivr.c (cff_property_set): Add check. - -2013-06-25 Werner Lemberg - - [cff] Add `darkening-parameters' property. - - * include/freetype/ftcffdrv.h: Document it. - - * src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle - `darkening-parameters' property. - - * src/cff/cf2font.h (CF2_FontRec): Add `darkenParams' array. - - * src/cff/cf2font.c (cf2_computeDarkening): Add `darkenParams' - argument and use it. - Update all callers. - - * src/cff/cf2ft.c (cf2_decoder_parse_charstrings): Copy - `darken_params' values. - - * src/cff/cffobjs.h (CFF_DriverRec): Add `darken_params' array. - - * src/cff/cffobjs.c (cff_driver_init): Set default values for - `darken_params'. - -2013-06-25 Werner Lemberg - - [docmaker] Code shuffling. - - * src/tools/docmaker/tohtml.py (re_url): Move regexp... - * src/tools/docmaker/sources.py: ... to this file. - -2013-06-25 Werner Lemberg - - [docmaker] Remove unused functions. - - * src/tools/docmaker/content.py (DocMarkup.get_start, - DocBlock.get_markup_name): Removed. - * src/tools/docmaker/tohtml.py (html_quote0, dump_html_code, - HtmlFormatter.make_html_words): Removed. - -2013-06-25 Werner Lemberg - - * builds/freetype.mk (dll): Remove target. - - Problem reported by Jörg Günnewig . - -2013-06-25 Werner Lemberg - - [docmaker] Recognise URLs. - - * src/tools/docmaker/tohtml.py (re_url): New regular expression. - (make_html_para): Use it. - -2013-06-19 Werner Lemberg - - * Version 2.5.0.1 released. - =========================== - - - Tag sources with `VER-2-5-0-1'. - - * include/freetype/config/ftoption.h: Undefine - CFF_CONFIG_OPTION_OLD_ENGINE. - * devel/ftoption.h: Define CFF_CONFIG_OPTION_OLD_ENGINE. - -2013-06-19 Werner Lemberg - - * builds/unix/install.mk (install): Don't create `cache' directory. - - Found by Peter Breitenlohner . - -2013-06-19 Werner Lemberg - - * Version 2.5.0 released. - ========================= - - - Tag sources with `VER-2-5-0'. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.5.0. - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.4.12/2.5.0/, s/2412/250/. - - * include/freetype/freetype.h (FREETYPE_MINOR): Set to 5. - (FREETYPE_PATCH): Set to 0. - - * builds/unix/configure.raw (version_info): Set to 16:2:10. - - * src/base/ftobjs.c (FT_Open_Face): Pacify compiler. - * src/truetype/ttinterp.c (Ins_MSIRP, Ins_MIRP): Ditto. - -2013-06-18 Werner Lemberg - - Fix Savannah bug #39269. - - * src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Free memory in - case of reacollocation failures. - -2013-06-18 Andrew Church - - Fix Savannah bug #39266. - - If memory allocations fail at certain points while opening a font, - FreeType can either crash due to a NULL dereference or leak memory. - - * include/freetype/internal/ftobjs.c (FT_Face_InternalRec, - FT_LibraryRec): Make `refcount' a signed integer. If, for example, - FT_Open_Face() fails in a memory allocation before the face's - reference count is set to 1, a subsequent `FT_Done_Library' call - would otherwise loop over `FT_Done_Face' 2^32 times before freeing - the face. - - * src/base/ftobjs.c (open_face): Initialize `stream' and friends - earlier. - (FT_Open_Face) : Behave correctly if `node' is NULL. - (FT_Destroy_Module) : Check that `renderer_clazz' is valid. - -2013-06-14 Werner Lemberg - - * src/smooth/ftgrays.c One final pragma to silence 64-bit MSVC. - -2013-06-06 Dave Arnold - Werner Lemberg - - [cff] Add code to Adobe's engine to handle ppem > 2000. - - * src/cff/cffgload.c (cff_slot_load): If we get - FT_Err_Glyph_Too_Big, retry unhinted and scale up later on. - -2013-06-12 Werner Lemberg - - Another try on pragmas. - - * include/freetype/internal/ftdebug.h: Move pragmas to... - * include/freetype/internal/internal.h: ... this file since it gets - included by all source files. - * include/freetype/internal/ftserv.h: Remove pragma which has no - effect. - -2013-06-12 Werner Lemberg - - * include/freetype/internal/ftdebug.h: Disable MSVC warning C4127. - - This partially undoes commit 3f6e0e0c. - -2013-06-12 Werner Lemberg - - More compiler warning fixes. - - */*: Use cast to `FT_Bool' (or `Bool') where appropriate. - -2013-06-10 Werner Lemberg - - [truetype] Improve handling of broken sbit advance widths. - - * src/truetype/ttgload.c (TT_Load_Glyph): Use the glyph's (scaled) - `linearHoriAdvance' if the sbit's `horiAdvance' value is zero. - - Cf. font `Fixedsys Excelsior' v3.01 (FSEX300.ttf), glyph A, 16ppem. - -2013-06-10 Werner Lemberg - - [sfnt] Improve embedded bitmap tracing. - - * src/base/ftobjs.c (FT_Request_Size): Move trace message regarding - bitmap strike match to... - (FT_Match_Size): This function. - - * src/sfnt/ttsbit.c (tt_sbit_decoder_load_metrics, - tt_sbit_decoder_load_byte_aligned, tt_sbit_decoder_load_bit_aligned, - tt_sbit_decoder_load_compound, tt_sbit_decoder_load_png, - tt_sbit_decoder_load_image): Decorate with tracing messages. - -2013-06-10 Werner Lemberg - - Fix Savannah bug #39160. - - * src/truetype/ttinterp.c (Ins_SDPVTL): Set projection vector too - for the degenerate case. - -2013-06-09 David Turner - - * src/cache/ftcmanag.c (FTC_Manager_Reset): Add missing cache flush. - - This code, present since eight(!) years in the unused `CACHE' - branch, has been forgotten to apply to the master branch. It's - really amazing that noone has ever complained since - `FTC_Manager_Reset' is pretty useless without flushing the cache. - -2013-06-07 Werner Lemberg - - Add and improve pragmas for MSVC compiler. - - * include/freetype/internal/ftdebug.h: Remove pragmas. - * include/freetype/internal/ftserv.h: Use push and pop for pragmas. - * include/freetype/internal/ftvalid.h: Handle warning C4324. - * src/base/ftobjs.c: Use push and pop for pragmas. - * src/gzip/ftgzip.c: Handle warning C4244. - -2013-06-07 Werner Lemberg - - [cff] s/cf2_getGlyphWidth/cf2_getGlyphOutline/. - - * src/cff/cf2font.c, src/cff/cf2font.h, src/cff/cf2ft.c: Do it. - -2013-06-06 Dave Arnold - - [cff] Add early exit feature for width-only calls. - - This is for `FT_Get_Advance'. - - There are 7 places where the spec says the width can be defined: - - hstem/hstemhm - vstem/vstemhm - cntrmask/hintmask - hmoveto - vmoveto - rmoveto - endchar - - * src/cff/cf2intrp.c (cf2_doStems): Exit early for width-only calls, - if possible. - - (cf2_interpT2CharString) , , - , , , - , : Exit early for width-only calls. - -2013-06-06 Werner Lemberg - - Next round of compiler fixes. - - * builds/win32/ftdebug.c, builds/wince/ftdebug.c (ft_debug_init): - Add proper cast. - - * include/freetype/internal/ftserv.h (FT_SERVICE_UNAVAILABLE): Fix - cast. - * include/freetype/internal/ftstream.h: Decorate stream and frame - macros with `FT_Long' and `FT_ULong' as appropriate. - - * src/base/ftrfork.c (raccess_guess_darwin_hfsplus, - raccess_guess_darwin_newvfs): Use cast. - - * src/bdf/bdflib.c (_bdf_set_default_spacing): Use cast. - - * src/cache/ftcmanag.c (FTC_Manager_Check): Fix cast. - * src/cache/ftcmanag.h (FTC_ManagerRec): Ditto. - - * src/cff/cf2arrst.c (cf2_arrstack_setNum_Elements): Use cast. - * src/cff/cf2ft.c (cf2_freeSeacComponent): Ditto. - * src/cff/cffobjs.c (remove_subset_prefix, remove_style): Ditto. - - * src/cid/cidparse.c (cid_parser_new): Use cast. - - * src/pcf/pcfdrivr.c (PCF_Glyph_Load): Use cast. - - * src/psaux/psobjs.c (reallocate_t1_table): Fix argument type. - - * src/raster/ftraster.c (ft_black_reset): Use cast. - - * src/truetype/ttgxvar.c (FT_Stream_FTell): Use cast. - (ALL_POINTS): Fix cast. - - * src/type1/t1driver.c (t1_ps_get_font_value): Add casts. - * src/type1/t1parse.c (T1_Get_Private_Dict): Add cast. - -2013-06-05 Dave Arnold - - Fix more MSVC Win32 compiler warnings. - - * src/base/ftobjs.c: Fix typo in MS pragma. - - * src/base/bdflib.c (_bdf_set_default_spacing, _bdf_add_property): - `lineno' is only used in debug mode. - - * src/cff/cf2ft.c (cf2_builder_moveTo): `params' is only used in - debug mode. - -2013-06-05 Werner Lemberg - - Fix compiler warnings. - - * include/freetype/internal/ftmemory.h: Decorate memory allocation - macros with `FT_Long' where appropriate. - Remove duplicate of FT_MEM_QRENEW_ARRAY definition. - - * src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra): Use - cast. - - * src/base/ftobjs.c: Add warning disabling pragma for MSVC while - including `md5.c'. - - * src/cff/cf2intrp.c (cf2_interpT2CharString) : Add - cast. - - * src/sfnt/ttsbit.c (tt_sbit_decoder_load_compound): Fix casts. - (tt_sbit_decoder_load_bitmap): Beautification. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Initialize - variables (earlier). - - * src/truetype/ttgload.c (TT_Process_Simple_Glyph): Pacify compiler. - - * src/truetype/ttgxvar.c (TT_Get_MM_Var): Use unsigned constants - where appropriate. - - * src/type1/t1load.c (T1_Get_MM_Var): Ditto. - -2013-06-04 Werner Lemberg - - * src/cff/cf2font.c (cf2_getGlyphWidth): Initialize `advWidth'. - - Problem reported by Ingmar Sittl . - -2013-06-04 Werner Lemberg - - Apply fixes for cppcheck nitpicks. - - http://cppcheck.sourceforge.net/ - - The call was (from the top-level of the FreeType tree): - - cppcheck --force \ - --enable=all \ - -I include \ - -I include/freetype/ \ - -I include/freetype/config/ \ - -I include/freetype/internal/ \ - . &> cppcheck.log - - Note that the current version heavily chokes on FreeType, delivering - many wrong results. I will report those issues to the cppcheck team - so that a newer version gives improved results hopefully. - - */* Improve variable scopes. - */* Remove redundant initializations which get overwritten. - - * src/base/ftmac.c, builds/mac/ftmac.c (count_faces_scalable): - Remove unused variable. - - * src/base/ftdbgmem.c (ft_mem_table_destroy): `table' can't be zero. - - * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt1_entry_validate): - Remove functionless code. - - * src/tools/ftrandom.c (main): Fix memory leak. - -2013-06-03 Werner Lemberg - - Add CFF_CONFIG_OPTION_OLD_ENGINE configuration option. - - This controls whether the old FreeType CFF engine gets compiled into - FreeType. It is now disabled by default. - - * devel/ftoption.h, include/freetype/config/ftoption.h - (CFF_CONFIG_OPTION_OLD_ENGINE): New macro. - - * src/cff/cffdrivr.c (cff_property_set), src/cff/cffgload.c - (CFF_Operator, cff_argument_counts, cff_builder_add_point, - cff_operator_seac, cff_decoder_parse_charstrings, cff_slot_load), - src/cff/cffgload.h, src/cff/cffobjs.c (cff_driver_init): Use - CFF_CONFIG_OPTION_OLD_ENGINE to guard the affected code. - - * docs/CHANGES: Updated. - -2013-06-02 Werner Lemberg - - Fix PNG library handling. - - * builds/unix/configure.raw: Don't use LIBPNG_LIBS but - LIBPNG_LDFLAGS. - -2013-05-23 Behdad Esfahbod - - Add support for color embedded bitmaps (eg. color emoji). - - A new load flag, FT_LOAD_COLOR, makes FreeType load color - embedded-bitmaps, following this draft specification - - https://color-emoji.googlecode.com/git/specification/v1.html - - which defines two new SFNT tables, `CBDT' and `CBLC' (named and - modeled after `EBDT' and `EBLC', respectively). The color bitmaps - are stored in the new FT_PIXEL_MODE_BGRA format to represent BGRA - pre-multiplied sRGB images. If PNG support is available, PNG color - images as defined in the same proposed specification are supported - also. - - Note that color bitmaps are converted to grayscale if client didn't - ask for color. - - * builds/unix/configure.raw: Search for libpng. - Add `--without-png' option. - - * devel/ftoption.h, include/freetype/config/ftoption.h - (FT_CONFIG_OPTION_USE_PNG): New macro. - - * include/freetype/freetype.h (FT_LOAD_COLOR): New load flag. - - * include/freetype/ftimage.h (FT_Pixel_Mode): Add - `FT_PIXEL_MODE_BGRA'. - - * include/freetype/tttags.h (TTAG_CBDT, TTAG_CBLC): New tags. - - * src/base/ftbitmap.c (FT_Bitmap_Embolden): Updated. - (ft_gray_for_premultiplied_srgb_bgra): New function. - (FT_Bitmap_Convert): Handle FT_PIXEL_MODE_BGRA. - - * src/sfnt/pngshim.c, src/sfnt/pngshim.h: New files. - - * src/sfnt/sfnt.c: Include `pngshim.c'. - - * src/sfnt/ttsbit.c: Include FT_BITMAP_H and `pngshim.h' - (tt_face_load_eblc): Load `CBLC'. - (tt_sbit_decoder_init): Load `CBDT'. - (tt_sbit_decoder_alloc_bitmap): Pass load flags to select between - color and grayscale bitmaps. - Set `num_grays'. This is used by `ftview' to choose the blending - algorithm. - (tt_sbit_decoder_load_byte_aligned, - tt_sbit_decoder_load_bit_aligned, tt_sbit_decoder_load_compound, - tt_sbit_decoder_load_image): Pass load flag. - s/write/pwrite/. - Don't call `tt_sbit_decoder_alloc_bitmap'. - Updated. - (tt_sbit_decoder_load_png) [FT_CONFIG_OPTION_USE_PNG]: New function. - (tt_sbit_decoder_load_bitmap): Pass load flag. - Handle new glyph formats 17, 18, and 19. - Call `tt_sbit_decoder_alloc_bitmap'. - Flatten color bitmaps if necessary. - (tt_face_load_sbit_image): Updated. - - * src/sfnt/rules.mk (SFNT_DRV_SRC): Add `pngshim.c'. - - * docs/CHANGES: Updated. - -2013-05-24 Guenter - - Apply Savannah patch #8055. - - Make `apinames' create an import file for NetWare. - - * src/tools/apinames.c (PROGRAM_VERSION): Set to 0.2. - (OutputFormat): Add `OUTPUT_NETWARE_IMP'. - (names_dump): Handle it. - (usage): Updated. - (main): Handle new command line flag `-wN'. - -2013-05-23 Behdad Esfahbod - - Compilation fix. - - * src/truetype/ttinterp.c (TT_RunIns) - [!TT_CONFIG_OPTION_SUBPIXEL_HINTING]: Make it work. - -2013-05-22 Infinality - - [truetype] Formatting and an additional subpixel tweak. - - * src/truetype/ttinterp.c (Ins_SHPIX): Formatting fix. - * src/truetype/ttsubpix.c (SKIP_NONPIXEL_Y_MOVES_Rules): - Revert previous modification for Verdana clones. - -2013-05-22 Infinality - - [truetype] Adjust subpixel zp2 moves and tweak rules. - - These modifications fix thin diagonal stems in some legacy fonts. - - * src/truetype/ttinterp.c (Direct_Move_X): Remove unused macro. - (Move_Zp2_Point): Don't always disable x moves for subpixel rendering. - (Ins_SHP): Disable x moves here for subpixel rendering. - (Ins_SHPIX): Only disable x moves in compatibility mode. - Split out zp2 move reversals and reorder conditional respectively. - - * src/truetype/ttsubpix.c (SKIP_NONPIXEL_Y_MOVES_Rules): Fix oversight. - Only adjust Verdana clones for 17 ppem. - (SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions): Add Courier New. - (ALWAYS_SKIP_DELTAP_Rules): Found additional cases for Arial `s'. - -2013-05-20 Infinality - - [truetype] Simplify and improve subpixel function detection. - - Some small enhancements have allowed the removal of many macros and - the simplification of existing rules in `ttsubpix.c'. - - * src/truetype/ttsubpix.h (SPH_TWEAK_ALLOW_X_DMOVEX, - SPH_TWEAK_ALLOW_X_MOVE_ZP2, - SPH_TWEAK_DELTAP_SKIP_EXAGGERATED_VALUES, - SPH_TWEAK_SKIP_INLINE_DELTAS, SPH_TWEAK_MIRP_CVT_ZERO): Removed. - (SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP): New rule macro. - - * src/truetype/ttsubpix.c: Updated affected rules. - - * src/truetype/ttinterp.c (Direct_Move_X): Updated. - (INS_FDEF): Add additional function detection. - (INS_ENDF): Set runtime flag. - (Ins_CALL): Skip the call under certain conditions. - Remove bad code. - (Ins_LOOPCALL): Skip the call under certain conditions. - Remove bad code. - (Move_Zp2_Point): Updated. - (Ins_SHPIX): Updated. - Skip the move under some situations. - (Ins_MIAP): Improve conditions. - (Ins_MIRP): Updated. - (Ins_DELTAP): Skip move under certain conditions. - Simplify conditions. - (TT_RunIns): Updated. - Add code to handle new function detection. - Trace messages. - -2013-05-17 Werner Lemberg - - Update more FT_Err_XXX macros using FT_ERR and FT_THROW; - - * builds/amiga/src/base/ftsystem.c, builds/mac/ftmac.c, - builds/unix/ftsystem.c, builds/vms/ftsystem.c: Do it. - -2013-05-15 Werner Lemberg - - [truetype] Add `interpreter-version' property. - - This makes the option TT_CONFIG_OPTION_SUBPIXEL_HINTING controllable - at runtime. - - * include/freetype/ftttdrv.h: New file. - - * include/freetype/config/ftheader.h (FT_TRUETYPE_DRIVER_H): New - macro. - - * src/truetype/ttdriver.c: Include FT_TRUETYPE_DRIVER_H. - (tt_property_set, tt_property_get): Fill templates. - - * src/truetype/ttobjs.h (TT_DriverRec): Add `interpreter_version' - member. - Remove unused `extension_component' member. - - * src/truetype/ttgload.c: Include FT_TRUETYPE_DRIVER_H. - (tt_get_metrics, TT_Hint_Glyph, TT_Process_Simple_Glyph, - compute_glyph_metrics, tt_loader_init): Use `interpreter_version'. - - * src/truetype/ttinterp.c: Include FT_TRUETYPE_DRIVER_H. - (SUBPIXEL_HINTING): New macro to check `interpreter_version' flag. - Update all affected functions to use it. - Use TT_INTERPRETER_VERSION_XXX where appropriate. - - * src/truetype/ttobjs.c: Include FT_TRUETYPE_DRIVER_H. - (tt_driver_init): Initialize `interpreter_version'. - - * src/truetype/ttsubpix.c: Include FT_TRUETYPE_DRIVER_H. - Use TT_INTERPRETER_VERSION_XXX where appropriate. - -2013-05-13 Werner Lemberg - - [truetype] Avoid empty source file. - - * src/truetype/ttsubpix.c [!TT_CONFIG_OPTION_SUBPIXEL_HINTING]: - Provide dummy typedef. - -2013-05-13 Werner Lemberg - - * src/cff/cf2font.c (cf2_getGlyphWidth): Fix uninitialized variable. - - Fix suggested by Vaibhav Nagarnaik . - -2013-05-13 Brian Nixon - - Fix Savannah bug #38970. - - * src/base/ftdebug.c, builds/win32/ftdebug.c, - builds/wince/ftdebug.c, builds/amiga/src/base/ftdebug.c - (ft_debug_init): Don't read past the environment variable FT2_DEBUG. - -2013-05-12 Werner Lemberg - - [truetype] Add framework for TrueType properties. - - * src/truetype/ttdrivr.c: Include FT_SERVICE_PROPERTIES_H. - (tt_property_set, tt_property_get): New functions, still empty. - Define `tt_service_properties' service. - Update `tt_services'. - - * src/truetype/ttpic.h: Include FT_SERVICE_PROPERTIES_H. - (TT_SERVICE_PROPERTIES_GET): New macro. - (TTModulePIC): Add `tt_service_properties'. - -2013-05-12 Werner Lemberg - - Fix Savannah bug #38967. - - * src/base/ftcalc.c (FT_DivFix) [FT_LONG64]: Fix cast. - -2013-05-12 Werner Lemberg - - Introduce unsigned 64bit type (if available). - - * include/freetype/config/ftconfig.h: Define FT_UINT64 if available. - [FT_LONG64]: Provide FT_UInt64. - - * builds/unix/ftconfig.in: Synchronized. - -2013-05-12 Werner Lemberg - - Fix Savannah bug #38968. - - * include/freetype/ftmodapi.h: Add `FT_EXPORT' to - FT_Property_{Set,Get}. - * src/base/ftobjs.c: Add `FT_EXPORT_DEF' to - FT_Property_{Set,Get}. - -2013-05-10 Werner Lemberg - - [sfnt] Clean up bitmap code. - - * src/sfnt/ttsbit.c: Deleted. - * src/sfnt/ttsbit0.c: Renamed to `ttsbit.c'. - * rules.mk (SFNT_DRV_H): Updated. - -2013-05-10 Werner Lemberg - - */* [FT_CONFIG_OPTION_OLD_INTERNALS]: Remove macro and guarded code. - ----------------------------------------------------------------------------- - -Copyright 2013-2015 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. - - -Local Variables: -version-control: never -coding: utf-8 -End: diff --git a/3party/freetype/ChangeLog.20 b/3party/freetype/ChangeLog.20 deleted file mode 100644 index 6dae58ea7d..0000000000 --- a/3party/freetype/ChangeLog.20 +++ /dev/null @@ -1,2613 +0,0 @@ -2002-02-09 Werner Lemberg - - * README: Fix typo. - * docs/CHANGES: Minor fixes. - - - * Version 2.0.8 released. - ========================= - - -2002-02-08 David Turner - - * docs/CHANGES: Updating for 2.0.8. - - * include/freetype/freetype.h: Setting `PATCH_LEVEL' to 8 and - removing `FT_Get_Next_Char' from the API (temporarily). - - * include/freetype/freetype.h: Adding comments to FT_Get_Next_Char; - note that this function might temporarily be removed for the 2.0.8 - release. - -2002-02-07 David Turner - - * src/pcf/pcfread.c (pcf_load_font): Removed immature support of - the AVERAGE_WIDTH property. - -2002-02-06 David Turner - - * src/sfnt/sfobjs.c (SFNT_Load_Face): Since many fonts embedded in - PDF documents do not include 'cmap', 'post' and 'name' tables, the - SFNT face loader has been changed to not immediately report an - error if these are not present. - - Note that the specification _requires_ these tables, but Adobe - seems to ignore it completely. - - * src/sfnt/ttcmap.c: Removing compiler warnings. - - * src/pcf/pcfread.c (pcf_read_TOC): Use FT_UInt. - (pcf_parse_metric, pcf_parse_compressed_metric): Removed. Code - is now in ... - (pcf_get_metric): Here. - (pcfSeekToType): Renamed to ... - (pcf_seek_to_table_type): This. - Use FT_Int. - (pcfHasType): Renamed to ... - (pcf_has_table_type): This. - Use FT_Int. - (find_property): Renamed to ... - (pcf_find_property): This. - Use FT_Int. - (pcf_get_bitmaps, pcf_get_encodings): Handle invalid PCF fonts - better (delaying format checks out of FT_Access_Frame .. - FT_Forget_Frame blocks to avoid leaving the stream in an incorrect - state when encountering an invalid PCF font). - - * src/pcf/pcfdriver.c (PCF_Done_Face): Renamed to ... - (PCF_Face_Done): This. - (PCF_Init_Face): Renamed to ... - (PCF_Face_Init): This. - (PCF_Get_Char_Index): Renamed to ... - (PCF_Char_Get_Index): This. - (PCF_Get_Next_Char): Renamed to ... - (PCF_Char_Get_Next): This. - (pcf_driver_class): Updated. - - * src/pcf/pcf.h (PCF_Done_Face): Removed. - -2002-02-06 Detlef Würkner - - * src/pcf/pcfdriver.c (FT_Done_Face): Fixed small memory leak. - - * src/pcf/pcfread.c (pcf_load_font): Now handles the `AVERAGE_WIDTH' - property to return correct character pixel (width/height) pairs for - embedded bitmaps. - -2002-02-04 Keith Packard - - Adding the function `FT_Get_Next_Char', doing the obvious thing - w.r.t. the selected charmap. - - * include/freetype/freetype.h: Add prototype. - * include/freetype/internal/ftdriver.h: Add `FTDriver_getNextChar' - typedef. - (FT_Driver_Class): Use it. - * include/freetype/internal/psnames.h: Add `PS_Next_Unicode_Func' - typedef. - (PSNames_Interface): Use it. - * include/freetype/internal/tttypes.h: Add `TT_CharNext_Func' - typedef. - (TT_CMapTable): Use it. - - * src/base/ftobjs.c (FT_Get_Next_Char): New function, implementing - high-level API. - * src/cff/cffdrivr.c (cff_get_next_char): New function. - (cff_driver_class): Add it. - * src/cid/cidriver.c (Cid_Get_Next_Char): New function. - (t1cid_driver_class): Add it. - * src/pcf/pcfdriver.c (PCF_Get_Next_Char): New function. - (pcf_driver_class): Add it. - * src/psnames/psmodule.c (PS_Next_Unicode): New function. - (psnames_interface): Add it. - * src/sfnt/ttcmap.c (code_to_next0, code_to_next2, code_to_next4, - code_to_next6, code_to_next_8_12, code_to_next_10): New auxiliary - functions. - (TT_CharMap_Load): Use them. - * src/truetype/ttdriver.c (Get_Next_Char): New function. - (tt_driver_class): Add it. - * src/type1/t1driver.c (Get_Next_Char): New function. - (t1_driver_class): Add it. - * src/winfonts/winfnt.c (FNT_Get_Next_Char): New function. - (winfnt_driver_class): Add it. - - * src/pcf/pcfread.c (pcf_load_font): For now, report Unicode for - Unicode and Latin 1 encodings. - -2002-02-02 Keith Packard - - * builds/unix/freetype-config.in: Add missing `fi'. - - - * Version 2.0.7 released. - ========================= - - -2002-02-01 David Turner - - * include/freetype/freetype.h: Increasing FREETYPE_PATCH to 7 - for the new release. - -2002-01-31 David Turner - - * README, README.UNX, docs/CHANGES: Updating documentation for the - 2.0.7 release. - -2002-01-30 David Turner - - * INSTALL: Moved to ... - * docs/INSTALL: Here to avoid conflicts with the `install' script on - Windows, where the filesystem doesn't preserve case. - -2002-01-29 David Turner - - * configure: Fixed the script. It previously didn't accept more - than one argument correctly. For example, when typing: - - ./configure --disable-shared --disable-nls - - the `--disable-nls' was incorrectly sent to the `make' program. - -2002-01-29 Werner Lemberg - - * README.UNX: Fix typo. - * builds/unix/install.mk (uninstall): Fix library name for libtool. - -2002-01-28 Francesco Zappa Nardelli - - * src/pcf/pcfdriver.c (PCF_Done_Face): Fix incorrect destruction of - the face object (face->toc.tables, face->root.family_name, - face->root.available_size, face->charset_encoding, - face->charset_registry are now freed). Thanks to Niels Moseley. - -2002-01-28 Roberto Alameda - - * src/type1/t1load.c (parse_encoding): Set `loader->num_chars'. - -2002-01-28 Werner Lemberg - - * src/type1/t1load.c (parse_subrs, parse_charstrings): Use copy - of `base' string for decrypting to not modify the original data. - Based on a patch by Jakub Bogusz . - -2002-01-27 Giuliano Pochini - - * src/smooth/ftgrays.c (gray_render_scanline): Fix bug which caused - bad rendering of thin lines (less than one pixel thick). - -2002-01-25 Werner Lemberg - - * src/cff/cffdrivr.c (cff_get_name_index): Make last patch work - actually. - -2002-01-25 Martin Zinser - - * src/cache/ftccache.c (ftc_node_done, ftc_node_destroy): Fix - compilation warnings. - * src/base/descrip.mms (OBJS): Add `ftmm.obj'. - * src/cache/descrip.mms (ftcache.obj): Dependencies added. - -2002-01-25 WANG Yi - - * src/cff/cffdrivr.c (cff_get_name_index): Fix deallocation bug. - -2002-01-21 Antoine Leca - - * docs/PATENTS: Typo fixed (thanks to Detlef `Hawkeye' Würkner) in - the URL for the online resource. - -2002-01-18 Ian Brown - - * builds/win32/ftdebug.c: New file. - * builds/win32/visualc/freetype.dsp: Updated. - -2002-01-18 Detlef Würkner - - * builds/amiga/src/base/ftsystem.c: Updated for AmigaOS 3.9. - * builds/amiga/README: Updated. - -2002-01-18 Ian Brown - - * builds/win32/visualc/freetype.dsp: Updated. - -2002-01-13 Werner Lemberg - - * builds/unix/freetype2.a4: The script was still buggy. - * builds/unix/freetype-config.in: Make it really work for any install - prefix. - -2002-01-10 Werner Lemberg - - * builds/unix/freetype2.a4: Fix some serious bugs. - -2002-01-09 David Turner - - * builds/unix/configure.ac: Build top-level Jamfile. - -2002-01-09 Maxim Shemanarev - - * src/smooth/ftgrays.c (gray_render_line): Small optimization to - the smooth anti-aliased renderer that deals with vertical segments. - This results in a 5-7% speedup in rendering speed. - -2002-01-08 David Turner - - Added some wrapper scripts to make the installation more - Unix-friendly. - - * configure, install: New files. - - * INSTALL, README.UNX: Updated installation documentation to use the - new 'configure' and 'install' scripts. - -2002-01-07 David Turner - - - * Version 2.0.6 released. - ========================= - - - * docs/BUGS, docs/CHANGES: Updating documentation for 2.0.6 release. - - * src/tools/docmaker.py: Fixed HTML quoting in sources. - (html_format): Replaced with ... - (html_quote): New function. - (html_quote0): New function. - (DocCode::dump_html): Small improvement. - (DocParagraph::dump, DocBlock::html): Use html_quote0 and html_quote. - - * include/freetype/config/ftoption.h: Setting default options for - a release build (debugging off, bytecode interpreter off). - - * src/base/ftobjs.c, src/base/ftoutln.c, src/cache/ftccmap.c, - src/cff/cffload.c, src/cff/cffobjs.c, src/pshinter/pshalgo2.c, - src/sfnt/ttload.c, src/sfnt/ttsbit.c: Removing small compiler - warnings (in pedantic compilation modes). - -2002-01-05 David Turner - - * src/autohint/ahhint.c (ah_align_linked_edge): Modified computation - of auto-hinted stem widths; this avoids color fringes in - `ClearType-like' rendering. - - * src/truetype/ttgload.c (TT_Load_Glyph_Header, - TT_Load_Simple_Glyph, TT_Load_Composite_Glyph, load_truetype_glyph): - Modified the TrueType loader to make it more paranoid; this avoids - nasty buffer overflows in the case of invalid glyph data (as - encountered in the output of some buggy font converters). - -2002-01-04 David Turner - - * README.UNX: Added special README file for Unix users. - - * builds/unix/ftsystem.c (FT_New_Stream): Fixed typo. - - * src/base/ftobjs.c: Added #include FT_OUTLINE_H to get rid - of compiler warnings. - - * src/base/ftoutln.c (FT_Outline_Check): Remove compiler warning. - -2002-01-03 Werner Lemberg - - * src/type1/t1objs.c (T1_Face_Init): Add cast to avoid compiler - warning. - -2002-01-03 Keith Packard - - * builds/unix/ftsystem.c (FT_New_Stream): Added a fix to ensure that - all FreeType input streams are closed in child processes of a `fork' - on Unix systems. This is important to avoid (potential) access - control issues. - -2002-01-03 David Turner - - * src/type1/t1objs.c (T1_Face_Init): Fixed a bug that crashed the - library when dealing with certain weird fonts like `Stalingrad', in - `sadn.pfb' (this font has no full font name entry). - - * src/base/ftoutln.c, include/freetype/ftoutln.h (FT_Outline_Check): - New function to check the consistency of outline data. - - * src/base/ftobjs.c (FT_Load_Glyph): Use `FT_Outline_Check' to - ensure that loaded glyphs are valid. This allows certain fonts like - `tt1095m_.ttf' to be loaded even though it appears they contain - really funky glyphs. - - There still is a bug there, though. - - * src/truetype/ttgload.c (load_truetype_glyph): Fix error condition. - -2001-12-30 David Turner - - * src/autohint/ahhint.c (ah_hinter_load): Fix advance width - computation of auto-hinted glyphs. This noticeably improves the - spacing of letters in KDE and Gnome. - -2001-12-25 Antoine Leca - - * builds/dos/detect.mk: Correcting the order for Borland compilers: - 16-bit bcc was never selected, always overridden by 32-bit bcc32. - -2001-12-22 Francesco Zappa Nardelli - - * src/pfc/pcfread.c (pcf_load_font): Handle property `POINT_SIZE' - and fix incorrect computation of `available_sizes'. - -2001-12-22 David Turner - - * src/autohint/ahhint.c (ah_hinter_load): Auto-hinted glyphs had an - incorrect glyph advance in the case of mono-width fonts (like - Courier, Andale Mono, and others). - -2001-12-22 Detlef Würkner - - * builds/amiga/*: Adaptations to latest changes. - Support added for MorphOS. - -2001-12-22 Werner Lemberg - - * src/pshinter/pshrec.c (FT_COMPONENT): Redefine to `trace_pshrec'. - (ps_mask_table_merge, ps_hints_open, ps_hints_stem, - ps_hints_t1stem3, ps_hints_t2mask, ps_hints_t2counter): Fix - FT_ERROR messages. - * src/pshinter/pshalgo1.c (FT_COMPONENT): Define as - `trace_pshalgo1'. - * src/pshinter/pshalgo2.c (FT_COMPONENT): Define as - `trace_pshalgo2'. - * include/freetype/internal/ftdebug.h (FT_Trace): Updated. - - * docs/modules.txt: New file. - -2001-12-21 David Turner - - * src/pshinter/pshrec.c (ps_hints_t2mask, ps_hints_t2counter): - Ignore invalid `hintmask' and `cntrmask' operators (instead of - returning an error). Glyph 2028 of the CFF font `MSung-Light-Acro' - couldn't be rendered otherwise (it seems its charstring is buggy, - though this requires more analysis). - (FT_COMPONENT): Define. - - * src/cff/cffgload.c (CFF_Parse_CharStrings), src/psaux/t1decode.c - (T1_Decoder_Parse_Charstrings), src/pshinter/pshalgo2.c (*), Fixed a - bug where the X and Y axis where inverted in the postscript hinter. - This caused problem when displaying on non-square surfaces. - - * src/pshinter/pshalgo2.c: s/vertical/dimension/. - - * src/pshinter/pshglob.c (psh_globals_new): Replaced a floating - point constant with a fixed-float equivalent. For some reasons not - all compilers are capable of directly computing a floating pointer - constant casted to FT_Fixed, and will link a math library instead. - -2001-12-20 Werner Lemberg - - * src/cache/ftccache.c (ftc_node_destroy, ftc_cache_lookup): Fix - tracing strings. - * src/cache/ftccmap.c (ftc_cmap_family_init): Ditto. - * src/cache/ftcmanag.c (ftc_family_table_alloc, - ftc_family_table_free, FTC_Manager_Check): Ditto. - * src/cache/ftcsbits.c (ftc_sbit_node_load): Ditto. - - * src/base/ftobjs.c (FT_Done_Library): Remove compiler warning. - -2001-12-20 David Turner - - Added PostScript hinter support to the CFF and CID drivers. - - * include/freetype/internal/cfftypes.h (CFF_Font): New member - `pshinter'. - * src/cff/cffload.c (CFF_Get_Standard_Encoding): New function. - * src/cff/cffload.h: Updated. - * src/cff/cffgload.c (CFF_Init_Builder): Renamed to ... - (CFF_Builder_Init): This. - Added new argument `hinting'. - (CFF_Done_Builder): Renamed to ... - (CFF_Builder_Done): This. - (CFF_Init_Decoder): Added new argument `hinting'. - (CFF_Parse_CharStrings): Implement vstem support. - (CFF_Load_Glyph): Updated. - Add hinting support. - (cff_lookup_glyph_by_stdcharcode): Use CFF_Get_Standard_Encoding(). - (cff_argument_counts): Updated. - * src/cff/cffgload.h: Updated. - * src/cff/cffobjs.c: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. - (CFF_Size_Get_Globals_Funcs, CFF_Size_Done, CFF_Size_Init, - CFF_Size_Reset, CFF_GlyphSlot_Done, CFF_GLyphSlot_Init): New - functions. - (CFF_Init_Face): Renamed to ... - (CFF_Face_Init): This. - Add hinter support. - (CFF_Done_Face): Renamed to ... - (CFF_Face_Done): This. - (CFF_Init_Driver): Renamed to ... - (CFF_Driver_Init): This. - (CFF_Done_Driver): Renamed to ... - (CFF_Driver_Done): This. - * src/cff/cffobjs.h: Updated. - * src/cff/cffdrivr.c (cff_driver_class): Updated. - - * include/freetype/internal/t1types.h (CID_FaceRec): New member - `pshinter'. - * src/cid/cidgload.c (CID_Load_Glyph): Add hinter support. - * src/cid/cidobjs.c: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. - (CID_GlyphSlot_Done, CID_GlyphSlot_Init, CID_Size_Get_Globals_Funcs, - CID_Size_Done, CID_Size_Init, CID_Size_Reset): New functions. - (CID_Done_Face): Renamed to ... - (CID_Face_Done): This. - (CID_Init_Face): Renamed to ... - (CID_Face_Init): This. - Add hinting support. - (CID_Init_Driver): Renamed to ... - (CID_Driver_Init): This. - (CID_Done_Driver): Renamed to ... - (CID_Driver_Done): This. - * src/cid/cidobjs.h: Updated. - * src/cidriver.c: Updated. - - * src/pshinter/pshrec.c (t2_hint_stems): Fixed. - - * src/base/ftobjs.c (FT_Done_Library): Fixed a stupid bug that - crashed the library on exit. - - * src/type1/t1gload.c (T1_Load_Glyph): Enable font matrix - transformation of hinted glyphs. - - * src/cid/cidload.c (cid_read_subrs): Fix error condition. - - * src/cid/cidobjs.c (CID_Face_Done): Fixed a memory leak; the subrs - routines were never released when CID faces were destroyed. - - * src/cff/cffload.h, src/cff/cffload.c, src/cff/cffgload.c: Updated - to move the definition of encoding tables back within `cffload.c' - instead of making them part of a shared header (causing problems in - `multi' builds). This reverts change 2001-08-08. - - * docs/CHANGES: Updated for 2.0.6 release. - * docs/TODO: Added `stem3 and counter hints support' to the TODO - list for the Postscript hinter. - * docs/BUGS: Closed the AUTOHINT-NO-SBITS bug. - -2001-12-19 David Turner - - * include/freetype/cache/ftcache.h: Added comments to indicate that - some of the exported functions should only be used by applications - that need to implement custom cache types. - - * src/truetype/ttgload.c (cur_to_org, org_to_cur): Fixed a nasty bug - that prevented composites from loading correctly, due to missing - parentheses around macro parameters. - - * src/sfnt/sfobjs.c (SFNT_Load_Face): Make the `post' and `name' - tables optional to load PCL fonts properly. - - * src/truetype/ttgload.c (TT_Load_Glyph), src/base/ftobjs.c - (FT_Load_Glyph), include/freetype/freetype.h (FT_LOAD_SBITS_ONLY): - `Fixed' the bug that prevented embedded bitmaps to be loaded when - the auto-hinter is used. This actually is a hack but will be enough - until the internal re-design scheduled for FreeType 2.1. - - * src/raster/ftrend1.c (ft_raster1_render): Fixed a nasty outline - shifting bug in the monochrome renderer. - - * README: Updated version numbers to 2.0.6. - -2001-12-17 Werner Lemberg - - * src/truetype/ttgload.c (load_truetype_glyph): Fix test for invalid - glyph header. - -2001-12-15 Werner Lemberg - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Remove compiler warning. - * include/freetype/ftcache.h (FTC_Node_Unref): Removed. It is - already in ftcmanag.h. - * src/cache/ftcsbits.c (ftc_sbit_node_load): Remove unused variable - `gfam'. - * src/cache/ftcmanag.c (ftc_family_table_alloc, - * ftc_family_table_free): Use FT_EXPORT_DEF. - * include/freetype/cache/ftcmanag.h: Updated. - * src/cache/ftccache.c (ftc_node_destroy): Use FT_EXPORT_DEF. - * src/cache/ftccmap.c (ftc_cmap_node_init): Remove unused variable - `cfam'. - Remove compiler warning. - (FTC_CMapCache_Lookup): Remove compiler warnings. - (ftc_cmap_family_init): Ditto. - (FTC_CMapCache_Lookup): Ditto. - - * builds/unix/configure.ac: Increase `version_info' to 8:0:2. - * builds/unix/configure: Regenerated. - -2001-12-14 Werner Lemberg - - * builds/mac/README: Updated. - -2001-12-14 Scott Long - - * src/truetype/ttgload.c (load_truetype_glyph): Fixing crash when - dealing with invalid fonts (i.e. glyph size < 10 bytes). - -2001-12-14 Sam Latinga - - * builds/mac/freetype.make: A new Makefile to build with MPW on - MacOS classic. - -2001-12-14 David Turner - - * src/truetype/ttgload.c (TT_Load_Glyph), src/type1/t1gload.c - (T1_Load_Glyph), src/cid/cidgload.c (CID_Load_Glyph), - src/cff/cffgload.c (CFF_Load_Glyph): Fixed a serious bug common to - all font drivers (the advance width was never hinted when it - should). - - * include/freetype/freetype.h (FREETYPE_PATCH): New macro. - * src/base/ftdbgmem.c (debug_mem_dummy) [!FT_DEBUG_MEMORY]: Don't - use `extern' keyword. - -2001-12-12 David Turner - - * src/pshinter/pshglob.c (psh_blues_scale_zones, psh_blues_snap_stem - psh_globals_new): Adding correct BlueScale/BlueShift support, plus - family blues processing. - * src/pshinter/pshglob.h (PSH_BluesRec): Updated. - - Started adding support for the Postscript hinter in the CFF module. - - * src/cff/cffgload.c: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. - (CFF_Parse_CharStrings): Implement it. - * src/cff/cffgload.h: Updated. - -2001-12-12 Werner Lemberg - - * builds/unix/freetype2.m4: Some portability fixes. - -2001-12-11 Jouk Jansen - - * src/base/descrip.mms (OBJS): Add ftdebug.obj. - -2001-12-11 Werner Lemberg - - * src/sfnt/ttload.c (TT_Load_Generic_Header): Typos. - -2001-12-11 David Turner - - * builds/unix/freetype-config.in: Modified the script to prevent - passing `-L/usr/lib' to gcc. - - * docs/FTL.TXT: Simple fix (change `LICENSE.TXT' to `FTL.TXT'). - - * builds/unix/freetype2.m4: New file for checking configure paths. - We need to install it in $(prefix)/share/aclocal/freetype2.m4 but I - didn't modify builds/unix/install.mk yet. - - * INSTALL: Updated the instructions to build shared libraries with - Jam. They were simply wrong. - - * src/base/fttrigon.c (FT_Cos): Fixed a small bug that caused - slightly improper results for `FT_Cos' and `FT_Sin' (example: - FT_Sin(0) == -1!). - -2001-12-11 Detlef Würkner - - * include/freetype/internal/ftstream.h (GET_LongLE, GET_ULongLE): - Fixed incorrect argument types. - -2001-12-10 Francesco Zappa Nardelli - - * src/pcf/pcfdriver.c (PCF_Init_Face): Allow Xft to use PCF fonts - by setting the `face->metrics.max_advance' correctly. - -2001-12-07 David Turner - - * include/freetype/cache/ftccmap.h, src/cache/ftccmap.c: Added new - charmap cache. - * src/cache/ftcache.c: Updated. - - * src/autohint/ahhint.c (ah_hinter_hint_edges): s/UNUSED/FT_UNUSED/. - -2001-12-06 Leonard Rosenthol - - Added support for reading .dfont files on Mac OS X. Also added a - new routine which looks up a given font by name in the Mac OS and - returns the disk file where it resides. - - * src/base/ftmac.c: Include and . - (is_dfont): New auxiliary function. - (FT_New_Face_From_dfont): New function. - (FT_GetFile_From_Mac_Name): New exported function. - (FT_New_Face): Updated. - * include/freetype/ftmac.h: Updated. - -2001-12-06 David Turner - - * src/cache/Jamfile, src/cache/rules.mk: Updated. - -2001-12-06 Werner Lemberg - - * INSTALL: Small update. - -2001-12-05 David Turner - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Re-ordered code for - debugging purposes. - Comment out use of `origin'. - - * src/smooth/ftsmooth.c (ft_smooth_render): Fixed a nasty hidden bug - where outline shifting wasn't correctly undone after bitmap - rasterization. This created problems with certain glyphs (like '"' - of certain fonts) and the cache system. - - * src/pshinter/pshalgo1.c (psh1_hint_table_init): Fix typo. - * src/pshinter/pshalgo2.c (psh2_hint_table_init): Fix typo. - (ps2_hints_apply): Small fix. - -2001-12-05 David Turner - - * src/pshinter/pshalgo2.c (psh2_hint_table_init), - src/pshinter/pshalgo1.c (psh1_hint_table_init): Removed compiler - warnings. - - * include/freetype/ftcache.h, include/freetype/cache/*, src/cache/*: - Yet another massive rewrite of the caching sub-system in order to - both increase performance and allow simpler cache sub-classing. As - an example, the code for the image and sbit caches is now much - simpler. - - I still need to update the documentation in - www/freetype2/docs/cache.html to reflect the new design though. - - * include/freetype/config/ftheader.h (FT_CACHE_CHARMAP_H): New - macro. - (FT_CACHE_INTERNAL_CACHE_H): Updated. - -2001-12-05 David Krause - - * docs/license.txt: s/X Windows/X Window System/. - -2001-12-04 Werner Lemberg - - * src/raster/ftraster.c: Fix definition condition of MEM_Set(). - * src/smooth/ftgrays.c (M_Y): Change value to 192. - * src/base/ftdbgmem.c (ft_mem_table_destroy): Fix printf() parameter. - Remove unused variable. - * src/cache/ftcimage.c (ftc_image_node_init, - ftc_image_node_compare): Remove unused variables. - * src/cache/ftcsbits.c (ftc_sbit_node_weight): Remove unused - variable. - * src/raster/ftraster.c (MEM_Set): Move definition down to avoid - compiler warning. - * src/autohint/ahhint.c (ah_hinter_hint_edges): Use UNUSED() to - avoid compiler warnings. - * src/pcf/pcfread.c (tableNames): Use `const'. - (pcf_read_TOC): Change counter name to avoid compiler warning. - Use `const'. - * src/pshinter/pshrec.c (ps_hints_close): Remove redundant - declaration. - * src/pshinter/pshalgo1.c (psh1_hint_table_init): Rename variables - to avoid shadowing. - * src/pshinter/pshalgo2.c (psh2_hint_table_activate_mask): Ditto. - * src/type1/t1objs.h: Remove double declarations of `T1_Size_Init()' - and `T1_Size_Done()'. - -2001-11-20 Antoine Leca - - * include/freetype/ttnameid.h: Added some new Microsoft language - codes and LCIDs as found in MSDN (Passport SDK). Also added - comments about the meaning of bit 57 of the `OS/2' table - (TT_UCR_SURROGATES) which (with OpenType v.1.3) now means `there is - a character beyond 0xFFFF in this font'. Thanks to Detlef Würkner - for noticing this. - -2001-11-20 David Turner - - * src/pshinter/{pshalgo2.c, pshalgo1.c}: Fixed stupid bug in sorting - routine that created nasty alignment artefacts. - - * src/pshinter/pshrec.c, tests/gview.c: Debugging updates. - - * src/smooth/ftgrays.c: De-activated experimental gamma support. - Apparently, `optimal' gamma tables depend on the monitor type, - resolution and general karma, so it's better to compute them outside - of the rasterizer itself. - (gray_convert_glyph): Use `volatile' keyword. - -2001-10-29 David Turner - - Adding experimental `gamma' support. This produces smoother glyphs - at small sizes for very little cost. - - * src/smooth/ftgrays.c (grays_init_gamma): New function. - (gray_raster_new): Use it. - - Various fixes to the auto-hinter. They merely improve the output of - sans-serif fonts. Note that there are still problems with serifed - fonts and composites (accented characters). - - * src/autohint/ahglyph.c (ah_outline_load, - ah_outline_link_segments): Implement it. - Fix typos. - (ah_outline_save, ah_outline_compute_segments): Fix typos. - * src/autohint/ahhint.c (ah_align_serif_edge): New argument - `vertical'. Implement improvement. - (ah_hint_edges_3, ah_hinter_hint_edges): Implement it. - Fix typos. - (ah_hinter_align_strong_points, ah_hinter_align_weak_points): Fix - typos. - (ah_hinter_load): Set `ah_debug_hinter' if DEBUG_HINTER is defined. - * src/autohint/ahmodule.c: Implement support for DEBUG_HINTER macro. - * src/autohint/ahtypes.h: Ditto. - (AH_Hinter): Remove `disable_horz_edges' and `disable_vert_edges' - (making them global as `ah_debug_disable_horz' and - `ah_debug_disable_vert'). - Fix typos. - - * tests/gview.c: Updated the debugging glyph viewer to show the - hints generated by the `autohint' module. - -2001-10-27 David Turner - - * src/cache/ftcchunk.c (ftc_chunk_cache_lookup): Fixed a bug that - considerably lowered the performance of the abstract chunk cache. - -2001-10-26 David Turner - - * include/freetype/ftcache.h, include/freetype/cache/*.h, - src/cache/*.c: Major re-design of the cache sub-system to provide - better performance as well as an `Acquire'/`Release' API. Seems to - work well here, but probably needs a bit more testing. - -2001-10-26 Leonard Rosenthol - - * builds/mac/README: Updated to reflect my taking over the project - and that is now being actively maintained. - - * src/base/ftmac.c (parse_fond): Applied patches from Paul Miller - to support loading a face other than the - first from a FOND resource. - (FT_New_Face_From_FOND): Updated. - -2001-10-25 Leonard Rosenthol - - * builds/mac/ftlib.prj: Update of CodeWarrior project file for Mac - OS for latest version (7) of CWPro and for recent changes to the FT - source tree. - -2001-10-25 David Turner - - * include/freetype/config/ftoption.h: Updated comments to explain - precisely how to use project-specific macro definitions without - modifying this file manually. - - (FT_CONFIG_FORCE_INT64): Define. - - (FT_DEBUG_MEMORY): New macro. - -2001-10-24 Tom Kacvinsky - - * builds/unix/ftsystem.c (FT_New_Memory): Added a missing `{'. - -2001-10-23 David Turner - - * include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c: - Improvements to the memory debugger to report more information in - case of errors. Also, some allocations that occurred through REALLOC - couldn't be previously caught correctly. - - * src/autohint/ahglyph.c (ah_outline_compute_segments, - ah_outline_compute_edges), src/raster/ftraster.c (ft_black_new), - src/smooth/ftgrays.c (gray_render_span, gray_raster_new): Replaced - liberal uses of memset() by the MEM_Set() macro. - -2001-10-23 David Turner - - * src/raster/ftraster.c (Update): Removed to be inlined in ... - (Sort): Updated. - -2001-10-22 David Turner - - * builds/unix/ftsystem.c (FT_New_Memory, FT_Done_Memory), - builds/vms/ftsystem.c (FT_New_Memory, FT_Done_Memory), - builds/amiga/ftsystem.c (FT_New_Memory, FT_Done_Memory), - src/base/ftdbgmem.c: Updated the memory debugger and - platform-specific implementations of `ftsystem' in order to be able - to debug memory allocations on Unix, VMS and Amiga too! - - * src/pshinter/pshalgo2.c (psh2_hint_table_record_mask): Removed - some bogus warnings. - - * include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c: - Modified the debugging memory manager to report the location (source - file name + line number) where leaked memory blocks are allocated in - the source file. - - * src/base/ftdbgmem.c: New debugging memory manager. You must - define the FT_DEBUG_MEMORY macro in `ftoption.h' to enable it. It - will record every memory block allocated and report simple errors - like memory leaks and double deletes. - - * src/base/Jamfile: Include ftdbgmem. - * src/base/rules.mk: Ditto. - * src/base/ftbase.c: Include ftdbgmem.c. - - * include/freetype/config/ftoption.h: Added the FT_DEBUG_MEMORY - macro definition. - - * src/base/ftsystem.c (FT_New_Memory, FT_Done_Memory): Modified the - base component to use the debugging memory manager when the macro - FT_DEBUG_MEMORY is defined. - -2001-10-21 Tom Kacvinsky - - * src/cff/cffload.c (CFF_Done_Font): Free subfonts array only if - we are working with a CID keyed CFF font. Otherwise, a variable - that was never allocated memory might freed. This is a correction - to the previous patch for freeing subfonts. - -2001-10-21 Tom Kacvinsky - - * src/cff/cffload.c (CFF_Done_Font): Free the subfonts array to - avoid a memory leak. - -2001-10-21 David Turner - - * src/pshinter/pshalgo2.c, src/pshinter/pshalgo1.c, - src/pshinter/pshglob.c: Removing compiler warnings in pedantic modes - (in multi-object compilation mode, mainly). - -2001-10-20 Tom Kacvinsky - - * src/type1/t1load.c (parse_encoding): Add a test to make sure - that custom encodings (i.e., neither StandardEncoding nor - ExpertEncoding) are not loaded twice when the Type 1 font is - synthetic. - - * src/type1/t1load.c (parse_font_name, parse_subrs): Added a test - for when loading synthetic fonts to make sure that the font name - and subroutines are not loaded twice. This is to remove a memory - leak that occurred because the original memory blocks for these - objects were not deallocated when the objects were parsed the - second time. - -2001-10-19 David Turner - - * src/smooth/ftgrays.c, src/pshinter/pshglob.h, - src/pshinter/pshrec.c, src/pshinter/pshalgo2.c: Getting rid of - compiler warnings. - - * src/pshinter/module.mk, src/pshinter/rules.mk: Adding control - files to build the PostScript hinter with the `old' build system. - -2001-10-19 Jacob Jansen - - * descrip.mms, src/pshinter/descrip.mms: Updates to the VMS build - files. - -2001-10-18 David Turner - - * src/psnames/pstables.h, src/tools/glnames.py: Rewrote the - `glnames.py' script used to generate the `pstables.h' header file. - The old one contained a serious bug that made FreeType return - incorrect glyph names for certain glyphs. - - * src/truetype/ttdriver.c (Set_Char_Sizes): Changing computation of - pixel size from character size to use rounding. This is an - experiment to see whether this gives values similar to Windows for - scaled ascent/descent/etc. - - * src/base/ftcalc.c (FT_Div64by32): Changed the implementation - slightly since the original code was mis-compiled on Mac machines - using the MPW C compiler. - - * src/base/ftobjs.c (FT_Realloc): When a memory block was grown - through FT_Realloc(), the new bytes were not set to 0, which created - some strange bugs in the PostScript hinter. - (destroy_face): Don't deallocate unconditionally. - - * src/cid/cidgload.c (CID_Compute_Max_Advance, CID_Load_Glyph): - Adding support to new PostScript hinter. - - * include/freetype/internal/psglobal.h, - include/freetype/internal/pshints.h, - include/freetype/config/ftmodule.h, src/pshinter/Jamfile, - src/pshinter/pshalgo.h, src/pshinter/pshalgo1.h, - src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.h, - src/pshinter/pshalgo2.c, src/pshinter/pshglob.h, - src/pshinter/pshglob.c, src/pshinter/pshinter.c, - src/pshinter/pshmod.c, src/pshinter/pshmod.h, src/pshinter/pshrec.c, - src/pshinter/pshrec.h: Adding new PostScript hinter module. - - * include/freetype/internal/ftobjs.h, - include/freetype/internal/internal.h, - include/freetype/internal/psaux.h, - include/freetype/internal/t1types.h, src/psaux/psobjs.c, - src/psaux/psobjs.h, src/psaux/t1decode.h, src/psaux/t1decode.c, - src/type1/t1driver.c, src/type1/t1gload.c, src/type1/t1objs.c, - src/type1/t1objs.h: Updates to use the new PostScript hinter. - - * tests/Jamfile, tests/gview.c: Adding a new glyph hinting - viewer/debugger to the source tree. Note that you will _not_ be - able to compile it since it depends on an unavailable graphics - library named `Nirvana' to render vector images. - -2001-10-17 David Turner - - - * Version 2.0.5 released. - ========================= - - - * include/freetype/freetype.h, include/internal/ftobjs.h, - src/base/ftobjs.c, src/type1/t1driver.c: Adding a new function named - 'FT_Get_Postscript_Name' to retrieve the PostScript name of a given - font. Should work with all formats except pure CFF/CEF fonts (this - will be added soon). - - * src/cid/cidriver (cid_get_postscript_name): New function. - (CID_Get_Interface): Handle `postscript_name' interface. - - * src/sfnt/sfdriver.c (get_sfnt_postscript_name): New function. - (SFNT_Get_Interface): Handle `postscript_name' interface. - - * src/type1/t1driver.c (t1_get_ps_name): New function. - (Get_Interface): Handle `postscript_name' interface. - - * README, docs/CHANGES: Updated for 2.0.5 release. - -2001-10-08 David Turner - - Fixed a bug in `glnames.py' that prevented it from generating - correct glyph names tables. This resulted in the unavailability of - certain glyphs like `Cacute', `cacute' and `lslash' in Unicode - charmaps, even if these were present in the font (causing problems - for Polish users). - - * src/tools/glnames.py (mac_standard_names): Fixed. - (t1_standard_strings): Some fixes and renamed to ... - (sid_standard_names): This. - (t1_expert_encoding): Fixed. - (the_adobe_glyph_list): Renamed to ... - (adobe_glyph_names): This. - (the_adobe_glyphs): Renamed to ... - (adobe_glyph_values): This. - (dump_mac_indices, dump_glyph_list, dump_unicode_values, main): - Updated. - * src/psnames/pstables.h: Regenerated. - * src/psnames/psmodule.c (PS_Unicode_Value): Fix offset. - Fix return value. - Use `sid_standard_table' and `ps_names_to_unicode' instead of - `t1_standard_glyphs' and `names_to_unicode'. - (PS_Macintosh_Name): Use `ps_glyph_names' instead of - `standard_glyph_names'. - (PS_Standard_Strings): Use `sid_standard_names' instead of - `t1_standard_glyphs'. - - * doc/BUGS, doc/TODO: New documents. - -2001-10-07 Richard Barber - - * src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented - correct LRU behaviour. - -2001-10-07 David Turner - - setjmp() and longjmp() are now used for rollback (i.e. when memory - pool overflow occurs). - - Function names are now all uniformly prefixed with `gray_'. - - * src/smooth/ftgrays.c: Include . - (ErrRaster_MemoryOverflow): New macro. - (TArea): New type to store area values in each cell (using `int' was - too small on 16-bit systems). is included to properly - get the needed data type. - (TCell, TRaster): Use it. - (TRaster): New element `jump_buffer'. - (gray_compute_cbox): Use `RAS_ARG' as the only parameter and get - `outline' from it. - (gray_record_cell): Use longjmp(). - (gray_set_cell): Use gray_record_cell() for error handling. - (gray_render_line, gray_render_conic, gray_render_cubic): Simplify. - (gray_convert_glyph_inner): New function, using setjmp(). - (gray_convert_glyph): Use it. - -2001-10-07 David Turner - - Provide a public API to manage multiple size objects for a given - FT_Face in the new header file `ftsizes.h'. - - * include/freetype/ftsizes.h: New header file, - * include/freetype/internal/ftobjs.h: Use it. - Remove declarations of FT_New_Size and FT_Done_Size (moved to - ftsizes.h). - * include/freetype/config/ftheader.h (FT_SIZES_H): New macro. - * src/base/ftobjs.c (FT_Activate_Size): New function. - * src/cache/ftcmanag.c: Include ftsizes.h. - (ftc_manager_init_size, ftc_manager_flush_size): Use - FT_Activate_Size. - -2001-09-20 Detlef Würkner - - * builds/amiga/*: Added port to Amiga with the SAS/C compiler. - -2001-09-15 Detlef Würkner - - * src/type1/t1afm.c (T1_Done_AFM): Free `afm'. - -2001-09-10 Yao Zhang - - * src/sfnt/ttcmap.c (code_to_index2): Handle code values with - hi-byte == 0 correctly. - -2001-09-10 Werner Lemberg - - * builds/link-std.mk ($(PROJECT_LIBRARY)): Fix typo. - -2001-08-30 Martin Muskens - - * src/type1/t1load.c (parse_font_matrix): A new way to compute the - units per EM with greater accuracy (important for embedded T1 fonts - in PDF documents that were automatically generated from TrueType - ones). - - * src/type1/t1load.c (is_alpha): Now supports `+' in font names; - this is used in embedded fonts. - - * src/psaux/psobjs.c (PS_Table_Add): Fixed a reallocation bug that - generated a dangling pointer reference. - -2001-08-30 Anthony Feik - - * src/type1/t1afm.c (T1_Read_Afm): Now correctly sets the flag - FT_FACE_FLAG_KERNING when appropriate for Type1 + AFM files. - -2001-08-25 Werner Lemberg - - * src/sfnt/ttload.c (TT_Load_CMap): Fix frame length of - `cmap_rec_fields'. - - * include/freetype/fterrors.h [!FT_CONFIG_OPTION_USE_MODULE_ERRORS]: - Undefine FT_ERR_BASE before defining again. - -2001-08-22 Werner Lemberg - - * src/truetype/ttinterp.h: Fix prototype of TT_Move_Func. - -2001-08-21 Werner Lemberg - - * builds/dos/dos-def.mk (NO_OUTPUT): Don't use `&>' but `>'. - -2001-08-21 David Turner - - * include/freetype/config/ftoption.h: Changed the default setting - for FT_CONFIG_OPTION_USE_MODULE_ERRORS to undefined, since it breaks - source compatibility in a few cases. Updated the comment to explain - that too. - -2001-08-17 Martin Muskens - - * src/base/ftcalc.c (FT_MulDiv): Fixed serious typo. - -2001-08-12 Werner Lemberg - - Updating to OpenType 1.3. - - * include/freetype/internal/tttypes.h (TT_CMap0, TT_CMap2, TT_CMap4, - TT_CMap6): Adding field `language'. - (TT_CMapTable): Removing field `language'. - Type of `length' field changed to FT_ULong. - Adding fields for cmaps format 8, 10, and 12. - (TT_CMapGroup): New auxiliary structure. - (TT_CMap8_12, TT_CMap10): New structures. - * include/freetype/tttables.h (TT_HoriHeader, TT_VertHeader): - Removed last element of `Reserved' array. - * include/freetype/ttnameid.h (TT_PLATFORM_CUSTOM, TT_MS_ID_UCS_4, - TT_NAME_ID_CID_FINDFONT_NAME): New macros. - - * src/sfnt/ttcmap.c (TT_CharMap_Load): Updated loading of `language' - field to the new structures. - Fixed freeing of arrays in case of unsuccessful loads. - Added support for loading format 8, 10, and 12 cmaps. - (TT_CharMap_Free): Added support for freeing format 8, 10, and 12 - cmaps. - (code_to_index4): Small improvement. - (code_to_index6): Ditto. - (code_to_index8_12, code_to_index10): New functions. - * src/sfnt/ttload.c (TT_Load_Metrics_Header): Updated to new - structure. - (TT_Load_CMap): Ditto. - - * src/sfnt/sfobjs.c (tt_encodings): Add MS UCS4 table (before MS - Unicode). - -2001-08-11 Werner Lemberg - - * src/type1/t1driver.c (t1_get_name_index): Fix compiler warning. - -2001-08-09 Tom Kacvinsky - - * src/cff/cffdrivr.c (get_cff_glyph_name): Renamed to - cff_get_glyph_name for consistency. - - (cff_get_glyph_index): Minor documentation change. - - * src/type1/t1driver.c (t1_get_name_index): New function used in - Get_Interface as the function returned when the `name_index' - function is requested. - - (get_t1_glyph_name): Renamed to t1_get_glyph_name for consistency. - -2001-08-08 Tom Kacvinsky - - * src/cff/cffload.c: Removed definitions of cff_isoadobe_charset, - cff_expert_charset, cff_expertsubset_charset, cff_standard_encoding, - and cff_expert_encoding arrays to cffload.h. - - * src/cff/cffload.h: Added definitions of cff_isoadobe_charset, - cff_expert_charset, cff_expertsubset_charset, cff_standard_encoding, - and cff_expert_encoding arrays. - - * src/cff/cffdrivr.c (cff_get_name_index): New function, returned - when `cff_get_interface' is called with a request for the - `name_index' function. - - (cff_get_interface): Modified so that it returns the function - `cff_get_name_index' when the `name_index' function is requested. - - * src/base/ftobjs.c (FT_Get_Name_Index): New function, used to - return a glyph index for a given glyph name only if the driver - supports glyph names. - - * include/freetype/internal/ftobjs.h (FT_Name_Index_Requester): - New function pointer type definition used in the function - FT_Get_Name_Index. - - * include/freetype/freetype.h (FT_Get_Name_Index): Added - documentation and prototype. - -2001-07-26 Werner Lemberg - - * builds/cygwin/*: Removed. Use the unix stuff instead. - -2001-07-26 Jouk Jansen - - * builds/vms/ftconfig.h (FT_CALLBACK_DEF): Updated to change dated - 2001-06-27. - -2001-07-17 Werner Lemberg - - * include/freetype/internal/psaux.h (PS_Table): Use FT_Offset for - `cursor' and `capacity'. - * src/psaux/psobjc.c (reallocate_t1_table): Use FT_Long for second - parameter. - (PS_Table_Add): Use FT_Offset for `new_size'. - - Add support for version 0.5 maxp tables. - - * src/sfnt/ttload.c (TT_Load_MaxProfile): Implement it. - (TT_Load_OS2): Initialize some values. - -2001-07-13 Werner Lemberg - - * src/base/ftsynth.c: Include ftcalc.h unconditionally. - -2001-07-07 David Turner - - * src/truetype/ttgload.c, src/truetype/ttinterp.c, src/pcf/pcfread: - Removed pedantic compiler warnings when the bytecode interpreter is - compiled in. - -2001-07-03 Werner Lemberg - - * src/autohint/ahhint.c (ah_hinter_align_weak_points): Remove - unused variable `edges'. - (ah_hinter_load): Remove unused variables `old_width' and - `new_width'. - * src/cid/cidload.c (cid_decrypt): Use `U' for constant (again). - * src/psaux/psobjs.c (T1_Decrypt): Ditto. - * src/type1/t1parse.c (T1_Get_Private_Dict): Ditto. - -2001-06-28 David Turner - - * include/internal/ftstream.h: Modified the definitions - of the FT_GET_XXXX and NEXT_XXXX macros for 16-bit correctness. - -2001-06-26 Werner Lemberg - - * src/cid/cidload.c, src/cid/cidload.h (cid_decrypt): Use FT_Offset - instead of FT_Int as type for `length' parameter. - * include/freetype/internal/psaux.h (PSAux_Interface): Updated. - -2001-06-27 Wolfgang Domröse - - * src/psaux/psobjs.c, src/psaux/psobjs.h (T1_Decrypt): Use FT_Offset - instead of FT_Int as type for `length' parameter. - - - * Version 2.0.4 released. - ========================= - - -2001-06-27 David Turner - - * builds/unix/ftconfig.in: Changed the definition of the - FT_CALLBACK_DEF macro. - - * include/freetype/ftconfig.h, src/*/*.c: Changed the definition and - use of the FT_CALLBACK_DEF macro in order to support 16-bit - compilers. - - * builds/unix/ftconfig.in: Changed the definition of the - FT_CALLBACK_DEF macro. - - * src/sfnt/ttload.c (TT_Load_Kern): The kern table loader now ensures - that the kerning table is correctly sorted (some problem fonts don't - have a correct kern table). - -2001-06-26 Wolfgang Domröse - - * include/freetype/internal/ftstream.h (FT_GET_OFF3_LE): Fix typo. - -2001-06-24 David Turner - - * src/base/ftcalc.c (ft_div64by32): Fixed the source to work - correctly on 16-bit systems. - -2001-06-23 Anthony Fok - - * debian/*: Added Debian package build directory for 2.0.4. - -2001-06-22 David Turner - - * docs/PATENTS: Added patents disclaimer. This one was missing! - - * docs/CHANGES, docs/todo: Updated for the upcoming 2.0.4 release. - -2001-06-20 Werner Lemberg - - * include/freetype/config/ftconfig.h: Add two more `L's to - constants. - Add missing semicolons. - - * builds/toplevel.mk: Do similar change as for - builds/unix/detect.mk. - - * include/freetype/freetype.h (FT_ENC_TAG): New version to make it - easier to redefine. - * include/freetype/ftimage.h (FT_IMAGE_TAG): Ditto. - - * src/pcf/pcfread.c (pcf_get_encodings): Add cast. - -2001-06-19 David Turner - - * builds/win32/visualc/freetype.dsp, builds/win32/visualc/index.html: - Updated the Visual C++ project (for the 2.0.4 release). - - * builds/unix/detect.mk: Added rule for AIX detection (which uses - /usr/sbin/init instead of /sbin/init). - - * include/freetype/fterrors.h, src/*/*err*.h: Updated some of the - error macros to simplify handling of new error scheme. - -2001-06-19 Werner Lemberg - - * include/freetype/fttypes.h (FT_ERROR_MODULE): New macro. - -2001-06-19 David Turner - - Removing _lots_ of compiler warnings when the most pedantic warning - levels of Visual C++ and Borland C++ are used. Too many files to be - listed here, but FT2 now compiles without warnings with VC++ and the - `/W4' warning level (lint-style). - - * include/freetype/freetype.h (FT_New_Memory_Face): Updated - documentation. - * include/freetype/fttypes.h (FT_BOOL): New macro. - * include/freetype/internal/ftdebug.h: Add #pragma for Visual C++ - to suppress warning. - * include/freetype/internal/ftstream.h (FT_GET_SHORT_{BE,LE}, - FT_GET_OFF3_{BE,LE}, FT_GET_LONG_{BE,LE}): New macros. - (NEXT_*): Use them. - * src/autohint/ahglobal.c: Include FT_INTERNAL_DEBUG_H. - (FT_New_Memory_Face): Add `const' to function declaration. - -2001-06-18 Werner Lemberg - - Minor cleanups to remove compiler warnings. - - * include/freetype/cache/ftcmanag.h (FTC_MAX_BYTES_DEFAULT): Use - `L' for constant. - * include/freetype/config/ftoption.h (FT_RENDER_POOL_SIZE): Ditto. - * src/base/ftcalc.c (FT_MulDiv): Use `L' for constant. - * src/base/ftglyph.c (FT_Glyph_Get_CBox): Remove `error' variable. - * src/base/fttrigon.c (ft_trig_arctan_table): Use `L' for constants. - * src/base/ftobjs.c (FT_Done_Size): Fix return value. - (FT_Set_Char_Size, FT_Set_Pixel_Sizes, FT_Get_Kerning): Remove - unused `memory' variable. - * src/autohint/ahglyph.c (ah_get_orientation): Use `L' for constant. - * src/autohint/ahhint.c (ah_hint_edges_3, - ah_hinter_align_edge_points): Remove unused `before' and `after' - variables. - (ah_hinter_align_weak_points): Remove unused `edge_limit' variable. - (ah_hinter_load): Remove unused `new_advance', `start_contour', - and `metrics' variables. - * src/cff/cffload.c (CFF_Load_Encoding): Remove dead code to avoid - compiler warning. - * src/cff/cffobjs.c (CFF_Init_Face): Remove unused `base_offset' - variable. - * src/cff/cffgload.c (CFF_Parse_CharStrings): Remove unused - `outline' variable. - (cff_compute_bias): Use `U' for constant. - * src/cid/cidload.c (cid_decrypt): Ditto. - * src/psaux/psobjs.c (T1_Decrypt): Ditto. - * src/psaux/t1decode.c (T1_Decoder_Parse_CharStrings): Ditto. - * src/sfnt/ttload.c (TT_Load_Kern): Remove unused `version' - variable. - * src/sfnt/ttsbit.c (TT_Load_SBit_Image): Remove unused `top' - variable. - * src/truetype/ttgload.c (load_truetype_glyph): Remove unused - `num_contours' and `ins_offset' variables. - (compute_glyph_metrics): Remove unused `Top' and `x_scale' - variables. - (TT_Load_Glyph): Remove unused `memory' variable. - * src/smooth/ftgrays.c (grays_raster_render): Use `L' for constants. - -2001-06-18 Werner Lemberg - - Make the new error scheme source compatible with older FT versions - by introducing another layer. - - * include/freetype/fterrors.h (FT_ERRORDEF_, FT_NOERRORDEF_): New - macros. - (FT_NOERRORDEF): Removed. - * include/*/*err*.h: Use FT_ERRORDEF_ and FT_NOERRORDEF_. - -2001-06-16 Werner Lemberg - - * include/freetype/freetype.h (FT_ENC_TAG): New macro. - (FT_Encoding_): Use it. - * include/freetype/ftimage.h (FT_IMAGE_TAG): Define it - conditionally. - -2001-06-14 David Turner - - Modified the TrueType interpreter to let it use the new - trigonometric functions provided in `fttrigon.h'. This gets rid of - some old 64-bit computation routines, as well as many warnings when - compiling the library with the `long long' 64-bit integer type. - - * include/freetype/config/ftoption.h: Undefine - FT_CONFIG_OPTION_OLD_CALCS. - * include/freetype/internal/ftcalc.h: Rearrange use of - FT_CONFIG_OPTION_OLD_CALCS. - * src/base/ftcalc.c: Add declaration of FT_Int64 if - FT_CONFIG_OPTION_OLD_CALCS isn't defined. - * src/truetype/ttinterp.c: Use FT_TRIGONOMETRY_H. - (Norm): Add a special version if FT_CONFIG_OPTION_OLD_CALCS isn't - defined. - (Current_Ratio, Normalize): Simplify code. - -2001-06-11 Mike Owens - - * src/base/ftcalc.c (FT_MulDiv, FT_DivFix, FT_Sqrt64): Remove - compiler warnings. - -2001-06-08 Werner Lemberg - - * builds/unix/configure.in: Renamed to ... - * builds/unix/configure.ac: This to make sure that autoconf 2.50 is - needed. - Run `autoupdate' on it. - Increase `version_info' to 7:0:1. - * builds/unix/configure: Regenerated. - -2001-06-08 David Turner - - * src/autohint/ahhint.c (ah_hinter_load_glyph): Fixed a bug that - corrupted transformed glyphs that were auto-hinted (the transform - was applied twice). - - Fixed a bug that returned an invalid linear width for composite - TrueType glyphs. - - * include/internal/tttypes.h (TT_Loader_): Two new elements `linear' - and `linear_def'. - * src/truetype/ttgload.c (load_truetype_glyph, - compute_glyph_metrics): Use it. - - * include/fttypes.h (FT_ERROR_BASE): New macro. - * src/base/ftobjs.c (FT_Open_Face, FT_Render_Glyph_Internal): Use it - to make source code work with the new error scheme implemented by - Werner. - * src/base/ftoutln.c (FT_Outline_Render): Ditto. - -2001-06-07 Werner Lemberg - - Updating to libtool 1.4.0 and autoconf 2.50. - - * builds/unix/ltconfig: Removed. - * builds/unix/ltmain.sh, builds/unix/configure.in, - builds/unix/aclocal.m4: Updated. - * builds/unix/configure: Regenerated. - -2001-06-06 Werner Lemberg - - Complete redesign of error codes. Please check ftmoderr.h for more - details. - - * include/freetype/internal/cfferrs.h, - include/freetype/internal/tterrors.h, - include/freetype/internal/t1errors.h: Removed. Replaced with files - local to the module. All extra error codes have been moved to - `fterrors.h'. - - * src/sfnt/ttpost.h: Move error codes to `fterrors.h'. - - * src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h, - src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h, - src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h, - src/smooth/ftsmerrs.h, src/truetype/tterrors.h, - src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the - error names for the module it belongs to. - - * include/freetype/ftmoderr.h: New file, defining the module error - offsets. Its structure is similar to `fterrors.h'. - - * include/freetype/fterrors.h (FT_NOERRORDEF): New macro. - (FT_ERRORDEF): Redefined to use module error offsets. - All internal error codes are now public; unused error codes have - been removed, some are new. - - * include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New - macro. - * include/freetype/config/ftoption.h - (FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro. - - All other source files have been updated to use the new error codes; - some already existing (internal) error codes local to a module have - been renamed to give them the same name as in the base module. - - All make files have been updated to include the local error files. - -2001-06-06 Werner Lemberg - - * src/cid/cidtokens.h: Replaced with... - * src/cid/cidtoken.h: This file for 8+3 consistency. - - * src/raster/ftraster.c: Use macros for header file names. - - * src/include/freetype/tttables.h (TT_HoriHeader_, TT_VertHeader_): - Fix length of `Reserved' array. Note that this isn't the real fix - since recent OpenType specs have introduced a `CaretOffset' field - instead of the first reserved byte. - -2001-05-29 Werner Lemberg - - * INSTALL: Minor fixes. - - - * Version 2.0.3 released. - ========================= - - -2001-05-29 David Turner - - * INSTALL, docs/CHANGES: Updated. - -2001-05-25 David Turner - - Moved several documents from the top-level to the `docs' directory. - - * src/base/ftcalc.c (FT_DivFix): Small fix to return value. - -2001-05-16 David Turner - - * src/truetype/ttgload.c (load_truetype_glyph): Fixed a bug in the - composite loader. Spotted by Keith Packard. - * src/base/ftobjs.c (FT_GlyphLoader_Check_Points, - FT_GlyphLoader_Check_Subglyphs): Ditto. - -2001-05-14 David Turner - - Fixed the incorrect blue zone computations, and improved the - composite support. Note that these changes result in improved - rendering, while sometimes introducing their own artefacts. This is - probably the last big change to the autohinter before the - introduction of a complete replacement. - - * src/autohint/ahglobal.c (sort_values): Fix loop. - * src/autohint/ahglyph.c: Removed some obsolete code. - (ah_outline_compute_edges): Modify code to set the ah_edge_round - flag. - (ah_outline_compute_blue_edges): Add code to compute active blue - zones. - * src/autohint/ahhint.c (ah_hinter_glyph_load): Change load_flags - value. - - * src/base/ftcalc.c (FT_DivFix): Fixed a bug in the 64-bit code that - created incorrect scale factors! - (FT_Round_Fix, FT_CeilFix, FT_FloorFix): Minor improvements. - -2001-05-12 Werner Lemberg - - * include/freetype/ftbbox.h: FTBBOX_H -> __FTBBOX_H__. - * include/freetype/fttrigon.h: __FT_TRIGONOMETRY_H__ -> - __FTTRIGON_H__. - Include FT_FREETYPE_H. - Beautified; added copyright. - * src/base/fttrigon.c: Beautified; added copyright. - -2001-05-11 David Turner - - * src/cff/cffparse.c (cff_parse_font_matrix), src/cid/cidload.c - (parse_font_matrix), src/type1/t1load.c (parse_font_matrix): Fixed - the incorrect EM size computation. - - * include/freetype/fttrigon.h, src/base/fttrigon.c: New files, - adding trigonometric functions to the core API (using Cordic - algorithms). - * src/base/ftbase.c, src/base/Jamfile, src/base/rules.mk: Use them. - - * builds/newline: New file. - * builds/top_level.mk, builds/detect.mk: Use it. This fixes - problems with Make on Windows 2000, as well as problems when `make - distclean' is invoked on a non-Unix platform when there is no - `config.mk' in the current directory. - - * builds/freetype.mk: Fixed a problem with object deletions under - Dos/Windows/OS/2 systems. - - Added new directory to hold tools and test programs. - - * docs/docmaker.py, docs/glnames.py: Moved to... - * src/tools/docmaker.py, src/tools/glnames.py: This place. - * src/tools/cordic.py: New file used to compute arctangent table - needed by fttrigon.c. - * src/tools/test_bbox.c, src/tools/test_trig.c: New test files. - - * src/tools/docmaker.py: Improved the script to add the current date - at the footer of each web page (useful to distinguish between - versions). - - * Jamfile: Fixed incorrect HDRMACRO argument. - - * TODO: Removed the cubic arc bbox computation note, since it has been - fixed recently. - * src/base/ftbbox.c (test_cubic_zero): Renamed to... - (test_cubic_extrema): This function. Use `UL' for unsigned long - constants. - - * include/freetype/t1tables.h, include/freetype/config/ftoption.h: - Formatting. - -2001-05-10 David Turner - - * src/base/ftobjs.c (FT_Open_Face): Fixed a small memory leak - which happened when trying to open 0-size font files! - -2001-05-09 Werner Lemberg - - * include/freetype/internal/ftcalc.h: Move declaration of - FT_SqrtFixed() out of `#ifdef FT_LONG64'. - -2001-05-08 Francesco Zappa Nardelli - - * src/pcfdriver.c (PCF_Load_Glyph): Fixed incorrect bitmap width - computation. - -2001-05-08 David Turner - - * docs/docmaker.py: Updated the DocMaker script in order to add - command line options (--output,--prefix,--title), fix the erroneous - line numbers reported during errors and warnings, and other - formatting issues. - - * src/base/ftcalc.c (FT_MulDiv, FT_MulFix, FT_DivFix): Various tiny - fixes related to rounding in 64-bits routines and - pseudo-`optimizations'. - -2001-04-27 David Turner - - * src/base/ftbbox.c (BBox_Cubic_Check): Fixed the coefficient - normalization algorithm (invalid final bit position, and invalid - shift computation). - -2001-04-26 Werner Lemberg - - * builds/unix/config.guess, builds/unix/config.sub: Updated to - latest versions from gnu.org. - - * builds/compiler/gcc-dev.mk: Add `-Wno-long-long' flag. - - * include/freetype/internal/ftcalc.h: Define FT_SqrtFixed() - unconditionally. - * src/base/ftbbox.c: Include FT_INTERNAL_CALC_H. - Fix compiler warnings. - * src/base/ftcalc.c: Fix (potential) compiler warnings. - -2001-04-26 David Turner - - * src/base/ftcalc.c (FT_SqrtFixed): Corrected/optimized the 32-bit - fixed-point square root computation. It is now used even with - 64-bits integers, as it is _much_ faster than calling FT_Sqrt64 :-) - - * src/base/ftbbox.c: Removed invalid `#include FT_BEZIER_H' line. - -2001-04-25 David Turner - - * src/base/ftbbox.c (BBox_Cubic_Check): Rewrote function to use - direct computations with 16.16 values instead of sub-divisions. It - is now slower, but proves a point :-) - - * src/raster/ftraster.c, src/smooth/ftgrays.c, src/base/ftbbox.c: - Fixed the Bézier stack depths. - - * src/base/ftcalc.c (FT_MulFix): Minor rounding fix. - - * builds/beos: Added BeOS-specific files to the old build system - (no changes were necessary to support BeOS in the Jamfile though). - -2001-04-20 David Turner - - * ftconfig.h, ftoption.h: Updated `ftconfig.h' to detect 64-bit int - types on platforms where Autoconf is not available). Also removed - FTCALC_USE_LONG_LONG and replaced it with - FT_CONFIG_OPTION_FORCE_INT64. - - * builds/win32/freetype.dsp: Updated the Visual C++ project file. - Doesn't create a DLL yet. - - * cffgload.c: Removed a compilation warning. - -2001-04-10 Tom Kacvinsky - - * t1load.c (parse_charstrings): Changed code for placing .notdef - glyph into slot 0 so that we no longer have a memory access - violation. - - * t1load.h: In structure T1_Loader, added swap_table (of type - PS_Table) to facilitate placing the .notdef glyph into slot 0. - -2001-04-10 Francesco Zappa Nardelli - - * src/pcf/pcfdriver.c (PCF_Get_Char_Index): Fix return value. - -2001-04-09 Laurence Withers - - * builds/dos/detect.mk: Add support for bash. - -2001-04-05 Werner Lemberg - - * builds/os2/*.mk: These files have been forgotten to update to - the structure of similar makefiles. - * builds/dos/*.mk: Ditto. - * builds/ansi/*.mk: Ditto. - - * builds/win32/win32-def.mk (BUILD): Fix typo. - - * builds/compiler/*.mk (CLEAN_LIBRARY): Don't use NO_OUTPUT. - This is already used in the link_*.mk files. - -2001-04-03 Werner Lemberg - - * src/*/Jamfile: Slight changes to make files more cryptic. - -2001-04-03 Werner Lemberg - - * Jamfile, src/Jamfile, src/*/Jamfile: Formatted. Slight changes - to give files identical structure. - -2001-04-02 Werner Lemberg - - * CHANGES: Reformatted, minor fixes. - * TODO: Updated. - * README: Formatting. - * include/freetype/freetype.h: Formatting. - - * Jamfile: Fix typo. - - * src/cff/cffparse.c: Move error code #defines to... - * include/freetype/internal/cfferrs.h: This file. - * src/cff/cffdrivr.c, src/cff/cffobjs.c, src/cff/cffload.c: Replaced - `FT_Err_*' with `CFF_Err_*'. - * src/cid/cidparse.c: Replaced `FT_Err_*' with `T1_Err_*'. - * src/psaux/psobjs.c, src/psaux/t1decode.c: Ditto. - * src/sfnt/sfobcs.c, src/sfnt/ttload.c: Replaced `FT_Err_*' with - `TT_Err_*'. - * src/truetype/ttgload.c, src/truetype/ttobjs.c: Ditto. - * src/type1/t1gload.c, src/type1/t1load.c, src/type1/t1objs.c, - src/type1/t1parse.c: Replaced `FT_Err_*' with `T1_Err_*'. - - * include/freetype/internal/cfferrs.h: Add - `CFF_Err_Unknown_File_Format'. - * include/freetype/internal/t1errors.h: Add - `T1_Err_Unknown_File_Format'. - * include/freetype/internal/tterrors.h: Add - `TT_Err_Unknown_File_Format'. - - * src/cff/cffload.h: Add `cff_*_encoding' and `cff_*_charset' - references. - * src/psaux/psobjs.c: Include `FT_INTERNAL_TYPE1_ERRORS_H'. - - * src/cff/cffobjs.c (CFF_Init_Face, CFF_Done_Face): Use - FT_LOCAL_DEF. - * src/cid/cidobjs.c (CID_Done_Driver): Ditto. - * src/trutype/ttobjs.c (TT_Init_Face, TT_Done_Face, TT_Init_Size): - Ditto. - * src/type1/t1objs.c (T1_Done_Driver): Ditto. - * src/pcf/pcfdriver.c (PCF_Done_Face): Ditto. - * src/pcf/pcf.h: Use FT_LOCAL for `PCF_Done_Face'. - -2001-04-02 Tom Kacvinsky - - * src/sfnt/ttload.c (TT_Load_Metrics): Fix an improper pointer - dereference. Submitted by Herbert Duerr . - -2001-03-26 Tom Kacvinsky - - * include/freetype/config/ftconfig.h: Changed hexadecimal - constants to use suffix U to avoid problems with HP-UX's c89 - compiler. Submitted by G.W. Lucas . - -2001-03-24 David Turner - - * Jamrules, Jamfile, src/Jamfile, src/*/Jamfile: Adding jamfiles to - the source tree. See www.freetype.org/jam/index.html for details. - - - * Version 2.0.2 released. - ========================= - - -2001-03-20 Werner Lemberg - - * builds/win32/detekt.mk: Fix .PHONY target for Intel compiler. - -2001-03-20 David Turner - - * include/freetype/config/ftheader.h, include/freetype/ftsnames.h: - Renamed `ftnames.h' to `ftsnames.h', and FT_NAMES_H to - FT_SFNT_NAMES_H. - - * docs/docmaker.py: Added generation of INDEX link in table of - contents. - - * INSTALL, docs/BUILD: Updated documentation to indicate that the - compilation process has changed slightly (no more `src' required in - the include path). - - * builds/*/*-def.mk: Changed the objects directory from `obj' to - `objs'. - - * include/freetype/config/ftheader.h: Removed obsolete macros like - FT_SOURCE_FILE, etc. and added cache-specific macro definitions that - were previously defined in . Added comments to - be included in a new API Reference section. - - * src/*/*: Removed the use of FT_SOURCE_FILE, etc. Now, each - component needs to add its own directory to the include path at - compile time. Modified all `rules.mk' and `descrip.mms' - accordingly. - -2001-03-20 Werner Lemberg - - * builds/unix/configure.in: Add $ft_version. - * builds/unix/freetype-config.in: Use it. - * builds/unix/configure: Updated. - -2001-03-19 Tom Kacvinsky - - * src/type1/t1load.c (parse_font_matrix): Assign the units per em - value an unsigned short value, first by shifting right 16 bits, - then by casting the results to FT_UShort. - - * src/cff/cffparse.c (cff_parse_font_bbox): Assign the units per em - value an unsigned short value, first by shifting right 16 bits, - then by casting the results to FT_UShort. - -2001-03-17 David Turner - - * src/cid/cidobjs.c, src/cid/cidload.c, src/pcf/pcfread.c, - src/type1/t1load.c, src/type1/t1objs.c: Added a few casts to remove - compiler warnings in pedantic modes. - - * include/config/ft2build.h, include/config/ftheader.h: The file - `ft2build.h' was renamed to `ftheader.h' to avoid conflicts with the - top-level . - - * include/config/ftheader.h: Added new section describing the #include - macros. - -2001-03-17 Tom Kacvinsky - - * src/cff/cffparse.c (cff_parse_font_bbox): Obtain rounded FT_Fixed - values for the bounding box numbers. - - * src/cff/cffobjs.c (CFF_Init_Face): When processing a CFF/CEF font, - set `root->ascender' (`root->descender') to the integer part of - `root->bbox.yMax' (`root->bbox.yMin', respectively). - -2001-03-16 Tom Kacvinsky - - * src/cff/cffdrivr.c (get_cff_glyph_name): New function. Used in - cff_get_interface to facilitate getting a glyph name for glyph index - via FT_Get_Glyph_Name(). - - (cff_get_interface): Added support for getting a glyph name via the - `glyph_name' module interface. Uses the new function - get_cff_glyph_name(). - Submitted by Sander van der Wal . - - * src/cff/cffobjs.c (CFF_Init_Face): Logical or the face flags with - FT_FACE_FLAG_GLYPH_NAMES only if FT_CONFIG_OPTION_NO_GLYPH_NAMES is - not defined. This is to add support for getting a glyph name from a - glyph index via FT_Get_Glyph_Name(). - Submitted by Sander van der Wal . - - * src/cff/cffgload.c (CFF_Parse_CharStrings): Added support for - deprecated operator `dotsection'. - Submitted by Sander van der Wal . - -2001-03-12 Werner Lemberg - - * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Fix error - messages. - - * INSTALL, docs/BUILD: We need GNU make 3.78.1 or newer. - -2001-03-12 Tom Kacvinsky - - * include/freetype/internal/psaux.h: Changed the lenIV member of - the T1_Decoder_ struct to be an FT_Int instead of an FT_UInt. - - * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Adjust - for lenIV seed bytes at the start of a decrypted subroutine. - - * src/cid/cidload.c (cid_read_subrs): Decrypt subroutines only - if lenIV >= 0. - - * src/cid/cidgload.c (cid_load_glyph): Decrypt charstrings only - if lenIV >= 0. - -2001-03-11 Werner Lemberg - - * TODO: Updated. - - * src/pcf/pcfread.c: Put READ_Fields() always in a conditional to - avoid compiler warnings. - -2001-03-10 Tom Kacvinsky - - * TODO: New file. - - * include/freetype/freetype.h: Added prototypes and notes for - three new functions: FT_RoundFix, FT_CeilFix, and FT_FloorFix. - * src/base/ftcalc.c (FT_RoundFix, FT_CeilFix, FT_FloorFix): Added - implementation code. - - * src/cid/cidobjs.c (CID_Init_Face): Use calculated units_per_EM, - and if that is not available, default to 1000 units per EM. Changed - assignment code for ascender and descender values. - * src/cid/cidload.c (parse_font_matrix): Added units_per_EM - processing. - (parse_font_bbox): Changed to use FT_Fixed number handling. - - * src/type1/t1objs.c (T1_Init_Face): Changed the assignment code - for ascender, descender, and max_advance_width. - * src/type1/t1load.c (parse_font_bbox): Changed to use FT_Fixed - number handling. - -2001-03-10 Henrik Grubbström - - * src/*/*.c: Added many casts to make code more 64bit-safe. - -2001-03-07 Werner Lemberg - - * INSTALL, docs/BUILD: We need GNU make 3.78 or newer. - -2001-03-07 Tom Kacvinsky - - * src/type1/t1objs.c (T1_Init_Face): Minor correction: We must wait - until parse_font_bbox is changed before we use logical shift rights - in the assignments of `root->ascender', `root->descender', and - `root->max_advance_width'. - - (T1_Done_Face): Free `char_name' table to avoid a memory leak. - Submitted by Sander van der Wal . - -2001-03-05 Tom Kacvinsky - - * src/cff/cffgload.c (CFF_Load_Glyph): Set glyph control data to the - the Type 2 glyph charstring (used by conversion programs). - Submitted by Ha Shao . - -2001-03-04 Antoine Leca - - * include/freetype/ttnameid.h: Correct a stupid typo which prevented - correct compilation (TT_MS_LANGID_TIGRIGNA_ETHIOPIA appeared twice). - -2001-03-04 Werner Lemberg - - * src/autohint/ahtypes.h (AH_Hinter): Add elements - `disable_horz_edges', `disable_vert_edges'. - * src/autohint/ahhint.c (ah_hint_edges_3, ah_hinter_hint_edges): Use - them (and remove static variables with the same names). - * src/pcf/pcfutil.c (BitOrderInvert): Add `const'. - * docs/glnames.py: Updated to latest pstables.h changes. - - * builds/unix/detect.mk: Add test for Hurd. - * builds/hurd/detect.mk: Removed. - -2001-03-04 Sander van der Wal - - * src/psnames/pstables.h: Add more `const'. - * src/pcf/pcfutil.c: Ditto. - -2001-03-04 Werner Lemberg - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Fixing typo - (FT_Glyph_Done -> FT_Done_Glyph). - -2001-03-01 Antoine Leca - - * include/freetype/ttnameid.h: Added some new Microsoft language - codes and LCIDs as found in Office Xp. - -2001-02-28 David Turner - - * builds/hurd/detect.mk: New file. Added support to detect the GNU - Hurd operating system as Unix-like. Fix submitted by Anthony Fok - . - - * src/type1/t1gload.c (T1_Load_Glyph): Set glyph control data to the - the Type 1 glyph charstring (used by conversion programs). - Submitted by Ha Shao . - -2001-02-22 David Turner - - * src/base/ftgrays.c (grays_sweep): The function didn't exit - immediately if `num_cells' was 0 as it should. Thanks to Boris for - finding this out. - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Fixed memory leak when - bitmap rendering fails (thanks to Graham Asher). - -2001-02-13 Werner Lemberg - - * docs/docmaker.py (DocSection::add_element): Use - `self.print_error()'. - - * builds/unix/config.{guess,sub}: Updated (from ftp.gnu.org). - -2001-02-13 David Turner - - * docs/docmaker.py, include/freetype/*.h: Updated the DocMaker - script to support chapters and section block ordering. Updated the - public header files accordingly. - - * src/base/ftglyph.c (FT_Glyph_Copy): Advance width and glyph format - were not correctly copied. - -2001-02-08 Tom Kacvinsky - - * src/cff/cffparse.c (cff_parse_font_matrix): Removed an - unnecessary fprintf( stderr, ... ). - -2001-02-07 Tom Kacvinsky - - * src/type1/t1objs.c (T1_Init_Face): Added code to get the - units_per_EM from the value assigned in parse_font_matrix, if - available. Default to 1000 if not available. - - * src/cff/cffparse.c (cff_parse_font_matrix): Added logic to get - the units_per_EM from the FontMatrix. - - (cff_parse_fixed_thousand): New function. Gets a real number from - the CFF font, but multiplies by 1000 (this is to avoid rounding - errors when placing this real number into a 16.16 fixed number). - - (cff_parse_real): Added code so that the integer part is moved - into the high sixteen bits of the 16.16 fixed number. - - * src/cff/cffobjs.c (CFF_Init_Face): Added logic to get the units - per EM from the CFF dictionary, if available. - - * include/freetype/internal/cfftypes.h: In struct CFF_Font_Dict_, - added a units_per_em member to facilitate passing of units_per_em - from function cff_parse_font_matrix. - - * src/type1/t1load.c (is_alpha): Make `-' a legal alphanumeric - character. This is so that font names with `-' are fully parsed, - etc... - -2001-02-02 Werner Lemberg - - * src/psaux/psobjs.c (shift_elements): Remove if clause (which is - obsolete now). - - (reallocate_t1_table, PS_Table_Done): Replace REALLOC() with ALLOC() - + MEM_Copy() to avoid a memory bug. - -2001-02-01 David Turner - - * docs/docmaker.py: Improved the index sorting routine to place - capital letters before small ones. Added the `' marker to - section blocks in order to give the order of blocks. - -2001-01-30 Antoine Leca - - * include/freetype/ttnameid.h: Latest updates to Microsoft language - ID codes. - -2001-01-24 Tom Kacvinsky - - * src/cff/t1load.c (parse_font_matrix): Added heuristic to get - units_per_EM from the font matrix. - - (parse_dict): Deleted test to see whether the FontInfo keyword has - been seen. Deletion of this test allows fonts without FontInfo - dictionaries to be parsed by the Type 1 driver. - - (T1_Open_Face): Deleted empty subroutines array test to make sure - fonts with no subroutines still are parsed. - -2001-01-17 Francesco Zappa Nardelli - - * src/pcfread.c (pcf_get_properties, pcf_get_metrics, - pcf_get_bitmaps): Fix compiler errors. - -2001-01-11 David Turner - - * src/pcf/pcfread.c: Removed some compilation warnings related - to comparison of signed vs. unsigned integers. - - * include/freetype/internal/ftdebug.h: Changed the debug trace - constants from trace_t2xxxx to trace_cffxxxx to be able to compile - the CFF driver in debug mode. - -2001-01-11 Matthew Crosby - - * builds/unix/freetype-config.in: Fix problems with separate - --prefix and --exec-prefix. - -2001-01-11 David Turner - - * docs/docmaker.py: Added cross-references generation as well as - more robust handling of pathname wildcard matching. - -2001-01-10 Werner Lemberg - - * docs/docmaker.py: Minor improvements to reduce unwanted spaces - and empty lines in output. - -2001-01-09 David Turner - - * docs/docmaker.py: Improved script to generate table of contents - and index pages. It also supports wildcards on non Unix systems. - - * include/freetype/*.h, include/freetype/cache/*.h: Updated comments - to include section definitions/delimitations for the API Reference - generator. - - * include/freetype/freetype.h: Moved declaration of - `FT_Generic_Finalizer' and the `FT_Generic' structure to... - * include/freetype/fttypes.h: here. - -2001-01-04 Werner Lemberg - - * include/freetype/ttnameid.h: Updated Unicode code range comments. - -2001-01-03 Tom Kacvinsky - - * src/cff/rules.mk: Use cffgload.{c,h} instead of t2gload.{c,h}. - - * include/freetype/internal/internal.h: Changed to use cfftypes.h - (cfferrs.h) instead of t2types.h (t2errors.h, respectively). - - * include/freetype/internal/cfftypes.h: Merged in changes from - t2types.h and made this the canonical `types' header for the CFF - driver. - - * include/freetype/internal/t2types.h: This file was merged with - cfftypes.h and is no longer necessary. - - * include/freetype/internal/t2errors.h: Renamed to cfferrs.h. - - * src/cff/cffobjs.c, src/cff/cffobjs.h, src/cff/cffparse.c, - src/cff/cffdrivr.c, src/cff/cff.c, src/cff/cffload.c, - src/cff/cffgload.c, src/cff/cffgload.h: Changed to use - cffgload.{c,h} instead of t2gload.{c,h}. All occurrences of t2_ - (T2_) were replaced with cff_ (CFF_, respectively). - - * src/cff/t2gload.h: Renamed cffgload.h. - - * src/cff/t2gload.c: Renamed cffgload.c - -2000-01-02 Jouk Jansen - - * builds/vms: Support files for VMS architecture added. - * descrip.mms, src/*/descrip.mms: VMS makefiles added. - * README.VMS: New file. - -2000-01-01 Werner Lemberg - - * LICENSE.TXT: Added info about PCF driver license. - -2001-01-01 Francesco Zappa Nardelli - - * src/pcf/*: New driver module for PCF font format (used in - X Window System). - * include/freetype/internal/ftdebug.h (FT_Trace): Added values for - PCF driver. - * include/freetype/internal/pcftypes.h: New file. - * include/freetype/config/ftmodule.h: Added PCF driver module. - -2001-01-01 Werner Lemberg - - * src/winfonts/winfnt.c (FNT_Get_Char_Index): Fix parameter type. - -2000-12-31 Werner Lemberg - - * builds/modules.mk (clean_module_list): Fixed deletion of module - file in case `make make_module_list' is called before `make setup'. - -2000-12-30 Werner Lemberg - - * src/cff/cffload.c (CFF_Load_Charset): Improved error messages. - (CFF_Load_Charset, CFF_Load_Encoding): Remove unnecessary variable - definition. - -2000-12-30 Tom Kacvinsky - - * include/freetype/internal/t2types.h, - include/freetype/internal/cfftypes.h: Changed the structures for - CFF_Encoding and CFF_Encoding for the new implementations of the - charset and encoding parsers in the CFF driver. - - * src/cff/t2gload.c (t2_lookup_glyph_by_stdcharcode, - t2_operator_seac): Added these functions for use in implementing the - seac emulation provided by the Type 2 endchar operator. - (T2_Parse_CharStrings): Added seac emulation for the endchar - operator. - - * src/cff/cffload.c (CFF_Load_Encoding, CFF_Load_Charset, - CFF_Done_Encoding, CFF_Done_Charset): Extended to load and parse the - charset/encoding tables, and free the memory used by them when the - CFF driver is finished with them. Added tables - - cff_isoadobe_charset - cff_expert_charset - cff_expertsubset_charset - cff_standard_encoding - cff_expert_encoding - - so that the encoding/charset parser can handle predefined encodings and - charsets. - -2000-12-24 Tom Kacvinsky - - * src/cff/t2gload.c (T2_Load_Glyph): Added code so that the font - transform is applied. - - * src/cff/cffparse.c (cff_parse_font_matrix): Added code so that - the font matrix numbers are scaled by 1/(matrix->yy). Also, the - offset vector now contains integer values instead of 16.16 fixed - numbers. - -2000-12-22 Tom Kacvinsky - - * src/autohint/ahhint.c (ah_hinter_load_glyph): - Removed unnecessary comments and commented-out code. - -2000-12-21 David Turner - - * src/cid/cidafm.c, src/cid/cidafm.h: removed un-needed files, - we'll work on supporting CID AFM files later I guess :-) - -2000-12-21 Tom Kacvinsky - - * src/autohint/ahhint.c (ah_hinter_load, ah_hinter_load_glyph): - Changed so that fonts with a non-standard FontMatrix render - correctly. Previously, the first glyph rendered from such a - font did not have the transformation matrix applied. - -2000-12-17 Werner Lemberg - - * *.mk: Added lots of `.PHONY' targets. - -2000-12-17 Karsten Fleischer - - * *.mk: Implemented `platform' target to disable auto-detection. - -2000-12-14 Werner Lemberg - - * docs/design/modules.html: Removed. Covered by design-*.html. - - * INSTALL: Added info about makepp. - -2000-12-14 David Turner - - Added support for clipped direct rendering in the smooth renderer. - This should not break binary compatibility of existing applications. - - * include/freetype/fttypes.h, include/freetype/ftimage.h: Move - definition of the FT_BBox structure from the former to the latter. - * include/freetype/ftimage.h: Add `ft_raster_flag_clip' value to - FT_Raster_Flag enumeration. - Add `clip_box' element to FT_Raster_Params structure. - * src/smooth/ftgrays.c (grays_convert_glyph): Implement it. - - * INSTALL: Updated installation instructions on Win32, listing the - new `make setup list' target used to list supported - compilers/targets. - - * src/raster/ftraster.c (ft_black_render): Test for unsupported - direct rendering before testing arguments. - -2000-12-13 David Turner - - * include/freetype/config/ft2build.h, - include/freetype/internal/internal.h: Fixed header inclusion macros - to use direct definitions. This is the only way to do these things - in a portable way :-( The rest of the code should follow shortly - though everything compiles now. - - * builds/compiler/intelc.mk, builds/compiler/watcom.mk: New files. - - * builds/win32/detect.mk: Added support for the Intel C/C++ - compiler, as well as _preliminary_ (read: doesn't work!) support for - Watcom. Also added a new setup target. Type `make setup list' for - a list of supported command-line compilers on Win32. - - * src/base/ftdebug.c: Added dummy symbol to avoid empty file if - conditionals are off. - -2000-12-13 Werner Lemberg - - * builds/unix/ftsystem.c: Fixed typos. Fixed inclusion of wrong - ftconfig.h file. - -2000-12-12 Werner Lemberg - - * include/freetype/config/ft2build.h (FT2_ROOT, FT2_CONFIG_ROOT): - Removed. ANSI C doesn't (explicitly) allow macro expansion in - arguments using `##'. - (FT2_PUBLIC_FILE, FT2_CONFIG_FILE, FT2_INTERNAL_FILE): Use directory - names directly. Make them configurable. Use `##' to strip leading - and trailing spaces from arguments. - - * builds/unix/ft2unix.h: Adapted. - - * src/base/ftsystem.c (ft_alloc, ft_realloc, ft_free, ft_io_stream, - ft_close_stream): Use FT_CALLBACK_DEF. - - * builds/unix/ftsystem.c: Use new header scheme. - (FT_Done_Memory): Use free() from FT_Memory structure. - - * src/base/ftinit.c, src/base/ftmac.c: Header scheme fixes. - -2000-12-11 Werner Lemberg - - * include/freetype/config/ft2build.h (FT2_CONFIG_ROOT, - FT2_PUBLIC_FILE, FT2_CONFIG_FILE, FT2_INTERNAL_FILE, - FT_SOURCE_FILE): Use `##' operator to be really ANSI C compliant. - -2000-12-09 Werner Lemberg - - * builds/unix/detect.mk: Remove unused USE_CFLAGS variable. - -2000-12-08 Werner Lemberg - - * */*.h: Changed body inclusion macro names to start and end with - `__' (those which haven't converted yet). Fixed minor conversion - issues. - - * src/winfonts/winfnt.c: Updated to new header inclusion scheme. - - * src/truetype/ttinterp.c: Remove unused CALC_Length() macro. - -2000-12-07 David Turner - - * */*.[ch]: Changed source files to adhere to the new - header inclusion scheme. Not completely tested but works for now - here. - - * src/cff/t2driver.c: Renamed and updated to... - * src/cff/cffdrivr.c: New file. - * src/cff/t2driver.h: Renamed and updated to... - * src/cff/cffdrivr.h: New file. - * src/cff/t2load.c: Renamed and updated to... - * src/cff/cffload.c: New file. - * src/cff/t2load.h: Renamed and updated to... - * src/cff/cffload.h: New file. - * src/cff/t2objs.c: Renamed and updated to... - * src/cff/cffobjs.c: New file. - * src/cff/t2objs.h: Renamed and updated to... - * src/cff/cffobjs.h: New file. - * src/cff/t2parse.c: Renamed and updated to... - * src/cff/cffparse.c: New file. - * src/cff/t2parse.h: Renamed and updated to... - * src/cff/cffparse.h: New file. - * src/cff/t2tokens.h: Renamed and updated to... - * src/cff/cfftoken.h: New file. - - * src/cff/cff.c, src/cff/rules.mk: Updated. - -2000-12-06 David Turner - - * src/cache/ftlru.c (FT_Lru_Done): Fixed memory leak. - -2000-12-06 Werner Lemberg - - * builds/module.mk: Replaced `xxx #' with `xxx$(space). - * builds/os2/detekt.mk, builds/win32/detekt.mk: Moved comment to - avoid trailing spaces in variable. - * builds/freetype.mk: Use $(D) instead of $D to make statement more - readable. - - * docs/docmaker.py: Formatting. - -2000-12-05 David Turner - - * src/psaux/psauxmod.c: Fixed a broken inclusion of component - header files (an FT_FLAT_COMPILE test was missing). - - * src/cache/ftcmanag.c (FTC_Manager_Done): Fixed a bug that caused - an occasional crash when the function was called (due to a dangling - pointer). - - * src/base/ftsystem.c (FT_Done_Memory): Fixed an obvious bug: - The ANSI `free()' function was called instead of `memory->free()'. - - * docs/docmaker.py: Added section filtering, multi-page generation - (index page generation is still missing though). - -2000-12-04 David Turner - - * builds/unix/install.mk, builds/unix/ft2unix.h: The file `ft2unix.h' - is now installed as for Unix systems. Note that we - still use the `freetype2/freetype' installation path for now. - - * */*.[ch]: Now using as the default build and setup - configuration file in all public headers. Internal source files - still need some changes though. - - * builds/devel/ft2build.h, builds/devel/ftoption.h: Created a new - directory to hold all development options for both the Unix and - Win32 developer builds. - - * builds/win32/detect.mk, builds/win32/w32-bccd.mk, - builds/win32/w32-dev.mk: Changed the developer build targets to - `devel-gcc' and `devel-bcc' in order to be able to develop with the - Borland C++ compiler. - -2000-12-01 David Turner - - - * Version 2.0.1 released. - ========================= - - - * builds/unix/configure.in, builds/unix/configure, - builds/cygwin/configure.in, builds/cygwin/configure: Setting - `version_info' to 6:1:0 for the 2.0.1 release. - - * CHANGES: Added a summary of changes between 2.0.1 and 2.0. - - * builds/unix/ftconfig.in, builds/cygwin/ftconfig.in: Changes - to allow compilation under Unix with the Unix-specific config - files. - -2000-12-01 Werner Lemberg - - * INSTALL: Revised. - * builds/compiler/bcc-dev.mk, builds/compiler/visualage.mk, - builds/compiler/bcc.mk, builds/win32/w32-bcc.mk, - builds/win32/w32-bccd.mk: Revised. - * include/freetype/config/ftbuild.h, - include/freetype/internal/internal.h: Revised. - * include/freetype/ftimage.h: Updated to new header inclusion scheme. - -2000-11-30 Werner Lemberg - - * builds/toplevel.mk (.PHONY): Adding `distclean'. - * builds/unix/detect.mk (.PHONY): Adding `devel', `unix', `lcc', - `setup'. - -2000-11-30 David Turner - - * INSTALL: Slightly updated the quick starter documentation to - include IDE compilation, prevent against BSD Make, and specify `make - setup' instead of a single `make' for build configuration. - - * include/config/ftbuild.h, include/internal/internal.h: Added new - configuration files used to determine the location of all public, - configuration, and internal header files for FreeType 2. Modified - all headers under `include/freetype' to reflect this change. Note - that we still need to change the library source files themselves - though. - - * builds/compiler/bcc.mk, builds/compiler/bcc-dev.mk, - builds/win32/w32-bcc.mk, builds/win32/w32-bccd.mk, - builds/win32/detect.mk: Added new files to support compilation with - the free Borland C++ command-line compiler. Modified the detection - rules to recognize the new `bcc32' target in `make setup bcc32'. - - * src/sfnt/ttcmap.c, src/sfnt/ttpost.c, src/sfnt/ttsbit.c, - src/truetype/ttobjs.c, src/truetype/ttgload.c, - src/truetype/ttinterp.c: Fixed a few comparisons that Borland C++ - didn't really like. Basically, this compiler complains when FT_UInt - is compared to FT_UShort (apparently, it promotes `UShort' to `Int' - in these cases). - -2000-11-30 Tom Kacvinsky - - * t2objs.c (T2_Init_Face): Added calculation of `face->height' for - pure CFF fonts. - - * t1objs.c (T1_Init_Face): Fixed computation of `face->height'. - -2000-11-29 David Turner - - * src/base/ftbbox.c (BBox_Conic_Check): Fixed a really stupid - bug in the formula used to compute the conic Bézier extrema - of non-monotonous arcs. - -2000-11-29 Werner Lemberg - - * src/base/ftcalc.c (FT_SqrtFixed), src/base/ftobjs.c - (FT_Set_Renderer): Use FT_EXPORT_DEF. - * src/cache/ftcimage.c (FTC_Image_Cache_Lookup), - src/cache/ftcmanag.c (FTC_Manager_Done, FTC_Manager_Reset, - FTC_Manager_Lookup_Face, FTC_Manager_Lookup_Size, - FTC_Manager_Register_Cache), src/cache/ftcsbits.c - (FTC_SBit_Cache_Lookup): Ditto. - - * src/include/freetype/cache/ftcglyph.h (FTC_GlyphNode_Init), - src/include/freetype/ftmac.h (FT_New_Face_From_FOND): Use FT_EXPORT. - -2000-11-29 Werner Lemberg - - * src/sfnt/sfdriver.c: Include ttsbit.h and ttpost.h only - conditionally. - - * src/truetype/ttdriver.c (Set_Char_Sizes, Set_Pixel_Sizes): Set - `size->strike_index' only conditionally. - - * src/type1/t1driver.c, src/type1/t1objs.c: Include t1afm.h only - conditionally. - - * src/winfonts/winfnt.h: Move all type definitions to... - * src/include/freetype/internal/fnttypes.h: New file. - * src/winfonts/winfnt.c: Use it. - -2000-11-29 ??? ??? - - * include/freetype/internal/ftdebug.h: Replaced FT_CAT and FT_XCAT - with a direct solution (which also satisfies picky compilers). - -2000-11-28 YAMANO-UCHI Hidetoshi - - * src/truetype/ttobjs.c (TT_Init_Size): Fix #ifdef's to work with - disabled interpreter also. - - * src/base/ftnames.c (FT_Get_Sfnt_Name_Count): Fix incorrect - parentheses. - -2000-11-26 Tom Kacvinsky - - * src/cff/t2gload.c (T2_Parse_CharStrings): Added logic to glyph - width setting code to take into account even/odd argument counts - and glyph width operand before endchar/hmoveto/vmoveto. - -2000-11-26 Werner Lemberg - - * builds/ansi/ansi.mk: Fix inclusion order of files. - -2000-11-26 Keith Packard - - * src/type1/t1objs.c (T1_Init_Face): Compute style flags. - -2000-11-26 Werner Lemberg - - * builds/compiler/ansi-cc.mk (CLEAN_LIBRARY): Fix rule and - conditional. - -2000-11-23 Werner Lemberg - - * src/type1/t1load.c (parse_subrs, parse_charstrings): Use decrypt - function from PSAux module. - - * src/type1/t1parse.c (T1_Done_Parse): Renamed to... - (T1_Finalize_Parser): New function (to avoid name clash with a - function in the PSAux module). - (T1_Decrypt): Removed since it is duplicated in the PSAux module. - (T1_Get_Private_Dict): Added `psaux' as new parameter; use decrypt - function from PSAux module. - - * src/type1/t1parse.h: Adapted. - -2000-11-22 Tom Kacvinsky - - * src/cff/t2objs.c (T2_Init_Face): For pure CFF fonts, set - `root->num_faces' to `cff->num_faces' and set `units_per_EM' - to 1000. - - * src/cff/t2parse.c (parse_t2_real): Fixed real number parsing - loop. - - * src/cff/t2load.c (T2_Get_String): Called T2_Get_Name with a - sid that was off by one. - -2000-11-16 David Turner - - * src/autohint/ahtypes.h (AH_Hinter): Added new fields to control - auto-hinting of synthetic Type 1 fonts. - - * src/autohint/ahhint.c (ah_hinter_load, ah_hinter_load_glyph): - Added auto-hinting support of synthetic Type 1 fonts. - -2000-11-12 Tom Kacvinsky - - * src/sfnt/ttload.c (TT_LookUp_Table, TT_Load_Generic_Table): Change - tracing output. - - * src/sfnt/sfobjs.c (SFNT_Load_Face): Set boolean variable - `has-outline' to true only if the font has a `glyf' or `CFF ' table. - -2000-11-11 Werner Lemberg - - * builds/win32/visualc/freetype.dsp: Fix raster1->raster and - type1z->type1. - -2000-11-11 Tom Kacvinsky - - * builds/unix/freetype-config.in, builds/cygwin/freetype-config.in: - Added a --libtool option. When freetype-config --libtool is - invoked, the absolute path to the libtool convenience library - is returned. - -2000-11-11 Werner Lemberg - - * builds/cygwin/cygwin-def.in: Same fix as previous. - -2000-11-10 Tom Kacvinsky - - * builds/unix/unix-def.in: Add - - INSTALL_PROGRAM := @INSTALL_PROGRAM@ - INSTALL_SCRIPT := @INSTALL_SCRIPT@ - - so that installation of freetype-config does not fail. - -2000-11-10 Werner Lemberg - - * builds/cygwin/freetype-config.in, builds/unix/freetype-config.in: - Move test down for empty --exec-prefix. - Fix --version. - - * builds/cygwin/install.mk, builds/unix/install.mk: Use - $(INSTALL_SCRIPT) for installation of freetype-config. - - * builds/cygwin/install.mk: Fix clean target names. - -2000-11-09 David Turner - - - * Version 2.0 released. - ======================= - ----------------------------------------------------------------------------- - -Copyright 2000-2015 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. - - -Local Variables: -version-control: never -coding: utf-8 -End: diff --git a/3party/freetype/ChangeLog.21 b/3party/freetype/ChangeLog.21 deleted file mode 100644 index a6f8be7543..0000000000 --- a/3party/freetype/ChangeLog.21 +++ /dev/null @@ -1,9439 +0,0 @@ -2005-06-08 Werner Lemberg - - - * Version 2.1.10 released. - ========================== - - - * src/pcf/readme: Renamed to... - * src/pcf/README: This. - -2005-06-07 Detlef Würkner - - * builds/amiga/*: Added copyright notes, reworked some comments. - -2005-06-05 Werner Lemberg - - * Add copyright notices to all files which don't have one. - - * docs/license.txt: Renamed to... - * docs/LICENSE.TXT: This. - * docs/FTL.txt: Renamed to... - * docs/FTL.TXT: This. - * docs/GPL.txt: Renamed to... - * docs/GPL.TXT: This. - - * docs/PATENTS: Slightly reworded. Suggested by Sylvain Beucler - . - -2005-06-04 Werner Lemberg - - * include/freetype/ftimage.h (FT_Outline_MoveToFunc, - FT_Outline_LineToFunc, FT_Outline_ConicToFunc, - FT_Outline_CubicToFunc, FT_Raster_RenderFunc), - include/freetype/ftrender.h (FT_Glyph_TransformFunc, - FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Don't use - `const' to stay compatible with FreeType 2.1.9. - -2005-06-01 Adam D. Moss - - * src/base/ftstroke.c (ft_stroker_inside): Revert `sigma' patch from - 2004-07-11; this gives much better results under normal - circumstances. - -2005-05-30 Chia I Wu - - * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Minor - documentation improvements. - - * include/freetype/ftoutln.h (FT_Outline_Embolden): Fix typos. - - * src/base/ftbitmap.c (FT_Bitmap_Embolden): Add support for bitmap - of pixel_mode FT_PIXEL_MODE_GRAY2 or FT_PIXEL_MODE_GRAY4. - If xstr is larger than 8 and bitmap is of pixel_mode - FT_PIXEL_MODE_MONO, set xstr to 8 instead of returning error. - -2005-05-29 Chia I Wu - - * src/base/ftbitmap.c (FT_Bitmap_Embolden): Fix emboldening bitmap - of mode FT_PIXEL_MODE_GRAY. Also add support for mode - FT_PIXEL_MODE_LCD and FT_PIXEL_MODE_LCD_V. - (ft_bitmap_assure_buffer): FT_PIXEL_MODE_LCD and FT_PIXEL_MODE_LCD_V - should have ppb (pixel per byte) 1. - Zero the padding when there's no need to allocate memory. - - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Handle slot->advance - too. - More suited emboldening strength. - -2005-05-28 Chia I Wu - - * src/base/ftbitmap.c (FT_Bitmap_Embolden): Handle negative pitch. - Handle FT_PIXEL_MODE_GRAY with num_gray != 256. - Improve speed for FT_PIXEL_MODE_GRAY. - (ft_bitmap_assure_buffer): Accept FT_PIXEL_MODE_LCD and - FT_PIXEL_MODE_LCD_V. - -2005-05-27 Chia I Wu - - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Initialize `error'. - - * src/base/ftobjs.c (ft_cmap_done_internal): New function. - (FT_CMap_Done): Remove cmap from cmap list. - (destroy_charmaps, FT_CMap_New): Don't call FT_CMap_Done but - ft_cmap_done_internal. - -2005-05-26 Werner Lemberg - - * docs/GPL.txt: Update postal address of FSF. - -2005-05-26 Chia I Wu - - * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Improve - documentation. - - * src/base/ftsynth.c (FT_BOLD_THRESHOLD): Removed. - (FT_GlyphSlot_Embolden): Check whether slot is bitmap owner. - Always modify the metrics. - -2005-05-24 Werner Lemberg - - * docs/CHANGES: Updated. - -2005-05-24 Chia I Wu - - * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): New declaration. - - * include/freetype/ftoutln.h (FT_Outline_Embolden): New declaration. - - * src/base/ftbitmap.c (ft_bitmap_assure_buffer): New auxiliary - function. - (FT_Bitmap_Embolden): New function. - - * src/base/ftoutln.c (FT_Outline_Embolden): New function. - - * src/base/ftsynth.c: Don't include FT_INTERNAL_CALC_H and - FT_TRIGONOMETRY_H but FT_BITMAP_H. - (FT_GlyphSlot_Embolden): Use FT_Outline_Embolden or - FT_Bitmap_Embolden. - -2005-05-24 Werner Lemberg - - * configure: Always remove config.mk, builds/unix/unix-def.mk, and - builds/unix/unix-cc.mk. This fixes repeated calls of the script. - Reported by Nelson Beebe and Behdad Esfahbod. - - * README.CVS: Mention file permissions. - -2005-05-23 Werner Lemberg - - * builds/amiga/makefile.os4 (WARNINGS), builds/compiler/gcc-dev.mk - (CFLAGS), builds/compiler/gcc.mk (CFLAGS): Remove - -fno-strict-aliasing. - - * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c -- - it is currently loaded from ttsbit.c. - -2005-05-23 Behdad Esfahbod - - Say you have `(Foo*)x' and want to assign, pass, or return it as - `(Bar*)'. If you simply say `x' or `(Bar*)x', then the C compiler - would warn you that type casting incompatible pointer types breaks - strict-aliasing. The solution is to cast to `(void*)' instead which - is the generic pointer type, so the compiler knows that it should - make no strict-aliasing assumption on `x'. But the problem with - `(void*)x' is that seems like in C++, unlike C, `void*' is not a - generic pointer type and assigning `void*' to `Bar*' without a cast - causes an error. The solution is to cast to `Bar*' too, with - `(Bar*)(void*)x' as the result -- this is what the patch does. - - * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP), - include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Remove - cast on lvalue, use a temporary pointer instead. - Cast temporarily to (void*) to not break strict aliasing. - - * include/freetype/internal/ftmemory.h (FT_MEM_ALLOC, - FT_MEM_REALLOC, FT_MEM_QALLOC, FT_MEM_QREALLOC, FT_MEM_FREE), - src/base/ftglyph.c (FT_Glyph_To_Bitmap): Cast temporarily to (void*) - to not break strict aliasing. - - * src/base/ftinit.c (FT_USE_MODULE): Fix wrong type information. - - * builds/unix/configure.ac (XX_CFLAGS): Remove -fno-strict-aliasing. - -2005-05-23 David Turner - - Fix Savannah bug #12213 (incorrect behaviour of the cache sub-system - in low-memory conditions). - - * include/freetype/cache/ftccache.h (FTC_CACHE_TRYLOOP, - FTC_CACHE_TRYLOOP_END): New macros. - - * src/cache/ftccache.c (FTC_Cache_NewNode), src/cache/ftcsbits.c - (ftc_snode_compare): Use FT_CACHE_TRYLOOP and FTC_CACE_TRYLOOP_END. - -2005-05-23 Werner Lemberg - - * src/base/rules.mk (BASE_SRC): Don't add ftsynth.c here but... - (BASE_EXT_SRC): Here. - -2005-05-22 Werner Lemberg - - * src/base/ftrfork.c (raccess_guess_apple_generic): Mark - `version_number' and `entry_length' as unused. - (raccess_guess_linux_double_from_file_name): Remove `memory'. - (raccess_make_file_name): Mark `error' as unused. - - * src/bdf/bdflib.c (_bdf_parse_properties): Remove `memory'. - - * src/cid/cidobjs.c (cid_face_init): Remove `psnames'. - - * src/sfnt/sfobjs.c (sfnt_load_face): Remove `memory'. - - * src/truetype/ttgxvar.c (ft_var_readpackedpoints, - ft_var_readpackeddeltas, ft_var_load_avar): Mark `error' as unused. - - * src/base/rules.mk (BASE_SRC): Add ftsynth.c. - -2005-05-21 David Turner - - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Fix a bug that - produced unpleasant artefacts when trying to embolden very sharp - corners. - -2005-05-20 Werner Lemberg - - * docs/CHANGES: Updated. - -2005-05-20 Chia I Wu - - * src/base/ftbitmap.c: Don't include FT_FREETYPE_H and FT_IMAGE_H - but FT_BITMAP_H. - (FT_Bitmap_Copy): New function (from ftglyph.c). - - * include/freetype/ftbitmap.h (FT_Bitmap_Copy): New public - definition. - - * src/base/ftglyph.c: Include FT_BITMAP_H. - (ft_bitmap_copy): Move to ftbitmap.c. - (ft_bitmap_glyph_init): Remove `memory' variable. - Create new bitmap object if FT_GLYPH_OWN_BITMAP isn't set. - (ft_bitmap_glyph_copy): Use FT_Bitmap_Copy. - (ft_bitmap_glyph_done): Use FT_Bitmap_Done. - (ft_outline_glyph_init): Use FT_Outline_Copy. - - * src/base/ftoutln.c (FT_Outline_Copy): Handle source == target. - (FT_Outline_Done_Internal): Check for valid `memory' pointer. - (FT_Outline_Translate, FT_Outline_Reverse, FT_Outline_Render, - FT_Outline_Transform): Check for valid `outline' pointer. - - * src/base/ftobjs.c (FT_New_GlyphSlot): Prepend glyph slot to - face->glyph, otherwise a new second glyph slot cannot be created. - (FT_Done_GlyphSlot): Fix memory leak. - (FT_Open_Face): Updated -- face->glyph is already managed by - FT_New_GlyphSlot. - - * src/type42/t42objs.c (T42_GlyphSlot_Done): Updated. - -2005-05-20 Kirill Smelkov - - * include/freetype/ftimage.h (FT_Raster_Params), - include/freetype/ftoutln.h (FT_Outline_Translate, - FT_Outline_Transform), src/base/ftoutln.c (FT_Outline_Translate, - FT_Outline_Transform): Decorate parameters with `const' where - appropriate. - Update all callers. - - * src/raster/ftraster.c (ft_black_reset), src/smooth/ftgrays.c - (gray_raster_reset): Remove `const' from `pool_base' argument. - -2005-05-18 Kirill Smelkov - - * src/raster/ftmisc.h: New file. Only needed if ftraster.c is - compiled as stand-alone. - - * src/raster/ftraster.c: Add comment how to compile as stand-alone. - s/FT_CONFIG_OPTION_STATIC_RASTER/FT_STATIC_RASTER/. - s/TT_STATIC_RASTER/FT_STATIC_RASTER/. - [_STANDALONE_]: Include ftimage.h and ftmisc.h. - (FT_TRACE1, FT_TRACE6, ft_memset, FT_MEM_ZERO): Define - conditionally. - (Render_Glyph, Render_Gray_Glyph): Return Raster_Err_None (or - Raster_Err_Unsupported). - (ft_black_new) [_STANDALONE_]: Fix type of `the_raster'. - (ft_black_init, ft_black_reset, ft_black_set_mode, ft_black_render): - Use `ras', not `raster'. - (ft_black_done): Use FT_UNUSED_RASTER. - (Horizontal_Sweep_Init, Horizontal_Sweep_Step, - Horizontal_Gray_Sweep_Span): Use FT_UNUSED_RASTER. - -2005-05-18 Werner Lemberg - - * docs/announce: Start updating. - - * docs/CHANGES: Updated. - -2005-05-16 Vitaliy Pasternak - - * builds/win32/visualc/freetype.vcproj: Updated. - Exclude debug info for `Release' versions to reduce library size. - -2005-05-16 Werner Lemberg - - * src/base/ftobjs.c (FT_Open_Face): Make it work as documented, this - is, ignore `aface' completely if face_index < 0. Reported by David - Osborn . - -2005-05-16 Kirill Smelkov - - * include/freetype/ftimage.h (FT_Outline_MoveToFunc, - FT_Outline_LineTo_Func, FT_Outline_ConicToFunc, - FT_Outline_CubicToFunc), src/smooth/ftgrays.c (gray_render_conic, - gray_render_cubic, gray_move_to, gray_line_to, gray_conic_to, - gray_cubic_to, gray_render_span, gray_sweep): Decorate parameters - with `const' where appropriate. - -2005-05-11 Kirill Smelkov - - * include/freetype/ftimage.h (FT_Raster_RenderFunc), - include/freetype/ftrender.h (FT_Glyph_TransformFunc, - FT_Renderer_Render_Func, FT_Renderer_TransformFunc), - src/base/ftglyph.c (ft_outline_glyph_transform), - src/raster/ftrend1.c (ft_raster1_transform, ft_raster1_render), - src/smooth/ftgrays.c (FT_Outline_Decompose, gray_raster_render), - src/smooth/ftsmooth.c (ft_smooth_transform, - ft_smooth_render_generic, ft_smooth_render, ft_smooth_render_lcd, - ft_smooth_render_lcd_v): Decorate parameters with `const' where - appropriate. - - * src/raster/ftraster.c (RASTER_RENDER_POOL): Removed. Obsolete. - (ft_black_render): Decorate parameters with `const' where - appropriate. - -2005-05-11 Werner Lemberg - - * src/sfnt/ttcmap.c (tt_cmap4_set_range): Fix typo (FT_PEEK_SHORT -> - FT_PEEK_USHORT) which caused crashes. Reported by Ismail Donmez - . - -2005-05-08 Werner Lemberg - - * include/freetype/internal/ftserv.h (FT_FACE_FIND_GLOBAL_SERVICE) - [__cplusplus]: Fix typo. - -2005-05-07 Werner Lemberg - - Handle unsorted SFNT type 4 cmaps correctly (reported by Dirck - Blaskey ). - - * src/sfnt/ttcmap.h (TT_CMap): Add member `unsorted'. - * src/sfnt/ttcmac.c: Use SFNT_Err_Ok where appropriate. - - (tt_cmap0_validate, tt_cmap2_validate, tt_cmap6_validate, - tt_cmap8_validate, tt_cmap10_validate, tt_cmap12_validate): Use - `FT_Error' as return type. - (tt_cmap4_validate): Use `FT_Error' as return type. - Return error code for unsorted cmap. - (tt_cmap4_char_index, tt_cmap4_char_next): Use old code for unsorted - cmaps. - (tt_face_build_cmaps): Set `unsorted' variable in cmap. - -2005-05-07 Werner Lemberg - - * src/truetype/ttpload.c (tt_face_get_location): Fix typo. - -2005-05-06 Werner Lemberg - - * src/cff/cffobjs.c (cff_face_init): Set ppem value in top - dictionary for SFNT-based CFF. - -2005-05-05 Werner Lemberg - - Handle malformed `loca' table entries. - - * docs/TODO: Add some bugs which should be fixed. - - * include/freetype/internal/tttypes.h (TT_FaceRec): Add `glyf_len' - element. - - * src/truetype/ttpload.c (tt_face_load_loca): Get length of `glyf' - table. - (tt_face_get_location): Fix computation of `asize' for malformed - `loca' entries. - -2005-05-01 David Turner - - * Jamfile: Remove `otvalid' from the list of compiled modules. - - * include/freetype/internal/ftserv.h: Add compiler pragmas to get - rid of annoying warnings with Visual C++ compiler in maximum warning - mode. - - * src/autofit/afhints.c, src/autofit/aflatin.c, src/base/ftstroke.c, - src/bdf/bdfdrivr.c, src/cache/ftcbasic.c, src/cache/ftccmap.c, - src/cache/ftcmanag.c, src/cff/cffload.c, src/cid/cidload.c, - src/lzw/zopen.c, src/otvalid/otvgdef.c, src/pcf/pcfread.c, - src/sfnt/sfobjs.c, src/truetype/ttgxvar.c: Remove compiler warnings. - -2005-04-28 Werner Lemberg - - * docs/TODO: Updated. - -2005-04-24 Werner Lemberg - - * src/otvalid/otvcommn.c - (otv_GSUBGPOS_have_MarkAttachmentType_flag): Handle table == 0. - -2005-04-16 Werner Lemberg - - * src/cff/cffobjs.c (cff_face_init): Set default upem value in top - font dict also. - Handle font matrix settings in subfonts. - - * src/cff/cffgload.c (cff_slot_load): Use the correct font matrix - for CID-keyed fonts with subfonts. - - * docs/formats.txt: Updated. - -2005-04-14 Kirill Smelkov - - * include/freetype/freetype.h (FT_Vector_Transform), - include/freetype/ftimage.h (FT_Raster_Params), - include/freetype/ftoutln.h, src/base/ftoutln.c (FT_Outline_Get_CBox, - FT_Outline_Copy, FT_Outline_Transform, FT_Vector_Transform, - FT_Outline_Get_Bitmap), src/raster/ftraster.c (ft_black_render), - src/smooth/ftgrays.c (gray_raster_render): Decorate parameters with - `const' where appropriate. - -2005-04-14 Werner Lemberg - - * src/type1/t1load.c (parse_charstrings): Catch this non-standard - beginning of the /CharStrings dictionary: - - /CharStrings 118 dict def - Private begin - CharStrings begin - - * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Fix arguments - to call of tt_sbit_decoder_load_bitmap. - -2005-04-13 Werner Lemberg - - * docs/TODO: Updated. - - * autogen.sh: Use `--force' for all commands. - -2005-04-09 Werner Lemberg - - * src/pshinter/pshalgo.c (ps_hints_apply): Change scaling values - only if `fitted' is not zero. - -2005-04-06 Werner Lemberg - - * src/truetype/ttgload.c (tt_face_get_metrics) [FT_OPTIMIZE_MEMORY]: - Fix typo which sometimes causes wrong metrics for the last glyph. - -2005-04-04 David Turner - - * devel/ftoption.h, include/freetype/config/ftoption.h - (FT_OPTIMIZE_MEMORY): Comment out this macro for the upcoming 2.1.10 - release. - (*_CHESTER_*): Removed. No longer used. - - * src/autofit/afhints.c (af_axis_hints_new_segment, - af_axis_hints_new_edge): Small tweak to use less heap memory. - -2005-04-03 Werner Lemberg - - * src/type1/t1parse.c (T1_New_Parser): Relax the check for a valid - first line in the font. - -2005-04-03 Werner Lemberg - - * docs/CHANGES, include/freetype/freetype.h: Improve documentation - of FT_Set_Pixel_Sizes and FT_Set_Char_Size. - -2005-03-26 Detlef Würkner - - * builds/amiga/src/base/ftsystem.c (ft_amiga_stream_io): Fix buffer - offsets after a large read. - -2005-03-26 Werner Lemberg - - * src/autofit/afglobal.c (af_face_globals_get_metrics): - s/index/gidx/. - - * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Fix compiler - warnings. - - * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttsbit0.c. - - * src/sfnt/ttsbit0.h: Dummy file for build with `make'. - -2005-03-26 Detlef Würkner - - Update of the Amiga port. - - * builds/amiga/makefile, builds/amiga/makefile.os4, - builds/amiga/smakefile: Included the base extension files - (ftbitmap.c, ftotval.c, ftpfr.c, ftstroke.c, ftxf86.c). - -2005-03-25 Detlef Würkner - - Update of the Amiga port. - - * builds/amiga/makefile, builds/amiga/smakefile: Handle new modules. - - * builds/amiga/makefile.os4: Makefile for AmigaOS4 SDK. - - * builds/amiga/README: Updated. - - * builds/amiga/include/freetype/config/ftconfig.h: Handle gcc for - AmigaOS4. - - * builds/amiga/include/freetype/config/ftmodule.h: Handle new - modules. - - * builds/amiga/src/base/ftdebug.c: Updated to current version of - default ftdebug.c. - Add various include files and macros to have proper support for - both AmigaOS4 and older AmigaOS versions. - Don't declare KVPrintF explicitly. - Replace getenv with GetVar. - Actually enable debugging code. - - * builds/amiga/src/base/ftsystem.c: Major rewrite. - -2005-03-23 Werner Lemberg - - * tests/*: Removed. - -2005-03-23 Werner Lemberg - - * docs/CHANGES, docs/INSTALL.ANY: Updated. - - * include/freetype/ftmoderr.h: Replace `Autohint' with `Autofit'. - Add `OTvalid'. - - * src/autofit/aferrors.h: New file. - - * src/autofit/afglobal.c, src/autofit/afhints.c, - src/autofit/aflatin.c, src/autofit/afloader.c: s/FT_Err_/AF_Err_/. - Include aferrors.h. - - * src/autofit/rules.mk (AUTOF_DRV_H): Include aferrors.h. - - * src/otvalid/otverror.h: s/FT_Mod_Err_OTV/FT_Mod_Err_OTvalid/. - -2005-03-22 David Turner - - * src/autohint/*: Removed. - * Jamfile: Updated. - -2005-03-15 David Turner - - * src/bdf/bdflib.c: Remove compiler warnings. - (hash_rehash, hash_init): Don't call FT_MEM_ZERO. - (_bdf_list_t): Add `memory' field. - (_bdf_list_init, _bdf_list_done, _bdf_list_ensure): New functions. - (_bdf_shift, _bdf_join): Rename to... - (_bdf_list_shift, _bdf_list_join): This. - (_bdf_split): Renamed to... - (_bdf_list_split): This. Use new functions. - (bdf_internal_readstream): Removed. - (NO_SKIP): New macro. - (_bdf_readstream): Rewritten. - (bdf_create_property, _bdf_add_comment): Improve allocation. - (_bdf_set_default_spacing, _bdf_parse_glyphs): Updated. Improve - allocation. - (_bdf_parse_properties, _bdf_parse_start): Updated. - (bdf_load_font): Updated to use new functions. - - * src/type1/t1parse.c (check_type1_format): New function. - (T1_New_Parser): Use it to check font header before allocating - anything on the heap. - - * src/type42/t42parse.c (t42_parser_init): Modify functions to check - the font header before allocating anything on the heap. - - * include/freetype/internal/ftmemory.h (FT_ARRAY_MAX, - FT_ARRAY_CHECK): New macros. - - * src/base/ftstream.c (FT_Stream_TryRead): New function. - * include/freetype/internal/ftstream.h: Updated. - - * src/pcf/pcfread.c (pcf_read_TOC), src/pcf/pcfutil.c - (BitOrderInvert, TwoByteSwap, FourByteSwap): Minor fixes and - simplifications. Try to protect the PCF driver from doing stupid - things with broken fonts. - - * src/lzw/ftlzw.c (FT_Stream_OpenLZW): Check the LZW header before - doing anything else. This avoids unnecessary heap allocations - (400KByte of heap memory for the LZW decoder). - - * src/gzip/ftgzip.c (FT_Stream_OpenGZip): Ditto for the gzip - decoder, although the code savings are smaller. - - * docs/CHANGES: Updated. - -2005-03-10 David Turner - - * src/tools/glnames.py: Add comment to explain the compression - being used for the Adobe Glyph List. - -2005-03-10 Werner Lemberg - - * src/truetype/ttpload.c (tt_face_load_cvt, tt_face_load_fpgm): - Fix serious typo which prevented correct TT rendering. - - * include/freetype/internal/ftmemory.h: Undo change from 2005-03-03. - To suppress warnings it is sufficient to use `-fno-strict-aliasing'. - -2005-03-10 Werner Lemberg - - * src/tools/glnames.py: Formatted. - Format output to be in sync with other FreeType code. - Import `re' and `os.path'. - (StringTable) <__init__>: Add parameter to initialize master table - name. - (StringTable) : Don't pass master table name. - (StringTable) : Emit explanatory comment. - Simplify and make output more human readable. - (t1_bias, glyph_list, adobe_glyph_names): Removed. Unused. - (main): Use `basename' for file name in header. - - * src/psnames/pstables.h: Regenerated. - -2005-03-09 David Turner - - * src/tools/glnames.py: Rewrite the generator for the `pstables.h' - header file which contains various constant tables related to glyph - names. It now uses a different, more compact storage scheme that - saves about 20KB. This also closes Savannah bug #12262. - - * src/psnames/pstables.h: Regenerated. - - * src/psnames/psmodule.c (ps_unicode_value): Use - `ft_get_adobe_glyph_index', a new function defined in `pstables.h'. - (ps_get_macintosh_name, ps_get_standard_strings): Updated. - - * src/base/ftobjs.c (FT_Set_Char_Sizes): Handle fractional sizes - more carefully. This fixes Savannah bug #12263. - -2005-03-06 David Turner - - * src/otvalid/otvgsub.c, src/otvalid/otvgpos.c: Make static tables - constant. - - * src/autofit/aflatin.c (af_latin_metrics_init): Fix Savannah bug - #12212 (auto-hinter refuses to work if no Unicode charmap in font). - -2005-03-05 Werner Lemberg - - * autogen.sh: New script for bootstrapping. - - * README.CVS: New file which documents bootstrapping. - - * builds/unix/aclocal.m4, builds/unix/config.guess, - builds/unix/config.sub, builds/unix/configure, - builds/unix/ltmain.sh: Removed. - -2005-03-04 Werner Lemberg - - * src/base/ftutil.c: Include FT_INTERNAL_OBJECTS_H. - -2005-03-03 Werner Lemberg - - Various fixes for C and C++ compiling. - - * src/autofit/*: Add copyright messages. - - * src/autofit/afhints.c (af_glyph_hints_done): Don't use - `AF_Dimension' but `int' for loop counter. - - * src/autofit/aflatin.c (af_latin_metrics_init_widths): Don't use - `AF_Dimension' but `int' for loop counter. - Use proper enumeration value for `render_mode'. - (af_latin_metrics_scale_dim): Don't shadow variables. - (af_latin_hints_compute_segments): Use proper cast for `major_dir' - and `segment_dir'. - (af_latin_align_linked_edge, af_latin_hint_edges): Fix arguments of call to - `af_latin_compute_stem_width'. - (af_latin_hints_apply): Don't use `AF_Dimension' but `int' for loop - counter. - - * src/base/ftdbgmem.c (ft_mem_table_get_source, FT_DumpMemory): Use - proper cast for memory allocation. - - * src/cff/cffdrivr.c (cff_get_kerning): Use proper cast for - initialization of `sfnt'. - - * src/sfnt/sfdriver.c: Include `ttkern.h'. - - * src/sfnt/ttkern.c (tt_face_get_kerning): Don't shadow variables. - - * src/truetype/ttgload.c: Include `ttpload.h'. - -2005-03-03 David Turner - - * include/freetype/internal/ftmemory.h (FT_ALLOC, FT_REALLOC, - FT_QALLOC, FT_QREALLOC) [gcc >= 3.3]: Provide macro versions which - avoid compiler warnings. - (FT_NEW, FT_NEW_ARRAY, FT_RENEW_ARRAY, FT_QNEW, FT_QNEW_ARRAY, - FT_QRENEW_ARRAY, FT_ALLOC_ARRAY, FT_REALLOC_ARRAY): Updated. - - * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, - FT_FACE_FIND_GLOBAL_SERVICE, FT_FACE_LOOKUP_SERVICE) [__cplusplus]: - Provide macro versions which avoid compiler warnings. - - * src/base/ftutil.c (ft_highpow2): New utility function. - - * include/freetype/internal/ftobjs.h: Updated. - - * src/pfr/pfrload.c (pfr_get_gindex, pfr_compare_kern_pairs, - pfr_sort_kerning_pairs): Don't define if FT_OPTIMIZE_MEMORY is set. - (pfr_phy_font_done): Don't handle `kern_pairs' if FT_OPTIMIZE_MEMORY - is set. - (pfr_phy_font_load): Don't call `pfr_sort_kerning_pairs' if - FT_OPTIMIZE_MEMORY is set. - - * src/pfr/pfrobjs.c (pfr_slot_load): Comment out some code which - doesn't work with broken fonts. - (pfr_face_get_kerning) [FT_OPTIMIZE_MEMORY]: Implement. - - * src/pfr/pfrtypes.h (PFR_KernItemRec): Optimize member types. - (PFR_NEXT_KPAIR): New macro. - (PFR_PhyFontRec): Don't define `kern_pairs' if FT_OPTIMIZE_MEMORY is - set. - - * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Introduce - temporary variable to avoid gcc warning. - (tt_face_load_sbit_image): Mark unused variables with FT_UNUSED. - - * src/truetype/ttpload.c (tt_face_load_loca) [FT_OPTIMIZE_MEMORY]: - Remove redundant variable. - - * include/freetype/config/ftmodule.h: Moving the order of drivers to - speed up font loading. The PCF and BDF loaders are still slow and - consume far too much memory. - -2005-03-03 Werner Lemberg - - * devel/ftoption.h: Updated to recent changes. - -2005-03-02 Werner Lemberg - - * src/autofit/afdummy.c, src/autofit/afdummy.h - (af_dummy_script_class): Fix type. - - * src/autofit/aflatin.c, src/autofit/aflatin.h - (af_latin_script_class): Fix type. - - * src/autofit/rules.mk (AUTOF_DRV_SRC): Fix typo. - -2005-03-01 David Turner - - * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning), - src/sfnt/ttsbit0.c (tt_face_load_sbit_strikes, - tt_sbit_decoder_load_byte_aligned, tt_sbit_decoder_load_compound, - tt_sbit_decoder_load_image), src/sfnt/ttload.c - (tt_face_load_metrics): Remove compiler warnings - -- redundant variables, missing initializations, etc. - - * src/sfnt/ttsbit.h: Handle FT_OPTIMIZE_MEMORY. - - * src/autofit/rules.mk, src/autofit/module.mk, - src/autofit/afangles.h: New files. - - * src/autofit/afhints.c (af_axis_hints_new_segment, - af_axis_hints_new_edge): New functions. - (af_glyph_hints_done): Do proper deallocation. - (af_glyph_hints_reload): Only reallocate points array. This - drastically reduces heap usage. - - * src/autofit/afhints.h (AF_PointRec, AF_SegmentRec): Optimize - member types and positions. - (AF_AxisHintsRec): Add `max_segments' and `max_edges'. - (af_axis_hints_new_segment, af_axis_hints_new_edge): New prototypes. - - * src/autofit/aflatin.c (af_latin_metricsc_scale): Don't call - AF_SCALER_EQUAL_SCALES. - (af_latin_hints_compute_segments): Change return type to FT_Error. - Update all callers. - Improve segment allocation. - (af_latin_hints_compute_edges): Change return type to FT_Error. - Update all callers. - Improve edge allocation and link handling. - (af_latin_hints_detect_features): Change return type to FT_Error. - Update all callers. - - * src/autofit/aflatin.h: Updated. - - * src/autofit/afloader.c (af_loader_load_g) - : Assure axis->num_edges > 1. This fixes - a bug with certain fonts. - - * include/freetype/config/ftmodule.h: The auto-fitter is now the - only supported auto-hinting module. - - * include/freetype/config/ftstdlib.h (FT_INT_MAX): New macro. - -2005-02-28 Werner Lemberg - - * src/truetype/ttpload.c (tt_face_load_loca): Fix typo. - - * src/sfnt/ttkern.c: Include `ttkern.h'. - (FT_COMPONENT): Updated. - - * include/freetype/internal/fttrace.h: Add entry for `ttkern'. - - * src/sfnt/ttsbit0.c: s/FT_Err_/SFNT_Err_/. - Decorate constants with `U' and `L' where necessary. - - * src/sfnt/ttcmap.c (tt_cmap4_next): Remove unused variable. - -2005-02-28 David Turner - - * src/base/ftdbgmem.c (FT_DumpMemory): Added sorting of memory - sources according to decreasing maximum cumulative allocations. - (ft_mem_source_compare): New auxiliary function. - - * src/sfnt/ttsbit0.c: New file, implementing a heap-optimized - embedded bitmap loader. - - * src/sfnt/ttsbit.c: Include `ft2build.h', FT_INTERNAL_DEBUG_H, - FT_INTERNAL_STREAM_H, FT_TRUETYPE_TAGS_H. - Load `ttsbit0.c' if FT_OPTIMIZE_MEMORY is set, otherwise use - file contents. - (tt_face_load_sbit_strikes): Set up root fields to indicate the - strikes. This fixes Savannah bug #12107. - Use `static' keyword for `sbit_line_metrics_field', - `strike_start_fields', `strike_end_fields'. - - * include/freetype/internal/tttypes.h (TT_FaceRec): Define - `sbit_table', `sbit_table_size', `sbit_num_strikes' if - FT_OPTIMIZE_MEMORY is set. - Don't define `num_sbit_strikes' and `sbit_strikes' if - FT_OPTIMIZE_MEMORY is set. - - * src/cff/cffobjs.c (sbit_size_reset): Handle FT_OPTIMIZE_MEMORY. - - * src/sfnt/sfobjs.c (sfnt_load_face): Fixed bug that prevented - loading SFNT fonts without a `kern' table. - Properly pass root->face_flags. - Remove code for TT_CONFIG_OPTION_EMBEDDED_BITMAPS. - - * src/sfnt/sfdriver.c (sfnt_interface) - [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Don't use `tt_find_sbit_image' - and `tt_load_sbit_metrics'. - - * src/sfnt/ttcmap.c: Optimize linear charmap scanning for Format 4. - (OPT_CMAP4): New macro. - (TT_CMap4Rec) [OPT_CMAP4]: New structure. - (tt_cmap4_init, tt_cmap4_set_range, tt_cmap4_next, tt_cmap4_reset) - [OPT_CMAP4]: New functions. - (tt_cmap4_char_next) [OPT_CMAP4]: Use `tt_cmap4_next' and - `tt_cmap4_reset'. - (tt_cmap4_class_rec) [OPT_CMAP4]: Use `TT_CMap4Rec' and - `tt_cmap4_init'. - - * src/truetype/ttobjs.c (Reset_SBit_Size): Handle - FT_OPTIMIZE_MEMORY. - - * src/autofit/afhints.h (AF_PointRec, AF_SegmentRec, AF_EdgeRec): - Optimize member types. - - * src/autofit/afloader.c (af_loader_done): Call - `af_glyph_hints_done'. - -2005-02-27 David Turner - - * src/sfnt/ttkern.c (tt_face_load_kern): Fix a small bug which - caused invalid (random) return values for the horizontal kerning. - -2005-02-25 David Turner - - Implement several memory optimizations to drastically reduce the - heap usage of FreeType, especially in the case of memory-mapped - files. The idea is to avoid loading and decoding tables in the - heap, and instead access the raw data whenever possible (i.e., when - it doesn't compromise performance). - - This has several benefits: For example, opening vera.ttf now uses - just a small amount of memory (even when the FT_Library footprint is - accounted for), until you start loading glyphs. Even then, you save - at least 20KB compared to the non-optimized case. Performance of - various operations, including open and close, has also been - dramatically improved. - - More optimizations to come, especially for the auto-hinter. - - * include/freetype/internal/sfnt.h (TT_Face_GetKerningFunc): New - function type. - (SFNT_Interface): Add it. - - * include/freetype/internal/tttypes.h (TT_HdmxEntryRec, TT_HdmxRec, - TT_Kern0_PairRec): Don't define if FT_OPTIMIZE_MEMORY is set. - (TT_FaceRec): Define `horz_metrics', `horz_metrics_size', - `vert_metrics', `vert_metrics_size', `hdmx_table', - `hdmx_table_size', `hdmx_record_count', `hdmx_record_size', - `hdmx_record_sizes', `kern_table', `kern_table_size, - `num_kern_tables', `kern_avail_bits', `kern_order_bits' if - FT_OPTIMIZE_MEMORY is set. - Don't define `hdmx', `num_kern_pairs', `kern_table_index', - `kern_pairs' if FT_OPTIMIZE_MEMORY is set. - - * src/base/ftdbgmem.c (ft_mem_table_set): Don't shadow variable. - Fix compiler warning. - - * src/cff/cffdrivr.c (Get_Kerning): Renamed to... - (cff_get_kerning): This. Simplify. - (cff_driver_class): Updated. - - * src/sfnt/Jamfile (_sources): Add `ttkern'. - * src/sfnt/rules.mk (SFNT_DRV_SRC): Add `ttkern.c'. - - * src/sfnt/sfdriver.c (sfnt_interface): Add `tt_face_get_kerning'. - - * src/sfnt/sfnt.c: Include `ttkern.c'. - - * src/sfnt/sfobjs.c: Include `ttkern.h'. - (sfnt_load_face): Consider the `kern' and `gasp' table as optional. - (sfnt_done_face): Call `tt_face_done_kern'. - Handle horizontal metrics for FT_OPTIMIZE_MEMORY. - - * src/sfnt/ttkern.c, src/sfnt/ttkern.h: New files. Code has been - taken from `ttload.c' and `ttload.h'. - Provide special versions of `tt_face_load_kern', - `tt_face_get_kerning', and `tt_face_done_kern' for - FT_OPTIMIZE_MEMORY. - - * src/sfnt/ttload.c (tt_face_load_metrics, tt_face_load_hdmx, - tt_face_free_hdmx): Provide version for FT_OPTIMIZE_MEMORY. - (tt_face_load_kern, tt_kern_pair_compare, TT_KERN_INDEX): Moved to - `ttkern.c'. - - * src/sfnt/ttload.h: Updated. - - * src/sfnt/ttsbit.c (sbit_metrics_field): Add `static' keyword. - - * src/truetype/ttdriver.c (Get_Kerning): Renamed to... - (tt_get_kerning): This. Simplify. - (tt_driver_class): Updated. - - * src/truetype/ttgload.c (TT_Get_Metrics): Renamed to... - (tt_face_get_metrics): This. Provide version for FT_OPTIMIZE_MEMORY. - Update all callers. - (Get_Advance_Widths): Replaced with... - (Get_Advance_WidthPtr): This. Provide version for - FT_OPTIMIZE_MEMORY. - Update all callers. - - * src/truetype/ttgload.h: Updated. - -2005-02-22 David Turner - - * src/base/ftdbgmem.c: Partly rewritten. Added the ability to list - all allocation sites in the memory debugger. Also a new function - FT_DumpMemory() was added. It is only available in builds with - FT_DEBUG_MEMORY defined, and you must declare it in your own code to - use it, i.e., with something like: - - extern void FT_DumpMemory( FT_Memory ); - - ... - - FT_DumpMemory( memory ); - - * include/freetype/config/ftoption.h - (TT_CONFIG_OPTION_BYTECODE_INTERPRETER): Comment out definition -- - again. - (FT_OPTIMIZE_MEMORY): New configuration macro to control various - optimizations for reducing the heap footprint of memory-mapped - TrueType files. - - * include/freetype/internal/ftmemory.h (FT_ARRAY_ZERO): New - convenience macro. - - * include/freetype/internal/tttypes.h (TT_FaceRec) - [FT_OPTIMIZE_MEMORY]: Use optimized types for `num_locations' and - `glyph_locations'. - - * src/truetype/ttgload.c (load_truetype_glyph): Call - `tt_face_get_location'. - - * src/truetype/ttobjs.c (tt_face_init) - [FT_CONFIG_OPTION_INCREMENTAL]: Improve error handling. - (tt_face_done): Call `tt_face_done_loca'. - - * src/truetype/ttpload.c (tt_face_get_location, tt_face_done_loca): - New functions. If FT_OPTIMIZE_MEMORY is set, the locations table is - read directly from memory-mapped streams, instead of being decoded - into the heap. - (tt_face_load_loca) [FT_OPTIMIZE_MEMORY]: New implementation. - (tt_face_load_cvt, tt_face_load_fpgm): Only load table if the - bytecode interpreter is compiled in. - - * src/truetype/ttpload.h: Updated. - - * src/autohint/ahglyph.c (ah_outline_load): Improve allocation - logic. - -2005-02-20 Werner Lemberg - - * builds/unix/ltmain.sh: Regenerated with `libtoolize --force - --copy' from libtool 1.5.14. - * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from - automake 1.9.4. - - * builds/unix/config.guess, builds/unix/config.sub: Updated from - `config' CVS module at subversions.gnu.org. - - * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from - `texinfo' CVS module at subversions.gnu.org. - -2005-02-14 Werner Lemberg - - * src/cff/cffcmap.c (cff_cmap_unicode_init): Don't try to build - a cmap for a CID-keyed font which doesn't have SIDs. - -2005-02-13 Werner Lemberg - - * src/type1/t1load.c (read_binary_data): Return more meaningful - value. - (parse_encoding, parse_subrs, parse_charstrings, parse_dict): Check - parser error value after call to T1_Skip_PS_Token (where necessary). - - * src/type1/t1parse.c (T1_Get_Private_Dict): Check parser error - value after call to T1_Skip_PS_Token. - - * src/cid/cidparse.c (cid_parser_new): Check parser error value - after call to cid_parser_skip_PS_token. - - * src/type42/t42parse.c (t42_parse_encoding, t42_parse_sfnts, - t42_parse_charstrings, t42_parse_dict): Check parser error value - after call to T1_Skip_PS_Token (where necessary). - - * src/psaux/psobjc.c (skip_string, ps_parser_skip_PS_token, - ps_tobytes): Add error messages. - -2005-02-12 Werner Lemberg - - * configure: Output more variables to the created Makefile so that - it can be used for ft2demos also (if the FT2DEMOS variable is - defined). - -2005-02-10 David Turner - - * src/pfr/pfrgload.c (pfr_glyph_load): Fix an unbounded growing - dynamic array when loading a glyph from a PFR font (Savannah bug - #11921). - - * src/base/ftbitmap.c (FT_Bitmap_Convert): Small improvements to the - conversion function (mainly stupid optimization). - - * src/base/Jamfile: Adding ftbitmap.c to the list of compiled files. - -2005-02-10 Werner Lemberg - - * builds/unix/freetype-config.in: Add new flag `--ftversion' to - return the FreeType version. Suggested by George Williams - . - - * docs/CHANGES: Updated. - -2005-02-09 Werner Lemberg - - * src/otvalid/otvmod.c (otv_validate): Deallocate arrays in case - of error. Reported by YAMANO-UCHI Hidetoshi . - -2005-02-08 Werner Lemberg - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings) - : Accept `T1_Parse_Have_Moveto' state also which can - happen in empty glyphs. Reported by Ian Brown - (Savannah bug #11856). - -2005-02-04 Werner Lemberg - - * src/otlayout/*: Removed. Obsolete. - -2004-12-28 Werner Lemberg - - * builds/unix/ltmain.sh: Regenerated with `libtoolize --force - --copy' from libtool 1.5.10. - * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from - automake 1.9.4. - * builds/unix/configure: Regenerated with autoconf 2.59b. - - * builds/unix/config.guess, builds/unix/config.sub: Updated from - `config' CVS module at subversions.gnu.org. - - * builds/unix/install-sh: Updated from - `texinfo' CVS module at subversions.gnu.org. - - * builds/unix/ftsystem.c (FT_Stream_Open): Add proper cast for - ft_alloc. - Fix compiler warning. - -2004-12-27 Dirck Blaskey - - * src/cff/cffobjs.c (cff_face_init): Improve computation of - FT_STYLE_BOLD_FLAG. - -2004-12-27 Werner Lemberg - - * src/cff/cffobjs.c (cff_face_init): A CFF within an SFNT can have - only a single font. This is undocumented but has been verified on - the opentype list. - -2004-12-26 Werner Lemberg - - * Jamfile (FT2_COMPONENTS): Add `otvalid'. - -2004-12-25 Werner Lemberg - - * src/base/ftbitmap.c (FT_Bitmap_Convert): Fix compiler warning. - -2004-12-15 Werner Lemberg - - * vms_make.com: Add ftbitmap.obj. - -2004-12-14 Werner Lemberg - - * src/base/ftbitmap.c, include/freetype/ftbitmap.h: New files for - handling various bitmap formats. - - * include/freetype/config/ftheader.h (FT_BITMAP_H): New macro. - - * src/base/rules.mk (BASE_EXT_SRC): Add ftbitmap.c. - - * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Don't convert bitmaps to 8bpp - but return them as-is. - - * docs/CHANGES: Mention new bitmap API. - * include/freetype/ftchapter.s: Updated. - -2004-12-11 Robert Clark - - * src/base/ftobjs.c (FT_Get_Kerning): Make kerning amount - dependent on ppem by scaling down for ppem < 25, then do normal - rounding. This gives slightly better results than rounding towards - zero. - -2004-12-09 Werner Lemberg - - * src/base/ftobjs.c (FT_Get_Kerning): Always round towards zero - for FT_KERNING_DEFAULT. This greatly enhances the kerning for - small ppem values. - -2004-12-08 Werner Lemberg - - * src/base/ftobjs.c (ft_glyphslot_clear): Reset `lsb_delta' and - `rsb_delta'. - -2004-12-05 Werner Lemberg - - * builds/unix/install.mk (install): Use $(OBJ_BUILD) for ftconfig.h. - -2004-12-03 Antoine Leca - - * include/freetype/ttnameid.h: Updated to latest - specifications from Microsoft. - -2004-11-26 Jouk Jansen - - * vms_make.com: Include ftbbox.c. - Fix `ccopt'. - Handle `otvalid' module. - Update `vmslib.dat' default values. - Fixes to `libs.opt'. - -2004-11-23 Anders Kaseorg - - * src/base/ftoutln.c (FT_OrientationExtremumRec, - ft_orientation_extremum_compute): Removed. - (FT_Outline_Get_Orientation): Rewritten, simplified. - - * src/autohint/ahglyph.c: Include FT_OUTLINE_H. - (ah_test_extremum, ah_get_orientation): Removed. - (ah_outline_load): Use FT_Outline_Get_Orientation. - - * src/base/ftsynth.c (ft_test_extrama, ft_get_orientation): Removed. - (FT_GlyphSlot_Embolden): Use FT_Outline_Get_Orientation. - -2004-11-23 Fernando Papa - - * src/truetype/ttinterp.h: Fix typo. - -2004-11-22 Antoine Leca - - * builds/win32/detect.mk: Corrected logic that detects Windows NT to - use the previous change even if win32 is forced. Corrected - detection of win32 on Win9X. - - * builds/dos/detect.mk: Added same correction as for win32 about - COPY on Windows NT. Detection of plain DOS 7.x. - -2004-11-22 Werner Lemberg - - * builds/detect.mk: Undo change from 2004-11-20. - * builds/win32/detect.mk: If the `OS' environment variable contains - `Windows_NT', use `cmd.exe /c copy' for copying files. - -2004-11-20 Werner Lemberg - - * builds/detect.mk (dos_setup): Use `cmd.exe' for copying - $(CONFIG_MK) to force lowercase file name under Windows. - -2004-11-19 Werner Lemberg - - Fix a serious bug in the TT hinter. - - * src/truetype/ttgload.c (TT_Process_Simple_Glyph): Don't shift - points vertically before hinting. - - * docs/CHANGES: Updated. - - * src/cache/ftcglyph.c (FTC_GNode_UnselectFamily, - FTC_GCache_Lookup): A new try to fix comparison with zero. - -2004-11-16 Werner Lemberg - - * builds/unix/configure.ac: Add `-fno-strict-aliasing' if gcc is - used. - * builds/unix/configure: Regenerated. - * builds/unix/config.guess, builds/unix/config.sub: Updated from - `config' CVS module at subversions.gnu.org. - -2004-11-16 Dr. Martin P.J. Zinser - - * src/cache/ftcglyph.c (FTC_GNode_UnselectFamily, - FTC_GCache_Lookup): Fix comparison with zero. - - * docs/INSTALL.VMS: Updated. - - * vms_make.com: Updated. All `descrip.mms' files are now created - automatically. - - * src/*/descrip.mms: Removed. - -2004-11-16 Owen Taylor - - * builds/unix/freetype-config.in: Suppress -L$libdir for - /usr/lib64 as well as /usr/lib. (Reported by Dan Winship - - https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=139199) - -2004-11-11 Werner Lemberg - - * src/cff/cffdrivr.c (cff_service_ps_info): Updated. - * src/cid/cidriver.c (cid_service_ps_info): Updated. - * src/type42/t42drivr.c (t42_ps_get_font_private): New function. - (t42_service_ps_info): Updated. - - * src/type42/t42parse.c (t42_parse_dict): Remove compiler warning. - -2004-11-11 David Bevan - - Add new function FT_Get_PS_Font_Private(). - - * include/freetype/internal/services/svpsinfo.h - (PS_GetFontPrivateFunc): New service function. - - * include/freetype/t1tables.h, src/base/fttype1.c - (FT_Get_PS_Font_Private): New function. - - * src/type1/t1driver.c (t1_ps_get_font_private): New function. - (t1_service_ps_info): Updated. - -2004-10-13 Werner Lemberg - - * include/freetype/config/ftstdlib.h: Include `stddef.h'. - (ft_ptrdiff_t): Define. - - * include/freetype/fttypes.h (FT_PtrDist): Use `ft_ptrdiff_t'. - - * src/cid/cidload.c (cid_parse_dict), src/type1/t1load.c - (parse_dict): Fix compiler warning. - -2004-10-11 Joshua Neal - - * src/sfnt/ttcmap.c (tt_face_build_cmaps): Check for pointer - overflow. - - * src/sfnt/ttload.c (tt_face_load_hdmx): Protect against bad input. - Don't use FT_QNEW_ARRAY but FT_NEW_ARRAY to make deallocation work - in case of failure. - - * src/sfnt/ttsbit.c (Load_SBit_Range): Check range intervals. - (tt_face_load_sbit_strikes): Allocate `strike_sbit_ranges' after - frame test. - - * src/truetype/ttgload.c (TTLoad_Simple_Glyph): Add assertion for - `flag'. - -2004-10-09 Werner Lemberg - - * docs/CHANGES: Updated. - -2004-10-09 Boris Letocha - - Fix handling of NPUSHW if skipped in data stream. - - * src/truetype/ttinterp.c (opcode_length): Set value for NPUSHW - to -2. - (SkipCode, TT_RunIns): Use opcode_length value for computation of - bytes to be skipped. - -2004-09-10 Jouk Jansen - - * vms_make.com: Updated. - -2004-09-09 Werner Lemberg - - Adding OpenType validation module. The code is based on the - (unfinished) `otlayout' module but has been heavily modified to make - it much more compact. - - * src/otvalid/*: New module. - - * include/freetype/ftotval.h, src/base/ftotval.c, - include/freetype/internal/services/svotval.h: New files. - - * include/freetype/config/ftmodule.h: Add otv_module_class. - * include/freetype/config/ftheader.h (FT_OPENTYPE_VALIDATE_H): New - macro. - * include/freetype/internal/ftserv.h - (FT_SERVICE_OPENTYPE_VALIDATE_H): New macro. - * include/freetype/internal/fttrace.h (otvmodule, otvcommon, - otvbase, otvgdef, otvgpos, otvgsub, otvjstf): New trace components. - - * include/freetype/ftchapters.h: Updated. - - * src/base/Jamfile (Library), src/base/descrip.mms (OBJS), - src/base/rules.mk (BASE_EXT_SRC): Updated. - - * docs/CHANGES: Updated. - -2004-09-08 Werner Lemberg - - * src/tools/docmaker/sources.py (re_source_block_format2) : - Use lookahead assertion to not match `*/'. This removes spurious - insertions of `/' in the HTML output. - -2004-09-07 Werner Lemberg - - * src/truetype/ttgxvar.c (TT_Vary_Get_Glyph_Deltas): Fix call to - FT_NEW_ARRAY. - -2004-09-04 Werner Lemberg - - * include/freetype/internal/ftobjs.h: Don't include - FT_CONFIG_STANDARD_LIBRARY_H. - (FT_Validator, FT_ValidationLevel, FT_ValidatorRec, FT_VALIDATOR, - ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID, - FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT, - FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to... - - * include/freetype/internal/ftvalid.h: New file. - Make FT_INVALID return module-specific error codes. - - * include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New - macro. - - * include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if - FT_KEEP_ERR_PREFIX isn't defined. - - * src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H. - - * src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but - FT_INTERNAL_VALIDATE_H. - - * src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but - FT_INTERNAL_VALIDATE_H. - Include sferrors.h before FT_INTERNAL_VALIDATE_H. - s/FT_Err_Ok/SFNT_Err_Ok/. - - * src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX. - - * src/type1/t1afm.c: Include t1errors.h. - -2004-09-03 Werner Lemberg - - * src/base/ftdebug.c (ft_debug_init): Highest debug level is 7, - not 6. - * docs/DEBUG: Updated. - -2004-08-30 Werner Lemberg - - * include/freetype/tttags.h (TTAG_BASE, TTAG_GDEF, TTAG_GPOS, - TTAG_JSTF): New tags. - - * include/freetype/fttypes.h (FT_Bytes, FT_Tag): New typedefs. - (FT_Int): Add `signed'. - -2004-08-29 Werner Lemberg - - * src/otlayout/otlgpos.c (otl_gpos_subtable_validate): Add argument - to pass number of lookups. - Update all callers. - Don't call otl_lookup_list_validate but otl_lookup_validate. - (otl_gpos_validate): Call otl_lookup_list_validate instead of - otl_gpos_subtable_validate. - - * src/otlayout/otlgpos.h: Updated. - - * src/otlayout/otljstf.c (otl_jstf_max_validate): Add argument to - pass number of lookups. - Update all callers. - - - * src/cff/cffparse.c (cff_parse_real): s/exp/exponent/ to avoid - compiler warning. - - - * src/sfnt/ttcmap0.c, src/sfnt/ttcmap0.h: Renamed to... - * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h: This. - * src/sfnt/Jamfile, src/sfnt/rules.mk, src/sfnt/sfdriver.c, - src/sfnt/sfnt.c, src/sfnt/sfobjs.c: Updated. - - - * builds/compiler/gcc-dev.mk (CFLAGS): Don't add `-Wnested-externs' - if compiler is g++ (v3.3.3 emits a warning otherwise). - -2004-08-28 Werner Lemberg - - * src/otlayout/otlgpos.c (otl_value_length): Return number of bytes, - not number of 16bit entities. - (otl_gpos_lookup2_validate): Check class definition tables for - format 2. - Fix loop for format 2. - (otl_liga_mark2_validate): Fix offset for otl_anchor_validate. - -2004-08-27 Werner Lemberg - - * src/base/ftmac.c: Don't include truetype/ttobjs.h. - Don't include type1/t1objs.h. - (FT_New_Face_From_FSSpec) [!__MWERKS__]: Remove compiler warnings. - -2004-08-27 Mathieu Malaterre - - * src/base/ftmac.c: Handle OS_INLINE for xlc compiler also. - -2004-08-27 Werner Lemberg - - * src/otlayout/otlayout.h: Add copyright. - (OTL_INVALID_OFFSET): Removed. - - * src/otlayout/otlgdef.h: Include otlayout.h. - Comment out inclusion of otltable.h. - - * src/otlayout/otlgpos.c (otl_gpos_lookup4_validate): Fix call - to otl_base_array_validate. - (otl_liga_mark2_validate): Fix `for' loop. - - * src/otlayout/otlgsub.c (otl_ligature_validate): Check `glyph_id', - not components array. - - * src/otlcommn.c (otl_lookup_get_count, otl_feature_get_count): - Comment out. - (otl_lookup_list_get_count, otl_feature_list_get_count): Activate. - (otl_feature_list_validate, otl_gsubgpos_get_lookup_count): - s/otl_lookup_get_count/otl_lookup_list_get_count/. - (otl_script_list_validate): - s/otl_feature_get_count/otl_feature_list_get_count/. - (otl_script_validate): Call otl_lang_validate for default language. - - * src/otlayout/otlcommn.h: Updated. - -2004-08-16 Werner Lemberg - - * src/otlayout/otlgpos.c (otl_gpos_lookup1_validate, - otl_gpos_lookup2_validate, otl_gpos_lookup3_validate, - otl_gpos_lookup4_validate, otl_gpos_lookup5_validate, - otl_gpos_lookup6_validate, otl_gpos_lookup9_validate, - otl_gpos_validate): Update - function arguments. - (otl_gpos_lookup7_validate, otl_gpos_lookup8_validate): Update - function arguments. - Handle NULL offsets correctly. - Check sequence and lookup indices for format 3. - (otl_pos_rule_validate, otl_chain_pos_rule_validate): Add argument - to pass lookup count. - Check sequence and glyph indices. - (otl_gpos_subtable_validate): Update function arguments. - Update callers. - - * src/otlayout/otlgpos.h: Updated. - - * src/otlayout/otlgsub.c (otl_gsub_lookup1_validate, - otl_gsub_lookup3_validate, otl_gsub_lookup8_validate): Update - function arguments. - Add glyph index checks. - (otl_sequence_validate, otl_alternate_set_validate, - otl_ligature_validate): Add argument to pass glyph count. - Update callers. - Add glyph index check. - (otl_gsub_lookup2_validate, otl_gsub_lookup4_validate): Update - function arguments. - (otl_ligature_set_validate): Add argument to pass glyph count. - Update caller. - (otl_sub_class_rule_validate, - otl_sub_class_rule_set_validate): Removed. - (otl_sub_rule_validate, otl_chain_sub_rule_validate): Add argument - to pass lookup count. - Update callers. - Add lookup index check. - (otl_sub_rule_set_validate, otl_chain_sub_rule_set_validate): Add - argument to pass lookup count. - Update callers. - (otl_gsub_lookup5_validate): Update function arguments. - Handle NULL offsets correctly. - Don't call otl_sub_class_rule_set_validate but - otl_sub_rule_set_validate. - Check sequence and lookup indices for format 3. - (otl_gsub_lookup6_validate): Update function arguments. - Handle NULL offsets correctly. - Check sequence and lookup indices for format 3. - (otl_gsub_lookup7_validate, otl_gsub_validate): Update function - arguments. - - * src/otlayout/otlgsub.h: Updated. - - * src/otlayout/otlbase.c (otl_base_validate): Handle NULL offsets - correctly. - - * src/otlayout/otlcommn.c (otl_class_definition_validate): Fix - compiler warning. - (otl_coverage_get_first, otl_coverage_get_last): New functions. - (otl_lookup_validate): Add arguments to pass lookup and glyph - counts. - Update callers. - (otl_lookup_list_validate): Add argument to pass glyph count. - Update callers. - - * src/otlayout/otlcommn.h: Updated. - - * src/otlayout/otljstf.c (otl_jstf_extender_validate, - otl_jstf_max_validate, otl_jstf_script_validate, - otl_jstf_priority_validate, otl_jstf_lang_validate): Add parameter - to validate glyph indices. - Update callers. - (otl_jstf_validate): Add parameter which specifies number of glyphs - in font. - - * src/otlayout/otljstf.h: Updated. - -2004-08-15 Werner Lemberg - - * src/otlayout/otlgpos.c (otl_liga_mark2_validate): Add parameter - to handle possible NULL values properly. - Update all callers. - -2004-08-15 Werner Lemberg - - * src/otlayout/gpos.c: Rename counting variables to be more - meaningful. - Add copyright. - (otl_liga_attach_validate): Renamed to... - (otl_liga_mark2_validate): This. - Update all callers. - (otl_mark2_array_validate): Removed. - (otl_gpos_lookup6_validate): Call otl_liga_mark2_validate, not - otl_mark2_array_validate. - (otl_pos_class_set_validate, otl_pos_class_rule_validate): Removed. - (otl_gpos_lookup7_validate): Complete code for format 2. - (otl_chain_pos_class_rule_validate, - otl_chain_pos_class_set_validate): Removed. - (otl_gpos_lookup8_validate): Don't call - otl_chain_pos_class_set_validate but - otl_chain_pos_rule_set_validate. - Simplify some code. - - * src/otlayout/otlgpos.h: Add copyright. - -2004-08-14 Werner Lemberg - - * src/otlayout/otljstf.c (otl_jstf_gsub_mods_validate): Removed. - (otl_jstf_gpos_mods_validate): Renamed to... - (otl_jstf_gsubgpos_mods_validate): This. - Test whether lookup_count is zero. - (otl_jstf_priority_validate): Use otl_jstf_gsubgpos_mods_validate. - (otl_jstf_validate): Initialize gsub_lookup_count and - gpos_lookup_count if gsub or gpos is zero. - - * src/otlayout/otlgsub.c: Rename counting variables to be more - meaningful. - Add copyright. - (otl_gsub_lookup1_validate): Simplify code. - (otl_gsub_lookup2_validate, otl_gsub_lookup3_validate, - otl_gsub_lookup4_validate, otl_gsub_lookup7_validate): Remove unused - variables. - (otl_gsub_lookup5_validate): Remove unused variable. - Fix call to otl_sub_rule_set_validate and - otl_sub_class_rule_set_validate. - (otl_chain_sub_class_rule_validate, - otl_chain_sub_class_set_validate): Removed. - (otl_gsub_lookup6_validate): Remove unused variable. - Fix call to otl_chain_sub_rule_set_validate. - (otl_gsub_lookup7_validate): Handle lookup type 8 also. - (otl_gsub_lookup8_validate: New function. - (otl_gsub_lookup1_apply, otl_gsub_lookup2_apply, - otl_gsub_lookup3_apply): Commented out. - (otl_gsub_validate_funcs): Add otl_gsub_lookup7_validate and - otl_gsub_lookup8_validate. - (otl_gsub_validate): Updated. - - * src/otlayout/otlgsub.h: Add copyright. - - * src/otlayout/otlcommn.c, src/otlayout/otlcommn.h - (otl_coverage_get_index): Comment out. - -2004-08-13 Werner Lemberg - - * src/otlayout/otlcommn.c (otl_gsubgpos_get_lookup_count): New - function. - * src/otlayout/otlcommn.h: Updated. - - * src/otlayout/otlbase.c: Rename counting variables to be more - meaningful. - Add copyright message. - * src/otlayout/otlbase.h: Add copyright message. - - * src/otlayout/otlgdef.c: Rename counting variables to be more - meaningful. - Add copyright message. - Use OTL_CHECK everywhere. - (otl_caret_value_validate): Remove unused variable. - (otl_gdef_validate): All tables are optional. - * src/otlayout/otlgdef.h: Add copyright message. - - * src/otlayout/otljstf.c: Rename counting variables to be more - meaningful. - Add copyright message. - (otl_jstf_gsub_mods_validate, otl_jstf_gpos_mods_validate): Add - parameter to pass lookup count. - Update all callers. - Check lookup array. - (otl_jstf_max_validate): - s/otl_gpos_subtable_check/otl_gpos_subtable_validate/. - (otl_jstf_priority_validate, otl_jstf_lang_validate, - otl_jstf_script_validate): Add two parameters to pass lookup counts. - Update all callers. - (otl_jstf_validate): Add two parameters to pass GPOS and GSUB - table offsets; use otl_gsubgpos_get_lookup_count to convert extract - lookup counts. - Fix typo. - * src/otlayout/otljstf.h: Updated. - Add copyright message. - - * src/otlayout/otlgpos.c (otl_gpos_subtable_validate): New function. - (otl_gpos_validate): Use it. - * src/otlayout/otlgpos.h: Updated. - -2004-08-13 Werner Lemberg - - * src/otlayout/otcommn.c: Use OTL_CHECK everywhere. - (otl_coverage_validate): Initialize `p', - s/count/num_glyphs/. - s/start_cover/start_coverage/. - (otl_coverage_get_index): Return OTL_Long, not OTL_Int. - Remove unused variables. - (otl_class_definition_validate): s/count/num_glyphs/. - Remove unused variables. - (otl_class_definition_get_value, otl_device_table_get_start, - otl_device_table_get_end, otl_device_table_get_delta, - otl_lookup_get_table, otl_lookup_list_get_count, - otl_lookup_list_get_lookup, otl_lookup_list_get_table, - otl_feature_get_lookups, otl_feature_list_get_count, - otl_feature_list_get_feature, otl_lang_get_count, - otl_lang_get_req_feature, otl_lang_get_features): Commented out - temporarily until we really need it. - (otl_lookup_validate): Removed. - (otl_lookup_table_validate): Renamed to ... - (otl_lookup_validate): This. Update callers. - (otl_lookup_list_validate): Remove already commented out definition - and move the other definition up. - (otl_feature_validate): Add parameter to pass number of lookups. - Update callers. - Check lookup indices. - (otl_feature_list_validate): Add parameter to pass lookup table. - Update callers. - (otl_lang_validate): Add parameter to pass number of features. - Update callers. - Handle req_feature and check feature indices. - (otl_script_validate): Add parameter to pass number of features. - Update callers. - (otl_script_list_validate): Add parameter to pass feature table. - Update callers. - - * src/otlayout/otcommn.h: s/LOCALDEF/LOCAL/. - Comment out the same functions as in otcommn.c. - (otl_script_list_get_script): Removed. - - * src/otlayout/otlgsub.c (otl_gsub_lookup1_apply): Change `index' to - type OTL_Long. - (otl_gsub_lookup2_apply, otl_gsub_lookup3_apply): Change `index' to - type OTL_Long. - Fix test. - (otl_gsub_validate): Fix order of validation. - - * src/otlayout/otlgpos.c (otl_gpos_validate): Fix order of - validation. - -2004-08-12 Werner Lemberg - - Make otlayout module compile (without actually working). - - * src/otlayout/*: s/OTL_Valid/OTL_Validator/. - s/NULL/0/. - - * src/otlayout/otlayout.h: Fix various typos. - (OTL_Bool): New typedef. - (OTL_Int, OTL_Long, OTL_Int16, OTL_Int32): Use `signed' keyword. - (OTL_Err_InvalidArgument): Removed. - (OTL_Err_InvalidData, OTL_Err_InvalidSize): New enum values. - (OTL_MAKE_TAG): Add missing parenthesis. - (OTL_INVALID_DATA): Use OTL_Err_InvalidData. - (OTL_INVALID_TOO_SHORT): Use OTL_Err_InvalidSize. - (OTL_INVALID_FORMAT, OTL_INVALID_OFFSET): New macros. - - * src/otlayout/otlgpos.c: s/FT_/OTL_/. - s/OTL_Short/OTL_Int16/. - (otl_gpos_pairset_validate): Add return type. - (otl_base_array_validate): Fix call to otl_anchor_validate. - (otl_liga_array_validate): Fix call to otl_liga_attach_validate. - (otl_gpos_lookup5_validate): Fix typos. - (otl_gpos_lookup6_validate): Fix call to otl_mark2_array_validate. - (otl_gpos_lookup7_validate): Comment out unfinished code. - Fix typos. - - * src/otlayout/otlgsub.c: Add forward declaration for - otl_gsub_validate_funcs. - (otl_gsub_lookup1_apply, otl_gsub_lookup2_apply, - otl_gsub_lookup3_apply): Fix call to otl_parser_check_property. - s/otl_coverage_lookup/otl_coverage_get_index/. - (otl_ligature_validate): Add missing variable declaration. - (otl_sub_rule_validate): Fix typo. - (otl_sub_class_rule_validate): Add missing variable declaration. - Fix typo. - (otl_gsub_lookup5_validate): Fix typo. - (otl_gsub_lookup6_validate): Fix call to - otl_chain_sub_class_set_validate. - (otl_gsub_validate_funcs): Don't use `const'. - - * src/otlayout/otlcommn.c (otl_class_definition_get_value, - otl_device_table_validate, otl_device_table_get_delta, - otl_lookup_validate, otl_script_validate): Add missing - variable declarations. - (otl_lookup_list_validate): Comment out first definition. - (otl_lookup_list_foreach, otl_feature_list_foreach): Comment out. - (otl_feature_list_validate): - s/otl_feature_table_validate/otl_feature_validate/. - (otl_script_list_validate): - s/otl_script_table_validate/otl_script_validate/. - - * src/otlayout/otlcommn.h: Comment out first declaration. - (otl_lookup_list_foreach, otl_feature_list_foreach): Comment out. - - * src/otlayout/otlbase.c (otl_base_coord_validate): Fix call to - otl_device_table_validate. - (otl_base_script_validate): Add missing variable declarations. - (otl_base_script_list_validate): Fix call to - otl_base_script_validate. - (otl_axis_table_validate): Fix calls to otl_base_tag_list_validate - and otl_base_script_list_validate. - (otl_base_validate): Fix calls to otl_axis_table_validate. - - * src/otlayout/otlgdef.c (otl_attach_list_validate): Fix call to - otl_attach_point_validate. - (otl_caret_value_validate): Add missing variable declaration. - Fix call to otl_device_table_validate. - (otl_ligature_glyph_validate): Fix call to otl_caret_value_validate. - (otl_ligature_caret_list_validate): Fix call to - otl_ligature_glyph_validate. - (otl_gdef_validate): Fix calls to otl_class_definition_validate, - otl_attach_list_validate, otl_ligature_caret_list_validate, and - otl_class_definition_validate. - - * src/otlayout/otltable.h (otl_table_validate, otl_table_init, - otl_table_set_script): Comment out. - - * src/otlayout/otlparse.h (OTL_ParserRec): - s/OTL_Alternate/OTL_GSUB_Alternate/. - (OTL_ParseError): Add OTL_Err_Parser_Memory and - OTL_Err_Parser_Internal. - (otl_parser_error): Fix typo. - (otl_parser_check_property): Remove third argument. - - * src/otlayout/otlparse.c (otl_string_ensure): - s/OTL_Parse_Err_Memory/OTL_Err_Parser_Memory/. - (OTL_STRING_ENSURE, otl_parser_error, otl_parser_get_index, - otl_parser_replace_1, otl_parser_replace_n): Fix typos. - (OTL_PARSER_UNCOVERED): Removed. - (otl_parser_check_property): Remove third argument. - - * src/otlayout/otljstf.c (otl_jstf_priority_validate): Add missing - variable declaration. - - * src/otlayout/otlutils.h (OTL_MEM_REALLOC): Fix typo. - -2004-08-11 Danny - - * src/base/ftstream.c (FT_Stream_Close): Don't reset stream->close - to NULL. This allows custom close functions to delete the FT_STREAM - object. - -2004-08-11 Werner Lemberg - - Add API to get information about SFNT tables. - - * include/freetype/internal/services/svsfnt.h - (FT_SFNT_Table_Info_Func): New typedef. - (SFNT_Table): Add it. - - * src/base/ftobjs (FT_Sfnt_Table_Info): New function. - - * include/freetype/tttables.h: Updated. - - * src/sfnt/sfdriver.c (sfnt_table_info): New function. - (sfnt_service_sfnt_table): Add it. - - * docs/CHANGES: Updated. - - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 10. - - * builds/unix/configure.ac (version_info): Set to 9:8:3. - * builds/unix/configure: Updated. - - * builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/. - - * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): - s/2.1.9/2.1.10/. - - * docs/CHANGES, docs/VERSION.DLL: Updated. - -2004-08-11 Detlef Würkner - - * src/base/ftrfork.c (FT_Raccess_Guess) - [!FT_CONFIG_OPTION_GUESSING_EMBEDDED_FORK]: Remove compiler - warnings. - -2004-08-06 Adam Piotrowski - - * src/pfr/pfrload.c (pfr_sort_kerning_pairs): Single-byte - adjustments are unsigned, not signed. - -2004-08-05 David Turner - - `Activate' gray-scale specifing hinting within the TrueType - bytecode interpreter. This is an experimental feature which - should probably be made optional. - - * src/truetype/ttgload.c (TT_Process_Simple_Glyph, - load_truetype_glyph): Move the code to set the pedantic_hinting flag - to... - (TT_Load_Glyph): Here. - Set `grayscale' flag except for `FT_LOAD_TARGET_MONO'. - - * src/truetyep/ttinterp.c (Ins_GETINFO): Return MS rasterizer - version 1.7. - Return rotation and stretching info only if glyph is rotated or - stretched, respectively. - Handle grayscale info. - - * src/truetype/ttinterp.h (TT_ExecContextRec): Add `grayscale' - member. - -2004-08-02 George Williams - - * src/base/ftobjs.c (FT_Attach_File): Initialize `open.stream'. - -2004-08-01 Werner Lemberg - - * docs/CHANGES: Updated. - -2004-08-01 George Williams - - FreeType now can read kerning values from PFM files. - - * src/type1/t1afm.c (T1_Done_AFM): Renamed to... - (T1_Done_Metrics): This. - Update all callers. - (T1_Read_AFM): Make it static. - Don't enter and leave a frame. - (LITTLE_ENDIAN_USHORT, LITTLE_ENDIAN_UINT): New macros. - (T1_Read_PFM): New function. - (T1_Read_Metrics): New higher-level function to be used instead of - T1Read_AFM. - Update all callers. - -2004-07-31 Werner Lemberg - - * src/pcf/pcfread (pcf_load_font), src/bdf/bdfdrivr.c - (BDF_Face_Init), src/truetype/ttgxvar (TT_Get_MM_Var, - tt_face_vary_cvt): Fix compiler warnings. - -2004-07-26 Søren Sandmann - - * src/pcf/pcfread.c (pcf_interpret_style): Always allocate memory for - face->style_name. - * src/pcf/pcfdrivr.c (PCF_Face_Done): Free `style_name'. - -2004-07-26 Darren J Longhorn - - * include/freetype/config/ftconfig.h (FT_SIZEOF_LONG): Recognize - five-byte `long' (which is avoided then). - -2004-07-25 Detlef Würkner - - * src/pcf/pcfdrivr.c (PCF_Set_Pixel_Size): Compare heights, not - ppem values. - (PCF_Set_Point_Size): Don't call PCF_Set_Pixel_Size but provide own - code to compare ppem values. - * src/bdf/bdfdrivr.c (BDF_Set_Pixel_Size): Compare heights, not - ppem values. - (BDF_Set_Point_Size): Don't call BDF_Set_Pixel_Size but provide own - code to compare ppem values. - -2004-07-25 Kornfeld Eliyahu Peter - - * src/sfnt/sfobjs.c (sfnt_load_face): Handle - TT_NAME_ID_PREFERRED_FAMILY and TT_NAME_ID_PREFERRED_SUBFAMILY. - -2004-07-24 Derek B. Noonburg - - * src/cff/cffload.c (cff_font_load): Always create inverse mapping. - Even if the charstring count is the same as the CID count, it is - still possible that the font uses a different CID -> GID mapping. - -2004-07-23 Werner Lemberg - - * src/truetype/ttobjs.c (tt_face_init): Accept 0x00020000 format tag - found in some Arphic fonts made for Chinese version of Windows 3.1. - -2004-07-17 David Turner - - Fixed a dangling pointer bug in the cache code that happened in very - rare cases, i.e., when a new family object was destroyed by an - out-of-memory condition during a glyph node initialization. The - function FTC_Cache_Lookup would flush the cache and restart the - lookup with a bad pointer. - - * include/freetype/cache/ftcglyph.h (FTC_FAMILY_TREE): New macro. - (FTC_GCACHE_LOOKUP_CMP): Use it. - Handle reference count in `num_nodes' correctly. - - * src/cache/ftcglyph.c (FTC_GNode_UnselectFamily): Use - FTC_FAMILY_FREE. - (FTC_GCache_Lookup): Handle reference count in `num_nodes' correctly. - - * src/cache/ftcmanag.c (FTC_Manager_FlushN): Fixed a cache flushing - bug. - - * src/truetype/ttinterp.c (Normalize): Fixed a bug that caused - long and unnecessary delays while normalizing huge vectors. - -2004-07-15 Werner Lemberg - - * docs/CHANGES: Updated. - - * src/base/ftstroke.c (FT_Stroker_ParseOutline): Fix compiler - warning. - -2004-07-15 David Turner - - * src/base/ftstroke.c (FT_Stroker_ParseOutline): Single points - are not stroked, preventing a bug with pala.ttf and other - fonts. - - * include/freetype/ftstroke.h: Updating documentation comments. - -2004-07-13 Werner Lemberg - - * src/base/ftstroke.c (ft_stroke_border_reverse): Removed. Unused. - -2004-07-12 David Turner - - * src/base/ftstroke.c (ft_stroke_border_close): Add second parameter - to indicate reversion of points. - Update all callers. - (ft_stroke_border_reverse): Fix initialization of `point1' and - `tag1'. - - * src/cache/ftcsbits.c (ftc_snode_load): Fixing advance computation - for transformed glyphs. - -2004-07-11 David Turner - - Fix bugs that prevented the stroker to correctly generate stroked - paths from closed paths, i.e., nearly all glyphs in vectorial fonts. - - The code is still _very_ buggy though; treat with special care. - - * src/base/ftstroke.c (FT_STROKE_TAG_BEGIN_END): New macro. - (ft_stroke_border_reverse): New function. - (ft_stroker_inside): Remove local variable `sigma'; use different - threshold. - (ft_stroker_add_reverse_left): Switch begin/end tags if necessary. - (FT_Stroker_EndSubPath): Call ft_stroker_inside and - ft_stroke_border_reverse. - -2004-06-26 Peter Kovar - - * src/truetype/ttgload.c (load_truetype_glyph): Fix typo. - -2004-06-25 Werner Lemberg - - * src/type1/t1afm.c (afm_atoindex): Fix boundary test. Reported - by Dirck Blaskey. - -2004-06-24 David Turner - - - * Version 2.1.9 released. - ========================= - - - * src/truetype/ttgload.c, src/truetype/ttxgvar.c: Removing - compiler warnings. - -2004-06-23 Werner Lemberg - - * include/freetype/internal/ftmemory.h [FT_DEBUG_MEMORY]: Declare - FT_QAlloc_Debug and FT_QRealloc_Debug. - - * src/base/ftutil.c (FT_QAlloc): Fix error and debug messages. - (FT_QRealloc): Call FT_QAlloc if original pointer is NULL. - Fix error message. - -2004-06-23 David Turner - - * include/freetype/internal/ftmemory.h, src/base/ftutil.c - (FT_QAlloc, FT_QRealloc), src/base/ftdbgmem.c (FT_QAlloc_Debug, - FT_QRealloc_Debug): New functions that perform allocation without - zero-ing out the corresponding blocks. - - * include/freetype/internal/ftmemory.h (FT_MEM_QALLOC, - FT_MEM_QREALLOC, FT_MEM_QNEW, FT_MEM_QNEW_ARRAY, - FT_MEM_QRENEW_ARRAY, FT_QALLOC, FT_QREALLOC, FT_QNEW, FT_QNEW_ARRAY, - FT_QRENEW_ARRAY): New macros. - - * src/base/ftstream.c (FT_Stream_EnterFrame): Use FT_QALLOC. - * src/gzip/ftgzip.c (FT_Stream_OpenGzip): Use FT_QNEW_ARRAY. - * src/sfnt/sfobjs.c (tt_face_get_name): Use FT_QNEW_ARRAY. - - * src/sfnt/ttload.c (tt_face_load_directory, tt_face_load_metrics, - tt_face_load_gasp): Use FT_QNEW_ARRAY. - (tt_face_load_kern): Use FT_QNEW_ARRAY. - Small optimization in the kerning table verifier; this speeds up - TrueType face opening by about 7%. - (tt_face_load_hdmx): Use FT_QNEW_ARRAY and FT_QALLOC. - - * include/freetype/config/ftmodule.h: Changed the order of modules, - putting TrueType and Type 1 first. This dramatically improves the - performance of face open/close operations. For example, putting the - TrueType driver first in the list results in a 5x speedup when - opening `Vera.ttf'. - - The very problem is that both the PCF and BDF drivers do a lot more - than necessary to detect that they cannot handle a font file. - -2004-06-22 Werner Lemberg - - * src/pcf/pcfread.c (pcf_read_TOC, pcf_get_properties, - pcf_get_metrics, pcf_get_bitmaps, pcf_get_encodings): Improve - debugging messages. - - * src/pcf/pcfdrivr.c (FT_COMPOMENT): Move up. - (PCF_Face_Init): Simplify code. - - * src/bdf/bdfdrivr.h (BDF_FaceRec): New element `default_glyph'. - - * src/bdf/bdflib.c (_bdf_add_property, _bdf_parse_start), - src/bdf/bdf.h (bdf_font_t): s/default_glyph/default_char/. - - * src/bdf/bdfdrivr.c (BDF_Face_Init): Fix number of glyphs. - Set `default_glyph'. - (BDF_Glyph_Load): Use `default_glyph' for undefined glyph. - - * docs/CHANGES: Updated. - -2004-06-21 Werner Lemberg - - * docs/CHANGES: Updated. - -2004-06-21 David Turner - - * src/truetype/ttgload.c (TT_Process_Simple_Glyph, - load_truetype_glyph): Don't access (unrounded) - `TT_Size.root.metrics' but (rounded) `TT_Size.metrics'. This fixes - a scaling bug that caused incorrect rendering when the bytecode - interpreter was enabled. - -2004-06-14 Huw D M Davies - - * src/winfonts/winfnt.c (FNT_Face_Init): Set x_ppem and y_ppem - based on pixel_width and pixel_height. - (FNT_Size_Set_Pixels): Updated. - -2004-06-14 Werner Lemberg - - * src/lzw/zopen.c: Comment out inclusion of signal.h and unistd.h. - Reported by Hyvärinen Jyrki Juhani. - -2004-06-11 Werner Lemberg - - * docs/CHANGES: Updated. - -2004-06-10 David Turner - - * src/base/ftobject.c, src/base/fthash.c, src/base/ftexcept.c, - src/base/ftsysio.c, src/base/ftsysmem.c, src/base/ftlist.c: Removed. - Obsolete. - - * src/raster/ftraster.c (Alignment, PAlignment): New union to fix - problems with 64bit systems. - (AlignProfileSize): Use it. - -2004-06-08 David Turner - - * include/freetype/freetype.h (FT_GlyphMetrics): Move `lsb_delta' - and `rsb_delta' elements to... - (FT_GlyphSlotRec): Here to retain binary compatibility with older - FreeType versions. - Update all users. - - * src/sfnt/sfobjs.c (tt_face_get_name): Remove compiler warning. - - * src/winfonts/winfnt.c (FNT_Load_Glyph): Add missing initialization - of slot->metrics.width and slot->metrics.height when loading a - Windows FNT glyph. Thanks to Huw Davies. - - * include/freetype/cache/ftcmru.h (FTC_MruNode_CompareFunc): Change - return type to FT_Bool. - - * src/cache/ftbasic.c (ftc_basic_family_compare): Change return - type to FT_Bool. - - * src/cache/ftccache.c (FTC_Cache_Init, ftc_cache_init): Make - the former call the latter, not vice versa. - (FTC_Cache_Done, ftc_cache_done): Ditto. - - * src/cache/ftcglyph.c (FTC_GNode_Compare, ftc_gnode_compare): Make - the former call the latter, not vice versa. - (FTC_GCache_Init, ftc_gcache_init): Ditto. - (FTC_GCache_Done, ftc_gcache_done): Ditto. - - * src/cache/ftcimage.c (FTC_INode_Free, ftc_inode_free): Make the - former call the latter, not vice versa. - (FTC_INode_Weight, ftc_inode_weight): Ditto. - - * src/cache/ftcmanag.c (ftc_size_node_compare, - ftc_size_node_compare_faceid, ftc_face_node_compare): Change return - type to FT_Bool. - - * src/cache/ftcsbits.c (FTC_SNode_Free, ftc_snode_free): Make the - former call the latter, not vice versa. - (FTC_SNode_Weight, ftc_snode_weight): Ditto. - (FTC_SNode_Compare, ftc_snode_compare): Ditto. - - * src/cache/ftcsbits.c: Fix some bugs and inefficiencies in the cache - sub-system. - -2004-06-05 Werner Lemberg - - * src/autofit/afloader.c (af_loader_load_g): Set `lsb_delta' and - `rsb_delta' in slot->metrics and tune side bearings slightly. - -2004-06-04 Werner Lemberg - - * docs/CHANGES: Updated. - -2004-06-04 David Chester - - Improve inter-letter spacing for autohinted glyphs. - - * include/freetype/freetype.h (FT_Glyph_Metrics): Add elements - `lsb_delta' and `rsb_delta'. - - * src/autohint/ahhint.c (ah_hinter_load): Set `lsb_delta' and - `rsb_delta' in slot->metrics and tune side bearings slightly. - -2004-06-04 David Turner - - * src/autofit/*: Important fixes to the auto-fitter. The output - now seems to be 100% equivalent to the auto-hinter, while being - about 2% faster (which proves that script-specific algorithm - selection isn't a performance problem). - - To test it, change `autohint' to `autofit' in - and recompile. - - A few more testing is needed before making this the official - auto-hinting module. - -2004-06-02 Werner Lemberg - - * src/truetype/ttgload.c (compute_glyph_metrics): Fix compiler - warnings. - -2004-06-01 Werner Lemberg - - * src/sfnt/sfobjs.c (tt_face_get_name): Make sure that an English - name record for the Apple platform is preferred to a non-English - entry for the Microsoft platform. Problem reported by HANDA - Ken'ichi. - -2004-05-19 George Williams - - * src/type1/t1load.c (mm_axis_unmap, mm_weights_unmap): New - auxiliary functions. - (T1_Get_MM_Var): Provide axis tags. - Use mm_axis_unmap and mm_weights_unmap to provide default values - for design and normalized axis coordinates. - - * include/freetype/t1tables.h (PS_DesignMapRec): Change type of - `design_points' to FT_Long. - Update all users. - -2004-05-17 Werner Lemberg - - * src/base/ftbbox.c (BBox_Conic_Check): Fix boundary cases. - Reported by Mikey Anbary . - -2004-05-15 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_done_face): Free face->postscript_name. - -2004-05-15 George Williams - - * src/sfnt/ttload.c (tt_face_load_max_profile): Always set - face->root.num_glyphs. - -2004-05-14 Masatake YAMATO - George Williams - - * src/sfnt/ttload.c (sfnt_dir_check): Handle `bhed' properly. - -2004-05-14 Werner Lemberg - - * src/cache/ftcbasic.c (ftc_basic_family_compare, - ftc_basic_family_init, ftc_basic_family_get_count, - ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph, - ftc_basic_gnode_compare_faceid): Adjust parameters and return types - to prototypes given in header files from include/freetype/cache. - Use casts to proper types locally. - (ftc_basic_image_family_class, ftc_basic_image_cache_class, - ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class): Remove - casts. - - * src/cache/ftccback.h: Adjust parameters and return types to - prototypes given in header files from include/freetype/cache. - - * src/cache/ftcimage.c (ftc_inode_free, ftc_inode_new, - ftc_inode_weight): Adjust parameters and return types to prototypes - given in header files from include/freetype/cache. Use casts to - proper types locally. - - * src/cache/ftcsbits.c (ftc_snode_free, ftc_snode_new, - ftc_snode_weight, ftc_snode_compare): Adjust parameters and return - types to prototypes given in header files from - include/freetype/cache. Use casts to proper types locally. - - * src/cache/ftccmap.c (ftc_cmap_node_free, ftc_cmap_node_new, - ftc_cmap_node_weight, ftc_cmap_node_compare, - ftc_cmap_node_remove_faceid): Adjust parameters and return types to - prototypes given in header files from include/freetype/cache. Use - casts to proper types locally. - (ftc_cmap_cache_class): Remove casts. - - * src/cache/ftcglyph.c (ftc_gnode_compare, ftc_gcache_init, - ftc_gcache_done): Adjust parameters and return types to prototypes - given in header files from include/freetype/cache. Use casts to - proper types locally. - - * src/cache/ftcmanag.c (ftc_size_node_done, ftc_size_node_compare, - ftc_size_node_init, ftc_size_node_reset, - ftc_size_node_compare_faceid, ftc_face_node_init, - ftc_face_node_done, ftc_face_node_compare: Adjust parameters and - return types to prototypes given in header files from - include/freetype/cache. Use casts to proper types locally. - - (ftc_size_list_class, ftc_face_list_class): Remove casts. - -2004-05-13 Werner Lemberg - - * src/autohint/ahmodule.c (ft_autohinter_init, ft_autohinter_done): - Use FT_Module as parameter and do a cast to FT_AutoHinter locally. - (autohint_module_class): Remove casts. - - * src/base/ftglyph.c (ft_bitmap_glyph_init, ft_bitmap_glyph_copy, - ft_bitmap_glyph_done, ft_bitmap_glyph_bbox, ft_outline_glyph_init, - ft_outline_glyph_done, ft_outline_glyph_copy, - ft_outline_glyph_transform, ft_outline_glyph_bbox, - ft_outline_glyph_prepare): Use FT_Glyph as parameter and do a cast - to FT_XXXGlyph locally. - Use FT_CALLBACK_DEF throughout. - (ft_bitmap_glyph_class, ft_outline_glyph_class): Remove casts. - - * src/bdf/bdfdrivr.c (bdf_cmap_init, bdf_cmap_done, - bdf_cmap_char_index, bdf_cmap_char_next): Use FT_CMap as parameter - and do a cast to BDF_CMap locally. - (bdf_cmap_class): Remove casts. - -2004-05-12 Werner Lemberg - - * src/cff/cffgload.h (CFF_Builder): Remove `error'. - * src/cff/cffgload.c (cff_decoder_parse_charstrings): Replace - `Memory_Error' with `Fail' und update all users. - -2004-05-11 Werner Lemberg - - * include/freetype/internal/psaux.h (T1_ParseState): New - enumeration. - (T1_BuilderRec): Replace `path_begun' with `parse_state'. - Remove `error'. - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Replace - `Memory_Error' with `Fail' and update all users. - Don't use `builder->error'. - Replace `path_begun' with `parse_state' and check parsing states. - - * src/psaux/psobjs.c (t1_builder_init, t1_builder_start_point): - Replace `path_begun' with `parse_state' and check parsing states. - -2004-05-10 George Williams - - * src/truetype/ttxgvar.c (ft_var_load_avar): Do free arrays in case - of error -- `avar' is optional so we can't rely on tt_done_blend - being called automatically. - -2004-05-09 George Williams - - * src/truetype/ttxgvar.c (ft_var_load_avar, ft_var_load_gvar): Fix - error handling. - -2004-05-07 Werner Lemberg - - * src/pfr/pfrobjs.c, src/pfr/pfrobjs.h (pfr_face_init, - pfr_face_done, pfr_face_get_kerning, pfr_slot_init, pfr_slot_done, - pfr_slot_load): Don't use PFR_XXX but FT_XXX arguments which are - typecast to the proper PFR_XXX types within the function. - Update code accordingly. - - * src/pfr/pfrdrivr.c (pfr_get_kerning, pfr_get_advance, - pfr_get_metrics, pfr_get_service): Don't use PFR_XXX but FT_XXX - arguments which are typecast to the proper PFR_XXX types within the - function. - Update code accordingly. - Use FT_CALLBACK_DEF throughout. - (pfr_metrics_service_rec, pfr_driver_class): Remove casts. - -2004-05-06 Masatake YAMATO - - * src/truetype/ttgxvar.c (ft_var_load_gvar): Use FT_FACE_STREAM. - (*): Rename local variable OffsetToData to offsetToData. - -2004-05-06 Werner Lemberg - - * src/cff/cffobjs.c (cff_size_done, cff_size_init, cff_size_reset, - cff_slot_done, cff_slot_init, cff_face_init, cff_face_done): Access - root fields directly. - * src/cff/cffdrivr.c (Load_Glyph): Access root fields directly. - - * src/truetype/ttgload.c (TT_Process_Simple_Glyph): Save current - frame before calling TT_Vary_Get_Glyph_Deltas. - - * src/pcf/pcfdrivr.c (PCF_CMapRec): Rename `cmap' to `root' for - consistency. - (pcf_cmap_init, pcf_cmap_done, pcf_cmap_char_index, - pcf_cmap_char_next): Don't use PCF_XXX but FT_XXX arguments which - are typecast to the proper PCF_XXX types within the function. - Update code accordingly. - (pcf_cmap_class): Remove casts. - (PCF_Face_Done, PCF_Face_Init, PCF_Set_Pixel_Size): Don't use - PCF_XXX but FT_XXX arguments which are typecast to the proper - PCF_XXX types within the function. - Update code accordingly. - Use FT_CALLBACK_DEF throughout. - (PCF_Set_Point_Size): New wrapper function. - (PCF_Glyph_Load, pcf_driver_requester): Use FT_CALLBACK_DEF. - (pcf_driver_class): Remove casts. - -2004-05-04 Steve Hartwell - - * src/truetype/ttobjs.c (tt_driver_done): Fix typo. - -2004-05-04 Werner Lemberg - - * src/bdf/bdfdrivr.c (BDF_Face_Done, BDF_Face_Init, - BDF_Set_Pixel_Size): Don't use BDF_XXX but FT_XXX arguments which - are typecast to the proper BDF_XXX types within the function. - Update code accordingly. - Use FT_CALLBACK_DEF throughout. - (BDF_Set_Point_Size): New wrapper function. - (bdf_driver_class): Remove casts. - - * src/cff/cffdrivr.c (Get_Kerning, Load_Glyph, cff_get_interface): - Don't use CFF_XXX but FT_XXX arguments which are typecast to the - proper CFF_XXX types within the function. - Update code accordingly. - Use FT_CALLBACK_DEF throughout. - (cff_driver_class): Remove casts. - - * src/cff/cffobjs.h, src/cff/cffobjs.c (cff_size_done, - cff_size_init, cff_size_reset, cff_slot_done, cff_slot_init, - cff_face_init, cff_face_done, cff_driver_init, cff_driver_done): - Don't use CFF_XXX but FT_XXX arguments which are typecast to the - proper CFF_XXX types within the function. - Update code accordingly. - (cff_point_size_reset): New wrapper function. - - * src/cid/cidobjs.h, src/cid/cidobjs.c (cid_slot_done, - cid_slot_init, cid_size_done, cid_size_init, cid_size_reset, - cid_face_done, cid_face_init, cid_driver_init, cid_driver_done): - Don't use CID_XXX but FT_XXX arguments which are typecast to the - proper CID_XXX types within the function. - Update code accordingly. - (cid_point_size_reset): New wrapper function. - - * src/cid/cidgload.c, src/cid/cidgload.h (cid_slot_load_glyph): - Don't use CID_XXX but FT_XXX arguments which are typecast to the - proper CID_XXX types within the function. - Update code accordingly. - - * src/cid/cidriver.c (cid_get_interface): - Don't use CID_XXX but FT_XXX arguments which are typecast to the - proper CID_XXX types within the function. - Update code accordingly. - Use FT_CALLBACK_DEF. - (t1cid_driver_class): Remove casts. - - * src/truetype/ttdriver.c (tt_get_interface): Use FT_CALLBACK_DEF. - * src/truetype/ttgxvar.c (ft_var_load_avar): Don't free non-local - variables (this is done later). - (ft_var_load_avar): Fix call to FT_FRAME_ENTER. - (TT_Get_MM_Var): Fix size for `fvar_fields'. - (TT_Vary_Get_Glyph_Deltas): Handle deallocation of local variables - correctly. - - * src/base/ftdbgmem.c (ft_mem_debug_realloc): Don't abort if - current size is zero. - -2004-05-03 Steve Hartwell - - * src/truetype/ttobjs.h, src/truetype/ttobjs.c (tt_face_init, - tt_face_done, tt_size_init, tt_size_done, tt_driver_init, - tt_driver_done): Don't use TT_XXX but FT_XXX arguments which are - typecast to the proper TT_XXX types within the function. - Update code accordingly. - - * src/truetype/ttdriver.c (Get_Kerning, Set_Char_Sizes, - Set_Pixel_Sizes, Load_Glyph, tt_get_interface): Don't use TT_XXX but - FT_XXX arguments which are typecast to the proper TT_XXX types - within the function. - Update code accordingly. - (tt_driver_class): Remove casts. - -2004-05-02 Werner Lemberg - - * src/sfnt/ttload.c (tt_face_free_names): Check that `table->names' - is not NULL. Reported by Gordon Childs . - -2004-04-29 Werner Lemberg - - * docs/formats.txt: Add more information on PFR format. - -2004-04-28 Werner Lemberg - - * docs/formats.txt: New file. - * docs/CHANGES: Updated. - -2004-04-28 Masatake YAMATO - - * include/freetype/internal/tttypes.h (GX_BlendRec_) - [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Fix a typo. - - * src/truetype/ttgxvar.h (GX_BlendRec_): Fix a typo. - -2004-04-27 Masatake YAMATO - - * src/truetype/ttgxvar.h: Use FT_LOCAL instead of FT_LOCAL_DEF - for function declarations. - -2004-04-25 George Williams - - * src/truetype/ttgxvar.c (ft_var_apply_tuple): Fix typo. - -2004-04-25 Werner Lemberg - - * src/truetype/Jamfile, docs/CHANGES: Updated. - -2004-04-24 Werner Lemberg - - * src/pcf/pcfdrivr.c: Revert change from 2004-04-17. - * src/pcf/pcfutil.c: Use FT_LOCAL_DEF. - * src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H. - Use FT_BEGIN_HEADER and FT_END_HEADER. - Use FT_LOCAL. - -2004-04-24 George Williams - - Add support for Apple's distortable font technology (in GX fonts). - - * devel/ftoption.h, include/freetype/config/ftoption.h - (TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro. - - * include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style, - FT_MM_Var): New structures. - (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates, - FT_Set_Var_Blend_Coordinates): New function declarations. - - * include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func, - FT_Set_Var_Design_Func): New typedefs. - Update MultiMasters service. - - * include/freetype/internal/tttypes.h - [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H. - (GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef. - (TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend' - and `blend'. - - * include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New - macros. - - * include/freetype/internal/fttrace.h: Add `ttgxvar'. - - * src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates, - FT_Set_Var_Blend_Coordinates): New functions. - - * src/sfnt/sfobjs.c (sfnt_load_face) - [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS - flag for GX var fonts. - - * src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files. - - * src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include - ttgxvar.c. - - * src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include - FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h. - (tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: - New service. - (tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated. - - * src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include - ttgxvar.h. - (TT_Process_Simple_Glyph, load_truetype_glyph) - [TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts. - - * src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include - ttgxvar.h. - (tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call - tt_done_blend. - - * src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include - ttgxvar.h. - (tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call - tt_face_vary_cvt. - - * src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c. - - * src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var - and T1_Set_Var_Design. - - * src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros. - (T1_Get_MM_Var, T1_Set_Var_Design): New functions. - - * src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New - function declarations. - -2004-04-23 Werner Lemberg - - * include/freetype/ftcache.h (FT_Get_CharMap_Index): Rename - declaration and move to... - * include/freetype/freetype.h (FT_Get_Charmap_Index): Here. - (FREETYPE_PATCH): Set to 9. - - * src/base/ftobjs.c (FT_Get_Charmap_Index): New function. - - * builds/unix/configure.ac (version_info): Set to 9:7:3. - * builds/unix/configure: Updated. - - * builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj: s/218/219/. - - * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): - s/2.1.8/2.1.9/. - - * docs/CHANGES, docs/VERSION.DLL: Updated. - -2004-04-21 Werner Lemberg - - * src/cff/cffparse.c (cff_parser_run), src/psaux/psobjs.c - (ps_parser_load_field): Use FT_CHAR_BIT. - -2004-04-21 David Turner - - - * Version 2.1.8 released. - ========================= - - - * src/cff/cffobjs.c (cff_face_init): Fix a small memory leak. - - * src/autofit/afloader.c (af_loader_load_g), src/autofit/afmodule.c - (af_autofitter_load_glyph), src/base/ftdebug.c (FT_Trace_Get_Name): - Remove compiler warnings. - - * src/autofit/aftypes.h: Undefine AF_DEBUG. - - * src/lzw/zopen.c (rmask), src/pcf/pcfdrivr.c (pcf_service_bdf, - pcf_services), src/pcf/pcfread.c (tableNames), src/psaux/psobjs.c - (ft_char_table), src/type42/t42drivr.c (t42_service_glyph_dict, - t42_service_ps_font_name): Decorate data arrays with `const' to - avoid populating the `.data' segment. - - * src/lzw/Jamfile: New file. - -2004-04-20 Werner Lemberg - - * src/psaux/psobjs.c (T1Radix): Renamed to... - (ps_radix): This. - Update current cursor position. - - * docs/CHANGES: Updated. - -2004-04-18 Werner Lemberg - - * src/truetype/ttgload.c, src/truetype/ttgload.h (TT_Load_Glyph), - src/ttdriver.c (Load_Glyph): Change type of `glyph_index' to - FT_UInt. From Lex Warners. - -2004-04-17 Chisato Yamauchi - - * src/sfnt/ttload.c (tt_face_load_sfnt_header): Really fix change - from 2004-03-19. - - * src/bdf/bdfdrivr.c (BDF_Face_Init): Use `ft_strlen'. - - * src/pcf/pcfutil.c, src/pcf/pcfutil.h: Decorate functions with - `static'. - Remove unused function `RepadBitmap'. - * src/pcf/pcfdrivr.c: Don't include pcfutil.h. - -2004-04-16 Werner Lemberg - - * builds/unix/freetype-config.in (usage): Fix and improve usage - information. - -2004-04-15 Werner Lemberg - - * builds/unix/ftconfig.in, builds/vms/ftconfig.h: Define - FT_CHAR_BIT. - - * src/base/ftobjs.c (FT_Load_Glyph): Don't apply autohinting if - glyph is vertically distorted or mirrored. - - * src/cff/cffgload.c (cff_slot_load): Handle zero `size' properly - for embedded bitmaps. - - * docs/CHANGES: Updated. - -2004-04-15 bytesoftware - - * include/freetype/config/ftconfig.h, src/base/ftstream.c - (FT_Stream_ReadFields): More fixes using FT_CHAR_BIT. - -2004-04-14 Werner Lemberg - - * include/freetype/config/ftconfig.h (FT_CHAR_BIT): New macro. - -2004-04-14 Alex Strelnikov - - * src/cache/ftcsbits.c (ftc_snode_load): Initialize `*asize' in case - of error. - -2004-04-14 Werner Lemberg - - * src/base/ftmac.c [__GNUC__]: Define OS_INLINE. - * builds/unix/configure.ac: Don't try to remove `-ansi' compilation - switch on the Mac. - - * builds/unix/ltmain.sh: Regenerated with `libtoolize --force - --copy' from libtool 1.5.6. - * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from - automake 1.8a. - * builds/unix/configure: Regenerated with autoconf 2.59a. - -2004-04-13 Werner Lemberg - - * include/freetype/config/ftconfig.h: Use CHAR_BIT to define - size of FT_SIZEOF_xxx. - -2004-04-12 Chisato Yamauchi - - * include/freetype/internal/sfnt.h (TT_Find_SBit_Image_Func, - TT_Load_SBit_Metrics_Func): New typedefs. - (SFNT_Interface): Add find_sbit_image and load_sbit_metrics. - - * src/sfnt/sfdriver.c (sfnt_interface): Updated. - * src/sfnt/ttsbit.h (tt_find_sbit_image, tt_load_sbit_metrics): New - declarations. - * src/sfnt/ttsbit.c (find_sbit_image): Renamed to... - (tt_find_sbit_image): This. - Updated all callers. - (load_sbit_metrics): Renamed to... - (tt_load_sbit_metrics): This. - Updated all callers. - -2004-04-12 Werner Lemberg - - * configure: Accept makepp also. - - * builds/unix/detect.mk: Use proper path to unix-def.mk. - * builds/unix/unix-def.in (BUILD_DIR, PLATFORM): Remove. - * builds/unix/unix.mk (BUILD_DIR, PLATFORM): Define. - Use BUILD_DIR. - - * docs/INSTALL, docs/INSTALL.GNU, docs/INSTALL.UNX: Update - documentation on makepp. - -2004-04-11 Werner Lemberg - - * src/lzw/zopen.c: Don't include sys/param.h and sys/stat.h. - -2004-04-10 Werner Lemberg - - * src/lzw/ftlzw.c: Include zopen.h dependent on - FT_CONFIG_OPTION_USE_LZW. - - * src/base/ftdebug.c: s/index/idx/ to avoid compiler warnings. - -2004-04-02 Werner Lemberg - - * builds/unix/ltmain.sh: Regenerated with `libtoolize --force - --copy' from libtool 1.5.2. - * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from - automake 1.8a. - * builds/unix/configure: Regenerated with autoconf 2.59a. - -2004-04-01 Werner Lemberg - - * builds/unix/ft-munmap.m4 (FT_MUNMAP_PARAM): Fix arguments of - AC_COMPILE_IFELSE. - * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from - automake 1.8a. - * builds/unix/configure: Regenerated with autoconf 2.59a. - * builds/unix/config.guess, builds/unix/config.sub: Updated from - `config' CVS module at subversions.gnu.org. - * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from - `texinfo' CVS module at subversions.gnu.org. - * builds/freetype.mk (refdoc): Updated. - -2004-03-31 Werner Lemberg - - Handle broken FNT files which don't have a trailing NULL byte - in the face name string. - - * src/winfonts/winfnt.h (FNT_FontRec): New member `family_name'. - * src/winfonts/winfnt.c (fnt_font_done): Free font->family_name. - (FNT_Face_Init): Append a final zero byte to the font face name. - -2004-03-30 Werner Lemberg - - * src/sfnt/ttload.c (tt_face_load_sfnt_header): Fix change from - 2004-03-19. - -2004-03-27 Werner Lemberg - - * src/base/descrip.mms (OBJS): Add ftbbox.obj. - -2004-03-26 George Williams - - Add vertical phantom points. - - * include/freetype/internal/tttypes.h (TT_LoaderRec): Add - `top_bearing', `vadvance', `pp3', and `pp4'. - - * src/autofit/afloader.c (af_loader_load_g): Handle two more points. - - * src/autohint/ahhint.c (ah_hinter_load): Handle two more points. - * src/truetype/ttgload.c (Get_VMetrics): New function. - (TT_Load_Simple_Glyph, TT_Process_Simple_Glyph): Handle two more - points. - (load_truetype_glyph): Use Get_VMetrics. - Handle two more points. - (compute_glyph_metrics): Thanks to vertical phantom points we now - can always compute `advance_height' and `top_bearing'. - * src/truetype/ttobjs.h (TT_SubglyphRec): Add vertical phantom - points. - - - * src/autohint/ahglyph.c (ah_outline_load): Fix allocation of - `news'. - -2004-03-21 Werner Lemberg - - * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Fix left side bearing. - -2004-03-20 Steve Hartwell - - * src/cache/ftcmru.c (FTC_MruList_RemoveSelection): Handle a NULL - value for `selection' as `select all'. - -2004-03-19 Steve Hartwell - - * src/sfnt/ttload.c (tt_face_load_sfnt_header): Reject face_index - values > 0 if loading non-TTC fonts. - - * src/base/ftmac.c (open_face_from_buffer): Set positive face_index - to zero before calling FT_Open_Face. - - * docs/CHANGES: Updated. - -2004-03-04 Werner Lemberg - - * Jamfile, vms_make.com, builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype/vcproj, include/freetype/ftmoderr.h: - Add LZW module. - - * Jamfile.in: Removed. - - * docs/CHANGES: Updated. - - * include/freetype/internal/ftobjs.h: s/MIN/FT_MIN/, s/MAX/FT_MAX/, - s/ABS/FT_ABS/. Updated all callers. - - * src/type1/t1load.c (parse_dict), src/pcf/pcfdrivr.c - (PCF_Face_Init): Use FT_ERROR_BASE. - -2004-03-04 Albert Chin - - Add support for PCF fonts compressed with LZW (extension .pcf.Z, - created with `compress'). - - * include/freetype/config/ftoption.h, devel/ftoption.h - (FT_CONFIG_OPTION_USE_LZW): New macro. - - * include/freetype/ftlzw.h: New file. - * include/freetype/config/ftheader.h (FT_LZW_H): New macro for - ftlzw.h. - - * src/lzw/*: New files. - - * src/pcf/pcfdrivr.c: Include FT_LZW_H. - (PCF_Face_Init): Try LZW also. - - * src/gzip/ftgzip.c: s/0/Gzip_Err_Ok/ where appropriate. - Beautify. - -2004-03-03 Werner Lemberg - - * src/pshinter/pshalgo.c (psh_hint_table_init): Simplify code. - -2004-03-02 Werner Lemberg - - Add embedded bitmap support to CFF driver. - - * src/cff/cffobjs.h (CFF_SizeRec): New structure. - - * src/cff/cffgload.c (cff_builder_init): Updated. - (cff_slot_load): Updated. - [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Load sbit. - - * src/cff/cffobjs.c (sbit_size_reset) - [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: New function. - (cff_size_get_globals_funcs, cff_size_done, cff_size_init): Updated. - (cff_size_reset): Updated. - [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Call sbit_size_reset. - - * src/cff/cffdrivr.c (Load_Glyph): Updated. - (cff_driver_class): Use CFF_SizeRec. - - * docs/CHANGES: Updated. - -2004-03-01 Werner Lemberg - - * src/pshinter/pshglob.c (psh_globals_scale_widths): Don't use - FT_RoundFix but FT_PIX_ROUND. - (psh_blues_snap_stem): Don't use blue_shift but blue_threshold. - - * src/pshinter/pshalgo.c (PSH_STRONG_THRESHOLD_MAXIMUM): New macro. - (psh_glyph_find_string_points): Use PSH_STRONG_THRESHOLD_MAXIMUM. - (psh_glyph_find_blue_points): New function. Needed for fonts like - p052003l.pfb (URW Palladio L Roman) which have flex curves at the - base line within blue zones, but the flex curves aren't covered by - hints. - (ps_hints_apply): Use psh_glyph_find_blue_points. - -2004-02-27 Garrick Meeker - - * builds/unix/configure.ac: Fix compiler flags for - `--with-old-mac-fonts'. - * builds/unix/configure: Regenerated. - - * src/base/ftmac.c: s/TARGET_API_MAC_CARBON/!TARGET_API_MAC_OS8/. - (FT_New_Face_From_Resource): New function. - (FT_New_Face): Use FT_New_Face_From_Resource. - (FT_New_Face_From_FSSpec): Use FT_New_Face_From_Resource. - [__MWERKS__]: Don't include FSp_fopen.h. - -2004-02-26 Werner Lemberg - - * src/pshinter/pshglob.c (psh_globals_new): Fix value of - `dim->stdw.count'. - Don't assign default values to blue scale and blue shift. - -2004-02-25 Werner Lemberg - - * docs/CHANGES: Updated. - -2004-02-25 Garrick Meeker - Steve Hartwell - - Improve MacOS fond support. Provide a new API - `FT_New_Face_From_FSSpec' similar to `FT_New_Face'. - - * src/base/ftmac.c [__MWERKS__]: Include FSp_fpopen.h. - STREAM_FILE [__MWERKS__]: New macro. - (ft_FSp_stream_close, ft_FSp_stream_io) [__MWERKS__]: New functions. - (file_spec_from_path) [__MWERKS__]: Updated #if statement. - (get_file_type, make_lwfn_spec): Use `const' for argument. - (is_dfont) [TARGET_API_MAC_CARBON]: Removed. - (count_face_sfnt, count_faces): New functions. - (parse_fond): Do some range checking. - (read_lwfn): Change type of second argument. - No longer call FSpOpenResFile. - (OpenFileAsResource): New function. - (FT_New_Face_From_LWFN): Use `const' for second argument. - Use OpenFileAsResource. - (FT_New_Face_From_Suitcase): Change type of second argument. - No longer call FSpOpenResFile. - Loop over all resource indices. - (FT_New_Face_From_dfont) [TARGET_API_MAC_CARBON]: Removed. - (FT_GetFile_From_Mac_Name): Use `const' for first argument. - (ResourceForkSize): Removed. - (FT_New_Face): Updated to use new functions. - (FT_New_Face_From_FSSpec): New function. - - * include/freetype/ftmac.h: Updated. - -2004-02-24 Malcolm Taylor - - * src/autohint/ahhint.c (ah_hinter_load) : - Handle case where outline->num_vedges is zero while computing hinted - metrics. - -2004-02-24 Gordon Childs - - * src/cff/cffcmap.c (cff_cmap_unicode_init): Provide correct value - for `count'. - -2004-02-24 Werner Lemberg - - * include/freetype/t1tables.h (PS_PrivateRec): Add - `expansion_factor'. - - * src/pshinter/pshglob (psh_blues_scale_zones): Fix computation - of blues->no_overshoots -- `blues_scale' is stored with a - magnification of 1000, and `scale' returns fractional pixels. - - * src/type1/t1load.c (T1_Open_Face): Initialize `blue_shift', - `blue_fuzz', `expansion_factor', and `blue_scale' according to the - Type 1 specification. - - * src/type1/t1tokens.h: Handle `ExpansionFactor'. - - * docs/CHANGES: Updated. - -2004-02-24 Masatake YAMATO - - Provide generic access to MacOS resource forks. - - * src/base/ftrfork.c, include/freetype/internal/ftrfork.h: New - files. - - * src/base/ftobjs.c: Include FT_INTERNAL_RFORK_H. - (Mac_Read_POST_Resource, Mac_Read_sfnt_Resource): Remove arguments - `resource_listoffset' and `resource_data' and adapt code - accordingly. These values are calculated outside of the function - now. - Add new argument `offsets'. - (IsMacResource): Use `FT_Raccess_Get_HeaderInfo' and - `FT_Raccess_Get_DataOffsets'. - (load_face_in_embedded_rfork): New function. - (load_mac_face): Use load_face_in_embedded_rfork. - (ft_input_stream_new): Renamed to... - (FT_Stream_New): This. Use FT_BASE_DEF. Updated all callers. - (ft_input_stream_free): Renamed to... - (FT_Stream_Free): This. Use FT_BASE_DEF. Updated all callers. - - * src/base/ftbase.c: Include ftrfork.c. - - * src/base/rules.mk (BASE_SRC), src/base/Jamfile: Updated. - - * include/freetype/internal/internal.h (FT_INTERNAL_RFORK_H): - New macro. - - * include/freetype/internal/fttrace.h: Added `rfork' as a new - trace definition. - - * include/freetype/internal/ftstream.h: Declare FT_Stream_New and - FT_Stream_Free. - - * include/freetype/config/ftoption.h, devel/ftoption.h - (FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK): New option. - - * include/freetype/config/ftstdlib.h (ft_strrchr): New macro. - -2004-02-23 Werner Lemberg - - * docs/CHANGES: Updated. - - * include/freetype/internal/ftdebug.h: Include FT_FREETYPE_H. - -2004-02-23 Masatake YAMATO - - Provide a simple API to control FreeType's tracing levels. - - * include/freetype/internal/ftdebug.h (FT_Trace_Get_Count, - FT_Trace_Get_Name): New declarations. - - * src/base/ftdebug.c (FT_Trace_Get_Count, FT_Trace_Get_Name): New - functions. - -2004-02-23 David Turner - - * src/autofit/afhints.c, src/autofit/afhints.h, - src/autofit/aflatin.c, src/autofit/afloader.c, src/types.h: Grave - bugs have been fixed. The auto-fitter works, doesn't crash, but - still produces unexpected results... - -2004-02-21 Werner Lemberg - - * src/pshinter/pshalgo.c (PSH_STRONG_THRESHOLD): Changed to hold - the accepted shift for strong points in fractional pixels (which - is a heuristic value). - (psh_glyph_find_strong_points): Compute threshold for - psh_hint_table_find_strong_points. - (psh_hint_table_find_strong_point): Add parameter to pass threshold. - -2004-02-20 Werner Lemberg - - * src/pshinter/pshrec.c (ps_mask_table_set_bits): Don't call - ps_mask_table_alloc but ps_mask_table_last. - (ps_hints_t2mask): Use correct position and number for vertical - and horizontal hinter mask bits. - - * docs/CHANGES: Updated. - -2004-02-19 Werner Lemberg - - * src/base/ftstroke.c (FT_Glyph_StrokeBorder): Fix enum handling. - * src/cff/cffdrivr.c (cff_get_cmap_info): Remove compiler warning. - -2004-02-18 Werner Lemberg - - * include/freetype/freetype.h: Document FT_LOAD_TARGET_XXX properly. - - * src/base/ftglyph.c (ft_bitmap_glyph_class, - ft_outline_glyph_class): Tag with FT_CALLBACK_TABLE_DEF. - - * src/smooth/ftsmooth.c (ft_smooth_render): Handle - FT_RENDER_MODE_LIGHT. - -2004-02-17 Werner Lemberg - - Fix callback functions in cache module. - - * src/cache/ftccback.h: New file for callback declarations. - - * src/cache/ftcbasic.c (ftc_basic_family_compare, - ftc_basic_family_init, ftc_basic_family_get_count, - ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph, - ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF. - (ftc_basic_image_family_class, ftc_basic_image_cache_class, - ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class): - Use FT_CALLBACK_TABLE_DEF and local wrapper functions. - - * src/cache/ftccache.c: Include ftccback.h. - (ftc_cache_init, ftc_cache_done): New wrapper functions which use - FT_LOCAL_DEF. - - * src/cache/ftccmap.c: Include ftccback.h. - (ftc_cmap_cache_class): Use local wrapper functions. - - * src/cache/ftcglyph.c: Include ftccback.h. - (ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper - functions which use FT_LOCAL_DEF. - - * src/cache/ftcimage.c: Include ftccback.h. - (ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper - functions which use FT_LOCAL_DEF. - - * src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class): - Use FT_CALLBACK_TABLE_DEF. - - * src/cache;/ftcsbits.c: Include ftccback.h. - (ftc_snode_free, ftc_snode_new, ftc_snode_weight, - ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF. - - * src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h. - -2004-02-17 Masatake YAMATO - - * include/freetype/ftmac.h (FT_GetFile_From_Mac_Name): Fix a typo - (FT_EXPORT_DEF -> FT_EXPORT). - - * include/freetype/ftxf86.h (FT_Get_X11_Font_Format): Ditto. - -2004-02-15 Werner Lemberg - - * src/base/ftobjs.c (FT_Set_Char_Size): Fix typo. - -2004-02-14 Masatake YAMATO - - * builds/unix/ftsystem.c: Include errno.h. - (ft_close_stream): Renamed to... - (ft_close_stream_by_munmap): This. - (ft_close_stream_by_free): New function. - (FT_Stream_Open): Use fallback method if mmap fails. - Use proper function for closing the stream. - -2004-02-14 Werner Lemberg - - * src/type1/t1load.c (parse_dict): Initialize `start_binary'. - -2004-02-13 Robert Etheridge - - * src/type42/t42objs.c (T42_Face_Init), src/type1/t1objs.c - (T1_Face_Init), src/cid/cidobjs.c (cid_face_init): Fix computation - of underline_position and underline_thickness. - -2004-02-12 Werner Lemberg - - * src/base/ftobjs.c (FT_Set_Char_Size): Return immediately if - ppem values don't change. Suggested by Graham Asher. - -2004-02-11 Werner Lemberg - - * src/cid/cidload.c (cid_face_open): Always allocate - face->cid_stream so that we can deallocate it safely. - -2004-02-10 Werner Lemberg - - Make the PS parser more tolerant w.r.t. non-standard font data. In - general, an error is only reported in case of a syntax error; a - wrong type is now simply ignored (if possible). To be independent - of the order of various MM-specific keywords, the parse_shared_dict - routine has been removed -- the PS parser is now capable to skip - this data. It no longer fails on parsing e.g. - - dup /WeightVector exch def - - Since the token following /WeightVector isn't `[' (starting an - array) it is simply ignored. - - * include/freetype/fterrdef.h: Define `FT_Err_Ignore' (0xA2) as a - new internal error value. - - * src/type1/t1load.c (parse_blend_axis_types, - parse_blend_design_positions, parse_blend_design_map): Return - T1_Err_Ignore if no proper array is following the keyword. - (parse_weight_vector): Use T1_ToTokenArray, initializing `blend' - structure, if necessary. - Return T1_Err_Ignore if no proper array is following the keyword. - (parse_shared_dict): Removed. - (parse_encoding): Set parser->root.error to return T1_Err_Ignore - if no result can be obtained. - Check for errors before accessing `elements' array. - (t1_keywords): Remove /shareddict. - (parse_dict): Reset error if t1_load_keyword returns T1_Err_Ignore. - Set keyword_flag only in case of success. - Check error code if skipping an unrecognized token. - (T1_Open_Face) [!T1_CONFIG_OPTION_NO_MM_SUPPORT]: Call T1_Done_Blend - if blend commands haven't set up a proper MM font. - - * src/psaux/psobjs.c (ps_parser_load_field_table): Remove special - code for synthetic fonts. - Return PSaux_Err_Ignore if no proper value has been found. - -2004-02-09 Werner Lemberg - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - : Preserve glyph width before calling - cff_operator_seac. - -2004-02-09 Martin Muskens - - * src/cff/cffgload.c (cff_decoder_parse_charstrings): Handle special - first argument for `hintmask' and `cntrmask' operators also. - -2004-02-08 Werner Lemberg - - * builds/unix/configure.in: Call AC_SUBST for `enable_shared', - `hardcode_libdir_flag_spec', and `wl'. - * builds/unix/configure: Regenerated. - - * builds/unix/freetype-config.in: Make --prefix and --exec-prefix - actually work. - Report a proper --rpath (or -R) value for --libs argument if a - shared library has been built. - - * docs/CHANGES: Updated. - -2004-02-07 Keith Packard - - * src/bdf/bdfdrivr.c (BDF_Face_Init, BDF_Set_Pixel_Size): Fix - computation of various vertical and horizontal metric values. - - * src/pcfdrivr.c (PCF_Set_Pixel_Size), src/pcfread (pcf_load_font): - Ditto. - -2004-02-07 Werner Lemberg - - * builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.dsw, docs/CHANGES: Updated. - -2004-02-07 Vitaliy Pasternak - - * builds/win32/visualc/freetype.sln, - builds/win32/visualc/freetype.vcproj: New files for VS.NET 2003. - -2004-02-03 Werner Lemberg - - * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): - Initialize `node'. - * src/type1/t1load.c (parse_dict): Initialize `have_integer'. - -2004-02-02 Werner Lemberg - - * src/type1/t1load.c (parse_dict): Handle `RD' and `-|' commands - outside of /Subrs or /CharStrings. This can happen if there is - additional code manipulating those two arrays so that FreeType - doesn't recognize them properly. - (T1_Open_Face): Improve an error message. - -2004-02-01 Werner Lemberg - - * src/type1/t1load.c (parse_charstrings): Exit immediately if - there are no elements in /CharStrings. This is needed for fonts - like Optima-Oblique which not only define /CharStrings but access it - also. - -2004-02-01 David Turner - - * src/sfnt/Jamfile: Removing `ttcmap' from the list of sources. - - * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP) - : Provide macro version which doesn't use inline code. - * include/freetype/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP) - : Ditto. - Use FTC_MRULIST_LOOKUP_CMP. - * include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): New - macro. - (FTC_MRULIST_LOOKUP): Use it. - - * src/cache/Jamfile (_sources), src/cache/descrip.mms: Updated. - * src/cache/ftcbasic.c: Fix compiler warnings. - * src/cache/ftcmanag.c (FTC_Manager_LookupSize, - FTC_Manager_LookupFace) : Use FTC_MRULIST_LOOKUP_CMP. - * src/cache/ftcmru.c (FTC_MruList_Find): Fix a bug (found after - heavy testing). - - * Jamfile: Updating `refdoc' target, and adding `autohint' to the - list of modules to build. Both the autohinter and autofitter will - be built by default. But which one will be used is determined by - the content of `ftmodule.h'. - - * src/autofit/*: Many updates, but the code is still buggy... - -2004-01-31 Werner Lemberg - - * src/cff/cffgload.c (cff_operator_seac): Fix magnitude of - accent offset. - Update code similarly to the seac support for Type 1 fonts. - (cff_decoder_parse_charstrings) : Fix magnitude - of accent offset. - Don't hint glyphs twice if seac is emulated. - : Assign correct point tags. - * docs/CHANGES: Updated. - -2004-01-30 Werner Lemberg - - * src/type1/t1parse.c (T1_Get_Private_Dict): Use FT_MEM_MOVE, not - FT_MEM_COPY, for copying the private dict. - - * src/type1/t1load.c (parse_subrs): Assign number of subrs only - in first run. - (parse_charstrings): Parse /CharStrings in second run without - assigning values. - (parse_dict): Skip all /CharStrings arrays but the first. We need - this for non-standard fonts like `Optima' which have different - outlines depending on the resolution. Note that there is no - guarantee that we get fitting /Subrs and /CharStrings arrays; this - can only be done by a real PS interpreter. - -2004-01-29 Antoine Leca - - * builds/win32/visualc/index.html: New file, giving detailed - explanations about forcing CR+LF line endings for the VC++ project - files. - -2004-01-22 Garrick Meeker - - * src/cff/cffload.c (cff_subfont_load): Initialize `dict'. - -2004-01-22 Werner Lemberg - - Add support for the hexadecimal representation of binary data - started with `StartData' in CID-keyed Type 1 fonts. - - * include/freetype/internal/t1types.h (CID_FaceRec): Add new - members `binary_data' and `cid_stream'. - - * src/cid/cidload.c (cid_read_subrs): Use `face->cid_stream'. - (cid_hex_to_binary): New auxiliary function. - (cid_face_open): Add new argument `face_index' to return quickly - if less than zero. Updated all callers. - Call `cid_hex_to_binary', then open and assign memory stream to - `face->cid_stream' if `parser->binary_length' is non-zero. - * src/cid/cidload.h: Updated. - - * src/cid/cidobjs.c (cid_face_done): Free `binary_data' and - `cid_stream'. - - * src/cid/cidparse.c (cid_parser_new): Check arguments to - `StartData' and set parser->binary_length accordingly. - * src/cid/cidparse.h (CID_Parser): New member `binary_length'. - - * src/cid/cidgload.c (cid_load_glyph): Use `face->cid_stream'. - - * docs/CHANGES: Updated. - -2004-01-21 Werner Lemberg - - include/freetype/config/ftstdlib.h (ft_atoi): Replaced with... - (ft_atol): This. - * src/base/ftdbgmem.c: s/atol/ft_atol/. - * src/type42/t42drivr.c: s/ft_atoi/ft_atol/. - -2004-01-20 Masatake YAMATO - - * include/freetype/ftcache.h: Delete duplicated definition of - FTC_FaceID. - - * src/cff/cffdrivr.c (cff_get_cmap_info): Call sfnt module's TT CMap - Info service function if the cmap comes from sfnt. Return 0 if the - cmap is sythesized in cff module. - -2004-01-20 David Turner - - * src/cache/ftcmanag.c (ftc_size_node_compare): Call - FT_Activate_Size. - -2004-01-20 Werner Lemberg - - * src/type1/t1parse.c (T1_Get_Private_Dict): Skip exactly one - CR, LF, or CR/LF after `eexec'. - -2004-01-18 David Turner - - * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Remove compiler - warning. - - * src/tools/docmaker/*: Updating beautifier tool. - -2004-01-15 David Turner - - * src/base/ftoutln.c (ft_orientation_extremum_compute): Fix - infinite loop bug. - - * include/freetype/ftstroke.h: Include FT_GLYPH_H. - (FT_Stroker_Rewind, FT_Glyph_Stroke, FT_Glyph_StrokeBorder): New - declarations. - - * src/base/ftstroke.c: Include FT_INTERNAL_OBJECTS_H. - (FT_Outline_GetOutsideBorder): Inverse result. - (FT_Stroker_Rewind, FT_Glyph_Stroke, FT_GlyphStrokeBorder): New - functions. - (FT_Stroker_EndSubPath): Close path if needed. - (FT_Stroker_Set, FT_Stroker_ParseOutline): Use FT_Stroker_Rewind. - - * include/freetype/cache/ftcmanag.h (FTC_ScalerRec, - FTC_Manager_LookupSize): Moved to... - * include/freetype/ftcache.h (FTC_ScalerRec, - FTC_Manager_LookupSize): Here. - - * src/tools/docmaker/docbeauty.py: New file to beautify the - documentation comments (e.g., to convert them to single block border - mode). - * src/tools/docmaker/docmaker.py (file_exists, make_file_list): - Moved to... - * src/tools/docmaker/utils.py (file_exists, make_file_list): Here. - -2004-01-14 David Turner - - * include/freetype/internal/ftmemory.h (FT_ARRAY_COPY, - FT_ARRAY_MOVE): New macros to make copying arrays easier. - Updated all relevant code to use them. - -2004-01-14 Werner Lemberg - - * src/cff/cffload.c (cff_font_load): Load charstrings_index earlier. - Use number of charstrings as argument to CFF_Load_FD_Select (as - documented in the CFF specs). - -2004-01-13 Graham Asher - - * src/pshinter/pshalgo.c (psh_glyph_init): Move assignment of - `glyph->memory' up to free arrays properly in case of failure. - -2004-01-10 Masatake YAMATO - - Make `FT_Get_CMap_Language_ID' work with CFF. Bug reported by - Steve Hartwell . - - * src/cff/cffdrivr.c: Include FT_SERVICE_TT_CMAP_H. - (cff_services): Added an entry for FT_SERVICE_ID_TT_CMAP. - (cff_get_cmap_info): New function. - (cff_service_get_cmap_info) New entry for cff_services. - - * src/sfnt/ttcmap0.c: Exit loop after a format match has been found. - Suggested by Steve Hartwell . - -2004-01-03 Masatake YAMATO - - * src/base/ftobjs.c (destroy_charmaps): New function. - (destroy_face, open_face): Use `destroy_charmaps'. - -2004-01-01 Werner Lemberg - - * docs/CHANGES: Updated. - -2004-01-01 Michael Jansson - - * src/winfonts/winfnt.c (FNT_Size_Set_Pixels): Fix sign of - size->metrics.descender. - -2003-12-31 Wolfgang Domröse - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - [FT_DEBUG_LEVEL_TRACE]: Use `%ld' in FT_TRACE4. - : Change type of dx and dy to FT_Pos and remove - cast for accessing arguments. - -2003-12-31 Werner Lemberg - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Revert previous - change. It's not necessary. - -2003-12-29 Smith Charles - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Handle `repeated - flags set' correctly. - -2003-12-29 Werner Lemberg - - * src/cff/cffobjs.c (cff_face_init): Fix memory leak by deallocating - `full' and `weight' properly. - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - [FT_DEBUG_LEVEL_TRACE]: Use `0x' as prefix for - tracing output. - -2003-12-26 Werner Lemberg - - * include/freetype/internal/sfnt.h (TT_Set_SBit_Strike_Func): - Use FT_UInt for ppem values. - * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Use FT_UInt for - ppem values. - * src/sfnt/ttsbit.h: Updated. - - * src/base/ftobjs.c (FT_Set_Pixel_Sizes): Don't allow ppem values - larger than -0FFFF. - -2003-12-25 Werner Lemberg - - * src/base/fttrigon.c, src/base/ftgloadr.c: Inlude - FT_INTERNAL_OBJECTS_H. - - * src/base/ftstroke.c (FT_Outline_GetInsideBorder, - FT_Outline_GetOutsideBorder): s/or/o/ to make it compile with - C++ compilers. - - * src/cache/ftcmru.c, include/freetype/cache/ftcmru.h: - s/select/selection/ to avoid compiler warning. - * src/cff/cffload.h: s/select/ftselect/ to avoid potential - compiler warning. - -2003-12-24 Werner Lemberg - - * src/cache/ftcsbits.c (FTC_SNode_Weight): - s/FTC_SBIT_ITEM_PER_NODE/FTC_SBIT_ITEMS_PER_NODE/. - -2003-12-24 David Turner - - * Fixed compilation problems in the cache sub-system. - - * Partial updates to src/autofit. - - * Jamfile (FT2_COMPONENTS): Add autofit module. - -2003-12-23 Werner Lemberg - - * src/cff/cffgload.c (cff_lookup_glyph_by_stdcharcode): Handle - CID-keyed fonts. - -2003-12-23 David Turner - - * include/freetype/internal/ftobjs.h (FT_PAD_FLOOR, FT_PAD_ROUND, - FT_PAD_CEIL, FT_PIX_FLOOR, FT_PIX_ROUND, FT_CEIL): New macros. They - are used to avoid compiler warnings with very pedantic compilers. - Note that `(x) & -64' causes a warning if (x) is not signed. Use - `(x) & ~63' instead! - Updated all related code. - - Add support for extraction of `inside' and `outside' borders. - - * src/base/ftstroke.c (FT_StrokerBorder): New enumeration. - (FT_Outline_GetInsideBorder, FT_Outline_GetOutsideBorder, - FT_Stroker_GetBorderCounts, FT_Stroker_ExportBorder): New functions. - (FT_StrokeBorderRec): New boolean member `valid'. - (ft_stroke_border_get_counts): Updated. - * include/freetype/ftstroke.h: Updated. - -2003-12-22 Werner Lemberg - - * include/freetype/ftwinfnt.h (FT_WinFNT_ID_*): New definitions - to describe the `charset' field in FT_WinFNT_HeaderRec. - * src/winfonts/winfnt.c (FNT_Face_Init): Set encoding to - FT_ENCODING_NONE except for FT_WinFNT_ID_MAC. - - * include/freetype/freetype.h (FT_Encoding): Improve comment, - based on work by Detlef Würkner . - - * docs/CHANGES: Updated. - -2003-12-22 David Turner - - * include/freetype/ftcache.h, - include/freetype/cache/ftcmanag.h, - include/freetype/cache/ftccache.h, - include/freetype/cache/ftcmanag.h, - include/freetype/cache/ftcmru.h (added), - include/freetype/cache/ftlru.h (removed), - include/freetype/cache/ftcsbits.h, - include/freetype/cache/ftcimage.h, - include/freetype/cache/ftcglyph.h, - src/cache/ftcmru.c, - src/cache/ftcmanag.c, - src/cache/ftccache.c, - src/cache/ftcglyph.c, - src/cache/ftcimage.c, - src/cache/ftcsbits.c, - src/cache/ftccmap.c, - src/cache/ftcbasic.c (added), - src/cache/ftclru.c (removed): - - *Complete* rewrite of the cache sub-system to `solve' the - following points: - - - all public APIs have been moved to FT_CACHE_H, everything - under `include/freetype/cache' is only needed by client - applications that want to implement their own caches - - - a new function named FTC_Manager_RemoveFaceID to deal - with the uninstallation of FaceIDs - - - the image and sbit cache are now abstract classes, that - can be extended much more easily by client applications - - - better performance in certain areas. Further optimizations - to come shortly anyway... - - - the FTC_CMapCache_Lookup function has changed its signature, - charmaps can now only be retrieved by index - - - FTC_Manager_Lookup_Face => FTC_Manager_LookupFace - FTC_Manager_Lookup_Size => FTC_Manager_LookupSize (still in - private header for the moment) - -2003-12-21 Werner Lemberg - - * src/type1/t1load.c (parse_dict): Stop parsing if `eexec' keyword - is encountered. - -2003-12-19 Werner Lemberg - - * src/cff/cfftypes.h (CFF_MAX_CID_FONTS): Increase to 32. For - example, the Japanese Hiragino font already contains 15 subfonts. - - * src/cff/cffload.c (cff_font_load): Deallocate `sids' array for - CID-keyed fonts. - - * devel/ftoption.h: Define FT_DEBUG_MEMORY. - -2003-12-18 Werner Lemberg - - * include/freetype/ttnameid.h (TT_ADOBE_ID_LATIN_1): New macro. - * src/type1/t1objs.c (T1_Face_Init): Use TT_ADOBE_ID* values. - -2003-12-18 Werner Lemberg - - * src/cff/cfftypes.h (CFF_FontRecDictRec): Change type of - `cid_count' to `FT_ULong'. - - * src/cff/cffgload.c (cff_slot_load): Take care of empty `cids' - array. - - * src/cff/cffload.c (cff_charset_done): Free `cids' array. - (cff_font_load): Create cids array only for CID-keyed fonts which - are subsetted. - - * src/cff/cffobjs.c (cff_face_init): Check the availability of - the PSNames modules for non-pure CFFs also. - Set FT_FACE_FLAG_GLYPH_NAMES for a non-pure CFF also if it isn't - CID-keyed. - - * src/cff/rules.mk (CFF_DRV_H): Add cfftypes.h. - -2003-12-17 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_init_face): Don't set - FT_FACE_FLAG_GLYPH_NAMES if the font contains a version 3.0 `post' - table. - - * docs/CHANGES: Updated. - -2003-12-17 Masatake YAMATO - - Add new function FT_Get_CMap_Language_ID to extract the language ID - for TrueType/sfnt fonts. - - * include/freetype/internal/services/svttcmap.h: New file. - * include/freetype/internal/ftserv.h (FT_SERVICE_TT_CMAP_H): Add - svttcmap.h. - - * src/sfnt/sfdriver.c: Include ttcmap0.h. - (tt_service_get_cmap_info): New service. - (sfnt_services): Updated. - - * src/sfnt/ttcmap0.c (tt_cmap*_get_info): New functions. - (tt_cmap*_class_rec): Add tt_cmap*_get_info members. - (tt_get_cmap_info): New function. - * src/sfnt/ttcmap0.h: Include FT_SERVICE_TT_CMAP_H. - (TT_CMap_ClassRec): New field `get_cmap_info'. - (tt_get_cmap_info): New declaration. - - * src/base/ftobjs.c: Include FT_SERVICE_TT_CMAP_H. - (FT_Get_CMap_Language_ID): New function implementation. - * include/freetype/tttables.h (FT_Get_CMap_Language_ID): New - function declaration. - -2003-12-16 Werner Lemberg - - * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h: Removed. Obsolete. - - * include/freetype/internal/sfnt.h (SFNT_Interface): Remove - obsolete fields `load_charmap' and `free_charmap'. - (TT_CharMap_Load_Func, TT_CharMap_Free_Func): Removed. - * src/sfnt/sfnt.c: Don't include ttcmap.c. - * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttcmap.c. - * src/sfnt/ttload.c: Don't include ttcmap.h. - * src/sfnt/sfdriver.c: Don't include ttcmap.h. - (sfnt_interface): Updated. - - * include/freetype/internal/tttypes.h (TT_TableDirRec, - TT_CMapDirRec, TT_CMapDirEntryRec, TT_CMap0, TT_CMap2SubHeaderRec, - TT_CMap2Rec, TT_CMap4Segment, TT_CMap4Rec, TT_CMap6, - TT_CMapGroupRec, TT_CMap8_12Rec, TT_CMap10Rec, TT_CharMap_Func, - TT_CharNext_Func, TT_CMapTableRec, TT_CharMapRec): Removed. - Obsolete. - * src/cff/cffobjs.h (CFF_CharMapRec): Removed. Obsolete. - -2003-12-15 Werner Lemberg - - * docs/CHANGES: Updated. - -2003-12-15 Wolfgang Domröse - - * builds/atari/*: New directory for building FreeType 2 on Atari - with the PureC compiler. - -2003-12-12 Wolfgang Domröse - - * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Add - cast. - * src/cff/cffdrivr.c (cff_ps_has_glyph_names): Assure that return - value is either 0 or 1. - -2003-12-12 Werner Lemberg - - * src/cff/cffdrivr.c (cff_get_glyph_name): Improve error message. - (cff_get_name_index): Return if no PSNames service is available. - (cff_ps_has_glyph_names): Handle CID-keyed fonts correctly. - * src/cff/cfftypes.h (CFF_CharsetRec): New field `cids', used for - CID-keyed fonts. This is the inverse mapping of `sids'. - * src/cff/cffload.c (cff_charset_load): New argument `invert'. - Initialize charset->cids if `invert' is set. - (cff_font_load): In call to cff_charset_load, set `invert' to true - for CID-keyed fonts. - * src/cff/cffgload.c (cff_slot_load): Handle glyph index as CID - and map it to the real glyph index. - - * docs/CHANGES: Updated. - -2003-12-11 Werner Lemberg - - * src/cff/cffobjs.c (cff_face_init): Don't set - FT_FACE_FLAG_GLYPH_NAMES for CID-keyed fonts. - Don't construct a cmap for CID-keyed fonts. - -2003-12-10 Werner Lemberg - - Use implementation specific SID value 0xFFFF to indicate that - a dictionary element is missing. - - * src/cff/cffload.c (cff_subfont_load): Initialize all fields - which hold SIDs to 0xFFFF. - (cff_index_get_sid_string): Handle SID value 0xFFFF. - Handle case where `psnames' is zero. - (cff_font_load): Updated. - Don't load encoding for CID-keyed CFFs. - - * src/cff/cffobjs.c (cff_face_init): Updated. - Don't check for PSNames module if font is CID-keyed. - Compute style name properly (using the same algorithm as in the - CID driver). - Fix computation of style flags. - - * src/cff/cfftoken.h: Comment out handling of base_font_name. - Rename `postscript' field to `embedded_postscript' - * src/cff/cfftypes.h (CFF_FontRecDictRec): Remove `base_font_name' - and `postscript'. - -2003-12-10 Detlef Würkner - - * src/pcf/pcfdrivr.c (pcf_get_charset_id): New function (a clone - of the similar BDF function). - (pcf_service_bdf): Use it. - -2003-12-09 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_load_face): Set FT_FACE_FLAG_GLYPH_NAMES - only if a `post' table is present. - -2003-12-09 George Williams - - * src/base/ftobjs.c (load_mac_face): Recent versions of Linux - support Mac's HFS+ file system, thus enable code to read /rsrc on - non-Macintosh platforms also. - -2003-12-08 Werner Lemberg - - * include/freetype/internal/psaux.h (PS_TableRec): Change type - of `lengths' to FT_PtrDist. - (T1_DecoderRec): Change type of `subrs_len' to FT_PtrDist. - * include/freetype/internal/t1types.h (T1_FontRec): Change type - of `subrs_len' and `charstrings_len' to FT_PtrDist. - - * src/base/ftobjs.c (Mac_Read_POST_Resource): Replace `junk' - variable with better solution. - (IsMacResource): Remove unused variable `map_len'. - Replace `junk' variable with better solution. - (FT_Open_Face) [!FT_MACINTOSH]: Add conditional - FT_CONFIG_OPTION_MAC_FONTS. - -2003-12-08 Wolfgang Domröse - - * src/autohint/ahhint.c (ah_hinter_hint_edges, - ah_hinter_align_strong_points): Add some casts. - - * src/base/ftoutln.c (FT_OrientationExtremumRec): Change type - of `pos' to FT_Long. - - * src/base/ftobjs.c (Mac_Read_POST_Resource, - Mac_Read_sfnt_Resource): Change type of `len' to FT_Long. - - * src/type42/t42parse.c (t42_parse_dict): Add cast for `n_keywords'. - -2003-12-07 Werner Lemberg - - * docs/raster.txt: New file, taken from FreeType 1 and completely - revised. - -2003-12-04 Masatake YAMATO - - * src/type1/t1driver.c (Get_Interface): Remove FT_UNUSED for - t1_interface. t1_interface is used. - -2003-11-27 David Turner - - * src/pfr/pfrdrivr.c (pfr_get_metrics): Revert incorrect change of - 2003-11-23: For PFR fonts, metrics->x_scale and metrics->y_scale are - the scaling values for outline units, not for metric units. - -2003-11-25 Werner Lemberg - - * src/base/ftcalc.c, include/freetype/internal/ftcalc.h - (FT_MulDiv_No_Round): Surround code with `#ifdef - TT_CONFIG_OPTION_BYTECODE_INTERPRETER ... #endif'. - -2003-11-23 Werner Lemberg - - * src/base/ftcalc.c (FT_MulDiv_No_Round): New function (32 and - 64 bit version). - * include/freetype/internal/ftcalc.h: Updated. - - * src/truetype/ttinterp.c (TT_MULDIV_NO_ROUND): New macro. - (TT_INT64): Removed. - (DO_DIV): Use TT_MULDIV_NO_ROUND. - - * src/pfr/pfrdrivr.c (pfr_get_metrics): Directly use - metrics->x_scale and metrics->y_scale. - -2003-11-22 Rogier van Dalen - - * src/truetype/ttinterp.c (CUR_Func_move_orig): New macro. - (Direct_Move_Orig, Direct_Move_Orig_X, Direct_Move_Orig_Y): New - functions. Similar to Direct_Move, Direct_Move_X, and - Direct_Move_Y but without touching. - (Compute_Funcs): Use new functions. - - (Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid, - Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, - Round_Super_45): Fix rounding of value zero. - - (DO_DIV): Don't use TT_MULDIV. - - (Ins_SHC): This instruction actually touches the points. - (Ins_MSIRP): Fix undocumented behaviour. - - * src/truetype/ttinterp.h (TT_ExecContextRec): Updated. - -2003-11-22 Werner Lemberg - - * docs/VERSION.DLL, docs/CHANGES: Updated. - - * src/base/ftobjs.c (FT_Set_Char_Size): Make metrics->x_scale and - metrics->y_scale really precise. - - (FT_Load_Glyph): Update computation of linearHoriAdvance and - linearVertAdvance. - - * src/truetype/ttinterp.c (Update_Max): Use FT_REALLOC. - -2003-11-22 David Turner - - * src/autofit/*: More updates. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8. - * builds/unix/configure.ac (version_info): Set to 9:6:3. - * README: Updated. - -2003-11-13 John A. Boyd Jr. - - * src/bdf/bdfdrivr.c (bdf_interpret_style), src/pcf/pcfread.c - (pcf_interpret_style): Replace spaces with dashes in properties - SETWIDTH_NAME and ADD_STYLE_NAME to simplify parsing. - -2003-11-11 Werner Lemberg - - * docs/CHANGES: Updated. - -2003-11-11 John A. Boyd Jr. - - Handle SETWIDTH_NAME and ADD_STYLE_NAME properties for BDF and PCF - fonts. - - * src/bdf/bdfdrivr.c (bdf_interpret_style): New auxiliary function. - (BDF_Face_Init): Don't handle style properties but call - bdf_interpret_style. - - * src/pcf/pcfread.c (pcf_interpret_style): New auxiliary function. - (pcf_load_font): Don't handle style properties but call - pcf_interpret_style. - -2003-11-07 Werner Lemberg - - - * Version 2.1.7 released. - ========================= - - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7. - - * builds/unix/ft2unix.h: Fix comments. - - * builds/unix/ftconfig.in: Synchronized with ANSI version. - Use `#undef' in templates as recommended in the autoconf - documentation. - Since real `#undef' lines don't survive during configuration, use - `/undef' instead; the postprocessing facility of the - AC_CONFIG_HEADERS autoconf macro converts them to `#undef'. - - * builds/unix/install.mk (install): Install Unix version of - `ftconfig.h'. - - * builds/unix/unix-cc.in (CFLAGS): Set FT_CONFIG_CONFIG_H macro - to include the correct `ftconfig.h' file. - - * builds/unix/ft-munmap.m4 (FT_MUNMAP_DECL): Removed. - (FT_MUNMAP_PARAM): Updated syntax to autoconf 2.59. - - * builds/unix/freetype2.m4: Updated syntax to autoconf 2.59. - - * builds/unix/configure.ac: Use AC_CONFIG_HEADERS instead of - AC_CONFIG_HEADER to create ftconfig.h, and use second argument - to replace `/undef' with `#undef'. - Don't use FT_MUNMAP_DECL but AC_CHECK_DECLS to check for munmap. - Use AS_HELP_STRING in AC_ARG_WITH. - Update syntax to autoconf 2.59. - - * builds/unix/ltmain.sh: Regenerated with `libtoolize --force - --copy' from libtool 1.5. - * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from - automake 1.7.8. - * builds/unix/configure: Regenerated with autoconf 2.59. - * builds/unix/config.guess, builds/unix/config.sub: Updated from - `config' CVS module at subversions.gnu.org - * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from - `texinfo' CVS module at subversions.gnu.org. - - * builds/vms/ftconfig.h: Synchronized with ANSI version. - - * docs/CUSTOMIZE: Fix documentation error. - * docs/CHANGES, docs/VERSION.DLL, docs/release: Updated. - - * builds/freetype.mk (refdoc): Updated --title. - -2003-11-07 David Turner - - - * Version 2.1.6 released. - ========================= - - - * install: Removed. Obsolete. - -2003-11-04 Werner Lemberg - - * src/sfnt/sfdriver.c: Include FT_SERVICE_SFNT_H. - (sfnt_service_sfnt_table): New service. - (sfnt_services): Updated. - - * docs/license.txt: Reworded. - -2003-11-03 Werner Lemberg - - * include/freetype/*: Add a guard to all public header files which - load FT_FREETYPE_H to reject freetype.h from FreeType 1. - -2003-11-02 Patrick Welche - - * builds/unix/freetype2.m4, builds/unix/ft-munmap.m4: Protect - first argument of AC_DEFUN with brackets to avoid possible - expansion. - -2003-11-02 Werner Lemberg - - * include/freetype/cache/ftcglyph.h: Don't include stddef.h. - - * include/freetype/freetype.h: Fix check for ft2build.h. - -2003-11-01 Werner Lemberg - - * include/freetype/freetype.h: Check that ft2build.h has been - loaded first. - - * src/base/fttype1.c (FT_Get_PS_Font_Info): Fix incorrectly applied - patch. - -2003-10-31 Detlef Würkner - - * src/base/fttype1.c (FT_Get_PS_Font_Info, FT_Has_PS_Glyph_Names): - Fix parameter order in calls to FT_FACE_FIND_SERVICE. - -2003-10-31 Werner Lemberg - - * include/freetype/internal/ftserv.h - (FT_SERVICE_POSTSCRIPT_NAMES_H): Removed. Unused. - - * src/type42/t42drivr.c (t42_services): Updated. - -2003-10-29 David Turner - - * include/freetype/internal/bdftypes.h: Removed. Obsolete. - * src/base/ftbdf.c: Updated. - - * include/freetype/internal/cfftypes.h: Moved to... - * src/cff/cfftypes.h: This place since no other module needs to - know about those types. - - * include/freetype/internal/t42types.h: Moved to... - * src/type42/t42types.h: This place since no other module needs to - know about those types. - - * include/freetype/internal/services/svbdf.h: Include FT_BDF_H. - - * include/freetype/internal/services/svpsname.h: Renamed to... - * include/freetype/internal/services/svpscmap.h: This. - Updated `FT_Service_PsNames' -> `FT_Service_PsCMaps' and - `POSTSCRIPT_NAMES' -> `POSTSCRIPT_CMAPS' everywhere. - - * include/freetype/internal/services/svpsinfo.h: New file, providing - PostScript info service. - - * include/freetype/internal/ftserv.h (FT_SERVICE_POSTSCRIPT_CMAPS_H, - FT_SERVICE_POSTSCRIPT_INFO_H): New macros for svpscmap.h and - svpsinfo.h. - * include/freetype/internal/internal.h (FT_INTERNAL_TYPE42_TYPES_H, - FT_INTERNAL_CFF_TYPES_H, FT_INTERNAL_BDF_TYPES_H): Removed. - - * src/base/fttype1.c: Don't include FT_INTERNAL_TYPE1_TYPES_H and - FT_INTERNAL_TYPE42_TYPES_H but FT_INTERNAL_SERVICE_H and - FT_SERVICE_POSTSCRIPT_INFO_H. - (FT_Get_PS_Font_Info, FT_Has_PS_Glyph_Names): Use new - POSTSCRIPT_INFO service. - - * src/cff/cffdrivr.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. - (cff_ps_has_glyph_names): New function. - (cff_service_ps_info): New service. - (cff_services): Updated. - - * src/cff/cffload.h, src/cff/cffobjs.h, src/cff/cffparse.h: Don't - include FT_INTERNAL_CFF_TYPES_H but cfftypes.h directly. - - * src/cif/cidriver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. - (cid_ps_get_font_info): New function. - (cid_service_ps_info): New service. - (cid_services): Updated. - - * src/type1/t1driver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. - (t1_ps_get_font_info, t1_ps_has_glyph_names): New functions. - (t1_service_ps_info): New service. - (t1_services): Updated. - - * src/type42/t42drivr.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. - (t42_ps_get_font_info, t42_ps_has_glyph_names): New functions. - (t42_service_ps_info): New service. - - * src/type42/t42objs.h: Don't include FT_INTERNAL_TYPE42_TYPES_H - but t42types.h directly. - - * src/psnames/psmodule.c (psnames_interface, psnames_services): - Renamed to... - (pscmaps_interface, pscmaps_services): This. - Updated all users. - - - * src/gzip/infblock.c (inflate_blocks): Remove compiler warning. - -2003-10-22 Werner Lemberg - - * src/type1/t1load.c (parse_encoding): Handle `/Encoding [ ... ]'. - - * src/type1/t1parse.c (T1_Get_Private_Dict): Test whether `eexec' - is real. - - * src/type42/t42parse.c (t42_parse_encoding): Improve boundary - checking while parsing. - - * docs/CHANGES: Updated. - -2003-10-21 Josselin Mouette - - * include/freetype/internal/t1types.h (T1_FontRec): `paint_type' - and `stroke_width' aren't pointers. - - * src/type42/t42objs.c (T42_Face_Done), src/type1/t1objs.c - (T1_Face_Done): Don't free `paint_type' and `stroke_width'. - -2003-10-20 Graham Asher - - * src/winfonts/winfnt.c (fnt_cmap_class): Fix position of `const'. - -2003-10-19 Werner Lemberg - - * src/autohint/ahhint.c (ah_hinter_load_glyph): Patch from - 2003-08-18 introduced a severe bug (FT_Render_Glyph was called - twice under some circumstances, causing strange results). This - is fixed now by clearing the FT_LOAD_RENDER bit of `load_flags'. - - * src/base/ftpfr.c (FT_Get_PFR_Metrics): Initialize `error'. - * src/psaux/psobjs.c (ps_tobytes): Initialize `n'. - * src/type42/t42parse.c (t42_parse_sfnts): Initialize `string_size'. - -2003-10-16 Werner Lemberg - - Completely revised Type 42 parser. It now handles both fonts - produced with ttftot42 (tested version 0.3.1) and - TrueTypeToType42.ps (tested version May 2001; it is necessary to - fix the broken header comment to be `%!PS-TrueTypeFont...'). - - * src/type42/t42objs.c (T42_GlyphSlot_Load): Change fourth - parameter to `FT_UInt'. - * src/type42/t42objs.h: Updated. - - * src/type42/t42parse.h (T42_ParserRec): Change type of `in_memory' - to FT_Bool. - (T42_Loader): Change type of `num_chars' and `num_glyphs' to - FT_UInt. - Add `swap_table' element. - * src/type42/t42parse.c (T42_KEYWORD_COUNT, T1_ToFixed, - T1_ToCoordArray, T1_ToTokenArray): Removed. - (T1_ToBytes): New macro. - (t42_is_alpha, t42_hexval): Removed. - (t42_is_space): Handle `\0'. - (t42_parse_encoding): Updated to use new PostScript parser routines - from psaux. - Handle `/Encoding [ ... ]' also. - (T42_Load_Status): New enumeration. - (t42_parse_sfnts): Updated to use new PostScript parser routines - from psaux. - (t42_parse_charstrings): Updated to use new PostScript parser - routines from psaux. - Handle `/CharStrings << ... >>' also. - Don't expect that /.notdef is the first element in dictionary. Copy - code from type1 module to handle this. - (t42_parse_dict): Updated to use new PostScript parser routines - from psaux. - Remove code for synthetic fonts (which can't occur in Type 42 - fonts). - (t42_loader_done): Release `swap_table'. - - * src/psaux/psobjs.c (skip_string): Increase `cur' properly. - - * src/type1/t1load.c (parse_charstrings): Make test for `.notdef' - faster. - -2003-10-15 Graham Asher - - * src/autohint/ahglobal.c (blue_chars), src/winfonts/winfnt.c - (fnt_cmap_class_rec, fnt_cmap_class), src/bdf/bdflib.c (empty, - _num_bdf_properties), src/gzip/infutil.c (inflate_mask), - src/gzip/inffixed.h (fixed_bl, fixed_bd, fixed_tl, fixed_td), - src/gzip/inftrees.h (inflate_trees_fixed), srf/gzip/inftrees.c - (inflate_trees_fixed): Decorate with more `const' to avoid - writable global variables which are disallowed on ARM. - -2003-10-08 Werner Lemberg - - * src/type1/t1load.c (parse_font_matrix, parse_charstrings): Remove - code specially for synthetic fonts; this is handled elsewhere. - (parse_encoding): Remove code specially for synthetic fonts; this is - handled elsewhere. - Improve boundary checking while parsing. - (parse_dict): Improve boundary checking while parsing. - Use ft_memcmp to simplify code. - -2003-10-07 Werner Lemberg - - * src/type1/t1load.c (parse_subrs, parse_dict): Handle synthetic - fonts properly. - (parse_charstrings): Copy correct number of characters into - `name_table'. - -2003-10-06 Werner Lemberg - - Heavy modification of the PS parser to handle comments and strings - correctly. This doesn't slow down the loading of PS fonts - significantly since charstrings aren't affected. - - * include/freetype/config/ftstdlib.h (ft_xdigit): Renamed to... - (ft_isxdigit): This. Updated all callers. - (ft_isdigit): New alias to `isdigit'. - - * include/freetype/internal/psaux.h (PS_Parser_FuncsRec): Renamed - `skip_alpha' to `skip_PS_token'. - Add parameter to `to_bytes' and change some argument types. - - * src/psaux/psauxmod.c (ps_parser_funcs): Updated. - * src/psaux/psobjs.c (ft_char_table): New array to map character - codes (ASCII and EBCDIC) of digits to numbers. - (OP): New auxiliary macro holding either `>=' or `<' depending on - the character encoding. - (skip_comment): New function. - (skip_spaces): Use it. - (skip_alpha): Removed. - (skip_literal_string, skip_string): New functions. - (ps_parser_skip_PS_token): New function. This is a better - replacement of... - (ps_parser_skip_alpha): Removed. - (ps_parser_to_token, ps_parser_to_token_array): Updated. - (T1Radix): Rewritten, using `ft_char_table'. - (t1_toint): Renamed to... - (ps_toint): This. Update all callers. - Use `ft_char_table'. - (ps_tobytes): Add parameter to handle delimiters and change some - argument types. - Use `ft_char_table'. - (t1_tofixed): Renamed to... - (ps_tofixed): This. Update all callers. - Use `ft_char_table'. - (t1_tocoordarray): Renamed and updated to... - (ps_tocoordarray): This. Update all callers. - (t1_tofixedarray): Renamed and updated to... - (ps_tofixedarray): This. Update all callers. - (t1_tobool): Renamed to... - (ps_tobool): This. Update all callers. - (ps_parser_load_field): Updated. - (ps_parser_load_field_table): Use `T1_MAX_TABLE_ELEMENTS' - everywhere. - (ps_parser_to_int, ps_parser_to_fixed, ps_parser_to_coord_array, - ps_parser_to_fixed_array): Skip spaces. Updated. - (ps_parser_to_bytes): Add parameter to handle delimiters and change - some argument types. Updated. - * src/psaux/psobjs.h: Updated. - - * src/cid/cidload.c (cid_parse_dict): Updated. - * src/cid/cidparse.c (cid_parser_new): Check whether the `StartData' - token was really found. - * src/cid/cidparse.h (cid_parser_skip_alpha): Updated and renamed - to... - (cid_parser_skip_PS_token): This. - - * src/type1/t1parse.h (T1_ParserRec): Use `FT_Bool' for boolean - fields. - (T1_Skip_Alpha): Replaced with... - (T1_Skip_PS_Token): This new macro. - * src/type1/t1parse.c (hexa_value): Removed. - (T1_Get_Private_Dict): Use `ft_isxdigit' and - `psaux->ps_parser_funcs_to_bytes' for handling ASCII hexadecimal - encoding. - After decrypting, replace the four random bytes at the beginning - with whitespace. - * src/type1/t1load.c (t1_allocate_blend): Use proper error values. - (parser_blend_design_positions, parse_blend_design_map, - parse_weight_vector): Updated. - (is_space): Handle `\f' also. - (is_name_char): Removed. - (read_binary_data): Updated. - (parse_encoding): Use `ft_isdigit'. - Updated. - (parse_subrs): Updated. - (TABLE_EXTEND): New macro. - (parse_charstrings): Updated. - Provide a workaround for buggy fonts which have more entries in the - /CharStrings dictionary then expected; the function now adds some - slots and skips entries which still exceed the new limit. - (parse_dict): Updated. - Terminate on the token `closefile'. - - * src/type42/t42parse.c (T1_Skip_Alpha): Replaced with... - (T1_Skip_PS_Token): This new macro. Updated all callers. - (t42_parse_encoding): Use `ft_isdigit'. - - - * src/base/ftmm.c (ft_face_get_mm_service): Return FT_Err_OK if - success. - -2003-10-05 Werner Lemberg - - * include/freetype/ftmodule.h: Renamed to... - * include/freetype/ftmodapi.h: This to avoid duplicate file names. - * include/freetype/config/ftheader.h (FT_MODULE_H): Updated. - -2003-10-04 Werner Lemberg - - * src/base/ftoutln.c (FT_OrientationExtremumRec, - FT_Outline_Get_Orientation): Trivial typo fixes to make it compile. - -2003-10-02 Markus F.X.J. Oberhumer - - * src/winfonts/winfnt.c (FT_WinFNT_HeaderRec): `color_table_offset' - has four bytes, not two. - Fix all users. - (fnt_font_load, FNT_Load_Glyph): Add more font validity tests. - -2003-10-01 David Turner - - * src/autofit/*: Adding first source files of the new multi-script - `auto-fitter'. - - * include/freetype/ftoutln.h (FT_Orientation): New enumeration. - (FT_Outline_Get_Orientation): New declaration. - - * src/base/ftoutln.c (FT_OrientationExtremumRec): New structure. - (ft_orientation_extremum_compute): New auxiliary function. - (FT_Outline_Get_Orientation): New function to compute the fill - orientation of a given glyph outline. - - * include/freetype/internal/ftserv.h (FT_FACE_LOOKUP_SERVICE): Fixed - trivial bug which could crash the font engine when a cached service - pointer was retrieved. - -2003-09-30 Werner Lemberg - - * src/cid/cidload.c (cid_parse_dict): Skip token if no keyword is - found. - - * src/type1/t1parse.c (IS_T1_WHITESPACE, IS_T1_LINESPACE, - IS_T1_SPACE): Removed. - (PFB_Tag): Removed. - (read_pfb_tag): Don't use PFB_Tag. - - * src/type42/t42parse.c (t42_is_space): Handle `\f' also. - (t42_parse_encoding): Handle synthetic fonts. - -2003-09-29 Werner Lemberg - - * include/freetype/internal/t1types.h: Don't include - FT_INTERNAL_OBJECTS_H but FT_INTERNAL_SERVICE_H. - * src/truetype/ttobjs.c: Don't include - FT_SERVICE_POSTSCRIPT_NAMES_H. - -2003-09-29 David Turner - - Added new service to handle glyph name dictionaries, replacing the - old internal header named `psnames.h' by `services/svpsname.h'. - Note that this is different from `services/svpostnm.h' which only - handles the retrieval of PostScript font names for a given face. - (Should we merge these two services into a single header?) - - * include/freetype/internal/psnames.h: Removed. Most of its - contents is moved to... - * include/freetype/internal/services/svpsname.h: New file. - - * include/freetype/internal/services/svpostnm.h - (FT_SERVICE_ID_POSTSCRIPT_NAME): Replaced with... - (FT_SERVICE_ID_POSTSCRIPT_FONT_NAME): New macro. - (PsName): Service named changed to... - (PsFontName): This. - Updated `FT_Service_PsName' -> `FT_Service_PsFontName' and - `POSTSCRIPT_NAME' -> `POSTSCRIPT_FONT_NAME' everywhere. - - * include/freetype/internal/internal.h - (FT_INTERNAL_POSTSCRIPT_NAMES_H): Removed. - * include/freetype/internal/psaux.h: Include - FT_SERVICE_POSTSCRIPT_NAMES_H. - (T1_DecoderRec): Updated type of `psnames'. - * include/freetype/internal/t1types.h: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - Include FT_INTERNAL_OBJECTS_H. - * include/freetype/internal/t42types.h: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H. - * include/freetype/internal/tttypes.h (TT_FaceRec): Updated. - - * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE): Changed - order of parameters. All callers updated. - (FT_FACE_FIND_GLOBAL_SERVICE): New macro to look up a service - globally, checking all modules. - (FT_ServiceCacheRec): Updated. - (FT_SERVICE_POSTSCRIPT_NAMES_H): New macro for accessing - `svpsname.h'. - - * include/freetype/internal/ftobjs.h, src/base/ftobjs.c - (ft_module_get_service): New function. - - * src/cff/cffdrivr.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H - but FT_SERVICE_POSTSCRIPT_NAMES_H. - (cff_get_glyph_name, cff_get_name_index): Use new POSTSCRIPT_NAMES - service. - * src/cff/cffcmap.c (cff_cmap_unicode_init): Updated. - * src/cff/cffload.c, src/cff/cffload.h: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - (cff_index_get_sid_string): Updated. - * src/cff/cffobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H - but FT_SERVICE_POSTSCRIPT_NAMES_H. - (cff_face_init): Use new POSTSCRIPT_NAMES service. - * src/cff/cffobjs.h: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H - but FT_SERVICE_POSTSCRIPT_NAMES_H. - - * src/cid/cidobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H - but FT_SERVICE_POSTSCRIPT_NAMES_H. - (cid_face_init): Use new POSTSCRIPT_NAMES service. - * src/cid/cidriver.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H. - - * src/psaux/t1cmap.c (t1_cmap_std_init, t1_cmap_unicode_init): Use - new POSTSCRIPT_NAMES service. - * src/psaux/t1decode.h (t1_lookup_glyph_by_stdcharcode, - t1_decode_init): Use new POSTSCRIPT_NAMES service. - * src/psaux/t1cmap.h, src/psaux/t1decode.h: Dont' include - FT_INTERNAL_POSTSCRIPT_NAMES_H. - - * src/psnames/psmodule.c: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - (ps_build_unicode_table): Renamed to... - (ps_unicodes_init): This. - (ps_lookup_unicode): Renamed to... - (ps_unicodes_char_index): This. - (ps_next_unicode): Renamed to... - (ps_unicodes_char_next): This. - (psnames_interface): Updated. - (psnames_services): New services list. - (psnames_get_service): New function. - (psnames_module_class): Updated. - - * src/sfnt/sfobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H - but FT_SERVICE_POSTSCRIPT_NAMES_H. - (sfnt_init_face): Use new POSTSCRIPT_NAMES service. - * src/sfnt/ttpost.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H - but FT_SERVICE_POSTSCRIPT_NAMES_H. - (tt_face_get_ps_name): Updated. - - * src/truetype/ttobjs.c: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - - * src/type1/t1driver.c: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - * src/type1/t1objs.c: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - (T1_Face_Init): Use new POSTSCRIPT_NAMES service. - - * src/type42/t42drivr.c (t42_get_ps_name): Renamed to... - (t42_get_ps_font_name): This. - (t42_service_ps_name): Renamed to... - (t42_service_ps_font_name): This. - (t42_services): Updated. - * src/type42/t42objs.c (T42_Face_Init): Use new POSTSCRIPT_NAMES - service. - * src/type42/t42objs.h: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - - - * src/base/ftglyph.c (FT_Get_Glyph): Don't access `slot' before - testing its validity. Reported by Henry Maddocks - . - -2003-09-21 Werner Lemberg - - * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE): - Fix compilation warning (s/pptr/Pptr/). - - * include/freetype/internal/internal.h (FT_INTERNAL_PFR_H, - FT_INTERNAL_FNT_TYPES_H): Removed. - -2003-09-21 David Turner - - Migrating the PFR and WINFNT drivers to the new service-based - internal API. - - * include/freetype/internal/fnttypes.h: Removed. Most of its data - are moved to winfnt.h and... - * include/freetype/internal/services/svwinfnt.h: New file. - - * include/freetype/internal/pfr.h: Removed. Most of its data are - moved to... - * include/freetype/internal/services/svpfr.h: New file. - - * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, - FT_FACE_LOOKUP_SERVICE): Simplify fix of 2003-09-16 by removing - pointer type argument. - Updated all callers. - Update macro names of services header files. - - * src/base/ftobjs.c (FT_Get_Name_Index): Simplified code. - - * src/base/ftpfr.c: Include FT_SERVICE_PFR_H instead of - FT_INTERNAL_PFR_H. - (ft_pfr_check, FT_Get_PFR_Metrics, FT_Get_PFR_Kerning, - FT_Get_PFR_Advance): Use services provided in `PFR_METRICS'. - - * src/base/ftwinfnt.c: Include FT_SERVICE_WINFNT_H instead of - FT_INTERNAL_FNT_TYPES_H. - (FT_Get_WinFNT_Header): Use service provided in `WINFNT'. - - * src/pfr/pfrdrivr.c: Include FT_SERVICE_PFR_H and - FT_SERVICE_XFREE86_NAME_H instead of FT_INTERNAL_PFR_H. - (pfr_service_bdf): Updated. - (pfr_services): New services list. - (pfr_get_service): New function. - (pfr_driver_class): Updated. - - * src/winfonts/winfnt.c: Include FT_SERVICE_WINFNT_H and - FT_SERVICE_XFREE86_NAME_H instead of FT_INTERNAL_FNT_TYPES_H. - (winfnt_get_header, winfnt_get_service): New functions. - (winfnt_service_rec): New structure providing WINFNT services. - (winfnt_services): New services list. - (winfnt_driver_class): Updated. - * src/winfonts/winfnt.h: Add most of the removed fnttypes.h data. - - * src/sfnt/sfdriver.c (sfnt_service_ps_name): Fix typo. - - * src/type1/t1driver.c (t1_service_ps_name): Fix typo. - - * src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrsbit.c, - src/psaux/psobjs.c, src/sfnt/sfobjs.c, src/truetype/ttobjs.c, - src/type1/t1objs.c, src/type42/t42objs.c: Removing various compiler - warnings. - -2003-09-19 David Bevan - - * src/type1/t1parse.c (pfb_tag_fields): Removed. - (read_pfb_tag): Fix code so that it doesn't fail on end-of-file - indicator (0x8003). - * docs/CHANGES: Updated. - -2003-09-16 Werner Lemberg - - * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, - FT_FACE_LOOKUP_SERVICE): Add parameter to pass pointer type. - Ugly, I know, but this is needed for compilation with C++ -- - maybe someone knows a better solution? - Updated all callers. - - * src/base/ftobjs.c (FT_Get_Name_Index, FT_Get_Glyph_Name): Remove - C++ compiler warnings. - - * src/base/ftbdf.c (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): - Fix order of arguments passed to FT_FACE_FIND_SERVICE. - -2003-09-15 Werner Lemberg - - Avoid header files with identical names. - - * include/freetype/internal/services/bdf.h: Renamed to... - * include/freetype/internal/services/svbdf.h: This. - Add copyright notice. - * include/freetype/internal/services/glyfdict.h: Renamed to... - * include/freetype/internal/services/svgldict.h: This. - Add copyright notice. - * include/freetype/internal/services/multmast.h: Renamed to... - * include/freetype/internal/services/svmm.h: This. - Add copyright notice. - Add FT_BEGIN_HEADER and FT_END_HEADER. - * include/freetype/internal/services/sfnt.h: Renamed to... - * include/freetype/internal/services/svsfnt.h: This. - Add copyright notice. - * include/freetype/internal/services/postname.h: Renamed to... - * include/freetype/internal/services/svpostnm.h: This. - Add copyright notice. - * include/freetype/internal/services/xf86name.h: Renamed to... - * include/freetype/internal/services/svxf86nm.h: This. - Add copyright notice. - - * include/freetype/internal/ftserv.h: Add FT_BEGIN_HEADER and - FT_END_HEADER. - Add copyright notice. - Update macro names of services header files. - - * builds/freetype.mk (SERVICES_DIR): New variable. - (BASE_H): Add services header files. - -2003-09-11 Werner Lemberg - - * builds/toplevel.mk (distclean): Remove `builds/unix/freetype2.pc'. - - * src/cff/cffdrivr.c: Don't load headers twice. - - * include/freetype/internal/ftserv.h (FT_SERVICE_SFNT_H): New macro. - * src/base/ftobjs.c: Include FT_SERVICE_SFNT_H. - - * src/cff/cffcmap.c: Include `cfferrs.h'. - * src/pfr/pfrdrivr.c: Include `pfrerror.h'. - * src/sfnt/sfdriver.c: Include `sferrors.h'. - * src/psaux/psobjs.h: Add declaration for `ps_parser_to_bytes'. - -2003-09-11 David Turner - - Introducing the concept of `module services'. This is the first - step towards a massive simplification of the engine's internals, in - order to get rid of various numbers of hacks. - - Note that these changes will break source & binary compatibility for - authors of external font drivers. - - * include/freetype/config/ftconfig.h (FT_BEGIN_STMNT, FT_END_STMNT, - FT_DUMMY_STMNT): New macros. - - * include/freetype/internal/ftserv.h: New file, containing the new - structures and macros to provide `services'. - - * include/freetype/internal/internal.h (FT_INTERNAL_EXTENSION_H, - FT_INTERNAL_EXTEND_H, FT_INTERNAL_HASH_H, FT_INTERNAL_OBJECT_H): - Removed, obsolete. - (FT_INTERNAL_SERVICE_H): New macro for `ftserv.h'. - - * include/freetype/internal/services/bdf.h, - include/freetype/internal/services/glyfdict.h, - include/freetype/internal/services/postname.h, - include/freetype/internal/services/xf86name.h: New files. - - * include/freetype/ftmm.h (FT_Get_MM_Func, FT_Set_MM_Design_Func, - FT_Set_MM_Blend_Func): Function pointers moved (in modified form) - to... - * include/freetype/internal/services/multmast.h: New file. - - * include/freetype/internal/sfnt.h (SFNT_Interface): `get_interface' - is now of type `FT_Module_Requester'. - (SFNT_Get_Interface_Func, SFNT_Load_Table_Func): Function pointers - moved (in modified form) to... - * include/freetype/internal/services/sfnt.h: New file. - - * include/freetype/tttables.h (FT_Get_Sfnt_Table_Func): Function - pointer moved (in modified form) to `services/sfnt.h'. - - * include/freetype/ftmodule.h (FT_Module_Interface): Make it a - a typedef to `FT_Pointer'. - - * include/freetype/internal/tttypes.h (TT_FaceRec): Add - `postscript_name'. - * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove - `postscript_name'. - Add `services' element. - (FT_LibraryRec): Remove `meta_class'. - - * src/base/ftbdf.c: Include FT_SERVICE_BDF_H. - (test_font_type): Removed. - (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): Use services - provided in `FT_SERVICE_ID_BDF'. - - * src/base/ftmm.c: Include FT_SERVICE_MULTIPLE_MASTERS_H. - (ft_face_get_mm_service): New auxiliary function to get services - from `FT_SERVICE_ID_MULTI_MASTERS'. - (FT_Get_Multi_Master, FT_Set_MM_Design_Coordinates, - FT_Set_MM_Blend_Coordinates): Use `ft_face_get_mm_service'. - - * src/base/ftobjs.c: Include FT_SERVICE_POSTSCRIPT_NAME_H and - FT_SERVICE_GLYPH_DICT_H. - (ft_service_list_lookup): New function to get a specific service. - (destroy_face): Updated. - (Mac_Read_POST_Resource): Simplify some code. - (IsMacResource): Fix warnings. - (FT_Get_Name_Index, FT_Get_Glyph_Name): Use services provided in - `FT_SERVICE_ID_GLYPH_DICT'. - (FT_Get_Postscript_Name): Use service provided in - `FT_SERVICE_ID_POSTSCRIPT_NAME'. - (FT_Get_Sfnt_Table, FT_Load_Sfnt_Table): Use services provided in - `FT_SERVICE_ID_SFNT_TABLE'. - - * src/base/ftxf86.c: Include FT_SERVICE_XFREE86_NAME_H. - (FT_Get_X11_Font_Format): Use service provided in - `FT_SERVICE_ID_XF86_NAME'. - - * src/bdf/bdfdrivr.c: Include FT_SERVICE_BDF_H and - FT_SERVICE_XFREE86_NAME_H. - (bdf_get_charset_id): New function. - (bdf_service_bdf): New structure providing BDF services. - (bdf_services): New services list. - (bdf_driver_requester): Use `ft_service_list_lookup'. - - * src/cff/cffdrivr.c: Include FT_SERVICE_XFREE86_NAME_H and - FT_SERVICE_GLYPH_DICT_H. - (cff_service_glyph_dict): New structure providing CFF services. - (cff_services): New services list. - (cff_get_interface): Use `ft_service_list_lookup'. - - * src/cid/cidriver.c: Include FT_SERVICE_POSTSCRIPT_NAME_H and - FT_SERVICE_XFREE86_NAME_H. - (cid_service_ps_name): New structure providing CID services. - (cid_services): New services list. - (cid_get_interface): Use `ft_service_list_lookup'. - - * src/pcf/pcfdrivr.c: Include FT_SERVICE_BDF_H and - FT_SERVICE_XFREE86_NAME_H. - (pcf_service_bdf): New structure providing PCF services. - (pcf_services): New services list. - (pcf_driver_requester): Use `ft_service_list_lookup'. - - * src/sfnt/sfdriver.c: Include FT_SERVICE_GLYPH_DICT_H and - FT_SERVICE_POSTSCRIPT_NAME_H. - (get_sfnt_glyph_name): Renamed to... - (sfnt_get_glyph_name): This. - (get_sfnt_postscript_name): Renamed to... - (sfnt_get_ps_name): This. - Updated. - (sfnt_service_glyph_dict, sfnt_service_ps_name): New structures - providing services. - (sfnt_services): New services list. - (sfnt_get_interface): Use `ft_service_list_lookup'. - - * src/truetype/ttdriver.c: Include FT_SERVICE_XFREE86_NAME_H. - (tt_services): New services list. - (tt_get_interface): Use `ft_service_list_lookup'. - - * src/type1/t1driver.c: Include FT_SERVICE_MULTIPLE_MASTERS_H, - FT_SERVICE_GLYPH_DICT_H, FT_SERVICE_XFREE86_NAME_H, and - FT_SERVICE_POSTSCRIPT_NAME_H. - (t1_service_glyph_dict, t1_service_ps_name, - t1_service_multi_masters): New structures providing Type 1 services. - (t1_services): New services list. - (Get_Interface): Use `ft_service_list_lookup'. - - * src/type42/t42drivr.c: Include FT_SERVICE_XFREE86_NAME_H, - FT_SERVICE_GLYPH_DICT_H, and FT_SERVICE_POSTSCRIPT_NAME_H. - (t42_service_glyph_dict, t42_service_ps_name): New strucures - providing Type 42 services. - (t42_services): New services list. - (T42_Get_Interface): Use `ft_service_list_lookup'. - - - * README, docs/CHANGES: Updating version numbers for 2.1.6, and - removing obsolete warnings in the documentation. - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6. - * builds/unix/configure.ac (version_info): Set to 9:5:3. - * builds/unix/configure: Regenerated. - - * include/freetype/internal/ftcore.h, - include/freetype/internal/ftexcept.h, - include/freetype/internal/fthash.h, - include/freetype/internal/ftobject.h: Removed. Obsolete. - -2003-09-09 David Turner - - Fixing PFR kerning support. The tables within the font file contain - (charcode,charcode) kerning pairs, we need to convert them to - (gindex,gindex). - - * src/base/ftpfr.c (ft_pfr_check): Fix serious typo. - * src/pfr/prfload.c: Remove dead code. - (pfr_get_gindex, pfr_compare_kern_pairs, pfr_sort_kerning_pairs): - New functions. - (pfr_phy_font_done): Free `kern_pairs'. - (pfr_phy_font_load): Call `pfr_sort_kerning_pairs'. - * src/pfr/pfrobjs.c (pfr_face_get_kerning): Fix kerning extraction. - * src/pfr/pfrtypes.h (PFR_KERN_PAIR_INDEX): New macro. - (PFR_KernPairRec): Make `kerning' an FT_Int. - (PFR_PhyFontRec): New element `kern_pairs'. - (PFR_KernFlags): Values of PFR_KERN_2BYTE_CHAR and - PFR_KERN_2BYTE_ADJ were erroneously reversed. - - * include/freetype/ftoption.h: Commenting out the macro - TT_CONFIG_OPTION_BYTECODE_INTERPRETER. - -2003-09-02 David Turner - - - * Version 2.1.5 released. - ========================= - - -2003-08-31 Manish Singh - - * src/bdf/bdflib.c (_bdf_readstream): Don't use FT_MEM_COPY but - FT_MEM_MOVE. - -2003-08-30 Werner Lemberg - - * include/freetype/freetype.h (FT_ENCODING_SJIS, FT_ENCODING_GB2312, - FT_ENCODING_BIG5, FT_ENCODING_WANSUNG, FT_ENCODING_JOHAB): New - enumerations of FT_Encoding. The FT_ENCODING_MS_* variants except - FT_ENCODING_MS_SYMBOL are now deprecated. - Updated all users. - * docs/CHANGES: Document it. - -2003-08-27 Werner Lemberg - - * src/bdf/bdfdrivr.c (BDF_Face_Init): Accept lowercase characters - for spacing. - -2003-08-27 Mike FABIAN - - * src/pcf/pcfread.c (pcf_load_font), src/bdf/bdfdrivr.c - (BDF_Face_Init): Accept lowercase characters for slant and weight. - -2003-08-18 David Turner - - * include/freetype/config/ftoption.h: Disabling TrueType bytecode - interpreter until the UNPATENTED_HINTING works as advertised. - - * src/autohint/ahhint.c (ah_hinter_load_glyph): Use `|' for - setting `load_flags'. - - * Jamfile: Adding the `refdoc' target to the Jamfile in order to - build the API Reference in `docs/reference' automatically. - - * include/freetype/t1tables.h (PS_FontInfoRec), src/cid/cidtoken.h, - src/type1/t1tokens.h, src/type42/t42parse.c: Resetting the types of - `italic_angle', `underline_position', and `underline_thickness' to - their previous values (i.e., long, short, and ushort) in order to - avoid breaking binary compatibility. - - * include/freetype/ttunpat.h: Fixing documentation comment. - - * include/freetype/config/ftoption.h, devel/ftoption.h - (TT_CONFIG_OPTION_OPTION_COMPILE_UNPATENTED_HINTING): Replaced - with... - (TT_CONFIG_OPTION_UNPATENTED_HINTING): This. Updated all users. - (TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING): Removed. - - * include/freetype/internal/ftobjs.h (FT_DEBUG_HOOK_TYPE1): Removed. - (FT_DEBUG_HOOK_UNPATENTED_HINTING): New macro. Use this with - `FT_Set_Debug_Hook' to get the same effect as the removed - TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING. - - * src/truetype/ttobjs.c (tt_face_init): Use - `FT_DEBUG_HOOK_UNPATENTED_HINTING'. - -2003-08-06 Werner Lemberg - - * src/type1/t1gload.c (T1_Load_Glyph), src/cff/cffgload.c - (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph): Fix - previous change. - -2003-08-05 Werner Lemberg - - * src/type1/t1gload.c (T1_Load_Glyph), src/cff/cffgload.c - (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph): Apply - font matrix to advance width also. - * docs/CHANGES: Updated. - -2003-07-26 Werner Lemberg - - * builds/unix/configure.ac (version_info): Set to 9:4:3. - * builds/unix/configure: Updated. - * docs/CHANGES, docs/VERSION.DLL: Updated. - - * include/freetype/freetype.h (FT_GlyphSlot): Change 2003-06-16 - also breaks binary compatibility. Reintroduce an unsigned integer - at the old position of `flags' called `reserved'. - -2003-07-25 Werner Lemberg - - Make API reference valid HTML 4.01 transitional. - - * src/tools/docmaker/tohtml.py (html_header_1): Add doctype - and charset. - (html_header_2): Fix style elements and add some more. - Fix syntax. - (block_header, block_footer, description_header, description_footer, - marker_header, marker_footer, source_header, source_footer, - chapter_header): Don't use
...
but `align=center' - table attribute. - (chapter_inter, chapter_footer): Add
  • and use special
      - class. - Use double quotes around table widths given in percent. - (keyword_prefix, keyword_suffix): Don't change font colour directly - but use a new class. - (section_synopsis_header, section_synopsis_footer): Don't change - colour. - (code_header, code_footer): Don't change font colour directly but - use a special
       class.
      -	(print_html_field): 
  • gets the `valign' attribute, not
    . - (print_html_field_list): Ditto. - (index_exit): Don't use
    ...
    but `align=center' - table attribute. - (section_enter): Ditto. - (toc_exit): Don't emit
    . - (block_enter): Use

    , not

    . - (__init__): Fix tag order in self.html_footer. - -2003-07-25 David Turner - - This change reimplements fix from 2003-05-30 without breaking - binary compatibility. - - * include/freetype/t1tables.h (PS_FontInfoRec): `italic_angle', - `is_fixed_pitch', `underline_position', `underline_thickness' are - reverted to be normal values. - - * include/freetype/internal/psaux.h (T1_FieldType): Remove - `T1_FIELD_TYPE_BOOL_P', `T1_FIELD_TYPE_INTEGER_P', - `T1_FIELD_TYPE_FIXED_P', `T1_FIELD_TYPE_FIXED_1000_P'. - (T1_FIELD_TYPE_BOOL_P, T1_FIELD_NUM_P, T1_FIELD_FIXED_P, - T1_FIELD_FIXED_1000_P): Removed. - (T1_FIELD_TYPE_BOOL): Renamed to... - (T1_FIELD_BOOL): New macro. Updated all callers. - - * src/type42/t42parse.c: `italic_angle', `is_fixed_pitch', - `underline_position', `underline_thickness', `paint_type', - `stroke_width' are reverted to be normal values. - (T42_KEYWORD_COUNT): New macro. - (t42_parse_dict): New array `keyword_flags' to mark that a value has - already been assigned to a dictionary entry. - * src/type42/t42objs.c (T42_Face_Init, T42_Face_Done): Updated. - - * src/cid/cidtoken.h: `italic_angle', `is_fixed_pitch', - `underline_position', `underline_thickness' are reverted to be - normal values. - * src/cid/cidobjs.c (cid_face_done, cid_face_init): Updated. - - * src/psaux/psobjs.c (ps_parser_load_field): Updated. - - * src/type1/t1tokens.h: `italic_angle', `is_fixed_pitch', - `underline_position', `underline_thickness', `paint_type', - `stroke_width' are reverted to be normal values. - * src/type1/t1objs.c (T1_Face_Done, T1_Face_Init): Updated. - * src/type1/t1load.c (T1_FIELD_COUNT): New macro. - (parse_dict): Add parameter for keyword flags. - Record only first instance of a field. - (T1_Open_Face): New array `keyword_flags'. - -2003-07-24 Werner Lemberg - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5. - * builds/unix/configure.ac (version_info): Set to 10:0:3. - * builds/unix/configure: Updated. - * builds/freetype.mk (refdoc): Fix --title. - - * docs/CHANGES, docs/VERSION.DLL, README: Updated. - - * src/tools/docmaker/sources.py (re_crossref): Fix regular - expression to handle trailing punctuation characters. - * src/tools/docmaker/tohtml.py (make_html_word): Updated. - - * docs/release: New file. - -2003-07-23 YAMANO-UCHI Hidetoshi - - * include/freetype/internal/psaux.h (PS_Parser_FuncsRec): New - member function `to_bytes'. - - * src/psaux/psauxmod.c (ps_parser_funcs): New member - `ps_parser_to_bytes'. - (psaux_module_class): Increase version to 0x20000L. - - * src/psaux/psobjs.c (IS_T1_LINESPACE): Add \f. - (IS_T1_NULLSPACE): New macro. - (IS_T1_SPACE): Add it. - (skip_spaces, skip_alpha): New functions. - (ps_parser_skip_spaces, ps_parser_skip_alpha): Use them. - (ps_tobytes, ps_parser_to_bytes): New functions. - -2003-07-07 Werner Lemberg - - * builds/freetype.mk (DOC_DIR): New variable. - (refdoc): Use *_DIR variables. - (distclean): Remove documentation files. - - * builds/detect.mk (std_setup, dos_setup): Mention `make refdoc'. - - * configure: Set DOC_DIR variable. - -2003-07-07 Patrik Hägglund - - * builds/freetype.mk (refdoc): New target to build the - documentation. - (.PHONY): Updated. - - * include/freetype/freetype.h: Improve documentation of FT_CharMap. - * include/freetype/ftimage,h: Fix documentation of FT_OUTLINE_FLAGS. - * include/freetype/tttables.h: Document FT_Sfnt_Tag. - -2003-07-06 Werner Lemberg - - * src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfread.c - (pcf_load_font): Fix computation of height if PIXEL_SIZE property is - missing. - -2003-07-01 Werner Lemberg - - * src/cache/ftcsbits.c (ftc_sbit_node_compare): Only add `size' if - there is no error. Reported by Knut St. Osmundsen - . - -2003-06-30 Werner Lemberg - - A new try to synchronize bitmap font access. - - * include/freetype/freetype.h (FT_Bitmap_Size): `height' is now - defined to return the baseline-to-baseline distance. This was - already the value returned by the BDF and PCF drivers. - - The `width' field now gives the average width. I wasn't able to - find something better. It should be taken as informative only. - - New fields `size', `x_ppem', and `y_ppem'. - - * src/pcf/pcfread.c (pcf_load_font): Updated to properly fill - FT_Bitmap_Size. - Do proper rounding and conversion from 72.27 to 72 points. - - * src/bdf/bdfdrivr.c (BDF_Face_Init): Updated to properly fill - FT_Bitmap_Size. - Do proper rounding and conversion from 72.27 to 72 points. - - * src/sfnt/sfobjs.c (sfnt_load_face): Updated to properly fill - FT_Bitmap_Size. - - * src/winfonts/winfnt.c (FNT_Face_Init): Updated to properly fill - FT_Bitmap_Size. - -2003-06-29 Werner Lemberg - - Redesigning the FNT driver to return multiple faces, not multiple - strikes. At least one font (app850.fon from WinME) contains - different FNT charmaps for its subfonts. Consequently, the previous - design of having multiple bitmap strikes in a single font face fails - since we have only one charmap per face. - - * include/freetype/internal/fnttypes.h (FNT_Size_Rec): Removed. - (FNT_FaceRec): Remove `num_fonts' field and replace `fonts' with - `font'. - - * src/base/ftwinfnt.c (FT_Get_WinFNT_Header): Updated. - - * src/winfonts/winfnt.c (fnt_font_load): Don't set pixel_width equal - to pixel_height. - (fnt_face_done_fonts): Removed. - (fnt_face_get_dll_fonts): Renamed to... - (fnt_face_get_dll_font): This. Add second function argument to - select face index. - Updated to load just one subfont. - (fnt_font_done, FNT_Face_Done): Updated. - (FNT_Face_Init): Handle `face_index'. - Updated. - (FNT_Size_Set_Pixels): Simplified; similar to BDF and PCF, the - bitmap width is now ignored. - (FNT_Load_Glyph): Updated. - Fix glyph index computation. - (winfnt_driver_class): Updated. - -2003-06-25 Owen Taylor - - * src/sfnt/ttload.c (tt_face_load_hdmx): Don't assign - num_records until we actually decide to load the table, - otherwise, we'll segfault in tt_face_free_hdmx. - -2003-06-24 Werner Lemberg - - * src/cff/cffdrivr.c (cff_get_glyph_name): Protect against zero - glyph name pointer. Reported by Mikey Anbary . - -2003-06-23 Werner Lemberg - - * src/tools/glnames.py: Updated to AGL 2.0. - * src/psnames/pstables.h: Regenerated. - -2003-06-22 Werner Lemberg - - * include/freetype/cache/ftcglyph.h, include/freetype/ttnameid.h, - src/base/ftcalc.c, src/base/fttrigon.c, src/cff/cffgload.c, - src/otlayout/otlgsub.c, src/pshinter/pshrec.c, - src/psnames/psmodule.c, src/sfnt/sfobjs.c, src/truetype/ttdriver.c: - Decorate constants with `U' and `L' if appropriate. - - * include/freetype/ftmoderr.h: Updated to include recent module - additions. - - * src/pshinter/pshnterr.h (FT_ERR_BASE): Define as - `FT_Mod_Err_PShinter'. - * src/type42/t42error.h (FT_ERR_BASE): Define as - `FT_Mod_Err_Type42'. - - * src/pshinter/pshrec.h (PS_HINTS_MAGIC): Removed. Not used. - - * include/freetype/config/ftconfig.h [__MWERKS__]: Define FT_LONG64 - and FT_INT64. - -2003-06-21 Werner Lemberg - - * src/winfonts/winfnt.c (FNT_Load_Glyph): Use first_char in - computation of glyph_index. - (FNT_Size_Set_Pixels): To find a strike, first check pixel_height - only, then try to find a better hit by comparing pixel_width also. - Without this fix it isn't possible to access all strikes. - Also compute metrics.max_advance to be in sync with other bitmap - drivers. - - * src/base/ftobjs.c (FT_Set_Char_Size): Remove redundant code. - (FT_Set_Pixel_Size): Assign value to `metrics' after validation of - arguments. - -2003-06-20 Werner Lemberg - - Synchronize computation of height and width for bitmap strikes. The - `width' field in the FT_Bitmap_Size structure is now only useful to - enumerate different strikes. The `max_advance' field of the - FT_Size_Metrics structure should be used to get the (maximum) width - of a strike. - - * src/bdf/bdfdrivr.c (BDF_Face_Init): Don't use AVERAGE_WIDTH for - computing `available_sizes->width' but make it always equal to - `available_sizes->height'. - - * src/pcf/pcfread.c (pcf_load_font): Don't use RESOLUTION_X for - computing `available_sizes->width' but make it always equal to - `available_sizes->height'. - - * src/truetype/ttdriver.c (Set_Pixel_Sizes): Pass only single - argument to function. - - * src/psnames/psmodule.c (ps_unicode_value): Handle `.' after - `uniXXXX' and `uXXXX[X[X]]'. - -2003-06-19 Werner Lemberg - - * src/bdf/bdfdrivr.c: s/FT_Err_/BDF_Err/. - * src/cache/ftccache.c, src/cache/ftcsbits.c, src/cache/ftlru.c: - s/FT_Err_/FTC_Err_/. - * src/cff/cffcmap.c: s/FT_Err_/CFF_Err_/. - * src/pcf/pcfdrivr.c: s/FT_Err_/PCF_Err_/. - * src/psaux/t1cmap.c: Include psauxerr.h. - s/FT_Err_/PSaux_Err_/. - * src/pshinter/pshnterr.h: New file. - * src/pshinter/rules.mk: Updated. - * src/pshinter/pshalgo.c, src/pshinter/pshrec.c: Include pshnterr.h. - s/FT_Err_/PSH_Err_/. - * src/pfr/pfrdrivr.c, src/pfr/pfrobjs.c, src/pfr/pfrsbit.c: - s/FT_Err_/PFR_Err_/. - * src/sfnt/sfdriver.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c, - src/sfnt/ttload.c: s/FT_Err_/SFNT_Err_/. - * src/truetype/ttgload.c: s/FT_Err_/TT_Err_/. - * src/gzip/ftgzip.c: Load FT_MODULE_ERRORS_H and define - FT_ERR_PREFIX and FT_ERR_BASE. - s/FT_Err_/Gzip_Err_/. - -2003-06-19 Dirck Blaskey - - * src/cff/cffload (cff_encoding_load): `nleft' must be FT_UInt, - otherwise adding 1 might wrap the result. - -2003-06-18 Werner Lemberg - - * src/psnames/psmodule.c (ps_unicode_value): Add support to - recognize `uXXXX[X[X]]' glyph names. - Don't handle glyph names starting with `uni' which have more than - four digits. - -2003-06-16 Werner Lemberg - - * include/freetype/freetype.h (FT_Open_Flags): Replaced with - #defines for the constants. - (FT_Open_Args): Change type of `flags' to FT_UInt. - (FT_GlyphSlot): Move `flags' to FT_Slot_Internal. - - * include/freetype/ftimage.h (FT_Outline_Flags, FT_Raster_Flag): - Replaced with #defines for the constants. - - * include/freetype/internal/ftobjs.h (FT_Slot_Internal): New - field `flags' (from FT_GlyphSlot). - Updated all affected source files. - (FT_GLYPH_OWN_BITMAP): New macro (from ftgloadr.h). - - * include/freetype/internal/ftgloadr.h (FT_GLYPH_OWN_BITMAP): Moved - to ftobjs.h. - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Use dummy - FT_GlyphSlot_Internal object. - -2003-06-15 Werner Lemberg - - * builds/compiler/gcc.mk, builds/compiler/gcc-dev.mk (CFLAGS): - Add -fno-strict-aliasing to get rid of zillion warnings from gcc - version 3.3. - -2003-06-14 Werner Lemberg - - * include/freetype/ftglyph.h (ft_glyph_bbox_unscaled, - ft_glyph_bbox_subpixels, ft_glyph_bbox_gridfit, - ft_glyph_bbox_truncate, ft_glyph_bbox_pixels): Replaced with - FT_GLYPH_BBOX_UNSCALED, FT_GLYPH_BBOX_SUBPIXELS, - FT_GLYPH_BBIX_GRIDFIT, FT_GLYPH_BBOX_TRUNCATE, FT_GLYPH_BBOX_PIXELS. - The lowercase variants are now (deprecated aliases) to the uppercase - versions. - Updated all other files. - - * include/freetype/ftmodule.h (ft_module_font_driver, - ft_module_renderer, ft_module_hinter, ft_module_styler, - ft_module_driver_scalable, ft_module_driver_no_outlines, - ft_module_driver_has_hinter): Replaced with FT_MODULE_FONT_DRIVER, - FT_MODULE_RENDERER, FT_MODULE_HINTER, FT_MODULE_STYLER, - FT_MODULE_DRIVER_SCALABLE, FT_MODULE_DRIVER_NO_OUTLINES, - FT_MODULE_DRIVER_HAS_HINTER. - The lowercase variants are now (deprecated aliases) to the uppercase - versions. - Updated all other files. - - * src/base/ftglyph.c (FT_Glyph_Get_CBox): Handle bbox_mode better - as enumeration. - - * src/pcf/pcfdrivr.c (pcf_driver_class), src/winfonts/winfnt.c - (winfnt_driver_class), src/bdf/bdfdrivr.c (bdf_driver_class): Add - the FT_MODULE_DRIVER_NO_OUTLINES flag. - -2003-06-13 Detlef Würkner - - * src/pfr/pfrobjs.c (pfr_slot_load): Apply font matrix. - -2003-06-13 Werner Lemberg - - * builds/dos/detect.mk: Test not only for `Dos' but for `DOS' also. - - * builds/dos/dos-emx.mk, builds/compiler/emx.mk: New files for - EMX gcc compiler. - * builds/dos/detect.mk: Add target `emx'. - - * builds/compiler/watcom.mk (LINK_LIBRARY): GNU Make for DOS doesn't - like a trailing semicolon; add a dummy command. - - * src/cid/cidload.c: Remove parse_font_bbox code (already enclosed - with #if 0 ... #endif). - - * src/type1/t1tokens.h: Handle /FontName. - * src/type1/t1load.c (parse_font_name): Removed. - Remove parse_font_bbox code (already enclosed with #if 0 ... - #endif). - - * src/type42/t42parse.c (t42_parse_font_name): Removed. - Remove t42_parse_font_bbox code (already enclosed with #if 0 ... - #endif). - (t42_keywords): Handle /FontName with T1_FIELD_KEY. - -2003-06-12 Werner Lemberg - - * include/freetype/internal/psaux.h (T1_FieldType): Add - T1_FIELD_TYPE_KEY. - (T1_FIELD_KEY): New macro. - * src/psaux/psobjs.c (ps_parser_load_field): Handle - T1_FIELD_TYPE_KEY. - - * src/cid/cidtoken.h: Use T1_FIELD_KEY for /CIDFontName. - -2003-06-11 Alexander Malmberg - - * src/cache/ftlru.c (FT_LruList_Remove_Selection): Decrease - number of nodes. - (FT_LruList_Lookup): Fix assertion for out-of-memory case. - -2003-06-11 Werner Lemberg - - * src/cid/cidload.c (cid_decrypt): Removed. - (cid_read_subrs): Use t1_decrypt from psaux module. - * src/cid/cidload.h: Updated. - * src/cid/cidgload.c (cid_load_glyph): Use t1_decrypt from psaux - module. - -2003-06-10 Werner Lemberg - - * src/cid/cidobjs.c: Apply change 2003-05-31 from . - Compute style flags. - Fix computation of root->height. - * src/cid/cidtoken.h: Handle FontBBox. - * src/cid/cidload.c (cid_load_keyword): Handle - T1_FIELD_LOCATION_BBOX. - (parse_font_bbox): Commented out. - (cid_field_record): Comment out element for parsing FontBBox. - - * src/type42/t42parse.c (t42_parse_font_bbox): Commented out. - (t42_keywords): Handle FontBBox with T1_FIELD_BBOX, not with - T1_FIELD_CALLBACK. - (t42_parse_font_bbox): Commented out. - (t42_load_keyword): Handle T1_FIELD_LOCATION_BBOX. - * src/type42/t42objs.c (T42_Face_Init): Apply change 2003-05-31 - from . - -2003-06-09 George Williams - - * src/truetype/ttinterp.c (SetSuperRound) <0x30>: Follow Apple's - TrueType specification. - (Ins_MDRP, Ins_MIRP): Fix single width cut-in test. - -2003-06-09 Detlef Würkner - - * src/gzip/ftgzip.c: (inflate_mask): Replaced with... - (NO_INFLATE_MASK): This. - * src/gzip/infutil.h: Declare `inflate_mask' conditionally by - NO_INFLATE_MASK. - -2003-06-09 Alexis S. L. Carvalho - - * src/gzip/ftgzip.c (ft_gzip_file_fill_output): Handle Z_STREAM_END - correctly. - -2003-06-09 Wolfgang Domröse - - * src/pshinter/pshglob.c (psh_globals_new): Change calculation of - dim->stdw.count to avoid compiler problem. - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Move the block - variables to the beginning of the function to avoid compiler - problems. - Add casts necessary for 16bit compilers. - -2003-06-09 Werner Lemberg - - * src/pfr/rules.mk (PFR_DRV_SRC): Add pfrsbit.c. - (PFR_DRV_H): Add pfrtypes.h. - - * include/freetype/config/ftconfig.h: s/__MWKS__/__MWERKS__/. - -2003-06-08 Karl Schultz - - * src/pfr/pfrsbit.c (pfr_bitwriter_init): Change type of third - argument to FT_Bool. - (pfr_lookup_bitmap_data): Change type of third and fourth argument - to FT_UInt. Updated caller. - (pfr_load_bitmap_bits): Change type of fourth argument to FT_Bool. - -2003-06-08 Werner Lemberg - - Completely revised FreeType's make management. - - . In all makefiles `/' is used as the path separator. The - conversion to the real path separators is done as late as - possible using $(subst ...). - - . $(HOSTSEP) no longer exists. Now, $(SEP) gives the path separator - for the operating system, and the new $(COMPILER_SEP) the path - separator for the compiler tools. - - . $(BUILD) has been renamed to $(BUILD_DIR). In general, all - directory variables end with `_DIR'. The variants ending in `_' - (like `BASE_' have been removed). - - The following ChangeLog entries only describe changes which are - not related to the redesign. - - * builds/beos/beos-def.mk (BUILD_DIR): Fix typo. - * builds/compiler/watcom.mk (LINK_LIBRARY): Fix linker call to avoid - overlong arguments as suggested by J. Ali Harlow - . - * builds/dos/dos-wat.mk: New file. - * builds/freetype.mk (FREETYPE_H): Include header files from the - `devel' subdirectory. - - * builds/os2/os2-dev.mk, builds/unix/unixddef.mk, - builds/unix/unixddef.mk, builds/win32/w32-bccd.mk, - builds/win32/w32-dev.mk (BUILD_DIR): Fix path. - - * builds/unix/configure.ac, builds/unix/configure: Updated. - * builds/unix/unix-def.in (DISTCLEAN): Add `freetype2.pc'. - -2003-06-07 Werner Lemberg - - * src/base/ftmac.c (FT_New_Face_From_SFNT): s/rlen/sfnt_size/ to - make it compile. - - * devel/ftoption.h: Updated. - -2003-06-07 Detlef Würkner - - * include/freetype/internal/psaux.h, src/truetype/ttgload.h: - s/index/idx/ to fix compiler warnings. - - * src/sfnt/ttcmap0.c (tt_face_build_cmaps): Use more `volatile' to - fix compiler warning. - - * src/gzip/ftgzip.c (BUILDFIXED): Removed. - * src/gzip/inftrees.c (inflate_trees_fixed) [!BUILDFIXED]: Use - FT_UNUSED to remove compiler warning. - -2003-06-06 Werner Lemberg - - * include/freetype/ftstroker.h: Renamed to... - * include/freetype/ftstroke.h: This. - - * src/base/ftstroker.c: Renamed to... - * src/base/ftstroke.c: This. - - * include/freetype/config/ftheader.h (FT_STROKER_H): Updated. - - * src/base/descrip.mms, src/base/Jamfile, src/base/rules.mk: - Updated. - - * src/pcf/pcfdriver.c: Renamed to... - * src/pcf/pcfdrivr.c: This. - * src/pcf/pcfdriver.h: Renamed to... - * src/pcf/pcfdrivr.h: This. - - * src/pcf/Jamfile, src/pcf/rules.mk: Updated. - -2003-06-05 Wenlin Institute (Tom Bishop) - - * src/base/ftmac.c (file_spec_from_path) [TARGET_API_MAC_CARBON]: - Add `#if !defined(__MWERKS__)'. - -2003-06-05 Werner Lemberg - - * include/freetype/internal/psaux.h (T1_FieldType): Add - T1_FIELD_TYPE_FIXED_1000 and T1_FIELD_TYPE_FIXED_1000_P. - (T1_FIELD_FIXED_1000, T1_FIELD_FIXED_1000_P): New macros. - * src/psaux/psobjs.c (ps_parser_load_field): Handle - T1_FIELD_TYPE_FIXED_1000 and T1_FIELD_TYPE_FIXED_1000_P. - - * src/cff/cffparse.c (cff_kind_fixed_thousand): New enumeration. - (CFF_FIELD_FIXED_1000): New macro. - (cff_parser_run): Handle cff_kind_fixed_thousand. - * src/cff/cfftoken.h: Use CFF_FIELD_FIXED_1000 for blue_scale. - * src/cff/cffload (cff_subfont_load): Fix default values of - expansion_factor and blue_scale. - - * src/cif/cidtoken.h, src/type1/t1tokens.h: Use T1_FIELD_FIXED_1000 - for blue_scale. - - * src/pshinter/pshglob.c (psh_globals_new): Fix default value of - blue_scale. - -2003-06-04 Wolfgang Domröse - - * include/freetype/internal/ftdriver.h, - include/freetype/internal/ftobjs.h, - include/freetype/internal/psaux.h, src/cid/cidgload.c, - src/psaux/psobjs.c, src/psaux/t1decode.c, src/psaux/psobjs.h, - src/pshinter/pshrec.c, src/pshinter/pshalgo.c, - src/psnames/psmodule.c, src/raster/ftraster.c, src/sfnt/sfobjs.c, - src/smooth/ftgrays.c, src/smooth/ftsmooth.c, src/truetype/ttobjs.c, - src/truetype/ttdriver.c, src/truetype/ttgload.c, src/type1/t1afm.c, - src/type1/t1gload.c, src/type1/t1gload.h, src/type1/t1load.c, - src/type1/t1objs.c, src/type42/t42parse.c, src/type42/t42parse.h: - Many casts and slight argument type changes to make it work with - a 16bit compiler. - -2003-06-04 Werner Lemberg - - * include/freetype/config/ftoption.h: Defining - TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING by default is a bad idea - since some fonts (e.g. Arial) produce worse results than without - hinting. Reverted. - -2003-06-04 Werner Lemberg - - * src/truetype/ttgload.c (load_truetype_glyph) - [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Call - FT_GlyphLoader_CheckPoints before adding phantom points. This fixes - a segfault bug with fonts (e.g. htst3.ttf) which have nested - subglyphs more than one level deep. Reported by Anthony Fok. - - * include/freetype/config/ftoption.h: Define - TT_CONFIG_OPTION_BYTECODE_INTERPRETER, - TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING, and - TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING to make it the new - default. - -2003-06-03 Werner Lemberg - - * src/autohint/ahhint.c (ah_hinter_hint_edges): Removed. Just a - wrapper for ah_hint_edges. - (ah_hint_edges): Renamed to... - (ah_hinter_hint_edges): This. - - * src/base/ftobjs.c (FT_Set_Hint_Flags): Removed. Unused. - - * include/freetype/internal/ftobjs.h (FT_Face_InternalRec), - include/freetype/internal/psaux.h (T1_DecoderRec), - src/cff/cffgload.h (CFF_Builder): Remove `hint_flags' field. - Unused. - - * src/cff/cffgload.c (cff_builder_init): Updated. - (cff_decoder_parse_charstrings) : Call hinter->apply - with decoder->hint_mode instead of builder->hint_flags. - * src/psaux/t1decode.c (t1_decoder_init): Updated. - - * src/base/ftstroker.c (ft_stroke_border_export): s/index/idx/. - - * src/sfnt/sfobjs.c (sfnt_load_face): Commented out code which - increased root->height by 15% if the line gap was zero. There exist - fonts (containing e.g. form drawing characters) which intentionally - have a zero line gap value. - - * src/truetype/ttinterp.c (Free_Project, CUR_Func_freeProj): - Removed. Unused. - Updated all callers. - -2003-06-02 Werner Lemberg - - * src/cff/cffobjs.c (cff_face_init): Use symbolic names for - Adobe specific encoding IDs (there was a wrong EID value for custom - encoding). - - * src/cff/cffcmap.h (CFF_CMapStdRec): Remove `count'. - * src/cff/cffcmap.c (cff_cmap_encoding_init, - cff_cmap_encoding_done): Updated. - (cff_cmap_encoding_char_index, cff_cmap_encoding_char_next): Use - 256 as limit for character code. - -2003-06-01 Werner Lemberg - - * src/winfonts/winfnt.c (FNT_Load_Glyph): Revert change from - 2003-03-20. - -2003-05-31 Werner Lemberg - - * include/freetype/fttrigon.h (FT_Vector_Normalize): Removed. - -2003-05-31 - - * src/type1/t1objs.c (T1_Face_Init): Improve algorithm for guessing - the font style by ignoring spaces and hyphens. - - * builds/unix/freetype2.in: Fix `Version' field. - -2003-05-30 Werner Lemberg - - Avoid overwriting of numeric font dictionary entries for synthetic - fonts. Additionally, some entries were handled as `integer' instead - of `number'. - - * include/freetype/internal/psaux.h (T1_FieldType): Add - T1_FIELD_TYPE_BOOL_P, T1_FIELD_TYPE_INTEGER_P, and - T1_FIELD_TYPE_FIXED_P. - (T1_FIELD_BOOL_P, T1_FIELD_NUM_P, T1_FIELD_FIXED_P): New macros. - * src/psaux/psobjs.c (ps_parser_load_field): Handle new field types. - - * include/freetype/internal/cfftypes.h (CFF_FontRecDict), - src/cff/cfftoken.h: Change type of underline_position and - underline_thickness to FT_Fixed. - * src/cff/cffload.c (cff_subfont_load): Fix default values of - underline_position and underline_thickness. - * src/cff/cffobjs.c (cff_face_init): Set underline_position - and underline_thickness in `root'. - - * include/freetype/internal/t1types.h (T1_Font): Change point_type - and stroke_width to pointers. - * include/freetype/t1tables.h (PS_FontInfo): Change italic_angle, - is_fixed_pitch, underline_position, and underline_thickness to - pointers. - * src/type1/t1tokens.h: Change italic_angle, is_fixed_pitch, - underline_position, and underline_thickness to pointers. Change - the type of the latter two to `fixed'. - Change type of stroke_width to `fixed' and make it a pointer. - Change paint_type to pointer. - * src/type1/t1objs.c (T1_Face_Done): Updated. - (T1_Face_Init): Updated. - Fix assignment of underline_position and underline_thickness. - - * src/cid/cidtoken.h: Change italic_angle, is_fixed_pitch, - underline_position, and underline_thickness to pointers. Change - the type of the latter two to `fixed'. - Change type of stroke_width to `fixed'. - * src/cid/cidobjs.c (cid_face_done): Updated. - (cid_face_init): Updated. - Fix assignment of underline_position and underline_thickness. - - * src/type42/t42parse.c: Change italic_angle, is_fixed_pitch, - underline_position, and underline_thickness to pointers. Change the - type of the latter two to `fixed'. - Change type of stroke_width to `fixed' and make it a pointer. - Change paint_type to pointer. - * src/type42/t42objs.c (T42_Face_Init): Updated. - Fix assignment of underline_position and underline_thickness. - (T42_Face_Done): Updated. - - * src/base/ftobjs.c (open_face_from_buffer): Fix compiler warning. - * src/pshinter/pshglob.c, src/pshinter/pshglob.h - (psh_globals_set_scale): Make it a local function. - - * test/gview.c: Fix renaming ps3->ps typo. - Formatting. - -2003-05-29 Werner Lemberg - - * src/pshinter/pshalgo1.[ch], src/pshinter/pshalgo2.[ch]: Removed. - * src/pshinter/pshalgo.h: Removed. - - * src/pshinter/pshalgo3.[ch]: Renamed to... - * src/pshinter/pshalgo.[ch]: New files. - s/PSH3/PSH/. - s/psh3/psh/. - s/ps3/ps/. - - * src/pshinter/pshrec.c, src/pshinter/pshinter.c: Updated. - * src/pshinter/rules.mk, src/pshinter/Jamfile: Updated. - - * src/pshinter/pshglob.[ch] (psh_dimension_snap_width): Commented - out. - - * tests/gview.c: Remove code for pshalgo1 and pshalgo2. - Updated. - -2003-05-28 Martin Zinser - - * vms_make.com: Reworked support for shareable images on VMS. The - first version was kind of a hack; the current implementation of the - procedure to extract the required symbols is much cleaner. - - Reworked creation of MMS files, avoiding a number of temporary files - which were created in the previous version. - - Further work on creating descrip.mms files on the fly. - - * builds/vms/descrip.mms, src/autohint/descrip.mms, - src/type1/descrip.mms: Removed. - -2003-05-28 Werner Lemberg - - * src/pshinter/pshalgo3.c (psh3_glyph_compute_extrema): Skip - contours with only a single point to avoid segfault. - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Activate code for - handling `origin'. - -2003-05-24 Werner Lemberg - - * src/autohint/ahtypes.h (AH_OPTION_NO_STRONG_INTERPOLATION): - Removed since unused. - -2003-05-21 Werner Lemberg - - * include/freetype/config/ftstdlib.h (ft_strcat): New wrapper macro - for strcat. - - * src/base/ftmac.c (create_lwfn_name): s/isupper/ft_isupper/. - (parse_font): s/memcpy/ft_memcpy/. - (is_dfont) [TARGET_API_MAC_CARBON]: s/memcmp/ft_memcmp/. - * src/base/ftobjs.c (load_mac_face) [FT_MACINTOSH]: - s/strlen/ft_strlen/. - s/strcat/ft_strcat/. - s/strcpy/ft_strcpy/. - * src/gzip/zutil.h: s/memset/ft_memset/. - s/memcmp/ft_memcmp/. - - * src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfdriver.c - (PCF_Face_Init): Test for charset registry case-insensitively. - - * src/gzip/ftgzip.c (ft_gzip_fil_io): Revert change from yesterday; - it has already been fixed differently. - - * src/truetype/ttinterp.c (DO_SFVTL): Add missing braces around - if-clause. - -2003-05-21 Martin Zinser - - * t1load.c (parse_blend_axis_types): Fix compiler warning. - - * descrip.mms: Removed. Now created by... - - * vms_make.com: New file. - -2003-05-21 Weiqi Gao - - * src/gzip/ftgzip.c (ft_gzip_file_io): Avoid zero value of `delta' - to prevent infinite loop. - -2003-05-21 Lars Clausen - - * docs/VERSION.DLL: Provide better autoconf snippet to check - FreeType version. - -2003-05-21 Werner Lemberg - - * src/base/ftobjs.c (open_face): Free `internal' not - `face->internal' in case of error to avoid possible segfault. - - * src/pshinter/pshalgo3.c (ps3_hints_apply): Check whether we - actually have an outline. - -2003-05-20 David Chester - - * src/pshinter/pshalgo3.c (ps3_hints_apply): Try to optimize - y_scale so that the top of non-capital letters is aligned on a pixel - boundary whenever possible. - - * src/autohint/ahhint.c (ah_hint_edges): Make sure that lowercase - m's maintain their symmetry. - -2003-05-20 Werner Lemberg - - * src/autohint/ahhint.c (ah_hinter_load_glyph): Oops! David's - patch from yesterday has been resolved already in a different - way. Reverted. - -2003-05-19 David Chester - - * src/autohint/ahhint.c (ah_hinter_load_glyph): Don't scale - y_scale locally but face->size->metrics.y_scale. - -2003-05-19 David Turner - - * src/sfnt/ttcmap0.c (tt_cmap4_char_next): Select proper start - value for `hi' to avoid infinite loop. - -2003-05-18 Yong Sun - - * src/raster/ftraster.c (Insert_Y_Turn): Fix overflow test. - -2003-05-18 Werner Lemberg - - * include/freetype/config/ftoption.h [FT_CONFIG_OPTION_MAC_FONTS]: - New macro. - * src/base/ftobjs.c: Use it to control mac font support on non-mac - platforms. - -2003-05-17 George Williams - - Implement partial support of Mac fonts on non-Mac platforms. - - * src/base/ftobjs.c (memory_stream_close, new_memory_stream, - open_face_from_buffer, Mac_Read_POST_Resource, - Mac_Read_sfnt_Resource, IsMacResource, IsMacBinary, load_mac_face) - [!FT_MACINTOSH]: New functions. - (FT_Open_Face) [!FT_MACINTOSH]: Use load_mac_face. - -2003-05-17 Werner Lemberg - - * src/base/ftobjs.c (FT_Load_Glyph): Scale linear advance width only - if FT_FACE_FLAG_SCALABLE is set (otherwise we have a division by - zero since FNT and friends don't define `face->units_per_EM'). - -2003-05-15 David Turner - - * src/base/fttrigon.c (FT_Vector_Rotate): Avoid rounding errors - for small values. - -2003-05-15 Werner Lemberg - - * src/autohint/ahtypes.h (AH_PointRec): Remove unused `in_angle' - and `out_angle' fields. - -2003-05-14 George Williams - - * src/base/ftmac.c (FT_New_Face_From_SFNT): Handle CFF files also. - -2003-05-14 Werner Lemberg - - * include/freetype/freetype.h: Fix typo in comment - (FT_HAS_FIXED_SIZES). - -2003-05-10 Dan Williams - - * builds/unix/aclocal.m4: Comment out definition of - `allow_undefined_flag' for Darwin 1.3. - * builds/unix/configure.ac: Add option --with-old-mac-fonts. - * builds/unix/ltmain.sh: Fix version numbering for Darwin 1.3. - * builds/unix/configure: Regenerated. - - * include/freetype/config/ftconfig.h: Fix conditions for defining - `FT_MACINTOSH'. - * src/base/ftbase.c: Include `ftmac.c' conditionally. - * src/base/ftmac.c: Handle __GNUC__. - -2003-05-07 YAMANO-UCHI Hidetoshi - - * src/cid/cidload.c (is_alpha): Removed. - (cid_parse_dict): Use `cid_parser_skip_alpha' instead of `is_alpha'. - -2003-05-07 Werner Lemberg - - * src/autohint/ahoptim.c, src/autohint/ahoptim.h: Obsolete, removed. - -2003-05-07 David Turner - - * src/autohint/ahglyph.c (ah_setup_uv): Exchange `for' loop and - `switch' statement to make it run faster. - (ah_outline_compute_segments): Reset `segment->score' and - `segment->link'. - (ah_outline_link_segments): Provide alternative code which does - the same but runs much faster. - Handle major direction also. - (ah_outline_compute_edges): Scale `edge_distance_threshold' down - after rounding instead of scaling comparison value in loop. - - * src/autohint/ahhint.c (ah_hinter_align_stong_points): Provide - alternative code which runs faster. - Handle `before->scale == 0'. - - * src/autohint/ahtypes.h (AH_SegmentRec): Move some fields down. - (AH_EdgeRec): Move some fields in structure. - New field `scale'. - - * src/sfnt/ttcmap0.c (tt_cmap4_char_next): Use binary search. - -2003-05-02 Werner Lemberg - - * src/autohint/ahoptim.c (LOG): Renamed to... - (AH_OPTIM_LOG): This. - (AH_Dump_Springs): Fix log message format. - - * src/autohint/ahhint.c (ah_hint_edges_3): Renamed to... - (ah_hint_edges): This. - -2002-05-02 Keith Packard - - * src/bdf/bdfdrivr.c (BDF_Set_Pixel_Size): Initialize `max_advance'. - -2003-05-01 Werner Lemberg - - * src/autohint/ahglyph.c (ah_test_extrema): Renamed to... - (ah_test_extremum): This. - -2003-04-28 Werner Lemberg - - * builds/unix/configure.ac: Generate `freetype.pc' from - `freetype.in'. - * builds/unix/configure: Regenerated. - * builds/unix/install.mk (install, uninstall): Handle `freetype.pc'. - -2003-04-28 Gustavo J. A. M. Carneiro - - * builds/unix/freetype2.in: New file. Contains building information - for the `pkg-config' package. - -2003-04-28 David Turner - - * src/base/ftobjs.c (FT_Load_Glyph): Fix boundary check for - `glyph_index'. - -2003-04-25: Graham Asher - - Added the optional unpatented hinting system for TrueType. It - allows typefaces which need hinting to produce correct glyph forms - (e.g., Chinese typefaces from Dynalab) to work acceptably without - infringing Apple patents. This system is compiled only if - TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING is defined in - ftoption.h. - - * include/freetype/ttunpat.h: New file. Defines - FT_PARAM_TAG_UNPATENTED_HINTING. - - * include/freetype/config/ftheader.h (FT_TRUETYPE_UNPATENTED_H): New - macro to use when including ttunpat.h. - - * include/freetype/config/ftoption.h - (TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING, - TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING): New configuration macros - (not defined, but in comments) for the unpatented hinting system. - - * include/freetype/internal/tttypes.h (TT_FaceRec) - [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: New element `FT_Bool - unpatented_hinting'. - - * src/truetype/ttinterp.c (NO_APPLE_PATENT, APPLE_THRESHOLD): - Removed. - (GUESS_VECTOR): New macro. - (TT_Run_Context) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: - Set `both_x_axis'. - (tt_default_graphics_state) - [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Updated. - (Current_Ratio) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: - Handle `unpatented_hinting'. - (Direct_Move) [NO_APPLE_PATENT]: Removed. - [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Insert assertion. - (Project, FreeProject) - [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Insert assertion. - (Compute_Funcs) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: - Implement unpatented hinting. - (DO_SPVTCA, DO_SFVTCA, DO_SPVTL, DO_SFVTL, DO_SPVFS, DO_SFVFS, - Ins_SDPVTL): Call `GUESS_VECTOR'. - (DO_GPV, DO_GFV) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: - Handle `unpatented_hinting'. - (Compute_Point_Displacement) [NO_APPLE_PATENT]: Removed. - [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Implement unpatented - hinting. - (Move_Zp2_Point, Ins_SHPIX, Ins_DELTAP, Ins_DELTAC) - [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Implement unpatented - hinting. - (TT_RunIns): Updated. - - * src/truetype/ttobjs.c - [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Include - FT_TRUETYPE_UNPATENTED_H. - (tt_face_init) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING, - TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING]: Check - FT_PARAM_TAG_UNPATENTED_HINTING. - - * src/truetype/ttobjs.h (TT_GraphicsState) - [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Add `both_x_axis'. - -2003-04-25 Werner Lemberg - - * src/bdf/bdflib.c (hash_bucket, hash_lookup): Use `const' for first - argument. - (bdf_get_font_property): Use `const' for third argument. - Updated all callers. - * src/bdf/bdfdrivr.c (BDF_Face_Init): Set pixel width and height - similar to the PCF driver. - * src/bdf/bdf.h (_hashnode): Use `const' for `key'. - Updated. - - * src/gzip/ftgzip.c: C++ doesn't like that the array `inflate_mask' - is declared twice. It is perhaps better to modify the zlib source - files directly instead of this hack. - (zcalloc, zfree, ft_gzip_stream_close, ft_gzip_stream_io): Add casts - to make build with g++ successful. - -2003-04-24 Manish Singh - - * src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c - (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Split on `-' - also for searching the style name. - -2003-04-24 David Turner - - * src/pcf/pcfread.c (pcf_load_font): Fixed the computation of - face->num_glyphs. We must increase the value by 1 to respect the - convention that glyph index 0 always corresponds to the `missing - glyph'. - -2003-04-24 Werner Lemberg - - * builds/unix/unix-cc.in (CFLAGS): Add @CPPFLAGS@. - -2003-04-24 Dieter Baron - - * builds/unix/freetype-config.in (cflags): Emit FreeType 2's include - files first. Otherwise there are conflicts with FreeType 1 - installed simultaneously. - -2003-04-23 Werner Lemberg - - Fixing bugs reported by Nelson Beebe. - - * src/base/ftstroker.c (FT_Stroker_ParseOutline): Remove unused - variable `in_path'. - - * src/base/ftobjs (ft_glyphslot_set_bitmap): Change type of - second argument to `FT_Byte*'. - * include/freetype/internal/ftobjs.h: Updated. - - * src/bdf/bdflib.c (_bdf_readstream): Remove unused variable `res'. - (_bdf_parse_glyphs): Remove unused variable `next'. - Mark `call_data' as unused. - - * src/cache/ftlru.c (FT_LruList_Lookup): Remove unused variable - `plast'. - - * src/pcf/pcfread.c (pcf_seek_to_table_type): Slight recoding to - actually use `error'. - (pcf_load_font): Remove unused variable `avgw'. - - * src/pfr/pfrobjs.c (pfr_face_get_kerning): Change return type - to `void'. - Mark `error' as unused. - * src/pfr/pfrobjs.h: Updated. - * src/pfr/pfrdrivr.c (pfr_get_kerning): Updated. - - * src/sfnt/ttload.c (sfnt_dir_check): Remove unused variable - `format_tag'. - - * src/sfnt/ttcmap0.c (tt_cmap6_validate, tt_cmap10_validate): Remove - unused variable `start'. - (tt_cmap10_char_next): Remove unused variable `result' - - * src/sfnt/sfobjs.c (tt_face_get_name): Mark `error' as unused. - - * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Mark `error' as - unused. - - * src/type1/t1objs.c (T1_Face_Init): Remove unused variable - `pshinter'. - - * src/type1/t1gload.c (T1_Load_Glyph): Use `glyph_data_loaded' - only for FT_CONFIG_OPTION_INCREMENTAL. - -2003-04-23 Akito Hirai - - * src/sfnt/ttcmap0.c (tt_cmap4_validate): Provide a weak variant - of the glyph ID bounding check if FT_VALIDATE_TIGHT is not active. - Without this change, many CJK fonts from Dynalab are rejected. - -2003-04-23 Joe Marcus Clarke - - * src/base/ftbdf.c (FT_Get_BDF_Property): Check for valid - `get_interface'. - -2003-04-23 Paul Miller - - * src/base/ftmac.c (parse_fond): Fix handling of style names. - -2003-04-23 Werner Lemberg - - * src/pfr/pfrload.c (pfr_extra_item_load_font_id): Use FT_PtrDist - instead of FT_Uint for `len'. - -2003-04-22 Werner Lemberg - - * src/gzip/ftgzip.c (zcalloc) [!FT_CONFIG_OPTION_SYSTEM_ZLIB]: - Convert K&R format to modern C usage. - (FT_Stream_OpenGzip): Use long constant. - -2003-04-21 Werner Lemberg - - * src/cache/ftccache.c (ftc_cache_lookup): Remove shadow declaration - of `manager'. - -2003-04-20 Werner Lemberg - - * doc/INSTALL.UNX: Cleaned up. - -2003-04-09 Torrey Lyons - - * src/base/ftmac.c (open_face_from_buffer): Removed a double-free - bug that had nasty consequences when trying to open an `invalid' - font on a Mac. - -2003-04-09 Mike Fabian - - * src/bdf/bdfdrivr.h (BDF_encoding_el), src/pcf/pcf.h - (PCF_EncodingRec): Changed FT_Short to FT_UShort in order to be able - to access more than 32768 glyphs in fonts. - -2003-04-08 David Turner - - - * Version 2.1.4 released. - ========================= - - -2003-04-03 Martin Muskens - - * src/type1/t1load.c (T1_Open_Face): Fixed the code to make it - handle special cases where a font only contains a `.notdef' glyph - (happens in PDF-embedded fonts). Otherwise, FT_Panic was called. - -2003-03-27 David Turner - - * README: Udpated. - - * README.UNX: Removed (now replaced by docs/INSTALL.UNX). - - * src/pshinter/pshalgo3.c: The hinter now performs as in 2.1.3 and - will ignore stem quantization only when FT_LOAD_TARGET_SMOOTH is - used. - (psh3_dimension_quantize_len): Enabled. - (psh3_hint_align): Enable commented code. - (psh3_hint_align_light): Commented out. - - * src/base/ftobjs.c (FT_Set_Char_Size): Changed the default - computations to include rounding in all cases; this is required to - provide accurate kerning data when native TrueType hinting is - enabled. - - * src/type1/t1load.c (is_name_char): The Type 1 loader now accepts - more general names according to the PostScript specification (the - previous one was too restrictive). - (parse_font_name, parse_encoding, parse_charstrings, parse_dict): - Use `is_name_char'. - (parse_subrs): Handle empty arrays. - -2003-03-20 David Turner - - Serious rewriting of the documentation. - - * docs/BUGS, docs/BUILD: Removed. - * docs/DEBUG.TXT: Renamed to... - * docs/DEBUG: This. - * docs/CUSTOMIZE, docs/TRUETYPE, docs/UPGRADE.UNX: New files. - * docs/INSTALL.ANY, docs/INSTALL.UNX, docs/INSTALL.GNU New files, - containing platform specific information previously in INSTALL. - * docs/readme.vms: Renamed to... - * docs/INSTALL.VMS: This. - - * docs/*: Updated. - - Introduced three new functions to deal with glyph bitmaps within - FT_GlyphSlot objects: - - ft_glyphslot_free_bitmap - ft_glyphslot_alloc_bitmap - ft_glyphslot_set_bitmap - - These functions are much more convenient to use than managing the - FT_GLYPH_OWN_BITMAP flag manually. - - * include/freetype/internal/ftobjs.h (ft_glyphslot_free_bitmap, - ft_glyphslot_alloc_bitmap, ft_glyphslot_set_bitmap): New functions. - * src/base/ftobjs.c: Implement them. - (ft_glyphslot_done): Use ft_glyphslot_free_bitmap. - - * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/pcf/pcfdriver.c - (PCF_Glyph_Load): Remove unused variable `memory'. - Use `ft_glyphslot_*' functions. - Don't set `FT_GLYPH_OWN_BITMAP'. - - * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Use - `ft_glyphslot_alloc_bitmap'. - - * src/sfnt/ttsbit.c (Load_SBit_Image): Change 5th argument to type - `FT_GlyphSlot'. - Adding argument `depth' to handle recursive calls. - Use `ft_glyphslot_alloc_bitmap'. - (tt_face_load_sbit_image): Remove unused variable `memory'. - Don't handle `FT_GLYPH_OWN_BITMAP'. - Update call to Load_SBit_Image. - - * src/type42/t42objs.c (ft_glyphslot_clear): Renamed to... - (t42_glyphslot_clear): This. Updated caller. - Call `ft_glyphslot_free_bitmap'. - - * src/winfonts/winfnt.c (FNT_Load_Glyph): Use - `ft_glyphslot_set_bitmap'. - Don't handle `FT_GLYPH_OWN_BITMAP'. - - * src/cache/ftlru.c (FT_LruList_Lookup): Fixed an invalid assertion - check. - - * src/autohint/ahglyph.c (ah_outline_load): Add two scaling - arguments. - * src/autohint/ahglyph.h: Updated. - * src/autohint/ahhint.c (ah_hinter_load): Updated. - * src/autohint/ahglobal.c (ah_hinter_compute_widths): Updated. - - * src/cache/ftccache.c (ftc_family_done): Fixed small bug that could - crash the cache in rare circumstances (mostly with broken fonts). - -2003-03-15 David Turner - - * src/truetype/ttdriver.c (Set_Char_Sizes): Fixed a small rounding - bug. Actually, it seems that previous versions of FreeType didn't - perform TrueType rounding exactly as appropriate. - -2003-03-14 David Turner - - * src/truetype/ttdriver.c (Set_Char_Sizes): Fixing the small - TrueType native rendering glitches; they came from a small rounding - error. - -2003-03-13 David Turner - - Added new environment variables to control memory debugging with - FreeType. See the description of `FT2_DEBUG_MEMORY', - `FT2_ALLOC_TOTAL_MAX' and `FT2_ALLOC_COUNT_MAX' in DEBUG.TXT. - - * src/base/ftdbgmem.c (FT_MemTableRec): Add `alloc_count', - `bound_total', `alloc_total_max', `bound_count', `alloc_count_max'. - (ft_mem_debug_alloc): Handle new variables. - (ft_mem_debug_init): s/FT_DEBUG_MEMORY/FT2_DEBUG_MEMORY/. - Handle new environment variables. - * docs/DEBUG.TXT: Updated. - - Fixed the cache sub-system to correctly deal with out-of-memory - conditions. - - * src/cache/ftccache.c (ftc_node_destroy): Comment out generic - check. - (ftc_cache_lookup): Implement loop. - * src/cache/ftccmap.c: Define FT_COMPONENT. - * src/cache/ftcsbits.c (ftc_sbit_node_load): Handle - FT_Err_Out_Of_Memory. - * src/cache/ftlru.c: Include FT_INTERNAL_DEBUG_H. - (FT_LruList_Lookup): Implement loop. - - * src/pfr/pfrobjs.c (pfr_face_done): Fix memory leak. - (pfr_face_init): Fixing compiler warnings. - - * src/psaux/psobjs.c (reallocate_t1_table): Fixed a bug (memory - leak) that only happened when a try to resize an array would end in - an out-of-memory condition. - - * src/smooth/ftgrays.c (gray_convert_glyph): Removed compiler - warnings / volatile bug. - - * src/truetype/ttobjs.c (tt_glyphzone_done): Removed segmentation - fault that happened in tight memory environments. - -2003-02-28 Pixel - - * src/gzip/ftgzip.c (ft_gzip_file_done): Fixed memory leak: The ZLib - stream was not properly finalized. - -2003-02-25 Anthony Fok - - * src/cache/ftccmap.c: Include FT_TRUETYPE_IDS_H. - (ftc_cmap_family_init): The cmap cache now - supports UCS-4 charmaps when available in Asian fonts. - - * src/sfnt/ttload.c, src/base/ftobjs.c: Changed `asian' to `Asian' - in comments. - -2003-02-25 David Turner - - * src/gzip/ftgzip.c (ft_gzip_file_fill_output): Fixed a bug that - caused FreeType to loop endlessly when trying to read certain - compressed gzip files. The following test reveals the bug: - - touch 0123456789 ; gzip 0123456789 ; ftdump 0123456789.gz - - Several fixes to the PFR font driver: - - - The list of available embedded bitmaps was not correctly set in - the root FT_FaceRec structure describing the face. - - - The glyph loader always tried to load the outlines when - FT_LOAD_SBITS_ONLY was specified. - - - The table loaded now scans for *undocumented* elements of a - physical font's auxiliary data record. This is necessary to - retrieve the `real' family and style names. - - NOTE THAT THESE CHANGES THE FAMILY NAME OF MANY PFR FONTS! - - * src/pfr/pfrload.c (pfr_aux_name_load): New function. - (pfr_phy_font_done): Free `family_name' and `style_name' also. - Remove unused variables. - (pfr_phy_font_load): Extract useful information from the auxiliary - bytes. - - * src/pfr/pfrobjs.c (pfr_face_done): Set pointers to NULL. - (pfr_face_init): Provide fallback values for `family_name' and - `style_name'. - Handle strikes. - (pfr_slot_load): Handle FT_LOAD_SBITS_ONLY. - * src/pfr/pfrtypes.h (PFR_PhyFontRec): Add fields `ascent', - `descent', `leading', `family_name', and `style_name'. - - * src/truetype/ttdriver.c (Set_Char_Sizes): Fixed a rounding bug - when computing the scale factors for a given character size in - points with resolution. - - * devel/ft2build.h, devel/ftoption.h: New files (in a new directory) - which are special development versions of include/ft2build.h and - include/freetype/config/ftoption.h, respectively. - -2003-02-18 David Turner - - Fixing the slight distortion problem that occurred due to the latest - auto-hinter changes. - - * src/base/ftobjs.c (ft_recompute_scaled_metrics): Fix rounding. - - * src/truetype/ttdriver.c (Set_Char_Sizes): New variable `metrics2'. - [!TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Removed. - - * src/truetype/ttobjs.h (TT_SizeRec): New field `metrics'. - * src/truetype/ttobjs.c (Reset_Outline_Size): Fix initialization of - `metrics'. - [FT_CONFIG_CHESTER_ASCENDER]: Code removed. - (Reset_SBit_Size): Fix initialization of `metrics'. - - * src/truetype/ttinterp.c (TT_Load_Context): Fix initialization of - `exec->metrics'. - - * src/autohint/ahhint.c (ah_hinter_load): Disabled the advance width - `correction' which seemed to provide more trouble than benefits. - -2003-02-13 Graham Asher - - Changed the incremental loading interface in a way that makes it - simpler and allows glyph metrics to be changed (e.g., by adding a - constant, as required by CFF fonts) rather than just overridden. - This was required to make the GhostScript-to-FreeType bridge work. - - * src/cff/cffgload.c (cff_slot_load) [FT_CONFIG_OPTION_INCREMENTAL]: - Allow metrics to be overridden. - * src/cid/cidgload.c (cid_load_glyph) [FT_CONFIG_OPTION_INCREMENTAL]: - Ditto. - - * src/truetype/ttgload.c (load_truetype_glyph) - [FT_CONFIG_OPTION_INCREMENTAL]: Simplify. - (compute_glyph_metrics) [FT_CONFIG_OPTION_INCREMENTAL]: Code block - moved down. - - * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String) - [FT_CONFIG_OPTION_INCREMENTAL]: Updated. - - * include/freetype/ftincrem.h: Updated. - -2003-01-31 David Turner - - * docs/CHANGES, docs/VERSION.DLL, docs/TODO: Updating documentation - for the 2.1.4 release. - - * builds/win32/visualc/freetype.dsp, - builds/win32/visualc/index.html: Updating the project file for - 2.1.4. - - * src/gzip/adler32.c, src/gzip/ftgzip.c, src/gzip/infblock.c, - src/gzip/infcodes.c, src/gzip/inflate.c, src/gzip/inftrees.c, - src/gzip/infutil.c: Removed old-style (K&R)function definitions. - This avoids warnings with Visual C++ at its most pedantic mode. - - * src/pfr/pfrsbit.c: Removed compiler warnings. - - * src/cache/ftccmap.c (ftc_cmap_family_init): Changed an FT_ERROR - into an FT_TRACE1 since it caused `ftview' and others to dump too - much junk when trying to display a waterfall with a font without a - Unicode charmap (e.g. SYMBOL.TTF). - - Implemented FT_CONFIG_CHESTER_BLUE_SCALE, corresponding to the last - patch from David Chester, but with a much simpler (and saner) - implementation. - - * src/autohint/ahhint.c (ah_hinter_load_glyph) - [FT_CONFIG_CHESTER_BLUE_SCALE]: Try to optimize the y_scale so that - the top of non-capital letters is aligned on a pixel boundary - whenever possible. - - * src/base/ftobjs.c (FT_Set_Char_Size) - [FT_CONFIG_CHESTER_BLUE_SCALE]: Round differently. - * src/truetype/ttdriver.c (Set_Char_Sizes) - [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Do some rounding only - if this macro is defined. - - * src/truetype/ttobjs.c (Reset_Outline_Size) - [FT_CONFIG_CHESTER_ASCENDER]: Round differently. - - * src/pshinter/pshalgo3.c: Improved the Postscript hinter. Getting - rid of stem snapping seems to work well here (though the stems are - still slightly moved to increase contrast). - (psh3_dimension_quantize_len): Commented out. - (psh3_hint_align_light): New function. - (psh3_hint_align): Comment out some code. - - THIS IMPROVES ANTI-ALIASED RENDERING, BUT MONOCHROME AND LCD MODES - STILL SUCK. - -2003-01-22 David Chester - - * src/autohint/ahhint.c (ah_compute_stem_width): Small fix to the - stem width optimization. - -2003-01-22 David Turner - - Adding a new API `FT_Get_BDF_Property' to retrieve the BDF - properties of a given PCF or BDF font. - - * include/freetype/ftbdf.h (BDF_PropertyType): New enumeration. - (BDF_Property, BDF_PropertyRec): New structure. - FT_Get_BDF_Property): New function. - * include/freetype/internal/bdftypes.h: Include FT_BDF_H. - (BDF_GetPropertyFunc): New function pointer. - - * src/base/ftbdf.c (test_font_type): New helper function. - (FT_Get_BDF_Charset_ID): Use `test_font_type'. - (FT_Get_BDF_Property): New function. - - * src/bdf/bdfdrivr.c: Include FT_BDF_H. - (bdf_get_bdf_property, bdf_driver_requester): New functions. - (bdf_driver_class): Use `bdf_driver_requester'. - - * src/pcf/pcfdrivr.c: Include FT_BDF_H. - (pcf_get_bdf_property, pdc_driver_requester): New functions - (pcf_driver_class): Use `pcf_driver_requester'. - - * src/pcf/pcfread.c: Include `pcfread.h'. - (pcf_find_property): Decorate it with FT_LOCAL_DEF. - * src/pcf/pcfread.h: New file, providing `pcf_find_property'. - - * src/sfnt/ttload.c (sfnt_dir_check): Relaxed the `head' table size - verification to accept a few broken fonts who pad the size - incorrectly (the table should be padded, but its `size' field - shouldn't according to the specification). - -2003-01-18 Werner Lemberg - - * builds/unix/ltmain.sh: Regenerated with `libtoolize --force - --copy' from libtool 1.4.3. - * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from - automake 1.7.1. - * builds/unix/configure: Regenerated with autoconf 2.54. - * builds/unix/config.guess, builds/unix/config.sub: Updated from - `config' CVS module at subversions.gnu.org. - * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from - `automake' CVS module at subversions.gnu.org. - -2003-01-15 David Turner - - * include/freetype/freetype.h: Fixed documentation for - FT_Size_Metrics. - -2003-01-15 James Su - - * src/gzip/ftgzip.c (ft_gzip_check_header): Bugfix: couldn't read - certain gzip-ed font files (typo: `&&' -> `&'). - -2003-01-15 Huw D M Davies - - Added a Windows .FNT specific API (mostly for Wine). Also fixed a - nasty bug in the header loader which would cause invalid memory - overwrites. - - * include/freetype/config/ftheader.h (FT_WINFONTS_H): New macro - for ftwinfnt.h. - * include/freetype/internal/fnttypes.h: Include FT_WINFONTS_H. - (FNT_FontRec): Updated. - Move Windows FNT definition to... - * include/freetype/ftwinfnt.h: This new file. - (FT_WinFNT_HeaderRec): Rename `reserved2' to `reserved1'. - * src/base/ftwinfnt.c: New file, providing `FT_Get_WinFNT_Header'. - * src/winfonts/winfnt.c (winfnt_header_fields): Updated. - Rename `reserved2' to `reserved1'. - (fnt_font_load): Updated. - - * src/base/Jamfile, src/base/descrip.mms, src/base/rules.mk: - Updated. - -2003-01-14 Graham Asher - - * include/freetype/ftglyph.h, src/base/ftglyph.c: Added `const' to - the type of the first argument to FT_Matrix_Multiply, which isn't - changed -- this adds documentation and convenience. - -2003-01-13 Graham Asher - - * src/sfnt/ttload.c (tt_face_load_metrics) - [FT_CONFIG_OPTION_INCREMENTAL]: TrueType typefaces without - horizontal metrics (without the `hmtx' table) are now tolerated if - an incremental interface has been specified that has a - get_glyph_metrics function, implying that metrics will be supplied - from outside. This happens for certain Type 42 fonts passed from - GhostScript. - -2003-01-11 David Chester - - Patches to the auto-hinter in order to slightly improve the output. - Note that everything is controlled through the new - FT_CONFIG_OPTION_CHESTER_HINTS defined in `ftoption.h'. There are - also individual FT_CONFIG_CHESTER_XXX macros to control individual - `features'. - - Note that all improvements are enabled by default, but can be - tweaked for optimization and testing purposes. The configuration - macros will most likely disappear in the short future. - - * include/freetype/config/ftoption.h - (FT_CONFIG_OPTION_CHESTER_HINTS): New macro. - (FT_CONFIG_CHESTER_{SMALL_F,ASCENDER,SERIF,STEM,BLUE_SCALE}) - [FT_CONFIG_OPTION_CHESTER_HINTS]: New macros to control individual - features. - - * src/autohint/ahglobal.c (blue_chars) [FT_CONFIG_CHESTER_SMALL_F]: - Add blue zone for `fijkdbh'. - * src/autohint/ahglobal.h (AH_IS_TOP_BLUE) - [FT_CONFIG_CHESTER_SMALL_F]: Use `AH_BLUE_SMALL_F_TOP'. - * src/autohint/ahglyph.c (ah_outline_compute_edges) - [FT_CONFIG_CHESTER_SERIF]: Use `AH_EDGE_SERIF'. - (ah_outline_compute_blue_edges) [FT_CONFIG_CHESTER_SMALL_F]: - Increase threshold for `best_dist'. - * src/autohint/ahhint.c (ah_compute_stem_width) - [FT_CONFIG_CHESTER_SERIF]: Provide new version for improved serif - handling. - (ah_align_linked_edge) [FT_CONFIG_CHESTER_SERIF]: Use special - version of `ah_compute_stem_width'. - (ah_hint_edges_3) [FT_CONFIG_CHESTER_STEM]: A new algorithm for stem - alignment when stem widths are less than 1.5 pixels wide centers the - stem slightly off-center of the center of a pixel (this increases - sharpness and consistency). - [FT_CONFIG_CHESTER_SERIF]: Use special version of - `ah_compute_stem_width'. - * src/autohint/ahtypes.h [FT_CONFIG_CHESTER_SMALL_F]: Add - `AH_BLUE_SMALL_F_TOP'. - -2003-01-11 David Turner - - * include/freetype/internal/fnttypes.h (WinFNT_HeaderRec): Increase - size of `reserved2' to avoid memory overwrites. - -2003-01-08 Huw Davies - - * src/winfonts/winfnt.c (winfnt_header_fields): Read 16 bytes into - `reserved2', not `reserved'. - - * src/base/ftobjs.c (find_unicode_charmap): Fixed the error code - returned when the font doesn't contain a Unicode charmap. This - allows FT2 to load `symbol.ttf' and a few others correctly since the - last release. - (open_face): Fix return value. - -2003-01-08 Owen Taylor - - Implemented the FT_RENDER_MODE_LIGHT hinting mode in the auto and - postscript hinters. - - * src/autohint/ahtypes.h (AH_HinterRec): Add `do_stem_adjust'. - * src/autohint/ahhint.c (ah_compute_stem_width): Handle - hinter->do_stem_adjust. - (ah_hinter_load_glyph): Set hinter->do_stem_adjust. - - * src/pshinter/pshalgo3.h (PSH3_GlyphRec): Add `do_stem_adjust'. - * src/pshinter/pshalgo3.c (psh3_hint_align): Use `do_stem_adjust'. - (ps3_hints_apply): Handle FT_RENDER_MODE_LIGHT. - - * include/freetype/freetype.h (FT_Render_Mode): Add - FT_RENDER_MODE_LIGHT. - - * src/truetype/ttgload.c: Fixing the TrueType loader to handle - invalid composites correctly by limiting the recursion depth. - (TT_MAX_COMPOSITE_RECURSE): New macro. - (load_truetype_glyph): Add argument `recurse_count'. - Load a composite only if the numbers of contours is -1, emit error - otherwise. - (TT_Load_Glyph): Updated. - -2003-01-08 David Turner - - * Jamrules, Jamfile, Jamfile.in, src/*/Jamfile: Small changes to - support the compilation of FreeType 2 as part of larger projects - with their own configuration options (only with Jam). - -2003-01-07 David Turner - - * src/base/ftstroker.c: Probably the last bug-fixes to the stroker; - the API is likely to change, however. - (ft_stroke_border_close): Don't record empty paths. - (ft_stroke_border_get_counts): Increase `num_points' also in for loop. - (ft_stroke_border_export): Don't increase `write' twice in for loops. - (ft_stroker_outside): Handle `phi' together with `theta'. - (FT_Stroker_ParseOutline): New function. - - * src/base/fttrigon.c (FT_Angle_Diff): Fixing function: It returned - invalid values for large negative angle differences (resulting in - incorrect stroker computations, among other things). - - * src/cache/ftccache.c (ftc_node_hash_unlink): Removing incorrect - assertion, and changing code to avoid hash table size contraction. - - * src/base/Jamfile, src/base/rules.mk, src/base/descrip.mms: Adding - `ftstroker' to default build, as optional component. - -2002-12-26 David Turner - - * src/gzip/adler32.c, src/gzip/infblock.c, src/gzip/inflate.c, - src/gzip/inftrees.c, src/gzip/zconf.h, src/gzip/zlib.h, - src/gzip/zutil.h: Updates to allow compilation without compiler - warnings with LCC-Win32. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4. - * builds/unix/configure.ac (version_info): Increased to 9:3:3. - * builds/unix/configure: Regenerated. - * docs/VERSION.DLL: Updated. - -2002-12-23 Anthony Fok - - * builds/unix/configure.ac, builds/unix/unix-cc.in (LINK_LIBRARY), - builds/unix/unix-def.in (SYSTEM_ZLIB): Small fix to configure - sub-system on Unix to allow other programs to correctly link with - zlib when needed. - -2002-12-19 David Turner - - * include/freetype/internal/sfnt.h (SFNT_Load_Table_Func): New - function pointer. - - * include/freetype/tttables.h (FT_Load_Sfnt_Table): New function. - * src/base/ftobjs.c: Implement it. - - * src/sfnt/sfdriver.c (sfnt_get_interface): Handle `load_sfnt' - module request. - -2002-12-17 David Turner - - * src/base/ftobjs.c (find_unicode_charmap): Added some comments to - better explain what's happening there. - (open_face): Included Graham Asher's fix to prevent faces without - Unicode charmaps from loading. - - * src/winfonts/winfnt.c: Included George Williams's fix to support - version 2 fonts correctly. - (winfnt_header_fields): Updated. - (fnt_font_load): Handle version 2 fonts. - (FNT_Load_Glyph): Updated. - -2002-12-16 David Turner - - * docs/VERSION.DLL: Updating document to better explain the - differences between the three version numbers being used on Unix, as - well as providing an autoconf fragment provided by Lars Clausen. - - * src/smooth/ftgrays.c (gray_render_conic): Fixed small bug that - prevented Bézier arcs with negative vertical coordinates to be - rendered appropriately. - -2002-12-02 Antoine Leca - - * src/base/ftobjs.c: Modified the logic to get Unicode charmaps. - Now it loads UCS-4 charmaps when there is one. - (find_unicode_charmap): New function. - (open_face): Refer to the above one. - (FT_Select_Charmap): Idem. - -2002-11-29 Antoine Leca - - * include/freetype/ftgzip.h: Correct the name of the controlling - macro (was __FTXF86_H__ ...). - -2002-11-27 Vincent Caron - - * builds/unix/unix-def.in, builds/unix/freetype-config.in, - builds/unix/configure.ac, src/gzip/rules.mk, src/gzip/ftgzip.c - [FT_CONFIG_OPTION_SYSTEM_ZLIB]: Adding support for system zlib - installations if available on the target platform (Unix only). - -2002-11-23 David Turner - - * src/cff/cffload.c (cff_charset_load, cff_encoding_load): Modified - charset loader to accept pre-defined charsets, even when the font - contains fewer glyphs. Also enforced more checks to ensure that we - never overflow the character codes array in the encoding. - -2002-11-22 Antoine Leca - - * include/freetype/ttnameid.h: Updated to latest OpenType - specification. - -2002-11-18 David Turner - - - * Version 2.1.3 released. - ========================= - - -2002-11-07 David Turner - - * src/cache/ftcsbit.c (ftc_sbit_node_load): Fixed a small bug that - caused problems with embedded bitmaps. - - * src/otlayout/otlayout.h, src/otlyaout/otlconf.h, - src/otlayout/otlgsub.c, src/otlayout/otlgsub.h, - src/otlayout/otlparse.c, src/otlayout/otlparse.h, - src/otlayout/otlutils.h: Updating the OpenType Layout code, adding - support for the first GSUB lookups. Nothing that really compiles - for now though. - - * src/autohint/ahhint.c (ah_align_serif_edge): Disabled serif stem - width quantization. It produces slightly better shapes though this - is not distinguishable with many fonts. - Remove other dead code. - - * src/Jamfile, src/*/Jamfile: Simplified. - Use $(FT2_SRC_DIR). - -2002-11-06 David Turner - - * include/freetype/freetype.h (FT_LOAD_TARGET_LIGHT): New macro. - (FT_LOAD_TARGET, FT_LOAD_TARGET_MODE): Use `& 15' instead of `& 7'. - -2002-11-05 David Turner - - * include/freetype/config/ftoption.h, src/gzip/ftgzip.c: Added - support for the FT_CONFIG_OPTION_SYSTEM_ZLIB option, used to specify - the use of system-wide zlib. - - Note that this macro, as well as - TT_CONFIG_OPTION_BYTECODE_INTERPRETER, is not #undef-ed anymore. - This allows the build system to define them depending on the - configuration (typically by adding -D flags at compile time). - - * src/sfnt/ttcmap0.c (tt_face_build_cmaps): Removed compiler - warnings in optimized mode relative to the `volatile' local - variables. This was not a compiler bug after all, but the fact that - a pointer to a volatile variable is not the same as a volatile - pointer to a variable :-) - - The fix was to change - `volatile FT_Byte* p' - into - `FT_Byte* volatile p'. - - * src/pfr/pfrload.c (pfr_phy_font_load), src/pfr/pfrdrivr.c - (pfr_get_metrics), src/gzip/inftrees.c: Removed compiler warnings in - optimized modes. - - * src/gzip/*.[hc]: Modified our zlib copy in order to prevent - exporting any zlib function names outside of the component. This - prevents linking problems on some platforms, when applications want - to link FreeType _and_ zlib together. - -2002-11-05 Juliusz - - * src/psaux/psobjs.c (ps_table_add): Modified increment loop in - order to implement exponential behaviour. - -2002-11-01 David Turner - - Added PFR-specific public API. Fixed the kerning retrievel routine - (it returned invalid values when the outline and metrics resolution - differ). - - * include/freetype/ftpfr.h, include/freetype/internal/pfr.h: New - files. - - * include/freetype/internal/internal.h (FT_INTERNAL_PFR_H): New - macro for pfr.h. - - * src/base/ftpfr.c: New file. - * src/base/Jamfile, src/base/descrip.mms: Updated. - - * src/pfr/pfrdrivr.c: Include FT_INTERNAL_PFR_H. - (pfr_get_kerning, pfr_get_advance, pfr_get_metrics): New functions. - (pfr_service_rec): New format interface. - (pfr_driver_class): Use `pfr_service_rec'. - Replace `pfr_face_get_kerning' with `pfr_get_kerning'. - * src/pfr/pfrobjs.c: Remove dead code. - - * src/base/ftobjs.c (ft_glyphslot_clear): Small internal fix to - better support bitmap-based font formats. - - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Fix handling of - `scale'. - Fix arguments to `FT_Vector_From_Polar'. - -2002-10-31 David Turner - - Add support for automatic handling of gzip-compressed PCF files. - - * src/gzip/*: New files, taken from the zlib package (except - ftgzip.c). - - * include/freetype/ftgzip.h, src/gzip/ftgzip.c: New files. - * include/freetype/config/ftheader.h (FT_GZIP_H): New macro for - `ftgzip.h'. - - * src/pcf/pcfdriver.c: Include FT_GZIP_H and FT_ERRORS_H. - (PCF_Face_Init): If normal open fails, try to open gzip stream. - (PCF_Face_Done): Close gzip stream. - - * include/freetype/internal/pcftypes.h (PCF_Public_FaceRec), - src/pcf/pcf.h (PCF_FaceRec): Add `gzip_stream' and `gzip_source'. - - * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_USE_ZLIB): - New macro. - (T1_CONFIG_OPTION_DISABLE_HINTER, FT_CONFIG_OPTION_USE_CMAPS - FT_CONFIG_OPTION_NO_CONVENIENCE_FUNCS, - FT_CONFIG_OPTION_ALTERNATE_GLYPH_FORMATS): Removed. - - (FT_EXPORT, FT_EXPORT_DEF, FT_DEBUG_LEVEL_ERROR, - FT_DEBUG_LEVEL_TRACE, FT_DEBUG_MEMORY): Comment out definitions so - that platform specific configuration file can override. - - * include/freetype/internal/ftstream.h: Include FT_SYSTEM_H. - -2002-10-30 David Turner - - * FreeType 2.1.3rc3 released. - -2002-10-25 David Turner - - * include/freetype/ftcache.h (FT_POINTER_TO_ULONG): New macro. - (FTC_FACE_ID_HASH): Rewritten, using FT_POINTER_TO_ULONG. - -2002-10-22 Giuseppe Ghibò - - * include/freetype/freetype.h (FT_Encoding): Fix entry for latin-2. - -2002-10-07 Werner Lemberg - - * include/freetype/freetype.h (FT_Open_Face): Use `const' for `args' - (suggested by Graham). - * src/base/ftobjs.c (FT_Open_Face): Updated. - (ft_input_stream_new): Ditto. - -2002-10-05 David Turner - - Adding support for embedded bitmaps to the PFR driver, and rewriting - its kerning loader/handler to use all kerning pairs in a physical - font (and not just the first item). - - * src/pfr/pfr.c: Include `pfrsbit.c'. - * src/pfr/pfrgload.c: Include `pfrsbit.h'. - * src/pfr/pfrload.c (pfr_extra_item_load_kerning_pairs): Rewritten. - (pfr_phy_font_done, pfr_phy_font_load): Updated. - * src/pfr/pfrobks.c: Include `pfrsbit.h'. - (pfr_face_init): Handle kerning and embedded bitmaps. - (pfr_slot_load): Load embedded bitmaps. - (PFR_KERN_INDEX): Removed. - (pfr_face_get_kerning): Rewritten. - * src/pfr/pfrsbit.c, src/pfr/pfrsbit.h: New files. - * src/pfr/pfrtypes.h (PFR_KernItemRec): New structure. - (PFR_KERN_INDEX): New macro. - (PFR_PhyFontRec): Add items for kerning and embedded bitmaps. - * src/pfr/Jamfile (_sources) [FT2_MULTI]: Add `pfrsbit'. - - * src/base/ftobjs.c (FT_Load_Glyph): Don't load bitmap fonts if - FT_LOAD_NO_RECURSE is set. - Load embedded bitmaps only if FT_LOAD_NO_BITMAP isn't set. - - * src/tools/docmaker/content.py, src/tools/docmaker/sources.py, - src/tools/docmaker/tohtml.py: Fixing a few nasty bugs. - - * src/sfnt/ttcmap0.c (tt_cmap4_validate): The validator for format 4 - sub-tables is now capable of dealing with invalid `length' fields at - the start of the sub-table. This allows fonts like `mg______.ttf' - (i.e. Marriage) to return accurate charmaps. - - * docs/CHANGES: Updated. - -2002-10-05 Werner Lemberg - - * src/smooth/ftgrays.c (SUBPIXELS): Add cast to `TPos'. - Update all callers. - (TRUNC): Add cast to `TCoord'. - Update all callers. - (TRaster): Use `TPos' for min_ex, max_ex, min_ey, max_ey, and - last_ey. - Update all casts. - (gray_render_line): Fix casts for `p' and `first'. - -2002-10-02 Detlef Würkner - - * src/bdf/bdflib.c (bdf_load_font): Allocate the _bdf_parse_t - structure with FT_ALLOC instead of using the stack. - -2002-09-27 Werner Lemberg - - * src/include/freetype/internal/tttypes.h (num_sbit_strikes, - num_sbit_scales): Use `FT_ULong'. - * src/sfnt/sfobjs.c (sfnt_load_face): Updated accordingly. - * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Ditto. - (find_sbit_image): Remove cast. - * src/raster/ftrend1.c (ft_raster1_render): Fix cast. - -2002-09-27 Wolfgang Domröse - - * src/sfnt/ttload.c (tt_face_load_names): Use cast. - * src/sfnt/ttcmap.c (code_to_next2): Use long constant. - (code_to_index4): Use cast. - (code_to_index8_12): Fix cast. - * src/sfnt/ttcmap0.c (tt_cmap4_char_next, tt_cmap8_char_index, - tt_cmap12_char_index): Use cast for `result'. - (tt_face_build_cmaps): Use cast. - * src/sfnt/sfobjs.c (tt_name_entry_ascii_from_ucs4): Use cast for - `code'. - (sfnt_load_face): Use FT_Int32 for `flags'. - - * src/smooth/ftgrays.c (gray_render_scanline, gray_render_line, - gray_compute_cbox, gray_convert_glyph, gray_raster_reset): Add casts - to `TCoord' and `int'. - More 16bit fixes. - s/FT_Pos/TPos/. - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Add casts. - -2002-09-26 Werner Lemberg - - * src/sfnt/ttpost.c (load_post_names, tt_face_free_ps_names, - tt_face_get_ps_name): Replace switch statement with if clauses to - make it more portable. - - * src/cff/cffobjs.c (cff_face_init): Ditto. - - * include/freetype/ftmodule.h (FT_Module_Class): Use `FT_Long' for - `module_size'. - * include/freetype/ftrender.h (FT_Glyph_Class_): Use `FT_Long' for - `glyph_size'. - - * src/base/ftobjs.c (FT_Render_Glyph): Change second parameter to - `FT_Render_Mode'. - (FT_Render_Glyph_Internal): Change third parameter to - `FT_Render_Mode'. - * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Change second parameter - to `FT_Render_Mode'. - - * src/raster/ftrend1.c (ft_raster1_render): Change third parameter - to `FT_Render_Mode'. - * src/smooth/ftsmooth.c (ft_smooth_render, ft_smooth_render_lcd, - ft_smooth_render_lcd_v): Ditto. - (ft_smooth_render_generic): Change third and fifth parameter to - `FT_Render_Mode'. - - * include/freetype/freetype.h, include/freetype/internal/ftobjs.h, - include/freetype/ftglyph.h: Updated. - - * src/cff/cffdrivr.c (Load_Glyph), src/pcf/pcfdriver.c - (PCF_Glyph_Load), src/pfr/pfrobjs.c (pfr_slot_load), - src/winfonts/winfnt.c (FNT_Load_Glyph), src/t42/t42objs.c - (T42_GlyphSlot_Load), src/bdf/bdfdrivr.c (BDF_Glyph_Load): Change - fourth parameter to `FT_Int32'. - - * src/pfr/pfrobjs.c (pfr_face_init): Add two missing parameters - and declare them as unused. - - * src/cid/cidparse.h (CID_Parser): Use FT_Long for `postscript_len'. - - * src/psnames/psnames.h (PS_Unicode_Value_Func): Change return - value to FT_UInt32. - * src/psnames/psmodule.c (ps_unicode_value, ps_build_unicode_table): - Updated accordingly. - -2002-09-26 Wolfgang Domröse - - * src/cff/cffdrivr.c (Get_Kerning): Use FT_Long for `middle'. - (cff_get_glyph_name): Use cast for result of ft_strlen. - * src/cff/cffparse.c (cff_parse_real): User cast for assigning - `exp'. - * src/cff/cffload.c (cff_index_get_pointers): Use FT_ULong for - some local variables. - (cff_charset_load, cff_encoding_load): Use casts to FT_UInt for some - switch statements. - (cff_font_load): Use cast in call to CFF_Load_FD_Select. - * src/cff/cffobjs.c (cff_size_init): Use more casts. - (cff_face_init): Use FT_Int32 for `flags'. - * src/cff/cffgload.c (cff_operator_seac): Use cast for assigning - `adx' and `ady'. - (cff_decoder_parse_charstrings): Use FT_ULong for third parameter. - Use more casts. - * src/cff/cffcmap.c (cff_cmap_unicode_init): Use cast for `count'. - - * src/cid/cidload.c (cid_read_subrs): Use FT_ULong for `len'. - * src/cid/cidgload.c (cid_load_glyph): Add missing cast for - `cid_get_offset'. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings) <18>: Use - cast for `num_points'. - (t1_decoder_init): Use cast for assigning `decoder->num_glyphs'. - - * src/base/ftdebug.c (ft_debug_init): Use FT_Int. - * include/freetype/internal/ftdriver.h (FT_Slot_LoadFunc): Use - `FT_Int32' for fourth parameter. - * src/base/ftobjs.c (open_face): Use cast for calling - clazz->init_face. - - * src/raster/ftraster.c (Set_High_Precision): Use `1' instead of - `1L'. - (Finalize_Profile_Table, Line_Up, ft_black_init): Use casts. - * src/raster/ftrend1.c (ft_raster1_render): Ditto. - - * src/sfnt/sfnt_dir_check: Compare `magic' with unsigned long - constant. - -2002-09-26 Detlef Würkner - - * builds/amiga/include/freetype/config/ftmodule.h: Updated. - -2002-09-25 David Turner - - * src/autohint/ahtypes.h (AH_HINT_METRICS): Disabling metrics - hinting in the auto-hinter. This produces much better anti-aliased - text. - - * docs/CHANGES: Updating the changes documentation. - -2002-09-25 Anthony Fok - - * src/sfnt/ttcmap0.c (tt_cmap4_validate, tt_cmap4_char_index, - tt_cmap4_char_next): Added support for opens___.ttf (it contains a - charmap that uses offset=0xFFFFU instead of 0x0000 to indicate a - missing glyph). - -2002-09-21 Wolfgang Domröse - - * src/truetype/ttdriver.c (Load_Glyph): Fourth parameter must be - FT_Int32. - * src/truetype/ttgload.c, src/truetype/ttgload.h (TT_Load_Glyph): - Ditto. - -2002-09-19 Wolfgang Domröse - - More 16bit fixes. - - * src/autohint/ahglobal.c (sort_values): Use FT_Pos for `swap'. - (ah_hinter_compute_widths): Use FT_Pos for `dist'. - Use AH_MAX_WIDTHS. - * src/autohint/ahglyph.c (ah_outline_scale_blue_edges): Use FT_Pos - for `delta'. - (ah_outline_compute_edges): Replace some ints with FT_Int and - FT_Pos. - (ah_test_extrema): Clean up code. - (ah_get_orientation): Use 4 FT_Int variables instead of FT_BBox to - hold indices. - * src/autohint/ahtypes.h (AH_SegmentRec): Change type of `score' - to FT_Pos. - -2002-09-19 Werner Lemberg - - * builds/unix/config.guess, builds/unix/config.sub: Updated to - recent versions. - -2002-09-18 David Turner - - * src/base/ftobjs.c (FT_Library_Version): Bugfix. - - * FreeType 2.1.3rc2 (release candidate 2) is released! - -2002-09-17 David Turner - - * include/freetype/freetype.h, include/freetype/ftimage.h, - include/freetype/ftstroker.h, include/freetype/ftsysio.h, - include/freetype/ftsysmem.h, include/freetype/ttnameid.h: Updating - the in-source documentation. - - * src/tools/docmaker/tohtml.py: Updating the HTML formatter in the - DocMaker tool. - - * src/tools/docmaker.py: Removed. - -2002-09-17 Werner Lemberg - - More 16bit fixes. - - * src/psaux/psobjs.c (reallocate_t1_table): Use FT_Long for - second parameter. - -2002-09-16 Werner Lemberg - - 16bit fixes from Wolfgang Domröse. - - * src/type1/t1parse.h (T1_ParserRec): Change type of `base_len' - and `private_len' to FT_Long. - * src/type1/t1parse.c (T1_Get_Private_Dict): Remove cast for - `private_len'. - * src/type1/t1load.c: Use FT_Int cast for most calls of T1_ToInt. - Use FT_PtrDist where appropriate. - (parse_encoding): Use FT_Long for `count' and `n'. - (read_binary_data): Use FT_Long* for second parameter. - * src/type1/t1afm.c (afm_atoindex): Use FT_PtrDist. - - * src/cache/ftcsbits.c (ftc_sbit_node_load): Remove unused label. - * src/pshinter/pshalgo3.c (psh3_hint_align): Remove unused variable. - -2002-09-14 Werner Lemberg - - Making ftgrays.c compile stand-alone again. - - * include/freetype/ftimage.h: Include ft2build.h only if _STANDALONE_ - isn't defined. - * src/smooth/ftgrays.c [_STANDALONE_]: Define ft_memset, - FT_BEGIN_HEADER, FT_END_HEADER. - (FT_MEM_ZERO): Define. - (TRaster) [GRAYS_USE_GAMMA]: Use `unsigned char' instead of FT_Byte. - (gray_render_span, gray_init_gamma): Don't use `FT_UInt'. - Don't cast with `FT_Byte'. - (grays_init_gamma): Don't use `FT_UInt'. - -2002-09-14 Werner Lemberg - - * src/base/ftinit.c (FT_Add_Default_Modules): Improve error message. - * src/pcf/pcfdriver.c (PCF_Face_Done): Improve tracing message. - * include/freetype/config/ftoption.h (FT_MAX_MODULES): Increased - to 32. - -2002-09-10 Werner Lemberg - - * builds/unix/configure.ac (version_info): Set to 9:2:3. - * builds/unix/configure: Regenerated. - * docs/VERSION.DLL: Updated. - -2002-09-09 David Turner - - * src/pshinter/pshalgo2.c (psh2_glyph_find_strong_points), - src/pshinter/pshalgo3.c (psh3_glyph_find_strong_points): Adding fix - to prevent seg fault when hints are provided in an empty glyph. - - * src/cache/ftccache.i (GEN_CACHE_LOOKUP) [FT_DEBUG_LEVEL_ERROR]: - Removed conditional code. This fixes a bug that prevented - compilation in debug mode of template instantiation. - - * include/freetype/ftimage.h: Removed incorrect `zft_' definitions - and updated constants documentation comments. - - * src/cff/cffparse.c (cff_parser_run): Fixed the CFF table loader. - It didn't accept empty arrays, and this prevented the loading of - certain fonts. - - * include/freetype/freetype.h (FT_FaceRec): Updating documentation - comment. The `descender' value is always *negative*, not positive. - -2002-09-09 Owen Taylor - - * src/pcf/pcfdriver.c (PCF_Glyph_Load): Fixing incorrect computation - of bitmap metrics. - -2002-09-08 David Turner - - Various updates to correctly support sub-pixel rendering. - - * include/freetype/config/ftmodule.h: Add two renderers for LCD. - - * src/base/ftobjs.c (FT_Load_Glyph): Updated. - - * src/smooth/ftsmooth.c (ft_smooth_render_lcd, - ft_smooth_render_lcd_v): Set FT_PIXEL_MODE_LCD and - FT_PIXEL_MODE_LCD_V, respectively. - - * include/freetype/cache/ftcimage.h (FTC_ImageTypeRec): New - structure. - Updated all users. - (FTC_ImageDesc): Removed. - (FTC_ImageCache_Lookup): Second parameter is now of type - `FTC_ImageType'. - Updated all users. - (FTC_IMAGE_DESC_COMPARE): Updated and renamed to... - (FTC_IMAGE_TYPE_COMPARE): This. - (FTC_IMAGE_DESC_HASH): Updated and renamed to... - (FTC_IMAGE_TYPE_HASH): This. - - * include/freetype/cache/ftcsbits.h (FTC_SBitRec): Field `num_grays' - replaced with `max_grays'. - `pitch' is now FT_Short. - (FTC_SBitCache_Lookup): Second parameter is now of type - `FTC_ImageType'. - Updated all users. - - * src/cache/ftcimage.c (FTC_ImageQueryRec, FTC_ImageFamilyRec): - Updated. - (ftc_image_node_init): Updated. - Moved code to convert type flags to load flags to... - (FTC_Image_Cache_Lookup): This function. - (ftc_image_family_init): Updated. - - * src/cache/ftcsbit.c (FTC_SBitQueryRec, FTC_SBitFamilyRec): - Updated. - (ftc_sbit_node_load): Updated. - Moved code to convert type flags to load flags to... - (FTC_SBitCache_Lookup): This function. - - * src/autohint/ahtypes.h (AH_HinterRec): Replace `no_*_hints' with - `do_*_snapping'. - Update all users (with negation). - * src/autohint/ahhint.c (ah_compute_stem_width): Fix threshold for - `dist' for `delta' < 40. - - * src/pshinter/pshalgo3.h (PSH3_GlyphRec): Replace `no_*_hints' with - `do_*_snapping'. - Update all users (with negation). - * src/pshinter/pshalgo3.c (psh3_dimension_quantize_len): New - function. - (psh3_hint_align): Use it. - Improve hinting code. - [STRONGER]: Removed. - (STRONGER): Removed. - - * include/freetype/freetype.h (FT_Set_Hint_Flags, FT_HINT_*): - Removed. - -2002-09-05 Werner Lemberg - - * src/cid/cidobjs.c (CID_Size_Init): Renamed to... - (cid_size_init): This. - * src/psaux/psobjs.c (T1_Builder_Add_Point1): Renamed to... - (t1_builder_add_point1): This. - - Updated all affected code. - - * src/pshinter/pshalgo3.c (psh3_hint_align): Fix compiler warnings. - * src/type1/t1gload.c (T1_Compute_Max_Advance): Ditto. - -2002-09-04 David Turner - - * include/freetype/freetype.h: Corrected the definition of - ft_encoding_symbol to be FT_ENCODING_MS_SYMBOL (instead of - the erroneous FT_ENCODING_SYMBOL). - - * builds/unix/unix-def.in (datadir): Initialize it (thanks to - Anthony Fok). - -2002-08-29 David Turner - - Slight modification to the Postscript hinter to slightly increase - the contrast of smooth hinting. This is very similar to what the - auto-hinter does when it comes to stem width computations. However, - it produces better results with well-hinted fonts. - - * include/freetype/internal/psaux.h (T1_Decoder_FuncsRec): Add hint - mode to `init' member function. - (T1_DecoderRec): Add hint mode. - * include/freetype/internal/pshints (T1_Hints_ApplyFunc, - T2_Hints_ApplyFunc): Pass `hint_mode', not `hint_flags'. - * src/psaux/t1decode.c (t1_decoder_init): Add hint mode argument. - * src/pshinter/pshalgo1.c (ps1_hints_apply): Pass hint mode, not - hint flags. - * src/pshinter/pshalgo2.c (ps2_hints_apply): Ditto. - * src/pshinter/pshalgo3.c (ps3_hints_apply): Ditto. - (STRONGER): New macro. - (psh3_hint_align, psh3_hint_table_align_hints): Pass `glyph' instead - of `hint_flags'. - Implement announced changes. - * src/pshinter/pshalgo3.h (PSH3_GlyphRec): Add flags to control - vertical and horizontal hints and snapping. - - * README, docs/CHANGES: Updating for the 2.1.3 release. - -2002-08-27 David Turner - - * Massive re-formatting changes to many, many source files. I don't - want to list them all here. The operations performed were all - logical transformations of the sources: - - - trying to convert all enums and constants to CAPITALIZED_STYLE, - #with define definitions like - - #define my_old_constants MY_NEW_CONSTANT - - - big, big update of the documentation comments - - * include/freetype/freetype.h, src/base/ftobjs.c, - src/smooth/ftsmooth.c, include/freetype/ftimage.h: Adding support - for LCD-optimized rendering though the new constants/enums: - - FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V - FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V - - This is still work in progress, don't expect everything to work - correctly though most of the features have been implemented. - - * Adding new FT_LOAD_XXX flags, used to specify both hinting and - rendering targets: - - FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering - FT_LOAD_TARGET_MONO :: monochrome bitmaps - FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated - hinting & rendering - FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated - hinting & rendering - - Note that FT_LOAD_TARGET_NORMAL is 0, which means that the default - behaviour of the font engine is _unchanged_. - - * include/freetype/ftimage.h - (FT_Outline_{Move,Line,Conic,Cubic}To_Func): Renamed to... - (FT_Outline_{Move,Line,Conic,Cubic}ToFunc): This. - (FT_Raster_Span_Func): Renamed to ... - (FT_SpanFunc): This. - (FT_Raster_{New,Done,Reset,Set_Mode,Render}_Func): Renamed to ... - (FT_Raster_{New,Done,Reset,SetMode,Render}Func}: This. - - Updated all affected code. - - * include/freetype/ftrender.h - (FT_Glyph_{Init,Done,Transform,BBox,Copy,Prepare}_Func): Renamed - to ... - (FT_Glyph_{Init,Done,Transform,GetBBox,Copy,Prepare}Func): This. - (FTRenderer_{render,transform,getCBox,setMode}): Renamed to ... - (FT_Renderer_{RenderFunc,TransformFunc,GetCBoxFunc,SeteModeFunc}): - This. - - Updated all affected code. - - * src/autohint/ahtypes.h (AH_Point, AH_Segment, AH_Edge, AH_Globals, - AH_Face_Globals, AH_Outline, AH_Hinter): These typedefs are now - pointers to the corresponding `*Rec' structures. All source files - have been updated accordingly. - - * src/cff/cffgload.c (cff_decoder_init): Add hint mode as parameter. - * src/cff/cffgload.h (CFF_Decoder): Add `hint_mode' element. - - * src/cid/cidgload.c (CID_Compute_Max_Advance): Renamed to... - (cid_face_compute_max_advance): This. - (CID_Load_Glyph): Renamed to... - (cid_slot_load_glyph): This. - * src/cid/cidload.c (CID_Open_Face): Renamed to... - (cid_face_open): This. - * src/cid/cidobjs.c (CID_GlyphSlot_{Done,Init}): Renamed to... - (cid_slot_{done,init}): This. - (CID_Size_{Get_Globals_Funcs,Done,Reset): Renamed to... - (cid_size_{get_globals_funcs,done,reset): This. - (CID_Face_{Done,Init}): Renamed to... - (cid_face_{done,init}): This. - (CID_Driver_{Done,Init}: Renamed to... - (cid_driver_{done,init}: This. - * src/cid/cidparse.c (CID_{New,Done}_Parser): Renamed to... - (cid_parser_{new,done}): This. - * src/cid/cidparse.h (CID_Skip_{Spaces,Alpha}): Renamed to... - (cid_parser_skip_{spaces,alpha}): This. - (CID_To{Int,Fixed,CoordArray,FixedArray,Token,TokenArray}): Renamed - to... - (cid_parser_to_{int,fixed,coord_array,fixed_array,token,token_array}): - This. - (CID_Load_{Field,Field_Table): Renamed to... - (cid_parser_load_{field,field_table}): This. - * src/cid/cidriver.c (CID_Get_Interface): Renamed to... - (cid_get_interface): This. - - Updated all affected code. - - * src/psaux/psobjs.c (PS_Table_*): Renamed to... - (ps_table_*): This. - (T1_Builder_*): Renamed to... - (t1_builder_*): This. - * src/psaux/t1decode.c (T1_Decoder_*): Renamed to... - (t1_decoder_*): This. - - * src/psnames/psmodule.c (PS_*): Renamed to... - (ps_*): This. - - Updated all affected code. - - * src/sfnt/sfdriver (SFNT_Get_Interface): Renamed to... - (sfnt_get_interface): This. - * src/sfnt/sfobjs.c (SFNT_*): Renamed to... - (sfnt_*): This. - * src/sfnt/ttcmap.c (TT_CharMap_{Load,Free}): Renamed to... - (tt_face_{load,free}_charmap): This. - * src/sfnt/ttcmap0.c (TT_Build_CMaps): Renamed to... - (tt_face_build_cmaps): This. - * src/sfnt/ttload.c (TT_*): Renamed to... - (tt_face_*): This. - * src/sfnt/ttpost.c (TT_Post_Default_Names): Renamed to... - (tt_post_default_names): This. - (Load_*): Renamed to... - (load_*): This. - (TT_*): Renamed to... - (tt_face_*): This. - * src/sfnt/ttsbit.c (TT_*): Renamed to... - (tt_face_*): This. - ({Find,Load,Crop}_*): Renamed to... - ({find,load,crop}_*): This. - - Updated all affected code. - - * src/smooth/ftsmooth.c (ft_smooth_render): Renamed to... - (ft_smooth_render_generic): This. - Make function more generic by adding vertical and horizontal scaling - factors. - (ft_smooth_render, ft_smooth_render_lcd, ft_smooth_render_lcd_v): - New functions. - - (ft_smooth_locd_renderer_class, ft_smooth_lcdv_renderer_class): New - classes. - - * src/truetype/ttobjs.c (TT_{Done,New}_GlyphZone): Renamed to... - (tt_glyphzone_{done,new}): This. - (TT_{Face,Size,Driver}_*): Renamed to... - (tt_{face,size,driver}_*): This. - * src/truetype/ttpload.c (TT_Load_Locations): Renamed to... - (tt_face_load_loca): This. - (TT_Load_Programs): Renamed to... - (tt_face_load_fpgm): This. - (TT_*): Renamed to... - (tt_face_*): This. - -2002-08-27 Werner Lemberg - - * docs/VERSION.DLL: New file. - -2002-08-23 Graham Asher - - * src/cff/cffgload.c (cff_operator_seac) - [FT_CONFIG_OPTION_INCREMENTAL]: Incremental fonts (actually not - incremental in the case of CFF but just using callbacks to get glyph - recipes) pass the character code, not the glyph index, to the - get_glyph_data function; they have no valid charset table. - - * src/cff/cffload.c (cff_font_load): Removed special cases for - FT_CONFIG_OPTION_INCREMENTAL, which are no longer necessary; CFF - fonts provided via the incremental interface now have to conform - more closely to the CFF font format. - - * src/cff/cffload.h (cff_font_load): Removed argument now unneeded. - - * src/cff/cffobjs.c (cff_face_init): Changed call to cff_font_load - to conform with new signature. - -2002-08-22 David Turner - - * src/base/ftobject.c, src/base/ftsynth.c, src/base/ftstroker.c, - src/bdf/bdfdrivr.c: Removed compiler warnings. - -2002-08-21 Werner Lemberg - - * src/pshinter/pshalgo3.c (psh3_glyph_compute_inflections, - psh3_glyph_compute_extrema, psh3_hint_table_find_strong_point): Fix - compiler warnings and resolve shadowing of local variables. - -2002-08-21 David Turner - - The automatic and Postscript hinter now automatically detect - inflection points in glyph outlines and treats them specially. This - is very useful to prevent nasty effect like the disappearing - diagonals of `S' and `s' in many, many fonts. - - * src/autohint/ahtypes.h (ah_flag_inflection): New macro. - * src/autohint/ahangles.c (ah_angle_diff): New function. - * src/autohint/ahangles.h: Updated. - * src/autohint/ahglyph.c (ah_outline_compute_inflections): New - function. - (ah_outline_detect_features): Use it. - * src/autohint/ahhint.c (ah_hinter_align_strong_points) - [!AH_OPTION_NO_WEAK_INTERPOLATION]: Handle inflection. - - * src/tools/docmaker/docmaker.py, src/tools/docmaker/utils.py, - src/tools/docmaker/tohtml.py: Updating the DocMaker tool. - - * include/freetype/freetype.h: Changing the type of the `load_flags' - parameter from `FT_Int' to `FT_Int32', this in order to support more - options. This should only break binary and/or source compatibility - on 16-bit platforms (Atari?). - (FT_LOAD_NO_AUTOHINT): New macro. - - * src/base/ftobjs.c (FT_Load_Glyph): Updated. - Handle FT_LOAD_NO_AUTOHINT. - (FT_Load_Char): Updated. - - * src/pshinter/pshalgo3.c, src/base/ftobjs.c, src/base/ftobject.c, - src/autohint/ahglyph.c, include/freetype/freetype.h: Fixing typos - and removing compiler warnings. - -2002-08-20 Werner Lemberg - - * src/truetype/ttgload.c (TT_Get_Metrics): Add guard for k = 0. - -2002-08-20 David Turner - - * src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.c, - src/pshinter/pshglob.c, src/pshinter/pshrec.c, - src/autohint/ahmodule.c [DEBUG_HINTER]: Removing compiler warnings - (only used in development builds anyway). - - Improve support of local extrema and stem edge points. - - * src/pshinter/pshalgo3.h (PSH3_Hint_TableRec): Use PSH3_ZoneRec - for `zones'. - (PSH3_DIR_UP, PSH3_DIR_DOWN): Exchange values. - (PSH3_DIR_HORIZONTAL, PSH3_DIR_VERTICAL): New macros. - (PSH3_DIR_COMPARE, PSH3_DIR_IS_HORIZONTAL, PSH3_IS_VERTICAL): New - macros. - (PSH3_POINT_INFLEX): New enum. - (psh3_point_{is,set}_{off,inflex}): New macros. - (PSH3_POINT_{EXTREMUM,POSITIVE,NEGATIVE,EDGE_MIN,EDGE_MAX): New - enum values. - (psh3_point_{is,set}_{extremum,positive,negative,edge_min,edge_max}): - New macros. - (PSH3_PointRec): New members `flags2' and `org_v'. - (PSH3_POINT_EQUAL_ARG, PSH3_POINT_ANGLE): New macros. - - * src/pshinter/pshalgo3.c [DEBUG_HINTER]: Removing compiler - warnings. - (COMPUTE_INFLEXS): New macro. - (psh3_hint_align): Simplify some basic arithmetic computations. - (psh3_point_is_extremum): Removed. - (psh3_glyph_compute_inflections) [COMPUTE_INFLEXS]: New function. - (psh3_glyph_init) [COMPUTE_INFLEXS]: Use it. - (psh3_glyph_compute_extrema): New function. - (PSH3_STRONG_THRESHOLD): Increased to 30. - (psh3_hint_table_find_strong_point): Improved. - (psh3_glyph_find_strong_points, - psh3_glyph_interpolate_strong_points): Updated. - (psh3_hints_apply): Use psh3_glyph_compute_extrema. - - * test/gview.c (draw_ps3_hint, ps3_draw_control_points): New - functions. - Other small updates. - - * Jamfile: Small updates. - -2002-08-18 Arkadiusz Miskiewicz - - * builds/unix/install.mk (install, uninstall): Add $(DESTDIR) to - make life easier for package maintainers. - -2002-08-18 Werner Lemberg - - * src/pcf/pcfdriver.c (PCF_Glyph_Load): Fix computation of - horiBearingX. - * src/bdf/bdfdrivr.c (BDF_GlyphLoad): Fix computation of - horiBearingY. - -2002-08-16 George Williams - - Add support for Apple composite glyphs. - - * include/freetype/config/ftoption.h - (TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED): New macro. - - * src/truetype/ttgload.c (OVERLAP_COMPOUND, SCALED_COMPONENT_OFFSET, - UNSCALED_COMPONENT_OFFSET): New macros for additional OpenType - glyph loading flags. - (load_truetype_glyph): Implement it. - -2002-08-16 Werner Lemberg - - * src/cff/cffgload.c (cff_free_glyph_data), - src/cff/cffload.c (cff_font_load): Use FT_UNUSED. - -2002-08-15 Werner Lemberg - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Initialize `error'. - * src/sfnt/sfobjs.c (SFNT_Load_Face): Fix compiler warning. - -2002-08-15 Graham Asher - - Implemented the incremental font loading system for the CFF driver. - Tested using the GhostScript-to-FreeType bridge (under development). - - * src/cff/cffgload.c (cff_get_glyph_data, cff_free_glyph_data): New - functions. - (cff_operator_seac, cff_compute_max_advance, cff_slot_load): Use - them. - * src/cff/cffload.c (cff_font_load): Add `face' parameter. - Load charset and encoding only if there are glyphs. - [FT_CONFIG_OPTION_INCREMENTAL]: Incremental fonts don't need - character recipes. - * src/cff/cffload.h, src/cff/cffobjs.c: Updated. - - * src/cid/cidgload.c (cid_load_glyph) - [FT_CONFIG_OPTION_INCREMENTAL]: Corrected the incremental font - loading implementation to use the new system introduced on - 2002-08-01. - -2002-08-06 Werner Lemberg - - * src/cff/cffcmap.c: Remove compiler warnings. - * src/cache/ftccache.c, src/cache/ftccache.i, - src/pfr/pfrload.c, src/pfr/pfrgload.c: s/index/idx/. - * src/cff/cffload.c: s/select/fdselect/. - * src/raster/ftraster.c: s/wait/waiting/. - -2002-08-01 Graham Asher - - * src/type1/t1load.c (T1_Open_Face): Tolerate a face with no - charstrings if there is an incremental loading interface. Type 1 - faces supplied by PostScript interpreters like GhostScript will - typically not provide any charstrings at load time, so this is - essential if they are to work. - -2002-08-01 Graham Asher - - Modified incremental loading interface to be closer to David's - preferences. The header freetype.h is not now affected, the - interface is specified via an FT_Parameter, the pointer to the - interface is hidden in an internal part of the face record, and all - the definitions are in ftincrem.h. - - * include/freetype/freetype.h [FT_CONFIG_OPTION_INCREMENTAL]: - Removed. - * include/freetype/internal/ftobjs.h [FT_CONFIG_OPTION_INCREMENTAL]: - Include FT_INCREMENTAL_H. - (FT_Face_InternalRec) [FT_CONFIG_OPTION_INCREMENTAL]: Add - `incremental_interface'. - - * src/base/ftobjs.c (open_face, FT_Open_Face) - [FT_CONFIG_OPTION_INCREMENTAL]: Updated. - * src/sfnt/sfobjs.c (SFNT_Load_Face) [FT_CONFIG_OPTION_INCREMENTAL]: - Updated. - - * src/truetype/ttgload.c (load_truetype_glyph) - [FT_CONFIG_OPTION_INCREMENTAL]: Updated. - Free loaded glyph data properly. - (compute_glyph_metrics, TT_Load_Glyph) - [FT_CONFIG_OPTION_INCREMENTAL]: Updated. - * src/truetype/ttobjs.c (TT_Face_Init) - [FT_CONFIG_OPTION_INCREMENTAL]: Updated. - - * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String) - [FT_CONFIG_OPTION_INCREMENTAL]: Updated. - (T1_Parse_Glyph) [FT_CONFIG_OPTION_INCREMENTAL]: Updated. - Free loaded glyph data properly. - (T1_Load_Glyph): Updated. - [FT_CONFIG_OPTION_INCREMENTAL]: Free loaded glyph data properly. - -2002-07-30 David Turner - - * include/freetype/ftincrem.h: Adding new experimental header file - to demonstrate a `cleaner' API to support incremental font loading. - - * include/freetype/config/ftheader.h (FT_INCREMENTAL_H): New macro. - - * src/tools/docmaker/*: Adding new (more advanced) version of - the DocMaker tool, using Python's sophisticated regexps. - -2002-07-28 Werner Lemberg - - s/ft_memset/FT_MEM_SET/. - s/FT_MEM_SET/FT_MEM_ZERO/ where appropriate. - -2002-07-27 Werner Lemberg - - * src/sfnt/ttload.c (sfnt_dir_check): Make it work with TTCs. - -2002-07-26 Werner Lemberg - - * src/truetype/ttgload.c (load_truetype_glyph) - [FT_CONFIG_OPTION_INCREMENTAL]: s/memset/ft_memset/. - - * src/autohint/ahhint.c (ah_hint_edges_3): Fix compiler warning. - * src/cff/cffload.c (cff_encoding_load): Remove `memory' variable. - * src/cff/cffcmap.c (cff_cmap_encoding_init): Remove `psnames' - variable. - * src/truetype/ttgload.c (load_truetype_glyph): Remove statement - without effect. - * src/truetype/ttdriver (Get_Char_Index, Get_Next_Char): Removed. - - * src/pshinter/pshalgo3.c (psh3_hint_table_record, - psh3_hint_table_init, psh3_hint_table_activate_mask): Fix error - message. - -2002-07-24 Graham Asher - - * src/truetype/ttobjs.c: Fix for bug reported by Sven Neumann - [sven@gimp.org] on the FreeType development forum: `If - FT_CONFIG_OPTION_INCREMENTAL is undefined (this is the default), the - TrueType loader crashes in line 852 of src/truetype/ttgload.c when - it tries to access face->glyph_locations.' - -2002-07-18 Graham Asher - - Added types and structures to support incremental typeface loading. - The FT_Incremental_Interface structure, defined in freetype.h, is - designed to be passed to FT_Open_Face to provide callback functions - to obtain glyph recipes and metrics, for fonts like those passed - from PostScript that do not necessarily provide all, or any, glyph - information, when first opened. - - * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_INCREMENTAL): - New configuration macro to enable incremental face loading. By - default it is not defined. - - * include/freetype/freetype.h (FT_Basic_Glyph_Metrics, - FT_Get_Glyph_Data_Func, FT_Get_Glyph_Metrics_Func, - FT_Incremental_Interface_Funcs, FT_Incremental_Interface) - [FT_CONFIG_OPTION_INCREMENTAL]: New. - (FT_Open_Args, FT_FaceRec) [FT_CONFIG_OPTION_INCREMENTAL]: New field - `incremental_interface'. - (FT_Open_Flags) [FT_CONFIG_OPTION_INCREMENTAL]: New enum - `ft_open_incremental'. - - * include/freetype/fttypes.h: Include FT_CONFIG_CONFIG_H. - (FT_Data): New structure to represent binary data. - - * src/base/ftobjs.c (open_face) [FT_CONFIG_OPTION_INCREMENTAL]: - Add parameter for incremental loading. - (FT_Open_Face) [FT_CONFIG_OPTION_INCREMENTAL]: Use incremental - interface. - - * src/truetype/ttgload.c (load_truetype_glyph) - [FT_CONFIG_OPTION_INCREMENTAL]: Added the incremental loading system - for the TrueType driver. - (compute_glyph_metrics): Return FT_Error. - [FT_CONFIG_OPTION_INCREMENTAL]: Check for overriding metrics. - (TT_Load_Glyph) [FT_CONFIG_OPTION_INCREMENTAL]: Don't look for - the glyph table while handling an incremental font. - Get glyph offset. - - * src/truetype/ttobjs.c (TT_Face_Init) - [FT_CONFIG_OPTION_INCOREMENTAL]: Added the incremental loading - system for the TrueType driver. - - * src/cid/cidgload.c (cid_load_glyph) - [FT_CONFIG_OPTION_INCREMENTAL]: Added the incremental loading system - for the CID driver. - - * src/sfnt/sfobjs.c (SFNT_Load_Face) [FT_CONFIG_OPTION_INCREMENTAL]: - Changes to support incremental Type 42 fonts: Assume a font has - glyphs if it has an incremental interface object. - - * src/type1/t1gload.c (T1_Parse_Glyph): Renamed to... - (T1_Parse_Glyph_And_Get_Char_String): This. - [FT_CONFIG_OPTION_INCREMENTAL]: Added support for incrementally - loaded Type 1 faces. - (T1_Parse_Glyph): New function. - (T1_Load_Glyph): Updated. - -2002-07-17 David Turner - - Cleaning up the cache sub-system code; linear hashing is now the - default. - - * include/freetype/cache/ftccache.h, src/cache/ftccache.i, - src/cache/ftccache.c [!FTC_CACHE_USE_LINEAR_HASHING]: Removed. - (FTC_CACHE_USE_LINEAR_HASHING: Removed also. - - FT_CONFIG_OPTION_USE_CMAPS is now the default. - - * include/freetype/internal/ftdriver.h (FT_Driver_ClassRec): Remove - `get_char_index' and `get_next_char'. - - * include/freetype/config/ftoption.h, - include/freetype/internal/tttypes.h, src/base/ftobjs.c, - src/bdf/bdfdrivr.c, src/cff/cffobjs.c, src/pcf/pcfdrivr.c, - src/pfr/pfrdrivr.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c, - src/sfnt/ttcmap0.h, src/sfnt/ttload.c, src/type1/t1objs.c, - src/type42/t42objs.c, src/winfonts/winfnt.c - [!FT_CONFIG_OPTION_USE_CMAPS]: Removed. The new cmap code is now - the default. - - * src/type42/t42objs.c (T42_CMap_CharIndex, T42_CMap_CharNext): - Removed. - * src/type42/t42objs.h: Updated. - - * src/cid/cidriver.c (Cid_Get_Char_Index, Cid_Get_Next_Char): - Removed. - (t1_cid_driver_class): Updated. - * src/truetype/ttdriver.c (tt_driver_class): Updated. - * src/type1/t1driver.c (Get_Char_Index, Get_Next_Char): Removed - (t1_driver_class): Updated. - * src/type42/t42drivr.c (t42_driver_class): Updated. - - * src/base/ftobjs.c (open_face): Select Unicode cmap by default. - - * src/sfnt/ttload.c (TT_Load_SFNT_Header): Fixed a recent bug that - prevented OpenType fonts to be recognized by FreeType. - -2002-07-11 David Turner - - Changing the SFNT loader to check for SFNT-based font files - differently. We now ignore the range `helper' fields and check the - `head' table's magic number instead. - - * include/freetype/internal/tttypes.h (SFNT_HeaderRec): Add `offset' - field. - - * src/sfnt/ttload.c (sfnt_dir_check): New function. - (TT_Load_SFNT_HeaderRec): Renamed to... - (TT_Load_SFNT_Header): This. - Implement new functionality. - * src/sfnt/ttload.h: Updated. - * src/sfnt/sfdriver.c (sfnt_interface): Updated. - - * src/base/ftobject.c, src/base/fthash.c: Updated object sub-system - and dynamic hash table implementation (still experimental, don't - use). - * include/freetype/internal/fthash.h: Updated. - * include/freetype/internal/ftobjs.h (FT_LibraryRec): New member - `meta_class'. - - Fixing a bug in the Type 1 loader that prevented valid font bounding - boxes to be loaded from multiple master fonts. - - * include/freetype/t1tables.h (PS_BlendRec): Add `bboxes' field. - - * include/freetype/internal/psaux.h (T1_FieldType): Add - `T1_FIELD_TYPE_BBOX'. - (T1_FieldLocation): Add `T1_FIELD_LOCATION_BBOX'. - (T1_FIELD_BBOX): New macro. - - * src/psaux/psobjs.c (PS_Parser_LoadField): Handle T1_FIELD_TYPE_BBOX. - * src/type1/t1load.c (t1_allocate_blend): Create blend->bboxes. - (T1_Done_Blend): Free blend->bboxes. - (t1_load_keyword): Handle T1_FIELD_LOCATION_BBOX. - (parse_font_bbox): Commented out. - (t1_keywords): Comment out `parse_font_bbox'. - * src/type1/t1tokens.h: Define `FontBBox' field. - -2002-07-10 David Turner - - * src/cff/cffobjs.c: Small fix to select the Unicode charmap by - default when needed. - Small fix to allow OpenType fonts to support Adobe charmaps when - needed. - - * src/cff/cffcmap.c, src/cff/cffcmap.h: New files to support - charmaps for CFF fonts. - - * src/cff/cff.c, src/cff/Jamfile, src/cff/rules.mk: Updated. - - * include/freetype/internal/cfftypes.h (CFF_EncodingRec): Use - fixed-length arrays for `sids' and `codes'. Add `count' member. - (CFF_FontRec): Add `psnames' member. - - * src/cff/cffdrivr.c, src/cff/cffload.c, src/cff/cffload.h, - src/cff/cffobjs.c, src/cff/cffobjs.h, src/cff/cffparse.c, - src/cffparse.h, src/cff/cffgload.c, src/cff/cffgload.h: Adding - support for CFF charmaps, reformatting the sources, and removing - some bugs in the Encoding and Charset loaders. - Many fonts renamed to use lowercase only: - - CFF_Builder_Init -> cff_builder_init - CFF_Builder_Done -> cff_builder_done - CFF_Init_Decoder -> cff_decoder_init - CFF_Parse_CharStrings -> cff_decoder_parse_charstrings - CFF_Load_Glyph -> cff_slot_load - CFF_Init_Decoder -> cff_decoder_init - CFF_Prepare_Decoder -> cff_decoder_prepare - CFF_Get_Standard_Encoding -> cff_get_standard_encoding - CFF_Access_Element -> cff_index_access_element - CFF_Forget_Element -> cff_index_forget_element - CFF_Get_Name -> cff_index_get_name - CFF_Get_String -> cff_index_get_sid_string - CFF_Get_FD -> cff_fd_select_get - CFF_Done_Charset -> cff_charset_done - CFF_Load_Charset -> cff_charset_load - CFF_Done_Encoding -> cff_encoding_done - CFF_Load_Encoding -> cff_encoding_load - CFF_Done_SubFont -> cff_subfont_done - CFF_Load_Font -> cff_font_load - CFF_Done_Font -> cff_font_done - CFF_Size_Get_Global_Funcs -> cff_size_get_global_funcs - CFF_Size_Done -> cff_size_done - CFF_Size_Init -> cff_size_init - CFF_Size_Reset -> cff_size_reset - CFF_GlyphSlot_Done -> cff_slot_done - CFF_GlyphSlot_Init -> cff_slot_init - CFF_StrCopy -> cff_strcpy - CFF_Face_Init -> cff_face_init - CFF_Face_Done -> cff_face_done - CFF_Driver_Init -> cff_driver_init - CFF_Driver_Done -> cff_driver_done - CFF_Parser_Init -> cff_parser_init - CFF_Parser_Run -> cff_parser_run - - add_point -> cff_builder_add_point - add_point1 -> cff_builder_add_point1 - add_contour -> cff_builder_add_contour - close_contour -> cff_builder_close_contour - cff_explicit_index -> cff_index_get_pointers - -2002-07-09 Owen Taylor - - * src/pshinter/pshglob.c (psh_globals_new): Fixed a bug that - prevented the hinter from using correct standard width and height - values, resulting in hinting bugs with certain fonts (e.g. Utopia). - -2002-07-07 David Turner - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Added code to return - successfully when the function is called with a bitmap glyph (the - previous code simply returned with an error). - - * docs/DEBUG.TXT: Adding debugging support documentation. - - * src/base/ftdebug.c (ft_debug_init), builds/win32/ftdebug.c - (ft_debug_init), builds/amiga/src/ftdebug.c (ft_debug_init): Changed - the syntax of the FT2_DEBUG environment variable used to control - debugging output (i.e. logging and error messages). It must now - look like: - - any:6 memory:4 io:3 or - any:6,memory:4,io:3 or - any:6;memory:4;io:3 - -2002-07-07 Owen Taylor - - * src/pshinter/pshglob.c (psh_blues_snap_stem): Adding support for - blue fuzz. - * src/pshinter/pshglob.h (PSH_BluesRec): Add `blue_fuzz' field. - * src/type1/t1load.c (T1_Open_Face): Initialize `blue_fuzz'. - - Adding support for hinter-specific bit flags, and the new - FT_Set_Hint_Flags high-level API. - - * include/freetype/freetype.h (FT_Set_Hint_Flags): New function. - (FT_HINT_NO_INTEGER_STEM, FT_HINT_NO_HSTEM_ALIGN, - FT_HINT_NO_VSTEM_ALIGN): New macros. - - * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Add - `hint_flags' member. - - * src/base/ftobjs.c (FT_Set_Hint_Flags): New function. - - * include/freetype/internal/psaux.h (T1_DecoderRec): Add `hint_flags' - member. - - * include/freetype/internal/pshints.h (T1_Hints_ApplyFunc, - T2_Hints_ApplyFunc): Add parameter to pass hint flags. - - * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings, - T1_Decoder_Init): Use decoder->hint_flags. - * src/cff/cffgload.h (CFF_Builder): Add `hint_flags' field. - * src/cff/cffgload.c (CFF_Builder_Init): Set builder->hint_flags. - (CFF_Parse_CharStrings): Updated. - * src/pshinter/pshalgo1.c (ps1_hints_apply): Add parameter to handle - hint flags (unused). - * src/pshinter/pshalgo1.h: Updated. - * src/pshinter/pshalgo2.c (ps2_hints_apply): Add parameter to handle - hint flags (unused). - * src/pshinter/pshalgo2.h: Updated. - * src/pshinter/pshalgo3.c (ps3_hints_apply): Add parameter to handle - hint flags. - * src/pshinter/pshalgo3.h: Updated. - -2002-07-04 David Turner - - * src/pfr/pfrobjs.c (pfr_slot_load): Fixed a small bug that returned - incorrect advances when the outline resolution was different from - the metrics resolution. - - * src/autohint/ahhint.c: Removing compiler warnings. - - * src/autohint/ahglyph.c: s/FT_MEM_SET/FT_ZERO/ where appropriate. - (ah_outline_link_segments): Slight improvements to the serif - detection code. More work is needed though. - -2002-07-03 David Turner - - Small improvements to the automatic hinter. Uneven stem-widths have - now disappeared and everything looks much better, even if there are - still issues with serifed fonts. - - * src/autohint/ahtypes.h (AH_Globals): Added `stds' array. - * src/autohint/ahhint.c (OPTIM_STEM_SNAP): New #define. - (ah_snap_width): Commented out. - (ah_align_linked_edge): Renamed to... - (ah_compute_stem_width): This. - Don't allow uneven stem-widths. - (ah_align_linked_edge): New function. - (ah_align_serifed_edge): Don't strengthen serifs. - (ah_hint_edges_3, ah_hinter_scale_globals): Updated. - -2002-07-03 Owen Taylor - - Adding new algorithm based on Owen Taylor's recent work. - - * src/pshinter/pshalgo3.c, src/pshinter/pshalgo3.h: New files. - * src/pshinter/pshalgo.h: Updated. - Use pshalgo3 by default. - * src/pshinter/pshinter.c: Include pshalgo3.c. - - * src/pshinter/Jamfile, src/pshinter/rules.mk: Updated. - -2002-07-01 Owen Taylor - - * src/pshinter/pshalgo2.c (psh2_glyph_find_strong_points): Fix a bug - where, if a glyph has more than hint mask, the second mask gets - applied to points that should have been covered by the first mask. - -2002-07-01 Keith Packard - - * src/sfnt/ttcmap0.c (tt_cmap8_char_next, tt_cmap12_char_next): - Fixing the cmap 8 and 12 parsing routines. - -2002-07-01 David Turner - - * src/base/ftsynth.c: Include FT_TRIGONOMETRY_H. - (FT_Outline_Embolden): Renamed to... - (FT_GlyphSlot_Embolden): This. - Updated to new trigonometric functions. - (FT_Outline_Oblique): Renamed to... - (FT_GlyphSlot_Oblique): This. - (ft_norm): Removed. - * include/freetype/ftsynth.h: Updated. - -2002-06-26 David Turner - - * include/freetype/internal/ftobject.h: Updating the object - sub-system definitions (still experimental). - - * src/base/fthash.c (ft_hash_remove): Fixing a small reallocation - bug. - - * src/base/fttrigon.c (FT_Vector_From_Polar, FT_Angle_Diff): New - functions. - * include/freetype/fttrigon.h: Updated. - - - Adding path stroker component (work in progress). - - * include/freetype/ftstroker.h, src/base/ftstroker.c: New files. - * src/base/Jamfile: Updated. - - * include/freetype/config/ftheader.h (FT_STROKER_H): New macro. - - - * src/truetype/ttgload.c (TT_Load_Composite_Glyph), - src/base/ftoutln.c (FT_Vector_Transform): Fixed Werner's latest fix. - FT_Vector_Transform wasn't buggy, the TrueType composite loader was. - -2002-06-24 Werner Lemberg - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3. - -2002-06-21 David Turner - - - * Version 2.1.2 released. - ========================= - - -2002-06-21 Roberto Alameda . - - * include/freetype/internal/t42types.h (T42_Font): Removed since - it is already in t42objs.h. - (T42_Face): Use T1_FontRec. - - * src/base/fttype1.c (FT_Get_PS_Font_Info): Updated. - (FT_Has_PS_Glyph_Names): Check for type42 driver name also. - * src/type42/t42objs.h: Include FT_INTERNAL_TYPE42_TYPES_H. - (T42_Face): Removed since it is already in t42types.h. - -2002-06-21 Detlef Würkner - - * src/pfrgload.c (pfr_glyph_load_compound): Fix loading of composite - glyphs. - -2002-06-21 Sven Neumann - - * src/prf/pfrtypes.h (PFR_KernPair): New structure. - (PFR_PhyFont): Use it. - (PFR_KernFlags): New enumeration. - * src/pfr/pfrload.c (pfr_extra_item_load_kerning_pairs): New - function. - (pfr_phy_font_extra_items): Use it. - (pfr_phy_font_done): Updated. - * src/pfr/pfrobjs.c (pfr_face_init): Set kerning flag conditionally. - (pfr_face_get_kerning): New function. - * src/pfr/pfrobjs.h: Updated. - * src/pfr/pfrdrivr.c (pfr_driver_class): Updated. - -2002-06-21 David Turner - - * README, docs/CHANGES: Preparing the 2.1.2 release. - -2002-06-19 Detlef Würkner - - * src/base/fttype1.c: Include FT_INTERNAL_TYPE42_TYPES_H. - (t1_face_check_cast): Removed. - (FT_Get_PS_Font_Info): Make it work with CID and Type 42 drivers - also. - -2002-06-19 Sebastien BARRE - - * src/type42/t42parse.c (t42_parse_sfnts): Fix compiler warning. - -2002-06-19 Werner Lemberg - - * src/base/ftoutln.c (FT_Vector_Transform): Fix serious typo - (xy <-> yx). - * src/truetype/ttgload.c (load_truetype_glyph): Replace `|' with - `||' to make code easier to read. - -2002-06-18 Roberto Alameda . - - * src/type42/t42objs.c (t42_check_size_change): Removed. - (T42_Size_SetChars, T42_Size_SetPixels): Use FT_Activate_Size - instead. - (T42_GlyphSlot_Load): Remove call to t42_check_size_change. - -2002-06-18 Detlef Würkner - - * src/psaux/t1cmap.c (t1_cmap_custom_char_index, - t1_cmap_custom_char_next): Fix index computation -- indices start - with 0 and not with cmap->first. - - Provide default charmaps. - - * src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfdriver.c - (PCF_Face_Init), src/pfr/pfrobjs.c (pfr_face_init), - src/type1/t1objs (T1_Face_Init), src/winfonts/winfnt.c - (FNT_Face_Init): Implement it. - -2002-06-17 Sven Neumann - - * src/pfr/pfrobjs.c (pfr_face_init): Fix typo. - -2002-06-16 Leonard Rosenthol - - Updated Win32/VC++ projects to include the new PFR driver. - - * builds/win32/visualc/freetype.dsp: Updated. - -2002-06-16 Anthony Fok - - Install freetype2.m4. - - * builds/unix/install.mk (install, uninstall): Handle it. - -2002-06-16 Detlef Würkner - - Same fix for PFR driver. - - * src/pfr/pfrcmap.c (pfr_cmap_char_index, pfr_cmap_char_next): - Increase return value by 1. - * src/pfr/pfrobjs.c (pfr_slot_load): Decrease index by 1. - -2002-06-15 Detlef Würkner - - Fix glyph indices to make index zero always the undefined glyph. - - * src/bdf/bdfdrivr.c (bdf_cmap_init): Don't decrease - cmap->num_encodings. - (bdf_cmap_char_index, bdf_cmap_char_next, BDF_Get_Char_Index): - Increase result by 1 for normal cases. - (BDF_Glyph_Load): Decrease index by 1. - - * src/pcf/pcfdriver.c (pcf_cmap_char_index, pcf_cmap_char_next, - PCF_Char_Get_Index): Increase result by 1 for normal cases. - (PCF_Glyph_Load): Decrease index by 1. - * src/pcf/pcfread.c (pcf_get_encodings): Don't decrease j for - allocating `encoding'. - - * src/base/ftobjs.c (FT_Load_Glyph, FT_Get_Glyph_Name): Fix - bounding tests. - -2002-06-14 Detlef Würkner - - Add new cmap support to BDF driver. - - * src/bdf/bdfdrivr.c (BDF_CMapRec) [FT_CONFIG_OPTION_USE_CMAPS]: - New structure. - (bdf_cmap_init, bdf_cmap_done, bdf_cmap_char_index, - bdf_cmap_char_next) [FT_CONFIG_OPTION_USE_CMAPS]: New functions. - (BDF_Get_Char_Index) [!FT_CONFIG_OPTION_USE_CMAPS]: Use only - conditionally. - (BDF_Face_Init): Handle `AVERAGE_WIDTH' and `POINT_SIZE' keywords. - Implement new cmap handling. - (bdf_driver_class): Updated. - -2002-06-14 Werner Lemberg - - * Makefile, configure, */*.mk, builds/unix/unix-def.in, - docs/CHANGES, docs/INSTALL: s/TOP/TOP_DIR/. - -2002-06-12 Werner Lemberg - - * src/bdf/bdflib.c: s/FT_Short/short/ for consistency. - -2002-06-11 David Turner - - * builds/win32/ftdebug.c: Added a missing #endif. - - * src/sfnt/ttload.c, src/bdf/bdflib.c: Removing compiler warnings. - - Removed the bug in Type 42 driver that prevented un-hinted outlines - to be loaded. - - * src/type42/t42objs.c (T42_Face_Init): Call FT_Done_Size. - (T42_Size_Init): Call FT_Activate_Size. - (t42_check_size_change): New function. - (T42_Size_SetChars, T42_Size_SetPixels): Use it. - (ft_glyphslot_clear): Replace FT_MEM_SET with FT_ZERO. - (T42_GlyphSlot_Load): Use t42_check_size_change. - Initialize more fields of `glyph'. - - * builds/win32/visualc/freetype.dsp: Updated. - -2002-06-09 David Turner - - - * Version 2.1.1 released. - ========================= - - -2002-06-08 Juliusz Chroboczek - - * include/freetype/internal/ftobjs.h, src/autohint/ahglyph.c, - src/base/ftobjs.c, src/sfnt/ttcmap0.c, src/smooth/ftgrays.c: Don't - use `setjmp', `longjmp', and `jmp_buf' but `ft_setjmp', `ft_longjmp', - and `ft_jmp_buf'. - Removed direct references to and when - appropriate, to eventually replace them with a - FT_CONFIG_STANDARD_LIBRARY_H. Useful for the XFree86 Font Server - backend based on FT2. - - * src/base/fttype1.c (FT_Has_PS_Glyph_Names): Fix return value. - -2002-06-08 David Turner - - * src/pcf/pcfdriver.c (pcf_cmap_char_next): Fixed a bug that caused - the function to return invalid values. - - * src/cache/ftccache.i: Removing a typo that prevented - the source's compilation. - - * src/cache/ftccache.c (ftc_node_hash_unlink): Fixed a - bug that caused nasty memory overwrites. The hash table's - buckets array wasn't correctly resized when shrunk. - -2002-06-08 Detlef Würkner - - * builds/amiga/smakefile, builds/amiga/makefile: Updated. - -2002-06-08 Werner Lemberg - - * src/cache/ftccache.c (ftc_node_hash_unlink, ftc_node_hash_link) - [FTC_CACHE_USE_LINEAR_HASHING]: Fix returned error code. - Fix debugging messages. - * src/cache/ftccache.i (GEN_CACHE_LOOKUP): Move declaration of - `family' and `hash' up to make it compilable with g++. - - * src/type42/t42error.h: New file. - * src/type42/t42drivr.c, src/type42/t42objs.c, - src/type42/t42parse.c: Use t42 error codes. - * src/type42/rules.mk: Updated. - - * src/base/ftnames.c: Include FT_INTERNAL_STREAM_H. - -2002-06-08 David Turner - - * src/cache/ftccmap.c: GEN_CACHE_FAMILY_COMPARE, - GEN_CACHE_NODE_COMPARE, GEN_CACHE_LOOKUP) [FTC_CACHE_USE_INLINE]: - New macros. - (ftc_cmap_cache_lookup) [!FTC_CACHE_USE_INLINE]: Typedef to - ftc_cache_lookup. - (FTC_CMapCache_Lookup): Updated. - - Adding various experimental optimizations to the cache manager. - - * include/freetype/cache/ftccache.h (FTC_CACHE_USE_INLINE, - FTC_CACHE_USE_LINEAR_HASHING): New options. - (FTC_CacheRec) [FTC_CACHE_USE_LINEAR_HASHING]: New elements `p', - `mask', and `slack'. - - * src/cache/ftccache.c (FTC_HASH_MAX_LOAD, FTC_HASH_MIN_LOAD, - FTC_HASH_SUB_LOAD) [FTC_CACHE_USE_LINEAR_HASHING, - FTC_HASH_INITIAL_SIZE]: New macros. - (ftc_node_mru_link, ftc_node_mru_up): Optimized. - (ftc_node_hash_unlink, ftc_node_hash_link) - [FTC_CACHE_USE_LINEAR_HASHING]: New variants. - (FTC_PRIMES_MIN, FTC_PRIMES_MAX, ftc_primes, ftc_prime_closest, - FTC_CACHE_RESIZE_TEST, ftc_cache_resize) - [!FTC_CACHE_USE_LINEAR_HASHING]: Define it conditionally. - (ftc_cache_init, ftc_cache_clear) [FTC_CACHE_USE_LINEAR_HASHING]: - Updated. - (ftc_cache_lookup) [FTC_CACHE_USE_LINEAR_HASHING]: Implement it. - - * src/cache/ftccache.i: New file. - - * src/cache/ftcsbits.c (GEN_CACHE_FAMILY_COMPARE, - GEN_CACHE_NODE_COMPARE, GEN_CACHE_LOOKUP) [FTC_CACHE_USE_INLINE]: - New macros. - (ftc_sbit_cache_lookup) [!FTC_CACHE_USE_INLINE]: Typedef to - ftc_cache_lookup. - (FTC_SBitCache_Lookup): Updated. - - * src/type42/t42parse.c: Removing duplicate function. - -2002-06-07 Graham Asher - - * src/base/ftobjs.c (FT_Render_Glyph_Internal): Changed definition - from FT_EXPORT_DEF to FT_BASE_DEF. - -2002-06-07 David Turner - - Fixed the bug that prevented the correct display of fonts with - `ftview'. - - * src/type42/t42drivr.c: Split into... - * src/type42/t42drivr.h, src/type42/t42parse.c, - src/type42/t42parse.h, src/type42/t42objs.h, src/type42/t42objs.c, - src/type42/type42.c: New files. - - (t42_get_glyph_name, t42_get_ps_name, t42_get_name_index): Use - `face->type1'. - - (Get_Interface): Renamed to... - (T42_Get_Interface): This. - Updated. - (T42_Open_Face, T42_Face_Done): Updated. - (T42_Face_Init): Add new cmap support. - Updated. - (T42_Driver_Init, T42_Driver_Done, T42_Size_Init, T42_Size_Done, - T42_GlyphSlot_Init, T42_GlyphSlot_Done): Updated. - (Get_Char_Index, Get_Next_Char): Renamed to... - (T42_CMap_CharIndex, T42_CMap_CharNext): This. - Updated. - (T42_Char_Size, T42_Pixel_Size): Renamed to... - (T42_Size_SetChars, T42_Size_SetPixels): This. - (T42_Load_Glyph): Renamed to... - (T42_GlyphSlot_Load): This. - - (t42_init_loader, t42_done_loader): Renamed to... - (t42_loader_init, t42_loader_done): This. - (T42_New_Parser, T42_Finalize_Parser): Renamed to... - (t42_parser_init, t42_parser_done): This. - (parse_dict): Renamed to... - (t42_parse_dict): This. - (is_alpha, is_space, hexval): Renamed to... - (t42_is_alpha, t42_is_space, t42_hexval): This. - (parse_font_name, parse_font_bbox, parse_font_matrix, - parse_encoding, parse_sfnts, parse_charstrings, parse_dict): - Renamed to... - (t42_parse_font_name, t42_parse_font_bbox, t42_parse_font_matrix, - t42_parse_encoding, t42_parse_sfnts, t42_parse_charstrings, - t42_parse_dict): This. - Updated. - - (t42_keywords): Updated. - - * src/type42/Jamfile, src/type42/descrip.mms: Updated. - -2002-06-03 Werner Lemberg - - Add 8bpp support to BDF driver. - - * src/bdf/bdflib.c (_bdf_parse_start): Handle 8bpp. - * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Ditto. - * src/bdf/README: Updated. - -2002-06-02 Detlef Würkner - - * src/pfr/pfrload.c (pfr_phy_font_done): Free `blue_values' array. - -2002-05-29 Detlef Würkner - - * src/bdf/bdflib.c (_bdf_readstream): Allocate `buf' dynamically. - (_bdf_parse_glyphs): Use correct size for allocating - `font->unencoded'. - (bdf_load_font): Free array conditionally. - Return proper error code in case of failure. - * src/bdf/bdfdrivr.c (BDF_Face_Init): Make it more robust against - unusual fonts. - -2002-05-29 Werner Lemberg - - * src/bdf/descrip.mms, src/type42/descrip.mms: New files. - * descrip.mms (all): Updated. - - * src/bdf/bdflib.c (_bdf_parse_glyphs): Fix typo which prevented - compilation. - * src/pshglob.c (psh_blues_scale_zones): Fix compiler warning. - -2002-05-28 Detlef Würkner - - * builds/amiga/makefile, builds/amiga/smakefile, - amiga/include/freetype/config/ftmodule.h: Updated to include - support for BDF and Type42 drivers. - - * docs/modules.txt: Updated. - -2005-05-28 David Turner - - * docs/CHANGES: Updating file for next release (2.1.1). - - * src/bdf/bdflib.c: Removing compiler warnings. - - * include/freetype/ftxf86.h, src/base/ftxf86.c: New files. - They provide a new API (FT_Get_X11_Font_Format) to retrieve an - X11-compatible string describing the font format of a given face. - This was put in a new optional base source file, corresponding to a - new public header (named FT_XFREE86_H since this function should - only be used within the XFree86 font server IMO). - - * include/freetype/config/ftheader.h (FT_XFREE86_H): New macro (not - documented yet). - - * src/base/fttype1.c: New file, providing two new API functions - (FT_Get_PS_Font_Info and FT_Has_PS_Glyph_Names). - * include/freetype/t1tables.h: Updated. - - * src/base/Jamfile, src/base/rules.mk, src/base/descrip.mms: - Updating build control files for the new files `ftxf86.c' and - `fttype1.c' in src/base. - - * src/pshinter/pshglob.c (psh_blues_scale_zones): Fixed a bug that - prevented family blue zones substitution from hapenning correctly. - - * include/freetype/ftbdf.h FT_Get_BDF_Charset_ID): Adding - documentation comment. - -2002-05-28 Werner Lemberg - - * src/base/ftnames.c (FT_Get_Sfnt_Name): Don't use FT_STREAM_READ_AT - but FT_STREAM_READ. - Declare `stream' variable. - - * src/bdf/bdflib.c (_bdf_parse_glyphs): Replace floating point math - with calls to `FT_MulDiv'. - -2002-05-28 David Turner - - Fixing the SFNT name table loader to support various buggy fonts. - It now ignores empty name entries, entries with invalid pointer - Offsets and certain fonts containing tables with broken - `storageOffset' fields. - - Name strings are now loaded on demand, which reduces the memory - requirements for a given FT_Face tremendously (for example, the name - table of Arial.ttf is about 10Kb and contains 70 names). - - This is a temporary fix. The whole name table loader and interface - will be rewritten in a much more cleanly way shortly, once CSEH have - been introduced in the sources. - - * include/freetype/internal/tttypes.h (TT_NameEntryRec): Change - type of `stringOffset' to FT_ULong. - (TT_NameTableRec): Change type of `numNameRecords' and - `storageOffset' to FT_UInt. - Replace `storage' with `stream'. - * src/base/ftnames.c (FT_Get_Sfnt_Name): Load name on demand. - * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Ditto. - Make code more robust. - * src/sfnt/sfobjs.c (TT_NameEntry_ConvertFunc): New typedef. - (tt_face_get_name): Use it. - Make code more robust. - * src/sfnt/ttload.c (TT_Load_Names): Use `static' for arrays. - Handle invalid `storageOffset' data better. - Set length fields to zero for invalid or ignored data. - Remove code within FT_DEBUG_LEVEL_TRACE. - (TT_Free_Names): Updated. - -2002-05-24 Tim Mooney - - * builds/unix/ft-munmap.m4: New file, extracted FT_MUNMAP_DECL and - FT_MUNMAP_PARAM from aclocal.m4 into here, so aclocal.m4 can be - rebuilt from sources. Set macro serial to 1, and use third argument - to AC_DEFINE for our two custom symbols, so ftconfig.in could one day - be rebuilt with autoheader (not recommended now, ftconfig.in is a - custom source file) - -2002-05-22 Werner Lemberg - - * include/freetype/config/ftheader.h (FT_BEZIER_H): Removed. - (FT_BDF_H): New macro for accessing `ftbdf.h'. - - * src/type42/t42drivr.c (hexval): Fix typo. - -2002-05-21 Martin Muskens - - * src/psaux/psobjs.c (T1Radix): New function. - (t1_toint): Use it to handle numbers in radix format. - - * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Add dummy - for undocumented, obsolete opcode 15. - -2002-05-21 David Turner - - * src/bdf/bdflib.c: Removed compiler warning, and changed all tables - to the `static const' storage specifier (instead of simply - `static'). - - * src/type42/t42drivr.c (hexval): Use more efficient code. - Removing compiler warnings. - * src/bdf/bdfdrivr.c: Removing compiler warnings. - - * include/freetype/internal/ftbdf.h, src/base/ftbdf.c, - src/base/descrip.mms, src/base/Jamfile, src/base/rules.mk - (FT_Get_BDF_Charset_ID): New API to retrieve BDF-specific strings - from a face. This is much cleaner than accessing the internal types - `BDF_Public_Face' defined in FT_INTERNAL_BDF_TYPES_H. - -2002-05-21 Werner Lemberg - - * src/bdf/README: Mention Microsoft's SBIT tool. - - * src/cff/cffdrivr.c, src/cid/cidriver.c, src/pcf/pcfdriver.c, - src/truetype/ttdriver.c, src/type1/t1driver.c, - src/winfonts/winfnt.c, src/type42/t42drivr.c, src/bdf/bdfdrivr.c - [FT_CONFIG_OPTION_DYNAMIC_DRIVERS]: Completely removed. It has - been never used. - -2002-05-21 Roberto Alameda . - - * src/type42/t42drivr.c: s/T42_ENCODING_TYPE_/T1_ENCODING_TYPE_/. - (parse_font_matrix): Remove unnecessary code. - (parse_sfnts): Initialize some variables. - (t42_driver_class) [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Use - ft_module_driver_has_hinter conditionally. - Moved some type 42 specific structure definitions to... - * include/freetype/internal/t42types.h: New file. - * include/freetype/internal/internal.h (FT_INTERNAL_T42_TYPES_H): - New macro. - -2002-05-20 Werner Lemberg - - * include/freetype/cache/ftcsbits.h (FTC_SBit): Added a new field - `num_grays' for specifying the number of used gray levels. - * src/cache/ftcsbits.c (ftc_sbit_node_load): Initialize it. - -2002-05-19 Werner Lemberg - - Adding a driver for BDF fonts written by Francesco Zappa Nardelli - . Heavily modified by me to - better adapt it to FreeType, removing unneeded stuff. Additionally, - it now supports Mark Leisher's BDF extension for anti-aliased - bitmap glyphs with 2 and 4 bpp. - - * src/bdf/*: New driver. - * include/freetype/internal/bdftypes.h: New file. - * include/freetype/internal/fttrace.h: Added BDF driver components. - * include/freetype/fterrdef.h: Added error codes for BDF driver. - * include/freetype/config/ftmodule.h, src/Jamfile: Updated. - * include/freetype/internal/internal.h (FT_INTERNAL_BDF_TYPES_H): - New macro. - - * include/freetype/config/ftstdlib.h (ft_sprintf): New alias for - sprintf. - -2002-05-18 Werner Lemberg - - * include/freetype/internal/fttrace.h: Added Type 42 driver - component. - * src/type42/t42drivr.c: Use it. - - * include/freetype/internal/internal.h (FT_INTERNAL_PCF_TYPES_H): - New macro. - -2002-05-17 Werner Lemberg - - * src/type42/Jamfile: New file. - -2002-05-14 Werner Lemberg - - Adding a driver for Type42 fonts written by Roberto Alameda - . - - * src/type42/*: New driver. - * include/freetype/config/ftmodule.h, src/Jamfile: Updated. - * include/freetype/config/ftstdlib.h (ft_xdigit, ft_memcmp, - ft_atoi): New aliases for xdigit, memcmp, and atoi, respectively. - -2002-05-12 Owen Taylor - - * src/sfnt/ttload.c (TT_LookUp_Table): Protect against tables - with a zero length value. - -2002-05-12 Michael Pfeiffer - - * builds/beos/beos.mk: Include `link-std.mk'. - -2002-05-12 Werner Lemberg - - * src/type1/t1load.h (T1_Loader): Renamed to... - (T1_LoaderRec): This. - (T1_Loader): Now pointer to T1_LoaderRec. - * src/type1/t1load.c: Updated. - - * include/freetype/internal/t1types.h, src/type1/t1load.c, - src/type1/t1objs.c: - s/T1_ENCODING_TYPE_EXPORT/T1_ENCODING_TYPE_EXPERT/. - -2002-05-06 Werner Lemberg - - * README: Add a note regarding libttf vs. libfreetype. - -2002-05-05 Werner Lemberg - - FreeType 2 can now be built in an external directory with the - configure script also. - - * builds/freetype.mk (INCLUDES): Add `OBJ_DIR'. - - * builds/unix/detect.mk (have_mk): New variable to test for - external build. - (unix-def.mk): Defined according to value of `have_mk'. - * builds/unix/unix.mk (have_mk): New variable to test for - external build. - Select include paths for unix-def.mk and unix-cc.mk according - to value of `have_mk'. - * builds/unix/unix-def.in (OBJ_BUILD): New variable. - (DISTCLEAN): Use it. - * builds/unix/unix-cc.in (LIBTOOL): Define default value only - if not yet defined. - * builds/unix/install.mk (install): Use `OBJ_BUILD' for installing - freetype-config. - - * configure: Don't depend on bash features. - (ft2_dir, abs_curr_dir, abs_ft2_dir): New variables (code - partially taken from Autoconf). - Build a dummy Makefile if not building in source tree. - - * docs/INSTALL: Document it. - -2002-05-04 David Turner - - * src/truetype/ttgload.c (TT_Load_Glyph): Finally fixing the last - bug that prevented FreeType 2.x and FreeType 1.x to produce - bit-by-bit identical monochrome glyph bitmaps with native TrueType - hinting. The culprit was a single-bit flag that wasn't set - correctly by the TrueType glyph loader. - - * src/otlayout/otlayout.h, src/otlayout/otlbase.c, - src/otlayout/otlbase.h, src/otlayout/otlconf.h, - src/otlayout/otlgdef.c, src/otlayout/otlgdef.h, - src/otlayout/otlgpos.c, src/otlayout/otlgpos.h, - src/otlayout/otlgsub.c, src/otlayout/otlgsub.h, - src/otlayout/otljstf.c, src/otlayout/otljstf.h, - src/otlayout/otltable.c, src/otlayout/otltable.h, - src/otlayout/otltags.h: New OpenType Layout source files. The - module is still incomplete. - -2002-05-02 Werner Lemberg - - * src/sfnt/ttcmap0.c (tt_cmap4_char_index): Fix serious typo - (0xFFFU -> 0xFFFFU). - -2002-05-01 Werner Lemberg - - * docs/INSTALL: Fix URL of makepp. - -2002-05-01 David Turner - - * src/sfnt/sfobjs.c (tt_face_get_name): Fixing a bug that caused - FreeType to crash when certain broken fonts (e.g. `hya6gb.ttf') - were opened. - - * src/sfnt/ttload.c (TT_Load_Names): Applied a small work-around to - manage fonts containing a broken name table (e.g. `hya6gb.ttf'). - - * src/sfnt/ttcmap0.c (tt_cmap4_validate): Fixed over-restrictive - validation test. The charmap validator now accepts overlapping - ranges in format 4 charmaps. - - * src/sfnt/ttcmap0.c (tt_cmap4_char_index): Switched to a binary - search algorithm. Certain fonts contain more than 170 distinct - segments! - - * include/freetype/config/ftstdlib.h: Adding an alias for the `exit' - function. This will be used in the near future to panic in case of - unexpected exception (which shouldn't happen in theory). - - * include/freetype/internal/fthash.h, src/base/fthash.c: New files. - This is generic implementation of dynamic hash tables using a linear - algorithm (to get rid of `stalls' during resizes). In the future - this will be used in at least three parts of the library: the cache - sub-system, the object sub-system, and the memory debugger. - - * src/base/Jamfile: Updated. - - * include/freetype/internal/internal.h (FT_INTERNAL_HASH_H, - FT_INTERNAL_OBJECT_H): New macros. - - * include/freetype/internal/ftcore.h: New file to group all new - definitions related to exception handling and memory management. It - is very likely that this file will disappear or be renamed in the - future. - - * include/freetype/internal/ftobject.h, include/freetype/ftsysmem.h: - Adding comments to better explain the object sub-system as well as - the new memory manager interface. - -2002-04-30 Wenlin Institute (Tom Bishop) - - * src/base/ftmac.c (p2c_str): Removed. - (file_spec_from_path) [TARGET_API_MAC_CARBON]: Added support for - OS X. - (is_dfont) [TARGET_API_MAC_CARBON]: Define only for OS X. - Handle `nameLen' <= 6 also. - (parse_fond): Remove unused variable `name_table'. - Use functionality of old p2c_str directly. - Add safety checks. - (read_lwfn): Initialize `size_p'. - Check for size_p == NULL. - (new_memory_stream, open_face_from_buffer): Updated to FreeType 2.1. - (FT_New_Face_From_LWFN): Remove unused variable `memory'. - Remove some dead code. - (FT_New_Face_From_SFNT): Remove unused variable `stream'. - (FT_New_Face_From_dfont) [TARGET_API_MAC_CARBON]: Define only for - OS X. - (FT_New_Face_From_FOND): Remove unused variable `error'. - (ResourceForkSize): New function. - (FT_New_Face): Use it. - Handle empty resource forks. - Conditionalize some code for OS X. - Add code to call normal loader as a fallback. - -2002-04-30 Werner Lemberg - - `interface' is reserved on the Mac. - - * include/freetype/ftoutln.h, include/freetype/internal/sfnt.h, - src/base/ftoutln.c: s/interface/func_interface/. - * src/base/ftbbox.c (FT_Outline_Get_BBox): - s/interface/bbox_interface/. - * src/cff/cffdrivr.c: s/interface/module_interface/. - * src/cff/cffload.c, src/cff/cffload.h: - s/interface/psnames_interface/. - * src/cid/cidriver.c: s/interface/cid_interface/. - * src/sfnt/sfdriver.c: s/interface/module_interface/. - * src/smooth/ftgrays.c: s/interface/func_interface/. - * src/truetype/ttdriver.c: s/interface/tt_interface/. - * src/type1/t1driver.c: s/interface/t1_interface/. - - Some more variable renames to avoid troubles on the Mac. - - * src/raster/ftraster.c: - s/Unknown|Ascending|Descending|Flat/\1_State/. - * src/smooth/ftgrays.c: s/TScan/TCoord/. - - Other changes for the Mac. - - * include/freetype/config/ftconfig.h: Define FT_MACINTOSH for - Mac platforms. - * src/base/ftobjs.c: s/macintosh/FT_MACINTOSH/. - - * src/raster/ftrend1.c (ft_raster1_render): Make `pitch' always - an even number. - -2002-04-29 Jouk Jansen - - * descrip.mms (all): Add pfr driver. - -2002-04-28 Werner Lemberg - - * src/pfr/pfrerror.h: New file. - * include/freetype/ftmoderr.h: Add PFR error codes. - * src/pfr/pfrgload.c: Include pfrerror.h. - Use PCF error codes. - (pfr_extra_item_load_stem_snaps): Fix debug message. - * src/pfr/pfrgload.c: Include pfrerror.h. - Use PCF error codes. - (pfr_extra_item_load_bitmap_info, pfr_glyph_load_simple, - pfr_glyph_load_compound): Fix debug message. - * src/pfr/pfrobjs.c: Include pfrerror.h. - Use PCF error codes. - (pfr_face_init): Return PFR_Err_Unknown_File_Format. - * src/pfr/rules.mk (PFR_DRV_H): Include pfrerror.h. - - * src/pcf/pcfdriver.c (PCF_Face_Init) [!FT_CONFIG_OPTION_USE_CMAPS]: - `root' -> `face->root'. - * src/sfnt/ttcmap0.c (TT_Build_CMaps) [!FT_CONFIG_OPTION_USE_CMAPS]: - Removed. - * src/sfnt/ttcmap0.c: Declare TT_Build_CMaps only for - FT_CONFIG_OPTION_USE_CMAPS. - -2002-04-27 Werner Lemberg - - * src/cache/ftccache.c (ftc_cache_lookup), - src/cache/ftccmap.c (ftc_cmap_family_init), - src/cache/ftcmanag.c (ftc_family_table_alloc), - src/cache/ftcsbits.c (FTC_SBit_Cache_Lookup): Use FTC_Err_*. - src/cache/ftcimage.c (FTC_Image_Cache_Lookup): Use FTC_Err_*. - (FTC_ImageCache_Lookup): Fix handling of invalid arguments. - -2002-04-22 Werner Lemberg - - * builds/unix/configure.ac: Set `version_info' to 9:1:3 (FT2 - version 2.0.9 has 9:0:3). - * builds/unix/configure: Regenerated (using autoconf 2.53). - -2002-04-19 Werner Lemberg - - * src/pfr/pfrload.c (pfr_extra_items_farse): Fix debug message. - (pfr_phy_font_load): s/size/Size/ for local variable to avoid - compiler warning. - * src/pfr/pfrobjs.c (pfr_face_init): Fix debug message. - (pfr_slot_load): Remove redundant local variable. - -2002-04-19 David Turner - - Adding a PFR font driver to the FreeType sources. Note that it - doesn't support embedded bitmaps or kerning tables yet. - - src/pfr/*: New files. - - * include/freetype/config/ftmodule.h, - include/freetype/internal/fttrace.h, src/Jamefile: Updated. - - * src/type1/t1gload.h (T1_Load_Glyph), src/type1/t1gload.c - (T1_Load_Glyph): Fixed incorrect parameter sign-ness in callback - function. - - * include/freetype/internal/ftmemory.h (FT_MEM_ZERO, FT_ZERO): New - macros. - - * include/freetype/internal/ftstream.h (FT_NEXT_OFF3, FT_NEXT_UOFF3, - FT_NEXT_OFF3_LE, FT_NEXT_UOFF3_LE): New macros to parse in-memory - 24-bit integers. - -2002-04-18 David Turner - - * src/base/ftobjs.c, builds/win32/ftdebug.c, - builds/amiga/src/base/ftdebug.c: Version 2.1.0 couldn't be linked - against applications in Win32 and Amiga builds due to changes to - `src/base/ftdebug.c' that were not properly propagated to - `builds/win32' and `builds/amiga'. This has been fixed. - - * include/freetype/internal/ftobject.h, - include/freetype/internal/ftexcept.h, include/freetype/ftsysmem.h, - include/freetype/ftsysio.h, src/base/ftsysmem.c, src/base/ftsysio.c: - New experimental files. - -2002-04-17 David Turner - - - * Version 2.1.0 released. - ========================= - - -2002-04-17 Michael Jansson - - * src/type1/t1gload.c (T1_Compute_Max_Advance): Fixed a small bug - that prevented the function to return the correct value. - -2002-04-16 Francesco Zappa Nardelli - - * src/pcf/pcfread (pcf_get_accell): Fix parsing of accelerator - tables. - -2002-04-15 David Turner - - * docs/FTL.txt: Formatting. - - * include/freetype/config/ftoption.h: Reduce the size of the - render pool from 32kByte to 16kByte. - - * src/pcf/pcfread.c (pcf_seek_to_table_type): Remove compiler - warning. - - * include/freetype/config/ftoption.h (FT_MAX_EXTENSIONS): Removed. - - * docs/CHANGES: Preparing 2.1.0 release. - -2002-04-13 Werner LEMBERG - - * src/cff/cffgload.c (CFF_Parse_CharStrings): s/rand/Rand/ to avoid - compiler warning. - -2002-04-12 David Turner - - * README.UNX: Updated the Unix-specific quick-compilation guide to - warn about the GNU Make requirement at compile time. - - * include/freetype/config/ftstdlib.h, - include/freetype/config/ftconfig.h, - include/freetype/config/ftheader.h, - include/freetype/internal/ftmemory.h, - include/freetype/internal/ftobjs.h, - - src/autohint/ahoptim.c, - - src/base/ftdbgmem.c, src/base/ftdebug.c, src/base/ftmac.c, - src/base/ftobjs.c, src/base/ftsystem.c, - - src/cache/ftcimage.c, src/cache/ftcsbits.c, - - src/cff/cffdriver.c, src/cff/cffload.c, src/cff/cffobjs.c, - - src/cid/cidload.c, src/cid/cidparse.c, src/cid/cidriver.c, - - src/pcf/pcfdriver.c, src/pcf/pcfread.c, - - src/psaux/t1cmap.c, src/psaux/t1decode.c, - - src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.c, - src/pshinter/pshrec.c, - - src/psnames/psmodule.c, - - src/raster/ftraster.c, - - src/sfnt/sfdriver.c, src/sfnt/ttload.c, - - src/smooth/ftgrays.c, - - src/type1/t1afm.c, src/type1/t1driver.c, src/type1/t1gload.c, - src/type1/t1load.c, src/type1/t1objs.c, src/type1/t1parse.c, - - builds/unix/ftconfig.in, builds/vms/ftconfig.h, - - builds/amiga/src/base/ftdebug.c: - - Added the new configuration file `ftstdlib.h' used to define - aliases for all ISO C library functions used by the engine - (e.g. strlen, qsort, setjmp, etc.). - - This eases the porting of FreeType 2 to environments like - XFree86 modules/extensions. - - Also removed many #include , #include , etc. - from the engine's sources where they are not needed. - - * src/sfnt/ttpost.c: Use macro name for psnames.h. - -2002-04-12 Vincent Caron - - * configure, builds/detect.mk: Updated the build system to print - a warning message in case GNU Make isn't used to build the library. - -2002-04-11 David Turner - - * README, docs/CHANGES, Jamfile.in: Updates for the 2.1.0 release. - - * docs/FTL.txt: Updated license text to provide a preferred - disclaimer and adjust copyright dates/extents. - - * include/freetype/cache/ftcglyph.h: Removing obsolete (and - confusing) comment. - - * Jamfile.in: New file. - -2002-04-11 Maxim Shemanarev - - * src/smooth/ftgrays.c (gray_hline): Minor optimization. - -2002-04-02 Werner Lemberg - - Fixes from the stable branch: - - * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_OLD_CALCS): - Removed. - [FT_CONFIG_OPTION_OLD_CALCS]: Removed. - * include/freetype/internal/ftcalc.h, src/base/ftcalc.c - [FT_CONFIG_OPTION_OLD_CALCS]: Removed. - - * src/base/fttrigon.c (FT_Vector_Length): Change algorithm to match - output of FreeType 1. - - * src/pshinter/pshglob.c (psh_globals_scale_widths): Fixed a small - bug that created un-even stem widths when hinting Postscript fonts. - - * src/type1/t1driver.c, src/type1/t1parse.c: 16bit fixes. - -2002-04-01 Werner Lemberg - - * src/truetype/ttgload.c: 16bit fixes. - (TT_Load_Simple_Glyph): Improve debug messages. - (load_truetype_glyph): Remove dead code. - * src/truetype/ttinterp.c: 16bit fixes. - * src/truetype/ttobjs.c: Ditto. - - * include/freetype/ftsnames.h, include/freetype/internal/sfnt.h, - src/cff/cffload.h, src/psaux/psobjs.h, src/truetype/ttinterp.[ch], - src/sfnt/ttpost.h: s/index/idx/. - -2002-03-31 Yao Zhang - - * src/truetype/ttobjs.c (TT_Size_Init): Fix typo. - -2002-03-31 Werner Lemberg - - * src/otlayout/otlcommn.c, src/otlayout/otlcommn.h: s/index/idx/. - * src/psaux/t1cmap.c: Ditto. - * src/sfnt/ttcmap0.c: Ditto. - - * include/freetype/internal/tttypes.h, - include/freetype/internal/sfnt.h (TT_Goto_Table_Func): Renamed to ... - (TT_Loader_GotoTableFunc): This. - * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Fix debug - messages. - * src/psnames/psmodule.c (psnames_interface) - [!FT_CONFIG_OPTION_ADOBE_GLYPH_LIST]: Fix typo. - * src/sfnt/sfdriver.c (get_sfnt_table): 16bit fix. - * src/sfnt/ttcmap.c: 16bit fixes (0xFFFF -> 0xFFFFU). - * src/sfnt/ttcmap0.c: 16bit fixes. - (TT_Build_CMaps): Simplify debug messages. - (tt_cmap12_char_next): Fix offset. - * src/sfnt/ttload.c (TT_Load_Names, TT_Load_CMap): Fix debug - messages. - (TT_Load_OS2): 16bit fix. - -2002-03-30 David Turner - - * include/freetype/internal/tttypes.h: Adding comments to some of - the TT_FaceRec fields. - - * src/sfnt/ttcmap0.c (TT_Build_CMaps): Removed compiler warnings. - - * src/sfnt/sfobjs.c (tt_name_entry_ascii_from_{utf16,ucs4,other}: - New functions. - (tt_face_get_name): Use them to properly extract an ascii font name. - -2002-03-30 Werner Lemberg - - * include/freetype/t1tables.h (t1_blend_max): Fix typo. - * src/base/ftstream.c: Simplify FT_ERROR calls. - * src/cff/cffdrivr.c (cff_get_glyph_name): Fix debug message. - - * src/cff/cffobjs.c (CFF_Driver_Init, CFF_Driver_Done) - [TT_CONFIG_OPTION_EXTEND_ENGINE]: Removed. - * src/cff/sfobjs.c (SFNT_Load_Face) - [TT_CONFIG_OPTION_EXTEND_ENGINE]: Ditto. - * src/truetype/ttobjs.c (TT_Init_Driver, TT_Done_Driver) - [TT_CONFIG_OPTION_EXTEND_ENGINE]: Ditto. - - * src/truetype/ttdriver.c, src/truetype/ttobjs.c, - src/truetype/ttobjs.h: Renaming driver functions to the - FT__ scheme: - - TT_Init_Driver => TT_Driver_Init - TT_Done_Driver => TT_Driver_Done - TT_Init_Face => TT_Face_Init - TT_Done_Face => TT_Face_Done - TT_Init_Size => TT_Size_Init - TT_Done_Size => TT_Size_Done - TT_Reset_Size => TT_Size_Reset - -2002-03-29 Werner Lemberg - - * builds/vms/ftconfig.h: Rename LOCAL_DEF and LOCAL_FUNC to - FT_LOCAL and FT_LOCAL_DEF, respectively, as with other ftconfig.h - files. - * builds/unix/ftconfig.in: Add argument to FT_LOCAL and - FT_LOCAL_DEF. - * src/truetype/ttinterp.c: s/FT_Assert/FT_ASSERT/. - * builds/unix/configure.ac: Temporarily deactivate creation of - ../../Jamfile. - * builds/unix/configure: Updated. - -2002-03-28 KUSANO Takayuki - - * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fix serious typos. - -2002-03-28 Werner Lemberg - - * include/freetype/internal/psaux.h (PSAux_ServiceRec): Fix - compiler warnings. - * include/freetype/internal/t1types.h (T1_FaceRec): Use `const' for - some members. - * src/base/ftapi.c (FT_New_Memory_Stream): Fix typos. - * src/psaux/t1cmap.c (t1_cmap_std_init, t1_cmap_unicode_init): Add - cast. - (t1_cmap_{standard,expert,custom,unicode}_class_rec): Use - `FT_CALLBACK_TABLE_DEF'. - * src/psaux/t1cmap.h: Updated. - * src/sfnt/ttcmap0.c (TT_Build_CMaps): Use `ft_encoding_none' - instead of zero. - * src/type1/t1objs.c (T1_Face_Init): Use casts. - -2002-03-26 David Turner - - * src/sfnt/sfdriver.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c: - Fixed a small bug in the FT_CMaps support code. - -2002-03-25 David Turner - - * src/truetype/ttinterp.c (Norm): Replaced with... - (TT_VecLen): This. - (TT_MulFix14, TT_DotFix14): New functions. - (Project, Dual_Project, Free_Project, Compute_Point_Displacement, - Ins_SHPIX, Ins_MIAP, Ins_MIRP): Use them. - [FT_CONFIG_OPTION_OLD_CALCS]: Removed all code. - -2002-03-22 David Turner - - * src/base/ftobjs.c, src/sfnt/ttcmap0.c, src/type1/t1objs.c: - Various fixes to make the FT_CMaps support work correctly (more - tests are still needed). - - * include/freetype/internal/ftobjs.h, src/sfnt/Jamfile, - src/sfnt/rules.mk, src/sfnt/sfnt.c, src/sfnt/sfobjs.c, - src/sfnt/ttload.c, src/sfnt/ttcmap0.c, src/sfnt/ttcmap0.h: Updated - the SFNT charmap support to use FT_CMaps. - - * include/freetype/fterrdef.h: New file. - * include/freetype/fterrors.h: Include it. It contains all error - codes. - * include/freetype/config/ftheader.h (FT_ERROR_DEFINITIONS_H): New - macro. - - * include/freetype/internal/ftmemory.h, and a lot of other files: - Changed the names of memory macros. Examples: - - MEM_Set => FT_MEM_SET - MEM_Copy => FT_MEM_COPY - MEM_Move => FT_MEM_MOVE - - ALLOC => FT_ALLOC - FREE => FT_FREE - REALLOC = >FT_REALLOC - - FT_NEW was introduced to allocate a new object from a _typed_ - pointer. - - Note that ALLOC_ARRAY and REALLOC_ARRAY have been replaced by - FT_NEW_ARRAY and FT_RENEW_ARRAY which take _typed_ pointer - arguments. - - This results in _lots_ of sources being changed, but makes the code - more generic and less error-prone. - - * include/freetype/internal/ftstream.h, src/base/ftstream.c, - src/cff/cffload.c, src/pcf/pcfread.c, src/sfnt/ttcmap.c, - src/sfnt/ttcmap0.c, src/sfnt/ttload.c, src/sfnt/ttpost.c, - src/sfnt/ttsbit.c, src/truetype/ttgload.c, src/truetype/ttpload.c, - src/winfonts/winfnt.c: Changed the definitions of stream macros. - Examples: - - NEXT_Byte => FT_NEXT_BYTE - NEXT_Short => FT_NEXT_SHORT - NEXT_UShortLE => FT_NEXT_USHORT_LE - READ_Short => FT_READ_SHORT - GET_Long => FT_GET_LONG - etc. - - Also introduced the FT_PEEK_XXXX functions. - - * src/cff/cffobjs.c (CFF_Build_Unicode_Charmap): Removed commented - out function. - (find_encoding): Removed. - (CFF_Face_Init): Remove charmap support. - - * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_USE_CMAPS, - TT_CONFIG_CMAP_FORMAT{0,2,4,6,8,10,12}): New macros to fine-tune - support of cmaps. - -2002-03-21 David Turner - - * src/base/ftobjs.c, src/pcf/pcfdriver.c, src/pcf/pcfread.c: Updated - to new FT_CMap definitions. - - * src/psaux/t1cmap.h, src/psaux/t1cmap.c, src/type1/t1cmap.h, - src/type1/t1cmap.c: Updating and moving the Type 1 FT_CMap support - from `src/type1' to `src/psaux' since it is going to be shared by - the Type 1 and CID font drivers. - - * src/psaux/Jamfile, src/psaux/psaux.c, src/psaux/psauxmod.c, - src/psaux/rules.mk, include/freetype/internal/psaux.h: Added support - for Type 1 FT_CMaps. - -2002-03-20 David Turner - - * src/base/ftgloadr.c (FT_GlyphLoader_CheckSubGlyphs): Fixed a - memory allocation bug that was due to un-careful renaming of the - FT_SubGlyph type. - - * src/base/ftdbgmem.c (ft_mem_table_destroy): Fixed a small bug that - caused the library to crash with Electric Fence when memory - debugging is used. - - * Renaming stream macros. Examples: - - FILE_Skip => FT_STREAM_SKIP - FILE_Read => FT_STREAM_READ - ACCESS_Frame => FT_FRAME_ENTER - FORGET_Frame => FT_FRAME_EXIT - etc. - - * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fixed memory leak. - - * include/freetype/internal/ftobjs.h: Changing the definition of - FT_CMap_CharNextFunc slightly. - - * src/cff/*.c: Updating CFF type definitions. - -2002-03-14 David Turner - - * include/freetype/internal/autohint.h, src/autohint/ahmodule.c, - src/base/ftapi.c, src/base/ftobjs.c: Updating the type definitions - for the auto-hinter module. - - FT_AutoHinter_Interface => FT_AutoHinter_ServiceRec - FT_AutoHinter_Interface* => FT_AutoHinter_Service - etc. - - FT_AutoHinter_Get_Global_Func => FT_AutoHinter_GlobalGetFunc - FT_AutoHinter_Done_Global_Func => FT_AutoHinter_GlobalDoneFunc - etc. - - * ahloader.h [_STANDALONE_]: Removed all conditional code. - - * include/freetype/internal/cfftypes.h, src/cff/*.c: Updating the - type definitions of the CFF font driver. - - CFF_Font => CFF_FontRec - CFF_Font* => CFF_Font - etc. - - * include/freetype/internal/fnttypes.h, src/winfonts/*.c: Updating - type definitions of the Windows FNT font driver. - - * include/freetype/internal/ftdriver.h, - include/freetype/internal/ftobjs.h, src/base/ftapi.c, - src/base/ftobjs.c, src/cff/cffdrivr.c, src/cff/cffdrivr.h, - src/cid/cidriver.c, src/cid/cidriver.h, src/pcf/pcfdriver.c, - src/pcf/pcfdriver.h, src/truetype/ttdriver.c, - src/truetype/ttdriver.h, src/type1/t1driver.c, src/type1/t1driver.h, - src/winfonts/winfnt.c, src/winfonts/winfnt.h: Updating type - definitions for font drivers. - - FTDriver_initFace => FT_Face_InitFunc - FTDriver_initGlyphSlot => FT_Slot_InitFunc - etc. - - * src/cid/cidobjs.c (CID_Face_Init): Remove dead code. - - * include/freetype/internal/ftobjs.h, src/base/ftobjs.c: Updated a - few face method definitions: - - FT_PSName_Requester => FT_Face_GetPostscriptNameFunc - FT_Glyph_Name_Requester => FT_Face_GetGlyphNameFunc - FT_Name_Index_Requester => FT_Face_GetGlyphNameIndexFunc - - * src/base/ftapi.c: New file. It contains backwards compatibility - functions. - - * include/freetype/internal/psaux.h, src/cid/cidload.c, - src/cidtoken.h, src/psaux/psobjs.c, src/psaux/psobjs.h, - src/psaux/t1decode.c, stc/type1/t1load.c, src/type1/t1tokens.h: - Updated common PostScript type definitions. - Renamed all enumeration values like to uppercase variants: - - t1_token_any => T1_TOKEN_TYPE_ANY - t1_field_cid_info => T1_FIELD_LOCATION_CID_INFO - etc. - - * include/freetype/internal/psglobals.h: Removed. - * include/freetype/internal/pshints.h, src/pshinter/pshglob.h: - Updated. - - * include/freetype/internal/tttypes.h, - include/freetype/internal/sfnt.h, src/base/ftnames.c, - src/cff/cffdrivr.c, src/sfnt/*.c, src/truetype/*.c: Updated - SFNT/TrueType type definitions. - - * include/freetype/freetype.h, include/freetype/internal/ftgloadr.h: - Updating type definitions for the glyph loader. - -2002-03-13 Antoine Leca - - * include/freetype/config/ftoption.h: Changed the automatic - detection of Microsoft C compilers to automatically support 64-bit - integers only since revision 9.00 (i.e. >= Visual C++ 2.0). - -2002-03-08 Werner Lemberg - - * src/base/ftutil.c (FT_Realloc): Use MEM_Set instead of memset. - -2002-03-07 Werner Lemberg - - * src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new, - ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free, - ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug, - FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings. - * src/base/ftcalc.c (FT_MulFix): Ditto. - * src/cff/cffdrivr.c (cff_get_name_index): Ditto. - * src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init, - CFF_GlyphSlot_Init): Ditto. - * src/cid/cidobjs.c (CID_GlyphSlot_Init, - CID_Size_Get_Globals_Funcs): Ditto. - * src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init): - Ditto. - * src/pshinter/pshmod.c (pshinter_interface): Use `static const'. - * src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused - variables. - - * include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed - to... - (T1_Builder_FuncsRec): This. - (T1_Builder_Funcs): New typedef. - (PSAux_Interface): Remove compiler warnings. - * src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h - (t1_builder_funcs): Updated. - - * src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ... - (PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines. - (PSH_AlignmentRec): Updated. - - * include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix - typo. - * include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto. - * src/base/ftstream (FT_Get_Char): Rename to... - (FT_Stream_Get_Char): This. - - * src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is - a built-in function in gcc, causing warning messages with gcc 3.0. - * src/autohint/ahglyph.c (ah_outline_load): Ditto. - * src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto. - * src/cache/ftcmanag.c (ftc_family_table_alloc, - ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache): - Ditto. - * src/cff/cffload.c (cff_new_index, cff_done_index, - cff_explicit_index, CFF_Access_Element, CFF_Forget_Element, - CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font, - CFF_Done_Font): Ditto. - * src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto. - * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto. - * src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit, - ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3, - * src/pshinter/pshalgo1.c (psh1_hint_table_record, - psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto. - * src/pshinter/pshalgo2.c (psh2_hint_table_record, - psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto. - * src/sfnt/ttpost.c (Load_Format_20, Load_Format_25, - TT_Get_PS_Name): Ditto. - * src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics, - load_truetype_glyph): Ditto. - * src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto. - * src/type1/t1afm.c (T1_Get_Kerning): Ditto. - * include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto. - -2002-03-06 David Turner - - * src/type1/t1objs.c (T1_Face_Init), src/cid/cidobjs.c - (CID_Face_Init): Fixed another bug related to the - ascender/descender/text height of Postscript fonts. - - * src/pshinter/pshalgo2.c (print_zone): Renamed to ... - (psh2_print_zone): This. - * src/pshinter/pshalgo1.c (print_zone): Renamed to ... - (psh1_print_zone): This. - - * include/freetype/freetype.h, include/freetype/internal/ftobjs.h, - src/base/ftobjs.c: Adding the new FT_Library_Version API to return - the library's current version in dynamic links. - * src/base/ftinit.c (FT_Init_FreeType): Updated. - -2002-03-06 Werner Lemberg - - * src/pshinter/pshglob.h (PSH_DimensionRec): s/std/stdw/. - * src/pshinter/pshglob.c (psh_global_scale_widths, - psh_dimension_snap_width, psh_globals_destroy, psh_globals_new): - Ditto. - -2002-03-05 David Turner - - * src/type1/t1objs.c (T1_Face_Init), src/cff/cffobjs.c - (CFF_Face_Init), src/cid/cidobjs.c (CID_Face_Init): Removing the bug - that returned global BBox values in 16.16 fixed format (instead of - integer font units). - - * src/cid/cidriver.c (cid_get_postscript_name): Fixed a bug that - caused the CID driver to return Postscript font names with a leading - slash (`/') as in `/MOEKai-Regular'. - - * src/sfnt/ttload.c (TT_Load_Names), src/sfnt/sfobjs.c (Get_Name), - src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fixed the loader so - that it accepts broken fonts like `foxjump.ttf', which made FreeType - crash when trying to load them. - - Also improved the name table parser to be able to load - Windows-encoded entries before Macintosh or Unicode ones, since it - seems some fonts don't have reliable values here anyway. - - * include/freetype/internal/psnames.h: Add typedef for - `PSNames_Service'. - -2002-03-05 Werner Lemberg - - * builds/unix/aclocal.m4, builds/unix/ltmain.sh: Update to libtool - 1.4.2. - Apply a small patch for AIX to make shared libraries work (this - patch is already in the CVS version of libtool). - - * builds/unix/config.sub, builds/unix/config.guess: Updated to - recent versions. - - * builds/unix/configure.ac: Fix typo - (AC_CONFIG_FILE->AC_CONFIG_FILES). - - * builds/unix/configure: Regenerated. - -2002-02-28 David Turner - - * include/freetype/ftconfig.h: Changed `FT_LOCAL xxxx' to - `FT_LOCAL( xxxx )' everywhere in the source. The same goes for - `FT_LOCAL_DEF xxxx' which is translated to `FT_LOCAL_DEF( xxxxx )'. - - * include/freetype/freetype.h (FREETYPE_MINOR, FREETYPE_PATCH): - Changing version to 2.1.0 to indicate an unstable branch. - Added the declarations of FT_Get_First_Char and FT_Get_Next_Char. - - * src/base/ftobjs.c: Implement FT_Get_First_Char and - FT_Get_Next_Char. - - * include/freetype/t1tables.h: Renaming structure types. This - - typedef T1_Struct_ - { - } T1_Struct; - - becomes - - typedef PS_StructRec_ - { - } PS_StructRec, *PS_Struct; - - typedef PS_StructRec T1_Struct; /* backwards-compatibility */ - - Hence, we increase the coherency of the source code by effectively - using the `Rec' prefix for structure types. - -2002-02-27 David Turner - - * src/sfnt/ttload.c (TT_Load_Names): Simplifying and securing the - names table loader. Invalid individual name entries are now handled - correctly. This allows the loading of very buggy fonts like - `foxjump.ttf' without allocating tons of memory and causing crashes. - - * src/otlayout/otlcommon.h, src/otlayout/otlcommon.c: Adding (still - experimental) code for OpenType Layout tables validation and - parsing. - - * src/type1/t1cmap.h, src/type1/t1cmap.c: Adding (still - experimental) code for Type 1 charmap processing. - - * src/sfnt/ttcmap0.c: New file. It contains a new, still - experimental SFNT charmap processing support. - - * include/freetype/internal/ftobjs.h: Adding validation support as - well as internal charmap object definitions (FT_CMap != FT_CharMap). - -2002-02-24 David Turner - - * Renaming stream functions to the FT__ scheme: - - FT_Seek_Stream => FT_Stream_Seek - FT_Skip_Stream => FT_Stream_Skip - FT_Read_Stream => FT_Stream_Read - FT_Read_Stream_At => FT_Stream_Read_At - FT_Access_Frame => FT_Stream_Enter_Frame - FT_Forget_Frame => FT_Stream_Exit_Frame - FT_Extract_Frame => FT_Stream_Extract_Frame - FT_Release_Frame => FT_Stream_Release_Frame - FT_Get_XXXX => FT_Stream_Get_XXXX - FT_Read_XXXX => FT_Stream_Read_XXXX - - FT_New_Stream( filename, stream ) => - FT_Stream_Open( stream, filename ) - - (The function doesn't create the FT_Stream structure, it simply - initializes it for reading.) - - FT_New_Memory_Stream( library, FT_Byte* base, size, stream ) => - FT_Stream_Open_Memory( stream, const FT_Byte* base, size ) - - FT_Done_Stream => FT_Stream_Close - FT_Stream_IO => FT_Stream_IOFunc - FT_Stream_Close => FT_Stream_CloseFunc - - ft_close_stream => ft_ansi_stream_close (in base/ftsystem.c only) - ft_io_stream => ft_ansi_stream_io (in base/ftsystem.c only) - - * src/base/ftutil.c: New file. Contains all memory and list - management code (previously in `ftobjs.c' and `ftlist.c', - respectively). - - * include/freetype/internal/ftobjs.h: Moving all code related to - glyph loaders to ... - * include/freetype/internal/ftgloadr.h: This new file. - `FT_GlyphLoader' is now a pointer to the structure - `FT_GlyphLoaderRec'. - (ft_glyph_own_bitmap): Renamed to ... - (FT_GLYPH_OWN_BITMAP): This. - * src/base/ftobjs.c: Moving all code related to glyph loaders - to ... - * src/base/ftgloadr.c: This new file. - -2002-02-22 Werner Lemberg - - * include/freetype/internal/ftdebug.h (FT_Trace): Remove comma in - enum to avoid compiler warnings. - -2002-02-21 David Turner - - Modified the debug sub-system initialization. Trace levels can now - be specified within the `FT2_DEBUG' environment variable. See the - comments within `ftdebug.c' for more details. - - * src/base/ftdebug.c: (FT_SetTraceLevel): Removed. - (ft_debug_init): New function. - (ft_debug_dummy): Removed. - Updated to changes in ftdebug.h - - * include/freetype/internal/ftdebug.h: Always define - FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE is defined. - (FT_Assert): Renamed to ... - (FT_ASSERT): This. - Some stuff from ftdebug.h has been moved to ... - - * include/freetype/internal/fttrace.h: New file, to define the trace - levels used for debugging. It is used both to define enums and - toggle names for FT2_DEBUG. - - * include/freetype/internal/internal.h: Updated. - - * src/base/ftobjs.c, src/base/ftstream.c: Updated. - - * include/freetype/internal/ftextend.h, src/base/ftextend.c: - Removed. Both files are now completely obsolete. - * src/base/Jamfile, src/base/rules.mk: Updated. - - * include/freetype/fterrors.h: Adding `#undef FT_ERR_CAT' and - `#undef FT_ERR_XCAT' to avoid warnings with certain compilers (like - LCC). - - * src/pshinter/pshalgo2.c (print_zone): Renamed to ... - (psh2_print_zone): This to avoid errors during compilation of debug - library. - - * src/smooth/ftgrays.c (FT_COMPONENT): Change definition to as - `trace_smooth'. - -2002-02-20 David Turner - - * README: Adding `devel@freetype.org' address for bug reports. - -2002-02-20 Werner Lemberg - - * builds/unix/install.mk (check): New dummy target. - (.PHONY): Add it. - -2002-02-19 Werner Lemberg - - * builds/freetype.mk (FT_CFLAGS): Use $(INCLUDE_FLAGS) first. - - * src/cache/ftccache.c (ftc_cache_resize): Mark `error' as unused - to avoid compiler warning. - * src/cff/cffload.c (CFF_Get_String): Ditto. - * src/cff/cffobjs.c (CFF_StrCopy): Ditto. - * src/psaux/psobjs.c (PS_Table_Done): Ditto. - * src/pcf/pcfread.c (pcf_seek_to_table_type): Ditto. - * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Ditto. - (pcf_get_bitmaps): The same for `sizebitmaps'. - * src/psaux/t1decode.c (T1_Decode_Parse_Charstrings): The same for - `orig_y'. - (t1operator_seac): Comment out more dead code. - * src/pshinter/pshalgo2.c (ps2_hints_apply): Add `DEBUG_HINTER' - conditional. - * src/truetype/ttgload.c (TT_Process_Simple_Glyph, - load_truetype_glyph): Add `TT_CONFIG_OPTION_BYTECODE_INTERPRETER' - conditional. - -2002-02-18 Werner Lemberg - - * src/autohint/ahglyph.c (ah_outline_link_segments): Remove unused - variables. - * src/autohint/ahhint.c (ah_align_serif_edge): Use FT_UNUSED instead - of UNUSED. - * src/autohint/ahmodule.c (ft_autohinter_reset): Ditto. - * src/pshinter/pshrec.c (ps_mask_table_merge): Fix typo in variable - swapping code. - * src/pshinter/pshglob.h (PSH_Blue_Align): Add PSH_BLUE_ALIGN_NONE. - * src/pshinter/pshglob.c (psh_blues_snap_stem): Use it. - * src/pshinter/pshalgo1.c (psh1_hint_table_optimize): Ditto. - * src/pshinter/pshalgo2.c (psh2_hint_align): Ditto. - * include/freetype/internal/ftobjs.h (UNUSED): Removed. - -2002-02-10 Roberto Alameda - - Add support for ISOLatin1 PS encoding. - - * include/freetype/freetype.h (ft_encoding_latin_1): New tag - (`lat1'). - * include/freetype/internal/t1types.h (T1_Encoding_Type): Add - `t1_encoding_isolatin1'. - * src/type1/t1driver.c (Get_Char_Index, Get_Next_Char): Handle - ft_encoding_latin_1. - * src/type1/t1load.c (parse_encoding): Handle `ISOLatin1Encoding'. - * src/type1/t1objs.c (T1_Face_Init): Handle `t1_encoding_isolatin1'. - ----------------------------------------------------------------------------- - -Copyright 2002-2015 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. - - -Local Variables: -version-control: never -coding: utf-8 -End: diff --git a/3party/freetype/ChangeLog.22 b/3party/freetype/ChangeLog.22 deleted file mode 100644 index 08c5877e58..0000000000 --- a/3party/freetype/ChangeLog.22 +++ /dev/null @@ -1,2837 +0,0 @@ -2006-05-12 Werner Lemberg - - - * Version 2.2.1 released. - ========================= - - - Tag sources with `VER-2-2-1'. - -2006-05-12 Werner Lemberg - - * src/tools/docmaker/sources.py (re_source_keywords): Add word - boundary markers. - * src/tools/docmaker/content.py (re_field): Allow `.' in field names - (but not at the beginning or end). - * src/tools/docmaker/tohtml.py (html_header_1): Use `utf-8' charset. - (block_footer): Split into... - (block_footer_start, block_footer_middle, block_footer_end): This to - add navigation buttons. - (HtmlFormatter::block_exit): Updated. - - * include/freetype/*: Many minor documentation improvements (adding - links, spelling errors, etc.). - -2006-05-11 Werner Lemberg - - * README: Minor updates. - - * include/freetype/*: s/scale/scaling value/ where appropriate. - Many other minor documentation improvements. - - * src/tools/docmaker/sources.py (re_italic, re_bold): Handle - trailing punctuation. - * src/tools/docmaker/tohtml.py (HtmlFormatter::make_html_word): Add - warning message for undefined cross references. - Update handling of re_italic and re_bold. - -2006-05-11 Masatake YAMATO - - * builds/unix/ftsystem.c (FT_Stream_Open): Check errno only if - read system call returns -1. - Remove a redundant parenthesis. - -2006-05-10 Werner Lemberg - - * builds/unix/ftsystem.c (FT_Stream_Open): Avoid infinite loop if - given an empty, un-mmap()able file. Reported and suggested fix in - Savannah bug #16555. - - * builds/freetype.mk (refdoc): Write-protect the `docmaker' - directory to suppress generation of .pyc files. According to the - Python docs there isn't a more elegant solution (currently). - - * builds/toplevel.mk (dist): New target which builds .tar.gz, - .tar.bz2, and .zip files. Note that the version number is still - hard-coded. - (do-dist): Sub-target of `dist'. - (CONFIG_GUESS, CONFIG_SUB): New variables. - (.PHONY): Updated. - -2006-05-09 Rajeev Pahuja - - * builds/win32/visualc/freetype.sln, - builds/win32/visualc/freetype.vcproj: Upgraded to VS.NET 2005 from - VS.NET 2003 - Added files ftbbox.c, fttype1.c, ftwinfnt.c, ftsynth.c. - - * builds/win32/visualc/index.html: Updated. - -2006-05-07 Werner Lemberg - - Put version information into the configure script. Reported by Paul - Watson . - - * builds/unix/configure.ac: Renamed to... - * builds/unix/configure.raw: This which now serves (with appropriate - modifications) as a template for configure.ac. - - * version.sed: New script. - - * autogen.sh: Generate configure.ac from configure.raw, using - FREETYPE_MAJOR, FREETYPE_MINOR, and FREETYPE_PATCH from freetype.h. - -2006-05-06 Werner Lemberg - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1. - - * builds/unix/configure.ac (version_info): Set to 9:10:3. - - * builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, builds/freetype.mk (refdoc), - Jamfile (RefDoc), README: s/220/221/, s/2.2.0/2.2.1/. - Minor updates. - - * docs/CHANGES, docs/VERSION.DLL, docs/PROBLEMS, README.CVS: - Updated. - - * builds/unix/install-sh: Updated from `texinfo' CVS module at - savannah.gnu.org. - - * devel/ftoption.h: Synchronize with - include/freetype/config/ftoption.h. - -2006-05-04 Werner Lemberg - - * src/lzw/ftlzw2.c: Renamed to... - * src/lzw/ftlzw.c: This. - - * src/lzw/Jamfile, src/lzw/rules.mk: Updated. - - * builds/mac/FreeType.m68k_cfm.make.txt, - builds/mac/FreeType.m68k_far.make.txt, - builds/mac/FreeType.ppc_carbon.make.txt, - builds/mac/FreeType.ppc_classic.make.txt: Updated. - -2006-05-03 David Turner - - Allow compilation again with C++ compilers. - - * include/freetype/internal/ftmemory.h (FT_ASSIGNP, - FT_ASSIGNP_INNER): New macros which do the actual assignment, and - which exist in two variants (for C and C++). - Update callers accordingly. - -2006-05-03 Werner Lemberg - - * include/freetype/config/ftoption.h (FT_STRICT_ALIASING): Removed. - -2006-05-02 Werner Lemberg - - * include/freetype/internal/ftmemory.h: s/new/newsz/ (for C++). - (FT_ALLOC): Remove redundant redefinition. - - * builds/compiler/gcc-dev.mk (CFLAGS) [g++]: Don't use - `-Wstrict-prototypes'. - - * src/base/ftstream.c (FT_Stream_EnterFrame): Add cast. - - * include/freetype/config/ftconfig.h (FT_BASE_DEF) [__cplusplus]: - Remove `extern'. - -2006-05-02 David Turner - - Update the memory management functions and macros to safely deal - with array size buffer overflows. This corresponds to attempts to - allocate arrays that are too large. For an example, consider the - following code: - - count = read_uint32_from_file(); array = malloc( sizeof ( Item ) * - count ); for ( nn = 0; nn < count; nn++ ) - array[nn] = read_item_from_file(); - - If `count' is larger than `FT_UINT_MAX/sizeof(Item)', the - multiplication overflows, and the array allocated os smaller than - the data read from the file. In this case, the heap will be - trashed, and this can be used as a denial-of-service attack, or make - the engine crash later. - - The FT_ARRAY_NEW and FT_ARRAY_RENEW macros now ensure that the new - count is no larger than `FT_INT_MAX/item_size', otherwise a new - error code `FT_Err_Array_Too_Large' will be returned. - - Note that the memory debugger now works again when FT_DEBUG_MEMORY - is defined. FT_STRICT_ALIASING has disappeared; the corresponding - code is now the default. - - - * include/freetype/config/ftconfig.h (FT_BASE_DEF) [!__cplusplus]: - Don't use `extern'. - - * include/freetype/fterrdef.h (FT_Err_Array_Too_Large): New error - code. - - * include/freetype/internal/ftmemory.h (FT_DEBUG_INNER) - [FT_DEBUG_MEMORY]: New macro. - (ft_mem_realloc, ft_mem_qrealloc): Pass new object size count also. - (ft_mem_alloc_debug, ft_mem_qalloc_debug, ft_mem_realloc_debug, - ft_mem_qrealloc_debug, ft_mem_free_debug): Removed. - (FT_MEM_ALLOC, FT_MEM_REALLOC, FT_MEM_QALLOC, FT_MEM_QREALLOC, - FT_MEM_FREE): Redefine. - (FT_MEM_NEW_ARRAY, FT_MEM_RENEW_ARRAY, FT_MEM_QNEW_ARRAY, - FT_MEM_QRENEW_ARRAY): Redefine. - (FT_ALLOC_MULT, FT_REALLOC_MULT, FT_MEM_QALLOC_MULT, - FT_MEM_QREALLOC_MULT): New macros. Update callers where - appropriate. - (FT_MEM_SET_ERROR): Slightly redefine. - - - * src/base/ftdbgmem.c (_ft_debug_file, _ft_debug_lineno) - [FT_DEBUG_MEMORY]: New global variables, replacing... - (FT_MemTable_Rec) [FT_DEBUG_MEMORY]: Remove `filename' and - `line_no'. Update all callers. - (ft_mem_debug_alloc) [FT_DEBUG_MEMORY]: Avoid possible integer - overflow. - (ft_mem_alloc_debug, ft_mem_realloc_debug, ft_mem_qalloc_debug, - ft_mem_qrealloc_debug, ft_mem_free_debug): Removed. - - * src/base/ftmac.c (read_lwfn): Catch integer overflow. - * src/base/ftrfork.c (raccess_guess_darwin_hfsplus): Ditto. - * src/base/ftutil.c: Remove special code for FT_STRICT_ALIASING. - (ft_mem_alloc, ft_mem_realloc, ft_mem_qrealloc): Rewrite. - - - * include/freetype/ftstream.h (FT_FRAME_ENTER, FT_FRAME_EXIT, - FT_FRAME_EXTRACT, FT_FRAME_RELEASE): Use FT_DEBUG_INNER to report the - place where the frames were entered, extracted, exited or released - in the memory debugger. - - * src/base/ftstream.c (FT_Stream_ReleaseFrame) [FT_DEBUG_MEMORY]: - Call ft_mem_free. - (FT_Stream_EnterFrame) [FT_DEBUG_MEMORY]: Use ft_mem_qalloc. - (FT_Stream_ExitFrame) [FT_DEBUG_MEMORY]: Use ft_mem_free. - -2006-04-30 suzuki toshiya - - * src/base/ftobjs.c (Mac_Read_POST_Resource): Correct pfb_pos - initialization, remove extra cast to copy to pfb_lenpos. This fixes - parsing of PFB fonts with MacOS resource fork (bug introduced - 2003-09-11). Patch provided by Huib-Jan Imbens . - -2006-04-29 Werner Lemberg - - Further C library abstraction. Based on a patch from - msn2@bidyut.com. - - * include/freetype/config/ftstdlib.h (FT_CHAR_BIT, FT_FILE, - ft_fopen, ft_fclose, ft_fseek, ft_ftell, ft_fread, ft_smalloc, - ft_scalloc, ft_srealloc, ft_sfree, ft_labs): New wrapper macros for - C library functions. Update all users accordingly (and catch some - other places where the C library function was used instead of the - wrapper functions). - - * src/base/ftsystem.c: Don't include stdio.h and stdlib.h. - * src/gzip/zutil.h [MSDOS && !(__TURBOC__ || __BORLANDC__)]: Don't - include malloc.h. - - - * builds/unix/unix-def.in (datarootdir): Define, for autoconf 2.59c - and forthcoming versions. - -2006-04-28 Werner Lemberg - - * src/lzw/ftlzw.c, src/lzw/zopen.c, src/lzw/zopen.h: Removed, - obsolete. - -2006-04-27 yi luo - - * builds/win32/visualc/freetype.vcproj: Updated. - -2006-04-26 David Turner - - - * Version 2.2 released. - ======================= - - - Tag sources with `VER-2-2-0'. - -2006-04-26 Werner Lemberg - - * src/psaux/psobjs.c (shift_elements): Don't use FT_Long but - FT_PtrDiff for `delta'. Reported by Céline PILLET - . - -2006-04-21 David Turner - - * include/freetype/ftincrem.h: Documentation updates. - (FT_Incremental_Interface): New typedef. - - * include/freetype/ftmodapi.h, include/freetype/ftglyph.h: - Documentation updates. - - * include/freetype/freetype.h: Documentation update. - (FT_HAS_FAST_GLYPHS): Always set to 0. - - * include/freetype/ftstroke.h, src/base/ftstroke.c (FT_Stroker_New): - Take an FT_Library argument instead of FT_Memory. - - * src/sfnt/ttcmap.c: Remove compiler warnings (gcc-4.0.2). - -2006-04-13 David Turner - - * src/autofit/afloader.c (af_loader_init, af_loader_load_g): Remove - superfluous code in the auto-fitter's loader. - -2006-04-05 Detlef Würkner - - * builds/amiga/makefile, builds/amiga/makefile.os4, - builds/amiga/smakefile: Added FT2_BUILD_LIBRARY define. - -2006-04-03 luoyi - - * builds/compiler/intelc.mk (TE): New variable. - (ANSIFLAGS): Updated. - -2006-04-03 Werner Lemberg - - * builds/exports.mk (clean_symbols_list, clean_apinames): Removed. - (CLEAN): Add $(EXPORTS_LIST) and $(APINAMES_EXE). - (.PHONY): Updated. - - * configure.ac: Minor fixes to improve --help output. - - - * docs/PROBLEMS: New file. - -2006-04-01 David Turner - - * docs/CHANGES: Updated. - - * include/freetype/ftcache.h, include/freetype/config/ftheader.h: - Update documentation comments. - -2006-04-01 Werner Lemberg - - * builds/unix/install.mk (uninstall): Don't handle `cache' - directory which no longer exists. - -2006-03-29 Detlef Würkner - - * src/psaux/psconv.c: Changed some variables which are expected to - hold negative values from `char' to `FT_Char' to allow building with - a compiler where `char' is unsigned by default. - -2006-03-27 David Turner - - * src/sfnt/ttkern.c (tt_face_get_kerning): Fix a serious bug that - causes some programs to go into an infinite loop when dealing with - fonts that don't have a properly sorted kerning sub-table. - -2006-03-26 Werner Lemberg - - * src/bdf/bdflib.c (ERRMSG4): New macro. - (_bdf_parse_glyphs): Handle invalid BBX values. - - * include/freetype/fterrdef.h (FT_Err_Bbx_Too_Big): New error - macro. - -2006-03-23 Werner Lemberg - - * docs/CHANGES: Updated. - - - * src/tools/docmaker/tohtml.py (html_header_2): Add horizontal - padding between table elements. - (html_header_1): The `DOCTYPE' comment must be in uppercase. - (make_html_para): Convert `...' quotations into real left and - right single quotes. - Use `para_header' and `para_footer'. - - * src/tools/docmaker/sources.py (re_bold, re_italic): Accept "'" - also. - -2006-03-23 David Turner - - Add FT_Get_SubGlyph_Info API to retrieve subglyph data. Note that - we do not expose the FT_SubGlyphRec structure. - - * include/freetype/internal/ftgloadr.h (FT_SUBGLYPH_FLAGS_*): Moved - to... - * include/freetype/freetype.h (FT_SUBGLYPH_FLAGS_*): Here. - (FT_Get_SybGlyph_Info): New declaration. - - * src/base/ftobjs.c (FT_Get_SubGlyph_Info): New function. - - - * src/autofit/afloader.c (af_loader_load_g): Compute lsb_delta and - rsb_delta correctly in edge cases. - -2006-03-22 Werner Lemberg - - * src/cache/ftccache.c, (ftc_node_mru_up, FTC_Cache_Lookup) - [!FTC_INLINE]: Compile conditionally. - * src/cache/ftccache.h: Updated. - - * src/cache/ftcglyph.c (FTC_GNode_Init, FTC_GNode_UnselectFamily, - FTC_GNode_Done, FTC_GNode_Compare, FTC_Family_Init, FTC_GCache_New): - s/FT_EXPORT/FT_LOCAL/. - (FTC_GCache_Init, FTC_GCache_Done): Commented out. - (FTC_GCache_Lookup) [!FTC_INLINE]: Compile conditionally. - s/FT_EXPORT/FT_LOCAL/. - * src/cache/ftcglyph.h: Updated. - - * src/cache/ftcimage.c (FTC_INode_Free, FTC_INode_New): - s/FT_EXPORT/FT_LOCAL/. - (FTC_INode_Weight): Commented out. - * src/cache/ftcimage.h: Updated. - - * src/cache/ftmanag.c (FTC_Manager_Compress, - FTC_Manager_RegisterCache, FTC_Manager_FlushN): - s/FT_EXPORT/FT_LOCAL/. - * src/cache/ftmanag.h: Updated. - - * src/cache/ftcsbits.c (FTC_SNode_Free, FTC_SNode_New, - FTC_SNode_Compare): s/FT_EXPORT/FT_LOCAL/. - (FTC_SNode_Weight): Commented out. - * src/cache/ftcsbits.h: Updated. - -2006-03-22 Werner Lemberg - - * src/cache/ftccache.c, src/cache/ftccache.h (FTC_Node_Destroy): - Remove, unused. - - * src/cache/ftccmap.h: Remove, unused. - - * src/cache/rules.mk (CACHE_DRV_H): Remove ftccmap.h. - -2006-03-21 Zhe Su - - * src/base/ftoutln.c (FT_Outline_Get_Orientation): Improve - algorithm. - -2006-03-21 Werner Lemberg - - * src/cff/cfftypes.h (CFF_CharsetRec): Add `max_cid' member. - - * src/cff/cffload.c (cff_charset_load): Set `charset->max_cid'. - - * src/cff/cffgload.c (cff_slot_load): Change type of third parameter - to `FT_UInt'. - Check range of `glyph_index'. - * src/cff/cffgload.h: Updated. - - - * src/sfnt/ttcmap.c (tt_face_build_cmaps): Handle invalid offset - correctly. - - - * builds/freetype.mk (refdoc), docs/CHANGES, Jamfile (RefDoc), - README: s/2.1.10/2.2/. - -2006-03-21 David Turner - - * src/autofit/aflatin.c (af_latin_metrics_scale): Fix small bug - that crashes the auto-hinter (introduced by previous patch). - -2006-03-20 Werner Lemberg - - * builds/freetype.mk (CACHE_DIR, CACHE_H): Remove. - (FREETYPE_H): Updated. - - * src/cache/rules.mk (CACHE_H_DIR): Remove. - (CACHE_DRV_H): Updated. - -2006-03-20 David Turner - - * include/freetype/cache/ftccache.h, - include/freetype/cache/ftccmap.h, include/freetype/cache/ftcglyph.h - include/freetype/cache/ftcimage.h include/freetype/cache/ftcmanag.h - include/freetype/cache/ftcmru.h include/freetype/cache/ftcsbits.h: - Move to... - - * src/cache/ftccache.h, src/cache/ftcglyph.h, src/cache/ftcimage.h, - src/cache/ftcsbits.h, src/cache/ftcmanag.h, src/cache/ftccmap.h, - src/cache/ftcmru.h: This new location. - Update declarations according to the changes in the corresponding - source files. - - Note that these files are not used by FreeType clients; all public - APIs of the cache module have been already moved to - `include/freetype/ftcache.h', and all FT_CACHE_INTERNAL_XXXX_H - macros resolve to it. - - Reason for the move is to allow modifications of the internals - without interferences with rogue clients. Note that there are no - known clients that access the cache internals at the moment. - - * builds/unix/install.mk (install): Don't install headers from - $(CACHE_H). - Remove `freetype/cache' from the target directory. - - * include/freetype/config/ftheader.h (FT_CACHE_MANAGER_H, - FT_CACHE_INTERNAL_MRU_H, FT_CACHE_INTERNAL_MANAGER_H, - FT_CACHE_INTERNAL_CACHE_H, FT_CACHE_INTERNAL_GLYPH_H, - FT_CACHE_INTERNAL_IMAGE_H, FT_CACHE_INTERNAL_SBITS_H): Point to - FT_CACHE_H. - - * src/cache/ftcbasic.c, src/cache/ftccache.h, src/cache/ftccback.h, - src/cache/ftccmap.c, src/cache/ftcglyph.c, src/cache/ftcglyph.h, - src/cache/ftcimage.c, src/cache/ftcimage.h, src/cache/ftcmanag.c, - src/cache/ftcmanag.h, src/cache/ftcmru.h, src/cache/ftcsbits.c, - src/cache/ftcsbits.h: Don't use the FT_CACHE_INTERNAL_XXX_H macros - but include the headers directly (which are now in `src/cache'). - - * src/cache/ftccache.c: Don't use the FT_CACHE_INTERNAL_XXX_H - macros but include the headers directly. - (FTC_Cache_Init, FTC_Cache_Done, FTC_Cache_NewNode, - FTC_Cache_Lookup, FTC_Cache_RemoveFaceID): Declare as FT_LOCAL_DEF. - - * src/cache/ftccache.c: Don't use the FT_CACHE_INTERNAL_XXX_H - macros but include the headers directly. - (FTC_MruNode_Prepend, FTC_MruNode_Up, FTC_MruNode_Remove, - FTC_MruList_Init, FTC_MruList_Reset, FTC_MruList_Done, - FTC_MruList_New, FTC_MruList_Remove, FTC_MruList_RemoveSelection): - Declare as FT_LOCAL_DEF. - (FTC_MruListFind, FTC_MruList_Lookup) [!FTC_INLINE]: Compile - conditionally. - Declare as FT_LOCAL_DEF. - - - * builds/win32/visualc/freetype.dsp: Update project file, add - missing base source files (ftstroke.c, ftxf86.c, etc.). - - - * src/autofit/afcjk.c, src/autofit/aflatin.c, src/base/ftobjs.c, - src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrobjs.c, - src/sfnt/sfobjs.c, src/sfnt/ttmtx.c, src/type1/t1afm.c, - src/type1/t1objs.c: Remove compiler warnings when building with - Visual C++ 6 and /W4. - - * src/autofit/aflatin.c (af_latin_hints_init): Disable horizontal - hinting for italic/oblique fonts. - - - - * src/truetype/ttpload.c, src/truetype/ttpload.h - (tt_face_get_device_metrics): Change second argument to `FT_UInt'. - -2006-03-06 David Turner - - * src/cache/ftcmanag.c (FTC_Manager_Lookup_Size): Prevent crashes in - Mozilla/FireFox print preview in Ubuntu Hoary. - -2006-02-28 Chia-I Wu - - * src/base/ftutil.c (ft_mem_qalloc) [FT_STRICT_ALIASING]: Do not - return error when size == 0. - -2006-02-28 Chia-I Wu - - * src/base/ftobjs.c (FT_Done_Library): Remove modules in reverse - order so that type42 module is removed before truetype module. This - avoids double free in some occasions. - -2006-02-28 David Turner - - * Release candidate VER-2-2-0-RC4. - ---------------------------------- - - * docs/CHANGES: Documentation updates. - -2006-02-28 suzuki toshiya - - * modules.cfg (BASE_EXTENSIONS): Compile in ftgxval.c by default to - build ftvalid in ft2demos. It works as dummy ABI if gxvalid is not - built. - -2006-02-27 Werner Lemberg - - * include/freetype/cache/ftccache.h - [FT_CONFIG_OPTION_OLD_INTERNALS]: Remove declaration of - ftc_node_done. - - * src/cache/ftccache.c (ftc_node_destroy) - [!FT_CONFIG_OPTION_OLD_INTERNALS]: Mark as FT_LOCAL_DEF. This - should now fix all possible compilation options. - -2006-02-27 David Turner - - * src/base/ftutil.c (ft_mem_alloc, ft_mem_qalloc, ft_mem_realloc, - ft_mem_qrealloc): Return an error if a negative size is passed in - parameters. - - * src/cache/ftccache.c (ftc_node_destroy): Mark as FT_BASE_DEF since - it needs to be exported for rogue clients. - - * src/pshinter/pshglob.c (psh_blues_set_zones_0): Prevent problems - with malformed fonts which have an odd number of blue values (these - are broken according to the specs). - - * src/cff/cffload.c (cff_subfont_load), src/type1/t1load.c - (T1_Open_Face): Modify the loaders to force even-ness of - `num_blue_values'. - - (cff_index_access_element): Ignore invalid entries in index files. - -2006-02-27 Chia-I Wu - - * src/base/ftobjs.c (FT_Set_Char_Size): Check the case where width - or height is 0. - -2006-02-27 suzuki toshiya - - * builds/mac/FreeType.m68k_cfm.make.txt, - builds/mac/FreeType.m68k_far.make.txt, - builds/mac/FreeType.ppc_carbon.make.txt, - builds/mac/FreeType.ppc_classic.make.txt: Update to new header - inclusion introduced on 2006-02-16. - -2006-02-27 Chia-I Wu - - * src/base/ftobjs.c (GRID_FIT_METRICS): New macro. - (ft_glyphslot_grid_fit_metrics, FT_Load_Glyph) [GRID_FIT_METRICS]: - Re-enable glyph metrics grid-fitting. It is now done in the base - layer. - (FT_Set_Char_Size, FT_Set_Pixel_Sizes): Make sure the width and - height are not too small or too large, just like we were doing in - 2.1.10. - - * src/autofit/afloader.c (af_loader_load_g): The vertical metrics - are not scaled. - -2006-02-26 Werner Lemberg - - * docs/release: Minor additions and clarifications. - - * docs/CHANGES: Updated to reflect many fixes for backwards - compatibility. Still incomplete. - -2006-02-26 David Turner - - * src/base/ftobjs.c (ft_recompute_scaled_metrics): Re-enable - conservative rounding of metrics to avoid breaking clients like - Pango (see http://bugzilla.gnome.org/show_bug.cgi?id=327852). - -2006-02-25 Werner Lemberg - - * devel/ftoption.h: Synchronize with - include/freetype/config/ftoption.h. - - * src/cache/ftccache.c (ftc_node_destroy): Use FT_LOCAL_DEF (again). - -2006-02-25 David Turner - - Fix compiler warnings as well as C++ compilation problems. - Add missing prototypes. - - * src/autofit/afcjk.c, src/base/ftobjs.c, src/base/ftutil.c, - src/bdf/bdfdrivr.c, src/cff/cffcmap.c, src/cff/cffobjs.c, - src/psaux/afmparse.c,, src/psaux/t1cmap.c, src/smooth/ftgrays.c - src/tools/apinames.c, src/truetype/ttdriver.c: Add various casts, - initialize variables, and decorate functions with FT_CALLBACK_DEF, - etc., to fix compiler warnings (and C++ compiling errors). - - * src/cache/ftcbasic.c: Fix `-Wmissing-prototypes' warnings with - gcc. - - * builds/unix/ftsystem.c: Don't include FT_INTERNAL_OBJECTS_H but - FT_INTERNAL_STREAM_H. - - * src/base/ftsystem.c: Include FT_INTERNAL_STREAM_H. - - * include/freetype/config/ftheader.h (FT_PFR_H): New macro. - - * include/freetype/config/ftoption.h (FT_STRICT_ALIASING): Don't - define for C++. - - * include/freetype/internal/services/svotval.h: Don't include - FT_OPENTYPE_VALIDATE_H but FT_INTERNAL_VALIDATE_H. - - * include/freetype/internal/services/svpfr.h: Include FT_PFR_H. - - * src/gzip/ftgzip.c: Include FT_GZIP_H. - - * src/lzw/ftlzw.c, src/lzw/ftlzw2.c: Include FT_LZW_H. - - * src/sfnt/ttbdf.c (tt_face_load_bdf_props): Rearrange code. - -2006-02-24 Chia-I Wu - - * src/base/ftoutln.c (FT_OUTLINE_GET_CONTOUR, ft_contour_has, - ft_contour_enclosed, ft_outline_get_orientation): Commented out. We - have to wait until `FT_GlyphSlot_Own_Bitmap' is stabilized. - (FT_Outline_Embolden): Use `FT_Outline_Get_Orientation'. - -2006-02-24 Chia-I Wu - - * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Update - documentation. - - * include/freetype/ftsynth.h (FT_GlyphSlot_Own_Bitmap), - src/base/ftsynth.c (FT_GlyphSlot_Own_Bitmap): New function to make - sure a glyph slot owns its bitmap. It is also marked experimental - and due to change. - (FT_GlyphSlot_Embolden): Undo the last change. It turns out that - rendering the outline confuses some applications. - -2006-02-24 David Turner - - * Release candidate VER-2-2-0-RC3. - ---------------------------------- - - * src/cache/ftcbasic.c: Correct compatibility hack bug. - -2006-02-24 Chia-I Wu - - * include/freetype/freetype.h (FT_Size_RequestRec): Change the type - of `width' and `height' to `FT_Long'. - (enum FT_Size_Request_Type), src/base/ftobjs.c (FT_Request_Metrics): - New request type `FT_SIZE_REQUEST_TYPE_SCALES' to specify the scales - directly. - -2006-02-23 David Turner - - Two BDF patches from Debian libfreetype6 for 2.1.10. - - * src/bdf/bdflib.c (_bdf_parse_glyphs): Fix a bug with zero-width - glyphs. - Fix a problem with large encodings. - - - Fix binary compatibility issues for gnustep-back (GNUstep backend - module) which still crashes under Sarge. - - * src/cache/ftccmap.c (FTC_OldCMapType, FTC_OldCMapIdRec, - FTC_OldCMapDesc) [FT_CONFIG_OPTION_OLD_INTERNALS]: New data - structures and enumerations. - (FTC_CMapCache_Lookup) [FT_CONFIG_OPTION_OLD_INTERNALS]: New - compatibility code. - - * src/cache/ftcbasic.c: Fix a silly bug that prevented our `hack' to - support rogue clients compiled against 2.1.7 to work correctly. - This probably explains the GNUstep crashes with the second release - candidate. - -2006-02-23 Chia-I Wu - - * include/freetype/ftoutln.h (enum FT_Orientation): New value - `FT_ORIENTATION_NONE'. - - * src/base/ftoutln.c (FT_OUTLINE_GET_CONTOUR, ft_contour_has, - ft_contour_enclosed, ft_outline_get_orientation): Another version of - `FT_Outline_Get_Orientation'. This version differs from the public - one in that each part (contour not enclosed in another contour) of the - outline is checked for orientation. - (FT_Outline_Embolden): Use `ft_outline_get_orientation'. - - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Render the outline and - use bitmap's embolden routine when the outline one failed. - -2006-02-22 Chia-I Wu - - * modules.cfg: Compile in ftotval.c and ftxf86.c by default for ABI - compatibility. - - * src/sfnt/sfobjs.c (sfnt_done_face): Fix a memory leak. - - * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_bit_aligned, - tt_sbit_decoder_load_byte_aligned) [FT_OPTIMIZE_MEMORY]: Fix sbit - loading. (Only tested with bit aligned sbit with x_pos == 0.) - - * src/truetype/ttpload.c (tt_face_load_hdmx, - tt_face_get_device_metrics) [FT_OPTIMIZE_MEMORY]: `hdmx' is not - actually used. - -2006-02-21 David Turner - - Add a new API named FT_Get_TrueType_Engine_Type to determine whether - we have a patented, unpatented, or unimplemented TrueType bytecode - interpreter. - - The FT_Get_Module_Flags API was removed consequently. - - * include/freetype/ftmodapi.h (FT_Module_Get_Flags): Removed. - Replaced with... - (FT_Get_TrueType_Engine_Type): This. - (FT_TrueTypeEngineType): New enumeration. - - * include/freetype/internal/ftserv.h (FT_SERVICE_TRUETYPE_ENGINE_H): - New macro. - - * src/base/ftobjs.c: Include FT_SERVICE_TRUETYPE_ENGINE_H. - (FT_Module_Get_Flags): Removed. Replaced with... - (FT_Get_TrueType_Engine_Type): This. - - * src/truetype/ttdriver.c: Include FT_SERVICE_TRUETYPE_ENGINE_H. - (tt_service_truetype_engine): New service structure. - (tt_services): Register it. - - * include/freetype/internal/services/svtteng.h: New file. - - - * src/sfnt/sfobjs.c (sfnt_load_face): Fix silly bug that prevented - embedded bitmaps from being correctly listed and used. - - - * src/sfnt/ttmtx.c (tt_face_load_hmtx): Disable memory optimization - if FT_CONFIG_OPTION_OLD_INTERNALS is used. The is necessary because - libXfont is directly accessing the HMTX data, unfortunately. - Fix some compiler warnings. - (tt_face_get_metrics): Ditto. - - - * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Fix handling of - character advances. - -2006-02-20 David Turner - - Support binary compatibility with the X.Org server's Xfont library. - Note that this change unfortunately prevents memory optimizations - for the embedded bitmap loader. - - * include/freetype/internal/sfnt.h (SFNT_Interface): Move - `set_sbit_strike' and `load_sbit_metrics' fields to the location of - version 2.1.8. - - * src/sfnt/sfdriver.c (tt_face_set_sbit_strike_stub): Call - FT_Size_Request. - (sfnt_interface): Updated. - - * src/sfnt/ttsbit.c [FT_CONFIG_OPTION_OLD_INTERNALS]: Don't load - ttsbit0.c. - (tt_load_sbit_metrics): Make `sbit_small_metrics_fields' static. - - * src/sfnt/ttsbit.h: Updated. - -2006-02-17 David Turner - - * builds/unix/unix-cc.in (LINK_LIBRARY): Don't filter out exported - functions anymore. This ensures that all FT_BASE internal functions - are available for dynamic linking. - - * include/freetype/ftcache.h (FTC_IMAGE_TYPE_COMPARE, - FTC_IMAGE_TYPE_HASH), src/cache/ftcbasic.c (FTC_OldFontRec, - FTC_OldImageDescRec, FTC_ImageCache_Lookup, FTC_Image_Cache_New, - FTC_OldImage_Desc, FTC_OLD_IMAGE_FORMAT, ftc_old_image_xxx, - ftc_image_type_from_old_desc, FTC_Image_Cache_Lookup, - FTC_SBitCache_Lookup, FTC_SBit_Cache_New, FTC_SBit_Cache_Lookup) - [FT_CONFIG_OPTION_OLD_INTERNALS]: Try to revive old functions of the - cache sub-system. We try to recognize old legacy signatures with a - gross hack (hope it works). - -2006-02-17 Werner Lemberg - - * devel/ftoption.h: Synchronize with - include/freetype/config/ftoption.h. - -2006-02-16 David Turner - - Massive changes to the internals to respect the internal object - layouts and exported functions of FreeType 2.1.7. Note that the - cache sub-system cannot be fully retrofitted, unfortunately. - - * include/freetype/config/ftoption.h - (FT_CONFIG_OPTION_OLD_INTERNALS): New macro. - - * include/freetype/ftcache.h, include/freetype/cache/ftccache.h, - include/freetype/cache/ftccmap.h, - include/freetype/internal/ftcalc.h, - include/freetype/internal/ftdriver.h, - include/freetype/internal/ftmemory.h, - include/freetype/internal/ftobjs.h, - include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h, - include/freetype/internal/t1types.h, - include/freetype/internal/tttypes.h, src/base/ftcalc.c, - src/base/ftdbgmem.c, src/base/ftobjs.c, src/base/ftutil.c, - src/bdf/bdfdrivr.c, src/cache/ftccache.c, src/cache/ftccback.h, - src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c, - src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c, - src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c, - src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c: - Use FT_CONFIG_OPTION_OLD_INTERNALS to revive old functions and data - structures. - - Move newly added structure elements to the end of the affected - structure and add stub fields (if FT_CONFIG_OPTION_OLD_INTERNALS is - defined) to assure binary compatibility with older FreeType - versions. - Use FT_CONFIG_OPTION_OLD_INTERNALS to add function stubs for old - functions: - - ft_stub_set_char_sizes - ft_stub_set_pixel_sizes - - Rename the following internal functions to provide the old function - names as stubs: - - FT_Alloc -> ft_mem_alloc - FT_QAlloc -> ft_mem_qalloc - FT_Realloc -> ft_mem_realloc - FT_QRealloc -> ft_mem_qrealloc - FT_Free -> ft_mem_free - FT_Alloc_Debug -> ft_mem_alloc_debug - FT_QAlloc_Debug -> ft_mem_qalloc_debug - FT_Realloc_Debug -> ft_mem_realloc_debug - FT_QRealloc_Debug -> ft_mem_qrealloc_debug - FT_Free_Debug -> ft_mem_free_debug - -2006-02-15 Chia-I Wu - - * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove - unused `max_points' and `max_contours'. - - * src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c - (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update. - - * include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused - `max_components'. - - * src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused - `loadSize' and `loadStack'. - - * src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context), - src/sfnt/ttload.c (tt_face_load_maxp): Update. - - * src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c - (sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix - compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not - defined. - - * src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix - possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions. - (finally!) - - - For most OpenType tables, `tt_face_load_xxxx' simply loads the table - and `face->root' is set later in `sfnt_load_face'. Here, we try to - make this work for _all_ tables. Also improve tracing messages. - - * src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c, - src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and - then exit. Error handling or setting face->root is done later in - `sfnt_load_face'. - - * src/sfnt/sfobjs.c (sfnt_load_face): Work harder. - Mac bitmap-only fonts are not scalable. - Check that `face->header.Units_Per_EM' is not zero. - (LOAD_, LOADM_): Emit pretty trace messages. - - * src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics - from `eblc'. - - * src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c - (load_format_20, load_format_25, tt_face_get_ps_name): Use - face->max_profile.numGlyphs, instead of face->root.num_glyphs. - -2006-02-14 Werner Lemberg - - * include/freetype/ftoutln.h (FT_Outline_Embolden): Mention in - documentation that negative strength values are possible. - Give an example call. - - * include/freetype/freetype.h (FT_GlyphSlotRec): Improve - documentation of `outline' field. - - * src/sfnt/sfobjc.s: Inckude FT_INTERNAL_DEBUG_H. - * src/sfnt/sfdriver.c: Include ttmtx.h. - - * src/autofit/afcjk.c: Include aftypes.h and aflatin.h. - -2006-02-14 Chia-I Wu - - * src/sfnt/ttmtx.c (tt_face_get_metrics): Typo. - -2006-02-14 Chia-I Wu - - * src/sfnt/ttmtx.c (tt_face_load_hhea, tt_face_load_hmtx): Simply - return error if table is missing. - Check table length in non-FT_OPTIMIZE_MEMORY'ed `tt_face_load_hmtx'. - - * src/sfnt/sfobjs.c (sfnt_load_face): Take care of missing metrics - tables. The last change makes Mac bitmap-only font not load and - this fixes it. - - * src/truetype/ttgload.c (load_truetype_glyph): Fix compilation - error when FT_CONFIG_OPTION_INCREMENTAL is defined. - -2006-02-13 Chia-I Wu - - Clean up the SFNT_Interface. In this final pass, `load_hmtx' is - split from `load_hhea'. - - * include/freetype/internal/sfnt.h, src/sfnt/sfdriver.c, - src/sfnt/ttmtx.c, src/sfnt/ttmtx.h: Split `hmtx' from `hhea'. - - * src/sfnt/sfobjs.c (sfnt_load_face): Update. - -2006-02-13 Chia-I Wu - - * src/sfnt/ttmtx.h, src/sfnt/ttmtx.c: Why are there two copies of - code... - -2006-02-13 Chia-I Wu - - Clean up the SFNT_Interface. In this pass, we want to treat the - font directory (offset table and table directory) as a normal table - like the others. This also means that TTCs are no longer recognized - there but in `init_face'. - - * include/freetype/internal/sfnt.h (SFNT_Interface), - src/sfnt/sfdriver.c: `load_sfnt_header' and `load_directory' are - combined and renamed to `load_font_dir'. - - * src/sfnt/ttload.h, src/sfnt/ttload.c: - s/sfnt_dir_check/check_table_dir/. - `sfnt_init' is moved to sfobjs.c and renamed to `sfnt_open_font'. - `tt_face_load_sfnt_header' and `tt_face_load_directory' are combined - and renamed to `tt_face_load_font_dir'. - - * src/sfnt/sfobjs.c (sfnt_init_face): Recognize TTC here. - -2006-02-13 Chia-I Wu - - Clean up the SFNT_Interface. Table loading functions are now named - after the tables' tags; `hdmx' is TrueType-specific and thus the - code is moved to the truetype module; `get_metrics' is moved here - from the truetype module so that the code can be shared with the cff - module. - - This pass involves no real changes. That is, the code is moved - verbatim mostly. The only exception is the return value of - `tt_face_get_metrics'. - - * include/freetype/internal/sfnt.h, src/sfnt/rules.mk, - src/sfnt/sfdriver.c, src/sfnt/sfnt.c, src/sfnt/sfobjs.c, - src/sfnt/ttload.c, src/sfnt/ttload.h, src/sfnt/ttsbit.c, - src/sfnt/ttsbit.h, src/sfnt/ttsbit0.c: Clean up the SFNT_Interface. - - * src/sfnt/ttmtx.c, src/sfnt/ttmtx.h: New files. Metrics-related - tables' loading and parsing code is moved to here. - Move `tt_face_get_metrics' here from the truetype module. The - return value is changed from `void' to `FT_Error'. - - * include/freetype/internal/fttrace.h: New trace: ttmtx. - - * src/truetype/ttpload.c, src/truetype/ttpload.h: `hdmx' loading and - parsing code is moved here. - New function `tt_face_load_prep' split from `tt_face_load_fpgm'. - `tt_face_load_fpgm' returns `FT_Err_Ok' if `fpgm' doesn't exist. - - * src/cff/cffgload.c, src/cff/cffobjs.c: Update. - - * src/truetype/ttgload.c, src/truetype/ttobjs.c: Update. - -2006-02-11 Chia-I Wu - - * src/autofit/afcjk.c (af_cjk_metrics_init): Fix a stupid bug... - - * src/autofit/aflatin.c (af_latin_metrics_init_widths): Use - AF_LatinMetricsRec as the dummy metrics because we cast the metrics - to it later in `af_latin_hints_link_segments'. - -2006-02-11 Chia-I Wu - - * include/freetype/config/ftoption.h (AF_CONFIG_OPTION_CJK): #define - to enable autofit CJK script support. (#define'd by default.) - - * src/autofit/aflatin.h (AF_LATIN_CONSTANT): New macro. - - * src/autofit/aflatin.c (af_latin_metrics_init_widths): Make sure - that `edge_distance_threshold' is always set. - (af_latin_hints_link_segments): Potential divide-by-zero bug. - Use latin constant in the scoring formula. - - * src/autofit/afcjk.c: Minor updates due to the above three changes. - - * docs/TODO, docs/CHANGES: Updated. - -2006-02-09 Chia-I Wu - - Introduce experimental autofit CJK module based on akito's autohint - patch. You need to #define AF_MOD_CJK in afcjk.c to enable it. - - * src/autofit/afglobal.c, src/autofit/afcjk.h, src/autofit/afcjk.c, - src/autofit/rules.mk, src/autofit/autofit.c, src/autofit/aftypes.h: - Add CJK module based on akito's autohint patch. - - * src/autofit/afhints.h (AF_SegmentRec): New field `len' for the - overlap length of the segments. - (AF_SEGMENT_LEN, AF_SEGMENT_DIST): New macros. - - * src/autofit/aflatin.h (af_latin_metrics_init_widths), - src/autofit/aflatin.c (af_latin_metrics_init_widths): Made - `FT_LOCAL'. - Use the character given by the caller. - (af_latin_metrics_init_widths, af_latin_hints_link_segments): Scale - the thresholds. - - * src/autofit/afloader.c (af_loader_load_g): Respect - AF_SCALER_FLAG_NO_ADVANCE. - -2006-02-09 Werner Lemberg - - * src/cid/cidparse.c (cid_parse_new): Remove shadowing variable. - -2006-02-09 suzuki toshiya - - * src/cid/cidparse.c (cid_parse_new): Fix for abnormally short or - broken CIDFont. Reported by Taek Kwan(TK) Lee (see ft-devel - 2005-11-02). - -2006-02-08 suzuki toshiya - - * builds/unix/configure.ac: Fix bug for `--with-old-mac-fonts' - option on UNIX platform. It has been broken since 2006-01-11. - -2006-02-01 Werner Lemberg - - * src/otvalid/module.mk: s/otvalid_module_class/otv_module_class/. - * src/gxvalid/module.mk: s/gxvalid_module_class/gxv_module_class/. - - * builds/unix/unixddef.mk: Actually do define PLATFORM (fixing - change from 2006-01-31). - (TOP_DIR, OBJ_DIR): Update. - - * builds/unix/install.mk (install): Fix path for ftmodule.h. - - * Makefile, *.mk, builds/unix/unix-cc.in, builds/unix-def.in: Use - `?=' where appropriate. - - * builds/detect.mk (TOP_DIR), builds/os2/os2-dev.mk (TOP_DIR), - builds/win32/w32-dev.mk (TOP_DIR): Removed. Defined elsewhere. - -2006-01-31 Werner Lemberg - - Implement new, simplified module selection. With GNU make it is now - sufficient to modify a single file, `modules.cfg', to control the - inclusion of modules and base extension files. - - This change also fixes the creation of ftmodule.h; it now depends on - `modules.cfg' and thus is rebuilt only if necessary. - - Finally, a version of `ftoption.h' in OBJ_DIR is preferred over the - default location. - - * modules.cfg: New file. - - * builds/freetype.mk: Don't include `modules.mk'. - Include all `rules.mk' files as specified in `modules.cfg'. - (FTOPTION_FLAG, FTOPTION_H): New variables. - (FT_CFLAGS): Add macro definition for FT_CONFIG_MODULES_H. - Add FTOPTION_FLAG. - ($(FT_INIT_OBJ)): Don't use FT_MODULE_LIST. - (CONFIG_H): Add FTMODULE_H and FTOPTION_H. - (INCLUDES): Add DEVEL_DIR. - (INCLUDE_FLAGS, FTSYS_SRC, FTSYS_OBJ, FTDEBUG_SRC, FTDEBUG_OBJ, - OBJ_M, OBJ_S): Use `:=', not `='. - (remove_ftmodule_h): New phony target to delete `ftmodule.h'. - (distclean): Add remove_ftmodule_h. - - * builds/modules.mk: (MODULE_LIST): Removed. - (make_module_list, clean_module_list): Replace targets - with... - (FTMODULE_H_INIT, FTMODULE_H_CREATE, FTMODULE_H_DONE): New - variables. Reason for the change is that it is not possible to have - a phony prerequisite which is run only if the target file must be - rebuilt (phony prerequisites act like subroutines and are *always* - executed). We only want to rebuild `ftmodule.h' if `module.cfg' is - changed. - Update all callers. - ($FTMODULE_H)): Rule to create `ftmodule.h', depending on - `modules.cfg'. - - * builds/toplevel.mk: Rewrite and simplify module handling. - (MODULES_CFG, FTMODULE_H): New variables. - Include MODULES_CFG. - (MODULES): New variable to include all `module.mk' and `rules.mk' - files. We no longer use make's `wildcard' function for this. - - * Makefile (USE_MODULES): Remove. Update all users. - (OBJ_DIR): Define it here. - - * src/*/module.mk: Change - - make_module_list: foo - foo: ... - - to - - FTMODULE_H_COMMANDS += FOO - define FOO - ... - endef - - in all files. `FTMODULE_H_COMMANDS' is used in `FTMODULE_H_CREATE'. - - * src/base/rules.mk (BASE_EXT_SRC): Use BASE_EXTENSIONS. - - * builds/unix/detect.mk (setup): Always execute `configure' script. - (have_mk): Rename to... - (have_Makefile): This. - Don't use `strip' function. - - * builds/unix/unix.mk: Include `install.mk' only if BUILD_PROJECT is - defined. - (have_mk): Don't use `strip' function. - Test for unix-def.mk in OBJ_DIR, not BUILD_DIR (and invert the test - accordingly). - - * builds/unix/install.mk (install, uninstall): Handle `ftmodule.h'. - - * builds/os2/os2-dev.mk, builds/unix/unix-dev.mk, - builds/win32/w32-bccd.mk, builds/win32/w32-dev.mk: Don't define - BUILD_DIR but DEVEL_DIR for development header files. - - * builds/ansi/ansi-def.mk (TOP_DIR, OBJ_DIR), - builds/beos/beos-def.mk (TOP_DIR, OBJ_DIR), builds/unix/unix-def.in - (TOP_DIR, OBJ_DIR): Removed. Defined elsewhere. - - * builds/dos/dos-def.mk (OBJ_DIR), builds/os2/os2-def.mk (OBJ_DIR), - builds/win32/win32-def.mk (OBJ_DIR): Removed. Defined elsewhere. - - * builds/unix/unixddef.mk: Don't define BUILD_DIR but DEVEL_DIR for - development header files. - Don't define PLATFORM. - - * configure: Copy `modules.cfg' to builddir if builddir != srcdir. - Update snippet taken from autoconf's m4sh.m4 to current CVS version. - Be more verbose. - - * include/freetype/config/ftmodule.h: Add comments -- this file is - no longer used if FreeType is built with GNU make. - - * docs/CHANGES, docs/CUSTOMIZE, docs/INSTALL, docs/INSTALL.ANY, - docs/INSTALL.GNU, docs/INSTALL.UNX: Document new build mechanism. - Other minor updates. - - * modules.txt: Removed. Contents included in `modules.cfg'. - - - * include/freetype/internal/ftmemory.h (FT_QAlloc_Debug, - FT_Free_Debug) [FT_STRICT_ALIASING]: Fix typos. - - * src/base/ftdbgmem.c (FT_Alloc_Debug, FT_Realloc_Debug, - FT_QAlloc_Debug, FT_QRealloc_Debug, FT_Free_Debug) - [FT_STRICT_ALIASING]: Implement. - -2006-01-31 Chia-I Wu - - * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c - (cid_face_init), src/pfr/pfrobjs.c (pfr_face_init), - src/type1/t1objs.c (T1_Face_Init): Set face->height to MAX(1.2 * - units_per_EM, ascender - descender). - -2006-01-31 Chia-I Wu - - * include/freetype/internal/t1types.h (AFM_FontInfo), - src/psaux/afmparse.c, src/tools/test_afm.c: Read `FontBBox', - `Ascender', and `Descender' from an AFM. - - * src/type1/t1afm.c (T1_Read_Metrics): Use the metrics from the AFM. - - * include/freetype/freetype.h (FT_FaceRec): Mention that fields may - be changed after file attachment. - -2006-01-28 Werner Lemberg - - * src/*/module.mk (.PHONY): Add. - -2006-01-27 Werner Lemberg - - * README, docs/FTL.TXT: Fix email address for bug reports. - Other minor formatting. - - * devel/ftoption.h: Synchronize with - include/freetype/config/ftoption.h. - - * src/autofit/module.mk (add_autofit_module), src/bdf/module.mk - (add_bdf_module), src/type42/module.mk (add_type42_driver): Fix - whitespace. - - * src/smooth/module.mk (add_smooth_renderer): Add lcd and lcdv - renderer classes. - -2006-01-27 David Turner - - * builds/unix/configure.ac: Fix build problem on Cygwin. - - * builds/unix/install.mk (install): Don't install the internal - headers, and remove existing ones if found in the target install - directory. - - * src/autofit/afwarp.c: Add simple #ifdef to prevent compilation - if the warp hinter isn't active (it shouldn't, still experimental). - - * Jamfile, include/freetype/config/ftmodule.h: Remove `gxvalid' - and `otvalid' from the list of modules that are linked statically - to a given FreeType library. Functionality has been moved to the - `ftvalid' CVS module. - - Note also that current Make-based build system still compiles the - modules though. - - * include/freetype/config/ftoption.h (FT_STRICT_ALIASING): New macro - which controls the definitions of the memory management functions to - avoid warnings with recent versions of GCC. This macro is only here - to be disabled, in case we detect problems with the new scheme. - - NOTE: Disable macro to use the memory debugger -- this will be fixed - later! - - * include/freetype/internal/ftmemory.h, src/base/ftutil.c (FT_Alloc, - FT_QAlloc, FT_Realloc, FT_QRealloc, FT_Free) [FT_STRICT_ALIASING]: - New versions. - - - * builds/win32/visualc/freetype.dsp: Updating project file to - define FT2_BUILD_LIBRARY, and remove gxvalid + otvalid modules from - compilation. - - - * builds/freetype.mk (FT_CFLAGS), Jamfile (DEFINES): Define the - macro FT2_BUILD_LIBRARY when compiling the library. - - * include/freetype/config/ftheader.h: Remove inclusions of internal - headers except if the macro FT2_BUILD_LIBRARY is defined. - - - * include/freetype/internal/psaux.h (AFM_KernPair, AFM_TrackKern, - AFM_FontInfo): Move structure declarations to... - * include/freetype/internal/t1types.h: This file. - - - * (many files): Fix compiler warnings. - Various minor reorganizations. - - - * src/cff/cffload.c (cff_font_done): Don't free static array - `subfonts'. - - * src/otvalid/otvcommn.c (otv_ClassDef_validate), - src/otvalid/otvgpos.c (otv_x_sxy): Fix debugging information. - - - Get rid of writable static variables (i.e., the string table) in - afmparse, and fix compilation in FT2_MULTI mode. - - * src/psaux/afmparse.c: Include ft2build.h and FT_FREETYPE_H. - (AFM_MAX_ARGUMENTS): Define... - * src/psaux/afmparse.h: Here. - * src/psaux/Jamfile (_sources): Add afmparse. - - * src/psaux/psconv.c: Include psconv.h. - - * src/type1/t1afm.c: Don't include FT_INTERNAL_TYPE1_TYPES_H but - FT_INTERNAL_POSTSCRIPT_AUX_H. - * src/type1/t1afm.h: Include FT_INTERNAL_TYPE1_TYPES_H. - -2006-01-23 Chia-I Wu - - * include/freetype/freetype.h (FT_Select_Size): Rename the second - argument from `idx' to `strike_index'. - (FT_Size_Request_Type): Add FT_SIZE_REQUEST_TYPE_MAX to the end of - this enum. - - * include/freetype/internal/ftobjs.h (FT_REQUEST_WIDTH, - FT_REQUEST_HEIGHT): New macros to get the width and height of a - request, in fractional pixels. - - * include/freetype/internal/ftobjs.h (FT_Select_Metrics, - FT_Request_Metrics), src/base/ftobjs.c (FT_Select_Metrics, - FT_Request_Metrics): New base functions to set the font metrics. They - were part of FT_Select_Size/FT_Request_Size and are made independent - functions so that metrics are not set again and again. - - * src/base/ftobjs.c (FT_Select_Size, FT_Request_Size): Metrics are set - only when driver's size_select/size_request is NULL. That is, drivers - should set the metrics themselves. - (FT_Match_Size): Round before matching. This was what we did and it - does cause some problems without rounding. - - * src/cff/cffobjs.c (cff_size_select), src/truetype/ttdriver.c - (tt_size_select): Set the font metrics. - s/index/strike_index/. - The scaled metrics are always preferred over strikes' metrics, even - when some strike is selected. This is done because the strikes' - metrics are not reliable, e.g., the sign of the descender is wrong for - some fonts. - - * src/cff/cffobjs.c (cff_size_request), src/truetype/ttdriver.c - (tt_size_request): Set the font metrics. - Call cff_size_select/tt_size_select when some strike is matched. - - * src/bdf/bdfdrivr.c, src/cff/cffobjs.c, src/cid/cidobjs.c, - src/pcf/pcfdrivr.c, src/truetype/ttdriver.c, src/type1/t1objs.c, - src/type1/t1objs.h, src/type42/t42objs.c, src/winfonts/winfnt.c: - Set the font metrics. - s/index/strike_index/. - - * src/tools/test_afm.c, src/psaux/psconv.c: Older versions of these - files were committed. Just a catch-up. - (PS_Conv_ToFixed): Remove the `goto'. - (PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Speed up a little. - - * src/sfnt/ttsbit.c (tt_face_load_sbit_strikes, - tt_face_load_strike_metrics), src/sfnt/ttsbit0.c - (tt_face_load_sbit_strikes, tt_face_load_strike_metrics): The - advertised metrics in `available_sizes' are different from those - actually used. - -2006-01-23 Chia-I Wu - - * src/psaux/psaux.c src/psaux/psauxmod.c src/type1/t1driver.c: Make - AFM parser optional, controlled by `T1_CONFIG_OPTION_NO_AFM'. - -2006-01-22 Werner Lemberg - - * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from - `texinfo' CVS module at savannah.gnu.org. - -2006-01-21 Werner Lemberg - - * src/autofit/rules.mk (AUTOF_DRV_SRC): Add afwarp.c. - - * src/autofit/afloader.c (af_loader_load_g): Move AF_USE_WARPER up - to avoid compiler warnings. - - * src/autofit/afwarp.c (af_warper_compute_line_best): Remove - shadowing variable declarations. - Fix warning parameters and replace printf with AF_LOG. - (af_warper_compute): Remove unused variable. - -2006-01-20 David Turner - - Adding experimental implementation of `warp hinting' (new hinting - algorithm for gray-level and LCD rendering). It is disabled by - default, you need to #define AF_USE_WARPER in aftypes.h. - - * src/autofit/afhints.c (af_glyph_hints_scale_dim) [AF_USE_WARPER]: - New function. - * src/autofit/afhints.h: Updated. - - * src/autofit/aflatin.c [AF_USE_WARPER]: Include afwarp.h. - (af_latin_hints_init) [AF_USE_WARPER]: Reset mode to - FT_RENDER_MODE_NORMAL if an LCD mode is selected. - (af_latin_hints_apply) [AF_USE_WARPER]: Call af_warper_compute - appropriately. - - * src/autofit/afloader.c (af_loader_load_g) [!AF_USER_WARPER]: - Isolate code for adjusting metrics. - - * src/autofit/aftypes.h (AF_USE_WARPER): New macro (commented out by - default). - - * src/autofit/afwarp.c, src/autofit/afwarp.h: New files. - - * src/autofit/autofit.c [AF_USE_WARPER]: Include afwarp.c. - - * src/autofit/Jamfile (_sources): Add afwarp. - -2006-01-19 David Turner - - * src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Fix small bug - that prevented compilation when FT_OPTIMIZE_MEMORY is defined. - -2006-01-19 Brian Weed - - * builds/win32/visualc/freetype.dsp: Updated. - -2006-01-17 Werner Lemberg - - Use pscmap service in CFF module. - - * src/cff/cffcmap.c (cff_cmap_uni_pair_compare): Removed. - (cff_sid_to_glyph_name): New function. - (cff_cmap_unicode_init, cff_cmap_unicode_done, - cff_cmap_unicode_char_index, cff_cmap_unicode_char next): Use pscmap - service. - (cff_cmap_unicode_class_rec): Updated. - * src/cff/cffcmap.h (CFF_CMapUnicode, CFF_CMap_UniPair): Removed. - - - * src/psnames/psmodule.c (ps_unicodes_char_next): Fix `unicode' - return value. - - - * src/psaux/afmparse.c (afm_parser_read_vals): Use double casting - to avoid compiler warnings regarding type-punning. - -2006-01-16 Chia-I Wu - - * src/psaux/afmparse.c, src/psaux/afmparse.h: New files which - implement an AFM parser. - - * src/psaux/psconv.c, src/psaux/psconv.h: New files to provide - conversion functions (e.g., PS real number => FT_Fixed) for the - PS_Parser and AFM_Parser. Some of the functions are taken, with - some modifications, from the file psobjs.c. - - * src/psaux/psobjs.c: Use functions from psconv.c. - - * include/freetype/internal/psaux.h, src/psaux/psauxmod.c: Add - `AFM_Parser' to the `psaux' service. - - * src/psaux/psaux.c, src/psaux/rules.mk (PSAUX_DRV_SRC): Include - those new files. - - * src/tools/test_afm.c: A test program for AFM parser. - - * include/freetype/internal/services/svkern.h: New file providing a - `Kerning' service. It is currently only used to get the track - kerning information. - - * include/freetype/internal/ftserv.h (FT_SERVICE_KERNING_H): New - macro. - - * src/type1/t1driver.c, src/type1/t1objs.c, src/type1/t1afm.c, - src/type1/t1afm.h: Update to use the AFM parser. - Provide the `Kerning' service. - - * include/freetype/freetype.h, src/base/ftobjs.c: New API - `FT_Get_Track_Kerning'. - -2006-01-15 Chia-I Wu - - * include/freetype/internal/ftobjs.h, src/base/ftobjs.c, - src/bdf/bdfdrivr.c, src/cff/cffgload.c, src/cid/cidgload.c, - src/pcf/pcfdrivr.c, src/type1/t1gload.c, src/winfonts/winfnt.c: - s/ft_fake_vertical_metrics/ft_synthesize_vertical_metrics/. - - * docs/CHANGES: Mention that vertical metrics are synthesized for - fonts not having this info. - -2006-01-15 Chia-I Wu - - * include/freetype/internal/ftobjs.h (ft_fake_vertical_metrics), - src/base/ftobjs.c (ft_fake_vertical_metrics): New function to fake - vertical metrics. - - * src/cff/cffgload.c, src/cid/cidgload.c, src/pcf/pcfdrivr.c, - src/type1/t1gload.c, src/winfonts/winfnt.c: Fake vertical metrics, - which are monotone. - - * src/truetype/ttgload.c (compute_glyph_metrics): Some fixes and - formattings in vertical metrics faking. There is still room for - improvements (and so does the CFF module). - -2006-01-15 Chia-I Wu - - * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/pcf/pcfdrivr.c - (PCF_Glyph_Load), src/winfonts/winfnt.c (FNT_Load_Glyph): Don't set - the linear advance fields as they are only used by the outline - glyphs. - - * include/freetype/freetype.h: Documentation updates and - clarifications. - The meaning of FT_LOAD_FORCE_AUTOHINT is changed so that no real - change need be made to the code. - - * src/base/ftobjs.c (FT_Load_Glyph): Resolve flag dependencies and - decide whether to use the auto-hinter according to documentation. - There should to be no real difference. - Some checks (e.g., is text height positive?) after the glyph is - loaded. - (FT_Select_Size, FT_Request_Size): Scales are set to wrong values. - Be careful that scales won't be negative. - -2006-01-14 Chia-I Wu - - * docs/CHANGES: Mention the size selection change. - - * src/bdf/bdfdrivr.c (BDF_Size_Request, BDF_Size_Select), - src/pcf/pcfdrivr.c (PCF_Size_Request, PCF_Size_Select), - src/winfonts/winfnt.c (FNT_Size_Request, FNT_Size_Select): Do size - matching for requests of type NOMINAL and REAL_DIM. - - * src/winfonts/winfnt.c (FNT_Face_Init): Print trace message when - `pixel_height' is used for nominal height. - - * src/base/ftobjs.c (FT_Request_Size): Call `FT_Match_Size' if the - face is bitmap only and driver doesn't provide `request_size'. This - is added merely for completion as no driver satisfies the conditions. - -2006-01-13 Chia-I Wu - - Introduce new size selection interface. - - * include/freetype/internal/ftdriver.h (struct FT_Driver_ClassRec): - Replace `set_char_sizes' and `set_pixel_sizes' by `request_size' and - `select_size'. - - * include/freetype/freetype.h (FT_Select_Size, FT_Size_Request_Type, - FT_Size_Request, FT_Request_Size, FT_Select_Size), src/base/ftobjs.c - (FT_Select_Size, FT_Request_Size): API additions to export the new - size selection interface. - - * src/base/ftobjs.c (FT_Set_Char_Size, FT_Set_Pixel_Sizes): Use - `FT_Request_Size'. - - * include/freetype/internal/ftobjs.h (FT_Match_Size), - src/base/ftobjs.c (FT_Match_Size): New function to match a size - request against `available_sizes'. Drivers supporting bitmap strikes - can use this function to implement `request_size'. - - * src/bdf/bdfdrivr.c, src/cid/cidobjs.c, src/cid/cidobjs.h, - src/cid/cidriver.c, src/pcf/pcfdrivr.c, src/type1/t1driver.c, - src/type1/t1objs.c, src/type1/t1objs.h, src/type42/t42drivr.c, - src/type42/t42objs.c, src/type42/t42objs.h, src/winfonts/winfnt.c: - Update to new size selection interface. - - * src/cff/cffdrivr.c, src/cff/cffgload.c, src/cff/cffobjs.c, - src/cff/cffobjs.h, src/truetype/ttdriver.c, src/truetype/ttgload.c, - src/truetype/ttobjs.c, src/truetype/ttobjs.h: Update to new size - selection interface. - Make `strike_index' FT_ULong and always defined. - Use `load_strike_metrics' provided by SFNT interface. - -2006-01-13 Chia-I Wu - - * include/freetype/internal/sfnt.h (SFNT_Interface): New method - `load_strike_metrics' used to load the strike's metrics. - - * src/sfnt/sfdriver.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h, - src/sfnt/ttsbit0.c: New function `tt_face_load_strike_metrics'. - - * src/pfr/pfrobjs.c (pfr_face_init): Set FT_Bitmap_Size correctly. - - * src/winfonts/winfnt.c (FNT_Face_Init): Use `nominal_point_size' for - nominal size unless it is obviously incorrect. - - * include/freetype/freetype.h (FT_Bitmap_Size): Update the comments on - FNT driver. - -2006-01-12 Werner Lemberg - - Prepare use of pscmap service within CFF module. - - * include/freetype/internal/services/svpscmap.h: Include - FT_INTERNAL_OBJECTS_H. - (PS_Unicode_Index_Func): Removed. Unused. - (PS_Macintosh_Name_Func): Renamed to... - (PS_Macintosh_NameFunc): This. - Update all callers. - (PS_Adobe_Std_Strings_Func): Renamed to... - (PS_Adobe_Std_StringsFunc): This. - Update all callers. - (PS_UnicodesRec): This is the former `PS_Unicodes' structure. - Add `cmap' member. - Update all callers. - (PS_Unicodes): This is now a typedef'd pointer to PS_UnicodesRec. - Update all callers. - (PS_Glyph_NameFunc): New typedef. - (PS_Unicodes_InitFunc): Change arguments to expect a function - and generic data pointer which returns a glyph name from a given - index. - - * src/psnames/psmodule.c (ps_unicodes_init, ps_unicodes_char_index, - ps_unicodes_char_next, pscmaps_interface): Updated. - - * include/freetype/internal/t1types.h (T1_FaceRec): Updated. - - * src/psaux/t1cmap.h (T1_CmapStdRec): Updated. - (T1_CmapUnicode, T1_CmapUnicodeRec): Removed. - - * src/psaux/t1cmap.c (t1_get_glyph_name): New callback function. - (t1_cmap_unicode_init, t1_cmap_unicode_done, - t1_cmap_unicode_char_index, t1_cmap_unicode_char_next, - t1_cmap_unicode_class_rec): Updated. - - * src/type42/t42types.h (T42_FaceRec): Updated. - -2006-01-11 suzuki toshiya - - * include/freetype/ftmac.h: Add declaration of new functions - FT_New_Face_From_FSRef and FT_GetFile_From_Mac_ATS_Name that - were introduced by the jumbo patch on 2006-01-11. - -2006-01-11 Werner Lemberg - - Fix Savannah bug #15056 and use pscmap service in psaux module. - - * include/freetype/internal/services/svpscmap.h (PS_UniMap): Use - FT_UInt32 for `glyph_index'. - (PS_Unicodes_InitFunc): Use FT_String for `glyph_names'. - (PS_Unicodes_CharIndexFunc): Use FT_UInt32 for `unicode'. - (PS_Unicodes_CharNextFunc): Make second argument a pointer to - FT_UInt32. - - * src/psnames/psmodule.c (VARIANT_BIT, BASE_GLYPH): New macros. - (ps_unicode_value): Set VARIANT_BIT in return value if glyph is a - variant glyph (this is, it has non-leading `.' in its name). - (compare_uni_maps): Sort base glyphs before variant glyphs. - (ps_unicodes_init): Use FT_String for `glyph_names' argument. - Reallocate only if number of used entries is much smaller. - Updated to handle variant glyphs. - (ps_unicodes_char_index, ps_unicodes_char_next): Prefer base glyphs - over variant glyphs. - Simplify code. - - * src/psaux/t1cmap.c (t1_cmap_uni_pair_compare): Removed. - (t1_cmap_unicode_init, t1_cmap_unicode_char_index, - t1_cmap_unicode_char_next): Use pscmap service. - (t1_cmap_unicode_done): Updated. - - * src/psaux/t1cmap.h (T1_CMapUniPair): Removed. - (T1_CMapUnicode): Use PS_Unicodes structure. - -2006-01-11 suzuki toshiya - - Jumbo patch to fix `deprecated' warning of cross-build for Tiger on - Intel, as reported by Sean McBride on - 2005-08-24. - - * src/base/ftmac.c: Heavy change to build without deprecated Carbon - functions on Tiger. - - * builds/unix/configure.ac: Add options and autochecks for Carbon - functions availabilities, for MacOS X. - - * builds/mac/ascii2mpw.py: Add converter for character `\305'. - * builds/mac/FreeType.m68k_{far|cfm}.make.txt: Add conditional - macros to avoid unavailable functions. - ftmac.c must be compiled without `-strict ansi', because it disables - cpp macro to use ToolBox system call. - - * builds/mac/FreeType.ppc_{classic|carbon}.make.txt: Add conditional - macros to avoid unavailable functions. - - * builds/mac/README: Detailed notes on function availabilities. - - * docs/CHANGES: Notes about (possible) incompatibilities. - -2006-01-08 Werner Lemberg - - * docs/CHANGES: Updated. - -2006-01-08 Huw D M Davies - - * include/freetype/ftmodapi.h (FT_Module_Get_Flags): New - declaration. - - * src/base/ftobjs.c (FT_Module_Get_Flags): New function. - -2006-01-07 Werner Lemberg - - * src/pcf/pcfread.c (pcf_get_bitmaps): Remove unused variable - `bitmaps'. Reported by Yu Lei . - - * src/base/ftutil.c (ft_highpow2): s/FT_BASE/FT_BASE_DEF/. - Reported by Niels Boldt . - -2005-12-28 suzuki toshiya - - * src/sfnt/sfnt/ttbdf.c: Add newline '\n' to the end of file, for - MPW compiler. - -2005-12-23 David Turner - - * Jamfile (RefDoc), docs/reference/README: Fix it so that `jam - refdoc' works correctly to generate the API reference in - `docs/reference'. - - * src/tools/docmaker/tohtml.py (print_html_field, - print_html_field_list): Update to output nicer fields lists in the - API reference. - - * src/base/ftobjs.c (FT_Load_Glyph): FT_LOAD_TARGET_LIGHT now - forces auto-hinting. - - * freetype/freetype.h: Updating the documentation for - FT_LOAD_TARGET_XXX and FT_Render_Mode values. - -2005-12-23 suzuki toshiya - - * src/base/ftmac.c (FT_New_Face_From_Suitcase): Count scalable faces - in supported formats (sfnt, LWFN) only, and ignore bitmap faces in - unsupported formats (fbit, NFNT). The number of available faces are - passed via face->num_faces. If bitmap faces are embedded in sfnt - resource, face->num_fixed_size is correctly set. In public API, - FT_New_Face() and FT_New_Face_From_FSSpec() count the faces as - FT_GetFile_From_Mac_Name(), which ignores NFNT resources. - - * doc/CHANGES: Mention the changes. - -2005-12-17 Chia-I Wu - - * src/truetype/ttinterp.c (Update_Max): Set current size of buffer - correctly (so that memory debug system won't panic). - -2005-12-16 Chia-I Wu - - * include/freetype/internal/ftobjs.h (ft_glyphslot_grid_fit_metrics), - src/base/ftobjs.c (ft_glyphslot_grid_fit_metrics): Removed. - - * src/base/ftobjs.c (ft_recompute_scaled_metrics): Do not round. - - * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c - (cid_slot_load_glyph), src/truetype/ttgload.c (compute_glyph_metrics), - src/type1/t1gload.c (T1_Load_Glyph): Do not round glyph metrics. - - * doc/CHANGES: Mention the changes. - -2005-12-13 David Turner - - Change the implementation of the LIGHT hinting mode to completely - disable horizontal hinting. This is an experimental effort to - integrate David Chester's latest patch without affecting the other - hinting modes as well. - - Note that this doesn't force auto-hinting for all fonts, however. - - * src/autofit/afhints.c (af_glyph_hints_reload): Don't set - scaler_fiags here but... - (af_glyph_hints_rescale): Here. - - * src/autofit/aflatin.c (af_latin_hints_init): Disable horizontal - hinting for `light' hinting mode. - - - * Jamfile: Small fix to ensure that ftexport.sym is placed into the - same location as other generated objects (i.e., within the `objs' - directory of the current directory). - - - Add support for an embedded `BDF ' table within SFNT-based bitmap - font files. This is used to store atoms & properties from the - original BDF fonts that were used to generate the font file. - - The feature is controlled by TT_CONFIG_OPTION_BDF within - `ftoption.h' and is used to implement FT_Get_BDF_Property for these - font files. - - At the moment, this is still experimental, the BDF table format - isn't cast into stone yet. - - * include/freetype/config/ftoption.h (TT_CONFIG_OPTION_BDF): New - macro. - - * include/freetype/config/ftstdlib.h (ft_memchr): New macro. - - * include/freetype/internal/tttypes.h (TT_BDFRec, TT_BDF) - [TT_CONFIG_OPTION_BDF]: New structure. - (TT_FaceRec) [TT_CONFIG_OPTION_BDF]: New member `bdf'. - - * include/freetype/ttags.h (TTAG_BDF): New macro. - - * src/sfnt/Jamfile (_sources): Add ttbdf. - - * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttbdf.c. - - * src/sfnt/sfdriver.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.h and - FT_SERVICE_BDF_H. - (sfnt_get_charset_it) [TT_CONFIG_OPTION_BDF]: New function. - (sfnt_service_bdf) [TT_CONFIG_OPTION_BDF]: New service. - (sfnt_services) [TT_CONFIG_OPTION_BDF]: Add sfnt_service_bdf. - - * src/sfnt/sfnt.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.c. - - * src/sfnt/sfobjs.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.h. - (sfnt_done_face) [TT_CONFIG_OPTION_BDF]: Call - tt_face_free_bdf_props. - - * src/sfnt/ttbdf.h, src/sfnt/ttbdf.c: New files. - -2005-12-07 Werner Lemberg - - * src/sfnt/sfobjc.c (sfnt_init_face): Move tag check to... - * src/sfnt/ttload.c (sfnt_init): Here, before handling TTCs. - -2005-12-06 Chia-I Wu - - * src/truetype/ttobjs.c (tt_size_init): size->ttmetrics.valid is - initialized twice. - size->strike_index is not initialized. - -2005-12-02 Taek Kwan(TK) Lee - - * src/type42/t42objs.c (T42_Face_Init): Replace call to - FT_New_Memory_Face with call to FT_Open_Face to pass `params'. - -2005-11-30 Werner Lemberg - - * docs/CHANGES: Document ftdump's `-v' option. - Document latest charmap code changes. - - * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h: - s/TT_CMAP_FLAG_OVERLAPPED/TT_CMAP_FLAG_OVERLAPPING/. - -2005-11-30 Chia-I Wu - - * src/sfnt/ttcmap.c (tt_cmap4_char_map_binary, - tt_cmap12_char_map_binary): Fix compiler warnings. - -2005-11-29 Chia-I Wu - - Major update to distinguish between unsorted and overlapping - segments for cmap format 4. For overlapping but sorted segments, - which is previously considered unsorted, we still use binary search. - - * src/sfnt/ttcmap.h (TT_CMapRec_): Replace `unsorted' by `flags'. - (TT_CMAP_FLAG_UNSORTED, TT_CMAP_FLAG_OVERLAPPED): New macros. - - * src/sfnt/ttcmap.c (OPT_CMAP4): Removed as it is always defined. - (TT_CMap4Rec_): Remove `old_charcode' and `table_length'. - (tt_cmap4_reset): Removed. - (tt_cmap4_init): Updated accordingly. - (tt_cmap4_next): Updated accordingly. - Take care of overlapping segments. - (tt_cmap4_validate): Make sure the subtable is large enough. - Do not check glyph_ids because some fonts set the length wrongly. - Also, if all segments have offset 0, glyph_ids is always invalid. - It does not cause any problem so far only because the check misses - equality. - Distinguish between unsorted and overlapping segments. - (tt_cmap4_char_map_linear, tt_cmap4_char_map_binary): New functions - to do `charcode => glyph index' by linear/binary search. - (tt_cmap4_char_index, tt_cmap4_char_next): Use - tt_cmap4_char_map_linear and tt_cmap4_char_map_binary. - (tt_face_build_cmaps): Treat the return value of validator as flags - for cmap. - -2005-11-29 Chia-I Wu - - * src/sfnt/ttcmap.c (TT_CMap12Rec_, tt_cmap12_init, tt_cmap12_next): - New structures and functions for fast `next char'. - (tt_cmap12_char_map_binary): New function to do `charcode => glyph - index' by binary search. - (tt_cmap12_char_index, tt_cmap12_char_next): Use - tt_cmap12_char_map_binary. - (tt_face_build_cmaps): Check table and offset correctly (equality is - missing). - -2005-11-15 Detlef Würkner - - * builds/amiga/smakefile: Adjusted the compiler options - to the current sources, now really builds the gxvalid, gzip - and psnames modules. - - * builds/amiga/src/base/ftsystem.c: The assumed Seek() position - in the file cache was off by one byte which could cause false - errors in font files. - -2005-11-24 suzuki toshiya - - * builds/mac/FreeType.m68k_far.make.txt, - builds/mac/FreeType.m68k_cfm.make.txt, - builds/mac/FreeType.ppc_classic.make.txt, - builds/mac/FreeType.ppc_carbon.make.txt: - Updated for MPW to build all available modules. - -2005-11-21 Håvard Wall - - * src/bdf/bdfdrivr.c (bdf_interpret_style, BDF_Face_Done): Fix small - memory leak. - -2005-11-21 Werner Lemberg - - * src/sfnt/ttload.c (sfnt_init): Add tracing message. - -2005-11-21 Chia-I Wu - - * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Image_offset was - added twice to image_start if image_format was 2 or 5. - -2005-11-21 Chia-I Wu - - * src/sfnt/sfobjs.c (sfnt_init_face): Check that format_tag is known - before loading the table directory. - - * src/sfnt/ttload.c (tt_face_load_sfnt_header, - tt_face_load_directory): Delay sfnt_dir_check from - tt_face_load_sfnt_header to tt_face_load_directory. - -2005-11-20 Chia-I Wu - - * src/sfnt/ttload.c (sfnt_dir_check): Clean up and return correct - error code. - (sfnt_init): New function to fill in face->ttc_header. A non-TTC font - is synthesized into a TTC font with one offset table. - (tt_face_load_sfnt_header): Use sfnt_init. - Fix an invalid access if the font is TTC and face_index is -1. - -2005-11-18 Werner Lemberg - - * src/sfnt/ttload.c (tt_face_load_metrics): Ignore excess number - of metrics instead of aborting. Patch suggested by Derek Noonburg. - - * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c - (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph): Scale - the glyph properly if no hinter is available. - - * docs/CHANGES: Mention scaling bug. - -2005-11-18 susuzki toshiya - - * include/freetype/ftgxval.h, src/base/ftgxval.c - (FT_TrueTypeGX_Free, FT_ClassicKern_Free): New functions to free - buffers allocated by gxvalid module. - * include/freetype/ftotval.h, src/base/ftotval.c - (FT_OpenType_Free): New function to free buffer allocated by - otvalid module. - -2005-11-18 Chia-I Wu - - * builds/unix/ftsystem.c (FT_Stream_Open, FT_New_Memory, - FT_Done_Memory), builds/vms/ftsystem.c (FT_Stream_Open, FT_New_Memory, - FT_Done_Memory), builds/win32/ftdebug.c (FT_Message, FT_Panic): - s/FT_EXPORT/FT_BASE/. - -2005-11-17 Detlef Würkner - - * builds/amiga/src/base/ftdebug.c (FT_Trace_Get_Count, - FT_Trace_Get_Name, FT_Message, FT_Panic), - builds/amiga/src/base/ftsystem.c (FT_New_Memory, FT_Done_Memory, - FT_Stream_Open): s/FT_EXPORT/FT_BASE/. - -2005-11-17 Detlef Würkner - - * builds/amiga/makefile, builds/amiga/makefile.os4, - builds/amiga/smakefile, - builds/amiga/include/freetype/config/ftmodule.h: Updated the Amiga - build files (added support for the gxvalid module). - -2005-11-17 Werner Lemberg - - Add vertical metrics support to OpenType CFF outlines. Based on a - patch from Mike Moening . - - * src/cff/cffgload.c (cff_face_get_vertical_metrics): New function. - (cff_slot_load): Use cff_face_get_vertical_metrics. - - * docs/CHANGES: Updated. - -2005-11-17 Chia-I Wu - - * src/base/ftcalc.c (FT_MulTo64): Commented out. - - * include/freetype/internal/ftcalc.h (FT_SqrtFixed), - src/base/ftcalc.c (FT_SqrtFixed), - include/freetype/internal/ftdebug.h (FT_Trace_Get_Count, - FT_Trace_Get_Name, FT_Message, FT_Panic), src/base/ftdebug.c - (FT_Trace_Get_Count, FT_Trace_Get_Name, FT_Message, FT_Panic), - include/freetype/internal/ftobjs.h (FT_New_Memory, FT_Done_Memory), - include/freetype/internal/ftstream.h (FT_Stream_Open), - src/base/ftsystem.c (FT_New_Memory, FT_Done_Memory, FT_Stream_Open): - s/FT_EXPORT/FT_BASE/. - - * builds/exports.mk: Manually add TT_New_Context to EXPORTS_LIST - too. - -2005-11-15 David Turner - - * src/base/fttrigon.c (ft_trig_prenorm): Fix a bug that created - invalid computations, resulting in very weird bugs in TrueType - bytecode hinted fonts. - - * src/truetype/ttinterp.c (FT_UNUSED_EXEC): Don't perform a - structure copy each time. - -2005-11-11 Werner Lemberg - - * src/cache/ftccache.c (FTC_Cache_Clear), src/cache/ftcmanag.c - (FTC_Manager_Check): Remove FT_EXPORT_DEF tag. - - * src/base/ftcalc.c (FT_Add64): Remove FT_EXPORT_DEF tag. - (FT_Div64by32, FT_Sqrt32): Commented out. Unused. - - * include/freetype/internal/ftcalc.h (SQRT_32): Removed. Unused. - (FT_Sqrt32): Commented out. Unused. - - * include/freetype/cache/ftccache.h: - s/ftc_node_destroy/FTC_Node_Destroy/. - - * src/cache/ftccback.h (ftc_node_destroy): New declaration. - - * src/cache/ftccache.c (ftc_node_destroy): Use FT_LOCAL_DEF tag. - (FTC_Node_Destroy): New exported wrapper function for - ftc_node_destroy. - - * src/cache/ftcmanag.c: Include ftccback.c. - -2005-11-10 Werner Lemberg - - * src/autofit/afangles.c, src/autofit/aftypes.h (af_angle_diff): - Comment out. Unused. - - * builds/exports.mk ($(EXPORTS_LIST)): Add TT_RunIns. - -2005-11-10 Christian Biesinger - - * builds/beos/beos.mk: Call beos-def.mk before anything else to - define the separator. - - * builds/unix/unix-cc.in (LINK_LIBRARY): Add `-no-undefined' flag. - -2005-11-07 Werner Lemberg - - * src/type1/t1afm.c (T1_Read_PFM): Zero offset means `no kerning - table available'. From Sergey Tolstov . - -2005-11-03 Ville Syrjälä - - * src/base/ftobjs.c (FT_Open_Face): Avoid possible memory leak. - -2005-11-02 Werner Lemberg - - Make compiling instructions in docs/CUSTOMIZE work again. - - * builds/unix/unix-cc.in (CPPFLAGS): New variable. - (CFLAGS): Don't include @CPPFLAGS@. - * builds/freetype.mk (FT_CFLAGS): Add CPPFLAGS. - -2005-10-28 David Turner - - Update build system to support the generation of a list of exported - symbols or Windows .DEF files by parsing the public headers with the - `apinames' tool located in src/tools/apinames.c. - - Only tested on Unix at the moment. On Windows, the .DEF file is - generated but isn't used yet to generate a DLL. - - * builds/exports.mk: New file. - - * builds/freetype.mk: Include exports.mk. - (dll): New target. - (clean_project_dos): Fix rule. - - * builds/compiler/visualc.mk (TE), builds/dos/dos-def.mk (E), - builds/os2/os2-def.mk (E), builds/win32/win32-def.mk (E): New - variables for controlling executable extensions. - - * builds/unix/unix-cc.in (EXPORTS_LIST, CCexe), - builds/win32/w32-bcc.mk, builds/win32/w32-gcc.mk, - builds/win32/w32-icc.mk, builds/win32/w32-icc.mk, - builds/win32/w32-mingw32.mk, builds/win32/w32-vcc, - builds/win32/w32-wat.mk (EXPORTS_LIST, EXPORT_OPTIONS, - APINAMES_OPTIONS): New targets for controlling the `apinames' tool. - - * Jamfile (GenExportSymbols): Updated. - - - * src/pfr/pfrtypes.h, src/pfr/pfrload.c, src/pfr/pfrobjs.c - [!FT_OPTIMIZE_MEMORY]: Fold memory optimization code into - FT_OPTIMIZE_MEMORY chunks for better maintainability and simplicity. - - - * src/base/fttrigon.c (ft_trig_prenorm), src/base/ftcalc.c - (FT_MulFix): Performance optimizations. - - - * include/freetype/internal/ftgloadr.h (FT_GLYPHLOADER_CHECK_P, - FT_GLYPHLOADER_CHECK_C, FT_GLYPHLOADER_CHECK_POINTS): New macros for - checking points and contours. Update callers to use - FT_GLYPHLOADER_CHECK_POINTS instead of FT_GlyphLoader_CheckPoints - at profile-detected hot-spots. - - * src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Set `adjust' - to 0 to not call `AdjustPoints' every time. - - - * src/autofit/aftypes.h (AF_ANGLE_DIFF): New macro to inline - FT_Angle_Diff. - - * src/autofit/afhints.c (af_direction_compute): Re-implement. - (af_glyph_hints_compute_inflections, af_glyph_hints_reload): Use - AF_ANGLE_DIFF to speed up the detection of inflexions. - - - * src/tools/apinames.c: Include . - (OutputFormat): New enumeration. - (names_dump): Add two parameters to control output format and DLL - name. - (names_dump_windef): Removed. Code folded into `names_dump'. - (read_header_file): Use isalnum, not isalpha. Otherwise function - names with digits aren't read correctly. - (usage): Updated. - (main): New option `-o' to control output file name. - New option `-d' to indicate DLL file name. - Extend `-w' flag to handle Borland and Watcom compilers and linkers. - -2005-10-28 suzuki toshiya - - * builds/mac/ftlib.prj, builds/mac/freetype.mak: Removed. - ftlib.prj is unmaintained and incompatible with current tree. - freetype.mak is unrecoverably broken. - - * builds/mac/ftlib.prj.xml: Added. - Generated by Metrowerks CodeWarrior 9.0. - - * builds/mac/FreeType.m68k_far.make.txt, - builds/mac/FreeType.m68k_cfm.make.txt, - builds/mac/FreeType.ppc_classic.make.txt, - builds/mac/FreeType.ppc_carbon.make.txt: Added. - Skeleton files of MPW makefiles. - - * builds/mac/ascii2mpw.py: Added. - Python script to make MPW makefile from skeleton. - - * builds/mac/README: Updated. - Almost rewritten to use new files. - -2005-10-28 suzuki toshiya - - * src/base/ftmac.c: Fix invalid casts from NULL to integer typed - variables. Advised by David Turner, Masatake YAMATO, Sean McBride, - and George Williams. - -2005-10-27 Werner Lemberg - - * include/freetype/ftsysmem.h, include/freetype/ftsysio.h: Removed. - Obsolete. - -2005-10-25 Werner Lemberg - - * src/sfnt/sfdriver.c (sfnt_interface): Move out - `tt_face_get_kerning' from a #ifdef clause. Reported by Tony J. - Ibbs . - -2005-10-23 Werner Lemberg - - * src/base/ftdbgmem.c (ft_mem_debug_realloc): Make it compile with - C++. - -2005-10-21 David Turner - - * src/base/ftdbgmem.c (ft_mem_table_set, ft_mem_debug_realloc): - Another realloc memory counting bug fix. - - * src/tools/Jamfile: Add missing file. - - * src/lzw/Jamfile: Fix incorrect source file reference. - -2005-10-20 David Turner - - * src/base/ftdbgmem.c (ft_mem_table_set, ft_mem_table_remove, - ft_mem_debug_alloc, ft_mem_debug_free, ft_mem_debug_realloc): Fixes - to better account for memory reallocations. - - * src/lzw/ftlzw2.c, src/lzw/ftzopen.h, src/lzw/ftzopen.c, - src/lzw/rules.mk: First version of LZW loader re-implementation. - Apparently, this saves about 330 KB of heap memory when loading - timR24.pcf.Z. - -2005-10-20 Chia-I Wu - - * include/freetype/ftbitmap.h (FT_Bitmap_Copy, FT_Bitmap_Embolden), - src/base/ftbdf.c (FT_Get_BDF_Property), src/cache/ftcmru.c - (FTC_MruList_Reset, FTC_MruList_Done, FTC_MruList_Lookup): Fix - FT_EXPORT/FT_EXPORT_DEF tagging. - -2005-10-19 Chia-I Wu - - * src/truetype/ttgload.c (TT_Load_Glyph): Allow size->ttmetrics to - be invalid when FT_LOAD_NO_SCALE is set. - -2005-10-17 David Turner - - * src/base/ftobjs.c (FT_Open_Face): Don't call FT_New_GlyphSlot and - FT_New_Size if we are opening a face with face_index < 0 (which is - only used for testing the format). - - * src/gxvalid/gxvmort0.c (gxv_mort_subtable_type0_entry_validate): - Remove compiler warning. - -2005-10-16 David Turner - - * src/tools/apinames.c: Add new tool to extract public API function - names from header files. - -2005-10-05 Werner Lemberg - - Add FT_FACE_FLAG_HINTER to indicate that a specific font driver has - a hinting engine of its own. - - * include/freetype/freetype.h (FT_FACE_FLAG_HINTER): New macro. - - * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c - (cid_face_init), src/truetype/ttobjs.c (tt_face_init) - [TT_CONFIG_OPTION_BYTECODE_INTERPRETER], src/type1/t1objs.c - (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init) - [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Update face flags. - - * docs/CHANGES: Document it. - -2005-09-27 Werner Lemberg - - * builds/unix/freetype2.m4: Add license exception so that the file - can be used in any other autoconf script. - -2005-09-26 David Turner - - * src/autofit/aflatin.c (af_latin_compute_stem_width): Fix bad - computation of the `vertical' flag, causing ugly things in LCD mode - and others. - -2005-09-23 David Turner - - * src/autofit/aflatin.c (af_latin_hints_init): Fix a bug that - prevented internal hint mode bitflags from being computed correctly. - - * src/base/Jamfile: Adding src/base/ftgxval.c. - - * src/gxvalid/gxvbsln.c, src/gxvalid/gxvcommn.c, - src/gxvalid/gxvfeat.c, src/gxvalid/gxvjust.c, src/gxvalid/gxvkern.c, - src/gxvalid/gxvlcar.c, src/gxvalid/gxvmort.c, - src/gxvalid/gxvmort0.c, src/gxvalid/gxvmort1.c, - src/gxvalid/gxvmort2.c, src/gxvalid/gxvmort4.c, - src/gxvalid/gxvmort5.c, src/gxvalid/gxvmorx.c, - src/gxvalid/gxvmorx0.c, src/gxvalid/gxvmorx1.c, - src/gxvalid/gxvmorx2.c, src/gxvalid/gxvmorx5.c, - src/gxvalid/gxvopbd.c, src/gxvalid/gxvprop.c, - src/truetype/ttgload.c: Remove _many_ compiler warnings when - compiling with Visual C++ at maximum level (/W4). - - * src/autofit/afangles.c (af_angle_atan): Replaced CORDIC-based - implementation with one using lookup tables. This simple thing - speeds up glyph loading by 18%, according to ftbench! - - * src/sfnt/sfdriver.c (sfnt_get_interface): Don't check for - `get_sfnt' and `load_sfnt' module interfaces. - -2005-09-22 Werner Lemberg - - * docs/CHANGES: Mention SING Glyphlet support. - -2005-09-22 David Turner - - * src/base/Jamfile: Disable compilation of ftgxval module - temporarily. - -2005-09-19 David Somers - - * src/sfnt/ttload.c (sfnt_dir_check): Modified to allow a - font to have no `head' table if tables `SING' and `META' are - present; this is to support `SING Glyphlet'. - - `SING Glyphlet' is an extension to OpenType developed by Adobe - primarily to facilitate adding supplemental glyphs to an OpenType - font (with emphasis on, but not necessarily limited to, gaiji to a - CJK font). A SING Glyphlet Font is an OpenType font that contains - the outline(s), either in a `glyf' or `CFF' table, for a glyph; - `cmap', `BASE', and `GSUB' tables are present with the same format - and functionaliy as a regular OpenType font; there are no `name', - `head', `OS/2', and `post' tables; there are two new tables, `SING' - which contains details about the glyphlet, and `META' which contains - metadata. - - Further information on the SING Glyphlet format can be found at: - - http://www.adobe.com/products/indesign/sing_gaiji.html - - * include/freetype/ttags.h (TTAG_SING, TTAG_META): New macros for - the OpenType tables `SING' and `META'. These two tables are used in - SING Glyphlet Format fonts. - -2005-09-09 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_load_face): Reactivate code to set - FT_FACE_FLAG_KERNING which has been commented out erroneously. - - * docs/CHANGES: Document it. - -2005-09-05 Werner Lemberg - - Fixes for `make multi' and using C++ compiler. - - * src/gxvalid/gxvcommn.c (gxv_set_length_by_ushort_offset, - gxv_set_length_by_ulong_offset, gxv_array_getlimits_byte, - gxv_array_getlimits_ushort): Declare with FT_LOCAL_DEF. - (gxv_compare_ranges): Make it static. - (gxv_LookupTable_fmt0_validate, gxv_LookupTable_fmt2_validate, - gxv_LookupTable_fmt4_validate, gxv_LookupTable_fmt6_validate, - gxv_LookupTable_fmt8_validate, gxv_LookupTable_validate): Improve - trace messages. - (gxv_StateArray_validate, gxv_XStateArray_validate): s/class/clazz/. - (GXV_STATETABLE_HEADER_SIZE, GXV_STATEHEADER_SIZE, - GXV_XSTATETABLE_HEADER_SIZE, GXV_XSTATEHEADER_SIZE): Move to - gxvcommn.h. - - * src/gxvalid/gxvcommn.h: Add prototypes for - gxv_StateTable_subtable_setup, gxv_XStateTable_subtable_setup, - gxv_XStateTable_validate, gxv_array_getlimits_byte, - gxv_array_getlimits_ushort, gxv_set_length_by_ushort_offset, - gxv_set_length_by_ulong_offset, gxv_odtect_add_range, - gxv_odtect_validate. - (GXV_STATETABLE_HEADER_SIZE, GXV_STATEHEADER_SIZE, - GXV_XSTATETABLE_HEADER_SIZE, GXV_XSTATEHEADER_SIZE): Moved from - gxvcommn.c. - - * src/gxvalid/gxvbsln.c (gxv_bsln_LookupValue_validate, - gxv_bsln_parts_fmt1_validate): Improve trace messages. - - * src/gxvalid/gxvfeat.c: Split off predefined registry stuff to... - * src/gxvalid/gxvfeat.h: New file. - - * src/gxvalid/gxvjust.c (gxv_just_wdc_entry_validate): Improve trace - message. - - * src/gxvalid/gxvkern.c (GXV_kern_Dialect): Add KERN_DIALECT_UNKNOWN. - (gxv_kern_subtable_fmt1_valueTable_load, - gxv_kern_subtable_fmt1_subtable_setup, - gxv_kern_subtable_fmt1_entry_validate): Fix C++ compiler errors. - (gxv_kern_coverage_validate): Use KERN_DIALECT_UNKWOWN. - Improve trace message. - (gxv_kern_validate_generic): Fix C++ compiler error. - Improve trace message. - (gxv_kern_validate_classic): Fix C++ compiler error. - - * src/gxvalid/gxvmort0.c (gxv_mort_subtable_type0_validate): Declare - with FT_LOCAL_DEF. - - * src/gxvalid/gxvmort1.c - (gxv_mort_subtable_type1_substitutionTable_load, - gxv_mort_subtable_type1_subtable_setup): Fix C++ compiler errors. - (gxv_mort_subtable_type1_substTable_validate): Improve trace - message. - (gxv_mort_subtable_type1_validate): Declare with FT_LOCAL_DEF. - - * src/gxvalid/gxvmort2.c (gxv_mort_subtable_type2_opttable_load, - gxv_mort_subtable_type2_subtable_setup, - gxv_mort_subtable_type2_ligActionOffset_validate, - gxv_mort_subtable_type2_ligatureTable_validate): Fix C++ compiler - errors. - (gxv_mort_subtable_type2_validate): Declare with FT_LOCAL_DEF. - - * src/gxvalid/gxvmort4.c (gxv_mort_subtable_type4_validate): Declare - with FT_LOCAL_DEF. - - * src/gxvalid/gxvmort5.c (gxv_mort_subtable_type5_subtable_setup, - gxv_mort_subtable_type5_InsertList_validate): Fix C++ compiler - errors. - (gxv_mort_subtable_type5_validate): Declare with FT_LOCAL_DEF. - - * src/gxvalid/gxvmort.c: Include gxvfeat.h. - (gxv_mort_featurearray_validate, gxv_mort_coverage_validate): - Declare with FT_LOCAL_DEF. - (gxv_mort_subtables_validate, gxv_mort_validate): Improve trace - messages. - - * src/gxvalid/gxvmort.h (gxv_mort_feature_validate): Remove. - - * src/gxvalid/gxvmorx0.c (gxv_morx_subtable_type0_validate): Declare - with FT_LOCAL_DEF. - - * src/gxvalid/gxvmorx1.c - (gxv_morx_subtable_type1_substitutionTable_load, - gxv_morx_subtable_type1_subtable_setup, - gxv_morx_subtable_type1_entry_validate, - gxv_morx_subtable_type1_substitutionTable_validate): Fix C++ - compiler errors. - (gxv_morx_subtable_type1_validate): Declare with FT_LOCAL_DEF. - - * src/gxvalid/gxvmorx2.c (gxv_morx_subtable_type2_opttable_load, - gxv_morx_subtable_type2_subtable_setup, - gxv_morx_subtable_type2_ligActionIndex_validate, - gxv_morx_subtable_type2_ligatureTable_validate): Fix C++ compiler - errors. - (gxv_morx_subtable_type2_validate): Declare with FT_LOCAL_DEF. - Fix typo. - - * src/gxvalid/gxvmorx4.c (gxv_morx_subtable_type4_validate): Declare - with FT_LOCAL_DEF. - - * src/gxvalid/gxvmorx5.c (gxv_morx_subtable_type5_insertionGlyph_load, - gxv_morx_subtable_type5_subtable_setup): Fix C++ compiler error. - (gxv_morx_subtable_type5_validate): Declare with FT_LOCAL_DEF. - - * src/gxvalid/gxvmorx.c (gxv_morx_subtables_validate, - gxv_morx_validate): Improve trace message. - - * src/gxvalid/gxvopbd.c (gxv_opbd_LookupFmt4_transit): Fix compiler - warnings. - (gxv_opbd_validate): Improve trace message. - - * src/gxvalid/gxvprop.c: Decorate constants with `U' and `L' where - appropriate. - (gxv_prop_zero_advance_validate, gxv_prop_validate): Improve trace - message. - - * src/gxvalid/gxvtrak.c (gxv_trak_trackTable_validate): Remove unused - parameter. Update all callers. - (gxv_trak_validate): Improve trace message. - - * rules.mk (GXV_DRV_H): Add gxvfeat.h. - -2005-09-01 Werner Lemberg - - * src/gxvalid/gxvbsln.c (GXV_BSLN_VALUE_EMPTY): Add `U'. - - * src/gxvalid/gxmort1.c (GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE), - src/gxvalid/gxmort2.c (GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE): Fix - typo. - - * src/gxvalid/gxvmorx0.c, src/gxvalid/gxvmorx1.c, - src/gxvalid/gxvmorx2.c, src/gxvalid/gxvmorx4.c, - src/gxvalid/gxvmorx5.c, src/gxvalid/gxvmort.c: Improve trace - messages. - Decorate constants with `U' and `L' where appropriate. - Fix compiler warnings. - -2005-08-31 Werner Lemberg - - * src/truetype/ttgload.c (load_truetype_glyph): Fix typo. - - * src/gxvalid/gxvbsln.c (gxv_bsln_validate): Fix trace message. - - * src/gxvalid/gxvcommn.c (gxv_odtect_add_range): Use `const'. - - * src/gxvalid/gxvfeat.c, src/gxvalid/gxvjust.c, - src/gxvalid/gxvkern.c, src/gxvalid/gxvlcar.c, src/gxvalid/gxvmod.c, - src/gxvalid/gxvmort0.c, src/gxvalid/gxvmort1.c, - src/gxvalid/gxvmort2.c, src/gxvalid/gxvmort4.c, - src/gxvalid/gxvmort5.c, src/gxvalid/gxvmort.c: Improve trace - messages. - Decorate constants with `U' and `L' where appropriate. - Fix compiler warnings. - -2005-08-30 Werner Lemberg - - * src/gxvalid/README: Revised. - * src/gxvalid/gxvbsln.c: Fix compiler warnings. - * src/gxvalid/gxvcommn.c: Fix compiler warnings. - (gxv_XEntryTable_validate, gxv_compare_ranges): Remove unused - parameter. Update all callers. - Improve trace messages. - Some formatting. - -2005-08-29 Werner Lemberg - - * include/freetype/freetype.h, include/freetype/ftchapters.h: Add - a preliminary section with some explanations about user allocation. - - * src/tools/docmaker/tohtml.py (HtmlFormatter.section_enter): - Don't abort if there are no data types, functions, etc., in a - section. - Print synopsis only if we have a data type, function, etc. - - * docs/INSTALL.ANY, docs/INSTALL, docs/INSTALL.UNX, docs/CUSTOMIZE, - docs/INSTALL.GNU, docs/TRUETYPE, docs/DEBUG, docs/UPGRADE.UNX, - docs/VERSION.DLL, docs/formats.txt: Revised, formatted. - -2005-08-28 George Williams - - * src/truetype/ttgload.c [TT_MAX_COMPOSITE_RECURSE]: Removed. - (load_truetype_glyph): Limit recursion depth by `maxComponentDepth'. - -2005-08-25 J. Ali Harlow - - * builds/unix/freetype2.in (CFlags): Add missing directory. - -2005-08-24 Werner Lemberg - - * docs/CHANGES: Mention gxvalid module. - -2005-08-23 Werner Lemberg - - * src/autofit/aflatin.c (af_latin_metrics_scale): Initialize - render mode properly. Reported by chris@dokein.co.uk. - -2005-08-23 suzuki toshiya - - Add gxvalid module to validate TrueType GX/AAT tables. - - Modifications on existing files: - - * Jamfile: Register gxvalid module. - * src/base/Jamfile: Register ftgxval.c. - * src/base/rule.mk: Register ftgxval.c. - * docs/INSTALL.ANY: Register gxvalid/gxvalid.c. - - * include/freetype/config/ftheader.h (FT_GX_VALIDATE_H): New macro - to include gxvalid header file. - * include/freetype/config/ftmodule.h: Register gxv_module_class. - - * include/freetype/ftchapters.h: Add comment about gx_validation. - * include/freetype/ftotval.h: Change keyword FT_VALIDATE_XXX - to FT_VALIDATE_OTXXX to co-exist with gxvalid. - * include/freetype/tttags.h: Add tags for TrueType GX/AAT tables. - - * include/freetype/internal/ftserv.h (FT_SERVICE_GX_VALIDATE_H): New - macro for gxvalid service. - * include/freetype/internal/fttrace.h: Add trace facilities for - gxvalid. - - New files on existing directories: - - * include/freetype/internal/services/svgxval.h: Registration of - validation service for TrueType GX/AAT and classic kern table. - * include/freetype/ftgxval.h: Public API definition to use gxvalid. - * src/base/ftgxval.c: Public API of gxvalid. - - New files under src/gxvalid/: - - * src/gxvalid/Jamfile src/gxvalid/README src/gxvalid/module.mk - src/gxvalid/rules.mk src/gxvalid/gxvalid.c src/gxvalid/gxvalid.h - src/gxvalid/gxvbsln.c src/gxvalid/gxvcommn.c src/gxvalid/gxvcommn.h - src/gxvalid/gxverror.h src/gxvalid/gxvfeat.c src/gxvalid/gxvfgen.c - src/gxvalid/gxvjust.c src/gxvalid/gxvkern.c src/gxvalid/gxvlcar.c - src/gxvalid/gxvmod.c src/gxvalid/gxvmod.h src/gxvalid/gxvmort.c - src/gxvalid/gxvmort.h src/gxvalid/gxvmort0.c src/gxvalid/gxvmort1.c - src/gxvalid/gxvmort2.c src/gxvalid/gxvmort4.c src/gxvalid/gxvmort5.c - src/gxvalid/gxvmorx.c src/gxvalid/gxvmorx.h src/gxvalid/gxvmorx0.c - src/gxvalid/gxvmorx1.c src/gxvalid/gxvmorx2.c src/gxvalid/gxvmorx4.c - src/gxvalid/gxvmorx5.c src/gxvalid/gxvopbd.c src/gxvalid/gxvprop.c - src/gxvalid/gxvtrak.c: New files, gxvalid body. - -2005-08-21 Werner Lemberg - - * src/truetype/ttgload.c (TT_Load_Glyph): Only translate outline - to (0,0) if bit 1 of the `head' table isn't set. This improves - rendering of buggy fonts. - -2005-08-20 Chia I Wu - - * src/truetype/ttdriver.c (Load_Glyph): Don't check the validity of - ttmetrics here. TrueType fonts with only sbits always have - ttmetrics.valid set to false. - - * src/truetype/ttgload.c (TT_Load_Glyph): Check that ttmetrics is - valid before loading outline glyph. - - * src/cache/ftcimage.c (FTC_INode_New): Fix a memory leak. - -2005-08-20 Werner Lemberg - - * src/sfnt/ttload.c (tt_face_load_metrics_header): Ignore missing - `hhea' table for SFNT Mac fonts. Change based on a patch by - mpsuzuki@hiroshima-u.ac.jp. - -2005-08-20 Masatake YAMATO - - * src/otvalid/otvmod.c (otv_validate): Use ft_validator_run instead - of ft_setjmp. - -2005-08-19 Werner Lemberg - - * src/truetype/ttgload.c (load_truetype_glyph): Fix compiler - warnings. - -2005-08-16 Chia I Wu - - * src/truetype/ttinterp.c, src/truetype/ttinterp.h: Update copyright - messages. - -2005-08-16 Chia I Wu - - * src/truetype/ttinterp.c, src/truetype/ttinterp.h: Remove original - TT_Done_Context and rename TT_Destroy_Context to TT_Done_Context - with slight changes. - Update all callers. - (TT_New_Context): Now takes TT_Driver argument directly. - Update all callers. - - * src/truetype/ttobjs.h (tt_slot_init): New function. - * src/truetype/ttobjs.c (tt_driver_init): Initialize execution - context here. - (tt_slot_init): New function to create extra points for the internal - glyph loader. We then use it directly, instead of face's glyph - loader, when loading glyph. - - * src/truetype/ttdriver.c (tt_driver_class): Use tt_slot_init for - glyph slot initialization. - (Load_Glyph): Load flag dependencies are handled here. Return error - if size is NULL. - - * src/truetype/ttgload.c: Heavy cleanup and refactoring. - (org_to_cur): Removed. - (TT_Load_Simple_Glyph): Call FT_GlyphLoader_CheckPoints. - (TT_Hint_Glyph): New function to hint a zone, prepared by caller. - (TT_Process_Simple_Glyph): s/load/loader/. - Use loader->pp values instead of recalculation. - Use TT_Hint_Glyph. - No need to save/restore loader->stream before and after - TT_Vary_Get_Glyph_Deltas now. - (TT_LOADER_SET_PP): New macro to calculate and set the four phantom - points. - (load_truetype_glyph): Never set exec->glyphSize to 0. This closes - Savannah bug #13107. - Forget glyph frame before calling TT_Process_Simple_Glyph. - Use TT_LOADER_SET_PP. - Scale all four phantom points. - Split off some functionality to ... - (TT_Process_Composite_Component, TT_Process_Composite_Glyph): These - new functions. - (TT_Load_Glyph): Set various fields of `glyph' here, not in - load_truetype_glyph and compute_glyph_metrics. - Split off some functionality to ... - (load_sbit_image, tt_loader_init): These new functions. - (compute_glyph_metrics): Call FT_Outline_Get_CBox. - -2005-08-08 Werner Lemberg - - * docs/INSTALL.ANY: Updated. - -2005-08-05 Werner Lemberg - - * src/cff/cffgload.c (cff_builder_close_contour), - src/psaux/psobjs.c (t1_builder_close_contour): Protect against - zero `outline' pointer. - - * src/base/ftgloadr.c (FT_GlyphLoader_Add): Protect against zero - `loader' address. - -2005-08-03 Werner Lemberg - - * src/sfnt/sfdriver.c (sfnt_interface) [FT_OPTIMIZE_MEMORY]: - Reactivate pointers to tt_find_sbit_image and tt_load_sbit_metrics - to make X work again. - -2005-08-02 Werner Lemberg - - * src/otvalid/otvcommn.h: Remove dead code. - -2005-07-31 Chia I Wu - - * src/truetype/ttobjs.h (tt_size_run_fpgm, tt_size_run_prep): New - functions. - - * src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): New - functions. - (tt_size_init): Add 4, instead of 2, (phantom) points to twilight - zone. - Move code that runs fpgm to tt_size_run_fpgm. - (Reset_Outline_Size): Move code that runs prep to tt_size_run_prep. - (tt_glyphzone_new): Allocate right size of arrays. - Set max_points and max_contours properly. - -2005-07-26 Chia I Wu - - * src/truetype/ttdriver.c (Set_Char_Sizes): Avoid unnecessary - computations and clean up. - - * src/truetype/ttobjs.h (struct TT_SizeRec_): Comment on the - internal copy of metrics. - -2005-07-12 Werner Lemberg - - * include/freetype/ftoutln.h (FT_Outline_Embolden): Fix prototype. - Reported by Xerxes. - -2005-07-04 Werner Lemberg - - * include/freetype/internal/ftmemory.h (FT_REALLOC_ARRAY): Fix typo. - Reported by Brett Hutley. - -2005-06-30 David Turner - - * src/sfnt/ftbitmap.c, src/truetype/ttgload.c, src/sfnt/ttcmap.c: - Removing compiler warnings (Visual C++ /W4). - - - Implement a work-around for broken C preprocessor in Visual C++ (it - has been confirmed by the MS developers that it is indeed a bug - which won't be fixed in the very near future). - - * Jamfile (FT2_COMPONENTS): Include otvalid (again). - - * src/otvalid/otvcommn.h (OTV_NAME, OTV_FUNC): New macros. - (OTV_NEST1, OTV_NEST2, OTV_NEST3): Use OTV_NAME and OTV_FUNC to - avoid argument expansion by argument prescan. - Append `Func' to all affected macros and change them to take just a - single argument. Example: `AttachList' is renamed to - `AttachListFunc'. - - * src/otvalid/otvgdef.c, src/otvalid/otvgpos.c, - src/otvalid/otvgsub.c, src/otvjstf.c: Append `Func' to macros - affected by the changes to OTV_NESTx and modify them to take just a - single argument. - -2005-06-20 Chia I Wu - - * include/freetype/internal/ftobjs.h, src/base/ftobjs.c: New function - ft_glyphslot_grid_fit_metrics. - - * src/truetype/ttgload.c (compute_glyph_metrics): Use - ft_glyphslot_grid_fit_metrics. - - * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c - (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph): Use - ft_glyphslot_grid_fit_metrics. - FT_Outline_Get_CBox is called twice. - - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Modify metrics to more - reasonable values when emboldening outline glyphs. The theoretic - ones are unrealistic. - -2005-06-16 Chia I Wu - - * src/base/ftoutln.c (FT_Outline_Embolden): Strength should be - halved. - - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default - strength. - Don't increase slot->advance.y. - -2005-06-16 Werner Lemberg - - * include/freetype/freetype.h (FREETYPE_MINOR): Set to 2. - (FREETYPE_PATCH): Set to 0. - - * builds/unix/configure.ac (version_info): Set to 9:9:3. - Currently, we are still binary compatible. - - * builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/. - - * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): - s/2.1.9/2.1.10/. - - * docs/CHANGES, docs/VERSION.DLL: Updated. - - * ChangeLog: Split off older entries into... - * ChangeLog.20, ChangeLog.21: These new files. - -2005-06-15 Kirill Smelkov - - The next release will be 2.2.0, so don't worry about source code - backwards compatibility. - - * include/freetype/ftimage.h (FT_Outline_MoveToFunc, - FT_Outline_LineToFunc, FT_Outline_ConicToFunc, - FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc), - include/freetype/ftrender.h (FT_Glyph_TransformFunc, - FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate - parameters with `const' where appropriate. - -2005-06-15 Chia I Wu - - * src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY - to make glyphs centered vertically. - - * src/truetype/ttgload.c (compute_glyph_metrics): Compute - vertBearingY to make glyphs centered vertically. - Fix some bugs in vertical metrics: - - . loader->pp3.y and loader->pp4.y are in 26.6 format, not in font - units. - . As we use the glyph's cbox to calculate the top bearing now - there is no need to adjust `top'. - -2005-06-15 Werner Lemberg - - * src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be - in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake. - -2005-06-13 Werner Lemberg - - * docs/release: Update. - ----------------------------------------------------------------------------- - -Copyright 2005-2015 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. - - -Local Variables: -version-control: never -coding: utf-8 -End: diff --git a/3party/freetype/ChangeLog.23 b/3party/freetype/ChangeLog.23 deleted file mode 100644 index 93fd33ce87..0000000000 --- a/3party/freetype/ChangeLog.23 +++ /dev/null @@ -1,7948 +0,0 @@ -2010-02-13 Werner Lemberg - - * Version 2.3.12 released. - ========================== - - - Tag sources with `VER-2-3-12'. - - * docs/CHANGES: Updated. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.3.12. - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.3.11/2.3.12/, s/2311/2312/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 12. - - * builds/unix/configure.raw (version_info): Set to 10:0:4. - -2010-02-12 suzuki toshiya - - Improve autotool version checking to work with beta releases. - - * autogen.sh (check_tool_version): Improve the extraction of version - number from "tool --version" output. Some beta releases of - autotools have extra strings before version number. - -2010-02-12 suzuki toshiya - - Fix overallocating bug in FT_Outline_New_Internal(). - - * src/base/ftoutln.c (FT_Outline_New_Internal): The length of - FT_Outline->points[] should be numPoints, not 2 * numPoints. - Found by Paul Messmer, see - http://lists.gnu.org/archive/html/freetype-devel/2010-02/msg00003.html - -2010-02-10 Ken Sharp - - Really fix Savannah bug #28678 (part 2). - - Since we consider `sbw' for the horizontal direction only, we still have - to synthesize vertical metrics if the user wants to use the vertical - writing direction. - - * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c - (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph): - Synthesize vertical metrics (only) if FT_LOAD_VERTICAL_LAYOUT is - set. - -2010-02-10 Ken Sharp - - Really fix Savannah bug #28678 (part 1). - - After long discussion, we now consider the character width vector - (wx,wy) returned by the `sbw' Type 1 operator as being part of *one* - direction only. For example, if you are using the horizontal - writing direction, you get the horizontal and vertical components of - the advance width for this direction. Note that OpenType and CFF fonts - don't have such a vertical component; instead, the GPOS table can be - used to generate two-dimensional advance widths (but this isn't - handled by FreeType). - - * include/freetype/ftincrem.h (FT_Incremental_MetricsRec): Add - `advance_v' field to hold the vertical component of the advance - value. - - * src/truetype/ttgload.c (tt_get_metrics), src/cff/cffgload.c - (cff_slot_load), src/type1/t1gload.c - (T1_Parse_Glyph_And_Get_Char_String), src/cid/cidgload.c - (cid_load_glyph): Use it. - -2010-02-08 Werner Lemberg - - * devel/ftoption.h [FT_CONFIG_OPTION_PIC]: Define. - -2010-02-04 suzuki toshiya - - Prevent NULL pointer dereference passed to FT_Module_Requester. - - * src/sfnt/sfdriver.c (sfnt_get_interface): Don't use `module'. - * src/psnames/psmodule.c (psnames_get_interface): Ditto. - - * src/cff/cffdrivr.c (cff_get_interface): Check NULL `driver'. - * src/truetype/ttdriver.c (tt_get_interface): Ditto. - -2010-01-29 suzuki toshiya - - Fix memory leaks in previous patch. - - * src/sfnt/sfobjs.c (sfnt_load_face): Don't overwrite the strings - allocated for face->root.family_name and style_name. - -2010-01-29 suzuki toshiya - - New parameters for FT_Open_Face() to ignore preferred family names. - - Preferred family names should be used for legacy systems that - can hold only a few faces (<= 4) for a family name. Suggested by - Andreas Heinrich. - http://lists.gnu.org/archive/html/freetype/2010-01/msg00001.html - - * include/freetype/ftsnames.h (FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY, - FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY): Define. - - * src/sfnt/sfobjs.c (sfnt_load_face): Check the arguments and - ignore preferred family and subfamily names if requested. - -2010-01-27 Ken Sharp - - Fix Savannah bug #28678. - - * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c - (cid_load_glyph): Handle vertical metrics correctly. - - * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Handle - vertical metrics correctly. - (T1_Load_Glyph): Don't synthesize vertical metrics. - -2010-01-14 Werner Lemberg - - Make FT_Set_Transform work if no renderer is available. - - * src/base/ftobjs.c (FT_Load_Glyph): Apply `standard' transformation - if no renderer is compiled into the library. - -2010-01-14 Werner Lemberg - - Fix compilation warning. - - * src/base/ftbase.h: s/LOCAL_DEF/LOCAL/. - * src/base/ftobjc.s: Include ftbase.h conditionally. - -2010-01-11 Kwang Yul Seo - - Provide inline assembly code for RVCT compiler. - This is Savannah patch #7059. - - * include/freetype/config/ftconfig.h (FT_MULFIX_ASSEMBLER, - FT_MulFix_arm) [__CC_ARM || __ARM_CC]: Define. - -2010-01-08 Ken Sharp - - Fix Savannah bug #28521. - - Issue #28226 involved a work-around for a font which used the - `setcurrentpoint' operator in an invalid way; this operator is only - supposed to be used with the result of OtherSubrs, and the font used - it directly. The supplied patch removed the block of code which - checked this usage entirely. - - This turns out to be a Bad Thing. If `setcurrentpoint' is being - used correctly it should reset the flex flag in the decoder. If we - don't do this then the flag never gets reset and we omit any further - contours from the glyph (at least until we close the path or - similar). - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings) - : Handle `flex_state' correctly. - -2010-01-05 Werner Lemberg - - Apply reports from clang static analyzer. - - * src/lzw/ftlzw.c (ft_lzw_file_init), src/base/ftstroke.c - (FT_Stroker_ParseOutline), src/base/ftsynth.c - (FT_GlyphSlot_Embolden): Remove dead code. - - * src/base/ftpatent.c (_tt_check_patents_in_table): Initialize - `offset_i' and `length_i'. - -2010-01-05 Ralph Giles - - Enable the incremental font interface by default. - - Ghostscript requires the incremental font interface for handling - some Postscript documents. It is moving to using FreeType as its - primary renderer; supporting this in the default build makes it - Ghostscript to be linked against the system FreeType when one is - available. - - * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_INCREMENTAL): - Uncomment. - -2010-01-05 Werner Lemberg - - Fix Savannah bug #28395. - - * src/truetype/ttdriver.c (Load_Glyph), src/type1/t1gload.c - (T1_Loada_Glyph): Don't check `num_glyphs' if incremental interface - is used. - -2010-01-05 Ken Sharp - - Make Type 1 `seac' operator work with incremental interface. - This fixes Savannah bug #28480. - - * src/psaux/t1decode.c (t1operator_seac): Don't check `glyph_names' - if incremental interface is used. - -2010-01-04 Ken Sharp - - Make incremental interface work with TrueType fonts. - This fixes Savannah bug #28478. - - * src/truetype/ttgload.c (load_truetype_glyph): Don't check - `glyf_offset' if incremental interface is used. - -2009-12-31 Lars Abrahamsson - - Make compilation with FT_CONFIG_OPTION_PIC work again. - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap) [FT_CONFIG_OPTION_PIC]: - Declare `library' for FT_BITMAP_GLYPH_CLASS_GET. - - * src/base/ftinit.c (ft_destroy_default_module_classes, - ft_create_default_module_classes): Use proper casts (needed for C++ - compilation). - - * src/sfnt/ttcmap.c (tt_cmap13_class_rec): Use FT_DEFINE_TT_CMAP. - -2009-12-22 Marc Kleine-Budde - - Make freetype-config aware of $SYSROOT. - This is Savannah patch #7040. - - * builds/unix/freetype-config.in: Decorate with ${SYSROOT} where - appropriate. - -2009-12-20 Werner Lemberg - - Fix compiler warning. - Reported by Sean. - - * src/base/ftdbgmem.c [!FT_DEBUG_MEMORY]: ANSI C doesn't like empty - source files; however, some compilers warn about an unused variable - declaration. This is now replaced with a typedef. - -2009-12-18 Werner Lemberg - - Fix Savannah bug #28320. - - There exist corrupt, subsetted fonts (embedded in PDF files) which - contain a private dict that ends with an unterminated floating point - number (no operator following). We now ignore this error (as - acrobat does). - - * src/cff/cffparse.c (cff_parser_run): Don't emit a syntax error for - unterminated floating point numbers. - -2009-12-16 Werner Lemberg - - Really fix compiler warnings. - Reported by Sean. - - * src/truetype/ttgxvar.c (GX_PT_POINTS_ARE_WORDS, - GX_PT_POINT_RUN_COUNT_MASK): Convert enum values to macros. - -2009-12-16 suzuki toshiya - - Improve configure.raw to copy some options from CFLAGS to LDFLAGS. - The linker of Mac OS X 10.6 is sensitive to the architecture. If - the architectures are specified explicitly for the C compiler, the - linker requires the architecture specifications too. - - * builds/unix/configure.raw: Replace `-isysroot' option parser by - more generic argument parser. - -2009-12-15 Werner Lemberg - - Fix compiler warnings. - Reported by Sean. - - * src/truetype/ttgxvar.c (ft_var_readpackeddeltas): Fix counter data - type. - -2009-12-14 Ken Sharp - - Ignore invalid `setcurrentpoint' operations in Type 1 fonts. - This fixes Savannah bug #28226. - - At least two wild PostScript files of unknown provenance contain - Type 1 fonts, apparently converted from TrueType fonts in earlier - PDF versions of the files, which use the `setcurrentpoint' operator - inappropriately. - - FreeType currently throws an error in this case, but Ghostscript and - Adobe Distiller both accept the fonts and ignore the problem. This - commit #ifdefs out the check so PostScript interpreters using - FreeType can render these files. - - The specification says `setcurrentpoint' should only be used to set - the point after a `Subr' call, but these fonts use it to set the - initial point to (0,0). Unnecessarily so, as they correctly use an - `hsbw' operation which implicitly sets the initial point. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings) - : Comment out code. - -2009-12-14 Bram Tassyns - - Fix parsing of /CIDFontVersion. - This fixes Savannah bug #28287. - - * src/cid/cidtoken.h: `cid_version' in CID_FaceInfoRec (in - t1tables.h) is of type FT_Fixed. - -2009-12-14 Werner Lemberg - - Trace glyph index in CID module. - Suggested in Savannah patch #7023. - - * src/cid/cidgload.c (cid_load_glyph): Add tracing message. - -2009-12-03 Werner Lemberg - - Fix compiler warnings. - - * src/truetype/ttgload.c (tt_get_metrics): Put `Exit' label into the - proper preprocessor conditional. - * src/pfr/pfrobjs.c (pfr_slot_load): Pacify gcc. - -2009-11-25 John Tytgat - - Better handling of start of `eexec' section. - This fixes Savannah bug #28090. - - * src/type1/t1parse.c (T1_Get_Private_Dict): Skip all whitespace - characters before start of `eexec' section. - -2009-11-20 Werner Lemberg - - Fix Savannah bug #27742. - - * src/base/ftstroke.c (ft_stroker_outside): Avoid silent division by - zero, using a threshold for `theta'. - -2009-11-20 Werner Lemberg - - Fix Savannah bug #28036. - - * src/type1/t1afm.c (t1_get_index): Fix comparison. - -2009-11-16 Werner Lemberg - - Fix compiler warnings. - Reported by Kevin Blenkinsopp . - - * src/sfnt/ttload.c (check_table_dir): Use proper data type. - -2009-11-15 Werner Lemberg - - Really fix FreeDesktop bug #21197. - This also fixes Savannah bug #28021. - - * src/autofit/aflatin.c (af_latin_metrics_check_digits), - src/autofit/aflatin2.c (af_latin2_metrics_check_digits): Fix loop. - -2009-11-15 Werner Lemberg - - Add tracing messages for advance values. - - * src/base/ftobjs.c (FT_Load_Glyph), src/truetype/ttgload.c - (TT_Get_HMetrics, TT_Get_VMetrics): Do it. - -2009-11-08 Werner Lemberg - - Fix compiler warning. - Reported by Jeremy Manson . - - * src/truetype/ttgload.c (load_truetype_glyph): Initialize `error'. - -2009-11-04 Werner Lemberg - - Remove compiler warning. - Reported by Sean McBride . - - * src/tools/apinames.c (read_header_file): Use a cast to - `int', as specified in the printf(3) man page. - -2009-11-04 Werner Lemberg - - Fix Savannah bug #27921. - - * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c - (cid_face_init), src/type1/t1afm.c (T1_Read_Metrics), - src/type1/t1objs.c (T1_Face_Init): Don't use unsigned constant - values for rounding if the argument can be negative. - -2009-11-03 Bram Tassyns - - Add basic support for Type1 charstrings in CFF. - This fixes Savannah bug #27922. - - * src/cff/cffgload.c (CFF_Operator, cff_argument_counts): Handle - `seac', `sbw', and `setcurrentpoint' opcodes. - (cff_compute_bias): Add parameter to indicate the charstring type. - Update all callers. - (cff_operator_seac): Add parameter for side bearing. - (cff_decoder_parse_charstrings): Updated for more Type1 support. - -2009-11-03 Werner Lemberg - - Return correct `linearHoriAdvance' value for embedded TT bitmaps too. - Reported by Jeremy Manson . - - src/truetype/ttgload.c (load_truetype_glyph): Add parameter to - quickly load the glyph header only. - Update all callers. - (tt_loader_init): Add parameter to quickly load the `glyf' table - only. - Update all callers. - (TT_Load_Glyph): Compute linear advance values for embedded bitmap - glyphs too. - -2009-11-03 Werner Lemberg - - Improve code readability. - - * src/ttgload.c (load_truetype_glyph): Move metrics calculation - to... - (tt_get_metrics): This new function. - -2009-10-26 Bram Tassyns - - Fix Savannah bug #27811. - - * src/truetype/ttxgvar.c (ft_var_readpackeddeltas): Fix - signed/unsigned mismatch. - -2009-10-19 Ning Dong - - Fix handling of `get' and `put' CFF instructions. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) : Appendix B of Adobe Technote #5177 limits the number of - elements for the `get' and `put' operators to 32. - * src/cff/cffgload.h (CFF_MAX_TRANS_ELEMENTS): Define. - (CFF_Decoder): Use it for `buildchar' and remove `len_buildchar'. - -2009-10-18 Werner Lemberg - - Fix handling of `dup' CFF instruction. - Problem and solution reported by Ning Dong . - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) : - Increase `args' by 2, not 1. - -2009-10-10 Werner Lemberg - - * Version 2.3.11 released. - ========================== - - - Tag sources with `VER-2-3-11'. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.3.11. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualce/index.html, - builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj: s/2.3.10/2.3.11/, s/2310/2311/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 11. - - * builds/unix/configure.raw (version_info): Set to 9:22:3. - -2009-10-10 Werner Lemberg - - * docs/CHANGES, docs/release: Updated. - -2009-10-10 suzuki toshiya - - * src/pcf/pcfread.c (pcf_get_properties): Fix a bug in the nprops - truncation. Reported by Martin von Gagern and Peter Volkov. - https://bugs.gentoo.org/288357 and https://bugs.gentoo.org/288256 - -2009-10-06 Werner Lemberg - - * Version 2.3.10 released. - ========================== - - - Tag sources with `VER-2-3-10'. - - * builds/toplevel.mk (major, minor, patch): Fix regexp to allow more - than a single digit. - (dist): We now use git. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.3.10. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualce/index.html, - builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj: s/2.3.9/2.3.10/, s/239/2310/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 10. - - * builds/unix/configure.raw (version_info): Set to 9:21:3. - -2009-10-06 Werner Lemberg - - Fix `make multi'. - - * src/cache/ftccache.c, src/cache/ftcsbits.c (FT_COMPONENT): Define. - - * src/sfnt/sfdriver.c: Include FT_INTERNAL_DEBUG_H. - -2009-09-27 suzuki toshiya - - [cache] Fix Savannah bug #27441, clean up Redhat bugzilla #513582. - Tricky casts in FTC_{CACHE,GCACHE,MRULIST}_LOOKUP_CMP() are removed. - Now these functions should be called with FTC_Node or FTC_MruNode - variable, and the caller should cast them to appropriate pointers to - concrete data. These tricky casts can GCC-4.4 optimizer (-O2) - confused and the crashing binaries are generated. - - * src/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Drop tricky cast. - Now the 4th argument `node' of this function should be typed as - FTC_MruNode. - - * src/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP): For inline - implementation, new temporal variable FTC_MruNode `_mrunode' to take - the pointer from FTC_MRULIST_LOOKUP_CMP(). For non-inline - implementation, tricky cast is dropped. - - * src/cache/ftcmanag.c (FTC_SIZE_NODE): New macro casting - to FTC_SizeNode. - (FTC_Manager_LookupSize): Replace FTC_SizeNode `node' by FTC_MruNode - `mrunode', and FTC_SIZE_NODE() is inserted. - (FTC_FACE_NODE): New macro casting to FTC_FaceNode. - (FTC_Manager_LookupFace) Replace FTC_FaceNode `node' by FTC_MruNode - `mrunode', and FTC_FACE_NODE() is inserted. - - * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Change the type of - `node' from FTC_INode to FTC_Node. Extra casting macro FTC_NODE() - is dropped. - (FTC_ImageCache_LookupScaler): Ditto. - (FTC_SBitCache_Lookup): Change the type of `node' from FTC_SNode to - FTC_Node. Extra casting macro FTC_NODE() is dropped. FTC_SNODE() - is inserted. - (FTC_SBitCache_LookupScaler): Ditto. - - * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the type of - `node' from FTC_CMapNode to FTC_Node. Extra casting macro - FTC_NODE() is dropped, FTC_CMAP_NODE() is inserted. - -2009-09-25 suzuki toshiya - - [cache, psaux, type1] Fix for multi build. - In multi build, some cpp functions are left as unresolved symbols. - - * src/cache/ftcbasic.c: Include FT_INTERNAL_DEBUG_H for FT_TRACE1(). - - * src/psaux/t1decode.c: Include FT_INTERNAL_CALC_H for - FIXED_TO_INT(). - * src/type1/t1gload.c: Ditto. - * src/type1/t1objs.c: Ditto. - -2009-09-25 suzuki toshiya - - [autofit] Fix for multi build. - - * src/autofit/afmodule.h: Include FT_INTERNAL_OBJECTS_H to use - FT_DECLARE_MODULE() macro in multi build. - - * src/autofit/aflatin.c: Include to handle - FT_ADVANCES_H correctly in multi build. - -2009-09-24 suzuki toshiya - - [cache] Check the face filled by FTC_Manager_LookupFace(). - - * src/cache/ftcbasic.c (ftc_basic_family_get_count): Return - immediately if FTC_Manager_LookupFace() fills face by NULL. Such - case can occur when the code is optimized by GCC-4.2.x. - -2009-09-23 Werner Lemberg - - * docs/CHANGES: Updated. - -2009-09-12 Werner Lemberg - - [raster] Fix 5-levels grayscale output. - This was broken since version 2.3.0. - - * src/raster/ftraster.c (count_table): Use pre-2.3.0 values (which - were then computed dynamically). - (Vertical_Gray_Sweep_Step): Updated. - - (ft_black_render): Initialize `worker->gray_lines' (problem found by - valgrind). - - (FT_RASTER_OPTION_ANTI_ALIASING, DEBUG_RASTER): Dont' #undef, just - comment out. - -2009-09-12 suzuki toshiya - - Improve configure.raw for cross build. - - * builds/unix/configure.raw: Remove temporal files created by the - suffix checking for CC_BUILD. Set XX_ANSIFLAGS and XX_CFLAGS when - cross compiler is GCC. AC_PROG_CC checks whether the cross compiler - is GCC, its result is stored in GCC. - -2009-09-12 suzuki toshiya - - [BDF] Modify hash API to take size_t value instead of void *. - - The hash API in BDF driver is designed to be generic, it takes - void * typed data. But BDF driver always gives an unsigned long - integer (the index to a property). To reduce non-essential - casts from unsigned long to void* and from void* to unsigned - long, the hash API is changed to take size_t integer. - The issue of incompatible cast between unsigned long and void* - on LLP64 platform is reported by NightStrike from MinGW-Win64 - project. See - http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html - - * src/bdf/bdf.h: The type of hashnode->data is changed from - void* to size_t. - - * src/bdf/bdflib.c (hash_insert): Get size_t data, instead of - void* data. - (bdf_create_property): Get the name length of new property by - size_t variable, with a cut-off at FT_ULONG_MAX. - (_bdf_set_default_spacing): Get the name length of the face by - size_t variable, with a cut-off at 256. - (bdf_get_property): Get the property id by size_t variable to - reduce the casts between 32-bit prop ID & hashnode->data during - simple copying. - (_bdf_add_property): Ditto. - (_bdf_parse_start): Calculate the index to the property array - by size_t variable. - (bdf_get_font_property): Drop a cast to unsigned long. - -2009-09-10 suzuki toshiya - - [Win64] Improve the computation of random seed from stack address. - - On LLP64 platform, the conversion from pointer to FT_Fixed need - to drop higher 32-bit. Explict casts are required. Reported by - NightStrike from MinGW-w64 project. See - http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html - - * src/cff/cffgload.c: Convert the pointers to FT_Fixed explicitly. - - * src/psaux/t1decode.c: Ditto. - - -2009-09-03 Werner Lemberg - - [raster] Improvements for stand-alone mode. - - * src/raster/rules.mk: Don't handle ftmisc.h. It is needed for - stand-alone mode only. - - * src/raster/ftmisc.h (FT_MemoryRec , FT_Alloc_Func, FT_Free_Func, - FT_Realloc_Func): Copy declarations from ftsystem.h. - -2009-09-02 Bram Tassyns - - Improve vertical metrics calculation (Savannah bug #27364). - - The calculation of `vertBearingX' is not defined in the OTF font - spec so FreeType does a `best effort' attempt. However, this value - is defined in the PDF and PostScript specs, and that algorithm is - better than the one FreeType currently uses: - - FreeType: Use the middle of the bounding box as the X coordinate - of the vertical origin. - - Adobe PDF spec: Use the middle of the horizontal advance vector as - the X coordinate of the vertical origin. - - FreeType's algorithm goes wrong if you have a really small glyph - (like the full-width, circle-like dot at the end of the sentence, as - used in CJK scripts) with large bearings. With the FreeType - algorithm this dot gets centered on the baseline; with the PDF - algorithm it gets the correct location (in the top right). Note - that this is a serious issue, it's like printing the dot at the end - of a Roman sentence at the center of the textline instead of on the - baseline like it should. So i believe the PDF spec's algorithm - should be used in FreeType as well. - - The `vertBearingY' value for such small glyphs is also very strange - if no `vmtx' information is present, since the height of the bbox is - not representable for the height of the glyph visually (the - whitespace up to the baseline is part of the glyph). The fix also - includes some code for a better estimate of `vertBearingY'. - - * src/base/ftobjs.c (ft_synthesize_vertical_metrics): `vertBearingX' - is now calculated as described by the Adobe PDF Spec. Estimate for - `vertBearingY' now works better for small glyphs completely above or - below the baseline into account. - - * src/cff/cffgload.c (cff_slot_load): `vertBearingX' is now - calculated as described by the Adobe PDF Spec. Vertical metrics - information was always ignored when FT_CONFIG_OPTION_OLD_INTERNALS - was not defined. - - * src/truetype/ttgload.c (compute_glyph_metrics): `vertBearingX' is - now calculated as described by the Adobe PDF Spec. - -2009-09-01 John Tytgat - - Fix custom cmap for empty Type 1 font (Savannah bug #27294). - - * include/freetype/internal/t1types.h (T1_EncodingRecRec_): Update - comment to reflect revised code_last meaning. - * src/type1/t1load.c (T1_Open_Face), src/type42/t42objs.c - (T42_Open_Face): Assign max_char as highest character code + 1 and - use this for T1_EncodingRecRec_::code_last. - * src/psaux/t1cmap.c (t1_cmap_custom_init): Follow revised - T1_EncodingRecRec_::code_last meaning. - -2009-08-25 Werner Lemberg - - Fix rendering of horizontally compressed CFFs. - Bug reported by Ivan Nincic . - - * src/cff/cffgload.c (cff_slot_load): Thinko: Check `xx' element of - `font_matrix' also. - - * docs/CHANGES: Updated. - -2009-08-03 suyu0925@gmail.com - - Don't call `ft_fseek' every time when executing `ft_fread'. - - * src/base/ftstream.c (FT_Stream_Seek), src/base/ftsystem.c - (ft_ansi_stream_io): Implement it. - -2009-07-31 suzuki toshiya - - sfnt: Cast a charcode to 32-bit in cmap format 14 parser. - - * src/sfnt/ttcmap.c (tt_cmap14_char_var_index, - tt_cmap14_char_var_isdefault, tt_cmap14_char_variants, - tt_cmap14_variant_chars): Correct mismatches from - FT_CMap_CharVarIndexFunc prototype, FT_ULong arguments - are replaced by FT_UInt32 arguments. - -2009-07-31 suzuki toshiya - - sfnt: Cast a charcode to 32-bit in cmap format 12 parser. - - * src/sfnt/ttcmap.c (tt_cmap12_char_next): - Insert explicit cast from FT_UFast to FT_UInt32 - for return value. - -2009-07-31 suzuki toshiya - - psaux: Fix a few casts to FT_Int32 value. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): - Fix a few casts setting `value' from FT_Long to FT_Int32, - because `value' is typed as FT_Int32 since 2009-06-22. - -2009-07-31 suzuki toshiya - - sfnt: Fix a data type mismatching with its source. - - * src/sfnt/ttcmap.c (tt_cmap13_char_next): Fix the - type of `gindex' from FT_ULong to FT_UInt because - it is set by FT_UInt tt_cmap13_char_map_binary() or - TT_CMap13->cur_gindex. - -2009-07-31 suzuki toshiya - - sfnt: Extend a few local variables to load 32-bit values. - - * src/sfnt/ttkern.c (tt_face_load_kern): Extend `count' - and `kern' to load 32-bit values. - -2009-07-31 suzuki toshiya - - pfr: Extend `num_aux' to take 32-bit value. - - * src/pfr/pfrload.c (pfr_phy_font_load): Extend - `num_aux' to load 32-bit value. - -2009-07-31 suzuki toshiya - - pcf: Truncate FT_ULong `nprops' to fit to int PCF_Face->nprops. - - * src/pcf/pcfread.c (pcf_get_properties): Load `nprops' - as FT_ULong value from PCF file, but truncate it as - int to fit PCF_Face->nprops. The number of truncated - properties is shown in the trace message. - -2009-07-31 suzuki toshiya - - gxvalid: Extend a few local variables to reduce the casts. - - * src/gxvalid/gxvmorx.c (gxv_morx_subtables_validate): - Extend `type' and `rest' to take FT_ULong values. - -2009-07-31 suzuki toshiya - - gxvalid: Extend `settingTable' to take 32-bit offset. - - * src/gxvalid/gxvfeat.c (gxv_feat_name_validate): - Extend `settingTable' to take 32-bit offset. - -2009-07-31 suzuki toshiya - - autofit: Cast FT_Long glyph_count to compare with FT_UInt GID. - - * src/autofit/afglobal.c (af_face_globals_is_digit, - af_face_globals_compute_script_coverage): Cast FT_Long - globals->glyph_count to FT_ULong, to compare with FT_UInt - gindex. - -2009-07-31 suzuki toshiya - - smooth: Exclude 16-bit system in invalid pitch/height check. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): - pitch and height are typed as FT_UInt but checked to fit - 16-bit range, to avoid the overflows. On 16-bit system, - this checking inserts a conditional that never occurs. - -2009-07-03 suzuki toshiya - - cff: Type large constants > 0x7FFF as long for 16-bit systems. - - * src/cff/cffload.c (cff_charset_load): Type large - constants > 0x7FFF as long, because normal constants - are typed signed integer that is less than 0x8000 on - 16-bit systems. - -2009-07-31 suzuki toshiya - - base: Remove an unused variable. - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Remove an - unused variable `library'. glyph->library is used. - -2009-07-31 suzuki toshiya - - cache: Check higher bits in flags for non ILP32 systems. - - 4 public functions ought to take FT_ULong flags, but take - FT_UInt flags. To keep binary compatibility, we drop higher - bits on non ILP32 platforms, - ILP64 systems: No drop occurs. - LP64 systems: Higher bits are not used. - 16-bit systems: Drop can occur. - See - http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00065.html - These functions will be refined to take FT_ULong flags in - next bump with incompatible API change. - - * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): - Check `flags' in `type', the 2nd argument. - (FTC_SBitCache_Lookup): Ditto. - (FTC_ImageCache_LookupScaler): Check `load_flags', - the 3rd argument. - (FTC_SBitCache_LookupScaler): Ditto. - -2009-07-31 suzuki toshiya - - sfnt: Ignore invalid GIDs in glyph name lookup. - - * include/freetype/internal/fttrace.h: - New trace module for sfdriver.c is added. - - * src/sfnt/sfdriver.c (sfnt_get_name_index): - Restrict glyph name lookup to FT_UInt GID. - Genuine TrueType can hold 16-bit glyphs. - -2009-07-31 suzuki toshiya - - pcf: Fix a comparison between FT_Long and FT_ULong. - - * src/pcf/pcfread.c (pcf_get_bitmaps): Return an error - if PCF_Face->nemetrics is negative. - -2009-07-31 suzuki toshiya - - gxvalid: Guarantee `nFeatureFlags' size up to 32-bit. - - * src/gxvalid/gxvmort.c (gxv_mort_featurearray_validate): - Extend the 3rd argument `nFeatureFlags' to FT_ULong. - * src/gxvalid/gxvmort.h: Ditto. - -2009-07-31 suzuki toshiya - - sfnt: Insert explicit cast for LP64 system. - - * src/sfnt/ttkern.c (tt_face_load_kern): Insert - cast from unsigned long to FT_UInt32. - -2009-07-31 suzuki toshiya - - gxvalid: Guarantee `just' table size upto 32-bit. - - * src/gxvalid/gxvjust.c (gxv_just_validate): - The type of `offset' is changed from FT_UInt to - FT_Offset, for 16-bit platforms. - -2009-07-31 suzuki toshiya - - gxvalid: Guarantee `trak' table size upto 32-bit. - - * src/gxvalid/gxvtrak.c (gxv_trak_validate): - The type of `offset' is changed from FT_UInt to - FT_Offset, for 16-bit platforms. - -2009-07-31 suzuki toshiya - - type1: Fix a data type mismatching with its source. - - * include/freetype/internal/t1types.h: The type of - T1_Face->buildchar is matched with T1_Decorder->top. - -2009-07-31 suzuki toshiya - - pfr: Fix a data type mismatching with its source. - - * src/pfr/pfrtypes.h: The type of PFR_KernItem->offset - is extended from FT_UInt32 to FT_Offset, because it is - calculated with the pointer difference, in - pfr_extra_item_load_kerning_pairs(). - -2009-07-31 suzuki toshiya - - pfr: Fix a data type mismatching with its source. - - * src/pfr/pfrtypes.h: The type of PFR_PhysFont->chars_offset - is extended from FT_UInt32 to FT_Offset, because it is - calculated with the pointer difference in pfr_phy_font_load(). - -2009-07-31 suzuki toshiya - - pfr: Fix a data type mismatching with its source. - - * src/pfr/pfrtypes.h: The type of PFR_PhyFont->bct_offset - is extended from FT_UInt32 to FT_Long, because it is - loaded by FT_STREAM_POS() in pfr_phy_font_load(). - -2009-07-31 suzuki toshiya - - smooth: Improve the format in debug message. - - * src/smooth/ftgrays.c (gray_dump_cells): Improve the - format specifications to dump variables. - -2009-07-31 suzuki toshiya - - sfnt: Fix a data type mismatching with its source. - - * src/sfnt/sfobjs.c (sfnt_load_face): The type of - local `flags' is matched with FT_Face->face_flags. - -2009-07-31 suzuki toshiya - - psaux: Fix a data type mismatching with its source. - - * include/freetype/internal/psaux.h: The type of - T1_DecorderRec.buildchar is matched with - T1_DecorderRec.top. - -2009-07-31 suzuki toshiya - - truetype: Extend TrueType GX packed deltas to FT_Offset. - - * src/truetype/ttgxvar.c (ft_var_readpackeddeltas): - The type of 2nd argument `delta_cnt' is changed from - FT_Int to FT_Offset, because its source can be cvt - table size calculated from stream position. - -2009-07-31 suzuki toshiya - - truetype: Extend mmvar_len to hold size_t values. - - * src/truetype/ttgxvar.h: The type of - GX_BlendRec.mmvar_len is changed from FT_Int to - FT_Offset, because TT_Get_MM_Var() calculates it - by sizeof() results. - -2009-07-31 suzuki toshiya - - truetype: Check invalid function number in IDEF instruction. - - * src/truetype/ttinterp.c (Ins_IDEF): Check - if the operand fits to 8-bit opcode limitation. - -2009-07-31 suzuki toshiya - - truetype: Check invalid function number in FDEF instruction. - - * src/truetype/ttinterp.c (Ins_FDEF): Check - if the operand fits 16-bit function number. - -2009-07-31 suzuki toshiya - - truetype: Truncate the deltas of composite glyph at 16-bit values. - - * src/truetype/ttgload.c (load_truetype_glyph): - Insert cast from FT_Long (deltas[i].{x,y}) to - FT_Int16 in the summation of deltas[] for composite - glyphs. Because deltas[i] is typed as FT_Pos, - its component x, y are typed as FT_Long, but - their sources are always FT_Int16 when they are - loaded by ft_var_readpackeddeltas(). However, - the limitation about the summed deltas is unclear. - -2009-07-31 suzuki toshiya - - truetype: Truncate the instructions upto 16-bit per a glyph. - - * src/truetype/ttgload.c (TT_Hint_Glyph): Truncate - the instructions upto 16-bit length per a glyph. - -2009-07-31 suzuki toshiya - - truetype: Cast the numerical operands to 32-bit for LP64 systems. - - * src/truetype/ttinterp.c (Ins_SPHIX, INS_MIAP, - Ins_MIRP): Insert cast from long (args[], the - operands passed to TrueType operator) to FT_Int32 - (the argument of TT_MulFix14()). - -2009-07-31 suzuki toshiya - - truetype: Cast the project vector to 32-bit for LP64 system. - - * src/truetype/ttinterp.c (Project, DualProject): - Insert casts from FT_Pos (the arguments `dx', `dy') - to FT_UInt32 (the argument to TT_DotFix14()). - -2009-07-31 suzuki toshiya - - truetype: Cast the scaling params to 32-bit for LP64 system. - - * src/truetype/ttgload.c (TT_Process_Composite_Component): - Insert casts from long (return value of FT_MulFix()) to - FT_Int32 (the argument to FT_SqrtFixed()). - -2009-07-31 suzuki toshiya - - sfnt: Cast a character code to FT_UInt32 for LP64 system. - - * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary, - tt_cmap14_variants, tt_cmap14_char_variants, - tt_cmap14_def_char_count, tt_cmap14_get_def_chars, - tt_cmap14_get_nondef_chars, tt_cmap14_variant_chars) - Insert casts when FT_UInt32 variable is loaded by - TT_NEXT_{UINT24|ULONG}. Because most of them are - compared with FT_UInt32 values in public API, replacing - FT_UFast is not recommended. - -2009-07-31 suzuki toshiya - - sfnt: Cast a character code to FT_UInt32 for LP64 system. - - * src/sfnt/ttcmap.c (tt_cmap4_init, tt_cmap4_next): - Insert the casts from unsigned long constant to - FT_UInt32. - -2009-07-31 suzuki toshiya - - sfnt: Extend TT_BDF->strings_size to FT_ULong for huge BDF. - - * include/freetype/internal/tttypes.h: The type - of TT_BDF->string_size is extended from FT_UInt32 - to FT_ULong, because BDF specification does not - restrict the length of string. - * src/sfnt/ttbdf.c: The scratch variable `strings' - to load TT_BDF->string_size is matched with - TT_BDF->string_size. - -2009-07-31 suzuki toshiya - - psaux: Handle the string length by FT_Offset variables. - - * src/psaux/afmparse.c (afm_parser_next_key, - afm_tokenize, afm_parse_track_kern, - afm_parse_kern_pairs, afm_parse_kern_data, - afm_parser_skip_section, afm_parser_parse): - The length of key is handled by FT_Offset, - instead of FT_UInt. Although the length of - PostScript strings or name object is 16-bit, - AFM_STREAM_KEY_LEN() calculates the length - from the pointer difference. - - * src/psaux/afmparse.h (afm_parser_next_key): - Ditto. - -2009-07-31 suzuki toshiya - - pcf: Fix some data types mismatching with their sources. - - * src/pcf/pcfread.c (pcf_get_bitmaps): The types - of `nbitmaps', `i', `sizebitmaps' are matched with - the type of area FT_Bitmap.pitch * FT_Bitmap.rows. - -2009-07-31 suzuki toshiya - - pcf: Handle the string length by size_t variables. - - * src/pcf/pcfread.c (pcf_interpret_style): The types - of nn, len, lengths[4] are changed to size_t, because - they are loaded by (or compared with) ft_strlen(). - - * src/pcf/pcfutil.c (BitOrderInvert, TwoByteSwap, - FourByteSwap): The type of the 2nd argument `nbytes' - is changed to size_t, for similarity with ANSI C - string functions. - - * src/pcf/pcfdrivr.c (PCF_Glyph_Load): The type of - `bytes' is changed to FT_Offset, because it is passed - to FT_ALLOC(), via ft_glyphslot_alloc_bitmap(). At - least, using unsigned type is better. - -2009-07-31 suzuki toshiya - - pcf: Fix some data types mismatching with their sources. - - * src/pcf/pcfread.c (pcf_seek_to_table_type, - pcf_has_table_type): The type of 3rd argument - `ntables' is matched with PCF_Toc->count. - -2009-07-31 suzuki toshiya - - otvalid: Truncate the glyph index to 16-bit. - - * src/otvalid/otvalid.c (otv_validate): Checks - face->num_glyphs does not exceed 16-bit limit, - pass FT_UInt num_glyphs to backend functions - otv_{GPOS|GSUB|GDEF|JSTF|MATH}_validate(). - -2009-07-31 suzuki toshiya - - cache: Insert explict casts for LP64 systems. - - * src/cache/ftcbasic.c (FTC_ImageCache_Lookup, - FTC_SBitCache_Lookup): The type of FTC_ImageType->width - is FT_Int, so the cast to unsigned larger type FT_ULong - is introduced for the comparisons with 0x10000L for - LP64 platform. - -2009-07-31 suzuki toshiya - - cache: Fix some data types mismatching with their sources. - - * src/cache/ftccache.h: The type of return value - by FTC_Node_WeightFunc function is changed to - FT_Offset. The type of FTC_CacheClass->cache_size - is changed to FT_Offset, too. - - * src/cache/ftccback.h (ft_inode_weight, - ftc_snode_weight): Ditto. - - * src/cache/ftccmap.c (ftc_cmap_node_weight): Ditto. - - * src/cache/ftcimage.c (ftc_inode_weight, - FTC_INode_Weight): Ditto. - - * src/cache/ftcsbits.c (ftc_snode_weight, - FTC_SNode_Weight): Ditto. - - * src/cache/ftcmru.h: The type of - FTC_MruListClass->node_size is changed to FT_Offset, - because it is passed to FT_ALLOC() to specify the - size of buffer. - -2009-07-31 suzuki toshiya - - XXX_cmap_encoding_char_next() return FT_UInt32 values. - - * include/freetype/internal/services/svpscmap.h: - The size of the charcode value returned by - the function typed PS_Unicodes_CharNextFunc is - matched with its input charcode value. - - * src/cff/cffmap.c (cff_cmap_encoding_char_next, - cff_cmap_unicode_char_next): Ditto. - - * src/pfr/pfrmap.c (pfr_cmap_encoding_char_next): - Ditto. - - * src/psaux/t1cmap.c (t1_cmap_std_char_next, - t1_cmap_custom_char_next, t1_cmap_unicode_char_next): - Ditto. - - * src/psnames/psmodule.c (ps_unicodes_char_next): - Ditto. - - * src/winfonts/winfnt.c (fnt_cmap_char_next): - Ditto. - - * src/sfnt/ttcmap.c (tt_cmap0_char_next, - tt_cmap2_char_next, tt_cmap4_char_next, - tt_cmap6_char_next, tt_cmap10_char_next, - tt_cmap12_char_next, tt_cmap13_char_next): Ditto. - (tt_cmap14_char_variants): Handle base unicode - codepoint by FT_UInt32 variable to avoid overflow - on 16-bit platforms. - (tt_cmap14_ensure): The type of `num_results' is - extend to FT_UInt32, to cover unsigned 32-bit - `numVarSelectorRecords' in cmap14 table header. - -2009-07-31 suzuki toshiya - - truetype: Extend TT_Face->num_locations for broken TTFs. - - * include/freetype/internal/tttypes.h: - TT_Face->num_locations are extended from FT_UInt - to FT_ULong, to stand with broken huge loca table. - Some people insists there are broken TTF including - the glyphs over 16-bit limitation, in PRC market. - * src/truetype/ttpload.c (tt_face_load_loca): - Remove unrequired 16-bit truncation for FT_UInt - TT_Face->num_locations. - -2009-07-31 suzuki toshiya - - smooth: Fix some data types mismatching with their sources. - - * src/smooth/ftgrays.c: The type of `TCoord' is - matched to `TPos', because they are mixed in - gray_set_cell(). The type of TCell->x is extended - to `TPos', because gray_find_cell() sets it by - TWorker.ex. The type of TCell->cover is extended - to `TCoord', because gray_render_scanline() adds - TCoord value to it. The type of TWork.cover is matched - with TCell->cover. The types of - TWork.{max_cells,num_cells} are changed to FT_PtrDist, - because they are calculated from the memory addresses. - The type of TWork.ycount is changed to TPos, because - it is calculated from TPos variables. - (gray_find_cell): The type of `x' is matched with - its initial value ras.ex. - (gray_render_scanline): The types of `mod', `lift' - and `rem' are changed to TCoord, because their values - are set with explicit casts to TCoord. When ras.area - is updated by the differential values including - `delta', they are explicitly cast to TArea, because - the type of `delta' is not TArea but TCoord. - (gray_render_line): The type of `mod' is extended - from int to TCoord, because (TCoord)dy is added to mod. - (gray_hline): The argument `acount' is extended to - TCoord, to match with the parameters in the callers. - -2009-07-31 suzuki toshiya - - cff: Fix some data types mismatching with their sources. - - * src/cff/cffobjs.c (cff_face_init): The type of - `scaling' is matched with the scaling parameter - in FT_Matrix_Multiply_Scaled() and - FT_Vector_Transform_Scaled(). - - * src/cff/cffparse.c (cff_parse_real): The type of - `power_ten', `scaling', `exponent_add', - `integer_length', `fraction_length', - `new_fraction_length' and `shift' are matched with - the type of `exponent' to avoid unexpected truncation. - (cff_parse_fixed_scaled): The type of `scaling' is - matched with the `scaling' argument to - cff_parse_real(). - (cff_parse_fixed_dynamic): Ditto. - (cff_parse_font_matrix): The type of `scaling' is - matched with the `scaling' argument to - cff_parse_dynamic(). - -2009-07-31 suzuki toshiya - - autofit: Fix some data types mismatching with their sources. - - * src/autofit/afglobal.c: Correct the type of - AF_FaceGlobalsRec.glyph_count to match with - FT_Face->num_glyphs. - (af_face_globals_compute_script_coverage): - Insert explicit cast to compare - FT_Long AF_FaceGlobalsRec.glyph_count versus - FT_UInt gindex. The type of `nn' is changed - to scan glyph index upto AF_FaceGlobalsRec.glyph_count. - (af_face_globals_get_metrics): The type of `script_max' - is changed to cover size_t value. Insert explicit cast - to compare FT_Long AF_FaceGlobalsRec.glyph_count versus - FT_UInt gindex. - - * src/autofit/afhints.c (af_axis_hints_new_segment): - Insert explicit cast to calculate `big_max' from - integer and size_t values. - (af_axis_hints_new_edge): Ditto. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): - The type of `best_y' is matched to FT_Vector.y. - (af_latin_compute_stem_width): The type of `delta' is - matched to `dist' and `org_dist'. - -2009-07-31 suzuki toshiya - - autofit: Count the size of the memory object by ptrdiff_t. - - * src/autofit/afcjk.c (af_cjk_hint_edges): The - number of edges `n_edges' should be counted by - FT_PtrDist variable instead of FT_Int. - - * src/autofit/aflatin.c (af_latin_hint_edges): - Ditto. - - * src/autofit/aftypes.h: In AF_ScriptClassRec, - the size of metric `script_metrics_size' should - be counted by FT_Offset variable instead of FT_UInt. - - * src/autofit/afhints.c - (af_glyph_hints_align_strong_points): The cursors - for the edges `min', `max', `mid' in the memory - buffer should be typed FT_PtrDist. - -2009-07-31 suzuki toshiya - - autofit: Fix for unused variable `first'. - - * src/autofit/afhints.c (af_glyph_hints_reload): Insert - FT_UNUSED() to hide the unused variable warning. - -2009-07-31 suzuki toshiya - - Improve bitmap size or pixel variables for 16-bit systems. - - * include/freetype/config/ftstdlib.h: Introduce - FT_INT_MIN, to use in signed integer overflow in - 16-bit and 64-bit platforms. - - * include/freetype/internal/fttrace.h: Add a tracer - to ftsynth.c. - - * src/base/ftbitmap.c (FT_Bitmap_Embolden): Check - invalid strength causing integer overflow on 16-bit - platform. - - * src/base/ftcalc.c (ft_corner_orientation): Change - the internal calculation from FT_Int to FT_Long, to - avoid an overflow on 16-bit platforms. The caller of - this function should use only the sign of result, - so the cast to FT_Int is acceptable. - - * src/base/ftsynth.c: Introduce a tracer for synth module. - (FT_GlyphSlot_Embolden): Check invalid strength causing - integer overflow on 16-bit platform. - - * src/bdf/bdfdrivr.c (BDF_Face_Init): The glyph index - in FT2 API is typed as FT_UInt, although BDF driver - can handle unsigned long glyph index internally. To - avoid integer overflow on 16-bit platform, too large - glyph index should be excluded. - (BDF_Glyph_Load): The glyph pitch in FT2 is typed as - FT_UInt, although BDF driver can handle unsigned long - glyph pitch internally. To avoid integer overflow on - 16-bit platform, too large glyph pitch should not be - returned. - - * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): The glyph - pitch in FT2 is typed as FT_UInt, although PFR font - format can include huge bitmap glyph with 24-bit pitch - (however, a glyph spends 16.7 pixel, it's not realistic). - To avoid integer overflow on 16-bit platform, huge - bitmap glyph should be excluded. - - * src/smooth/ftgrays.c (gray_hline): As FT_Span.x is - truncated to fit its type (16-bit short), FT_Span.y - should be truncated to fit its type (FT_Int). - - * src/cff/cffdrivr.c (cff_get_ros): CFF specification - defines the supplement in ROS as a real number. - Truncate it to fit public FT2 API. - - * src/cff/cffparse.c (cff_parse_cid_ros): Warn the - supplement if it is truncated or rounded in cff_get_ros(). - - * src/cff/cfftypes.h: Change the type of internal variable - `supplement' from FT_Long to FT_ULong to fit the signedness - to the type in public API. - -2009-07-31 suzuki toshiya - - psaux: Prevent invalid arguments to afm_parser_read_vals(). - - * src/psaux/afmparse.c (afm_parser_read_vals): Change - the type of `n' to prevent negative number how many - arguments should be parsed. - - * src/psaux/afmparse.h (afm_parser_read_vals): Ditto. - -2009-07-31 suzuki toshiya - - base: Prevent some overflows on LP64 systems. - - * src/base/ftadvance.c (FT_Get_Advances): Cast the - unsigned long constant FT_LOAD_ADVANCE_ONLY to FT_UInt32 - for LP64 platforms. - - * src/base/ftcalc.c (FT_Sqrt32): All internal variables - are changed to FT_UInt32 from FT_ULong. - (FT_MulDiv): Insert casts to FT_Int32 for LP64 platforms. - This function is designed for 32-bit integer, although - their arguments and return value are FT_Long. - - * src/base/ftobjs.c (FT_Get_Char_Index): Check `charcode' - is within unsigned 32-bit integer for LP64 platforms. - (FT_Face_GetCharVariantIndex): Check `charcode' and - `variantSelector' are within 32-bit integer for LP64 - platforms. - (FT_Face_GetCharsOfVariant): Check `variantSelector' is - within unsigned 32-bit integer for LP64 platforms. - - * src/base/fttrigon.c (ft_trig_downscale): The FT_Fixed - variable `val' and unsigned long constant FT_TRIG_SCALE - are cast to FT_UInt32, when calculates FT_UInt32. - (FT_Vector_Rotate): The long constant 1L is cast to - FT_Int32 to calculate FT_Int32 `half'. - -2009-07-31 suzuki toshiya - - cff: Cast the long variables to 32-bit for LP64 systems. - - * src/cff/cffdrivr.c (cff_get_advances): Insert - explicit cast to modify a 32-bit flag by unsigned - long constant. - - * src/cff/cffobjs.c (cff_face_init): Ditto. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings): - Replace the casts to FT_Long by the casts to FT_Int32 - for LP64 platforms. - -2009-07-31 suzuki toshiya - - pcf: Improve PCF_PropertyRec.value names on LP64 platforms. - - * src/pcf/pcf.h: In PCF_PropertyRec.value, the member - `integer' is replaced by `l', `cardinal' is replaced - by `ul', to fix the difference between the name and - the types on LP64 platforms. - - * src/pcf/pcfdrivr.c (pcf_get_bdf_property): Reflect - PCF_PropertyRec.value change, with appropriate casts - to FT_Int32/FT_UInt32. Their destinations - BDF_PropertyRec.{integer|cardinal} are public and - explicitly defined as FT_Int32/FT_UInt32. - - * src/pcf/pcfread.c (pcf_get_properties, pcf_load_font): - Reflect PCF_PropertyRec.value change. - -2009-07-31 suzuki toshiya - - pcf: Fix some data types mismatching with their sources. - - * src/pcf/pcfdrivr.c (pcf_cmap_char_index): The type of - `code' is matched to PCF_Encoding->enc. - (pcf_cmap_char_next): The type of `charcode' is matched - to PCF_Encoding->enc. When *acharcode is set by charcode, - an overflow is checked and cast to unsigned 32-bit - integer. - -2009-07-31 suzuki toshiya - - bdf: Improve bdf_property_t.value names for LP64 platforms. - - * src/bdf/bdf.h: In bdf_property_t.value, the member - `int32' is replaced by `l', `card32' is replaced by - `ul', to fix the difference between the name and the - types on LP64 platforms. - - * src/bdf/bdfdrivr.c (BDF_Face_Init): Reflect - bdf_property_t.value change. - (bdf_get_bdf_property): Reflect bdf_property_t.value - change, with appropriate casts to FT_Int32/FT_UInt32. - Their destinations BDF_PropertyRec.{integer|cardinal} - are public and explicitly defined as FT_Int32/FT_UInt32. - - * src/bdf/bdflib.c (_bdf_add_property): Reflect - bdf_property_t.value change. - -2009-07-31 suzuki toshiya - - bdf: Fix some data types mismatching with their sources. - - * src/bdf/bdrdrivr.c (bdf_cmap_char_index): The type - of `code' is matched with BDF_encoding_el->enc. - (bdf_cmap_char_next): The type of `charcode' is - matched with BDF_encoding_el->enc. When *acharcode - is set by charcode, an overflow is checked and - cast to unsigned 32-bit integer. - -2009-07-31 suzuki toshiya - - autofit: Improve Unicode range definitions. - - * src/autofit/aftypes.h (AF_UNIRANGE_REC): New macro - to declare a range by two unsigned 32-bit integer, - to avoid 64-bit range definition on LP64 platforms. - - * src/autofit/aflatin.c (af_latin_uniranges): Ditto. - - * src/autofit/aflatin2.c (af_latin2_uniranges): Ditto. - - * src/autofit/afindic.c (af_indic_uniranges): Ditto. - - * src/autofit/afcjk.c (af_cjk_uniranges): Declare - the ranges by AF_UNIRANGE_REC. - -2009-07-31 suzuki toshiya - - smooth: Fix a data type mismatching with its source. - - * src/smooth/ftgrays.c (gray_sweep): The type of - `area' is matched with the 3rd argument `area' - of gray_hline(). - -2009-07-31 suzuki toshiya - - smooth: Fix a data type mismatching with its source. - - * src/smooth/ftgrays.c (gray_render_line): The type - of `area' is matched with TWorker.area. - -2009-07-31 suzuki toshiya - - cache: Disable the legacy compatibility if 16-bit system. - - * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Exclude - the legacy behaviour from 16-bit platform, because the - current hack cannot detect the caller uses this function - via legacy convension. - (FTC_SBitCache_Lookup): Ditto. - -2009-07-31 suzuki toshiya - - cache: Check 32-bit glyph index on 16-bit systems. - - * src/cache/ftcbasic.c (ftc_basic_family_get_count): - Check overflow caused by the face including large - number of glyphs > 64k. - -2009-07-31 suzuki toshiya - - cache: Fix some data types mismatching with their sources. - - * src/cache/ftccache.c (ftc_cache_resize): The types of - `p', `mask', `count' are matched with FTC_Cache->{p,mask}. - (FTC_Cache_Clear): The type of `old_index' is matched to - FTC_Cache->{p,mask}. - - * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): The type - of `_idx' is matched with FTC_Cache->{p,mask}. - -2009-07-31 suzuki toshiya - - cache: Fix some data types mismatching with their sources. - - * src/cache/ftcsbits.c (ftc_snode_load): The types - of `xadvance' and `yadvance' are matched with - FT_GlyphSlot->advance.{x|y}. - -2009-07-31 suzuki toshiya - - cache: Cast NULL to a required function type explicitly. - - * src/cache/ftcmanag.c (FTC_Manager_RemoveFaceID): - Insert explicit cast from NULL to function type. - -2009-07-31 suzuki toshiya - - fttypes.h: Cast FT_MAKE_TAG output to FT_Tag exlicitly. - - * include/freetype/fttypes.h (FT_MAKE_TAG): - Cast the result to FT_Tag. - -2009-07-31 suzuki toshiya - - psnames: Handle Unicode codepoints by FT_UInt32 variables. - - * src/psnames/psmodule.c (BASE_GLYPH): Cast the result - to unsigned 32-bit integer for LP64 platform. - (ps_unicode_value): Return the value by unsigned 32-bit - integer instead of unsigned long. - -2009-07-31 suzuki toshiya - - psaux: Use size_t variable to pass the buffer size. - - * src/psaux/psaux.h (to_bytes): The type of `max_bytes' - (the argument to pass the buffer size) is changed to - size_t, to match with ANSI C string functions. - - * src/psaux/psconv.h (PS_Conv_StringDecode, - PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto. - - * src/psaux/psconv.c (PS_Conv_StringDecode, - PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto. - - * src/psaux/psobjs.h (ps_parser_to_bytes): Ditto. - - * src/psaux/psobjs.c (ps_parser_to_bytes): Ditto. - -2009-07-31 suzuki toshiya - - type1: Use size_t variable to pass the string length. - - * psaux.h: The type of `len' (the argument to pass - the buffer size to the function in AFM_ParserRec) - is changed to size_t, to match with ANSI C string - functions. - - * t1afm.c (t1_get_index): Ditto. - - * test_afm.c (dummy_get_index): Ditto. - - * afmparse.c (afm_parser_read_vals): To call - AFM_ParserRec.get_index, the length of token - `len' is cast to size_t. - -2009-07-31 suzuki toshiya - - cid: Fix some data types mismatching with their sources. - - * src/cid/cidparse.c (cid_parser_new): The types of - `read_len' and `stream_len' are matched to - FT_Stream->size. Unrequired cast is removed. - -2009-07-31 suzuki toshiya - - cff: Fix for unused variable `rest'. - - * src/cff/cffparse.c (cff_parse_real): Insert - FT_UNUSED() to hide the unused variable warning. - -2009-07-31 suzuki toshiya - - cff: Fix some data types mismatching with their sources. - - * src/cff/cffgload.c (cff_slot_load): The types of - `top_upm' and `sub_upm' are matched with - CFF_FontRecDict->units_per_em. - - * src/cff/cffobjs.c (cff_size_select): Ditto. - (cff_size_request): Ditto. - -2009-07-31 suzuki toshiya - - bdf: Fix some data types mismatching with their sources. - - * bdflib.c (_bdf_list_ensure): The type of `num_items' - is matched with _bdf_list_t.used. Also the types of - `oldsize', `newsize', `bigsize' are matched too. - (_bdf_readstream): `cursor' is used as an offset to - the pointer, it should be typed as FT_Offset. Also - the types of `bytes', `start', `end', `avail' are matched. - - * bdfdrivr.c: The type of BDF_CMap->num_encodings is - matched with FT_CMap->clazz->size. - (bdf_cmap_char_index): The types of `min', `max', `mid' - are matched with BDF_CMap->num_encodings. The type of - `result' is matched with encoding->glyph. - (bdf_cmap_char_next): Ditto, the type of `code' is - matched with BDF_encoding_el.enc. - (bdf_interpret_style): The type of `lengths' is changed - to size_t, to take the value by ft_strlen(). Also the - types of `len', `nn', `mm' are matched. - -2009-07-31 suzuki toshiya - - sfnt: Count the size of the memory object by ptrdiff_t. - - * src/sfnt/ttbdf.c (tt_face_find_bdf_prop): The type of - `peroperty_len' is changed from FT_UInt to FT_Offset, - to match with size_t, which is appropriate type for the - object in the memory buffer. - -2009-07-31 suzuki toshiya - - lzw: Count the size of the memory object by ptrdiff_t. - - * src/lzw/ftzopen.h: The types of FT_LzwState->{buf_total, - stack_size} are changed from FT_UInt to FT_Offset, to match - with size_t, which is appropriate type for the object in - the memory buffer. - - * src/lzw/ftzopen.c (ft_lzwstate_stack_grow): The types of - `old_size' and `new_size' are changed from FT_UInt to - FT_Offset, to match with size_t, which is appropriate type - for the object in the memory buffer. - -2009-07-31 suzuki toshiya - - otvalid: Count the table size on memory by ptrdiff_t. - - * src/otvalid/otvgpos.c (otv_ValueRecord_validate): - Change the type of table size from FT_UInt to - FT_PtrDist because it is calculated by the memory - addresses. - -2009-07-31 suzuki toshiya - - otvalid: Prevent an overflow by GPOS/GSUB 32b-bit offset. - - * src/otvalid/otvgpos.c (otv_ExtensionPos_validate): - Extend ExtensionOffset from FT_UInt to FT_ULong, to - cover 32-bit offset on 16-bit platform. - - * src/otvalid/otvgsub.c (otv_ExtensionSubst_validate): - Ditto. - -2009-07-31 suzuki toshiya - - ftobjs.c: Prevent an overflow in glyph index handling. - - * src/base/ftobjs.c (FT_Face_GetCharsOfVariant): - Improve the cast in comparison to avoid the truncation. - -2009-07-31 suzuki toshiya - - Improve the variable types in raccess_make_file_name(). - - * src/base/ftrfork.c (raccess_make_file_name): - Change the type of cursor variable `tmp' to const char*, - to prevent the unexpected modification of original pathname. - (raccess_make_file_name): Change the type of new_length - to size_t. - -2009-07-31 suzuki toshiya - - ftpatent.c: Fix for unused variable `error'. - - * src/base/ftpatent.c (_tt_check_patents_in_range): - Fix warning for unused variable `error'. - -2009-07-31 suzuki toshiya - - type1: Check invalid string longer than PostScript limit. - - * src/type1/t1afm.c (t1_get_index): Check invalid string - which exceeds the limit of PostScript string/name objects. - -2009-07-31 suzuki toshiya - - gzip: Use FT2 zcalloc() & zfree() in ftgzip.c by default. - - * src/gzip/ftgzip.c (zcalloc, zcfree): Disable all - zcalloc() & zfree() by zlib in zutil.c, those in - ftgzip.c by FT2 are enabled by default. To use - zlib zcalloc() & zfree(), define USE_ZLIB_ZCALLOC. - See discussion: - http://lists.gnu.org/archive/html/freetype-devel/2009-02/msg00000.html - -2009-07-31 suzuki toshiya - - gzip: Distinguish PureC from TurboC on MSDOS. - - * src/gzip/zutil.c (zcalloc, zcfree): Enable only for - MSDOS platform. - -2009-07-31 suzuki toshiya - - gxvalid: Insert PureC pragma to allow unevaluated variables. - - * builds/atari/ATARI.H: Insert PureC pragma not to - warn against set-but-unevaluated variable in gxvalid - module. - -2009-07-31 suzuki toshiya - - gxvalid: Pass the union by the pointer instead of the value. - - * src/gxvalid/gxvcommn.h: - - Declare new type `GXV_LookupValueCPtr'. - - Update the type of the 2nd argument to pass GXV_LookupValueDesc - data to the function prototyped as GXV_Lookup_Value_Validate_Func, - from GXV_LookupValueDesc to GXV_LookupValueCPtr. - - Likewise for the function prototyped as - GXV_Lookup_Fmt4_Transit_Func. - - - Declare new type `GXV_StateTable_GlyphOffsetCPtr'. - - Update the type of the 3rd argument to pass - GXV_StateTable_GlyphOffsetDesc data to the function prototyped - as GXV_StateTable_Entry_Validate_Func, from - GXV_StateTable_GlyphOffsetDesc to GXV_StateTable_GlyphOffsetCPtr. - - - Declare new type `GXV_XStateTable_GlyphOffsetCPtr'. - - Update the type of the 3rd argument to pass - GXV_XStateTable_GlyphOffsetDesc data to the function prototyped - as GXV_XStateTable_Entry_Validate_Func, - from GXV_XStateTable_GlyphOffsetDesc - to GXV_XStateTable_GlyphOffsetCPtr. - - * src/gxvalid/gxvcommn.c (gxv_LookupTable_fmt0_validate, - gxv_XClassTable_lookupval_validate, - gxv_XClassTable_lookupfmt4_transit): - Update from GXV_LookupValueDesc to GXV_LookupValueCPtr. - - * src/gxvalid/gxvbsln.c (gxv_bsln_LookupValue_validate, - gxv_bsln_LookupFmt4_transit): Ditto. - - * src/gxvalid/gxvjust.c - (gxv_just_pcTable_LookupValue_entry_validate, - gxv_just_classTable_entry_validate, - gxv_just_wdcTable_LookupValue_validate): Ditto. - - * src/gxvalid/gxvkern.c - (gxv_kern_subtable_fmt1_entry_validate): Ditto. - - * src/gxvalid/gxvlcar.c (gxv_lcar_LookupValue_validate, - gxv_lcar_LookupFmt4_transit): Ditto. - - * src/gxvalid/gxvopbd.c (gxv_opbd_LookupValue_validate, - gxv_opbd_LookupFmt4_transit): Ditto. - - * src/gxvalid/gxvprop.c (gxv_prop_LookupValue_validate, - gxv_prop_LookupFmt4_transit): Ditto. - - * src/gxvalid/gxvmort4.c - (gxv_mort_subtable_type4_lookupval_validate): Ditto. - - * src/gxvalid/gxvmort0.c - (gxv_mort_subtable_type0_entry_validate): Update - from GXV_StateTable_GlyphOffsetDesc - to GXV_StateTable_GlyphOffsetCPtr. - - * src/gxvalid/gxvmort1.c - (gxv_mort_subtable_type1_entry_validate): Ditto. - - * src/gxvalid/gxvmort2.c - (gxv_mort_subtable_type2_entry_validate): Ditto. - - * src/gxvalid/gxvmort5.c - (gxv_mort_subtable_type5_entry_validate): Ditto. - - * src/gxvalid/gxvmorx2.c - (gxv_morx_subtable_type2_entry_validate): Ditto. - - * src/gxvalid/gxvmorx5.c - (gxv_morx_subtable_type5_entry_validate): Ditto. - - * src/gxvalid/gxvmorx1.c - (gxv_morx_subtable_type1_entry_validate): Ditto. - (gxv_morx_subtable_type1_LookupValue_validate, - gxv_morx_subtable_type1_LookupFmt4_transit): - Update from GXV_LookupValueDesc to GXV_LookupValueCPtr. - - * src/gxvalid/gxvmorx0.c - (gxv_morx_subtable_type0_entry_validate): Update - from GXV_XStateTable_GlyphOffsetDesc - to GXV_XStateTable_GlyphOffsetCPtr. - -2009-07-29 Fabrice Bellet - - Fix Redhat bugzilla #513582 and Savannah bug #26849. - - * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP) : Fix - aliasing bug. - -2009-07-19 Werner Lemberg - - Document recent library changes. - - * docs/CHANGES: Do it. - -2009-07-17 Werner Lemberg - - Fix Savannah bug #23786. - - * src/truetype/ttobjs.c (tt_size_init_bytecode): Don't reset x_ppem - and y_ppem. Otherwise the `*_CVT_Stretched' functions in ttinterp.c - get never called. - An anonymous guy suggested this change on Savannah, and it seems to - be the right solution. - -2009-07-15 Werner Lemberg - - * docs/release: Updated. - -2009-07-15 Werner Lemberg - - README.CVS -> README.git - - * README.CVS: Renamed to... - * README.git: This. - Updated. - -2009-07-15 suzuki toshiya - - Borland C++ compiler patch proposed by Mirco Babin. - http://lists.gnu.org/archive/html/freetype/2009-07/msg00016.html. - - * builds/exports.mk: Delete unused flags, CCexe_{CFLAGS,LDFLAGS}. - Fix APINAMES_C and APINAMES_EXE pathnames to reflect the platform - specific pathname syntax. - * builds/compiler/bcc.mk: Remove unused flag, CCexe_LDFLAGS. - Define TE = `-e' separately (bcc32 cannot specify the pathname of - binary executable by T = `-o'). - Extend the large page size in linking freetype.lib. - Add extra CLEAN target to delete bcc specific temporary files. - * builds/compiler/bcc-dev.mk: Ditto. - -2009-07-14 Werner Lemberg - - Fix Savannah bug #27026. - - * builds/win32/vc2005/freetype.sln: Use correct version number. - -2009-07-12 suzuki toshiya - - Add a script to check the undefined and unused trace macros. - - * src/tools/chktrcmp.py: A script to check trace_XXXX macros - that are used in C source but undefined in fttrace.h, or - defined in fttrace.h but unused in C sources. See - http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html. - * docs/DEBUG: Mention on chktrcmp.py. - * docs/release: Ditto. - -2009-07-09 Werner Lemberg - - [ftraster] Make it compile again with -D_STANDALONE_. - - * src/raster/ftraster.c [_STANDALONE_]: Define - FT_CONFIG_STANDARD_LIBRARY_H. - Include `string.h'. - Don't include `rastpic.h'. - Define FT_DEFINE_RASTER_FUNCS. - -2009-07-09 suzuki toshiya - - smooth: Check glyph size by width/height, instead of pitch/height. - Suggested by der Mouse . - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Improve - the check for too large glyph. Replace the pair of `pitch' and - `height' by the pair of `width' and `height'. `pitch' cannot - be greater than `height'. The required is checking the product - `pitch' * `height' <= FT_ULONG_MAX, but we use cheap checks for - the realistic case only. - -2009-07-09 suzuki toshiya - - Register 2 missing trace components, t1afm and ttbdf. - - * include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( t1afm ) - and FT_TRACE_DEF( ttbdf ). See - http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html - -2009-07-09 suzuki toshiya - - Register a trace component for ftgloadr.c. - - * include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( gloader ). - The macro `trace_gloader' was already used in the initial version - on 2002-02-24. - -2009-07-08 suzuki toshiya - - Prevent the overflows by a glyph with too many points or contours. - The bug is reported by Boris Letocha . See - http://lists.gnu.org/archive/html/freetype-devel/2009-06/msg00031.html - http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00002.html - - * include/freetype/ftimage.h (FT_OUTLINE_CONTOURS_MAX, - FT_OUTLINE_POINTS_MAX): New macros to declare the maximum - values of FT_Outline.{n_contours,n_points}. - * src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Check the - total numbers of points and contours cause no overflows in - FT_Outline.{n_contours,n_points}. - - * include/freetype/internal/ftgloadr.h (FT_GLYPHLOADER_CHECK_P, - FT_GLYPHLOADER_CHECK_C): Compare the numbers of points and - contours as unsigned long number, instead of signed int, to - prevent the overflows on 16-bit systems. - -2009-07-05 Bram Tassyns - - Improve compatibility to Acroread. - This fixes Savannah bug #26944. - - * src/cff/cffload.c (cff_charset_compute_cids): For multiple GID to - single CID mappings, make the lowest value win. - -2009-06-28 suzuki toshiya - - ftpatent: Fix a bug by wrong usage of service->table_info(). - http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00039.html - - * include/freetype/internal/services/svsfnt.h: Extend - FT_SFNT_TableInfoFunc() to take new argument to obtain the offset - to the specified table. - * src/sfnt/sfdriver.c (sfnt_table_info): Extend to return the - table-offset to the caller function. - * src/base/ftpatent.c (_tt_check_patents_in_table): Use new - service->table_info(). - * src/base/ftobjs.c (FT_Sfnt_Table_Info): Synchronize to new - service->table_info(). - -2009-06-28 Werner Lemberg - - [psaux, cff] Protect against nested `seac' calls. - - * include/freetype/internal/psaux.h (T1_Decoder), src/cff/cffgload.h - (CFF_Decoder): Add `seac' boolean variable. - - * src/cff/cffgload.c (cff_operator_seac), src/psaux/t1decode.c - (t1operator_seac): Use it. - -2009-06-28 Werner Lemberg - - Thinko. - - * src/psaux/t1decode.c (t1operator_seac) - [FT_CONFIG_OPTION_INCREMENTAL]: Test for existence of incremental - interface. - -2009-06-28 Werner Lemberg - - * devel/ftoption.h [FT_CONFIG_OPTION_INCREMENTAL]: Define. - -2009-06-27 suzuki toshiya - - Add tools to preprocess the source files for AtariST PureC. - - * builds/atari/deflinejoiner.awk: New file to filter C source files - for broken C preprocessor of PureC compiler. - - * builds/atari/gen-purec-patch.sh: New file to generate a patch set - for PureC, by using deflinejoiner.awk. - -2009-06-27 suzuki toshiya - - Keep existing modules.cfg in the building tree. - - * configure: If `configure' is executed outside of the source tree, - an existing `modules.cfg' file in the build directory should be - kept, not overwritten by the version in the source tree. - -2009-06-27 suzuki toshiya - - Filter --srcdir= option before invoking builds/unix/configure. - - * configure: If builds/unix/configure is invoked with --srcdir - option, the option should take `builds/unix' directory instead of - the top source directory. Thus the configure script in the top - directory should modify the --srcdir= option if - `builds/unix/configure' is invoked. - -2009-06-27 suzuki toshiya - - Improve configure.raw for cross-building on exe-suffixed systems. - - * builds/unix/configure.raw: Fix a bug in sed script to extract - native suffix for binary executables, patch by Peter Breitenlohner. - http://lists.gnu.org/archive/html/freetype-devel/2009-04/msg00036.html - -2009-06-26 Werner Lemberg - - [truetype] Remove TT_SubGlyphRec. - - * src/truetype/ttobjs.h (TT_SubGlyphRec): Removed, unused. - -2009-06-26 Werner Lemberg - - * */*: For warning messages, replace FT_ERROR with FT_TRACE0. - - FT_ERROR is now used only if a function produces a non-zero `error' - value. - - Formatting, improving and harmonizing debug strings. - -2009-06-25 Werner Lemberg - - Provide version information better. - - * src/base/ftinit.c (FT_Init_FreeType): Don't set version here - but... - * src/base/ftobjs.c (FT_New_Library): Here. - -2009-06-22 Werner Lemberg - - Use 16.16 format while parsing Type 1 charstrings. - This fixes Savannah bug #26867. - - Previously, only integers have been used which can lead to serious - rounding errors. - - However, fractional values are only used internally; after the - charstrings (of either Type 1 or 2) have been processed, the - resulting coordinates get rounded to integers currently -- before - applying scaling. This should be fixed; at the same time a new load - flag should be introduced, to be used in combination with - FT_LOAD_NO_SCALE, which indicates that font units are returned in - 16.16 format. Similarly, the incremental interface should be - extended to allow fractional values for metrics. - - * include/freetype/internal/psaux.h (T1_BuilderRec): Remove `shift' - field. - * include/freetype/internal/pshints.h (T1_Hints_SetStemFunc, - T1_Hints_SetStem3Func): Use FT_Fixed for coordinates. - - * src/psaux/psobjs.c: Include FT_INTERNAL_CALC_H. - (t1_build_add_point): Always convert fixed to integer. - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): - Use 16.16 format everywhere (except for large integers followed by a - `div'). - [CAN_HANDLE_NON_INTEGRAL_T1_OPERANDS]: Remove #ifdef and activate - code uncoditionally. - Add support for random numbers and update remaining code - accordingly; this should work now. - (t1_operator_seac): Updated. - * src/psaux/pshrec.c: Include FT_INTERNAL_CALC_H. - (ps_hints_t1stem3, t1_hints_stem): Updated. - - * src/cid/cidgload.c: Include FT_INTERNAL_CALC_H. - (cid_load_glyph) [FT_CONFIG_OPTION_INCREMENTAL], - (cid_face_compute_max_advance, cid_slot_load_glyph): Updated. - - * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String) - [FT_CONFIG_OPTION_INCREMENTAL], (T1_Get_Advances, T1_Load_Glyph): - Updated. - * src/type1/t1load.c: Include FT_INTERNAL_CALC_H. - * src/type1/t1objs.c (T1_Face_Init): Updated. - -2009-06-21 Werner Lemberg - - * src/pshinter/pshrec.c: Use PSH_Err_Ok. - -2009-06-21 Werner Lemberg - - Code beautification. - - * src/type1/t1load.c (FT_INT_TO_FIXED): Removed. - Replace everywhere with INT_TO_FIXED. - (FT_FIXED_TO_INT): Move to ... - * include/freetype/internal/ftcalc.h (FIXED_TO_INT): Here. - Update all users. - -2009-06-20 Werner Lemberg - - Remove unused variables. - - * include/freetype/internal/psaux.h (T1_BuilderRec), - src/cff/cffgload.h (CFF_Builder): Remove `last'. - Update all users. - -2009-06-20 Werner Lemberg - - [psaux] Check large integers while parsing charstrings. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Large - integers must be followed by a `div' operator. - -2009-06-20 Werner Lemberg - - [cff] Revert last change. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings): Do it. - Next time, don't confuse Type 2 charstring opcodes with TOP DICT - values... - -2009-06-20 Werner Lemberg - - * src/autofit/aflatin.c (af_latin_metrics_check_digits): Fix - compiler warning. - -2009-06-20 Werner Lemberg - - * builds/compiler/gcc.mk (CFLAGS): Use -O3, not -O6. - -2009-06-19 Werner Lemberg - - [cff] Fix handling of reserved byte 0xFF. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings): Abort if byte - 0xFF is encountered. - -2009-06-19 Werner Lemberg - - Improve debug messages for Type1 charstrings. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Emit newlines - after instructions. - Prettify output. - -2009-06-19 Werner Lemberg - - More ftgray fixes for FT_STATIC_RASTER. - Problems reported by suyu@cooee.cn. - - * src/smooth/ftgrays.c (gray_move_to, gray_raster_render): Use - RAS_VAR. - -2009-06-18 Werner Lemberg - - * docs/CHANGES: Updated. - -2009-06-18 Werner Lemberg - - Fix B/W rasterization of subglyphs with different drop-out modes. - - Normally, the SCANMODE instruction (if present) to set the drop-out - mode in a TrueType font is located in the `prep' table only and thus - valid for all glyphs. However, there are fonts like `pala.ttf' - which additionally contain this instruction in the hinting code of - some glyphs (but not all). As a result it can happen that a - composite glyph needs multiple drop-out modes for its subglyphs - since the rendering state gets reset for each subglyph. - - FreeType collects the hinted outlines from all subglyphs, then it - sends the data to the rasterizer. It also sends the drop-out mode - -- after hinting has been applied -- and here is the error: It sends - the drop-out mode of the last subglyph only; drop-out modes of all - other subglyphs are lost. - - This patch fixes the problem; it adds a second, alternative - mechanism to pass the drop-out mode: For each contour, the - rasterizer now checks the first `tags' array element. If bit 2 is - set, bits 5-7 contain the contour's drop-out mode, overriding the - global drop-out mode. - - * include/freetype/ftimage.h (FT_CURVE_TAG_HAS_SCANMODE): New macro. - - * src/truetype/ttgload.c (TT_Hint_Glyph): Store drop-out mode in - `tags[0]'. - - * src/raster/ftraster.c (Flow_Up, Overshoot_Top, Overshoot_Bottom): - Use bits 3-5 instead of 0-2. - (New_Profile): Set the drop-out mode in the profile's `flags' field. - (Decompose_Curve): Check `tags[0]' and set `dropOutControl' if - necessary. - (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, - Horizontal_Gray_Sweep_Drop, Draw_Sweep): Use the profile's drop-out - mode. - -2009-06-16 Werner Lemberg - - Improve scan conversion rules 4 and 6. - - Two new constraints are introduced to better identify a `stub' -- a - concept which is only vaguely described in the OpenType - specification. The old code was too rigorous and suppressed more - pixel than it should. - - . The intersection of the two profiles with the scanline is less - than a half pixel. Code related to this was already present in - the sources but has been commented out. - - . The endpoint of the original contour forming a profile has a - distance (`overshoot') less than half a pixel to the scanline. - - Note that the two additional conditions fix almost all differences - to the Windows rasterizer, but some problematic cases remain. - - * src/raster/ftraster.c (Overshoot_Top, Overshoot_Bottom): New - macros for the `flags' field in the `TProfile' structure. - (IS_BOTTOM_OVERSHOOT, IS_TOP_OVERSHOOT): New macros. - (New_Profile, End_Profile): Pass overshoot flag as an argument and - set it accordingly. - Update callers. - (Vertical_Sweep_Drop, Horizontal_Sweep_Drop): Implement the two new - constraints. - -2009-06-11 Werner Lemberg - - Increase precision for B/W rasterizer. - - * src/raster/ftraster.c (Set_High_Precision): Add two more bits to - the precision. This corrects rendering of some small glyphs, for - example, glyph `xi' in verdana.ttf at 13 ppem. Testing with ftbench - on my GNU/Linux box I don't see a performance degradation. - -2009-06-08 Michael Zucchi - - Handle FT_STROKER_LINECAP_BUTT. - This fixes Savannah bug #26757. - - * src/base/ftstroke.c (ft_stroker_cap): Implement it. - -2009-06-07 Harald Fernengel - - Fix some potential out-of-memory crashes. - - * src/base/ftobjs.c (ft_glyphslot_done): Check `slot->internal'. - * src/base/ftstream.c (FT_Stream_ReleaseFrame): Check `stream'. - * src/truetype/ttinterp.c (TT_New_Context): Avoid double-free of - `exec' in case of failure. - -2009-06-07 Werner Lemberg - - Simplify math. - Suggested by Alexei Podtelezhnikov . - - * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, - Horizontal_Gray_Sweep_Drop): Do it. - -2009-06-04 Werner Lemberg - - Preparation for fixing scan conversion rules 4 and 6. - - * src/raster/ftraster.c (TFlow): Replace enumeration with... - (Flow_Up): This macro. - (TProfile): Replace `flow' member with `flags' bit field. - Update all affected code. - -2009-05-29 James Cloos - - Enable autohinting for glyphs rotated by multiples of 90°. - - * src/base/ftobjs.c (FT_Load_Glyph): Alter check for permitted - matrices to allow rotations by multiples of 90°, not only unrotated, - possibly slanted matrices. - -2009-05-28 Werner Lemberg - - Remove compiler warning. - Reported by Krzysztof Kowalczyk . - - * src/autofit/aflatin2.c (af_latin2_hint_edges): Move declaration of - `n_edges' into `#if' block. - -2009-05-28 Werner Lemberg - - Make compilation work with FT_CONFIG_OPTION_USE_ZLIB not defined. - Reported by Krzysztof Kowalczyk . - - * src/pcf/pcfdrivr.c (PCF_Face_Init) [!FT_CONFIG_OPTION_USE_ZLIB]: - Make it work. - Simplify #ifdef logic. - -2009-05-22 Werner Lemberg - - Improve b/w rasterizer. - Problem reported by Krzysztof Kotlenga . - - * src/raster/raster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, - Horizontal_Gray_Sweep_Drop): For smart drop-out mode, if - intersections are equally distant relative to next pixel center, - select the left pixel, not the right one. - -2009-05-19 Werner Lemberg - - Fix Savannah bug #26600. - - * src/type42/t42parse.c (t42_load_keyword): Handle - T1_FIELD_LOCATION_FONT_EXTRA. - -2009-04-30 Werner Lemberg - - Document recent changes to ftview. - - * docs/CHANGES: Do it. - -2009-04-27 Werner Lemberg - - autohinter: Don't change digit widths if all widths are the same. - This fixes FreeDesktop bug #21197. - - * src/autofit/afglobal.c (AF_DIGIT): New macro. - (af_face_globals_compute_script_coverage): Mark ASCII digits in - `glyph_scripts' array. - (af_face_globals_get_metrics): Updated. - (af_face_globals_is_digit): New function. - * src/autofit/afglobal.h: Updated. - (AF_ScriptMetricsRec): Add `digits_have_same_width' flag. - - * src/autofit/aflatin.c: Include FT_ADVANCES_H. - (af_latin_metrics_check_digits): New function. - (af_latin_metrics_init): Use it. - * src/autofit/aflatin.h: Updated. - * src/autofit/afcjk.c (af_cjk_metrics_init): Updated. - - * src/autofit/aflatin2.c: Similar changes as with aflatin.c. - - * src/autofit/afloader.c (af_loader_load_g): Test digit width. - - * docs/CHANGES: Document it. - -2009-04-26 Werner Lemberg - - Make ftgrays compile with _STANDALONE_ and FT_STATIC_RASTER again. - Problems reported by suyu@cooee.cn. - - * src/smooth/ftgrays.c (FT_DEFINE_OUTLINE_FUNCS, - FT_DEFINE_RASTER_FUNCS) [_STANDALONE_]: Define. - [!_STANDALONE_]: Include ftspic.h only here. - (ras): Define/declare after definition of `TWorker'. - Use `RAS_VAR_' where necessary. - -2009-04-21 Karl Berry - - Fix AC_CHECK_FT2. - - * builds/unix/freetype2.m4: Only check PATH for freetype-config if - we did not already find it from a prefix option. - -2009-04-05 Oran Agra - - Add #error to modules and files that do not support PIC yet. - - When FT_CONFIG_OPTION_PIC is defined the following files will - create #error: - * src/bdf/bdfdrivr.h - * src/cache/ftcmanag.c - * src/cid/cidriver.h - * src/gxvalid/gxvmod.h - * src/gzip/ftgzip.c - * src/lzw/ftlzw.c - * src/otvalid/otvmod.h - * src/pcf/pcfdrivr.h - * src/pfr/pfrdrivr.h - * src/psaux/psauxmod.h - * src/type1/t1driver.h - * src/type42/t42drivr.h - * src/winfonts/winfnt.h - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in autofit module. - - * include/freetype/internal/autohint.h add macros to init - instances of FT_AutoHinter_ServiceRec. - - * src/autofit/afmodule.h declare autofit_module_class - using macros from ftmodapi.h, - when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/autofit/afmodule.c when FT_CONFIG_OPTION_PIC is defined - af_autofitter_service and autofit_module_class structs - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from afpic.h in order to access them. - - * src/autofit/aftypes.h add macros to init and declare - instances of AF_ScriptClassRec. - - * src/autofit/afcjk.h declare af_cjk_script_class - using macros from aftypes.h, - when FT_CONFIG_OPTION_PIC is defined init function will be declared. - * src/autofit/afcjk.c when FT_CONFIG_OPTION_PIC is defined - af_cjk_script_class struct will have function to init it instead of - being allocated in the global scope. - - * src/autofit/afdummy.h declare af_dummy_script_class - using macros from aftypes.h, - when FT_CONFIG_OPTION_PIC is defined init function will be declared. - * src/autofit/afdummy.c when FT_CONFIG_OPTION_PIC is defined - af_dummy_script_class struct will have function to init it instead of - being allocated in the global scope. - - * src/autofit/afindic.h declare af_indic_script_class - using macros from aftypes.h, - when FT_CONFIG_OPTION_PIC is defined init function will be declared. - * src/autofit/afindic.c when FT_CONFIG_OPTION_PIC is defined - af_indic_script_class struct will have function to init it instead of - being allocated in the global scope. - - * src/autofit/aflatin.h declare af_latin_script_class - using macros from aftypes.h, - when FT_CONFIG_OPTION_PIC is defined init function will be declared. - * src/autofit/aflatin.c when FT_CONFIG_OPTION_PIC is defined - af_latin_script_class struct will have function to init it instead of - being allocated in the global scope. - Change af_latin_blue_chars to be PIC-compatible by being a two - dimentional array rather than array of pointers. - - - * src/autofit/aflatin2.h declare af_latin2_script_class - using macros from aftypes.h, - when FT_CONFIG_OPTION_PIC is defined init function will be declared. - * src/autofit/aflatin2.c when FT_CONFIG_OPTION_PIC is defined - af_latin2_script_class struct will have function to init it instead of - being allocated in the global scope. - Change af_latin2_blue_chars to be PIC-compatible by being a two - dimentional array rather than array of pointers. - - * src/autofit/afglobal.c when FT_CONFIG_OPTION_PIC is defined - af_script_classes array initialization was moved to afpic.c and - is later refered using macros defeined in afpic.h. - - New Files: - * src/autofit/afpic.h declare struct to hold PIC globals for autofit - module and macros to access them. - * src/autofit/afpic.c implement functions to allocate, destroy and - initialize PIC globals for autofit module. - - * src/autofit/autofit.c add new file to build: afpic.c. - * src/autofit/jamfile add new files to FT2_MULTI build: afpic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in pshinter module. - - * include/freetype/internal/pshints.h add macros to init - instances of PSHinter_Interface. - - * src/pshinter/pshmod.h declare pshinter_module_class - using macros from ftmodapi.h, - when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/pshinter/pshmod.c when FT_CONFIG_OPTION_PIC is defined - pshinter_interface and pshinter_module_class structs - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from pshpic.h in order to access them. - - New Files: - * src/pshinter/pshpic.h declare struct to hold PIC globals for pshinter - module and macros to access them. - * src/pshinter/pshpic.c implement functions to allocate, destroy and - initialize PIC globals for pshinter module. - - * src/pshinter/pshinter.c add new file to build: pshpic.c. - * src/pshinter/jamfile add new files to FT2_MULTI build: pshpic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in psnames module. - - * include/freetype/internal/services/svpscmap.h add macros to init - instances of FT_Service_PsCMapsRec. - - * src/psnames/psmodule.h declare psnames_module_class - using macros from ftmodapi.h, - when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/psnames/psmodule.c when FT_CONFIG_OPTION_PIC is defined - pscmaps_interface and pscmaps_services structs - and psnames_module_class array - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from pspic.h in order to access them. - - New Files: - * src/psnames/pspic.h declare struct to hold PIC globals for psnames - module and macros to access them. - * src/psnames/pspic.c implement functions to allocate, destroy and - initialize PIC globals for psnames module. - - * src/psnames/psnames.c add new file to build: pspic.c. - * src/psnames/jamfile add new files to FT2_MULTI build: pspic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in raster renderer. - - * src/raster/ftrend1.h declare ft_raster1_renderer_class - and ft_raster5_renderer_class - using macros from ftrender.h, - when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/smooth/ftrend1.c when FT_CONFIG_OPTION_PIC is defined - ft_raster1_renderer_class and ft_raster5_renderer_class structs - will have functions to init or create and destroy them - instead of being allocated in the global scope. - Macros will be used from rastpic.h in order to access - ft_standard_raster from the pic_container (allocated in ftraster.c). - In ft_raster1_render when PIC is enabled, the last letter of - module_name is used to verfy the renderer class rather than the - class pointer. - - * src/raster/ftraster.c when FT_CONFIG_OPTION_PIC is defined - ft_standard_raster struct will have function to init it - instead of being allocated in the global scope. - - New Files: - * src/raster/rastpic.h declare struct to hold PIC globals for raster - renderer and macros to access them. - * src/raster/rastpic.c implement functions to allocate, destroy and - initialize PIC globals for raster renderer. - - * src/raster/raster.c add new file to build: rastpic.c. - * src/raster/jamfile add new files to FT2_MULTI build: rastpic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in smooth renderer. - - * src/smooth/ftsmooth.h declare ft_smooth_renderer_class, - ft_smooth_lcd_renderer_class and ft_smooth_lcd_v_renderer_class - using macros from ftrender.h, - when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/smooth/ftsmooth.c when FT_CONFIG_OPTION_PIC is defined - the following structs: - ft_smooth_renderer_class, ft_smooth_lcd_renderer_class - and ft_smooth_lcd_v_renderer_class - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from ftspic.h in order to access - ft_grays_raster from the pic_container (allocated in ftgrays.c). - - * src/smooth/ftgrays.h include FT_CONFIG_CONFIG_H - * src/smooth/ftgrays.c when FT_CONFIG_OPTION_PIC is NOT defined - func_interface was moved from gray_convert_glyph_inner function - to the global scope. - When FT_CONFIG_OPTION_PIC is defined - func_interface and ft_grays_raster structs - will have functions to init them - instead of being allocated in the global scope. - And func_interface will be allocated on the stack of - gray_convert_glyph_inner. - - New Files: - * src/smooth/ftspic.h declare struct to hold PIC globals for smooth - renderer and macros to access them. - * src/smooth/ftspic.c implement functions to allocate, destroy and - initialize PIC globals for smooth renderer. - - * src/smooth/smooth.c add new file to build: ftspic.c. - * src/smooth/jamfile add new files to FT2_MULTI build: ftspic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in cff driver. - - * include/freetype/internal/services/svcid.h add macros to init - instances of FT_Service_CIDRec. - * include/freetype/internal/services/svpsinfo.h add macros to init - instances of FT_Service_PsInfoRec. - - * src/cff/cffcmap.h declare cff_cmap_encoding_class_rec - and cff_cmap_unicode_class_rec using macros from - ftobjs.h, when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/cff/cffcmap.c when FT_CONFIG_OPTION_PIC is defined - the following structs: - cff_cmap_encoding_class_rec and cff_cmap_unicode_class_rec - will have functions to init or create and destroy them - instead of being allocated in the global scope. - - * src/cff/cffdrivr.h declare cff_driver_class using macros from - ftdriver.h, when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/cff/cffdrivr.c when FT_CONFIG_OPTION_PIC is defined - the following structs: - cff_service_glyph_dict, cff_service_ps_info, cff_service_ps_name - cff_service_get_cmap_info, cff_service_cid_info, cff_driver_class, - and cff_services array - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from cffpic.h in order to access them - from the pic_container. - Use macros from cffpic.h in order to access the - structs allocated in cffcmap.c - - * src/cff/cffobjs.c Use macros from cffpic.h in order to access the - structs allocated in cffcmap.c - - * src/cff/parser.c when FT_CONFIG_OPTION_PIC is defined - implement functions to create and destroy cff_field_handlers array - instead of being allocated in the global scope. - And macros will be used from cffpic.h in order to access it - from the pic_container. - - New Files: - * src/cff/cffpic.h declare struct to hold PIC globals for cff - driver and macros to access them. - * src/cff/cffpic.c implement functions to allocate, destroy and - initialize PIC globals for cff driver. - - * src/cff/cff.c add new file to build: cffpic.c. - * src/cff/jamfile add new files to FT2_MULTI build: cffpic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in sfnt driver. - - * include/freetype/internal/services/svbdf.h add macros to init - instances of FT_Service_BDFRec. - * include/freetype/internal/services/svgldict.h add macros to init - instances of FT_Service_GlyphDictRec. - * include/freetype/internal/services/svpostnm.h add macros to init - instances of FT_Service_PsFontNameRec. - * include/freetype/internal/services/svsfnt.h add macros to init - instances of FT_Service_SFNT_TableRec. - * include/freetype/internal/services/svttcmap.h add macros to init - instances of FT_Service_TTCMapsRec. - * include/freetype/internal/sfnt.h add macros to init - instances of SFNT_Interface. - - * src/sfnt/sfdriver.h declare sfnt_module_class using macros from - ftmodapi.h, when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/sfnt/sfdriver.c when FT_CONFIG_OPTION_PIC is defined - the following structs: - sfnt_service_sfnt_table, sfnt_service_glyph_dict, sfnt_service_ps_name - tt_service_get_cmap_info, sfnt_service_bdf, sfnt_interface, - sfnt_module_class, and sfnt_services array - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from sfntpic.h in order to access them - from the pic_container. - - * src/sfnt/ttcmap.h add macros to init - instances of TT_CMap_ClassRec. - * src/sfnt/ttcmap.c when FT_CONFIG_OPTION_PIC is defined - the following structs: - tt_cmap0_class_rec, tt_cmap2_class_rec, tt_cmap4_class_rec - tt_cmap6_class_rec, tt_cmap8_class_rec, tt_cmap10_class_rec, - tt_cmap12_class_rec, tt_cmap14_class_rec and tt_cmap_classes array - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from sfntpic.h in order to access them - from the pic_container. - The content of tt_cmap_classes is now described in the - new file 'ttcmapc.h'. - - New Files: - * src/sfnt/sfntpic.h declare struct to hold PIC globals for sfnt - driver and macros to access them. - * src/sfnt/sfntpic.c implement functions to allocate, destroy and - initialize PIC globals for sfnt driver. - * src/sfnt/ttcmapc.h describing the content of - tt_cmap_classes allocated in ttcmap.c - - * src/sfnt/sfnt.c add new file to build: sfntpic.c. - * src/sfnt/jamfile add new files to FT2_MULTI build: sfntpic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in truetype driver. - - * include/freetype/internal/services/svmm.h add macros to init - instances of FT_Service_MultiMastersRec. - * include/freetype/internal/services/svttglyf.h add macros to init - instances of FT_Service_TTGlyfRec. - - * src/truetype/ttdriver.h declare tt_driver_class using macros from - ftdriver.h, when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/truetype/ttdriver.c when FT_CONFIG_OPTION_PIC is defined - the following structs: - tt_service_gx_multi_masters, tt_service_truetype_glyf, tt_driver_class - and tt_services array, - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from ttpic.h in order to access them - from the pic_container. - * src/truetype/ttobjs.c change trick_names array to be - PIC-compatible by being a two dimentional array rather than array - of pointers. - - New Files: - * src/truetype/ttpic.h declare struct to hold PIC globals for truetype - driver and macros to access them. - * src/truetype/ttpic.c implement functions to allocate, destroy and - initialize PIC globals for truetype driver. - - * src/truetype/truetype.c add new file to build: ttpic.c. - * src/truetype/jamfile add new files to FT2_MULTI build: ttpic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support and infrastructure in base. - - * include/freetype/config/ftoption.h add FT_CONFIG_OPTION_PIC - * include/freetype/internal/ftobjs.h Add pic_container member to - FT_LibraryRec. - Add macros to declare and init instances of FT_CMap_ClassRec. - Add macros to init instances of FT_Outline_Funcs and FT_Raster_Funcs. - Add macros to declare, allocate and initialize modules - (FT_Module_Class). - Add macros to declare, allocate and initialize renderers - (FT_Renderer_Class). - Add macro to init instances of FT_Glyph_Class. - Add macros to declare, allocate and initialize drivers - (FT_Driver_ClassRec). - * include/freetype/internal/ftpic.h new file to declare the - FT_PIC_Container struct and the functions to allocate and detroy it. - * include/freetype/internal/ftserv.h add macros to allocate and - destory arrays of FT_ServiceDescRec. - * include/freetype/internal/internal.h define macro to include - ftpic.h. - - New Files: - * src/base/ftpic.c implement functions to allocate and destory the - global pic_container. - * src/base/basepic.h declare struct to hold PIC globals for base and - macros to access them. - * src/base/basepic.c implement functions to allocate, destroy and - initialize PIC globals for base. - - * src/base/ftinit.c when FT_CONFIG_OPTION_PIC is defined implement - functions that allocate and destroy ft_default_modules according to - FT_CONFIG_MODULES_H in the pic_container instead of the global scope - and use macro from basepic.h to access it. - * src/base/ftobjs.c add calls to the functions that allocate and - destroy the global pic_container when the library is created and - destroyed. - - * src/base/jamfile add new files to FT2_MULTI build: - ftpic.c and basepic.c. - * src/base/ftbase.c add new files to build: - ftpic.c and basepic.c. - - * src/base/ftglyph.c when FT_CONFIG_OPTION_PIC is defined - ft_bitmap_glyph_class and ft_outline_glyph_class will be allocated - in the pic_container instead of the global scope and use macros from - basepic.h to access them. - * src/base/ftbbox.c allocate bbox_interface stract on the stack - instead of the global scope when FT_CONFIG_OPTION_PIC is defined. - * src/base/ftstroke.c access ft_outline_glyph_class allocated in - ftglyph.c via macros from basepic.h - -2009-04-05 Oran Agra - - Preparing changes in cff parser later needed for PIC version. - - * src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c, - src/cff/cffparse.c, src/cff/cffparse.h: Add library pointer to - 'CFF_ParserRec' set by `cff_parser_init'. - Route library pointer from 'cff_face_init' to 'cff_subfont_load' - for `cff_parser_init'. - - * src/cff/cffparse.c (CFF_Field_Handler): Move it to... - * src/cff/cffparse.h: This file, to be used by other C files. - -2009-04-05 Oran Agra - - Minor change in ftstroke.c. - - * src/base/ftstroke.c (FT_StrokerRec): Replace `memory' member with - `library' needed for PIC version. - Update all callers. - -2009-04-04 Werner Lemberg - - ftnames.c -> ftsnames.c - - * src/base/ftnames.c: Rename to... - * src/base/ftsnames.c: This. - * src/base/Jamfile, src/base/rules.mk, src/base/ftbase.c: Updated. - -2009-04-04 Werner Lemberg - - Add support for cmap type 13. - - * devel/ftoption.h, include/freetype/config/ftoption.h - (TT_CONFIG_CMAP_FORMAT_13): New macro. - - * src/sfnt/ttcmap.c (TT_CMap13Rec, tt_cmap13_init, - tt_cmap13_validate, tt_cmap13_char_index, tt_cmap13_char_next, - tt_cmap13_get_info, tt_cmap13_char_map_def_binary, - tt_cmap14_class_rec): New functions and structures for cmap 13 - support. - (tt_cmap_classes): Register tt_cmap13_class_rec. - - * docs/CHANGES: Mention cmap 13 support. - -2009-04-01 Werner Lemberg - - Ignore empty contours in CFF glyphs. - - Problem reported by Albert Astals Cid . - - * src/cff/cffgload.c (cff_builder_close_contour): Synchronize with - t1_builder_close_contour. - -2009-03-21 Werner Lemberg - - Another redundant header inclusion. - - * src/truetype/ttgxvar.c: Fix Ghostscript Coverity issue #4041. - -2009-03-21 Werner Lemberg - - Remove redundant header inclusions. - - This covers many Ghostscript Coverity issues. - - * src/*: Do it. - -2009-03-21 Werner Lemberg - - Fix Ghostscript Coverity issue #3904. - - * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Protect against - invalid values of `runcnt'. - -2009-03-20 Werner Lemberg - - Fix `make multi' run. - - * src/smooth/ftsmooth.h: Include FT_INTERNAL_DEBUG_H. - -2009-03-20 Werner Lemberg - - Fix Savannah bug #25923. - - * src/cache/ftccmap.c (FTC_CMAP_HASH): Fix typo. - -2009-03-20 Werner Lemberg - - Protect against too large glyphs. - - Problem reported by Tavis Ormandy . - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Don't allow - `pitch' or `height' to be larger than 0xFFFF. - -2009-03-20 Werner Lemberg - Tavis Ormandy - - Fix validation for various cmap table formats. - - * src/sfnt/ttcmap.c (tt_cmap8_validate, tt_cmap10_validate, - tt_cmap12_validate): Check `length' correctly. - (tt_cmap_14_validate): Check `length' and `numMappings' correctly. - -2009-03-20 Werner Lemberg - - Protect against malformed compressed data. - - * src/lzw/ftzopen.c (ft_lzwstate_io): Test whether `state->prefix' is - zero. - -2009-03-20 Werner Lemberg - - Protect against invalid SID values in CFFs. - - Problem reported by Tavis Ormandy . - - * src/cff/cffload.c (cff_charset_load): Reject SID values larger - than 64999. - -2009-03-19 Vincent Richomme - - Update WinCE Visual C project files. - - * builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2008-ce/freetype.vcproj: Add missing base extension - files. - -2009-03-19 Werner Lemberg - - Remove unused Win32 code. - - * builds/wince/ftdebug.c: Remove code guarded with `!_WIN32_WCE'. - Since Win32 is handled separately this is no longer needed. - -2009-03-19 Vincent Richomme - - Make `gzip' module compile on WinCE. - - * src/gzip/zconf.h [_WIN32_WCE]: Define NO_ERRNO_H. - -2009-03-19 Werner Lemberg - - Remove unused WinCE code. - - * builds/win32/ftdebug.c: Remove code guarded with `_WIN32_WCE'. - Since WinCE is handled separately this is no longer needed. - -2009-03-16 Werner Lemberg - - docmaker: Don't ignore single-line code blocks. - - * src/tools/docmaker/content.py (DocBlock::_init__): Fix change from - 2009-01-31. - -2009-03-15 Steve Langasek - - Use __asm__ for declaring assembly instead of asm. - - * builds/unix/ftconfig.in (FT_MulFix_arm): Use __asm__ instead of - asm on arm, fixing a build failure on armel with -pedantic. - -2009-03-14 Werner Lemberg - - Fix valgrind warning. - - * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_bit_aligned): Don't read - past the end of the frame. - -2009-03-12 Werner Lemberg - - * Version 2.3.9 released. - ========================= - - - Tag sources with `VER-2-3-9'. - -2009-03-12 Werner Lemberg - - * builds/unix/freetype2.in: Move @FT2_EXTRA_LIBS@ to `Libs.private'. - -2009-03-12 Werner Lemberg - - Fix some FreeType Coverity issues as reported for Ghostscript. - - * src/base/ftobjs.c (FT_New_Face, FT_New_Memory_Face): Initialize - `args.stream' (#3874, #3875). - (open_face_PS_from_sfnt_stream): Improve error management (#3786). - * src/base/ftmm.c (ft_face_get_mm_service): Fix check of `aservice' - (#3870). - * src/base/ftstroke.c (ft_stroke_border_get_counts): Remove dead - code (#3790). - * src/base/ftrfork.c (raccess_guess_apple_generic): Check error - value of `FT_Stream_Skip' (#3784). - - * src/type1/t1gload.c (T1_Load_Glyph): Check `size' before accessing - it (#3872) - - * src/pcf/pcfdrivr.c (PCF_Glyph_Load): Check `face' before accessing - it (#3871). - * src/pcf/pcfread.c (pcf_get_metrics): Handle return value of - `pcf_get_metric' (#3789, #3782). - (pcf_get_properties): Use FT_STREAM_SKIP (#3783). - - * src/cache/ftcmanag.c (FTC_Manager_RegisterCache): Fix check of - `acache' (#3797) - - * src/cff/cffdrivr.c (cff_ps_get_font_info): Fix check of `cff' - (#3796). - * src/cff/cffgload.c (cff_decoder_prepare): Check `size' (#3795). - * src/cff/cffload.c (cff_index_get_pointers): Add comment (#3794). - - * src/bdf/bdflib.c (_bdf_add_property): Check `fp->value.atom' - (#3793). - (_bdf_parse_start): Add comment (#3792). - - * src/raster/ftraster.c (Finalize_Profile_Table): Check - `ras.fProfile' (#3791). - - * src/sfnt/ttsbit.c (Load_SBit_Image): Use FT_STREAM_SKIP (#3785). - - * src/gzip/ftgzip.c (ft_gzip_get_uncompressed_size): Properly ignore - seek error (#3781). - -2009-03-11 Michael Toftdal - - Extend CID service functions to handle CID-keyed CFFs as CID fonts. - - * include/freetype/ftcid.h (FT_Get_CID_Is_Internally_CID_keyed, - FT_Get_CID_From_Glyph_Index): New functions. - - * include/freetype/internal/services/svcid.h - (FT_CID_GetIsInternallyCIDKeyedFunc, - FT_CID_GetCIDFromGlyphIndexFunc): New function typedefs. - (CID Service): Use them. - - * src/base/ftcid.c: Include FT_CID_H. - (FT_Get_CID_Is_Internally_CID_keyed, FT_Get_CID_From_Glyph_Index): - New functions. - - * src/cff/cffdrivr.c (cff_get_is_cid, cff_get_cid_from_glyph_index): - New functions. - (cff_service_cid_info): Add them. - * src/cff/cffload.c (cff_font_load): Don't free `font->charset.sids' - -- it is needed for access as a CID-keyed font. It gets deleted - later on. - - * src/cid/cidriver.c (cid_get_is_cid, cid_get_cid_from_glyph_index): - New functions. - (cid_service_cid_info): Add them. - - * docs/CHANGES: Updated. - -2009-03-11 Bram Tassyns - - Fix Savannah bug #25597. - - * src/cff/cffparse.c (cff_parse_real): Don't allow fraction_length - to become larger than 9. - -2009-03-11 Werner Lemberg - - Fix Savannah bug #25814. - - * builds/unix/freetype2.in: As suggested in the bug report, move - @LIBZ@ to `Libs.private'. - -2009-03-11 Werner Lemberg - - Fix Savannah bug #25781. - We now simply check for a valid `offset', no longer handling `delta - = 1' specially. - - * src/sfnt/ttcmap.c (tt_cmap4_validate): Don't check `delta' for - last segment. - (tt_cmap4_set_range, tt_cmap4_char_map_linear, - tt_cmap4_char_map_binary): Check offset. - -2009-03-11 Werner Lemberg - - * src/base/Jamfile: Fix handling of ftadvanc.c. - Reported by Oran Agra . - -2009-03-10 Vincent Richomme - - Restructure Win32 and Wince compiler support. - - * src/builds/win32: Remove files for WinCE. - Move VC 2005 support to a separate directory. - Add directory for VC 2008 support. - - * src/builds/wince: New directory hierarchy for WinCE compilers - (VC 2005 and VC 2008). - -2009-03-09 Werner Lemberg - - More preparations for 2.3.9 release. - - * docs/CHANGES: Updated. - - * Jamfile, README: s/2.3.8/2.3.9/, s/238/239/. - -2009-03-09 Werner Lemberg - - * src/sfnt/rules.mk (SFNT_DRV_H): Add ttsbit0.c. - -2009-03-09 Alexey Kryukov - - Fix handling of EBDT formats 8 and 9 (part 2). - - This patch fixes the following problems in ttsbit0.c: - - . Bitmaps for compound glyphs were never allocated. - - . `SBitDecoder' refused to load metrics if some other metrics have - already been loaded. This condition certainly makes no sense for - recursive calls, so I've just disabled it. Another possibility - would be resetting `decoder->metrics_loaded' to false before - loading each composite component. However, we must restore the - original metrics after finishing the recursion; otherwise we can - get a misaligned glyph. - - . `tt_sbit_decoder_load_bit_aligned' incorrectly handled `x_pos', - causing some glyph components to be shifted too far to the right - (especially noticeable for small sizes). - - Note that support for grayscale bitmaps (not necessarily compound) is - completely broken in ttsbit0.c. - - * src/sfnt/tt_sbit_decoder_load_metrics: Always load metrics. - (tt_sbit_decoder_load_bit_aligned): Handle `x_pos' correctly in case - of `h == height'. - (tt_sbit_decoder_load_compound): Reset metrics after loading - components. - Allocate bitmap. - -2009-03-09 Werner Lemberg - - * builds/unix/configure.raw (version_info): Set to 9:20:3. - -2009-03-03 David Turner - - Protect SFNT kerning table parser against malformed tables. - - This closes Savannah BUG #25750. - - * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning): Fix a - bug where a malformed table would be successfully loaded but later - crash the engine during parsing. - -2009-03-03 David Turner - - Update documentation and bump version number to 2.3.9. - - * include/freetype/freetype.h: Bump patch version to 9. - * docs/CHANGES: Document the ABI break in 2.3.8. - * docs/VERSION.DLL: Update version numbers table for 2.3.9. - -2009-03-03 David Turner - - Remove ABI-breaking field in public PS_InfoFontRec definition. - - Instead, we define a new internal PS_FontExtraRec structure to - hold the additional field, then place it in various internal - positions of the corresponding FT_Face derived objects. - - * include/freetype/t1tables.h (PS_FontInfoRec): Remove the - `fs_type' field from the public structure. - * include/freetype/internal/psaux.h (T1_FieldLocation): New - enumeration `T1_FIELD_LOCATION_FONT_EXTRA'. - * include/freetype/internal/t1types.h (PS_FontExtraRec): New - structure. - (T1_FontRec, CID_FaceRec): Add it. - - * src/cid/cidload.c (cid_load_keyword): Handle - T1_FIELD_LOCATION_FONT_EXTRA. - * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c: - Adjust FT_STRUCTURE and T1CODE properly to handle `FSType'. - * src/type1/t1load.c (t1_load_keyword): Handle - T1_FIELD_LOCATION_FONT_EXTRA. - - * include/freetype/internal/services/svpsinfo.h (PsInfo service): - Add `PS_GetFontExtraFunc' function typedef. - - * src/base/ftfstype.c: Include FT_INTERNAL_SERVICE_H and - FT_SERVICE_POSTSCRIPT_INFO_H. - (FT_Get_FSType_Flags): Use POSTSCRIPT_INFO service. - - * src/cff/cffdrivr.c (cff_service_ps_info): Updated. - * src/cid/cidriver.c (cid_ps_get_font_extra): New function. - (cid_service_ps_info): Updated. - * src/type1/t1driver.c (t1_ps_get_font_extra): New function. - (t1_service_ps_info): Updated. - * src/type42/t42drivr.c (t42_ps_get_font_extra): New function. - (t42_service_ps_info): Updated. - -2009-03-02 Alexey Kryukov - - Fix handling of EBDT formats 8 and 9. - - The main cycle in `blit_sbit' makes too many iterations: it actually - needs the count of lines in the source bitmap rather than in the - target image. - - * src/sfnt/ttsbit.c (blit_sbit) [FT_CONFIG_OPTION_OLD_INTERNALS]: - Add parameter `source_height' and use it for main loop. - (Load_SBit_Single) [FT_CONFIG_OPTION_OLD_INTERNALS]: Updated. - -2009-02-23 Werner Lemberg - - Fix Savannah bug #25669. - - * src/base/ftadvanc.h (FT_Get_Advances): Fix serious typo. - - * src/base/ftobjs.c (FT_Select_Metrics, FT_Request_Metrics): Fix - scaling factor for non-scalable fonts. - - * src/cff/cffdrivr.c (cff_get_advances): Use correct advance width - value to prevent incorrect scaling. - - * docs/CHANGES: Document it. - -2009-02-15 Matt Godbolt - - Fix Savannah bug #25588. - - * builds/unix/ftconfig.in (FT_MulFix_arm): Use correct syntax for - `orr' instruction. - -2009-02-11 Werner Lemberg - - * src/truetype/ttobjs.c (tt_check_trickyness): Add `DFKaiShu'. - Reported by David Bevan . - -2009-02-09 Werner Lemberg - - Fix Savannah bug #25495. - - * src/sfnt/sfobjs.c (sfnt_load_face): Test for bitmap strikes before - setting metrics and bbox values. This ensures that the check for a - font with neither a `glyf' table nor bitmap strikes can be performed - early enough to set metrics and bbox values too. - -2009-02-04 Werner Lemberg - - Fix Savannah bug #25480. - - * builds/unix/freetype-config.in: For --ftversion, don't use $prefix - but $includedir. - -2009-01-31 Werner Lemberg - - Minor docmaker improvements. - - * src/tools/docmaker/content.py (DocBlock::__init__): Ignore empty - code blocks. - -2009-01-25 Werner Lemberg - - Fix SCANCTRL handling in TTFs. - Problem reported by Alexey Kryukov . - - * src/truetype/ttinterp.c (Ins_SCANCTRL): Fix threshold handling. - -2009-01-23 Werner Lemberg - - Move FT_Get_FSType_Flags to a separate file. - Problem reported by Mickey Gabel . - - * src/base/ftobjs.c (FT_Get_FSType_Flags): Move to... - * src/base/ftfstype.c: This new file. - - * modules.cfg (BASE_EXTENSION): Add ftfstype.c. - - * docs/INSTALL.ANY: Updated. - - * builds/mac/*.txt, builds/amiga/*makefile*, - builds/win32/{visualc,visualce}/freetype.*, builds/symbian/*: - Updated. - -2009-01-22 suzuki toshiya - - * builds/unix/ftsystem.c (FT_Stream_Open): Fix 2 error - messages ending without "\n". - -2009-01-22 suzuki toshiya - - Fix Savannah bug #25347. - - * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Rewind - the stream to the original position passed to this function, - when ft_lookup_PS_in_sfnt_stream() failed. - (Mac_Read_sfnt_Resource): Rewind the stream to the head of - sfnt resource body, when open_face_PS_from_sfnt_stream() - failed. - -2009-01-19 Michael Lotz - - Fix Savannah bug #25355. - - * include/freetype/config/ftconfig.h (FT_MulFix_i386): Make - assembler code work with gcc 2.95.3 (as used by the Haiku project). - Add `cc' register to the clobber list. - -2009-01-18 Werner Lemberg - - Protect FT_Get_Next_Char. - - * src/sfnt/ttcmap.c (tt_cmap4_set_range): Apply fix similar to - change from 2008-07-22. - - Patch from Ronen Ghoshal . - -2009-01-18 Werner Lemberg - - Implement FT_Get_Name_Index for SFNT driver. - - * src/sfnt/sfdriver.c (sfnt_get_name_index): New function. - (sfnt_service_glyph_dict): Use it. - - Problem reported by Truc Truong . - -2009-01-18 Werner Lemberg - - * include/freetype/ftstroke.h (FT_Outline_GetInsideBorder): Fix - documentation. Problem reported by Truc Truong . - - * docs/CHANGES: Updated. - -2009-01-14 Werner Lemberg - - * Version 2.3.8 released. - ========================= - - - Tag sources with `VER-2-3-8'. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.3.8. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualce/index.html, - builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj: s/2.3.7/2.3.8/, s/237/238/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8. - - * builds/unix/configure.raw (version_info): Set to 9:19:3. - - * docs/release: Updated. - -2009-01-14 Werner Lemberg - - * builds/toplevel.mk (dist): Compress better. - -2009-01-13 Werner Lemberg - - * src/base/ftobjs.c (FT_Get_FSType_Flags): Cast for compilation - with C++. - -2009-01-13 Werner Lemberg - - Don't use stdlib.h and friends directly. - Reported by Mickey Gabel . - - * src/base/ftdbgmem.c: s//FT_CONFIG_STANDARD_LIBRARY_H/. - - * src/gzip/ftgzip.c, src/lzw/ftlzw.c, src/raster/ftmisc.h: - s//FT_CONFIG_STANDARD_LIBRARY_H/. - - * src/autofit/aftypes.h, src/autofit/afhints.c, - src/pshinter/pshalgo.c: s//FT_CONFIG_STANDARD_LIBRARY_H/ - - * src/lzw/ftlzw.c, src/base/ftdbgmem.c: Don't include stdio.h. - -2009-01-12 Werner Lemberg - - Avoid compiler warnings. - - * */*: s/do ; while ( 0 )/do { } while ( 0 )/. - Reported by Sean McBride . - -2009-01-12 Werner Lemberg - - Fix stdlib dependencies. - - Problem reported by Mickey Gabel . - - * include/freetype/config/ftstdlib.h (ft_exit): Removed. Unused. - - * src/autofit/afhints.c, src/base/ftlcdfil.c, src/smooth/ftsmooth.c: - s/memcpy/ft_memcpy/. - * src/psaux/t1decode.c: s/memset/ft_memset/, s/memcpy/ft_memcpy/. - -2009-01-11 Werner Lemberg - - * docs/formats.txt: Add link to PCF specification. - - * include/freetype/ftbdf.h (FT_Get_BDF_Property): Improve - documentation. - -2009-01-09 suzuki toshiya - - * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance, - FT_Get_Advances): Change the type of load_flags from FT_UInt32 to - FT_Int32, to match with the flags for FT_Load_Glyph(). - * src/cff/cffdrivr.c (cff_get_advances): Ditto. - * src/truetype/ttdriver.c (tt_get_advances): Ditto. - * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances): - Ditto. - * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): - Ditto. - -2009-01-09 Daniel Zimmermann - - * src/gxvalid/gxvmort.c (gxv_mort_feature_validate): Fix wrong - length check. From Savannah patch #6682. - -2009-01-09 Werner Lemberg - - Fix problem with T1_FIELD_{NUM,FIXED}_TABLE2. - - * src/psaux/psobjs.c (ps_parser_load_field_table): Don't handle - `count_offset' if it is zero (i.e., unused). Otherwise, the first - element of the structure which holds the data is erroneously - modified. Problem reported by Chi Nguyen . - -2009-01-09 suzuki toshiya - - * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance, - FT_Get_Advances): Extend the type of load_flags from FT_UInt to - FT_UInt32, to pass 32-bit flags on 16bit platforms. - * src/cff/cffdrivr.c (cff_get_advances): Ditto. - * src/truetype/ttdriver.c (tt_get_advances): Ditto. - * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances): - Ditto. - * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): - Ditto. - -2009-01-09 suzuki toshiya - - * src/base/ftobjs.c (FT_Done_Library): Issue an error message when - FT_Done_Face() cannot free all faces. If the list of the opened - faces includes broken face which FT_Done_Face() cannot free, - FT_Done_Library() retries FT_Done_Face() and it can fall into - an endless loop. See the discussion: - http://lists.gnu.org/archive/html/freetype-devel/2008-09/msg00047.html - http://lists.gnu.org/archive/html/freetype-devel/2008-10/msg00000.html - -2009-01-07 Werner Lemberg - - * docs/CHANGES: Document new key `a' in ftdiff. - -2009-01-06 Werner Lemberg - - * autogen.sh: Don't use GNUisms while calling sed. Problem reported - by Sean McBride. - -2009-01-06 Werner Lemberg - - * src/base/ftbitmap.c (FT_Bitmap_Convert): Handle FT_PIXEL_MODE_LCD - and FT_PIXEL_MODE_LCD_V. Problem reported by Chi Nguyen - . - -2009-01-06 Diego Pettenò - - * builds/unix/configure.raw: Don't call AC_CANONICAL_BUILD and - AC_CANONICAL_TARGET and use $host_os only. A nice explanation for - this change can be found at - http://blog.flameeyes.eu/s/canonical-target. - - From Savannah patch #6712. - -2009-01-06 Sean McBride - - * src/base/ftdbgmem.c (_debug_mem_dummy): Make it static. - - * src/base/ftmac.c: Remove some #undefs. - -2008-12-26 Werner Lemberg - - Set `face_index' field in FT_Face for all font formats. - - * cff/cffobjs.c (cff_face_init), winfonts/winfnt.c (FNT_Face_Init), - sfnt/sfobjs.c (sfnt_init_face): Do it. - - * docs/CHANGES: Document it. - -2008-12-22 Steve Grubb - - * builds/unix/ftsystem.c (FT_Stream_Open): Reject zero-length files. - Patch from Savannah bug #25151. - -2008-12-21 Werner Lemberg - - * src/pfr/pfrdrivr.c, src/winfonts/winfnt.c, src/cache/ftcmanag.c, - src/smooth/ftgrays.c, src/base/ftobjc.s, src/sfobjs.c: - s/_Err_Bad_Argument/_Err_Invalid_Argument/. The former is for - errors in the bytecode interpreter only. - -2008-12-21 Werner Lemberg - - * src/base/ftpfr.c (FT_Get_PFR_Metrics): Protect against NULL - arguments. - Fix return value for non-PFR fonts. Both problems reported by Chi - Nguyen . - -2008-12-21 anonymous - - FT_USE_MODULE declares things as: - - extern const FT_Module_Class - - (or similar for C++). However, the actual types of the variables - being declared are often different, e.g., FT_Driver_ClassRec or - FT_Renderer_Class. (Some are, indeed, FT_Module_Class.) - - This works with most C compilers (since those structs begin with an - FT_Module_Class struct), but technically it's undefined behavior. - - To quote the ISO/IEC 9899:TC2 final committee draft, section 6.2.7 - paragraph 2: - - All declarations that refer to the same object or function shall - have compatible type; otherwise, the behavior is undefined. - - (And they are not compatible types.) - - Most C compilers don't reject (or even detect!) code which has this - issue, but the GCC LTO development branch compiler does. (It - outputs the types of the objects while generating .o files, along - with a bunch of other information, then compares them when doing the - final link-time code generation pass.) - - Patch from Savannah bug #25133. - - * src/base/ftinit.c (FT_USE_MODULE): Include variable type. - - * builds/amiga/include/freetype/config/ftmodule.h, - include/freetype/config/ftmodule.h, */module.mk: Updated to declare - pass correct types to FT_USE_MODULE. - -2008-12-21 Hongbo Ni - - * src/autofit/aflatin.c (af_latin_hint_edges), - src/autofit/aflatin2.c (af_latin2_hint_edges), src/autofit/afcjk.c - (af_cjk_hint_edges): Protect against division by zero. This fixes - Savannah bug #25124. - -2008-12-18 Werner Lemberg - - * docs/CHANGES: Updated. - -2008-12-18 Bevan, David - - Provide API for accessing embedding and subsetting restriction - information. - - * include/freetype.h (FT_FSTYPE_INSTALLABLE_EMBEDDING, - FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING, - FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING, FT_FSTYPE_EDITABLE_EMBEDDING, - FT_FSTYPE_NO_SUBSETTING, FT_FSTYPE_BITMAP_EMBEDDING_ONLY): New - macros. - (FT_Get_FSType_Flags): New function declaration. - - * src/base/ftobjs.c (FT_Get_FSType_Flags): New function. - - * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c - (t42_keywords): Handle `FSType'. - - * include/freetype/t1tables.h (PS_FontInfoRec): Add `fs_type' field. - -2008-12-17 Werner Lemberg - - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Don't use internal - macros so that copying the source code into an application works - out of the box. - -2008-12-17 Werner Lemberg - - * include/freetype/ftsynth.h, src/base/ftsynth.c: Move - FT_GlyphSlot_Own_Bitmap to... - * include/freetype/ftbitmap.h, src/base/ftbitmap.c: These files. - - * docs/CHANGES: Document it. - -2008-12-10 Werner Lemberg - - Generalize the concept of `tricky' fonts by introducing - FT_FACE_FLAG_TRICKY to indicate that the font format's hinting - engine is necessary for correct rendering. - - At the same time, slightly modify the behaviour of tricky fonts: - FT_LOAD_NO_HINTING is now ignored. To really force raw loading - of tricky fonts (without hinting), both FT_LOAD_NO_HINTING and - FT_LOAD_NO_AUTOHINT must be used. - - Finally, tricky TrueType fonts always use the bytecode interpreter - even if the patented code is used. - - * include/freetype/freetype.h (FT_FACE_FLAG_TRICKY, FT_IS_TRICKY): - New macros. - - * src/truetype/ttdriver.c (Load_Glyph): Handle new load flags - semantics as described above. - - * src/truetype/ttobjs.c (tt_check_trickyness): New function, using - code of ... - (tt_face_init): This function, now simplified and updated to new - semantics. - - * src/base/ftobjs.c (FT_Load_Glyph): Don't use autohinter for tricky - fonts. - - * docs/CHANGES: Document it. - -2008-12-09 Werner Lemberg - - Really fix Savannah bug #25010: An SFNT font with neither outlines - nor bitmaps can be considered as containing space `glyphs' only. - - * src/truetype/ttpload.c (tt_face_load_loca): Handle the case where - a `glyf' table is missing. - - * src/truetype/ttgload.c (load_truetype_glyph): Abort if we have no - `glyf' table but a non-zero `loca' entry. - (tt_loader_init): Handle missing `glyf' table. - - * src/base/ftobjs.c (FT_Load_Glyph): Undo change 2008-12-05. - - * src/sfnt/sfobjs.c (sfnt_load_face): A font with neither outlines - nor bitmaps is scalable. - -2008-12-05 Werner Lemberg - - * src/autofit/aflatin.c (af_latin_uniranges): Add more ranges. This - fixes Savannah bug #21190 which also provides a basic patch. - -2008-12-05 Werner Lemberg - - * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): Use value - 0x100 instead of 0x10000; the latter value is already occupied by - FT_LOAD_TARGET_LIGHT. Bug reported by James Cloos. - - - Handle SFNT with neither outlines nor bitmaps. This fixes Savannah - bug #25010. - - * src/base/ftobjs.c (FT_Load_Glyph): Reject fonts with neither - outlines nor bitmaps. - - * src/sfnt/sfobjs.c (sfnt_load_face): Don't return an error if there - is no table with glyphs. - - - * src/sfnt/ttload.c (tt_face_lookup_table): Improve debugging - message. - -2008-12-01 Werner Lemberg - - GDEF tables need `glyph_count' too for validation. Problem reported - by Chi Nguyen . - - * src/otvalid/otvgdef.c (otv_GDEF_validate), src/otvalid/otvalid.h - (otv_GDEF_validate), src/otvalid/otvmod.c (otv_validate): Pass - `glyph_count'. - -2008-11-29 Werner Lemberg - - * src/autofit/afcjk.c, src/base/ftoutln.c, src/base/ftrfork.c, - src/bdf/bdfdrivr.c, src/gxvalid/gxvmorx.c, src/otvalid/otvmath.c, - src/pcf/pcfdrivr.c, src/psnames/pstables.h, src/smooth/ftgrays.c, - src/tools/glnames.py, src/truetype/ttinterp.c, src/type1/t1load.c, - src/type42/t42objs.c, src/winfonts/winfnt.c: Fix compiler warnings - (Atari PureC). - -2008-11-29 James Cloos - - * src/type/t1load.c (mm_axis_unmap): Revert previous patch and fix - it correctly by using FT_INT_TO_FIXED (FreeType expects 16.16 values - in the /BlendDesignMap space). - -2008-11-29 James Cloos - - * src/type1/t1load.c (mm_axis_unmap): `blend_points' is FT_Fixed*, - whereas `design_points' is FT_Long*. Therefore, return blend rather - than design points. - -2008-11-27 Werner Lemberg - - * src/cff/cffparse.c (cff_parse_real): Handle more than nine - significant digits correctly. This fixes Savannah bug #24953. - -2008-11-25 Daniel Zimmermann - - * src/base/ftstream.c (FT_Stream_ReadFields): Don't access stream - before the NULL check. From Savannah patch #6681. - -2008-11-24 Werner Lemberg - - Fixes from the gnuwin32 port. - - * src/base/ftlcdfil.c: s/EXPORT/EXPORT_DEF/. - - * src/base/ftotval.c: Include FT_OPENTYPE_VALIDATE_H. - - * src/psaux/psobjs.c (ps_table_add): Check `length'. - -2008-11-15 Werner Lemberg - - * src/truetype/ttinterp.c (tt_default_graphics_state): The default - value for `scan_type' is zero, as confirmed by Greg Hitchcock from - Microsoft. Problem reported by Michal Nowakowski - . - -2008-11-12 Tor Andersson - - * src/cff/cffdrivr.c (cff_get_cmap_info): Initialize `format' field. - This fixes Savannah bug #24819. - -2008-11-08 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_load_face): Remove #if 0/#endif guards - since OpenType version 1.5 has been released. - - * include/ttnameid.h (TT_NAME_ID_WWS_FAMILY, - TT_NAME_ID_WWS_SUBFAMILY): New macros for OpenType 1.5. - (TT_URC_COPTIC, TT_URC_VAI, TT_URC_NKO, TT_URC_BALINESE, - TT_URC_PHAGSPA, TT_URC_NON_PLANE_0, TT_URC_PHOENICIAN, - TT_URC_TAI_LE, TT_URC_NEW_TAI_LUE, TT_URC_BUGINESE, - TT_URC_GLAGOLITIC, TT_URC_YIJING, TT_URC_SYLOTI_NAGRI, - TT_URC_LINEAR_B, TT_URC_ANCIENT_GREEK_NUMBERS, TT_URC_UGARITIC, - TT_URC_OLD_PERSIAN, TT_URC_SHAVIAN, TT_URC_OSMANYA, - TT_URC_CYPRIOT_SYLLABARY, TT_URC_KHAROSHTHI, TT_URC_TAI_XUAN_JING, - TT_URC_CUNEIFORM, TT_URC_COUNTING_ROD_NUMERALS, TT_URC_SUNDANESE, - TT_URC_LEPCHA, TT_URC_OL_CHIKI, TT_URC_SAURASHTRA, TT_URC_KAYAH_LI, - TT_URC_REJANG, TT_URC_CHAM, TT_URC_ANCIENT_SYMBOLS, - TT_URC_PHAISTOS_DISC, TT_URC_OLD_ANATOLIAN, TT_URC_GAME_TILES): New - macros for OpenType 1.5. - -2008-11-08 Wenlin Institute - - * src/base/ftobjs.c (ft_glyphslot_free_bitmap): Protect against - slot->internal == NULL. Reported by Graham Asher. - -2008-11-08 Werner Lemberg - - * src/sfnt/sfobjs.c (tt_face_get_name): Modified to return an error - code so that memory allocation problems can be distinguished from - missing table entries. Reported by Graham Asher. - (GET_NAME): New macro. - (sfnt_load_face): Use it. - -2008-11-05 Werner Lemberg - - * devel/ftoption.h, include/freetype/config/ftoption.h - [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Undefine - TT_CONFIG_OPTION_UNPATENTED_HINTING. This fixes the return value of - `FT_Get_TrueType_Engine_Type' (and makes it work as documented). - Reported in bug #441638 of bugzilla.novell.com. - - * docs/CHANGES: Document it. - -2008-11-03 Werner Lemberg - - * src/type1/t1load.c (parse_subrs): Use an endless loop. There are - fonts (like HELVI.PFB version 003.001, used on OS/2) which define - some `subrs' elements more than once. Problem reported by Peter - Weilbacher . - -2008-10-15 Graham Asher - - * src/sfnt/ttpost.c (tt_post_default_names): Add `const'. - -2008-10-15 David Turner - - * src/truetype/ttgxvar.c (TT_Set_MM_Blend): Disambiguate for - meddlesome compilers' warning against `for ( ...; ...; ...) ;'. - -2008-10-14 Werner Lemberg - - * src/cff/cffobjs.c (cff_face_init): Remove compiler warning. - Suggested by Bram Tassyns in Savannah patch #6651. - -2008-10-12 Graham Asher - - * src/sfnt/sfobjs.c (sfnt_load_face): Fix computation of - `underline_position'. - -2008-10-12 Werner Lemberg - - * docs/CHANGES: Updated. - -2008-10-09 suzuki toshiya - - Fix Savannah bug #24468. - - According to include/freetype/internal/ftobjs.h, the appropriate - type to interchange single character codepoint is FT_UInt32. It - should be distinguished from FT_UInt which can be 16bit integer. - - * src/sfnt/ttcmap.c (tt_cmap4_char_map_linear): Change the type - of the second argument `pcharcode' from FT_UInt* to FT_UInt32*. - (tt_cmap4_char_map_binary): Ditto. - (tt_cmap14_get_nondef_chars): Change the type of return value - from FT_UInt* to FT_UInt32*. - -2008-10-08 John Tytgat - - Fix Savannah bug #24485. - - * src/type1/t1load.c (parse_charstrings): Assure that we always have - a .notdef glyph. - -2008-10-05 suzuki toshiya - - * src/base/ftmac.c: Include FT_TRUETYPE_TAGS_H for multi build. - * builds/mac/ftmac.c: Ditto. - -2008-10-05 suzuki toshiya - - * include/freetype/tttags.h (TTAG_TYP1, TTAG_typ1): Fix definitions. - * src/base/ftobjs.c: Include FT_TRUETYPE_TAGS_H. - -2008-10-05 suzuki toshiya - - * src/sfnt/sfobjs.c (sfnt_open_font): Allow `typ1' version tag in - the beginning of sfnt container. - * src/sfnt/ttload.c (check_table_dir): Return - `SFNT_Err_Table_Missing' when sfnt table directory structure is - correct but essential tables for TrueType fonts (`head', `bhed' or - `SING') are missing. Other errors are returned by - SFNT_Err_Unknown_File_Format. - - * src/base/ftobjs.c (FT_Open_Face): When TrueType driver returns - `FT_Err_Table_Missing', try `open_face_PS_from_sfnt_stream'. It is - enabled only when old mac font support is configured. - -2008-10-04 suzuki toshiya - - * include/freetype/tttags.h (TTAG_CID, TTAG_FOND, TTAG_LWFN, - TTAG_POST, TTAG_sfnt, TTAG_TYP1, TTAG_typ1): New tags to simplify - the repeated calculations of these values in ftobjs.c and ftmac.c. - * src/base/ftobjs.c: Replace all FT_MAKE_TAG by new tags. - * src/base/ftmac.c: Ditto. - * builds/mac/ftmac.c: Ditto. - -2008-10-04 suzuki toshiya - - * src/base/ftobjs.c (ft_lookup_PS_in_sfnt_stream): Remove wrong - initialization of *is_sfnt_cid. - -2008-10-04 Werner Lemberg - - * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Remove compiler - warnings. - -2008-10-04 suzuki toshiya - - * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Replaced by... - (ft_lookup_PS_in_sfnt_stream): This. - (open_face_PS_from_sfnt_stream): New function. It checks whether - the stream is sfnt-wrapped Type1 PS font or sfnt-wrapped CID-keyed - font, then try to open a face for given face_index. - (Mac_Read_sfnt_Resource): Replace the combination of - `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' by - `open_face_PS_from_sfnt_stream'. - * src/base/ftmac.c (FT_New_Face_From_SFNT): Ditto. - * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto. - * src/base/ftbase.h: Remove `ft_lookup_PS_in_sfnt' and add - `open_face_PS_from_sfnt_stream'. - -2008-10-03 suzuki toshiya - - * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Set *is_sfnt_cid to - FALSE if neither `CID ' nor `TYP1' is found in the sfnt container. - -2008-10-03 suzuki toshiya - - * include/freetype/config/ftconfig.h: Define FT_MACINTOSH when SC or - MrC compiler of MPW is used. These compilers do not define the - macro __APPLE__ by themselves. - * builds/unix/ftconfig.in: Ditto. - * builds/vms/ftconfig.h: Ditto. - * src/base/ftbase.c: Use FT_MACINTOSH instead of __APPLE__, to - include ftmac.c if FreeType 2 is built by MPW. - * src/base/ftobjs.c: Use FT_MACINTOSH instead of __APPLE__, to - enable shared functions for ftmac.c if FreeType 2 is built by MPW. - - * builds/mac/ftmac.c: Include ftbase.h. - (memory_stream_close): Removed. - (new_memory_stream): Ditto. - (open_face_from_buffer): Removed. Use the implementation in - ftobjs.c. - (ft_lookup_PS_in_sfnt): Ditto. - - * builds/mac/FreeType.m68k_far.make.txt: Build ftmac.c as an - included part of ftbase.c, to share the functions in ftobjs.c. The - rule compiling ftmac.c separately is removed and the rule copying - ftbase.c from src/base/ftbase.c to builds/mac/ftbase.c is added. - * builds/mac/FreeType.m68k_cfm.make.txt: Ditto. - * builds/mac/FreeType.ppc_classic.make.txt: Ditto. - * builds/mac/FreeType.ppc_carbon.make.txt: Ditto. - -2008-10-02 Bram Tassyns - - * src/cff/cffgload.c (cff_slot_load): Map CID 0 to GID 0. This - fixes Savannah bug #24430. - -2008-10-02 Werner Lemberg - - * builds/freetype.mk (BASE_H): Rename to... - (INTERNAL_H): This. - (FREETYPE_H): Updated. - * src/base/rules.mk: (BASE_OBJ_S, OBJ_DIR/%.$O): Add BASE_H. - * src/bdf/rules.mk (BDF_DRV_H): Add bdferror.h. - * src/cache/rules.mk (CACHE_DRV_H): Add ftccache.h and ftcsbits.h. - * src/pcf/rules.mk (PCF_DRV_H): Add pcfread.h. - * src/raster/rules.mk (RASTER_DRV_H): Add ftmisc.h. - * src/type42/rules.mk (T42_DRV_H): Add t42types.h. - -2008-10-02 suzuki toshiya - - * src/base/ftbase.h: New file to declare the private utility - functions shared by the sources of base modules. Currently, - `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' are declared to - share between ftobjs.c and ftmac.c. - - * src/base/rule.mk: Add ftbase.h. - - * src/base/ftobjs.c: Include ftbase.h. - (memory_stream_close): Build on any platform when old MacOS font - support is enabled. - (new_memory_stream): Ditto. - (open_face_from_buffer): Build on any platform when old MacOS font - support is enabled. The counting of the face in a font file is - slightly different between Carbon-dependent parser and Carbon-free - parser. They are merged with the platform-specific conditional. - (ft_lookup_PS_in_sfnt): Ditto. - - * src/base/ftmac.c: Include ftbase.h. - (memory_stream_close): Removed. - (new_memory_stream): Ditto. - (open_face_from_buffer): Removed. Use the implementation in - ftobjs.c. - (ft_lookup_PS_in_sfnt): Ditto. - -2008-10-02 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_load_face): `psnames_error' is only needed - if TT_CONFIG_OPTION_POSTSCRIPT_NAMES is defined. - -2008-10-01 Werner Lemberg - - * src/truetype/ttobjs.c (tt_face_done), src/cff/cffobjs.c - (cff_face_done), src/pfr/pfrobjs.c (pfr_face_done), - src/pcf/pcfdrivr.c (PCF_Face_Done), src/cid/cidobjs.c - (cid_face_done), src/bdf/bdfdrivr. (BDF_Face_Done), - src/sfnt/sfobjs.c (sfnt_face_done): Protect against face == 0. - Reported by Graham Asher. - -2008-09-30 suzuki toshiya - - * src/base/rules.mk: Add conditional source to BASE_SRC, for `make - multi' on Mac OS X. If the macro $(ftmac_c) is defined, - $(BASE_DIR)/$(ftmac_c) is added to BASE_SRC. In a normal build, the - lack of ftmac.c in BASE_SRC is not serious because ftbase.c includes - ftmac.c. - * builds/unix/unix-def.in: Add a macro definition of $(ftmac_c). - * builds/unix/configure.raw: Add procedure to set up appropriate - value of $(ftmac_c) with the consideration of the availability of - Carbon framework. - -2008-09-30 suzuki toshiya - - * src/base/Jamfile: Add target for multi build by jam on Mac OS X. - * src/base/ftobjs.c (FT_New_Face): Fix the condition to include this - function for MPW building. It is synchronized the condition to - include ftmac.c source into ftbase.c. - -2008-09-22 Werner Lemberg - - * src/cff/cffgload.c (CFF_Operator, cff_argument_counts, - cff_decoder_parse_charstrings): Handle (invalid) - `callothersubr' and `pop' instructions. - -2008-09-22 John Tytgat - - Fix Savannah bug #24307. - - * include/freetype/internal/t1types.h (CID_FaceRec), - src/type42/t42types.h (T42_FaceRec): Comment out `afm_data'. - -2008-09-21 Werner Lemberg - - * src/smooth/ftgrays.c (gray_raster_render): Don't dereference - `target_map' if FT_RASTER_FLAG_DIRECT is set. Problem reported by - Stephan T. Lavavej . - -2008-09-21 suzuki toshiya - - * src/otvalid/Jamfile: Add missing target `otvmath' for multi build - by jam. - * src/sfnt/Jamfile: Add missing target `ttmtx' for multi build by - jam. - -2008-09-20 Werner Lemberg - - * src/smooth/ftgrays.c (gray_find_cell): Fix threshold. The values - passed to this function are already `normalized'. Problem reported - by Stephan T. Lavavej . - - * docs/CHANGES: Document it. - -2008-09-20 Werner Lemberg - - * src/base/ftoutln.c: Include FT_INTERNAL_DEBUG_H. - (FT_Outline_Decompose): Decorate with tracing messages. - - * src/smooth/ftgrays.c [DEBUG_GRAYS]: Replace with - FT_DEBUG_LEVEL_TRACE. - [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: Include stdio.h and - stdarg.h. - - (FT_TRACE) [_STANDALONE_]: Remove. - (FT_Message) [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: New function. - (FT_TRACE5, FT_TRACE7) [_STANDALONE_]: New macros. - (FT_ERROR) [_STANDALONE_]: Updated. - - (gray_hline) [FT_DEBUG_LEVEL_TRACE]: Fix condition. - Use FT_TRACE7. - (gray_dump_cells): Make it `static void'. - (gray_convert_glyph): Use FT_TRACE7. - - (FT_Outline_Decompose) [_STANDALONE_]: Synchronize with version in - ftoutln.c. - - * src/base/ftadvanc.c (FT_Get_Advance, FT_Get_Advances): Use - FT_ERROR_BASE. - - * docs/formats.txt: Updated. - -2008-09-19 suzuki toshiya - - * src/base/ftmac.c: Import sfnt-wrapped Type1 and sfnt-wrapped - CID-keyed font support. - * builds/mac/ftmac.c: Ditto. - -2008-09-19 suzuki toshiya - - * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Fix double free bug in - sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font support code. - `open_face_from_buffer' frees the passed buffer if it cannot open a - face from the buffer, so the caller must not free it. - -2008-09-19 suzuki toshiya - - * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Add initial support - for sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font. - (ft_lookup_PS_in_sfnt): New function to look up `TYP1' or `CID ' - table in sfnt table directory. It is used before loading TrueType - font driver. - - * docs/CHANGES: Add note about the current status of sfnt-wrapped - Type1 and sfnt-wrapped CID-keyed font support. - -2008-09-18 Werner Lemberg - - * src/base/ftsystem.c (FT_Done_Memory): Use ft_sfree directly for - orthogonality (ft_free and ft_sfree could belong to different memory - pools). This fixes Savannah bug #24297. - -2008-09-18 suzuki toshiya - - * src/cff/cffobjs.c (cff_face_init): Use TTAG_OTTO defined - in ttags.h instead of numerical value 0x4F54544FL. - -2008-09-16 Werner Lemberg - - * src/cff/cffgload.h, src/cff/cffgload.c - (cff_decoder_set_width_only): Eliminate function call. - -2008-09-15 George Williams - - Fix Savannah bug #24179, reported by Bram Tassyns. - - * src/type1/t1load.c (mm_axis_unmap, T1_Get_MM_Var): Fix computation - of default values. - -2008-09-15 Werner Lemberg - - * src/tools/glnames.py (main): Surround `ft_get_adobe_glyph_index' - and `ft_adobe_glyph_list' with FT_CONFIG_OPTION_ADOBE_GLYPH_LIST to - prevent unconditional definition. This fixes Savannah bug #24241. - - * src/psnames/pstables.h: Regenerated. - -2008-09-13 Werner Lemberg - - * autogen.sh, builds/unix/configure.raw, - include/freetype/config/ftconfig.h, builds/unix/ftconfig.in: Minor - beautifying. - - * include/freetype/ftadvanc.h, include/freetype/ftgasp.h, - include/freetype/ftlcdfil.h: Protect against FreeType 1. - Some other minor fixes. - - * devel/ftoption.h: Synchronize with - include/freetype/config/ftoption.h. - -2008-09-11 Werner Lemberg - - * src/base/ftbase.c: Include ftadvanc.c. - -2008-09-11 suzuki toshiya - - * builds/unix/ftconfig.in: Duplicate the cpp computation of - FT_SIZEOF_{INT|LONG} from include/freetype/config/ftconfig.h. - (FT_USE_AUTOCONF_SIZEOF_TYPES): New macro. If defined, the cpp - computation is disabled and the statically configured sizes are - used. This fixes Savannah bug #21250. - - * builds/unix/configure.raw: Add the checks to compare the cpp - computation results of the bit length of int and long versus the - sizes detected by running `configure'. If the results are - different, FT_USE_AUTOCONF_SIZEOF_TYPES is defined to prioritize the - results. - New option --{enable|disable}-biarch-config is added to define or - undefine FT_USE_AUTOCONF_SIZEOF_TYPES manually. - -2008-09-05 suzuki toshiya - - * builds/unix/configure.raw: Clear FT2_EXTRA_LIBS when Carbon or - ApplicationService framework is missing. Although this value is not - used in building of FreeType2, it is written in `freetype2.pc' and - `freetype-config'. - -2008-09-01 david turner - - * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Accept a negative cmap - index to mean `use default cached FT_Face's charmap'. This fixes - Savannah bug #22625. - * include/freetype/ftcache.h: Document it. - - - Make FT_MulFix an inlined function. This is done to speed up - FreeType a little (on x86 3% when loading+hinting, 10% when - rendering, ARM savings are more important though). Disable this by - undefining FT_CONFIG_OPTION_INLINE_MULFIX. - - Use of assembler code can now be controlled with - FT_CONFIG_OPTION_NO_ASSEMBLER. - - * include/freetype/config/ftconfig.h, builds/unix/ftconfig.in - [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_arm): New assembler - implementation. - [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_i386): Assembler - implementation taken from `ftcalc.c'. - [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MULFIX_ASSEMBLER): New macro - which is defined to the platform-specific assembler implementation - of FT_MulFix. - [FT_CONFIG_OPTION_INLINE_MULFIX && FT_MULFIX_ASSEMBLER] - (FT_MULFIX_INLINED): New macro. - - * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_NO_ASSEMBLER, - FT_CONFIG_OPTION_INLINE_MULFIX): New macros. - - * include/freetype/freetype.h: Updated to handle FT_MULFIX_INLINED. - - * src/base/ftcalc.c: Updated to use FT_MULFIX_ASSEMBLER and - FT_MULFIX_INLINED. - - - Add a new header named FT_ADVANCES_H declaring some new APIs to - extract the advances of one or more glyphs without necessarily - loading their outlines. Also provide `fast loaders' for the - TrueType, Type1, and CFF font drivers (more to come later). - - * src/base/ftadvanc.c, include/freetype/ftadvanc.h: New files. - - * include/freetype/config/ftheader.h (FT_ADVANCES_H): New macro. - * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): New macro. - - * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): - `flags' and `advances' are now of type `FT_UInt' and `FT_Fixed', - respectively. - - * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC): Add - ftadvanc.c. - - * src/cff/cffdrivr.c (cff_get_advances): New function. - (cff_driver_class): Register it. - - * src/cff/cffgload.c (cff_decoder_set_width_only): New function. - (cff_decoder_parse_charstrings): Handle `width_only'. - (cff_slot_load): Handle FT_LOAD_ADVANCE_ONLY. - - * src/cff/cffgload.h (cff_decoder): New element `width_only'. - (cff_decoder_set_width_only): New declaration. - - * src/truetype/ttdriver.c (tt_get_advances): New function. - (tt_driver_class): Register it. - - * src/truetype/ttgload.c (Get_HMetrics, Get_VMetrics): Renamed to... - (TT_Get_HMetrics, TT_Get_VMetrics): This. - Update callers. - * src/truetype/ttgload.h: Declare them. - - * src/type1/t1gload.h, src/type1/t1gload.c (T1_Get_Advances): New - function. - * src/type1/t1driver.c (t1_driver_class): Register T1_Get_Advances. - - - Add checks for minimum version of the `autotools' stuff. - - * autogen.sh: Implement it. - (get_major_version, get_minor_version, get_patch_version, - compare_to_minimum_version, check_tool_version): New auxiliary - functions. - - * README.CVS: Document it. - -2008-08-29 suzuki toshiya - - * src/sfnt/sfobjs.c (sfnt_open_font): Use TTAG_OTTO defined in - ttags.h instead of FT_MAKE_TAG( 'O', 'T', 'T', 'O' ). - -2008-08-28 Werner Lemberg - - * src/type1/t1load.c (parse_encoding): Protect against infinite - loop. This fixes Savannah bug #24150 (where a patch has been posted - too). - -2008-08-23 Werner Lemberg - - * src/type/t1afm.c (compare_kern_pairs), src/pxaux/afmparse.c - (afm_compare_kern_pairs): Fix comparison. This fixes Savannah bug - #24119. - -2008-08-19 suzuki toshiya - - * src/base/ftobjs.c (FT_Stream_New): Initialize *astream always, - even if passed library or arguments are invalid. This fixes a bug - that an uninitialized stream is freed when an invalid library handle - is passed. Originally proposed by Mike Fabian, 2008/08/18 on - freetype-devel. - (FT_Open_Face): Ditto (stream). - (load_face_in_embedded_rfork): Ditto (stream2). - -2008-08-18 suzuki toshiya - - * src/base/ftmac.c: Add a fallback to guess the availability of the - `ResourceIndex' type. It is used when built without configure - (e.g., a build with Jam). - * builds/mac/ftmac.c: Ditto. - * builds/unix/configure.raw: Set HAVE_TYPE_RESOURCE_INDEX to 1 or 0 - explicitly, even if `ResourceIndex' is unavailable. - -2008-08-18 suzuki toshiya - - * builds/unix/configure.raw: In checking of Mac OS X features, - all-in-one header file `Carbon.h' is replaced by the minimum - header file `CoreServices.h', similar to current src/base/ftmac.c. - -2008-08-18 suzuki toshiya - - * src/sfnt/ttcmap.c (tt_cmap2_validate): Skip the validation of - sub-header when its code_count is 0. Many Japanese Dynalab fonts - include such an empty sub-header (code_count == 0, first_code == 0 - delta == 0, but offset != 0) as the second sub-header in SJIS cmap. - -2008-08-04 Werner Lemberg - - * src/type1/t1tokens.h: Handle `ForceBold' keyword. This fixes - Savannah bug #23995. - - * src/cid/cidload.c (parse_expansion_factor): New callback function. - (cid_field_records): Use it for `ExpansionFactor'. - * src/cod/cidtoken.h: Handle `ForceBold' keyword. - Don't handle `ExpansionFactor'. - -2008-08-04 Bram Tassyns - - * src/cff/cffparse.c (cff_parse_fixed_scaled): Fix thinko which - resulted in incorrect scaling. This fixes Savannah bug #23973. - -2008-08-04 Werner Lemberg - - Be more tolerant w.r.t. invalid entries in SFNT table directory. - - * src/sfnt/ttload.c (check_table_dir): Ignore invalid entries and - adjust table count. - Add more trace messages. - (tt_face_load_font_dir): Updated. - -2008-07-30 Werner Lemberg - - * src/cff/cffgload.c (cff_decoder_parse_charstrings): No longer - assume that the first argument on the stack is the bottom-most - element. Two reasons: - - o According to people from Adobe it is missing in the Type 2 - specification that pushing of additional, superfluous arguments - on the stack is prohibited. - - o Acroread in general handles fonts differently, namely by popping - the number of arguments needed for a particular operand (as a PS - interpreter would do). In case of buggy fonts this causes a - different interpretation which of the elements on the stack are - superfluous and which not. - - Since there are CFF subfonts (embedded in PDFs) which rely on - Acroread's behaviour, FreeType now does the same. - -2008-07-27 Werner Lemberg - - Add extra mappings for `Tcommaaccent' and `tcommaaccent'. This - fixes Savannah bug #23940. - - * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): Rename to... - (EXTRA_GLYPH_LIST_SIZE): This. - Increase by 2. - (ft_wgl_extra_unicodes): Rename to... - (ft_extra_glyph_unicodes): This. - Add two code values. - (ft_wgl_extra_glyph_names): Rename to... - (ft_extra_glyph_names): This. - Add two glyphs. - (ft_wgl_extra_glyph_name_offsets): Rename to... - (ft_extra_glyph_name_offsets): This. - Add two offsets. - - (ps_check_wgl_name, ps_check_wgl_unicode): Rename to... - (ps_check_extra_glyph_name, ps_check_extra_glyph_unicode): This. - Updated. - (ps_unicodes_init): Updated. - -2008-07-26 Werner Lemberg - - * src/cff/cffgload.c (cff_decoder_prepare, - cff_decoder_parse_charstrings): Improve debug output. - -2008-07-22 Martin McBride - - * src/sfnt/ttcmap.c (tt_cmap4_validate, tt_cmap4_char_map_linear, - tt_cmap4_char_map_binary): Handle fonts which treat the last segment - specially. According to the specification, such fonts would be - invalid but acroread accepts them. - -2008-07-16 Jon Foster - - * src/pfr/pfrdrivr.c (pfr_get_advance): Fix off-by-one error. - - * src/base/ftcalc.c (FT_MulFix): Fix portability issue. - - * src/sfnt/ttpost.c (MAC_NAME) [!FT_CONFIG_OPTION_POSTSCRIPT_NAMES]: - Fix compiler warning. - -2008-07-16 Werner Lemberg - - Handle CID-keyed fonts wrapped in an SFNT (with cmaps) correctly. - - * src/cff/cffload.c (cff_font_load): Pass `pure_cff'. - Invert sids table only if `pure_cff' is set. - * src/cff/cffload.h: Udpated. - - * src/cff/cffobjs.c (cff_face_init): Updated. - Set FT_FACE_FLAG_CID_KEYED only if pure_cff is set. - - * docs/CHANGES: Updated. - -2008-07-09 Werner Lemberg - - * src/truetype/ttpload.c (tt_face_load_loca): Handle buggy fonts - where num_locations < num_glyphs. Problem reported by Ding Li. - -2008-07-05 Werner Lemberg - - Since FreeType uses `$(value ...)', we now need GNU make 3.80 or - newer. This fixes Savannah bug #23648. - - * configure: zsh doesn't like ${1+"$@"}. - Update needed GNU make version. - * builds/toplevel.mk: Check for `$(eval ...)'. - * docs/INSTALL.GNU, docs/INSTALL.CROSS, docs/INSTALL.UNIX: Document - it. - -2008-07-04 Werner Lemberg - - * src/raster/ftraster.c (Draw_Sweep): If span is smaller than one - pixel, only check for dropouts if neither start nor end point lies - on a pixel center. This fixes Savannah bug #23762. - -2008-06-29 Werner Lemberg - - * Version 2.3.7 released. - ========================= - - - Tag sources with `VER-2-3-7'. - - * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump - version number to 2.3.7. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualce/index.html, - builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj: s/2.3.6/2.3.7/, s/236/237/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7. - - * builds/unix/configure.raw (version_info): Set to 9:18:3. - - * docs/release: Updated. - -2008-06-28 Werner Lemberg - - * src/ftglyph.c (FT_Matrix_Multiply, FT_Matrix_Invert): Move to... - * src/ftcalc.c: Here. This fixes Savannah bug #23729. - -2008-06-27 Werner Lemberg - - * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, - Horizontal_Gray_Sweep_Drop): Test for intersections which - degenerate to a single point can be ignored; this has been confirmed - by Greg Hitchcock from Microsoft. (This was commented out code.) - -2008-06-26 Werner Lemberg - - Improve navigation in API reference. - - * src/tools/docmaker/tohtml.py (html_header_3): Renamed to... - (html_header_6): This. - (html_header_3, html_header_3i, html_header_4, html_header_5, - html_header_5t): New strings. - (toc_footer_start, toc_footer_end): New strings. - (HtmlFormatter::html_header): Updated. - (HtmlFormatter::html_index_header, HtmlFormatter::html_toc_header): - New strings. - (HtmlFormatter::index_enter): Use `html_index_header'. - (HtmlFormatter::index_exit): Print `html_footer'. - (HtmlFormatter::toc_enter): Use `html_toc_header'. - (HtmlFormatter::toc_exit): Print proper footer. - - Convert ~ to non-breakable space. - - * src/tools/docmaker/tohtml.py (make_html_para): Implement it. - Update header files accordingly. - -2008-06-24 suzuki toshiya - - * builds/unix/configure.raw: Check type `ResourceIndex' explicitly - and define HAVE_TYPE_RESOURCE_INDEX if it is defined. Mac OS X 10.5 - bundles 10.4u SDK with MAC_OS_X_VERSION_10_5 macro but without - ResourceIndex type definition. The macro does not inform the type - availability. - * src/base/ftmac.c: More parentheses are inserted to clarify the - conditionals to disable legacy APIs in `10.5 and later' cases. If - HAVE_TYPE_RESOURCE_INDEX is not defined, ResourceIndex is defined. - -2008-06-24 Werner Lemberg - - * src/truetype/ttinterp.c (Ins_SCANTYPE): Don't check rendering - mode. - - * src/raster/ftraster.c (Render_Glyph, Render_Gray_Glyph, - Draw_Sweep): No-dropout mode is value 2, not value 0. - (Draw_Sweep): Really skip dropout handling for no-dropout mode. - -2008-06-24 Werner Lemberg - - * src/psaux/psobjs.c (t1_builder_close_contour): Don't add contour - if it consists of one point only. Based on a patch from Savannah - bug #23683 (from John Tytgat). - -2008-06-22 Werner Lemberg - - * src/truetype/ttgload.c (TT_Load_Glyph): Protect bytecode stuff - with IS_HINTED. - - * docs/CHANGES: Updated. - -2008-06-22 suzuki toshiya - - * builds/unix/configure.raw: If CFLAGS has `-isysroot XXX' option - but LDFLAGS does not, import it to LDFLAGS. The option is used to - specify non-default SDK on Mac OS X (e.g., universal binary SDK for - Mac OS X 10.4 on PowerPC platform). Although Apple TechNote 2137 - recommends to add the option only to CFLAGS, LDFLAGS should include - it because libfreetype.la is built with -no-undefined. This fixes a - bug reported by Ryan Schmidt in MacPorts, - http://trac.macports.org/ticket/15331. - -2008-06-21 Werner Lemberg - - Enable access to the various dropout rules of the B&W rasterizer. - Pass dropout rules from the TT bytecode interpreter to the - rasterizer. - - * include/freetype/ftimage.h (FT_OUTLINE_SMART_DROPOUTS, - FT_OUTLINE_EXCLUDE_STUBS): New flags for FT_Outline. - - * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, - Horizontal_Gray_Sweep_Drop): Use same mode numbers as given in the - OpenType specification. - Fix mode 4 computation. - (Render_Glyph, Render_Gray_Glyph): Handle new outline flags. - - * src/truetype/ttgload.c (TT_Load_Glyph) Convert scan conversion - mode to FT_OUTLINE_XXX flags. - - * src/truetype/ttinterp.c (Ins_SCANCTRL): Enable ppem check. - -2008-06-19 Werner Lemberg - - * src/cff/cffobjs.c (cff_face_init): Compute final - `dict->units_per_em' value before assigning it to - `cffface->units_per_EM'. Otherwise, CFFs without subfonts are - scaled incorrectly if the font matrix is non-standard. This fixes - Savannah bug #23630. - - * docs/CHANGES: Updated. - -2008-06-19 Werner Lemberg - - * src/type/t1objs.c (T1_Face_Init): Slightly improve algorithm fix - from 2008-06-19. - -2008-06-18 Werner Lemberg - - * src/type/t1objs.c (T1_Face_Init): Fix change from 2008-03-21. - Reported by Peter Weilbacher . - - * docs/CHANGES: Updated. - -2008-06-15 George Williams - - * src/otvalid/otvgpos.c (otv_MarkBasePos_validate): Set - `valid->extra2' to 1. This is undocumented in the OpenType 1.5 - specification. - -2008-06-15 Werner Lemberg - - * src/base/ftcalc.c (FT_MulFix) : Protect registers correctly - from clobbering. Patch from Savannah bug report #23556. - - * docs/CHANGES: Document it. - -2008-06-10 Werner Lemberg - - * autogen.sh: Add option `--install' to libtoolize. - -2008-06-10 Werner Lemberg - - * Version 2.3.6 released. - ========================= - - - Tag sources with `VER-2-3-6'. - - * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump - version number to 2.3.6. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualce/index.html, - builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj: s/2.3.5/2.3.6/, s/235/236/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6. - - * builds/unix/configure.raw (version_info): Set to 9:17:3. - - - * include/freetype/internal/psaux.h (T1_BuilderRec): Remove `scale_x' - and `scale_y'. - * src/cff/cffgload.h (CFF_Builder): Remove `scale_x' and `scale_y'. - - - * src/cff/cffparse.c: Include FT_INTERNAL_DEBUG_H. - * src/cff/cffobjs.h: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. - -2008-06-10 Werner Lemberg - - * src/base/ftobjs.c (open_face): Check `clazz->init_face' and - `clazz->done_face'. - -2008-06-09 VaDiM - - Support debugging on WinCE. From Savannah patch #6536; this fixes - bug #23497. - - * builds/win32/ftdebug.c (OutputDebugStringEx): New function/macro - as a replacement for OutputDebugStringA (which WinCE doesn't have). - Update all callers. - (ft_debug_init) [_WIN32_CE]: WinCE apparently doesn't have - environment variables. - -2008-06-09 Werner Lemberg - - * README.CVS: Updated. - - * builds/unix/configure.raw, builds/unix/freetype-config.in: Updated - for newer versions of autoconf and friends. - -2008-06-08 Werner Lemberg - - * src/type1/t1parse.h (T1_ParserRec): Make `base_len' and - `private_len' unsigned. - - * src/type1/t1parse.c (read_pfb_tag): Make `asize' unsigned and read - it as such. - (T1_New_Parser, T1_Get_Private_Dict): Make `size' unsigned. - - - * src/base/ftstream.c (FT_Stream_Skip): Reject negative values. - - - * src/type1/t1load.c (parse_blend_design_positions): Check `n_axis' - for sane value. - Fix typo. - - - * src/psaux/psobjs.c (ps_table_add): Check `idx' correctly. - - - * src/truetype/ttinterp (Ins_SHC): Use BOUNDS() to check - `last_point'. - - - * src/sfnt/ttload.c (tt_face_load_max_profile): Limit - `maxTwilightPoints'. - -2008-06-06 Werner Lemberg - - * src/truetype/ttinterp.c (Ins_IP): Handle case `org_dist == 0' - correctly. This fixes glyphs `t' and `h' of Arial Narrow at 12ppem. - -2008-06-03 Werner Lemberg - - * include/freetype/ftcache.h (FTC_FaceID): Change type back to - FT_Pointer. Reported by Ian Britten . - -2008-06-02 Werner Lemberg - - Emit header info for defined FreeType objects in reference. - - * src/tools/docmaker/content.py (re_header_macro): New regexp. - (ContentProcessor::__init__): Initialize new dictionary `headers'. - (DocBlock::__init__): Collect macro header definitions. - - * src/tools/docmaker/tohtml.py (header_location_header, - header_location_footer): New strings. - (HtmlFormatter::__init__): Pass `headers' dictionary. - (HtmlFormatter::print_html_field): Don't emit paragraph tags. - (HtmlFormatter::print_html_field_list): Emit empty paragraph. - (HtmlFormatter::block_enter): Emit header info. - -2008-06-01 Werner Lemberg - - * include/freetype/config/ftheader.h (FT_UNPATENTED_HINTING_H, - FT_INCREMENTAL_H): Added. - -2008-05-28 Werner Lemberg - - * src/tools/docmaker/sources.py (SourceBlock::__init__): While - looking for markup tags, return immediately as soon a single one is - found. - -2008-05-28 Werner Lemberg - - * src/truetype/ttinterp.c (Ins_MD): The MD instruction also uses - original, unscaled input values. Confirmed by Greg Hitchcock from - Microsoft. - -2008-05-27 Werner Lemberg - - * src/tools/docmaker/tohtml.py (block_footer_start, - block_footer_middle): Beautify output. - -2008-05-25 Werner Lemberg - - * src/raster/ftraster.c (fc_black_render): Return 0 when we are - trying to render into a zero-width/height bitmap, not an error code. - - * src/truetype/ttgload.c (load_truetype_glyph): Move initialization - of the graphics state for subglyphs to... - (TT_Hint_Glyph): This function. - Hinting instructions for a composite glyph apparently refer to the - just hinted subglyphs, not the unhinted, unscaled outline. This - seems to fix Savannah bugs #20973 and (at least partially) #23310. - -2008-05-20 suzuki toshiya - - * src/base/ftmac.c (FT_New_Face_From_Suitcase): Check if valid - `aface' is returned by FT_New_Face_From_FOND(). The patch was - proposed by an anonymous reporter of Savannah bug #23204. - -2008-05-18 Werner Lemberg - - * src/pshinter/pshalgo.c (ps_hints_apply): Reset scale values after - correction for pixel boundary. Without this patch, the effect can - be cumulative under certain circumstances, making glyphs taller and - taller after each call. This fixes Savannah bug #19976. - -2008-05-18 Werner Lemberg - - * src/base/ftdebug.c (FT_Message, FT_Panic): Send output to stderr. - This fixes Savannah bug #23280. - - * docs/CHANGES: Updated. - -2008-05-18 David Turner - - * src/psnames/psmodule.c (ft_wgl_extra_unicodes, - ft_wgl_extra_glyph_names, ft_wgl_extra_glyph_name_offsets, - ps_check_wgl_name, ps_check_wgl_unicode): Use `static' to make - declarations non-global. - - * src/type1/t1load.c: Add missing comment. - -2008-05-17 Sam Hocevar - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Handle zero-contour - glyphs correctly. Patch from Savannah bug #23277. - -2008-05-16 Werner Lemberg - - * docs/CHANGES: Updated. - -2008-05-16 Sergey Tolstov - - Improve support for WGL4 encoded fonts. - - * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): New macro. - (ft_wgl_extra_unicodes, ft_wgl_extra_glyph_names, - ft_wgl_extra_glyph_name_offsets): New arrays. - (ps_check_wgl_name, ps_check_wgl_unicode): New functions. - (ps_unicodes_init): Use them to add additional Unicode mappings. - -2008-05-15 Werner Lemberg - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings) - : `closepath' without a path is a no-op, not an error - (cf. the PS reference manual). - - Reported by Martin McBride. - -2008-05-15 Werner Lemberg - - * builds/toplevel.mk (CONFIG_GUESS, CONFIG_SUB): Updated. - -2008-05-15 Werner Lemberg - - * src/type1/t1load.c (parse_subrs): Accept fonts with a subrs array - which contains a single but empty entry. This is technically - invalid (since it must end with `return'), but... - - Reported by Martin McBride. - -2008-05-14 Werner Lemberg - - Finish fix of scaling bug of CID-keyed CFF subfonts. - - * include/freetype/internal/ftcalc.h, src/base/ftcalc.c - (FT_Matrix_Multiply_Scaled, FT_Vector_Transform_Scaled): New - functions. - - * src/cff/cffobjs.h (CFF_Internal): New struct. It is used to - provide global hinting data for both the top-font and all subfonts - (with proper scaling). - - * src/cff/cffobjs.c (cff_make_private_dict): New function, using - code from `cff_size_init'. - (cff_size_init, cff_size_done, cff_size_select, cff_size_request): - Use CFF_Internal and handle subfonts. - (cff_face_init): Handle top-dict and subfont matrices correctly; - apply some heuristic in case of unlikely matrix concatenation - results. This has been discussed with people from Adobe (thanks - goes mainly to David Lemon) who confirm that the CFF specs are fuzzy - and not correct. - - * src/cff/cffgload.h (cff_decoder_prepare): Add `size' argument. - - * src/cff/cffgload.c (cff_builder_init): Updated. - (cff_decoder_prepare): Handle hints globals for subfonts. - Update all callers. - (cff_slot_load): Handling scaling of subfonts properly. - - * src/cff/cffparse.c (cff_parse_fixed_dynamic): New function. - (cff_parse_font_matrix): Use it. - - * src/cff/cfftypes.h (CFF_FontDictRec): Make `units_per_em' - FT_ULong. - - * docs/CHANGES: Document it. - -2008-05-13 Werner Lemberg - - * src/winfonts/winfnt.c (fnt_face_get_dll_font, FNT_Face_Init): - Handle case `face_index < 0'. - * docs/CHANGES: Document it. - -2008-05-04 Werner Lemberg - - First steps to fix the scaling bug of CID-keyed CFF subfonts, - reported by Ding Li on 2008/03/28 on freetype-devel. - - * src/base/cff/cffparse.c (power_tens): New array. - (cff_parse_real): Rewritten to introduce a fourth parameter which - returns the `scaling' of the real number so that we have no - precision loss. This is not used yet. - Update all callers. - (cff_parse_fixed_thousand): Replace with... - (cff_parse_fixed_scaled): This function. Update all callers. - -2008-05-03 Werner Lemberg - - * src/base/ftobjs.c (FT_Load_Glyph): Call the auto-hinter without - transformation since it recursively calls FT_Load_Glyph. This fixes - Savannah bug #23143. - -2008-04-26 Werner Lemberg - - * include/freetype/internal/psaux.h (T1_BuilderRec): Mark `scale_x' - and `scale_y' as obsolete since they aren't used. - * src/psaux/psobjs.c (t1_builder_init): Updated. - - * src/cff/cffgload.h (CFF_Builder): Mark `scale_x' and `scale_y' as - obsolete since they aren't used. - * src/cff/cffgload.c (cff_builder_init): Updated. - -2008-04-14 Werner Lemberg - - * src/pcf/pcfdrivr.c (PCF_Face_Init): Protect call to - `FT_Stream_OpenLZW' with `FT_CONFIG_OPTION_USE_LZ'. From Savannah - bug #22909. - -2008-04-13 Werner Lemberg - - * src/psaux/psconv.c (PS_Conv_ToFixed): Increase precision if - integer part is zero. - -2008-04-01 Werner Lemberg - - Fix compilation with g++ 4.1 (with both `single' and `multi' - targets). - - * src/base/ftobjs.c (FT_Open_Face): Don't define a variable in block - which is crossed by a `goto'. - - * src/otvalid/otvalid.h (otv_MATH_validate): Add prototype. - -2008-03-31 Werner Lemberg - - Fix support for subsetted CID-keyed CFFs. - - * include/freetype/freetype.h (FT_FACE_FLAG_CID_KEYED, - FT_IS_CID_KEYED): New macros. - - * src/cff/cffobjs.c (cff_face_init): Set number of glyphs to the - maximum CID value in CID-keyed CFFs. - Handle FT_FACE_FLAG_CID_KEYED flag. - - * docs/CHANGES: Document it. - - - Fix CFF font matrix calculation and improve precision. - - * src/cff/cffparse.c (cff_parse_real): Increase precision if integer - part is zero. - (cff_parse_font_matrix): Simplify computation of `units_per_em'; - this prevents overflow also. - - - Support FT_Get_CID_Registry_Ordering_Supplement for PS CID fonts. - - * src/cid/cidriver.c: Include FT_SERVICE_CID_H. - (cid_get_ros): New function. - (cid_service_cid_info): New service structure. - (cid_services): Register it. - -2008-03-23 Werner Lemberg - - Adjustments for Visual C++ 8.0, as reported by Rainer Deyke. - - * builds/compiler/visualc.mk (CFLAGS): Remove /W5. - (ANSIFLAGS): Add _CRT_SECURE_NO_DEPRECATE. - -2008-03-21 Laurence Darby - - * src/type1/t1objs.c (T1_Face_Init): Use `/Weight'. Patch from - Savannah bug #22675. - -2008-03-13 Derek Clegg - - * src/truetype/ttgxvar.c (TT_Get_MM_Var): Fix named style loop. - Patch from Savannah bug #22541. - -2008-03-03 Masatoshi Kimura - - * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary, - tt_cmap14_find_variant): Return correct value. - (tt_cmap14_variant_chars): Fix check for `di'. - -2008-02-29 Wermer Lemberg - - * docs/CHANGES: Updated. - -2008-02-29 Wolf - - Add build support for symbian platform. From Savannah bug #22440. - - * builds/symbian/*: New files. - -2008-02-21 suzuki toshiya - - * src/base/ftmac.c (parse_fond): Fix a bug of PostScript font name - synthesis. For any face of a specified FOND, always the name for - the first face was used. Except of a FOND that refers multiple - Type1 font files, wrong synthesized font names are not used at all, - so this is an invisible bug. A few limit checks are added too. - - * builds/mac/ftmac.c: Ditto. - -2008-02-21 suzuki toshiya - - * builds/unix/configure.raw: Split compiler option to link Carbon - frameworks to one option for CoreServices framework and another - option for ApplicationServices framework. The split options can be - managed by GNU libtool to avoid unrequired duplication when FreeType - is linked with other applications. Suggested by Daniel Macks, - Savannah bug #22366. - -2008-02-18 Victor Stinner - - * src/truetype/ttinterp.c (Ins_IUP): Check number of points. Fix - from Savannah bug #22356. - -2008-02-17 Jonathan Blow - - * src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph): - Check for valid callback pointers. - -2008-02-15 suzuki toshiya - - * src/base/ftmac.c (FT_New_Face_From_SFNT): Check the sfnt resource - handle by its value instead of ResError(), fix provided by Deron - Kazmaier. According to the Resource Manager Reference, - GetResource(), Get1Resource(), GetNamedResource(), - Get1NamedResource() and RGetResource() set noErr but return NULL - handle when they can not find the requested resource. These - functions never return undefined values, so it is sufficient to - check if the handle is not NULL. - - * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto. - -2008-02-14 suzuki toshiya - - * src/base/ftbase.c: is replaced by "ftmac.c" as other - inclusion styles. Now it always includes src/base/ftmac.c; - builds/mac/ftmac.c is never included in any configuration. - - * builds/unix/configure.raw: Print warning if configure is executed - with options to specify Carbon functionalities explicitly. - - * docs/INSTALL.MAC: Note that legacy builds/mac/ftmac.c is not - included automatically and manual replacement is required. - -2008-02-11 Werner Lemberg - - * builds/modules.mk (CLOSE_MODULE, REMOVE_MODULE), builds/detect.mk - (dos_setup), builds/freetype.mk (clean_project_dos, - distclean_project_dos): Don't use \ but $(SEP). Reported by Duncan - Murdoch. - -2008-01-18 Sylvain Pasche - - * src/base/ftlcdfil.c (_ft_lcd_filter_legacy): Updated comment to - mention intra-pixel algorithm. - - * include/freetype/freetype.h (FT_Render_Mode): Mention that - FT_Library_SetLcdFilter can be used to reduce fringes. - -2008-01-16 Werner Lemberg - - * src/raster/ftraster.c (ft_black_render): Check `outline' before - using it. Reported by Allan Yang. - -2008-01-12 Werner Lemberg - - * src/raster/ftraster.c (FT_CONFIG_OPTION_5_GRAY_LEVELS): Remove. - -2008-01-12 Allan Yang, Jian Hua - SH - - * src/raster/ftraster.c (ft_black_init) - [FT_RASTER_OPTION_ANTI_ALIASING]: Fix compilation. - -2008-01-10 Werner Lemberg - - * src/truetype/ttgload.c (load_truetype_glyph): Handle the case - where the number of contours in a simple glyph is zero (and which - does contain an entry in the `glyf' table). This fixes Savannah bug - #21990. - -2008-01-04 suzuki toshiya - - Formatting suggested by Sean McBride. - - * builds/mac/ftmac.c: Formatting (tab expanded). - * src/autofit/afindic.c: Ditto. - * src/base/ftcid.c: Ditto. - * src/base/ftmac.c: Ditto. - -2007-12-30 Werner Lemberg - - * src/smooth/ftgrays.c (gray_raster_render): Check `outline' - correctly. - -2007-12-21 suzuki toshiya - - Improvement of POSIX resource-fork accessor to load unsorted - references in a resource. In HelveLTMM (resource-fork PostScript - Type1 font bundled with Mac OS X since 10.3.x), the appearance order - of PFB chunks is not sorted; sorting the chunks by reference IDs is - required. - - * include/freetype/internal/ftrfork.h (FT_RFork_Ref): New structure - type to store a pair of reference ID and offset to the chunk. - - * src/base/ftrfork.c (ft_raccess_sort_ref_by_id): New function to - sort FT_RFork_Ref by their reference IDs. - - (FT_Raccess_Get_DataOffsets): Returns an array of offsets that is - sorted by reference ID. - -2007-12-14 Werner Lemberg - - * src/cff/cffparse.c (cff_parse_real): Don't apply `power_ten' - division too early; otherwise the most significant digit(s) of the - final result are lost as the value is truncated to an integer. This - fixes Savannah bug #21794 (where the patch has been posted too). - -2007-12-06 Fix <4d876b82@gmail.com> - - Pass options from one configure script to another as-is (not - expanded). This is needed for options like - --includedir='${prefix}/include'. - - * builds/unix/detect.mk, configure: Prevent argument expansion in - call to the (real) `configure' script. - -2007-12-06 Werner Lemberg - - * src/truetype/ttgload.c (load_truetype_glyph): Fix compilation if - TT_USE_BYTECODE_INTERPRETER isn't defined. - -2007-12-06 Werner Lemberg - - There exist CFFs which contain opcodes for the Type 1 operators - `hsbw' and `closepath' which are both invalid in Type 2 charstrings. - However, it doesn't harm to support them. - - * src/cff/cffgload.c (CFF_Operator): Add `cff_op_hsbw' and - `cff_op_closepath.' - (cff_argument_counts): Ditto. - - (cff_decoder_parse_charstrings): Handle Type 1 opcodes 9 (closepath) - and 13 (hsbw) which are invalid in Type 2 charstrings. - -2007-12-06 suzuki toshiya - - * src/base/ftrfork.c (raccess_guess_darwin_newvfs): New function to - support new pathname syntax `..namedfork/rsrc' to access a resource - fork on Mac OS X. The legacy syntax `/rsrc' does not work on - case-sensitive HFS+. - (raccess_guess_darwin_hfsplus): Fix a bug in the calculation of - buffer size to store a pathname. - * include/freetype/internal/ftrfork.h: Increment the number of - resource fork guessing rule. - -2007-12-06 suzuki toshiya - - * builds/unix/configure.raw: Improve the compile tests to search - Carbon functions. - * builds/mac/ftmac.c: Import fixes for Carbon incompatibilities - proposed by Sean McBride from src/base/ftmac.c (see 2007-11-16). - -2007-12-06 suzuki toshiya - - The documents and comments for Mac OS X are improved by Sean - McBride. - - * src/base/ftmac.c: Fix a comment. - * include/freetype/ftmac.h: Ditto. - * docs/INSTALL.MAC: Improve English and add comment on lowest - system version specified by MACOSX_DEPLOYMENT_TARGET. - -2007-12-04 Werner Lemberg - - * src/cff/cffload.c (cff_subfont_load): Don't use logical OR to - concatenate error codes. - * src/sfnt/ttsbit.c (Load_SBit_Range): Ditto. - -2007-12-04 Graham Asher - - * src/truetype/ttobjs.c (tt_face_init): Don't use logical OR to - concatenate error codes. - -2007-12-04 Sean McBride - - * src/pfr/pfrgload.c (pfr_glyph_load_compound): Remove compiler - warning. - -2007-11-20 suzuki toshiya - - Fix MacOS legacy font support by Masatake Yamato on Mac OS X. It is - not working since 2.3.5. In FT_Open_New(), if FT_New_Stream() - cannot mmap() the specified file and cannot seek to head of the - specified file, it returns NULL stream and FT_Open_New() returns the - error immediately. On MacOS, most legacy MacOS fonts fall into such - a scenario because their data forks are zero-sized and cannot be - sought. To proceed to guessing of resource fork fonts, the - functions for legacy MacOS font must properly handle the NULL stream - returned by FT_New_Stream(). - - * src/base/ftobjs.c (IsMacBinary): Return error - FT_Err_Invalid_Stream_Operation immediately when NULL stream is - passed. - (FT_Open_Face): Even when FT_New_Stream() returns an error, proceed - to fallback. Originally, legacy MacOS font is tested in the cases - of FT_Err_Invalid_Stream_Operation (occurs when data fork is empty) - or FT_Err_Unknown_File_Format (occurs when AppleSingle header or - .dfont header is combined). Now the case of - FT_Err_Cannot_Open_Stream is included. - - * src/base/ftrfork.c (FT_Raccess_Guess): When passed stream is NULL, - skip FT_Stream_Seek(), which seeks to the head of stream, and - proceed to unit testing of raccess_guess_XXX(). FT_Stream_Seek() - for a NULL stream causes a Bus error on Mac OS X. - (raccess_guess_apple_double): Return FT_Err_Cannot_Open_Stream - immediately if passed stream is NULL. - (raccess_guess_apple_single): Ditto. - -2007-11-16 suzuki toshiya - - Fix for Carbon incompatibilities since Mac OS X 10.5, - proposed by Sean McBride. - - * doc/INSTALL.MAC: Comment on MACOSX_DEPLOYMENT_TARGET. - - * include/freetype/ftmac.h: Deprecate FT_New_Face_From_FOND and - FT_GetFilePath_From_Mac_ATS_Name. Since Mac OS X 10.5, calling - Carbon functions from a forked process is classified as unsafe - by Apple. All Carbon-dependent functions should be deprecated. - - * src/base/ftmac.c: Use essential header files - and - instead of - all-in-one header file . - - Include and replace HFS_MAXPATHLEN by Apple - genuine macro PATH_MAX. - - Add fallback macro for kATSOptionFlagsUnRestrictedScope which - is not found in Mac OS X 10.0. - - Multi-character constants ('POST', 'sfnt' etc) are replaced by - 64bit constants calculated by FT_MAKE_TAG() macro. - - For the index in the segment of resource fork, new portable - type ResourceIndex is introduced for better compatibility. - This type is since Mac OS X 10.5, so it is defined as short - when built on older platforms. - - (FT_ATSFontGetFileReference): If build target is only the systems - 10.5 and newer, it calls Apple genuine ATSFontGetFileReference(). - - (FT_GetFile_From_Mac_ATS_Name): Return an error if system is 10.5 - and newer or 64bit platform, because legacy type FSSpec type is - removed completely. - - (FT_New_Face_From_FSSpec): Ditto. - -2007-11-01 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_done_face): Check `sfnt' everywhere. This - fixes Savannah bug #21485. - -2007-10-29 Daniel Svoboda - - * src/winfonts/winfnt.c (FNT_Face_Init): Check first that the driver - can handle the font at all, then check `face_index'. Otherwise, the - driver might return the wrong error code. This fixes Savannah bug - #21468. - -2007-10-21 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_load_face): Support bit 9 and prepare - support for bit 8 of the `fsSelection' field in the `OS/2' table. - MS is already using this; hopefully, this becomes part of OpenType - 1.5. - Prepare also support for `name' IDs 21 (WWS_FAMILY) and 22 - (WWS_SUBFAMILY). - -2007-10-20 Werner Lemberg - - * src/tools/docmaker/tohtml.py (html_header_2): Fix typo. - Add `td.left' element to CSS. - (toc_section_enter): Use it. - -2007-10-18 David Turner - - * include/freetype/freetype.h, src/base/ftobjs.c: Rename API - functions related to cmap type 14 support to the - `FT_Object_ActionName' scheme: - - FT_Get_Char_Variant_index -> FT_Face_GetCharVariantIndex - FT_Get_Char_Variant_IsDefault -> FT_Face_GetCharVariantIsDefault - FT_Get_Variant_Selectors -> FT_Face_GetVariantSelectors - FT_Get_Variants_Of_Char -> FT_Face_GetVariantsOfChar - FT_Get_Chars_Of_Variant -> FT_Face_GetCharsOfVariant - - Update documentation accordingly. - - * src/sfnt/ttcmap.c: Stronger cmap 14 validation. - Make the code a little more consistent with FreeType coding - conventions and modify the cmap14 functions that returned a newly - allocated array to use a persistent vector from the TT_CMap14 object - instead. - - (TT_CMap14Rec): Provide array and auxiliary data for result. - (tt_cmap14_done, tt_cmap14_ensure): New functions. - - (tt_cmap14_init, tt_cmap14_validate, tt_cmap14_char_map_def_binary, - tt_cmap14_char_map_nondef_binary, tt_cmap14_find_variant, - tt_cmap14_char_var_index, tt_cmap14_variants, - tt_cmap14_char_variants, tt_cmap14_def_char_count, - tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars, - tt_cmap14_variant_chars, tt_cmap14_class_rec): Updated and improved. - -2007-10-15 George Williams - - Add support for cmap type 14. - - * devel/ftoption.h, include/freetype/config/ftoption.h - (TT_CONFIG_CMAP_FORMAT_14): New macro. - - * include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc, - FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc, - FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New - support function prototypes. - (FT_CMap_ClassRec): Add them. - Update all users. - - * include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New - macro. - - * include/freetype/freetype.h (FT_Get_Char_Variant_Index, - FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors, - FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API - functions. - - * src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary - function. - (FT_Set_Charmap): Disallow cmaps of type 14. - (FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault, - FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char, - FT_Get_Chars_Of_Variant): New API functions. - - * src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros. - - (TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate, - tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info, - tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary, - tt_cmap14_find_variant, tt_cmap14_char_var_index, - tt_cmap14_char_var_isdefault, tt_cmap14_variants, - tt_cmap14_char_variants, tt_cmap14_def_char_count, - tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars, - tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and - structures for cmap 14 support. - (tt_cmap_classes): Register tt_cmap14_class_rec. - (tt_face_build_cmaps): One more error message. - - * docs/CHANGES: Mention cmap 14 support. - -2007-10-01 Werner Lemberg - - * src/base/ftobjs.c (find_unicode_charmap): If search for a UCS-4 - charmap fails, do the loop again while searching a UCS-2 charmap. - This favours MS charmaps over Apple ones. - -2007-08-29 suzuki toshiya - - * src/base/ftmac.c: Introduction of abstract `short' data types, - ResFileRefNum and ResID. These types were introduced for Copland, - then backported to MPW. The variables exchanged with FileManager - QuickDraw frameworks are redefined by these data types. Patch was - proposed by Sean McBride. - * builds/mac/ftmac.c: Ditto. - -2007-08-18 Werner Lemberg - - * src/otvalid/otvcmmn.c (otv_x_y_ux_sy): Skip context glyphs. Found - by Imran Yousaf. Fixes Savannah bug #20773. - - (otv_Lookup_validate): Correct handling of LookupType. Found by - Imran Yousaf. Fixes Savannah bug #20782. - -2007-08-17 George Williams - - * src/otvalid/otvgsub.c (otv_SingleSubst_validate): Fix handling of - SingleSubstFormat1. - -2007-08-11 suzuki toshiya - - * builds/unix/configure.raw: Fix a bug which sets CC_BUILD by - ${build-gcc} (unchecked) instead of by ${build}-gcc (checked). - Found by Ryan Hill. - -2007-08-11 George Williams - - * src/otvalid/otvcommn.c, src/otvalid/otvcommn.h - (otv_Coverage_validate): Add fourth argument to pass an expected - count value. Update all users. - Check glyph IDs. - (otv_ClassDef_validate): Check `StartGlyph'. - - * src/otvalid/otvgsub.c (otv_SingleSubst_validate): More glyph ID - checks. - - * src/otvalid/otvmath.c (otv_MathConstants_validate): There are only - 56 constants. - (otv_GlyphAssembly_validate, otv_MathGlyphConstruction_validate): - Check glyph IDs. - -2007-08-08 Werner Lemberg - - * src/otvalid/otvbase.c, src/otvalid/otvcommn.c, - src/otvalid/otvgdef.c, src/otvalid/otvgpos.c, src/otvalid/otvgsub.c, - src/otvalid/otvjstf.c: s/FT_INVALID_DATA/FT_INVALID_FORMAT/ where - appropriate. Reported by George. - - * include/freetype/internal/fttrace.h: Define `trace_otvmath'. - - * src/otvalid/rules.mk (OTV_DRV_SRC): Add otvmath.c. - - * docs/CHANGES: Updated. - -2007-08-08 George Williams - - Add `MATH' validating support to otvalid module. - - * include/freetype/tttags.h (TTAG_MATH): New macro. - * include/freetype/ftotval.h (FT_VALIDATE_MATH): New macro. - (FT_VALIDATE_OT): Updated. - - * src/otvalid/otmath.c: New file. - - * src/otvalid/otvalid.c: Include otvmath.c. - * src/otvalid/otvmod.c (otv_validate): Handle `MATH' table. - -2007-08-04 Werner Lemberg - - * builds/unix/configure.raw: Add call to AC_LIBTOOL_WIN32_DLL. - Fixes Savannah bug #20686. - -2007-08-03 Werner Lemberg - - * src/psnames/psmodule.c: Fix usage of - FT_CONFIG_OPTION_POSTSCRIPT_NAMES macro. Reported by Graham Asher. - -2007-07-31 suzuki toshiya - - * src/base/ftmac.c (open_face_from_buffer): The argument - `driver_name' is typed as `const char*' to match with the - callers in FT_New_Face_From_LWFN and FT_New_Face_From_SFNT. - This is same with open_face_from_buffer in src/base/ftobjs.c. - Found and fixed by Sean McBride. - -2007-07-28 Werner Lemberg - - * src/raster/ftraster.c (count_table): Make it conditional. - * src/base/ftobjs.c (FT_New_Library): Check FT_RENDER_POOL_SIZE with - a preprocessor statement. - -2007-07-27 Werner Lemberg - - * src/base/ftoutln.c (FT_Outline_Translate): Check `outline' before - first usage. From Savannah patch #6115. - -2007-07-16 Werner Lemberg - - * docs/CHANGES: Updated. - -2007-07-16 Derek Clegg - - Add new service for getting the ROS from a CID font. - - * include/freetype/config/ftheader.h (FT_CID_H): New macro. - * include/freetype/ftcid.h: New file. - - * include/freetype/internal/ftserv.h (FT_SERVIVE_CID_H): New macro. - * include/freetype/internal/services/svcid.h: New file. - - * src/base/ftcid.c: New file. - - * src/cff/cffdrivr.c: Include FT_SERVICE_CID_H. - (cff_get_ros): New function. - (cff_service_cid_info): New service structure. - (cff_services): Register it. - - * src/cff/cffload.c (cff_font_done): Free registry and ordering. - - * src/cff/cfftypes.h (CFF_FontRec): Add `registry' and `ordering'. - - * modules.cfg (BASE_EXTENSIONS): Add ftcid.c. - -2007-07-11 Derek Clegg - - Add support for postscript name service to CFF driver. - - * src/cff/cffdrivr.c: Include FT_SERVICE_POSTSCRIPT_NAME_H. - (cff_get_ps_name): New function. - (cff_service_ps_name): New service structure. - (cff_services): Register it. - -2007-07-07 Werner Lemberg - - * src/base/ftglyph.c (FT_Glyph_Copy): Fix initialization of - `target'. Reported by Sean McBride. - -2007-07-06 Werner Lemberg - - * src/pfr/pfrcmap.c: Include pfrerror.h. - - * src/autofit/afindic.c: Add some external declarations to pacify - `make multi' compilation. - - * src/cid/cidgload.c (cid_load_glyph): Pacify compiler. - - * src/cff/cffdrivr.c (cff_ps_get_font_info), src/cff/cffobjs.c - (cff_strcpy), include/freetype/internal/ftmemory.h (FT_MEM_STRDUP), - src/autofit/aflatin.c (af_latin_hints_compute_edges), - src/autofit/afcjk.c (af_cjk_hints_compute_edges), src/sfnt/ttmtx.c - (tt_face_get_metrics), src/base/ftobjs.c (open_face) - [FT_CONFIG_OPTION_INCREMENTAL]: Fix compilation with C++ compiler. - - * docs/release: Mention test compilation targets. - -2007-07-04 Werner Lemberg - - * docs/PROBLEMS: Mention that some PS based fonts can't be - handled correctly by FreeType. - - * src/truetype/ttgload.c (load_truetype_glyph): Always allow a - recursion depth of 1. This was the maximum value in TrueType 1.0, - and some older fonts don't set this field correctly. - - * src/gxvalid/gxvmort1.c - (gxv_mort_subtable_type1_substTable_validate): Fix tracing message. - -2007-07-03 Werner Lemberg - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Initialize - `round' to pacify compiler. - -2007-07-02 Werner Lemberg - - - * Version 2.3.5 released. - ========================= - - - Tag sources with `VER-2-3-5'. - - * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump - version number to 2.3.5. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualce/index.html, - builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj: s/2.3.4/2.3.5/, s/234/235/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5. - - * builds/unix/configure.raw (version_info): Set to 9:16:3. - -2007-07-01 David Turner - - * include/freetype/freetype.h, src/base/ftpatent.c - (FT_Face_SetUnpatentedHinting): New function to dynamically change - the setting after a face is created. - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Fix a small bug - that created distortions in the bytecode interpreter results. - -2007-06-30 David Turner - - * src/truetype/ttinterp.c (Ins_IUP): Add missing variable - initialization. - - * src/autofit/aflatin.c (af_latin_metric_init_blues): Get rid of an - infinite loop in the case of degenerate fonts. - -2007-06-26 Rahul Bhalerao - - Add autofit module for Indic scripts. This currently just reuses - the CJK-specific functions. - - * include/freetype/config/ftoption.h (AF_CONFIG_OPTION_INDIC): New - macro. - * devel/ftoption.h: Synchronize with - include/freetype/config/ftoption.h. - - * src/autofit/afindic.c, src/autofit/afindic.h: New files. - - * src/autofit/afglobal.c, src/autofit/aftypes.h, - src/autofit/autofit.c: Updated. - - * src/autofit/Jamfile (_sources), * src/autofit/rules.mk - (AUTOF_DRV_SRC): Updated. - -2007-06-23 David Turner - - * src/truetype/ttgload.c (TT_Load_Simple): Fix change from - 2007-06-16 that prevented the TrueType module from loading most - glyphs. - -2007-06-20 Werner Lemberg - - * src/cff/cffgload.c (cff_slot_load): Fix logic of 2007-05-28 - change. - -2007-06-19 Werner Lemberg - - * src/type1/t1load.c (parse_encoding): Handle one more error. - -2007-06-19 Dmitry Timoshkov - - * src/winfonts/winfnt.c (fnt_face_get_dll_font): Return error - FNT_Err_Invalid_File_Format if file format was recognized but - the file doesn't contain any FNT(NE) or RT_FONT(PE) resources. - Add verbose debug logs to make it easier to debug failing load - attempts. - (FNT_Face_Init): A single FNT font can't contain more than 1 face, - so return an error if requested face index is > 0. - Do not do further attempt to load fonts if a previous attempt has - failed but returned error FNT_Err_Invalid_File_Format, i.e., the - file format has been recognized but no fonts found in the file. - -2007-07-19 suzuki toshiya - - * src/base/ftmac.c: Apply patches proposed by Sean McBride. - (FT_GetFile_From_Mac_Name): Insert FT_UNUSED macros to fix - the compiler warnings against unused arguments. - (FT_ATSFontGetFileReference): Ditto. - (FT_GetFile_From_Mac_ATS_Name): Ditto. - (FT_New_Face_From_FSSpec): Ditto. - (lookup_lwfn_by_fond): Fix wrong comment. - Replace `const StringPtr' by more appropriate type - `ConstStr255Param'. - FSRefMakePathPath always returns UTF8 POSIX pathname in - Mach-O, thus HFS pathname support is dropped. - (count_faces): Remove HLock and HUnlock which is not - required on Mac OS X anymore. - (FT_New_Face_From_SFNT): Ditto. - (FT_New_Face_From_FOND): Ditto. - * builds/mac/ftmac.c: Synchronize to src/base/ftmac.c, - except of HFS pathname support and HLock/HUnlock. - They are required on classic CFM environment. - -2007-06-18 Werner Lemberg - - * src/psaux/psobjs.c (ps_parser_skip_PS_token): Remove incorrect - assertion. - (ps_parser_to_bytes): Fix error message. - - * src/type42/t42objs.c (T42_Open_Face): Handle one more error. - * src/type42/t42parse.c (t42_parse_sfnts): s/alloc/allocated/. - Don't allow mixed binary and hex strings. - Handle string_size == 0 and string_buf == 0. - (t42_parse_encoding): Handle one more error. - -2007-06-18 Werner Lemberg - - * src/psaux/psobjs.c (ps_tofixedarray, ps_tocoordarray): Fix exit - logic. - (ps_parser_load_field) : Skip delimiters - correctly. - (ps_parser_load_field_table): Use `fields->array_max' instead of - T1_MAX_TABLE_ELEMENTS to limit the number of arguments. - - * src/cff/cffgload.c (cff_decoder_prepare): Fix change from - 2007-06-06. - -2007-06-17 Werner Lemberg - - * src/tools/ftrandom.c (font_size): New global variable. - (TestFace): Use it. - (main): Handle new option `--size' to set `font_size'. - (Usage): Updated. - - * src/winfonts/winfnt.c (fnt_face_get_dll_font): Exit in case of - invalid font. - (FNT_Load_Glyph): Protect against invalid bitmap width. - -2007-06-16 David Turner - - * src/smooth/ftgrays.c (gray_find_cell, gray_set_cell, gray_hline): - Prevent integer overflows when rendering very large outlines. - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check the - well-formedness of the contours array when loading a glyph. - - * src/truetype/ttinterp.c (TT_Load_Context): Initialize `zp0', `zp1', - and `zp2'. - (Ins_IP): Check argument ranges to reject bogus operations properly. - (IUP_WorkerRec): Add `max_points' member. - (_iup_worker_interpolate): Check argument ranges. - (Ins_IUP): Ignore empty outlines. - -2007-06-16 Dmitry Timoshkov - - * src/winfonts/winfnt.h: Add necessary structures for PE resource - parsing. - (WinPE32_HeaderRec): New structure. - (WinPE32_SectionRec): New structure. - (WinPE_RsrcDirRec): New structure. - (WinPE_RsrcDirEntryRec): New structure. - (WinPE_RsrcDataEntryRec): New structure. - (FNT_FontRec): Remove unused `size_shift' field. - - * src/winfonts/winfnt.c (fnt_face_get_dll_font): Add support for - loading bitmap .fon files in PE format. - -2007-06-15 Dmitry Timoshkov - - * builds/win32/ftdebug.c: Unify debug level handling with other - platforms. - -2007-06-14 Dmitry Timoshkov - - * builds/win32/ftdebug.c (FT_Message): Send debug output to the - console as well as to the debugger. - -2007-06-14 Werner Lemberg - - * src/autofit/aflatin.c (af_latin_uniranges): Expand structure to - cover all ranges which could possibly be handled by the aflatin - module (since the default fallback for unknown ranges is now the - afcjk module). It might be necessary to fine-tune this further by - splitting off modules for Greek, Cyrillic, or other blocks. - -2007-06-11 David Turner - - * src/autofit/aflatin.c (af_latin_hints_link_segments): Fix - incorrect segment linking computation. This was the root cause of - Savannah bug #19565. - - - * src/autofit/* [FT_OPTION_AUTOFIT2]: Some very experimental changes - to improve the Latin auto-hinter. Note that the new code is - disabled by default since it is not stabilized yet. - - * src/autofit/aflatin2.c, src/autofit/aflatin2.h: New files - (disabled currently). - - * src/autofit/afhints.c: Remove dead code. - (af_axis_hints_new_edge): Add argument to handle segment directions. - (af_edge_flags_to_string): New function. - (af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Handle - option flags. - (af_glyph_hints_reload): Add argument to handle inflections. - Simplify. - (af_direction_compute): Fine tuning. - (af_glyph_hints_align_edge_points): Fix logic. - (af_glyph_hints_align_strong_points): Do linear search for small - edge counts. - (af_glyph_hints_align_weak_points): Skip any touched neighbors. - (af_iup_shift): Handle zero `delta'. - - * src/autofit/afhints.h: Updated. - (AF_SORT_SEGMENTS): New macro (disabled). - (AF_AxisHintsRec) [AF_SORT_SEGMENTS]: New member `mid_segments'. - - * src/autofit/afglobal.c (af_face_globals_get_metrics): Add - argument to pass option flags for handling scripts. - * src/autofit/afglobal.h: Updated. - - * src/autofit/afcjk.c: Updated. - * src/autofit/aflatin.c: Updated. - (af_latin_metrics_scale_dim): Don't reduce scale by 2%. - - (af_latin_hints_compute_segments) [AF_HINT_METRICS]: Remove dead code. - (af_latin_hints_compute_edges) [AF_HINT_METRICS]: Remove dead code. - Don't set `edge->dir' - (af_latin_hint_edges): Add more logging. - - * src/autofit/afloader.c: Updated. - -2007-06-11 Werner Lemberg - - * docs/CHANGES: Document FT_Face_CheckTrueTypePatents. - -2007-06-10 David Turner - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Slight speed-up to - the TrueType glyph loader. - - * include/freetype/config/ftoption.h: Clarify documentation - regarding unpatented hinting. - - - Add new `FT_Face_CheckTrueTypePatents' API. - - * include/freetype/freetype.h (FT_Face_CheckTrueTypePatents): New - declaration. - - * include/freetype/internal/services/svttglyf.h, - src/base/ftpatent.c: New files. - - * include/freetype/internal/ftserv.h (FT_SERVICE_TRUETYPE_GLYF_H): - New macro. - - * src/truetype/ttdriver.c: Include FT_SERVICE_TRUETYPE_GLYF_H and - `ttpload.h'. - (tt_service_truetype_glyf): New service structure. - (tt_services): Register it. - - * modules.cfg (BASE_EXTENSIONS), src/base/Jamfile (_sources): Add - `ftpatent.c'. - -2007-06-08 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_load_face): Undo change from 2007-04-28. - Fonts without a cmap must be handled correctly by FreeType (anything - else would be a bug). - - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings) - [FT_DEBUG_LEVEL_TRACE]: Improve tracing message. - -2007-06-07 Werner Lemberg - - * src/sfnt/ttsbit0.c (tt_sbit_decoder_init, - tt_sbit_decoder_load_image): Protect against integer overflows. - - - * src/pfr/pfrgload.c (pfr_glyph_load_simple): More bounding checks - for `x_control' and `y_control'. - -2007-06-06 Werner Lemberg - - * src/base/ftoutln.c (FT_Outline_Decompose): Check `last'. - - - * src/pfr/pfrcmap.c (pfr_cmap_init): Convert assertion into normal - FreeType error. - - - * src/winfonts/winfnt.c (fnt_face_get_dll_font): Do a rough check of - `font_count'. - - - * src/type1/t1load.c (parse_font_matrix): Check `temp_scale'. - - - * src/cff/cffgload.c (cff_decoder_prepare): Change return type to - `FT_Error'. - Check `fd_index'. - (cff_slot_load): Updated. - * src/cff/cffgload.h: Updated. - -2007-06-05 Werner Lemberg - - * src/pfr/pfrgload.c (pfr_glyph_done): Comment out unused code. - (pfr_glyph_load_simple): Convert assertion into normal FreeType - error. - Check `idx'. - (pfr_glyph_load_compound, pfr_glyph_curve_to, pfr_glyph_line_to): - Convert assertion into normal FreeType error. - - * src/pfr/pfrtypes.h (PFR_GlyphRec): Comment out unused code. - - - * src/winfonts/winfnt.c (FNT_Face_Init): Check `family_size'. - - - * src/psaux/psobjs.c (ps_tocoordarray, ps_tofixedarray): Return -1 - in case of parsing error. - (ps_parser_load_field): Updated. - - * src/type1/t1load.c (parse_font_matrix): Updated. - -2007-06-04 Werner Lemberg - - * src/cid/cidgload.c (cid_load_glyph): Check `fd_select'. - - * src/tools/ftrandom/Makefile: Depend on `libfreetype.a'. - -2007-06-03 Werner Lemberg - - * src/tools/ftrandom/*: Add the `ftrandom' test program written by - George Williams (with some modifications). - -2007-06-03 Werner Lemberg - - * src/base/ftobjs.c (destroy_charmaps), src/type1/t1objs.c - (T1_Face_Done), src/winfonts/winfnt.c (FNT_Face_Done): Check for - face == NULL. Suggested by Graham Asher. - -2007-06-03 Ismail Dönmez - - * src/base/ftobjs.c (FT_Request_Metrics): Fix compiler warning. - -2007-06-02 Werner Lemberg - - * include/freetype/fterrdef.h (FT_Err_Corrupted_Font_Header, - FT_Err_Corrupted_Font_Glyphs): New error codes for BDF files. - - * src/bdf/bdflib.c (bdf_load_font): Use them. - - * src/bdf/bdflib.c (_bdf_parse_start): Check `FONT' better. - -2007-06-01 Werner Lemberg - - * src/base/ftobjs.c (FT_Request_Metrics), src/cache/ftccmap.c - (FTC_CMapCache_Lookup): Remove unused code. - -2007-06-01 Sean McBride - - * src/truetype/ttinterp.c (Null_Vector, NULL_Vector): Removed, - unused. - -2007-06-01 Werner Lemberg - - * src/cid/cidparse.c (cid_parser_new): Don't continue second search - pass for `StartData' if an error has occurred. - Exit properly if no `StartData' has been seen at all. - - * builds/unix/ftsystem.c (FT_Stream_Open): Don't use ULONG_MAX but - LONG_MAX to avoid compiler warning. Suggested by Sean McBride. - -2007-05-30 Werner Lemberg - - * src/type1/t1load.c (parse_subrs, parse_charstrings): Protect - against too small binary data strings. - - * src/bdf/bdflib.c (_bdf_parse_glyphs): Check `STARTCHAR' better. - -2007-05-28 David Turner - - * src/cff/cffgload.c (cff_slot_load): Do not apply the identity - transformation. This significantly reduces the loading time of CFF - glyphs. - - * docs/CHANGES: Updated. - - * src/autofit/afglobal.c (AF_SCRIPT_LIST_DEFAULT): Change default - hinting script to CJK, since it works well with more scripts than - latin. Thanks to Rahul Bhalerao for pointing - this out! - -2007-05-25 Werner Lemberg - - * docs/CHANGES: Updated. - -2007-05-24 Werner Lemberg - - * src/truetype/ttobjs.h (tt_size_ready_bytecode): Move declaration - into TT_USE_BYTECODE_INTERPRETER preprocessor block. - -2007-05-24 Graham Asher - - * src/truetype/ttobjs.c (tt_size_ready_bytecode) - [!TT_USE_BYTECODE_INTERPRETER]: Removed. Unused. - -2007-05-22 David Turner - - * src/truetype/ttgload.c (load_truetype_glyph): Fix last change to - avoid crashes in case the bytecode interpreter is not used. - - - Avoid heap blowup with very large .Z font files. This fixes - Savannah bug #19910. - - * src/lzw/ftzopen.h (FT_LzwStateRec): Remove `in_cursor', - `in_limit', `pad', `pad_bits', and `in_buff' members. - Add `buf_tab', `buf_offset', `buf_size', `buf_clear', and - `buf_total' members. - - * src/lzw/ftzopen.c (ft_lzwstate_get_code): Rewritten. It now takes - only one argument. - (ft_lzwstate_refill, ft_lzwstate_reset, ft_lzwstate_io): Updated. - -2007-05-20 Ismail Dönmez - - * src/pshinter/pshrec.c (ps_mask_table_set_bits): Add `const'. - (ps_dimension_set_mask_bits): Remove `const'. - -2007-05-19 Werner Lemberg - - * src/sfnt/ttmtx.c (tt_face_get_metrics) - [!FT_CONFIG_OPTION_OLD_INTERNALS]: Another type-punning fix. - -2007-05-19 Derek Clegg - - Savannah patch #5929. - - * include/freetype/tttables.h, src/base/ftobjcs.c - (FT_Get_CMap_Format): New function. - - * include/freetype/internal/services/svttcmap.c (TT_CMapInfo): Add - `format' member. - * src/sfnt/ttcmap.c (tt_cmap{0,2,4,6,8,10,12}_get_info): Set - cmap_info->format. - -2007-05-19 Werner Lemberg - - * src/truetype/ttgload.c (load_truetype_glyph): Save graphics state - before handling subglyphs so that it can be reinitialized each time. - This fixes Savannah bug #19859. - -2007-05-16 Werner Lemberg - - * src/cache/ftccache.c (ftc_node_mru_link, ftc_node_mru_unlink), - src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP), src/cache/ftcglyph.h - (FTC_GCACHE_LOOKUP_CMP), src/pshinter/pshmod.c (ps_hinter_init), - src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_load_hhea, - tt_face_get_metrics): Fix type-punning issues. - -2007-05-15 David Turner - - * include/freetype/config/ftstdlib.h, - include/freetype/internal/ftobjs.h: As suggested by Graham Asher, - ensure that ft_isalnum, ft_isdigit, etc., use hard-coded values - instead on relying on the locale-dependent functions provided by - . - -2007-05-15 Graham Asher - - * src/autofit/afcjk.c (af_cjk_hints_compute_edges): Remove unused - variable. - * src/autofit/afloader.c (af_loader_load_g): Ditto. - - * src/base/ftobjs.c (ft_validator_error): Use `ft_jmp_buf'. - (open_face_from_buffer): Initialize `stream'. - (FT_Request_Metrics): Remove unused variable. - Remove redundant `break' statements. - (FT_Get_Track_Kerning): Remove unused variable. - - * src/psaux/afmparse.c (afm_parse_track_kern, afm_parse_kern_pairs, - afm_parse_kern_data): Remove redundant - `break' statements. - (afm_parser_parse): Ditto. - Don't use uninitialized variables. - - * src/psnames/psmodule.c (VARIANT_BIT): Define as unsigned long. - Use `|' operator instead of `^' to set it. - Update all users. - - * src/sfnt/ttcmap.c (tt_face_build_cmaps): Use `ft_jmp_buf'. - * src/sfnt/ttkern.c (tt_face_load_kern): Remove unused variable. - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Remove redundant - comparison. - (TT_Process_Simple_Glyph): Use FT_UInt for `n_points' and `i'. - (TT_Load_Glyph): Remove unused variable. - -2007-05-13 Derek Clegg - - * src/base/ftobjs.c (FT_New_Library): Only allocate rendering pool - if FT_RENDER_POOL_SIZE is > 0. From Savannah patch #5928. - -2007-05-11 David Turner - - * src/cache/ftbasic.c, include/freetype/ftcache.h - (FTC_ImageCache_LookupScaler, FTC_SBit_Cache_LookupScaler): Two new - functions that allow us to look up glyphs using an FTC_Scaler object - to specify the size, making it possible to use fractional pixel - sizes. - - * src/truetype/ttobjs.c (tt_size_ready_bytecode): Set - `size->cvt_ready'. Reported by Boris Letocha. - -2007-05-09 Graham Asher - - * src/truetype/ttinterp.c (Ins_IP), src/autofit/aflatin.c - (af_latin_metrics_scale_dim): Fix compiler warnings. - -2007-05-06 Werner Lemberg - - * builds/win32/visualce/freetype.sln: Removed, as requested by - Vincent. - -2007-05-04 Vincent RICHOMME - - * builds/win32/visualce/*: Add Visual C++ project files for Pocket - PC targets. - - * docs/CHANGES: Document them. - -2007-05-04 - - * builds/unix/ftsystem.c (FT_Stream_Open): Handle return value 0 of - mmap (which might happen on some RTOS). From Savannah patch #5909. - -2007-05-03 Werner Lemberg - - * src/base/ftobjs.c (FT_Set_Char_Size): Simplify code. - * include/freetype/freetype.h (FT_Set_Char_Size): Update - documentation. - -2007-04-28 Victor Stinner - - * src/sfnt/sfobjs.c (sfnt_load_face): Check error code after loading - `cmap'. - -2007-04-27 Werner Lemberg - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check for negative - number of points in contours. Problem reported by Victor Stinner - . - (TT_Process_Simple_Glyph): Synchronize variable types. - -2007-04-26 Werner Lemberg - - * src/base/ftglyph.c (FT_Glyph_Copy): Always set second argument to - zero in case of error. This fixes Savannah bug #19689. - -2007-04-25 Boris Letocha - - * src/truetype/ttobjs.c: Fix a typo that created a speed regression - in the TrueType bytecode loader. - -2007-04-10 Martin Horak - - * src/sfnt/sfobjs.c (sfnt_load_face) [FT_CONFIG_OPTION_INCREMENTAL]: - Ignore `hhea' table. This fixes Savannah bug #19261. - -2007-04-09 Werner Lemberg - - - * Version 2.3.4 released. - ========================= - - - Tag sources with `VER-2-3-4'. - - * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump - version number to 2.3.4. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj: s/2.3.3/2.3.4/, s/233/234/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4. - - * builds/unix/configure.raw (version_info): Set to 9:15:3. - -2007-04-09 Martin Horak - - * src/truetype/ttgload.c (load_truetype_glyph): Save and restore - memory stream to avoid a crash with the incremental memory - interface (Savannah bug #19260). - -2007-04-06 David Turner - - * src/base/ftbimap.c (ft_bitmap_assure_buffer): Fix buffer-overwrite bug - (Savannah bug #19536). - -2007-04-04 Werner Lemberg - - - * Version 2.3.3 released. - ========================= - - - Tag sources with `VER-2-3-3'. - - * docs/CHANGES: Mention CVE-2007-1351. - -2007-04-03 David Turner - - * src/base/ftobjs.c (FT_Set_Char_Size): As suggested by James Cloos, - if one of the resolution values is 0, treat it as if it were the - same as the other value. - -2007-04-02 David Turner - - Add special code to detect `extra-light' fonts and do not snap their - stem widths too much to avoid bizarre hinting effects. - - * src/autofit/aflatin.h (AF_LatinAxisRec): Add `standard_width' and - `extra_light' members. - - * src/autofit/aflatin.c (af_latin_metrics_init_widths): Initialize - them. - (af_latin_metrics_scale_dim): Set `extra_light'. - (af_latin_compute_stem_width): Use `extra_light'. - -2007-03-28 David Turner - - * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix zero-ing of the - padding. - -2007-03-28 Werner Lemberg - - * src/bdf/bdflib.c (setsbit, sbitset): Handle values >= 128 - gracefully. - (_bdf_set_default_spacing): Increase `name' buffer size to 256 and - issue an error for longer names. This fixes CVE-2007-1351. - (_bdf_parse_glyphs): Limit allowed number of glyphs in font to the - number of code points in Unicode. - - * builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, README: s/2.3.2/2.3.3/, - s/232/233/. - - * docs/CHANGES: Mention ftdiff. - -2007-03-26 David Turner - - * src/truetype/ttinterp.c [FIX_BYTECODE]: Remove it and - corresponding code. - (Ins_MD): Last regression fix. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Fix blues - computations in order to ignore single-point contours. These are - never rasterized and correspond in certain fonts to mark-attach - points that are very far from the glyph's real outline, ruining the - computation. - - * src/autofit/afloader.c (af_loader_load_g): In the case of - monospaced fonts, always set `rsb_delta' and `lsb_delta' to 0. - Otherwise code that uses them will most certainly ruin the fixed - advance property. - - * docs/CHANGES, docs/VERSION.DLL, README, Jamfile (RefDoc): Update - documentation and bump version number to 2.3.3. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3. - - * builds/unix/configure.raw (version_info): Set to 9:14:3. - -2007-03-26 suzuki toshiya - - * builds/unix/ftconfig.in: Disable Carbon framework dependency on - 64bit ABI on Mac OS X 10.4.x (ppc & i386). Found by Sean McBride. - * builds/vms/ftconfig.h: Ditto. - * include/freetype/config/ftconfig.h: Ditto. - -2007-03-22 suzuki toshiya - - * builds/unix/ftsystem.c (FT_Stream_Open): Temporary fix to prevent - 32bit unsigned long overflow by 64bit filesize on LP64 platform, as - proposed by Sean McBride: - http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html - -2007-03-22 suzuki toshiya - - * builds/unix/ftconfig.in: Suppress SGI compiler's warning against - setjmp, proposed by Sean McBride: - http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html - -2007-03-19 suzuki toshiya - - * builds/unix/configure.raw: Dequote `OS_INLINE' in comment of - conftest.c, to avoid unexpected shell evaluation. Possibly it is a - bug or undocumented behaviour of autoconf. - -2007-03-18 David Turner - - * src/truetype/ttinterp.c (Ins_MDRP): Another bytecode regression - fix; testing still needed. - - * src/truetype/ttinterp.c (Ins_MD): Another bytecode regression fix. - -2007-03-17 David Turner - - * src/truetype/ttinterp.c (Ins_IP): Fix wrong handling of the - (undocumented) twilight zone special case. - -2007-03-09 Werner Lemberg - - - * Version 2.3.2 released. - ========================= - - - Tag sources with `VER-2-3-2'. - - * builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, README: s/2.3.1/2.3.2/, - s/231/232/. - -2007-03-08 David Turner - - * docs/CHANGES, docs/VERSION.DLL: Updated for upcoming release. - - * builds/unix/configure.raw (version_info): Set to 9:13:3. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 2. - - * README, Jamfile (RefDoc): s/2.3.1/2.3.2/. - - * src/base/ftutil.c (ft_mem_strcpyn): Fix a bug that prevented the - function to work properly, over-writing user-provided buffers in - some cases. Reported by James Cloos . - - -2007-03-05 Werner Lemberg - - * include/freetype/config/ftstdlib.h (ft_strstr): New wrapper - macro for `strstr'. - - * src/truetype/ttobjs.c (tt_face_init): Use ft_strstr for scanning - `trick_names', as suggested by Ivan Nincic. - -2007-03-05 David Turner - - * src/base/ftinit.c (FT_Init_FreeType): Fix a small memory leak in - case FT_Init_FreeType fails for some reason. Problem reported by - Maximilian Schwerin . - - * src/truetype/ttobs.c (tt_size_init_bytecode): Clear the `x_ppem' - and `y_ppem' fields of the `TT_Size.metrics' structure, not those of - `TT_Size.root.metrics'. Problem reported by Daniel Glöckner - . - - * src/type1/t1afm.c (T1_Read_PFM): Read kerning values as 16-bit - signed values, not unsigned ones. Problem reported by Johannes - Walther . - -2007-02-21 David Turner - - * src/pshinter/pshalgo.c (psh_hint_align): Fix a bug in the hinting - of small and ghost stems in the Postscript interpreter. - -2007-02-20 suzuki toshiya - - * src/base/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Fix memory - leak, patch by "Jjgod Jiang" . - * builds/mac/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Ditto. - -2007-02-16 Werner Lemberg - - * src/truetype/ttinterp.c (Ins_MD): Remove unused variable. - * src/autofit/aflatin.c (af_latin_hints_link_segments): Ditto. - -2007-02-14 David Turner - - It seems that the following changes fix most of the known - interpreter problems with my fonts, but more testing is needed, - though. - - * src/truetype/ttinterp.c (FIX_BYTECODE): Activate. - (TT_MulFix14): Rewrite. - (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Improved and updated. - (Ins_MIRP): Ditto. - -2007-02-12 Werner Lemberg - - * src/truetype/ttinterp.c (Project_x, Project_y): Remove compiler - warnings. - - * src/pcf/pcfread.c (pcf_interpret_style), src/bdf/bdfdrivr.c - (bdf_interpret_style): Ditto. - -2007-02-12 David Turner - - Simplify projection and dual-projection code interface. - - * src/truetype/ttinterp.h (TT_Project_Func): Use `FT_Pos', not - FT_Vector' as argument type. - * src/truetype/ttinterp.c (CUR_Func_project, CUR_Func_dualproj): - Updated. - (CUR_fast_project, CUR_fast_dualproj): New macros. - (Project, Dual_Project, Project_x, Project_y): Updated. - (Ins_GC, Ins_SCFS, Ins_MDAP, Ins_MIAP, Ins_IP): Use new `fast' - macros. - - - * src/autofit/afloader.c (af_loader_load_g): Improve spacing - adjustments for the non-light auto-hinted modes. Gets rid of - `inter-letter spacing is too wide' problems. - - * src/autofit/aflatin.c (af_latin_hints_link_segments, - af_latin_hints_compute_edges): Slight optimization of the segment - linker and better handling of serif segments to get rid of broken - `9' in Arial at 9pt (96dpi). - - - Introduce new string functions and the corresponding macros to get - rid of various uses of strcpy and other `evil' functions, as well as - to simplify a few things. - - * include/freetype/internal/ftmemory.h (ft_mem_strdup, ft_mem_dup, - ft_mem_strcpyn): New declarations. - (FT_MEM_STRDUP, FT_STRDUP, FT_MEM_DUP, FT_DUP, FT_STRCPYN): New - macros. - * src/base/ftutil.c (ft_mem_dup, ft_mem_strdup, ft_mem_strcpyn): New - functions. - - * src/bfd/bfddrivr.c (bdf_interpret_style, BDF_Face_Init), - src/bdf/bdflib.c (_bdf_add_property), src/pcf/pcfread.c - (pcf_get_properties, pcf_interpret_style, pcf_load_font), - src/cff/cffdrivr.c (cff_get_glyph_name), src/cff/cffload.c - (cff_index_get_sid_string), src/cff/cffobjs.c (cff_strcpy), - src/sfnt/sfdriver.c (sfnt_get_glyph_name), src/type1/t1driver.c - (t1_get_glyph_name), src/type42/t42drivr.c (t42_get_glyph_name, - t42_get_name_index): Use new functions and simplify code. - - * builds/mac/ftmac.c (FT_FSPathMakeSpec): Don't use FT_MIN. - -2007-02-11 Werner Lemberg - - * src/autofit/afloader.c (af_loader_load_g): Don't change width for - non-spacing glyphs. - -2007-02-07 Tom Parker - - * src/cff/cffdrivr.c (cff_get_name_index): Protect against NULL - pointer. - -2007-02-05 suzuki toshiya - - * include/freetype/ftmac.h (FT_DEPRECATED_ATTRIBUTE): - Introduce __attribute((deprecated))__ to warn functions - which use non-ANSI data types in its interfaces. - (FT_GetFile_From_Mac_Name): Deprecated, using FSSpec. - (FT_GetFile_From_Mac_ATS_Name): Deprecated, using FSSpec. - (FT_New_Face_From_FSSpec): Deprecated, using FSSpec. - (FT_New_Face_From_FSRef): Deprecated, using FSRef. - - * src/base/ftmac.c: Predefine FT_DEPRECATED_ATTRIBUTE as void - to avoid warning in building FreeType. - * builds/mac/ftmac.c: Ditto. - -2007-02-05 suzuki toshiya - - * src/base/ftbase.c: Fix to use builds/mac/ftmac.c, if configured - `--with-fsspec' etc. Replace #include "ftmac.c" with - #include . - -2007-02-05 suzuki toshiya - - * include/freetype/ftmac.h (FT_GetFilePath_From_Mac_ATS_Name): - Introduced as replacement of FT_GetFile_From_Mac_ATS_Name. - * src/base/ftmac.c (FT_GetFilePath_From_Mac_ATS_Name): Ditto. - (FT_GetFile_From_Mac_ATS_Name): Rewritten as wrapper of - FT_GetFilePath_From_Mac_ATS_Name. - * builds/mac/ftmac.c: Ditto. - -2007-02-05 suzuki toshiya - - * include/freetype/ftmac.h: Fixed wrong comment: FSSpec of - FT_GetFile_From_Mac_Name, FT_GetFile_From_Mac_ATS_Name are - for passing to FT_New_Face_From_FSSpec. - -2007-02-05 suzuki toshiya - - * builds/unix/configure.raw: Check whether Mac OS X system headers - can be built under ANSI C mode. - - * src/base/ftmac.c (OS_INLINE): Redefine OS_INLINE by a version - compatible to ANSI C in case system headers are ANSI C incompatible. - * builds/mac/ftmac.c (OS_INLINE): Ditto. - -2007-02-01 Werner Lemberg - - * include/freetype/ttnameid.h (TT_MS_LANGID_DZONGHKA_BHUTAN): - Explain why applications shouldn't use it. Found by Alexei. - -2007-02-01 Alexei Podtelezhnikov - - * builds/unix/freetype2.m4 (AC_CHECK_FT2): Fix spelling of warning - message. - - * src/gxvalid/gxvmort1.c - (gxv_mort_subtable_type1_substTable_validate): Fix debugging - message. - -2007-01-31 Werner Lemberg - - - * Version 2.3.1 released. - ========================= - - - Tag sources with `VER-2-3-1-FINAL'. - - * builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj: s/230/231/. - * builds/win32/visualc/index.html: s/221/231/. - - * vms_make.com: Add `ftgasp'. - -2007-01-30 David Turner - - Tag sources with VER-2-3-1 to prepare release. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1. - - * docs/VERSION.DLL, docs/release, README, Jamfile (RefDoc): - s/2.3.0/2.3.1/. - - * builds/unix/configure.raw (version_info): Set to 9:12:3. - - - * src/autofit/aftypes.h (AF_USE_WARPER), src/autofit/afloader.c - (af_loader_load_g): Disable the warper (i.e., the light hinting - improvements) to make a 2.3.1 bugfix release before introducing a - new feature. This should give us more time to tune and improve the - warper for the next release. - - * docs/CHANGES: Update accordingly. - -2007-01-25 David Turner - - For light auto-hinting, improve glyph advance widths and resurrect - normal/full hinting to its normal quality. - - * src/autofit/afhints.h (AF_GlyphHintsRec): New members `xmin_delta' - and `xmax_delta'. - * src/autofit/afhints.c (af_glyph_hints_reload): Reset `xmin_delta' - and `xmax_delta'. - - * src/autofit/afloader.c (af_loader_load_g) : Replace - preprocessor conditional with if-clause, handling both light and - normal mode. - - * src/autofit/afwarp.c (AF_WarpScore): Fine-tune again. - (af_warper_compute): Handle `xmin_delta' and `xmax_delta'. - -2007-01-25 Werner Lemberg - - * docs/release: Updated -- Savannah uses a new uploading scheme. - -2007-01-25 David Turner - - * src/cff/cffload.c (cff_index_get_pointers): Improve previous fix. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - : Fix sanity check for empty - functions. - - * docs/CHANGES: Document light auto-hinting improvement. - -2007-01-25 Werner Lemberg - - * src/cff/cffload.c (cff_index_get_pointers): Handle last entry - correctly in a sanity check. Since this function is only used to - load local and global functions, any charstring that called the last - local/global function would fail otherwise. This fixes Savannah bug - #18867. - - * docs/CHANGES: Document it. - -2007-01-23 David Turner - - * src/truetype/ttobjs.c (tt_size_ready_bytecode): Fix typo that - prevented compilation when disabling both the unpatented and the - bytecode interpreter in the TrueType font driver. - - - Fix and enable the warper to improve `light' hinting mode. This is - not necessarily a final version, but it seems to work well. - - * src/autofit/aflatin.c (af_latin_hints_init) [AF_USE_WARPER]: - Disable code. - (af_latin_hints_apply) [AF_USE_WARPER]: Handle FT_RENDER_MODE_LIGHT. - * src/autofit/aftypes.h: Activate AF_USE_WARPER. - - * src/autofit/afwarp.c (AF_WarpScore): Tune table. - (af_warper_compute_line_best): Fix array size of `scores'. - (af_warper_compute): Better handling of border cases. - * src/autofit/afwarp.h (AF_WarperRec): Remove unused members `X1' - and `X2'. - -2007-01-21 Werner Lemberg - - * ChangeLog: Split off older entries into... - * ChangeLog.22: This new file. - -2007-01-21 Werner Lemberg - - * docs/CHANGES: Document SHZ fix. - -2007-01-21 George Williams - - * src/truetype/ttinterp.c (Ins_SHZ): SHZ doesn't move phantom - points. - -2007-01-21 Werner Lemberg - - * src/sfnt/ttmtx.c (tt_face_get_metrics) - [!FT_CONFIG_OPTION_OLD_INTERNALS]: Fix limit check. - -2007-01-17 Werner Lemberg - - - * Version 2.3.0 released. - ========================= - - - Tag sources with `VER-2-3-0-FINAL'. - -2007-01-17 Werner Lemberg - - * docs/release: Updated. - -2007-01-16 David Turner - - * src/autofit/aflatin.c (af_latin_hints_compute_segments), - src/cff/cffdriver.c (cff_ps_get_font_info), src/truetype/ttobjs.c - (tt_face_init), src/truetype/ttinterp.c (Ins_SHC): Fix compiler - warnings. - -2007-01-15 Detlef Würkner - - * builds/amiga/makefile, builds/amiga/makefile.os4, - builds/amiga/smakefile: Add `ftgasp.c' and `ftlcdfil.c'. - - * builds/amiga/include/freetype/config/ftconfig.h: Synchronize. - -2007-01-14 Detlef Würkner - - Fix various compiler warnings. - - * src/truetype/ttdriver.c (tt_size_select), src/cff/cffobjs.h, - src/cff/cffobjs.c (cff_size_request), src/type42/t42objs.h: - s/index/strike_index/. - * src/base/ftobjs.c (FT_Match_Size): s/index/size_index/. - - * src/gxvalid/gxvmorx5.c - (gxv_morx_subtable_type5_InsertList_validate): s/index/table_index/. - - * src/truetype/ttinterp.c (Compute_Point_Displacement), - src/pcf/pcfread.c (pcf_seek_to_table_type): Avoid possibly - uninitialized variables. - -2007-01-13 suzuki toshiya - - * docs/CHANGES, docs/INSTALL.MAC: Improvements. - -2007-01-13 Werner Lemberg - - * src/type1/t1afm.c (T1_Read_Metrics): MS Windows allows PFM - versions up to 0x3FF without complaining. - -2007-01-13 Derek Clegg - - Add FT_Get_PS_Font_Info interface to CFF driver. - - * src/cff/cfftypes.h: Include FT_TYPE1_TABLES_H. - (CFF_FontRec): Add `font_info' field. - - * src/cff/cffload.c: Include FT_TYPE1_TABLES_H. - (cff_font_done): Free font->font_info if necessary. - - * src/cff/cffdrvr.c (cff_ps_get_font_info): New function. - (cff_service_ps_info): Register cff_ps_get_font_info. - -2007-01-13 Werner Lemberg - - * src/base/ftoutln.c (FT_Outline_Get_Orientation): Fix compilation - with C++ compiler. - - * src/autofit/afhints.c (af_glyph_hints_dump_segments, - af_glyph_hints_dump_edges): Ditto. - - * src/base/rules.mk (BASE_SRC): Remove ftgasp.c (it's already in - `modules.cfg'). - - * src/sfnt/ttsbit0.h: Remove. - - * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c. - -2007-01-12 David Turner - - * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix memory stomping - bug in the bitmap emboldener if the pitch of the source bitmap is - much larger than its width. - - * src/truetype/ttinterp.c (Update_Max): Fix aliasing-related - compilation warning. - -2007-01-12 Werner Lemberg - - * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from - `automake' CVS module from sources.redhat.com. - -2007-01-11 Werner Lemberg - - * src/type1/t1load.c (is_space): Removed. - (parse_encoding, parse_charstrings): Use IS_PS_DELIM. - (parse_charstrings): Use IS_PS_TOKEN. - - - * autogen.sh: Avoid bash specific syntax. - -2007-01-11 David Turner - - * docs/CHANGES: Small update. - - * builds/unix/configure.raw (version_info): Set to 9:11:3. - - * src/base/ftobjs.c (IsMacResource): Fix a small bug that caused a - crash with some Mac OS X .dfont files. Submitted by Masatake - Yamato. - - * autogen.sh: Small fix to get it working on Mac OS X properly: - The issue is that GNU libtool is called `glibtool' on this platform, - and we must call `glibtoolize', since `libtoolize' doesn't exist. - -2007-01-10 David Turner - - * all-sources: Tag all sources with VER-2-3-0-RC1 and - VER-2-3-0. - - * Jamfile (RefDoc), README, builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, docs/VERSION.DLL: Update - version number to 2.3.0. - - * include/freetype/freetype.h (FREETYPE_MINOR): Set to 3. - (FREETYPE_PATCH): Set to 0. - - * include/freetype/ftchapters.h, include/freetype/ftgasp.h, - include/freetype/ftlcdfil.h: Update reference documentation with - GASP support and LCD filtering sections. - - * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix a typo - which created an endless loop with some malformed font files. - -2007-01-10 Derek Clegg - - * src/type1/t1load.c (T1_Get_MM_Var): Always return fixed-point - values. - -2007-01-08 David Turner - - * docs/CHANGES: Updated. - - * include/freetype/ftgasp.h, src/base/ftgasp.c: New files which add - a new API `FT_Get_Gasp' to return entries of the `gasp' table - corresponding to a given character pixel size. - - * src/sfnt/ttload.c (tt_face_load_gasp): Add version check for the - `gasp' table, in order to avoid potential problems with later - versions. - - * include/freetype/config/ftheader.h (FT_GASP_H): New macro for - . - - * src/base/rules.mk (BASE_SRC), src/base/Jamfile (_sources), - modules.cfg (BASE_EXTENSIONS), builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj: Add src/base/ftgasp.c to the - default build. - -2007-01-07 Werner Lemberg - - * src/cid/cidparse.c (cid_parser_new): Improve error message for - Type 11 fonts. - Scan for `/sfnts' token. - -2007-01-07 Werner Lemberg - - * src/cid/cidparse.c (cid_parser_new): Reject Type 11 fonts. - -2007-01-06 Werner Lemberg - - * src/cff/cffload.c (cff_index_init): Remove unused variable. - (cff_index_read_offset): s/perror/errorp/ to avoid global shadowing. - -2007-01-04 David Turner - - * src/pfr/pfrobjs.c (pfr_face_init): Detect non-scalable fonts - correctly. This fixes Savannah bug #17876. - - - Do not allocate interpreter-specific tables in memory if we are not - going to load glyphs with the bytecode interpreter anyway. - - * src/truetype/ttgload.c (tt_loader_init): Load execution context - only if glyph is hinted. - Updated. - * src/truetype/ttobjs.h (TT_SizeRec): Add members `bytecode_ready' - and `cvs_ready'. - Add `tt_size_ready_bytecode' declaration. - * src/truetype/ttobjs.c (tt_size_done_bytecode, - tt_size_init_bytecode, tt_size_ready_bytecode): New functions. - (tt_size_init): Move most code into `tt_size_init_bytecode'. - (tt_size_done): Move most code into `tt_size_done_bytecode'. - (tt_size_reset): Move some code to `tt_size_ready_bytecode'. - - - Don't extract the metrics table from the SFNT font file. Instead, - reparse it on each glyph load. The runtime difference is not - noticeable, and it can save a lot of heap memory when memory-mapped - files are not used. - - * include/freetype/internal/tttypes.h (TT_FaceRec): Add members - `horz_metrics_offset' and `vert_metrics_ofset'. - * src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): - Updated. - - - * src/sfnt/ttcmap.c (tt_cmap4_validate): Slight optimization. - - - Do not load the CFF index offsets into memory, since this wastes a - *lot* of heap memory with large Asian CFF fonts. There is no - significant performance loss. - - * src/cff/cffload.h: Add `cff_charset_cid_to_gindex' declaration. - * src/cff/cfftypes.h (CFF_IndexRec): Add fields `start' and - `data_size'. - (CFF_CharsetRec): Add field `num_glyphs'. - - * src/cff/cffload.c (cff_index_read_offset, cff_index_load_offsets, - cff_charset_cid_to_gindex): New functions. - (cff_new_index): Renamed to... - (cff_index_init): This. Update all callers. - Updated -- some code has been moved to `cff_index_load_offsets'. - (cff_done_index): Renamed to... - (cff_index_done): This. Update all callers. - (cff_index_get_pointers, cff_index_access_element): Updated to use - stream offsets. - (cff_charset_compute_cids): Set `num_glyphs' field. - (cff_encoding_load): Updated. - - * src/cff/cffgload.c (cff_slot_load): Updated. - -2007-01-04 David Turner - - * docs/INSTALL.UNIX: Simplify some parts, add reference to - autogen.sh and pointer to README.CVS. - - * README.CVS: Add common problem description and solution - when running autogen.sh. - - * docs/INSTALL: Add reference to MacOS X. - - * docs/MAKEPP, docs/INSTALL.MAC: New documentation files. - - * docs/TODO: Remove obsolete items. - - * src/raster/ftraster.c: (TRaster_Instance): Replace it with... - (TWorker): This. - Remove `count_table' and `memory'. - Make `grays' a pointer. - (TRaster): New structure. - (count_table): New static array. - (RAS_ARGS, RAS_ARG, RAS_VARS, RAS_VAR, FT_UNUSED_RASTER, cur_ras, - Vertical_Gray_Sweep_Step, ft_black_new, ft_black_done, - ft_black_set_mode, ft_black_render): Updated. - (ft_black_init): Don't initialize `count_table'. - (ft_black_reset): Use the render pool. This saves about 6KB of - heap space for each FT_Library instance. - - * src/smooth/ftgrays.c (TRaster): Replaced with... - (TWorker): This. - Remove `memory'. - (TRaster): New structure. - - (RAS_ARG_, RAS_ARG, RAS_VAR_, RAS_VAR, ras, gray_render_line, - gray_move_to, gray_line_to, gray_conic_to, gray_cubic_to, - gray_render_span, gray_raster_render): Updated. - (gray_raster_reset): Use the render pool. This saves about 6KB of - heap space for each FT_Library instance. - - * src/sfnt/sfobjs.c, src/sfnt/ttkern.c, src/sfnt/ttkern.h, - src/sfnt/ttmtx.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h, - src/truetype/ttpload.c, include/freetype/config/ftoption.h: Remove - FT_OPTIMIZE_MEMORY macro (and code for !FT_OPTIMIZE_MEMORY) since - the optimization is no longer experimental. - - * src/pshinter/pshalgo.c (psh_glyph_interpolate_normal_points): - Remove a typo that results in no hinting and a memory leak with some - large Asian CFF fonts. - - * src/base/ftobjs.c (FT_Done_Library): Remove a subtle memory leak - which happens when FT_Done_Library is called with still opened - CFF_Faces in it. We need to close all faces before destroying the - modules, or else some bad things (memory leaks) may happen. - -2007-01-02 Werner Lemberg - - * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): - Remove compiler warning. - -2007-01-02 David Turner - - * src/sfnt/sfobjs.c: Add documentation comment. - -2006-12-31 Masatake YAMATO - - * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): New - function. - Check uniqueness of the gid pairs. - (gxv_kern_subtable_fmt0_validate): Move some code to - `gxv_kern_subtable_fmt0_pairs_validate'. - -2006-12-22 David Turner - - * src/autofit/aflatin.c, src/truetype/ttgload.c: Remove compiler - warnings. - - * builds/win32/visualc/freetype.vcproj: Add _CRT_SECURE_NO_DEPRECATE - to avoid deprecation warnings with Visual C++ 8. - -2006-12-16 Anders Kaseorg - - * src/base/ftlcdfil.c (FT_Library_SetLcdFilter) - [FT_FORCE_LIGHT_LCD_FILTER]: Fix typo. - -2006-12-15 suzuki toshiya - - * include/freetype/internal/services/svotval.h: Add `volatile' to - sync with the modification by Jens Claudius on 2006-08-22; cf. - http://cvs.savannah.gnu.org/viewcvs/freetype/freetype2/src/otvalid/otvmod.c?r1=1.4&r2=1.5 - -2006-12-15 suzuki toshiya - - * src/base/ftmac.c: Specialized for Mac OS X only. - * builds/unix/ftconfig.in: Fixed for ppc64 missing Carbon framework. - * builds/unix/configure.raw: Ditto. When explicit switches for - FSSpec/FSRef/QuickDraw/ATS availability are given to configure, - builds/mac/ftmac.c is used instead of default src/base/ftmac.c. - -2006-12-15 suzuki toshiya - - * builds/mac/ftmac.c: Copied src/base/ftmac.c for legacy system. - * builds/mac/FreeType.m68k_cfm.make.txt: Fix to use builds/mac/ftmac.c - instead of src/base/ftmac.c - * builds/mac/FreeType.ppc_carbon.make.txt: Ditto. - * builds/mac/FreeType.ppc_classic.make.txt: Ditto. - * builds/mac/FreeType.m68k_far.make.txt: Ditto, and exclude gxvalid.c - that cannot be built at present. - -2006-12-15 suzuki toshiya - - * src/base/ftobjs.c: Improvement of resource fork handler for - POSIX, cf. - http://lists.gnu.org/archive/html/freetype-devel/2006-10/msg00025.html - (Mac_Read_sfnt_Resource): Count only `sfnt' resource of suitcase font - format or .dfont, to simulate the face index number counted by ftmac.c. - (IsMacResource): Return the number of scalable faces correctly. - -2006-12-10 Werner Lemberg - - * builds/toplevel.mk (version): Protect against `distclean' target. - -2006-12-09 Werner Lemberg - - * builds/*/*def.mk, builds/*/detect.mk (CAT): Define to either `cat' - or `type'. - - * builds/freetype.mk (version): Extracted from freetype.h, using - GNU make's built-in string functions. - (refdoc): Use $(version) instead of static version number. - -2006-12-08 Werner Lemberg - - * builds/toplevel.mk (dist): Extract version number from freetype.h. - -2006-12-08 Vladimir Volovich - - * src/tools/apinames.c (State): Remove final comma in structure -- - xlc v5 under AIX 4.3 doesn't like this. - -2006-12-07 David Turner - - * src/autofit/afloader.c (af_loader_load_g): Small adjustment - to the spacing of auto-fitted glyphs. This only impacts rare - cases (e.g., Arial Bold at rather small character sizes). - -2006-12-03 Werner Lemberg - - * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttsbit0.c. - -2006-12-01 Werner Lemberg - - * src/sfnt/sfobjs.c (tt_face_get_name): All Unicode strings are - encoded in UTF-16BE. Patch from Rajeev Pahuja . - (tt_name_entry_ascii_from_ucs4): Removed. - - - * include/freetype/ftxf86.h: Fix and extend comment so that it - appears in the documentation. - - * include/freetype/ftchapters.h: Add `font_format' section. - - - * src/tools/docmaker/tohtml.py (HtmlFormatter::index_exit): Add link - to TOC in index page. - -2006-11-28 David Turner - - * src/smooth/ftgrays.c (gray_raster_render): Return 0 when we are - trying to render into a zero-width/height bitmap, not an error code. - - * src/truetype/ttobjs.c (tt_face_init): Fix typo in previous patch. - - * src/smooth/ftgrays.c: Remove hard-coded error values; use FreeType - ones instead. - - * src/autofit/afhints.c (af_glyph_hints_dump_segments): Remove unused - variable. - -2006-11-26 Pierre Hanser - - * src/truetype/ttobjs.c (tt_face_init): Protect against NULL pointer. - -2006-11-25 David Turner - - * src/autofit/afhints.c (af_glyph_hints_dump_points, - af_glyph_hints_dump_segments, af_glyph_hints_dumpedges) [!AF_DEBUG]: - Add stubs to link the `ftgrid' test program when debugging is - disabled in the auto-hinter. - -2006-11-23 David Turner - - * src/autofit/afhints.c, src/autofit/afhints.h, src/autofit/aflatin.c, - src/autofit/aftypes.h: Miscellaneous auto-hinter improvements. - - * src/autofit/afhints.c (af_glyph_hints_dump_segments) [AF_DEBUG]: - Emit more sensible information. - - * src/autofit/afhints.h (AF_SegmentRec): Add `height' member. - - * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Improve - rounding of blue values. - (af_latin_hints_compute_segments): Hint segment heights. - (af_latin_hints_link_segments): Reduce `len_score' value. - (af_latin_hints_compute_edges): Increase `segment_length_threshold' - value and use `height' member for comparisons. - (af_latin_hint_edges): Extend logging message. - Improve handling of remaining edges. - -2006-11-22 Werner Lemberg - - Fix Savannah bug #15553. - - * src/truetype/ttgload.c (tt_loader_init): Re-execute the CVT - program after a change from mono to grayscaling (and vice versa). - Use correct constant for comparison to get `exec->grayscale'. - -2006-11-18 Werner Lemberg - - Because FT_Load_Glyph expects CID values for CID-keyed fonts, the - test for a valid glyph index must be deferred to the font drivers. - This patch fixes Savannah bug #18301. - - * src/base/ftobjs.c (FT_Load_Glyph): Don't check `glyph_index'. - * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/cff/cffgload.c - (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph), - src/pcf/pcfdrivr.c (PCF_Glyph_Load), src/pfr/pfrobjs.c - (pfr_slot_load), src/truetype/ttdriver.c (Load_Glyph), - src/type1/t1gload.c (T1_Load_Glyph), src/winfonts/winfnt.c - (FNT_Load_Glyph): Check validity of `glyph_index'. - -2006-11-13 David Turner - - * src/truetype/ttinterp.c (FIX_BYTECODE): Undefine. The interpreter - `enhancements' are still too buggy for general use. - - * src/base/ftlcdfil.c: Add support for FT_FORCE_LIGHT_LCD_FILTER and - FT_FORCE_LEGACY_LCD_FILTER at compile time. Define these macros - when building the library to change the default LCD filter to be - used. This is only useful for experimentation. - - * include/freetype/ftlcdfil.h: Update documentation. - -2006-11-10 David Turner - - * src/smooth/ftsmooth.c: API change for the LCD - filter. The FT_LcdFilter value is an enumeration describing which - filter to apply, with new values FT_LCD_FILTER_LIGHT and - FT_LCD_FILTER_LEGACY (the latter implements the LibXft original - algorithm which produces strong color fringes for everything - except very-well hinted text). - - * include/freetype/ftlcdfil.h (FT_Library_SetLcdFilter): Change - second parameter to an enum type. - - * src/base/ftlcdfil.c (USE_LEGACY): Define. - (_ft_lcd_filter): Rename to... - (_ft_lcd_filter_fir): This. - Update parameters. - (_ft_lcd_filter_legacy) [USE_LEGACY]: New filter function. - (FT_Library_Set_LcdFilter): Update parameters. - Handle new filter modes. - - * include/internal/ftobjs.h: Include FT_LCD_FILTER_H. - (FT_Bitmap_LcdFilterFunc): Change third argument to `FT_Library'. - (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Add filtering - callback and update other fields. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic) - [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Update. - Other minor improvements. - - * src/autofit/aflatin.c: Various tiny improvements that drastically - improve the handling of serif fonts and of LCD/LCD_V hinting modes. - (af_latin_hints_compute_edges): Fix typo. - (af_latin_compute_stem_width): Take better care of diagonal stems. - -2006-11-09 David Turner - - * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix - typo which created a variable-used-before-initialized bug. - -2006-11-07 Zhe Su - - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Handle vertical layout - also. - -2006-11-03 Werner Lemberg - - * src/base/ftcalc.c: Don't use `long long' but `FT_Int64'. - -2006-11-02 David Turner - - Add a few tweaks to better handle serif fonts. - Add more debugging messages. - - * src/autofit/aflatin.c (af_latin_hints_compute_edges): Ignore - segments that are less than 1.5 pixels high. This gets rid of - *many* corner cases with serifs. - (af_latin_align_linked_edge): Add logging message. - (af_latin_hint_edges): Use AF_HINTS_DO_BLUES. - Add logging messages. - Handle AF_EDGE_FLAG flag specially. - - * src/autofit/afmodule.c [AF_DEBUG]: Add _af_debug, - _af_debug_disable_blue_hints, and _af_debug_hints variables. - - * src/autofit/aftypes.h (AF_LOG) [AF_DEBUG]: Use _af_debug. - Update external declarations. - (af_corner_orientation, af_corner_is_flat): Replaced by... - - * include/freetype/internal/ftcalc.h (ft_corner_orientation, - ft_corner_is_flat): These declarations. - - * src/autofit/afangles.c (af_corner_orientation, af_corner_is_flat): - Comment out. Replaced by... - - * src/base/ftcalc.h (ft_corner_orientation, ft_corner_is_flat): - These functions. Update all callers. - (FT_Add64) [!FT_LONG64]: Simplify. - - * src/autofit/afhints.c: Include FT_INTERNAL_CALC_H. - (af_direction_compute): Add a missing FT_ABS call. This bug caused - production of garbage by missing lots of segments. - - * src/autofit/afhints.h (AF_HINTS_DO_BLUES): New macro. - - * src/autofit/afloader.c (af_loader_init, af_loader_done) - [AF_DEBUG]: Set _af_debug_hints. - - - * src/pshinter/pshalgo.c: Include FT_INTERNAL_CALC_H. - (psh_corner_is_flat, psh_corner_orientation): Use ft_corner_is_flat - and ft_corner_orientation. - - - * src/gzip/inftrees.c (huft_build): Remove compiler warning. - -2006-10-24 Werner Lemberg - - * src/cff/cffload.c (cff_encoding_load): Remove unused variable. - - * src/base/ftobjs.c (FT_Select_Charmap): Disallow FT_ENCODING_NONE - as argument. - -2006-10-23 Zhe Su - - * src/base/ftoutln.c (FT_Outline_Get_Orientation): Re-implement to - better deal with broken Asian fonts with strange glyphs, having - self-intersections and other peculiarities. The used algorithm is - based on the nonzero winding rule. - -2006-10-23 David Turner - - Speed up the CFF font loader. With some large CFF fonts, - FT_Open_Face is now more than three times faster. - - * src/cff/cffload.c (cff_get_offset): Removed. - (cff_new_index): Inline functionality of `cff_get_offset'. - (cff_charset_compute_cids, cff_charset_free_cids): New functions. - (cff_charset_done): Call `cff_charset_free_cids'. - (cff_charset_load): Call `cff_charset_compute_cids'. - (cff_encoding_load) : Ditto, to replace inefficient loop. - - * src/sfnt/ttmtx.c (tt_face_load_hmtx): Replace calls to FT_GET_XXX - with FT_NEXT_XXX. - - - Speed up the Postscript hinter, with more than 100% speed increase - on my machine. - - * src/pshinter/pshalgo.c (psh_corner_is_flat, - psh_corner_orientation): New functions. - (psh_glyph_compute_inflections): Merge loops for efficiency. - Use `psh_corner_orientation'. - (psh_glyph_init): Use `psh_corner_is_flat'. - (psh_hint_table_find_strong_point): Renamed to... - (psh_hint_table_find_strong_points): This. - Rewrite, adding argument to handle all points at once. - Update all callers. - (PSH_MAX_STRONG_INTERNAL): New macro. - (psh_glyph_interpolate_normal_points): Rewrite for efficiency. - -2006-10-15 suzuki toshiya - - * src/base/ftmac.c (FT_New_Face_From_FOND): Initialize variable - `error' with FT_Err_Ok. - -2006-10-14 suzuki toshiya - - * docs/INSTALL.CROSS: New document file for cross-building. - - * builds/unix/configure.raw: Preliminary cross-building support. - Find native C compiler and pass it by CC_BUILD, and - find suffix for native executable and pass it by EXEEXT_BUILD. - Also suffix for target executable is passed by EXEEXT. - - * builds/unix/unix-cc.in (CCraw_build, E_BUILD): New variables to - build `apinames' which runs on building system. They are set by - CC_BUILD and EXEEXT_BUILD. - - * builds/exports.mk (APINAMES_EXE): Change the extension for - apinames from the suffix for target (E) to that for building host - (E_BUILD). - -2006-10-12 Werner Lemberg - - * docs/INSTALL.UNX, docs/UPGRADE.UNX: Renamed to... - * docs/INSTALL.UNIX, docs/UPGRADE.UNIX: This. Update all documents - which reference those files. - -2006-10-12 suzuki toshiya - - * builds/unix/configure.raw (FT2_EXTRA_LIBS): New variable. It is - embedded in freetype2.pc and freetype-config. Use it to record - Carbon dependency of MacOSX. - - * builds/unix/freetype2.in: Embed FT2_EXTRA_LIBS. - - * builds/unix/freetype-config.in: Ditto. - -2006-10-11 Werner Lemberg - - * devel/ftoption.h (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): Define for - development. - -2006-10-03 Jens Claudius - - * include/freetype/config/ftstdlib.h: Cast away volatileness from - argument to ft_setjmp. - - * include/freetype/internal/ftvalid.h: Add comment that - ft_validator_run must not be used. - -2006-10-01 Werner Lemberg - - * src/base/ftbase.c: Undo change from 2006-09-30. - - * src/base/rules.mk (BASE_SRC): Remove `ftlcdfil.c'. - -2006-09-30 David Turner - - * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): - s/unpatented_hinting/ignore_unpatented_hinter/. - Update all callers. - - * src/base/ftobjs.c (FT_Load_Glyph): Refine the algorithm whether - auto-hinting shall be used or not. - - * src/truetype/ttobjs.c (tt_face_init): Ditto. - -2006-09-30 Werner Lemberg - - * src/base/rules.mk (BASE_SRC): Remove `ftapi.c' (which is no longer - in use). - - * src/base/ftbase.c: Include `ftlcdfil.c'. - -2006-09-29 Werner Lemberg - - * src/sfnt/ttcmap.c (tt_cmap4_char_map_binary): Fix algorithm for - overlapping segments. Bug reported by Stefan Koch. - -2006-09-28 David Turner - - Fix a bug in the automatic unpatented hinting support which prevents - normal bytecode hinting to work properly. - - * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): - s/force_autohint/unpatented_hinting/. Update all callers. - - * src/base/ftobjs.c (FT_Load_Glyph): Updated code. - - * src/autofit/aftypes.h (AF_DEBUG): Undefine to get rid of traces. - -2006-09-27 David Turner - - * include/freetype/freetype.h (FT_FREETYPE_PATCH): Set to 2. - - - Add a new API to support color filtering of subpixel glyph bitmaps. - In a default build, the function `FT_Library_SetLcdFilter' returns - `FT_Err_Unimplemented_Feature'; you need to #define - FT_CONFIG_OPTION_SUBPIXEL_RENDERING in ftoption.h to compile the - real implementation. - - * include/freetype/ftlcdfil.h, src/base/ftlcdfil.c: New files. - - * include/freetype/internal/ftobjs.h (FT_Bitmap_LcdFilterFunc): New - typedef. - (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: New members - `lcd_filter_weights' and `lcd_filter'. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Remove arguments - `hmul' and `vmul'. - - Handle subpixel rendering. - Simplify function. - (ft_smooth_render_lcd): Use `FT_RENDER_MODE_LCD'. - (ft_smooth_render_lcd_v): Use `FT_RENDER_MODE_LCD_V'. - - * include/freetype/config/ftheader.h (FT_LCD_FILTER_H): New macro, - pointing to . - - * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC), - vms_make.com: Add `ftlcdfil.c' to the list of compiled source files. - - * modules.cfg (BASE_EXTENSIONS): Add ftlcdfil.c. - -2006-09-26 David Bustin - - * src/pfr/pfrobjs.c (pfr_face_get_kerning): Skip adjustment bytes - correctly. Reported as Savannah bug #17843. - -2006-09-26 David Turner - - * src/autofit/afhints.h (AF_HINTS_DO_HORIZONTAL, - AF_HINTS_DO_VERTICAL, AF_HINTS_DO_ADVANCE): New macros to disable - horizontal and vertical hinting for the purpose of debugging the - auto-fitter. - - * src/autofit/afmodule.c (_af_debug_disable_horz_hints, - _af_debug_disable_vert_hints) [AF_DEBUG]: New global variables. - - * src/autofit/aftypes.h [AF_DEBUG]: Declare above variables. - - * include/freetype/config/ftoption.h, devel/ftoption.h - (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): New macro to control whether - we want to compile LCD-optimized rendering code (à la ClearType) or - not. The macro *must* be disabled in default builds of the library - for patent reasons. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Disable - LCD-specific rendering when FT_CONFIG_OPTION_SUBPIXEL_RENDERING - isn't defined at compile time. This only changes the content of the - rendered glyph to match the one of normal gray-level rendering, - hence clients should not need to be modified. - - * docs/CHANGES: Updated. - -2006-09-18 Garrick Meeker - - * src/base/ftmac.c (FT_New_Face_From_FOND): Fall back to SFNT if - LWFN fails and both are available. - -2006-09-11 David Turner - - * src/sfnt/sfobjs.c (tt_face_get_name): Support some fonts which - report their English names through an Apple Roman - (platform,encoding) pair, with language_id != English. - - If the font uses another name entry with language_id == English, it - will be selected correctly, though. - - * src/truetype/ttobjs.c (tt_face_init): Add unpatented hinting - selection for `mingli.ttf'. - -2006-09-05 Werner Lemberg - - * src/truetype/ttpload.c (tt_face_load_hdmx): Handle `record_size' - values which have the upper two bytes set to 0xFF instead of 0x00 - (as it happens in at least two CJKV fonts, `HAN NOM A.ttf' and - `HAN NOM B.ttf'). - - * src/smooth/ftgrays.c [GRAYS_USE_GAMMA]: Really remove all code. - -2006-09-05 David Turner - - Minor source cleanups and optimizations. - - * src/smooth/ftgrays.c (GRAYS_COMPACT): Removed. - (TRaster): Remove `count_ex' and `count_ey'. - (gray_find_cell): Remove 2nd and 3rd argument. - (gray_alloc_cell): Merged with `gray_find_cell'. - (gray_record_cell): Simplify. - (gray_set_cell): Rewrite. - (gray_start_cell): Apply offsets to `ras.ex' and `ras.ey'. - (gray_render_span): Don't use FT_MEM_SET for small values. - (gray_dump_cells) [DEBUG_GRAYS]: New function. - (gray_sweep): Avoid buffer overwrites when to drawing the end of a - bitmap scanline. - (gray_convert_glyph): Fix speed-up. - -2006-09-04 David Turner - - * src/smooth/ftgrays.c (gray_convert_glyphs): Make it work with - 64bit processors. - -2006-09-03 Werner Lemberg - - * devel/ftoption.h: Synchronize with - include/freetype/config/ftoption.h. - - * src/smooth/ftgrays.c (gray_record_cell): Remove shadowing - variable declaration. - (gray_convert_glyph): Fix compiler warnings. - -2006-09-01 David Turner - - * src/truetype/ttobjs.c (tt_face_init): Update the TrueType loader - to recognize a few fonts that require the automatic unpatented - loader. - - * src/smooth/ftgrays.c: Optmize the performance of the anti-aliased - rasterizer. The speed improvement is between 15% and 25%, depending - on the font data. - - (GRAYS_USE_GAMMA, GRAYS_COMPACT): Removed, and all associated code. - (TCell): Redefine. - (TRaster): New members `buffer', `buffer_size', `ycells', `ycount'. - (gray_init_cells): Updated. - (gray_find_cell, gray_alloc_cell): New functions. - (gray_record_cell): Rewritten to use `gray_find_cell' and - `gray_alloc_cell'. - (PACK, LESS_THAN, SWAP_CELLS, DEBUG_SORT, QUICK_SORT, SHELL_SORT, - QSORT_THRESHOLD): - Removed. - (gray_shell_sort, gray_quick_sort, gray_check_sort, - gray_dump_cells): Removed. - (gray_sweep): Rewritten. - (gray_convert_glyph): Rewrite code which used one of the sorting - functions. - (gray_raster_render): Updated. - -2006-08-29 Dr. Werner Fink - - * configure: Make it possible to handle configure options which - have strings containing spaces. - -2006-08-27 David Turner - - * include/freetype/config/ftoption.h (TT_USE_BYTECODE_INTERPRETER): - New macro, defined if either TT_CONFIG_OPTION_BYTECODE_INTERPRETER - or TT_CONFIG_OPTION_UNPATENTED_HINTING is defined. - - * include/freetype/internal/ftcalc.h, src/base/ftcalc.c, - src/truetype/truetype.c, src/truetype/ttdriver.c, - src/truetype/ttgload.c, src/truetype/ttgload.h, - src/truetype/ttinterp.c, src/truetype/ttobjs.c, - src/truetype/ttobjs.h, src/truetype/ttpload.c, src/type42/t42drivr.c: - s/TT_CONFIG_OPTION_BYTECODE_INTERPRETER/TT_USE_BYTECODE_INTERPRETER/. - - * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): New - member `force_autohint'. - - * src/base/ftobjs.c (FT_Load_Glyph): Use `force_autohint'. - - * src/truetype/ttobjs.c (tt_face_init): Prepare code for testing - against a list of font names which need the bytecode interpreter. - -2006-08-27 Jens Claudius - - Fix miscellaneous compiler warnings. - - * include/freetype/internal/ftobjs.h: Close comment with `*/' to - avoid `/* in comment' compiler warning. - - * src/base/ftdbgmem.c (ft_mem_table_get_source): Turn cast - `(FT_UInt32)(void*)' into `(FT_UInt32)(FT_PtrDist)(void*)' since on - 64-bit platforms void* is larger than FT_UInt32. - - * src/base/ftobjs.c (t_validator_error): Cast away - volatileness of argument to ft_longjmp. Spotted by Werner - `Putzfrau' Lemberg. - - * src/bdf/bdflib.c (bdf_load_font): Initialize local - variable `lineno'. - - * src/gxvalid/gxvmod.c (classic_kern_validate): Mark local variable - `error' as volatile. - -2006-08-27 Werner Lemberg - - * builds/unix/ftconfig.in: Synchronize with main ftconfig.h. - Reported by Jens. - -2006-08-22 Jens Claudius - - Fix for previous commit, which caused many compiler warnings/errors - about addresses of volatile objects passed as function arguments as - non-volatile pointers. - - * include/freetype/internal/ftvalid.h: Make FT_Validator typedef a - pointer to a volatile object. - - * src/gxvalid/gxvmod.c (gxv_load_table): Make function argument - `table' a pointer to a volatile object. - - * src/otvalid/otvmod.c (otv_load_table): Make function argument - `table' a pointer to a volatile object. - -2006-08-18 Jens Claudius - - * src/gxvalid/gxvmod.c (GXV_TABLE_DECL): Mark local variable `_sfnt' - as volatile since it must keep its value across a call to ft_setjmp. - (gxv_validate): Same for local variables `memory' and `valid'. - (classic_kern_validate): Same for local variables `memory', - `ckern', and `valid'. - - * src/otvalid/otvmod.c (otv_validate): Same for function parameter - `face' and local variables `base', `gdef', `gpos', `gsub', `jstf', - and 'valid'. - - * src/sfnt/ttcmap.c (tt_face_build_cmaps): Same for local variable - `cmap'. - -2006-08-16 David Turner - - * src/cid/cidgload.c (cid_slot_load_glyph): Remove compiler - warnings. - - * src/base/ftobjs.c (ft_validator_run): Disable function; it is - buggy by design. Always return -1. - - - Improvements to native TrueType hinting. This is a first try, - controlled by the FIX_BYTECODE macro in src/truetype/ttinterp.c. - - * include/freetype/internal/ftgloadr.h (FT_GlyphLoadRec): Add member - `extra_points2'. - - * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add member - `orus'. - - * src/base/ftgloadr.c (FT_GlyphLoader_Reset, - FT_GlyphLoader_Adjust_Points, FT_GlyphLoader_CreateExtra, - FT_GlyphLoader_CheckPoints, FT_GlyphLoader_CopyPoints): Updated to - handle `extra_points2'. - - * src/truetype/ttgload.c (tt_prepare_zone): Handle `orus'. - Remove compiler warning. - (cur_to_arg): Remove macro. - (TT_Hint_Glyph): Updated. - (TT_Process_Simple_Glyph): Handle `orus'. - - * src/truetype/ttinterp.c (FIX_BYTECODE): New macro. - (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Handle `orus'. - (LOC_Ins_IUP): Renamed to... - (IUP_WorkerRec): This. - Add `orus' member. - (Shift): Renamed to... - (_iup_worker_shift): This. - Updated. - (Interp): Renamed to... - (_iup_worker_interpolate): This. - Updated to handle `orus'. - (Ins_IUP): Updated. - - * src/truetype/ttobjs.c (tt_glyphzone_done, tt_glyphzone_new): - Handle `orus'. - -2006-08-15 suzuki toshiya - - * modules.cfg (BASE_EXTENSIONS): Compile in ftgxval.c by default to - build ftvalid in ft2demos. This has been inadvertedly changed - 2006-08-13. - -2006-08-15 suzuki toshiya - - `ft_validator_run' wrapping `setjmp' can cause a crash, as found by - Jens: - http://lists.gnu.org/archive/html/freetype-devel/2006-08/msg00004.htm. - - * src/otvalid/otvmod.c: Replace `ft_validator_run' by `ft_setjmp'. - It reverts the change introduced on 2005-08-20. - - * src/gxvalid/gxvmod.c: Ditto. - -2006-08-13 Jens Claudius - - * finclude/freetype/internal/psaux.h: (T1_TokenType): Add - T1_TOKEN_TYPE_KEY. - (T1_FieldRec): Add `dict'. - (T1_FIELD_DICT_FONTDICT, T1_FIELD_DICT_PRIVATE): New macros. - (T1_NEW_XXX, T1_FIELD_XXX): Update to take the dictionary where a PS - keyword is expected as an additional argument. - - * src/cid/cidload.c: (cid_field_records): Adjust invocations of - T1_FIELD_XXX. - - * src/cid/cidtoken.h: Adjust invocations of T1_FIELD_XXX. - - * src/psaux/psobjs.c: Add macro FT_COMPONENT for tracing. - (ps_parser_to_token): Report a PostScript key as T1_TOKEN_TYPE_KEY, - not T1_TOKEN_TYPE_ANY. - (ps_parser_load_field): Make sure a token that should be a string or - name is really a string or name. - Avoid memory leak if a keyword has been already encountered and its - value is overwritten. - * src/type1/t1load.c: (t1_keywords): Adjust invocations of - T1_FIELD_XXX. - (parse_dict): Ignore keywords that occur in the wrong dictionary - (e.g., in `Private' instead of `FontDict'). - - * src/type1/t1tokens.h: Adjust invocations of T1_FIELD_XXX. - - * src/type42/t42parse.c: (t42_keywords): Adjust invocations of - T1_FIELD_XXX. - -2006-07-18 Jens Claudius - - Move creation of field `buildchar' of T1_DecoderRec out of - `t1_decoder_init' and let the caller of `t1_decoder_init' take care - of it. - - Call the finisher for T1_Decoder in `cid_face_compute_max_advance' - and `T1_Compute_Max_Advance'. - - * include/freetype/internal/psaux.h (T1_DecoderRec): Remove field - `face', add `len_buildchar'. - - * include/freetype/internal/t1types.h (T1_FaceRec): Add field - `buildchar'. - - * src/cid/cidgload.c (cid_face_compute_max_advance): Call finisher - for T1_Decoder. - (cid_slot_load_glyph): Do not ignore failure when initializing the - T1_Decoder. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Updated. - (t1_decoder_init): Remove initialization of fields `buildchar' and - `len_buildchar'. - (t1_decoder_done): Remove deallocation of field `buildchar'. - - * freetype/src/type1/t1gload.c (T1_Compute_Max_Advance): Initialize - T1_Decoder's `buildchar' and `len_buildchar'; call finisher for - T1_Decoder. - (T1_Load_Glyph): Initialize T1_Decoder's `buildchar' and - `len_buildchar'; make sure to call finisher for T1_Decoder even in - case of error. - - * src/type1/t1load.c (T1_Open_Face): Allocate new field `buildchar' - of T1_FaceRec. - - * src/type1/t1objs.c (T1_Face_Done): Free new field `buildchar' of - T1_FaceRec. - -2006-07-14 Jens Claudius - - * include/freetype/internal/psaux.h: New macros IS_PS_NEWLINE, - IS_PS_SPACE, IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT, - and IS_PS_BASE85 (from src/psaux/psconv.h). - (T1_FieldLocation): Add T1_FIELD_LOCATION_LOADER, - T1_FIELD_LOCATION_FACE, and T1_FIELD_LOCATION_BLEND. - (T1_DecoderRec): New fields `buildchar' and `face'. - (IS_PS_TOKEN): New macro. - - * include/freetype/internal/t1types.h (T1_FaceRec): New fields - `ndv_idx', `cdv_idx', and `len_buildchar'. - - * include/freetype/t1tables.h (PS_BlendRec): New fields - `default_design_vector' and `num_default_design_vector'. - - * src/psaux/psconv.h: Move macros IS_PS_NEWLINE, IS_PS_SPACE, - IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT, and - IS_PS_BASE85 to include/freetype/internal/psaux.h. - - * src/psaux/psobjs.c (ps_parser_to_token_array): Allow `token' - argument to be NULL if we want only to count the number of tokens. - (ps_tocoordarray): Allow `coords' argument to be NULL if we just - want to skip the array. - (ps_tofixedarray): Allow `values' argument to be NULL if we just - want to skip the array. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Add support - for (partially commented out) othersubrs 19-25, 27, and 28. - (t1_decoder_init): Initialize new fields `face' and `buildchar'. - (t1_decoder_done): Release new field `buildchar'. - - * src/type1/t1load.c (parse_buildchar, parse_private): New - functions. - (t1_keywords): Register them. - (t1_allocate_blend): Updated. - (t1_load_keyword): Handle field types T1_FIELD_LOCATION_LOADER, - T1_FIELD_LOCATION_FACE and T1_FIELD_LOCATION_BLEND. - (parse_dict): Remove `keyword_flags' argument. - Use new macro IS_PS_TOKEN. - Changed function so that later PostScript definitions override - earlier ones. - (t1_init_loader): Initialize new field `keywords_encountered'. - (T1_Open_Face): Initialize new fields `ndv_idx', `cdv_idx', and - `len_buildchar'. - Remove `keywords_flags'. - - * src/type1/t1load.h (T1_LoaderRect): New field - `keywords_encountered'. - (T1_PRIVATE, T1_FONTDIR_AFTER_PRIVATE): New macros. - - * src/type1/t1tokens.h [!T1_CONFIG_OPTION_NO_MM_SUPPORT]: New - entries for parsing /NDV, /CDV, and /DesignVector. - -2006-07-07 Werner Lemberg - - Add many checks to protect against malformed PCF files. - - * src/pcf/pcfdrivr.c (PCF_Face_Done): Protect against NULL pointers. - (PCF_Face_Init): Add calls to PCF_Face_Done in case of errors. - - * src/pcf/pcfread.c (pcf_read_TOC): Protect against malformed table - data and check that tables don't overlap (using a simple - bubblesort). - (PCF_METRIC_SIZE, PCF_COMPRESSED_METRIC_SIZE, PCF_PROPERTY_SIZE): - New macros which give the size of data structures in the data - stream. - (pcf_get_properties): Use rough estimates to get array size limits. - Assign `face->nprops' and `face->properties' earlier so that a call - to PCF_Face_Done can do the clean-up in case of error. - Protect against invalid string offsets. - (pcf_get_metrics): Clean up code. - Adjust tracing message levels. - Use rough estimate to get array size limit. - (pcf_get_bitmaps): Clean up code. - Adjust tracing message levels. - Use rough estimates to get offset limits. - (pcf_get_encodings): Adjust tracing message level. - (pcf_get_accel): Clean up code. - -2006-06-26 Werner Lemberg - - * src/bdf/bdfdrivr.c (BDF_Face_Init): Handle fonts correctly which - don't have a POINT_SIZE property. This fixes Savannah bug #16914. - -2006-06-26 Jens Claudius - - * src/psaux/t1decode.c (T1_Operator, t1_args_count): Add opcode 15. - (t1_decoder_parse_charstrings): Operator with - opcode 15 pops its two arguments. - Handle the case where the pops of an othersubr may be part of a - subroutine. - Handle unknown othersubrs gracefully: count their operands and let - the following pop operators push the operands as the results onto - the Type1 stack. - Improve handling of setcurrentpoint opcode. - -2006-06-25 Jens Claudius - - The Type 1 parser now skips over top-level procedures as required - for a `Simplified Parser'. This makes the parser more robust as it - doesn't poke around in PostScript code. Additionally, it makes the - FontDirectory hackery in src/type1/t1load.c unnecessary. - - * src/psaux/psobjs.c (IS_OCTAL_DIGIT): New macro. - (skip_literal_string): Add FT_Error as return value. - Handle escapes better. - (skip_string): Add FT_Error as return value. - Don't set `parser->error' but return error code directly. - (skip_procedure): New function. - (ps_parser_skip_PS_token): Handle procedures. - Update code. - (ps_parser_to_token): Update code. - (ps_parser_load_field_table): Handle bbox entries also. - - * src/type1/t1load.c (parse_dict): Remove FontDirectory hackery. - Add commented-out code for synthetic fonts. - -2006-06-24 Eugeniy Meshcheryakov - - Fix two hinting bugs as reported in - http://lists.gnu.org/archive/html/freetype-devel/2006-06/msg00057.html. - - * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add - `first_point' member. - - * src/truetype/ttgload.c (tt_prepare_zone): Initialize - `first_point'. - (TT_Process_Composite_Glyph): Always untouch points. - - * src/truetype/ttinterp.c (Ins_SHC): Fix computation of - `first_point' and `last_point' in case of composite glyphs. - (Ins_IUP): Fix computation of `end_point'. - -2006-06-22 suzuki toshiya - - Insert EndianS16_BtoN and EndianS32_BtoN as workaround for Intel - Mac. The original patch was written by David Sachitano and Lawrence - Coopet, and modified by Sean McBride for MPW compatibility. Only - required data are converted; unused data are left in big endian. - - * src/base/ftmac.c: Include for byteorder macros for non - Mac OS X platforms. - (OS_INLINE): Undefine before definition. - (count_faces_sfnt): Insert EndianS16_BtoN to parse the header of - FontAssociation table in FOND resource. - (count_faces_scalable): Insert EndianS16_BtoN to parse the header - and fontSize at each entry of FontAssociation table in FOND - resource. - (parse_fond): Insert EndianS16_BtoN and EndianS32_BtoN to parse - ffStylOff of FamilyRecord header of FOND resource, the header, - fontSize, fontID at each entry of FontAssociation table, and - StyleMapping table. - (count_faces): Call `HUnlock' after all FOND utilization. - -2006-06-08 suzuki toshiya - - Public API of TrueTypeGX, OpenType, and classic kern table validator - should return `FT_Err_Unimplemented_Feature' if validation service - is unavailable (disabled in `modules.cfg'). It is originally - suggested by David Turner, cf. - http://lists.gnu.org/archive/html/freetype-devel/2005-11/msg00078.html - - * src/base/ftgxval.c (FT_TrueTypeGX_Validate): Return - FT_Err_Unimplemented_Feature if TrueTypeGX validation service is - unavailable. - (FT_ClassicKern_Validate): Return FT_Err_Unimplemented_Feature if - classic kern table validation service is unavailable. - - * src/base/ftotval.c (FT_OpenType_Validate): Return - FT_Err_Unimplemented_Feature if OpenType validation service is - unavailable. - -2006-06-08 Werner Lemberg - - * src/bdf/bdflib.c (bdf_load_font): Fix memory leaks in case of - errors. - -2006-06-07 David Turner - - * src/type1/t1afm.c (KERN_INDEX): Make it more robust. - (T1_Read_Metrics): Fix memory leak which happened when the metrics - file doesn't have kerning pairs. This fixes Savannah bug #16768. - -2006-06-06 David Turner - - Fix memory leak described in Savannah bug #16759. - - We change `ps_unicodes_init' so that it also takes a - `free_glyph_name' callback to release the glyph names returned by - `get_glyph_name' - - * include/freetype/internal/services/svpscmap.h (PS_Glyph_NameFunc): - Renamed to ... - (PS_GetGlyphNameFunc): This. - (PS_FreeGlyphNameFunc): New typedef. - (PS_Unicodes_InitFunc): Add variable for PS_FreeGlyphNameFunc. - - * src/cff/cffcmap.c (cff_sid_to_glyph_name): Use `TT_Face' for first - argument. - (cff_sid_free_glyph_name): New function. - (cff_cmap_unicode_init): Updated. - - * src/psaux/t1cmap.c (t1_cmap_unicode_init): Updated. - - * src/psnames/psmodule.c (ps_unicodes_init): Add variable for - PS_FreeGlyphNameFunc and use it. - - -2006-06-04 David Turner - - * src/base/ftutil.c (ft_mem_qrealloc): Fix the function to accept - `item_size == 0' as well -- though this sounds weird, it can - theoretically happen. This fixes Savannah bug #16669. - - * src/pfr/pfrobjs.c (pfr_face_init): Fix the computation - of `face->num_glyphs' which missed the last glyph, due to - the offset-by-1 computation, since the PFR format doesn't - guarantee that glyph index 0 corresponds to the `missing - glyph. This fixes Savannah bug #16668. - -2006-05-25 Werner Lemberg - - * builds/unix/unix-cc.in (LINK_LIBRARY): Don't comment out - `-no-undefined'. Reported by Christian Biesinger. - -2006-05-19 Brian Weed - - * builds/win32/visualc/freetype.dsp: Release libraries no longer - have debug information, and debug libraries use `C7 compatible' - debug info. - -2006-05-19 suzuki toshiya - - Apply patch by Derek Clegg to fix two memory leaks in the MacOS - resource fork handler. This fixes Savannah bug #16631. - - * src/base/ftobjs.c (load_face_in_embedded_rfork): Replace - `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak. - - * src/base/ftrfrk.c (raccess_guess_linux_double_from_file_name): - Replace `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak. - -2006-05-19 suzuki toshiya - - * build/unix/configure.raw: Add a fallback to disable Carbon - dependency, if configured with no options on Mac OS X. - -2006-05-19 suzuki toshiya - - * src/base/ftmac.c (open_face_from_buffer): Deallocate stream when - its content cannot be parsed as supported font. This fixes - the second part of Savannah bug #16590. - -2006-05-18 Werner Lemberg - - * src/truetype/ttgload.c (TT_Load_Composite_Glyph) - [FT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Make it compilable again. - -2006-05-17 David Turner - - This is a major patch used to drastically improve the performance of - loading glyphs. This both speeds up loading the glyph vectors - themselves and the auto-fitter module. - - We now use inline assembler code with GCC to implement `FT_MulFix', - which is probably the most important function related to the - engine's performance. - - The resulting speed-up is about 25%. - - - * include/freetype/internal/tttypes.h (TT_LoaderRec): Add fields - `cursor' and `limit'. - - * src/autofit/afangles.c (af_corner_is_flat, af_corner_orientation): - New functions. - (AF_ATAN_BITS, af_arctan, af_angle_atan): Comment out. - [TEST]: Remove. - - * src/autofit/afcjk.c (AF_Script_UniRangeRec): Comment out test - code. - - * src/autofit/afhints.c (af_axis_hints_new_segment): Don't call - `FT_ZERO' - (af_direction_compute, af_glyph_hints_compute_inflections): Rewritten. - (af_glyph_hints_reload: Rewrite recognition of weak points. - - * src/autofit/aflatin.c (af_latin_hints_compute_segments): Move - constant values out of the loops. - - * src/autofit/aftypes.h: Updated. - - * src/base/ftcalc.c (FT_MulFix): Use inline assembler code. - - * src/base/ftoutln.c (FT_Outline_Get_Orientation): Use vector - product to get orientation. - - * src/gzip/ftgzip.c (ft_get_uncompressed_size): New function. - (FT_Stream_OpenGzip): Use it to handle small files directly in - memory. - - * src/psaux/psconv.c (PS_Conv_ASCIIHexDecode, PS_ConvEexecDecode): - Improve performance. - - * src/truetype/ttgload.c (TT_Access_Glyph_Frame): Set `cursor' and - `limit'. - - (TT_Load_Glyph_Header, TT_Load_Simple_Glyph, - TT_Load_Composite_Glyph): Updated. Add threshold to protect against - exceedingly large values of number of contours. Speed up by - reducing the number of loops. - - * src/type1/t1gload.c (T1_Load_Glyph): Don't apply unit matrix. - - - * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the threshold - used to detect rogue clients from 4 to 16. This is to prevent some - segmentation faults with fonts like `KozMinProVI-Regular.otf' which - comes from the Japanese Adobe Reader Asian Font pack. - -2007-05-17 Werner Lemberg - - * src/cff/cffload.c (cff_font_done): Deallocate subfont array. This - fixes the first part of Savannah bug #16590. - -2006-05-16 Werner Lemberg - - * docs/PROBLEMS: Updated icl issues. - ----------------------------------------------------------------------------- - -Copyright 2006-2015 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. - - -Local Variables: -version-control: never -coding: utf-8 -End: diff --git a/3party/freetype/ChangeLog.24 b/3party/freetype/ChangeLog.24 deleted file mode 100644 index df2119d8ec..0000000000 --- a/3party/freetype/ChangeLog.24 +++ /dev/null @@ -1,6360 +0,0 @@ -2013-05-08 Werner Lemberg - - * Version 2.4.12 released. - ========================== - - - Tag sources with `VER-2-4-12'. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.4.12. - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.4.11/2.4.12/, s/2411/2412/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 12. - - * builds/unix/configure.raw (version_info): Set to 16:1:10. - -2013-05-08 Werner Lemberg - - * docs/CHANGES: Updated. - -2013-05-08 Werner Lemberg - - * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Typo. - -2013-05-05 Werner Lemberg - - Synchronize `ftconfig.h'. - - * builds/unix/ftconfig.in: Updated. - -2013-05-05 Werner Lemberg - - Fix compilation with C++. - - * src/base/md5.c (body): Use proper cast. - -2013-05-05 Werner Lemberg - - Fix 64bit compilation issues. - - * include/freetype/config/ftconfig.h [FT_LONG64]: Typedef - `FT_Int64' here. - - * src/base/ftcalc.c: Remove typedef of `FT_Int64'. - (FT_DivFix): Fix cast. - * src/base/fttrigon.c: Remove typedef of `FT_Int64'. - -2013-05-05 Werner Lemberg - - [raster] Fix clang issues. - - Fix suggested by . - - * src/raster/ftraster.c (ULong): New typedef. - (SCALED): Add proper cast. - -2013-05-04 Werner Lemberg - - Fix clang fixes. - - * src/base/fttrigon.c (ft_trig_prenorm, FT_Vector_Rotate): Use - correct types. - - * src/cff/cf2intrp.c (cf2_interpT2CharString) : Force - unsigned for computations. - * src/cff/cffgload.c (cff_decoder_parse_charstrings): Ditto. - * src/cff/cffparse.c (cff_parse_integer): Ditto. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Ditto. - -2013-05-04 Werner Lemberg - - [cff] Make Adobe CFF engine work correctly on 64bit hosts. - - Reported by numerous people on the `freetype-devel' list. Without - this fix, glyphs aren't properly aligned on a common baseline. - - On 64bit systems, `FT_Pos' expands to `long int', having a width of - 64bit. `CF2_Fixed' expands to `int' which is normally 32bit wide on - 64bit hosts also. Wrong casts filled up the blues arrays with - incorrect values. Note that all blues values are accessed with the - `cf2_blueToFixed' macro which handles the 64bit to 32bit conversion. - - * src/cff/cf2ft.h (cf2_getBlueValues, cf2_getOtherBlues, - cf2_getFamilyBlues, cf2_getFamilyOtherBlues): Use `FT_Pos' for - `data', not `CF2_Fixed'. - * src/cff/cf2ft.c (cf2_getBlueValues, cf2_getOtherBlues, - cf2_getFamilyBlues, cf2_getFamilyOtherBlues): Updated. - * src/cff/cf2blues.c (cf2_blues_init): Updated. - -2013-05-04 Werner Lemberg - - More fixes for clang's `sanitize' feature. - - * src/base/ftcalc.c (FT_DivFix): Use unsigned values for - computations which use the left shift operator and convert to signed - as the last step. - * src/base/fttrigon.c (ft_trig_prenorm, FT_Vector_Rotate, - FT_Vector_Length, FT_Vector_Polarize): Ditto. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings): Simplify. - * src/cff/cffload.c (cff_subfont_load): Fix constant. - * src/cff/cffparse.c (cff_parse_integer, cff_parse_real, do_fixed, - cff_parse_fixed_dynamic): Use unsigned values for computations which - use the left shift operator and convert to signed as the last step. - - * src/cid/cidload.c (cid_get_offset): Ditto. - - * src/psaux/psconv.c (PS_Conv_ToFixed): Ditto. - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Ditto. - - * src/truetype/ttinterp.c (TT_MulFix14, TT_DotFix14): Ditto. - -2013-05-04 Werner Lemberg - - Fix errors reported by clang's `sanitize' feature. - - * include/freetype/internal/ftstream.h: Simplify and fix integer - extraction macros. - (FT_INT8_, FT_BYTE_I16, FT_BYTE_I32, FT_INT8_I16, FT_INT8_I32, - FT_INT8_I32, FT_INT8_U32): Removed. - (FT_PEEK_SHORT, FT_PEEK_LONG, FT_PEEK_OFF3, FT_PEEK_SHORT_LE, - FT_PEEK_LONG_LE, FT_PEEK_OFF3_LE): Use unsigned values for - computations and convert to signed as the last step. - - * src/cff/cf2fixed.h (cf2_intToFixed, cf2_fixedToInt, - cf2_fracToFixed): Avoid shifts of negative values. - (cf2_intToFrac, cf2_fixedToFrac, cf2_fixedTo26Dot6): Removed, - unused. - - * src/cff/cf2intrp.c (cf2_interpT2CharString) : Use unsigned values for computations and convert to signed - as the last step. - Use proper types in tracing messages. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings): Use unsigned - values for computation of operands and convert to signed as the last - step. - Use proper type in tracing message. - -2013-05-03 Werner Lemberg - - * src/cff/cf2blues.c: Remove dead code. - -2013-05-02 Chris Liddell - - * src/cff/cffgload.c: Include FT_CFF_DRIVER_H. - -2013-04-27 Werner Lemberg - - * docs/CHANGES: Updated. - * README: Improved. - -2013-04-13 Werner Lemberg - - [cff] Add a new Type 2 interpreter and hinter. - - This work, written by Dave Arnold and fully - integrated into FreeType by me, is a donation by Adobe in - collaboration with Google. It is vastly superior to the old CFF - engine, and it will replace it soon. Right now, it is still off by - default, and you have to explicitly select it using the new - `hinting-engine' property of the cff driver. - - For convenience, (most of) the new files are committed separately. - - * include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro. - * include/freetype/ftcffdrv.h: New file to access CFF driver - properties. - * include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error - code. - * include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints', - and `cf2interp'. - - * src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'. - * src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine' - and `no_stem_darkening'. - * src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'. - - * src/cff/cff.c: Include new files. - * src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle - `hinting-engine' and `no-stem-darkening' properties (only the Adobe - engine listens to them). - * src/cff/cffgload.c: Include `cf2ft.h'. - (cff_decoder_prepare): Initialize `current_subfont'. - (cff_build_add_point): Handle Adobe engine which uses 16.16 - coordinates. - (cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING - separately. - Choose rendering engine based on `hinting_engine' property. - * src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe - engine. - * src/cff/cffobjs.c: Include FT_CFF_DRIVER_H. - (cff_driver_init): Set default property values. - - * src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files. - - * src/cff/cf2*.*: New files, containing the Adobe engine. - -2013-04-12 Werner Lemberg - - [cff] Minor code administration issues. - - * src/cff/cffgload.c (check_points): Rename to... - (cff_check_points): ...this and make it FT_LOCAL. - (cff_builder_add_point, cff_builder_add_point1, - cff_builder_start_point, cff_builder_close_contour, - cff_lookup_glyph_by_stdcharcode, cff_get_glyph_data, - cff_free_glyph_data): Make them FT_LOCAL. - - * src/cff/cffgload.h: Updated. - -2013-04-12 Werner Lemberg - - Add output bitmap checksums. - - Use `FT2_DEBUG=bitmap:3' for tracing. - - * src/base/md5.c, src/base/md5.h: New files, taken from - - http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 - - * include/freetype/internal/fttrace.h: Add `bitmap'. - - * src/base/ftobjs.c [FT_DEBUG_LEVEL_TRACE]: Include `md5.c' - - (FT_Render_Glyph_Internal) [FT_DEBUG_LEVEL_TRACE]: For tracing, - convert resulting bitmap to a uniform format and compute a checksum. - Use `bitmap' category for the tracing message. - - * src/base/rules.mk (BASE_H): Updated. - - * docs/LICENSE.TXT: Updated. - -2013-04-12 Werner Lemberg - - [cff] Add framework for CFF properties. - - * include/freetype/internal/ftserv.h (FT_DEFINE_SERVICEDESCREC7): - New macro. - - * src/cff/cffdrivr.c: Include FT_SERVICE_PROPERTIES_H. - (cff_property_set, cff_property_get): New functions, still empty. - Define `cff_service_properties' service. - Update `cff_services'. - - * src/cff/cffpic.h: Include FT_SERVICE_PROPERTIES_H. - (CFF_SERVICE_PROPERTIES_GET): New macro. - (CffModulePIC): Add `cff_service_properties'. - -2013-04-03 Werner Lemberg - - [bdf] Fix Savannah bug #38589. - - * src/bdf/bdflib.c (_bdf_readstream): Thinko. - -2013-03-31 Werner Lemberg - - * configure: Use egrep, not grep. - - Problem reported Mojca Miklavec . - -2013-03-29 Werner Lemberg - - * include/freetype/ftlcdfil.h: Add description of color filtering. - - Based on a contribution from Antti S. Lankila - (Savannah bug #38607). - -2013-03-23 Werner Lemberg - - [autofit] Minor. - - * src/autofit/afmodule.c (af_property_set): Typo. - (af_autofitter_init, af_autofitter_done): Use cast. - -2013-03-21 Werner Lemberg - - * configure: Automatically test for `gmake' also. - - Suggested by Mojca Miklavec . - -2013-03-21 Peter Breitenlohner - - Respect CONFIG_SHELL from the environment. - - Some large packages using FreeType have to use a broken (deficient) - /bin/sh. The configure scripts (as generated by Autoconf) are - clever enough to find a better shell and put that one into the - environment variable CONFIG_SHELL. If that environment variable is - already set the script skips the test and assumes to be already - running under a good shell. - - * builds/unix/detect.mk: Honour CONFIG_SHELL. - * builds/unix/unix-def.in (SHELL): Define. - -2013-03-21 Werner Lemberg - - Fix Savannah patch #7971. - - * configure: Handle MAKE environment variable also. - -2013-03-17 Werner Lemberg - - Fix Savannah bug #38538. - - * builds/amiga/src/base/ftdebug.c, builds/win32/ftdebug.c, - builds/wince/ftdebug.c (FT_Throw): Add function. - -2013-03-17 Werner Lemberg - - [raster] Remove dead code. - - * src/raster/rastpic.c (ft_raster1_renderer_class_pic_init) - src/smooth/ftspic.c (ft_smooth_renderer_class_pic_init): Do it. - -2013-03-17 Werner Lemberg - - * src/pshinter/pshpic.h (GET_PIC): Use correct container. - -2013-03-15 Werner Lemberg - - * include/freetype/ftmoderr.h: Fix commit from 2013-03-11. - - The previous version was not backwards compatible. Reported by - Behdad. - -2013-03-14 Werner Lemberg - - */*: Use FT_ERR_EQ, FT_ERR_NEQ, and FT_ERR where appropriate. - - FT_Err_XXX and friends are no longer directly used in the source - code. - -2013-03-14 Werner Lemberg - - New error management macros. - - * include/freetype/fterrors.h (FT_ERR_XCAT, FT_ERR_CAT): Move to... - * include/freetype/fttypes.h: ... this file. - (FT_ERR, FT_ERR_EQ, FT_ERR_NEQ, FT_MODERR_EQ, FT_MODERR_NEQ): New - macros. - - * include/freetype/freetype.h: Updated. - -2013-03-14 Werner Lemberg - - */*: Use FT_Err_Ok only. - - This is a purely mechanical conversion. - -2013-03-14 Werner Lemberg - - */*: Use `FT_THROW'. - - This is essentially a mechanical conversion, adding inclusion of - `FT_INTERNAL_DEBUG_H' where necessary, and providing the macros for - stand-alone compiling modes of the rasterizer modules. - - To convert the remaining occurrences of FT_Err_XXX and friends it is - necessary to rewrite the code. Note, however, that it doesn't harm - if some cases are not handled since FT_THROW is a no-op. - -2013-03-13 Werner Lemberg - - Introduce `FT_THROW' macro. - - The idea is to replace code like - - return FT_Err_Foo_Bar; - - or - - return CFF_Err_Foo_Bar; - - with - - return FT_THROW( Foo_Bar ); - - The FT_THROW macro has two functions: - - . It hides the module specific prefix. - - . In debug mode, it calls the empty function `FT_Throw' which can - be thus used to set a breakpoint. - - * include/freetype/internal/ftdebug.h (FT_THROW): New macro. - (FT_Throw): New prototype. - * src/base/ftdebug.c (FT_Throw): New function. - -2013-03-12 Werner Lemberg - - Remove `FT_KEEP_ERR_PREFIX'. - - The idea is to always have FT_ERR_PREFIX available internally. - - * include/freetype/fterrors.h: Use FT2_BUILD_LIBRARY to guard - undefinition of FT_ERR_PREFIX - - * src/gxvalid/gxverror.h, src/otvalid/otverror.h, - src/sfnt/sferrors.h: Updated. - -2013-03-11 Werner Lemberg - - [gxvalid] Fix module error. - - * src/gxvalid/gxverror.h (FT_ERR_BASE): Define as - FT_Mod_Err_GXvalid. - * include/freetype/ftmoderr.h: Add module error for `GXvalid'. - -2013-03-11 Werner Lemberg - - Always use module related error codes. - - * src/cff/cffobjs.c (cff_face_init), src/type1/t1objs.c - (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Use - `FT_ERROR_BASE'. - - * src/type1/t1load.c (parse_encoding): Use - T1_Err_Unknown_File_Format. - -2013-03-08 Werner Lemberg - - [cff] Set `linear{Hori,Vert}Advance' for embedded bitmaps also. - - Problem reported by Khaled Hosny . - - * src/cff/cffgload.c (cff_slot_load): Implement it. - -2013-02-23 Alexei Podtelezhnikov - - [base] Fix commit ab02d9e8. - - * src/base/ftbbox.c (BBox_Cubic_Check): Change scaling to msb of 22. - -2013-02-19 Alexei Podtelezhnikov - - [base] New bisecting BBox_Cubic_Check (disabled). - - * src/base/ftbbox.c (BBox_Cubic_Check): New bisecting algorithm - for extremum search built around simple condition that defines - which half contains the extremum. - -2013-02-18 Alexei Podtelezhnikov - - [tools] Update BBox testing tool. - - * src/tools/test_bbox.c: Add another cubic outline with exact BBox. - (REPEAT): Increase the number of benchmarking cycles. - (profile_outline): Tweak output formatting. - -2013-02-02 Werner Lemberg - - Fix Savannah bug #38235. - - * builds/unix/configure.raw: Don't generate `freetype-config' and - `freetype.pc'. - - * builds/unix/unix-def.in (FT2_EXTRA_LIBS, LIBBZ2, LIBZ, - build_libtool_libs, ft_version): New variables to be substituted. - (freetype-config, freetype.pc): New rules to generate those files. - - * builds/unix/freetype-config.in: Remove code for handling `rpath'. - The use of $rpath has been accidentally removed in a patch from - 2009-12-22, and apparently noone has missed it since. - Use `%' instead of `@' as a variable substitution marker. - Use quotes. - - * builds/unix/freetype.in: Use `%' instead of `@' as a variable - substitution marker. - Use quotes. - -2013-02-07 Werner Lemberg - - * src/truetype/ttobjs.c (tt_size_run_prep): Reset more GS variables. - - BTW, Greg agrees that the OpenType specification is missing the list - of GS variables which will always be reset to the default values - after the `prep' table has been executed. - -2013-02-06 Werner Lemberg - - * src/truetype/ttobjs.c (tt_size_run_prep): Reset reference points. - - Up to now, we simply took a snapshot of the Graphics State after the - `prep' table has been executed, and right before a glyph's bytecode - was run it got reloaded. However, as Greg Hitchcock has told us in - private communication, reference points get reset to zero in the MS - rasterizer and we follow in due course. While reasonable, this is - undocumented behaviour. - - Most notably, this fixes the rendering of Arial's `x' glyph in - subpixel hinting mode. - -2013-02-05 Werner Lemberg - - [truetype] A better fix for Savannah bug #38211. - - * src/truetype/ttinterp.c (Ins_IP): Implement identical behaviour to - MS rasterizer if rp1 == rp2 (confirmed by Greg Hitchcock). - -2013-02-01 Alexei Podtelezhnikov - - [pcf] Streamline parsing of PCF encoding table. - - * src/pcf/pcfread.c (pcf_get_encodings): Use simpler double for-loop. - Reallocate array instead of using temporary storage. - -2013-02-01 Werner Lemberg - - Fix Savannah bug #38227. - - * builds/unix/freetype-config.in: Set LC_ALL. - -2013-02-01 Werner Lemberg - - Fix Savannah bug #38221. - - This complements commit 83c0ebab. - - * src/base/ftcalc.c (FT_MulDiv_No_Round): Don't enclose with - `TT_USE_BYTECODE_INTERPRETER'. - -2013-02-01 Werner Lemberg - - [truetype] Fix Savannah bug #38211. - - * src/truetype/ttinterp.c (Ins_IP): Make FreeType behave identical - to other interpreters if rp1 == rp2 (which is invalid). - -2013-01-28 Alexei Podtelezhnikov - - [base] Small optimization of BBox calculation. - - * src/base/ftbbox.c (BBox_Cubic_Check): Use FT_MSB function in - scaling algorithm. - -2013-01-26 Infinality - - [truetype] Minor formatting fix. - - * src/truetype/ttinterp.c: Updated. - (DO_RS): Fix indentation. - -2013-01-26 Infinality - - [truetype] Fix rasterizer_version logic in sph. - - * src/truetype/ttsubpix.c: Updated. - (ALWAYS_SKIP_DELTAP_Rules): Remove rule for Trebuchet MS. - (sph_set_tweaks): Fix `rasterizer_version' logic. - -2013-01-26 Infinality - - [truetype] Align more to ClearType whitepaper for sph. - - * include/freetype/internal/tttypes.h (TT_FaceRec): Add flags - for detected opcode patterns and compatibility mode. - - * src/truetype/ttgload.c (tt_loader_init): Complete conditional. - - * src/truetype/ttinterp.c: Updated. - Remove SPH_DEBUG and replace with FT_TRACE7. - (DO_RS): More conditions. - (Ins_FDEF): Add more opcode detection patterns. - More specific conditions when flagging an fdef. - Make compatibility mode only turn on when delta fdefs are found. - (Ins_CALL, Ins_LOOPCALL): Set flags for currently executed fdef. - (Ins_SHPIX): Remove logic to handle ttfautohinted fonts. - Simplify conditionals where possible. - Use `&' instead of `%' operator for dumb compilers. - (Ins_MIAP): Adjust twilight zone conditional. - Ensure `ignore_x_mode' is on when testing sph conditionals. - (Ins_MIRP): Ensure `ignore_x_mode' is on when testing sph - conditionals. - Do cvt cutin always when `ignore_x_mode' is active. - Remove test for ttfautohinted fonts. - (Ins_DELTAP): Ensure `ignore_x_mode' is on when testing sph - conditionals. - Do cvt cutin always when `ignore_x_mode' is active. - Remove test for ttfautohinted fonts. - Use `&' instead of `%' operator for dumb compilers. - (Ins_GETINFO): Remove SPH_DEBUG and replace with FT_TRACE7. - - * src/truetype/ttinterp.h: Updated. - (TT_ExecContextRec): Remove compatibility_mode variable. - Add variable to indicate when executing in special fdefs for sph. - - * src/truetype/ttobjs.h: Updated. - (TT_DefRecord): Add flags to identify special fdefs for sph. - (TT_SizeRec): Remove unnecessary ttfautohinted variable. - - * src/truetype/ttsubpix.c: Updated. - (COMPATIBILITY_MODE_Rules): Remove all. Auto-detected now. - (PIXEL_HINTING_Rules): Remove all. Unnecessary after fixes. - (SKIP_NONPIXEL_Y_MOVES_Rules): Remove Ubuntu. - (SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions): Add Arial Bold `N'. - (SKIP_OFFPIXEL_Y_MOVES_Rules): Remove all. Happens automatically - now. - (ROUND_NONPIXEL_Y_MOVES_Rules): Remove Ubuntu. - (ROUND_NONPIXEL_Y_MOVES_Rules_Exceptions): Remove all. - (NORMAL_ROUND_Rules): Remove Verdana. - (NO_DELTAP_AFTER_IUP_Rules): Remove all. - (sph_set_tweaks): Performance fix. Don't run prep always. - Adjust conditional for sph_compatibility_mode. - - * src/truetype/ttsubpix.h: Add new fdef flags for sph. - -2013-01-23 Alexei Podtelezhnikov - - [base] Fix broken emboldening at small sizes. - - * src/base/ftoutln.c (FT_Outline_EmboldenXY): Do not attempt to - normalize zero-length vectors. - -2013-01-25 Werner Lemberg - - Fix Savannah bug #38167. - - This fixes commit 83c0ebab from 2012-06-27. - - * src/truetype/ttinterp.h: - s/TT_CONFIG_OPTION_BYTECODE_INTERPRETER/TT_USE_BYTECODE_INTERPRETER/. - -2013-01-25 Xi Wang - - [sfnt] Fix broken pointer overflow checks. - - Many compilers such as gcc and clang optimize away pointer overflow - checks `p + n < p', because pointer overflow is undefined behavior. - Use a safe form `n > p_limit - p' instead. - - Also avoid possible integer overflow issues, for example, using - `num_glyphs > ( p_limit - p ) / 2' rather than `num_glyphs * 2' - given a large `num_glyphs'. - - * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Implement it. - -2013-01-25 Werner Lemberg - - [base] Fix `make multi'. - - * src/base/ftoutln.c, src/base/fttrigon.c: Include - FT_INTERNAL_CALC_H. - -2013-01-25 David 'Digit' Turner - - [truetype] Fix C++ compilation. - - * src/truetype/ttsubpix.h: Updated. - (SPH_X_SCALING_RULES_SIZE): Moved and renamed to... - * src/truetype/ttsubpix.c (X_SCALING_RULES_SIZE): This. - (sph_X_SCALING_Rules): Removed. - (scale_test_tweak): Make function static. - (sph_test_tweak_x_scaling): New function. - - * src/truetype/ttgload.c (TT_Process_Simple_Glyph): Updated. - -2013-01-23 Werner Lemberg - - [base] Make `FT_Hypot' really internal. - - * include/freetype/fttrigon.h (FT_Hypot): Move to... - * include/freetype/internal/ftcalc.h: This file. - - * src/base/fttrigon.c (FT_Hypot): Move to... - * src/base/ftcalc.c: This file. - Include FT_TRIGONOMETRY_H. - - * src/truetype/ttgload.c: Don't include FT_TRIGONOMETRY_H. - -2013-01-23 Werner Lemberg - - [truetype] Revert change from 2013-01-22. - - FreeType's `height' value is the baseline-to-baseline distance... - - * src/truetype/ttobjs.c (tt_size_reset): Undo. - -2013-01-23 Alexei Podtelezhnikov - - [base, truetype] New internal `FT_Hypot' function. - - * include/freetype/fttrigon.h (FT_Hypot): Declare it. - * src/base/fttrigon.c (FT_Hypot): Define it. - * src/truetype/ttgload.c (TT_Process_Composite_Component): Use it - instead of explicit expressions. - * src/truetype/ttinterp.c (Current_Ratio, Normalize): Use it instead - of TT_VecLen. - (TT_VecLen): Removed. - -2013-01-23 Alexei Podtelezhnikov - - [base] Fix integer overflow. - - * src/base/ftoutln.c (FT_Outline_EmboldenXY): Normalize incoming and - outgoing vectors and use fixed point arithmetic. - -2013-01-23 Alexei Podtelezhnikov - - [base] Fix integer overflow. - - * src/base/ftoutln.c (FT_Outline_Get_Orientation): Scale the - coordinates down to avoid overflow. - -2013-01-23 Alexei Podtelezhnikov - - [base] Split out MSB function. - - * src/base/fttrigon.c (ft_trig_prenorm): Borrow from here. - * include/freetype/internal/ftcalc.h (FT_MSB): Declare here. - * src/base/ftcalc.c (FT_MSB): Define here. - -2013-01-22 Werner Lemberg - - [truetype] Fix font height. - - * src/truetype/ttobjs.c (tt_size_reset): The Windows rendering - engine uses rounded values of the ascender and descender to compute - the TrueType font height. - -2013-01-16 Behdad Esfahbod - - [sfnt] Fix optimized sbit loader. - - It was not taking bit_depth into consideration when blitting! - - * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_byte_aligned, - * tt_sbit_decoder_load_bit_aligned): Handle bit - depth. - -2013-01-16 David 'Digit' Turner - - [truetype] Improve sub-pixel code. - - This patches fixes many issues with the ttsubpix implementation. - - 1. Data tables are defined, instead of declared, in the header, and - thus copied into each source file that includes it. - - 2. These tables were defined as global, mutable, visible variables, - and thus costing private RAM to every process that loads the - library (> 50 KB / process, this is huge!). - - Additionally, this also made the library export the symbols - completely needlessly. - - 3. Missing `sph_' and `SPH_' prefixes to some of the definitions. - - Note that this doesn't try to fix the incredibly inefficient storage - format for the data tables used by the code. This one will require - another pass in the future. - - * src/truetype/ttinterp.h (MAX_NAME_SIZE, MAX_CLASS_MEMBERS): - Renamed to... - (SPH_MAX_NAME_SIZE, SPH_MAX_CLASS_MEMBERS): This. - Update all users. - - (SPH_TweakRule, SPH_ScaleRule): Decorate with `const' where - appropriate. - - (Font_Class): Rename to... - (SPH_Font_Class): This. Decorate with `const' where appropriate. - - * src/truetype/ttsubpix.h (scale_test_tweak, sph_test_tweak): - Decorate arguments with `const' where appropriate. - - Move font tweaking tables to... - - * src/truetype/ttsubpic.c: This file and decorate them with `static' - and `const' where appropriate. - - (X_SCALING_Rules, X_SCALING_RULES_SIZE): Renamed to... - (spu_X_SCALING_Rules, SPH_X_SCALING_RULES_SIZE): This. - Update all users. - -2013-01-12 Alexei Podtelezhnikov - - [truetype] Improve accuracy of normalization of short vectors. - - Unit vector components are stored as 2.14 fixed-point numbers. In - order to calculate all 14 bits accurately, a short vector to be - normalized has to be upscaled to at least 14 bits before its length - is calculated. This has been safe since accurate CORDIC algorithms - were adopted. - - * src/truetype/ttinterp.c (Normalize): Scale short vectors by 0x4000. - -2013-01-12 Alexei Podtelezhnikov - - [truetype] Kill very old vector normalization hacks. - - Back in the days, vector length calculations were not very accurate - and the vector normalization function, Normalize, had to meticulously - correct the errors for long vectors [commit b7ef2b096867]. It was no - longer necessary after accurate CORDIC algorithms were adopted, but - the code remained. It is time to kill it. - - * src/truetype/ttinterp.c (Normalize): Remove error compensation. - (TT_VecLen): Remove any mention of old less accurate implementation. - -2013-01-11 Werner Lemberg - - Disable FT_CONFIG_OPTION_OLD_INTERNALS. - - After the next release we are going to remove the code completely. - - * devel/ftoption.h, include/freetype/config/ftoption.h - (FT_CONFIG_OPTION_OLD_INTERNALS): Comment out. - * docs/CHANGES: Document it. - -2013-01-10 Alexei Podtelezhnikov - - [base] Update the overflow protection bit. - - The recent optimizations of CORDIC iterations drastically reduce the - expansion factor. Vector components with MSB of 29 are now safe - from overflow. - - * src/base/fttrigon.c (FT_TRIG_SAFE_MSB): New macro. - (ft_trig_prenorm): Use it and remove dead code. - -2013-01-09 Alexei Podtelezhnikov - - [base, pshinter] Use FT_ABS, FT_MIN, and FT_MAX for readability. - - * src/base/ftbbox.c: Updated. - * src/base/ftobjs.c: Updated. - * src/base/fttrigon.c: Updated. - * src/pshinter/pshalgo.c: Updated. - * src/pshinter/pshrec.c: Updated. - -2013-01-08 Alexei Podtelezhnikov - - [base] Clean up trigonometric core. - - * src/base/fttrigon.c: Document the algorithm in a large comment. - (FT_TRIG_COSCALE): Remove macro. - (FT_Tan: Use `FT_TRIG_SCALE' instead. - (FT_Cos, FT_Vector_Unit): Ditto and round the return values. - -2013-01-02 Alexei Podtelezhnikov - - [base] Use rounding in CORDIC iterations. - - * src/base/fttrigon.c (ft_trig_pseudo_rotate, - ft_trig_pseudo_polarize): Improve accuracy by rounding. - -2013-01-02 Alexei Podtelezhnikov - - [base] Reduce trigonometric algorithms. - - After we get within 45 degrees by means of true 90-degree rotations, - we can remove initial 45-degree CORDIC iteration and start from - atan(1/2) pseudorotation, reducing expansion factor thereby. - - * src/base/fttrigon.c (FT_TRIG_SCALE, FT_TRIG_COSCALE): Update macros. - (ft_trig_pseudo_rotate, ft_trig_pseudo_polarize): Update. - - * src/tools/cordic.py: Bring up to date with trigonometric core. - - * docs/CHANGES: Old typo. - -2013-01-02 Alexei Podtelezhnikov - - * src/pshinter/pshalgo.h: Remove unused code. - -2012-12-27 Werner Lemberg - - * src/truetype/ttgload.c (tt_loader_init): Add more tracing. - -2012-12-23 Werner Lemberg - - [type1] Fix handling of /FontBBox in MM fonts. - Problem reported by Del Merritt - - If we have - - /FontBBox { { 11 12 13 14 15 16 17 18 } - { 21 22 23 24 25 26 27 28 } - { 31 32 33 34 35 36 37 38 } - { 41 42 43 44 45 46 47 48 } } - - in the /Blend dictionary, then the first BBox is { 11 21 31 41 }, - the second { 12 22 32 42 }, etc. - - * include/freetype/internal/psaux.h (T1_FieldType): Add - `T1_FIELD_TYPE_MM_BBOX' (for temporary use). - - * src/psaux/psobjs.c (ps_parser_load_field) : - Implement it. - -2012-12-21 Alexei Podtelezhnikov - - * src/tools/cordic.py: Bring up to date with trigonometric core. - -2012-12-21 Werner Lemberg - - Check parameters of `FT_Outline_New'. - Problem reported by Robin Watts . - - * src/base/ftoutln.c (FT_Outline_New_Internal): Ensure that - `numContours' and `numPoints' fit into FT_Outline's `n_points' and - `n_contours', respectively. - -2012-12-20 Werner Lemberg - - * Version 2.4.11 released. - ========================== - - - Tag sources with `VER-2-4-11'. - - * docs/CHANGES, docs/release: Updated. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.4.11. - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.4.10/2.4.11/, s/2410/2411/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 11. - - * builds/unix/configure.raw (version_info): Set to 16:0:10. - - * builds/toplevel.mk (dist): Don't include `.mailmap'. - -2012-12-20 Alexei Podtelezhnikov - - [base] Improve trigonometric core. - - FreeType used to rely on a 24-step iteration CORDIC algorithm to - calculate trigonometric functions and rotate vectors. It turns out - that once the vector is in the right half-plane, the initial rotation - by 63 degrees is not necessary. The algorithm is perfectly capable - to converge to any angle starting from the second 45 degree rotation. - This patch removes the first rotation and makes it a 23-step CORDIC - algorithm. - - * src/base/fttrigon.c (FT_TRIG_SCALE, FT_TRIG_COSCALE): Update macro - values. - (ft_trig_pseudo_rotate, ft_trig_pseudo_polarize): Remove initial - rotation. - -2012-12-19 Werner Lemberg - - * src/base/ftobjs.c (ft_property_do): Fix compiler warning. - -2012-12-19 Alexei Podtelezhnikov - - * src/base/ftrfork.c (FT_Raccess_Guess): Switch to FT_Int counters. - -2012-12-19 Alexei Podtelezhnikov - - [base] Clean up trigonometric core. - - * src/base/fttrrigon.c (ft_trig_pseudo_polarize): Align algorithm - with `ft_trig_pseudo_rotate'. - -2012-12-18 Infinality - - [truetype] Minor performance enhancement. - - * src/truetype/ttgload.c: (TT_Process_Simple_Glyph): Use FT_MulFix - instead of FT_MulDiv. - -2012-12-17 Infinality - - [truetype] Remove unusued code and variables. - - * src/truetype/ttinterp.c: Updated. - (Ins_FDEF): Remove opcode patterns that are not being used. - -2012-12-16 Werner Lemberg - - Various compiler warning fixes. - - * include/freetype/internal/ftserv.h (FT_SERVICE_UNAVAILABLE): Use - `logical not' operator instead of negation. The idea is that `~' - returns exactly the data type enforced by the cast to a pointer (be - it 32bit or 64bit or whatever), while a negative integer has not - this flexibility. - * src/cache/ftccmap.c (FTC_CMAP_UNKNOWN): Ditto. - * src/truetype/ttgxvar.c (ALL_POINTS, TT_Get_MM_Var): Ditto. - * src/type/t1load.c (T1_Get_MM_Var): Ditto. - (parse_blend_axis_types): Use cast. - * src/bdf/bdflib.c (_bdf_readstream): Use cast. - -2012-12-16 Infinality - - [truetype] Remove unusued code and variables. Add minor fixes. - - * src/truetype/ttsubpix.h: Updated. - (SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions): Add Trebuchet MS. - (ALLOW_X_DMOVEX_Rules): Remove Arial characters. - (ALLOW_X_DMOVE_Rules): Remove Arial characters. - (RASTERIZER_35_Rules): Verdana no longer needs to be here. - (SKIP_IUP_Rules): Formatting fix. - (DELTAP_SKIP_EXAGGERATED_VALUES_Rules): Remove Segoe UI. - (COMPATIBLE_WIDTHS_Rules): Add Monaco and Trebuchet MS. - (X_SCALING_Rules): Add misc. corrective fixes. - - * src/truetype/ttgload.c: (TT_Process_Simple_Glyph): Adjust correction - factor for emboldening during scaling. - - * src/truetype/ttinterp.h: Updated. - (TT_ExecContextRec): Remove unused variables. - - * src/truetype/ttobjs.h: Updated. - (TT_SizeRec): Add ttfautohinted variable. - - * src/truetype/ttinterp.c: Updated. - (Ins_FDEF): Rework code to fix bugs and add more detection. - (Ins_CALL): Remove unused code. - (Ins_LOOPCALL): Remove unused code. - (TT_RunIns): Remove unusued code. - (Ins_SHPIX): Add logic to handle ttfautohinted fonts. - (Ins_MIRP): Don't round x in cut-in calculation. Add logic to handle - ttfautohinted fonts. - -2012-12-16 Werner Lemberg - - [sfnt] Fix Savannah bug #37936. - - * src/sfnt/ttload.c (tt_face_load_gasp): Avoid memory leak. - -2012-12-15 Alexei Podtelezhnikov - - [base] Fix 11-year old bug. - - Since the initial commit (ebe85f59) the value of FT_TRIG_SCALE has - always been slightly less than the correct value, which has been - given in the comment as a hexadecimal. As a result, vector lengths - were underestimated and rotated vectors were shortened. - - * src/base/fttrigon.c (FT_TRIG_SCALE): Fix macro value. - -2012-12-15 Werner Lemberg - - [bdf] Fix Savannah bug #37907. - - * src/bdf/bdflib.c (_bdf_parse_glyphs) : Normalize - negative second parameter of `ENCODING' field also. - -2012-12-15 Werner Lemberg - - [bdf] Fix Savannah bug #37906. - - * src/bdf/bdflib.c (_bdf_parse_glyphs) : Use correct array - size for checking `glyph_enc'. - -2012-12-15 Werner Lemberg - - [bdf] Fix Savannah bug #37905. - - * src/bdf/bdflib.c (_bdf_parse_start) : Reset - `props_size' to zero in case of allocation error; this value gets - used in a loop in `bdf_free_font'. - -2012-12-10 Alexei Podtelezhnikov - - [truetype] Scale F_dot_P down. - - The dot product between freeVector and projVector or cosine of - the angle between these FT_F2Dot14 unit vectors used to be scaled up - by 4 and routinely occupied 32 bits in an FT_Long field F_dot_P. - This patch scales the value down by 2^14 instead, which simplifies - its use throughout the bytecode interpreter. - - This does not lead to the loss of precision because the lower bits - are unreliable anyway. Consider two unit vectors (1,0) and (.6,.8) - for which the true value of F_dot_P is .6 * 0x40000000 = 0x26666666. - These vectors are stored as (0x4000,0) and (0x2666,0x3333) after - rounding and F_dot_P is assigned 0x26660000. The lower bits were - already lost while rounding the unit vector components. - - Besides code simplification, this change can lead to better - performance when FT_MulDiv with the scaled-down F_dot_P is less - likely to use the costly 64-bit path. We are not changing the type - of F_dot_P to FT_F2Dot14 at this point. - - * src/truetype/ttinterp.c (Compute_Funcs): Scale F_dot_P down by 14 - bits and modify its use accordingly. - (Direct_Move, Direct_Move_Orig, Compute_Point_Displacement): Modify - the use of F_dot_P field. - * src/truetype/ttobjs.c (tt_size_run_fpgm): Change arbitrary - assignment of F_dot_P to its theoretical maximum in case we decide - to scale back its type later. - -2012-12-09 Johnson Y. Yan - - [type1] Another fix for 2012-09-17 commit. - - * src/type1/t1parse.c (T1_Get_Private_Dict) : Correctly set - `limit' value. - -2012-12-06 Alexei Podtelezhnikov - - [truetype] Tweak the previous commit. - - * src/truetype/ttinterp.c (Current_Ratio): Put unit vector - components as the second TT_MulFix14 arguments. This is required - on 16-bit systems. - -2012-12-06 Alexei Podtelezhnikov - - [truetype] Microoptimizations in bytecode interpreter. - - * src/truetype/ttinterp.c (TT_DivFix14): New macro. - (Normalize): Use it here. - (Current_Ratio): Use TT_MulFix14 instead of FT_MulDiv. - (Ins_SHPIX): Cancel out two TT_MulFix14 calls. - -2012-12-05 Alexei Podtelezhnikov - - [truetype] Cosmetic improvement in bytecode interpreter. - - * src/truetype/ttinterp.c: Use explicit calls to FT_MulDiv, - FT_MulFix, and FT_DivFix instead of macros. - -2012-12-03 John Tytgat - - [pshinter] Clamp BlueScale value. - - This is Savannah bug #37856. - - * src/pshinter/pshglob.c (psh_calc_max_height): New function. - (psh_globals_new): Use it to limit BlueScale value to - `1 / max_of_blue_zone_heights'. - -2012-12-01 Alexei Podtelezhnikov - - [truetype, type1] Revise the use of FT_MulDiv. - - * src/truetype/ttgxvar.c: Updated. - * src/truetype/ttobjs.c: Updated. - * src/type1/t1load.c: Updated. - -2012-11-30 Werner Lemberg - - [configure] Preserve customized `ftoption.h'. - - Problem reported by Del Merritt . - - * builds/unix/configure.raw : Don't - remove existing FreeType configuration files. - -2012-11-29 John Tytgat - - [type1] Fix Savannah bug #37831. - - The bug report also contains a patch. - - * src/type1/t1parse.c (T1_Get_Private_Dict) : Really fix - change from 2012-09-17. - -2012-11-28 Alexei Podtelezhnikov - - [truetype] Fix formatting and typo. - -2012-11-27 Alexei Podtelezhnikov - - [cid, type1, type42] Clean up units_per_EM calculations. - - * src/cid/cidload.c (cid_parse_font_matrix): Updated. - * src/type1/t1load.c (t1_parse_font_matrix): Updated. - * src/type42/t42parse.c (t42_parse_font_matrix): Updated. - -2012-11-27 Alexei Podtelezhnikov - - [ftstroke] Minor improvement. - - * src/base/ftstroke.c: Replace nested FT_DivFix and FT_MulFix with - FT_MulDiv. - -2012-11-17 Werner Lemberg - - * src/base/fttrigon.c (ft_trig_downscale): Make 64bit version work. - -2012-11-15 Alexei Podtelezhnikov - - [base] Fix integer overflows in dd5718c7d67a. - - * src/base/ftoutln.c (FT_Outline_EmboldenXY): Use FT_MulDiv. - -2012-11-15 Werner Lemberg - - [autofit] Trace stem widths. - - * src/autofit/aflatin.c (af_latin_metrics_init_widths): Add some - FT_TRACE calls. - -2012-11-13 Werner Lemberg - - [cff] Add support for OpenType Collections (OTC). - - * src/cff/cffload.c (cff_font_load): Separate subfont and face - index handling to load both pure CFFs with multiple subfonts and - OTCs (with multiple faces where each face holds exactly one - subfont). - * src/cff/cffobjs.c (cff_face_init): Updated. - -2012-11-12 Werner Lemberg - - [autofit] Minor improvement. - - * src/autofit/aflatin.c (af_latin_hints_compute_blue_edges): Fix - loop. - -2012-11-10 Werner Lemberg - - [autofit] Improve tracing. - - * src/autofit/aflatin.c (af_latin_hint_edges) - [FT_DEBUG_LEVEL_TRACE]: Count number of actions and emit something - if there weren't any. - -2012-11-04 Alexei Podtelezhnikov - - [base] Fortify emboldening code against egregious distortions. - - * src/base/ftoutln.c (FT_Outline_EmboldenXY): Threshold emboldening - strength when it leads to segment collapse. - -2012-11-03 Alexei Podtelezhnikov - - [base] Clean up emboldening code and improve comments there. - - * src/base/ftoutln.c (FT_Outline_EmboldenXY): Replace sequential - calls to FT_MulFix and FT_DivFix with FT_MulDiv. - Mention that bisectors are used to figure out the shift direction. - -2012-10-24 Werner Lemberg - - [autofit] Add standard character to `AF_ScriptClassRec' structure. - - * src/autofit/aftypes.h (AF_ScriptClassRec): Add `standard_char' - member. - (AF_DEFINE_SCRIPT_CLASS): Updated. - - * src/autofit/aflatin.c (af_latin_metrics_init_widths): Use it. - (af_latin_metrics_init, af_latin_script_class): Updated. - - * src/autofit/aflatin.c (af_latin2_metrics_init_widths): Use it. - (af_latin2_metrics_init, af_latin2_script_class): Updated. - - * src/autofit/afcjk.c (af_cjk_metrics_init_widths): Use it. - (af_cjk_metrics_init, af_cjk_script_class): Updated. - - * src/autofit/afindic.c (af_indic_metrics_init, - af_indic_script_class): Updated. - - * src/autofit/afcjk.h, src/autofit/aflatin.h: Updated. - - * src/autofit/afdummy.c: Updated. - -2012-10-24 Werner Lemberg - - [autofit] Only use Unicode CMap. - - * src/autofit/aflatin.c (af_latin_metrics_init): Implement it, to be - in sync with `af_face_globals_compute_script_coverage'. - -2012-10-21 Werner Lemberg - - [psaux] Improve parsing of invalid numbers. - - * src/psaux/psconv.c (PS_Conv_Strtol): Always parse complete number, - even in case of overflow. - (PS_Conv_ToInt): Only increase cursor if parsing was successful. - (PS_Conv_ToFixed): Ditto. - Trace underflow and data error. - -2012-10-21 Werner Lemberg - - [smooth] Improve tracing. - - * src/smooth/ftgrays.c (gray_sweep): Trace last sweep line of - current band also. - -2012-10-20 Alexei Podtelezhnikov - - [truetype] Cheaper way to threshold angles between vectors. - - * src/truetype/ttinterp.c (Ins_ISECT): Thresholding tangent is a lot - cheaper than thresholding sine. - -2012-10-20 Werner Lemberg - - [cff] Improve parsing of invalid real numbers. - - * src/cff/cffparse.c (cff_parse_real): Always parse complete number, - even in case of overflow or underflow. - Also trace one more underflow. - -2012-10-20 Andreas Pehnack - - [sfnt] Load pure CFF fonts wrapped in SFNT container. - - Such fonts only have a `cmap' and a `CFF' table. - - * src/sfnt/ttload.c (tt_face_load_font_dir): Don't call - `check_table_dir' if font signature is `OTTO'. - -2012-10-20 Werner Lemberg - - [psaux] Fix some value overflows and improve tracing. - - * src/psaux/psconv.c: Include FT_INTERNAL_DEBUG_H. - (FT_COMPONENT): Define. - (PS_Conv_Strtol): Return FT_Long. - Handle bad data and overflow. - Emit some tracing messages in case of error. - (PS_Conv_ToInt): Return FT_Long. - (PS_Conv_ToFixed): Updated. - * src/psaux/psconv.h: Updated. - - * include/freetype/internal/fttrace.h: Add `psconv'. - -2012-10-20 Werner Lemberg - - [autofit] Fix `make multi CC=c++'. - - * src/autofit/aflatin.c, src/autofit/aflatin2.c: Include - `afglobal.h'. - * src/autofit/afloader.c: Fix order of header files. - * src/autofit/afmodule.c: Include `afglobal.h' and `aferrors.h'. - -2012-10-19 Werner Lemberg - - [cff] Fix more value errors and improve tracing. - - * src/cff/cffparse.c (cff_parse_integer): Emit tracing message in - case of error. - (cff_parse_real): Handle and trace overflow, underflow, and bad data - consistently. - (do_fixed): New helper function, handling and tracing overflow. - (cff_parse_fixed, cff_parse_fixed_scaled): Use `do_fixed'. - -2012-10-17 Werner Lemberg - - [psaux] Fix some value overflows. - - * src/psaux/psconv.c (PS_Conv_ToFixed): Implement it. - -2012-10-17 Bram Tassyns - - [cff] Fix value overflow. - - * src/cff/cffparse.c (cff_parse_fixed_scaled): Implement it. - -2012-10-17 Werner Lemberg - - [truetype] Fix Savannah bug #37572. - - * src/truetype/ttinterp.c (Ins_ISECT): Use angle between vectors to - avoid grazing intersections. The previous threshold was too coarse, - incorrectly rejecting short but valid vectors. - -2012-09-30 Gilles Espinasse - - Remove useless `rm' detection. - - `rm -f' is directly used in the `configure' script created by - autoconf, thus no availability test is necessary. - - * builds/unix/configure.raw (RMF): Remove test. - * builds/unix/unix-def.in (DELETE): Updated. - -2012-09-29 Werner Lemberg - - [autofit] Minor optimization. - - * src/autofit/afglobals.c (af_face_globals_compute_script_coverage): - Add loop condition. - -2012-09-29 Werner Lemberg - - [autofit] Fix thinko. - - * src/autofit/aftypes.h (AF_SCRIPT): - s/AF_SCRIPT_NONE/AF_SCRIPT_DUMMY/. We already use `AF_SCRIPT_NONE' - as a bit mask. - - * src/autofit/afdummy.c: Updated. - -2012-09-18 Werner Lemberg - - [autofit] Implement `increase-x-height' property. - - * include/freetype/ftautoh.h (FT_Prop_IncreaseXHeight): New - structure. - - * include/autofit/afmodule.c (af_property_get_face_globals): New - function, re-using code from `af_property_get'. - (af_property_set, af_property_get): Handle `increase-x-height'. - Updated. - -2012-09-18 Werner Lemberg - - [autofit] Implement Infinality's `increase glyph heights'. - - This is an improved version of a similar fix contained in the - so-called `Infinality patch', taken from - - http://www.infinality.net/fedora/linux/zips/freetype-infinality-2.4.10-20120616_01-x86_64.tar.bz2 - - which addresses various enhancements of the auto-hinter. Without - properties to control a module's metadata it wasn't possible to - adapt the patches because everything was originally controlled by - environment variables which I consider not suitable in general. - - A patch to control `increase_x_height' follows. - - * src/autofit/afglobal.h (AF_PROP_INCREASE_X_HEIGHT_MIN, - AF_PROP_INCREASE_X_HEIGHT_MAX): New macros. - (AF_FaceGlobalsRec): Add `increase_x_height' member. - * src/autofit/afglobal.c (af_face_globals_new): Initialize it. - - * src/autofit/aflatin.c (af_latin_metrics_scale_dim), - * src/autofit/aflatin2.c (af_latin2_metrics_scale_dim): Implement - handling of `increase_x_height'. - -2012-09-18 Werner Lemberg - - [autofit] Add hierarchical property access to some structures. - - * src/autofit/afglobal.h: Include `afmodule.h'. - (AF_FaceGlobalsRec): Add `module' member. - (AF_FaceGlobals): Typedef moved to... - * src/autofit/aftypes.h: Here. - (AF_ScriptMetricsRec): Add `globals' member. - - * src/autofit/afglobal.c (af_face_globals_new, - af_face_globals_compute_script_coverage, - af_face_globals_get_metrics): Updated. - - * src/autofit/afloader.c (af_loader_reset), src/autofit/afmodule.c - (af_property_get): Updated. - -2012-09-17 Werner Lemberg - - [type1] Fix Savannah bug #37350. - - * src/type1/t1parse.c (T1_Get_Private_Dict) : Check for ASCII - storage only if we actually have at least four bytes. - -2012-09-15 Werner Lemberg - - [autofit] Implement `fallback-script' property. - - * src/autofit/afglobal.c: s/default_script/fallback_script/. - * src/autofit/afglobal.h: s/AF_SCRIPT_DEFAULT/AF_SCRIPT_FALLBACK/. - - * src/autofit/afmodule.c: s/default_script/fallback_script/. - (af_property_set, af_property_get): Implement `fallback-script'. - * src/autofit/afmodule.h: s/default_script/fallback_script/. - - * include/freetype/ftautoh.h: Document it. - -2012-09-15 Werner Lemberg - - [autofit] Correct previous Unicode 6.1.0 change. - - The auto-hinter's latin module only handles latin ligatures in the - `Alphabetical Presentation Forms' block. - - * src/autofit/aflatin.c (af_latin_uniranges): Fix it. - -2012-09-15 Werner Lemberg - - * src/autofit/afmodule.c: s/FT_Err_/AF_Err_/. - -2012-09-15 Werner Lemberg - - [autofit] Make default script a global property. - - * src/autofit/afmodule.h (AF_ModuleRec): Add `default_script' field. - - * src/autofit/afglobal.c (af_face_globals_compute_script_coverage, - af_face_globals_new), src/autofit/afloader.c (af_loader_reset), - src/autofit/afmodule.c (af_property_get) , - af_autofitter_init: - Handle default script. - - * src/autofit/afglobal.h: Updated. - -2012-09-15 Werner Lemberg - - Use `FT_Module' instead of `FT_Library' argument in property funcs. - - This internal change simplifies access to global module data. - - * include/freetype/internal/services/svprop.h - (FT_Properties_SetFunc, FT_Properties_GetFunc): Change accordingly. - - * src/base/ftobjs.c (ft_property_do), src/autofit/afmodule.c - (af_property_set, af_property_get): Updated. - -2012-09-14 Werner Lemberg - - [autofit] Update to Unicode 6.1.0. - - * src/autofit/afcjk.c (af_cjk_uniranges), src/autofit/aflatin.c - (af_latin_uniranges): Add and fix ranges. - -2012-09-14 Werner Lemberg - - [autofit] Pass `AF_Module' instead of `AF_Loader'. - - We want to access the (not yet existing) module's global data later - on. - - * src/autofit/afloader.c: Include `afmodule.h'. - (af_loader_init, af_loader_reset, af_loader_done, - af_loader_load_glyph): Change accordingly. - * src/autofit/afmodule.c (AF_ModuleRec): Move to `afmodule.h'. - Updated. - - * src/autofit/afmodule.h: Include `afloader.h'. - (AF_ModuleRec): Define here. - * src/autofit/afloader.h (AF_Module): Define here. - Updated. - -2012-09-14 Werner Lemberg - - [autofit] Fix `make multi'. - - * include/freetype/internal/fttrace.h: Add `afmodule'. - * src/autofit/afmodule.c: Include FT_INTERNAL_DEBUG_H. - (FT_COMPONENT): Define. - -2012-09-14 Werner Lemberg - - * src/autofit/afmodule.c: s/FT_Autofitter/AF_Module/. - -2012-09-12 Werner Lemberg - - [autofit] Minor reorganization. - - * src/autofit/afglobal.c (AF_SCRIPT_LIST_DEFAULT, - AF_SCRIPT_LIST_NONE, AF_DIGIT): Move to... - * src/autofit/afglobal.h (AF_SCRIPT_DEFAULT, AF_SCRIPT_LIST_NONE, - AF_DIGIT): This and update code. - -2012-09-01 Werner Lemberg - - [autofit] Implement `glyph-to-script-map' property. - - * include/freetype/ftautoh.h: New public header file. - * include/freetype/config/ftheader.h (FT_AUTOHINTER_H): New macro. - - * src/autofit/afglobal.c (AF_FaceGlobalsRec): Move structure to... - * src/autofit/afglobal.h: This header file. - * src/autofit/afmodule.c: Include FT_AUTOHINTER_H. - (af_property_get): Handle `glyph-to-script-map'. - -2012-08-31 Werner Lemberg - - [autofit] Implement properties service framework. - - No properties are added yet. - - * src/autofit/afmodule.c: Include FT_SERVICE_PROPERTIES_H. - (af_property_set, af_property_get): New dummy functions. - (af_service_properties, af_services, af_get_interface): Provide - service setup. - (autofit_moduleclass): Add service interface. - - * src/autofit/afpic.c: Add necessary forward declarations. - (autofit_module_class_pic_init): Add code for service addition. - (autofit_module_pic_free): Add code for service removal. - * src/autofit/afpic.h (AF_SERVICES_GET, AF_SERVICE_PROPERTIES_GET): - New macros which provide necessary syntactical sugar for PIC - support. - -2012-08-30 Werner Lemberg - - Implement properties to control FreeType modules. - - * include/freetype/fterrdef.h (FT_Err_Missing_Property): New error - code. - * include/freetype/ftmodapi.h (FT_Property_Set, FT_Property_Get): - New API. - - * include/freetype/internal/services/svprop.h: New file. - * include/freetype/internal/ftserv.h (FT_SERVICE_PROPERTIES_H): New - macro. - - * src/base/ftobjs.c: Include FT_SERVICE_PROPERTIES_H. - (ft_property_do, FT_Property_Set, FT_Property_Get): New functions. - -2012-08-29 Werner Lemberg - - [docmaker] Allow `-' in tags and identifiers. - - * src/tools/docmaker/content.py (re_identifier), - src/tools/docmaker/sources.py (re_markup_tag1, re_markup_tag2, - re_crossref): Add `-' in patterns. - -2012-08-27 Werner Lemberg - - [FT_CONFIG_OPTION_PIC] Fix g++ 4.6.2 compiler warnings. - - * include/freetype/internal/ftdriver.h (FT_DEFINE_DRIVER), - include/freetype/internal/ftobjs.h (FT_DEFINE_RENDERER, - FT_DEFINE_MODULE), include/freetype/internal/ftserv.h - (FT_DEFINE_SERVICEDESCREC1, FT_DEFINE_SERVICEDESCREC2, - FT_DEFINE_SERVICEDESCREC3, FT_DEFINE_SERVICEDESCREC4, - FT_DEFINE_SERVICEDESCREC5, FT_DEFINE_SERVICEDESCREC6), - src/autofit/afpic.c (autofit_module_class_pic_init), - src/base/basepic.c (ft_base_pic_init), src/base/ftinit.c - (ft_create_default_module_classes), src/cff/cffparse.c - (FT_Create_Class_cff_field_handlers), src/cff/cffpic.c - (cff_driver_class_pic_init), src/pshinter/pshpic.c - (pshinter_module_class_pic_init), src/psnames/pspic.c - (psnames_module_class_pic_init), src/raster/rastpic.c - (ft_raster1_renderer_class_pic_init), src/sfnt/sfntpic.c - (sfnt_module_class_pic_init), src/sfnt/ttcmap.c - (FT_Create_Class_tt_cmap_classes), src/smooth/ftspic.c - (ft_smooth_renderer_class_pic_init), src/truetype/ttpic.c - (tt_driver_class_pic_init): Initialize allocation variable. - -2012-08-27 Werner Lemberg - - [truetype] Fix compilation warning. - - * src/truetype/ttgload.c (IS_HINTED): Move macro to... - * src/truetype/ttobjs.h: This header file. - -2012-08-27 Werner Lemberg - - [autofit, cff, pshinter, psnames] More renamings for orthogonality. - - * src/autofit/afmodule.c, src/autofit/afpic.h: - s/AF_AUTOFITTER_/AF_/. - - * src/cff/cffdrivr.c, src/cff/cffobjs.c, src/cff/cffparse.c, - src/cff/cffpic.h: s/FT_CFF_/CFF_/. - - * src/pshinter/pshmod.c, src/pshinter/pshpic.h: - s/FT_PSHINTER_/PSHINTER_/. - - * src/psnames/psmodule.c, src/psnames/pspic.h: - s/FT_PSCMAPS/PSCMAPS_/. - -2012-08-27 Werner Lemberg - - [sfnt, truetype] More renamings for orthogonality. - - * src/sfnt/sfdriver.c, src/sfnt/sfntpic.h, src/sfnt/ttcmap.c, - src/truetype/ttdriver.c, src/truetype/ttpic.h: s/FT_SFNT_/SFNT_/, - s/FT_TT_/TT_/, s/GET_CMAP_INFO_GET/CMAP_INFO_GET/. - -2012-08-27 Werner Lemberg - - [autofit] Some macro and variable renamings for orthogonality. - - * include/freetype/internal/autohint.h, src/base/ftobjs.c, - src/autofit/afmodule.c, src/autofit/afpic.c, src/autofit/afpic.h: - s/SERVICE/INTERFACE/, s/service/interface/, s/Service/Interface/. - -2012-08-26 Werner Lemberg - - Fix Savannah bug #37178. - - * src/base/ftobjs.c (FT_Open_Face): Initialize `error' with - `FT_Err_Missing_Module' before loop to indicate `no valid drivers'. - -2012-08-17 Werner Lemberg - - * src/base/ftsynth.c (FT_GlyphSlot_Oblique): Fix shear angle. - - The old value was far too large (more than 20°). The new one - corresponds to 12°, quite common in typography. - -2012-08-12 Alexei Podtelezhnikov - - [smooth] Fix Savannah bug #37017. - - * src/smooth/ftgrays.c (gray_render_cubic): Use a different set of - checks when detecting super curvy splines to be split. - -2012-08-05 Werner Lemberg - - [autofit] Improve recognition of flat segments. - - Problem reported by Brad Dunzer . - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): We have - a flat segment if the horizontal distance of best on-points is - larger than a given threshold. - -2012-08-05 Werner Lemberg - - [autofit] Variable renamings. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Replace - `glyph' with `outline'. - s/best_first/best_contour_first/. - s/best_last/best_contour_last/. - -2012-07-31 Werner Lemberg - - [type1] Fix Savannah bug #37000. - - * src/type1/t1load.c (parse_encoding): Fix order of checks. - -2012-07-17 Werner Lemberg - - [psaux] Fix Savannah bug #36833. - - * src/psaux/t1decode.c (t1operator_seac): `seac' is not a valid - operator if we want metrics only. - -2012-07-16 Werner Lemberg - - [type1] Fix Savannah bug #36832. - - * src/type1/t1load.c (parse_charstrings): Reject negative number of - glyphs. - -2012-07-13 Werner Lemberg - - [type1] Fix Savannah bug #36829. - - * src/type1/t1load.c (parse_encoding): Check cursor position after - call to T1_Skip_PS_Token. - -2012-07-12 Alexei Podtelezhnikov - - Revert the last commit 45337b07. - - * src/base/ftstroke.c (FT_Stroker_New): Revert the previous change. - -2012-07-11 Alexei Podtelezhnikov - - [ftstroke] Fix uninitialized return value. - - * src/base/ftstroke.c (FT_Stroker_New): Return FT_Err_Ok instead. - -2012-07-11 Werner Lemberg - - [smooth] Avoid memory leak in case of failure. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Use flags to - indicate what to clean up after finishing the function, with and - without errors. - -2012-07-09 Werner Lemberg - - Fix compilation with MSVC 5.0. - - Problem reported by Peter Breitenlohner and Akira Kakuto. - - * include/freetype/config/ftstdlib.h (ft_setjmp): Updated. - * src/sfnt/ttcmap.c (tt_face_build_cmaps): Remove cast. - -2012-07-09 Werner Lemberg - - [autofit] Improve debugging messages; do some code cleanup. - - * src/autofit/aflatin.c (af_latin_align_linked_edge, - af_latin_hint_edges): Synchronize with formatting used in the - ttfautohint project. - -2012-07-07 Gilles Espinasse - - Fix strict-aliasing warning. - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Avoid double cast. - -2012-07-07 Dave Thomas - - [ARM] Fix FT_MulFix_arm. - - * include/freetype/config/ftconfig.h (FT_MulFix_arm) [__arm__]: - Avoid ADDS instruction to clobber condition codes. - -2012-07-06 Werner Lemberg - - [autofit] Do some code cleanup. - - * src/autofit/afglobal.c (af_face_globals_new): Simplify. - - * src/autofit/afhints.c: Use `FT_TRACE7' instead of `printf' - everywhere. - (FT_COMPONENT): New macro. - (af_glyph_hints_done): Simplify. - - * include/freetype/internal/fttrace.h: Updated. - -2012-07-05 Werner Lemberg - - [autofit] Improve output of debugging information. - - * src/autofit/afhints.c (af_glyph_hints_dump_segments): Print more - data; report no data. - (af_glyph_hints_dump_edges): Report no data. - -2012-07-04 Werner Lemberg - - [autofit] Fix Savannah bug #36091. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues), - src/autofit/aflatin2.c (af_latin2_metrics_init_blues): Change the - constraint for testing round vs. flat segment: Accept either a - small distance or a small angle. - -2012-07-04 Werner Lemberg - - [autofit] Beautify blue zone tracing. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues), - src/autofit/aflatin2.c (af_latin2_metrics_init_blues): Implement it. - -2012-07-03 Werner Lemberg - - [autofit] Quantize stem widths. - - * src/autofit/afangles.c (af_sort_widths): Rename to... - (af_sort_and_quantize_widths): This. - Add code to avoid stem widths which are almost identical. - * src/autofit/aftypes.h, src/autofit/aflatin.c, src/autofit/afcjk.c: - Updated. - -2012-07-03 Werner Lemberg - - [autofit] Minor speed-up. - - * src/autofit/afangles (af_sort_pos, af_sort_widths): Don't swap - elements if they are equal. - -2012-06-30 Gilles Espinasse - - Fix `checking if gcc static flag -static works' test. - - On my linux build tree, I receive yes answer in in every package I - build except freetype for this test checking if gcc static flag - `-static' works - - On freetype, no is received, unless bzip2 and zlib are disabled using - - ./configure --without-bzip2 --without-zlib - - The reason is that bzip2 and zlib tests add `-lz' and `-lbz2' to - LDFLAGS and this broke static flag test. - - * builds/unix/configure.raw: Update CFLAGS and LDFLAGS only after - LT_INIT has run. - -2012-06-28 Infinality - - [truetype] Fix various artifacts. - - Verdana was broken in the original Infinality commit. Also - includes other minor fixes. - - * src/truetype/ttsubpix.h: Updated. Removed unused macros. - (RASTERIZER_35_Rules): Add Verdana. - (SKIP_NONPIXEL_Y_MOVES_Rules): Add Tahoma `s'. - (MIRP_CVT_ZERO_Rules): Remove Verdana. - (ALWAYS_SKIP_DELTAP_Rules): Add Russian char 0x438. - (COMPATIBLE_WIDTHS_Rules): Rearrange some rules. - (X_SCALING_Rules): Adjust Verdana `a' at 12 and 13 ppem. - - * src/truetype/ttsubpix.c: Updated. - (sph_set_tweaks): Re-execute fpgm always. - -2012-06-28 Gilles Espinasse - - Fix CFLAGS and LDFLAGS share configure test. - - * builds/unix/configure.raw: Fix typo. - -2012-06-28 Werner Lemberg - - [truetype] Set the `subpixel_positioned' flag unconditionally. - - This is how the code currently behaves. - - * src/truetype/ttgload.c (tt_loader_init): Do it. - -2012-06-27 Werner Lemberg - - Fix conditional compilation. - - * src/base/basepic.c: Use FT_CONFIG_OPTION_MAC_FONTS. - -2012-06-27 Werner Lemberg - - Fix conditional compilation. - - * include/freetype/internal/ftcalc.h (FT_MulDiv_No_Round): Don't - enclose with `TT_USE_BYTECODE_INTERPRETER'; we now need the function - elsewhere also. - - * src/autofit/afcjk.h: Use AF_CONFIG_OPTION_CJK. - - * src/truetype/ttgload.c (tt_loader_init): Fix compiler warning. - - * src/truetype/ttinterp.c (Ins_MSIRP): Fix compiler warning. - - * src/truetype/ttinterp.h: Use - TT_CONFIG_OPTION_BYTECODE_INTERPRETER. - -2012-06-26 Infinality - - [truetype] Remove unused rounding functionality. - - The subpixel hinting patch contained the concept of an adjustable - number of gridlines per pixel. This is no longer used due to x - being completely ignored instead. This will return some of the - code to its existing state prior to the original Infinality - commit. - - * include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID, - FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): Removed. - - * src/truetype/ttinterp.c: Updated. - (Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid, - Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45, - SetSuperRound): Remove parameter to handle the number of grid lines per - pixel. - (SET_SuperRound, ROUND_None, CUR_Func_round): Updated. - (DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated. - (DO_ROUND, DO_NROUND): Updated. - (Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP, - Ins_MDRP, Ins_MIRP): Perform Round_None instead of calling a modified - rounding function. Remove gridlines_per_pixel. Create a local - variable to store control value cutin. Simplify the conditional for - ignore_x_mode. Adjust rounding calls to pass only two values. - -2012-06-25 Werner Lemberg - - [cff] Fix Savannah bug #36705. - - Handle numbers like 2.001 correctly. - - * src/cff/cffparse.c (cff_parse_real): Avoid negative values for - `shift'. - -2012-06-18 Infinality - - [truetype] Support subpixel hinting. - - This is the large, famous `Infinality' patch to support ClearType - bytecode which has been available from - http://www.infinality.net/blog/ for some time, and which has been - refined over the last years. While still experimental, it is now - mature enough to be included directly into FreeType. - - Most of the code is based on the ClearType whitepaper written by - Greg Hitchcock - - http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx - - which gives a detailed overview of the necessary changes to the - Microsoft rasterizer so that older fonts are supported. However, a - lot of details are still missing, and this patches provides a - framework to easily handle rendering issues down to the glyph level - of certain fonts. - - Note that ClearType support is not completely implemented! In - particular, full support for the options `compatible_widths', - `symmetrical_smoothing, and `bgr' (via the GETINFO bytecode - instruction) is missing. - - * src/truetype/ttsubpix.c: New file, providing code to handle - `tweaks', this is, rules for certain glyphs in certain fonts - (including wildcards) which need a special treatment. - - * src/truetype/ttsubpix.h: New file, holding the tweaking rules. - - * include/freetype/config/ftoption.h, src/devel/ftoption.h - (TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro. - - * include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID, - FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros. - - * src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include - `ttsubpix.c'. - - * src/truetype/ttgload.c: Include `ttsubpix.h'. - [All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.] - - (tt_get_metrics): Set tweak flags. - (TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary. - (TT_Process_Simple_Glyph): Compensate emboldening if necessary. - (compute_glyph_metrics): Handle `compatible widths' option. - (tt_loader_init): Handle ClearType GETINFO information bits. - - * src/truetype/rules.mk (TT_DRC_SRC): Updated. - - * src/truetype/ttinterp.c: Include `ttsubpix.h'. - [Where necessary, changes below are guarded by - TT_CONFIG_OPTION_SUBPIXEL_HINTING.] - - (Direct_Move, Direct_Move_X): Extended. - (Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid, - Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45, - SetSuperRound): Add parameter to handle the number of grid lines per - pixel. - (SET_SuperRound, ROUND_None, CUR_Func_round): Updated. - (DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated. - (DO_ROUND, DO_NROUND): Updated. - (DO_RS): Take care of `Typeman' bytecode patterns. - (Ins_FDEF): Add some debugging code. Commented out. - (Ins_ENDF): Restore state. - (Ins_CALL, Ins_LOOPCALL): Handle inline delta functions. - (Ins_MD): Handle `Vacuform' rounds. - (Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP, - Ins_MDRP, Ins_MIRP): Handle tweaks. - (Ins_ALIGNRP): Add tweak guard. - (Ins_IUP, Ins_DELTAP): Handle tweaks. - (Ins_GETINFO): Handle new ClearType bits. - (TT_RunIns): Handle tweaks. - - * src/truetype/ttinterp.h: Updated. - (SPH_TweakRule, SPH_ScaleRule): New structures for tweaks. - (TT_ExecContextRec): Add members for subpixel hinting support. - - * src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member. - -2012-06-15 Werner Lemberg - - * Version 2.4.10 released. - ========================= - - - Tag sources with `VER-2-4-10'. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.4.10. - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.4.9/2.4.10/, s/249/2410/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 10. - - * builds/unix/configure.raw (version_info): Set to 15:0:9. - -2012-06-15 Alexei Podtelezhnikov - - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Improve spacing. - - * docs/CHANGES: Updated. - -2012-06-14 suzuki toshiya - - * builds/exports.mk: Add CCexe_CFLAGS and CCexe_LDFLAGS. - - to pass special compiler/linker flags under cross development. - Suggested by Savannah bug #36367. - - ChangeLog on 2010-07-15 saying as they were removed was wrong - for the official trunk of FreeType2. This commit is the first - introduction of them. - -2012-06-14 Werner Lemberg - - * docs/CHANGES: Updated. - -2012-06-14 suzuki toshiya - - [truetype] Add new versions of NEC FA family to tricky font list. - - NEC FA family dated in 1996 have different checksum. - Reported by Johnson Y. Yan ; see - - http://lists.gnu.org/archive/html/freetype-devel/2012-06/msg00023.html - - * src/truetype/ttobjs.c (tt_check_trickyness_sfnt_ids): 4 sets - of fpgm & prep table checksums for FA-Gothic, FA-Minchou, - FA-RoundedGothicM, FA-RoundedGothicB are added. The family - names in sample PDF are truncated, thus the list of the - family names in tt_check_trickyness_family() is not updated yet. - -2012-06-06 Werner Lemberg - - [ftraster] Fix rounding issue causing visual artifacts. - - Problem reported by jola ; see - - http://lists.gnu.org/archive/html/freetype-devel/2012-05/msg00036.html - - * src/raster/ftraster.c (SMulDiv_No_Round): New macro. - (Line_Up): Use it. - * src/raster/ftmisc.h (FT_MulDiv_No_Round): Copied from `ftcalc.c'. - -2012-05-28 Alexei Podtelezhnikov - - * src/base/ftoutln.c (FT_Outline_Get_Orientation): Simplify. - - We now use the cross product of the direction vectors to compute the - outline's orientation. - -2012-05-28 Werner Lemberg - - * docs/CHANGES: Updated. - -2012-05-28 Alexei Podtelezhnikov - - New function FT_Outline_EmboldenXY. - - * include/freetype/ftoutln.h (FT_Outline_EmboldenXY): Define it. - - * src/base/ftoutln.c (FT_Outline_EmboldenXY): Implement it, using a - simplified embolding algorithm. - (FT_Outline_Embolden): Make it a special case of - `FT_Outline_EmboldenXY' - -2012-05-07 Werner Lemberg - - [type1] Fix Savannah bug #36386. - - * src/type1/t1load.c (t1_load_keyword): Ignore keyword if context is - not valid. - -2012-04-07 Werner Lemberg - - Remove compiler warning. - - * src/truetype/ttgload.c (TT_Load_Glyph) - [!TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Access `glyph->face' directly. - -2012-03-28 Werner Lemberg - - [autofit] Properly copy scaler flags to script metrics object. - - Without this patch, only the dummy and cjk autohinter modules get - them (since they copy the whole scaler object). - - * src/autofit/aflatin.c (af_latin_metrics_scale), - src/autofit/aflatin2.c (af_latin2_metrics_scale): Implement it. - -2012-03-22 Alexei Podtelezhnikov - - [bdflib] Remove redundant macro. - - * src/bdf/bdflib.c (isdigok): Remove and replace with sbitset, which - is exactly the same. - -2012-03-20 suzuki toshiya - - [configure] Fix Savannah bug #35644. - - * builds/unix/configure.raw: Check `-ansi' flag works even if gcc - is used. Bionic libc headers for Android lose the consistency - when they are parsed with __STDC_VERSION__ older than 199901L or - __STRICT_ANSI__. - -2012-03-20 Werner Lemberg - - [bdf] Improvement to Savannah bug #35656. - - * src/bdf/bdflib.c (isdigok): Add cast, as suggested in report. - -2012-03-17 Chris Liddell - - [type1] Fix Savannah bug #35847. - - * src/type1/t1load.c (parse_subrs): Fix the loop exit condition; - we want to exit when we have run out of data. - -2012-03-16 Werner Lemberg - - [bdf] Really fix Savannah bug #35658. - - * src/bdf/bdflib.c (_bdf_list_split): Add one more `field' initializer. - -2012-03-14 Yann Droneaud - - [sfnt] Make arrays static like all others. - - * src/sfnt/ttload.c (tt_face_load_maxp, tt_face_load_os2), - src/sfnt/ttmtx.c (tt_face_load_hhea): Add `static' keyword to frame - fields. - -2012-03-14 Huw Davies - - [sfnt] A refinement of the previous commit. - - * src/sfnt/sfobjs.c (tt_name_entry_ascii_from_utf16, - tt_name_entry_ascii_from_other): Stop at null byte. - -2012-03-14 Huw Davies - - [sfnt] Add `name' table compatibility to MS Windows. - - * src/sfnt/sfobjs.c (tt_name_entry_ascii_from_utf16, - tt_name_entry_ascii_from_other): Don't replace `\0' with question - marks when converting strings. - -2012-03-14 Werner Lemberg - - [type1] Fix Savannah bug #35833. - - Based on the patch given in the bug report. - - * src/type1/t1load.c (IS_INCREMENTAL): New macro. - (read_binary_data): Add parameter `incremental'. - Update all callers using `IS_INCREMENTAL'. - -2012-03-11 Werner Lemberg - - [autofit] Return correct linear advance width values. - - This was quite a subtle bug which accidentally showed up with glyph - `afii10023' of arial.ttf (version 2.76). This glyph is a composite; - the first component, `E', has an advance width of 1366 font units, - while the advance width of the composite itself (which looks like - uppercase `E' with dieresis) is 1367 font units. I think this is - actually a bug in the font itself, because there is no reason that - this glyph has not the same width as uppercase `E' without the - dieresis. Anyway, it helped identify this problem. - - Using the TrueType hinter, the correct value (1367) of `afii10023' - was returned, but the autohinter mysteriously returned 1366. - - Digging in the code showed that the autohinter recursively calls - FT_Load_Glyph to load the glyph, adding the FT_LOAD_NO_SCALE load - flag. However, the `linearHoriAdvance' field is still returned as a - scaled value. To avoid scaling twice, the old code in autofit reset - `linearHoriAdvance', using the `horiAdvance' field. This seemed to - work since FT_LOAD_NO_SCALE was in use, but it failed actually, - because `horiAdvance' is defined as the distance of the first - subglyph's phantom points, which in turn are initialized using the - advance width of the first subglyph. And as the given example - shows, these widths can differ. - - * src/autofit/afloader.c (af_loader_load_g): Temporarily set - FT_LOAD_LINEAR_DESIGN while calling FT_Load_Glyph to get unscaled - values for the linear advance widths. - -2012-03-10 Werner Lemberg - - [truetype] Fix SSW instruction. - - * src/truetype/ttinterp.c (DO_SSW): SSW *does* use font units. For - verification, it took some time to find a font which actually uses - this instruction. - -2012-03-09 Vinnie Falco - - Prepare source code for amalgamation. - - * include/freetype/freetype.h: Swap order of preprocessor blocks. - -2012-03-08 Werner Lemberg - - * Version 2.4.9 released. - ========================= - - - Tag sources with `VER-2-4-9'. - - * docs/CHANGES: Updated. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.4.9. - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.4.8/2.4.9/, s/248/249/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 9. - - * builds/unix/configure.raw (version_info): Set to 14:1:8. - -2012-03-08 Werner Lemberg - - [bdf] Add missing overflow check. - - * src/bdf/bdflib.c (_bdf_parse_glyphs) : Add threshold for - `glyph->bpr'. - -2012-03-07 Vinnie Falco - - Prepare source code for amalgamation. - - * src/autofit/aferrors.h, src/bdf/bdferror.h, src/bzip2/ftbzip2.c, - src/cache/ftcerror.h, src/cff/cfferrs.h, src/cid/ciderrs.h, - src/gxvalid/gxverror.h, src/gzip/ftgzip.c, src/lzw/ftlzw.c, - src/otvalid/otverror.h, src/pcf/pcferror.h, src/pfr/pfrerror.h, - src/psaux/psauxerr.h, src/pshinter/pshnterr.h, - src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h, - src/smooth/ftsmerrs.h, src/truetype/tterrors.h, - src/type1/t1errors.h, src/type42/t42error.h, src/winfonts/fnterrs.h: - Add #undef FT_ERR_PREFIX before #define FT_ERR_PREFIX. - -2012-03-03 Werner Lemberg - - Fix Savannah bug #35660. - - For some divisions, we use casts to 32bit entities. Always guard - against division by zero with these casts also. - - * src/base/ftcalc.c (ft_div64by32): Remove redundant cast. - (FT_MulDiv, FT_MulDiv_No_Round): Add 32bit cast. - (FT_DivFix): Add 32bit cast (this omission triggered the bug). - -2012-03-03 Werner Lemberg - - [psaux] Fix handling of track kerning. - - * src/psaux/afmparse.c (afm_parse_track_kern): Don't inverse sign - for `min_kern'. It is indeed quite common that track kerning - *increases* spacing for very small sizes. - -2012-03-02 Werner Lemberg - - [truetype] Fix Savannah bug #35689. - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check first outline - point. - -2012-03-01 Werner Lemberg - - [bdf] Fix Savannah bug #35656. - - * src/bdf/bdflib.c (_bdf_parse_glyphs) <_BDF_BITMAP>: Check validity - of nibble characters instead of accessing `a2i' array. - -2012-03-01 Werner Lemberg - - [winfonts] Fix Savannah bug #35659. - - * src/winfonts/winfnt.c (FNT_Face_Init): Check number of glyphs. - -2012-03-01 Werner Lemberg - - [bdf] Fix Savannah bug #35658. - - * src/bdf/bdflib.c (_bdf_list_split): Initialize `field' elements - properly. - -2012-03-01 Werner Lemberg - - [psaux] Fix Savannah bug #35657. - - If in function `skip_spaces' the routine `skip_comment' comes to the - end of buffer, `cur' is still increased by one, so we need to check - for `p >= limit' and not `p == limit'. - - * src/psaux/psconv.c (PS_Conv_Strtol, PS_Conv_ToFixed, - PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Fix boundary checking. - -2012-03-01 Werner Lemberg - - [truetype] Fix Savannah bug #35646. - - * src/truetype/ttinterp.c (Ins_MIRP): Typo, present since ages. The - code is now in sync with the other operators (e.g. MSIRP) which - modify twilight points. - -2012-03-01 Werner Lemberg - - [bdf] Fix Savannah bug #35643. - - * src/bdf/bdflib.c (_bdf_list_ensure): Bring code in sync with - comment before `_bdf_list_split', this is, really allocate at least - five `field' elements. - -2012-03-01 Werner Lemberg - - [bdf] Fix Savannah bug #35641. - - * src/bdf/bdflib.c (_bdf_parse_glyphs) : Abort if - _BDF_ENCODING isn't set. We need this because access to the `glyph' - variable might be undefined otherwise. - -2012-03-01 Werner Lemberg - - [truetype] Fix Savannah bug #35640. - - * src/truetype/ttinterp.c (SkipCode, TT_RunIns): Fix boundary check - for NPUSHB and NPUSHW instructions. - -2012-02-29 Werner Lemberg - - [truetype] Fix Savannah bug #35601. - - * src/truetype/ttinterp.c (Ins_SHZ): Use number of points instead of - last point for loop. - Also remove redundant boundary check. - -2012-02-29 Werner Lemberg - - [truetype] Remove redundant check. - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Remove redundant - second check for ordered contour start points. - -2012-02-29 Werner Lemberg - - [truetype] Make SHC instruction behave similar to MS rasterizer. - - * src/truetype/ttinterp.c (Ins_SHC): Handle virtual contour in - twilight zone. - -2012-02-29 Alexei Podtelezhnikov - - Avoid modulo operators against a power-of-two denominator. - - * src/afcjk.c (af_hint_normal_stem), src/base/ftoutln.c - (ft_contour_has), src/cff/cffgload.c (cff_decoder_parse_charstrings) - , - src/gxvalid/gxvcommn.c (GXV_32BIT_ALIGNMENT_VALIDATE), - src/gxvalid/gxvfeat.c (gxv_feat_setting_validate): Replace `%' with - `&' operator. - -2012-02-29 Werner Lemberg - - [autofit] Don't synchronize digit widths for light rendering mode. - - We don't hint horizontally in this mode. - - * src/autofit/afloader.c (af_loader_load_g) : - Implement it. - -2012-02-26 Alexei Podtelezhnikov - - [type42] Minor code optimization (again). - - * src/type42/t42parse.c (t42_parse_sfnts): Simplify previous change. - -2012-02-26 Mateusz Jurczyk - Werner Lemberg - - [smooth] Fix Savannah bug #35604. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Use `FT_Pos' - instead of `FT_UInt' for some variables and update comparisons - accordingly. A detailed analysis can be found in the bug report. - -2012-02-26 Alexei Podtelezhnikov - - [type42] Minor code optimization. - - * src/type42/t42parse.c (t42_parse_sfnts): Use bitmask instead of - modulo operator. - -2012-02-26 Werner Lemberg - - * docs/CHANGES: Updated. - -2012-02-26 Werner Lemberg - - [type1] Fix Savannah bug #35608. - - * src/type1/t1parse.c (T1_Get_Private_Dict): Reject too short - dictionaries. - -2012-02-26 Werner Lemberg - - [bdf] Support `ENCODING -1 ' format. - - * src/bdf/bdflib.c (_bdf_parse_glyphs) : Implement it. - -2012-02-26 Werner Lemberg - - [bdf] Fix Savannah bug #35607. - - * src/bdf/bdflib.c (_bdf_parse_glyphs) : Normalize - negative encoding values. - -2012-02-26 Werner Lemberg - - [type1] Fix Savannah bug #35606. - - * src/type1/t1load.c (parse_subrs): Add proper guards for `strncmp'. - - * src/psaux/psobjs.c (ps_parser_skip_PS_token): Emit error message - only if cur < limit. - -2012-02-25 Werner Lemberg - - [pcf] Fix Savannah bug #35603. - - * src/pcf/pcfread.c (pcf_get_properties): Assure final zero byte in - `strings' array. - -2012-02-25 Werner Lemberg - - [type42] Fix Savannah bug #35602. - - * src/type42/t42parse.c (t42_parse_sfnts): Check `string_size' more - thoroughly. - -2012-02-25 Werner Lemberg - - [bdf] Fix Savannah bugs #35599 and #35600. - - * src/bdf/bdflib.c (ACMSG16): New warning message. - (_bdf_parse_glyphs) <_BDF_BITMAP>: Check line length. - -2012-02-24 Werner Lemberg - - [bdf] Fix Savannah bugs #35597 and #35598. - - * src/bdf/bdflib.c (_bdf_is_atom): Fix handling of property value. - -2012-02-24  Vinnie Falco - - Prepare source code for amalgamation (6/6). - - * src/cff/cffdrivr.c: s/Load_Glyph/cff_glyph_load/. - - * src/cid/cidload.c: s/parse_font_matrix/cid_parse_font_matrix/. - s/t1_init_loader/cid_init_loader/. - s/t1_done_loader/cid_done_loader/. - - * src/pxaux/t1cmap.c: s/t1_get_glyph_name/psaux_get_glyph_name/. - - * src/truetype/ttdriver.c: s/Load_Glyph/tt_glyph_load/. - - * src/type1/t1load.c: s/parse_font_matrix/t1_parse_font_matrix/. - -2012-02-24  Vinnie Falco - - Prepare source code for amalgamation (5/6). - - * include/freetype/fterrors.h: Undefine FT_KEEP_ERR_PREFIX after - using it. - -2012-02-22  Vinnie Falco - - Prepare source code for amalgamation (4/6). - - * src/smooth/ftgrays.c, src/raster/ftraster.c: Undefine RAS_ARG, - RAS_ARGS, RAS_VAR, and RAS_VARS before defining it. - - * src/smooth/ftgrays.c: s/TRaster/black_TRaster/, - s/PRaster/black_PRaster/. - * src/raster/ftraster.c: s/TRaster/gray_TRaster/, - s/PRaster/gray_PRaster/. - -2012-02-20  Vinnie Falco - - Prepare source code for amalgamation (3/6). - - * src/smooth/ftgrays.c: s/TWorker/black_TWorker/, - s/PWorker/black_PWorker/. - * src/raster/ftraster.c: s/TWorker/gray_TWorker/, - s/PWorker/gray_PWorker/. - -2012-02-20  Vinnie Falco - - Prepare source code for amalgamation (2/6). - - * src/smooth/ftgrays.c, src/raster/ftraster.c: Undefine FLOOR, - CEILING, TRUNC, and SCALED before defining it. - -2012-02-20  Vinnie Falco - - Prepare source code for amalgamation (1/6). - - See discussion starting at - - http://lists.gnu.org/archive/html/freetype-devel/2012-01/msg00037.html - - * src/smooth/ftgrays.c: s/TBand/gray_TBand/. - * src/raster/ftraster.c: s/TBand/black_TBand/. - -2012-02-17 Alexei Podtelezhnikov - - [autofit] Fix outline flags. - - * src/autofit/afloader.c (af_loader_load_g): Don't reassign - `outline.flags' so that this information is preserved. See - discussion starting at - - http://lists.gnu.org/archive/html/freetype-devel/2012-02/msg00046.html - -2012-02-11 Werner Lemberg - - [truetype] Fix Savannah bug #35466. - - Jump instructions are now bound to the current function. The MS - Windows rasterizer behaves the same, as confirmed by Greg Hitchcock. - - * src/truetype/ttinterp.h (TT_CallRec): Add `Cur_End' element. - * src/truetype/ttobjs.h (TT_DefRecord): Add `end' element. - - * src/truetype/ttinterp.c (DO_JROT, DO_JMPR, DO_JROF): Check upper - bound of jump address. - (Ins_FDEF, Ins_CALL, Ins_LOOPCALL, Ins_UNKNOWN, TT_RunIns): Updated. - -2012-02-11 Werner Lemberg - - We don't use `extensions'. - - * include/freetype/internal/ftobjs.h (FT_DriverRec): Remove - `extensions' field. - -2012-02-11 Werner Lemberg - - Clean up `generic' fields. - - * include/freetype/internal/ftobjs.h (FT_ModuleRec, FT_LibraryRec): - Remove `generic' field since users can't access it. - - * src/base/ftobjs.c (FT_Done_GlyphSlot): Call `generic.finalizer' as - advertised in the documentation of FT_Generic. - (Destroy_Module, FT_Done_Library): Updated to changes in `ftobjs.h'. - -2012-02-07 Werner Lemberg - - [autofit] Harmonize function arguments. - - * src/autofit/afloader.c, src/autofit/afloader.h: Use `FT_Int32' for - `load_flags'. - -2012-02-07 Werner Lemberg - - * src/cff/cffobjs.c (cff_face_init): Remove unnecessary casts. - -2012-01-17 suzuki toshiya - - [gxvalid] Fix Savannah bug #35286. - - Patch submitted by anonymous reporter. - - * src/gxvalid/gxvcommn.c (gxv_XStateTable_subtable_setup): - gxv_set_length_by_ulong_offset() must be called with 3, not 4, - the number of the subtables in the state tables; classTable, - stateArray, entryTable. - -2012-01-17 suzuki toshiya - - [raccess] Modify for PIC build. - - Based on the patch provided by Erik Dahlstrom , - http://lists.gnu.org/archive/html/freetype-devel/2012-01/msg00010.html - - Also `raccess_guess_table[]' and `raccess_rule_by_darwin_vfs()' - are renamed with `ft_' suffixes. - - * src/base/ftbase.h: `raccess_rule_by_darwin_vfs()' is renamed - to `ft_raccess_rule_by_darwin_vfs()'. - * src/base/ftobjs.c: Ditto. - - * src/base/ftrfork.c: Declarations of FT_RFork_Rule, - raccess_guess_rec, are moved to... - * include/freetype/internal/ftrfork.h: Here. - - * include/freetype/internal/ftrfork.h: - FT_RFORK_RULE_ARRAY_{BEGIN,ENTRY,END} macros are defined - to replace raccess_guess_table[] in both of PIC and non-PIC - modes. - * src/base/ftrfork.c: raccess_guess_table[] array is rewritten - by FT_RFORK_RULE_ARRAY_{BEGIN,ENTRY,END}. - - * src/base/basepic.h (BasePIC): Add `ft_raccess_guess_table' - storage. (FT_RACCESS_GUESS_TABLE_GET): New macro to retrieve - the function pointer from `ft_raccess_guess_table' storage in - `BasePIC' structure. - * src/base/ftrfork.c (FT_Raccess_Guess): Rewritten with - FT_RACCESS_GUESS_TABLE_GET. - (raccess_get_rule_type_from_rule_index): Add `library' as the - first argument to the function, to retrieve the storage of - `ft_raccess_guess_table' from it. Also `raccess_guess_table' - is replaced by FT_RACCESS_GUESS_TABLE_GET. - (ft_raccess_rule_by_darwin_vfs): Ditto. - -2012-01-16 suzuki toshiya - - Remove trailing spaces. - -2012-01-16 suzuki toshiya - - Formatting PIC related sources. - - * src/autofit/afpic.c: Harmonize to FT2 coding conventions. - * src/base/basepic.c: Ditto. - * src/base/ftpic.c: Ditto. - * src/cff/cffpic.c: Ditto. - * src/pshinter/pshpic.c: Ditto. - * src/psnames/pspic.c: Ditto. - * src/raster/rastpic.c: Ditto. - * src/sfnt/sfntpic.c: Ditto. - * src/smooth/ftspic.c: Ditto. - * src/truetype/ttpic.c: Ditto. - -2012-01-16 suzuki toshiya - - [autofit] Fix the inclusion of `aflatin2.h' in PIC file. - - * src/autofit/afpic.c: Include `aflatin2.h' when - FT_OPTION_AUTOFIT2 is defined, as afglobal.c does so. - Unconditionally inclusion causes declared but unimplemented - warning by GCC 4.6. - -2012-01-16 suzuki toshiya - - [cff] Remove redundant declarations of cff_cmap_XXX_class_rec. - - * src/cff/cffpic.c: The declarations of - FT_Init_Class_cff_cmap_encoding_class_rec() and - FT_Init_Class_cff_cmap_unicode_class_rec() are removed. - They can be obtained by the inclusion of cffcmap.h. - cffcmap.h invokes FT_DECLARE_CMAP_CLASS() and it declares - FT_Init_Class_cff_cmap_encoding_class_rec() etc in PIC mode. - -2012-01-15 suzuki toshiya - - Fix redundant declaration warning in PIC mode. - - Originally FT_DEFINE_{DRIVER,MODULE,RENDERER}() macros were - designed to declare xxx_pic_{free,init} by themselves. - Because these macros are used at the end of the module - interface (e.g. ttdriver.c) and the wrapper source to build - a module as a single object (e.g. truetype.c) includes - the PIC file (e.g. ttpic.c) before the module interface, - these macros are expanded AFTER xxx_pic_{free,init} body - when the modules are built as single object. - The declaration after the implementation causes the redundant - declaration warnings, so the declarations are moved to module - PIC headers (e.g. ttpic.h). Separating to other header files - are needed for multi build. - - * include/freetype/internal/ftdriver.h (FT_DEFINE_DRIVER): - Remove class_##_pic_free and class_##_pic_init declarations. - * include/freetype/internal/ftobjs.h (FT_DEFINE_RENDERER, - FT_DEFINE_MODULE): Ditto. - - * src/base/basepic.h: Insert a comment and fix coding style. - * src/autofit/afpic.h: Declare autofit_module_class_pic_{free, - init}. - * src/cff/cffpic.h: Declare cff_driver_class_pic_{free,init}. - * src/pshinter/pshpic.h: Declare pshinter_module_class_pic_{free, - init}. - * src/psnames/pspic.h: Declare psnames_module_class_pic_{free, - init}. - * src/raster/rastpic.h: Declare - ft_raster{1,5}_renderer_class_pic_{free,init} - * src/sfnt/sfntpic.h: Declare sfnt_module_class_pic_{free,init}. - * src/smooth/ftspic.h: Declare - ft_smooth_{,lcd_,lcdv_}renderer_class_pic_{free,init}. - * src/truetype/ttpic.h: Declare tt_driver_class_pic_{free,init}. - -2012-01-15 suzuki toshiya - - Make pspic.c to include module error header to fix multi build. - - * src/psnames/pspic.c: Include `psnamerr.h'. - -2012-01-14 suzuki toshiya - - [base] Fix a dereference of uninitialized variable in PIC mode. - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap): `glyph' must be - set before derefering to obtain `library'. The initialization - of `clazz', `glyph', `library' and NULL pointer check are - reordered to minimize PIC conditonals. - -2012-01-14 suzuki toshiya - - [base] Insert explicit cast for GCC 4.6 in PIC mode. - - * src/base/ftinit.c (FT_Add_Default_Modules): Under PIC - configuration, FT_DEFAULT_MODULES_GET returns - FT_Module_Class** pointer, GCC 4.6 warns that - const FT_Module_Class* const* variable is warned as - inappropriate to store it. To calm it, explicit cast is - inserted. Also `library' is checked to prevent the NULL - pointer dereference in FT_DEFAULT_MODULES_GET. - -2012-01-13 suzuki toshiya - - Fix PIC build broken by d9145241fe378104ba4c12a42534549faacc92e6. - - Under PIC configuration, FT_{CFF,PSCMAPS,SFNT,TT}_SERVICES_GET - take no arguments but derefer the variable named `library' - internally. - - * src/cff/cffdrivr.c (cff_get_interface): Declare `library' and - set it if non-NULL driver is passed. - * src/truetype/ttdriver.c (tt_get_interface): Ditto. - - * src/sfnt/sfdriver.c (sfnt_get_interface): Declare `library' - under PIC configuration, and set it if non-NULL module is given. - * src/psnames/psmodule.c (psnames_get_interface): Ditto. - -2012-01-13 suzuki toshiya - - Make PIC files include module error headers, to use the error codes - with per-module prefix. - - * src/autofit/afpic.c: Include `aferrors.h'. - * src/cff/cffpic.c: Include `cfferrs.h'. - * src/pshinter/pshpic.c: Include `pshnterr.h'. - * src/raster/rastpic.c: Include `rasterrs.h'. - * src/sfnt/sfntpic.c: Include `sferrors.h'. - * src/smooth/ftspic.c: Include `ftsmerrs.h'. - * src/truetype/ttpic.c: Include `tterrors.h'. - -2012-01-04 Tobias Ringström - - [truetype] Fix IP instruction if x_ppem != y_ppem. - - * src/truetype/ttinterp.c (Ins_IP): Scale `orus' coordinates - properly. - -2012-01-02 Werner Lemberg - - Fix tracing message for `loca' table. - - * src/truetype/ttpload.c (tt_face_get_location): Don't emit a - warning message if the last `loca' entry references an empty glyph. - -2011-12-10 Werner Lemberg - - Add some variable initializations. - Reported by Richard COOK . - - * src/type1/t1driver.c (t1_ps_get_font_value): Initialize `val'. - * src/smooth/ftgrays.c (gray_render_conic): Initialize `levels' - earlier. - -2011-12-08 Werner Lemberg - - Fix serious scaling bug in `FT_Get_Advances'. - - * src/base/ftadvanc.c (FT_Get_Advances): Advance values returned by - `FT_Load_Glyph' must be simply multiplied by 1024. - -2011-12-08 Werner Lemberg - - * src/bdf/bdflib.c (_bdf_parse_start): Drop redundant error tracing. - -2011-12-02 suzuki toshiya - - [mac] Unify DARWIN_NO_CARBON with FT_MACINTOSH. - - Originally FT_MACINTOSH was a pure auto macro and DARWIN_NO_CARBON - was a configurable macro to disable Carbon-dependent code. Because - now configure script sets DARWIN_NO_CARBON by default and disables - Darwin & Carbon-dependent codes, these macros can be unified. - FT_MACINTOSH (undefined by default) is kept and DARWIN_NO_CARBON - (defined by default) is removed, because DARWIN_NO_CARBON violates - FT_XXX naming convention of public macros, and a macro configured by - default is not portable for the building without configure (e.g. - make devel). - - * builds/unix/configure.raw: Define FT_MACINTOSH if Carbon-based - old Mac font support is requested and Carbon is available. - * builds/unix/ftconfig.in: Undefine FT_MACINTOSH when the support - for Mac OS X without Carbon (e.g. Mac OS X 10.4 for ppc64) is - requested. - * include/freetype/config/ftconfig.in: Ditto. - * builds/vms/ftconfig.h: Ditto. - - * src/base/ftbase.h: Remove DARWIN_NO_CARBON. - * src/base/ftbase.c: Ditto. - * src/base/ftobjs.c: Ditto. - * src/base/ftrfork.c: Ditto. - - * src/base/ftmac.c: Compile the body if FT_MACINTOSH is defined - (same with TT_USE_BYTECODE_INTERPRETER in ttinterp.c). - * builds/mac/ftmac.c: Ditto. - - * builds/mac/FreeType.m68k_cfm.make.txt: Define FT_MACINTOSH. - * builds/mac/FreeType.m68k_far.make.txt: Ditto. - * builds/mac/FreeType.ppc_classic.make.txt: Ditto. - * builds/mac/FreeType.ppc_carbon.make.txt: Ditto. - -2011-11-30 suzuki toshiya - - Fix Savannah bug #34728 (`make devel' on Mac OS X). - - * builds/toplevel.mk: Check `/dev/null' to identify the Unix- - like systems without `init' nor `hurd' (e.g. Mac OS X >= 10.4). - * builds/unix/detect.mk: Ditto. - -2011-11-30 suzuki toshiya - - [apinames] Fix the overflow of signed integer hash. - - * src/tools/apinames.c (names_add): Change the type of `h' from - int to unsigned int, to prevent undefined behaviour in the - overflow of signed integers (overflow of unsigned int is defined - to be wrap around). Found by clang test suggested by Sean - McBride. - -2011-11-30 Werner Lemberg - - [winfonts] Remove casts. - - * src/winfonts/winfnt.c (winfnt_driver_class): Remove all casts and - update affected functions. - (FNT_Size_Select): Fix number of arguments. - -2011-11-30 Werner Lemberg - - [type42] Remove casts. - - * src/type42/t42driver.c (t42_driver_class): Remove all casts and - update affected functions. - - * src/type42/t42objs.c, src/type42/t42objs.h: Updated for t42driver - changes. - -2011-11-30 Werner Lemberg - - [type1] Remove casts. - - * src/type1/t1driver.c (t1_driver_class): Remove all casts and - update affected functions. - - * src/type1/t1gload.c, src/type1/t1gload.h, src/type1/t1objs.c: - Updated for t1driver changes. - src/type1/t1objs.h (T1_Driver): Remove unused typedef. - Updated for t1driver changes. - -2011-11-27 Werner Lemberg - - [bdf] Fix Savannah bug #34896. - - ENCODING now covers the whole Unicode range. - - Note, however, that this change is quite expensive since it - increases the size of three arrays by almost 400kByte in total. The - right fix is to replace the logic with something smarter. - Additionally, there exist very old BDFs for three-byte CCCII - encoding which exceeds the range of Unicode (another reason to have - a smarter logic). - - * src/bdf/bdf.h (bdf_font_t): Increase size of `nmod' and `umod' - arrays. - * src/bdf/bdflib.c (bdf_parse_t): Increase size of `have' array. - -2011-11-27 Werner Lemberg - - [bdf] Improve tracing. - - * src/bdf/bdflib.c (DBGMSG1, DBGMSG2): New macros. - (_bdf_parse_glyphs): Use them. - -2011-11-26 Werner Lemberg - - Improve tracing. - - * src/bdf/bdfdrivr.c (BDF_Face_Done), src/pcf/pcfdrivr.c - (PCF_Face_Done): Remove tracing message. - - * src/bdf/bdfdrivr.c (BDF_Face_Init), src/cff/cffobjs.c - (cff_face_init), src/cid/cidobjs.c (cid_face_init), - src/pfr/pfrobjs.c (pfr_face_init), src/sfnt/sfobjs.c - (sfnt_init_face), src/truetype/ttobjs.c (tt_face_init), - src/type1/t1objs.c (T1_Face_Init), src/type42/t42objs.c - (T42_Face_Init), src/winfonts/winfnt.c (FNT_Face_Init): Add - `greeting' message. - - * src/sfnt/sfobjs.c (sfnt_open_font), src/type42/t42objs.c - (T42_Open_Face): Improve tracing. - -2011-11-26 Werner Lemberg - - [cid] Fix error code. - - * src/cid/cidparse.c (cid_parser_new): Do it. - -2011-11-26 Werner Lemberg - - [cff] Fix error code. - - * src/cff/cffload.c (cff_font_load): Do it. - -2011-11-26 Werner Lemberg - - Add new error code FT_Err_Missing_Module. - - Previously, FreeType misleadingly returned - FT_Err_Unknown_File_Format if a module was missing (or a test was - missing completely). - - * include/freetype/fterrdef.h (FT_Err_Missing_Module): Define. - - * src/cff/cffobjs.c (cff_face_init), src/cff/cffdrivr.c - (cff_get_glyph_name), src/cid/cidobjs.c (cid_face_init), - src/sfnt/sfobjs.c (sfnt_init_face), src/truetype/ttobjs.c - (tt_face_init), src/type1/t1objs.c (T1_Face_Init), - src/type42/t42objs.c (T42_Face_Init, T42_Driver_Init): Updated. - - * src/type1/t1afm.c (T1_Read_Metrics), src/type/t1objs.c - (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Remove now - redundant test for `psaux'. - -2011-11-25 Werner Lemberg - - [bdf] Add more error messages. - - * src/bdf/bdflib.c (_bdf_set_default_spacing, _bdf_add_property): - Add line number argument. - Update all callers. - (ERRMSG5, ERRMSG6, ERRMSG7, ERRMSG8, ERRMSG9): New macros. - (_bdf_readstream, _bdf_set_default_spacing, _bdf_add_property, - _bdf_parse_glyphs, _bdf_parse_start): Add error messages. - -2011-11-24 Werner Lemberg - - * include/freetype/fterrors.h: Remove dead code. - -2011-11-15 Werner Lemberg - - * docs/releases: Updated. - -2011-11-15 Werner Lemberg - - * Version 2.4.8 released. - ========================= - - - Tag sources with `VER-2-4-8'. - - * docs/CHANGES: Updated. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.4.8. - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.4.7/2.4.8/, s/247/248/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8. - - * builds/unix/configure.raw (version_info): Set to 14:0:8. - -2011-11-13 Chris Liddell - - Add FT_Get_PS_Font_Value() API. - - This allows a Type 1 font face to be interrogated to retrieve most - of the dictionary keys (keys not relevant to FreeType's Type 1 - interpreter are not available). - - * include/freetype/internal/services/svpsinfo.h - (PS_GetFontValueFunc): New typedef. - (PSInfo): Add `ps_get_font_value'. - (FT_DEFINE_SERVICE_PSINFOREC): Updated. - - * include/freetype/internal/t1types.h (T1_EncodingType): Moved to... - * include/freetype/t1tables.h: Here. - (PS_Dict_Keys): New enumeration. - (FT_Get_PS_Font_Value): New declaration. - - * src/base/fttype1.c (FT_Get_PS_Font_Value): New function. - - * src/type1/t1driver.c (t1_ps_get_font_value): This new function - does the real job. - (t1_service_ps_info): Add it. - - * src/cff/cffdrivr.c (cff_service_ps_info), src/cid/cidriver.c - (cid_service_ps_info), src/type42/t42drivr.c (t42_service_ps_info): - Updated. - -2011-11-08 Braden Thomas - - [cid] Various loading fixes. - - * src/cid/cidload.c (cid_load_keyword) , - (parse_font_matrix, parse_expansion_factor): Correctly check number - of dictionaries. - (cid_read_subrs): Protect against invalid values of `num_subrs'. - Assure that the elements of the `offsets' array are ascending. - -2011-11-05 Werner Lemberg - - * README: We use copyright ranges also. - - According to - - http://www.gnu.org/prep/maintain/html_node/Copyright-Notices.html - - this should be mentioned explicitly. - -2011-10-30 suzuki toshiya - - [raccess] Supplement for previous fix. - - * src/base/ftbase.h (raccess_rule_by_darwin_vfs): Do not declare - it on native Mac OS X. - * src/base/ftrfork.c (raccess_get_rule_type_from_rule_index): - Hide raccess_get_rule_type_from_rule_index() on native Mac OS X - too. - -2011-10-30 suzuki toshiya - - [raccess] Hide raccess_rule_by_darwin_vfs() on native Mac OS X. - - * src/base/ftrfork.c (raccess_rule_by_darwin_vfs): Do not - compile on native Mac OS X because it is not used. - -2011-10-25 Werner Lemberg - - [truetype] Fix MD instruction for twilight zone. - - * src/truetype/ttinterp.c (Ins_MD): Without this fix, the MD - instruction applied to original coordinates of twilight points - always returns zero. - -2011-10-18 Werner Lemberg - - * Version 2.4.7 released. - ========================= - - - Tag sources with `VER-2-4-7'. - - * docs/CHANGES: Updated. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.4.7. - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.4.6/2.4.7/, s/246/247/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7. - - * builds/unix/configure.raw (version_info): Set to 13:2:7. - -2011-10-15 Kal Conley - - Fix handling of transformations if no renderer is present. - - * src/base/ftobjs.c (FT_Load_Glyph): Thinko. - -2011-10-15 Kal Conley - - Fix conditions for autohinting. - - * src/base/ftobjs.c (FT_Load_Glyph): Handle - FT_LOAD_IGNORE_TRANSFORM. - -2011-10-07 suzuki toshiya - - [gxvalid] Fix a bug to detect too large offset in morx table. - - * src/gxvalid/gxvmorx2.c - (gxv_morx_subtable_type2_ligActionIndex_validate): Fix a bug - that too large positive offset cannot be detected. - -2011-10-01 Braden Thomas - - Handle some border cases. - - * include/freetype/config/ftstdlib.h (FT_USHORT_MAX): New macro. - - * src/base/ftbitmap.c (FT_Bitmap_Convert): Protect against invalid - value of `target->rows'. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Add check for - flex start. - - * src/raster/ftrend1.c (ft_raster1_render): Check `width' and - `height'. - - * src/truetype/ttgxvar.c (TT_Vary_Get_Glyph_Deltas): Protect against - invalid values in `localpoints' array. - -2011-10-01 Werner Lemberg - - [psnames] Handle zapfdingbats. - Problem reported by Nicolas Rougier . - - * src/tools/glnames.py (adobe_glyph_list): Add data from AGL's - `zapfdingbats.txt' file. - - * src/psnames/pstables.h: Regenerated. - -2011-09-27 Simon Bünzli - - [type1] Fix Savannah bug #34189. - - * src/type1/t1load.c (T1_Open_Face): Initialize - `face->len_buildchar'. - -2011-09-26 Werner Lemberg - - [cff] Dump SIDs while tracing. - - * src/cff/cffobjs.c (cff_face_init): Do it. - - * src/cff/cffparse.c (cff_parser_run) [FT_DEBUG_LEVEL_TRACE] - : Identify as SID. - -2011-09-17 Werner Lemberg - - Remove unused FT_ALIGNMENT macro. - - * builds/unix/ftconfig.in, builds/vms/ftconfig.h, - include/freetype/config/ftconfig.h: Do it. - -2011-09-17 Alexei Podtelezhnikov - - [smooth] Slightly optimize conic and cubic flatterners. - - * src/smooth/ftgrays.c (gray_render_conic, gray_render_cubic): Move - out some code from the main loop to speed it up. - -2011-09-11 Tomas Hoger - - Slightly improve LZW_CLEAR handling. - - * src/lzw/ftzopen.c (ft_lzwstate_io) : - Ensure that subsequent (modulo garbage byte(s)) LZW_CLEAR codes are - handled as clear codes. This also re-sets old_code and old_char to - predictable values, which is a little better than using `random' - ones if the code following LZW_CLEAR is invalid. - -2011-09-11 Tomas Hoger - - Add explicit LZW decompression stack size limit. - - Stack larger than 1<prefix[code - 256] - when traversing prefix table. Such check is less efficient and - should not be required if prefix table is constructed correctly in - the first place. - - * src/lzw/ftzopen.c (ft_lzwstate_stack_grow): Implement it. - -2011-09-11 Tomas Hoger - - Protect against loops in the prefix table. - - LZW decompressor did not sufficiently check codes read from the - input LZW stream. A specially-crafted or corrupted input could - create a loop in the prefix table, which leads to memory usage - spikes, as there's no decompression stack size limit. - - * src/lzw/ftzopen.c (ft_lzwstate_io) : First - code in valid LZW stream must be 0..255. - : In the special KwKwK case, code == free_ent, - code > free_ent is invalid. - -2011-09-09 Werner Lemberg - - Better tracing of metrics. - - * src/base/ftobjs.c (FT_Request_Size, FT_Select_Size): Decorate with - FT_TRACE. - -2011-09-07 Werner Lemberg - - [cff] Fix Savannah bug #33816. - - * src/cff/cfftypes.h (CFF_FontRecDictRec): New member - `has_font_matrix'. - * src/cff/cffparse.c (cff_parse_font_matrix): Set it. - Update tracing output. - * src/cff/cffobjs.c (cff_face_init): Use it so that the heuristics - can be removed. - -2011-08-30 Werner Lemberg - - Better tracing of metrics. - - * src/base/ftobjs.c (FT_Select_Metrics, FT_Request_Metrics): - Decorate with FT_TRACE. - -2011-08-25 Werner Lemberg - - [cff] Better tracing of the parsing process. - - * src/cff/cffload.c (cff_subfont_load, cff_font_load): Decorate with - FT_TRACE. - - * src/cff/cffparse.c (cff_parse_font_matrix, cff_parse_font_bbox, - cff_parse_private_dict, cff_parse_cid_ros): Updated. - (CFF_FIELD_NUM, CFF_FIELD_FIXED, CFF_FIELD_FIXED_1000, - CFF_FIELD_STRING, CFF_FIELD_BOOL, CFF_FIELD_CALLBACK, CFF_FIELD, - CFF_FIELD_DELTA): Add argument for ID. - (cff_parser_run): Decorate with FT_TRACE. - - * src/cff/cffparse.h (CFF_Field_Handler) [FT_DEBUG_LEVEL_TRACE]: Add - `id' member. - - * src/cff/cfftoken.h: Add IDs to all fields. - -2011-08-16 Werner Lemberg - - Fix Savannah bug #34022. - - * README, docs/INSTALL: Remove references to UPGRADE.UNIX. - -2011-08-15 Werner Lemberg - - Fix Savannah bug #34018. - - * docs/UPGRADE.UNIX: Removed. Obsolete. - -2011-08-15 David Bevan - - Fix Savannah bug #33992. - - * src/base/ftstroke.c (FT_Stroker_ParseOutline): Fix border case. - -2011-08-12 Werner Lemberg - - [cff] Fix Savannah bug #33975. - - * src/cff/cffparse.c (cff_parse_font_matrix): Fix typo. - -2011-07-29 Werner Lemberg - - * Version 2.4.6 released. - ========================= - - - Tag sources with `VER-2-4-6'. - - * docs/CHANGES: Updated. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.4.6. - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.4.5/2.4.6/, s/245/246/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6. - - * builds/unix/configure.raw (version_info): Set to 13:1:7. - -2011-07-29 Werner Lemberg - - [cff] Add some more tracing infos. - - * src/cff/cffparse.c (cff_parse_font_matrix, cff_parse_font_bbox, - cff_parse_cid_ros): Add tracing. - -2011-07-22 Dirk Müller - - [psaux, type1] Fix null pointer dereferences. - - Found with font fuzzying. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Check - `decoder->buildchar'. - - * src/type1/t1load.c (t1_load_keyword): Check `blend->num_designs'. - -2011-07-20 Chris Morgan - - Add FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT. - - Useful for embedded systems which don't need file stream support. - - * src/base/ftsystem.c, src/base/ftobjs.c (FT_Stream_New): Implement - it. - -2011-07-20 Elton Chung - - * src/base/ftpatent.c (FT_Face_SetUnpatentedHinting): Fix typo. - -2011-07-16 Steven Chu - - [truetype] Fix metrics on size request for scalable fonts. - - * src/truetype/ttdriver.c (tt_size_request): Fix copying metrics - from TT_Size to FT_Size if scalable font. - - See - - http://lists.gnu.org/archive/html/freetype-devel/2011-07/msg00049.html - - for some comparison images. - -2011-07-14 Matthias Drochner . - - [psaux] Fix potential sign extension problems. - - When shifting right a signed value, it is not defined by the - C standard whether one gets a sign extension or not. Use a macro to - do an explicit cast from a signed short (assuming that this is - 16bit) to an int. - - * src/psaux/t1decode.c (Fix2Int): New macro. - Use it where appropriate. - -2011-07-14 Werner Lemberg - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings) - : Better handling of subroutine index 0. - From Matthias Drochner . - -2011-07-10 Алексей Подтележников - - [psaux] Optimize previous commit. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings) - : Move error check down to avoid testing twice for - good cases. - -2011-07-08 Werner Lemberg - - [psaux] Add better argument check for `callothersubr'. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings) - : Reject negative arguments. - -2011-07-07 Werner Lemberg - - [sfnt] Try harder to find non-zero values for ascender and descender. - - * src/sfnt/sfobjs.c (sfnt_load_face): Consult `OS/2' table in case - the `hhea' table's values are zero. - -2011-07-03 Werner Lemberg - - Fix previous commit. - - We want to unset FT_FACE_FLAG_SCALABLE only if there are bitmap - strikes in the font. - - * src/truetype/ttobjs.c (tt_face_init): Implement it. - - * docs/CHANGES: Updated. - -2011-07-02 Just Fill Bugs - - [truetype] Fix Savannah bug #33246. - - * src/truetype/ttobjs.c (tt_check_single_notdef): New function. - (tt_face_init): Use it to test FT_FACE_FLAG_SCALABLE. - -2011-07-02 Werner Lemberg - - * docs/CHANGES: Updated. - -2011-07-02 David Bevan - - [ftstroke] Major revision. - - The main problems - ----------------- - - o If FT_STROKER_LINEJOIN_BEVEL was specified, unlimited miter - joins (not bevel joins) were generated. Indeed, the meanings of - `miter' and `bevel' were incorrectly reversed (consistently) in - both the code and comments. - - o The way bevel joins were constructed (whether specified - explicitly, or created as a result of exceeding the miter limit) - did not match what is required for stroked text in PostScript or - PDF. - - The main fixes - -------------- - - o The behaviour of FT_STROKER_LINEJOIN_BEVEL has been corrected. - - o A new line join style, FT_STROKER_LINEJOIN_MITER_FIXED, has been - introduced to support PostScript and PDF miter joins. - - o FT_STROKER_LINEJOIN_MITER_VARIABLE has been introduced as an - alias for FT_STROKER_LINEJOIN_MITER. - - Additionally, a variety of stroking errors have been fixed. These - would cause various artifacts (including points `at infinity'), - especially when stroking poor quality fonts. - - See - - http://lists.gnu.org/archive/html/freetype-devel/2011-07/msg00001.html - - for example documents. The FreeType stroker now produces results - very similar to that produced by GhostScript and Distiller for these - fonts. - - Other problems - -------------- - - The following problems have been resolved: - - o Inside corners could be generated incorrectly. Intersecting the - inside corner could cause a missing triangular area and other - effects. - - The intersection point can only be used if the join is between - two lines and both lines are long enough. The `optimization' - condition in `ft_stroker_inside' has been corrected; this - requires the line length to be passed into various functions and - stored in `FT_StrokerRec'. - - o Incorrect cubic curves could be generated. The angle - calculations in `FT_Stroker_CubicTo' have been corrected to - handle the case of the curve crossing the +/-PI direction. - - o If the border radius was greater than the radius of curvature of - a curve, then the negative sector would end up outside (not - inside) the border. This situation is now recognized and the - negative sector is circumnavigated in the opposite direction. - (If round line joins are being used, this code is disabled - because the line join will always cover the negative sector.) - - o When a curve is split, the arcs may not join smoothly (especially - if the curve turns sharply back on itself). Changes in - direction between adjacent arcs were not handled. A round - corner is now added if the deviation from one arc to the next is - greater than a suitable threshold. - - o The current direction wasn't retained if a the outline contained - a zero length lineto or a curve that was determined to be - `basically a point'. This could cause a spurious join to be - added. - - o Cubics with close control points could be mishandled. All eight - cases are now distinguished correctly. - - Other improvements - ------------------ - - o Borders for cubic curves could be too `flat'. - FT_SMALL_CUBIC_THRESHOLD has been reduced a little to prevent - this. - - o The handling and use of movable points has been simplified a - little. - - o Various values are now computed only if the results are actually - needed. - - o The directions of the outer and inner borders have been swapped, - as recommended by Graham Asher. - - * src/base/ftstroke.c: Revised. - * include/freetype/ftstroke.h: Updated. - -2011-06-30 İsmail Dönmez - - * builds/toplevel.mk: We use git, not CVS, thus skip `.gitignore'. - -2011-06-29 Werner Lemberg - - [bdf] Fix Savannah bug #33663. - - * src/bdf/bdflib.c (_bdf_parse_glyphs): Handle negative values for - ENCODING correctly. - - * docs/CHANGES: Document it. - -2011-06-24 Werner Lemberg - - * Version 2.4.5 released. - ========================= - - - Tag sources with `VER-2-4-5'. - - * docs/CHANGES: Updated. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.4.5 - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.4.4/2.4.5/, s/244/245/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5. - - * builds/unix/configure.raw (version_info): Set to 13:0:7. - -2011-06-20 Werner Lemberg - - * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Fix change - from 2011-05-04. - -2011-06-19 suzuki toshiya - - [gxvalid] make the `prop' validation tracing verbose. - - * src/gxvalid/gxvprop.c: Add tracing messages for errors. - -2011-06-19 suzuki toshiya - - [autogen.sh] Reflect environment variable LIBTOOLIZE. - -2011-06-18 Werner Lemberg - - Update license documentation. - - * docs/GPL.TXT: Renamed to... - * docs/GPLv2.TXT: This. - - * docs/LICENSE.TXT: Updated. - -2011-06-14 suzuki toshiya - - Fix g++4.6 compiler warnings in module drivers. - - The background is same with previous commit. - - * src/truetype/ttgxvar.c (ft_var_readpackedpoints): - Init `points'. (TT_Vary_Get_Glyph_Deltas): Init - `delta_xy'. (TT_Get_MM_Var): Init `mmvar'. - * src/type1/t1load.c (T1_Get_MM_Var): Ditto. - * src/cff/cffdrivr.c (cff_ps_get_font_info): Init - `font_info'. - * src/cff/cffload.c (cff_index_get_pointers): Init `t'. - (cff_font_load): Init `sub'. - * src/cff/cffobjs.c (cff_size_init): Init `internal'. - (cff_face_init): Init `cff'. - * src/pfr/pfrload.c (pfr_extra_item_load_stem_snaps): - Init `snaps'. - * src/pcf/pcfread.c (pcf_get_properties): Init `properties'. - (pcf_get_bitmaps): Init `offsets'. (pcf_get_encodings): - Init `tmpEncoding'. - * src/sfnt/ttload.c (tt_face_load_gasp): Init `gaspranges'. - * src/sfnt/ttsbit.c (Load_SBit_Image): Init `components'. - * src/cache/ftcmru.c (FTC_MruList_New): Init `node'. - * src/gzip/ftgzip.c (FT_Stream_OpenGzip): Init `zip' and - `zip_buff'. - * src/lzw/ftlzw.c (FT_Stream_OpenLZW): Init `zip'. - * src/bzip2/ftbzip2.c (FT_Stream_OpenBzip2): Init `zip'. - -2011-06-14 suzuki toshiya - - [base] Fix g++4.6 compiler warnings in src/base/*.c. - - Passing uninitialized pointer to FT_NEW() families is - not problematic theoretically (as far as the returned - pointer is checked before writing), but g++4.6 dislikes - it and warns by -Wuninitialized. Initialize them by NULL. - - * src/base/ftobjs.c (FT_Stream_New): Init `stream'. - (new_memory_stream): Ditto. - (FT_New_GlyphSlot): Init `slot'. - (FT_CMap_New): Init `cmap'. - (open_face_PS_from_sfnt_stream): Init `sfnt_ps'. - (Mac_Read_POST_Resource): Init `pfb_data'. - (Mac_Read_sfnt_Resource): Init `sfnt_data'. - * src/base/ftrfork.c (FT_Raccess_Get_DataOffsets): - Init `offsets_internal' and `ref'. - (raccess_guess_darwin_hfsplus): Init `newpath'. - (raccess_guess_darwin_newvfs): Ditto. - * src/base/ftbitmap.c (ft_bitmap_assure_buffer): - Init `buffer'. - * src/base/ftstroke.c (FT_Stroker_New): Init `stroker'. - -2011-06-14 suzuki toshiya - - [gxvalid] Cleanup. - - Some invalid, overrunning, unrecommended non-zero values - are cared in paranoid validation mode only. There are - many lines looking like: - - if ( valid->root->level >= FT_VALIDATE_PARANOID ) - FT_INVALID_xxx; - - To simplify them, GXV_SET_ERR_IF_PARANOID( err ) is - introduced for more paranoid validation in future. - - * src/gxvalid/gxvcommn.h (IS_PARANOID_VALIDATION): - New macro to assure valid->root->level is more or - equal to FT_VALIDATE_PARANOID. (GXV_SET_ERR_IF_PARANOID): - New macro to raise an error if in paranoid validation. - * src/gxvalid/gxvcommn.c: Use GXV_SET_ERR_IF_PARANOID(). - * src/gxvalid/gxvfeat.c: Ditto. - * src/gxvalid/gxvjust.c: Ditto. - * src/gxvalid/gxvkern.c: Ditto. - * src/gxvalid/gxvmort.c: Ditto. - * src/gxvalid/gxvmort0.c: Ditto. - * src/gxvalid/gxvmort1.c: Ditto. - * src/gxvalid/gxvmort2.c: Ditto. - * src/gxvalid/gxvmorx1.c: Ditto. - * src/gxvalid/gxvmorx2.c: Ditto. - -2011-06-14 suzuki toshiya - - [gxvalid] Fix gcc4.6 compiler warnings in gxvtrak.c. - - * src/gxvalid/gxvtrak.c (gxv_trak_trackTable_validate): - Check different entries pointing same traking value. - (gxv_trak_validate): Remove unused variable `table_size'. - -2011-06-14 suzuki toshiya - - [gxvalid] Fix gcc4.6 compiler warnings in gxvmorx*.c. - - * src/gxvalid/gxvmorx.c (gxv_morx_subtables_validate): - Conditionalize unvalidated variable `subFeatureFlags'. - (gxv_morx_chain_validate): Conditionalize unvalidated - variable `defaultFlags'. - - * src/gxvalid/gxmorx0.c - (gxv_morx_subtable_type0_entry_validate): - Conditionalize unvalidated variables; `markFirst', - `dontAdvance', `markLast', `verb'. - - * src/gxvalid/gxmorx1.c - (gxv_morx_subtable_type1_entry_validate): Conditionalize - unvalidated variables; `setMark', `dontAdvance'. - - * src/gxvalid/gxvmorx2.c - (gxv_morx_subtable_type2_ligActionOffset_validate): - Conditionalize unvalidated variables; `last', `store'. - Checking for overrunning offset is added. - (gxv_morx_subtable_type2_entry_validate): - Conditionalize unvalidated variables; `setComponent', - `dontAdvance', `performAction'. - (gxv_morx_subtable_type2_ligatureTable_validate): - Check if the GID for ligature does not exceed the - max GID in `maxp' table. - - * src/gxvalid/gxvmort5.c - (gxv_morx_subtable_type5_InsertList_validate): - Conditionalize unvalidated loading of `insert_glyphID' - array. (gxv_morx_subtable_type5_entry_validate): - Conditionalize unvalidated variables; `setMark', - `dontAdvance', `currentIsKashidaLike', - `markedIsKashidaLike', `currentInsertBefore', - `markedInsertBefore'. - -2011-06-14 suzuki toshiya - - [gxvalid] Fix gcc4.6 compiler warnings in gxvmort*.c. - - * src/gxvalid/gxvmort.c (gxv_mort_subtables_validate): - Conditionalize unvalidated variable `subFeatureFlags'. - (gxv_mort_chain_validate): Conditionalize unvalidated - variable `defaultFlags'. - - * src/gxvalid/gxmort0.c - (gxv_mort_subtable_type0_entry_validate): Check the - conflict of the marks for the glyphs. - - * src/gxvalid/gxmort1.c - (gxv_mort_subtable_type1_offset_to_subst_validate): - Local variables `min_gid', `max_gid' are replaced by - variables in the validator. - (gxv_mort_subtable_type1_entry_validate): Conditionalize - unvalidated variables; `setMark', `dontAdvance'. - (gxv_mort_subtable_type1_substTable_validate): - Validate the GID by the min/max GIDs in the validator. - - * src/gxvalid/gxvmort2.c - (gxv_mort_subtable_type2_ligActionOffset_validate): - Conditionalize unvalidated variables; `last', `store'. - Checking for overrunning offset is added. - (gxv_mort_subtable_type2_entry_validate): - Conditionalize unvalidated variables; `setComponent', - `dontAdvance'. - (gxv_mort_subtable_type2_ligatureTable_validate): - Check if the GID for ligature does not exceed the - max GID in `maxp' table. - - * src/gxvalid/gxvmort5.c - (gxv_mort_subtable_type5_InsertList_validate): - Conditionalize unvalidated loading of `insert_glyphID' - array. (gxv_mort_subtable_type5_entry_validate): - Conditionalize unvalidated variables; `setMark', - `dontAdvance', `currentIsKashidaLike', - `markedIsKashidaLike', `currentInsertBefore', - `markedInsertBefore'. - -2011-06-14 suzuki toshiya - - [gxvalid] Fix gcc4.6 compiler warnings in gxvkern.c. - - * src/gxvalid/gxvkern.c - (gxv_kern_subtable_fmt0_pairs_validate): Conditionalize - unvalidated variable `kernValue'. - (gxv_kern_subtable_fmt1_entry_validate): Conditionalize - unvalidated variables; `push', `dontAdvance', `kernAction', - `kernValue'. - (gxv_kern_coverage_new_apple_validate): Conditionalize - trace-only variables; `kernVertical', `kernCrossStream', - `kernVariation'. - (gxv_kern_coverage_classic_apple_validate): Conditionalize - trace-only variables; `horizontal', `cross_stream'. - (gxv_kern_coverage_classic_microsoft_validate): - Conditionalize trace-only variables; `horizontal', - `minimum', `cross_stream', `override'. - (gxv_kern_subtable_validate): Conditionalize trace-only - variables; `version', `tupleIndex'. - -2011-06-14 suzuki toshiya - - [gxvalid] Fix gcc4.6 compiler warnings in gxvjust.c. - - * src/gxvalid/gxvjust.c (gxv_just_check_max_gid): - New function to unify the checks of too large GID. - (gxv_just_wdp_entry_validate): Conditionalize unvalidated - variables; `beforeGrowLimit', `beforeShrinkGrowLimit', - `afterGrowLimit', `afterShrinkGrowLimit', `growFlags', - `shrinkFlags'. Additional check for non-zero values in - unused storage `justClass' is added. - (gxv_just_actSubrecord_type0_validate): Conditionalize - unvalidated variable `order'. GID is checked by - gxv_just_check_max_gid(). Additional check for upside-down - relationship between `lowerLimit' and `upperLimit' is added. - (gxv_just_actSubrecord_type1_validate): GID is checked by - gxv_just_check_max_gid(). - (gxv_just_actSubrecord_type2_validate): Conditionalize - unvalidated variable `substThreshhold'. GID is checked by - gxv_just_check_max_gid(). - (gxv_just_actSubrecord_type5_validate): GID is checked by - gxv_just_check_max_gid(). - (gxv_just_classTable_entry_validate): Conditionalize - unvalidated variables; `setMark', `dontAdvance', - `markClass', `currentClass'. - -2011-06-14 suzuki toshiya - - [gxvalid] Preparation to fix gcc4.6 compiler warnings. - - * src/gxvalid/gxvcommn.h (GXV_LOAD_TRACE_VARS): New macro to - conditionalize the variable which is only used for trace messages. - Automatically set by FT_DEBUG_LEVEL_TRACE. - (GXV_LOAD_UNUSED_VARS): New macro to conditionalize the loading of - unvalidated variables. Undefined by default to calm gcc4.6 warning. - (GXV_ValidatorRec.{min_gid,max_gid}): New variables to hold defined - GID ranges, for the comparison of GID ranges in different subtables. - -2011-06-08 Werner Lemberg - - [autofit] Remove unused structure member. - - * src/autofit/afhints.h (AF_SegmentRec): Remove `contour'. - * src/autofit/aflatin.c (af_latin_hints_compute_segments), - src/autofit/aflatin2.c (af_latin2_hints_compute_segments): Updated. - -2011-05-30 Werner Lemberg - - Fix g++ 4.6 compilation. - - * src/autofit/afhints.c (af_glyph_hints_dump_segments, - af_glyph_hints_dump_edges): Use cast. - -2011-05-30 Werner Lemberg - - Fix gcc 4.6 compiler warnings. - - * src/autofit/afcjk.c (af_cjk_metrics_init_blues): Use casts and - remove unused variables. - * src/autofit/aflatin.c (af_latin_hints_compute_edges): Comment out - `up_dir'. - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Use `height_org' - and `width_org' conditionalized. - -2011-05-28 suzuki toshiya - - [mac] Conditionalize the inclusion of `AvailabilityMacros.h'. - - The native SDK on earliest Mac OS X (10.0-10.1) did not have - `AvailabilityMacros.h'. To prevent the inclusion of missing - header file, ECANCELED (introduced in 10.2) in POSIX header - file is checked to detect the system version. - - * include/freetype/config/ftconfig.h: Conditionalize the - inclusion of `AvailabilityMacros.h'. - * builds/unix/ftconfig.in: Ditto. - * builds/vms/ftconfig.h: Ditto. - -2011-05-27 Werner Lemberg - - [autofit] Improve tracing of hinting process. - - * src/autofit/aflatin.c (af_latin_hint_edges): Add tracing message - `ADJUST'. - -2011-05-26 Werner Lemberg - - [autofit] Fix trace message. - - * src/autofit/aflatin.c (af_latin_hint_edges): Show correct value in - tracing message. - -2011-05-24 Daniel Zimmermann - - Reduce warnings for MS Visual Studio 2010. - - * src/autofit/afhints.c (af_glyph_hints_get_num_segments, - af_glyph_hints_get_segment_offset) [!FT_DEBUG_AUTOFIT]: Provide - return value. - * src/cff/cffgload.c (cff_slot_load): Add cast. - * src/truetype/ttobjs.c (tt_check_trickyness_sfnt_ids): Use proper - loop variable type. - -2011-05-16 suzuki toshiya - - Automake component `builds/unix/install-sh' is removed. - - * builds/unix/install-sh: Removed. It is not needed to - include repository, because autogen.sh installs it. - * builds/unix/.gitignore: Register install-sh. - -2011-05-12 suzuki toshiya - - [autofit] Make trace message for CJK bluezone more verbose. - -2011-05-08 Just Fill Bugs - suzuki toshiya - - [autofit] Add bluezones for CJK Ideographs. - - To remove extremas of vertical strokes of CJK Ideographs at - low resolution and make the top and bottom horizontal stems - aligned, bluezones for CJK Ideographs are calculated from - sample glyphs. At present, vertical bluezones (bluezones - to align vertical stems) are disabled by default. For detail, see - http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00070.html - http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00092.html - http://lists.gnu.org/archive/html/freetype-devel/2011-05/msg00001.html - - * include/freetype/internal/fttrace.h: New trace component `afcjk'. - * src/autofit/afcjk.h (AF_CJK{Blue,Axis,Metric}Rec): Add CJK version - for AF_Latin{Blue,Axis,Metric}Rec. - (af_cjk_metrics_check_digits): Ditto, shared with Indic module. - (af_cjk_metrics_init_widths): Ditto. - (af_cjk_metrics_init): Take AF_CJKMetric instead of AF_LatinMetric. - (af_cjk_metrics_scale): Ditto (declaration). - (af_cjk_hints_init): Ditto (declaration). - (af_cjk_hints_apply): Ditto (declaration). - * src/autofit/afcjk.c (af_cjk_metrics_scale): Ditto (body). - (af_cjk_hints_init): Ditto (body). - (af_cjk_hints_apply): Ditto (body). - (af_cjk_metrics_init_widths): Duplicate af_latin_metrics_init_widths. - (af_cjk_metrics_check_digits): Duplicate af_latin_metrics_check_digits. - (af_cjk_metrics_init): Call CJK bluezone initializer. - (af_cjk_metrics_scale_dim): Add code to scale bluezones. - (af_cjk_hints_compute_blue_edges): New function, CJK version of - af_latin_hints_compute_blue_edges. - (af_cjk_metrics_init_blues): New function, CJK version of - af_latin_metrics_init_blues. - (af_cjk_hints_edges): Add code to align the edge stems to blue zones. - - * src/autofit/afindic.c (af_indic_metrics_init): Take AF_CJKMetric - instead of AF_LatinMetric, and initialize as af_cjk_metrics_init. - However bluezones are not initialized. - (af_indic_metrics_scale): Take AF_CJKMetric instead of AF_LatinMetric. - (af_indic_hints_init): Ditto. - (af_indic_hints_apply): Ditto. - - * docs/CHANGES: Note about CJK bluezone support. - -2011-05-06 Werner Lemberg - - [autofit] Remove unused struct member. - - * src/autofit/aflatin.h (AF_LatinAxis): Remove `control_overshoot'. - -2011-05-04 Werner Lemberg - - * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Simplify. - -2011-05-01 Just Fill Bugs - Werner Lemberg - - [autofit] Add more debugging functions. - - * src/autofit/afhints.c (af_glyph_hints_get_num_segments, - af_glyph_hints_get_segment_offset): New functions. - -2011-05-01 suzuki toshiya - - Add new option `--disable-mmap' to configure script. - - * builds/unix/configure.raw: New option `--disable-mmap' - is added. It is for the developers to simulate the systems - without mmap() (like 4.3BSD, minix etc) on POSIX systems. - -2011-04-30 suzuki toshiya - - [truetype] Always recalculate the sfnt table checksum. - - * src/truetype/ttobjs.c (tt_get_sfnt_checksum): Recalculate - the sfnt table checksum even if non-zero value is written in - the TrueType font header. Some bad PDF generators write - wrong values. For details see examples and benchmark tests - of the latency by recalculation: - http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00091.html - http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00096.html - -2011-04-30 suzuki toshiya - - [truetype] Register a set of tricky fonts, NEC FA family. - - * src/truetype/ttobjs.c (tt_check_trickyness_sfnt_ids): - Add 8 checksum sets for NEC FA family. For the tricky fonts - without some tables (e.g. NEC FA fonts lack cvt table), - extra check is added to assure that a zero-length table in the - registry is not included in the font. - -2011-04-29 suzuki toshiya - - [truetype] Fix a bug in the sfnt table checksum getter. - - * src/truetype/ttobjs.c (tt_get_sfnt_checksum): Check the - return value of face->goto_table() correctly. - -2011-04-28 Werner Lemberg - - [autofit] Improve tracing messages. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues, - af_latin_align_linked_edge, af_latin_hint_edges): Do it. - -2011-04-25 Kan-Ru Chen - - [truetype] Always check the checksum to identify tricky fonts. - - Because some PDF generators mangle the family name badly, - the trickyness check by the checksum should be invoked always. - For sample PDF, see - http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00073.html - - * src/truetype/ttobjs.c (tt_check_trickyness): Even when - tt_check_trickyness_family() finds no trickyness, - tt_check_trickyness_sfnt_ids() is invoked. - -2011-04-22 suzuki toshiya - - [autofit] Add more Indic scripts with hanging baseline. - - * src/autofit/afindic.c (af_indic_uniranges): Tibetan, Limbu, - Sundanese, Meetei Mayak, Syloti Nagri and Sharada scripts are - added. - -2011-04-21 Behdad Esfahbod - - Always ignore global advance. - - This makes FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH redundant, - deprecated, and ignored. The new behavior is what every major user - of FreeType has been requesting. Global advance is broken in many - CJK fonts. Just ignoring it by default makes most sense. - - * src/truetype/ttdriver.c (tt_get_advances), - src/truetype/ttgload.c (TT_Get_HMetrics, TT_Get_VMetrics, - tt_get_metrics, compute_glyph_metrics, TT_Load_Glyph), - src/truetype/ttgload.h: Implement it. - - * docs/CHANGES: Updated. - -2011-04-21 rainy6144 - - [autofit] Blur CJK stems if too many to preserve their gaps. - - When there are too many stems to preserve their gaps in the - rasterization of CJK Ideographs at a low resolution, blur the - stems instead of showing clumped stems. See - http://lists.gnu.org/archive/html/freetype-devel/2011-02/msg00011.html - http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00046.html - for details. - - * src/autofit/afcjk.c (af_cjk_hint_edges): Store the position of - the previous stem by `has_last_stem' and `last_stem_pos', and skip - a stem if the current and previous stem are too near to preserve - the gap. - -2011-04-18 Werner Lemberg - - Integrate autofitter debugging stuff. - - * devel/ftoption.h, include/freetype/config/ftoption.h - (FT_DEBUG_AUTOFIT): New macro. - - * include/freetype/internal/fttrace.h: Add trace components for - autofitter. - - * src/autofit/aftypes.h (AF_LOG): Removed. - (_af_debug): Removed. - - * src/autofit/*: s/AF_DEBUG/FT_DEBUG_AUTOFIT/. - s/AF_LOG/FT_TRACE5/. - Define FT_COMPONENT where necessary. - -2011-04-18 Werner Lemberg - - Synchronize config files. - - * builds/unix/ftconfig.in: Copy missing assembler routines from - include/freetype/config/ftconfig.h. - -2011-04-13 Werner Lemberg - - [psaux] Fix Savannah bug #33047. - - Patch submitted by anonymous reporter. - - * src/psaux/psobjs.c (ps_table_add): Use FT_PtrDist for pointer - difference. - -2011-04-11 Kan-Ru Chen - - Fix reading of signed integers from files on 64bit platforms. - - Previously, signed integers were converted to unsigned integers, but - this can fail because of sign extension. For example, 0xa344a1eb - becomes 0xffffffffa344a1eb. - - We now do the reverse which is always correct because the integer - size is the same during the cast from unsigned to signed. - - * include/freetype/internal/ftstream.h, src/base/ftstream.c - (FT_Stream_Get*): Replace with... - (FT_Stream_GetU*): Functions which read unsigned integers. - Update all macros accordingly. - - * src/gzip/ftgzip.c (ft_gzip_get_uncompressed_size): Updated. - -2011-04-07 Werner Lemberg - - Update Unicode ranges for CJK autofitter; in particular, add Hangul. - - * src/autofit/afcjk.c (af_cjk_uniranges): Update to Unicode 6.0. - -2011-04-04 Werner Lemberg - - Fix formatting of autofit debug dumps. - - * src/autofit/afhints.c (af_glyph_hints_dump_points, - af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Adjust - column widths. - -2011-03-30 Werner Lemberg - - * src/autofit/aftypes.h (AF_OutlineRec): Removed, unused. - -2011-03-24 Werner Lemberg - - * src/cff/cfftypes.h (CFF_MAX_CID_FONTS): Increase to 256. - This limit is given on p. 37 of Adobe Technical Note #5014. - -2011-03-23 Werner Lemberg - - * src/truetype/ttpload.c (tt_face_load_loca): Fix mismatch warning. - -2011-03-20 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_open_font): Check number of TTC subfonts. - -2011-03-19 Werner Lemberg - - More C++ compilation fixes. - - * src/autofit/afhints.c (af_glyph_hints_dump_points, - af_glyph_hints_dump_segments, af_glyph_hints_dump_edges) - [__cplusplus]: Protect with `extern "C"'. - -2011-03-18 Werner Lemberg - - C++ compilation fixes. - - * src/autofit/aflatin.c (af_latin_hints_apply), src/autofit/afcjk.c - (af_cjk_hints_apply): Use cast for `dim'. - -2011-03-17 Alexei Podtelezhnikov - - A better fix for Savannah bug #32671. - - * src/smooth/ftgrays.c (gray_render_conic): Clean up code and - replace WHILE loop with a more natural DO-WHILE construct. - -2011-03-16 Werner Lemberg . - - * src/base/ftstroke.c (FT_StrokerRec): Remove unused `valid' field. - Suggested by Graham Asher. - -2011-03-09 Werner Lemberg - - Make FT_Sfnt_Table_Info return the number of SFNT tables. - - * src/sfnt/sfdriver.c (sfnt_table_info): Implement it. - * include/freetype/tttables.h: Update documentation. - * docs/CHANGES: Updated. - -2011-03-07 Bram Tassyns - - [cff] Fix Savannah bug #27988. - - * src/cff/cffobjs.c (remove_style): New function. - (cff_face_init): Use it to strip off the style part of the family - name. - -2011-03-07 Werner Lemberg - - * docs/CHANGES: Updated. - -2011-03-07 Alexei Podtelezhnikov - - Quick fix for Savannah bug #32671. - - This isn't the optimal solution yet, but it restores the previous - rendering quality (more or less). - - * src/smooth/ftgrays.c (gray_render_conic): Do more splitting. - -2011-03-06 Werner Lemberg - - Fix autohinting fallback. - - * src/base/ftobjs.c (FT_Load_Glyph): Assure that we only check TTFs, - ignoring CFF-based OTFs. - -2011-02-27 Werner Lemberg - - Add AF_CONFIG_OPTION_USE_WARPER to control the autofit warper. - - * devel/ftoption.h, include/freetype/config/ftoption.h - (AF_CONFIG_OPTION_USE_WARPER): New macro. - * src/autofit/aftypes.h (AF_USE_WARPER): Remove. - - * src/autofit/*: s/AF_USE_WARPER/AF_CONFIG_OPTION_USE_WARPER/. - - * src/autofit/afwarp.c [!AF_CONFIG_OPTION_USE_WARPER]: Replace dummy - variable assignment with a typedef. - -2011-02-26 Werner Lemberg - - [autofit] Slight simplifications. - - * src/autofit/aflatin.c (af_latin_hints_link_segments): Remove - test which always returns false. - (af_latin_hints_compute_blue_edges): Remove redundant assignment. - -2011-02-24 Werner Lemberg - - * docs/PROBLEMS: Mention rendering differences on different - platforms. - Suggested and worded by Jason Owen . - -2011-02-24 Werner Lemberg - - [autofit] Comment out unused code. - - * src/autofit/aflatin.c, src/autofit/aflatin2.c - (af_latin_hints_compute_edges): Do it. - -2011-02-24 Werner Lemberg - - * src/autofit/afhints.h (AF_GlyphHints): Remove unused field. - -2011-02-20 suzuki toshiya - - [cache] Fix an off-by-one bug in `FTC_Manager_RemoveFaceID'. - Found by , see detail in - - http://lists.gnu.org/archive/html/freetype/2011-01/msg00023.html - - * src/cache/ftccache.c (FTC_Cache_RemoveFaceID): Check the node - buckets[cache->p + cache->mask] too. - -2011-02-19 Kevin Kofler - - Fall back to autohinting if a TTF/OTF doesn't contain any bytecode. - This is Savannah patch #7471. - - * src/base/ftobjs.c (FT_Load_Glyph): Implement it. - -2011-02-19 John Tytgat - - [cff] Fix subset prefix removal. - This is Savannah patch #7465. - - * src/cff/cffobjs.c (remove_subset_prefix): Update length after - subset prefix removal. - -2011-02-13 Bradley Grainger - - Add inline assembly version of FT_MulFix for MSVC. - - * include/freetype/config/ftconfig.h: Ported the FT_MulFix_i386 - function from GNU inline assembly syntax (see #ifdef __GNUC__ block - above) to MASM syntax for Microsoft Visual C++. - -2011-02-13 Bradley Grainger - - Add project and solution files in Visual Studio 2010 format. - - * builds/win32/.gitignore: Ignore user-specific cache files. - * builds/win32/vc2010/: Add VS2010 project & solution files, created - by upgrading builds/win32/vc2008/freetype.vcproj. - * objs/.gitignore: Ignore Visual Studio output files. - -2011-02-01 Werner Lemberg - - * src/autofit/afdummy.c: Include `aferrors.h'. - Problem reported by Chris Liddell . - -2011-02-01 Werner Lemberg - - [cff] Ignore unknown operators in charstrings. - Patch suggested by Miles.Lau . - - * src/cff/cffgload.c (cff_decoder_parse_charstrings): Emit tracing - message for unknown operators and continue instead of exiting with a - syntax error. - -2011-02-01 Werner Lemberg - - [truetype] FT_LOAD_PEDANTIC now affects `prep' and `fpgm' also. - - * src/truetype/ttgload.c (tt_loader_init): Handle - `FT_LOAD_PEDANTIC'. - * src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep, - tt_size_init_bytecode, tt_size_ready_bytecode): New argument to - handle pedantic mode. - * src/truetype/ttobjs.h: Updated. - -2011-01-31 Werner Lemberg - - [truetype] Protect jump instructions against endless loops. - - * src/truetype/interp.c (DO_JROT, DO_JMPR, DO_JROF): Exit with error - if offset is zero. - -2011-01-31 Werner Lemberg - - [truetype] Improve handling of invalid references. - - * src/truetype/interp.c: Set even more TT_Err_Invalid_Reference - error codes only if pedantic hinting is active. At the same time, - try to provide sane values which hopefully allow useful - continuation. Exception to this is CALL and LOOPCALL – due to - possible stack corruption it is necessary to bail out. - -2011-01-31 Werner Lemberg - - [truetype] Improve handling of stack underflow. - - * src/truetype/ttinterp.c (TT_RunIns, Ins_FLIPPT, Ins_DELTAP, - Ins_DELTAC): Exit with error only if `pedantic_hinting' is set. - Otherwise, try to do something sane. - -2011-01-30 Werner Lemberg - - * src/sfnt/ttmtx.c (tt_face_load_hmtx): Fix tracing message. - -2011-01-30 LIU Sun-Liang - - [truetype]: Fix behaviour of MIAP for invalid arguments. - - * src/truetype/ttinterp.c (Ins_MIAP): Set reference points even in - case of error. - -2011-01-18 Werner Lemberg - - [truetype] Fix handling of MIRP instruction. - - Thanks to Greg Hitchcock who explained the issue. - - * src/truetype/ttinterp.c (Ins_MIRP): Replace a `>=' operator with - `>' since the description in the specification is incorrect. - This fixes, for example, glyph `two' in font `Helvetica Neue LT Com - 65 medium' at 15ppem. - -2011-01-15 suzuki toshiya - - Fix ARM assembly code in include/freetype/config/ftconfig.h. - - * include/freetype/config/ftconfig.h (FT_MulFix_arm): - Copy the maintained code from builds/unix/ftconfig.in. - Old GNU binutils could not accept the reduced syntax - `orr %0, %2, lsl #16'. Un-omitted syntax like RVCT, - `orr %0, %0, %2, lsl #16' is better. Reported by - Johnson Y. Yan. The bug report by Qt developers is - considered too. - - http://bugreports.qt.nokia.com/browse/QTBUG-6521 - -2011-01-15 Werner Lemberg - - [raster] Make bbox handling the same as with Microsoft's rasterizer. - - Right before B/W rasterizing, the bbox gets simply rounded to - integers. This fixes, for example, glyph `three' in font `Helvetica - Neue LT Com 65 Medium' at 11ppem. - - Thanks to Greg Hitchcock who explained this behaviour. - - * src/raster/ftrend1.c (ft_raster1_render): Implement it. - -2011-01-15 suzuki toshiya - - Copy -mcpu=* & -march=* options from CFLAGS to LDFLAGS. - - * builds/unix/configure.raw: Consider recent gcc-standard - flags to specify architecture in CFLAGS & LDFLAGS - harmonization. Requested by Savannah bug #32114, to - support multilib feature of BuildRoot SDK correctly. - -2011-01-15 suzuki toshiya - - Fix off-by-one bug in CFLAGS & LDFLAGS harmonizer. - - * builds/unix/configure.raw: Some important options that - included in CFLAGS but not in LDFLAGS are copied to - LDFLAGS, but the last option in CFLAGS was not checked. - -2011-01-13 Werner Lemberg - - [raster] Add undocumented drop-out rule to the other bbox side also. - - * src/raster/ftraster.c (Vertical_Sweep_Drop, - Horizontal_Sweep_Drop): Implement it. - -2011-01-13 Werner Lemberg - - [raster] Reduce jitter value. - - This catches a rendering problem with glyph `x' from Tahoma at - 10ppem. It seems that the increase of the precision in the change - from 2009-06-11 makes a larger jitter value unnecessary. - - * src/raster/ftraster.c (Set_High_Precision): Implement it. - -2011-01-13 Werner Lemberg - - [raster] Handle drop-outs at glyph borders according to Microsoft. - - If a drop-out rule would switch on a pixel outside of the glyph's - bounding box, use the right (or top) pixel instead. This is an - undocumented feature, but some fonts like `Helvetica Neue LT Com 65 - Medium' heavily rely on it. - - Thanks to Greg Hitchcock who explained this behaviour. - - * src/raster/ftraster.c (Vertical_Sweep_Drop, - Horizontal_Sweep_Drop): Implement it. - -2011-01-09 suzuki toshiya - - [cache] Fix Savannah bug #31923, patch drafted by Harsha. - - When a node comparator changes the cached nodes during the - search of a node matching with queried properties, the - pointers obtained before the function should be updated to - prevent the dereference to freed or reallocated nodes. - To minimize the rescan of the linked list, the update is - executed when the comparator notifies the change of cached - nodes. This change depends previous change: - 38b272ffbbdaae276d636aec4ef84af407d16181 - - * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): Rescan the - top node if the cached nodes are changed. - * src/cache/ftccache.c (FTC_Cache_Lookup): Ditto. - -2011-01-09 suzuki toshiya - - [cache] Notice if a cache query induced the node list change. - - Some node comparators (comparing the cache node contents and the - properties specified by the query) can flush the cache node to - prevent the cache inflation. The change may invalidate the pointers - to the node obtained before the node comparison, so it should be - noticed to the caller. The problem caused by the cache node - changing is reported by Harsha, see Savannah bug #31923. - - * src/cache/ftccache.h (FTC_Node_CompareFunc): Add new argument - `FT_Bool* list_changed' to indicate the change of the cached nodes - to the caller. - (FTC_CACHE_LOOKUP_CMP): Watch the change of the cached nodes by - `_list_changed'. - (FTC_CACHE_TRYLOOP_END): Take new macro argument `_list_changed' - and update it when `FTC_Manager_FlushN' flushes any nodes. - - * src/cache/ftccback.h (ftc_snode_compare): Updated to fit with new - FTC_Node_CompareFunc type. - (ftc_gnode_compare): Ditto. - - * src/cache/ftcbasic.c: Include FT_INTERNAL_OBJECTS_H to use - TRUE/FALSE macros. - (ftc_basic_gnode_compare_faceid): New argument `FT_Bool* - list_changed' to indicate the change of the cache nodes (anyway, it - is always FALSE). - - * src/cache/ftccmap.c: Include FT_INTERNAL_OBJECTS_H to use - TRUE/FALSE macros. - (ftc_cmap_node_compare): New argument `FT_Bool* list_changed' to - indicate the change of the cache nodes (anyway, it is always FALSE). - (ftc_cmap_node_remove_faceid): Ditto. - - * src/cache/ftccache.c (FTC_Cache_NewNode): Pass a NULL pointer to - `FTC_CACHE_TRYLOOP_END', because the result is not needed. - (FTC_Cache_Lookup): Watch the change of the cache nodes by - `list_changed'. - (FTC_Cache_RemoveFaceID): Ditto. - - * src/cache/ftcglyph.c: Include FT_INTERNAL_OBJECTS_H to use - TRUE/FALSE macros. - (ftc_gnode_compare): New argument `FT_Bool* list_changed' to - indicate the change of the cache nodes (anyway, it is always FALSE). - (FTC_GNode_Compare): New argument `FT_Bool* list_changed' to be - passed to `ftc_gnode_compare'. - * src/cache/ftcglyph.h (FTC_GNode_Compare): Ditto. - - * src/cache/ftcsbits.c (ftc_snode_compare): New argument `FT_Bool* - list_changed' to indicate the change of the cache nodes, anyway. It - is updated by `FTC_CACHE_TRYLOOP'. - (FTC_SNode_Compare): New argument `FT_Bool* list_changed' to be - passed to `ftc_snode_compare'. - * src/cache/ftcsbits.h (FTC_SNode_Compare): Ditto. - -2011-01-09 suzuki toshiya - - [cache] Fit `FTC_GNode_Compare' to `FTC_Node_CompareFunc'. - - * src/cache/ftcglyph.h (FTC_GNode_Compare): Add the 3rd - argument `FTC_Cache cache' to fit FTC_Node_CompareFunc - prototype. - * src/cache/ftcglyph.c (FTC_GNode_Compare): Ditto. Anyway, - `cache' is not used by its child `ftc_gnode_compare'. - -2011-01-09 suzuki toshiya - - [cache] Deduplicate the code to get the top node by a hash. - - There are several duplicated code fragments getting the top node - from a cache by a given hash, like: - - idx = hash & cache->mask; - if ( idx < cache->p ) - idx = hash & ( cache->mask * 2 + 1 ); - pnode = cache->buckets + idx; - - To remove duplication, a cpp-macro to do same work - `FTC_NODE__TOP_FOR_HASH' is introduced. For non-inlined - configuration, non-`ftc_get_top_node_for_hash' is also introduced. - - * src/cache/ftccache.h (FTC_NODE__TOP_FOR_HASH): Declare - and implement inlined version. - (FTC_CACHE_LOOKUP_CMP): Use `FTC_NODE__TOP_FOR_HASH'. - * src/cache/ftccache.c (ftc_get_top_node_for_hash): Non-inlined - version. - (ftc_node_hash_unlink): Use `FTC_NODE__TOP_FOR_HASH'. - (ftc_node_hash_link): Ditto. - (FTC_Cache_Lookup): Ditto. - -2011-01-09 suzuki toshiya - - [cache] inline-specific functions are conditionalized. - - * src/cache/ftcglyph.c (FTC_GNode_Compare): Conditionalized for - inlined configuration. This function is a thin wrapper of - `ftc_gnode_compare' for inlined `FTC_CACHE_LOOKUP_CMP' (see - `nodecmp' argument). Under non-inlined configuration, - `ftc_gnode_compare' is invoked by `FTC_Cache_Lookup', via - `FTC_Cache->clazz.node_compare'. - - * src/cache/ftcglyph.h (FTC_GNode_Compare): Ditto. - * src/cache/ftcsbits.c (FTC_SNode_Compare): Ditto, for - `ftc_snode_compare'. - * src/cache/ftcsbits.h (FTC_SNode_Compare): Ditto. - -2011-01-09 suzuki toshiya - - [cache] Correct a type mismatch under non-inlined config. - - * src/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP): `FTC_GCache_Lookup' - takes the node via a pointer `FTC_Node*', differently from cpp-macro - `FTC_CACHE_LOOKUP_CMP'. - -2011-01-06 suzuki toshiya - - Update Jamfile to include Bzip2 support. - - * Jamfile: Include src/bzip2 to project. - Comments for lzw, gzip, bzip2 are changed to clarify that - they are for compressed PCF fonts, not others. - (e.g. compressed BDF fonts are not supported yet) - -2011-01-05 suzuki toshiya - - Update Symbian project files to include Bzip2 support. - - Currently, it provides `FT_Stream_OpenBzip2' that returns - unimplemented error always, to prevent unresolved symbol - error for the applications designed for Unix systems. - - * builds/symbian/bld.inf: Include ftbzip2.h. - * builds/symbian/freetype.mmp: Include ftbzip2.c. - -2011-01-05 suzuki toshiya - - Update classic MacOS makefiles to include Bzip2 support. - - Currently, it provides `FT_Stream_OpenBzip2' that returns - unimplemented error always, to prevent unresolved symbol - error for the applications designed for Unix systems. - - * builds/mac/FreeType.m68k_cfm.make.txt: Include ftbzip2.c.o. - * builds/mac/FreeType.m68k_far.make.txt: Ditto. - * builds/mac/FreeType.ppc_carbon.make.txt: Include ftbzip2.c.x. - * builds/mac/FreeType.ppc_classic.make.txt: Ditto. - -2011-01-05 suzuki toshiya - - Update Amiga makefiles to include Bzip2 support. - - Currently, it provides `FT_Stream_OpenBzip2' that returns - unimplemented error always, to prevent unresolved symbol - error for the applications designed for Unix systems. - - * builds/amiga/makefile: Include bzip2.ppc.o built from ftbzip2.c. - * builds/amiga/makefile.os4: Include bzip2.o built from ftbzip2.c. - * builds/amiga/smakefile: Ditto. - -2011-01-05 suzuki toshiya - - Update pkg-config tools to reflect Bzip2 support. - - * builds/unix/freetype-config.in: Include `-lbz2' to - --libs output, if built with Bzip2 support. - * builds/unix/freetype2.in: Ditto. - -2011-01-05 suzuki toshiya - - * builds/unix/configure.raw: Remove `SYSTEM_BZ2LIB' macro. - - SYSTEM_ZLIB is used to switch the builtin zlib source - or system zlib source out of FreeType2. But ftbzip2 - module has no builtin bzip2 library and always requires - system bzip2 library. Thus SYSTEM_BZ2LIB is always yes, - it is not used. - -2011-01-03 Werner Lemberg - - */rules.mk: Handle `*pic.c' files. - -2010-12-31 Werner Lemberg - - * src/cff/cfftypes.h (CFF_MAX_CID_FONTS): Increase to 64. - Problem reported by Tom Bishop . - -2010-12-31 Werner Lemberg - - Improve bzip2 support. - - * include/freetype/ftmoderr.h: Add bzip2. - - * docs/INSTALL.ANY, docs/CHANGES: Updated. - - * src/pcf/README: Updated. - * include/freetype/internal/pcftypes.h: Obsolete, removed. - -2010-12-31 Joel Klinghed - - Add bzip2 compression support to handle *.pcf.bz2 files. - - * builds/unix/configure.raw: Test for libbz2 library. - - * devel/ftoption.h, include/freetype/config/ftoption.h - (FT_CONFIG_OPTION_USE_BZIP2): Define. - * include/freetype/config/ftheader.h (FT_BZIP2_H): Define. - - * include/freetype/ftbzip2.h: New file. - - * src/bzip2/*: New files. - - * src/pcf/pcf.h: s/gzip_/comp_/. - * src/pcf/pcfdrvr.c: Include FT_BZIP2_H. - s/gzip_/comp_/. - (PCF_Face_Init): Handle bzip2 compressed files. - - * docs/formats.txt, modules.cfg: Updated. - -2010-12-25 Harsha - - Apply Savannah patch #7422. - - If we encounter a space in a string then the sbit buffer is NULL, - height and width are 0s. So the check in ftc_snode_compare will - always pass for spaces (comparision with 255). Here the comments - above the condition are proper but the implementation is not. When - we create an snode I think it is the proper way to initialize the - width to 255 and then put a check for being equal to 255 in snode - compare function. - - * src/cache/ftcsbits.c (FTC_SNode_New): Initialize sbit widths with - value 255. - (ftc_snode_compare): Fix condition. - -2010-12-13 Werner Lemberg - - Fix parameter handling of `FT_Set_Renderer'. - Reported by Kirill Tishin . - - * src/base/ftobjs.c (FT_Set_Renderer): Increment `parameters'. - -2010-12-09 Werner Lemberg - - [cff] Allow `hlineto' and `vlineto' without arguments. - - We simply ignore such instructions. This is invalid, but it doesn't - harm; and indeed, there exist such subsetted fonts in PDFs. - - Reported by Albert Astals Cid . - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - [cff_op_hlineto]: Ignore instruction if there aren't any arguments - on the stack. - -2010-11-28 Werner Lemberg - - * Version 2.4.4 released. - ========================= - - - Tag sources with `VER-2-4-4'. - - * docs/CHANGES: Updated. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.4.4 - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.4.3/2.4.4/, s/243/244/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4. - - * builds/unix/configure.raw (version_info): Set to 12:2:6. - -2010-11-28 Alexei Podtelezhnikov - - [ftsmooth]: Minor code simplification. - - * src/smooth/ftgrays (gray_render_cubic): Do only one comparison - instead of two. - -2010-11-26 Johnson Y. Yan - - [truetype] Better multi-threading support. - - * src/truetype/ttinterp.c (TT_Load_Context): Reset glyph zone - references. - -2010-11-23 John Tytgat - - * src/psaux/t1decode.c (t1_decoder_parse_charstring): Expand - start_point, check_points, add_point, add_point1, close_contour - macros. - Remove add_contour macro. - Return error code from t1_builder_start_point and - t1_builder_check_points when there was one (instead of returning 0). - -2010-11-22 suzuki toshiya - - [truetype] Identify the tricky fonts by cvt/fpgm/prep checksums. - Some Latin TrueType fonts are still expected to be unhinted. - Fix Savannah bug #31645. - - * src/truetype/ttobjs.c (tt_check_trickyness): Divided to... - (tt_check_trickyness_family): this checking family name, and - (tt_check_trickyness_sfnt_ids): this checking cvt/fpgm/prep. - (tt_get_sfnt_checksum): Function to retrieve the sfnt checksum - for specified subtable even if cleared by lazy PDF generators. - (tt_synth_sfnt_checksum): Function to calculate the checksum. - -2010-11-18 Werner Lemberg - - [truetype] Fix `loca' handling for inconsistent number of glyphs. - Reported by Johnson Y. Yan . - - * src/truetype/ttpload.c (tt_face_load_loca): While sanitizing, - handle case where `loca' is the last table in the font. - -2010-11-18 Werner Lemberg - - [sfnt] Ignore all errors while loading `OS/2' table. - Suggested by Johnson Y. Yan . - - * src/sfnt/sfobjs.c (sfnt_load_face): Do it. - -2010-11-18 Johnson Y. Yan - - [type1] Fix matrix normalization. - - * src/type1/t1load.c (parse_font_matrix): Handle sign of scaling - factor. - -2010-11-18 Werner Lemberg - - [type1] Improve guard against malformed data. - Based on a patch submitted by Johnson Y. Yan - - - * src/type1/t1load.c (read_binary_data): Check `size'. - -2010-11-17 Werner Lemberg - - [sfnt] While tracing, output table checksums also. - - * src/sfnt/ttload.c (tt_face_load_font_dir): Do it. - -2010-11-04 suzuki toshiya - - [UVS] Fix `find_variant_selector_charmap', Savannah bug #31545. - - Since 2010-07-04, `find_variant_selector_charmap' returns - the first cmap subtable always under rogue-compatible - configuration, it causes NULL pointer dereference and - make UVS-related functions crashed. - - * src/base/ftobjs.c (Fix find_variant_selector_charmap): - Returns UVS cmap correctly. - -2010-11-01 Alexei Podtelezhnikov - - [ftsmooth] Improve rendering. - - * src/smooth/ftsmooth.c (gray_render_conic): Since version 2.4.3, - cubic deviations have been estimated _after_ UPSCALE, whereas - conic ones have been evaluated _before_ UPSCALE, which produces - inferior rendering results. Fix this. - Partially undo change from 2010-10-15 by using ONE_PIXEL/4; this has - been tested with demo images sent to the mailing list. See - - http://lists.gnu.org/archive/html/freetype-devel/2010-10/msg00055.html - - and later mails in this thread. - -2010-10-28 Werner Lemberg - - [ftraster] Minor fixes. - - Reported by Tom Bishop . - - * src/raster/ftraster.c (ULong): Remove unused typedef. - (TWorker): Remove unused variable `precision_mask'. - -2010-10-28 Werner Lemberg - - [ftraster] Fix rendering. - - Problem reported by Tom Bishop ; see - thread starting with - - http://lists.gnu.org/archive/html/freetype/2010-10/msg00049.html - - * src/raster/ftraster.c (Line_Up): Replace FMulDiv with SMulDiv - since the involved multiplication exceeds 32 bits. - -2010-10-25 suzuki toshiya - - Revert a change of `_idx' type in `FTC_CACHE_LOOKUP_CMP'. - - * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): Revert - the type of `_idx' from FT_PtrDist (by previous change) - to original FT_UFast, to match with FT_CacheRec. - -2010-10-24 suzuki toshiya - - [cache] Change the hash types to FT_PtrDist. - - On LLP64 platforms (e.g. Win64), FT_ULong (32-bit) - variables are inappropriate to calculate hash values - from the memory address (64-bit). The hash variables - are extended from FT_ULong to FT_PtrDist and new - hashing macro functions are introduced. The hash - values on 16-bit memory platforms are changed, but - ILP32 and LP64 are not changed. The hash value in - the cache subsystem is not reverted to the memory - address, so using signed type FT_PtrDist is safe. - - * src/cache/ftccache.h (_FTC_FACE_ID_HASH): New hash - function to replace `FTC_FACE_ID_HASH' for portability. - * src/cache/ftcmanag.h (FTC_SCALER_HASH): Replace - `FTC_FACE_ID_HASH' by `_FTC_FACE_ID_HASH'. - * src/cache/ftccmap.c (FTC_CMAP_HASH): Ditto. - - * src/cache/ftccache.h (FTC_NodeRec): The type of the - member `hash' is changed from FT_UInt32 to FT_PtrDist. - - * src/cache/ftccache.h (FTC_Cache_Lookup): The type of the - argument `hash' is changed from FT_UInt32 to FT_PtrDist. - (FTC_Cache_NewNode): Ditto. - * src/cache/ftccache.c (ftc_cache_add): Ditto. - (FTC_Cache_Lookup): Ditto. (FTC_Cache_NewNode): Ditto. - * src/cache/ftcglyph.h (FTC_GCache_Lookup): Ditto. - * src/cache/ftcglyph.c (FTC_GCache_Lookup): Ditto. - - * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): The type - of the internal variable `hash' is changed to FT_PtrDist - from FT_UInt32. (FTC_ImageCache_LookupScaler): Ditto. - (FTC_SBitCache_Lookup): Ditto. - (FTC_SBitCache_LookupScaler): Ditto. - * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Ditto. - * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): Ditto. - Also the type of the internal variable `_idx' is changed to - FT_PtrDist from FT_UFast for better pointer calculation. - -2010-10-24 suzuki toshiya - - [cache] Hide internal macros incompatible with LLP64. - - `FT_POINTER_TO_ULONG', `FTC_FACE_ID_HASH', and - `FTC_IMAGE_TYPE_HASH' are enclosed by - FT_CONFIG_OPTION_OLD_INTERNALS and hidden from - normal clients. - - For the history of these macros, see the investigation: - http://lists.gnu.org/archive/html/freetype/2010-10/msg00022.html - -2010-10-24 suzuki toshiya - - Change the type of `FT_MEM_VAL' from FT_ULong to FT_PtrDist. - - On LLP64 platforms (e.g. Win64), unsigned long (32-bit) - cannot cover the memory address (64-bit). `FT_MEM_VAL' is - used for hashing only and not dereferred, so using signed - type FT_PtrDist is safe. - - * src/base/ftdbgmem.c (FT_MEM_VAL): Change the type of the - return value from FT_ULong to FT_PtrDist. - (ft_mem_table_resize): The type of hash is changed to - FT_PtrDist. (ft_mem_table_get_nodep): Ditto. - -2010-10-24 suzuki toshiya - - Replace "%lx" for memory address by "%p", LLP64 platforms. - - On LLP64 platforms (e.g. Win64), long (32-bit) cannot cover - the memory address (64-bit). Also the casts from the pointer - type to long int should be removed to preserve the address - correctly. - - * src/raster/ftraster.c (New_Profile): Replace "%lx" by "%p". - (End_Profile) Ditto. - * src/truetype/ttinterp.c (Init_Context): Ditto. - -2010-10-15 Alexei Podtelezhnikov - - Fix thinko in spline flattening. - - FT_MAX_CURVE_DEVIATION is dependent on the value of ONE_PIXEL. - - * src/smooth/ftgrays.c (FT_MAX_CURVE_DEVIATION): Remove it and - replace it everywhere with ONE_PIXEL/8. - -2010-10-13 suzuki toshiya - - [raccess] Skip unrequired resource access rules by Darwin VFS. - - When a resource fork access rule by Darwin VFS could open the - resource fork but no font is found in it, the rest of rules - by Darwin VFS are skipped. It reduces the warnings of the - deprecated resource fork access method by recent Darwin kernel. - Fix MacPorts ticket #18859: - http://trac.macports.org/ticket/18859 - - * src/base/ftobjs.c (load_face_in_embedded_rfork): - When `FT_Stream_New' returns FT_Err_Cannot_Open_Stream, it - means that the file is possible to be `fopen'-ed but zero-sized. - Also there is a case that the resource fork is not zero-sized, - but no supported font exists in it. If a rule by Darwin VFS - falls into such cases, there is no need to try other Darwin VFS - rules anymore. Such cases are marked by vfs_rfork_has_no_font. - If it is TRUE, the Darwin VFS rules are skipped. - -2010-10-13 suzuki toshiya - - [raccess] Grouping resource access rules based on Darwin VFS. - - MacOS X/Darwin kernel supports a few tricky methods to access - a resource fork via ANSI C or POSIX interface. Current resource - fork accessor tries all possible methods to support all kernels. - But if a method could open a resource fork but no font is found, - there is no need to try other methods older than tested method. - To determine whether the rule index is for Darwin VFS, a local - function `ftrfork.c::raccess_rule_by_darwin_vfs' is introduced. - To use this function in ftobjs.c etc but it should be inlined, - it is exposed by ftbase.h. - - * src/base/ftrfork.c (FT_RFork_Rule): New enum type to identify - the rules to access the resource fork. - (raccess_guess_rec): New structure to bind the rule function and - rule enum type. - (FT_Raccess_Guess): The list of the rule functions is replaced by - (raccess_guess_table): This. This is exposed to be used by other - intra module functions. - (raccess_rule_by_darwin_vfs): A function to return a boolean - if the rule specified by the rule index is based on Darwin VFS. - -2010-10-13 suzuki toshiya - - Prevent to open a FT_Stream for zero-sized file on non-Unix. - - builds/unix/ftsystem.c prevents to open an useless stream from - zero-sized file and returns FT_Err_Cannot_Open_Stream, but the - stream drivers for ANSI C, Amiga and VMS return useless streams. - For cross-platform consistency, all stream drivers should act - same. - - * src/base/ftsystem.c (FT_Stream_Open): If the size of the opened - file is zero, FT_Err_Cannot_Open_Stream is returned. - * builds/amiga/src/base/ftsystem.c (FT_Stream_Open): Ditto. - * src/vms/ftsystem.c (FT_Stream_Open): Ditto. - -2010-10-12 Werner Lemberg - - [truetype] Fix Savannah bug #31310. - - * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Protect against - invalid `runcnt' values. - -2010-10-08 Chris Liddell - - [sfnt] Fix Savannah bug #31275. - - * src/sfnt/ttpost.c: Include FT_INTERNAL_DEBUG_H. - -2010-10-06 Werner Lemberg - - [truetype] Improve error handling of `SHZ' bytecode instruction. - Problem reported by Chris Evans . - - * src/truetype/ttinterp.c (Ins_SHZ): Check `last_point'. - -2010-10-05 Werner Lemberg - - Fix Savannah bug #31253. - Patch submitted by an anonymous reporter. - - * configure: Use `awk' instead of `sed' to manipulate output of `ls - -id'. - -2010-10-03 Werner Lemberg - - * Version 2.4.3 released. - ========================= - - - Tag sources with `VER-2-4-3'. - - * docs/CHANGES: Updated. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.4.3 - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.4.2/2.4.3/, s/242/243/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3. - - * builds/unix/configure.raw (version_info): Set to 12:1:6. - -2010-10-03 Werner Lemberg - - Avoid `configure' issues with symbolic links. - Based on a patch from Alexander Stohr . - - * configure: Compare directories using `ls -id'. - Check existence of `reference' subdirectory before creating it. - -2010-10-02 Werner Lemberg - - [sfnt] Fix Savannah bug #31088 (sort of). - - * src/sfnt/ttload.c (tt_face_load_maxp): Always allocate at least 64 - function entries. - -2010-10-02 Werner Lemberg - - [smooth] Fix splitting of cubics for negative values. - - Reported by Róbert Márki ; see - http://lists.gnu.org/archive/html/freetype/2010-09/msg00019.html. - - * src/smooth/ftgrays.c (gray_render_cubic): Fix thinko. - -2010-10-01 suzuki toshiya - - [truetype] Fix Savannah bug #31040. - - * src/truetype/ttinterp.c (free_buffer_in_size): Remove. - (TT_RunIns): Updated. - -2010-09-20 suzuki toshiya - - [sfnt] Make error message filling NULL names less verbose. - - * src/sfnt/ttpost.c (load_format_20): Showing 1 summary message - when we fill `post' names by NULL, instead of per-entry message. - -2010-09-20 Graham Asher - David Bevan - - [smooth] Fix and improve spline flattening. - - This fixes the flattening of cubic, S-shaped curves and speeds up - the handling of both the conic and cubic arcs. - - See the discussions on the freetype-devel mailing list in late - August and September 2010 for details. - - * src/smooth/ftgrays.c (FT_MAX_CURVE_DEVIATION): New macro. - (TWorker): Remove `conic_level' and `cubic_level' elements. - (gray_render_conic): Simplify algorithm. - (gray_render_cubic): New algorithm; details are given in the code - comments. - (gray_convert_glyph): Remove heuristics. - -2010-09-19 Werner Lemberg - - Minor fixes. - - * src/cff/cffload.c (cff_charset_compute_cids): `charset->sids[i]' - is `FT_UShort'. - (cff_index_access_element): Don't use additions in comparison. - * src/sfnt/ttpost.c (load_format_20): Make `post_limit' of type - `FT_Long'. - Don't use additions in comparison. - Improve tracing messages. - (load_format_25, load_post_names): Make `post_limit' of type - `FT_Long'. - -2010-09-19 suzuki toshiya - - [cff] Truncate the element length at the end of the stream. - See Savannah bug #30975. - - * src/cff/cffload.c (cff_index_access_element): `off2', the offset - to the next element is truncated at the end of the stream to prevent - invalid I/O. As `off1', the offset to the requested element has - been checked by `FT_STREAM_SEEK', `off2' should be checked - similarly. - -2010-09-19 suzuki toshiya - - [cff] Ignore CID > 0xFFFFU. - See Savannah bug #30975. - - * src/cff/cffload.c (cff_charset_compute_cids): Ignore CID if - greater than 0xFFFFU. CFF font spec does not mention maximum CID in - the font, but PostScript and PDF spec define that maximum CID is - 0xFFFFU. - -2010-09-19 suzuki toshiya - - [cff] Make trace message in` cff_charset_load' verbose. - See Savannah bug #30975. - - * src/cff/cffload.c (cff_charset_load): Report the original `nleft' - and truncated `nleft'. - -2010-09-19 suzuki toshiya - - [cff] Correct `max_cid' from CID array length to max CID. - See Savannah bug #30975. - - * src/cff/cffload.c (cff_charset_compute_cids): Don't increment - max_cid after detecting max CID. The array CFF_Charset->cids is - allocated by max_cid + 1. - (cff_charset_cid_to_gindex): Permit CID is less than or equal to - CFF_Charset->max_cid. - * src/cff/cffobjs.c (cff_face_init): FT_Face->num_glyphs is - calculated as CFF_Charset->max_cid + 1. - -2010-09-19 suzuki toshiya - - [truetype] Sanitize the broken offsets in `loca'. - See Savannah bug #31040. - - * src/truetype/ttpload.c (tt_face_get_location): If `pos1', the - offset to the requested entry in `glyf' exceeds the end of the - table, return offset=0, length=0. If `pos2', the offset to the next - entry in `glyf' exceeds the end of the table, truncate the entry - length at the end of `glyf' table. - -2010-09-19 suzuki toshiya - - [sfnt] Prevent overrunning in `post' table parser. - See Savannah bug #31040. - - * src/sfnt/ttpost.c (load_post_names): Get the length of `post' - table and pass the limit of `post' table to `load_format_20' and - `load_format_25'. - (load_format_20): Stop the parsing when we reached at the limit of - `post' table. If more glyph names are required, they are filled by - NULL names. - -2010-09-17 suzuki toshiya - - [truetype] Don't duplicate size->twilight structure to be freed. - See Savannah bug #31040 for detail. - - * src/truetype/ttinterp.c (free_buffer_in_size): Don't duplicate - FT_GlyphZoneRec size->twilight to be freed. If duplicated, - `FT_FREE' erases the duplicated pointers only and leave original - pointers. They can cause the double-free crash when the burst - errors occur in TrueType interpreter and `free_buffer_in_size' is - invoked repeatedly. - -2010-09-15 Werner Lemberg - - Make bytecode debugging with FontForge work again. - - * src/truetype/ttinterp.c (TT_RunIns): Don't call - `free_buffer_in_size' in case of error if a debugger is active. - -2010-09-14 Werner Lemberg - - Improve tracing messages. - - * src/truetype/ttinterp.c (TT_RunIns): Improve wording of tracing - message. - * src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): Add - tracing message. - * src/truetype/ttgload.c (tt_loader_init): Add tracing message. - * src/cache/ftcsbits.c (ftc_snode_load): Emit tracing message if - glyph doesn't fit into a small bitmap container. - -2010-09-13 Werner Lemberg - - Fix minor issues reported by . - - * src/autofit/aflatin.c (af_latin_compute_stem_width): Remove - redundant conditional check. - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Ditto. - * src/cff/cffload.c (cff_encoding_load): Remove conditional check - which always evaluates to `true'. - * src/pshinter/pshalgo.c (ps_glyph_interpolate_strong_points): - Ditto. - * src/truetype/ttinterp.c (Ins_IUP): Ditto. - * src/cid/cidgload.c (cid_slot_load_glyph): Don't check for NULL if - value is already dereferenced. - * src/winfonts/winfnt.c (FNT_Load_Glyph): Fix check of `face'. - -2010-08-31 suzuki toshiya - - Ignore the environmental setting of LIBTOOL. - Patch is suggested by Adrian Bunk, to prevent unexpected - reflection of environmental LIBTOOL. See: - http://savannah.nongnu.org/patch/?7290 - - * builds/unix/unix-cc.in: LIBTOOL is unconditionally set to - $(FT_LIBTOOL_DIR)/libtool. FT_LIBTOOL_DIR is set to $(BUILD_DIR) - by default. - * configure: When configured for the building out of source tee, - FT_LIBTOOL_DIR is set to $(OBJ_DIR). - -2010-08-31 suzuki toshiya - - [truetype] Decrease the trace level catching the interpreter error. - - * src/truetype/ttinterp.c (TT_RunIns): Decrease the trace level - showing the error when the interpreter returns with an error, - from` FT_TRACE7' to `FT_TRACE1'. - -2010-08-30 suzuki toshiya - - [truetype] Prevent bytecode reuse after the interpretation error. - - * src/truetype/ttinterp.c (free_buffer_in_size): New function to - free the buffer allocated during the interpretation of this glyph. - (TT_RunIns): Unset FT_Face->size->{cvt_ready,bytecode_ready} if - an error occurs in the bytecode interpretation. The interpretation - of invalid bytecode may break the function definitions and referring - them in later interpretation is danger. By unsetting these flags, - `fpgm' and `prep' tables are executed again in next interpretation. - - This fixes Savannah bug #30798, reported by Robert Święcki. - -2010-08-29 Werner Lemberg - - [ftraster] Pacify compiler. - - * src/raster/ftraster.c (ft_black_new) [_STANDALONE_]: `memory' is - not used. - -2010-08-29 Werner Lemberg - - [cff] Allow SIDs >= 65000. - - * src/cff/cffload.c (cff_charset_load): Fix change from 2009-03-20: - The threshold for SIDs is not applicable here. I misinterpreted the - `SID values 65000 and above are available for implementation use' - sentence in the CFF specification. - - Problem reported by Ivan Ninčić . - -2010-08-28 suzuki toshiya - - Force hinting when the font lacks its familyname. - - In Type42 or Type11 font embedded in PostScript & PDF, TrueType sfnt - stream may lack `name' table because they are not required. Hinting - for nameless fonts is safer for PDFs including embedded Chinese - fonts. Written by David Bevan, see: - - http://lists.gnu.org/archive/html/freetype-devel/2010-08/msg00021.html - http://lists.freedesktop.org/archives/poppler/2010-August/006310.html - - * src/truetype/ttobjs.c (tt_check_trickyness): If a NULL pointer by - nameless font is given, TRUE is returned to enable hinting. - -2010-08-28 suzuki toshiya - - Register yet another tricky TrueType font. - - * src/truetype/ttobjs.c (tt_check_trickyness): Add `HuaTianKaiTi?', - a Kaishu typeface paired with `HuaTianSongTi?' by Huatian - Information Industry. - -2010-08-17 Teijo Kinnunen - - [cache] Fix Savannah bug #30788. - - * src/cache/ftccache.c (FTC_Cache_Clear): Check `cache->buckets' for - NULL too. - -2010-08-10 Werner Lemberg - - Try to fix Savannah bug #30717 (and probably #30719 too). - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Add another - overflow test for `width' and `height'. - -2010-08-06 Werner Lemberg - - * Version 2.4.2 released. - ========================= - - - Tag sources with `VER-2-4-2'. - - * docs/CHANGES: Updated. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.4.2 - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.4.1/2.4.2/, s/241/242/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 2. - - * builds/unix/configure.raw (version_info): Set to 12:0:6. - -2010-08-06 suzuki toshiya - - Fix Savannah bug #30648. - - * src/base/ftobjs.c (FT_Done_Library): Specify the order of font - drivers during the face closing process. Type42 faces should be - closed before TrueType faces, because a Type42 face refers to - another internal TrueType face which is created from sfnt[] array on - the memory. - -2010-08-06 Yuriy Kaminskiy - - [raster] Fix valgrind warning. - - * src/raster/ftraster.c (Decompose_Curve) : Access point[0] - only if we don't hit `limit'. - -2010-08-06 suzuki toshiya - - Fix Savannah bug #30658. - - * src/base/ftobjs.c (Mac_Read_POST_Resource): Check that the total - length of collected POST segments does not overrun the allocated - buffer. - -2010-08-06 Yuriy Kaminskiy - - Fix conditional usage of FT_MulFix_i386. - With -ansi flag, gcc does not define `i386', only `__i386__'. - - * include/freetype/config/ftconfig.h, builds/unix/ftconfig.in: - s/i386/__i386__/. - -2010-08-05 Werner Lemberg - - [truetype] Fix Savannah bug #30657. - - * src/truetype/ttinterp.c (BOUNDSL): New macro. - Change `BOUNDS' to `BOUNDSL' where appropriate. - - * src/truetype/ttinterp.h (TT_ExecContextRec): Fix type of - `cvtSize'. - -2010-08-05 Werner Lemberg - - [type42] Fix Savannah bug #30656. - - * src/type42/t42parse.c (t42_parse_sfnts): Protect against negative - string_size. - Fix comparison. - -2010-08-05 suzuki toshiya - - [cff] Don't use any values in decoder after parsing error. - - * src/cff/cffgload.c (cff_slot_load): Skip the evaluations - of the values in decoder, if `cff_decoder_parse_charstrings' - returns any error. - -2010-08-04 Werner Lemberg - - Fix Savannah bug #30644. - - * src/base/ftstream.c (FT_Stream_EnterFrame): Fix comparison. - -2010-08-04 Werner Lemberg - - `make devel' fails if FT_CONFIG_OPTION_OLD_INTERNALS is set. - - * devel/ftoption.h: Synchronize with - include/freetype/config/ftoption.h. - -2010-08-04 suzuki toshiya - - [cff] Improve stack overflow test. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings): Check stack - after execution of operations too. - -2010-07-18 Werner Lemberg - - Add reference counters and to FT_Library and FT_Face objects. - - * include/freetype/freetype.h (FT_Reference_Face): New function. - * include/freetype/ftmodapi.h (FT_Rererence_Library): New function. - - * include/freetype/internal/ftobjs.h (FT_Face_InternalRec, - FT_LibraryRec): New field `refcount'. - - * src/base/ftobjs.c (FT_Open_Face, FT_New_Library): Handle - `refcount'. - (FT_Reference_Face, FT_Reference_Library): Implement new functions. - (FT_Done_Face, FT_Done_Library): Handle `refcount'. - - * docs/CHANGES: Updated. - -2010-07-18 Werner Lemberg - - * Version 2.4.1 released. - ========================= - - - Tag sources with `VER-2-4-1'. - - * docs/CHANGES: Updated. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.4.1. - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.4.0/2.4.1/, s/240/241/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1. - - * builds/unix/configure.raw (version_info): Set to 11:1:5. - -2010-07-17 Werner Lemberg - - [cff] Final try to fix `hintmask' and `cntrmask' limit check. - - Problem reported by Tobias Wolf . - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - : Sigh. I'm apparently too silly to fix this - correctly in less than three tries. - -2010-07-12 Werner Lemberg - - * Version 2.4.0 released. - ========================= - - - Tag sources with `VER-2-4-0'. - - * docs/CHANGES: Updated. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.4.0. - - * README, Jamfile (RefDoc), - builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, - builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj, - builds/win32/visualce/index.html, - builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2005-ce/index.html, - builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.3.12/2.4.0/, s/2312/240/. - - * include/freetype/freetype.h (FREETYPE_MINOR): Set to 4. - (FREETYPE_PATCH): Set to 0. - - * builds/unix/configure.raw (version_info): Set to 11:0:5. - -2010-07-12 Werner Lemberg - - Remove C++ warnings. - - */*: Initialize pointers where necessary to make g++ happy. - -2010-07-12 malc - Richard Henderson - - Fix type-punning issues with C++. - - * include/freetype/internal/ftmemory.h (FT_ASSIGNP) [__cplusplus]: - Emulate a `typeof' operator with an inline template which uses - `static_cast'. - -2010-07-11 Werner Lemberg - - Fix C++ compilation issue. - - * src/tools/apinames.c (names_dump) : Fix - type of `dot' variable. - -2010-07-10 suzuki toshiya - - Fix another case reported in Savannah bug #30373. - Permit a face for Type1, Type42 and CFF without charmap, - patch by Tor Andersson. - - * src/type1/t1objs.c (T1_Face_Init): Reset the error if it - is FT_Err_No_Unicode_Glyph_Name. - * src/type42/t42objs.c (T42_Face_Init): Ditto. - * src/cff/cffobjs.c (cff_face_init): Ditto. - -2010-07-09 suzuki toshiya - - Use defined macros to set {platform,encoding}_id. - - * src/bdf/bdfdrivr.c: Include ttnameid.h and use macros to - set charmap.{platfom,encoding}_id. - * src/pcf/pcfdrivr.c: Ditto. - * src/winfonts/winfnt.c: Ditto. - * src/type1/t1objs.c: Ditto. - * src/type42/t42objs.c: Ditto. - * src/cff/cffobjs.c: Ditto. - * src/pfr/pfrobjs.c: Ditto. - -2010-07-09 suzuki toshiya - - Fix Savannah bug #30373. - Too serious check of errors by `FT_CMap_New' since 2010-07-04 - is fixed. Reported by Tor Andersson. - - * include/freetype/fterrdef.h - (PSnames_Err_No_Unicode_Glyph_Name): New error code to - indicate the Unicode charmap synthesis failed because - no Unicode glyph name is found. - - * src/psnames/psmodule.c (ps_unicodes_init): Return - PSnames_Err_No_Unicode_Glyph_Name when no Unicode glyph name - is found in the font. - * src/cff/cffcmap.c (cff_cmap_unicode_init): Return - CFF_Err_No_Unicode_Glyph_Name when no SID is available. - - * src/type1/t1objs.c (T1_Face_Init): Proceed if `FT_CMap_New' - is failed by the lack of Unicode glyph name. - * src/type42/t42objs.c (T42_Face_Init): Ditto. - * src/cff/cffobjs.c (cff_face_init): Ditto. - -2010-07-09 Ken Sharp - - Make ftraster.c compile in stand-alone mode with MSVC compiler. - - * src/raster/ftmisc.h (FT_Int64) [_WIN32, _WIN64]: Fix typedef - since there is no `inttypes.h' for MSVC. - -2010-07-08 Werner Lemberg - - [truetype] Fix Savannah bug #30361. - - * src/truetype/ttinterp.c (Ins_IUP): Fix bounds check. - -2010-07-06 Werner Lemberg - - Pacify compiler. - - * src/cff/cffload.c (cff_index_get_pointers): Initialize - `new_bytes'. - -2010-07-05 Eugene A. Shatokhin - - Fix Savannah bug #27648. - - * src/base/ftobjs.c (ft_remove_renderer, FT_Add_Module): Call - `raster_done' only if we have an outline glyph format. - -2010-07-05 Werner Lemberg - - Fix Savannah bug #30030. - - * builds/win32/*/freetype.vcproj: Add ftxf86.c. - -2010-07-05 Werner Lemberg - - [cff] Next try to fix `hintmask' and `cntrmask' limit check. - - Problem reported by malc . - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - : It is possible that there is just a single byte - after the `hintmask' or `cntrmask', e.g., a `return' instruction. - -2010-07-04 suzuki toshiya - - Restrict the number of the charmaps in a rogue-compatible mode. - Fix for Savannah bug #30059. - - * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Replace `16' the - minimum character code passed by a legacy rogue client by... - * include/freetype/config/ftoption.h (FT_MAX_CHARMAP_CACHEABLE): - This. It is undefined when FT_CONFIG_OPTION_OLD_INTERNALS is - undefined (thus the rogue client compatibility is not required). - - * src/cff/cffobjs.c (cff_face_init): Abort the automatic - selection or synthesis of Unicode cmap subtable when the charmap - index exceeds FT_MAX_CHARMAP_CACHEABLE. - * src/sfnt/ttcmap.c (tt_face_build_cmaps): Issue error message - when the charmap index exceeds FT_MAX_CHARMAP_CACHEABLE. - - * src/base/ftobjs.c (find_unicode_charmap): When Unicode charmap - is found after FT_MAX_CHARMAP_CACHEABLE, ignore it and search - earlier one. - (find_variant_selector_charmap): When UVS charmap is found after - FT_MAX_CHARMAP_CACHEABLE, ignore it and search earlier one. - (FT_Select_Charmap): When a charmap matching with requested - encoding but after FT_MAX_CHARMAP_CACHEABLE, ignore and search - earlier one. - (FT_Set_Charmap): When a charmap matching with requested - charmap but after FT_MAX_CHARMAP_CACHEABLE, ignore and search - earlier one. - (FT_Get_Charmap_Index): When a requested charmap is found - after FT_MAX_CHARMAP_CACHEABLE, return the inverted charmap - index. - -2010-07-04 Werner Lemberg - - TrueType hinting is no longer patented. - - * include/freetype/config/ftoption.h, devel/ftoption.h - (TT_CONFIG_OPTION_BYTECODE_INTERPRETER): Define. - (TT_CONFIG_OPTION_UNPATENTED_HINTING): Undefine. - - * docs/CHANGES, docs/INSTALL, include/freetype/freetype.h: Updated. - * docs/TRUETYPE, docs/PATENTS: Removed. - -2010-07-04 suzuki toshiya - - Check error value by `FT_CMap_New'. - - * src/cff/cffobjs.c (cff_face_init): Check error value by - `FT_CMap_New'. - * src/pfr/pfrobjs.c (pfr_face_init): Ditto. - * src/type1/t1jobjs.c (T1_Face_Init): Ditto. - * src/type42/t42jobjs.c (T42_Face_Init): Ditto. - -2010-07-03 Werner Lemberg - - Make ftgrays.c compile stand-alone again. - - * src/smooth/ftgrays.c [_STANDALONE_]: Include `stddef.h'. - (FT_INT_MAX, FT_PtrDist)[_STANDALONE_]: Define. - -2010-07-02 suzuki toshiya - - Additional fix for Savannah bug #30306. - - * src/base/ftobjs.c (Mac_Read_POST_Resource): If the type of the - POST fragment is 0, the segment is completely ignored. The declared - length of the segment is not cared at all. According to Adobe - Technical Note 5040, type 0 segment is a comment only and should not - be loaded for the interpreter. Reported by Robert Święcki. - -2010-07-01 Werner Lemberg - - [truetype] Protect against code range underflow. - - * src/truetype/ttinterp.c (DO_JROT, DO_JMPR, DO_JROF): Don't allow - negative IP values. - -2010-07-01 Werner Lemberg - - [truetype] Add rudimentary tracing for bytecode instructions. - - * src/truetype/ttinterp.c (opcode_name) [FT_DEBUG_LEVEL_TRACE]: New - array. - (TT_RunIns): Trace opcodes. - -2010-06-30 Werner Lemberg - - [smooth] Fix Savannah bug #30263. - - * src/smooth/ftgrays.c (gray_render_span): Use cast to `unsigned - int' to avoid integer overflow. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Use smaller - threshold values for `width' and `height'. This is not directly - related to the bug fix but makes sense anyway. - -2010-07-01 suzuki toshiya - - Initial fix for Savannah bug #30306. - - * src/base/ftobjs.c (Mac_Read_POST_Resource): Check `rlen', the - length of fragment declared in the POST fragment header, and prevent - an underflow in length calculation. Some fonts set the length to - zero in spite of the existence of a following 16bit `type'. - Reported by Robert Święcki. - -2010-07-01 suzuki toshiya - - Additional fix for Savannah bug #30248 and #30249. - - * src/base/ftobjs.c (Mac_Read_POST_Resource): Check the buffer size - during gathering PFB fragments embedded in LaserWriter PS font for - Macintosh. Reported by Robert Święcki. - -2010-06-30 Alexei Podtelezhnikov - - Minor optimizations by avoiding divisions. - - * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning): - Replace divisions with multiplication in comparisons. - -2010-06-29 Werner Lemberg - - Fix minor tracing issues. - - * src/cff/cffgload.c, src/truetype/ttgload.c: Adjust tracing levels. - -2010-06-27 Werner Lemberg - - [cff] Really fix `hintmask' and `cntrmask' limit check. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - : Fix thinko and handle tracing also. - -2010-06-27 Werner Lemberg - - Fix valgrind warning. - - * src/base/ftoutln.c (FT_Outline_Get_Orientation): Initialize - `result' array. - -2010-06-27 Werner Lemberg - - [cff] Fix memory leak. - - * src/cff/cffgload.c (cff_operator_seac): Free charstrings even in - case of errors. - -2010-06-27 Werner Lemberg - - [cff] Protect against invalid `hintmask' and `cntrmask' operators. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - : Ensure that we don't exceed `limit' while parsing - the bit masks of the `hintmask' and `cntrmask' operators. - -2010-06-26 Werner Lemberg - - Fix PFR change 2010-06-24. - - * src/pfr/pfrgload.c (pfr_glyph_load_simple): Really protect against - invalid indices. - -2010-06-26 Werner Lemberg - - Improve PFR tracing messages. - - * src/pfr/pfrgload.c (pfr_glyph_load_rec): Emit tracing messages for - simple and compound glyph offsets. - -2010-06-26 Werner Lemberg - - Fix last PFR change. - - * src/pfr/pfrobjs.c (pfr_face_init): Fix rejection logic. - -2010-06-26 Werner Lemberg - - [sfnt] Fix Savannah bug #30262. - - * src/sfnt/ttload.c (tt_face_load_maxp): Limit `maxComponentDepth' - arbitrarily to 100 to avoid stack exhaustion. - -2010-06-26 Werner Lemberg - - Add some memory checks (mainly for debugging). - - * src/base/ftstream.c (FT_Stream_EnterFrame): Exit with error - if the frame size is larger than the stream size. - - * src/base/ftsystem.c (ft_ansi_stream_io): Exit with error if - seeking a position larger than the stream size. - -2010-06-25 Werner Lemberg - - [pfr] Fix Savannah bug #30261. - - * src/pfr/pfrobjs.c (pfr_face_init): Reject fonts which contain - neither outline nor bitmap glyphs. - -2010-06-25 Werner Lemberg - - [cff] Fix Savannah bug #30254. - - * src/cff/cffload.c (cff_index_get_pointers): Do sanity check for - first offset also. - -2010-06-25 suzuki toshiya - - Initial fix for Savannah bug #30248 and #30249. - - * src/base/ftobjs.c (Mac_Read_POST_Resource): Check the error during - reading a PFB fragment embedded in LaserWriter PS font for Macintosh. - Reported by Robert Święcki. - -2010-06-24 Werner Lemberg - - [pcf] Fix Savannah bug #30247. - - * src/pcf/pcfread.c (pcf_get_metrics): Disallow (invalid) fonts with - zero metrics. - -2010-06-24 Graham Asher - - * src/smooth/ftgrays.c (gray_render_cubic): Fix algorithm. - The previous version was too aggressive, as demonstrated in - http://lists.gnu.org/archive/html/freetype-devel/2010-06/msg00020.html. - -2010-06-24 Werner Lemberg - - */*: Use module specific error names where appropriate. - -2010-06-24 Werner Lemberg - - [sfnt] Fix Savannah bug #30236. - - * src/sfnt/ttcmap.c (tt_face_build_cmaps): Improve check for pointer - to `cmap_table'. - -2010-06-24 Werner Lemberg - - [pfr] Fix Savannah bug #30235. - - * src/pfr/pfrgload.c (pfr_glyph_load_simple): Protect against - invalid indices if there aren't any coordinates for indexing. - -2010-06-24 Werner Lemberg - - [bdf]: Font properties are optional. - - * src/bdf/bdflib.c (_bdf_readstream): Use special error code to - indicate a redo operation. - (_bdf_parse_start): Handle `CHARS' keyword here too and pass current - input line to `_bdf_parse_glyph'. - -2010-06-23 Werner Lemberg - - [bdf] Fix Savannah bug #30220. - - * include/freetype/fterrdef.h - (BDF_Err_Missing_Fontboundingbox_Field): New error code. - - * src/bdf/bdflib.c (_bdf_parse_start): Check for missing - `FONTBOUNDINGBOX' field. - Avoid memory leak if there are multiple `FONT' lines (which is - invalid but doesn't hurt). - -2010-06-21 Werner Lemberg - - [pfr] Fix Savannah bug #30168. - - * src/pfr/pfrgload.c (pfr_glyph_load_compound): Limit the number of - subglyphs to avoid endless recursion. - -2010-06-20 Werner Lemberg - - [psaux] Fix Savannah bug #30145. - - * src/psaux/psobjs.c (t1_builder_add_contour): Protect against - `outline == NULL' which might happen in invalid fonts. - -2010-06-19 Werner Lemberg - - [bdf] Fix Savannah bug #30135. - - * src/bdf/bdflib.c (_bdf_list_join): Don't modify value in static - string `empty'. - (_bdf_parse_glyph): Avoid memory leak in case of error. - -2010-06-15 Werner Lemberg - - [autofit] Fix Savannah bug #30108. - - * src/autofit/afglobal.c (af_face_globals_compute_script_coverage): - Properly mask AF_DIGIT bit in comparison. - -2010-06-11 Werner Lemberg - - [pshinter] Fix Savannah bug #30106. - - Point numbers for FreeType's implementation of hinting masks are - collected before the final number of points of a glyph has been - determined; in particular, the code for handling the `endchar' - opcode can reduce the number of points. - - * src/pshinter/pshalgo.c (psh_glyph_find_strong_points): Assure that - `end_point' is not larger than `glyph->num_points'. - -2010-06-11 Werner Lemberg - - [cff]: Improve debugging output. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - : Implement it. - -2010-06-10 Graham Asher - - ftgrays: Speed up rendering of small cubic splines. - - * src/smooth/ftgrays.c (gray_render_cubic): Implement new, - simplified algorithm to find out whether the spline can be replaced - with two straight lines. See this thread for more: - - http://lists.gnu.org/archive/html/freetype-devel/2010-06/msg00000.html - -2010-06-09 Werner Lemberg - - [cff] Fix Savannah bug #30082. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - : Protect against stack underflow. - -2010-06-08 Werner Lemberg - - [cff] Fix Savannah bug #30053. - - * src/cff/cffparse.c (cff_parse_real): Handle border case where - `fraction_length' has value 10. - -2010-06-07 Werner Lemberg - - Fix Savannah bug #30052. - This bug has been introduced with commit 2415cbf3. - - * src/base/ftobjs.c (FT_Get_First_Char, FT_Get_Next_Char): Protect - against endless loop in case of corrupted font header data. - -2010-05-26 Werner Lemberg - - Remove unused variable. - Found by Graham. - - * src/autofit/afhints.c (af_glyph_hints_reload): Remove unused - variable `first' in first block. - -2010-05-22 Werner Lemberg - - Fix various memory problems found by linuxtesting.org. - - * src/base/ftgxval.c (FT_TrueTypeGX_Free, FT_ClassicKern_Free), - src/base/ftotval.c (FT_OpenType_Free), src/base/ftpfr.c - (ft_pfr_check): Check `face'. - - * src/base/ftobjs.c (FT_Get_Charmap_Index): Check `charmap' and - `charmap->face'. - (FT_Render_Glyph): Check `slot->face'. - (FT_Get_SubGlyph_Info): Check `glyph->subglyphs'. - -2010-05-22 Werner Lemberg - - autofit: Remove dead code. - Suggested by Graham. - - * src/autofit/afhints.c (af_glyph_hints_compute_inflections): - Removed. - (af_glyph_hints_reload): Remove third argument. - Update all callers. - -2010-05-21 Bram Tassyns - - [cff] Fix Savannah bug #27987. - - * src/cff/cffobjs.c (remove_subset_prefix): New function. - (cff_face_init): Use it to adjust `cffface->family_name'. - -2010-05-20 Werner Lemberg - - TrueType: Make FreeType ignore maxSizeOfInstructions in `maxp'. - - Acroread does the same. - - * src/truetype/ttgload.c (TT_Process_Composite_Glyph): Call - `Update_Max' to adjust size of instructions array if necessary and - add a rough safety check. - - (load_truetype_glyph): Save `loader->byte_len' before recursive - call. - - * src/truetype/ttinterp.h, src/truetype/ttinterp.c (Update_Max): - Declare it as FT_LOCAL. - -2010-05-18 Hongbo Ni - - Apply Savannah patch #7196. - - * src/cff/cffgload.c (cff_slot_load): Prevent crash if CFF subfont - index is out of range. - -2010-05-11 Werner Lemberg - - * docs/formats.txt: Give pointer to PCF documentation. - Information provided by Alan Coopersmith - . - -2010-05-10 Ken Sharp - - [psaux] Fix Savannah bug #29846. - - Previously we discovered fonts which used `setcurrentpoint' to set - the initial point of a contour to 0,0. This caused FreeType to - raise an error, because the `setcurrentpoint' operator is only - supposed to be used with the results from an OtherSubr subroutine. - - This was fixed by simply ignoring the error and carrying on. - - Now we have found a font which uses setcurrentpoint to actually - establish a non-zero point for a contour during the course of a - glyph program. FWIW, these files may be produced by an application - called `Intaglio' on the Mac, when converting TrueType fonts to - Type 1. - - The fix allows the new invalid behaviour, the old invalid behaviour - and real proper usage of the operator to work the same way as Adobe - interpreters apparently do. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Make - `setcurrentpoint' use the top two elements of the stack to establish - unconditionally the current x and y coordinates. - - Make the `flex' subroutine handling (OtherSubr 0) put the current - x,y coordinates onto the stack, instead of two dummy uninitialised - values. - -2010-04-14 Ken Sharp - - [psaux] Fix Savannah bug #29444. - - * src/psaux/psobjs.c (t1_builder_start_point): Accept (invalid) - `lineto' immediately after `hsbw', in accordance with Acrobat, GS, - and others. - -2010-04-14 Michał Cichoń - - [psaux] Fix Savannah bug #27999. - - * src/cache/ftcmanag.c (FTC_Manager_RemoveFaceID): Only remove - selected entry, not all. - -2010-04-06 Jonathan Kew - - [truetype] Add overflow check to `fvar' table. - - * src/truetype/ttgxvar.c (TT_Get_MM_Var): Check axis and instance - count. - -2010-04-05 Ken Sharp - - [raster] Fix Savannah bug #29335. - - * src/raster/ftraster.c (Line_Up): Use slow multiplication to - prevent overflow. This shouldn't have any serious impact on speed, - however. - -2010-04-05 Werner Lemberg - - Add new function `FT_Library_SetLcdFilterWeights'. - - This is based on code written by Lifter - . It fixes - FreeDesktop bug #27386. - - * src/base/ftlcdfil.c (FT_Library_SetLcdFilterWeights): New - function. - - * include/freetype/ftlcdfil.h: Updated. - - * docs/CHANGES: Updated. - -2010-04-01 John Tytgat - - [truetype] Fix Savannah bug #29404. - - * src/truetype/ttgload.c: Revert change 2752bd1a (check on bit 1 - of `head' table of TrueType fonts). - -2010-03-14 suzuki toshiya - - Fix `multi build' for Tytgat's CFF driver improvement. - - * src/base/cffload.h (cff_index_get_name): Added. - -2010-03-12 suzuki toshiya - - Remove duplicated inclusion of `FT_OUTLINE_H' in ftobjs.c. - - * src/base/ftobjs.c: Remove 2nd inclusion of `FT_OUTLINE_H'. - -2010-03-11 Chris Liddell - - [raster] Fix Savannah bug #27442. - - * src/raster/ftraster.c (ft_black_reset): Fix `buffer_size'. - -2010-03-09 Werner Lemberg - - [cff] Remove unused variable. - Reported by Graham. - - * src/cff/cffparse.c (cff_parse_real): Remove `rest'. - -2010-03-02 John Tytgat - - [cff] Improve CFF string (especially glyphname) lookup performance. - - We do this by avoiding memory allocation and file I/O. This is - Savannah patch #7104. - - * src/cff/cfftypes.h: Include PS cmaps service and - FT_INTERNAL_POSTSCRIPT_HINTS_H. - (CFF_SubFontRec): Remove `num_local_subrs'. - (CFF_FontRec): Add `num_strings', `strings', and `string_pool' - fields. - Remove `string_index' and `num_global_subrs' fields. - Use real types instead of `void' for `pshinter' and `psnames' fields. - - * src/cff/cffload.c: Don't include PS cmaps service. - (cff_index_get_pointers): Add `pool' parameter which allows to - insert an extra NUL character for each String INDEX entry. - (cff_index_get_name): Make it a local function. - (cff_index_get_string): New function. - (cff_subfont_load): Updated. - (cff_font_load): Initialize `num_strings', `strings', and - `string_pool' fields in the `CFF_FontRec' structure. - (cff_index_get_sid_string): Use `cff_index_get_string' instead of - `cff_index_get_name'. - (cff_font_done): Updated. - - * src/cff/cffload.h: Don't include PS cmaps service. - (cff_index_get_string): Added. - (cff_index_get_sid_string): Updated. - - * src/cff/cffobjs.c: Don't include PS cmaps service and - FT_INTERNAL_POSTSCRIPT_HINTS_H. - (cff_size_get_globals_funcs, cff_slot_init): Updated. - (cff_face_init): Follow `cff_index_get_name', - `cff_index_get_string', and `cff_index_get_sid_string' changes. - - * src/cff/cffcmap.c (cff_sid_free_glyph_name): Removed. - (cff_sid_to_glyph_name): Use `cff_index_get_cid_string'. - (cff_cmap_unicode_init): Updated. - - * src/cff/cffdrivr.c: Don't include PS cmap service. - (cff_get_glyph_name): Avoid unnecessary lookup for POSTSCRIPT_CMAPS - service. - (cff_get_glyph_name, cff_ps_get_font_info, cff_get_ros): Follow API - `cff_index_get_sid_string' change. - (cff_get_name_index): Use `cff_index_get_string' instead of - `cff_index_get_name'. - - * src/cff/cffgload.c: Don't include FT_INTERNAL_POSTSCRIPT_HINTS_H. - (cff_decoder_init, cff_decoder_prepare): Updated. - -2010-02-27 Werner Lemberg - - Simplify code. - Suggested by Behdad. - - * src/base/ftobjs.c (FT_Get_First_Char): Don't use a loop since we - call FT_Get_Next_Char anyway if necessary. - -2010-02-26 Behdad Esfahbod - - Improve handling of invalid glyph indices in char->index functions. - - * src/base/ftobjs.c (FT_Get_First_Char, FT_Get_Next_Char): Use a - loop. - -2010-02-18 Chris Liddell - - [truetype] Fix Savannah bug #28905. - - Initialize phantom points before calling the incremental interface - to update glyph metrics. - - * src/truetype/ttgload.c (tt_get_metrics_incr_overrides) - [FT_CONFIG_OPTION_INCREMENTAL]: New function, split off from... - (tt_get_metrics): This. - Updated. - (load_truetype_glyph): Use tt_get_metrics_incr_overrides. - ----------------------------------------------------------------------------- - -Copyright 2010-2015 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. - - -Local Variables: -version-control: never -coding: utf-8 -End: diff --git a/3party/freetype/Jamfile b/3party/freetype/Jamfile deleted file mode 100644 index 66537141eb..0000000000 --- a/3party/freetype/Jamfile +++ /dev/null @@ -1,209 +0,0 @@ -# FreeType 2 top Jamfile. -# -# Copyright 2001-2015 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. - - -# The HDRMACRO is already defined in FTJam and is used to add -# the content of certain macros to the list of included header -# files. -# -# We can compile FreeType 2 with classic Jam however thanks to -# the following code -# -if ! $(JAM_TOOLSET) -{ - rule HDRMACRO - { - # nothing - } -} - - -# We need to invoke a SubDir rule if the FT2 source directory top is not the -# current directory. This allows us to build FreeType 2 as part of a larger -# project easily. -# -if $(FT2_TOP) != $(DOT) -{ - SubDir FT2_TOP ; -} - - -# The following macros define the include directory, the source directory, -# and the final library name (without library extensions). They can be -# replaced by other definitions when the library is compiled as part of -# a larger project. -# - -# Name of FreeType include directory during compilation. -# This is relative to FT2_TOP. -# -FT2_INCLUDE_DIR ?= include ; - -# Name of FreeType source directory during compilation. -# This is relative to FT2_TOP. -# -FT2_SRC_DIR ?= src ; - -# Name of final library, without extension. -# -FT2_LIB ?= $(LIBPREFIX)freetype ; - - -# Define FT2_BUILD_INCLUDE to point to your build-specific directory. -# This is prepended to FT2_INCLUDE_DIR. It can be used to specify -# the location of a custom which will point to custom -# versions of `ftmodule.h' and `ftoption.h', for example. -# -FT2_BUILD_INCLUDE ?= ; - -# The list of modules to compile on any given build of the library. -# By default, this will contain _all_ modules defined in FT2_SRC_DIR. -# -# IMPORTANT: You'll need to change the content of `ftmodule.h' as well -# if you modify this list or provide your own. -# -FT2_COMPONENTS ?= autofit # auto-fitter - base # base component (public APIs) - bdf # BDF font driver - bzip2 # support for bzip2-compressed PCF font - cache # cache sub-system - cff # CFF/CEF font driver - cid # PostScript CID-keyed font driver - gzip # support for gzip-compressed PCF font - lzw # support for LZW-compressed PCF font - pcf # PCF font driver - pfr # PFR/TrueDoc font driver - psaux # common PostScript routines module - pshinter # PostScript hinter module - psnames # PostScript names handling - raster # monochrome rasterizer - sfnt # SFNT-based format support routines - smooth # anti-aliased rasterizer - truetype # TrueType font driver - type1 # PostScript Type 1 font driver - type42 # PostScript Type 42 (embedded TrueType) driver - winfonts # Windows FON/FNT font driver - ; - - -# Don't touch. -# -FT2_INCLUDE = $(FT2_BUILD_INCLUDE) - [ FT2_SubDir $(FT2_INCLUDE_DIR) ] ; - -FT2_SRC = [ FT2_SubDir $(FT2_SRC_DIR) ] ; - -# Location of API Reference Documentation -# -if $(DOC_DIR) -{ - DOC_DIR = $(DOCDIR:T) ; -} -else -{ - DOC_DIR = docs/reference ; -} - - -# Only used by FreeType developers. -# -if $(DEBUG_HINTER) -{ - CCFLAGS += -DDEBUG_HINTER ; -} - - -# We need `include' in the current include path in order to -# compile any part of FreeType 2. -# -HDRS += $(FT2_INCLUDE) ; - - -# We need to #define FT2_BUILD_LIBRARY so that our sources find the -# internal headers -# -CCFLAGS += -DFT2_BUILD_LIBRARY ; - -# Uncomment the following line if you want to build individual source files -# for each FreeType 2 module. This is only useful during development, and -# is better defined as an environment variable anyway! -# -# FT2_MULTI = true ; - - -# The files `ftheader.h', `internal.h', and `ftserv.h' are used to define -# macros that are later used in #include statements. They need to be parsed -# in order to record these definitions. -# -HDRMACRO [ FT2_SubDir $(FT2_INCLUDE_DIR) freetype config ftheader.h ] ; -HDRMACRO [ FT2_SubDir $(FT2_INCLUDE_DIR) freetype internal internal.h ] ; -HDRMACRO [ FT2_SubDir $(FT2_INCLUDE_DIR) freetype internal ftserv.h ] ; - - -# Now include the Jamfile in `freetype2/src', used to drive the compilation -# of each FreeType 2 component and/or module. -# -SubInclude FT2_TOP $(FT2_SRC_DIR) ; - -# Handle the generation of the `ftexport.sym' file, which contains the list -# of exported symbols. This can be used on Unix by libtool. -# -SubInclude FT2_TOP $(FT2_SRC_DIR) tools ; - -rule GenExportSymbols -{ - local apinames = apinames$(SUFEXE) ; - local headers = [ Glob $(2) : *.h ] ; - - LOCATE on $(1) = $(ALL_LOCATE_TARGET) ; - - APINAMES on $(1) = apinames$(SUFEXE) ; - - Depends $(1) : $(apinames) $(headers) ; - GenExportSymbols1 $(1) : $(headers) ; - Clean clean : $(1) ; -} - -actions GenExportSymbols1 bind APINAMES -{ - $(APINAMES) $(2) > $(1) -} - -GenExportSymbols ftexport.sym : include include/cache ; - -# Test files (hinter debugging). Only used by FreeType developers. -# -if $(DEBUG_HINTER) -{ - SubInclude FT2_TOP tests ; -} - -rule RefDoc -{ - Depends $1 : all ; - NotFile $1 ; - Always $1 ; -} - -actions RefDoc -{ - python $(FT2_SRC)/tools/docmaker/docmaker.py - --prefix=ft2 - --title=FreeType-2.6 - --output=$(DOC_DIR) - $(FT2_INCLUDE)/freetype/*.h - $(FT2_INCLUDE)/freetype/config/*.h -} - -RefDoc refdoc ; - - -# end of top Jamfile diff --git a/3party/freetype/Jamrules b/3party/freetype/Jamrules deleted file mode 100644 index 91d1966454..0000000000 --- a/3party/freetype/Jamrules +++ /dev/null @@ -1,71 +0,0 @@ -# FreeType 2 JamRules. -# -# Copyright 2001-2015 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. - - -# This file contains the Jam rules needed to build the FreeType 2 library. -# It is shared by all Jamfiles and is included only once in the build -# process. -# - - -# Call SubDirHdrs on a list of directories. -# -rule AddSubDirHdrs -{ - local x ; - - for x in $(<) - { - SubDirHdrs $(x) ; - } -} - - -# Determine prefix of library file. We must use "libxxxxx" on Unix systems, -# while all other simply use the real name. -# -if $(UNIX) -{ - LIBPREFIX ?= lib ; -} -else -{ - LIBPREFIX ?= "" ; -} - -# FT2_TOP contains the location of the FreeType source directory. You can -# set it to a specific value if you want to compile the library as part of a -# larger project. -# -FT2_TOP ?= $(DOT) ; - -# Define a new rule used to declare a sub directory of the Nirvana source -# tree. -# -rule FT2_SubDir -{ - if $(FT2_TOP) = $(DOT) - { - return [ FDirName $(<) ] ; - } - else - { - return [ FDirName $(FT2_TOP) $(<) ] ; - } -} - -# We also set ALL_LOCATE_TARGET in order to place all object and library -# files in "objs". -# -ALL_LOCATE_TARGET ?= [ FT2_SubDir objs ] ; - - -# end of Jamrules diff --git a/3party/freetype/README b/3party/freetype/README deleted file mode 100644 index adc63f6aa3..0000000000 --- a/3party/freetype/README +++ /dev/null @@ -1,84 +0,0 @@ - FreeType 2.6 - ============ - - Homepage: http://www.freetype.org - - FreeType is a freely available software library to render fonts. - - It is written in C, designed to be small, efficient, highly - customizable, and portable while capable of producing high-quality - output (glyph images) of most vector and bitmap font formats. - - Please read the docs/CHANGES file, it contains IMPORTANT - INFORMATION. - - Read the files `docs/INSTALL*' for installation instructions; see - the file `docs/LICENSE.TXT' for the available licenses. - - The FreeType 2 API reference is located in `docs/reference'; use the - file `ft2-toc.html' as the top entry point. Additional - documentation is available as a separate package from our sites. Go - to - - http://download.savannah.gnu.org/releases/freetype/ - - and download one of the following files. - - freetype-doc-2.6.tar.bz2 - freetype-doc-2.6.tar.gz - ftdoc26.zip - - To view the documentation online, go to - - http://www.freetype.org/freetype2/documentation.html - - - Mailing Lists - ============= - - The preferred way of communication with the FreeType team is using - e-mail lists. - - general use and discussion: freetype@nongnu.org - engine internals, porting, etc.: freetype-devel@nongnu.org - announcements: freetype-announce@nongnu.org - git repository tracker: freetype-commit@nongnu.org - - The lists are moderated; see - - http://www.freetype.org/contact.html - - how to subscribe. - - - Bugs - ==== - - Please submit bug reports at - - https://savannah.nongnu.org/bugs/?group=freetype - - Alternatively, you might report bugs by e-mail to - `freetype-devel@nongnu.org'. Don't forget to send a detailed - explanation of the problem -- there is nothing worse than receiving - a terse message that only says `it doesn't work'. - - - Enjoy! - - - The FreeType Team - ----------------------------------------------------------------------- - -Copyright 2006-2015 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. - - ---- end of README --- diff --git a/3party/freetype/README.git b/3party/freetype/README.git deleted file mode 100644 index 2350e78d60..0000000000 --- a/3party/freetype/README.git +++ /dev/null @@ -1,50 +0,0 @@ -The git archive doesn't contain pre-built configuration scripts for -UNIXish platforms. To generate them say - - sh autogen.sh - -which in turn depends on the following packages: - - automake (1.10.1) - libtool (2.2.4) - autoconf (2.62) - -The versions given in parentheses are known to work. Newer versions -should work too, of course. Note that autogen.sh also sets up proper -file permissions for the `configure' and auxiliary scripts. - -The autogen.sh script now checks the version of above three packages -whether they match the numbers above. Otherwise it will complain and -suggest either upgrading or using an environment variable to point to -a more recent version of the required tool(s). - -Note that `aclocal' is provided by the `automake' package on Linux, -and that `libtoolize' is called `glibtoolize' on Darwin (OS X). - - -For static builds which don't use platform specific optimizations, no -configure script is necessary at all; saying - - make setup ansi - make - -should work on all platforms which have GNU make (or makepp). - - -Similarly, a build with `cmake' can be done directly from the git -repository. - - ----------------------------------------------------------------------- - -Copyright 2005-2015 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. - - ---- end of README.git --- diff --git a/3party/freetype/autogen.sh b/3party/freetype/autogen.sh deleted file mode 100755 index 0693e9f920..0000000000 --- a/3party/freetype/autogen.sh +++ /dev/null @@ -1,166 +0,0 @@ -#!/bin/sh - -# Copyright 2005-2015 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. - -run () -{ - echo "running \`$*'" - eval $* - - if test $? != 0 ; then - echo "error while running \`$*'" - exit 1 - fi -} - -get_major_version () -{ - echo $1 | sed -e 's/\([0-9][0-9]*\)\..*/\1/g' -} - -get_minor_version () -{ - echo $1 | sed -e 's/[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/g' -} - -get_patch_version () -{ - # tricky: some version numbers don't include a patch - # separated with a point, but something like 1.4-p6 - patch=`echo $1 | sed -e 's/[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/g'` - if test "$patch" = "$1"; then - patch=`echo $1 | sed -e 's/[0-9][0-9]*\.[0-9][0-9]*\-p\([0-9][0-9]*\).*/\1/g'` - # if there isn't any patch number, default to 0 - if test "$patch" = "$1"; then - patch=0 - fi - fi - echo $patch -} - -# $1: version to check -# $2: minimum version - -compare_to_minimum_version () -{ - MAJOR1=`get_major_version $1` - MAJOR2=`get_major_version $2` - if test $MAJOR1 -lt $MAJOR2; then - echo 0 - return - else - if test $MAJOR1 -gt $MAJOR2; then - echo 1 - return - fi - fi - - MINOR1=`get_minor_version $1` - MINOR2=`get_minor_version $2` - if test $MINOR1 -lt $MINOR2; then - echo 0 - return - else - if test $MINOR1 -gt $MINOR2; then - echo 1 - return - fi - fi - - PATCH1=`get_patch_version $1` - PATCH2=`get_patch_version $2` - if test $PATCH1 -lt $PATCH2; then - echo 0 - else - echo 1 - fi -} - -# check the version of a given tool against a minimum version number -# -# $1: tool path -# $2: tool usual name (e.g. `aclocal') -# $3: tool variable (e.g. `ACLOCAL') -# $4: minimum version to check against -# $5: option field index used to extract the tool version from the -# output of --version - -check_tool_version () -{ - field=$5 - # assume the output of "[TOOL] --version" is "toolname (GNU toolname foo bar) version" - if test "$field"x = x; then - field=3 # default to 3 for all GNU autotools, after filtering enclosed string - fi - version=`$1 --version | head -1 | sed 's/([^)]*)/()/g' | cut -d ' ' -f $field` - version_check=`compare_to_minimum_version $version $4` - if test "$version_check"x = 0x; then - echo "ERROR: Your version of the \`$2' tool is too old." - echo " Minimum version $4 is required (yours is version $version)." - echo " Please upgrade or use the $3 variable to point to a more recent one." - echo "" - exit 1 - fi -} - -if test ! -f ./builds/unix/configure.raw; then - echo "You must be in the same directory as \`autogen.sh'." - echo "Bootstrapping doesn't work if srcdir != builddir." - exit 1 -fi - -# On MacOS X, the GNU libtool is named `glibtool'. -HOSTOS=`uname` -if test "$LIBTOOLIZE"x != x; then - : -elif test "$HOSTOS"x = Darwinx; then - LIBTOOLIZE=glibtoolize -else - LIBTOOLIZE=libtoolize -fi - -if test "$ACLOCAL"x = x; then - ACLOCAL=aclocal -fi - -if test "$AUTOCONF"x = x; then - AUTOCONF=autoconf -fi - -check_tool_version $ACLOCAL aclocal ACLOCAL 1.10.1 -check_tool_version $LIBTOOLIZE libtoolize LIBTOOLIZE 2.2.4 -check_tool_version $AUTOCONF autoconf AUTOCONF 2.62 - -# This sets freetype_major, freetype_minor, and freetype_patch. -eval `sed -nf version.sed include/freetype/freetype.h` - -# We set freetype-patch to an empty value if it is zero. -if test "$freetype_patch" = ".0"; then - freetype_patch= -fi - -cd builds/unix - -echo "generating \`configure.ac'" -sed -e "s;@VERSION@;$freetype_major$freetype_minor$freetype_patch;" \ - < configure.raw > configure.ac - -run aclocal -I . --force -run $LIBTOOLIZE --force --copy --install -run autoconf --force - -chmod +x mkinstalldirs -chmod +x install-sh - -cd ../.. - -chmod +x ./configure - -# EOF diff --git a/3party/freetype/builds/FindHarfBuzz.cmake b/3party/freetype/builds/FindHarfBuzz.cmake deleted file mode 100644 index 8440c7b2b6..0000000000 --- a/3party/freetype/builds/FindHarfBuzz.cmake +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (c) 2012, Intel Corporation -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name of Intel Corporation nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# Try to find Harfbuzz include and library directories. -# -# After successful discovery, this will set for inclusion where needed: -# HARFBUZZ_INCLUDE_DIRS - containg the HarfBuzz headers -# HARFBUZZ_LIBRARIES - containg the HarfBuzz library - -include(FindPkgConfig) - -pkg_check_modules(PC_HARFBUZZ harfbuzz>=0.9.7) - -find_path(HARFBUZZ_INCLUDE_DIRS NAMES hb.h - HINTS ${PC_HARFBUZZ_INCLUDE_DIRS} ${PC_HARFBUZZ_INCLUDEDIR} -) - -find_library(HARFBUZZ_LIBRARIES NAMES harfbuzz - HINTS ${PC_HARFBUZZ_LIBRARY_DIRS} ${PC_HARFBUZZ_LIBDIR} -) - -# HarfBuzz 0.9.18 split ICU support into a separate harfbuzz-icu library. -if ("${PC_HARFBUZZ_VERSION}" VERSION_GREATER "0.9.17") - pkg_check_modules(PC_HARFBUZZ_ICU harfbuzz-icu>=0.9.18 REQUIRED) - find_library(HARFBUZZ_ICU_LIBRARIES NAMES harfbuzz-icu - HINTS ${PC_HARFBUZZ_ICU_LIBRARY_DIRS} ${PC_HARFBUZZ_ICU_LIBDIR} - ) - list(APPEND HARFBUZZ_LIBRARIES "${HARFBUZZ_ICU_LIBRARIES}") -endif () - -include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(HarfBuzz DEFAULT_MSG HARFBUZZ_INCLUDE_DIRS HARFBUZZ_LIBRARIES) - -mark_as_advanced( - HARFBUZZ_ICU_LIBRARIES - HARFBUZZ_INCLUDE_DIRS - HARFBUZZ_LIBRARIES -) diff --git a/3party/freetype/builds/amiga/README b/3party/freetype/builds/amiga/README deleted file mode 100644 index d0e5ec5d61..0000000000 --- a/3party/freetype/builds/amiga/README +++ /dev/null @@ -1,110 +0,0 @@ - -README for the builds/amiga subdirectory. - -Copyright 2005-2015 by -Werner Lemberg and Detlef Wrkner. - -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. - - -The makefile.os4 is for the AmigaOS4 SDK. To use it, type -"make -f makefile.os4", it produces a link library libft2_ppc.a. - -The makefile is for ppc-morphos-gcc-2.95.3-bin.tgz (gcc 2.95.3 hosted on -68k-Amiga producing MorphOS-PPC-binaries from http://www.morphos.de). -To use it, type "make assign", then "make"; it produces a link library -libft2_ppc.a. - -The smakefile is a makefile for Amiga SAS/C 6.58 (no longer available, -latest sold version was 6.50, updates can be found in Aminet). It is -based on the version found in the sourcecode of ttf.library 0.83b for -FreeType 1.3.1 from Richard Griffith (ragriffi@sprynet.com, -http://ragriffi.home.sprynet.com). - -You will also need the latest include files and amiga.lib from the -Amiga web site (http://www.amiga.com/3.9/download/NDK3.9.lha) for -AmigaOS 3.9; the generated code should work under AmigaOS 2.04 and up. - -To use it, call "smake assign" and then "smake" from the builds/amiga -directory. The results are: - -- A link library "ft2_680x0.lib" (where x depends on the setting of - the CPU entry in the smakefile) containing all FreeType2 parts - except of the init code, debugging code, and the system interface - code. - -- ftsystem.o, an object module containing the standard version of the - system interface code which uses fopen() fclose() fread() fseek() - ftell() malloc() realloc() and free() from lib:sc.lib (not pure). - -- ftsystempure.o, an object module containing the pure version of the - system interface code which uses Open() Close() Read() Seek() - ExamineFH() AsmAllocPooled() AsmFreePooled() etc. This version can - be used in both normal programs and in Amiga run-time shared system - librarys (can be linked with lib:libinit.o, no copying of DATA and - BSS hunks for each OpenLibrary() necessary). Source code is in - src/base/ftsystem.c. - -- ftdebug.o, an object module containing the standard version of the - debugging code which uses vprintf() and exit() (not pure). - Debugging can be turned on in FT:include/freetype/config/ftoption.h - and with FT_SetTraceLevel(). - -- ftdebugpure.o, an object module containing the pure version of the - debugging code which uses KVPrintf() from lib:debug.lib and no - exit(). For debugging of Amiga run-time shared system libraries. - Source code is in src/base/ftdebug.c. - -- NO ftinit.o. Because linking with a link library should result in - linking only the needed object modules in it, but standard - ftsystem.o would force ALL FreeType2 modules to be linked to your - program, I decided to use a different scheme: You must #include - FT:src/base/ftinit.c in your sourcecode and specify with #define - statements which modules you need. See - include/freetype/config/ftmodule.h. - - -To use in your own programs: - -- Insert the #define and #include statements from top of - include/freetype/config/ftmodule.h in your source code and - uncomment the #define statements for the FreeType2 modules you need. - -- You can use either PARAMETERS=REGISTER or PARAMETERS=STACK for - calling the FreeType2 functions, because the link library and the - object files are compiled with PARAMETERS=BOTH. - -- "smake assign" (assign "FT:" to the FreeType2 main directory). - -- Compile your program. - -- Link with either ftsystem.o or ftsystempure.o, if debugging enabled - with either ftdebug.o or (ftdebugpure.o and lib:debug.lib), and with - ft2_680x0.lib as link library. - - -To adapt to other compilers: - -- The standard ANSI C maximum length of 31 significant characters in - identifiers is not enough for FreeType2. Check if your compiler has - a minimum length of 40 significant characters or can be switched to - it. "idlen=40" is the option for SAS/C. Setting #define - HAVE_LIMIT_ON_IDENTS in an include file may also work (not tested). - -- Make sure that the include directory in builds/amiga is searched - before the normal FreeType2 include directory, so you are able to - replace problematic include files with your own version (same may be - useful for the src directory). - -- An example of how to replace/workaround a problematic include file - is include/freetype/config/ftconfig.h; it changes a #define that - would prevent SAS/C from generating XDEF's where it should do that and - then includes the standard FreeType2 include file. - -Local Variables: -coding: latin-1 -End: diff --git a/3party/freetype/builds/amiga/include/config/ftconfig.h b/3party/freetype/builds/amiga/include/config/ftconfig.h deleted file mode 100644 index 5ad8ded0fd..0000000000 --- a/3party/freetype/builds/amiga/include/config/ftconfig.h +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftconfig.h */ -/* */ -/* Amiga-specific configuration file (specification only). */ -/* */ -/* Copyright 2005-2015 by */ -/* Werner Lemberg and Detlef Wrkner. */ -/* */ -/* 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. */ -/* */ -/***************************************************************************/ - -/* - * This is an example how to override the default FreeType2 header files - * with Amiga-specific changes. When the compiler searches this directory - * before the default directory, we can do some modifications. - * - * Here we must change FT_EXPORT_DEF so that SAS/C does - * generate the needed XDEFs. - */ - -#if 0 -#define FT_EXPORT_DEF( x ) extern x -#endif - -#undef FT_EXPORT_DEF -#define FT_EXPORT_DEF( x ) x - -/* Now include the original file */ -#ifndef __MORPHOS__ -#ifdef __SASC -#include "FT:include/freetype/config/ftconfig.h" -#else -#include "/FT/include/freetype/config/ftconfig.h" -#endif -#else -/* We must define that, it seems that - * lib/gcc-lib/ppc-morphos/2.95.3/include/syslimits.h is missing in - * ppc-morphos-gcc-2.95.3-bin.tgz (gcc for 68k producing MorphOS PPC elf - * binaries from http://www.morphos.de) - */ -#define _LIBC_LIMITS_H_ -#include "/FT/include/freetype/config/ftconfig.h" -#endif - -/* -Local Variables: -coding: latin-1 -End: -*/ diff --git a/3party/freetype/builds/amiga/include/config/ftmodule.h b/3party/freetype/builds/amiga/include/config/ftmodule.h deleted file mode 100644 index 77a66db477..0000000000 --- a/3party/freetype/builds/amiga/include/config/ftmodule.h +++ /dev/null @@ -1,160 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmodule.h */ -/* */ -/* Amiga-specific FreeType module selection. */ -/* */ -/* Copyright 2005-2015 by */ -/* Werner Lemberg and Detlef Wrkner. */ -/* */ -/* 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. */ -/* */ -/***************************************************************************/ - -/* - * To avoid that all your programs include all FreeType modules, - * you copy the following piece of source code into your own - * source file and specify which modules you really need in your - * application by uncommenting the appropriate lines. - */ -/* -//#define FT_USE_AUTOFIT // autofitter -//#define FT_USE_RASTER // monochrome rasterizer -//#define FT_USE_SMOOTH // anti-aliasing rasterizer -//#define FT_USE_TT // truetype font driver -//#define FT_USE_T1 // type1 font driver -//#define FT_USE_T42 // type42 font driver -//#define FT_USE_T1CID // cid-keyed type1 font driver // no cmap support -//#define FT_USE_CFF // opentype font driver -//#define FT_USE_BDF // bdf bitmap font driver -//#define FT_USE_PCF // pcf bitmap font driver -//#define FT_USE_PFR // pfr font driver -//#define FT_USE_WINFNT // windows .fnt|.fon bitmap font driver -//#define FT_USE_OTV // opentype validator -//#define FT_USE_GXV // truetype gx validator -#include "FT:src/base/ftinit.c" -*/ - -/* Make sure that the needed support modules are built in. - * Dependencies can be found by searching for FT_Get_Module. - */ - -#ifdef FT_USE_T42 -#define FT_USE_TT -#endif - -#ifdef FT_USE_TT -#define FT_USE_SFNT -#endif - -#ifdef FT_USE_CFF -#define FT_USE_SFNT -#define FT_USE_PSHINT -#define FT_USE_PSNAMES -#endif - -#ifdef FT_USE_T1 -#define FT_USE_PSAUX -#define FT_USE_PSHINT -#define FT_USE_PSNAMES -#endif - -#ifdef FT_USE_T1CID -#define FT_USE_PSAUX -#define FT_USE_PSHINT -#define FT_USE_PSNAMES -#endif - -#ifdef FT_USE_PSAUX -#define FT_USE_PSNAMES -#endif - -#ifdef FT_USE_SFNT -#define FT_USE_PSNAMES -#endif - -/* Now include the modules */ - -#ifdef FT_USE_AUTOFIT -FT_USE_MODULE( FT_Module_Class, autofit_module_class ) -#endif - -#ifdef FT_USE_TT -FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) -#endif - -#ifdef FT_USE_T1 -FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) -#endif - -#ifdef FT_USE_CFF -FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) -#endif - -#ifdef FT_USE_T1CID -FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) -#endif - -#ifdef FT_USE_PFR -FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) -#endif - -#ifdef FT_USE_T42 -FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) -#endif - -#ifdef FT_USE_WINFNT -FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) -#endif - -#ifdef FT_USE_PCF -FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) -#endif - -#ifdef FT_USE_PSAUX -FT_USE_MODULE( FT_Module_Class, psaux_module_class ) -#endif - -#ifdef FT_USE_PSNAMES -FT_USE_MODULE( FT_Module_Class, psnames_module_class ) -#endif - -#ifdef FT_USE_PSHINT -FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) -#endif - -#ifdef FT_USE_RASTER -FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) -#endif - -#ifdef FT_USE_SFNT -FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) -#endif - -#ifdef FT_USE_SMOOTH -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) -#endif - -#ifdef FT_USE_OTV -FT_USE_MODULE( FT_Module_Class, otv_module_class ) -#endif - -#ifdef FT_USE_BDF -FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) -#endif - -#ifdef FT_USE_GXV -FT_USE_MODULE( FT_Module_Class, gxv_module_class ) -#endif - -/* -Local Variables: -coding: latin-1 -End: -*/ diff --git a/3party/freetype/builds/amiga/makefile b/3party/freetype/builds/amiga/makefile deleted file mode 100644 index 038e4686a4..0000000000 --- a/3party/freetype/builds/amiga/makefile +++ /dev/null @@ -1,299 +0,0 @@ -# -# Makefile for FreeType2 link library using ppc-morphos-gcc-2.95.3-bin.tgz -# (gcc 2.95.3 hosted on 68k-Amiga producing MorphOS-PPC-binaries from -# http://www.morphos.de) -# - - -# Copyright 2005-2015 by -# Werner Lemberg and Detlef Wrkner. -# -# 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. - - -# -# to build from the builds/amiga directory call -# -# make assign -# make -# -# Your programs source code should start with this -# (uncomment the parts you do not need to keep the program small): -# ---8<--- -#define FT_USE_AUTOFIT // autofitter -#define FT_USE_RASTER // monochrome rasterizer -#define FT_USE_SMOOTH // anti-aliasing rasterizer -#define FT_USE_TT // truetype font driver -#define FT_USE_T1 // type1 font driver -#define FT_USE_T42 // type42 font driver -#define FT_USE_T1CID // cid-keyed type1 font driver -#define FT_USE_CFF // opentype font driver -#define FT_USE_BDF // bdf bitmap font driver -#define FT_USE_PCF // pcf bitmap font driver -#define FT_USE_PFR // pfr font driver -#define FT_USE_WINFNT // windows .fnt|.fon bitmap font driver -#define FT_USE_OTV // opentype validator -#define FT_USE_GXV // truetype gx validator -#include "FT:src/base/ftinit.c" -# ---8<--- -# -# link your programs with libft2_ppc.a and either ftsystem.ppc.o or ftsystempure.ppc.o -# (and either ftdebug.ppc.o or ftdebugpure.ppc.o if you enabled FT_DEBUG_LEVEL_ERROR or -# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h). - -all: libft2_ppc.a ftsystem.ppc.o ftsystempure.ppc.o - -assign: - assign FT: // - -FTSRC = /FT/src - -CC = ppc-morphos-gcc -AR = ppc-morphos-ar rc -RANLIB = ppc-morphos-ranlib -LD = ppc-morphos-ld -CFLAGS = -DFT2_BUILD_LIBRARY -O2 -I/emu/emulinclude/includegcc -I/emu/include -Iinclude -I$(FTSRC) -I/FT/include - -# -# FreeType2 library base -# -ftbase.ppc.o: $(FTSRC)/base/ftbase.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftinit.ppc.o: $(FTSRC)/base/ftinit.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftsystem.ppc.o: $(FTSRC)/base/ftsystem.c - $(CC) -c $(CFLAGS) -o $@ $< - -# pure version for use in run-time library etc -ftsystempure.ppc.o: src/base/ftsystem.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftdebug.ppc.o: $(FTSRC)/base/ftdebug.c - $(CC) -c $(CFLAGS) -o $@ $< - -# pure version for use in run-time library etc -ftdebugpure.ppc.o: src/base/ftdebug.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library base extensions -# -ftbbox.ppc.o: $(FTSRC)/base/ftbbox.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftbdf.ppc.o: $(FTSRC)/base/ftbdf.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftbitmap.ppc.o: $(FTSRC)/base/ftbitmap.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftcid.ppc.o: $(FTSRC)/base/ftcid.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftfntfmt.ppc.o: $(FTSRC)/base/ftfntfmt.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftfstype.ppc.o: $(FTSRC)/base/ftfstype.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftgasp.ppc.o: $(FTSRC)/base/ftgasp.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftglyph.ppc.o: $(FTSRC)/base/ftglyph.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftgxval.ppc.o: $(FTSRC)/base/ftgxval.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftlcdfil.ppc.o: $(FTSRC)/base/ftlcdfil.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftmm.ppc.o: $(FTSRC)/base/ftmm.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftotval.ppc.o: $(FTSRC)/base/ftotval.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftpatent.ppc.o: $(FTSRC)/base/ftpatent.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftpfr.ppc.o: $(FTSRC)/base/ftpfr.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftstroke.ppc.o: $(FTSRC)/base/ftstroke.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftsynth.ppc.o: $(FTSRC)/base/ftsynth.c - $(CC) -c $(CFLAGS) -o $@ $< - -fttype1.ppc.o: $(FTSRC)/base/fttype1.c - $(CC) -c $(CFLAGS) -o $@ $< - -ftwinfnt.ppc.o: $(FTSRC)/base/ftwinfnt.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library autofitting module -# -autofit.ppc.o: $(FTSRC)/autofit/autofit.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library postscript hinting module -# -pshinter.ppc.o: $(FTSRC)/pshinter/pshinter.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library PS support module -# -psaux.ppc.o: $(FTSRC)/psaux/psaux.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library PS glyph names module -# -psnames.ppc.o: $(FTSRC)/psnames/psnames.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library monochrome raster module -# -raster.ppc.o: $(FTSRC)/raster/raster.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library anti-aliasing raster module -# -smooth.ppc.o: $(FTSRC)/smooth/smooth.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library 'sfnt' module -# -sfnt.ppc.o: $(FTSRC)/sfnt/sfnt.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library glyph and image caching system -# -ftcache.ppc.o: $(FTSRC)/cache/ftcache.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library OpenType font driver -# -cff.ppc.o: $(FTSRC)/cff/cff.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library TrueType font driver -# -truetype.ppc.o: $(FTSRC)/truetype/truetype.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library Type1 font driver -# -type1.ppc.o: $(FTSRC)/type1/type1.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library Type42 font driver -# -type42.ppc.o: $(FTSRC)/type42/type42.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library CID-keyed Type1 font driver -# -type1cid.ppc.o: $(FTSRC)/cid/type1cid.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library BDF bitmap font driver -# -bdf.ppc.o: $(FTSRC)/bdf/bdf.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library PCF bitmap font driver -# -pcf.ppc.o: $(FTSRC)/pcf/pcf.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library gzip support for compressed PCF bitmap fonts -# -gzip.ppc.o: $(FTSRC)/gzip/ftgzip.c - $(CC) -c $(CFLAGS) -o $@ $< - -# FreeType2 library bzip2 support for compressed PCF bitmap fonts -# -bzip2.ppc.o: $(FTSRC)/bzip2/ftbzip2.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library compress support for compressed PCF bitmap fonts -# -lzw.ppc.o: $(FTSRC)/lzw/ftlzw.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library PFR font driver -# -pfr.ppc.o: $(FTSRC)/pfr/pfr.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library Windows FNT/FON bitmap font driver -# -winfnt.ppc.o: $(FTSRC)/winfonts/winfnt.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library TrueTypeGX Validator -# -gxvalid.ppc.o: $(FTSRC)/gxvalid/gxvalid.c - $(CC) -c $(CFLAGS) -o $@ $< - -# -# FreeType2 library OpenType validator -# -otvalid.ppc.o: $(FTSRC)/otvalid/otvalid.c - $(CC) -c $(CFLAGS) -o $@ $< - -BASEPPC = ftbase.ppc.o ftbbox.ppc.o ftbdf.ppc.o ftbitmap.ppc.o ftcid.ppc.o \ - ftfntfmt.ppc.oftfstype.ppc.o ftgasp.ppc.o ftglyph.ppc.o \ - ftgxval.ppc.o ftlcdfil.ppc.o ftmm.ppc.o ftotval.ppc.o \ - ftpatent.ppc.o ftpfr.ppc.o ftstroke.ppc.o ftsynth.ppc.o \ - fttype1.ppc.o ftwinfnt.ppc.o - -DEBUGPPC = ftdebug.ppc.o ftdebugpure.ppc.o - -AFITPPC = autofit.ppc.o - -GXVPPC = gxvalid.ppc.o - -OTVPPC = otvalid.ppc.o - -PSPPC = psaux.ppc.o psnames.ppc.o pshinter.ppc.o - -RASTERPPC = raster.ppc.o smooth.ppc.o - -FONTDPPC = cff.ppc.o type1.ppc.o type42.ppc.o type1cid.ppc.o truetype.ppc.o\ - bdf.ppc.o pcf.ppc.o pfr.ppc.o winfnt.ppc.o - -libft2_ppc.a: $(BASEPPC) $(AFITPPC) $(GXVPPC) $(OTVPPC) $(PSPPC) $(RASTERPPC) sfnt.ppc.o ftcache.ppc.o $(FONTDPPC) gzip.ppc.o bzip2.ppc.o lzw.ppc.o - $(AR) $@ $(BASEPPC) $(AFITPPC) $(GXVPPC) $(OTVPPC) $(PSPPC) $(RASTERPPC) sfnt.ppc.o ftcache.ppc.o $(FONTDPPC) gzip.ppc.o bzip2.ppc.o lzw.ppc.o - -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 - -#Local Variables: -#coding: latin-1 -#End: diff --git a/3party/freetype/builds/amiga/makefile.os4 b/3party/freetype/builds/amiga/makefile.os4 deleted file mode 100644 index b7930558e3..0000000000 --- a/3party/freetype/builds/amiga/makefile.os4 +++ /dev/null @@ -1,303 +0,0 @@ -# -# Makefile for FreeType2 link library using gcc 4.0.3 from the -# AmigaOS4 SDK -# - - -# Copyright 2005-2015 by -# Werner Lemberg and Detlef Wrkner. -# -# 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. - - -# to build from the builds/amiga directory call -# -# make -f makefile.os4 -# -# Your programs source code should start with this -# (uncomment the parts you do not need to keep the program small): -# ---8<--- -#define FT_USE_AUTOFIT // autofitter -#define FT_USE_RASTER // monochrome rasterizer -#define FT_USE_SMOOTH // anti-aliasing rasterizer -#define FT_USE_TT // truetype font driver -#define FT_USE_T1 // type1 font driver -#define FT_USE_T42 // type42 font driver -#define FT_USE_T1CID // cid-keyed type1 font driver -#define FT_USE_CFF // opentype font driver -#define FT_USE_BDF // bdf bitmap font driver -#define FT_USE_PCF // pcf bitmap font driver -#define FT_USE_PFR // pfr font driver -#define FT_USE_WINFNT // windows .fnt|.fon bitmap font driver -#define FT_USE_OTV // opentype validator -#define FT_USE_GXV // truetype gx validator -#include "FT:src/base/ftinit.c" -# ---8<--- -# -# link your programs with libft2_ppc.a and either ftsystem.ppc.o or ftsystempure.ppc.o -# (and either ftdebug.ppc.o or ftdebugpure.ppc.o if you enabled FT_DEBUG_LEVEL_ERROR or -# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h). - -all: assign libft2_ppc.a ftsystem.ppc.o ftsystempure.ppc.o - -assign: - assign FT: // - -CC = ppc-amigaos-gcc -AR = ppc-amigaos-ar -RANLIB = ppc-amigaos-ranlib - -DIRFLAGS = -Iinclude -I/FT/src -I/FT/include -I/SDK/include - -WARNINGS = -Wall -W -Wundef -Wpointer-arith -Wbad-function-cast \ - -Waggregate-return -Wwrite-strings -Wshadow - -OPTIONS = -DFT2_BUILD_LIBRARY -DNDEBUG -fno-builtin -OPTIMIZE = -O2 -fomit-frame-pointer -fstrength-reduce -finline-functions - -CFLAGS = -mcrt=clib2 $(DIRFLAGS) $(WARNINGS) $(FT2FLAGS) $(OPTIONS) $(OPTIMIZE) - -# -# FreeType2 library base -# -ftbase.ppc.o: FT:src/base/ftbase.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbase.c - -ftinit.ppc.o: FT:src/base/ftinit.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftinit.c - -ftsystem.ppc.o: FT:src/base/ftsystem.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftsystem.c - -# pure version for use in run-time library etc -ftsystempure.ppc.o: src/base/ftsystem.c - $(CC) -c $(CFLAGS) -o $@ src/base/ftsystem.c - -# -# FreeType2 library base extensions -# -ftbbox.ppc.o: FT:src/base/ftbbox.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbbox.c - -ftbdf.ppc.o: FT:src/base/ftbdf.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbdf.c - -ftbitmap.ppc.o: FT:src/base/ftbitmap.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbitmap.c - -ftcid.ppc.o: FT:src/base/ftcid.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftcid.c - -ftdebug.ppc.o: FT:src/base/ftdebug.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftdebug.c - -# pure version for use in run-time library etc -ftdebugpure.ppc.o: src/base/ftdebug.c - $(CC) -c $(CFLAGS) -o $@ src/base/ftdebug.c - -ftfntfmt.ppc.o: FT:src/base/ftfntfmt.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftfntfmt.c - -ftfstype.ppc.o: FT:src/base/ftfstype.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftfstype.c - -ftgasp.ppc.o: FT:src/base/ftgasp.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftgasp.c - -ftglyph.ppc.o: FT:src/base/ftglyph.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftglyph.c - -ftgxval.ppc.o: FT:src/base/ftgxval.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftgxval.c - -ftlcdfil.ppc.o: FT:src/base/ftlcdfil.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftlcdfil.c - -ftmm.ppc.o: FT:src/base/ftmm.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftmm.c - -ftotval.ppc.o: FT:src/base/ftotval.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftotval.c - -ftpatent.ppc.o: FT:src/base/ftpatent.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftpatent.c - -ftpfr.ppc.o: FT:src/base/ftpfr.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftpfr.c - -ftstroke.ppc.o: FT:src/base/ftstroke.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftstroke.c - -ftsynth.ppc.o: FT:src/base/ftsynth.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftsynth.c - -fttype1.ppc.o: FT:src/base/fttype1.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/fttype1.c - -ftwinfnt.ppc.o: FT:src/base/ftwinfnt.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftwinfnt.c - -# -# FreeType2 library autofitting module -# -autofit.ppc.o: FT:src/autofit/autofit.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/autofit/autofit.c - -# -# FreeType2 library postscript hinting module -# -pshinter.ppc.o: FT:src/pshinter/pshinter.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/pshinter/pshinter.c - -# -# FreeType2 library PS support module -# -psaux.ppc.o: FT:src/psaux/psaux.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/psaux/psaux.c - -# -# FreeType2 library PS glyph names module -# -psnames.ppc.o: FT:src/psnames/psnames.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/psnames/psnames.c - -# -# FreeType2 library monochrome raster module -# -raster.ppc.o: FT:src/raster/raster.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/raster/raster.c - -# -# FreeType2 library anti-aliasing raster module -# -smooth.ppc.o: FT:src/smooth/smooth.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/smooth/smooth.c - -# -# FreeType2 library 'sfnt' module -# -sfnt.ppc.o: FT:src/sfnt/sfnt.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/sfnt/sfnt.c - -# -# FreeType2 library glyph and image caching system -# -ftcache.ppc.o: FT:src/cache/ftcache.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/cache/ftcache.c - -# -# FreeType2 library OpenType font driver -# -cff.ppc.o: FT:src/cff/cff.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/cff/cff.c - -# -# FreeType2 library TrueType font driver -# -truetype.ppc.o: FT:src/truetype/truetype.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/truetype/truetype.c - -# -# FreeType2 library Type1 font driver -# -type1.ppc.o: FT:src/type1/type1.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/type1/type1.c - -# -# FreeType2 library Type42 font driver -# -type42.ppc.o: FT:src/type42/type42.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/type42/type42.c - -# -# FreeType2 library CID-keyed Type1 font driver -# -type1cid.ppc.o: FT:src/cid/type1cid.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/cid/type1cid.c - -# -# FreeType2 library BDF bitmap font driver -# -bdf.ppc.o: FT:src/bdf/bdf.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/bdf/bdf.c - -# -# FreeType2 library PCF bitmap font driver -# -pcf.ppc.o: FT:src/pcf/pcf.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/pcf/pcf.c - -# -# FreeType2 library gzip support for compressed PCF bitmap fonts -# -gzip.ppc.o: FT:src/gzip/ftgzip.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/gzip/ftgzip.c - -# -# FreeType2 library bzip2 support for compressed PCF bitmap fonts -# -bzip2.ppc.o: FT:src/bzip2/ftbzip2.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/bzip2/ftbzip2.c - -# -# FreeType2 library compress support for compressed PCF bitmap fonts -# -lzw.ppc.o: FT:src/lzw/ftlzw.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/lzw/ftlzw.c - -# -# FreeType2 library PFR font driver -# -pfr.ppc.o: FT:src/pfr/pfr.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/pfr/pfr.c - -# -# FreeType2 library Windows FNT/FON bitmap font driver -# -winfnt.ppc.o: FT:src/winfonts/winfnt.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/winfonts/winfnt.c - -# -# FreeType2 library TrueTypeGX Validator -# -gxvalid.ppc.o: FT:src/gxvalid/gxvalid.c - $(CC) -c $(CFLAGS) -Wno-aggregate-return -o $@ /FT/src/gxvalid/gxvalid.c - -# -# FreeType2 library OpenType validator -# -otvalid.ppc.o: FT:src/otvalid/otvalid.c - $(CC) -c $(CFLAGS) -o $@ /FT/src/otvalid/otvalid.c - -BASE = ftbase.ppc.o ftbbox.ppc.o ftbdf.ppc.o ftbitmap.ppc.o ftcid.ppc.o \ - ftfntfmt.ppc.o ftfstype.ppc.o ftgasp.ppc.o ftglyph.ppc.o \ - ftgxval.ppc.o ftlcdfil.ppc.o ftmm.ppc.o ftotval.ppc.o \ - ftpatent.ppc.o ftpfr.ppc.o ftstroke.ppc.o ftsynth.ppc.o \ - fttype1.ppc.o ftwinfnt.ppc.o - -DEBUG = ftdebug.ppc.o ftdebugpure.ppc.o - -AFIT = autofit.ppc.o - -GXV = gxvalid.ppc.o - -OTV = otvalid.ppc.o - -PS = psaux.ppc.o psnames.ppc.o pshinter.ppc.o - -RASTER = raster.ppc.o smooth.ppc.o - -FONTD = cff.ppc.o type1.ppc.o type42.ppc.o type1cid.ppc.o truetype.ppc.o\ - bdf.ppc.o pcf.ppc.o pfr.ppc.o winfnt.ppc.o - -libft2_ppc.a: $(BASE) $(AFIT) $(GXV) $(OTV) $(PS) $(RASTER) sfnt.ppc.o ftcache.ppc.o $(FONTD) gzip.ppc.o lzw.ppc.o - $(AR) r $@ $(BASE) $(AFIT) $(GXV) $(OTV) $(PS) $(RASTER) sfnt.ppc.o ftcache.ppc.o $(FONTD) gzip.ppc.o lzw.ppc.o - $(RANLIB) $@ - -#Local Variables: -#coding: latin-1 -#End: diff --git a/3party/freetype/builds/amiga/smakefile b/3party/freetype/builds/amiga/smakefile deleted file mode 100644 index 145b1ad6e8..0000000000 --- a/3party/freetype/builds/amiga/smakefile +++ /dev/null @@ -1,303 +0,0 @@ -# -# Makefile for FreeType2 link library using Amiga SAS/C 6.58 -# - - -# Copyright 2005-2015 by -# Werner Lemberg and Detlef Wrkner. -# -# 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. - - -# to build from the builds/amiga directory call -# -# smake assign -# smake -# -# Your programs source code should start with this -# (uncomment the parts you do not need to keep the program small): -# ---8<--- -#define FT_USE_AUTOFIT // autofitter -#define FT_USE_RASTER // monochrome rasterizer -#define FT_USE_SMOOTH // anti-aliasing rasterizer -#define FT_USE_TT // truetype font driver -#define FT_USE_T1 // type1 font driver -#define FT_USE_T42 // type42 font driver -#define FT_USE_T1CID // cid-keyed type1 font driver -#define FT_USE_CFF // opentype font driver -#define FT_USE_BDF // bdf bitmap font driver -#define FT_USE_PCF // pcf bitmap font driver -#define FT_USE_PFR // pfr font driver -#define FT_USE_WINFNT // windows .fnt|.fon bitmap font driver -#define FT_USE_OTV // opentype validator -#define FT_USE_GXV // truetype gx validator -#include "FT:src/base/ftinit.c" -# ---8<--- -# -# link your programs with ft2_680x0.lib and either ftsystem.o or ftsystempure.o -# (and either ftdebug.o or ftdebugpure.o if you enabled FT_DEBUG_LEVEL_ERROR or -# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h). - -OBJBASE = ftbase.o ftbbox.o ftbdf.o ftbitmap.o ftcid.o ftfntfmt.o ftfstype.o \ - ftgasp.o ftglyph.o ftgxval.o ftlcdfil.o ftmm.o ftotval.o \ - ftpatent.o ftpfr.o ftstroke.o ftsynth.o fttype1.o ftwinfnt.o - -OBJSYSTEM = ftsystem.o ftsystempure.o - -OBJDEBUG = ftdebug.o ftdebugpure.o - -OBJAFIT = autofit.o - -OBJGXV = gxvalid.o - -OBJOTV = otvalid.o - -OBJPS = psaux.o psnames.o pshinter.o - -OBJRASTER = raster.o smooth.o - -OBJSFNT = sfnt.o - -OBJCACHE = ftcache.o - -OBJFONTD = cff.o type1.o type42.o type1cid.o\ - truetype.o winfnt.o bdf.o pcf.o pfr.o - -CORE = FT:src/ - -CPU = 68000 -#CPU = 68020 -#CPU = 68030 -#CPU = 68040 -#CPU = 68060 - -OPTIMIZER = optinlocal - -SCFLAGS = optimize opttime optsched strmerge data=faronly idlen=50 cpu=$(CPU)\ - idir=include/ idir=$(CORE) idir=FT:include/ nostackcheck nochkabort\ - noicons ignore=79,85,110,306 parameters=both define=FT2_BUILD_LIBRARY - -LIB = ft2_$(CPU).lib - -# sample linker options -OPTS = link lib=$(LIB),lib:sc.lib,lib:amiga.lib,lib:debug.lib\ - smallcode smalldata noicons utillib - -# sample program entry -#myprog: myprog.c ftsystem.o $(LIB) -# sc $< programname=$@ ftsystem.o $(SCFLAGS) $(OPTS) - -all: $(LIB) $(OBJSYSTEM) $(OBJDEBUG) - -assign: - assign FT: // - -# uses separate object modules in lib to make for easier debugging -# also, can make smaller programs if entire engine is not used -ft2_$(CPU).lib: $(OBJBASE) $(OBJAFIT) $(OBJOTV) $(OBJPS) $(OBJRASTER) $(OBJSFNT) $(OBJCACHE) $(OBJFONTD) lzw.o gzip.o bzip2.o - oml $@ r $(OBJBASE) $(OBJAFIT) $(OBJOTV) $(OBJPS) $(OBJRASTER) $(OBJSFNT) $(OBJCACHE) $(OBJFONTD) lzw.o gzip.o bzip2.o - -clean: - -delete \#?.o - -realclean: clean - -delete ft2$(CPU).lib - -# -# freetype library base -# -ftbase.o: $(CORE)base/ftbase.c - sc $(SCFLAGS) objname=$@ $< -ftinit.o: $(CORE)base/ftinit.c - sc $(SCFLAGS) objname=$@ $< -ftsystem.o: $(CORE)base/ftsystem.c - sc $(SCFLAGS) objname=$@ $< -ftsystempure.o: src/base/ftsystem.c ## pure version for use in run-time library etc - sc $(SCFLAGS) objname=$@ $< -ftdebug.o: $(CORE)base/ftdebug.c - sc $(SCFLAGS) objname=$@ $< -ftdebugpure.o: src/base/ftdebug.c ## pure version for use in run-time library etc - sc $(SCFLAGS) objname=$@ $< -# -# freetype library base extensions -# -ftbbox.o: $(CORE)base/ftbbox.c - sc $(SCFLAGS) objname=$@ $< -ftbdf.o: $(CORE)base/ftbdf.c - sc $(SCFLAGS) objname=$@ $< -ftbitmap.o: $(CORE)base/ftbitmap.c - sc $(SCFLAGS) objname=$@ $< -ftcid.o: $(CORE)base/ftcid.c - sc $(SCFLAGS) objname=$@ $< -ftfntfmt.o: $(CORE)base/ftfntfmt.c - sc $(SCFLAGS) objname=$@ $< -ftfstype.o: $(CORE)base/ftfstype.c - sc $(SCFLAGS) objname=$@ $< -ftgasp.o: $(CORE)base/ftgasp.c - sc $(SCFLAGS) objname=$@ $< -ftglyph.o: $(CORE)base/ftglyph.c - sc $(SCFLAGS) objname=$@ $< -ftgxval.o: $(CORE)base/ftgxval.c - sc $(SCFLAGS) objname=$@ $< -ftlcdfil.o: $(CORE)base/ftlcdfil.c - sc $(SCFLAGS) objname=$@ $< -ftmm.o: $(CORE)base/ftmm.c - sc $(SCFLAGS) objname=$@ $< -ftotval.o: $(CORE)base/ftotval.c - sc $(SCFLAGS) objname=$@ $< -ftpatent.o: $(CORE)base/ftpatent.c - sc $(SCFLAGS) objname=$@ $< -ftpfr.o: $(CORE)base/ftpfr.c - sc $(SCFLAGS) objname=$@ $< -ftstroke.o: $(CORE)base/ftstroke.c - sc $(SCFLAGS) objname=$@ $< -ftsynth.o: $(CORE)base/ftsynth.c - sc $(SCFLAGS) objname=$@ $< -fttype1.o: $(CORE)base/fttype1.c - sc $(SCFLAGS) objname=$@ $< -ftwinfnt.o: $(CORE)base/ftwinfnt.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library autofitter module -# -autofit.o: $(CORE)autofit/autofit.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library PS hinting module -# -pshinter.o: $(CORE)pshinter/pshinter.c - sc $(SCFLAGS) objname=$@ $< -# -# freetype library PS support module -# -psaux.o: $(CORE)psaux/psaux.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library PS glyph names module -# -psnames.o: $(CORE)psnames/psnames.c - sc $(SCFLAGS) code=far objname=$@ $< - -# -# freetype library monochrome raster module -# -raster.o: $(CORE)raster/raster.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library anti-aliasing raster module -# -smooth.o: $(CORE)smooth/smooth.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library 'sfnt' module -# -sfnt.o: $(CORE)sfnt/sfnt.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library glyph and image caching system (still experimental) -# -ftcache.o: $(CORE)cache/ftcache.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library OpenType font driver -# -cff.o: $(CORE)cff/cff.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library TrueType font driver -# -truetype.o: $(CORE)truetype/truetype.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library Type1 font driver -# -type1.o: $(CORE)type1/type1.c - sc $(SCFLAGS) objname=$@ $< - -# -# FreeType2 library Type42 font driver -# -type42.o: $(CORE)type42/type42.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library CID-keyed Type1 font driver -# -type1cid.o: $(CORE)cid/type1cid.c - sc $(SCFLAGS) objname=$@ $< -# -# freetype library CID-keyed Type1 font driver extensions -# -#cidafm.o: $(CORE)cid/cidafm.c -# sc $(SCFLAGS) objname=$@ $< - -# -# freetype library BDF bitmap font driver -# -bdf.o: $(CORE)bdf/bdf.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library PCF bitmap font driver -# -pcf.o: $(CORE)pcf/pcf.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library gzip support for compressed PCF bitmap fonts -# -gzip.o: $(CORE)gzip/ftgzip.c - sc $(SCFLAGS) define FAR objname=$@ $< - -# -# freetype library bzip2 support for compressed PCF bitmap fonts -# -bzip2.o: $(CORE)bzip2/ftbzip2.c - sc $(SCFLAGS) define FAR objname=$@ $< - -# -# freetype library compress support for compressed PCF bitmap fonts -# -lzw.o: $(CORE)lzw/ftlzw.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library PFR font driver -# -pfr.o: $(CORE)pfr/pfr.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library Windows FNT/FON bitmap font driver -# -winfnt.o: $(CORE)winfonts/winfnt.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library TrueTypeGX validator -# -gxvalid.o: $(CORE)gxvalid/gxvalid.c - sc $(SCFLAGS) objname=$@ $< - -# -# freetype library OpenType validator -# -otvalid.o: $(CORE)otvalid/otvalid.c - sc $(SCFLAGS) objname=$@ $< - -#Local Variables: -#coding: latin-1 -#End: diff --git a/3party/freetype/builds/amiga/src/base/ftdebug.c b/3party/freetype/builds/amiga/src/base/ftdebug.c deleted file mode 100644 index 14c353e3cf..0000000000 --- a/3party/freetype/builds/amiga/src/base/ftdebug.c +++ /dev/null @@ -1,297 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftdebug.c */ -/* */ -/* Debugging and logging component for amiga (body). */ -/* */ -/* Copyright 1996-2015 by */ -/* David Turner, Robert Wilhelm, Werner Lemberg and Detlef Wrkner. */ -/* */ -/* 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This component contains various macros and functions used to ease the */ - /* debugging of the FreeType engine. Its main purpose is in assertion */ - /* checking, tracing, and error detection. */ - /* */ - /* There are now three debugging modes: */ - /* */ - /* - trace mode */ - /* */ - /* Error and trace messages are sent to the log file (which can be the */ - /* standard error output). */ - /* */ - /* - error mode */ - /* */ - /* Only error messages are generated. */ - /* */ - /* - release mode: */ - /* */ - /* No error message is sent or generated. The code is free from any */ - /* debugging parts. */ - /* */ - /*************************************************************************/ - - - /* - * Based on the default ftdebug.c, - * replaced vprintf() with KVPrintF(), - * commented out exit(), - * replaced getenv() with GetVar(). - */ - -#include -#include -#include -#include -#define __NOLIBBASE__ -#define __NOLOBALIFACE__ -#define __USE_INLINE__ -#include -#include - -#ifndef __amigaos4__ - extern struct Library *DOSBase; -#else - extern struct DOSIFace *IDOS; -#endif - - -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_DEBUG_H - - -#if defined( FT_DEBUG_LEVEL_ERROR ) - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( void ) - FT_Message( const char* fmt, - ... ) - { - va_list ap; - - - va_start( ap, fmt ); - KVPrintF( fmt, ap ); - va_end( ap ); - } - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( void ) - FT_Panic( const char* fmt, - ... ) - { - va_list ap; - - - va_start( ap, fmt ); - KVPrintF( fmt, ap ); - va_end( ap ); - -/* exit( EXIT_FAILURE ); */ - } - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( int ) - FT_Throw( FT_Error error, - int line, - const char* file ) - { - FT_UNUSED( error ); - FT_UNUSED( line ); - FT_UNUSED( file ); - - return 0; - } - -#endif /* FT_DEBUG_LEVEL_ERROR */ - - - -#ifdef FT_DEBUG_LEVEL_TRACE - - /* array of trace levels, initialized to 0 */ - int ft_trace_levels[trace_count]; - - - /* define array of trace toggle names */ -#define FT_TRACE_DEF( x ) #x , - - static const char* ft_trace_toggles[trace_count + 1] = - { -#include FT_INTERNAL_TRACE_H - NULL - }; - -#undef FT_TRACE_DEF - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( FT_Int ) - FT_Trace_Get_Count( void ) - { - return trace_count; - } - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( const char * ) - FT_Trace_Get_Name( FT_Int idx ) - { - int max = FT_Trace_Get_Count(); - - - if ( idx < max ) - return ft_trace_toggles[idx]; - else - return NULL; - } - - - /*************************************************************************/ - /* */ - /* Initialize the tracing sub-system. This is done by retrieving the */ - /* value of the `FT2_DEBUG' environment variable. It must be a list of */ - /* toggles, separated by spaces, `;', or `,'. Example: */ - /* */ - /* export FT2_DEBUG="any:3 memory:7 stream:5" */ - /* */ - /* This requests that all levels be set to 3, except the trace level for */ - /* the memory and stream components which are set to 7 and 5, */ - /* respectively. */ - /* */ - /* See the file `include/freetype/internal/fttrace.h' for details of the */ - /* available toggle names. */ - /* */ - /* The level must be between 0 and 7; 0 means quiet (except for serious */ - /* runtime errors), and 7 means _very_ verbose. */ - /* */ - FT_BASE_DEF( void ) - ft_debug_init( void ) - { -/* const char* ft2_debug = getenv( "FT2_DEBUG" ); */ - char buf[256]; - const char* ft2_debug = &buf[0]; - - -/* if ( ft2_debug ) */ - if ( GetVar( "FT2_DEBUG", (STRPTR)ft2_debug, 256, LV_VAR ) > 0 ) - { - const char* p = ft2_debug; - const char* q; - - - for ( ; *p; p++ ) - { - /* skip leading whitespace and separators */ - if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) - continue; - - /* read toggle name, followed by ':' */ - q = p; - while ( *p && *p != ':' ) - p++; - - if ( !*p ) - break; - - if ( *p == ':' && p > q ) - { - FT_Int n, i, len = (FT_Int)( p - q ); - FT_Int level = -1, found = -1; - - - for ( n = 0; n < trace_count; n++ ) - { - const char* toggle = ft_trace_toggles[n]; - - - for ( i = 0; i < len; i++ ) - { - if ( toggle[i] != q[i] ) - break; - } - - if ( i == len && toggle[i] == 0 ) - { - found = n; - break; - } - } - - /* read level */ - p++; - if ( *p ) - { - level = *p - '0'; - if ( level < 0 || level > 7 ) - level = -1; - } - - if ( found >= 0 && level >= 0 ) - { - if ( found == trace_any ) - { - /* special case for `any' */ - for ( n = 0; n < trace_count; n++ ) - ft_trace_levels[n] = level; - } - else - ft_trace_levels[found] = level; - } - } - } - } - } - - -#else /* !FT_DEBUG_LEVEL_TRACE */ - - - FT_BASE_DEF( void ) - ft_debug_init( void ) - { - /* nothing */ - } - - - FT_BASE_DEF( FT_Int ) - FT_Trace_Get_Count( void ) - { - return 0; - } - - - FT_BASE_DEF( const char * ) - FT_Trace_Get_Name( FT_Int idx ) - { - FT_UNUSED( idx ); - - return NULL; - } - - -#endif /* !FT_DEBUG_LEVEL_TRACE */ - -/* -Local Variables: -coding: latin-1 -End: -*/ -/* END */ diff --git a/3party/freetype/builds/amiga/src/base/ftsystem.c b/3party/freetype/builds/amiga/src/base/ftsystem.c deleted file mode 100644 index bb3ccfd132..0000000000 --- a/3party/freetype/builds/amiga/src/base/ftsystem.c +++ /dev/null @@ -1,530 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsystem.c */ -/* */ -/* Amiga-specific FreeType low-level system interface (body). */ -/* */ -/* Copyright 1996-2015 by */ -/* David Turner, Robert Wilhelm, Werner Lemberg and Detlef Wrkner. */ -/* */ -/* 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. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* This file contains the Amiga interface used by FreeType to access */ - /* low-level, i.e. memory management, i/o access as well as thread */ - /* synchronisation. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Maintained by Detlef Wrkner */ - /* */ - /* Based on the original ftsystem.c, */ - /* modified to avoid fopen(), fclose(), fread(), fseek(), ftell(), */ - /* malloc(), realloc(), and free(). */ - /* */ - /* Those C library functions are often not thread-safe or cant be */ - /* used in a shared Amiga library. If that's not a problem for you, */ - /* you can of course use the default ftsystem.c with C library calls */ - /* instead. */ - /* */ - /* This implementation needs exec V39+ because it uses AllocPooled() etc */ - /* */ - /*************************************************************************/ - -#define __NOLIBBASE__ -#define __NOGLOBALIFACE__ -#define __USE_INLINE__ -#include -#include -#include -#ifdef __amigaos4__ -extern struct ExecIFace *IExec; -extern struct DOSIFace *IDOS; -#else -extern struct Library *SysBase; -extern struct Library *DOSBase; -#endif - -#define IOBUF_SIZE 512 - -/* structure that helps us to avoid - * useless calls of Seek() and Read() - */ -struct SysFile -{ - BPTR file; - ULONG iobuf_start; - ULONG iobuf_end; - UBYTE iobuf[IOBUF_SIZE]; -}; - -#ifndef __amigaos4__ -/* C implementation of AllocVecPooled (see autodoc exec/AllocPooled) */ -APTR -Alloc_VecPooled( APTR poolHeader, - ULONG memSize ) -{ - ULONG newSize = memSize + sizeof ( ULONG ); - ULONG *mem = AllocPooled( poolHeader, newSize ); - - if ( !mem ) - return NULL; - *mem = newSize; - return mem + 1; -} - -/* C implementation of FreeVecPooled (see autodoc exec/AllocPooled) */ -void -Free_VecPooled( APTR poolHeader, - APTR memory ) -{ - ULONG *realmem = (ULONG *)memory - 1; - - FreePooled( poolHeader, realmem, *realmem ); -} -#endif - -#include -#include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_DEBUG_H -#include FT_SYSTEM_H -#include FT_ERRORS_H -#include FT_TYPES_H - -#include -#include -#include - - - /*************************************************************************/ - /* */ - /* MEMORY MANAGEMENT INTERFACE */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* It is not necessary to do any error checking for the */ - /* allocation-related functions. This is done by the higher level */ - /* routines like ft_mem_alloc() or ft_mem_realloc(). */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* ft_alloc */ - /* */ - /* */ - /* The memory allocation function. */ - /* */ - /* */ - /* memory :: A pointer to the memory object. */ - /* */ - /* size :: The requested size in bytes. */ - /* */ - /* */ - /* The address of newly allocated block. */ - /* */ - FT_CALLBACK_DEF( void* ) - ft_alloc( FT_Memory memory, - long size ) - { -#ifdef __amigaos4__ - return AllocVecPooled( memory->user, size ); -#else - return Alloc_VecPooled( memory->user, size ); -#endif - } - - - /*************************************************************************/ - /* */ - /* */ - /* ft_realloc */ - /* */ - /* */ - /* The memory reallocation function. */ - /* */ - /* */ - /* memory :: A pointer to the memory object. */ - /* */ - /* cur_size :: The current size of the allocated memory block. */ - /* */ - /* new_size :: The newly requested size in bytes. */ - /* */ - /* block :: The current address of the block in memory. */ - /* */ - /* */ - /* The address of the reallocated memory block. */ - /* */ - FT_CALLBACK_DEF( void* ) - ft_realloc( FT_Memory memory, - long cur_size, - long new_size, - void* block ) - { - void* new_block; - -#ifdef __amigaos4__ - new_block = AllocVecPooled ( memory->user, new_size ); -#else - new_block = Alloc_VecPooled ( memory->user, new_size ); -#endif - if ( new_block != NULL ) - { - CopyMem ( block, new_block, - ( new_size > cur_size ) ? cur_size : new_size ); -#ifdef __amigaos4__ - FreeVecPooled ( memory->user, block ); -#else - Free_VecPooled ( memory->user, block ); -#endif - } - return new_block; - } - - - /*************************************************************************/ - /* */ - /* */ - /* ft_free */ - /* */ - /* */ - /* The memory release function. */ - /* */ - /* */ - /* memory :: A pointer to the memory object. */ - /* */ - /* block :: The address of block in memory to be freed. */ - /* */ - FT_CALLBACK_DEF( void ) - ft_free( FT_Memory memory, - void* block ) - { -#ifdef __amigaos4__ - FreeVecPooled( memory->user, block ); -#else - Free_VecPooled( memory->user, block ); -#endif - } - - - /*************************************************************************/ - /* */ - /* RESOURCE MANAGEMENT INTERFACE */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_io - - /* We use the macro STREAM_FILE for convenience to extract the */ - /* system-specific stream handle from a given FreeType stream object */ -#define STREAM_FILE( stream ) ( (struct SysFile *)stream->descriptor.pointer ) - - - /*************************************************************************/ - /* */ - /* */ - /* ft_amiga_stream_close */ - /* */ - /* */ - /* The function to close a stream. */ - /* */ - /* */ - /* stream :: A pointer to the stream object. */ - /* */ - FT_CALLBACK_DEF( void ) - ft_amiga_stream_close( FT_Stream stream ) - { - struct SysFile* sysfile; - - sysfile = STREAM_FILE( stream ); - Close ( sysfile->file ); - FreeMem ( sysfile, sizeof ( struct SysFile )); - - stream->descriptor.pointer = NULL; - stream->size = 0; - stream->base = 0; - } - - - /*************************************************************************/ - /* */ - /* */ - /* ft_amiga_stream_io */ - /* */ - /* */ - /* The function to open a stream. */ - /* */ - /* */ - /* stream :: A pointer to the stream object. */ - /* */ - /* offset :: The position in the data stream to start reading. */ - /* */ - /* buffer :: The address of buffer to store the read data. */ - /* */ - /* count :: The number of bytes to read from the stream. */ - /* */ - /* */ - /* The number of bytes actually read. */ - /* */ - FT_CALLBACK_DEF( unsigned long ) - ft_amiga_stream_io( FT_Stream stream, - unsigned long offset, - unsigned char* buffer, - unsigned long count ) - { - struct SysFile* sysfile; - unsigned long read_bytes; - - if ( count != 0 ) - { - sysfile = STREAM_FILE( stream ); - - /* handle the seek */ - if ( (offset < sysfile->iobuf_start) || (offset + count > sysfile->iobuf_end) ) - { - /* requested offset implies we need a buffer refill */ - if ( !sysfile->iobuf_end || offset != sysfile->iobuf_end ) - { - /* a physical seek is necessary */ - Seek( sysfile->file, offset, OFFSET_BEGINNING ); - } - sysfile->iobuf_start = offset; - sysfile->iobuf_end = 0; /* trigger a buffer refill */ - } - - /* handle the read */ - if ( offset + count <= sysfile->iobuf_end ) - { - /* we have buffer and requested bytes are all inside our buffer */ - CopyMem( &sysfile->iobuf[offset - sysfile->iobuf_start], buffer, count ); - read_bytes = count; - } - else - { - /* (re)fill buffer */ - if ( count <= IOBUF_SIZE ) - { - /* requested bytes is a subset of the buffer */ - read_bytes = Read( sysfile->file, sysfile->iobuf, IOBUF_SIZE ); - if ( read_bytes == -1UL ) - { - /* error */ - read_bytes = 0; - } - else - { - sysfile->iobuf_end = offset + read_bytes; - CopyMem( sysfile->iobuf, buffer, count ); - if ( read_bytes > count ) - { - read_bytes = count; - } - } - } - else - { - /* we actually need more than our buffer can hold, so we decide - ** to do a single big read, and then copy the last IOBUF_SIZE - ** bytes of that to our internal buffer for later use */ - read_bytes = Read( sysfile->file, buffer, count ); - if ( read_bytes == -1UL ) - { - /* error */ - read_bytes = 0; - } - else - { - ULONG bufsize; - - bufsize = ( read_bytes > IOBUF_SIZE ) ? IOBUF_SIZE : read_bytes; - sysfile->iobuf_end = offset + read_bytes; - sysfile->iobuf_start = sysfile->iobuf_end - bufsize; - CopyMem( &buffer[read_bytes - bufsize] , sysfile->iobuf, bufsize ); - } - } - } - } - else - { - read_bytes = 0; - } - - return read_bytes; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( FT_Error ) - FT_Stream_Open( FT_Stream stream, - const char* filepathname ) - { - struct FileInfoBlock* fib; - struct SysFile* sysfile; - - - if ( !stream ) - return FT_THROW( Invalid_Stream_Handle ); - -#ifdef __amigaos4__ - sysfile = AllocMem ( sizeof (struct SysFile ), MEMF_SHARED ); -#else - sysfile = AllocMem ( sizeof (struct SysFile ), MEMF_PUBLIC ); -#endif - if ( !sysfile ) - { - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " could not open `%s'\n", filepathname )); - - return FT_THROW( Cannot_Open_Resource ); - } - sysfile->file = Open( (STRPTR)filepathname, MODE_OLDFILE ); - if ( !sysfile->file ) - { - FreeMem ( sysfile, sizeof ( struct SysFile )); - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " could not open `%s'\n", filepathname )); - - return FT_THROW( Cannot_Open_Resource ); - } - - fib = AllocDosObject( DOS_FIB, NULL ); - if ( !fib ) - { - Close ( sysfile->file ); - FreeMem ( sysfile, sizeof ( struct SysFile )); - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " could not open `%s'\n", filepathname )); - - return FT_THROW( Cannot_Open_Resource ); - } - if ( !( ExamineFH( sysfile->file, fib ) ) ) - { - FreeDosObject( DOS_FIB, fib ); - Close ( sysfile->file ); - FreeMem ( sysfile, sizeof ( struct SysFile )); - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " could not open `%s'\n", filepathname )); - - return FT_THROW( Cannot_Open_Resource ); - } - stream->size = fib->fib_Size; - FreeDosObject( DOS_FIB, fib ); - - stream->descriptor.pointer = (void *)sysfile; - stream->pathname.pointer = (char*)filepathname; - sysfile->iobuf_start = 0; - sysfile->iobuf_end = 0; - stream->pos = 0; - - stream->read = ft_amiga_stream_io; - stream->close = ft_amiga_stream_close; - - if ( !stream->size ) - { - ft_amiga_stream_close( stream ); - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " opened `%s' but zero-sized\n", filepathname )); - return FT_THROW( Cannot_Open_Stream ); - } - - FT_TRACE1(( "FT_Stream_Open:" )); - FT_TRACE1(( " opened `%s' (%ld bytes) successfully\n", - filepathname, stream->size )); - - return FT_Err_Ok; - } - - -#ifdef FT_DEBUG_MEMORY - - extern FT_Int - ft_mem_debug_init( FT_Memory memory ); - - extern void - ft_mem_debug_done( FT_Memory memory ); - -#endif - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( FT_Memory ) - FT_New_Memory( void ) - { - FT_Memory memory; - - -#ifdef __amigaos4__ - memory = (FT_Memory)AllocVec( sizeof ( *memory ), MEMF_SHARED ); -#else - memory = (FT_Memory)AllocVec( sizeof ( *memory ), MEMF_PUBLIC ); -#endif - if ( memory ) - { -#ifdef __amigaos4__ - memory->user = CreatePool( MEMF_SHARED, 16384, 16384 ); -#else - memory->user = CreatePool( MEMF_PUBLIC, 16384, 16384 ); -#endif - if ( memory->user == NULL ) - { - FreeVec( memory ); - memory = NULL; - } - else - { - memory->alloc = ft_alloc; - memory->realloc = ft_realloc; - memory->free = ft_free; -#ifdef FT_DEBUG_MEMORY - ft_mem_debug_init( memory ); -#endif - } - } - - return memory; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( void ) - FT_Done_Memory( FT_Memory memory ) - { -#ifdef FT_DEBUG_MEMORY - ft_mem_debug_done( memory ); -#endif - - DeletePool( memory->user ); - FreeVec( memory ); - } - -/* -Local Variables: -coding: latin-1 -End: -*/ -/* END */ diff --git a/3party/freetype/builds/ansi/ansi-def.mk b/3party/freetype/builds/ansi/ansi-def.mk deleted file mode 100644 index 35b9f32fe7..0000000000 --- a/3party/freetype/builds/ansi/ansi-def.mk +++ /dev/null @@ -1,74 +0,0 @@ -# -# FreeType 2 configuration rules for a `normal' ANSI system -# - - -# Copyright 1996-2015 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. - - -DELETE := rm -f -CAT := cat -SEP := / -BUILD_DIR := $(TOP_DIR)/builds/ansi -PLATFORM := ansi - - -# The directory where all library files are placed. -# -# By default, this is the same as $(OBJ_DIR); however, this can be changed -# to suit particular needs. -# -LIB_DIR := $(OBJ_DIR) - - -# The name of the final library file. Note that the DOS-specific Makefile -# uses a shorter (8.3) name. -# -LIBRARY := lib$(PROJECT) - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := -I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := -D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := -l - - -# Target flag. -# -T := -o$(space) - - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -CFLAGS ?= -c - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -ANSIFLAGS := - - -# EOF diff --git a/3party/freetype/builds/ansi/ansi.mk b/3party/freetype/builds/ansi/ansi.mk deleted file mode 100644 index 2816e14fec..0000000000 --- a/3party/freetype/builds/ansi/ansi.mk +++ /dev/null @@ -1,21 +0,0 @@ -# -# FreeType 2 configuration rules for a `normal' pseudo ANSI compiler/system -# - - -# Copyright 1996-2015 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 $(TOP_DIR)/builds/ansi/ansi-def.mk -include $(TOP_DIR)/builds/compiler/ansi-cc.mk -include $(TOP_DIR)/builds/link_std.mk - - -# EOF diff --git a/3party/freetype/builds/atari/ATARI.H b/3party/freetype/builds/atari/ATARI.H deleted file mode 100644 index 9f78c924b8..0000000000 --- a/3party/freetype/builds/atari/ATARI.H +++ /dev/null @@ -1,20 +0,0 @@ -#if defined( __GXVALID_H__ ) -#pragma warn -aus /* too many unevaluated variables in gxvalid */ -#endif - -#ifndef ATARI_H -#define ATARI_H - -#pragma warn -stu - -/* PureC doesn't like 32bit enumerations */ - -#ifndef FT_IMAGE_TAG -#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value -#endif /* FT_IMAGE_TAG */ - -#ifndef FT_ENC_TAG -#define FT_ENC_TAG( value, a, b, c, d ) value -#endif /* FT_ENC_TAG */ - -#endif /* ATARI_H */ diff --git a/3party/freetype/builds/atari/FNames.SIC b/3party/freetype/builds/atari/FNames.SIC deleted file mode 100644 index f3657179d9..0000000000 --- a/3party/freetype/builds/atari/FNames.SIC +++ /dev/null @@ -1,37 +0,0 @@ -/* the following changes file names for PureC projects */ - -if (argc > 0) -{ - ordner = argv[0]; - if (basename(ordner) == "") /* ist Ordner */ - { - ChangeFilenames(ordner); - } -} - -proc ChangeFilenames(folder) -local i,entries,directory,file; -{ - entries = filelist(directory,folder); - for (i = 0; i < entries; ++i) - { - file = directory[i,0]; - if ((directory[i,3]&16) > 0) /* subdirectory */ - { - ChangeFilenames(folder+file+"\\"); - } - else - { - if ((stricmp(suffix(file),".h")==0)|(stricmp(suffix(file),".c")==0)) - ChangeFilename(folder,file); - } - } -} - -proc ChangeFilename(path,datei) -local newfile,err; -{ - newfile=datei; - newfile[0]=(newfile[0] | 32) ^ 32; - err=files.rename("-q",path+datei,newfile); -} diff --git a/3party/freetype/builds/atari/FREETYPE.PRJ b/3party/freetype/builds/atari/FREETYPE.PRJ deleted file mode 100644 index 4776a5bc69..0000000000 --- a/3party/freetype/builds/atari/FREETYPE.PRJ +++ /dev/null @@ -1,32 +0,0 @@ -;FreeType project file - -FREETYPE.LIB - -.C [-K -P -R -A] -.L [-J -V] -.S - -= - -..\..\src\base\ftsystem.c -..\..\src\base\ftdebug.c - -..\..\src\base\ftinit.c -..\..\src\base\ftglyph.c -..\..\src\base\ftmm -..\..\src\base\ftbbox - -..\..\src\base\ftbase.c -..\..\src\autohint\autohint.c -;..\..\src\cache\ftcache.c -..\..\src\cff\cff.c -..\..\src\cid\type1cid.c -..\..\src\psaux\psaux.c -..\..\src\pshinter\pshinter.c -..\..\src\psnames\psnames.c -..\..\src\raster\raster.c -..\..\src\sfnt\sfnt.c -..\..\src\smooth\smooth.c -..\..\src\truetype\truetype.c -..\..\src\type1\type1.c -..\..\src\type42\type42.c diff --git a/3party/freetype/builds/atari/README.TXT b/3party/freetype/builds/atari/README.TXT deleted file mode 100644 index 04eec63519..0000000000 --- a/3party/freetype/builds/atari/README.TXT +++ /dev/null @@ -1,51 +0,0 @@ -Compiling FreeType 2 with PureC compiler -======================================== - -[See below for a German version.] - -To compile FreeType 2 as a library the following changes must be applied: - -- All *.c files must start with an uppercase letter. - (In case GEMSCRIPT is available: - Simply drag the whole FreeType 2 directory to the file `FNames.SIC'.) - -- You have to change the INCLUDE directory in PureC's compiler options - to contain both the `INCLUDE' and `freetype2\include' directory. - Example: - - INCLUDE;E:\freetype2\include - -- The file `freetype2/include/Ft2build.h' must be patched as follows to - include ATARI.H: - - #ifndef __FT2_BUILD_GENERIC_H__ - #define __FT2_BUILD_GENERIC_H__ - - #include "ATARI.H" - - - -Compilieren von FreeType 2 mit PureC -==================================== - -Um FreeType 2 als eine Bibliothek (library) zu compilieren, muss folgendes -gendert werden: - -- Alle *.c-files mssen mit einem GROSSBUCHSTABEN beginnen. - (Falls GEMSCRIPT zur Verfgung steht: - Den kompletten Ordner freetype2 auf die Datei `FNames.SIC' draggen.) - -- In den Compiler-Optionen von PureC muss das INCLUDE directory auf INCLUDE - und freetype2\include verweisen. Z.B.: - - INCLUDE;E:\freetype2\include - -- In der Datei freetype2/include/Ft2build.h muss zu Beginn - ein #include "ATARI.H" wie folgt eingefgt werden: - - #ifndef __FT2_BUILD_GENERIC_H__ - #define __FT2_BUILD_GENERIC_H__ - - #include "ATARI.H" - ---- end of README.TXT --- diff --git a/3party/freetype/builds/atari/deflinejoiner.awk b/3party/freetype/builds/atari/deflinejoiner.awk deleted file mode 100644 index 16d9e6dd93..0000000000 --- a/3party/freetype/builds/atari/deflinejoiner.awk +++ /dev/null @@ -1,181 +0,0 @@ -#!/usr/bin/env awk - - -function shift( array, \ - junk, elm0, l ) -{ - elm0 = array[0] - for ( l = 0; l < asorti( array, junk ) - 1; l++ ) - array[l] = array[l+1]; - delete array[l] - return elm0 -} - - -function init_cpp_src_line() -{ - logical_line = "" - delete break_pos -} - - -function shift_valid_bp( array, \ - junk, elm ) -{ - elm = -1 - - if ( 0 < asorti( array, junk ) ) - do { - elm = shift( array ) - } while ( 0 > elm ); - - return elm -} - - -function check_cpp_src_line_break_pos( \ - i, junk ) -{ - printf( "break_pos:" ) - for ( i = 0; i < asorti( break_pos, junk ); i++ ) - printf( " %d", break_pos[i] ); - printf( "\n" ) -} - - -function check_cpp_src_line() -{ - printf( "logical_line[%s]\n", logical_line ) - check_cpp_src_line_break_pos() -} - - -function append_line( phys_line, \ - filt_line, bp_len ) -{ - filt_line = phys_line - sub( /\\$/, " ", filt_line ) - logical_line = logical_line filt_line - bp_len = asorti( break_pos, junk ) - break_pos[bp_len] = length( logical_line ) - 1 -} - - -function print_line( \ - c0, c1, i, junk, part_str ) -{ - c0 = 0 - - while( asorti( break_pos, junk ) > 1 ) - { - if ( ( c1 = shift_valid_bp( break_pos ) ) < 1 ) - { - part_str = substr( logical_line, c0 + 1 ) - printf( "%s\n", part_str ) - return - } - - part_str = substr( logical_line, c0 + 1, c1 - c0 + 1 ) - gsub( / $/, "\\", part_str ) - printf( "%s\n", part_str ) - c0 = c1 + 1 - } - - part_str = substr( logical_line, c0 + 1 ) - printf( "%s\n", part_str ) -} - - -function shrink_spaces( pos, \ - tail, removed_length, k ) -{ - tail = substr( logical_line, pos ) - sub( /^[ \t]+/, " ", tail ) - removed_length = length( logical_line ) - pos - length( tail ) + 1 - logical_line = substr( logical_line, 0, pos - 1 ) tail - - - for ( k = 0; k < asorti( break_pos, junk ); k++ ) - if ( ( pos + removed_length ) <= break_pos[k] ) - break_pos[k] = break_pos[k] - removed_length; - else if ( pos <= break_pos[k] ) - break_pos[k] = -1; - - return removed_length -} - - -function shrink_spaces_to_linebreak( pos, \ - junk, part_str, removed_length, i ) -{ - for ( i = 0; i < asorti( break_pos, junk ) && break_pos[i] < pos ; i++ ) - ; - - if ( break_pos[i] < 1 ) - return; - - part_str = substr( logical_line, pos, break_pos[i] - pos + 1 ) - sub( /^[ \t]+/, " ", part_str ) - removed_length = ( break_pos[i] - pos + 1 ) - length( part_str ) - - tail = substr( logical_line, pos + removed_length ) - logical_line = substr( logical_line, 0, pos - 1 ) tail - - for ( ; i < asorti( break_pos, junk ); i++ ) - break_pos[i] -= removed_length; - - return removed_length -} - - -function delete_linebreaks_in_2nd_token( \ - tail, paren_depth, junk, i, j, k, l ) -{ - if ( logical_line ~ /^[ \t]*#[ \t]*define[ \t]+[0-9A-Za-z_]+\(/ ) - { - tail = logical_line - sub( /^[ \t]*#[ \t]*define[ \t]+[0-9A-Za-z_]+/, "", tail ) - - paren_depth = 0 - l = 0 - i = length( logical_line ) - length( tail ) + 1 # seek to the 1st op paren - j = i - do { - if ( substr( logical_line, j, 2 ) ~ /[ \t][ \t]/ ) - l = shrink_spaces( j ); - else if ( substr( logical_line, j, 1 ) == "(" ) - paren_depth += 1; - else if ( substr( logical_line, j, 1 ) == ")" ) - paren_depth -= 1; - j += 1 - } while ( j < length( logical_line ) && paren_depth != 0 ) - - for ( k = 0; k < asorti( break_pos, junk ); k++ ) - if ( i <= break_pos[k] && break_pos[k] < j ) - break_pos[k] = -1; - - if ( l > 0 ) - shrink_spaces_to_linebreak( j ); - } -} - - -BEGIN{ - init_cpp_src_line() -} -{ - append_line( $0 ) - if ( $0 !~ /\\$/ ) - { - delete_linebreaks_in_2nd_token() - print_line() - init_cpp_src_line() - } -} -END{ - if ( 0 < length( logical_line ) ) - { - delete_linebreaks_in_2nd_token() - print_line() - } -} diff --git a/3party/freetype/builds/atari/gen-purec-patch.sh b/3party/freetype/builds/atari/gen-purec-patch.sh deleted file mode 100755 index 1ec050c11f..0000000000 --- a/3party/freetype/builds/atari/gen-purec-patch.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh - -TOP_DIR=. -OBJ_DIR=. - -for x in "$@" -do - case x"$x" in - x--srcdir=* | x--topdir=* ) - TOP_DIR=`echo $x | sed 's/^--[a-z]*dir=//'` - ;; - x--builddir=* | x--objdir=* ) - OBJ_DIR=`echo $x | sed 's/^--[a-z]*dir=//'` - ;; - esac -done - -mkdir -p ${OBJ_DIR}/builds/atari/tmp/orig - -( cd ${TOP_DIR} && find . -name '*.[CHch]' -type f | fgrep -v builds/atari/tmp | cpio -o ) | \ -( cd ${OBJ_DIR}/builds/atari/tmp/orig && cpio -idum ) -cp ${TOP_DIR}/builds/atari/deflinejoiner.awk ${OBJ_DIR}/builds/atari/tmp - -pushd ${OBJ_DIR}/builds/atari/tmp - - cp -pr orig purec - for f in `cd orig && find . -type f` - do - echo filter $f - env LANG=C awk -f deflinejoiner.awk < orig/$f > purec/$f - done - - echo '#define FT2_BUILD_LIBRARY' > purec/include/ft2build.h - echo '#include "ATARI.H"' >> purec/include/ft2build.h - env LANG=C awk -f deflinejoiner.awk < orig/include/ft2build.h >> purec/include/ft2build.h - - env LANG=C diff -ur orig purec > ../purec.diff - -popd -rm -rf ${OBJ_DIR}/builds/atari/tmp diff --git a/3party/freetype/builds/beos/beos-def.mk b/3party/freetype/builds/beos/beos-def.mk deleted file mode 100644 index 5ddedc0378..0000000000 --- a/3party/freetype/builds/beos/beos-def.mk +++ /dev/null @@ -1,76 +0,0 @@ -# -# FreeType 2 configuration rules for a BeOS system -# -# this is similar to the "ansi-def.mk" file, except for BUILD and PLATFORM -# - - -# Copyright 1996-2015 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. - - -DELETE := rm -f -CAT := cat -SEP := / -BUILD_DIR := $(TOP_DIR)/builds/beos -PLATFORM := beos - - -# The directory where all library files are placed. -# -# By default, this is the same as $(OBJ_DIR); however, this can be changed -# to suit particular needs. -# -LIB_DIR := $(OBJ_DIR) - - -# The name of the final library file. Note that the DOS-specific Makefile -# uses a shorter (8.3) name. -# -LIBRARY := lib$(PROJECT) - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := -I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := -D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := -l - - -# Target flag. -# -T := -o$(space) - - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -CFLAGS ?= -c - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -ANSIFLAGS := - - -# EOF diff --git a/3party/freetype/builds/beos/beos.mk b/3party/freetype/builds/beos/beos.mk deleted file mode 100644 index 6c7fca11c9..0000000000 --- a/3party/freetype/builds/beos/beos.mk +++ /dev/null @@ -1,19 +0,0 @@ -# -# FreeType 2 configuration rules for a BeOS system -# - -# Copyright 1996-2015 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 $(TOP_DIR)/builds/beos/beos-def.mk -include $(TOP_DIR)/builds/compiler/ansi-cc.mk -include $(TOP_DIR)/builds/link_std.mk - - -# EOF diff --git a/3party/freetype/builds/beos/detect.mk b/3party/freetype/builds/beos/detect.mk deleted file mode 100644 index b23f94ee7f..0000000000 --- a/3party/freetype/builds/beos/detect.mk +++ /dev/null @@ -1,41 +0,0 @@ -# -# FreeType 2 configuration file to detect an BeOS host platform. -# - - -# Copyright 1996-2015 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. - - -.PHONY: setup - - -ifeq ($(PLATFORM),ansi) - - ifdef BE_HOST_CPU - - PLATFORM := beos - - endif # test MACHTYPE beos -endif - -ifeq ($(PLATFORM),beos) - - DELETE := rm -f - CAT := cat - SEP := / - BUILD_DIR := $(TOP_DIR)/builds/beos - CONFIG_FILE := beos.mk - - setup: std_setup - -endif # test PLATFORM beos - - -# EOF diff --git a/3party/freetype/builds/cmake/iOS.cmake b/3party/freetype/builds/cmake/iOS.cmake deleted file mode 100644 index 7970f2b10a..0000000000 --- a/3party/freetype/builds/cmake/iOS.cmake +++ /dev/null @@ -1,275 +0,0 @@ -# iOS.cmake -# -# Copyright 2014-2015 by -# David Turner, Robert Wilhelm, and Werner Lemberg. -# -# Written by David Wimsey -# -# 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. -# -# -# This file is derived from the files `Platform/Darwin.cmake' and -# `Platform/UnixPaths.cmake', which are part of CMake 2.8.4. It has been -# altered for iOS development. - - -# Options -# ------- -# -# IOS_PLATFORM = OS | SIMULATOR -# -# This decides whether SDKS are selected from the `iPhoneOS.platform' or -# `iPhoneSimulator.platform' folders. -# -# OS - the default, used to build for iPhone and iPad physical devices, -# which have an ARM architecture. -# SIMULATOR - used to build for the Simulator platforms, which have an -# x86 architecture. -# -# CMAKE_IOS_DEVELOPER_ROOT = /path/to/platform/Developer folder -# -# By default, this location is automatically chosen based on the -# IOS_PLATFORM value above. If you manually set this variable, it -# overrides the default location and forces the use of a particular -# Developer Platform. -# -# CMAKE_IOS_SDK_ROOT = /path/to/platform/Developer/SDKs/SDK folder -# -# By default, this location is automatically chosen based on the -# CMAKE_IOS_DEVELOPER_ROOT value. In this case it is always the most -# up-to-date SDK found in the CMAKE_IOS_DEVELOPER_ROOT path. If you -# manually set this variable, it forces the use of a specific SDK -# version. -# -# -# Macros -# ------ -# -# set_xcode_property (TARGET XCODE_PROPERTY XCODE_VALUE) -# -# A convenience macro for setting Xcode specific properties on targets. -# -# Example: -# -# set_xcode_property(myioslib IPHONEOS_DEPLOYMENT_TARGET "3.1") -# -# find_host_package (PROGRAM ARGS) -# -# A macro to find executable programs on the host system, not within the -# iOS environment. Thanks to the `android-cmake' project for providing -# the command. - - -# standard settings -set(CMAKE_SYSTEM_NAME Darwin) -set(CMAKE_SYSTEM_VERSION 1) -set(UNIX True) -set(APPLE True) -set(IOS True) - -# required as of cmake 2.8.10 -set(CMAKE_OSX_DEPLOYMENT_TARGET "" - CACHE STRING "Force unset of the deployment target for iOS" FORCE -) - -# determine the cmake host system version so we know where to find the iOS -# SDKs -find_program(CMAKE_UNAME uname /bin /usr/bin /usr/local/bin) -if (CMAKE_UNAME) - exec_program(uname ARGS -r OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_VERSION) - string(REGEX REPLACE "^([0-9]+)\\.([0-9]+).*$" "\\1" - DARWIN_MAJOR_VERSION "${CMAKE_HOST_SYSTEM_VERSION}") -endif (CMAKE_UNAME) - -# force the compilers to gcc for iOS -include(CMakeForceCompiler) -CMAKE_FORCE_C_COMPILER(gcc gcc) -CMAKE_FORCE_CXX_COMPILER(g++ g++) - -# skip the platform compiler checks for cross compiling -set(CMAKE_CXX_COMPILER_WORKS TRUE) -set(CMAKE_C_COMPILER_WORKS TRUE) - -# all iOS/Darwin specific settings - some may be redundant -set(CMAKE_SHARED_LIBRARY_PREFIX "lib") -set(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib") -set(CMAKE_SHARED_MODULE_PREFIX "lib") -set(CMAKE_SHARED_MODULE_SUFFIX ".so") -set(CMAKE_MODULE_EXISTS 1) -set(CMAKE_DL_LIBS "") - -set(CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG - "-compatibility_version ") -set(CMAKE_C_OSX_CURRENT_VERSION_FLAG - "-current_version ") -set(CMAKE_CXX_OSX_COMPATIBILITY_VERSION_FLAG - "${CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG}") -set(CMAKE_CXX_OSX_CURRENT_VERSION_FLAG - "${CMAKE_C_OSX_CURRENT_VERSION_FLAG}") - -# hidden visibility is required for cxx on iOS -set(CMAKE_C_FLAGS_INIT "") -set(CMAKE_CXX_FLAGS_INIT - "-headerpad_max_install_names -fvisibility=hidden -fvisibility-inlines-hidden") - -set(CMAKE_C_LINK_FLAGS - "-Wl,-search_paths_first ${CMAKE_C_LINK_FLAGS}") -set(CMAKE_CXX_LINK_FLAGS - "-Wl,-search_paths_first ${CMAKE_CXX_LINK_FLAGS}") - -set(CMAKE_PLATFORM_HAS_INSTALLNAME 1) -set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS - "-dynamiclib -headerpad_max_install_names") -set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS - "-bundle -headerpad_max_install_names") -set(CMAKE_SHARED_MODULE_LOADER_C_FLAG - "-Wl,-bundle_loader,") -set(CMAKE_SHARED_MODULE_LOADER_CXX_FLAG - "-Wl,-bundle_loader,") -set(CMAKE_FIND_LIBRARY_SUFFIXES - ".dylib" ".so" ".a") - -# hack: If a new cmake (which uses CMAKE_INSTALL_NAME_TOOL) runs on an old -# build tree (where `install_name_tool' was hardcoded), and where -# CMAKE_INSTALL_NAME_TOOL isn't in the cache and still cmake didn't -# fail in `CMakeFindBinUtils.cmake' (because it isn't rerun), hardcode -# CMAKE_INSTALL_NAME_TOOL here to `install_name_tool' so it behaves as -# it did before. -if (NOT DEFINED CMAKE_INSTALL_NAME_TOOL) - find_program(CMAKE_INSTALL_NAME_TOOL install_name_tool) -endif (NOT DEFINED CMAKE_INSTALL_NAME_TOOL) - -# set up iOS platform unless specified manually with IOS_PLATFORM -if (NOT DEFINED IOS_PLATFORM) - set(IOS_PLATFORM "OS") -endif (NOT DEFINED IOS_PLATFORM) - -set(IOS_PLATFORM ${IOS_PLATFORM} CACHE STRING "Type of iOS Platform") - -# check the platform selection and setup for developer root -if (${IOS_PLATFORM} STREQUAL "OS") - set(IOS_PLATFORM_LOCATION "iPhoneOS.platform") - - # this causes the installers to properly locate the output libraries - set(CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphoneos") - -elseif (${IOS_PLATFORM} STREQUAL "SIMULATOR") - set(IOS_PLATFORM_LOCATION "iPhoneSimulator.platform") - - # this causes the installers to properly locate the output libraries - set(CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphonesimulator") - -else (${IOS_PLATFORM} STREQUAL "OS") - message(FATAL_ERROR - "Unsupported IOS_PLATFORM value selected. Please choose OS or SIMULATOR.") - -endif (${IOS_PLATFORM} STREQUAL "OS") - -# set up iOS developer location unless specified manually with -# CMAKE_IOS_DEVELOPER_ROOT -- -# note that Xcode 4.3 changed the installation location; choose the most -# recent one available -set(XCODE_POST_43_ROOT - "/Applications/Xcode.app/Contents/Developer/Platforms/${IOS_PLATFORM_LOCATION}/Developer") -set(XCODE_PRE_43_ROOT - "/Developer/Platforms/${IOS_PLATFORM_LOCATION}/Developer") - -if (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT) - if (EXISTS ${XCODE_POST_43_ROOT}) - set(CMAKE_IOS_DEVELOPER_ROOT ${XCODE_POST_43_ROOT}) - elseif (EXISTS ${XCODE_PRE_43_ROOT}) - set(CMAKE_IOS_DEVELOPER_ROOT ${XCODE_PRE_43_ROOT}) - endif (EXISTS ${XCODE_POST_43_ROOT}) -endif (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT) - -set(CMAKE_IOS_DEVELOPER_ROOT ${CMAKE_IOS_DEVELOPER_ROOT} - CACHE PATH "Location of iOS Platform" -) - -# find and use the most recent iOS SDK unless specified manually with -# CMAKE_IOS_SDK_ROOT -if (NOT DEFINED CMAKE_IOS_SDK_ROOT) - file(GLOB _CMAKE_IOS_SDKS "${CMAKE_IOS_DEVELOPER_ROOT}/SDKs/*") - if (_CMAKE_IOS_SDKS) - list(SORT _CMAKE_IOS_SDKS) - list(REVERSE _CMAKE_IOS_SDKS) - list(GET _CMAKE_IOS_SDKS 0 CMAKE_IOS_SDK_ROOT) - else (_CMAKE_IOS_SDKS) - message(FATAL_ERROR - "No iOS SDK's found in default search path ${CMAKE_IOS_DEVELOPER_ROOT}. Manually set CMAKE_IOS_SDK_ROOT or install the iOS SDK.") - endif (_CMAKE_IOS_SDKS) - - message(STATUS "Toolchain using default iOS SDK: ${CMAKE_IOS_SDK_ROOT}") -endif (NOT DEFINED CMAKE_IOS_SDK_ROOT) - -set(CMAKE_IOS_SDK_ROOT ${CMAKE_IOS_SDK_ROOT} - CACHE PATH "Location of the selected iOS SDK" -) - -# set the sysroot default to the most recent SDK -set(CMAKE_OSX_SYSROOT ${CMAKE_IOS_SDK_ROOT} - CACHE PATH "Sysroot used for iOS support" -) - -# set the architecture for iOS -- -# note that currently both ARCHS_STANDARD_32_BIT and -# ARCHS_UNIVERSAL_IPHONE_OS set armv7 only, so set both manually -if (${IOS_PLATFORM} STREQUAL "OS") - set(IOS_ARCH $(ARCHS_STANDARD_32_64_BIT)) -else (${IOS_PLATFORM} STREQUAL "OS") - set(IOS_ARCH i386) -endif (${IOS_PLATFORM} STREQUAL "OS") - -set(CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} - CACHE string "Build architecture for iOS" -) - -# set the find root to the iOS developer roots and to user defined paths -set(CMAKE_FIND_ROOT_PATH - ${CMAKE_IOS_DEVELOPER_ROOT} - ${CMAKE_IOS_SDK_ROOT} - ${CMAKE_PREFIX_PATH} - CACHE string "iOS find search path root" -) - -# default to searching for frameworks first -set(CMAKE_FIND_FRAMEWORK FIRST) - -# set up the default search directories for frameworks -set(CMAKE_SYSTEM_FRAMEWORK_PATH - ${CMAKE_IOS_SDK_ROOT}/System/Library/Frameworks - ${CMAKE_IOS_SDK_ROOT}/System/Library/PrivateFrameworks - ${CMAKE_IOS_SDK_ROOT}/Developer/Library/Frameworks -) - -# only search the iOS SDKs, not the remainder of the host filesystem -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - -# this little macro lets you set any Xcode specific property -macro(set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE) - set_property(TARGET ${TARGET} - PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY} ${XCODE_VALUE}) -endmacro(set_xcode_property) - -# this macro lets you find executable programs on the host system -macro(find_host_package) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) - set(IOS FALSE) - - find_package(${ARGN}) - - set(IOS TRUE) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -endmacro(find_host_package) - -# eof diff --git a/3party/freetype/builds/compiler/ansi-cc.mk b/3party/freetype/builds/compiler/ansi-cc.mk deleted file mode 100644 index c9f66088e1..0000000000 --- a/3party/freetype/builds/compiler/ansi-cc.mk +++ /dev/null @@ -1,80 +0,0 @@ -# -# FreeType 2 generic pseudo ANSI compiler -# - - -# Copyright 1996-2015 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. - - -# Compiler command line name -# -CC := cc -COMPILER_SEP := $(SEP) - - -# The object file extension (for standard and static libraries). This can be -# .o, .tco, .obj, etc., depending on the platform. -# -O := o -SO := o - -# The library file extension (for standard and static libraries). This can -# be .a, .lib, etc., depending on the platform. -# -A := a -SA := a - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := -I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := -D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := -l - - -# Target flag. -# -T := -o$(space) - - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -CFLAGS ?= -c - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -# we assume the compiler is already strictly ANSI -# -ANSIFLAGS := - - -# Library linking -# -CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) -LINK_LIBRARY = $(AR) -r $@ $(subst /,$(COMPILER_SEP),$(OBJECTS_LIST)) - - -# EOF diff --git a/3party/freetype/builds/compiler/bcc-dev.mk b/3party/freetype/builds/compiler/bcc-dev.mk deleted file mode 100644 index 8ab957e9ca..0000000000 --- a/3party/freetype/builds/compiler/bcc-dev.mk +++ /dev/null @@ -1,86 +0,0 @@ -# -# FreeType 2 Borland C++-specific with NO OPTIMIZATIONS + DEBUGGING -# - - -# Copyright 1996-2015 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. - - -# Compiler command line name -# -CC := bcc32 -COMPILER_SEP := $(SEP) - - -# The object file extension (for standard and static libraries). This can be -# .o, .tco, .obj, etc., depending on the platform. -# -O := obj -SO := obj - -# The library file extension (for standard and static libraries). This can -# be .a, .lib, etc., depending on the platform. -# -A := lib -SA := lib - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := -I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := -D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := - - -# Target flag -- no trailing space. -# -T := -o -TE := -e - - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -CFLAGS ?= -q -c -y -d -v -Od -w-par -w-ccc -w-rch -w-pro -w-aus - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -ANSIFLAGS := -A - - -# Library linking -# -CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) -LINK_LIBRARY = tlib /u /P128 $(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST:%=+%)) - - -# Borland C++ specific temporary files -# -CLEAN += \ - $(subst /,$(SEP),$(TOP_DIR)/apinames.$(O)) \ - $(subst /,$(SEP),$(OBJ_DIR)/apinames.tds) - - -# EOF diff --git a/3party/freetype/builds/compiler/bcc.mk b/3party/freetype/builds/compiler/bcc.mk deleted file mode 100644 index f38384064b..0000000000 --- a/3party/freetype/builds/compiler/bcc.mk +++ /dev/null @@ -1,86 +0,0 @@ -# -# FreeType 2 Borland C++-specific rules -# - - -# Copyright 1996-2015 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. - - -# Compiler command line name -# -CC := bcc32 -COMPILER_SEP := $(SEP) - - -# The object file extension (for standard and static libraries). This can be -# .o, .tco, .obj, etc., depending on the platform. -# -O := obj -SO := obj - -# The library file extension (for standard and static libraries). This can -# be .a, .lib, etc., depending on the platform. -# -A := lib -SA := lib - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := -I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := -D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := - - -# Target flag -- no trailing space. -# -T := -o -TE := -e - - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -CFLAGS ?= -c -q -y -d -v -Od -w-par -w-ccc -w-rch -w-pro -w-aus - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -ANSIFLAGS := -A - - -# Library linking -# -CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) -LINK_LIBRARY = tlib /u /P128 $(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST:%=+%)) - - -# Borland C++ specific temporary files -# -CLEAN += \ - $(subst /,$(SEP),$(TOP_DIR)/apinames.$(O)) \ - $(subst /,$(SEP),$(OBJ_DIR)/apinames.tds) - - -# EOF diff --git a/3party/freetype/builds/compiler/emx.mk b/3party/freetype/builds/compiler/emx.mk deleted file mode 100644 index 62fe35df70..0000000000 --- a/3party/freetype/builds/compiler/emx.mk +++ /dev/null @@ -1,77 +0,0 @@ -# -# FreeType 2 emx-specific definitions -# - - -# Copyright 2003-2015 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. - - -# Compiler command line name -# -CC := set GCCOPT="-ansi -pedantic"; gcc -COMPILER_SEP := / - - -# The object file extension (for standard and static libraries). This can be -# .o, .tco, .obj, etc., depending on the platform. -# -O := o -SO := o - -# The library file extension (for standard and static libraries). This can -# be .a, .lib, etc., depending on the platform. -# -A := a -SA := a - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := -I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := -D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := -l - - -# Target flag. -# -T := -o$(space) - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -CFLAGS ?= -c -g -O6 -Wall - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -ANSIFLAGS := - - -# Library linking -# -CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) -LINK_LIBRARY = $(foreach m,$(OBJECTS_LIST),$(AR) -r $@ $(m);) echo > nul - - -# EOF diff --git a/3party/freetype/builds/compiler/gcc-dev.mk b/3party/freetype/builds/compiler/gcc-dev.mk deleted file mode 100644 index fd789af9e9..0000000000 --- a/3party/freetype/builds/compiler/gcc-dev.mk +++ /dev/null @@ -1,95 +0,0 @@ -# -# FreeType 2 gcc-specific with NO OPTIMIZATIONS + DEBUGGING -# - - -# Copyright 1996-2015 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. - - -# Compiler command line name -# -CC := gcc -COMPILER_SEP := / - - -# The object file extension (for standard and static libraries). This can be -# .o, .tco, .obj, etc., depending on the platform. -# -O := o -SO := o - -# The library file extension (for standard and static libraries). This can -# be .a, .lib, etc., depending on the platform. -# -A := a -SA := a - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := -I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := -D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := -l - - -# Target flag. -# -T := -o$(space) - - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -ifndef CFLAGS - ifeq ($(findstring g++,$(CC)),) - nested_externs := -Wnested-externs - strict_prototypes := -Wstrict-prototypes - endif - - CFLAGS := -c -g -O0 \ - -Wall \ - -W \ - -Wundef \ - -Wshadow \ - -Wpointer-arith \ - -Wwrite-strings \ - -Wredundant-decls \ - -Wno-long-long \ - $(nested_externs) \ - $(strict_prototypes) -endif - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -ANSIFLAGS := -ansi -pedantic - - -# Library linking -# -CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) -LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST) - - -# EOF diff --git a/3party/freetype/builds/compiler/gcc.mk b/3party/freetype/builds/compiler/gcc.mk deleted file mode 100644 index 0970d1c55d..0000000000 --- a/3party/freetype/builds/compiler/gcc.mk +++ /dev/null @@ -1,77 +0,0 @@ -# -# FreeType 2 gcc-specific definitions -# - - -# Copyright 1996-2015 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. - - -# Compiler command line name -# -CC := gcc -COMPILER_SEP := / - - -# The object file extension (for standard and static libraries). This can be -# .o, .tco, .obj, etc., depending on the platform. -# -O := o -SO := o - -# The library file extension (for standard and static libraries). This can -# be .a, .lib, etc., depending on the platform. -# -A := a -SA := a - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := -I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := -D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := -l - - -# Target flag. -# -T := -o$(space) - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -CFLAGS ?= -c -g -O3 -Wall - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -ANSIFLAGS := -ansi -pedantic - - -# Library linking -# -CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) -LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST) - - -# EOF diff --git a/3party/freetype/builds/compiler/intelc.mk b/3party/freetype/builds/compiler/intelc.mk deleted file mode 100644 index 19e5962ead..0000000000 --- a/3party/freetype/builds/compiler/intelc.mk +++ /dev/null @@ -1,85 +0,0 @@ -# -# FreeType 2 Intel C/C++ definitions (VC++ compatibility mode) -# - - -# Copyright 1996-2015 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. - - -# compiler command line name -# -CC := icl -COMPILER_SEP := $(SEP) - - -# The object file extension (for standard and static libraries). This can be -# .o, .tco, .obj, etc., depending on the platform. -# -O := obj -SO := obj - - -# The library file extension (for standard and static libraries). This can -# be .a, .lib, etc., depending on the platform. -# -A := lib -SA := lib - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := /I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := /D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := /Fl - - -# Target flag. -# -T := /Fo -TE := /Fe - - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -# Note that the Intel C/C++ compiler version 4.5 complains about -# the use of FT_FIELD_OFFSET with "value must be arithmetic type"! -# This really looks like a bug in the compiler because the macro -# _does_ compute an arithmetic value, so we disable this warning -# with "/Qwd32". -# -CFLAGS ?= /nologo /c /Ox /G5 /W3 /Qwd32 - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -ANSIFLAGS := /Qansi_alias /Za - -# Library linking -# -#CLEAN_LIBRARY = -LINK_LIBRARY = lib /nologo /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST)) - - -# EOF diff --git a/3party/freetype/builds/compiler/unix-lcc.mk b/3party/freetype/builds/compiler/unix-lcc.mk deleted file mode 100644 index ebe3306543..0000000000 --- a/3party/freetype/builds/compiler/unix-lcc.mk +++ /dev/null @@ -1,83 +0,0 @@ -# -# FreeType 2 Unix LCC specific definitions -# - - -# Copyright 1996-2015 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. - - -# Command line name -# -CC := lcc -COMPILER_SEP := $(SEP) - - -# The object file extension (for standard and static libraries). This can be -# .o, .tco, .obj, etc., depending on the platform. -# -O := o -SO := o - - -# The library file extension (for standard and static libraries). This can -# be .a, .lib, etc., depending on the platform. -# -A := a -SA := a - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := -I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := -D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := -l - - -# Target flag. -# -T := -o$(space) - - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -CFLAGS ?= -c -g - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -# LCC is pure ANSI anyway! -# -# the "-A" flag simply increments verbosity about non ANSI code -# -ANSIFLAGS := -A - - -# library linking -# -CLEAN_LIBRARY ?= $(DELETE) $(PROJECT_LIBRARY) -LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST) - - -# EOF diff --git a/3party/freetype/builds/compiler/visualage.mk b/3party/freetype/builds/compiler/visualage.mk deleted file mode 100644 index db997faa32..0000000000 --- a/3party/freetype/builds/compiler/visualage.mk +++ /dev/null @@ -1,76 +0,0 @@ -# -# FreeType 2 Visual Age C++ specific definitions -# - - -# Copyright 1996-2015 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. - - -# command line compiler name -# -CC := icc -COMPILER_SEP := $(SEP) - - -# The object file extension (for standard and static libraries). This can be -# .o, .tco, .obj, etc., depending on the platform. -# -O := obj -SO := obj - - -# The library file extension (for standard and static libraries). This can -# be .a, .lib, etc., depending on the platform. -# -A := lib -SA := lib - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := /I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := /D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := /Fl - - -# Target flag. -# -T := /Fo - - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -CFLAGS ?= /Q- /Gd+ /O2 /G5 /W3 /C - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -ANSI_FLAGS := /Sa - - -# Library linking -# -#CLEAN_LIBRARY := -LINK_LIBRARY = lib /nologo /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST)) - - -# EOF diff --git a/3party/freetype/builds/compiler/visualc.mk b/3party/freetype/builds/compiler/visualc.mk deleted file mode 100644 index 900c8bea2b..0000000000 --- a/3party/freetype/builds/compiler/visualc.mk +++ /dev/null @@ -1,82 +0,0 @@ -# -# FreeType 2 Visual C++ definitions -# - - -# Copyright 1996-2015 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. - - -# compiler command line name -# -CC := cl -COMPILER_SEP := $(SEP) - - -# The object file extension (for standard and static libraries). This can be -# .o, .tco, .obj, etc., depending on the platform. -# -O := obj -SO := obj - - -# The library file extension (for standard and static libraries). This can -# be .a, .lib, etc., depending on the platform. -# -A := lib -SA := lib - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := /I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := /D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := /Fl - - -# Target flag. -# -T := /Fo - -# Target executable flag -# -TE := /Fe - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -CFLAGS ?= /nologo /c /Ox /W3 /WX - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -ANSIFLAGS := /Za /D_CRT_SECURE_NO_DEPRECATE - - -# Library linking -# -#CLEAN_LIBRARY = -LINK_LIBRARY = lib /nologo /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST)) - - -# EOF diff --git a/3party/freetype/builds/compiler/watcom.mk b/3party/freetype/builds/compiler/watcom.mk deleted file mode 100644 index f83425e2ba..0000000000 --- a/3party/freetype/builds/compiler/watcom.mk +++ /dev/null @@ -1,81 +0,0 @@ -# -# FreeType 2 Watcom-specific definitions -# - - -# Copyright 1996-2015 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. - - -# Compiler command line name -# -CC := wcc386 -COMPILER_SEP := $(SEP) - - -# The object file extension (for standard and static libraries). This can be -# .o, .tco, .obj, etc., depending on the platform. -# -O := obj -SO := obj - - -# The library file extension (for standard and static libraries). This can -# be .a, .lib, etc., depending on the platform. -# -A := lib -SA := lib - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := -I= - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := -D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := -l - - -# Target flag. -# -T := -FO= - - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -CFLAGS ?= -zq - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -ANSIFLAGS := -za - - -# Library linking -# -CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) -LINK_LIBRARY = $(subst /,$(COMPILER_SEP), \ - wlib -q -n $@; \ - $(foreach m, $(OBJECTS_LIST), wlib -q $@ +$(m);) \ - echo > nul) - -# EOF diff --git a/3party/freetype/builds/compiler/win-lcc.mk b/3party/freetype/builds/compiler/win-lcc.mk deleted file mode 100644 index 9e4f79df28..0000000000 --- a/3party/freetype/builds/compiler/win-lcc.mk +++ /dev/null @@ -1,81 +0,0 @@ -# -# FreeType 2 Win32-LCC specific definitions -# - - -# Copyright 1996-2015 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. - - -# Command line name -# -CC := lcc -COMPILER_SEP := $(SEP) - - -# The object file extension (for standard and static libraries). This can be -# .o, .tco, .obj, etc., depending on the platform. -# -O := obj -SO := obj - - -# The library file extension (for standard and static libraries). This can -# be .a, .lib, etc., depending on the platform. -# -A := lib -SA := lib - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := -I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := -D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := -Fl - - -# Target flag. -# -T := -Fo - - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -CFLAGS ?= -c -g2 -O - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -# LCC is pure ANSI anyway! -# -ANSIFLAGS := - - -# library linking -# -#CLEAN_LIBRARY := -LINK_LIBRARY = lcclib /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST)) - - -# EOF diff --git a/3party/freetype/builds/detect.mk b/3party/freetype/builds/detect.mk deleted file mode 100644 index 4b789d3ab7..0000000000 --- a/3party/freetype/builds/detect.mk +++ /dev/null @@ -1,154 +0,0 @@ -# -# FreeType 2 host platform detection rules -# - - -# Copyright 1996-2015 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. - - -# This sub-Makefile is in charge of detecting the current platform. It sets -# the following variables: -# -# BUILD_DIR The configuration and system-specific directory. Usually -# `builds/$(PLATFORM)' but can be different for custom builds -# of the library. -# -# The following variables must be defined in system specific `detect.mk' -# files: -# -# PLATFORM The detected platform. This will default to `ansi' if -# auto-detection fails. -# CONFIG_FILE The configuration sub-makefile to use. This usually depends -# on the compiler defined in the `CC' environment variable. -# DELETE The shell command used to remove a given file. -# COPY The shell command used to copy one file. -# SEP The platform-specific directory separator. -# COMPILER_SEP The separator used in arguments of the compilation tools. -# CC The compiler to use. -# -# You need to set the following variable(s) before calling it: -# -# TOP_DIR The top-most directory in the FreeType library source -# hierarchy. If not defined, it will default to `.'. - -# Set auto-detection default to `ansi' resp. UNIX-like operating systems. -# -PLATFORM := ansi -DELETE := $(RM) -COPY := cp -CAT := cat -SEP := / - -BUILD_CONFIG := $(TOP_DIR)/builds - -# These two assignments must be delayed. -BUILD_DIR = $(BUILD_CONFIG)/$(PLATFORM) -CONFIG_RULES = $(BUILD_DIR)/$(CONFIG_FILE) - -# We define the BACKSLASH variable to hold a single back-slash character. -# This is needed because a line like -# -# SEP := \ -# -# does not work with GNU Make (the backslash is interpreted as a line -# continuation). While a line like -# -# SEP := \\ -# -# really defines $(SEP) as `\' on Unix, and `\\' on Dos and Windows! -# -BACKSLASH := $(strip \ ) - -# Find all auto-detectable platforms. -# -PLATFORMS := $(notdir $(subst /detect.mk,,$(wildcard $(BUILD_CONFIG)/*/detect.mk))) -.PHONY: $(PLATFORMS) ansi - -# Filter out platform specified as setup target. -# -PLATFORM := $(firstword $(filter $(MAKECMDGOALS),$(PLATFORMS))) - -# If no setup target platform was specified, enable auto-detection/ -# default platform. -# -ifeq ($(PLATFORM),) - PLATFORM := ansi -endif - -# If the user has explicitly asked for `ansi' on the command line, -# disable auto-detection. -# -ifeq ($(findstring ansi,$(MAKECMDGOALS)),) - # Now, include all detection rule files found in the `builds/' - # directories. Note that the calling order of the various `detect.mk' - # files isn't predictable. - # - include $(wildcard $(BUILD_CONFIG)/*/detect.mk) -endif - -# In case no detection rule file was successful, use the default. -# -ifndef CONFIG_FILE - CONFIG_FILE := ansi.mk - setup: std_setup - .PHONY: setup -endif - -# The following targets are equivalent, with the exception that they use -# a slightly different syntax for the `echo' command. -# -# std_setup: defined for most (i.e. Unix-like) platforms -# dos_setup: defined for Dos-ish platforms like Dos, Windows & OS/2 -# -.PHONY: std_setup dos_setup - -std_setup: - @echo "" - @echo "$(PROJECT_TITLE) build system -- automatic system detection" - @echo "" - @echo "The following settings are used:" - @echo "" - @echo " platform $(PLATFORM)" - @echo " compiler $(CC)" - @echo " configuration directory $(BUILD_DIR)" - @echo " configuration rules $(CONFIG_RULES)" - @echo "" - @echo "If this does not correspond to your system or settings please remove the file" - @echo "\`$(CONFIG_MK)' from this directory then read the INSTALL file for help." - @echo "" - @echo "Otherwise, simply type \`$(MAKE)' again to build the library," - @echo "or \`$(MAKE) refdoc' to build the API reference (this needs python >= 2.6)." - @echo "" - @$(COPY) $(CONFIG_RULES) $(CONFIG_MK) - - -# Special case for Dos, Windows, OS/2, where echo "" doesn't work correctly! -# -dos_setup: - @type builds$(SEP)newline - @echo $(PROJECT_TITLE) build system -- automatic system detection - @type builds$(SEP)newline - @echo The following settings are used: - @type builds$(SEP)newline - @echo platform$(PLATFORM) - @echo compiler$(CC) - @echo configuration directory$(subst /,$(SEP),$(BUILD_DIR)) - @echo configuration rules$(subst /,$(SEP),$(CONFIG_RULES)) - @type builds$(SEP)newline - @echo If this does not correspond to your system or settings please remove the file - @echo '$(CONFIG_MK)' from this directory then read the INSTALL file for help. - @type builds$(SEP)newline - @echo Otherwise, simply type 'make' again to build the library. - @echo or 'make refdoc' to build the API reference (this needs python >= 2.6). - @type builds$(SEP)newline - @$(COPY) $(subst /,$(SEP),$(CONFIG_RULES) $(CONFIG_MK)) > nul - - -# EOF diff --git a/3party/freetype/builds/dos/detect.mk b/3party/freetype/builds/dos/detect.mk deleted file mode 100644 index e49ba98caf..0000000000 --- a/3party/freetype/builds/dos/detect.mk +++ /dev/null @@ -1,142 +0,0 @@ -# -# FreeType 2 configuration file to detect a DOS host platform. -# - - -# Copyright 1996-2015 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. - - -.PHONY: setup - - -ifeq ($(PLATFORM),ansi) - - # Test for DJGPP by checking the DJGPP environment variable, which must be - # set in order to use the system (ie. it will always be present when the - # `make' utility is run). - # - # We test for the COMSPEC environment variable, then run the `ver' - # command-line program to see if its output contains the word `Dos' or - # `DOS'. - # - # If this is true, we are running a Dos-ish platform (or an emulation). - # - ifdef DJGPP - PLATFORM := dos - else - ifdef COMSPEC - is_dos := $(findstring DOS,$(subst Dos,DOS,$(shell ver))) - - # We try to recognize a Dos session under OS/2. The `ver' command - # returns `Operating System/2 ...' there, so `is_dos' should be empty. - # - # To recognize a Dos session under OS/2, we check COMSPEC for the - # substring `MDOS\COMMAND' - # - ifeq ($(is_dos),) - is_dos := $(findstring MDOS\COMMAND,$(COMSPEC)) - endif - - # We also try to recognize Dos 7.x without Windows 9X launched. - # See builds/windows/detect.mk for explanations about the logic. - # - ifeq ($(is_dos),) - ifdef winbootdir -#ifneq ($(OS),Windows_NT) - # If windows is available, do not trigger this test. - ifndef windir - is_dos := $(findstring Windows,$(strip $(shell ver))) - endif -#endif - endif - endif - - endif # test COMSPEC - - ifneq ($(is_dos),) - - PLATFORM := dos - - endif # test Dos - endif # test DJGPP -endif # test PLATFORM ansi - -ifeq ($(PLATFORM),dos) - - # Use DJGPP (i.e. gcc) by default. - # - CONFIG_FILE := dos-gcc.mk - CC ?= gcc - - # additionally, we provide hooks for various other compilers - # - ifneq ($(findstring emx,$(MAKECMDGOALS)),) # EMX gcc - CONFIG_FILE := dos-emx.mk - CC := gcc - emx: setup - .PHONY: emx - endif - - ifneq ($(findstring turboc,$(MAKECMDGOALS)),) # Turbo C - CONFIG_FILE := dos-tcc.mk - CC := tcc - turboc: setup - .PHONY: turboc - endif - - ifneq ($(findstring watcom,$(MAKECMDGOALS)),) # Watcom C/C++ - CONFIG_FILE := dos-wat.mk - CC := wcc386 - watcom: setup - .PHONY: watcom - endif - - ifneq ($(findstring borlandc,$(MAKECMDGOALS)),) # Borland C/C++ 32-bit - CONFIG_FILE := dos-bcc.mk - CC := bcc32 - borlandc: setup - .PHONY: borlandc - endif - - ifneq ($(findstring borlandc16,$(MAKECMDGOALS)),) # Borland C/C++ 16-bit - CONFIG_FILE := dos-bcc.mk - CC := bcc - borlandc16: setup - .PHONY: borlandc16 - endif - - ifneq ($(findstring bash,$(SHELL)),) # check for bash - SEP := / - DELETE := rm - COPY := cp - CAT := cat - setup: std_setup - else - SEP := $(BACKSLASH) - DELETE := del - CAT := type - - # Setting COPY is a bit trickier. We can be running DJGPP on some - # Windows NT derivatives, like XP. See builds/windows/detect.mk for - # explanations why we need hacking here. - # - ifeq ($(OS),Windows_NT) - COPY := cmd.exe /c copy - else - COPY := copy - endif # test NT - - setup: dos_setup - endif - -endif # test PLATFORM dos - - -# EOF diff --git a/3party/freetype/builds/dos/dos-def.mk b/3party/freetype/builds/dos/dos-def.mk deleted file mode 100644 index ac0be5ebb3..0000000000 --- a/3party/freetype/builds/dos/dos-def.mk +++ /dev/null @@ -1,45 +0,0 @@ -# -# FreeType 2 DOS specific definitions -# - - -# Copyright 1996-2015 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. - - -DELETE := del -CAT := type -SEP := $(strip \ ) -BUILD_DIR := $(TOP_DIR)/builds/dos -PLATFORM := dos - - -# The executable file extension (for tools), *with* leading dot. -# -E := .exe - -# The directory where all library files are placed. -# -# By default, this is the same as $(OBJ_DIR); however, this can be changed -# to suit particular needs. -# -LIB_DIR := $(OBJ_DIR) - -# The name of the final library file. Note that the DOS-specific Makefile -# uses a shorter (8.3) name. -# -LIBRARY := $(PROJECT) - - -# The NO_OUTPUT macro is used to ignore the output of commands. -# -NO_OUTPUT = > nul - - -# EOF diff --git a/3party/freetype/builds/dos/dos-emx.mk b/3party/freetype/builds/dos/dos-emx.mk deleted file mode 100644 index c421674fb9..0000000000 --- a/3party/freetype/builds/dos/dos-emx.mk +++ /dev/null @@ -1,21 +0,0 @@ -# -# FreeType 2 configuration rules for the EMX gcc compiler -# - - -# Copyright 2003-2015 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 $(TOP_DIR)/builds/dos/dos-def.mk -include $(TOP_DIR)/builds/compiler/emx.mk -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/dos/dos-gcc.mk b/3party/freetype/builds/dos/dos-gcc.mk deleted file mode 100644 index 991fb64acc..0000000000 --- a/3party/freetype/builds/dos/dos-gcc.mk +++ /dev/null @@ -1,21 +0,0 @@ -# -# FreeType 2 configuration rules for the DJGPP compiler -# - - -# Copyright 1996-2015 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 $(TOP_DIR)/builds/dos/dos-def.mk -include $(TOP_DIR)/builds/compiler/gcc.mk -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/dos/dos-wat.mk b/3party/freetype/builds/dos/dos-wat.mk deleted file mode 100644 index 0c34a0d90e..0000000000 --- a/3party/freetype/builds/dos/dos-wat.mk +++ /dev/null @@ -1,20 +0,0 @@ -# -# FreeType 2 configuration rules for the Watcom C/C++ compiler -# - - -# Copyright 2003-2015 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 $(TOP_DIR)/builds/dos/dos-def.mk -include $(TOP_DIR)/builds/compiler/watcom.mk -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/exports.mk b/3party/freetype/builds/exports.mk deleted file mode 100644 index 687ced7baa..0000000000 --- a/3party/freetype/builds/exports.mk +++ /dev/null @@ -1,76 +0,0 @@ -# -# FreeType 2 exports sub-Makefile -# - - -# Copyright 2005-2015 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. - - -# DO NOT INVOKE THIS MAKEFILE DIRECTLY! IT IS MEANT TO BE INCLUDED BY -# OTHER MAKEFILES. - - -# This sub-Makefile is used to compute the list of exported symbols whenever -# the EXPORTS_LIST variable is defined by one of the platform or compiler -# specific build files. -# -# EXPORTS_LIST contains the name of the `list' file, for example a Windows -# .DEF file. -# -ifneq ($(EXPORTS_LIST),) - - # CCexe is the compiler used to compile the `apinames' tool program - # on the host machine. This isn't necessarily the same as the compiler - # which can be a cross-compiler for a different architecture, for example. - # - ifeq ($(CCexe),) - CCexe := $(CC) - endif - - # TE acts like T, but for executables instead of object files. - ifeq ($(TE),) - TE := $T - endif - - # The list of public headers we're going to parse. - PUBLIC_HEADERS := $(wildcard $(PUBLIC_DIR)/*.h) - - # The `apinames' source and executable. We use $E_BUILD as the host - # executable suffix, which *includes* the final dot. - # - # Note that $(APINAMES_OPTIONS) is empty, except for Windows compilers. - # - APINAMES_SRC := $(subst /,$(SEP),$(TOP_DIR)/src/tools/apinames.c) - APINAMES_EXE := $(subst /,$(SEP),$(OBJ_DIR)/apinames$(E_BUILD)) - - $(APINAMES_EXE): $(APINAMES_SRC) - $(CCexe) $(CCexe_CFLAGS) $(TE)$@ $< $(CCexe_LDFLAGS) - - .PHONY: symbols_list - - symbols_list: $(EXPORTS_LIST) - - # We manually add TT_New_Context and TT_RunIns, which are needed by TT - # debuggers, to the EXPORTS_LIST. - # - $(EXPORTS_LIST): $(APINAMES_EXE) $(PUBLIC_HEADERS) - $(subst /,$(SEP),$(APINAMES_EXE)) -o$@ $(APINAMES_OPTIONS) $(PUBLIC_HEADERS) - @echo TT_New_Context >> $(EXPORTS_LIST) - @echo TT_RunIns >> $(EXPORTS_LIST) - - $(PROJECT_LIBRARY): $(EXPORTS_LIST) - - CLEAN += $(EXPORTS_LIST) \ - $(APINAMES_EXE) - -endif - - -# EOF diff --git a/3party/freetype/builds/freetype.mk b/3party/freetype/builds/freetype.mk deleted file mode 100644 index 1cc7e29bc0..0000000000 --- a/3party/freetype/builds/freetype.mk +++ /dev/null @@ -1,339 +0,0 @@ -# -# FreeType 2 library sub-Makefile -# - - -# Copyright 1996-2015 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. - - -# DO NOT INVOKE THIS MAKEFILE DIRECTLY! IT IS MEANT TO BE INCLUDED BY -# OTHER MAKEFILES. - - -# The following variables (set by other Makefile components, in the -# environment, or on the command line) are used: -# -# BUILD_DIR The architecture dependent directory, -# e.g. `$(TOP_DIR)/builds/unix'. Added to INCLUDES also. -# -# OBJ_DIR The directory in which object files are created. -# -# LIB_DIR The directory in which the library is created. -# -# DOC_DIR The directory in which the API reference is created. -# -# INCLUDES A list of directories to be included additionally. -# -# DEVEL_DIR Development directory which is added to the INCLUDES -# variable before the standard include directories. -# -# CFLAGS Compilation flags. This overrides the default settings -# in the platform-specific configuration files. -# -# FTSYS_SRC If set, its value is used as the name of a replacement -# file for `src/base/ftsystem.c'. -# -# FTDEBUG_SRC If set, its value is used as the name of a replacement -# file for `src/base/ftdebug.c'. [For a normal build, this -# file does nothing.] -# -# FTMODULE_H The file which contains the list of module classes for -# the current build. Usually, this is automatically -# created by `modules.mk'. -# -# BASE_OBJ_S -# BASE_OBJ_M A list of base objects (for single object and multiple -# object builds, respectively). Set up in -# `src/base/rules.mk'. -# -# BASE_EXT_OBJ A list of base extension objects. Set up in -# `src/base/rules.mk'. -# -# DRV_OBJ_S -# DRV_OBJ_M A list of driver objects (for single object and multiple -# object builds, respectively). Set up cumulatively in -# `src//rules.mk'. -# -# CLEAN -# DISTCLEAN The sub-makefiles can append additional stuff to these two -# variables which is to be removed for the `clean' resp. -# `distclean' target. -# -# TOP_DIR, SEP, -# COMPILER_SEP, -# LIBRARY, CC, -# A, I, O, T Check `config.mk' for details. - - -# The targets `objects' and `library' are defined at the end of this -# Makefile after all other rules have been included. -# -.PHONY: single multi objects library refdoc - -# default target -- build single objects and library -# -single: objects library - -# `multi' target -- build multiple objects and library -# -multi: objects library - - -# The FreeType source directory, usually `./src'. -# -SRC_DIR := $(TOP_DIR)/src - -# The directory where the base layer components are placed, usually -# `./src/base'. -# -BASE_DIR := $(SRC_DIR)/base - -# Other derived directories. -# -PUBLIC_DIR := $(TOP_DIR)/include/freetype -INTERNAL_DIR := $(PUBLIC_DIR)/internal -SERVICES_DIR := $(INTERNAL_DIR)/services -CONFIG_DIR := $(PUBLIC_DIR)/config - -# The documentation directory. -# -DOC_DIR ?= $(TOP_DIR)/docs/reference - -# The final name of the library file. -# -PROJECT_LIBRARY := $(LIB_DIR)/$(LIBRARY).$A - - -# include paths -# -# IMPORTANT NOTE: The architecture-dependent directory must ALWAYS be placed -# before the standard include list. Porters are then able to -# put their own version of some of the FreeType components -# in the `builds/' directory, as these files will -# override the default sources. -# -INCLUDES := $(subst /,$(COMPILER_SEP),$(OBJ_DIR) \ - $(DEVEL_DIR) \ - $(BUILD_DIR) \ - $(TOP_DIR)/include) - -INCLUDE_FLAGS := $(INCLUDES:%=$I%) - -ifdef DEVEL_DIR - # We assume that all library dependencies for FreeType are fulfilled for a - # development build, so we directly access the necessary include directory - # information using `pkg-config'. - INCLUDE_FLAGS += $(shell pkg-config --cflags libpng \ - harfbuzz ) -endif - - -# C flags used for the compilation of an object file. This must include at -# least the paths for the `base' and `builds/' directories; -# debug/optimization/warning flags + ansi compliance if needed. -# -# $(INCLUDE_FLAGS) should come before $(CFLAGS) to avoid problems with -# old FreeType versions. -# -# Note what we also define the macro FT2_BUILD_LIBRARY when building -# FreeType. This is required to let our sources include the internal -# headers (something forbidden by clients). -# -# Finally, we define FT_CONFIG_MODULES_H so that the compiler uses the -# generated version of `ftmodule.h' in $(OBJ_DIR). If there is an -# `ftoption.h' files in $(OBJ_DIR), define FT_CONFIG_OPTIONS_H too. -# -ifneq ($(wildcard $(OBJ_DIR)/ftoption.h),) - FTOPTION_H := $(OBJ_DIR)/ftoption.h - FTOPTION_FLAG := $DFT_CONFIG_OPTIONS_H="" -endif - -# `CPPFLAGS' might be specified by the user in the environment. -# -FT_CFLAGS = $(CPPFLAGS) \ - $(CFLAGS) \ - $DFT2_BUILD_LIBRARY \ - $DFT_CONFIG_MODULES_H="" \ - $(FTOPTION_FLAG) - - -# Include the `exports' rules file. -# -include $(TOP_DIR)/builds/exports.mk - - -# Initialize the list of objects. -# -OBJECTS_LIST := - - -# Define $(PUBLIC_H) as the list of all public header files located in -# `$(TOP_DIR)/include/freetype'. $(INTERNAL_H), and $(CONFIG_H) are defined -# similarly. -# -# This is used to simplify the dependency rules -- if one of these files -# changes, the whole library is recompiled. -# -PUBLIC_H := $(wildcard $(PUBLIC_DIR)/*.h) -INTERNAL_H := $(wildcard $(INTERNAL_DIR)/*.h) \ - $(wildcard $(SERVICES_DIR)/*.h) -CONFIG_H := $(wildcard $(CONFIG_DIR)/*.h) \ - $(wildcard $(BUILD_DIR)/config/*.h) \ - $(FTMODULE_H) \ - $(FTOPTION_H) -DEVEL_H := $(wildcard $(TOP_DIR)/devel/*.h) - -FREETYPE_H := $(PUBLIC_H) $(INTERNAL_H) $(CONFIG_H) $(DEVEL_H) - - -FT_COMPILE := $(CC) $(ANSIFLAGS) $(INCLUDE_FLAGS) $(FT_CFLAGS) - -# ftsystem component -# -FTSYS_SRC ?= $(BASE_DIR)/ftsystem.c - -FTSYS_OBJ := $(OBJ_DIR)/ftsystem.$O - -OBJECTS_LIST += $(FTSYS_OBJ) - -$(FTSYS_OBJ): $(FTSYS_SRC) $(FREETYPE_H) - $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# ftdebug component -# -FTDEBUG_SRC ?= $(BASE_DIR)/ftdebug.c - -FTDEBUG_OBJ := $(OBJ_DIR)/ftdebug.$O - -OBJECTS_LIST += $(FTDEBUG_OBJ) - -$(FTDEBUG_OBJ): $(FTDEBUG_SRC) $(FREETYPE_H) - $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# Include all rule files from FreeType components. -# -include $(SRC_DIR)/base/rules.mk -include $(patsubst %,$(SRC_DIR)/%/rules.mk,$(MODULES)) - - -# ftinit component -# -# The C source `ftinit.c' contains the FreeType initialization routines. -# It is able to automatically register one or more drivers when the API -# function FT_Init_FreeType() is called. -# -# The set of initial drivers is determined by the driver Makefiles -# includes above. Each driver Makefile updates the FTINIT_xxx lists -# which contain additional include paths and macros used to compile the -# single `ftinit.c' source. -# -FTINIT_SRC := $(BASE_DIR)/ftinit.c -FTINIT_OBJ := $(OBJ_DIR)/ftinit.$O - -OBJECTS_LIST += $(FTINIT_OBJ) - -$(FTINIT_OBJ): $(FTINIT_SRC) $(FREETYPE_H) - $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# All FreeType library objects. -# -OBJ_M := $(BASE_OBJ_M) $(BASE_EXT_OBJ) $(DRV_OBJS_M) -OBJ_S := $(BASE_OBJ_S) $(BASE_EXT_OBJ) $(DRV_OBJS_S) - - -# The target `multi' on the Make command line indicates that we want to -# compile each source file independently. -# -# Otherwise, each module/driver is compiled in a single object file through -# source file inclusion (see `src/base/ftbase.c' or -# `src/truetype/truetype.c' for examples). -# -BASE_OBJECTS := $(OBJECTS_LIST) - -ifneq ($(findstring multi,$(MAKECMDGOALS)),) - OBJECTS_LIST += $(OBJ_M) -else - OBJECTS_LIST += $(OBJ_S) -endif - -objects: $(OBJECTS_LIST) - -library: $(PROJECT_LIBRARY) - - -# Option `-B' disables generation of .pyc files (available since python 2.6) -# -refdoc: - python -B $(SRC_DIR)/tools/docmaker/docmaker.py \ - --prefix=ft2 \ - --title=FreeType-$(version) \ - --output=$(DOC_DIR) \ - $(PUBLIC_DIR)/*.h \ - $(PUBLIC_DIR)/config/*.h \ - $(PUBLIC_DIR)/cache/*.h - - -.PHONY: clean_project_std distclean_project_std - -# Standard cleaning and distclean rules. These are not accepted -# on all systems though. -# -clean_project_std: - -$(DELETE) $(BASE_OBJECTS) $(OBJ_M) $(OBJ_S) $(CLEAN) - -distclean_project_std: clean_project_std - -$(DELETE) $(PROJECT_LIBRARY) - -$(DELETE) *.orig *~ core *.core $(DISTCLEAN) - - -.PHONY: clean_project_dos distclean_project_dos - -# The Dos command shell does not support very long list of arguments, so -# we are stuck with wildcards. -# -# Don't break the command lines with \; this prevents the "del" command from -# working correctly on Win9x. -# -clean_project_dos: - -$(DELETE) $(subst /,$(SEP),$(OBJ_DIR)/*.$O $(CLEAN) $(NO_OUTPUT)) - -distclean_project_dos: clean_project_dos - -$(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY) $(DISTCLEAN) $(NO_OUTPUT)) - - -.PHONY: remove_config_mk remove_ftmodule_h - -# Remove configuration file (used for distclean). -# -remove_config_mk: - -$(DELETE) $(subst /,$(SEP),$(CONFIG_MK) $(NO_OUTPUT)) - -# Remove module list (used for distclean). -# -remove_ftmodule_h: - -$(DELETE) $(subst /,$(SEP),$(FTMODULE_H) $(NO_OUTPUT)) - - -.PHONY: clean distclean - -# The `config.mk' file must define `clean_freetype' and -# `distclean_freetype'. Implementations may use to relay these to either -# the `std' or `dos' versions from above, or simply provide their own -# implementation. -# -clean: clean_project -distclean: distclean_project remove_config_mk remove_ftmodule_h - -$(DELETE) $(subst /,$(SEP),$(DOC_DIR)/*.html $(NO_OUTPUT)) - - -# EOF diff --git a/3party/freetype/builds/link_dos.mk b/3party/freetype/builds/link_dos.mk deleted file mode 100644 index 694845b9e0..0000000000 --- a/3party/freetype/builds/link_dos.mk +++ /dev/null @@ -1,42 +0,0 @@ -# -# Link instructions for Dos-like systems (Dos, Win32, OS/2) -# - - -# Copyright 1996-2015 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. - - -ifdef BUILD_PROJECT - - .PHONY: clean_project distclean_project - - # Now include the main sub-makefile. It contains all the rules used to - # build the library with the previous variables defined. - # - include $(TOP_DIR)/builds/$(PROJECT).mk - - # The cleanup targets. - # - clean_project: clean_project_dos - distclean_project: distclean_project_dos - - # This final rule is used to link all object files into a single library. - # this is compiler-specific - # - $(PROJECT_LIBRARY): $(OBJECTS_LIST) - ifdef CLEAN_LIBRARY - -$(CLEAN_LIBRARY) $(NO_OUTPUT) - endif - $(LINK_LIBRARY) - -endif - - -# EOF diff --git a/3party/freetype/builds/link_std.mk b/3party/freetype/builds/link_std.mk deleted file mode 100644 index 886b2e6b31..0000000000 --- a/3party/freetype/builds/link_std.mk +++ /dev/null @@ -1,42 +0,0 @@ -# -# Link instructions for standard systems -# - - -# Copyright 1996-2015 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. - - -ifdef BUILD_PROJECT - - .PHONY: clean_project distclean_project - - # Now include the main sub-makefile. It contains all the rules used to - # build the library with the previous variables defined. - # - include $(TOP_DIR)/builds/$(PROJECT).mk - - # The cleanup targets. - # - clean_project: clean_project_std - distclean_project: distclean_project_std - - # This final rule is used to link all object files into a single library. - # this is compiler-specific - # - $(PROJECT_LIBRARY): $(OBJECTS_LIST) - ifdef CLEAN_LIBRARY - -$(CLEAN_LIBRARY) $(NO_OUTPUT) - endif - $(LINK_LIBRARY) - -endif - - -# EOF diff --git a/3party/freetype/builds/mac/FreeType.m68k_cfm.make.txt b/3party/freetype/builds/mac/FreeType.m68k_cfm.make.txt deleted file mode 100644 index c0a55f510d..0000000000 --- a/3party/freetype/builds/mac/FreeType.m68k_cfm.make.txt +++ /dev/null @@ -1,212 +0,0 @@ -# File: FreeType.m68k_cfm.make -# Target: FreeType.m68k_cfm -# Created: Thursday, October 27, 2005 09:23:25 PM - - -MAKEFILE = FreeType.m68k_cfm.make -\xA5MondoBuild\xA5 = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified - -ObjDir = :objs: -Includes = \xB6 - -ansi strict \xB6 - -includes unix \xB6 - -i :include: \xB6 - -i :src: \xB6 - -i :include:freetype:config: - -Sym-68K = -sym off - -COptions = \xB6 - -d FT_MACINTOSH=1 \xB6 - -d HAVE_FSSPEC=1 \xB6 - -d HAVE_FSREF=0 \xB6 - -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6 - -d HAVE_QUICKDRAW_CARBON=0 \xB6 - -d HAVE_ATS=0 \xB6 - -d FT2_BUILD_LIBRARY \xB6 - -d FT_CONFIG_CONFIG_H="" \xB6 - -d FT_CONFIG_MODULES_H="" \xB6 - {Includes} {Sym-68K} -model cfmseg - - -### Source Files ### - -SrcFiles = \xB6 - :src:autofit:autofit.c \xB6 - :builds:mac:ftbase.c \xB6 - :src:base:ftbbox.c \xB6 - :src:base:ftbdf.c \xB6 - :src:base:ftbitmap.c \xB6 - :src:base:ftdebug.c \xB6 - :src:base:ftfntfmt.c \xB6 - :src:base:ftfstype.c \xB6 - :src:base:ftglyph.c \xB6 - :src:base:ftgxval.c \xB6 - :src:base:ftinit.c \xB6 - :src:base:ftmm.c \xB6 - :src:base:ftotval.c \xB6 - :src:base:ftpfr.c \xB6 - :src:base:ftstroke.c \xB6 - :src:base:ftsynth.c \xB6 - :src:base:ftsystem.c \xB6 - :src:base:fttype1.c \xB6 - :src:base:ftwinfnt.c \xB6 - :src:cache:ftcache.c \xB6 - :src:bdf:bdf.c \xB6 - :src:cff:cff.c \xB6 - :src:cid:type1cid.c \xB6 -# :src:gxvalid:gxvalid.c \xB6 - :src:gzip:ftgzip.c \xB6 - :src:bzip2:ftbzip2.c \xB6 - :src:lzw:ftlzw.c \xB6 - :src:otvalid:otvalid.c \xB6 - :src:pcf:pcf.c \xB6 - :src:pfr:pfr.c \xB6 - :src:psaux:psaux.c \xB6 - :src:pshinter:pshinter.c \xB6 - :src:psnames:psmodule.c \xB6 - :src:raster:raster.c \xB6 - :src:sfnt:sfnt.c \xB6 - :src:smooth:smooth.c \xB6 - :src:truetype:truetype.c \xB6 - :src:type1:type1.c \xB6 - :src:type42:type42.c \xB6 - :src:winfonts:winfnt.c - - -### Object Files ### - -ObjFiles-68K = \xB6 - "{ObjDir}autofit.c.o" \xB6 - "{ObjDir}ftbase.c.o" \xB6 - "{ObjDir}ftbbox.c.o" \xB6 - "{ObjDir}ftbdf.c.o" \xB6 - "{ObjDir}ftbitmap.c.o" \xB6 - "{ObjDir}ftdebug.c.o" \xB6 - "{ObjDir}ftfntfmt.c.o" \xB6 - "{ObjDir}ftfstype.c.o" \xB6 - "{ObjDir}ftglyph.c.o" \xB6 - "{ObjDir}ftgxval.c.o" \xB6 - "{ObjDir}ftinit.c.o" \xB6 - "{ObjDir}ftmm.c.o" \xB6 - "{ObjDir}ftotval.c.o" \xB6 - "{ObjDir}ftpfr.c.o" \xB6 - "{ObjDir}ftstroke.c.o" \xB6 - "{ObjDir}ftsynth.c.o" \xB6 - "{ObjDir}ftsystem.c.o" \xB6 - "{ObjDir}fttype1.c.o" \xB6 - "{ObjDir}ftwinfnt.c.o" \xB6 - "{ObjDir}ftcache.c.o" \xB6 - "{ObjDir}bdf.c.o" \xB6 - "{ObjDir}cff.c.o" \xB6 - "{ObjDir}type1cid.c.o" \xB6 -# "{ObjDir}gxvalid.c.o" \xB6 - "{ObjDir}ftgzip.c.o" \xB6 - "{ObjDir}ftbzip2.c.o" \xB6 - "{ObjDir}ftlzw.c.o" \xB6 - "{ObjDir}otvalid.c.o" \xB6 - "{ObjDir}pcf.c.o" \xB6 - "{ObjDir}pfr.c.o" \xB6 - "{ObjDir}psaux.c.o" \xB6 - "{ObjDir}pshinter.c.o" \xB6 - "{ObjDir}psmodule.c.o" \xB6 - "{ObjDir}raster.c.o" \xB6 - "{ObjDir}sfnt.c.o" \xB6 - "{ObjDir}smooth.c.o" \xB6 - "{ObjDir}truetype.c.o" \xB6 - "{ObjDir}type1.c.o" \xB6 - "{ObjDir}type42.c.o" \xB6 - "{ObjDir}winfnt.c.o" - - -### Libraries ### - -LibFiles-68K = - - -### Default Rules ### - -.c.o \xC4 .c {\xA5MondoBuild\xA5} - {C} {depDir}{default}.c -o {targDir}{default}.c.o {COptions} - - -### Build Rules ### - -:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c - Duplicate :src:base:ftbase.c :builds:mac:ftbase.c - -"{ObjDir}ftbase.c.o" \xC4\xC4 :builds:mac:ftbase.c - {C} :builds:mac:ftbase.c -o "{ObjDir}ftbase.c.o" \xB6 - -i :builds:mac: \xB6 - -i :src:base: \xB6 - {COptions} - -FreeType.m68k_cfm \xC4\xC4 FreeType.m68k_cfm.o - -FreeType.m68k_cfm.o \xC4\xC4 {ObjFiles-68K} {LibFiles-68K} {\xA5MondoBuild\xA5} - Lib \xB6 - -o {Targ} \xB6 - {ObjFiles-68K} \xB6 - {LibFiles-68K} \xB6 - {Sym-68K} \xB6 - -mf -d - - - -### Required Dependencies ### - -"{ObjDir}autofit.c.o" \xC4 :src:autofit:autofit.c -# "{ObjDir}ftbase.c.o" \xC4 :src:base:ftbase.c -"{ObjDir}ftbbox.c.o" \xC4 :src:base:ftbbox.c -"{ObjDir}ftbdf.c.o" \xC4 :src:base:ftbdf.c -"{ObjDir}ftbitmap.c.o" \xC4 :src:base:ftbitmap.c -"{ObjDir}ftdebug.c.o" \xC4 :src:base:ftdebug.c -"{ObjDir}ftfntfmt.c.o" \xC4 :src:base:ftfntfmt.c -"{ObjDir}ftfstype.c.o" \xC4 :src:base:ftfstype.c -"{ObjDir}ftglyph.c.o" \xC4 :src:base:ftglyph.c -"{ObjDir}ftgxval.c.o" \xC4 :src:base:ftgxval.c -"{ObjDir}ftinit.c.o" \xC4 :src:base:ftinit.c -"{ObjDir}ftmm.c.o" \xC4 :src:base:ftmm.c -"{ObjDir}ftotval.c.o" \xC4 :src:base:ftotval.c -"{ObjDir}ftpfr.c.o" \xC4 :src:base:ftpfr.c -"{ObjDir}ftstroke.c.o" \xC4 :src:base:ftstroke.c -"{ObjDir}ftsynth.c.o" \xC4 :src:base:ftsynth.c -"{ObjDir}ftsystem.c.o" \xC4 :src:base:ftsystem.c -"{ObjDir}fttype1.c.o" \xC4 :src:base:fttype1.c -"{ObjDir}ftwinfnt.c.o" \xC4 :src:base:ftwinfnt.c -"{ObjDir}ftcache.c.o" \xC4 :src:cache:ftcache.c -"{ObjDir}bdf.c.o" \xC4 :src:bdf:bdf.c -"{ObjDir}cff.c.o" \xC4 :src:cff:cff.c -"{ObjDir}type1cid.c.o" \xC4 :src:cid:type1cid.c -# "{ObjDir}gxvalid.c.o" \xC4 :src:gxvalid:gxvalid.c -"{ObjDir}ftgzip.c.o" \xC4 :src:gzip:ftgzip.c -"{ObjDir}ftbzip2.c.o" \xC4 :src:bzip2:ftbzip2.c -"{ObjDir}ftlzw.c.o" \xC4 :src:lzw:ftlzw.c -"{ObjDir}otvalid.c.o" \xC4 :src:otvalid:otvalid.c -"{ObjDir}pcf.c.o" \xC4 :src:pcf:pcf.c -"{ObjDir}pfr.c.o" \xC4 :src:pfr:pfr.c -"{ObjDir}psaux.c.o" \xC4 :src:psaux:psaux.c -"{ObjDir}pshinter.c.o" \xC4 :src:pshinter:pshinter.c -"{ObjDir}psmodule.c.o" \xC4 :src:psnames:psmodule.c -"{ObjDir}raster.c.o" \xC4 :src:raster:raster.c -"{ObjDir}sfnt.c.o" \xC4 :src:sfnt:sfnt.c -"{ObjDir}smooth.c.o" \xC4 :src:smooth:smooth.c -"{ObjDir}truetype.c.o" \xC4 :src:truetype:truetype.c -"{ObjDir}type1.c.o" \xC4 :src:type1:type1.c -"{ObjDir}type42.c.o" \xC4 :src:type42:type42.c -"{ObjDir}winfnt.c.o" \xC4 :src:winfonts:winfnt.c - - -### Optional Dependencies ### -### Build this target to generate "include file" dependencies. ### - -Dependencies \xC4 $OutOfDate - MakeDepend \xB6 - -append {MAKEFILE} \xB6 - -ignore "{CIncludes}" \xB6 - -objdir "{ObjDir}" \xB6 - -objext .o \xB6 - {Includes} \xB6 - {SrcFiles} - - diff --git a/3party/freetype/builds/mac/FreeType.m68k_far.make.txt b/3party/freetype/builds/mac/FreeType.m68k_far.make.txt deleted file mode 100644 index e9b7f6f5f0..0000000000 --- a/3party/freetype/builds/mac/FreeType.m68k_far.make.txt +++ /dev/null @@ -1,211 +0,0 @@ -# File: FreeType.m68k_far.make -# Target: FreeType.m68k_far -# Created: Tuesday, October 25, 2005 03:34:05 PM - - -MAKEFILE = FreeType.m68k_far.make -\xA5MondoBuild\xA5 = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified - -ObjDir = :objs: -Includes = \xB6 - -includes unix \xB6 - -i :include: \xB6 - -i :src: \xB6 - -i :include:freetype:config: - -Sym-68K = -sym off - -COptions = \xB6 - -d FT_MACINTOSH=1 \xB6 - -d HAVE_FSSPEC=1 \xB6 - -d HAVE_FSREF=0 \xB6 - -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6 - -d HAVE_QUICKDRAW_CARBON=0 \xB6 - -d HAVE_ATS=0 \xB6 - -d FT2_BUILD_LIBRARY \xB6 - -d FT_CONFIG_CONFIG_H="" \xB6 - -d FT_CONFIG_MODULES_H="" \xB6 - {Includes} {Sym-68K} -model far - - -### Source Files ### - -SrcFiles = \xB6 - :src:autofit:autofit.c \xB6 - :builds:mac:ftbase.c \xB6 - :src:base:ftbbox.c \xB6 - :src:base:ftbdf.c \xB6 - :src:base:ftbitmap.c \xB6 - :src:base:ftdebug.c \xB6 - :src:base:ftfntfmt.c \xB6 - :src:base:ftfstype.c \xB6 - :src:base:ftglyph.c \xB6 - :src:base:ftgxval.c \xB6 - :src:base:ftinit.c \xB6 - :src:base:ftmm.c \xB6 - :src:base:ftotval.c \xB6 - :src:base:ftpfr.c \xB6 - :src:base:ftstroke.c \xB6 - :src:base:ftsynth.c \xB6 - :src:base:ftsystem.c \xB6 - :src:base:fttype1.c \xB6 - :src:base:ftwinfnt.c \xB6 - :src:cache:ftcache.c \xB6 - :src:bdf:bdf.c \xB6 - :src:cff:cff.c \xB6 - :src:cid:type1cid.c \xB6 - :src:gxvalid:gxvalid.c \xB6 - :src:gzip:ftgzip.c \xB6 - :src:bzip2:ftbzip2.c \xB6 - :src:lzw:ftlzw.c \xB6 - :src:otvalid:otvalid.c \xB6 - :src:pcf:pcf.c \xB6 - :src:pfr:pfr.c \xB6 - :src:psaux:psaux.c \xB6 - :src:pshinter:pshinter.c \xB6 - :src:psnames:psmodule.c \xB6 - :src:raster:raster.c \xB6 - :src:sfnt:sfnt.c \xB6 - :src:smooth:smooth.c \xB6 - :src:truetype:truetype.c \xB6 - :src:type1:type1.c \xB6 - :src:type42:type42.c \xB6 - :src:winfonts:winfnt.c - - -### Object Files ### - -ObjFiles-68K = \xB6 - "{ObjDir}autofit.c.o" \xB6 - "{ObjDir}ftbase.c.o" \xB6 - "{ObjDir}ftbbox.c.o" \xB6 - "{ObjDir}ftbdf.c.o" \xB6 - "{ObjDir}ftbitmap.c.o" \xB6 - "{ObjDir}ftdebug.c.o" \xB6 - "{ObjDir}ftfntfmt.c.o" \xB6 - "{ObjDir}ftfstype.c.o" \xB6 - "{ObjDir}ftglyph.c.o" \xB6 - "{ObjDir}ftgxval.c.o" \xB6 - "{ObjDir}ftinit.c.o" \xB6 - "{ObjDir}ftmm.c.o" \xB6 - "{ObjDir}ftotval.c.o" \xB6 - "{ObjDir}ftpfr.c.o" \xB6 - "{ObjDir}ftstroke.c.o" \xB6 - "{ObjDir}ftsynth.c.o" \xB6 - "{ObjDir}ftsystem.c.o" \xB6 - "{ObjDir}fttype1.c.o" \xB6 - "{ObjDir}ftwinfnt.c.o" \xB6 - "{ObjDir}ftcache.c.o" \xB6 - "{ObjDir}bdf.c.o" \xB6 - "{ObjDir}cff.c.o" \xB6 - "{ObjDir}type1cid.c.o" \xB6 - "{ObjDir}gxvalid.c.o" \xB6 - "{ObjDir}ftgzip.c.o" \xB6 - "{ObjDir}ftbzip2.c.o" \xB6 - "{ObjDir}ftlzw.c.o" \xB6 - "{ObjDir}otvalid.c.o" \xB6 - "{ObjDir}pcf.c.o" \xB6 - "{ObjDir}pfr.c.o" \xB6 - "{ObjDir}psaux.c.o" \xB6 - "{ObjDir}pshinter.c.o" \xB6 - "{ObjDir}psmodule.c.o" \xB6 - "{ObjDir}raster.c.o" \xB6 - "{ObjDir}sfnt.c.o" \xB6 - "{ObjDir}smooth.c.o" \xB6 - "{ObjDir}truetype.c.o" \xB6 - "{ObjDir}type1.c.o" \xB6 - "{ObjDir}type42.c.o" \xB6 - "{ObjDir}winfnt.c.o" - - -### Libraries ### - -LibFiles-68K = - - -### Default Rules ### - -.c.o \xC4 .c {\xA5MondoBuild\xA5} - {C} {depDir}{default}.c -o {targDir}{default}.c.o {COptions} \xB6 - -ansi strict - -### Build Rules ### - -:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c - Duplicate :src:base:ftbase.c :builds:mac:ftbase.c - -"{ObjDir}ftbase.c.o" \xC4\xC4 :builds:mac:ftbase.c - {C} :builds:mac:ftbase.c -o "{ObjDir}ftbase.c.o" \xB6 - -i :builds:mac: \xB6 - -i :src:base: \xB6 - {COptions} - -FreeType.m68k_far \xC4\xC4 FreeType.m68k_far.o - -FreeType.m68k_far.o \xC4\xC4 {ObjFiles-68K} {LibFiles-68K} {\xA5MondoBuild\xA5} - Lib \xB6 - -o {Targ} \xB6 - {ObjFiles-68K} \xB6 - {LibFiles-68K} \xB6 - {Sym-68K} \xB6 - -mf -d - - - -### Required Dependencies ### - -"{ObjDir}autofit.c.o" \xC4 :src:autofit:autofit.c -# "{ObjDir}ftbase.c.o" \xC4 :src:base:ftbase.c -"{ObjDir}ftbbox.c.o" \xC4 :src:base:ftbbox.c -"{ObjDir}ftbdf.c.o" \xC4 :src:base:ftbdf.c -"{ObjDir}ftbitmap.c.o" \xC4 :src:base:ftbitmap.c -"{ObjDir}ftdebug.c.o" \xC4 :src:base:ftdebug.c -"{ObjDir}ftfntfmt.c.o" \xC4 :src:base:ftfntfmt.c -"{ObjDir}ftfstype.c.o" \xC4 :src:base:ftfstype.c -"{ObjDir}ftglyph.c.o" \xC4 :src:base:ftglyph.c -"{ObjDir}ftgxval.c.o" \xC4 :src:base:ftgxval.c -"{ObjDir}ftinit.c.o" \xC4 :src:base:ftinit.c -"{ObjDir}ftmm.c.o" \xC4 :src:base:ftmm.c -"{ObjDir}ftotval.c.o" \xC4 :src:base:ftotval.c -"{ObjDir}ftpfr.c.o" \xC4 :src:base:ftpfr.c -"{ObjDir}ftstroke.c.o" \xC4 :src:base:ftstroke.c -"{ObjDir}ftsynth.c.o" \xC4 :src:base:ftsynth.c -"{ObjDir}ftsystem.c.o" \xC4 :src:base:ftsystem.c -"{ObjDir}fttype1.c.o" \xC4 :src:base:fttype1.c -"{ObjDir}ftwinfnt.c.o" \xC4 :src:base:ftwinfnt.c -"{ObjDir}ftcache.c.o" \xC4 :src:cache:ftcache.c -"{ObjDir}bdf.c.o" \xC4 :src:bdf:bdf.c -"{ObjDir}cff.c.o" \xC4 :src:cff:cff.c -"{ObjDir}type1cid.c.o" \xC4 :src:cid:type1cid.c -"{ObjDir}gxvalid.c.o" \xC4 :src:gxvalid:gxvalid.c -"{ObjDir}ftgzip.c.o" \xC4 :src:gzip:ftgzip.c -"{ObjDir}ftbzip2.c.o" \xC4 :src:bzip2:ftbzip2.c -"{ObjDir}ftlzw.c.o" \xC4 :src:lzw:ftlzw.c -"{ObjDir}otvalid.c.o" \xC4 :src:otvalid:otvalid.c -"{ObjDir}pcf.c.o" \xC4 :src:pcf:pcf.c -"{ObjDir}pfr.c.o" \xC4 :src:pfr:pfr.c -"{ObjDir}psaux.c.o" \xC4 :src:psaux:psaux.c -"{ObjDir}pshinter.c.o" \xC4 :src:pshinter:pshinter.c -"{ObjDir}psmodule.c.o" \xC4 :src:psnames:psmodule.c -"{ObjDir}raster.c.o" \xC4 :src:raster:raster.c -"{ObjDir}sfnt.c.o" \xC4 :src:sfnt:sfnt.c -"{ObjDir}smooth.c.o" \xC4 :src:smooth:smooth.c -"{ObjDir}truetype.c.o" \xC4 :src:truetype:truetype.c -"{ObjDir}type1.c.o" \xC4 :src:type1:type1.c -"{ObjDir}type42.c.o" \xC4 :src:type42:type42.c -"{ObjDir}winfnt.c.o" \xC4 :src:winfonts:winfnt.c - - -### Optional Dependencies ### -### Build this target to generate "include file" dependencies. ### - -Dependencies \xC4 $OutOfDate - MakeDepend \xB6 - -append {MAKEFILE} \xB6 - -ignore "{CIncludes}" \xB6 - -objdir "{ObjDir}" \xB6 - -objext .o \xB6 - {Includes} \xB6 - {SrcFiles} - - diff --git a/3party/freetype/builds/mac/FreeType.ppc_carbon.make.txt b/3party/freetype/builds/mac/FreeType.ppc_carbon.make.txt deleted file mode 100644 index 9eb1dac4e7..0000000000 --- a/3party/freetype/builds/mac/FreeType.ppc_carbon.make.txt +++ /dev/null @@ -1,215 +0,0 @@ -# File: FreeType.ppc_carbon.make -# Target: FreeType.ppc_carbon -# Created: Friday, October 28, 2005 03:40:06 PM - - -MAKEFILE = FreeType.ppc_carbon.make -\xA5MondoBuild\xA5 = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified - -ObjDir = :objs: -Includes = \xB6 - -ansi strict \xB6 - -includes unix \xB6 - -i :include: \xB6 - -i :src: \xB6 - -i :include:freetype:config: - -Sym-PPC = -sym off - -PPCCOptions = \xB6 - -d FT_MACINTOSH=1 \xB6 - -d HAVE_FSSPEC=1 \xB6 - -d HAVE_FSREF=1 \xB6 - -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6 - -d HAVE_QUICKDRAW_CARBON=1 \xB6 - -d HAVE_ATS=0 \xB6 - -d FT2_BUILD_LIBRARY \xB6 - -d FT_CONFIG_CONFIG_H="" \xB6 - -d FT_CONFIG_MODULES_H="" \xB6 - {Includes} {Sym-PPC} -d TARGET_API_MAC_CARBON=1 - - -### Source Files ### - -SrcFiles = \xB6 - :src:autofit:autofit.c \xB6 - :builds:mac:ftbase.c \xB6 - :src:base:ftbbox.c \xB6 - :src:base:ftbdf.c \xB6 - :src:base:ftbitmap.c \xB6 - :src:base:ftdebug.c \xB6 - :src:base:ftfntfmt.c \xB6 - :src:base:ftfstype.c \xB6 - :src:base:ftglyph.c \xB6 - :src:base:ftgxval.c \xB6 - :src:base:ftinit.c \xB6 - :src:base:ftmm.c \xB6 - :src:base:ftotval.c \xB6 - :src:base:ftpfr.c \xB6 - :src:base:ftstroke.c \xB6 - :src:base:ftsynth.c \xB6 - :src:base:ftsystem.c \xB6 - :src:base:fttype1.c \xB6 - :src:base:ftwinfnt.c \xB6 - :src:cache:ftcache.c \xB6 - :src:bdf:bdf.c \xB6 - :src:cff:cff.c \xB6 - :src:cid:type1cid.c \xB6 - :src:gxvalid:gxvalid.c \xB6 - :src:gzip:ftgzip.c \xB6 - :src:bzip2:ftbzip2.c \xB6 - :src:lzw:ftlzw.c \xB6 - :src:otvalid:otvalid.c \xB6 - :src:pcf:pcf.c \xB6 - :src:pfr:pfr.c \xB6 - :src:psaux:psaux.c \xB6 - :src:pshinter:pshinter.c \xB6 - :src:psnames:psmodule.c \xB6 - :src:raster:raster.c \xB6 - :src:sfnt:sfnt.c \xB6 - :src:smooth:smooth.c \xB6 - :src:truetype:truetype.c \xB6 - :src:type1:type1.c \xB6 - :src:type42:type42.c \xB6 - :src:winfonts:winfnt.c - - -### Object Files ### - -ObjFiles-PPC = \xB6 - "{ObjDir}autofit.c.x" \xB6 - "{ObjDir}ftbase.c.x" \xB6 - "{ObjDir}ftbbox.c.x" \xB6 - "{ObjDir}ftbdf.c.x" \xB6 - "{ObjDir}ftbitmap.c.x" \xB6 - "{ObjDir}ftdebug.c.x" \xB6 - "{ObjDir}ftfntfmt.c.x" \xB6 - "{ObjDir}ftfstype.c.x" \xB6 - "{ObjDir}ftglyph.c.x" \xB6 - "{ObjDir}ftgxval.c.x" \xB6 - "{ObjDir}ftinit.c.x" \xB6 - "{ObjDir}ftmm.c.x" \xB6 - "{ObjDir}ftotval.c.x" \xB6 - "{ObjDir}ftpfr.c.x" \xB6 - "{ObjDir}ftstroke.c.x" \xB6 - "{ObjDir}ftsynth.c.x" \xB6 - "{ObjDir}ftsystem.c.x" \xB6 - "{ObjDir}fttype1.c.x" \xB6 - "{ObjDir}ftwinfnt.c.x" \xB6 - "{ObjDir}ftcache.c.x" \xB6 - "{ObjDir}bdf.c.x" \xB6 - "{ObjDir}cff.c.x" \xB6 - "{ObjDir}type1cid.c.x" \xB6 - "{ObjDir}gxvalid.c.x" \xB6 - "{ObjDir}ftgzip.c.x" \xB6 - "{ObjDir}ftbzip2.c.x" \xB6 - "{ObjDir}ftlzw.c.x" \xB6 - "{ObjDir}otvalid.c.x" \xB6 - "{ObjDir}pcf.c.x" \xB6 - "{ObjDir}pfr.c.x" \xB6 - "{ObjDir}psaux.c.x" \xB6 - "{ObjDir}pshinter.c.x" \xB6 - "{ObjDir}psmodule.c.x" \xB6 - "{ObjDir}raster.c.x" \xB6 - "{ObjDir}sfnt.c.x" \xB6 - "{ObjDir}smooth.c.x" \xB6 - "{ObjDir}truetype.c.x" \xB6 - "{ObjDir}type1.c.x" \xB6 - "{ObjDir}type42.c.x" \xB6 - "{ObjDir}winfnt.c.x" - - -### Libraries ### - -LibFiles-PPC = - - -### Default Rules ### - -.c.x \xC4 .c {\xA5MondoBuild\xA5} - {PPCC} {depDir}{default}.c -o {targDir}{default}.c.x {PPCCOptions} - - -### Build Rules ### - -:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c - Duplicate :src:base:ftbase.c :builds:mac:ftbase.c - -"{ObjDir}ftbase.c.x" \xC4\xC4 :builds:mac:ftbase.c - {PPCC} :builds:mac:ftbase.c -o {ObjDir}ftbase.c.x \xB6 - -i :builds:mac: \xB6 - -i :src:base: \xB6 - {PPCCOptions} - -FreeType.ppc_carbon \xC4\xC4 FreeType.ppc_carbon.o - -FreeType.ppc_carbon.o \xC4\xC4 {ObjFiles-PPC} {LibFiles-PPC} {\xA5MondoBuild\xA5} - PPCLink \xB6 - -o {Targ} \xB6 - {ObjFiles-PPC} \xB6 - {LibFiles-PPC} \xB6 - {Sym-PPC} \xB6 - -mf -d \xB6 - -t 'XCOF' \xB6 - -c 'MPS ' \xB6 - -xm l - - - -### Required Dependencies ### - -"{ObjDir}autofit.c.x" \xC4 :src:autofit:autofit.c -# "{ObjDir}ftbase.c.x" \xC4 :builds:mac:ftbase.c -"{ObjDir}ftbbox.c.x" \xC4 :src:base:ftbbox.c -"{ObjDir}ftbdf.c.x" \xC4 :src:base:ftbdf.c -"{ObjDir}ftbitmap.c.x" \xC4 :src:base:ftbitmap.c -"{ObjDir}ftdebug.c.x" \xC4 :src:base:ftdebug.c -"{ObjDir}ftfntfmt.c.x" \xC4 :src:base:ftfntfmt.c -"{ObjDir}ftfstype.c.x" \xC4 :src:base:ftfstype.c -"{ObjDir}ftglyph.c.x" \xC4 :src:base:ftglyph.c -"{ObjDir}ftgxval.c.x" \xC4 :src:base:ftgxval.c -"{ObjDir}ftinit.c.x" \xC4 :src:base:ftinit.c -"{ObjDir}ftmm.c.x" \xC4 :src:base:ftmm.c -"{ObjDir}ftotval.c.x" \xC4 :src:base:ftotval.c -"{ObjDir}ftpfr.c.x" \xC4 :src:base:ftpfr.c -"{ObjDir}ftstroke.c.x" \xC4 :src:base:ftstroke.c -"{ObjDir}ftsynth.c.x" \xC4 :src:base:ftsynth.c -"{ObjDir}ftsystem.c.x" \xC4 :src:base:ftsystem.c -"{ObjDir}fttype1.c.x" \xC4 :src:base:fttype1.c -"{ObjDir}ftwinfnt.c.x" \xC4 :src:base:ftwinfnt.c -"{ObjDir}ftcache.c.x" \xC4 :src:cache:ftcache.c -"{ObjDir}bdf.c.x" \xC4 :src:bdf:bdf.c -"{ObjDir}cff.c.x" \xC4 :src:cff:cff.c -"{ObjDir}type1cid.c.x" \xC4 :src:cid:type1cid.c -"{ObjDir}gxvalid.c.x" \xC4 :src:gxvalid:gxvalid.c -"{ObjDir}ftgzip.c.x" \xC4 :src:gzip:ftgzip.c -"{ObjDir}ftbzip2.c.x" \xC4 :src:bzip2:ftbzip2.c -"{ObjDir}ftlzw.c.x" \xC4 :src:lzw:ftlzw.c -"{ObjDir}otvalid.c.x" \xC4 :src:otvalid:otvalid.c -"{ObjDir}pcf.c.x" \xC4 :src:pcf:pcf.c -"{ObjDir}pfr.c.x" \xC4 :src:pfr:pfr.c -"{ObjDir}psaux.c.x" \xC4 :src:psaux:psaux.c -"{ObjDir}pshinter.c.x" \xC4 :src:pshinter:pshinter.c -"{ObjDir}psmodule.c.x" \xC4 :src:psnames:psmodule.c -"{ObjDir}raster.c.x" \xC4 :src:raster:raster.c -"{ObjDir}sfnt.c.x" \xC4 :src:sfnt:sfnt.c -"{ObjDir}smooth.c.x" \xC4 :src:smooth:smooth.c -"{ObjDir}truetype.c.x" \xC4 :src:truetype:truetype.c -"{ObjDir}type1.c.x" \xC4 :src:type1:type1.c -"{ObjDir}type42.c.x" \xC4 :src:type42:type42.c -"{ObjDir}winfnt.c.x" \xC4 :src:winfonts:winfnt.c - - -### Optional Dependencies ### -### Build this target to generate "include file" dependencies. ### - -Dependencies \xC4 $OutOfDate - MakeDepend \xB6 - -append {MAKEFILE} \xB6 - -ignore "{CIncludes}" \xB6 - -objdir "{ObjDir}" \xB6 - -objext .x \xB6 - {Includes} \xB6 - {SrcFiles} - - diff --git a/3party/freetype/builds/mac/FreeType.ppc_classic.make.txt b/3party/freetype/builds/mac/FreeType.ppc_classic.make.txt deleted file mode 100644 index 0627eeaa9f..0000000000 --- a/3party/freetype/builds/mac/FreeType.ppc_classic.make.txt +++ /dev/null @@ -1,216 +0,0 @@ -# File: FreeType.ppc_classic.make -# Target: FreeType.ppc_classic -# Created: Thursday, October 27, 2005 07:42:43 PM - - -MAKEFILE = FreeType.ppc_classic.make -\xA5MondoBuild\xA5 = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified - -ObjDir = :objs: -Includes = \xB6 - -ansi strict \xB6 - -includes unix \xB6 - -i :include: \xB6 - -i :src: \xB6 - -i :include:freetype:config: - -Sym-PPC = -sym off - -PPCCOptions = \xB6 - -d FT_MACINTOSH=1 \xB6 - -d HAVE_FSSPEC=1 \xB6 - -d HAVE_FSREF=0 \xB6 - -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6 - -d HAVE_QUICKDRAW_CARBON=0 \xB6 - -d HAVE_ATS=0 \xB6 - -d FT2_BUILD_LIBRARY \xB6 - -d FT_CONFIG_CONFIG_H="" \xB6 - -d FT_CONFIG_MODULES_H="" \xB6 - {Includes} {Sym-PPC} - - -### Source Files ### - -SrcFiles = \xB6 - :src:autofit:autofit.c \xB6 - :builds:mac:ftbase.c \xB6 - :src:base:ftbbox.c \xB6 - :src:base:ftbdf.c \xB6 - :src:base:ftbitmap.c \xB6 - :src:base:ftdebug.c \xB6 - :src:base:ftfntfmt.c \xB6 - :src:base:ftfstype.c \xB6 - :src:base:ftglyph.c \xB6 - :src:base:ftgxval.c \xB6 - :src:base:ftinit.c \xB6 - :src:base:ftmm.c \xB6 - :src:base:ftotval.c \xB6 - :src:base:ftpfr.c \xB6 - :src:base:ftstroke.c \xB6 - :src:base:ftsynth.c \xB6 - :src:base:ftsystem.c \xB6 - :src:base:fttype1.c \xB6 - :src:base:ftwinfnt.c \xB6 - :src:cache:ftcache.c \xB6 - :src:bdf:bdf.c \xB6 - :src:cff:cff.c \xB6 - :src:cid:type1cid.c \xB6 - :src:gxvalid:gxvalid.c \xB6 - :src:gzip:ftgzip.c \xB6 - :src:bzip2:ftbzip2.c \xB6 - :src:lzw:ftlzw.c \xB6 - :src:otvalid:otvalid.c \xB6 - :src:pcf:pcf.c \xB6 - :src:pfr:pfr.c \xB6 - :src:psaux:psaux.c \xB6 - :src:pshinter:pshinter.c \xB6 - :src:psnames:psmodule.c \xB6 - :src:raster:raster.c \xB6 - :src:sfnt:sfnt.c \xB6 - :src:smooth:smooth.c \xB6 - :src:truetype:truetype.c \xB6 - :src:type1:type1.c \xB6 - :src:type42:type42.c \xB6 - :src:winfonts:winfnt.c - - -### Object Files ### - -ObjFiles-PPC = \xB6 - "{ObjDir}autofit.c.x" \xB6 - "{ObjDir}ftbase.c.x" \xB6 - "{ObjDir}ftbbox.c.x" \xB6 - "{ObjDir}ftbdf.c.x" \xB6 - "{ObjDir}ftbitmap.c.x" \xB6 - "{ObjDir}ftdebug.c.x" \xB6 - "{ObjDir}ftfntfmt.c.x" \xB6 - "{ObjDir}ftfstype.c.x" \xB6 - "{ObjDir}ftglyph.c.x" \xB6 - "{ObjDir}ftgxval.c.x" \xB6 - "{ObjDir}ftinit.c.x" \xB6 - "{ObjDir}ftmm.c.x" \xB6 - "{ObjDir}ftotval.c.x" \xB6 - "{ObjDir}ftpfr.c.x" \xB6 - "{ObjDir}ftstroke.c.x" \xB6 - "{ObjDir}ftsynth.c.x" \xB6 - "{ObjDir}ftsystem.c.x" \xB6 - "{ObjDir}fttype1.c.x" \xB6 - "{ObjDir}ftwinfnt.c.x" \xB6 - "{ObjDir}ftcache.c.x" \xB6 - "{ObjDir}bdf.c.x" \xB6 - "{ObjDir}cff.c.x" \xB6 - "{ObjDir}type1cid.c.x" \xB6 - "{ObjDir}gxvalid.c.x" \xB6 - "{ObjDir}ftgzip.c.x" \xB6 - "{ObjDir}ftbzip2.c.x" \xB6 - "{ObjDir}ftlzw.c.x" \xB6 - "{ObjDir}otvalid.c.x" \xB6 - "{ObjDir}pcf.c.x" \xB6 - "{ObjDir}pfr.c.x" \xB6 - "{ObjDir}psaux.c.x" \xB6 - "{ObjDir}pshinter.c.x" \xB6 - "{ObjDir}psmodule.c.x" \xB6 - "{ObjDir}raster.c.x" \xB6 - "{ObjDir}sfnt.c.x" \xB6 - "{ObjDir}smooth.c.x" \xB6 - "{ObjDir}truetype.c.x" \xB6 - "{ObjDir}type1.c.x" \xB6 - "{ObjDir}type42.c.x" \xB6 - "{ObjDir}winfnt.c.x" - - -### Libraries ### - -LibFiles-PPC = - - -### Default Rules ### - -.c.x \xC4 .c {\xA5MondoBuild\xA5} - {PPCC} {depDir}{default}.c -o {targDir}{default}.c.x {PPCCOptions} - - -### Build Rules ### - -:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c - Duplicate :src:base:ftbase.c :builds:mac:ftbase.c - -"{ObjDir}ftbase.c.x" \xC4\xC4 :builds:mac:ftbase.c - {PPCC} :builds:mac:ftbase.c -o "{ObjDir}ftbase.c.x" \xB6 - -i :builds:mac: \xB6 - -i :src:base: \xB6 - {PPCCOptions} - -FreeType.ppc_classic \xC4\xC4 FreeType.ppc_classic.o - -FreeType.ppc_classic.o \xC4\xC4 {ObjFiles-PPC} {LibFiles-PPC} {\xA5MondoBuild\xA5} - PPCLink \xB6 - -o {Targ} \xB6 - {ObjFiles-PPC} \xB6 - {LibFiles-PPC} \xB6 - {Sym-PPC} \xB6 - -mf -d \xB6 - -t 'XCOF' \xB6 - -c 'MPS ' \xB6 - -xm l - - - -### Required Dependencies ### - -"{ObjDir}autofit.c.x" \xC4 :src:autofit:autofit.c -# "{ObjDir}ftbase.c.x" \xC4 :builds:mac:ftbase.c -"{ObjDir}ftbbox.c.x" \xC4 :src:base:ftbbox.c -"{ObjDir}ftbdf.c.x" \xC4 :src:base:ftbdf.c -"{ObjDir}ftbitmap.c.x" \xC4 :src:base:ftbitmap.c -"{ObjDir}ftdebug.c.x" \xC4 :src:base:ftdebug.c -"{ObjDir}ftfntfmt.c.x" \xC4 :src:base:ftfntfmt.c -"{ObjDir}ftfstype.c.x" \xC4 :src:base:ftfstype.c -"{ObjDir}ftglyph.c.x" \xC4 :src:base:ftglyph.c -"{ObjDir}ftgxval.c.x" \xC4 :src:base:ftgxval.c -"{ObjDir}ftinit.c.x" \xC4 :src:base:ftinit.c -"{ObjDir}ftmm.c.x" \xC4 :src:base:ftmm.c -"{ObjDir}ftotval.c.x" \xC4 :src:base:ftotval.c -"{ObjDir}ftpfr.c.x" \xC4 :src:base:ftpfr.c -"{ObjDir}ftstroke.c.x" \xC4 :src:base:ftstroke.c -"{ObjDir}ftsynth.c.x" \xC4 :src:base:ftsynth.c -"{ObjDir}ftsystem.c.x" \xC4 :src:base:ftsystem.c -"{ObjDir}fttype1.c.x" \xC4 :src:base:fttype1.c -"{ObjDir}ftwinfnt.c.x" \xC4 :src:base:ftwinfnt.c -"{ObjDir}ftcache.c.x" \xC4 :src:cache:ftcache.c -"{ObjDir}bdf.c.x" \xC4 :src:bdf:bdf.c -"{ObjDir}cff.c.x" \xC4 :src:cff:cff.c -"{ObjDir}type1cid.c.x" \xC4 :src:cid:type1cid.c -"{ObjDir}gxvalid.c.x" \xC4 :src:gxvalid:gxvalid.c -"{ObjDir}ftgzip.c.x" \xC4 :src:gzip:ftgzip.c -"{ObjDir}ftbzip2.c.x" \xC4 :src:bzip2:ftbzip2.c -"{ObjDir}ftlzw.c.x" \xC4 :src:lzw:ftlzw.c -"{ObjDir}otvalid.c.x" \xC4 :src:otvalid:otvalid.c -"{ObjDir}pcf.c.x" \xC4 :src:pcf:pcf.c -"{ObjDir}pfr.c.x" \xC4 :src:pfr:pfr.c -"{ObjDir}psaux.c.x" \xC4 :src:psaux:psaux.c -"{ObjDir}pshinter.c.x" \xC4 :src:pshinter:pshinter.c -"{ObjDir}psmodule.c.x" \xC4 :src:psnames:psmodule.c -"{ObjDir}raster.c.x" \xC4 :src:raster:raster.c -"{ObjDir}sfnt.c.x" \xC4 :src:sfnt:sfnt.c -"{ObjDir}smooth.c.x" \xC4 :src:smooth:smooth.c -"{ObjDir}truetype.c.x" \xC4 :src:truetype:truetype.c -"{ObjDir}type1.c.x" \xC4 :src:type1:type1.c -"{ObjDir}type42.c.x" \xC4 :src:type42:type42.c -"{ObjDir}winfnt.c.x" \xC4 :src:winfonts:winfnt.c - - - -### Optional Dependencies ### -### Build this target to generate "include file" dependencies. ### - -Dependencies \xC4 $OutOfDate - MakeDepend \xB6 - -append {MAKEFILE} \xB6 - -ignore "{CIncludes}" \xB6 - -objdir "{ObjDir}" \xB6 - -objext .x \xB6 - {Includes} \xB6 - {SrcFiles} - - diff --git a/3party/freetype/builds/mac/README b/3party/freetype/builds/mac/README deleted file mode 100644 index f58e47d4ad..0000000000 --- a/3party/freetype/builds/mac/README +++ /dev/null @@ -1,401 +0,0 @@ -This folder contains - - * Makefile skeletons for Apple MPW (Macintosh's Programmer's Workshop) - - * Python script to generate MPW makefile from skeleton - - * Metrowerks CodeWarrior 9.0 project file in XML format - ------------------------------------------------------------- - -1. What is this ---------------- - -Files in this directory are designed to build FreeType -running on classic MacOS. To build FreeType running on -Mac OS X, build as the system is UNIX. - -However, Mac OS X is most useful to manipulate files in -vanilla FreeType to fit classic MacOS. - -The information about MacOS specific API is written in -appendix of this document. - -2. Requirement --------------- - -You can use MPW: a free-charged developer environment -by Apple, or CodeWarrior: a commercial developer -environment by Metrowerks. GCC for MPW and Symantec -"Think C" are not tested at present. - - - 2-1. Apple MPW - -------------- - - Following C compilers are tested: - - m68k target: Apple SC 8.9.0d3e1 - ppc target: Apple MrC 5.0.0d3c1 - - The final MPW-GM (official release on 1999/Dec) is too - old and cannot compile FreeType, because bundled C - compilers cannot search header files in sub directories. - Updating by the final MPW-PR (pre-release on 2001/Feb) - is required. - - Required files are downloadable from: - - http://developer.apple.com/tools/mpw-tools/index.html - - Also you can find documents how to update by MPW-PR. - - Python is required to restore MPW makefiles from the - skeletons. Python bundled to Mac OS X is enough. For - classic MacOS, MacPython is available: - - http://homepages.cwi.nl/~jack/macpython/ - - MPW requires all files are typed by resource fork. - ResEdit bundled to MPW is enough. In Mac OS X, - /Developer/Tools/SetFile of DevTool is useful to - manipulate from commandline. - - 2-2. Metrowerks CodeWarrior - --------------------------- - - XML project file is generated and tested by - CodeWarrior 9.0. Older versions are not tested - at all. At present, static library for ppc target - is available in the project file. - - -3. How to build ---------------- - - 3-1. Apple MPW - -------------- - Detailed building procedure by Apple MPW is - described in following. - - 3-1-1. Generate MPW makefiles from the skeletons - ------------------------------------------------ - - Here are 4 skeletons for following targets are - included. - - - FreeType.m68k_far.make.txt - Ancient 32bit binary executable format for - m68k MacOS: System 6, with 32bit addressing - mode (far-pointer-model) So-called "Toolbox" - API is used. - - - FreeType.m68k_cfm.make.txt - CFM binary executable format for m68k MacOS: - System 7. So-called "Toolbox" API is used. - - - FreeType.ppc_classic.make.txt - CFM binary executable format for ppc MacOS: - System 7, MacOS 8, MacOS 9. So-called "Toolbox" - API is used. - - - FreeType.ppc_carbon.make.txt - CFM binary executable format for ppc MacOS: - MacOS 9. Carbon API is used. - - At present, static library is only supported, - although targets except of m68k_far are capable - to use shared library. - - MPW makefile syntax uses 8bit characters. To keep - from violating them during version control, here - we store skeletons in pure ASCII format. You must - generate MPW makefile by Python script ascii2mpw.py. - - In Mac OS X terminal, you can convert as: - - python builds/mac/ascii2mpw.py \ - < builds/mac/FreeType.m68k_far.make.txt \ - > FreeType.m68k_far.make - - The skeletons are designed to use in the top - directory where there are builds, include, src etc. - You must name the generated MPW makefile by removing - ".txt" from source skeleton name. - - 3-1-2. Add resource forks to related files - ------------------------------------------ - - MPW's Make and C compilers cannot recognize files - without resource fork. You have to add resource - fork to the files that MPW uses. In Mac OS X - terminal of the system, you can do as: - - find . -name '*.[ch]' -exec \ - /Developer/Tools/SetFile -a l -c "MPS " -t TEXT \{\} \; - - find . -name '*.make' -exec \ - /Developer/Tools/SetFile -a l -c "MPS " -t TEXT \{\} \; - - - 3-1-3. Open MPW shell and build - ------------------------------- - - Open MPW shell and go to the top directory that - FreeType sources are extracted (MPW makefile must - be located in there), from "Set Directory" in - "Directory" menu. - - Choose "Build" from "Build" menu, and type the - name of project by removing ".make" from MPW - makefile, as: FreeType.m68k_far - - If building is successfully finished, you can find - built library in objs/ directory. - - - 3-2. Metrowerks CodeWarrior - --------------------------- - - Detailed building procedure by Metrowerks - CodeWarrior (CW) 9.0 is described in following. - - 3-2-1. Import XML project file - ------------------------------ - - CW XML project file is not ready for double- - click. Start CodeWarrior IDE, and choose - "Import project" in "File" menu. Choose XML - project file: builds/mac/ftlib.prj.xml. - In next, you will be asked where to save CW - native project file: you must choose - "builds/mac/ftlib.prj". The project file is - designed with relative path from there. After - CW native project file is generated, it is - automatically loaded, small project window - titled "ftlib.prj" is displayed. - - 3-2-2. Building - --------------- - Choose "Make" from "Project" menu. If building - is successfully finished, you can find built - library at objs/FreeTypeLib. - -4. TODO -------- - - 4-1. All modules should be included - ----------------------------------- - - At present, MPW makefiles and CW project file are - just updated versions of these by Leonard. Some - modules are added after the last maintenance, they - are not included. - - 4-2. Working test with ftdemos - ------------------------------ - - At present, MPW makefiles and CW project file can - build FreeType for classic MacOS. But their working - behaviours are not tested at all. Building ftdemos - for classic MacOS and working test is required. - - 4-3. Porting Jam onto MPW - ------------------------- - - FreeType uses Jam (and FT-Jam) for unified cross- - platform building tool. At present, Jam is not ported - to MPW. To update classic MacOS support easily, - building by Jam is expected on MPW. - - -APPENDIX I ----------- - - A-1. Framework dependencies - --------------------------- - - src/base/ftmac.c adds two Mac-specific features to - FreeType. These features are based on MacOS libraries. - - * accessing resource-fork font - The fonts for classic MacOS store their graphical data - in resource forks which cannot be accessed via ANSI C - functions. FreeType2 provides functions to handle such - resource fork fonts, they are based on File Manager - framework of MacOS. In addition, HFS and HFS+ file - system driver of Linux is supported. Following - functions are for this purpose. - - FT_New_Face_From_Resource() - FT_New_Face_From_FSSpec() - FT_New_Face_From_FSRef() - - * resolving font name to font file - The font menu of MacOS application prefers font name - written in FOND resource than sfnt resource. FreeType2 - provides functions to find font file by name in MacOS - application, they are based on QuickDraw Font Manager - and Apple Type Service framework of MacOS. - - FT_GetFile_From_Mac_Name() - FT_GetFile_From_Mac_ATS_Name() - - Working functions for each MacOS are summarized as - following. - - upto MacOS 6: - not tested (you have to obtain MPW 2.x) - - MacOS 7.x, 8.x, 9.x (without CarbonLib): - FT_GetFile_From_Mac_Name() - FT_New_Face_From_Resource() - FT_New_Face_From_FSSpec() - - MacOS 9.x (with CarbonLib): - FT_GetFile_From_Mac_Name() - FT_New_Face_From_Resource() - FT_New_Face_From_FSSpec() - FT_New_Face_From_FSRef() - - Mac OS X upto 10.4.x: - FT_GetFile_From_Mac_Name() deprecated - FT_New_Face_From_FSSpec() deprecated - FT_GetFile_From_Mac_ATS_Name() deprecated? - FT_New_Face_From_FSRef() - - A-2. Deprecated Functions - ------------------------- - - A-2-1. FileManager - ------------------ - - For convenience to write MacOS application, ftmac.c - provides functions to specify a file by FSSpec and FSRef, - because the file identification pathname had ever been - unrecommended method in MacOS programming. - - Toward to MacOS X 10.4 & 5, Carbon functions using FSSpec - datatype is noticed as deprecated, and recommended to - migrate to FSRef datatype. The big differences of FSRef - against FSSpec are explained in Apple TechNotes 2078. - - http://developer.apple.com/technotes/tn2002/tn2078.html - - - filename length: the max length of file - name of FSRef is 255 chars (it is limit of HFS+), - that of FSSpec is 31 chars (it is limit of HFS). - - - filename encoding: FSSpec is localized by - legacy encoding for each language system, - FSRef is Unicode enabled. - - A-2-2. FontManager - ------------------ - - Following functions receive QuickDraw fontname: - - FT_GetFile_From_Mac_Name() - - QuickDraw is deprecated and replaced by Quartz - since Mac OS X 10.4. They are still kept for - backward compatibility. By undefinition of - HAVE_QUICKDRAW in building, you can change these - functions to return FT_Err_Unimplemented always. - - Replacement functions are added for migration. - - FT_GetFile_From_Mac_ATS_Name() - - They are usable on Mac OS X only. On older systems, - these functions return FT_Err_Unimplemented always. - - The detailed incompatibilities and possibility - of FontManager emulation without QuickDraw is - explained in - - http://www.gyve.org/~mpsuzuki/ats_benchmark.html - - A-3. Framework Availabilities - ----------------------------- - - The framework of MacOS are often revised, especially - when new format of binary executable is introduced. - Following table is the minimum version of frameworks - to use functions used in FreeType2. The table is - extracted from MPW header files for assembly language. - - *** NOTE *** - The conditional definition of available data type - in MPW compiler is insufficient. You can compile - program using FSRef data type for older systems - (MacOS 7, 8) that don't know FSRef data type. - - - +-------------------+-----------------------------+ - CPU | mc680x0 | PowerPC | - +---------+---------+---------+---------+---------+ - Binary Executable Format | Classic | 68K-CFM | CFM | CFM | Mach-O | - +---------+---------+---------+---------+---------+ - Framework API | Toolbox | Toolbox | Toolbox | Carbon | Carbon | - +---------+---------+---------+---------+---------+ - - +---------+---------+---------+---------+---------+ - | ?(*) |Interface|Interface|CarbonLib|Mac OS X | - | |Lib |Lib | | | -* Files.h +---------+---------+---------+---------+---------+ -PBGetFCBInfoSync() | o | 7.1- | 7.1- | 1.0- | o | -FSMakeFSSpec() | o | 7.1- | 7.1- | 1.0- | o | -FSGetForkCBInfo() | o | (**) | 9.0- | 1.0- | o | -FSpMakeFSRef() | o | (**) | 9.0- | 1.0- | o | -FSGetCatalogInfo() | o | (**) | 9.0- | 1.0- | -10.3 | -FSPathMakeRef() | x | x | x | 1.1- | -10.3 | - +---------+---------+---------+---------+---------+ - - +---------+---------+---------+---------+---------+ - | ?(*) |Font |Font |CarbonLib|Mac OS X | - | |Manager |Manager | | | -* Fonts.h +---------+---------+---------+---------+---------+ -FMCreateFontFamilyIterator() | x | x | 9.0- | 1.0- | -10.3 | -FMDisposeFontFamilyIterator() | x | x | 9.0- | 1.0- | -10.3 | -FMGetNextFontFamily() | x | x | 9.0- | 1.0- | -10.3 | -FMGetFontFamilyName() | x | x | 9.0- | 1.0- | -10.3 | -FMCreateFontFamilyInstanceIterator() | x | x | 9.0- | 1.0- | -10.3 | -FMDisposeFontFamilyInstanceIterator() | x | x | 9.0- | 1.0- | -10.3 | -FMGetNextFontFamilyInstance() | x | x | 9.0- | 1.0- | -10.3 | - +---------+---------+---------+---------+---------+ - - +---------+---------+---------+---------+---------+ - | - | - | - |CarbonLib|Mac OS X | -* ATSFont.h (***) +---------+---------+---------+---------+---------+ -ATSFontFindFromName() | x | x | x | x | o | -ATSFontGetFileSpecification() | x | x | x | x | o | - +---------+---------+---------+---------+---------+ - - (*) - In the "Classic": the original binary executable - format, these framework functions are directly - transformed to MacOS system call. Therefore, the - exact availability should be checked by running - system. - - (**) - InterfaceLib is bundled to MacOS and its version - is usually equal to MacOS. There's no separate - update for InterfaceLib. It is supposed that - there's no InterfaceLib 9.x for m68k platforms. - In fact, these functions are FSRef dependent. - - (***) - ATSUI framework is available on ATSUnicode 8.5 on - ppc Toolbox CFM, CarbonLib 1.0 too. But its base: - ATS font manager is not published in these versions. - ------------------------------------------------------------- -Last update: 2013-Nov-03. - -Currently maintained by - suzuki toshiya, -Originally prepared by - Leonard Rosenthol, - Just van Rossum, diff --git a/3party/freetype/builds/mac/ascii2mpw.py b/3party/freetype/builds/mac/ascii2mpw.py deleted file mode 100755 index ad32b21977..0000000000 --- a/3party/freetype/builds/mac/ascii2mpw.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python -import sys -import string - -if len( sys.argv ) == 1 : - for asc_line in sys.stdin.readlines(): - mpw_line = string.replace(asc_line, "\\xA5", "\245") - mpw_line = string.replace(mpw_line, "\\xB6", "\266") - mpw_line = string.replace(mpw_line, "\\xC4", "\304") - mpw_line = string.replace(mpw_line, "\\xC5", "\305") - mpw_line = string.replace(mpw_line, "\\xFF", "\377") - mpw_line = string.replace(mpw_line, "\n", "\r") - mpw_line = string.replace(mpw_line, "\\n", "\n") - sys.stdout.write(mpw_line) -elif sys.argv[1] == "-r" : - for mpw_line in sys.stdin.readlines(): - asc_line = string.replace(mpw_line, "\n", "\\n") - asc_line = string.replace(asc_line, "\r", "\n") - asc_line = string.replace(asc_line, "\245", "\\xA5") - asc_line = string.replace(asc_line, "\266", "\\xB6") - asc_line = string.replace(asc_line, "\304", "\\xC4") - asc_line = string.replace(asc_line, "\305", "\\xC5") - asc_line = string.replace(asc_line, "\377", "\\xFF") - sys.stdout.write(asc_line) diff --git a/3party/freetype/builds/mac/freetype-Info.plist b/3party/freetype/builds/mac/freetype-Info.plist deleted file mode 100644 index b3d114dad8..0000000000 --- a/3party/freetype/builds/mac/freetype-Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - CFBundleDevelopmentRegion - English - - CFBundleExecutable - FreeType - - CFBundleGetInfoString - FreeType ${PROJECT_VERSION} - - CFBundleInfoDictionaryVersion - 6.0 - - CFBundleName - FreeType - - CFBundlePackageType - FMWK - - CFBundleShortVersionString - ${PROJECT_VERSION} - - CFBundleSignature - ???? - - CFBundleVersion - ${PROJECT_VERSION} - - - diff --git a/3party/freetype/builds/mac/ftlib.prj.xml b/3party/freetype/builds/mac/ftlib.prj.xml deleted file mode 100644 index cbbc45ee55..0000000000 --- a/3party/freetype/builds/mac/ftlib.prj.xml +++ /dev/null @@ -1,1194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - - - FreeTypeLib - - - - UserSourceTrees - - - AlwaysSearchUserPathstrue - InterpretDOSAndUnixPathstrue - RequireFrameworkStyleIncludesfalse - SourceRelativeIncludesfalse - UserSearchPaths - - SearchPath - Path: - PathFormatMacOS - PathRootProject - - Recursivetrue - FrameworkPathfalse - HostFlagsAll - - - SearchPath - Path:::include: - PathFormatMacOS - PathRootProject - - Recursivetrue - FrameworkPathfalse - HostFlagsAll - - - SearchPath - Path:::src: - PathFormatMacOS - PathRootProject - - Recursivetrue - FrameworkPathfalse - HostFlagsAll - - - SearchPath - Path:: - PathFormatMacOS - PathRootProject - - Recursivetrue - FrameworkPathfalse - HostFlagsAll - - - SystemSearchPaths - - SearchPath - Path: - PathFormatMacOS - PathRootCodeWarrior - - Recursivetrue - FrameworkPathfalse - HostFlagsAll - - - - - MWRuntimeSettings_WorkingDirectory - MWRuntimeSettings_CommandLine - MWRuntimeSettings_HostApplication - Path - PathFormatGeneric - PathRootAbsolute - - MWRuntimeSettings_EnvVars - - - LinkerMacOS PPC Linker - PreLinker - PostLinker - TargetnameFreeTypeLib - OutputDirectory - Path:::objs: - PathFormatMacOS - PathRootProject - - SaveEntriesUsingRelativePathsfalse - - - FileMappings - - FileTypeAPPL - FileExtension - Compiler - EditLanguage - Precompilefalse - Launchabletrue - ResourceFiletrue - IgnoredByMakefalse - - - FileTypeAppl - FileExtension - Compiler - EditLanguage - Precompilefalse - Launchabletrue - ResourceFiletrue - IgnoredByMakefalse - - - FileTypeMMLB - FileExtension - CompilerLib Import PPC - EditLanguage - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeMPLF - FileExtension - CompilerLib Import PPC - EditLanguage - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeMWCD - FileExtension - Compiler - EditLanguage - Precompilefalse - Launchabletrue - ResourceFiletrue - IgnoredByMakefalse - - - FileTypeRSRC - FileExtension - Compiler - EditLanguage - Precompilefalse - Launchabletrue - ResourceFiletrue - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.bh - CompilerBalloon Help - EditLanguage - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.c - CompilerMW C/C++ PPC - EditLanguageC/C++ - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.c++ - CompilerMW C/C++ PPC - EditLanguageC/C++ - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.cc - CompilerMW C/C++ PPC - EditLanguageC/C++ - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.cp - CompilerMW C/C++ PPC - EditLanguageC/C++ - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.cpp - CompilerMW C/C++ PPC - EditLanguageC/C++ - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.exp - Compiler - EditLanguage - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.h - CompilerMW C/C++ PPC - EditLanguageC/C++ - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMaketrue - - - FileTypeTEXT - FileExtension.p - CompilerMW Pascal PPC - EditLanguage - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.pas - CompilerMW Pascal PPC - EditLanguage - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.pch - CompilerMW C/C++ PPC - EditLanguageC/C++ - Precompiletrue - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.pch++ - CompilerMW C/C++ PPC - EditLanguageC/C++ - Precompiletrue - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.ppu - CompilerMW Pascal PPC - EditLanguage - Precompiletrue - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.r - CompilerRez - EditLanguageRez - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeTEXT - FileExtension.s - CompilerPPCAsm - EditLanguage - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypeXCOF - FileExtension - CompilerXCOFF Import PPC - EditLanguage - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypedocu - FileExtension - Compiler - EditLanguage - Precompilefalse - Launchabletrue - ResourceFiletrue - IgnoredByMakefalse - - - FileTypersrc - FileExtension - Compiler - EditLanguage - Precompilefalse - Launchabletrue - ResourceFiletrue - IgnoredByMakefalse - - - FileTypeshlb - FileExtension - CompilerPEF Import PPC - EditLanguage - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileTypestub - FileExtension - CompilerPEF Import PPC - EditLanguage - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileExtension.doc - Compiler - EditLanguage - Precompilefalse - Launchabletrue - ResourceFilefalse - IgnoredByMaketrue - - - FileExtension.o - CompilerXCOFF Import PPC - EditLanguage - Precompilefalse - Launchablefalse - ResourceFilefalse - IgnoredByMakefalse - - - FileExtension.ppob - Compiler - EditLanguage - Precompilefalse - Launchabletrue - ResourceFiletrue - IgnoredByMakefalse - - - FileExtension.rsrc - Compiler - EditLanguage - Precompilefalse - Launchabletrue - ResourceFiletrue - IgnoredByMakefalse - - - - - CacheModDatestrue - DumpBrowserInfofalse - CacheSubprojectstrue - UseThirdPartyDebuggerfalse - BrowserGenerator1 - DebuggerAppPath - Path - PathFormatGeneric - PathRootAbsolute - - DebuggerCmdLineArgs - DebuggerWorkingDir - Path - PathFormatGeneric - PathRootAbsolute - - CodeCompletionPrefixFileNameMacHeaders.c - CodeCompletionMacroFileNameMacOS_Carbon_C++_Macros.h - - - ConsoleEncoding0 - LogSystemMessagestrue - AutoTargetDLLsfalse - StopAtWatchpointstrue - PauseWhileRunningfalse - PauseInterval5 - PauseUIFlags0 - AltExePath - Path - PathFormatGeneric - PathRootAbsolute - - StopAtTempBPOnLaunchtrue - CacheSymbolicstrue - TempBPFunctionNamemain - TempBPType0 - - - Enabledfalse - ConnectionName - DownloadPath - LaunchRemoteAppfalse - RemoteAppPath - CoreID0 - JTAGClockSpeed8000 - IsMultiCorefalse - OSDownloadfalse - UseGlobalOSDownloadfalse - OSDownloadConnectionName - OSDownloadPath - AltDownloadfalse - AltDownloadConnectionName - - - OtherExecutables - - - AnalyzerConnectionName - - - CustomColor1 - Red0 - Green32767 - Blue0 - - CustomColor2 - Red0 - Green32767 - Blue0 - - CustomColor3 - Red0 - Green32767 - Blue0 - - CustomColor4 - Red0 - Green32767 - Blue0 - - - - MWFrontEnd_C_cplusplus0 - MWFrontEnd_C_checkprotos1 - MWFrontEnd_C_arm0 - MWFrontEnd_C_trigraphs0 - MWFrontEnd_C_onlystdkeywords0 - MWFrontEnd_C_enumsalwaysint0 - MWFrontEnd_C_ansistrict1 - MWFrontEnd_C_wchar_type1 - MWFrontEnd_C_enableexceptions1 - MWFrontEnd_C_dontreusestrings0 - MWFrontEnd_C_poolstrings0 - MWFrontEnd_C_dontinline0 - MWFrontEnd_C_useRTTI1 - MWFrontEnd_C_unsignedchars0 - MWFrontEnd_C_autoinline0 - MWFrontEnd_C_booltruefalse1 - MWFrontEnd_C_inlinelevel0 - MWFrontEnd_C_ecplusplus0 - MWFrontEnd_C_defer_codegen0 - MWFrontEnd_C_templateparser0 - MWFrontEnd_C_c990 - MWFrontEnd_C_bottomupinline1 - MWFrontEnd_C_gcc_extensions0 - MWFrontEnd_C_instance_manager0 - - - C_CPP_Preprocessor_EmitFiletrue - C_CPP_Preprocessor_EmitLinefalse - C_CPP_Preprocessor_EmitFullPathfalse - C_CPP_Preprocessor_KeepCommentsfalse - C_CPP_Preprocessor_PCHUsesPrefixTextfalse - C_CPP_Preprocessor_EmitPragmastrue - C_CPP_Preprocessor_KeepWhiteSpacefalse - C_CPP_Preprocessor_MultiByteEncodingencASCII_Unicode - C_CPP_Preprocessor_PrefixText/* settings imported from old "C/C++ Language" panel */ - -#if !__option(precompile) -#include "ftoption.h" /* was "Prefix file" */ -#endif - - - - MWWarning_C_warn_illpragma0 - MWWarning_C_warn_emptydecl0 - MWWarning_C_warn_possunwant0 - MWWarning_C_warn_unusedvar1 - MWWarning_C_warn_unusedarg1 - MWWarning_C_warn_extracomma0 - MWWarning_C_pedantic0 - MWWarning_C_warningerrors0 - MWWarning_C_warn_hidevirtual0 - MWWarning_C_warn_implicitconv0 - MWWarning_C_warn_notinlined0 - MWWarning_C_warn_structclass0 - MWWarning_C_warn_missingreturn0 - MWWarning_C_warn_no_side_effect0 - MWWarning_C_warn_resultnotused0 - MWWarning_C_warn_padding0 - MWWarning_C_warn_impl_i2f_conv0 - MWWarning_C_warn_impl_f2i_conv0 - MWWarning_C_warn_impl_s2u_conv0 - MWWarning_C_warn_illtokenpasting0 - MWWarning_C_warn_filenamecaps0 - MWWarning_C_warn_filenamecapssystem0 - MWWarning_C_warn_undefmacro0 - MWWarning_C_warn_ptrintconv0 - - - MWMerge_MacOS_projectTypeApplication - MWMerge_MacOS_outputNameMerge Out - MWMerge_MacOS_outputCreator???? - MWMerge_MacOS_outputTypeAPPL - MWMerge_MacOS_suppressWarning0 - MWMerge_MacOS_copyFragments1 - MWMerge_MacOS_copyResources1 - MWMerge_MacOS_flattenResource0 - MWMerge_MacOS_flatFileNamea.rsrc - MWMerge_MacOS_flatFileOutputPath - Path: - PathFormatMacOS - PathRootProject - - MWMerge_MacOS_skipResources - DLGX - ckid - Proj - WSPC - - - - FileLockedfalse - ResourcesMapIsReadOnlyfalse - PrinterDriverIsMultiFinderCompatiblefalse - Invisiblefalse - HasBundlefalse - NameLockedfalse - Stationeryfalse - HasCustomIconfalse - Sharedfalse - HasBeenInitedfalse - Label0 - Comments - HasCustomBadgefalse - HasRoutingInfofalse - - - MWCodeGen_PPC_structalignmentPPC_mw - MWCodeGen_PPC_tracebacktablesNone - MWCodeGen_PPC_processorGeneric - MWCodeGen_PPC_function_align4 - MWCodeGen_PPC_tocdata1 - MWCodeGen_PPC_largetoc0 - MWCodeGen_PPC_profiler0 - MWCodeGen_PPC_vectortocdata0 - MWCodeGen_PPC_poolconst0 - MWCodeGen_PPC_peephole0 - MWCodeGen_PPC_readonlystrings0 - MWCodeGen_PPC_linkerpoolsstrings0 - MWCodeGen_PPC_volatileasm0 - MWCodeGen_PPC_schedule0 - MWCodeGen_PPC_altivec0 - MWCodeGen_PPC_altivec_move_block0 - MWCodeGen_PPC_strictIEEEfp0 - MWCodeGen_PPC_fpcontract1 - MWCodeGen_PPC_genfsel0 - MWCodeGen_PPC_orderedfpcmp0 - - - MWCodeGen_MachO_structalignmentPPC_mw - MWCodeGen_MachO_profiler_enumOff - MWCodeGen_MachO_processorGeneric - MWCodeGen_MachO_function_align4 - MWCodeGen_MachO_common0 - MWCodeGen_MachO_boolisint0 - MWCodeGen_MachO_peephole1 - MWCodeGen_MachO_readonlystrings0 - MWCodeGen_MachO_linkerpoolsstrings1 - MWCodeGen_MachO_volatileasm0 - MWCodeGen_MachO_schedule0 - MWCodeGen_MachO_altivec0 - MWCodeGen_MachO_vecmove0 - MWCodeGen_MachO_fp_ieee_strict0 - MWCodeGen_MachO_fpcontract1 - MWCodeGen_MachO_genfsel0 - MWCodeGen_MachO_fp_cmps_ordered0 - - - MWDisassembler_PPC_showcode1 - MWDisassembler_PPC_extended1 - MWDisassembler_PPC_mix0 - MWDisassembler_PPC_nohex0 - MWDisassembler_PPC_showdata1 - MWDisassembler_PPC_showexceptions1 - MWDisassembler_PPC_showsym0 - MWDisassembler_PPC_shownames1 - - - GlobalOptimizer_PPC_optimizationlevelLevel0 - GlobalOptimizer_PPC_optforSpeed - - - MWLinker_PPC_linksym1 - MWLinker_PPC_symfullpath1 - MWLinker_PPC_linkmap0 - MWLinker_PPC_nolinkwarnings0 - MWLinker_PPC_dontdeadstripinitcode0 - MWLinker_PPC_permitmultdefs0 - MWLinker_PPC_linkmodeFast - MWLinker_PPC_code_foldingNone - MWLinker_PPC_initname - MWLinker_PPC_mainname - MWLinker_PPC_termname - - - MWLinker_MacOSX_linksym1 - MWLinker_MacOSX_symfullpath0 - MWLinker_MacOSX_nolinkwarnings0 - MWLinker_MacOSX_linkmap0 - MWLinker_MacOSX_dontdeadstripinitcode0 - MWLinker_MacOSX_permitmultdefs0 - MWLinker_MacOSX_use_objectivec_semantics0 - MWLinker_MacOSX_strip_debug_symbols0 - MWLinker_MacOSX_split_segs0 - MWLinker_MacOSX_report_msl_overloads0 - MWLinker_MacOSX_objects_follow_linkorder0 - MWLinker_MacOSX_linkmodeNormal - MWLinker_MacOSX_exportsReferencedGlobals - MWLinker_MacOSX_sortcodeNone - MWLinker_MacOSX_mainname - MWLinker_MacOSX_initname - MWLinker_MacOSX_code_foldingNone - MWLinker_MacOSX_stabsgenNone - - - MWProject_MacOSX_typeExecutable - MWProject_MacOSX_outfile - MWProject_MacOSX_filecreator???? - MWProject_MacOSX_filetypeMEXE - MWProject_MacOSX_vmaddress4096 - MWProject_MacOSX_usedefaultvmaddr1 - MWProject_MacOSX_flatrsrc0 - MWProject_MacOSX_flatrsrcfilename - MWProject_MacOSX_flatrsrcoutputdir - Path: - PathFormatMacOS - PathRootProject - - MWProject_MacOSX_installpath./ - MWProject_MacOSX_dont_prebind0 - MWProject_MacOSX_flat_namespace0 - MWProject_MacOSX_frameworkversionA - MWProject_MacOSX_currentversion0 - MWProject_MacOSX_flat_oldimpversion0 - MWProject_MacOSX_AddrMode1 - - - MWPEF_exportsNone - MWPEF_libfolder0 - MWPEF_sortcodeNone - MWPEF_expandbss0 - MWPEF_sharedata0 - MWPEF_olddefversion0 - MWPEF_oldimpversion0 - MWPEF_currentversion0 - MWPEF_fragmentname - MWPEF_collapsereloads0 - - - MWProject_PPC_typeLibrary - MWProject_PPC_outfileFreeTypeLib - MWProject_PPC_filecreator???? - MWProject_PPC_filetype???? - MWProject_PPC_size0 - MWProject_PPC_minsize0 - MWProject_PPC_stacksize0 - MWProject_PPC_flags0 - MWProject_PPC_symfilename - MWProject_PPC_rsrcname - MWProject_PPC_rsrcheaderNative - MWProject_PPC_rsrctype???? - MWProject_PPC_rsrcid0 - MWProject_PPC_rsrcflags0 - MWProject_PPC_rsrcstore0 - MWProject_PPC_rsrcmerge0 - MWProject_PPC_flatrsrc0 - MWProject_PPC_flatrsrcoutputdir - Path: - PathFormatMacOS - PathRootProject - - MWProject_PPC_flatrsrcfilename - - - MWAssembler_PPC_auxheader0 - MWAssembler_PPC_symmodeMac - MWAssembler_PPC_dialectPPC - MWAssembler_PPC_prefixfile - MWAssembler_PPC_typecheck0 - MWAssembler_PPC_warnings0 - MWAssembler_PPC_casesensitive0 - - - PList_OutputTypeFile - PList_OutputEncodingUTF-8 - PList_PListVersion1.0 - PList_Prefix - PList_FileFilenameInfo.plist - PList_FileDirectory - Path: - PathFormatMacOS - PathRootProject - - PList_ResourceTypeplst - PList_ResourceID0 - PList_ResourceName - - - MWRez_Language_maxwidth80 - MWRez_Language_scriptRoman - MWRez_Language_alignmentAlign1 - MWRez_Language_filtermodeFilterSkip - MWRez_Language_suppresswarnings0 - MWRez_Language_escapecontrolchars1 - MWRez_Language_prefixname - MWRez_Language_filteredtypes'CODE' 'DATA' 'PICT' - - - - Name - ftsystem.c - MacOS - Text - Debug - - - Name - ftbase.c - MacOS - Text - Debug - - - Name - ftinit.c - MacOS - Text - Debug - - - Name - sfnt.c - MacOS - Text - Debug - - - Name - psnames.c - MacOS - Text - Debug - - - Name - ftdebug.c - MacOS - Text - Debug - - - Name - type1cid.c - MacOS - Text - Debug - - - Name - cff.c - MacOS - Text - Debug - - - Name - smooth.c - MacOS - Text - Debug - - - Name - winfnt.c - MacOS - Text - Debug - - - Name - truetype.c - MacOS - Text - Debug - - - Name - ftmac.c - MacOS - Text - Debug - - - Name - psaux.c - MacOS - Text - - - - Name - ftcache.c - MacOS - Text - - - - Name - ftglyph.c - MacOS - Text - - - - Name - type1.c - MacOS - Text - Debug - - - Name - pshinter.c - MacOS - Text - Debug - - - Name - pcf.c - MacOS - Text - Debug - - - Name - ftraster.c - MacOS - Text - Debug - - - Name - ftrend1.c - MacOS - Text - Debug - - - - - Name - ftsystem.c - MacOS - - - Name - ftbase.c - MacOS - - - Name - ftinit.c - MacOS - - - Name - sfnt.c - MacOS - - - Name - psnames.c - MacOS - - - Name - ftdebug.c - MacOS - - - Name - type1cid.c - MacOS - - - Name - cff.c - MacOS - - - Name - smooth.c - MacOS - - - Name - winfnt.c - MacOS - - - Name - truetype.c - MacOS - - - Name - ftmac.c - MacOS - - - Name - psaux.c - MacOS - - - Name - ftcache.c - MacOS - - - Name - ftglyph.c - MacOS - - - Name - type1.c - MacOS - - - Name - pshinter.c - MacOS - - - Name - pcf.c - MacOS - - - Name - ftraster.c - MacOS - - - Name - ftrend1.c - MacOS - - - - - - - FreeTypeLib - - - - base - - FreeTypeLib - Name - ftbase.c - MacOS - - - FreeTypeLib - Name - ftdebug.c - MacOS - - - FreeTypeLib - Name - ftglyph.c - MacOS - - - FreeTypeLib - Name - ftinit.c - MacOS - - - FreeTypeLib - Name - ftsystem.c - MacOS - - - FreeTypeLib - Name - ftmac.c - MacOS - - - ftmodules - - FreeTypeLib - Name - cff.c - MacOS - - - FreeTypeLib - Name - ftcache.c - MacOS - - - FreeTypeLib - Name - psaux.c - MacOS - - - FreeTypeLib - Name - psnames.c - MacOS - - - FreeTypeLib - Name - sfnt.c - MacOS - - - FreeTypeLib - Name - smooth.c - MacOS - - - FreeTypeLib - Name - truetype.c - MacOS - - - FreeTypeLib - Name - type1cid.c - MacOS - - - FreeTypeLib - Name - winfnt.c - MacOS - - - FreeTypeLib - Name - type1.c - MacOS - - - FreeTypeLib - Name - pshinter.c - MacOS - - - FreeTypeLib - Name - pcf.c - MacOS - - - FreeTypeLib - Name - ftraster.c - MacOS - - - FreeTypeLib - Name - ftrend1.c - MacOS - - - - - diff --git a/3party/freetype/builds/mac/ftmac.c b/3party/freetype/builds/mac/ftmac.c deleted file mode 100644 index 7e2f292d1b..0000000000 --- a/3party/freetype/builds/mac/ftmac.c +++ /dev/null @@ -1,1542 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmac.c */ -/* */ -/* Mac FOND support. Written by just@letterror.com. */ -/* Heavily Fixed by mpsuzuki, George Williams and Sean McBride */ -/* */ -/* Copyright 1996-2015 by */ -/* Just van Rossum, 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. */ -/* */ -/***************************************************************************/ - - - /* - Notes - - Mac suitcase files can (and often do!) contain multiple fonts. To - support this I use the face_index argument of FT_(Open|New)_Face() - functions, and pretend the suitcase file is a collection. - - Warning: fbit and NFNT bitmap resources are not supported yet. In old - sfnt fonts, bitmap glyph data for each size is stored in each `NFNT' - resources instead of the `bdat' table in the sfnt resource. Therefore, - face->num_fixed_sizes is set to 0, because bitmap data in `NFNT' - resource is unavailable at present. - - The Mac FOND support works roughly like this: - - - Check whether the offered stream points to a Mac suitcase file. This - is done by checking the file type: it has to be 'FFIL' or 'tfil'. The - stream that gets passed to our init_face() routine is a stdio stream, - which isn't usable for us, since the FOND resources live in the - resource fork. So we just grab the stream->pathname field. - - - Read the FOND resource into memory, then check whether there is a - TrueType font and/or(!) a Type 1 font available. - - - If there is a Type 1 font available (as a separate `LWFN' file), read - its data into memory, massage it slightly so it becomes PFB data, wrap - it into a memory stream, load the Type 1 driver and delegate the rest - of the work to it by calling FT_Open_Face(). (XXX TODO: after this - has been done, the kerning data from the FOND resource should be - appended to the face: On the Mac there are usually no AFM files - available. However, this is tricky since we need to map Mac char - codes to ps glyph names to glyph ID's...) - - - If there is a TrueType font (an `sfnt' resource), read it into memory, - wrap it into a memory stream, load the TrueType driver and delegate - the rest of the work to it, by calling FT_Open_Face(). - - - Some suitcase fonts (notably Onyx) might point the `LWFN' file to - itself, even though it doesn't contains `POST' resources. To handle - this special case without opening the file an extra time, we just - ignore errors from the `LWFN' and fallback to the `sfnt' if both are - available. - */ - - -#include -#include FT_FREETYPE_H -#include FT_TRUETYPE_TAGS_H -#include FT_INTERNAL_STREAM_H -#include "ftbase.h" - -#if defined( __GNUC__ ) || defined( __IBMC__ ) - /* This is for Mac OS X. Without redefinition, OS_INLINE */ - /* expands to `static inline' which doesn't survive the */ - /* -ansi compilation flag of GCC. */ -#if !HAVE_ANSI_OS_INLINE -#undef OS_INLINE -#define OS_INLINE static __inline__ -#endif -#include -#include -#include /* PATH_MAX */ -#else -#include -#include -#include -#include -#include -#include -#endif - -#ifndef PATH_MAX -#define PATH_MAX 1024 /* same with Mac OS X's syslimits.h */ -#endif - -#if defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO -#include -#endif - -#define FT_DEPRECATED_ATTRIBUTE - -#include FT_MAC_H - - /* undefine blocking-macros in ftmac.h */ -#undef FT_GetFile_From_Mac_Name -#undef FT_GetFile_From_Mac_ATS_Name -#undef FT_New_Face_From_FOND -#undef FT_New_Face_From_FSSpec -#undef FT_New_Face_From_FSRef - - - /* FSSpec functions are deprecated since Mac OS X 10.4 */ -#ifndef HAVE_FSSPEC -#if TARGET_API_MAC_OS8 || TARGET_API_MAC_CARBON -#define HAVE_FSSPEC 1 -#else -#define HAVE_FSSPEC 0 -#endif -#endif - - /* most FSRef functions were introduced since Mac OS 9 */ -#ifndef HAVE_FSREF -#if TARGET_API_MAC_OSX -#define HAVE_FSREF 1 -#else -#define HAVE_FSREF 0 -#endif -#endif - - /* QuickDraw is deprecated since Mac OS X 10.4 */ -#ifndef HAVE_QUICKDRAW_CARBON -#if TARGET_API_MAC_OS8 || TARGET_API_MAC_CARBON -#define HAVE_QUICKDRAW_CARBON 1 -#else -#define HAVE_QUICKDRAW_CARBON 0 -#endif -#endif - - /* AppleTypeService is available since Mac OS X */ -#ifndef HAVE_ATS -#if TARGET_API_MAC_OSX -#define HAVE_ATS 1 -#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */ -#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault -#endif -#else -#define HAVE_ATS 0 -#endif -#endif - - /* `configure' checks the availability of `ResourceIndex' strictly */ - /* and sets HAVE_TYPE_RESOURCE_INDEX to 1 or 0 always. If it is */ - /* not set (e.g., a build without `configure'), the availability */ - /* is guessed from the SDK version. */ -#ifndef HAVE_TYPE_RESOURCE_INDEX -#if !defined( MAC_OS_X_VERSION_10_5 ) || \ - ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 ) -#define HAVE_TYPE_RESOURCE_INDEX 0 -#else -#define HAVE_TYPE_RESOURCE_INDEX 1 -#endif -#endif /* !HAVE_TYPE_RESOURCE_INDEX */ - -#if ( HAVE_TYPE_RESOURCE_INDEX == 0 ) -typedef short ResourceIndex; -#endif - - /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over - TrueType in case *both* are available (this is not common, - but it *is* possible). */ -#ifndef PREFER_LWFN -#define PREFER_LWFN 1 -#endif - -#ifdef FT_MACINTOSH - -#if !HAVE_QUICKDRAW_CARBON /* QuickDraw is deprecated since Mac OS X 10.4 */ - - FT_EXPORT_DEF( FT_Error ) - FT_GetFile_From_Mac_Name( const char* fontName, - FSSpec* pathSpec, - FT_Long* face_index ) - { - FT_UNUSED( fontName ); - FT_UNUSED( pathSpec ); - FT_UNUSED( face_index ); - - return FT_THROW( Unimplemented_Feature ); - } - -#else - - FT_EXPORT_DEF( FT_Error ) - FT_GetFile_From_Mac_Name( const char* fontName, - FSSpec* pathSpec, - FT_Long* face_index ) - { - OptionBits options = kFMUseGlobalScopeOption; - - FMFontFamilyIterator famIter; - OSStatus status = FMCreateFontFamilyIterator( NULL, NULL, - options, - &famIter ); - FMFont the_font = 0; - FMFontFamily family = 0; - - - if ( !fontName || !face_index ) - return FT_THROW( Invalid_Argument ); - - *face_index = 0; - while ( status == 0 && !the_font ) - { - status = FMGetNextFontFamily( &famIter, &family ); - if ( status == 0 ) - { - int stat2; - FMFontFamilyInstanceIterator instIter; - Str255 famNameStr; - char famName[256]; - - - /* get the family name */ - FMGetFontFamilyName( family, famNameStr ); - CopyPascalStringToC( famNameStr, famName ); - - /* iterate through the styles */ - FMCreateFontFamilyInstanceIterator( family, &instIter ); - - *face_index = 0; - stat2 = 0; - - while ( stat2 == 0 && !the_font ) - { - FMFontStyle style; - FMFontSize size; - FMFont font; - - - stat2 = FMGetNextFontFamilyInstance( &instIter, &font, - &style, &size ); - if ( stat2 == 0 && size == 0 ) - { - char fullName[256]; - - - /* build up a complete face name */ - ft_strcpy( fullName, famName ); - if ( style & bold ) - ft_strcat( fullName, " Bold" ); - if ( style & italic ) - ft_strcat( fullName, " Italic" ); - - /* compare with the name we are looking for */ - if ( ft_strcmp( fullName, fontName ) == 0 ) - { - /* found it! */ - the_font = font; - } - else - ++(*face_index); - } - } - - FMDisposeFontFamilyInstanceIterator( &instIter ); - } - } - - FMDisposeFontFamilyIterator( &famIter ); - - if ( the_font ) - { - FMGetFontContainer( the_font, pathSpec ); - return FT_Err_Ok; - } - else - return FT_THROW( Unknown_File_Format ); - } - -#endif /* HAVE_QUICKDRAW_CARBON */ - - -#if HAVE_ATS - - /* Private function. */ - /* The FSSpec type has been discouraged for a long time, */ - /* unfortunately an FSRef replacement API for */ - /* ATSFontGetFileSpecification() is only available in */ - /* Mac OS X 10.5 and later. */ - static OSStatus - FT_ATSFontGetFileReference( ATSFontRef ats_font_id, - FSRef* ats_font_ref ) - { - OSStatus err; - -#if !defined( MAC_OS_X_VERSION_10_5 ) || \ - MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - FSSpec spec; - - - err = ATSFontGetFileSpecification( ats_font_id, &spec ); - if ( noErr == err ) - err = FSpMakeFSRef( &spec, ats_font_ref ); -#else - err = ATSFontGetFileReference( ats_font_id, ats_font_ref ); -#endif - - return err; - } - - - static FT_Error - FT_GetFileRef_From_Mac_ATS_Name( const char* fontName, - FSRef* ats_font_ref, - FT_Long* face_index ) - { - CFStringRef cf_fontName; - ATSFontRef ats_font_id; - - - *face_index = 0; - - cf_fontName = CFStringCreateWithCString( NULL, fontName, - kCFStringEncodingMacRoman ); - ats_font_id = ATSFontFindFromName( cf_fontName, - kATSOptionFlagsUnRestrictedScope ); - CFRelease( cf_fontName ); - - if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL ) - return FT_THROW( Unknown_File_Format ); - - if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) ) - return FT_THROW( Unknown_File_Format ); - - /* face_index calculation by searching preceding fontIDs */ - /* with same FSRef */ - { - ATSFontRef id2 = ats_font_id - 1; - FSRef ref2; - - - while ( id2 > 0 ) - { - if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) ) - break; - if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) ) - break; - - id2--; - } - *face_index = ats_font_id - ( id2 + 1 ); - } - - return FT_Err_Ok; - } - -#endif - -#if !HAVE_ATS - - FT_EXPORT_DEF( FT_Error ) - FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, - UInt8* path, - UInt32 maxPathSize, - FT_Long* face_index ) - { - FT_UNUSED( fontName ); - FT_UNUSED( path ); - FT_UNUSED( maxPathSize ); - FT_UNUSED( face_index ); - - return FT_THROW( Unimplemented_Feature ); - } - -#else - - FT_EXPORT_DEF( FT_Error ) - FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, - UInt8* path, - UInt32 maxPathSize, - FT_Long* face_index ) - { - FSRef ref; - FT_Error err; - - - err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); - if ( err ) - return err; - - if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) ) - return FT_THROW( Unknown_File_Format ); - - return FT_Err_Ok; - } - -#endif /* HAVE_ATS */ - - -#if !HAVE_FSSPEC || !HAVE_ATS - - FT_EXPORT_DEF( FT_Error ) - FT_GetFile_From_Mac_ATS_Name( const char* fontName, - FSSpec* pathSpec, - FT_Long* face_index ) - { - FT_UNUSED( fontName ); - FT_UNUSED( pathSpec ); - FT_UNUSED( face_index ); - - return FT_THROW( Unimplemented_Feature ); - } - -#else - - /* This function is deprecated because FSSpec is deprecated in Mac OS X. */ - FT_EXPORT_DEF( FT_Error ) - FT_GetFile_From_Mac_ATS_Name( const char* fontName, - FSSpec* pathSpec, - FT_Long* face_index ) - { - FSRef ref; - FT_Error err; - - - err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); - if ( err ) - return err; - - if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL, - pathSpec, NULL ) ) - return FT_THROW( Unknown_File_Format ); - - return FT_Err_Ok; - } - -#endif - - -#if defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO - -#define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer ) - - - FT_CALLBACK_DEF( void ) - ft_FSp_stream_close( FT_Stream stream ) - { - ft_fclose( STREAM_FILE( stream ) ); - - stream->descriptor.pointer = NULL; - stream->size = 0; - stream->base = 0; - } - - - FT_CALLBACK_DEF( unsigned long ) - ft_FSp_stream_io( FT_Stream stream, - unsigned long offset, - unsigned char* buffer, - unsigned long count ) - { - FT_FILE* file; - - - file = STREAM_FILE( stream ); - - ft_fseek( file, offset, SEEK_SET ); - - return (unsigned long)ft_fread( buffer, 1, count, file ); - } - -#endif /* __MWERKS__ && !TARGET_RT_MAC_MACHO */ - - -#if HAVE_FSSPEC && !HAVE_FSREF - - /* isDirectory is a dummy to synchronize API with FSPathMakeRef() */ - static OSErr - FT_FSPathMakeSpec( const UInt8* pathname, - FSSpec* spec_p, - Boolean isDirectory ) - { - const char *p, *q; - short vRefNum; - long dirID; - Str255 nodeName; - OSErr err; - FT_UNUSED( isDirectory ); - - - p = q = (const char *)pathname; - dirID = 0; - vRefNum = 0; - - while ( 1 ) - { - int len = ft_strlen( p ); - - - if ( len > 255 ) - len = 255; - - q = p + len; - - if ( q == p ) - return 0; - - if ( 255 < ft_strlen( (char *)pathname ) ) - { - while ( p < q && *q != ':' ) - q--; - } - - if ( p < q ) - *(char *)nodeName = q - p; - else if ( ft_strlen( p ) < 256 ) - *(char *)nodeName = ft_strlen( p ); - else - return errFSNameTooLong; - - ft_strncpy( (char *)nodeName + 1, (char *)p, *(char *)nodeName ); - err = FSMakeFSSpec( vRefNum, dirID, nodeName, spec_p ); - if ( err || '\0' == *q ) - return err; - - vRefNum = spec_p->vRefNum; - dirID = spec_p->parID; - - p = q; - } - } - - - static OSErr - FT_FSpMakePath( const FSSpec* spec_p, - UInt8* path, - UInt32 maxPathSize ) - { - OSErr err; - FSSpec spec = *spec_p; - short vRefNum; - long dirID; - Str255 parDir_name; - - - FT_MEM_SET( path, 0, maxPathSize ); - while ( 1 ) - { - int child_namelen = ft_strlen( (char *)path ); - unsigned char node_namelen = spec.name[0]; - unsigned char* node_name = spec.name + 1; - - - if ( node_namelen + child_namelen > maxPathSize ) - return errFSNameTooLong; - - FT_MEM_MOVE( path + node_namelen + 1, path, child_namelen ); - FT_MEM_COPY( path, node_name, node_namelen ); - if ( child_namelen > 0 ) - path[node_namelen] = ':'; - - vRefNum = spec.vRefNum; - dirID = spec.parID; - parDir_name[0] = '\0'; - err = FSMakeFSSpec( vRefNum, dirID, parDir_name, &spec ); - if ( noErr != err || dirID == spec.parID ) - break; - } - return noErr; - } - -#endif /* HAVE_FSSPEC && !HAVE_FSREF */ - - - static OSErr - FT_FSPathMakeRes( const UInt8* pathname, - ResFileRefNum* res ) - { - -#if HAVE_FSREF - - OSErr err; - FSRef ref; - - - if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) - return FT_THROW( Cannot_Open_Resource ); - - /* at present, no support for dfont format */ - err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res ); - if ( noErr == err ) - return err; - - /* fallback to original resource-fork font */ - *res = FSOpenResFile( &ref, fsRdPerm ); - err = ResError(); - -#else - - OSErr err; - FSSpec spec; - - - if ( noErr != FT_FSPathMakeSpec( pathname, &spec, FALSE ) ) - return FT_THROW( Cannot_Open_Resource ); - - /* at present, no support for dfont format without FSRef */ - /* (see above), try original resource-fork font */ - *res = FSpOpenResFile( &spec, fsRdPerm ); - err = ResError(); - -#endif /* HAVE_FSREF */ - - return err; - } - - - /* Return the file type for given pathname */ - static OSType - get_file_type_from_path( const UInt8* pathname ) - { - -#if HAVE_FSREF - - FSRef ref; - FSCatalogInfo info; - - - if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) - return ( OSType ) 0; - - if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info, - NULL, NULL, NULL ) ) - return ( OSType ) 0; - - return ((FInfo *)(info.finderInfo))->fdType; - -#else - - FSSpec spec; - FInfo finfo; - - - if ( noErr != FT_FSPathMakeSpec( pathname, &spec, FALSE ) ) - return ( OSType ) 0; - - if ( noErr != FSpGetFInfo( &spec, &finfo ) ) - return ( OSType ) 0; - - return finfo.fdType; - -#endif /* HAVE_FSREF */ - - } - - - /* Given a PostScript font name, create the Macintosh LWFN file name. */ - static void - create_lwfn_name( char* ps_name, - Str255 lwfn_file_name ) - { - int max = 5, count = 0; - FT_Byte* p = lwfn_file_name; - FT_Byte* q = (FT_Byte*)ps_name; - - - lwfn_file_name[0] = 0; - - while ( *q ) - { - if ( ft_isupper( *q ) ) - { - if ( count ) - max = 3; - count = 0; - } - if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) ) - { - *++p = *q; - lwfn_file_name[0]++; - count++; - } - q++; - } - } - - - static short - count_faces_sfnt( char* fond_data ) - { - /* The count is 1 greater than the value in the FOND. */ - /* Isn't that cute? :-) */ - - return EndianS16_BtoN( *( (short*)( fond_data + - sizeof ( FamRec ) ) ) ) + 1; - } - - - static short - count_faces_scalable( char* fond_data ) - { - AsscEntry* assoc; - short i, face, face_all; - - - face_all = EndianS16_BtoN( *( (short *)( fond_data + - sizeof ( FamRec ) ) ) ) + 1; - assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); - face = 0; - - for ( i = 0; i < face_all; i++ ) - { - if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) ) - face++; - } - return face; - } - - - /* Look inside the FOND data, answer whether there should be an SFNT - resource, and answer the name of a possible LWFN Type 1 file. - - Thanks to Paul Miller (paulm@profoundeffects.com) for the fix - to load a face OTHER than the first one in the FOND! - */ - - static void - parse_fond( char* fond_data, - short* have_sfnt, - ResID* sfnt_id, - Str255 lwfn_file_name, - short face_index ) - { - AsscEntry* assoc; - AsscEntry* base_assoc; - FamRec* fond; - - - *sfnt_id = 0; - *have_sfnt = 0; - lwfn_file_name[0] = 0; - - fond = (FamRec*)fond_data; - assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); - base_assoc = assoc; - - /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */ - if ( 47 < face_index ) - return; - - /* Let's do a little range checking before we get too excited here */ - if ( face_index < count_faces_sfnt( fond_data ) ) - { - assoc += face_index; /* add on the face_index! */ - - /* if the face at this index is not scalable, - fall back to the first one (old behavior) */ - if ( EndianS16_BtoN( assoc->fontSize ) == 0 ) - { - *have_sfnt = 1; - *sfnt_id = EndianS16_BtoN( assoc->fontID ); - } - else if ( base_assoc->fontSize == 0 ) - { - *have_sfnt = 1; - *sfnt_id = EndianS16_BtoN( base_assoc->fontID ); - } - } - - if ( EndianS32_BtoN( fond->ffStylOff ) ) - { - unsigned char* p = (unsigned char*)fond_data; - StyleTable* style; - unsigned short string_count; - char ps_name[256]; - unsigned char* names[64]; - int i; - - - p += EndianS32_BtoN( fond->ffStylOff ); - style = (StyleTable*)p; - p += sizeof ( StyleTable ); - string_count = EndianS16_BtoN( *(short*)(p) ); - p += sizeof ( short ); - - for ( i = 0; i < string_count && i < 64; i++ ) - { - names[i] = p; - p += names[i][0]; - p++; - } - - { - size_t ps_name_len = (size_t)names[0][0]; - - - if ( ps_name_len != 0 ) - { - ft_memcpy(ps_name, names[0] + 1, ps_name_len); - ps_name[ps_name_len] = 0; - } - if ( style->indexes[face_index] > 1 && - style->indexes[face_index] <= FT_MIN( string_count, 64 ) ) - { - unsigned char* suffixes = names[style->indexes[face_index] - 1]; - - - for ( i = 1; i <= suffixes[0]; i++ ) - { - unsigned char* s; - size_t j = suffixes[i] - 1; - - - if ( j < string_count && ( s = names[j] ) != NULL ) - { - size_t s_len = (size_t)s[0]; - - - if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) ) - { - ft_memcpy( ps_name + ps_name_len, s + 1, s_len ); - ps_name_len += s_len; - ps_name[ps_name_len] = 0; - } - } - } - } - } - - create_lwfn_name( ps_name, lwfn_file_name ); - } - } - - - static FT_Error - lookup_lwfn_by_fond( const UInt8* path_fond, - ConstStr255Param base_lwfn, - UInt8* path_lwfn, - int path_size ) - { - -#if HAVE_FSREF - - FSRef ref, par_ref; - int dirname_len; - - - /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */ - /* We should not extract parent directory by string manipulation. */ - - if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) ) - return FT_THROW( Invalid_Argument ); - - if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, - NULL, NULL, NULL, &par_ref ) ) - return FT_THROW( Invalid_Argument ); - - if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) ) - return FT_THROW( Invalid_Argument ); - - if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size ) - return FT_THROW( Invalid_Argument ); - - /* now we have absolute dirname in path_lwfn */ - if ( path_lwfn[0] == '/' ) - ft_strcat( (char *)path_lwfn, "/" ); - else - ft_strcat( (char *)path_lwfn, ":" ); - - dirname_len = ft_strlen( (char *)path_lwfn ); - ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 ); - path_lwfn[dirname_len + base_lwfn[0]] = '\0'; - - if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) ) - return FT_THROW( Cannot_Open_Resource ); - - if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, - NULL, NULL, NULL, NULL ) ) - return FT_THROW( Cannot_Open_Resource ); - - return FT_Err_Ok; - -#else - - int i; - FSSpec spec; - - - /* pathname for FSSpec is always HFS format */ - if ( ft_strlen( (char *)path_fond ) > path_size ) - return FT_THROW( Invalid_Argument ); - - ft_strcpy( (char *)path_lwfn, (char *)path_fond ); - - i = ft_strlen( (char *)path_lwfn ) - 1; - while ( i > 0 && ':' != path_lwfn[i] ) - i--; - - if ( i + 1 + base_lwfn[0] > path_size ) - return FT_THROW( Invalid_Argument ); - - if ( ':' == path_lwfn[i] ) - { - ft_strcpy( (char *)path_lwfn + i + 1, (char *)base_lwfn + 1 ); - path_lwfn[i + 1 + base_lwfn[0]] = '\0'; - } - else - { - ft_strcpy( (char *)path_lwfn, (char *)base_lwfn + 1 ); - path_lwfn[base_lwfn[0]] = '\0'; - } - - if ( noErr != FT_FSPathMakeSpec( path_lwfn, &spec, FALSE ) ) - return FT_THROW( Cannot_Open_Resource ); - - return FT_Err_Ok; - -#endif /* HAVE_FSREF */ - - } - - - static short - count_faces( Handle fond, - const UInt8* pathname ) - { - ResID sfnt_id; - short have_sfnt, have_lwfn; - Str255 lwfn_file_name; - UInt8 buff[PATH_MAX]; - FT_Error err; - short num_faces; - - - have_sfnt = have_lwfn = 0; - - HLock( fond ); - parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 ); - - if ( lwfn_file_name[0] ) - { - err = lookup_lwfn_by_fond( pathname, lwfn_file_name, - buff, sizeof ( buff ) ); - if ( FT_Err_Ok == err ) - have_lwfn = 1; - } - - if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) - num_faces = 1; - else - num_faces = count_faces_scalable( *fond ); - - HUnlock( fond ); - return num_faces; - } - - - /* Read Type 1 data from the POST resources inside the LWFN file, - return a PFB buffer. This is somewhat convoluted because the FT2 - PFB parser wants the ASCII header as one chunk, and the LWFN - chunks are often not organized that way, so we glue chunks - of the same type together. */ - static FT_Error - read_lwfn( FT_Memory memory, - ResFileRefNum res, - FT_Byte** pfb_data, - FT_ULong* size ) - { - FT_Error error = FT_Err_Ok; - ResID res_id; - unsigned char *buffer, *p, *size_p = NULL; - FT_ULong total_size = 0; - FT_ULong old_total_size = 0; - FT_ULong post_size, pfb_chunk_size; - Handle post_data; - char code, last_code; - - - UseResFile( res ); - - /* First pass: load all POST resources, and determine the size of */ - /* the output buffer. */ - res_id = 501; - last_code = -1; - - for (;;) - { - post_data = Get1Resource( TTAG_POST, res_id++ ); - if ( post_data == NULL ) - break; /* we are done */ - - code = (*post_data)[0]; - - if ( code != last_code ) - { - if ( code == 5 ) - total_size += 2; /* just the end code */ - else - total_size += 6; /* code + 4 bytes chunk length */ - } - - total_size += GetHandleSize( post_data ) - 2; - last_code = code; - - /* detect integer overflows */ - if ( total_size < old_total_size ) - { - error = FT_ERR( Array_Too_Large ); - goto Error; - } - - old_total_size = total_size; - } - - if ( FT_ALLOC( buffer, (FT_Long)total_size ) ) - goto Error; - - /* Second pass: append all POST data to the buffer, add PFB fields. */ - /* Glue all consecutive chunks of the same type together. */ - p = buffer; - res_id = 501; - last_code = -1; - pfb_chunk_size = 0; - - for (;;) - { - post_data = Get1Resource( TTAG_POST, res_id++ ); - if ( post_data == NULL ) - break; /* we are done */ - - post_size = (FT_ULong)GetHandleSize( post_data ) - 2; - code = (*post_data)[0]; - - if ( code != last_code ) - { - if ( last_code != -1 ) - { - /* we are done adding a chunk, fill in the size field */ - if ( size_p != NULL ) - { - *size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF ); - *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8 ) & 0xFF ); - *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF ); - *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF ); - } - pfb_chunk_size = 0; - } - - *p++ = 0x80; - if ( code == 5 ) - *p++ = 0x03; /* the end */ - else if ( code == 2 ) - *p++ = 0x02; /* binary segment */ - else - *p++ = 0x01; /* ASCII segment */ - - if ( code != 5 ) - { - size_p = p; /* save for later */ - p += 4; /* make space for size field */ - } - } - - ft_memcpy( p, *post_data + 2, post_size ); - pfb_chunk_size += post_size; - p += post_size; - last_code = code; - } - - *pfb_data = buffer; - *size = total_size; - - Error: - CloseResFile( res ); - return error; - } - - - /* Create a new FT_Face from a file spec to an LWFN file. */ - static FT_Error - FT_New_Face_From_LWFN( FT_Library library, - const UInt8* pathname, - FT_Long face_index, - FT_Face* aface ) - { - FT_Byte* pfb_data; - FT_ULong pfb_size; - FT_Error error; - ResFileRefNum res; - - - if ( noErr != FT_FSPathMakeRes( pathname, &res ) ) - return FT_THROW( Cannot_Open_Resource ); - - pfb_data = NULL; - pfb_size = 0; - error = read_lwfn( library->memory, res, &pfb_data, &pfb_size ); - CloseResFile( res ); /* PFB is already loaded, useless anymore */ - if ( error ) - return error; - - return open_face_from_buffer( library, - pfb_data, - pfb_size, - face_index, - "type1", - aface ); - } - - - /* Create a new FT_Face from an SFNT resource, specified by res ID. */ - static FT_Error - FT_New_Face_From_SFNT( FT_Library library, - ResID sfnt_id, - FT_Long face_index, - FT_Face* aface ) - { - Handle sfnt = NULL; - FT_Byte* sfnt_data; - size_t sfnt_size; - FT_Error error = FT_Err_Ok; - FT_Memory memory = library->memory; - int is_cff, is_sfnt_ps; - - - sfnt = GetResource( TTAG_sfnt, sfnt_id ); - if ( sfnt == NULL ) - return FT_THROW( Invalid_Handle ); - - sfnt_size = (FT_ULong)GetHandleSize( sfnt ); - if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) ) - { - ReleaseResource( sfnt ); - return error; - } - - HLock( sfnt ); - ft_memcpy( sfnt_data, *sfnt, sfnt_size ); - HUnlock( sfnt ); - ReleaseResource( sfnt ); - - is_cff = sfnt_size > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); - is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, "typ1", 4 ); - - if ( is_sfnt_ps ) - { - FT_Stream stream; - - - if ( FT_NEW( stream ) ) - goto Try_OpenType; - - FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size ); - if ( !open_face_PS_from_sfnt_stream( library, - stream, - face_index, - 0, NULL, - aface ) ) - { - FT_Stream_Close( stream ); - FT_FREE( stream ); - FT_FREE( sfnt_data ); - goto Exit; - } - - FT_FREE( stream ); - } - Try_OpenType: - error = open_face_from_buffer( library, - sfnt_data, - sfnt_size, - face_index, - is_cff ? "cff" : "truetype", - aface ); - Exit: - return error; - } - - - /* Create a new FT_Face from a file spec to a suitcase file. */ - static FT_Error - FT_New_Face_From_Suitcase( FT_Library library, - const UInt8* pathname, - FT_Long face_index, - FT_Face* aface ) - { - FT_Error error = FT_ERR( Cannot_Open_Resource ); - ResFileRefNum res_ref; - ResourceIndex res_index; - Handle fond; - short num_faces_in_res; - - - if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) ) - return FT_THROW( Cannot_Open_Resource ); - - UseResFile( res_ref ); - if ( ResError() ) - return FT_THROW( Cannot_Open_Resource ); - - num_faces_in_res = 0; - for ( res_index = 1; ; ++res_index ) - { - short num_faces_in_fond; - - - fond = Get1IndResource( TTAG_FOND, res_index ); - if ( ResError() ) - break; - - num_faces_in_fond = count_faces( fond, pathname ); - num_faces_in_res += num_faces_in_fond; - - if ( 0 <= face_index && face_index < num_faces_in_fond && error ) - error = FT_New_Face_From_FOND( library, fond, face_index, aface ); - - face_index -= num_faces_in_fond; - } - - CloseResFile( res_ref ); - if ( FT_Err_Ok == error && NULL != aface ) - (*aface)->num_faces = num_faces_in_res; - return error; - } - - - /* documentation is in ftmac.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_New_Face_From_FOND( FT_Library library, - Handle fond, - FT_Long face_index, - FT_Face* aface ) - { - short have_sfnt, have_lwfn = 0; - ResID sfnt_id, fond_id; - OSType fond_type; - Str255 fond_name; - Str255 lwfn_file_name; - UInt8 path_lwfn[PATH_MAX]; - OSErr err; - FT_Error error = FT_Err_Ok; - - - /* test for valid `aface' and `library' delayed to */ - /* `FT_New_Face_From_XXX' */ - - GetResInfo( fond, &fond_id, &fond_type, fond_name ); - if ( ResError() != noErr || fond_type != TTAG_FOND ) - return FT_THROW( Invalid_File_Format ); - - HLock( fond ); - parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index ); - HUnlock( fond ); - - if ( lwfn_file_name[0] ) - { - ResFileRefNum res; - - - res = HomeResFile( fond ); - if ( noErr != ResError() ) - goto found_no_lwfn_file; - -#if HAVE_FSREF - - { - UInt8 path_fond[PATH_MAX]; - FSRef ref; - - - err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum, - NULL, NULL, NULL, &ref, NULL ); - if ( noErr != err ) - goto found_no_lwfn_file; - - err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) ); - if ( noErr != err ) - goto found_no_lwfn_file; - - error = lookup_lwfn_by_fond( path_fond, lwfn_file_name, - path_lwfn, sizeof ( path_lwfn ) ); - if ( FT_Err_Ok == error ) - have_lwfn = 1; - } - -#elif HAVE_FSSPEC - - { - UInt8 path_fond[PATH_MAX]; - FCBPBRec pb; - Str255 fond_file_name; - FSSpec spec; - - - FT_MEM_SET( &spec, 0, sizeof ( FSSpec ) ); - FT_MEM_SET( &pb, 0, sizeof ( FCBPBRec ) ); - - pb.ioNamePtr = fond_file_name; - pb.ioVRefNum = 0; - pb.ioRefNum = res; - pb.ioFCBIndx = 0; - - err = PBGetFCBInfoSync( &pb ); - if ( noErr != err ) - goto found_no_lwfn_file; - - err = FSMakeFSSpec( pb.ioFCBVRefNum, pb.ioFCBParID, - fond_file_name, &spec ); - if ( noErr != err ) - goto found_no_lwfn_file; - - err = FT_FSpMakePath( &spec, path_fond, sizeof ( path_fond ) ); - if ( noErr != err ) - goto found_no_lwfn_file; - - error = lookup_lwfn_by_fond( path_fond, lwfn_file_name, - path_lwfn, sizeof ( path_lwfn ) ); - if ( FT_Err_Ok == error ) - have_lwfn = 1; - } - -#endif /* HAVE_FSREF, HAVE_FSSPEC */ - - } - - if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) - error = FT_New_Face_From_LWFN( library, - path_lwfn, - face_index, - aface ); - else - error = FT_ERR( Unknown_File_Format ); - - found_no_lwfn_file: - if ( have_sfnt && FT_Err_Ok != error ) - error = FT_New_Face_From_SFNT( library, - sfnt_id, - face_index, - aface ); - - return error; - } - - - /* Common function to load a new FT_Face from a resource file. */ - static FT_Error - FT_New_Face_From_Resource( FT_Library library, - const UInt8* pathname, - FT_Long face_index, - FT_Face* aface ) - { - OSType file_type; - FT_Error error; - - - /* LWFN is a (very) specific file format, check for it explicitly */ - file_type = get_file_type_from_path( pathname ); - if ( file_type == TTAG_LWFN ) - return FT_New_Face_From_LWFN( library, pathname, face_index, aface ); - - /* Otherwise the file type doesn't matter (there are more than */ - /* `FFIL' and `tfil'). Just try opening it as a font suitcase; */ - /* if it works, fine. */ - - error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface ); - if ( error == 0 ) - return error; - - /* let it fall through to normal loader (.ttf, .otf, etc.); */ - /* we signal this by returning no error and no FT_Face */ - *aface = NULL; - return 0; - } - - - /*************************************************************************/ - /* */ - /* */ - /* FT_New_Face */ - /* */ - /* */ - /* This is the Mac-specific implementation of FT_New_Face. In */ - /* addition to the standard FT_New_Face() functionality, it also */ - /* accepts pathnames to Mac suitcase files. For further */ - /* documentation see the original FT_New_Face() in freetype.h. */ - /* */ - FT_EXPORT_DEF( FT_Error ) - FT_New_Face( FT_Library library, - const char* pathname, - FT_Long face_index, - FT_Face* aface ) - { - FT_Open_Args args; - FT_Error error; - - - /* test for valid `library' and `aface' delayed to FT_Open_Face() */ - if ( !pathname ) - return FT_THROW( Invalid_Argument ); - - *aface = NULL; - - /* try resourcefork based font: LWFN, FFIL */ - error = FT_New_Face_From_Resource( library, (UInt8 *)pathname, - face_index, aface ); - if ( error != 0 || *aface != NULL ) - return error; - - /* let it fall through to normal loader (.ttf, .otf, etc.) */ - args.flags = FT_OPEN_PATHNAME; - args.pathname = (char*)pathname; - return FT_Open_Face( library, &args, face_index, aface ); - } - - - /*************************************************************************/ - /* */ - /* */ - /* FT_New_Face_From_FSRef */ - /* */ - /* */ - /* FT_New_Face_From_FSRef is identical to FT_New_Face except it */ - /* accepts an FSRef instead of a path. */ - /* */ - /* This function is deprecated because Carbon data types (FSRef) */ - /* are not cross-platform, and thus not suitable for the freetype API. */ - FT_EXPORT_DEF( FT_Error ) - FT_New_Face_From_FSRef( FT_Library library, - const FSRef* ref, - FT_Long face_index, - FT_Face* aface ) - { - -#if !HAVE_FSREF - - FT_UNUSED( library ); - FT_UNUSED( ref ); - FT_UNUSED( face_index ); - FT_UNUSED( aface ); - - return FT_THROW( Unimplemented_Feature ); - -#else - - FT_Error error; - FT_Open_Args args; - OSErr err; - UInt8 pathname[PATH_MAX]; - - - /* test for valid `library' and `aface' delayed to `FT_Open_Face' */ - - if ( !ref ) - return FT_THROW( Invalid_Argument ); - - err = FSRefMakePath( ref, pathname, sizeof ( pathname ) ); - if ( err ) - error = FT_ERR( Cannot_Open_Resource ); - - error = FT_New_Face_From_Resource( library, pathname, face_index, aface ); - if ( error != 0 || *aface != NULL ) - return error; - - /* fallback to datafork font */ - args.flags = FT_OPEN_PATHNAME; - args.pathname = (char*)pathname; - return FT_Open_Face( library, &args, face_index, aface ); - -#endif /* HAVE_FSREF */ - - } - - - /*************************************************************************/ - /* */ - /* */ - /* FT_New_Face_From_FSSpec */ - /* */ - /* */ - /* FT_New_Face_From_FSSpec is identical to FT_New_Face except it */ - /* accepts an FSSpec instead of a path. */ - /* */ - /* This function is deprecated because Carbon data types (FSSpec) */ - /* are not cross-platform, and thus not suitable for the freetype API. */ - FT_EXPORT_DEF( FT_Error ) - FT_New_Face_From_FSSpec( FT_Library library, - const FSSpec* spec, - FT_Long face_index, - FT_Face* aface ) - { - -#if HAVE_FSREF - - FSRef ref; - - - if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr ) - return FT_THROW( Invalid_Argument ); - else - return FT_New_Face_From_FSRef( library, &ref, face_index, aface ); - -#elif HAVE_FSSPEC - - FT_Error error; - FT_Open_Args args; - OSErr err; - UInt8 pathname[PATH_MAX]; - - - if ( !spec ) - return FT_THROW( Invalid_Argument ); - - err = FT_FSpMakePath( spec, pathname, sizeof ( pathname ) ); - if ( err ) - error = FT_ERR( Cannot_Open_Resource ); - - error = FT_New_Face_From_Resource( library, pathname, face_index, aface ); - if ( error != 0 || *aface != NULL ) - return error; - - /* fallback to datafork font */ - args.flags = FT_OPEN_PATHNAME; - args.pathname = (char*)pathname; - return FT_Open_Face( library, &args, face_index, aface ); - -#else - - FT_UNUSED( library ); - FT_UNUSED( spec ); - FT_UNUSED( face_index ); - FT_UNUSED( aface ); - - return FT_THROW( Unimplemented_Feature ); - -#endif /* HAVE_FSREF, HAVE_FSSPEC */ - - } - -#endif /* FT_MACINTOSH */ - - -/* END */ diff --git a/3party/freetype/builds/modules.mk b/3party/freetype/builds/modules.mk deleted file mode 100644 index 0b8b0c1ffd..0000000000 --- a/3party/freetype/builds/modules.mk +++ /dev/null @@ -1,79 +0,0 @@ -# -# FreeType 2 modules sub-Makefile -# - - -# Copyright 1996-2015 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. - - -# DO NOT INVOKE THIS MAKEFILE DIRECTLY! IT IS MEANT TO BE INCLUDED BY -# OTHER MAKEFILES. - - -# This file is in charge of handling the generation of the modules list -# file. - - -# Build the modules list. -# -$(FTMODULE_H): $(MODULES_CFG) - $(FTMODULE_H_INIT) - $(FTMODULE_H_CREATE) - $(FTMODULE_H_DONE) - -ifneq ($(findstring $(PLATFORM),dos windows os2),) - OPEN_MODULE := @echo$(space) - CLOSE_MODULE := >> $(subst /,$(SEP),$(FTMODULE_H)) - REMOVE_MODULE := @-$(DELETE) $(subst /,$(SEP),$(FTMODULE_H)) -else - OPEN_MODULE := @echo " - CLOSE_MODULE := " >> $(FTMODULE_H) - REMOVE_MODULE := @-$(DELETE) $(FTMODULE_H) -endif - - -define FTMODULE_H_INIT -$(REMOVE_MODULE) -@-echo Generating modules list in $(FTMODULE_H)... -$(OPEN_MODULE)/* This is a generated file. */$(CLOSE_MODULE) -endef - -# It is no mistake that the final closing parenthesis is on the -# next line -- it produces proper newlines during the expansion -# of `foreach'. -# -define FTMODULE_H_CREATE -$(foreach COMMAND,$(FTMODULE_H_COMMANDS),$($(COMMAND)) -) -endef - -define FTMODULE_H_DONE -$(OPEN_MODULE)/* EOF */$(CLOSE_MODULE) -@echo done. -endef - - -# $(OPEN_DRIVER) & $(CLOSE_DRIVER) are used to specify a given font driver -# in the `module.mk' rules file. -# -OPEN_DRIVER := $(OPEN_MODULE)FT_USE_MODULE( -CLOSE_DRIVER := )$(CLOSE_MODULE) - -ECHO_DRIVER := @echo "* module:$(space) -ECHO_DRIVER_DESC := ( -ECHO_DRIVER_DONE := )" - -# Each `module.mk' in the `src/*' subdirectories adds a variable with -# commands to $(FTMODULE_H_COMMANDS). Note that we can't use SRC_DIR here. -# --include $(patsubst %,$(TOP_DIR)/src/%/module.mk,$(MODULES)) - - -# EOF diff --git a/3party/freetype/builds/newline b/3party/freetype/builds/newline deleted file mode 100644 index 8b13789179..0000000000 --- a/3party/freetype/builds/newline +++ /dev/null @@ -1 +0,0 @@ - diff --git a/3party/freetype/builds/os2/detect.mk b/3party/freetype/builds/os2/detect.mk deleted file mode 100644 index fde9327433..0000000000 --- a/3party/freetype/builds/os2/detect.mk +++ /dev/null @@ -1,73 +0,0 @@ -# -# FreeType 2 configuration file to detect an OS/2 host platform. -# - - -# Copyright 1996-2015 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. - - -.PHONY: setup - - -ifeq ($(PLATFORM),ansi) - - ifdef OS2_SHELL - - PLATFORM := os2 - - endif # test OS2_SHELL -endif - -ifeq ($(PLATFORM),os2) - - COPY := copy - DELETE := del - CAT := type - SEP := $(BACKSLASH) - - # gcc-emx by default - CONFIG_FILE := os2-gcc.mk - - # additionally, we provide hooks for various other compilers - # - ifneq ($(findstring visualage,$(MAKECMDGOALS)),) # Visual Age C++ - CONFIG_FILE := os2-icc.mk - CC := icc - visualage: setup - .PHONY: visualage - endif - - ifneq ($(findstring watcom,$(MAKECMDGOALS)),) # Watcom C/C++ - CONFIG_FILE := os2-wat.mk - CC := wcc386 - watcom: setup - .PHONY: watcom - endif - - ifneq ($(findstring borlandc,$(MAKECMDGOALS)),) # Borland C++ 32-bit - CONFIG_FILE := os2-bcc.mk - CC := bcc32 - borlandc: setup - .PHONY: borlandc - endif - - ifneq ($(findstring devel,$(MAKECMDGOALS)),) # development target - CONFIG_FILE := os2-dev.mk - CC := gcc - devel: setup - .PHONY: devel - endif - - setup: dos_setup - -endif # test PLATFORM os2 - - -# EOF diff --git a/3party/freetype/builds/os2/os2-def.mk b/3party/freetype/builds/os2/os2-def.mk deleted file mode 100644 index 691036f1d6..0000000000 --- a/3party/freetype/builds/os2/os2-def.mk +++ /dev/null @@ -1,44 +0,0 @@ -# -# FreeType 2 OS/2 specific definitions -# - - -# Copyright 1996-2015 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. - - -DELETE := del -CAT := type -SEP := $(strip \ ) -BUILD_DIR := $(TOP_DIR)/builds/os2 -PLATFORM := os2 - -# The executable file extension (for tools), *with* leading dot. -# -E := .exe - -# The directory where all library files are placed. -# -# By default, this is the same as $(OBJ_DIR); however, this can be changed -# to suit particular needs. -# -LIB_DIR := $(OBJ_DIR) - -# The name of the final library file. Note that the DOS-specific Makefile -# uses a shorter (8.3) name. -# -LIBRARY := $(PROJECT) - - -# The NO_OUTPUT macro is used to ignore the output of commands. -# -NO_OUTPUT = 2> nul - - -# EOF diff --git a/3party/freetype/builds/os2/os2-dev.mk b/3party/freetype/builds/os2/os2-dev.mk deleted file mode 100644 index eacf58f8a3..0000000000 --- a/3party/freetype/builds/os2/os2-dev.mk +++ /dev/null @@ -1,30 +0,0 @@ -# -# FreeType 2 configuration rules for OS/2 + GCC -# -# Development version without optimizations. -# - - -# Copyright 1996-2015 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. - - -DEVEL_DIR := $(TOP_DIR)/devel - -# include OS/2-specific definitions -include $(TOP_DIR)/builds/os2/os2-def.mk - -# include gcc-specific definitions -include $(TOP_DIR)/builds/compiler/gcc-dev.mk - -# include linking instructions -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/os2/os2-gcc.mk b/3party/freetype/builds/os2/os2-gcc.mk deleted file mode 100644 index 8390a36fea..0000000000 --- a/3party/freetype/builds/os2/os2-gcc.mk +++ /dev/null @@ -1,26 +0,0 @@ -# -# FreeType 2 configuration rules for the OS/2 + gcc -# - - -# Copyright 1996-2015 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 OS/2-specific definitions -include $(TOP_DIR)/builds/os2/os2-def.mk - -# include gcc-specific definitions -include $(TOP_DIR)/builds/compiler/gcc.mk - -# include linking instructions -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/toplevel.mk b/3party/freetype/builds/toplevel.mk deleted file mode 100644 index 243c113304..0000000000 --- a/3party/freetype/builds/toplevel.mk +++ /dev/null @@ -1,276 +0,0 @@ -# -# FreeType build system -- top-level sub-Makefile -# - - -# Copyright 1996-2015 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. - - -# This file is designed for GNU Make, do not use it with another Make tool! -# -# It works as follows: -# -# - When invoked for the first time, this Makefile includes the rules found -# in `PROJECT/builds/detect.mk'. They are in charge of detecting the -# current platform. -# -# A summary of the detection is displayed, and the file `config.mk' is -# created in the current directory. -# -# - When invoked later, this Makefile includes the rules found in -# `config.mk'. This sub-Makefile defines some system-specific variables -# (like compiler, compilation flags, object suffix, etc.), then includes -# the rules found in `PROJECT/builds/PROJECT.mk', used to build the -# library. -# -# See the comments in `builds/detect.mk' and `builds/PROJECT.mk' for more -# details on host platform detection and library builds. - - -# First of all, check whether we have `$(value ...)'. We do this by testing -# for `$(eval ...)' which has been introduced in the same GNU make version. - -eval_available := -$(eval eval_available := T) -ifneq ($(eval_available),T) - $(error FreeType's build system needs a Make program which supports $$(value)) -endif - - -.PHONY: all dist distclean modules setup - - -# The `space' variable is used to avoid trailing spaces in defining the -# `T' variable later. -# -empty := -space := $(empty) $(empty) - - -# The main configuration file, defining the `XXX_MODULES' variables. We -# prefer a `modules.cfg' file in OBJ_DIR over TOP_DIR. -# -ifndef MODULES_CFG - MODULES_CFG := $(TOP_DIR)/modules.cfg - ifneq ($(wildcard $(OBJ_DIR)/modules.cfg),) - MODULES_CFG := $(OBJ_DIR)/modules.cfg - endif -endif - - -# FTMODULE_H, as its name suggests, indicates where the FreeType module -# class file resides. -# -FTMODULE_H ?= $(OBJ_DIR)/ftmodule.h - - -include $(MODULES_CFG) - - -# The list of modules we are using. -# -MODULES := $(FONT_MODULES) \ - $(HINTING_MODULES) \ - $(RASTER_MODULES) \ - $(AUX_MODULES) - - -CONFIG_MK ?= config.mk - -# If no configuration sub-makefile is present, or if `setup' is the target -# to be built, run the auto-detection rules to figure out which -# configuration rules file to use. -# -# Note that the configuration file is put in the current directory, which is -# not necessarily $(TOP_DIR). - -# If `config.mk' is not present, set `check_platform'. -# -ifeq ($(wildcard $(CONFIG_MK)),) - check_platform := 1 -endif - -# If `setup' is one of the targets requested, set `check_platform'. -# -ifneq ($(findstring setup,$(MAKECMDGOALS)),) - check_platform := 1 -endif - -# Include the automatic host platform detection rules when we need to -# check the platform. -# -ifdef check_platform - - all modules: setup - - include $(TOP_DIR)/builds/detect.mk - - # This rule makes sense for Unix only to remove files created by a run of - # the configure script which hasn't been successful (so that no - # `config.mk' has been created). It uses the built-in $(RM) command of - # GNU make. Similarly, `nul' is created if e.g. `make setup windows' has - # been erroneously used. - # - # Note: This test is duplicated in `builds/unix/detect.mk'. - # - is_unix := $(strip $(wildcard /sbin/init) \ - $(wildcard /usr/sbin/init) \ - $(wildcard /dev/null) \ - $(wildcard /hurd/auth)) - ifneq ($(is_unix),) - - distclean: - $(RM) builds/unix/config.cache - $(RM) builds/unix/config.log - $(RM) builds/unix/config.status - $(RM) builds/unix/unix-def.mk - $(RM) builds/unix/unix-cc.mk - $(RM) builds/unix/freetype2.pc - $(RM) nul - - endif # test is_unix - - # IMPORTANT: - # - # `setup' must be defined by the host platform detection rules to create - # the `config.mk' file in the current directory. - -else - - # A configuration sub-Makefile is present -- simply run it. - # - all: single - - BUILD_PROJECT := yes - include $(CONFIG_MK) - -endif # test check_platform - - -# We always need the list of modules in ftmodule.h. -# -all setup: $(FTMODULE_H) - - -# The `modules' target unconditionally rebuilds the module list. -# -modules: - $(FTMODULE_H_INIT) - $(FTMODULE_H_CREATE) - $(FTMODULE_H_DONE) - -include $(TOP_DIR)/builds/modules.mk - - -# get FreeType version string, using a -# poor man's `sed' emulation with make's built-in string functions -# -work := $(strip $(shell $(CAT) $(TOP_DIR)/include/freetype/freetype.h)) -work := $(subst |,x,$(work)) -work := $(subst $(space),|,$(work)) -work := $(subst \#define|FREETYPE_MAJOR|,$(space),$(work)) -work := $(word 2,$(work)) -major := $(subst |,$(space),$(work)) -major := $(firstword $(major)) - -work := $(subst \#define|FREETYPE_MINOR|,$(space),$(work)) -work := $(word 2,$(work)) -minor := $(subst |,$(space),$(work)) -minor := $(firstword $(minor)) - -work := $(subst \#define|FREETYPE_PATCH|,$(space),$(work)) -work := $(word 2,$(work)) -patch := $(subst |,$(space),$(work)) -patch := $(firstword $(patch)) - -ifneq ($(findstring x0x,x$(patch)x),) - version := $(major).$(minor) - winversion := $(major)$(minor) -else - version := $(major).$(minor).$(patch) - winversion := $(major)$(minor)$(patch) -endif - - -# This target builds the tarballs. -# -# Not to be run by a normal user -- there are no attempts to make it -# generic. - -dist: - -rm -rf tmp - rm -f freetype-$(version).tar.gz - rm -f freetype-$(version).tar.bz2 - rm -f ft$(winversion).zip - - for d in `find . -wholename '*/.git' -prune \ - -o -type f \ - -o -print` ; do \ - mkdir -p tmp/$$d ; \ - done ; - - currdir=`pwd` ; \ - for f in `find . -wholename '*/.git' -prune \ - -o -name .gitignore \ - -o -name .mailmap \ - -o -type d \ - -o -print` ; do \ - ln -s $$currdir/$$f tmp/$$f ; \ - done - - @# Prevent generation of .pyc files. Python follows (soft) links if - @# the link's directory is write protected, so we have temporarily - @# disable write access here too. - chmod -w src/tools/docmaker - - cd tmp ; \ - $(MAKE) devel ; \ - $(MAKE) do-dist - - chmod +w src/tools/docmaker - - mv tmp freetype-$(version) - - tar -H ustar -chf - freetype-$(version) \ - | gzip -9 -c > freetype-$(version).tar.gz - tar -H ustar -chf - freetype-$(version) \ - | bzip2 -c > freetype-$(version).tar.bz2 - - @# Use CR/LF for zip files. - zip -lr9 ft$(winversion).zip freetype-$(version) - - rm -fr freetype-$(version) - - -# The locations of the latest `config.guess' and `config.sub' versions (from -# GNU `config' git repository), relative to the `tmp' directory used during -# `make dist'. -# -CONFIG_GUESS = ~/git/config/config.guess -CONFIG_SUB = ~/git/config/config.sub - - -# Don't say `make do-dist'. Always use `make dist' instead. -# -.PHONY: do-dist - -do-dist: distclean refdoc - @# Without removing the files, `autoconf' and friends follow links. - rm -f builds/unix/aclocal.m4 - rm -f builds/unix/configure.ac - rm -f builds/unix/configure - - sh autogen.sh - rm -rf builds/unix/autom4te.cache - - cp $(CONFIG_GUESS) builds/unix - cp $(CONFIG_SUB) builds/unix - -# EOF diff --git a/3party/freetype/builds/unix/configure.raw b/3party/freetype/builds/unix/configure.raw deleted file mode 100644 index 7768564017..0000000000 --- a/3party/freetype/builds/unix/configure.raw +++ /dev/null @@ -1,1016 +0,0 @@ -# This file is part of the FreeType project. -# -# Process this file with autoconf to produce a configure script. -# -# Copyright 2001-2015 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. - -AC_INIT([FreeType], [@VERSION@], [freetype@nongnu.org], [freetype]) -AC_CONFIG_SRCDIR([ftconfig.in]) - - -# Don't forget to update docs/VERSION.DLL! - -version_info='18:0:12' -AC_SUBST([version_info]) -ft_version=`echo $version_info | tr : .` -AC_SUBST([ft_version]) - - -# checks for system type - -AC_CANONICAL_HOST - - -# checks for programs - -AC_PROG_CC -AC_PROG_CPP -AC_SUBST(EXEEXT) - -PKG_PROG_PKG_CONFIG([0.24]) - -LT_INIT(win32-dll) - - -# checks for native programs to generate building tool - -if test ${cross_compiling} = yes; then - AC_CHECK_PROG(CC_BUILD, ${build}-gcc, ${build}-gcc) - test -z "${CC_BUILD}" && AC_CHECK_PROG(CC_BUILD, gcc, gcc) - test -z "${CC_BUILD}" && AC_CHECK_PROG(CC_BUILD, cc, cc, , , /usr/ucb/cc) - test -z "${CC_BUILD}" && AC_MSG_ERROR([cannot find native C compiler]) - - AC_MSG_CHECKING([for suffix of native executables]) - rm -f a.* b.* a_out.exe conftest.* - echo > conftest.c "int main() { return 0;}" - ${CC_BUILD} conftest.c || AC_MSG_ERROR([native C compiler is not working]) - rm -f conftest.c - if test -x a.out -o -x b.out -o -x conftest; then - EXEEXT_BUILD="" - elif test -x a_out.exe -o -x conftest.exe; then - EXEEXT_BUILD=".exe" - elif test -x conftest.*; then - EXEEXT_BUILD=`echo conftest.* | sed -n '1s/^.*\././'` - fi - rm -f a.* b.* a_out.exe conftest.* - AC_MSG_RESULT($EXEEXT_BUILD) -else - CC_BUILD=${CC} - EXEEXT_BUILD=${EXEEXT} -fi - -AC_SUBST(CC_BUILD) -AC_SUBST(EXEEXT_BUILD) - - -# Since this file will be finally moved to another directory we make -# the path of the install script absolute. This small code snippet has -# been taken from automake's `ylwrap' script. - -AC_PROG_INSTALL -case "$INSTALL" in -/*) - ;; -*/*) - INSTALL="`pwd`/$INSTALL" - ;; -esac - - -# checks for header files - -AC_HEADER_STDC -AC_CHECK_HEADERS([fcntl.h unistd.h]) - - -# checks for typedefs, structures, and compiler characteristics - -AC_C_CONST -AC_CHECK_SIZEOF([int]) -AC_CHECK_SIZEOF([long]) - - -# check whether cpp computation of size of int and long in ftconfig.in works - -AC_MSG_CHECKING([whether cpp computation of bit length in ftconfig.in works]) -orig_CPPFLAGS="${CPPFLAGS}" -CPPFLAGS="-I${srcdir} -I. ${CPPFLAGS}" - -ac_clean_files= -for f in ft2build.h ftoption.h ftstdlib.h; do - if test ! -f $f; then - ac_clean_files="$ac_clean_files $f" - touch $f - fi -done - -cat > conftest.c <<\_ACEOF -#include -#define FT_CONFIG_OPTIONS_H "ftoption.h" -#define FT_CONFIG_STANDARD_LIBRARY_H "ftstdlib.h" -#define FT_UINT_MAX UINT_MAX -#define FT_ULONG_MAX ULONG_MAX -#include "ftconfig.in" -_ACEOF -echo >> conftest.c "#if FT_SIZEOF_INT == "${ac_cv_sizeof_int} -echo >> conftest.c "ac_cpp_ft_sizeof_int="${ac_cv_sizeof_int} -echo >> conftest.c "#endif" -echo >> conftest.c "#if FT_SIZEOF_LONG == "${ac_cv_sizeof_long} -echo >> conftest.c "ac_cpp_ft_sizeof_long="${ac_cv_sizeof_long} -echo >> conftest.c "#endif" - -${CPP} ${CPPFLAGS} conftest.c | ${GREP} ac_cpp_ft > conftest.sh -eval `cat conftest.sh` -rm -f conftest.* $ac_clean_files - -if test x != "x${ac_cpp_ft_sizeof_int}" \ - -a x != x"${ac_cpp_ft_sizeof_long}"; then - unset ft_use_autoconf_sizeof_types -else - ft_use_autoconf_sizeof_types=yes -fi - -AC_ARG_ENABLE(biarch-config, -[ --enable-biarch-config install biarch ftconfig.h to support multiple - architectures by single file], [], []) - -case :${ft_use_autoconf_sizeof_types}:${enable_biarch_config}: in - :yes:yes:) - AC_MSG_RESULT([broken but use it]) - unset ft_use_autoconf_sizeof_types - ;; - ::no:) - AC_MSG_RESULT([works but ignore it]) - ft_use_autoconf_sizeof_types=yes - ;; - ::yes: | :::) - AC_MSG_RESULT([yes]) - unset ft_use_autoconf_sizeof_types - ;; - *) - AC_MSG_RESULT([no]) - ft_use_autoconf_sizeof_types=yes - ;; -esac - -if test x"${ft_use_autoconf_sizeof_types}" = xyes; then - AC_DEFINE([FT_USE_AUTOCONF_SIZEOF_TYPES], [], - [Define if autoconf sizeof types should be used.]) -fi - -CPPFLAGS="${orig_CPPFLAGS}" - - -# checks for library functions - -# Here we check whether we can use our mmap file component. - -AC_ARG_ENABLE([mmap], - AS_HELP_STRING([--disable-mmap], - [do not check mmap() and do not use]), - [enable_mmap="no"],[enable_mmap="yes"]) -if test "x${enable_mmap}" != "xno"; then - AC_FUNC_MMAP -fi -if test "x${enable_mmap}" = "xno" \ - -o "$ac_cv_func_mmap_fixed_mapped" != "yes"; then - FTSYS_SRC='$(BASE_DIR)/ftsystem.c' -else - FTSYS_SRC='$(BUILD_DIR)/ftsystem.c' - - AC_CHECK_DECLS([munmap], - [], - [], - [ - -#ifdef HAVE_UNISTD_H -#include -#endif -#include - - ]) - - FT_MUNMAP_PARAM -fi -AC_SUBST([FTSYS_SRC]) - -AC_CHECK_FUNCS([memcpy memmove]) - - -# get compiler flags right -# -# We try to make the compiler work for C89-strict source. Even if the -# C compiler is gcc and C89 flags are available, some system headers -# (e.g., Android Bionic libc) are broken in C89 mode. We have to check -# whether the compilation finishes successfully. -# -# Due to bugs in mingwrt 4.0.3 we don't use `-ansi' for MinGW. -# -# To avoid zillions of -# -# ISO C90 does not support 'long long' -# -# warnings, we disable `-pedantic' for gcc version < 4.6. -# -if test "x$GCC" = xyes; then - XX_CFLAGS="-Wall" - case "$host" in - *-*-mingw*) - XX_ANSIFLAGS="-pedantic" - ;; - *) - GCC_VERSION=`$CC -dumpversion` - GCC_MAJOR=`echo "$GCC_VERSION" | sed 's/\([[^.]][[^.]]*\).*/\1/'` - GCC_MINOR=`echo "$GCC_VERSION" | sed 's/[[^.]][[^.]]*.\([[^.]][[^.]]*\).*/\1/'` - - XX_PEDANTIC=-pedantic - if test $GCC_MAJOR -lt 4; then - XX_PEDANTIC= - else - if test $GCC_MAJOR -eq 4 -a $GCC_MINOR -lt 6; then - XX_PEDANTIC= - fi - fi - - XX_ANSIFLAGS="" - for a in $XX_PEDANTIC -ansi - do - AC_MSG_CHECKING([gcc compiler flag ${a} to assure ANSI C works correctly]) - orig_CFLAGS="${CFLAGS}" - CFLAGS="${CFLAGS} ${XX_ANSIFLAGS} ${a}" - AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM([ - -#include - - ], - [ - - { - puts( "" ); - return 0; - } - - ])], - [AC_MSG_RESULT([ok, add it to XX_ANSIFLAGS]) - XX_ANSIFLAGS="${XX_ANSIFLAGS} ${a}" - ], - [AC_MSG_RESULT([no])]) - CFLAGS="${orig_CFLAGS}" - done - ;; - esac -else - case "$host" in - *-dec-osf*) - CFLAGS= - XX_CFLAGS="-std1 -g3" - XX_ANSIFLAGS= - ;; - *) - XX_CFLAGS= - XX_ANSIFLAGS= - ;; - esac -fi -AC_SUBST([XX_CFLAGS]) -AC_SUBST([XX_ANSIFLAGS]) - - -# All library tests below try `pkg-config' first. If that fails, a function -# from the library is tested in the traditional autoconf way (zlib, bzip2), -# or a config script is called (libpng). -# -# The `xxx_reqpriv' variables are for the `Requires.private' field in -# `freetype2.pc'. The `xxx_libspriv' variables are for the `Libs.private' -# field in `freetype2.pc' if pkg-config doesn't find a proper .pc file. -# -# The `xxx_libsstaticconf' variables are for the `freetype-config' script. -# -# Note that a call to PKG_CHECK_MODULES(XXX, ...) sets and creates the -# output variables `XXX_CFLAGS' and `XXX_LIBS'. In case one or both are set -# for a library by the user, no entry for this library is added to -# `Requires.private'. Instead, it gets added to `Libs.private' - - -# check for system zlib - -AC_ARG_WITH([zlib], - [AS_HELP_STRING([--with-zlib=@<:@yes|no|auto@:>@], - [use system zlib instead of internal library @<:@default=auto@:>@])], - [], [with_zlib=auto]) - -have_zlib=no -if test x"$with_zlib" = xyes -o x"$with_zlib" = xauto; then - zlib_pkg="zlib" - have_zlib_pkg=no - - if test x"$ZLIB_CFLAGS" = x -a x"$ZLIB_LIBS" = x; then - PKG_CHECK_EXISTS([$zlib_pkg], [have_zlib_pkg=yes]) - fi - PKG_CHECK_MODULES([ZLIB], [$zlib_pkg], - [have_zlib="yes (pkg-config)"], [:]) - - if test $have_zlib_pkg = yes; then - # we have zlib.pc - zlib_reqpriv="$zlib_pkg" - zlib_libspriv= - zlib_libsstaticconf=`$PKG_CONFIG --static --libs "$zlib_pkg"` - else - zlib_reqpriv= - - if test "$have_zlib" != no; then - # ZLIB_CFLAGS and ZLIB_LIBS are set by the user - zlib_libspriv="$ZLIB_LIBS" - zlib_libsstaticconf="$ZLIB_LIBS" - have_zlib="yes (ZLIB_CFLAGS and ZLIB_LIBS)" - else - # fall back to standard autoconf test - AC_CHECK_LIB([z], - [gzsetparams], - [AC_CHECK_HEADER([zlib.h], - [have_zlib="yes (autoconf test)" - zlib_libspriv="-lz" - zlib_libsstaticconf="$zlib_libspriv" - ZLIB_LIBS="$zlib_libspriv"])]) - fi - fi -fi - -if test x"$with_zlib" = xyes -a "$have_zlib" = no; then - AC_MSG_ERROR([external zlib support requested but library not found]) -fi - - -# check for system libbz2 - -AC_ARG_WITH([bzip2], - [AS_HELP_STRING([--with-bzip2=@<:@yes|no|auto@:>@], - [support bzip2 compressed fonts @<:@default=auto@:>@])], - [], [with_bzip2=auto]) - -have_bzip2=no -if test x"$with_bzip2" = xyes -o x"$with_bzip2" = xauto; then - bzip2_pkg="bzip2" - have_bzip2_pkg=no - - if test x"$BZIP2_CFLAGS" = x -a x"$BZIP2_LIBS" = x; then - PKG_CHECK_EXISTS([$bzip2_pkg], [have_bzip2_pkg=yes]) - fi - PKG_CHECK_MODULES([BZIP2], [$bzip2_pkg], - [have_bzip2="yes (pkg-config)"], [:]) - - if test $have_bzip2_pkg = yes; then - # we have bzip2.pc - bzip2_reqpriv="$bzip2_pkg" - bzip2_libspriv= - bzip2_libsstaticconf=`$PKG_CONFIG --static --libs "$bzip2_pkg"` - else - bzip2_reqpriv= - - if test "$have_bzip2" != no; then - # BZIP2_CFLAGS and BZIP2_LIBS are set by the user - bzip2_libspriv="$BZIP2_LIBS" - bzip2_libsstaticconf="$BZIP2_LIBS" - have_bzip2="yes (BZIP2_CFLAGS and BZIP2_LIBS)" - else - # fall back to standard autoconf test - AC_CHECK_LIB([bz2], - [BZ2_bzDecompress], - [AC_CHECK_HEADER([bzlib.h], - [have_bzip2="yes (autoconf test)" - bzip2_libspriv="-lbz2" - bzip2_libsstaticconf="$bzip2_libspriv" - BZIP2_LIBS="$bzip2_libspriv"])]) - fi - fi -fi - -if test x"$with_bzip2" = xyes -a "$have_bzip2" = no; then - AC_MSG_ERROR([bzip2 support requested but library not found]) -fi - - -# check for system libpng - -AC_ARG_WITH([png], - [AS_HELP_STRING([--with-png=@<:@yes|no|auto@:>@], - [support png compressed OpenType embedded bitmaps @<:@default=auto@:>@])], - [], [with_png=auto]) - -have_libpng=no -if test x"$with_png" = xyes -o x"$with_png" = xauto; then - libpng_pkg="libpng" - have_libpng_pkg=no - - if test x"$LIBPNG_CFLAGS" = x -a x"$LIBPNG_LIBS" = x; then - PKG_CHECK_EXISTS([$libpng_pkg], [have_libpng_pkg=yes]) - fi - PKG_CHECK_MODULES([LIBPNG], [$libpng_pkg], - [have_libpng="yes (pkg-config)"], [:]) - - if test $have_libpng_pkg = yes; then - # we have libpng.pc - libpng_reqpriv="$libpng_pkg" - libpng_libspriv= - libpng_libsstaticconf=`$PKG_CONFIG --static --libs "$libpng_pkg"` - else - libpng_reqpriv= - - if test "$have_libpng" != no; then - # LIBPNG_CFLAGS and LIBPNG_LIBS are set by the user - libpng_libspriv="$LIBPNG_LIBS" - libpng_libsstaticconf="$LIBPNG_LIBS" - have_libpng="yes (LIBPNG_CFLAGS and LIBPNG_LIBS)" - else - # fall back to config script. - AC_MSG_CHECKING([for libpng-config]) - if which libpng-config > /dev/null 2>&1; then - LIBPNG_CFLAGS=`libpng-config --cflags` - LIBPNG_LIBS=`libpng-config --ldflags` - libpng_libspriv=`libpng-config --static --ldflags` - libpng_libsstaticconf="$libpng_libspriv" - have_libpng="yes (libpng-config)" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - fi - fi -fi - -if test x"$with_png" = xyes -a "$have_libpng" = no; then - AC_MSG_ERROR([libpng support requested but library not found]) -fi - - -# check for system libharfbuzz - -AC_ARG_WITH([harfbuzz], - [AS_HELP_STRING([--with-harfbuzz=@<:@yes|no|auto@:>@], - [improve auto-hinting of OpenType fonts @<:@default=auto@:>@])], - [], [with_harfbuzz=auto]) - -have_harfbuzz=no -if test x"$with_harfbuzz" = xyes -o x"$with_harfbuzz" = xauto; then - harfbuzz_pkg="harfbuzz >= 0.9.19" - have_harfbuzz_pkg=no - - if test x"$HARFBUZZ_CFLAGS" = x -a x"$HARFBUZZ_LIBS" = x; then - PKG_CHECK_EXISTS([$harfbuzz_pkg], [have_harfbuzz_pkg=yes]) - fi - PKG_CHECK_MODULES([HARFBUZZ], [$harfbuzz_pkg], - [have_harfbuzz="yes (pkg-config)"], [:]) - - if test $have_harfbuzz_pkg = yes; then - # we have harfbuzz.pc - harfbuzz_reqpriv="$harfbuzz_pkg" - harfbuzz_libspriv= - harfbuzz_libsstaticconf=`$PKG_CONFIG --static --libs "$harfbuzz_pkg"` - else - harfbuzz_reqpriv= - - if test "$have_harfbuzz" != no; then - # HARFBUZZ_CFLAGS and HARFBUZZ_LIBS are set by the user - harfbuzz_libspriv="$HARFBUZZ_LIBS" - harfbuzz_libsstaticconf="$HARFBUZZ_LIBS" - have_harfbuzz="yes (HARFBUZZ_CFLAGS and HARFBUZZ_LIBS)" - else - # since HarfBuzz is quite a new library we don't fall back to a - # different test; additionally, it has too many dependencies - : - fi - fi -fi - -if test x"$with_harfbuzz" = xyes -a "$have_harfbuzz" = no; then - AC_MSG_ERROR([harfbuzz support requested but library not found]) -fi - - -# Some options handling SDKs/archs in CFLAGS should be copied -# to LDFLAGS. Apple TechNote 2137 recommends to include these -# options in CFLAGS but not in LDFLAGS. - -save_config_args=$* -set dummy ${CFLAGS} -i=1 -while test $i -le $# -do - c=$1 - - case "${c}" in - -isysroot|-arch) # options taking 1 argument - a=$2 - AC_MSG_CHECKING([whether CFLAGS and LDFLAGS share ${c} ${a}]) - if expr " ${LDFLAGS} " : ".* ${c} *${a}.*" > /dev/null - then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no, copy to LDFLAGS]) - LDFLAGS="${LDFLAGS} ${c} ${a}" - fi - shift 1 - ;; - -m32|-m64|-march=*|-mcpu=*) # options taking no argument - AC_MSG_CHECKING([whether CFLAGS and LDFLAGS share ${c}]) - if expr " ${LDFLAGS} " : ".* ${c} *${a}.*" > /dev/null - then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no, copy to LDFLAGS]) - LDFLAGS="${LDFLAGS} ${c}" - fi - ;; - # *) - # AC_MSG_RESULT([${c} is not copied to LDFLAGS]) - # ;; - esac - - shift 1 -done -set ${save_config_args} - - -# Whether to use Mac OS resource-based fonts. - -ftmac_c="" # src/base/ftmac.c should not be included in makefiles by default - -AC_ARG_WITH([old-mac-fonts], - AS_HELP_STRING([--with-old-mac-fonts], - [allow Mac resource-based fonts to be used])) -if test x$with_old_mac_fonts = xyes; then - orig_LDFLAGS="${LDFLAGS}" - AC_MSG_CHECKING([CoreServices & ApplicationServices of Mac OS X]) - ft2_extra_libs="-Wl,-framework,CoreServices -Wl,-framework,ApplicationServices" - LDFLAGS="$LDFLAGS $ft2_extra_libs" - AC_LINK_IFELSE([ - AC_LANG_PROGRAM([ - -#if defined(__GNUC__) && defined(__APPLE_CC__) -# include -# include -#else -# include -# include -#endif - - ], - [ - - short res = 0; - - - UseResFile( res ); - - ])], - [AC_MSG_RESULT([ok]) - ftmac_c='ftmac.c' - AC_MSG_CHECKING([whether OS_INLINE macro is ANSI compatible]) - orig_CFLAGS="$CFLAGS -DFT_MACINTOSH" - CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" - AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM([ - -#if defined(__GNUC__) && defined(__APPLE_CC__) -# include -# include -#else -# include -# include -#endif - - ], - [ - - /* OSHostByteOrder() is typed as OS_INLINE */ - int32_t os_byte_order = OSHostByteOrder(); - - - if ( OSBigEndian != os_byte_order ) - return 1; - - ])], - [AC_MSG_RESULT([ok]) - CFLAGS="$orig_CFLAGS" - CFLAGS="$CFLAGS -DHAVE_ANSI_OS_INLINE=1" - ], - [AC_MSG_RESULT([no, ANSI incompatible]) - CFLAGS="$orig_CFLAGS" - ]) - AC_MSG_CHECKING([type ResourceIndex]) - orig_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" - AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM([ - -#if defined(__GNUC__) && defined(__APPLE_CC__) -# include -# include -#else -# include -# include -# include -#endif - - ], - [ - - ResourceIndex i = 0; - return i; - - ])], - [AC_MSG_RESULT([ok]) - CFLAGS="$orig_CFLAGS" - CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=1" - ], - [AC_MSG_RESULT([no]) - CFLAGS="$orig_CFLAGS" - CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=0" - ])], - [AC_MSG_RESULT([not found]) - ft2_extra_libs="" - LDFLAGS="${orig_LDFLAGS}" - CFLAGS="$CFLAGS -DDARWIN_NO_CARBON"]) -else - case x$host_os in - xdarwin*) - dnl AC_MSG_WARN([host system is MacOS but configured to build without Carbon]) - CFLAGS="$CFLAGS -DDARWIN_NO_CARBON" - ;; - *) - ;; - esac -fi - - -# Whether to use FileManager, which is deprecated since Mac OS X 10.4. - -AC_ARG_WITH([fsspec], - AS_HELP_STRING([--with-fsspec], - [use obsolete FSSpec API of MacOS, if available (default=yes)])) -if test x$with_fsspec = xno; then - CFLAGS="$CFLAGS -DHAVE_FSSPEC=0" -elif test x$with_old_mac_fonts = xyes -a x$with_fsspec != x; then - AC_MSG_CHECKING([FSSpec-based FileManager]) - AC_LINK_IFELSE([ - AC_LANG_PROGRAM([ - -#if defined(__GNUC__) && defined(__APPLE_CC__) -# include -# include -#else -# include -# include -#endif - - ], - [ - - FCBPBPtr paramBlock; - short vRefNum; - long dirID; - ConstStr255Param fileName; - FSSpec* spec; - - - /* FSSpec functions: deprecated since Mac OS X 10.4 */ - PBGetFCBInfoSync( paramBlock ); - FSMakeFSSpec( vRefNum, dirID, fileName, spec ); - - ])], - [AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_FSSPEC=1"], - [AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_FSSPEC=0"]) -fi - - -# Whether to use FileManager in Carbon since MacOS 9.x. - -AC_ARG_WITH([fsref], - AS_HELP_STRING([--with-fsref], - [use Carbon FSRef API of MacOS, if available (default=yes)])) -if test x$with_fsref = xno; then - AC_MSG_WARN([ -*** WARNING - FreeType2 built without FSRef API cannot load - data-fork fonts on MacOS, except of XXX.dfont. - ]) - CFLAGS="$CFLAGS -DHAVE_FSREF=0" -elif test x$with_old_mac_fonts = xyes -a x$with_fsref != x; then - AC_MSG_CHECKING([FSRef-based FileManager]) - AC_LINK_IFELSE([ - AC_LANG_PROGRAM([ - -#if defined(__GNUC__) && defined(__APPLE_CC__) -# include -# include -#else -# include -# include -#endif - - ], - [ - - short vRefNum; - long dirID; - ConstStr255Param fileName; - - Boolean* isDirectory; - UInt8* path; - SInt16 desiredRefNum; - SInt16* iterator; - SInt16* actualRefNum; - HFSUniStr255* outForkName; - FSVolumeRefNum volume; - FSCatalogInfoBitmap whichInfo; - FSCatalogInfo* catalogInfo; - FSForkInfo* forkInfo; - FSRef* ref; - -#if HAVE_FSSPEC - FSSpec* spec; -#endif - - /* FSRef functions: no need to check? */ - FSGetForkCBInfo( desiredRefNum, volume, iterator, - actualRefNum, forkInfo, ref, - outForkName ); - FSPathMakeRef( path, ref, isDirectory ); - -#if HAVE_FSSPEC - FSpMakeFSRef ( spec, ref ); - FSGetCatalogInfo( ref, whichInfo, catalogInfo, - outForkName, spec, ref ); -#endif - ])], - [AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_FSREF=1"], - [AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_FSREF=0"]) -fi - - -# Whether to use QuickDraw API in ToolBox, which is deprecated since -# Mac OS X 10.4. - -AC_ARG_WITH([quickdraw-toolbox], - AS_HELP_STRING([--with-quickdraw-toolbox], - [use MacOS QuickDraw in ToolBox, if available (default=yes)])) -if test x$with_quickdraw_toolbox = xno; then - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0" -elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_toolbox != x; then - AC_MSG_CHECKING([QuickDraw FontManager functions in ToolBox]) - AC_LINK_IFELSE([ - AC_LANG_PROGRAM([ - -#if defined(__GNUC__) && defined(__APPLE_CC__) -# include -# include -#else -# include -# include -#endif - - ], - [ - - Str255 familyName; - SInt16 familyID = 0; - FMInput* fmIn = NULL; - FMOutput* fmOut = NULL; - - - GetFontName( familyID, familyName ); - GetFNum( familyName, &familyID ); - fmOut = FMSwapFont( fmIn ); - - ])], - [AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=1"], - [AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0"]) -fi - - -# Whether to use QuickDraw API in Carbon, which is deprecated since -# Mac OS X 10.4. - -AC_ARG_WITH([quickdraw-carbon], - AS_HELP_STRING([--with-quickdraw-carbon], - [use MacOS QuickDraw in Carbon, if available (default=yes)])) -if test x$with_quickdraw_carbon = xno; then - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0" -elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_carbon != x; then - AC_MSG_CHECKING([QuickDraw FontManager functions in Carbon]) - AC_LINK_IFELSE([ - AC_LANG_PROGRAM([ - -#if defined(__GNUC__) && defined(__APPLE_CC__) -# include -# include -#else -# include -# include -#endif - - ], - [ - - FMFontFamilyIterator famIter; - FMFontFamily family; - Str255 famNameStr; - FMFontFamilyInstanceIterator instIter; - FMFontStyle style; - FMFontSize size; - FMFont font; - FSSpec* pathSpec; - - - FMCreateFontFamilyIterator( NULL, NULL, kFMUseGlobalScopeOption, - &famIter ); - FMGetNextFontFamily( &famIter, &family ); - FMGetFontFamilyName( family, famNameStr ); - FMCreateFontFamilyInstanceIterator( family, &instIter ); - FMGetNextFontFamilyInstance( &instIter, &font, &style, &size ); - FMDisposeFontFamilyInstanceIterator( &instIter ); - FMDisposeFontFamilyIterator( &famIter ); - FMGetFontContainer( font, pathSpec ); - - ])], - [AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=1"], - [AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0"]) -fi - - -# Whether to use AppleTypeService since Mac OS X. - -AC_ARG_WITH([ats], - AS_HELP_STRING([--with-ats], - [use AppleTypeService, if available (default=yes)])) -if test x$with_ats = xno; then - CFLAGS="$CFLAGS -DHAVE_ATS=0" -elif test x$with_old_mac_fonts = xyes -a x$with_ats != x; then - AC_MSG_CHECKING([AppleTypeService functions]) - AC_LINK_IFELSE([ - AC_LANG_PROGRAM([ - -#if defined(__GNUC__) && defined(__APPLE_CC__) -# include -# include -#else -# include -# include -#endif - - ], - [ - - FSSpec* pathSpec; - - - ATSFontFindFromName( NULL, kATSOptionFlagsUnRestrictedScope ); -#if HAVE_FSSPEC - ATSFontGetFileSpecification( 0, pathSpec ); -#endif - - ])], - [AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_ATS=1"], - [AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_ATS=0"]) -fi - -case "$CFLAGS" in - *HAVE_FSSPEC* | *HAVE_FSREF* | *HAVE_QUICKDRAW* | *HAVE_ATS* ) - AC_MSG_WARN([ -*** WARNING - FSSpec/FSRef/QuickDraw/ATS options are explicitly given, - thus it is recommended to replace src/base/ftmac.c by builds/mac/ftmac.c. - ]) - CFLAGS="$CFLAGS "'-I$(TOP_DIR)/builds/mac/' - ;; - *) - ;; -esac - - -# entries in Requires.private are separated by commas; -REQUIRES_PRIVATE="$zlib_reqpriv, \ - $bzip2_reqpriv, \ - $libpng_reqpriv, \ - $harfbuzz_reqpriv" -# beautify -REQUIRES_PRIVATE=`echo "$REQUIRES_PRIVATE" \ - | sed -e 's/^ *//' \ - -e 's/ *$//' \ - -e 's/, */,/g' \ - -e 's/,,*/,/g' \ - -e 's/^,*//' \ - -e 's/,*$//' \ - -e 's/,/, /g'` - -LIBS_PRIVATE="$zlib_libspriv \ - $bzip2_libspriv \ - $libpng_libspriv \ - $harfbuzz_libspriv \ - $ft2_extra_libs" -# beautify -LIBS_PRIVATE=`echo "$LIBS_PRIVATE" \ - | sed -e 's/^ *//' \ - -e 's/ *$//' \ - -e 's/ */ /g'` - -LIBSSTATIC_CONFIG="-lfreetype \ - $zlib_libsstaticconf \ - $bzip2_libsstaticconf \ - $libpng_libsstaticconf \ - $harfbuzz_libsstaticconf \ - $ft2_extra_libs" -# remove -L/usr/lib and -L/usr/lib64 since `freetype-config' adds them later -# on if necessary; also beautify -LIBSSTATIC_CONFIG=`echo "$LIBSSTATIC_CONFIG" \ - | sed -e 's|-L */usr/lib64/* | |g' \ - -e 's|-L */usr/lib/* | |g' \ - -e 's/^ *//' \ - -e 's/ *$//' \ - -e 's/ */ /g'` - - -AC_SUBST([ftmac_c]) -AC_SUBST([REQUIRES_PRIVATE]) -AC_SUBST([LIBS_PRIVATE]) -AC_SUBST([LIBSSTATIC_CONFIG]) - -AC_SUBST([hardcode_libdir_flag_spec]) -AC_SUBST([wl]) -AC_SUBST([build_libtool_libs]) - - -# changing LDFLAGS value should only be done after -# lt_cv_prog_compiler_static_works test - -if test "$have_zlib" != no; then - CFLAGS="$CFLAGS $ZLIB_CFLAGS -DFT_CONFIG_OPTION_SYSTEM_ZLIB" - LDFLAGS="$LDFLAGS $ZLIB_LIBS" -fi - -if test "$have_bzip2" != no; then - CFLAGS="$CFLAGS $BZIP2_CFLAGS -DFT_CONFIG_OPTION_USE_BZIP2" - LDFLAGS="$LDFLAGS $BZIP2_LIBS" -fi -if test "$have_libpng" != no; then - CFLAGS="$CFLAGS $LIBPNG_CFLAGS -DFT_CONFIG_OPTION_USE_PNG" - LDFLAGS="$LDFLAGS $LIBPNG_LIBS" -fi -if test "$have_harfbuzz" != no; then - CFLAGS="$CFLAGS $HARFBUZZ_CFLAGS -DFT_CONFIG_OPTION_USE_HARFBUZZ" - LDFLAGS="$LDFLAGS $HARFBUZZ_LIBS" -fi - -AC_SUBST([CFLAGS]) -AC_SUBST([LDFLAGS]) - -# configuration file -- stay in 8.3 limit -# -# since #undef doesn't survive in configuration header files we replace -# `/undef' with `#undef' after creating the output file - -AC_CONFIG_HEADERS([ftconfig.h:ftconfig.in], - [mv ftconfig.h ftconfig.tmp - sed 's|/undef|#undef|' < ftconfig.tmp > ftconfig.h - rm ftconfig.tmp]) - -# create the Unix-specific sub-Makefiles `builds/unix/unix-def.mk' -# and `builds/unix/unix-cc.mk' that will be used by the build system -# -AC_CONFIG_FILES([unix-cc.mk:unix-cc.in - unix-def.mk:unix-def.in]) - -# re-generate the Jamfile to use libtool now -# -# AC_CONFIG_FILES([../../Jamfile:../../Jamfile.in]) - -AC_OUTPUT - -AC_MSG_NOTICE([ - -Library configuration: - external zlib: $have_zlib - bzip2: $have_bzip2 - libpng: $have_libpng - harfbuzz: $have_harfbuzz -]) - -# end of configure.raw diff --git a/3party/freetype/builds/unix/detect.mk b/3party/freetype/builds/unix/detect.mk deleted file mode 100644 index 025ed491d4..0000000000 --- a/3party/freetype/builds/unix/detect.mk +++ /dev/null @@ -1,93 +0,0 @@ -# -# FreeType 2 configuration file to detect a UNIX host platform. -# - - -# Copyright 1996-2015 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. - -.PHONY: setup - -ifeq ($(PLATFORM),ansi) - - # Note: this test is duplicated in "builds/toplevel.mk". - # - is_unix := $(strip $(wildcard /sbin/init) \ - $(wildcard /usr/sbin/init) \ - $(wildcard /dev/null) \ - $(wildcard /hurd/auth)) - ifneq ($(is_unix),) - - PLATFORM := unix - - endif # test is_unix -endif # test PLATFORM ansi - -ifeq ($(PLATFORM),unix) - COPY := cp - DELETE := rm -f - CAT := cat - - # If `devel' is the requested target, we use a special configuration - # file named `unix-dev.mk'. It disables optimization and libtool. - # - ifneq ($(findstring devel,$(MAKECMDGOALS)),) - CONFIG_FILE := unix-dev.mk - CC := gcc - devel: setup - .PHONY: devel - else - - # If `lcc' is the requested target, we use a special configuration - # file named `unix-lcc.mk'. It disables libtool for LCC. - # - ifneq ($(findstring lcc,$(MAKECMDGOALS)),) - CONFIG_FILE := unix-lcc.mk - CC := lcc - lcc: setup - .PHONY: lcc - else - - # If a Unix platform is detected, the configure script is called and - # `unix-def.mk' together with `unix-cc.mk' is created. - # - # Arguments to `configure' should be in the CFG variable. Example: - # - # make CFG="--prefix=/usr --disable-static" - # - # If you need to set CFLAGS or LDFLAGS, do it here also. - # - # Feel free to add support for other platform specific compilers in - # this directory (e.g. solaris.mk + changes here to detect the - # platform). - # - CONFIG_FILE := unix.mk - unix: setup - must_configure := 1 - .PHONY: unix - endif - endif - - have_Makefile := $(wildcard $(OBJ_DIR)/Makefile) - - setup: std_setup - ifdef must_configure - ifneq ($(have_Makefile),) - # we are building FT2 not in the src tree - $(TOP_DIR)/builds/unix/configure $(value CFG) - else - cd builds/unix; \ - ./configure $(value CFG) - endif - endif - -endif # test PLATFORM unix - - -# EOF diff --git a/3party/freetype/builds/unix/freetype-config.in b/3party/freetype/builds/unix/freetype-config.in deleted file mode 100644 index 371f615daa..0000000000 --- a/3party/freetype/builds/unix/freetype-config.in +++ /dev/null @@ -1,161 +0,0 @@ -#! /bin/sh -# -# Copyright 2000-2015 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. - -LC_ALL=C -export LC_ALL - -prefix="%prefix%" -exec_prefix="%exec_prefix%" -exec_prefix_set="no" -includedir="%includedir%" -libdir="%libdir%" - -usage() -{ - cat <&2 -fi - -while test $# -gt 0 ; do - case "$1" in - -*=*) - optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` - ;; - *) - optarg= - ;; - esac - - case $1 in - --prefix=*) - prefix=$optarg - local_prefix=yes - ;; - --prefix) - echo_prefix=yes - ;; - --exec-prefix=*) - exec_prefix=$optarg - exec_prefix_set=yes - local_prefix=yes - ;; - --exec-prefix) - echo_exec_prefix=yes - ;; - --version) - echo %ft_version% - exit 0 - ;; - --ftversion) - echo_ft_version=yes - ;; - --cflags) - echo_cflags=yes - ;; - --libs) - echo_libs=yes - ;; - --libtool) - echo_libtool=yes - ;; - --static) - show_static=yes - ;; - *) - usage 1 1>&2 - ;; - esac - shift -done - -if test "$local_prefix" = "yes" ; then - if test "$exec_prefix_set" != "yes" ; then - exec_prefix=$prefix - fi -fi - -if test "$echo_prefix" = "yes" ; then - echo ${SYSROOT}$prefix -fi - -if test "$echo_exec_prefix" = "yes" ; then - echo ${SYSROOT}$exec_prefix -fi - -if test "$exec_prefix_set" = "yes" ; then - libdir=$exec_prefix/lib -else - if test "$local_prefix" = "yes" ; then - includedir=$prefix/include - libdir=$prefix/lib - fi -fi - -if test "$echo_ft_version" = "yes" ; then - major=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \ - | grep FREETYPE_MAJOR \ - | sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'` - minor=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \ - | grep FREETYPE_MINOR \ - | sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'` - patch=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \ - | grep FREETYPE_PATCH \ - | sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'` - echo $major.$minor.$patch -fi - -if test "$echo_cflags" = "yes" ; then - echo -I${SYSROOT}$includedir/freetype2 -fi - -if test "$echo_libs" = "yes" ; then - libs="-lfreetype" - staticlibs="%LIBSSTATIC_CONFIG%" - if test "$show_static" = "yes" ; then - libs="$staticlibs" - fi - if test "${SYSROOT}$libdir" != "/usr/lib" && - test "${SYSROOT}$libdir" != "/usr/lib64"; then - echo -L${SYSROOT}$libdir $libs - else - echo $libs - fi -fi - -if test "$echo_libtool" = "yes" ; then - convlib="libfreetype.la" - echo ${SYSROOT}$libdir/$convlib -fi - -# EOF diff --git a/3party/freetype/builds/unix/freetype2.in b/3party/freetype/builds/unix/freetype2.in deleted file mode 100644 index c4dfda4abc..0000000000 --- a/3party/freetype/builds/unix/freetype2.in +++ /dev/null @@ -1,14 +0,0 @@ -prefix=%prefix% -exec_prefix=%exec_prefix% -libdir=%libdir% -includedir=%includedir% - -Name: FreeType 2 -URL: http://freetype.org -Description: A free, high-quality, and portable font engine. -Version: %ft_version% -Requires: -Requires.private: %REQUIRES_PRIVATE% -Libs: -L${libdir} -lfreetype -Libs.private: %LIBS_PRIVATE% -Cflags: -I${includedir}/freetype2 diff --git a/3party/freetype/builds/unix/freetype2.m4 b/3party/freetype/builds/unix/freetype2.m4 deleted file mode 100644 index 3dc88076ab..0000000000 --- a/3party/freetype/builds/unix/freetype2.m4 +++ /dev/null @@ -1,194 +0,0 @@ -# Configure paths for FreeType2 -# Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor -# -# Copyright 2001-2015 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. -# -# As a special exception to the FreeType project license, this file may be -# distributed as part of a program that contains a configuration script -# generated by Autoconf, under the same distribution terms as the rest of -# that program. -# -# serial 4 - -# AC_CHECK_FT2([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) -# Test for FreeType 2, and define FT2_CFLAGS and FT2_LIBS. -# MINIMUM-VERSION is what libtool reports; the default is `7.0.1' (this is -# FreeType 2.0.4). -# -AC_DEFUN([AC_CHECK_FT2], - [# Get the cflags and libraries from the freetype-config script - # - AC_ARG_WITH([ft-prefix], - dnl don't quote AS_HELP_STRING! - AS_HELP_STRING([--with-ft-prefix=PREFIX], - [Prefix where FreeType is installed (optional)]), - [ft_config_prefix="$withval"], - [ft_config_prefix=""]) - - AC_ARG_WITH([ft-exec-prefix], - dnl don't quote AS_HELP_STRING! - AS_HELP_STRING([--with-ft-exec-prefix=PREFIX], - [Exec prefix where FreeType is installed (optional)]), - [ft_config_exec_prefix="$withval"], - [ft_config_exec_prefix=""]) - - AC_ARG_ENABLE([freetypetest], - dnl don't quote AS_HELP_STRING! - AS_HELP_STRING([--disable-freetypetest], - [Do not try to compile and run a test FreeType program]), - [], - [enable_fttest=yes]) - - if test x$ft_config_exec_prefix != x ; then - ft_config_args="$ft_config_args --exec-prefix=$ft_config_exec_prefix" - if test x${FT2_CONFIG+set} != xset ; then - FT2_CONFIG=$ft_config_exec_prefix/bin/freetype-config - fi - fi - - if test x$ft_config_prefix != x ; then - ft_config_args="$ft_config_args --prefix=$ft_config_prefix" - if test x${FT2_CONFIG+set} != xset ; then - FT2_CONFIG=$ft_config_prefix/bin/freetype-config - fi - fi - - if test "x$FT2_CONFIG" = x ; then - AC_PATH_TOOL([FT2_CONFIG], [freetype-config], [no]) - fi - - min_ft_version=m4_if([$1], [], [7.0.1], [$1]) - AC_MSG_CHECKING([for FreeType -- version >= $min_ft_version]) - no_ft="" - if test "$FT2_CONFIG" = "no" ; then - no_ft=yes - else - FT2_CFLAGS=`$FT2_CONFIG $ft_config_args --cflags` - FT2_LIBS=`$FT2_CONFIG $ft_config_args --libs` - ft_config_major_version=`$FT2_CONFIG $ft_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - ft_config_minor_version=`$FT2_CONFIG $ft_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - ft_config_micro_version=`$FT2_CONFIG $ft_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - ft_min_major_version=`echo $min_ft_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - ft_min_minor_version=`echo $min_ft_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - ft_min_micro_version=`echo $min_ft_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test x$enable_fttest = xyes ; then - ft_config_is_lt="" - if test $ft_config_major_version -lt $ft_min_major_version ; then - ft_config_is_lt=yes - else - if test $ft_config_major_version -eq $ft_min_major_version ; then - if test $ft_config_minor_version -lt $ft_min_minor_version ; then - ft_config_is_lt=yes - else - if test $ft_config_minor_version -eq $ft_min_minor_version ; then - if test $ft_config_micro_version -lt $ft_min_micro_version ; then - ft_config_is_lt=yes - fi - fi - fi - fi - fi - if test x$ft_config_is_lt = xyes ; then - no_ft=yes - else - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $FT2_CFLAGS" - LIBS="$FT2_LIBS $LIBS" - - # - # Sanity checks for the results of freetype-config to some extent. - # - AC_RUN_IFELSE([ - AC_LANG_SOURCE([[ - -#include -#include FT_FREETYPE_H -#include -#include - -int -main() -{ - FT_Library library; - FT_Error error; - - error = FT_Init_FreeType(&library); - - if (error) - return 1; - else - { - FT_Done_FreeType(library); - return 0; - } -} - - ]]) - ], - [], - [no_ft=yes], - [echo $ECHO_N "cross compiling; assuming OK... $ECHO_C"]) - - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi # test $ft_config_version -lt $ft_min_version - fi # test x$enable_fttest = xyes - fi # test "$FT2_CONFIG" = "no" - - if test x$no_ft = x ; then - AC_MSG_RESULT([yes]) - m4_if([$2], [], [:], [$2]) - else - AC_MSG_RESULT([no]) - if test "$FT2_CONFIG" = "no" ; then - AC_MSG_WARN([ - - The freetype-config script installed by FreeType 2 could not be found. - If FreeType 2 was installed in PREFIX, make sure PREFIX/bin is in - your path, or set the FT2_CONFIG environment variable to the - full path to freetype-config. - ]) - else - if test x$ft_config_is_lt = xyes ; then - AC_MSG_WARN([ - - Your installed version of the FreeType 2 library is too old. - If you have different versions of FreeType 2, make sure that - correct values for --with-ft-prefix or --with-ft-exec-prefix - are used, or set the FT2_CONFIG environment variable to the - full path to freetype-config. - ]) - else - AC_MSG_WARN([ - - The FreeType test program failed to run. If your system uses - shared libraries and they are installed outside the normal - system library path, make sure the variable LD_LIBRARY_PATH - (or whatever is appropriate for your system) is correctly set. - ]) - fi - fi - - FT2_CFLAGS="" - FT2_LIBS="" - m4_if([$3], [], [:], [$3]) - fi - - AC_SUBST([FT2_CFLAGS]) - AC_SUBST([FT2_LIBS])]) - -# end of freetype2.m4 diff --git a/3party/freetype/builds/unix/ft-munmap.m4 b/3party/freetype/builds/unix/ft-munmap.m4 deleted file mode 100644 index 72b08645dd..0000000000 --- a/3party/freetype/builds/unix/ft-munmap.m4 +++ /dev/null @@ -1,32 +0,0 @@ -## FreeType specific autoconf tests -# -# Copyright 2002-2015 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. - -# serial 2 - -AC_DEFUN([FT_MUNMAP_PARAM], - [AC_MSG_CHECKING([for munmap's first parameter type]) - AC_COMPILE_IFELSE([ - AC_LANG_SOURCE([[ - -#include -#include -int munmap(void *, size_t); - - ]]) - ], - [AC_MSG_RESULT([void *]) - AC_DEFINE([MUNMAP_USES_VOIDP], - [], - [Define to 1 if the first argument of munmap is of type void *])], - [AC_MSG_RESULT([char *])]) - ]) - -# end of ft-munmap.m4 diff --git a/3party/freetype/builds/unix/ftconfig.in b/3party/freetype/builds/unix/ftconfig.in deleted file mode 100644 index fc5c89ba3e..0000000000 --- a/3party/freetype/builds/unix/ftconfig.in +++ /dev/null @@ -1,497 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftconfig.in */ -/* */ -/* UNIX-specific configuration file (specification only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This header file contains a number of macro definitions that are used */ - /* by the rest of the engine. Most of the macros here are automatically */ - /* determined at compile time, and you should not need to change it to */ - /* port FreeType, except to compile the library with a non-ANSI */ - /* compiler. */ - /* */ - /* Note however that if some specific modifications are needed, we */ - /* advise you to place a modified copy in your build directory. */ - /* */ - /* The build directory is usually `builds/', and contains */ - /* system-specific files that are always included first when building */ - /* the library. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTCONFIG_H__ -#define __FTCONFIG_H__ - -#include -#include FT_CONFIG_OPTIONS_H -#include FT_CONFIG_STANDARD_LIBRARY_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ - /* */ - /* These macros can be toggled to suit a specific system. The current */ - /* ones are defaults used to compile FreeType in an ANSI C environment */ - /* (16bit compilers are also supported). Copy this file to your own */ - /* `builds/' directory, and edit it to port the engine. */ - /* */ - /*************************************************************************/ - - -#undef HAVE_UNISTD_H -#undef HAVE_FCNTL_H -#undef HAVE_STDINT_H - - - /* There are systems (like the Texas Instruments 'C54x) where a `char' */ - /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ - /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ - /* is probably unexpected. */ - /* */ - /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ - /* `char' type. */ - -#ifndef FT_CHAR_BIT -#define FT_CHAR_BIT CHAR_BIT -#endif - - -#undef FT_USE_AUTOCONF_SIZEOF_TYPES -#ifdef FT_USE_AUTOCONF_SIZEOF_TYPES - -#undef SIZEOF_INT -#undef SIZEOF_LONG -#define FT_SIZEOF_INT SIZEOF_INT -#define FT_SIZEOF_LONG SIZEOF_LONG - -#else /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ - - /* Following cpp computation of the bit length of int and long */ - /* is copied from default include/freetype/config/ftconfig.h. */ - /* If any improvement is required for this file, it should be */ - /* applied to the original header file for the builders that */ - /* do not use configure script. */ - - /* The size of an `int' type. */ -#if FT_UINT_MAX == 0xFFFFUL -#define FT_SIZEOF_INT (16 / FT_CHAR_BIT) -#elif FT_UINT_MAX == 0xFFFFFFFFUL -#define FT_SIZEOF_INT (32 / FT_CHAR_BIT) -#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL -#define FT_SIZEOF_INT (64 / FT_CHAR_BIT) -#else -#error "Unsupported size of `int' type!" -#endif - - /* The size of a `long' type. A five-byte `long' (as used e.g. on the */ - /* DM642) is recognized but avoided. */ -#if FT_ULONG_MAX == 0xFFFFFFFFUL -#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) -#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL -#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) -#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL -#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT) -#else -#error "Unsupported size of `long' type!" -#endif - -#endif /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ - - - /* FT_UNUSED is a macro used to indicate that a given parameter is not */ - /* used -- this is only used to get rid of unpleasant compiler warnings */ -#ifndef FT_UNUSED -#define FT_UNUSED( arg ) ( (arg) = (arg) ) -#endif - - - /*************************************************************************/ - /* */ - /* AUTOMATIC CONFIGURATION MACROS */ - /* */ - /* These macros are computed from the ones defined above. Don't touch */ - /* their definition, unless you know precisely what you are doing. No */ - /* porter should need to mess with them. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Mac support */ - /* */ - /* This is the only necessary change, so it is defined here instead */ - /* providing a new configuration file. */ - /* */ -#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) - /* no Carbon frameworks for 64bit 10.4.x */ - /* AvailabilityMacros.h is available since Mac OS X 10.2, */ - /* so guess the system version by maximum errno before inclusion */ -#include -#ifdef ECANCELED /* defined since 10.2 */ -#include "AvailabilityMacros.h" -#endif -#if defined( __LP64__ ) && \ - ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) -/undef FT_MACINTOSH -#endif - -#elif defined( __SC__ ) || defined( __MRC__ ) - /* Classic MacOS compilers */ -#include "ConditionalMacros.h" -#if TARGET_OS_MAC -#define FT_MACINTOSH 1 -#endif - -#endif - - - /* Fix compiler warning with sgi compiler */ -#if defined( __sgi ) && !defined( __GNUC__ ) -#if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) -#pragma set woff 3505 -#endif -#endif - - - /*************************************************************************/ - /* */ - /*
    */ - /* basic_types */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Int16 */ - /* */ - /* */ - /* A typedef for a 16bit signed integer type. */ - /* */ - typedef signed short FT_Int16; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_UInt16 */ - /* */ - /* */ - /* A typedef for a 16bit unsigned integer type. */ - /* */ - typedef unsigned short FT_UInt16; - - /* */ - - - /* this #if 0 ... #endif clause is for documentation purposes */ -#if 0 - - /*************************************************************************/ - /* */ - /* */ - /* FT_Int32 */ - /* */ - /* */ - /* A typedef for a 32bit signed integer type. The size depends on */ - /* the configuration. */ - /* */ - typedef signed XXX FT_Int32; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_UInt32 */ - /* */ - /* A typedef for a 32bit unsigned integer type. The size depends on */ - /* the configuration. */ - /* */ - typedef unsigned XXX FT_UInt32; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Int64 */ - /* */ - /* A typedef for a 64bit signed integer type. The size depends on */ - /* the configuration. Only defined if there is real 64bit support; */ - /* otherwise, it gets emulated with a structure (if necessary). */ - /* */ - typedef signed XXX FT_Int64; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_UInt64 */ - /* */ - /* A typedef for a 64bit unsigned integer type. The size depends on */ - /* the configuration. Only defined if there is real 64bit support; */ - /* otherwise, it gets emulated with a structure (if necessary). */ - /* */ - typedef unsigned XXX FT_UInt64; - - /* */ - -#endif - -#if FT_SIZEOF_INT == 4 - - typedef signed int FT_Int32; - typedef unsigned int FT_UInt32; - -#elif FT_SIZEOF_LONG == 4 - - typedef signed long FT_Int32; - typedef unsigned long FT_UInt32; - -#else -#error "no 32bit type found -- please check your configuration files" -#endif - - - /* look up an integer type that is at least 32 bits */ -#if FT_SIZEOF_INT >= 4 - - typedef int FT_Fast; - typedef unsigned int FT_UFast; - -#elif FT_SIZEOF_LONG >= 4 - - typedef long FT_Fast; - typedef unsigned long FT_UFast; - -#endif - - - /* determine whether we have a 64-bit int type for platforms without */ - /* Autoconf */ -#if FT_SIZEOF_LONG == 8 - - /* FT_LONG64 must be defined if a 64-bit type is available */ -#define FT_LONG64 -#define FT_INT64 long -#define FT_UINT64 unsigned long - - /*************************************************************************/ - /* */ - /* A 64-bit data type may create compilation problems if you compile */ - /* in strict ANSI mode. To avoid them, we disable other 64-bit data */ - /* types if __STDC__ is defined. You can however ignore this rule */ - /* by defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ - /* */ -#elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 ) - -#if defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 -#define FT_UINT64 unsigned __int64 - -#elif defined( __BORLANDC__ ) /* Borland C++ */ - - /* XXXX: We should probably check the value of __BORLANDC__ in order */ - /* to test the compiler version. */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 -#define FT_UINT64 unsigned __int64 - -#elif defined( __WATCOMC__ ) /* Watcom C++ */ - - /* Watcom doesn't provide 64-bit data types */ - -#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ - -#define FT_LONG64 -#define FT_INT64 long long int -#define FT_UINT64 unsigned long long int - -#elif defined( __GNUC__ ) - - /* GCC provides the `long long' type */ -#define FT_LONG64 -#define FT_INT64 long long int -#define FT_UINT64 unsigned long long int - -#endif /* _MSC_VER */ - -#endif /* FT_SIZEOF_LONG == 8 */ - -#ifdef FT_LONG64 - typedef FT_INT64 FT_Int64; - typedef FT_UINT64 FT_UInt64; -#endif - - - /*************************************************************************/ - /* */ - /* miscellaneous */ - /* */ - /*************************************************************************/ - - -#define FT_BEGIN_STMNT do { -#define FT_END_STMNT } while ( 0 ) -#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT - - - /* typeof condition taken from gnulib's `intprops.h' header file */ -#if ( __GNUC__ >= 2 || \ - defined( __IBM__TYPEOF__ ) || \ - ( __SUNPRO_C >= 0x5110 && !__STDC__ ) ) -#define FT_TYPEOF( type ) (__typeof__ (type)) -#else -#define FT_TYPEOF( type ) /* empty */ -#endif - - -#ifdef FT_MAKE_OPTION_SINGLE_OBJECT - -#define FT_LOCAL( x ) static x -#define FT_LOCAL_DEF( x ) static x - -#else - -#ifdef __cplusplus -#define FT_LOCAL( x ) extern "C" x -#define FT_LOCAL_DEF( x ) extern "C" x -#else -#define FT_LOCAL( x ) extern x -#define FT_LOCAL_DEF( x ) x -#endif - -#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ - -#define FT_LOCAL_ARRAY( x ) extern const x -#define FT_LOCAL_ARRAY_DEF( x ) const x - - -#ifndef FT_BASE - -#ifdef __cplusplus -#define FT_BASE( x ) extern "C" x -#else -#define FT_BASE( x ) extern x -#endif - -#endif /* !FT_BASE */ - - -#ifndef FT_BASE_DEF - -#ifdef __cplusplus -#define FT_BASE_DEF( x ) x -#else -#define FT_BASE_DEF( x ) x -#endif - -#endif /* !FT_BASE_DEF */ - - -#ifndef FT_EXPORT - -#ifdef __cplusplus -#define FT_EXPORT( x ) extern "C" x -#else -#define FT_EXPORT( x ) extern x -#endif - -#endif /* !FT_EXPORT */ - - -#ifndef FT_EXPORT_DEF - -#ifdef __cplusplus -#define FT_EXPORT_DEF( x ) extern "C" x -#else -#define FT_EXPORT_DEF( x ) extern x -#endif - -#endif /* !FT_EXPORT_DEF */ - - -#ifndef FT_EXPORT_VAR - -#ifdef __cplusplus -#define FT_EXPORT_VAR( x ) extern "C" x -#else -#define FT_EXPORT_VAR( x ) extern x -#endif - -#endif /* !FT_EXPORT_VAR */ - - /* The following macros are needed to compile the library with a */ - /* C++ compiler and with 16bit compilers. */ - /* */ - - /* This is special. Within C++, you must specify `extern "C"' for */ - /* functions which are used via function pointers, and you also */ - /* must do that for structures which contain function pointers to */ - /* assure C linkage -- it's not possible to have (local) anonymous */ - /* functions which are accessed by (global) function pointers. */ - /* */ - /* */ - /* FT_CALLBACK_DEF is used to _define_ a callback function. */ - /* */ - /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ - /* contains pointers to callback functions. */ - /* */ - /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ - /* that contains pointers to callback functions. */ - /* */ - /* */ - /* Some 16bit compilers have to redefine these macros to insert */ - /* the infamous `_cdecl' or `__fastcall' declarations. */ - /* */ -#ifndef FT_CALLBACK_DEF -#ifdef __cplusplus -#define FT_CALLBACK_DEF( x ) extern "C" x -#else -#define FT_CALLBACK_DEF( x ) static x -#endif -#endif /* FT_CALLBACK_DEF */ - -#ifndef FT_CALLBACK_TABLE -#ifdef __cplusplus -#define FT_CALLBACK_TABLE extern "C" -#define FT_CALLBACK_TABLE_DEF extern "C" -#else -#define FT_CALLBACK_TABLE extern -#define FT_CALLBACK_TABLE_DEF /* nothing */ -#endif -#endif /* FT_CALLBACK_TABLE */ - - -FT_END_HEADER - - -#endif /* __FTCONFIG_H__ */ - - -/* END */ diff --git a/3party/freetype/builds/unix/ftsystem.c b/3party/freetype/builds/unix/ftsystem.c deleted file mode 100644 index d7513d9e96..0000000000 --- a/3party/freetype/builds/unix/ftsystem.c +++ /dev/null @@ -1,420 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsystem.c */ -/* */ -/* Unix-specific FreeType low-level system interface (body). */ -/* */ -/* Copyright 1996-2015 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 - /* we use our special ftconfig.h file, not the standard one */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_SYSTEM_H -#include FT_ERRORS_H -#include FT_TYPES_H -#include FT_INTERNAL_STREAM_H - - /* memory-mapping includes and definitions */ -#ifdef HAVE_UNISTD_H -#include -#endif - -#include -#ifndef MAP_FILE -#define MAP_FILE 0x00 -#endif - -#ifdef MUNMAP_USES_VOIDP -#define MUNMAP_ARG_CAST void * -#else -#define MUNMAP_ARG_CAST char * -#endif - -#ifdef NEED_MUNMAP_DECL - -#ifdef __cplusplus - extern "C" -#else - extern -#endif - int - munmap( char* addr, - int len ); - -#define MUNMAP_ARG_CAST char * - -#endif /* NEED_DECLARATION_MUNMAP */ - - -#include -#include - -#ifdef HAVE_FCNTL_H -#include -#endif - -#include -#include -#include -#include - - - /*************************************************************************/ - /* */ - /* MEMORY MANAGEMENT INTERFACE */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* ft_alloc */ - /* */ - /* */ - /* The memory allocation function. */ - /* */ - /* */ - /* memory :: A pointer to the memory object. */ - /* */ - /* size :: The requested size in bytes. */ - /* */ - /* */ - /* The address of newly allocated block. */ - /* */ - FT_CALLBACK_DEF( void* ) - ft_alloc( FT_Memory memory, - long size ) - { - FT_UNUSED( memory ); - - return malloc( size ); - } - - - /*************************************************************************/ - /* */ - /* */ - /* ft_realloc */ - /* */ - /* */ - /* The memory reallocation function. */ - /* */ - /* */ - /* memory :: A pointer to the memory object. */ - /* */ - /* cur_size :: The current size of the allocated memory block. */ - /* */ - /* new_size :: The newly requested size in bytes. */ - /* */ - /* block :: The current address of the block in memory. */ - /* */ - /* */ - /* The address of the reallocated memory block. */ - /* */ - FT_CALLBACK_DEF( void* ) - ft_realloc( FT_Memory memory, - long cur_size, - long new_size, - void* block ) - { - FT_UNUSED( memory ); - FT_UNUSED( cur_size ); - - return realloc( block, new_size ); - } - - - /*************************************************************************/ - /* */ - /* */ - /* ft_free */ - /* */ - /* */ - /* The memory release function. */ - /* */ - /* */ - /* memory :: A pointer to the memory object. */ - /* */ - /* block :: The address of block in memory to be freed. */ - /* */ - FT_CALLBACK_DEF( void ) - ft_free( FT_Memory memory, - void* block ) - { - FT_UNUSED( memory ); - - free( block ); - } - - - /*************************************************************************/ - /* */ - /* RESOURCE MANAGEMENT INTERFACE */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_io - - /* We use the macro STREAM_FILE for convenience to extract the */ - /* system-specific stream handle from a given FreeType stream object */ -#define STREAM_FILE( stream ) ( (FILE*)stream->descriptor.pointer ) - - - /*************************************************************************/ - /* */ - /* */ - /* ft_close_stream_by_munmap */ - /* */ - /* */ - /* The function to close a stream which is opened by mmap. */ - /* */ - /* */ - /* stream :: A pointer to the stream object. */ - /* */ - FT_CALLBACK_DEF( void ) - ft_close_stream_by_munmap( FT_Stream stream ) - { - munmap( (MUNMAP_ARG_CAST)stream->descriptor.pointer, stream->size ); - - stream->descriptor.pointer = NULL; - stream->size = 0; - stream->base = 0; - } - - - /*************************************************************************/ - /* */ - /* */ - /* ft_close_stream_by_free */ - /* */ - /* */ - /* The function to close a stream which is created by ft_alloc. */ - /* */ - /* */ - /* stream :: A pointer to the stream object. */ - /* */ - FT_CALLBACK_DEF( void ) - ft_close_stream_by_free( FT_Stream stream ) - { - ft_free( NULL, stream->descriptor.pointer ); - - stream->descriptor.pointer = NULL; - stream->size = 0; - stream->base = 0; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( FT_Error ) - FT_Stream_Open( FT_Stream stream, - const char* filepathname ) - { - int file; - struct stat stat_buf; - - - if ( !stream ) - return FT_THROW( Invalid_Stream_Handle ); - - /* open the file */ - file = open( filepathname, O_RDONLY ); - if ( file < 0 ) - { - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " could not open `%s'\n", filepathname )); - return FT_THROW( Cannot_Open_Resource ); - } - - /* Here we ensure that a "fork" will _not_ duplicate */ - /* our opened input streams on Unix. This is critical */ - /* since it avoids some (possible) access control */ - /* issues and cleans up the kernel file table a bit. */ - /* */ -#ifdef F_SETFD -#ifdef FD_CLOEXEC - (void)fcntl( file, F_SETFD, FD_CLOEXEC ); -#else - (void)fcntl( file, F_SETFD, 1 ); -#endif /* FD_CLOEXEC */ -#endif /* F_SETFD */ - - if ( fstat( file, &stat_buf ) < 0 ) - { - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " could not `fstat' file `%s'\n", filepathname )); - goto Fail_Map; - } - - /* XXX: TODO -- real 64bit platform support */ - /* */ - /* `stream->size' is typedef'd to unsigned long (in `ftsystem.h'); */ - /* `stat_buf.st_size', however, is usually typedef'd to off_t */ - /* (in sys/stat.h). */ - /* On some platforms, the former is 32bit and the latter is 64bit. */ - /* To avoid overflow caused by fonts in huge files larger than */ - /* 2GB, do a test. Temporary fix proposed by Sean McBride. */ - /* */ - if ( stat_buf.st_size > LONG_MAX ) - { - FT_ERROR(( "FT_Stream_Open: file is too big\n" )); - goto Fail_Map; - } - else if ( stat_buf.st_size == 0 ) - { - FT_ERROR(( "FT_Stream_Open: zero-length file\n" )); - goto Fail_Map; - } - - /* This cast potentially truncates a 64bit to 32bit! */ - stream->size = (unsigned long)stat_buf.st_size; - stream->pos = 0; - stream->base = (unsigned char *)mmap( NULL, - stream->size, - PROT_READ, - MAP_FILE | MAP_PRIVATE, - file, - 0 ); - - /* on some RTOS, mmap might return 0 */ - if ( (long)stream->base != -1 && stream->base != NULL ) - stream->close = ft_close_stream_by_munmap; - else - { - ssize_t total_read_count; - - - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " could not `mmap' file `%s'\n", filepathname )); - - stream->base = (unsigned char*)ft_alloc( NULL, stream->size ); - - if ( !stream->base ) - { - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " could not `alloc' memory\n" )); - goto Fail_Map; - } - - total_read_count = 0; - do - { - ssize_t read_count; - - - read_count = read( file, - stream->base + total_read_count, - stream->size - total_read_count ); - - if ( read_count <= 0 ) - { - if ( read_count == -1 && errno == EINTR ) - continue; - - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " error while `read'ing file `%s'\n", filepathname )); - goto Fail_Read; - } - - total_read_count += read_count; - - } while ( (unsigned long)total_read_count != stream->size ); - - stream->close = ft_close_stream_by_free; - } - - close( file ); - - stream->descriptor.pointer = stream->base; - stream->pathname.pointer = (char*)filepathname; - - stream->read = 0; - - FT_TRACE1(( "FT_Stream_Open:" )); - FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", - filepathname, stream->size )); - - return FT_Err_Ok; - - Fail_Read: - ft_free( NULL, stream->base ); - - Fail_Map: - close( file ); - - stream->base = NULL; - stream->size = 0; - stream->pos = 0; - - return FT_THROW( Cannot_Open_Stream ); - } - - -#ifdef FT_DEBUG_MEMORY - - extern FT_Int - ft_mem_debug_init( FT_Memory memory ); - - extern void - ft_mem_debug_done( FT_Memory memory ); - -#endif - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( FT_Memory ) - FT_New_Memory( void ) - { - FT_Memory memory; - - - memory = (FT_Memory)malloc( sizeof ( *memory ) ); - if ( memory ) - { - memory->user = 0; - memory->alloc = ft_alloc; - memory->realloc = ft_realloc; - memory->free = ft_free; -#ifdef FT_DEBUG_MEMORY - ft_mem_debug_init( memory ); -#endif - } - - return memory; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( void ) - FT_Done_Memory( FT_Memory memory ) - { -#ifdef FT_DEBUG_MEMORY - ft_mem_debug_done( memory ); -#endif - memory->free( memory, memory ); - } - - -/* END */ diff --git a/3party/freetype/builds/unix/install.mk b/3party/freetype/builds/unix/install.mk deleted file mode 100644 index c7a20a35e2..0000000000 --- a/3party/freetype/builds/unix/install.mk +++ /dev/null @@ -1,92 +0,0 @@ -# -# FreeType 2 installation instructions for Unix systems -# - - -# Copyright 1996-2015 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. - -# If you say -# -# make install DESTDIR=/tmp/somewhere/ -# -# don't forget the final backslash (this command is mainly for package -# maintainers). - - -.PHONY: install uninstall check - -# Unix installation and deinstallation targets. -# -# Note that we remove any data found in `$(includedir)/freetype2' before -# installing new files to avoid interferences with files installed by -# previous FreeType versions (which use slightly different locations). -# -install: $(PROJECT_LIBRARY) - -$(DELDIR) $(DESTDIR)$(includedir)/freetype2 - $(MKINSTALLDIRS) $(DESTDIR)$(libdir) \ - $(DESTDIR)$(libdir)/pkgconfig \ - $(DESTDIR)$(includedir)/freetype2/freetype/config \ - $(DESTDIR)$(bindir) \ - $(DESTDIR)$(datadir)/aclocal \ - $(DESTDIR)$(mandir)/man1 - $(LIBTOOL) --mode=install $(INSTALL) \ - $(PROJECT_LIBRARY) $(DESTDIR)$(libdir) - -for P in $(PUBLIC_H) ; do \ - $(INSTALL_DATA) \ - $$P $(DESTDIR)$(includedir)/freetype2/freetype ; \ - done - -for P in $(CONFIG_H) ; do \ - $(INSTALL_DATA) \ - $$P $(DESTDIR)$(includedir)/freetype2/freetype/config ; \ - done - $(INSTALL_DATA) $(TOP_DIR)/include/ft2build.h \ - $(DESTDIR)$(includedir)/freetype2/ft2build.h - $(INSTALL_DATA) $(OBJ_BUILD)/ftconfig.h \ - $(DESTDIR)$(includedir)/freetype2/freetype/config/ftconfig.h - $(INSTALL_DATA) $(OBJ_DIR)/ftmodule.h \ - $(DESTDIR)$(includedir)/freetype2/freetype/config/ftmodule.h - $(INSTALL_SCRIPT) -m 755 $(OBJ_BUILD)/freetype-config \ - $(DESTDIR)$(bindir)/freetype-config - $(INSTALL_SCRIPT) -m 644 $(BUILD_DIR)/freetype2.m4 \ - $(DESTDIR)$(datadir)/aclocal/freetype2.m4 - $(INSTALL_SCRIPT) -m 644 $(OBJ_BUILD)/freetype2.pc \ - $(DESTDIR)$(libdir)/pkgconfig/freetype2.pc - $(INSTALL_DATA) $(TOP_DIR)/docs/freetype-config.1 \ - $(DESTDIR)$(mandir)/man1/freetype-config.1 - - -uninstall: - -$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(LIBRARY).$A - -$(DELDIR) $(DESTDIR)$(includedir)/freetype2 - -$(DELETE) $(DESTDIR)$(bindir)/freetype-config - -$(DELETE) $(DESTDIR)$(datadir)/aclocal/freetype2.m4 - -$(DELETE) $(DESTDIR)$(libdir)/pkgconfig/freetype2.pc - -$(DELETE) $(DESTDIR)$(mandir)/man1/freetype-config.1 - - -check: - @echo There is no validation suite for this package. - - -.PHONY: clean_project_unix distclean_project_unix - -# Unix cleaning and distclean rules. -# -clean_project_unix: - -$(DELETE) $(BASE_OBJECTS) $(OBJ_M) $(OBJ_S) - -$(DELETE) $(patsubst %.$O,%.$(SO),$(BASE_OBJECTS) $(OBJ_M) $(OBJ_S)) \ - $(CLEAN) - -distclean_project_unix: clean_project_unix - -$(DELETE) $(PROJECT_LIBRARY) - -$(DELDIR) $(OBJ_DIR)/.libs - -$(DELETE) *.orig *~ core *.core $(DISTCLEAN) - -# EOF diff --git a/3party/freetype/builds/unix/mkinstalldirs b/3party/freetype/builds/unix/mkinstalldirs deleted file mode 100755 index ef7e16fdaf..0000000000 --- a/3party/freetype/builds/unix/mkinstalldirs +++ /dev/null @@ -1,161 +0,0 @@ -#! /bin/sh -# mkinstalldirs --- make directory hierarchy - -scriptversion=2006-05-11.19 - -# Original author: Noah Friedman -# Created: 1993-05-16 -# Public domain. -# -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -nl=' -' -IFS=" "" $nl" -errstatus=0 -dirmode= - -usage="\ -Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... - -Create each directory DIR (with mode MODE, if specified), including all -leading file name components. - -Report bugs to ." - -# process command line arguments -while test $# -gt 0 ; do - case $1 in - -h | --help | --h*) # -h for help - echo "$usage" - exit $? - ;; - -m) # -m PERM arg - shift - test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } - dirmode=$1 - shift - ;; - --version) - echo "$0 $scriptversion" - exit $? - ;; - --) # stop option processing - shift - break - ;; - -*) # unknown option - echo "$usage" 1>&2 - exit 1 - ;; - *) # first non-opt arg - break - ;; - esac -done - -for file -do - if test -d "$file"; then - shift - else - break - fi -done - -case $# in - 0) exit 0 ;; -esac - -# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and -# mkdir -p a/c at the same time, both will detect that a is missing, -# one will create a, then the other will try to create a and die with -# a "File exists" error. This is a problem when calling mkinstalldirs -# from a parallel make. We use --version in the probe to restrict -# ourselves to GNU mkdir, which is thread-safe. -case $dirmode in - '') - if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - echo "mkdir -p -- $*" - exec mkdir -p -- "$@" - else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - test -d ./-p && rmdir ./-p - test -d ./--version && rmdir ./--version - fi - ;; - *) - if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && - test ! -d ./--version; then - echo "mkdir -m $dirmode -p -- $*" - exec mkdir -m "$dirmode" -p -- "$@" - else - # Clean up after NextStep and OpenStep mkdir. - for d in ./-m ./-p ./--version "./$dirmode"; - do - test -d $d && rmdir $d - done - fi - ;; -esac - -for file -do - case $file in - /*) pathcomp=/ ;; - *) pathcomp= ;; - esac - oIFS=$IFS - IFS=/ - set fnord $file - shift - IFS=$oIFS - - for d - do - test "x$d" = x && continue - - pathcomp=$pathcomp$d - case $pathcomp in - -*) pathcomp=./$pathcomp ;; - esac - - if test ! -d "$pathcomp"; then - echo "mkdir $pathcomp" - - mkdir "$pathcomp" || lasterr=$? - - if test ! -d "$pathcomp"; then - errstatus=$lasterr - else - if test ! -z "$dirmode"; then - echo "chmod $dirmode $pathcomp" - lasterr= - chmod "$dirmode" "$pathcomp" || lasterr=$? - - if test ! -z "$lasterr"; then - errstatus=$lasterr - fi - fi - fi - fi - - pathcomp=$pathcomp/ - done -done - -exit $errstatus - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff --git a/3party/freetype/builds/unix/pkg.m4 b/3party/freetype/builds/unix/pkg.m4 deleted file mode 100644 index f26f84c9ae..0000000000 --- a/3party/freetype/builds/unix/pkg.m4 +++ /dev/null @@ -1,199 +0,0 @@ -# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -# serial 1 (pkg-config-0.24) -# -# Copyright © 2004 Scott James Remnant . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# PKG_PROG_PKG_CONFIG([MIN-VERSION]) -# ---------------------------------- -AC_DEFUN([PKG_PROG_PKG_CONFIG], -[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) -m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) -m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) -AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) -AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) -AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) - -if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=m4_default([$1], [0.9.0]) - AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - PKG_CONFIG="" - fi -fi[]dnl -])# PKG_PROG_PKG_CONFIG - -# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# -# Check to see whether a particular set of modules exists. Similar -# to PKG_CHECK_MODULES(), but does not set variables or print errors. -# -# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -# only at the first occurence in configure.ac, so if the first place -# it's called might be skipped (such as if it is within an "if", you -# have to call PKG_CHECK_EXISTS manually -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_EXISTS], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -if test -n "$PKG_CONFIG" && \ - AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then - m4_default([$2], [:]) -m4_ifvaln([$3], [else - $3])dnl -fi]) - -# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) -# --------------------------------------------- -m4_define([_PKG_CONFIG], -[if test -n "$$1"; then - pkg_cv_[]$1="$$1" - elif test -n "$PKG_CONFIG"; then - PKG_CHECK_EXISTS([$3], - [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` - test "x$?" != "x0" && pkg_failed=yes ], - [pkg_failed=yes]) - else - pkg_failed=untried -fi[]dnl -])# _PKG_CONFIG - -# _PKG_SHORT_ERRORS_SUPPORTED -# ----------------------------- -AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi[]dnl -])# _PKG_SHORT_ERRORS_SUPPORTED - - -# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# -# -# Note that if there is a possibility the first call to -# PKG_CHECK_MODULES might not happen, you should be sure to include an -# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac -# -# -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_MODULES], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl -AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl - -pkg_failed=no -AC_MSG_CHECKING([for $1]) - -_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) -_PKG_CONFIG([$1][_LIBS], [libs], [$2]) - -m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS -and $1[]_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details.]) - -if test $pkg_failed = yes; then - AC_MSG_RESULT([no]) - _PKG_SHORT_ERRORS_SUPPORTED - if test $_pkg_short_errors_supported = yes; then - $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` - else - $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` - fi - # Put the nasty error message in config.log where it belongs - echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD - - m4_default([$4], [AC_MSG_ERROR( -[Package requirements ($2) were not met: - -$$1_PKG_ERRORS - -Consider adjusting the PKG_CONFIG_PATH environment variable if you -installed software in a non-standard prefix. - -_PKG_TEXT])[]dnl - ]) -elif test $pkg_failed = untried; then - AC_MSG_RESULT([no]) - m4_default([$4], [AC_MSG_FAILURE( -[The pkg-config script could not be found or is too old. Make sure it -is in your PATH or set the PKG_CONFIG environment variable to the full -path to pkg-config. - -_PKG_TEXT - -To get pkg-config, see .])[]dnl - ]) -else - $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS - $1[]_LIBS=$pkg_cv_[]$1[]_LIBS - AC_MSG_RESULT([yes]) - $3 -fi[]dnl -])# PKG_CHECK_MODULES - - -# PKG_INSTALLDIR(DIRECTORY) -# ------------------------- -# Substitutes the variable pkgconfigdir as the location where a module -# should install pkg-config .pc files. By default the directory is -# $libdir/pkgconfig, but the default can be changed by passing -# DIRECTORY. The user can override through the --with-pkgconfigdir -# parameter. -AC_DEFUN([PKG_INSTALLDIR], -[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) -m4_pushdef([pkg_description], - [pkg-config installation directory @<:@]pkg_default[@:>@]) -AC_ARG_WITH([pkgconfigdir], - [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, - [with_pkgconfigdir=]pkg_default) -AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) -m4_popdef([pkg_default]) -m4_popdef([pkg_description]) -]) dnl PKG_INSTALLDIR - - -# PKG_NOARCH_INSTALLDIR(DIRECTORY) -# ------------------------- -# Substitutes the variable noarch_pkgconfigdir as the location where a -# module should install arch-independent pkg-config .pc files. By -# default the directory is $datadir/pkgconfig, but the default can be -# changed by passing DIRECTORY. The user can override through the -# --with-noarch-pkgconfigdir parameter. -AC_DEFUN([PKG_NOARCH_INSTALLDIR], -[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) -m4_pushdef([pkg_description], - [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) -AC_ARG_WITH([noarch-pkgconfigdir], - [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, - [with_noarch_pkgconfigdir=]pkg_default) -AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) -m4_popdef([pkg_default]) -m4_popdef([pkg_description]) -]) dnl PKG_NOARCH_INSTALLDIR diff --git a/3party/freetype/builds/unix/unix-cc.in b/3party/freetype/builds/unix/unix-cc.in deleted file mode 100644 index d53b25f6d8..0000000000 --- a/3party/freetype/builds/unix/unix-cc.in +++ /dev/null @@ -1,114 +0,0 @@ -# -# FreeType 2 template for Unix-specific compiler definitions -# - -# Copyright 1996-2015 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. - - -CC := @CC@ -COMPILER_SEP := $(SEP) -FT_LIBTOOL_DIR ?= $(BUILD_DIR) - -LIBTOOL := $(FT_LIBTOOL_DIR)/libtool - - -# The object file extension (for standard and static libraries). This can be -# .o, .tco, .obj, etc., depending on the platform. -# -O := lo -SO := o - - -# The executable file extension. Although most Unix platforms use no -# extension, we copy the extension detected by autoconf. Useful for cross -# building on Unix systems for non-Unix systems. -# -E := @EXEEXT@ - - -# The library file extension (for standard and static libraries). This can -# be .a, .lib, etc., depending on the platform. -# -A := la -SA := a - - -# The name of the final library file. Note that the DOS-specific Makefile -# uses a shorter (8.3) name. -# -LIBRARY := lib$(PROJECT) - - -# Path inclusion flag. Some compilers use a different flag than `-I' to -# specify an additional include path. Examples are `/i=' or `-J'. -# -I := -I - - -# C flag used to define a macro before the compilation of a given source -# object. Usually it is `-D' like in `-DDEBUG'. -# -D := -D - - -# The link flag used to specify a given library file on link. Note that -# this is only used to compile the demo programs, not the library itself. -# -L := -l - - -# Target flag. -# -T := -o$(space) - - -# C flags -# -# These should concern: debug output, optimization & warnings. -# -# Use the ANSIFLAGS variable to define the compiler flags used to enfore -# ANSI compliance. -# -# We use our own FreeType configuration file. -# -CPPFLAGS := @CPPFLAGS@ -CFLAGS := -c @XX_CFLAGS@ @CFLAGS@ -DFT_CONFIG_CONFIG_H="" - -# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. -# -ANSIFLAGS := @XX_ANSIFLAGS@ - -# C compiler to use -- we use libtool! -# -# -CCraw := $(CC) -CC := $(LIBTOOL) --mode=compile $(CCraw) - -# Linker flags. -# -LDFLAGS := @LDFLAGS@ - - -# export symbols -# -CCraw_build := @CC_BUILD@ # native CC of building system -E_BUILD := @EXEEXT_BUILD@ # extension for exexutable on building system -EXPORTS_LIST := $(OBJ_DIR)/ftexport.sym -CCexe := $(CCraw_build) # used to compile `apinames' only - - -# Library linking -# -LINK_LIBRARY = $(LIBTOOL) --mode=link $(CCraw) -o $@ $(OBJECTS_LIST) \ - -rpath $(libdir) -version-info $(version_info) \ - $(LDFLAGS) -no-undefined \ - # -export-symbols $(EXPORTS_LIST) - -# EOF diff --git a/3party/freetype/builds/unix/unix-def.in b/3party/freetype/builds/unix/unix-def.in deleted file mode 100644 index 8529683671..0000000000 --- a/3party/freetype/builds/unix/unix-def.in +++ /dev/null @@ -1,148 +0,0 @@ -# -# FreeType 2 configuration rules templates for Unix + configure -# - - -# Copyright 1996-2015 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. - -SHELL := @SHELL@ - -TOP_DIR := $(shell cd $(TOP_DIR); pwd) - -DELETE := rm -f -DELDIR := rm -rf -CAT := cat -SEP := / - -# this is used for `make distclean' and `make install' -OBJ_BUILD ?= $(BUILD_DIR) - -# don't use `:=' here since the path stuff will be included after this file -# -FTSYS_SRC = @FTSYS_SRC@ - -INSTALL := @INSTALL@ -INSTALL_DATA := @INSTALL_DATA@ -INSTALL_PROGRAM := @INSTALL_PROGRAM@ -INSTALL_SCRIPT := @INSTALL_SCRIPT@ -MKINSTALLDIRS := $(BUILD_DIR)/mkinstalldirs - -CLEAN += $(OBJ_BUILD)/freetype-config \ - $(OBJ_BUILD)/freetype2.pc - -DISTCLEAN += $(OBJ_BUILD)/config.cache \ - $(OBJ_BUILD)/config.log \ - $(OBJ_BUILD)/config.status \ - $(OBJ_BUILD)/unix-def.mk \ - $(OBJ_BUILD)/unix-cc.mk \ - $(OBJ_BUILD)/ftconfig.h \ - $(LIBTOOL) \ - $(OBJ_BUILD)/Makefile - - -# Standard installation variables. -# -prefix := @prefix@ -exec_prefix := @exec_prefix@ -libdir := @libdir@ -bindir := @bindir@ -includedir := @includedir@ -datarootdir := @datarootdir@ -datadir := @datadir@ -mandir := @mandir@ - -version_info := @version_info@ - -# Variables needed for `freetype-config' and `freetype.pc'. -# -REQUIRES_PRIVATE := @REQUIRES_PRIVATE@ -LIBS_PRIVATE := @LIBS_PRIVATE@ -LIBSSTATIC_CONFIG := @LIBSSTATIC_CONFIG@ -build_libtool_libs := @build_libtool_libs@ -ft_version := @ft_version@ - -# The directory where all library files are placed. -# -# By default, this is the same as $(OBJ_DIR); however, this can be changed -# to suit particular needs. -# -LIB_DIR := $(OBJ_DIR) - -# The BASE_SRC macro lists all source files that should be included in -# src/base/ftbase.c. When configure sets up CFLAGS to build ftmac.c, -# ftmac.c should be added to BASE_SRC. -ftmac_c := @ftmac_c@ - -# The SYSTEM_ZLIB macro is defined if the user wishes to link dynamically -# with its system wide zlib. If SYSTEM_ZLIB is 'yes', the zlib part of the -# ftgzip module is not compiled in. -SYSTEM_ZLIB := @SYSTEM_ZLIB@ - - -# The NO_OUTPUT macro is appended to command lines in order to ignore -# the output of some programs. -# -NO_OUTPUT := 2> /dev/null - - -# To support calls like -# -# configure --includedir='${libdir}'/freetype2/include -# -# we generate `freetype-config' and `freetype.pc' at compile time so that -# those variables are properly expanded. - -$(OBJ_BUILD)/freetype-config: $(TOP_DIR)/builds/unix/freetype-config.in - rm -f $@ $@.tmp - sed -e 's|%LIBSSTATIC_CONFIG%|$(LIBSSTATIC_CONFIG)|' \ - -e 's|%build_libtool_libs%|$(build_libtool_libs)|' \ - -e 's|%exec_prefix%|$(exec_prefix)|' \ - -e 's|%ft_version%|$(ft_version)|' \ - -e 's|%includedir%|$(includedir)|' \ - -e 's|%libdir%|$(libdir)|' \ - -e 's|%prefix%|$(prefix)|' \ - $< \ - > $@.tmp - chmod +x $@.tmp - chmod a-w $@.tmp - mv $@.tmp $@ - -# To support directory names with spaces (as might easily happen on Windows -# platforms), the right solution would be to surround the pkg-variables in -# `freetype2.pc' with double quotes. However, doing so ironically disables -# the prefix override mechanism especially written for Windows. This is a -# bug in pkg-config version 0.28 and earlier. -# -# For this reason, we escape spaces with backslashes. - -exec_prefix_x := $(subst $(space),\\$(space),$(exec_prefix)) -includedir_x := $(subst $(space),\\$(space),$(includedir)) -libdir_x := $(subst $(space),\\$(space),$(libdir)) -prefix_x := $(subst $(space),\\$(space),$(prefix)) - -$(OBJ_BUILD)/freetype2.pc: $(TOP_DIR)/builds/unix/freetype2.in - rm -f $@ $@.tmp - sed -e 's|%REQUIRES_PRIVATE%|$(REQUIRES_PRIVATE)|' \ - -e 's|%LIBS_PRIVATE%|$(LIBS_PRIVATE)|' \ - -e 's|%build_libtool_libs%|$(build_libtool_libs)|' \ - -e 's|%exec_prefix%|$(exec_prefix_x)|' \ - -e 's|%ft_version%|$(ft_version)|' \ - -e 's|%includedir%|$(includedir_x)|' \ - -e 's|%libdir%|$(libdir_x)|' \ - -e 's|%prefix%|$(prefix_x)|' \ - $< \ - > $@.tmp - chmod a-w $@.tmp - mv $@.tmp $@ - -all: $(OBJ_BUILD)/freetype-config \ - $(OBJ_BUILD)/freetype2.pc - -# EOF diff --git a/3party/freetype/builds/unix/unix-dev.mk b/3party/freetype/builds/unix/unix-dev.mk deleted file mode 100644 index 62de3445fc..0000000000 --- a/3party/freetype/builds/unix/unix-dev.mk +++ /dev/null @@ -1,26 +0,0 @@ -# -# FreeType 2 Configuration rules for Unix + GCC -# -# Development version without optimizations & libtool -# and no installation. -# - - -# Copyright 1996-2015 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. - - -DEVEL_DIR := $(TOP_DIR)/devel - -include $(TOP_DIR)/builds/unix/unixddef.mk -include $(TOP_DIR)/builds/compiler/gcc-dev.mk -include $(TOP_DIR)/builds/link_std.mk - - -# EOF diff --git a/3party/freetype/builds/unix/unix-lcc.mk b/3party/freetype/builds/unix/unix-lcc.mk deleted file mode 100644 index 328cc80ebe..0000000000 --- a/3party/freetype/builds/unix/unix-lcc.mk +++ /dev/null @@ -1,24 +0,0 @@ -# -# FreeType 2 Configuration rules for Unix + LCC -# -# Development version without optimizations & libtool -# and no installation. -# - - -# Copyright 1996-2015 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 $(TOP_DIR)/builds/unix/unixddef.mk -include $(TOP_DIR)/builds/compiler/unix-lcc.mk -include $(TOP_DIR)/builds/link_std.mk - - -# EOF diff --git a/3party/freetype/builds/unix/unix.mk b/3party/freetype/builds/unix/unix.mk deleted file mode 100644 index 542aa7fe3b..0000000000 --- a/3party/freetype/builds/unix/unix.mk +++ /dev/null @@ -1,62 +0,0 @@ -# -# FreeType 2 configuration rules for UNIX platforms -# - - -# Copyright 1996-2015 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. - -# We need these declarations here since unix-def.mk is a generated file. -BUILD_DIR := $(TOP_DIR)/builds/unix -PLATFORM := unix - -have_mk := $(wildcard $(OBJ_DIR)/unix-def.mk) -ifneq ($(have_mk),) - # We are building FreeType 2 not in the src tree. - include $(OBJ_DIR)/unix-def.mk - include $(OBJ_DIR)/unix-cc.mk -else - include $(BUILD_DIR)/unix-def.mk - include $(BUILD_DIR)/unix-cc.mk -endif - -ifdef BUILD_PROJECT - - .PHONY: clean_project distclean_project - - # Now include the main sub-makefile. It contains all the rules used to - # build the library with the previous variables defined. - # - include $(TOP_DIR)/builds/$(PROJECT).mk - - - # The cleanup targets. - # - clean_project: clean_project_unix - distclean_project: distclean_project_unix - - - # This final rule is used to link all object files into a single library. - # It is part of the system-specific sub-Makefile because not all - # librarians accept a simple syntax like - # - # librarian library_file {list of object files} - # - $(PROJECT_LIBRARY): $(OBJECTS_LIST) - ifdef CLEAN_LIBRARY - -$(CLEAN_LIBRARY) $(NO_OUTPUT) - endif - $(LINK_LIBRARY) - - include $(TOP_DIR)/builds/unix/install.mk - -endif - - -# EOF diff --git a/3party/freetype/builds/unix/unixddef.mk b/3party/freetype/builds/unix/unixddef.mk deleted file mode 100644 index f3336408fd..0000000000 --- a/3party/freetype/builds/unix/unixddef.mk +++ /dev/null @@ -1,45 +0,0 @@ -# -# FreeType 2 configuration rules templates for -# development under Unix with no configure script (gcc only) -# - - -# Copyright 1996-2015 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. - - -TOP_DIR := $(shell cd $(TOP_DIR); pwd) -OBJ_DIR := $(shell cd $(OBJ_DIR); pwd) - -PLATFORM := unix - -DELETE := rm -f -CAT := cat -SEP := / - -# we use a special devel ftoption.h -DEVEL_DIR := $(TOP_DIR)/devel - - -# library file name -# -LIBRARY := lib$(PROJECT) - - -# The directory where all library files are placed. -# -# By default, this is the same as $(OBJ_DIR); however, this can be changed -# to suit particular needs. -# -LIB_DIR := $(OBJ_DIR) - - -NO_OUTPUT := 2> /dev/null - -# EOF diff --git a/3party/freetype/builds/vms/ftconfig.h b/3party/freetype/builds/vms/ftconfig.h deleted file mode 100644 index 4a3fa09b56..0000000000 --- a/3party/freetype/builds/vms/ftconfig.h +++ /dev/null @@ -1,440 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftconfig.h */ -/* */ -/* VMS-specific configuration file (specification only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This header file contains a number of macro definitions that are used */ - /* by the rest of the engine. Most of the macros here are automatically */ - /* determined at compile time, and you should not need to change it to */ - /* port FreeType, except to compile the library with a non-ANSI */ - /* compiler. */ - /* */ - /* Note however that if some specific modifications are needed, we */ - /* advise you to place a modified copy in your build directory. */ - /* */ - /* The build directory is usually `builds/', and contains */ - /* system-specific files that are always included first when building */ - /* the library. */ - /* */ - /*************************************************************************/ - -#ifndef __FTCONFIG_H__ -#define __FTCONFIG_H__ - -#include -#include FT_CONFIG_OPTIONS_H -#include FT_CONFIG_STANDARD_LIBRARY_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ - /* */ - /* These macros can be toggled to suit a specific system. The current */ - /* ones are defaults used to compile FreeType in an ANSI C environment */ - /* (16bit compilers are also supported). Copy this file to your own */ - /* `builds/' directory, and edit it to port the engine. */ - /* */ - /*************************************************************************/ - - -#define HAVE_UNISTD_H 1 -#define HAVE_FCNTL_H 1 - -#define SIZEOF_INT 4 -#define SIZEOF_LONG 4 - -#define FT_SIZEOF_INT 4 -#define FT_SIZEOF_LONG 4 - -#define FT_CHAR_BIT 8 - - - /* FT_UNUSED is a macro used to indicate that a given parameter is not */ - /* used -- this is only used to get rid of unpleasant compiler warnings */ -#ifndef FT_UNUSED -#define FT_UNUSED( arg ) ( (arg) = (arg) ) -#endif - - - /*************************************************************************/ - /* */ - /* AUTOMATIC CONFIGURATION MACROS */ - /* */ - /* These macros are computed from the ones defined above. Don't touch */ - /* their definition, unless you know precisely what you are doing. No */ - /* porter should need to mess with them. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Mac support */ - /* */ - /* This is the only necessary change, so it is defined here instead */ - /* providing a new configuration file. */ - /* */ -#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) - /* no Carbon frameworks for 64bit 10.4.x */ - /* AvailabilityMacros.h is available since Mac OS X 10.2, */ - /* so guess the system version by maximum errno before inclusion */ -#include -#ifdef ECANCELED /* defined since 10.2 */ -#include "AvailabilityMacros.h" -#endif -#if defined( __LP64__ ) && \ - ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) -#undef FT_MACINTOSH -#endif - -#elif defined( __SC__ ) || defined( __MRC__ ) - /* Classic MacOS compilers */ -#include "ConditionalMacros.h" -#if TARGET_OS_MAC -#define FT_MACINTOSH 1 -#endif - -#endif - - - /*************************************************************************/ - /* */ - /*
    */ - /* basic_types */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Int16 */ - /* */ - /* */ - /* A typedef for a 16bit signed integer type. */ - /* */ - typedef signed short FT_Int16; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_UInt16 */ - /* */ - /* */ - /* A typedef for a 16bit unsigned integer type. */ - /* */ - typedef unsigned short FT_UInt16; - - /* */ - - - /* this #if 0 ... #endif clause is for documentation purposes */ -#if 0 - - /*************************************************************************/ - /* */ - /* */ - /* FT_Int32 */ - /* */ - /* */ - /* A typedef for a 32bit signed integer type. The size depends on */ - /* the configuration. */ - /* */ - typedef signed XXX FT_Int32; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_UInt32 */ - /* */ - /* A typedef for a 32bit unsigned integer type. The size depends on */ - /* the configuration. */ - /* */ - typedef unsigned XXX FT_UInt32; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Int64 */ - /* */ - /* A typedef for a 64bit signed integer type. The size depends on */ - /* the configuration. Only defined if there is real 64bit support; */ - /* otherwise, it gets emulated with a structure (if necessary). */ - /* */ - typedef signed XXX FT_Int64; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_UInt64 */ - /* */ - /* A typedef for a 64bit unsigned integer type. The size depends on */ - /* the configuration. Only defined if there is real 64bit support; */ - /* otherwise, it gets emulated with a structure (if necessary). */ - /* */ - typedef unsigned XXX FT_UInt64; - - /* */ - -#endif - -#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT) - - typedef signed int FT_Int32; - typedef unsigned int FT_UInt32; - -#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT) - - typedef signed long FT_Int32; - typedef unsigned long FT_UInt32; - -#else -#error "no 32bit type found -- please check your configuration files" -#endif - - - /* look up an integer type that is at least 32 bits */ -#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT) - - typedef int FT_Fast; - typedef unsigned int FT_UFast; - -#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT) - - typedef long FT_Fast; - typedef unsigned long FT_UFast; - -#endif - - - /* determine whether we have a 64-bit int type for platforms without */ - /* Autoconf */ -#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) - - /* FT_LONG64 must be defined if a 64-bit type is available */ -#define FT_LONG64 -#define FT_INT64 long -#define FT_UINT64 unsigned long - - /*************************************************************************/ - /* */ - /* A 64-bit data type may create compilation problems if you compile */ - /* in strict ANSI mode. To avoid them, we disable other 64-bit data */ - /* types if __STDC__ is defined. You can however ignore this rule */ - /* by defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ - /* */ -#elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 ) - -#if defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 -#define FT_UINT64 unsigned __int64 - -#elif defined( __BORLANDC__ ) /* Borland C++ */ - - /* XXXX: We should probably check the value of __BORLANDC__ in order */ - /* to test the compiler version. */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 -#define FT_UINT64 unsigned __int64 - -#elif defined( __WATCOMC__ ) /* Watcom C++ */ - - /* Watcom doesn't provide 64-bit data types */ - -#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ - -#define FT_LONG64 -#define FT_INT64 long long int -#define FT_UINT64 unsigned long long int - -#elif defined( __GNUC__ ) - - /* GCC provides the `long long' type */ -#define FT_LONG64 -#define FT_INT64 long long int -#define FT_UINT64 unsigned long long int - -#endif /* _MSC_VER */ - -#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ - -#ifdef FT_LONG64 - typedef FT_INT64 FT_Int64; - typedef FT_UINT64 FT_UInt64; -#endif - - - /*************************************************************************/ - /* */ - /* miscellaneous */ - /* */ - /*************************************************************************/ - - -#define FT_BEGIN_STMNT do { -#define FT_END_STMNT } while ( 0 ) -#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT - - - /* typeof condition taken from gnulib's `intprops.h' header file */ -#if ( __GNUC__ >= 2 || \ - defined( __IBM__TYPEOF__ ) || \ - ( __SUNPRO_C >= 0x5110 && !__STDC__ ) ) -#define FT_TYPEOF( type ) (__typeof__ (type)) -#else -#define FT_TYPEOF( type ) /* empty */ -#endif - - -#ifdef FT_MAKE_OPTION_SINGLE_OBJECT - -#define FT_LOCAL( x ) static x -#define FT_LOCAL_DEF( x ) static x - -#else - -#ifdef __cplusplus -#define FT_LOCAL( x ) extern "C" x -#define FT_LOCAL_DEF( x ) extern "C" x -#else -#define FT_LOCAL( x ) extern x -#define FT_LOCAL_DEF( x ) x -#endif - -#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ - -#define FT_LOCAL_ARRAY( x ) extern const x -#define FT_LOCAL_ARRAY_DEF( x ) const x - - -#ifndef FT_BASE - -#ifdef __cplusplus -#define FT_BASE( x ) extern "C" x -#else -#define FT_BASE( x ) extern x -#endif - -#endif /* !FT_BASE */ - - -#ifndef FT_BASE_DEF - -#ifdef __cplusplus -#define FT_BASE_DEF( x ) x -#else -#define FT_BASE_DEF( x ) x -#endif - -#endif /* !FT_BASE_DEF */ - - -#ifndef FT_EXPORT - -#ifdef __cplusplus -#define FT_EXPORT( x ) extern "C" x -#else -#define FT_EXPORT( x ) extern x -#endif - -#endif /* !FT_EXPORT */ - - -#ifndef FT_EXPORT_DEF - -#ifdef __cplusplus -#define FT_EXPORT_DEF( x ) extern "C" x -#else -#define FT_EXPORT_DEF( x ) extern x -#endif - -#endif /* !FT_EXPORT_DEF */ - - -#ifndef FT_EXPORT_VAR - -#ifdef __cplusplus -#define FT_EXPORT_VAR( x ) extern "C" x -#else -#define FT_EXPORT_VAR( x ) extern x -#endif - -#endif /* !FT_EXPORT_VAR */ - - /* The following macros are needed to compile the library with a */ - /* C++ compiler and with 16bit compilers. */ - /* */ - - /* This is special. Within C++, you must specify `extern "C"' for */ - /* functions which are used via function pointers, and you also */ - /* must do that for structures which contain function pointers to */ - /* assure C linkage -- it's not possible to have (local) anonymous */ - /* functions which are accessed by (global) function pointers. */ - /* */ - /* */ - /* FT_CALLBACK_DEF is used to _define_ a callback function. */ - /* */ - /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ - /* contains pointers to callback functions. */ - /* */ - /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ - /* that contains pointers to callback functions. */ - /* */ - /* */ - /* Some 16bit compilers have to redefine these macros to insert */ - /* the infamous `_cdecl' or `__fastcall' declarations. */ - /* */ -#ifndef FT_CALLBACK_DEF -#ifdef __cplusplus -#define FT_CALLBACK_DEF( x ) extern "C" x -#else -#define FT_CALLBACK_DEF( x ) static x -#endif -#endif /* FT_CALLBACK_DEF */ - -#ifndef FT_CALLBACK_TABLE -#ifdef __cplusplus -#define FT_CALLBACK_TABLE extern "C" -#define FT_CALLBACK_TABLE_DEF extern "C" -#else -#define FT_CALLBACK_TABLE extern -#define FT_CALLBACK_TABLE_DEF /* nothing */ -#endif -#endif /* FT_CALLBACK_TABLE */ - - -FT_END_HEADER - - -#endif /* __FTCONFIG_H__ */ - - -/* END */ diff --git a/3party/freetype/builds/vms/ftsystem.c b/3party/freetype/builds/vms/ftsystem.c deleted file mode 100644 index 74d3392cef..0000000000 --- a/3party/freetype/builds/vms/ftsystem.c +++ /dev/null @@ -1,328 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsystem.c */ -/* */ -/* VMS-specific FreeType low-level system interface (body). */ -/* */ -/* Copyright 1996-2015 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 - /* we use our special ftconfig.h file, not the standard one */ -#include -#include FT_INTERNAL_DEBUG_H -#include FT_SYSTEM_H -#include FT_ERRORS_H -#include FT_TYPES_H -#include FT_INTERNAL_OBJECTS_H - - /* memory-mapping includes and definitions */ -#ifdef HAVE_UNISTD_H -#include -#endif - -#include -#ifndef MAP_FILE -#define MAP_FILE 0x00 -#endif - -#ifdef MUNMAP_USES_VOIDP -#define MUNMAP_ARG_CAST void * -#else -#define MUNMAP_ARG_CAST char * -#endif - -#ifdef NEED_MUNMAP_DECL - -#ifdef __cplusplus - extern "C" -#else - extern -#endif - int - munmap( char* addr, - int len ); - -#define MUNMAP_ARG_CAST char * - -#endif /* NEED_DECLARATION_MUNMAP */ - - -#include -#include - -#ifdef HAVE_FCNTL_H -#include -#endif - -#include -#include -#include - - - /*************************************************************************/ - /* */ - /* MEMORY MANAGEMENT INTERFACE */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* ft_alloc */ - /* */ - /* */ - /* The memory allocation function. */ - /* */ - /* */ - /* memory :: A pointer to the memory object. */ - /* */ - /* size :: The requested size in bytes. */ - /* */ - /* */ - /* The address of newly allocated block. */ - /* */ - FT_CALLBACK_DEF( void* ) - ft_alloc( FT_Memory memory, - long size ) - { - FT_UNUSED( memory ); - - return malloc( size ); - } - - - /*************************************************************************/ - /* */ - /* */ - /* ft_realloc */ - /* */ - /* */ - /* The memory reallocation function. */ - /* */ - /* */ - /* memory :: A pointer to the memory object. */ - /* */ - /* cur_size :: The current size of the allocated memory block. */ - /* */ - /* new_size :: The newly requested size in bytes. */ - /* */ - /* block :: The current address of the block in memory. */ - /* */ - /* */ - /* The address of the reallocated memory block. */ - /* */ - FT_CALLBACK_DEF( void* ) - ft_realloc( FT_Memory memory, - long cur_size, - long new_size, - void* block ) - { - FT_UNUSED( memory ); - FT_UNUSED( cur_size ); - - return realloc( block, new_size ); - } - - - /*************************************************************************/ - /* */ - /* */ - /* ft_free */ - /* */ - /* */ - /* The memory release function. */ - /* */ - /* */ - /* memory :: A pointer to the memory object. */ - /* */ - /* block :: The address of block in memory to be freed. */ - /* */ - FT_CALLBACK_DEF( void ) - ft_free( FT_Memory memory, - void* block ) - { - FT_UNUSED( memory ); - - free( block ); - } - - - /*************************************************************************/ - /* */ - /* RESOURCE MANAGEMENT INTERFACE */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_io - - /* We use the macro STREAM_FILE for convenience to extract the */ - /* system-specific stream handle from a given FreeType stream object */ -#define STREAM_FILE( stream ) ( (FILE*)stream->descriptor.pointer ) - - - /*************************************************************************/ - /* */ - /* */ - /* ft_close_stream */ - /* */ - /* */ - /* The function to close a stream. */ - /* */ - /* */ - /* stream :: A pointer to the stream object. */ - /* */ - FT_CALLBACK_DEF( void ) - ft_close_stream( FT_Stream stream ) - { - munmap( (MUNMAP_ARG_CAST)stream->descriptor.pointer, stream->size ); - - stream->descriptor.pointer = NULL; - stream->size = 0; - stream->base = 0; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( FT_Error ) - FT_Stream_Open( FT_Stream stream, - const char* filepathname ) - { - int file; - struct stat stat_buf; - - - if ( !stream ) - return FT_THROW( Invalid_Stream_Handle ); - - /* open the file */ - file = open( filepathname, O_RDONLY ); - if ( file < 0 ) - { - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " could not open `%s'\n", filepathname )); - return FT_THROW( Cannot_Open_Resource ); - } - - if ( fstat( file, &stat_buf ) < 0 ) - { - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " could not `fstat' file `%s'\n", filepathname )); - goto Fail_Map; - } - - stream->size = stat_buf.st_size; - if ( !stream->size ) - { - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " opened `%s' but zero-sized\n", filepathname )); - goto Fail_Map; - } - - stream->pos = 0; - stream->base = (unsigned char *)mmap( NULL, - stream->size, - PROT_READ, - MAP_FILE | MAP_PRIVATE, - file, - 0 ); - - if ( (long)stream->base == -1 ) - { - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " could not `mmap' file `%s'\n", filepathname )); - goto Fail_Map; - } - - close( file ); - - stream->descriptor.pointer = stream->base; - stream->pathname.pointer = (char*)filepathname; - - stream->close = ft_close_stream; - stream->read = 0; - - FT_TRACE1(( "FT_Stream_Open:" )); - FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", - filepathname, stream->size )); - - return FT_Err_Ok; - - Fail_Map: - close( file ); - - stream->base = NULL; - stream->size = 0; - stream->pos = 0; - - return FT_THROW( Cannot_Open_Stream ); - } - - -#ifdef FT_DEBUG_MEMORY - - extern FT_Int - ft_mem_debug_init( FT_Memory memory ); - - extern void - ft_mem_debug_done( FT_Memory memory ); - -#endif - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( FT_Memory ) - FT_New_Memory( void ) - { - FT_Memory memory; - - - memory = (FT_Memory)malloc( sizeof ( *memory ) ); - if ( memory ) - { - memory->user = 0; - memory->alloc = ft_alloc; - memory->realloc = ft_realloc; - memory->free = ft_free; -#ifdef FT_DEBUG_MEMORY - ft_mem_debug_init( memory ); -#endif - } - - return memory; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( void ) - FT_Done_Memory( FT_Memory memory ) - { -#ifdef FT_DEBUG_MEMORY - ft_mem_debug_done( memory ); -#endif - memory->free( memory, memory ); - } - - -/* END */ diff --git a/3party/freetype/builds/wince/ftdebug.c b/3party/freetype/builds/wince/ftdebug.c deleted file mode 100644 index 17b4d61459..0000000000 --- a/3party/freetype/builds/wince/ftdebug.c +++ /dev/null @@ -1,255 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftdebug.c */ -/* */ -/* Debugging and logging component for WinCE (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This component contains various macros and functions used to ease the */ - /* debugging of the FreeType engine. Its main purpose is in assertion */ - /* checking, tracing, and error detection. */ - /* */ - /* There are now three debugging modes: */ - /* */ - /* - trace mode */ - /* */ - /* Error and trace messages are sent to the log file (which can be the */ - /* standard error output). */ - /* */ - /* - error mode */ - /* */ - /* Only error messages are generated. */ - /* */ - /* - release mode: */ - /* */ - /* No error message is sent or generated. The code is free from any */ - /* debugging parts. */ - /* */ - /*************************************************************************/ - - -#include -#include FT_INTERNAL_DEBUG_H - - -#ifdef FT_DEBUG_LEVEL_ERROR - - -#include -#include -#include - -#include - - - void - OutputDebugStringEx( const char* str ) - { - static WCHAR buf[8192]; - - - int sz = MultiByteToWideChar( CP_ACP, 0, str, -1, buf, - sizeof ( buf ) / sizeof ( *buf ) ); - if ( !sz ) - lstrcpyW( buf, L"OutputDebugStringEx: MultiByteToWideChar failed" ); - - OutputDebugStringW( buf ); - } - - - FT_BASE_DEF( void ) - FT_Message( const char* fmt, - ... ) - { - static char buf[8192]; - va_list ap; - - - va_start( ap, fmt ); - vprintf( fmt, ap ); - /* send the string to the debugger as well */ - vsprintf( buf, fmt, ap ); - OutputDebugStringEx( buf ); - va_end( ap ); - } - - - FT_BASE_DEF( void ) - FT_Panic( const char* fmt, - ... ) - { - static char buf[8192]; - va_list ap; - - - va_start( ap, fmt ); - vsprintf( buf, fmt, ap ); - OutputDebugStringEx( buf ); - va_end( ap ); - - exit( EXIT_FAILURE ); - } - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( int ) - FT_Throw( FT_Error error, - int line, - const char* file ) - { - FT_UNUSED( error ); - FT_UNUSED( line ); - FT_UNUSED( file ); - - return 0; - } - -#ifdef FT_DEBUG_LEVEL_TRACE - - - /* array of trace levels, initialized to 0 */ - int ft_trace_levels[trace_count]; - - /* define array of trace toggle names */ -#define FT_TRACE_DEF( x ) #x , - - static const char* ft_trace_toggles[trace_count + 1] = - { -#include FT_INTERNAL_TRACE_H - NULL - }; - -#undef FT_TRACE_DEF - - - /*************************************************************************/ - /* */ - /* Initialize the tracing sub-system. This is done by retrieving the */ - /* value of the "FT2_DEBUG" environment variable. It must be a list of */ - /* toggles, separated by spaces, `;' or `,'. Example: */ - /* */ - /* "any:3 memory:6 stream:5" */ - /* */ - /* This will request that all levels be set to 3, except the trace level */ - /* for the memory and stream components which are set to 6 and 5, */ - /* respectively. */ - /* */ - /* See the file `include/freetype/internal/fttrace.h' for details of the */ - /* available toggle names. */ - /* */ - /* The level must be between 0 and 6; 0 means quiet (except for serious */ - /* runtime errors), and 6 means _very_ verbose. */ - /* */ - FT_BASE_DEF( void ) - ft_debug_init( void ) - { - /* Windows Mobile doesn't have environment API: */ - /* GetEnvironmentStrings, GetEnvironmentVariable, getenv. */ - /* */ - /* FIXME!!! How to set debug mode? */ - - /* const char* ft2_debug = getenv( "FT2_DEBUG" ); */ - - const char* ft2_debug = 0; - - - if ( ft2_debug ) - { - const char* p = ft2_debug; - const char* q; - - - for ( ; *p; p++ ) - { - /* skip leading whitespace and separators */ - if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) - continue; - - /* read toggle name, followed by ':' */ - q = p; - while ( *p && *p != ':' ) - p++; - - if ( !*p ) - break; - - if ( *p == ':' && p > q ) - { - int n, i, len = (int)( p - q ); - int level = -1, found = -1; - - - for ( n = 0; n < trace_count; n++ ) - { - const char* toggle = ft_trace_toggles[n]; - - - for ( i = 0; i < len; i++ ) - { - if ( toggle[i] != q[i] ) - break; - } - - if ( i == len && toggle[i] == 0 ) - { - found = n; - break; - } - } - - /* read level */ - p++; - if ( *p ) - { - level = *p - '0'; - if ( level < 0 || level > 7 ) - level = -1; - } - - if ( found >= 0 && level >= 0 ) - { - if ( found == trace_any ) - { - /* special case for "any" */ - for ( n = 0; n < trace_count; n++ ) - ft_trace_levels[n] = level; - } - else - ft_trace_levels[found] = level; - } - } - } - } - } - - -#else /* !FT_DEBUG_LEVEL_TRACE */ - - - FT_BASE_DEF( void ) - ft_debug_init( void ) - { - /* nothing */ - } - - -#endif /* !FT_DEBUG_LEVEL_TRACE */ - -#endif /* FT_DEBUG_LEVEL_ERROR */ - - -/* END */ diff --git a/3party/freetype/builds/wince/vc2005-ce/index.html b/3party/freetype/builds/wince/vc2005-ce/index.html deleted file mode 100644 index a8e92d7007..0000000000 --- a/3party/freetype/builds/wince/vc2005-ce/index.html +++ /dev/null @@ -1,47 +0,0 @@ - -
    - - FreeType 2 Project Files for VS.NET 2005 - (Pocket PC) - - - -

    - FreeType 2 Project Files for VS.NET 2005 - (Pocket PC) -

    - -

    This directory contains project files for Visual C++, named -freetype.vcproj, and Visual Studio, called freetype.sln for -the following targets: - -

      -
    • PPC/SP 2003 (Pocket PC 2003)
    • -
    • PPC/SP WM5 (Windows Mobile 5)
    • -
    • PPC/SP WM6 (Windows Mobile 6)
    • -
    - -It compiles the following libraries from the FreeType 2.6 sources:

    - -
      -
      -    freetype26.lib     - release build; single threaded
      -    freetype26_D.lib   - debug build;   single threaded
      -    freetype26MT.lib   - release build; multi-threaded
      -    freetype26MT_D.lib - debug build;   multi-threaded
      -
    - -

    Be sure to extract the files with the Windows (CR+LF) line endings. ZIP -archives are already stored this way, so no further action is required. If -you use some .tar.*z archives, be sure to configure your extracting -tool to convert the line endings. For example, with WinZip, you should activate the TAR -file smart CR/LF Conversion option. Alternatively, you may consider -using the unix2dos or u2d utilities that are floating -around, which specifically deal with this particular problem. - -

    Build directories are placed in the top-level objs -directory.

    - - - diff --git a/3party/freetype/builds/wince/vc2008-ce/index.html b/3party/freetype/builds/wince/vc2008-ce/index.html deleted file mode 100644 index ebf13768ba..0000000000 --- a/3party/freetype/builds/wince/vc2008-ce/index.html +++ /dev/null @@ -1,47 +0,0 @@ - -
    - - FreeType 2 Project Files for VS.NET 2008 - (Pocket PC) - - - -

    - FreeType 2 Project Files for VS.NET 2008 - (Pocket PC) -

    - -

    This directory contains project files for Visual C++, named -freetype.dsp, and Visual Studio, called freetype.sln for -the following targets: - -

      -
    • PPC/SP 2003 (Pocket PC 2003)
    • -
    • PPC/SP WM5 (Windows Mobile 5)
    • -
    • PPC/SP WM6 (Windows Mobile 6)
    • -
    - -It compiles the following libraries from the FreeType 2.6 sources:

    - -
      -
      -    freetype26.lib     - release build; single threaded
      -    freetype26_D.lib   - debug build;   single threaded
      -    freetype26MT.lib   - release build; multi-threaded
      -    freetype26MT_D.lib - debug build;   multi-threaded
      -
    - -

    Be sure to extract the files with the Windows (CR+LF) line endings. ZIP -archives are already stored this way, so no further action is required. If -you use some .tar.*z archives, be sure to configure your extracting -tool to convert the line endings. For example, with WinZip, you should activate the TAR -file smart CR/LF Conversion option. Alternatively, you may consider -using the unix2dos or u2d utilities that are floating -around, which specifically deal with this particular problem. - -

    Build directories are placed in the top-level objs -directory.

    - - - diff --git a/3party/freetype/builds/windows/detect.mk b/3party/freetype/builds/windows/detect.mk deleted file mode 100644 index 26297f20fb..0000000000 --- a/3party/freetype/builds/windows/detect.mk +++ /dev/null @@ -1,184 +0,0 @@ -# -# FreeType 2 configuration file to detect a Win32 host platform. -# - - -# Copyright 1996-2015 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. - - -.PHONY: setup - - -ifeq ($(PLATFORM),ansi) - - # Detecting Windows NT is easy, as the OS variable must be defined and - # contains `Windows_NT'. This also works with Windows 2000 and XP. - # - ifeq ($(OS),Windows_NT) - - PLATFORM := windows - - else - - # Detecting Windows 9X - - # We used to run the `ver' command to see if its output contains the - # word `Windows'. If this is true, we are running Windows 95 or later: - # - # ifdef COMSPEC - # # First, check if we have the COMSPEC environment variable, which - # # indicates we can use COMMAND.COM's internal commands - # is_windows := $(findstring Windows,$(strip $(shell ver))) - # endif - # - # Unfortunately, this also detects the case when one is running - # DOS 7.x (the MS-DOS version that lies below Windows) without actually - # launching the GUI. - # - # A better test is to check whether there are both the environment - # variables `winbootdir' and `windir'. The first indicates an - # underlying DOS 7.x, while the second is set only if windows is - # available. - # - # Note that on Windows NT, such an environment variable will not be seen - # from DOS-based tools like DJGPP's make; this is not actually a problem - # since NT is detected independently above. But do not try to be clever! - # - ifdef winbootdir - ifdef windir - - PLATFORM := windows - - endif - endif - - endif # test NT - -endif # test PLATFORM ansi - -ifeq ($(PLATFORM),windows) - - DELETE := del - CAT := type - SEP := $(BACKSLASH) - - # Setting COPY is a bit trickier. Plain COPY on NT will not work - # correctly, because it will uppercase 8.3 filenames, creating a - # `CONFIG.MK' file which isn't found later on by `make'. - # Since we do not want that, we need to force execution of CMD.EXE. - # Unfortunately, CMD.EXE is not available on Windows 9X. - # So we need to hack. - # - # Kudos to Eli Zaretskii (DJGPP guru) that helped debug it. - # Details are available in threads of the freetype mailing list - # (2004-11-11), and then in the devel mailing list (2004-11-20 to -23). - # - ifeq ($(OS),Windows_NT) - COPY := cmd.exe /c copy - else - COPY := copy - endif # test NT - - - # gcc Makefile by default - CONFIG_FILE := w32-gcc.mk - ifeq ($(firstword $(CC)),cc) - CC := gcc - endif - - ifneq ($(findstring list,$(MAKECMDGOALS)),) # test for the "list" target - dump_target_list: - @echo - @echo $(PROJECT_TITLE) build system -- supported compilers - @echo - @echo Several command-line compilers are supported on Win32: - @echo - @echo make setupgcc (with Mingw) - @echo make setup visualcMicrosoft Visual C++ - @echo make setup bcc32Borland C/C++ - @echo make setup lccWin32-LCC - @echo make setup intelcIntel C/C++ - @echo - - setup: dump_target_list - .PHONY: dump_target_list list - else - setup: dos_setup - endif - - # additionally, we provide hooks for various other compilers - # - ifneq ($(findstring visualc,$(MAKECMDGOALS)),) # Visual C/C++ - CONFIG_FILE := w32-vcc.mk - CC := cl - visualc: setup - .PHONY: visualc - endif - - ifneq ($(findstring intelc,$(MAKECMDGOALS)),) # Intel C/C++ - CONFIG_FILE := w32-intl.mk - CC := cl - visualc: setup - .PHONY: intelc - endif - - ifneq ($(findstring watcom,$(MAKECMDGOALS)),) # Watcom C/C++ - CONFIG_FILE := w32-wat.mk - CC := wcc386 - watcom: setup - .PHONY: watcom - endif - - ifneq ($(findstring visualage,$(MAKECMDGOALS)),) # Visual Age C++ - CONFIG_FILE := w32-icc.mk - CC := icc - visualage: setup - .PHONY: visualage - endif - - ifneq ($(findstring lcc,$(MAKECMDGOALS)),) # LCC-Win32 - CONFIG_FILE := w32-lcc.mk - CC := lcc - lcc: setup - .PHONY: lcc - endif - - ifneq ($(findstring mingw32,$(MAKECMDGOALS)),) # mingw32 - CONFIG_FILE := w32-mingw32.mk - CC := gcc - mingw32: setup - .PHONY: mingw32 - endif - - ifneq ($(findstring bcc32,$(MAKECMDGOALS)),) # Borland C++ - CONFIG_FILE := w32-bcc.mk - CC := bcc32 - bcc32: setup - .PHONY: bcc32 - endif - - ifneq ($(findstring devel-bcc,$(MAKECMDGOALS)),) # development target - CONFIG_FILE := w32-bccd.mk - CC := bcc32 - devel-bcc: setup - .PHONY: devel-bcc - endif - - ifneq ($(findstring devel-gcc,$(MAKECMDGOALS)),) # development target - CONFIG_FILE := w32-dev.mk - CC := gcc - devel-gcc: setup - .PHONY: devel-gcc - endif - -endif # test PLATFORM windows - - -# EOF diff --git a/3party/freetype/builds/windows/ftdebug.c b/3party/freetype/builds/windows/ftdebug.c deleted file mode 100644 index 09c3b65a72..0000000000 --- a/3party/freetype/builds/windows/ftdebug.c +++ /dev/null @@ -1,237 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftdebug.c */ -/* */ -/* Debugging and logging component for Win32 (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This component contains various macros and functions used to ease the */ - /* debugging of the FreeType engine. Its main purpose is in assertion */ - /* checking, tracing, and error detection. */ - /* */ - /* There are now three debugging modes: */ - /* */ - /* - trace mode */ - /* */ - /* Error and trace messages are sent to the log file (which can be the */ - /* standard error output). */ - /* */ - /* - error mode */ - /* */ - /* Only error messages are generated. */ - /* */ - /* - release mode: */ - /* */ - /* No error message is sent or generated. The code is free from any */ - /* debugging parts. */ - /* */ - /*************************************************************************/ - - -#include -#include FT_INTERNAL_DEBUG_H - - -#ifdef FT_DEBUG_LEVEL_ERROR - -#include -#include -#include - -#include - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( void ) - FT_Message( const char* fmt, - ... ) - { - static char buf[8192]; - va_list ap; - - - va_start( ap, fmt ); - vprintf( fmt, ap ); - /* send the string to the debugger as well */ - vsprintf( buf, fmt, ap ); - OutputDebugStringA( buf ); - va_end( ap ); - } - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( void ) - FT_Panic( const char* fmt, - ... ) - { - static char buf[8192]; - va_list ap; - - - va_start( ap, fmt ); - vsprintf( buf, fmt, ap ); - OutputDebugStringA( buf ); - va_end( ap ); - - exit( EXIT_FAILURE ); - } - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( int ) - FT_Throw( FT_Error error, - int line, - const char* file ) - { - FT_UNUSED( error ); - FT_UNUSED( line ); - FT_UNUSED( file ); - - return 0; - } - - -#ifdef FT_DEBUG_LEVEL_TRACE - - - /* array of trace levels, initialized to 0 */ - int ft_trace_levels[trace_count]; - - /* define array of trace toggle names */ -#define FT_TRACE_DEF( x ) #x , - - static const char* ft_trace_toggles[trace_count + 1] = - { -#include FT_INTERNAL_TRACE_H - NULL - }; - -#undef FT_TRACE_DEF - - - /*************************************************************************/ - /* */ - /* Initialize the tracing sub-system. This is done by retrieving the */ - /* value of the "FT2_DEBUG" environment variable. It must be a list of */ - /* toggles, separated by spaces, `;' or `,'. Example: */ - /* */ - /* "any:3 memory:6 stream:5" */ - /* */ - /* This will request that all levels be set to 3, except the trace level */ - /* for the memory and stream components which are set to 6 and 5, */ - /* respectively. */ - /* */ - /* See the file `include/freetype/internal/fttrace.h' for details of the */ - /* available toggle names. */ - /* */ - /* The level must be between 0 and 6; 0 means quiet (except for serious */ - /* runtime errors), and 6 means _very_ verbose. */ - /* */ - FT_BASE_DEF( void ) - ft_debug_init( void ) - { - const char* ft2_debug = getenv( "FT2_DEBUG" ); - - - if ( ft2_debug ) - { - const char* p = ft2_debug; - const char* q; - - - for ( ; *p; p++ ) - { - /* skip leading whitespace and separators */ - if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) - continue; - - /* read toggle name, followed by ':' */ - q = p; - while ( *p && *p != ':' ) - p++; - - if ( !*p ) - break; - - if ( *p == ':' && p > q ) - { - int n, i, len = (int)( p - q ); - int level = -1, found = -1; - - - for ( n = 0; n < trace_count; n++ ) - { - const char* toggle = ft_trace_toggles[n]; - - - for ( i = 0; i < len; i++ ) - { - if ( toggle[i] != q[i] ) - break; - } - - if ( i == len && toggle[i] == 0 ) - { - found = n; - break; - } - } - - /* read level */ - p++; - if ( *p ) - { - level = *p - '0'; - if ( level < 0 || level > 7 ) - level = -1; - } - - if ( found >= 0 && level >= 0 ) - { - if ( found == trace_any ) - { - /* special case for "any" */ - for ( n = 0; n < trace_count; n++ ) - ft_trace_levels[n] = level; - } - else - ft_trace_levels[found] = level; - } - } - } - } - } - - -#else /* !FT_DEBUG_LEVEL_TRACE */ - - - FT_BASE_DEF( void ) - ft_debug_init( void ) - { - /* nothing */ - } - - -#endif /* !FT_DEBUG_LEVEL_TRACE */ - -#endif /* FT_DEBUG_LEVEL_ERROR */ - - -/* END */ diff --git a/3party/freetype/builds/windows/vc2005/index.html b/3party/freetype/builds/windows/vc2005/index.html deleted file mode 100644 index 7d47e39a4a..0000000000 --- a/3party/freetype/builds/windows/vc2005/index.html +++ /dev/null @@ -1,37 +0,0 @@ - -
    - - FreeType 2 Project Files for VS.NET 2005 - - - -

    - FreeType 2 Project Files for VS.NET 2005 -

    - -

    This directory contains project files for Visual C++, named -freetype.vcproj, and Visual Studio, called freetype.sln. It -compiles the following libraries from the FreeType 2.6 sources:

    - -
      -
      -    freetype26.lib     - release build; single threaded
      -    freetype26_D.lib   - debug build;   single threaded
      -    freetype26MT.lib   - release build; multi-threaded
      -    freetype26MT_D.lib - debug build;   multi-threaded
      -
    - -

    Be sure to extract the files with the Windows (CR+LF) line endings. ZIP -archives are already stored this way, so no further action is required. If -you use some .tar.*z archives, be sure to configure your extracting -tool to convert the line endings. For example, with WinZip, you should activate the TAR -file smart CR/LF Conversion option. Alternatively, you may consider -using the unix2dos or u2d utilities that are floating -around, which specifically deal with this particular problem. - -

    Build directories are placed in the top-level objs -directory.

    - - - diff --git a/3party/freetype/builds/windows/vc2008/index.html b/3party/freetype/builds/windows/vc2008/index.html deleted file mode 100644 index 533337f009..0000000000 --- a/3party/freetype/builds/windows/vc2008/index.html +++ /dev/null @@ -1,37 +0,0 @@ - -
    - - FreeType 2 Project Files for VS.NET 2008 - - - -

    - FreeType 2 Project Files for VS.NET 2008 -

    - -

    This directory contains project files for Visual C++, named -freetype.vcproj, and Visual Studio, called freetype.sln. It -compiles the following libraries from the FreeType 2.6 sources:

    - -
      -
      -    freetype26.lib     - release build; single threaded
      -    freetype26_D.lib   - debug build;   single threaded
      -    freetype26MT.lib   - release build; multi-threaded
      -    freetype26MT_D.lib - debug build;   multi-threaded
      -
    - -

    Be sure to extract the files with the Windows (CR+LF) line endings. ZIP -archives are already stored this way, so no further action is required. If -you use some .tar.*z archives, be sure to configure your extracting -tool to convert the line endings. For example, with WinZip, you should activate the TAR -file smart CR/LF Conversion option. Alternatively, you may consider -using the unix2dos or u2d utilities that are floating -around, which specifically deal with this particular problem. - -

    Build directories are placed in the top-level objs -directory.

    - - - diff --git a/3party/freetype/builds/windows/vc2010/freetype.user.props b/3party/freetype/builds/windows/vc2010/freetype.user.props deleted file mode 100644 index 78310d4631..0000000000 --- a/3party/freetype/builds/windows/vc2010/freetype.user.props +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3party/freetype/builds/windows/vc2010/index.html b/3party/freetype/builds/windows/vc2010/index.html deleted file mode 100644 index 37e642d3f1..0000000000 --- a/3party/freetype/builds/windows/vc2010/index.html +++ /dev/null @@ -1,52 +0,0 @@ - -
    - - FreeType 2 Project Files for VS.NET 2010 or newer - - - -

    - FreeType 2 Project Files for VS.NET 2010 or newer -

    - -

    This directory contains a project file for Visual C++ (VS.NET 2010 -or newer), named freetype.vcxproj, and Visual Studio, called -freetype.sln. It compiles the following libraries from the -FreeType 2.6 sources:

    - -
      -
      -freetype26.lib     - release build
      -freetype26d.lib    - debug build
      -freetype26ST.lib   - release build; single threaded
      -freetype26STd.lib  - debug build;   single threaded
      -freetype26MT.lib   - release build; multi-threaded
      -freetype26MTd.lib  - debug build;   multi-threaded
      -
    - -

    Both Win32 and x64 builds are supported.

    - -

    Be sure to extract the files with the Windows (CR+LF) line endings. ZIP -archives are already stored this way, so no further action is required. If -you use some .tar.*z archives, be sure to configure your extracting -tool to convert the line endings. For example, with WinZip, you should activate the TAR -file smart CR/LF Conversion option. Alternatively, you may consider -using the unix2dos or u2d utilities that are floating -around, which specifically deal with this particular problem. - -

    Build directories are placed in the top-level objs\vc2010 -directory.

    - -

    Customization of the FreeType library is done by editing the -ftoptions.h header file in the top-level devel path. -Alternatively, you may copy the file to another directory and change the -include directory in freetype.users.props.

    - -

    To configure library dependencies like zlib and libpng, -edit the freetype.users.props file in this directory. It also -simplifies automated (command-line) builds using msbuild.

    - - - diff --git a/3party/freetype/builds/windows/visualc/freetype.dsp b/3party/freetype/builds/windows/visualc/freetype.dsp deleted file mode 100644 index faa8d1c423..0000000000 --- a/3party/freetype/builds/windows/visualc/freetype.dsp +++ /dev/null @@ -1,400 +0,0 @@ -# Microsoft Developer Studio Project File - Name="freetype" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=freetype - Win32 Debug Singlethreaded -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "freetype.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "freetype.mak" CFG="freetype - Win32 Debug Singlethreaded" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "freetype - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "freetype - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE "freetype - Win32 Debug Multithreaded" (based on "Win32 (x86) Static Library") -!MESSAGE "freetype - Win32 Release Multithreaded" (based on "Win32 (x86) Static Library") -!MESSAGE "freetype - Win32 Release Singlethreaded" (based on "Win32 (x86) Static Library") -!MESSAGE "freetype - Win32 Debug Singlethreaded" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "freetype - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\..\objs\release" -# PROP Intermediate_Dir "..\..\..\objs\release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /MD /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c -# SUBTRACT CPP /nologo /Z /YX -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26.lib" - -!ELSEIF "$(CFG)" == "freetype - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\..\objs\debug" -# PROP Intermediate_Dir "..\..\..\objs\debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /MDd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c -# SUBTRACT CPP /nologo /X /YX -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26_D.lib" - -!ELSEIF "$(CFG)" == "freetype - Win32 Debug Multithreaded" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "freetype___Win32_Debug_Multithreaded" -# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Multithreaded" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\..\objs\debug_mt" -# PROP Intermediate_Dir "..\..\..\objs\debug_mt" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /Za /W3 /Gm /GX /ZI /Od /I "..\include\\" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /GZ /c -# SUBTRACT BASE CPP /X -# ADD CPP /MTd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c -# SUBTRACT CPP /nologo /X /YX -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo /out:"lib\freetype26_D.lib" -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26MT_D.lib" - -!ELSEIF "$(CFG)" == "freetype - Win32 Release Multithreaded" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "freetype___Win32_Release_Multithreaded" -# PROP BASE Intermediate_Dir "freetype___Win32_Release_Multithreaded" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\..\objs\release_mt" -# PROP Intermediate_Dir "..\..\..\objs\release_mt" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /Za /W3 /GX /O2 /I "..\include\\" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /c -# ADD CPP /MT /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c -# SUBTRACT CPP /nologo /Z /YX -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo /out:"lib\freetype26.lib" -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26MT.lib" - -!ELSEIF "$(CFG)" == "freetype - Win32 Release Singlethreaded" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "freetype___Win32_Release_Singlethreaded" -# PROP BASE Intermediate_Dir "freetype___Win32_Release_Singlethreaded" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\..\objs\release_st" -# PROP Intermediate_Dir "..\..\..\objs\release_st" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MD /Za /W4 /GX /Zi /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /FD /c -# SUBTRACT BASE CPP /YX -# ADD CPP /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c -# SUBTRACT CPP /nologo /Z /YX -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype26.lib" -# ADD LIB32 /out:"..\..\..\objs\freetype26ST.lib" -# SUBTRACT LIB32 /nologo - -!ELSEIF "$(CFG)" == "freetype - Win32 Debug Singlethreaded" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "freetype___Win32_Debug_Singlethreaded" -# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Singlethreaded" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\..\objs\debug_st" -# PROP Intermediate_Dir "..\..\..\objs\debug_st" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MDd /Za /W4 /Gm /GX /Zi /Od /I "..\..\..\include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /FD /GZ /c -# SUBTRACT BASE CPP /X /YX -# ADD CPP /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c -# SUBTRACT CPP /nologo /X /YX -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype26_D.lib" -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26ST_D.lib" - -!ENDIF - -# Begin Target - -# Name "freetype - Win32 Release" -# Name "freetype - Win32 Debug" -# Name "freetype - Win32 Debug Multithreaded" -# Name "freetype - Win32 Release Multithreaded" -# Name "freetype - Win32 Release Singlethreaded" -# Name "freetype - Win32 Debug Singlethreaded" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\..\src\autofit\autofit.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\bdf\bdf.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\cff\cff.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftbase.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftbbox.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftbdf.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftbitmap.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftfntfmt.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftfstype.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftgasp.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\cache\ftcache.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\ftdebug.c -# ADD CPP /Ze -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftglyph.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftgxval.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\gzip\ftgzip.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftinit.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\lzw\ftlzw.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftmm.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftotval.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftpfr.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftstroke.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftsynth.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftsystem.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\fttype1.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftwinfnt.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\pcf\pcf.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\pfr\pfr.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\psaux\psaux.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\pshinter\pshinter.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\psnames\psmodule.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\raster\raster.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\sfnt\sfnt.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\smooth\smooth.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\truetype\truetype.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\type1\type1.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\cid\type1cid.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\type42\type42.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\winfonts\winfnt.c -# SUBTRACT CPP /Fr -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\..\include\ft2build.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\include\freetype\config\ftconfig.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\include\freetype\config\ftheader.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\include\freetype\config\ftmodule.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\include\freetype\config\ftoption.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\include\freetype\config\ftstdlib.h -# End Source File -# End Group -# End Target -# End Project diff --git a/3party/freetype/builds/windows/visualc/freetype.dsw b/3party/freetype/builds/windows/visualc/freetype.dsw deleted file mode 100644 index b1b375dbbc..0000000000 --- a/3party/freetype/builds/windows/visualc/freetype.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "freetype"=.\freetype.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/3party/freetype/builds/windows/visualc/index.html b/3party/freetype/builds/windows/visualc/index.html deleted file mode 100644 index 2beb8a913c..0000000000 --- a/3party/freetype/builds/windows/visualc/index.html +++ /dev/null @@ -1,37 +0,0 @@ - -
    - - FreeType 2 Project Files for Visual C++ and VS.NET 2005 - - - -

    - FreeType 2 Project Files for Visual C++ and VS.NET 2005 -

    - -

    This directory contains project files for Visual C++, named -freetype.dsp, and Visual Studio, called freetype.sln. It -compiles the following libraries from the FreeType 2.6 sources:

    - -
      -
      -    freetype26.lib     - release build; single threaded
      -    freetype26_D.lib   - debug build;   single threaded
      -    freetype26MT.lib   - release build; multi-threaded
      -    freetype26MT_D.lib - debug build;   multi-threaded
      -
    - -

    Be sure to extract the files with the Windows (CR+LF) line endings. ZIP -archives are already stored this way, so no further action is required. If -you use some .tar.*z archives, be sure to configure your extracting -tool to convert the line endings. For example, with WinZip, you should activate the TAR -file smart CR/LF Conversion option. Alternatively, you may consider -using the unix2dos or u2d utilities that are floating -around, which specifically deal with this particular problem. - -

    Build directories are placed in the top-level objs -directory.

    - - - diff --git a/3party/freetype/builds/windows/visualce/freetype.dsp b/3party/freetype/builds/windows/visualce/freetype.dsp deleted file mode 100644 index faa8d1c423..0000000000 --- a/3party/freetype/builds/windows/visualce/freetype.dsp +++ /dev/null @@ -1,400 +0,0 @@ -# Microsoft Developer Studio Project File - Name="freetype" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=freetype - Win32 Debug Singlethreaded -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "freetype.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "freetype.mak" CFG="freetype - Win32 Debug Singlethreaded" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "freetype - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "freetype - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE "freetype - Win32 Debug Multithreaded" (based on "Win32 (x86) Static Library") -!MESSAGE "freetype - Win32 Release Multithreaded" (based on "Win32 (x86) Static Library") -!MESSAGE "freetype - Win32 Release Singlethreaded" (based on "Win32 (x86) Static Library") -!MESSAGE "freetype - Win32 Debug Singlethreaded" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "freetype - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\..\objs\release" -# PROP Intermediate_Dir "..\..\..\objs\release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /MD /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c -# SUBTRACT CPP /nologo /Z /YX -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26.lib" - -!ELSEIF "$(CFG)" == "freetype - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\..\objs\debug" -# PROP Intermediate_Dir "..\..\..\objs\debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /MDd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c -# SUBTRACT CPP /nologo /X /YX -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26_D.lib" - -!ELSEIF "$(CFG)" == "freetype - Win32 Debug Multithreaded" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "freetype___Win32_Debug_Multithreaded" -# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Multithreaded" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\..\objs\debug_mt" -# PROP Intermediate_Dir "..\..\..\objs\debug_mt" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /Za /W3 /Gm /GX /ZI /Od /I "..\include\\" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /GZ /c -# SUBTRACT BASE CPP /X -# ADD CPP /MTd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c -# SUBTRACT CPP /nologo /X /YX -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo /out:"lib\freetype26_D.lib" -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26MT_D.lib" - -!ELSEIF "$(CFG)" == "freetype - Win32 Release Multithreaded" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "freetype___Win32_Release_Multithreaded" -# PROP BASE Intermediate_Dir "freetype___Win32_Release_Multithreaded" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\..\objs\release_mt" -# PROP Intermediate_Dir "..\..\..\objs\release_mt" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /Za /W3 /GX /O2 /I "..\include\\" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /c -# ADD CPP /MT /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c -# SUBTRACT CPP /nologo /Z /YX -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo /out:"lib\freetype26.lib" -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26MT.lib" - -!ELSEIF "$(CFG)" == "freetype - Win32 Release Singlethreaded" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "freetype___Win32_Release_Singlethreaded" -# PROP BASE Intermediate_Dir "freetype___Win32_Release_Singlethreaded" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\..\objs\release_st" -# PROP Intermediate_Dir "..\..\..\objs\release_st" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MD /Za /W4 /GX /Zi /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /FD /c -# SUBTRACT BASE CPP /YX -# ADD CPP /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c -# SUBTRACT CPP /nologo /Z /YX -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype26.lib" -# ADD LIB32 /out:"..\..\..\objs\freetype26ST.lib" -# SUBTRACT LIB32 /nologo - -!ELSEIF "$(CFG)" == "freetype - Win32 Debug Singlethreaded" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "freetype___Win32_Debug_Singlethreaded" -# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Singlethreaded" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\..\objs\debug_st" -# PROP Intermediate_Dir "..\..\..\objs\debug_st" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MDd /Za /W4 /Gm /GX /Zi /Od /I "..\..\..\include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /FD /GZ /c -# SUBTRACT BASE CPP /X /YX -# ADD CPP /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c -# SUBTRACT CPP /nologo /X /YX -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype26_D.lib" -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26ST_D.lib" - -!ENDIF - -# Begin Target - -# Name "freetype - Win32 Release" -# Name "freetype - Win32 Debug" -# Name "freetype - Win32 Debug Multithreaded" -# Name "freetype - Win32 Release Multithreaded" -# Name "freetype - Win32 Release Singlethreaded" -# Name "freetype - Win32 Debug Singlethreaded" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\..\src\autofit\autofit.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\bdf\bdf.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\cff\cff.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftbase.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftbbox.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftbdf.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftbitmap.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftfntfmt.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftfstype.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftgasp.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\cache\ftcache.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\ftdebug.c -# ADD CPP /Ze -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftglyph.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftgxval.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\gzip\ftgzip.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftinit.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\lzw\ftlzw.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftmm.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftotval.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftpfr.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftstroke.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftsynth.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftsystem.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\fttype1.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\base\ftwinfnt.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\pcf\pcf.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\pfr\pfr.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\psaux\psaux.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\pshinter\pshinter.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\psnames\psmodule.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\raster\raster.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\sfnt\sfnt.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\smooth\smooth.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\truetype\truetype.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\type1\type1.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\cid\type1cid.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\type42\type42.c -# SUBTRACT CPP /Fr -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\winfonts\winfnt.c -# SUBTRACT CPP /Fr -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\..\include\ft2build.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\include\freetype\config\ftconfig.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\include\freetype\config\ftheader.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\include\freetype\config\ftmodule.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\include\freetype\config\ftoption.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\include\freetype\config\ftstdlib.h -# End Source File -# End Group -# End Target -# End Project diff --git a/3party/freetype/builds/windows/visualce/freetype.dsw b/3party/freetype/builds/windows/visualce/freetype.dsw deleted file mode 100644 index b1b375dbbc..0000000000 --- a/3party/freetype/builds/windows/visualce/freetype.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "freetype"=.\freetype.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/3party/freetype/builds/windows/visualce/index.html b/3party/freetype/builds/windows/visualce/index.html deleted file mode 100644 index 90334f5365..0000000000 --- a/3party/freetype/builds/windows/visualce/index.html +++ /dev/null @@ -1,47 +0,0 @@ - -
    - - FreeType 2 Project Files for Visual C++ and VS.NET 2005 - (Pocket PC) - - - -

    - FreeType 2 Project Files for Visual C++ and VS.NET 2005 - (Pocket PC) -

    - -

    This directory contains project files for Visual C++, named -freetype.dsp, and Visual Studio, called freetype.sln for -the following targets: - -

      -
    • PPC/SP 2003 (Pocket PC 2003)
    • -
    • PPC/SP WM5 (Windows Mobile 5)
    • -
    • PPC/SP WM6 (Windows Mobile 6)
    • -
    - -It compiles the following libraries from the FreeType 2.6 sources:

    - -
      -
      -    freetype26.lib     - release build; single threaded
      -    freetype26_D.lib   - debug build;   single threaded
      -    freetype26MT.lib   - release build; multi-threaded
      -    freetype26MT_D.lib - debug build;   multi-threaded
      -
    - -

    Be sure to extract the files with the Windows (CR+LF) line endings. ZIP -archives are already stored this way, so no further action is required. If -you use some .tar.*z archives, be sure to configure your extracting -tool to convert the line endings. For example, with WinZip, you should activate the TAR -file smart CR/LF Conversion option. Alternatively, you may consider -using the unix2dos or u2d utilities that are floating -around, which specifically deal with this particular problem. - -

    Build directories are placed in the top-level objs -directory.

    - - - diff --git a/3party/freetype/builds/windows/w32-bcc.mk b/3party/freetype/builds/windows/w32-bcc.mk deleted file mode 100644 index d483df57a7..0000000000 --- a/3party/freetype/builds/windows/w32-bcc.mk +++ /dev/null @@ -1,28 +0,0 @@ -# -# FreeType 2 Borland C++ on Win32 -# - - -# Copyright 1996-2015 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. - -# default definitions of the export list -# -EXPORTS_LIST = $(OBJ_DIR)/freetype.def -EXPORTS_OPTIONS = /DEF:$(EXPORTS_LIST) -APINAMES_OPTIONS := -dfreetype.dll -wB - -include $(TOP_DIR)/builds/windows/win32-def.mk -include $(TOP_DIR)/builds/compiler/bcc.mk - -# include linking instructions -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/windows/w32-bccd.mk b/3party/freetype/builds/windows/w32-bccd.mk deleted file mode 100644 index bd72ca1175..0000000000 --- a/3party/freetype/builds/windows/w32-bccd.mk +++ /dev/null @@ -1,26 +0,0 @@ -# -# FreeType 2 Borland C++ on Win32 + debugging -# - - -# Copyright 1996-2015 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. - - -DEVEL_DIR := $(TOP_DIR)/devel - -include $(TOP_DIR)/builds/windows/win32-def.mk - -include $(TOP_DIR)/builds/compiler/bcc-dev.mk - -# include linking instructions -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/windows/w32-dev.mk b/3party/freetype/builds/windows/w32-dev.mk deleted file mode 100644 index 11d1afd3f9..0000000000 --- a/3party/freetype/builds/windows/w32-dev.mk +++ /dev/null @@ -1,32 +0,0 @@ -# -# FreeType 2 configuration rules for Win32 + GCC -# -# Development version without optimizations. -# - - -# Copyright 1996-2015 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. - - -# NOTE: This version requires that GNU Make is invoked from the Windows -# Shell (_not_ Cygwin BASH)! -# - -DEVEL_DIR := $(TOP_DIR)/devel - -include $(TOP_DIR)/builds/windows/win32-def.mk - -include $(TOP_DIR)/builds/compiler/gcc-dev.mk - -# include linking instructions -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/windows/w32-gcc.mk b/3party/freetype/builds/windows/w32-gcc.mk deleted file mode 100644 index 1092fb7851..0000000000 --- a/3party/freetype/builds/windows/w32-gcc.mk +++ /dev/null @@ -1,31 +0,0 @@ -# -# FreeType 2 configuration rules for Win32 + GCC -# - - -# Copyright 1996-2015 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. - -# default definitions of the export list -# -EXPORTS_LIST = $(OBJ_DIR)/freetype.def -EXPORTS_OPTIONS = $(EXPORTS_LIST) -APINAMES_OPTIONS := -dfreetype.dll -w - -# include Win32-specific definitions -include $(TOP_DIR)/builds/windows/win32-def.mk - -# include gcc-specific definitions -include $(TOP_DIR)/builds/compiler/gcc.mk - -# include linking instructions -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/windows/w32-icc.mk b/3party/freetype/builds/windows/w32-icc.mk deleted file mode 100644 index b2dcbe59d8..0000000000 --- a/3party/freetype/builds/windows/w32-icc.mk +++ /dev/null @@ -1,28 +0,0 @@ -# -# FreeType 2 configuration rules for Win32 + IBM Visual Age C++ -# - - -# Copyright 1996-2015 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. - -# default definitions of the export list -# -EXPORTS_LIST = $(OBJ_DIR)/freetype.def -EXPORTS_OPTIONS = /DEF:$(EXPORTS_LIST) -APINAMES_OPTIONS := -dfreetype.dll -w - -include $(TOP_DIR)/builds/windows/win32-def.mk -include $(TOP_DIR)/builds/compiler/visualage.mk - -# include linking instructions -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/windows/w32-intl.mk b/3party/freetype/builds/windows/w32-intl.mk deleted file mode 100644 index de9912fa3f..0000000000 --- a/3party/freetype/builds/windows/w32-intl.mk +++ /dev/null @@ -1,28 +0,0 @@ -# -# FreeType 2 configuration rules for Intel C/C++ on Win32 -# - - -# Copyright 1996-2015 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. - -# default definitions of the export list -# -EXPORTS_LIST = $(OBJ_DIR)/freetype.def -EXPORTS_OPTIONS = /DEF:$(EXPORTS_LIST) -APINAMES_OPTIONS := -dfreetype.dll -w - -include $(TOP_DIR)/builds/windows/win32-def.mk -include $(TOP_DIR)/builds/compiler/intelc.mk - -# include linking instructions -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/windows/w32-lcc.mk b/3party/freetype/builds/windows/w32-lcc.mk deleted file mode 100644 index 75979f38dd..0000000000 --- a/3party/freetype/builds/windows/w32-lcc.mk +++ /dev/null @@ -1,24 +0,0 @@ -# -# FreeType 2 configuration rules for Win32 + LCC -# - - -# Copyright 1996-2015 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. - - -SEP := / -include $(TOP_DIR)/builds/windows/win32-def.mk -include $(TOP_DIR)/builds/compiler/win-lcc.mk - -# include linking instructions -include $(TOP_DIR)/builds/link_dos.mk - -# EOF - diff --git a/3party/freetype/builds/windows/w32-mingw32.mk b/3party/freetype/builds/windows/w32-mingw32.mk deleted file mode 100644 index 1300a44aca..0000000000 --- a/3party/freetype/builds/windows/w32-mingw32.mk +++ /dev/null @@ -1,33 +0,0 @@ -# -# FreeType 2 configuration rules for mingw32 -# - - -# Copyright 1996-2015 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. - -# default definitions of the export list -# -EXPORTS_LIST = $(OBJ_DIR)/freetype.def -EXPORTS_OPTIONS = $(EXPORTS_LIST) -APINAMES_OPTIONS := -dfreetype.dll -w - -# include Win32-specific definitions -include $(TOP_DIR)/builds/windows/win32-def.mk - -LIBRARY := lib$(PROJECT) - -# include gcc-specific definitions -include $(TOP_DIR)/builds/compiler/gcc.mk - -# include linking instructions -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/windows/w32-vcc.mk b/3party/freetype/builds/windows/w32-vcc.mk deleted file mode 100644 index fcf1aa0046..0000000000 --- a/3party/freetype/builds/windows/w32-vcc.mk +++ /dev/null @@ -1,28 +0,0 @@ -# -# FreeType 2 Visual C++ on Win32 -# - - -# Copyright 1996-2015 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. - -# definitions of the export list -# -EXPORTS_LIST = $(OBJ_DIR)/freetype.def -EXPORTS_OPTIONS = /DEF:$(EXPORTS_LIST) -APINAMES_OPTIONS := -dfreetype.dll -w - -include $(TOP_DIR)/builds/windows/win32-def.mk -include $(TOP_DIR)/builds/compiler/visualc.mk - -# include linking instructions -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/windows/w32-wat.mk b/3party/freetype/builds/windows/w32-wat.mk deleted file mode 100644 index cc5eaf0a26..0000000000 --- a/3party/freetype/builds/windows/w32-wat.mk +++ /dev/null @@ -1,28 +0,0 @@ -# -# FreeType 2 configuration rules for Watcom C/C++ -# - - -# Copyright 1996-2015 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. - -# redefine export symbol definitions -# -EXPORTS_LIST = $(OBJ_DIR)/watcom-ftexports.lbc -EXPORTS_OPTIONS = -\"export @$(EXPORTS_LIST)\"- -APINAMES_OPTIONS := -wW - -include $(TOP_DIR)/builds/windows/win32-def.mk -include $(TOP_DIR)/builds/compiler/watcom.mk - -# include linking instructions -include $(TOP_DIR)/builds/link_dos.mk - - -# EOF diff --git a/3party/freetype/builds/windows/win32-def.mk b/3party/freetype/builds/windows/win32-def.mk deleted file mode 100644 index 516c5cd95e..0000000000 --- a/3party/freetype/builds/windows/win32-def.mk +++ /dev/null @@ -1,47 +0,0 @@ -# -# FreeType 2 Win32 specific definitions -# - - -# Copyright 1996-2015 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. - - -DELETE := del -CAT := type -SEP := $(strip \ ) -BUILD_DIR := $(TOP_DIR)/builds/windows -PLATFORM := windows - -# The executable file extension (for tools). NOTE: WE INCLUDE THE DOT HERE !! -# -E := .exe -E_BUILD := .exe - - -# The directory where all library files are placed. -# -# By default, this is the same as $(OBJ_DIR); however, this can be changed -# to suit particular needs. -# -LIB_DIR := $(OBJ_DIR) - - -# The name of the final library file. Note that the DOS-specific Makefile -# uses a shorter (8.3) name. -# -LIBRARY := $(PROJECT) - - -# The NO_OUTPUT macro is used to ignore the output of commands. -# -NO_OUTPUT = 2> nul - - -# EOF diff --git a/3party/freetype/configure b/3party/freetype/configure deleted file mode 100755 index fd525816ca..0000000000 --- a/3party/freetype/configure +++ /dev/null @@ -1,135 +0,0 @@ -#!/bin/sh -# -# Copyright 2002-2015 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. -# -# -# Call the `configure' script located in `builds/unix'. -# - -rm -f config.mk builds/unix/unix-def.mk builds/unix/unix-cc.mk - -# respect GNUMAKE environment variable for backwards compatibility -if test "x$GNUMAKE" = x; then - if test "x$MAKE" = x; then - if test "x`make -v 2>/dev/null | egrep 'GNU|makepp'`" = x; then - MAKE=gmake - else - MAKE=make - fi - fi -else - MAKE=$GNUMAKE -fi - -if test "x`$MAKE -v 2>/dev/null | egrep 'GNU|makepp'`" = x; then - echo "GNU make (>= 3.80) or makepp (>= 1.19) is required to build FreeType2." >&2 - echo "Please try" >&2 - echo >&2 - echo " MAKE= $0" >&2 - echo >&2 - echo "or" >&2 - echo >&2 - echo " MAKE=\"makepp --norc-substitution\" $0" >&2 - exit 1 -fi - -# Get `dirname' functionality. This is taken and adapted from autoconf's -# m4sh.m4 (_AS_EXPR_PREPARE, AS_DIRNAME_EXPR, and AS_DIRNAME_SED). - -if expr a : '\(a\)' >/dev/null 2>&1; then - ft_expr=expr -else - ft_expr=false -fi - -ft2_dir=`(dirname "$0") 2>/dev/null || - $ft_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || - echo X"$0" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -abs_curr_dir=`pwd` -abs_ft2_dir=`cd "$ft2_dir" && pwd` - -# `--srcdir=' option can override abs_ft2_dir - -if test $# -gt 0; then - for x in "$@"; do - case x"$x" in - x--srcdir=*) - abs_ft2_dir=`echo $x | sed 's/^--srcdir=//'` ;; - esac - done -fi - -# build a dummy Makefile if we are not building in the source tree; -# we use inodes to avoid issues with symbolic links -inode_src=`ls -id $abs_ft2_dir | awk '{print $1}'` -inode_dst=`ls -id $abs_curr_dir | awk '{print $1}'` - -if test $inode_src -ne $inode_dst; then - if test ! -d reference; then - mkdir reference - fi - if test ! -r $abs_curr_dir/modules.cfg; then - echo "Copying \`modules.cfg'" - cp $abs_ft2_dir/modules.cfg $abs_curr_dir - fi - echo "Generating \`Makefile'" - echo "TOP_DIR := $abs_ft2_dir" > Makefile - echo "OBJ_DIR := $abs_curr_dir" >> Makefile - echo "OBJ_BUILD := \$(OBJ_DIR)" >> Makefile - echo "DOC_DIR := \$(OBJ_DIR)/reference" >> Makefile - echo "FT_LIBTOOL_DIR := \$(OBJ_DIR)" >> Makefile - echo "ifndef FT2DEMOS" >> Makefile - echo " include \$(TOP_DIR)/Makefile" >> Makefile - echo "else" >> Makefile - echo " TOP_DIR_2 := \$(TOP_DIR)/../ft2demos" >> Makefile - echo " PROJECT := freetype" >> Makefile - echo " CONFIG_MK := \$(OBJ_DIR)/config.mk" >> Makefile - echo " include \$(TOP_DIR_2)/Makefile" >> Makefile - echo "endif" >> Makefile -fi - -# call make - -CFG= -# work around zsh bug which doesn't like `${1+"$@"}' -case $# in -0) ;; -*) for x in "$@"; do - case x"$x" in - x--srcdir=* ) CFG="$CFG '$x'/builds/unix" ;; - *) CFG="$CFG '$x'" ;; - esac - done ;; -esac -CFG=$CFG $MAKE setup unix - -# eof diff --git a/3party/freetype/devel/ft2build.h b/3party/freetype/devel/ft2build.h deleted file mode 100644 index b9eade2dd3..0000000000 --- a/3party/freetype/devel/ft2build.h +++ /dev/null @@ -1,40 +0,0 @@ -/***************************************************************************/ -/* */ -/* ft2build.h */ -/* */ -/* FreeType 2 build and setup macros (development version). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /* - * This is a development version of to build the library in - * debug mode. Its only difference to the default version is that it - * includes a local `ftoption.h' header file with different settings for - * many configuration macros. - * - * To use it, simply ensure that the directory containing this file is - * scanned by the compiler before the default FreeType header directory. - * - */ - -#ifndef __FT2BUILD_H__ -#define __FT2BUILD_H__ - -#define FT_CONFIG_OPTIONS_H - -#include - -#endif /* __FT2BUILD_H__ */ - - -/* END */ diff --git a/3party/freetype/devel/ftoption.h b/3party/freetype/devel/ftoption.h deleted file mode 100644 index eda772e84a..0000000000 --- a/3party/freetype/devel/ftoption.h +++ /dev/null @@ -1,886 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftoption.h (for development) */ -/* */ -/* User-selectable configuration macros (specification only). */ -/* */ -/* Copyright 1996-2015 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 __FTOPTION_H__ -#define __FTOPTION_H__ - - -#include - - -FT_BEGIN_HEADER - - /*************************************************************************/ - /* */ - /* USER-SELECTABLE CONFIGURATION MACROS */ - /* */ - /* This file contains the default configuration macro definitions for */ - /* a standard build of the FreeType library. There are three ways to */ - /* use this file to build project-specific versions of the library: */ - /* */ - /* - You can modify this file by hand, but this is not recommended in */ - /* cases where you would like to build several versions of the */ - /* library from a single source directory. */ - /* */ - /* - You can put a copy of this file in your build directory, more */ - /* precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD' */ - /* is the name of a directory that is included _before_ the FreeType */ - /* include path during compilation. */ - /* */ - /* The default FreeType Makefiles and Jamfiles use the build */ - /* directory `builds/' by default, but you can easily change */ - /* that for your own projects. */ - /* */ - /* - Copy the file to `$BUILD/ft2build.h' and modify it */ - /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */ - /* locate this file during the build. For example, */ - /* */ - /* #define FT_CONFIG_OPTIONS_H */ - /* #include */ - /* */ - /* will use `$BUILD/myftoptions.h' instead of this file for macro */ - /* definitions. */ - /* */ - /* Note also that you can similarly pre-define the macro */ - /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */ - /* that are statically linked to the library at compile time. By */ - /* default, this file is . */ - /* */ - /* We highly recommend using the third method whenever possible. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Uncomment the line below if you want to activate sub-pixel rendering */ - /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */ - /* */ - /* Note that this feature is covered by several Microsoft patents */ - /* and should not be activated in any default build of the library. */ - /* */ - /* This macro has no impact on the FreeType API, only on its */ - /* _implementation_. For example, using FT_RENDER_MODE_LCD when calling */ - /* FT_Render_Glyph still generates a bitmap that is 3 times wider than */ - /* the original size in case this macro isn't defined; however, each */ - /* triplet of subpixels has R=G=B. */ - /* */ - /* This is done to allow FreeType clients to run unmodified, forcing */ - /* them to display normal gray-level anti-aliased glyphs. */ - /* */ -#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING - - - /*************************************************************************/ - /* */ - /* Many compilers provide a non-ANSI 64-bit data type that can be used */ - /* by FreeType to speed up some computations. However, this will create */ - /* some problems when compiling the library in strict ANSI mode. */ - /* */ - /* For this reason, the use of 64-bit integers is normally disabled when */ - /* the __STDC__ macro is defined. You can however disable this by */ - /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */ - /* */ - /* For most compilers, this will only create compilation warnings when */ - /* building the library. */ - /* */ - /* ObNote: The compiler-specific 64-bit integers are detected in the */ - /* file `ftconfig.h' either statically or through the */ - /* `configure' script on supported platforms. */ - /* */ -#undef FT_CONFIG_OPTION_FORCE_INT64 - - - /*************************************************************************/ - /* */ - /* If this macro is defined, do not try to use an assembler version of */ - /* performance-critical functions (e.g. FT_MulFix). You should only do */ - /* that to verify that the assembler function works properly, or to */ - /* execute benchmark tests of the various implementations. */ -/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ - - - /*************************************************************************/ - /* */ - /* If this macro is defined, try to use an inlined assembler version of */ - /* the `FT_MulFix' function, which is a `hotspot' when loading and */ - /* hinting glyphs, and which should be executed as fast as possible. */ - /* */ - /* Note that if your compiler or CPU is not supported, this will default */ - /* to the standard and portable implementation found in `ftcalc.c'. */ - /* */ -#define FT_CONFIG_OPTION_INLINE_MULFIX - - - /*************************************************************************/ - /* */ - /* LZW-compressed file support. */ - /* */ - /* FreeType now handles font files that have been compressed with the */ - /* `compress' program. This is mostly used to parse many of the PCF */ - /* files that come with various X11 distributions. The implementation */ - /* uses NetBSD's `zopen' to partially uncompress the file on the fly */ - /* (see src/lzw/ftgzip.c). */ - /* */ - /* Define this macro if you want to enable this `feature'. */ - /* */ -#define FT_CONFIG_OPTION_USE_LZW - - - /*************************************************************************/ - /* */ - /* Gzip-compressed file support. */ - /* */ - /* FreeType now handles font files that have been compressed with the */ - /* `gzip' program. This is mostly used to parse many of the PCF files */ - /* that come with XFree86. The implementation uses `zlib' to */ - /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */ - /* */ - /* Define this macro if you want to enable this `feature'. See also */ - /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ - /* */ -#define FT_CONFIG_OPTION_USE_ZLIB - - - /*************************************************************************/ - /* */ - /* ZLib library selection */ - /* */ - /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ - /* It allows FreeType's `ftgzip' component to link to the system's */ - /* installation of the ZLib library. This is useful on systems like */ - /* Unix or VMS where it generally is already available. */ - /* */ - /* If you let it undefined, the component will use its own copy */ - /* of the zlib sources instead. These have been modified to be */ - /* included directly within the component and *not* export external */ - /* function names. This allows you to link any program with FreeType */ - /* _and_ ZLib without linking conflicts. */ - /* */ - /* Do not #undef this macro here since the build system might define */ - /* it for certain configurations only. */ - /* */ -/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ - - - /*************************************************************************/ - /* */ - /* Bzip2-compressed file support. */ - /* */ - /* FreeType now handles font files that have been compressed with the */ - /* `bzip2' program. This is mostly used to parse many of the PCF */ - /* files that come with XFree86. The implementation uses `libbz2' to */ - /* partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */ - /* Contrary to gzip, bzip2 currently is not included and need to use */ - /* the system available bzip2 implementation. */ - /* */ - /* Define this macro if you want to enable this `feature'. */ - /* */ -#define FT_CONFIG_OPTION_USE_BZIP2 - - - /*************************************************************************/ - /* */ - /* PNG bitmap support. */ - /* */ - /* FreeType now handles loading color bitmap glyphs in the PNG format. */ - /* This requires help from the external libpng library. Uncompressed */ - /* color bitmaps do not need any external libraries and will be */ - /* supported regardless of this configuration. */ - /* */ - /* Define this macro if you want to enable this `feature'. */ - /* */ -#define FT_CONFIG_OPTION_USE_PNG - - - /*************************************************************************/ - /* */ - /* HarfBuzz support. */ - /* */ - /* FreeType uses the HarfBuzz library to improve auto-hinting of */ - /* OpenType fonts. If available, many glyphs not directly addressable */ - /* by a font's character map will be hinted also. */ - /* */ - /* Define this macro if you want to enable this `feature'. */ - /* */ -#define FT_CONFIG_OPTION_USE_HARFBUZZ - - - /*************************************************************************/ - /* */ - /* Define to disable the use of file stream functions and types, FILE, */ - /* fopen() etc. Enables the use of smaller system libraries on embedded */ - /* systems that have multiple system libraries, some with or without */ - /* file stream support, in the cases where file stream support is not */ - /* necessary such as memory loading of font files. */ - /* */ -/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ - - - /*************************************************************************/ - /* */ - /* DLL export compilation */ - /* */ - /* When compiling FreeType as a DLL, some systems/compilers need a */ - /* special keyword in front OR after the return type of function */ - /* declarations. */ - /* */ - /* Two macros are used within the FreeType source code to define */ - /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */ - /* */ - /* FT_EXPORT( return_type ) */ - /* */ - /* is used in a function declaration, as in */ - /* */ - /* FT_EXPORT( FT_Error ) */ - /* FT_Init_FreeType( FT_Library* alibrary ); */ - /* */ - /* */ - /* FT_EXPORT_DEF( return_type ) */ - /* */ - /* is used in a function definition, as in */ - /* */ - /* FT_EXPORT_DEF( FT_Error ) */ - /* FT_Init_FreeType( FT_Library* alibrary ) */ - /* { */ - /* ... some code ... */ - /* return FT_Err_Ok; */ - /* } */ - /* */ - /* You can provide your own implementation of FT_EXPORT and */ - /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */ - /* will be later automatically defined as `extern return_type' to */ - /* allow normal compilation. */ - /* */ - /* Do not #undef these macros here since the build system might define */ - /* them for certain configurations only. */ - /* */ -/* #define FT_EXPORT(x) extern x */ -/* #define FT_EXPORT_DEF(x) x */ - - - /*************************************************************************/ - /* */ - /* Glyph Postscript Names handling */ - /* */ - /* By default, FreeType 2 is compiled with the `psnames' module. This */ - /* module is in charge of converting a glyph name string into a */ - /* Unicode value, or return a Macintosh standard glyph name for the */ - /* use with the TrueType `post' table. */ - /* */ - /* Undefine this macro if you do not want `psnames' compiled in your */ - /* build of FreeType. This has the following effects: */ - /* */ - /* - The TrueType driver will provide its own set of glyph names, */ - /* if you build it to support postscript names in the TrueType */ - /* `post' table. */ - /* */ - /* - The Type 1 driver will not be able to synthesize a Unicode */ - /* charmap out of the glyphs found in the fonts. */ - /* */ - /* You would normally undefine this configuration macro when building */ - /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */ - /* */ -#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES - - - /*************************************************************************/ - /* */ - /* Postscript Names to Unicode Values support */ - /* */ - /* By default, FreeType 2 is built with the `PSNames' module compiled */ - /* in. Among other things, the module is used to convert a glyph name */ - /* into a Unicode value. This is especially useful in order to */ - /* synthesize on the fly a Unicode charmap from the CFF/Type 1 driver */ - /* through a big table named the `Adobe Glyph List' (AGL). */ - /* */ - /* Undefine this macro if you do not want the Adobe Glyph List */ - /* compiled in your `PSNames' module. The Type 1 driver will not be */ - /* able to synthesize a Unicode charmap out of the glyphs found in the */ - /* fonts. */ - /* */ -#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - - - /*************************************************************************/ - /* */ - /* Support for Mac fonts */ - /* */ - /* Define this macro if you want support for outline fonts in Mac */ - /* format (mac dfont, mac resource, macbinary containing a mac */ - /* resource) on non-Mac platforms. */ - /* */ - /* Note that the `FOND' resource isn't checked. */ - /* */ -#define FT_CONFIG_OPTION_MAC_FONTS - - - /*************************************************************************/ - /* */ - /* Guessing methods to access embedded resource forks */ - /* */ - /* Enable extra Mac fonts support on non-Mac platforms (e.g. */ - /* GNU/Linux). */ - /* */ - /* Resource forks which include fonts data are stored sometimes in */ - /* locations which users or developers don't expected. In some cases, */ - /* resource forks start with some offset from the head of a file. In */ - /* other cases, the actual resource fork is stored in file different */ - /* from what the user specifies. If this option is activated, */ - /* FreeType tries to guess whether such offsets or different file */ - /* names must be used. */ - /* */ - /* Note that normal, direct access of resource forks is controlled via */ - /* the FT_CONFIG_OPTION_MAC_FONTS option. */ - /* */ -#ifdef FT_CONFIG_OPTION_MAC_FONTS -#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK -#endif - - - /*************************************************************************/ - /* */ - /* Allow the use of FT_Incremental_Interface to load typefaces that */ - /* contain no glyph data, but supply it via a callback function. */ - /* This is required by clients supporting document formats which */ - /* supply font data incrementally as the document is parsed, such */ - /* as the Ghostscript interpreter for the PostScript language. */ - /* */ -#define FT_CONFIG_OPTION_INCREMENTAL - - - /*************************************************************************/ - /* */ - /* The size in bytes of the render pool used by the scan-line converter */ - /* to do all of its work. */ - /* */ -#define FT_RENDER_POOL_SIZE 16384L - - - /*************************************************************************/ - /* */ - /* FT_MAX_MODULES */ - /* */ - /* The maximum number of modules that can be registered in a single */ - /* FreeType library object. 32 is the default. */ - /* */ -#define FT_MAX_MODULES 32 - - - /*************************************************************************/ - /* */ - /* Debug level */ - /* */ - /* FreeType can be compiled in debug or trace mode. In debug mode, */ - /* errors are reported through the `ftdebug' component. In trace */ - /* mode, additional messages are sent to the standard output during */ - /* execution. */ - /* */ - /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */ - /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */ - /* */ - /* Don't define any of these macros to compile in `release' mode! */ - /* */ - /* Do not #undef these macros here since the build system might define */ - /* them for certain configurations only. */ - /* */ -#define FT_DEBUG_LEVEL_ERROR -#define FT_DEBUG_LEVEL_TRACE - - - /*************************************************************************/ - /* */ - /* Autofitter debugging */ - /* */ - /* If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to */ - /* control the autofitter behaviour for debugging purposes with global */ - /* boolean variables (consequently, you should *never* enable this */ - /* while compiling in `release' mode): */ - /* */ - /* _af_debug_disable_horz_hints */ - /* _af_debug_disable_vert_hints */ - /* _af_debug_disable_blue_hints */ - /* */ - /* Additionally, the following functions provide dumps of various */ - /* internal autofit structures to stdout (using `printf'): */ - /* */ - /* af_glyph_hints_dump_points */ - /* af_glyph_hints_dump_segments */ - /* af_glyph_hints_dump_edges */ - /* af_glyph_hints_get_num_segments */ - /* af_glyph_hints_get_segment_offset */ - /* */ - /* As an argument, they use another global variable: */ - /* */ - /* _af_debug_hints */ - /* */ - /* Please have a look at the `ftgrid' demo program to see how those */ - /* variables and macros should be used. */ - /* */ - /* Do not #undef these macros here since the build system might define */ - /* them for certain configurations only. */ - /* */ -#define FT_DEBUG_AUTOFIT - - - /*************************************************************************/ - /* */ - /* Memory Debugging */ - /* */ - /* FreeType now comes with an integrated memory debugger that is */ - /* capable of detecting simple errors like memory leaks or double */ - /* deletes. To compile it within your build of the library, you */ - /* should define FT_DEBUG_MEMORY here. */ - /* */ - /* Note that the memory debugger is only activated at runtime when */ - /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */ - /* */ - /* Do not #undef this macro here since the build system might define */ - /* it for certain configurations only. */ - /* */ -#define FT_DEBUG_MEMORY - - - /*************************************************************************/ - /* */ - /* Module errors */ - /* */ - /* If this macro is set (which is _not_ the default), the higher byte */ - /* of an error code gives the module in which the error has occurred, */ - /* while the lower byte is the real error code. */ - /* */ - /* Setting this macro makes sense for debugging purposes only, since */ - /* it would break source compatibility of certain programs that use */ - /* FreeType 2. */ - /* */ - /* More details can be found in the files ftmoderr.h and fterrors.h. */ - /* */ -#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS - - - /*************************************************************************/ - /* */ - /* Position Independent Code */ - /* */ - /* If this macro is set (which is _not_ the default), FreeType2 will */ - /* avoid creating constants that require address fixups. Instead the */ - /* constants will be moved into a struct and additional intialization */ - /* code will be used. */ - /* */ - /* Setting this macro is needed for systems that prohibit address */ - /* fixups, such as BREW. */ - /* */ -/* #define FT_CONFIG_OPTION_PIC */ - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */ - /* embedded bitmaps in all formats using the SFNT module (namely */ - /* TrueType & OpenType). */ - /* */ -#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */ - /* load and enumerate the glyph Postscript names in a TrueType or */ - /* OpenType file. */ - /* */ - /* Note that when you do not compile the `PSNames' module by undefining */ - /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */ - /* contain additional code used to read the PS Names table from a font. */ - /* */ - /* (By default, the module uses `PSNames' to extract glyph names.) */ - /* */ -#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */ - /* access the internal name table in a SFNT-based format like TrueType */ - /* or OpenType. The name table contains various strings used to */ - /* describe the font, like family name, copyright, version, etc. It */ - /* does not contain any glyph name though. */ - /* */ - /* Accessing SFNT names is done through the functions declared in */ - /* `ftsnames.h'. */ - /* */ -#define TT_CONFIG_OPTION_SFNT_NAMES - - - /*************************************************************************/ - /* */ - /* TrueType CMap support */ - /* */ - /* Here you can fine-tune which TrueType CMap table format shall be */ - /* supported. */ -#define TT_CONFIG_CMAP_FORMAT_0 -#define TT_CONFIG_CMAP_FORMAT_2 -#define TT_CONFIG_CMAP_FORMAT_4 -#define TT_CONFIG_CMAP_FORMAT_6 -#define TT_CONFIG_CMAP_FORMAT_8 -#define TT_CONFIG_CMAP_FORMAT_10 -#define TT_CONFIG_CMAP_FORMAT_12 -#define TT_CONFIG_CMAP_FORMAT_13 -#define TT_CONFIG_CMAP_FORMAT_14 - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ - /* a bytecode interpreter in the TrueType driver. */ - /* */ - /* By undefining this, you will only compile the code necessary to load */ - /* TrueType glyphs without hinting. */ - /* */ - /* Do not #undef this macro here, since the build system might */ - /* define it for certain configurations only. */ - /* */ -#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile */ - /* EXPERIMENTAL subpixel hinting support into the TrueType driver. This */ - /* replaces the native TrueType hinting mechanism when anything but */ - /* FT_RENDER_MODE_MONO is requested. */ - /* */ - /* Enabling this causes the TrueType driver to ignore instructions under */ - /* certain conditions. This is done in accordance with the guide here, */ - /* with some minor differences: */ - /* */ - /* http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */ - /* */ - /* By undefining this, you only compile the code necessary to hint */ - /* TrueType glyphs with native TT hinting. */ - /* */ - /* This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be */ - /* defined. */ - /* */ -#define TT_CONFIG_OPTION_SUBPIXEL_HINTING - - - /*************************************************************************/ - /* */ - /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */ - /* of the TrueType bytecode interpreter is used that doesn't implement */ - /* any of the patented opcodes and algorithms. The patents related to */ - /* TrueType hinting have expired worldwide since May 2010; this option */ - /* is now deprecated. */ - /* */ - /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* */ - /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, */ - /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ - /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */ - /* */ - /* This macro is only useful for a small number of font files (mostly */ - /* for Asian scripts) that require bytecode interpretation to properly */ - /* load glyphs. For all other fonts, this produces unpleasant results, */ - /* thus the unpatented interpreter is never used to load glyphs from */ - /* TrueType fonts unless one of the following two options is used. */ - /* */ - /* - The unpatented interpreter is explicitly activated by the user */ - /* through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag */ - /* when opening the FT_Face. */ - /* */ - /* - FreeType detects that the FT_Face corresponds to one of the */ - /* `trick' fonts (e.g., `Mingliu') it knows about. The font engine */ - /* contains a hard-coded list of font names and other matching */ - /* parameters (see function `tt_face_init' in file */ - /* `src/truetype/ttobjs.c'). */ - /* */ - /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */ - /* */ - /* { */ - /* FT_Parameter parameter; */ - /* FT_Open_Args open_args; */ - /* */ - /* */ - /* parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; */ - /* */ - /* open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; */ - /* open_args.pathname = my_font_pathname; */ - /* open_args.num_params = 1; */ - /* open_args.params = ¶meter; */ - /* */ - /* error = FT_Open_Face( library, &open_args, index, &face ); */ - /* ... */ - /* } */ - /* */ -/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */ - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */ - /* TrueType glyph loader to use Apple's definition of how to handle */ - /* component offsets in composite glyphs. */ - /* */ - /* Apple and MS disagree on the default behavior of component offsets */ - /* in composites. Apple says that they should be scaled by the scaling */ - /* factors in the transformation matrix (roughly, it's more complex) */ - /* while MS says they should not. OpenType defines two bits in the */ - /* composite flags array which can be used to disambiguate, but old */ - /* fonts will not have them. */ - /* */ - /* http://www.microsoft.com/typography/otspec/glyf.htm */ - /* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html */ - /* */ -#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */ - /* support for Apple's distortable font technology (fvar, gvar, cvar, */ - /* and avar tables). This has many similarities to Type 1 Multiple */ - /* Masters support. */ - /* */ -#define TT_CONFIG_OPTION_GX_VAR_SUPPORT - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_BDF if you want to include support for */ - /* an embedded `BDF ' table within SFNT-based bitmap formats. */ - /* */ -#define TT_CONFIG_OPTION_BDF - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* T1_MAX_DICT_DEPTH is the maximum depth of nest dictionaries and */ - /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */ - /* required. */ - /* */ -#define T1_MAX_DICT_DEPTH 5 - - - /*************************************************************************/ - /* */ - /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ - /* calls during glyph loading. */ - /* */ -#define T1_MAX_SUBRS_CALLS 16 - - - /*************************************************************************/ - /* */ - /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ - /* minimum of 16 is required. */ - /* */ - /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */ - /* */ -#define T1_MAX_CHARSTRINGS_OPERANDS 256 - - - /*************************************************************************/ - /* */ - /* Define this configuration macro if you want to prevent the */ - /* compilation of `t1afm', which is in charge of reading Type 1 AFM */ - /* files into an existing face. Note that if set, the T1 driver will be */ - /* unable to produce kerning distances. */ - /* */ -#undef T1_CONFIG_OPTION_NO_AFM - - - /*************************************************************************/ - /* */ - /* Define this configuration macro if you want to prevent the */ - /* compilation of the Multiple Masters font support in the Type 1 */ - /* driver. */ - /* */ -#undef T1_CONFIG_OPTION_NO_MM_SUPPORT - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** C F F D R I V E R C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Using CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4} it is */ - /* possible to set up the default values of the four control points that */ - /* define the stem darkening behaviour of the (new) CFF engine. For */ - /* more details please read the documentation of the */ - /* `darkening-parameters' property of the cff driver module (file */ - /* `ftcffdrv.h'), which allows the control at run-time. */ - /* */ - /* Do *not* undefine these macros! */ - /* */ -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 500 -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 400 - -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 1000 -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 275 - -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 1667 -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 275 - -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 2333 -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 0 - - - /*************************************************************************/ - /* */ - /* CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF */ - /* engine gets compiled into FreeType. If defined, it is possible to */ - /* switch between the two engines using the `hinting-engine' property of */ - /* the cff driver module. */ - /* */ -#define CFF_CONFIG_OPTION_OLD_ENGINE - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Compile autofit module with CJK (Chinese, Japanese, Korean) script */ - /* support. */ - /* */ -#define AF_CONFIG_OPTION_CJK - - /*************************************************************************/ - /* */ - /* Compile autofit module with Indic script support. */ - /* */ -#define AF_CONFIG_OPTION_INDIC - - /*************************************************************************/ - /* */ - /* Compile autofit module with warp hinting. The idea of the warping */ - /* code is to slightly scale and shift a glyph within a single dimension */ - /* so that as much of its segments are aligned (more or less) on the */ - /* grid. To find out the optimal scaling and shifting value, various */ - /* parameter combinations are tried and scored. */ - /* */ - /* This experimental option is active only if the rendering mode is */ - /* FT_RENDER_MODE_LIGHT; you can switch warping on and off with the */ - /* `warping' property of the auto-hinter (see file `ftautoh.h' for more */ - /* information; by default it is switched off). */ - /* */ -#define AF_CONFIG_OPTION_USE_WARPER - - /* */ - - - /* - * This macro is obsolete. Support has been removed in FreeType - * version 2.5. - */ -/* #define FT_CONFIG_OPTION_OLD_INTERNALS */ - - - /* - * This macro is defined if either unpatented or native TrueType - * hinting is requested by the definitions above. - */ -#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER -#define TT_USE_BYTECODE_INTERPRETER -#undef TT_CONFIG_OPTION_UNPATENTED_HINTING -#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING -#define TT_USE_BYTECODE_INTERPRETER -#endif - - - /* - * Check CFF darkening parameters. The checks are the same as in function - * `cff_property_set' in file `cffdrivr.c'. - */ -#if CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 < 0 || \ - \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 < 0 || \ - \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 > \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 > \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 > \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 || \ - \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 > 500 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 > 500 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 > 500 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 > 500 -#error "Invalid CFF darkening parameters!" -#endif - -FT_END_HEADER - - -#endif /* __FTOPTION_H__ */ - - -/* END */ diff --git a/3party/freetype/docs/CHANGES b/3party/freetype/docs/CHANGES deleted file mode 100644 index ec417c6586..0000000000 --- a/3party/freetype/docs/CHANGES +++ /dev/null @@ -1,4342 +0,0 @@ -CHANGES BETWEEN 2.6 and 2.6.1 - - I. IMPORTANT BUG FIXES - - - It turned out that for CFFs only the advance widths should be - taken from the `htmx', not the side bearings. This bug, - introduced in version 2.6.0, makes it necessary to upgrade if - you are using CFFs; otherwise you get cropped glyphs with GUI - interfaces like GTK or Qt. - - - Accessing Type 42 fonts returned incorrect results if the glyph - order of the embedded TrueType font differs from the glyph order - of the Type 42 charstrings table. - - - II. IMPORTANT CHANGES - - - The header file layout has been changed (again), moving all - header files except `ft2build.h' into a subdirectory tree. - - Doing so reduces the possibility of header file name clashes - (e.g., FTGL's `FTGlyph.h' with FreeType's `ftglyph.h' on case - insensitive file systems like Mac OS X or Windows). - - Applications that use (a) `freetype-config' or FreeType's - `freetype2.pc' file for pkg-config to get the include directory - for the compiler, and (b) the documented way for header - inclusion like - - #include - #include FT_FREETYPE_H - ... - - don't need any change to the source code. - - - Simple access to named instances in GX variation fonts is now - available (in addition to the previous method via FreeType's MM - interface). In the FT_Face structure, bits 16-30 of the - `face_index' field hold the current named instance index for the - given face index, and bits 16-30 of `style_flags' contain the - number of instances for the given face index. `FT_Open_Face' - and friends also understand the extended bits of the face index - parameter. - - You need to enable TT_CONFIG_OPTION_GX_VAR_SUPPORT for this new - feature. Otherwise, bits 16-30 of the two fields are zero (or - are ignored). - - - III. MISCELLANEOUS - - - The auto-hinter's Arabic script support has been enhanced. - - - The TrueType bytecode interpreter now runs slightly faster. - - - Improved support for builds with cmake. - - -====================================================================== - -CHANGES BETWEEN 2.5.5 and 2.6 - - I. IMPORTANT CHANGES - - - Behdad Esfahbod contributed code for improved thread-safety, - which results in the following model. - - * An `FT_Face' object can only be safely used from one thread at - a time. - - * An `FT_Library' object can now be used without modification - from multiple threads at the same time. - - * `FT_Face' creation and destruction with the same `FT_Library' - object can only be done from one thread at a time. - - One can use a single `FT_Library' object across threads as long - as a mutex lock is used around `FT_New_Face' and `FT_Done_Face'. - Any calls to `FT_Load_Glyph' and similar API are safe and do not - need the lock to be held as long as the same `FT_Face' is not - used from multiple threads at the same time. - - - Thai script support has been added to the auto-hinter. - - - Arabic script support has been added to the auto-hinter. - - - Following OpenType version 1.7, advance widths and side bearing - values in CFFs (wrapped in an SFNT structure) are now always - taken from the `hmtx' table. - - - Following OpenType version 1.7, the PostScript font name of a - CFF font (wrapped in an SFNT structure) is now always taken from - the `name' table. This is also true for OpenType Collections - (i.e., TTCs using CFFs subfonts instead of TTFs), where it may - have a significant difference. - - - Fonts natively hinted for ClearType are now supported, properly - handling selector index 3 of the INSTCTRL bytecode instruction. - - - Major improvements to the GX TrueType variation font handling. - - - II. MISCELLANEOUS - - - A new auto-hinter property `warping' can switch on and off the - warping code if this experimental feature is compiled in (by - defining the AF_CONFIG_OPTION_USE_WARPER configuration option; - by default this option is now enabled but warping is switched - off). - - The AF_CONFIG_OPTION_USE_WARPER option itself is an old feature, - available since 2006. Warping only works in `light' - auto-hinting mode. The idea of the code is to slightly scale - and shift a glyph along the non-hinted dimension (which is - usually the horizontal axis) so that as much of its segments are - aligned (more or less) to the grid. To find out a glyph's - optimal scaling and shifting value, various parameter - combinations are tried and scored. - - See file `ftautoh.h' for more; the demo programs `ftdiff', - `ftview', and `ftgrid' can toggle warping with key `w'. - - - Some fields in the `FTC_ImageTypeRec' structure have been - changed from signed to unsigned type, which better reflects the - actual usage. It is also an additional means to protect against - malformed input. - - This change doesn't break the ABI; however, it might cause - compiler warnings. - - - Function `FT_Bitmap_New' has been renamed to `FT_Bitmap_Init', - since this name better reflects its function. For backwards - compatibility, the old function name is still available. - - - Function `FT_Get_X11_Font_Format' has been renamed to - `FT_Get_Font_Format', since this name better reflects its - function. For backwards compatibility, the old function name is - still available. - - Additionally, the header file macro for this function has been - renamed to `FT_FONT_FORMATS_H' (the old name `FT_XFREE86_H' is - retained for backwards compatibility). - - - Various improvements to the `ftgrid' demo program. - - . It can now display GX and MM fonts while interactively - manipulating the axes (with keys F2, F3, and F4). - - . Anti-aliasing rendering modes can now be selected (with keys - F5 and F6). - - . The display of point numbers can be toggled with key `D'. - - - Various improvements to the `ftdump' demo program. - - . It now displays information on MM and GX variation axes. - - . New command line option `-u' makes it output data in utf-8 - encoding. - - - The `ftmulti' demo program can now handle up to six MM or GX - axes. - - -====================================================================== - -CHANGES BETWEEN 2.5.4 and 2.5.5 - - I. IMPORTANT BUG FIXES - - - Handling of uncompressed PCF files works again (bug introduced - in version 2.5.4). - - -====================================================================== - -CHANGES BETWEEN 2.5.3 and 2.5.4 - - I. IMPORTANT BUG FIXES - - - A variant of vulnerability CVE-2014-2240 was identified - (cf. http://savannah.nongnu.org/bugs/?43661) and fixed in the - new CFF driver. All users should upgrade. - - - The new auto-hinter code using HarfBuzz crashed for some invalid - fonts. - - - Many fixes to better protect against malformed input. - - - II. IMPORTANT CHANGES - - - Full auto-hinter support of the Devanagari script. - - - Experimental auto-hinter support of the Telugu script. - - - CFF stem darkening behaviour can now be controlled at build time - using the eight macros - - CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4} . - - - Some fields in the `FT_Bitmap' structure have been changed from - signed to unsigned type, which better reflects the actual usage. - It is also an additional means to protect against malformed - input. - - This change doesn't break the ABI; however, it might cause - compiler warnings. - - - III. MISCELLANEOUS - - - Improvements to the auto-hinter's algorithm to recognize stems - and local extrema. - - - Function `FT_Get_SubGlyph_Info' always returned an error even in - case of success. - - - Version 2.5.1 introduced major bugs in the cjk part of the - auto-hinter, which are now fixed. - - - The `FT_Sfnt_Tag' enumeration values have been changed to - uppercase, e.g. `FT_SFNT_HEAD'. The lowercase variants are - deprecated. This is for orthogonality with all other - enumeration (and enumeration-like) values in FreeType. - - - `cmake' now supports builds of FreeType as an OS X framework and - for iOS. - - - Improved project files for vc2010, introducing a property file. - - - The documentation generator for the API reference has been - updated to produce better HTML code (with proper CSS). At the - same time, the documentation got a better structure. - - - The FT_LOAD_BITMAP_CROP flag is obsolete; it is not used by any - driver. - - - The TrueType DELTAP[123] bytecode instructions now work in - subpixel hinting mode as described in the ClearType whitepaper - (i.e., for touched points in the non-subpixel direction). - - - Many small improvements to the internal arithmetic routines. - - -====================================================================== - -CHANGES BETWEEN 2.5.2 and 2.5.3 - - I. IMPORTANT BUG FIXES - - - A vulnerability (CVE-2014-2240) was identified and fixed in the - new CFF driver (cf. http://savannah.nongnu.org/bugs/?41697). - All users should upgrade. - - - More bug fixes related to correct positioning of composite - glyphs. - - - Many fixes to better protect against malformed input. - - - II. IMPORTANT CHANGES - - - FreeType can now use the HarfBuzz library to greatly improve the - auto-hinting of fonts that use OpenType features: Many glyphs - that are part of such features but don't have cmap entries are - now handled properly, for example small caps or superscripts. - Define the configuration macro FT_CONFIG_OPTION_USE_HARFBUZZ to - activate HarfBuzz support. - - You need HarfBuzz version 0.9.19 or newer. - - Note that HarfBuzz depends on FreeType; this currently causes a - chicken-and-egg problem that can be solved as follows in case - HarfBuzz is not yet installed on your system. - - 1. Compile and install FreeType without the configuration - macro FT_CONFIG_OPTION_USE_HARFBUZZ. - - 2. Compile and install HarfBuzz. - - 3. Define macro FT_CONFIG_OPTION_USE_HARFBUZZ, then compile - and install FreeType again. - - With FreeType's `configure' script the procedure boils down to - configure, build, and install Freetype, then configure, compile, - and install HarfBuzz, then configure, compile, and install - FreeType again (after executing `make distclean'). - - - All libraries FreeType depends on are now checked using the - `pkg-config' configuration files first, followed by alternative - methods. - - - The new value `auto' for the various `--with-XXX' library - options (for example `--with-harfbuzz=auto') makes the - `configure' script automatically link to the libraries it finds. - This is now the default. - - - In case FreeType's `configure' script can't find a library, you - can pass environment variables to circumvent pkg-config, and - those variables have been harmonized as a consequence of the - changes mentioned above: - - LIBZ -> removed; use LIBZ_CFLAGS and LIBZ_LIBS - LIBBZ2 -> removed; use BZIP2_CFLAGS and BZIP2_LIBS - LIBPNG_LDFLAGS -> LIBPNG_LIBS - - `./configure --help' shows all available environment variables. - - - The `freetype-config' script now understands option `--static' - to emit static linking information. - - -====================================================================== - -CHANGES BETWEEN 2.5.1 and 2.5.2 - - I. IMPORTANT BUG FIXES - - - Improving the display of some broken TrueType fonts introduced a - bug that made FreeType crash on some popular (but not fully - conformant) fonts like `ahronbd.ttf'. - - - Another round of improvements to correct positioning and hinting - of composite glyphs in TrueType fonts. - - - II. MISCELLANEOUS - - - Version 2.5.1 introduced a bug in handling embedded bitmap - strikes of TrueType fonts, causing garbage display under some - circumstances. - - - The `ftgrid' demo program couldn't be compiled in - non-development builds. - - -====================================================================== - -CHANGES BETWEEN 2.5 and 2.5.1 - - I. IMPORTANT BUG FIXES - - - For some WinFNT files, the last glyph wasn't displayed but - incorrectly marked as invalid. - - - The vertical size of glyphs was incorrectly set after a call to - `FT_GlyphSlot_Embolden', resulting in clipped glyphs. - - - Many fields of the `PCLT' table in SFNT based fonts (if accessed - with `FT_Get_Sfnt_Table') were computed incorrectly. - - - In TrueType fonts, hinting of composite glyphs could sometimes - deliver incorrect positions of components or even distorted - shapes. - - - II. IMPORTANT CHANGES - - - WOFF font format support has been added. - - - The auto-hinter now supports Hebrew. Greek and Cyrillic support - has been improved. - - - Support for the forthcoming `OS/2' SFNT table version 5, as can - be found e.g. in the `Sitka' font family for Windows 8.1. - - - The header file layout has been changed. After installation, - all files are now located in `/include/freetype2'. - - Applications that use (a) `freetype-config' or FreeType's - `pkg-config' file to get the include directory for the compiler, - and (b) the documented way for header inclusion like - - #include - #include FT_FREETYPE_H - ... - - don't need any change to the source code. - - - III. MISCELLANEOUS - - - The stem darkening feature of the new CFF engine can now be - fine-tuned with the new `darkening-parameters' property. - - - `ftgrid' has been updated to toggle various engines with the `H' - key, similar to `ftview' and `ftdiff'. - - - The functionality of `ttdebug' has been greatly enhanced. - - . It now displays twilight, storage, and control value data; key - `T' shows the twilight point table, key `S' the storage data, - and key `C' the control value table. - - . Some keys have been reassigned from lowercase to their - uppercase equivalents; for example `q' to quit the program is - now `Q'. - - . Key `f' finishes the current function. - - . Key `R' restarts the debugger. - - . Keys `b' and `p' set a breakpoint. - - . Key `B' provides a function call backtrace. - - - Better support of ARMv7 and x86_64 processors. - - - Apple's `sbix' color bitmap format is now supported. - - - Improved auto-hinter rendering for many TrueType fonts, - especially in the range 20-40ppem. - - - A new face flag `FT_FACE_FLAG_COLOR' has been added (to be - accessed with the macro `FT_HAS_COLOR'). - - - `FT_Gzip_Uncompress' (modeled after zlib's `uncompress' - function) has been added; this is a by-product of the newly - added WOFF support. - - - Support for a build with `cmake' has been contributed by John - Cary . - - - Support for x64 builds with Visual C++ has been contributed by - Kenneth Miller - - - Manual pages for most demo programs have been added. - - - The GETINFO bytecode instruction for TrueType fonts was buggy if - used to retrieve subpixel hinting information. It was necessary - to set selector bit 6 to get results for selector bits 7-10, - which is wrong. - - - Improved computation of emulated vertical metrics for TrueType - fonts. - - - Fixed horizontal start-up position of vertical phantom points in - TrueType bytecode. - - -====================================================================== - -CHANGES BETWEEN 2.4.12 and 2.5 - - I. IMPORTANT BUG FIXES - - - The cache manager function `FTC_Manager_Reset' didn't flush the - cache. - - - II. IMPORTANT CHANGES - - - Behdad Esfahbod (on behalf of Google) contributed support for - color embedded bitmaps (eg. color emoji). - - A new load flag, FT_LOAD_COLOR, makes FreeType load color - embedded-bitmaps, following this draft specification - - https://color-emoji.googlecode.com/git/specification/v1.html - - which defines two new SFNT tables, `CBDT' and `CBLC' (named and - modeled after `EBDT' and `EBLC', respectively). The color - bitmaps are stored in the new FT_PIXEL_MODE_BGRA format to - represent BGRA pre-multiplied sRGB images. If PNG support is - available, PNG color images as defined in the same proposed - specification are supported also. - - Note that color bitmaps are converted to grayscale if client - didn't ask for color. - - - As announced in the previous release, the old FreeType CFF - engine is now disabled by default. It can be conditionally - compiled by defining the configuration macro - CFF_CONFIG_OPTION_OLD_ENGINE. - - - As announced in the previous release, all code related to macro - FT_CONFIG_OPTION_OLD_INTERNALS has been removed, thus becoming - obsolete. - - - III. MISCELLANEOUS - - - The property API (`FT_Property_Get' and `FT_Property_Set') is - now declared as stable. - - The exception, however, are the experimental auto-hinter - properties `glyph-to-script-map' and `fallback-script' which are - subject to change in a forthcoming release. - - - `ftview' has been updated to support color embedded bitmaps; it - can be toggled on and off with key `c'. The small cache toggle - is now key `K'. - - - It is now possible to control the version of the TrueType - hinting engine using the new `interpreter-version' property of - the `truetype' module: Versions 35 and 38 (the default) are - supported, which roughly corresponds to disable and enable - subpixel hinting support, respectively. - - In both `ftview' and `ftdiff', switching between the two - versions can be done with key `H'. In the `ftbench' demo - program, command line option `-H' has been extended to activate - the non-default interpreter version. - - - The `ttdebug' program has been further improved. In particular, - it accepts a new command line option `-H' to select the hinting - engine. - - - `ftdump's verbose option has been renamed to `-V'. For all demo - programs, `-v' now shows version information. - - - Another round of TrueType subpixel hinting fixes. - - - The `apinames' tool can now create an import file for NetWare. - - - 64bit compilation of the new CFF engine was buggy. - - - Some fixes to improve robustness in memory-tight situations. - - -====================================================================== - -CHANGES BETWEEN 2.4.11 and 2.4.12 - - - We have another CFF parsing and hinting engine! Written by Dave - Arnold , this work has been contributed by - Adobe in collaboration with Google. It is vastly superior to - the old CFF engine, and it will replace it in the next release. - Right now, it is still off by default, and you have to - explicitly select it using the new `hinting-engine' property of - the cff driver: - - ... - #include FT_MODULE_H - #include FT_CFF_DRIVER_H - - FT_Library library; - int engine = FT_CFF_HINTING_ADOBE; - - - ... - FT_Property_Set( library, "cff", "hinting-engine", &engine ); - - The code has a (mature) beta status; we encourage all users to - test it and report any problems. - - In case you want to activate the new CFF engine unconditionally, - apply this patch: - ---- snip --- -diff --git a/src/cff/cffobjs.c b/src/cff/cffobjs.c -index ebcf189..3f2ce6b 100644 ---- a/src/cff/cffobjs.c -+++ b/src/cff/cffobjs.c -@@ -1056,7 +1056,7 @@ - - - /* set default property values */ -- driver->hinting_engine = FT_CFF_HINTING_FREETYPE; -+ driver->hinting_engine = FT_CFF_HINTING_ADOBE; - driver->no_stem_darkening = FALSE; - - return FT_Err_Ok; ---- snip --- - - - The macro FT_CONFIG_OPTION_OLD_INTERNALS is no longer set by - default. In the next release, we will completely remove the - associated code. Please update your programs in case you are - still using this macro. - - - II. MISCELLANEOUS - - - The (top-level) `configure' script now respects the MAKE - environment variable to specify a `make' binary. For backwards - compatibility, GNUMAKE still overrides MAKE, though. - - - The `ftview' and `ftdiff' demo programs have been redesigned, - showing more options permanently on the screen, among other - minor improvements. - - - Using the `H' key, it is now possible to select the CFF engine - in both `ftview' and `ftdiff'. - - - The new command line option `-H' for `ftbench' selects the Adobe - CFF engine. - - - It is now possible to directly select the LCD rendering mode - with the keys `A'-`F' in `ftview'. The key mapping for cycling - through LCD modes has been changed from `K' and `L' to `k' and - `l', and toggling custom LCD filtering is no longer mapped to - key `F' but to key `L'. - - - In `ftdiff', key `x' toggles between layout modes: Either use - the advance width (this is new and now the default) or the - bounding box information to determine line breaks. - - - For all demo tools, the new command line option `-v' shows the - version. - - - For the demo tools with a GUI, the new command line options `-w' - and `-h' select the width and the height of the output window, - respectively. - - - The `ttdebug' program was broken and has been reactivated. Note - that this program is not compiled by default. - - -====================================================================== - -CHANGES BETWEEN 2.4.10 and 2.4.11 - - I. IMPORTANT BUG FIXES - - - Some vulnerabilities in the BDF implementation have been fixed. - Users of this font format should upgrade. - - - II. IMPORTANT CHANGES - - - Subpixel hinting support has been contributed by Infinality, - based on Greg Hitchcock's whitepaper at - - http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx - - Originally, it was a separate patch available from - - http://www.infinality.net/blog/ - - and which has been integrated. - - Note that ClearType support is not completely implemented! In - particular, full support for the options `compatible_widths', - `symmetrical_smoothing, and `bgr' (via the GETINFO bytecode - instruction) is missing. - - Activation of subpixel hinting support can be controlled with - the `TT_CONFIG_OPTION_SUBPIXEL_HINTING' configuration option; it - is switched off by default. This feature is still experimental; - we welcome test reports! - - - Support for OpenType collections (OTC) has been added. - - - Pure CFF fonts within an SFNT wrapper are now supported. - - - III. MISCELLANEOUS - - - Minor rendering improvements to the auto-hinter. - - - `FT_GlyphSlot_Oblique' now uses a shear angle of 12°. - - - Experimental support to handle `property modules', for example - to control the behaviour of the auto-hinter. The API consists - of two new functions, `FT_Property_Set' and `FT_Property_Get'. - - The code is still subject to change and should not be used for - production. - - - The `ftdiff' demo program now supports UTF-8 encoded input files - for option `-f'. - - - Using keys `r' and `R', you can now adjust the stroker radius in - the `ftview' demo program. - - - Other, minor fixes and improvements. - - -====================================================================== - -CHANGES BETWEEN 2.4.9 and 2.4.10 - - I. IMPORTANT BUG FIXES - - - Incremental glyph loading as needed by ghostscript was broken. - - - II. MISCELLANEOUS - - - A new function `FT_Outline_EmboldenXY', contributed by Alexei - Podtelezhnikov. - - - In the `ftview' demo program, key `e' has been replaced with `x' - and `y' to embolden in the horizontal and vertical direction, - respectively. - - - The glyph spacing computation in `FT_GlyphSlot_Embolden' (and - similar code in `ftview') has been improved. - - - Minor improvements to the TrueType bytecode interpreter and - glyph loader, the auto-hinter, and the B/W rasterizer. - - -====================================================================== - -CHANGES BETWEEN 2.4.8 and 2.4.9 - - I. IMPORTANT BUG FIXES - - - Another round of fixes to better handle invalid fonts. Many of - them are vulnerabilities (see CVE-2012-1126 up to CVE-2012-1144 - and SA48320) so all users should upgrade. - - - II. MISCELLANEOUS - - - The `ENCODING -1 ' format of BDF fonts is now supported. - - - For BDF fonts, support for the whole Unicode encoding range has - been added. - - - Better TTF support for x_ppem != y_ppem. - - - `FT_Get_Advances' sometimes returned bogus values. - - - The demo programs no longer recognize and handle default - suffixes; you now have to always specify the complete font name. - - - Better rendering and LCD mode cycling added to `ftview'. - - -====================================================================== - -CHANGES BETWEEN 2.4.7 and 2.4.8 - - I. IMPORTANT BUG FIXES - - - Some vulnerabilities in handling CID-keyed PostScript fonts have - been fixed; see CVE-2011-3439. - - - II. MISCELLANEOUS - - - Chris Liddell contributed a new API, `FT_Get_PS_Font_Value', to - retrieve most of the dictionary keys in Type 1 fonts. - - -====================================================================== - -CHANGES BETWEEN 2.4.6 and 2.4.7 - - I. IMPORTANT BUG FIXES - - - Some vulnerabilities in handling Type 1 fonts have been fixed; - see CVE-2011-3256. - - - II. MISCELLANEOUS - - - FreeType now properly handles ZapfDingbats glyph names while - constructing a Unicode character map (for fonts which don't have - one). - - -====================================================================== - -CHANGES BETWEEN 2.4.5 and 2.4.6 - - I. IMPORTANT BUG FIXES - - - For TrueType based fonts, the ascender and descender values were - incorrect sometimes (off by a pixel if the ppem value was not a - multiple of 5). Depending on the use you might now experience - a different layout; the change should result in better, more - consistent line spacing. - - - Fix CVE-2011-0226 which causes a vulnerability while handling - Type 1 fonts. - - - BDF fonts containing glyphs with negative values for ENCODING - were incorrectly rejected. This bug has been introduced in - FreeType version 2.2.0. - - - David Bevan contributed a major revision of the FreeType stroker - code: - - . The behaviour of FT_STROKER_LINEJOIN_BEVEL has been corrected. - - . A new line join style, FT_STROKER_LINEJOIN_MITER_FIXED, has - been introduced to support PostScript and PDF miter joins. - - . FT_STROKER_LINEJOIN_MITER_VARIABLE has been introduced as an - alias for FT_STROKER_LINEJOIN_MITER. - - . Various stroking glitches has been fixed. - - - II. MISCELLANEOUS - - - SFNT bitmap fonts which contain an outline glyph for `.notdef' - only no longer set the FT_FACE_FLAG_SCALABLE flag. - - -====================================================================== - -CHANGES BETWEEN 2.4.4 and 2.4.5 - - I. IMPORTANT BUG FIXES - - - A rendering regression for second-order Bézier curves has been - fixed, introduced in 2.4.3. - - - II. IMPORTANT CHANGES - - - If autohinting is not explicitly disabled, FreeType now uses - the autohinter if a TrueType based font doesn't contain native - hints. - - - The load flag FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH has been made - redundant and is simply ignored; this means that FreeType now - ignores the global advance width value in TrueType fonts. - - - III. MISCELLANEOUS - - - `FT_Sfnt_Table_Info' can now return the number of SFNT tables of - a font. - - - Support for PCF files compressed with bzip2 has been contributed - by Joel Klinghed. To make this work, the OS must provide a - bzip2 library. - - - Bradley Grainger contributed project and solution files in - Visual Studio 2010 format. - - - Again some fixes to better handle broken fonts. - - - Some improvements to the B/W rasterizer. - - - Fixes to the cache module to improve robustness. - - - Just Fill Bugs contributed (experimental) code to compute blue - zones for CJK Ideographs, improving the alignment of horizontal - stems at the top or bottom edges. - - - The `ftgrid' demo program can now display autohinter segments, - to be toggled on and off with key `s'. - - -====================================================================== - -CHANGES BETWEEN 2.4.3 and 2.4.4 - - I. IMPORTANT BUG FIXES - - - UVS support (TrueType/OpenType cmap format 14) support is fixed. - This regression has been introduced in version 2.4.0. - - - II. MISCELLANEOUS - - - Detect tricky fonts (e.g. MingLiU) by the lengths and checksums - of Type42-persistent subtables (`cvt ', `fpgm', and `prep') when - a TrueType font without family name is given. The previous fix, - introduced in 2.4.3, was too rigorous, causing many subsetted - fonts (mainly from PDF files) displayed badly because FreeType - forced rendering with the TrueType bytecode engine instead of - the autohinter. - - - Better support for 64bit platforms. - - - More fixes to improve handling of broken fonts. - - -====================================================================== - -CHANGES BETWEEN 2.4.2 and 2.4.3 - - I. IMPORTANT BUG FIXES - - - Fix rendering of certain cubic, S-shaped arcs. This regression - has been introduced in version 2.4.0. - - - II. MISCELLANEOUS - - - To fix the above mentioned rendering issue, a new spline - flattening algorithm has been introduced which speeds up both - conic and cubic arcs. - - - Handling of broken fonts has been further improved. - - -====================================================================== - -CHANGES BETWEEN 2.4.1 and 2.4.2 - - I. IMPORTANT BUG FIXES - - - A stack overflow in CFF Type2 CharStrings interpreter is fixed. - - - Handling Type 42 font deallocation was broken; additionally, the - library is now more robust against malformed Type 42 fonts. - - - II. MISCELLANEOUS - - - Two new functions, `FT_Reference_Library' (in FT_MODULE_H) and - `FT_Reference_Face' (in FT_FREETYPE_H), have been added to - simplify life-cycle management. A counter gets initialized to 1 - at the time an FT_Library (or FT_Face) structure is created. - The two new functions increment the respective counter. - `FT_Done_Library' and `FT_Done_Face' then only destroy a library - or face if the counter is 1, otherwise they simply decrement the - counter. - - -====================================================================== - -CHANGES BETWEEN 2.4.0 and 2.4.1 - - I. IMPORTANT CHANGES - - - A serious bug in the CFF font module prevented display of many - glyphs in CFF fonts like `MinionPro-Regular.otf'. - - -====================================================================== - -CHANGES BETWEEN 2.3.12 and 2.4.0 - - I. IMPORTANT CHANGES - - - Since May 2010, all patents regarding the TrueType bytecode - interpreter have expired worldwide. Consequently, we now define - TT_CONFIG_OPTION_BYTECODE_INTERPRETER by default (and undefine - TT_CONFIG_OPTION_UNPATENTED_HINTING). - - - A new function `FT_Library_SetLcdFilterWeights' is available to - adjust the filter weights set by `FT_Library_SetLcdFilter'. - - - II. MISCELLANEOUS - - - Thanks to many reports from Robert Święcki, FreeType's stability - in handling broken or damaged fonts is much improved. - - - Support for LCD filter control has been added to the demo - programs `ftdiff' and `ftview'. - - -====================================================================== - -CHANGES BETWEEN 2.3.11 and 2.3.12 - - I. IMPORTANT CHANGES - - - For `FT_Open_Face', new parameters are available to ignore - preferred family names: FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY and - FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY. - - - II. MISCELLANEOUS - - - Support for incremental font loading (controlled with the - FT_CONFIG_OPTION_INCREMENTAL macro) is now active by default. - - - Better support for vertical metrics. - - - Various minor bug fixes. - - -====================================================================== - -CHANGES BETWEEN 2.3.10 and 2.3.11 - - I. IMPORTANT BUG FIXES - - - Version 2.3.10 broke PCF support. - - -====================================================================== - -CHANGES BETWEEN 2.3.10 and 2.3.9 - - I. IMPORTANT BUG FIXES - - - If all ASCII digits in a font have the same (unscaled) width, - the autohinter respects this and won't change it. - - - TrueType fonts are now rasterized correctly if the horizontal - and vertical resolution differ. - - - Type 1 fonts are now handled with increased precision internally - to avoid serious rounding issues if non-integral coordinates are - encountered. - - - Horizontally condensed CFF fonts (using the font matrix) were - rendered incorrectly. This bug has been introduced after - release 2.3.5. - - - II. IMPORTANT CHANGES - - - Support for the SFNT cmap 13 table format (as defined by the new - OpenType 1.6 specification) has been added. - - - B/W rasterization of well-hinted TrueType fonts at small sizes - has been greatly improved. - - - Calculation of vertical metrics in OpenType fonts has been - improved. - - - III. MISCELLANEOUS - - - It is now possible to change the emboldening factor in the - `ftview' demo program with keys `e' and `E'. - - - It is now possible to change the slant value in the `ftview' - demo program with keys `s' and `S'. - - - The 5-levels grayscale mode of the `ftraster' module (which - FreeType doesn't use by default) was broken since version 2.3.0. - - - Compilation of the `ftgrays' and `ftraster' modules was broken - in stand-alone mode. - - - Various fixes for compilation on 64bit and 16bit architectures. - - -====================================================================== - -CHANGES BETWEEN 2.3.9 and 2.3.8 - - I. IMPORTANT BUG FIXES - - - Very unfortunately, FreeType 2.3.8 contained a change that broke - its official ABI. The end result is that programs compiled - against previous versions of the library, but dynamically linked - to 2.3.8 can experience memory corruption if they call the - `FT_Get_PS_Font_Info' function. - - We recommend all users to upgrade to 2.3.9 as soon as possible, - or to downgrade to a previous release of the library if this is - not an option. - - The origin of the bug is that a new field was added to the - publicly defined `PS_FontInfoRec' structure. Unfortunately, - objects of this type can be stack or heap allocated by callers - of `FT_Get_PS_Font_Info', resulting in a memory buffer - overwrite with its implementation in 2.3.8. - - If you want to know whether your code is vulnerable to this - issue, simply search for the substrings `PS_FontInfo' and - `PS_Font_Info' in your source code. If none is found, your code - is safe and is not affected. - - The FreeType team apologizes for the problem. - - - The POSIX support of MacOS resource-fork fonts (Suitcase fonts - and LaserWriter Type1 PostScript fonts) was broken in 2.3.8. If - FreeType2 is built without Carbon framework, these fonts are not - handled correctly. Version 2.3.7 didn't have this bug. - - - `FT_Get_Advance' (and `FT_Get_Advances') returned bad values for - almost all font formats except TrueType fonts. - - - Fix a bug in the SFNT kerning table loader/parser which could - crash the engine if certain malformed tables were encountered. - - - Composite SFNT bitmaps are now handled correctly. - - - II. IMPORTANT CHANGES - - - The new functions `FT_Get_CID_Is_Internally_CID_keyed' and - `FT_Get_CID_From_Glyph_Index' can be used to access CID-keyed - CFF fonts via CID values. This code has been contributed by - Michael Toftdal. - - - III. MISCELLANEOUS - - - `FT_Outline_Get_InsideBorder' returns FT_STROKER_BORDER_RIGHT - for empty outlines. This was incorrectly documented. - - - The `ftview' demo program now supports UTF-8 encoded strings. - - -====================================================================== - -CHANGES BETWEEN 2.3.8 and 2.3.7 - - I. IMPORTANT BUG FIXES - - - CID-keyed fonts in an SFNT wrapper were not handled correctly. - - - The smooth renderer produced truncated images (on the right) for - outline parts with negative horizontal values. Most fonts don't - contain outlines left to the y coordinate axis, but the effect - was very noticeable for outlines processed with FT_Glyph_Stroke, - using thick strokes. - - - `FT_Get_TrueType_Engine_Type' returned a wrong value if both - configuration macros TT_CONFIG_OPTION_BYTECODE_INTERPRETER and - TT_CONFIG_OPTION_UNPATENTED_HINTING were defined. - - - The `face_index' field in the `FT_Face' structure wasn't - initialized properly after calling FT_Open_Face and friends with - a positive face index for CFFs, WinFNTs, and, most importantly, - for TrueType Collections (TTCs). - - - II. IMPORTANT CHANGES - - - Rudimentary support for Type 1 fonts and CID-keyed Type 1 fonts - in an SFNT wrapper has been added -- such fonts are used on the - Mac. The core SFNT tables `TYP1' and `CID ' are passed to the - PS Type 1 and CID-keyed PS font drivers; other tables (`ALMX', - `BBOX', etc.) are not supported yet. - - - A new interface to extract advance values of glyphs without - loading their outlines has been added. The functions are called - `FT_Get_Advance' and `FT_Get_Advances'; they are defined in file - `ftadvanc.h' (to be accessed as FT_ADVANCES_H). - - - A new function `FT_Get_FSType_Flags' (in FT_FREETYPE_H) has been - contributed by David Bevan to access the embedding and - subsetting restriction information of fonts. - - - III. MISCELLANEOUS - - - FT_MulFix is now an inlined function; by default, assembler code - is provided for x86 and ARM. See FT_CONFIG_OPTION_INLINE_MULFIX - and FT_CONFIG_OPTION_NO_ASSEMBLER (in ftoption.h) for more. - - - The handling of `tricky' fonts (this is, fonts which don't work - with the autohinter, needing the font format's hinting engine) - has been generalized and changed slightly: - - . A new face flag FT_FACE_FLAG_TRICKY indicates that the font - format's hinting engine is necessary for correct rendering. - The macro FT_IS_TRICKY can be used to check this flag. - - . FT_LOAD_NO_HINTING is now ignored for tricky fonts. To really - force raw loading of such fonts (without hinting), both - FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT must be used -- - this is something which you probably never want to do. - - . Tricky TrueType fonts always use the bytecode interpreter, - either the patented or unpatented version. - - - The function `FT_GlyphSlot_Own_Bitmap' has been moved from - FT_SYNTHESIS_H to FT_BITMAP_H; it is now part of the `official' - API. (The functions in FT_SYNTHESIS_H are still subject to - change, however.) - - - In the `ftdiff' demo program you can now toggle the use of - FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH with key `a'. - - -====================================================================== - -CHANGES BETWEEN 2.3.7 and 2.3.6 - - I. IMPORTANT BUG FIXES - - - If the library was compiled on an i386 platform using gcc, and - compiler option -O3 was given, `FT_MulFix' sometimes returned - incorrect results which could have caused problems with - `FT_Request_Metrics' and `FT_Select_Metrics', returning an - incorrect descender size. - - - Pure CFFs without subfonts were scaled incorrectly if the font - matrix was non-standard. This bug has been introduced in - version 2.3.6. - - - The `style_name' field in the `FT_FaceRec' structure often - contained a wrong value for Type 1 fonts. This misbehaviour - has been introduced in version 2.3.6 while trying to fix - another problem. [Note, however, that this value is - informative only since the used algorithm to extract it is - very simplistic.] - - - II. IMPORTANT CHANGES - - - Two new macros, FT_OUTLINE_SMART_DROPOUTS and - FT_OUTLINE_EXCLUDE_STUBS, have been introduced. Together with - FT_OUTLINE_IGNORE_DROPOUTS (which was ignored previously) it is - now possible to control the dropout mode of the `raster' module - (for B&W rasterization), using the `flags' field in the - `FT_Outline' structure. - - - The TrueType bytecode interpreter now passes the dropout mode to - the B&W rasterizer. This greatly increases the output for small - ppem values of many fonts like `pala.ttf'. - - -====================================================================== - -CHANGES BETWEEN 2.3.6 and 2.3.5 - - I. IMPORTANT BUG FIXES - - - A bunch of potential security problems have been found. All - users should update. - - - Microsoft Unicode cmaps in TrueType fonts are now always - preferred over Apple cmaps. This is not a bug per se, but there - exist some buggy fonts created for MS which have broken Apple - cmaps. This affects only the automatic selection of FreeType; - it's always possible to manually select an Apple Unicode cmap if - desired. - - - Many bug fixes to the TrueType bytecode interpreter. - - - Improved Mac support. - - - Subsetted CID-keyed CFFs are now supported correctly. - - - CID-keyed CFFs with subfonts which are scaled in a non-standard - way are now handled correctly. - - - A call to FT_Open_Face with `face_index' < 0 crashed FreeType if - the font was a Windows (bitmap) FNT/FON. - - - II. IMPORTANT CHANGES - - - The new function `FT_Get_CID_Registry_Ordering_Supplement' gives - access to those fields in a CID-keyed font. The code has been - contributed by Derek Clegg. - - - George Williams contributed code to validate the new `MATH' - OpenType table (within the `otvalid' module). The `ftvalid' - demo program has been extended accordingly. - - - An API for cmap 14 support (for Unicode Variant Selectors, UVS) - has been contributed by George Williams. - - - A new face flag FT_FACE_FLAG_CID_KEYED has been added, together - with a macro FT_IS_CID_KEYED which evaluates to 1 if the font is - CID-keyed. - - - III. MISCELLANEOUS - - - Build support for symbian has been contributed. - - - Better WGL4 glyph name support, contributed by Sergey Tolstov. - - - Debugging output of the various FT_TRACEX macros is now sent to - stderr. - - - The `ftview' demo program now provides artificial slanting too. - - - The `ftvalid' demo program has a new option `-f' to select the - font index. - - -====================================================================== - -CHANGES BETWEEN 2.3.5 and 2.3.4 - - I. IMPORTANT BUG FIXES - - - Some subglyphs in TrueType fonts were handled incorrectly due to - a missing graphics state reinitialization. - - - Large .Z files (as distributed with some X11 packages) weren't - handled correctly, making FreeType increase the heap stack in an - endless loop. - - - A large number of bugs have been fixed to avoid crashes and - endless loops with invalid fonts. - - - II. IMPORTANT CHANGES - - - The two new cache functions `FTC_ImageCache_LookupScaler' and - `FTC_SBit_Cache_LookupScaler' have been added to allow lookup of - glyphs using an `FTC_Scaler' object; this makes it possible to - use fractional pixel sizes in the cache. The demo programs have - been updated accordingly to use this feature. - - - A new API `FT_Get_CMap_Format' has been added to get the cmap - format of a TrueType font. This is useful in handling PDF - files. The code has been contributed by Derek Clegg. - - - The auto-hinter now produces better output by default for - non-Latin scripts like Indic. This was done by using the CJK - hinting module as the default instead of the Latin one. Thanks - to Rahul Bhalerao for this suggestion. - - - A new API `FT_Face_CheckTrueTypePatents' has been added to find - out whether a given TrueType font uses patented bytecode - instructions. The `ft2demos' bundle contains a new program - called `ftpatchk' which demonstrates its usage. - - - A new API `FT_Face_SetUnpatentedHinting' has been added to - enable or disable the unpatented hinter. - - - Support for Windows FON files in PE format has been contributed - by Dmitry Timoshkov. - - - III. MISCELLANEOUS - - - Vincent Richomme contributed Visual C++ project files for Pocket - PCs. - - -====================================================================== - -CHANGES BETWEEN 2.3.4 and 2.3.3 - - I. IMPORTANT BUG FIXES - - - A serious bug in the handling of bitmap fonts (and bitmap - strikes of outline fonts) has been introduced in 2.3.3. - - -====================================================================== - -CHANGES BETWEEN 2.3.3 and 2.3.2 - - I. IMPORTANT BUG FIXES - - - Remove a serious regression in the TrueType bytecode interpreter - that was introduced in version 2.3.2. Note that this does not - disable the improvements introduced to the interpreter in - version 2.3.2, only some ill cases that occurred with certain - fonts (though a few popular ones). - - - The auto-hinter now ignores single-point contours for computing - blue zones. This bug created `wavy' baselines when rendering - text with various fonts that use these contours to model - mark-attach points (these are points that are never rasterized - and are placed outside of the glyph's real outline). - - - The `rsb_delta' and `lsb_delta' glyph slot fields are now set to - zero for mono-spaced fonts. Otherwise code that uses them would - essentially ruin the fixed-advance property. - - - Fix CVE-2007-1351 which can cause an integer overflow while - parsing BDF fonts, leading to a potentially exploitable heap - overflow condition. - - - II. MISCELLANEOUS - - - Fixed compilation issues on some 64-bit platforms (see ChangeLog - for details). - - - A new demo program `ftdiff' has been added to compare TrueType - hinting, FreeType's auto hinting, and rendering without hinting - in three columns. - - -====================================================================== - -CHANGES BETWEEN 2.3.2 and 2.3.1 - - I. IMPORTANT BUG FIXES - - - FreeType returned incorrect kerning information from TrueType - fonts when the bytecode interpreter was enabled. This happened - due to a typo introduced in version 2.3.0. - - - Negative kerning values from PFM files are now reported - correctly (they were read as 16-bit unsigned values from the - file). - - - Fixed a small memory leak when `FT_Init_FreeType' failed for - some reason. - - - The Postscript hinter placed and sized very thin and ghost stems - incorrectly. - - - The TrueType bytecode interpreter has been fixed to get rid of - most of the rare differences seen in comparison to the Windows - font loader. - - - II. IMPORTANT CHANGES - - - The auto-hinter now better deals with serifs and corner cases - (e.g., glyph '9' in Arial at 9pt, 96dpi). It also improves - spacing adjustments and doesn't change widths for non-spacing - glyphs. - - - Many Mac-specific functions are deprecated (but still - available); modern replacements have been provided for them. - See the documentation in file `ftmac.h'. - - -====================================================================== - -CHANGES BETWEEN 2.3.1 and 2.3.0 - - I. IMPORTANT BUG FIXES - - - The TrueType interpreter sometimes returned incorrect horizontal - metrics due to a bug in the handling of the SHZ instruction. - - - A typo in a security check introduced after version 2.2.1 - prevented FreeType to render some glyphs in CFF fonts. - - -====================================================================== - -CHANGES BETWEEN 2.3.0 and 2.2.1 - - I. IMPORTANT BUG FIXES - - - The PCF font loader is now much more robust while loading - malformed font files. - - - Various memory leaks have been found and fixed. - - - The TrueType name loader now deals properly with some fonts that - encode their names in UTF-16 (the specification was vague, and - the code incorrectly assumed UCS-4). - - - Fixed the TrueType bytecode loader to deal properly with subtle - monochrome/gray issues when scaling the CVT. Some fonts - exhibited bad rendering artifacts otherwise. - - - `FT_GlyphSlot_Embolden' now supports vertical layouts correctly - (it mangled the vertical advance height). - - - Fixed byte endian issues of `ftmac.c' to support Mac OS X on - i386. - - - The PFR font loader no longer erroneously tags font files - without any outlines as FT_FACE_FLAG_SCALABLE. - - - II. NEW API FUNCTIONS - - - `FT_Library_SetLcdFilter' allows you to select a special filter - to be applied to the bitmaps generated by `FT_Render_Glyph' if - one of the FT_RENDER_MODE_LCD and FT_RENDER_MODE_LCD_V modes has - been selected. This filter is used to reduce color fringes; - several settings are available through the FT_LCD_FILTER_XXX - enumeration. - - Its declaration and documentation can be found in file - `include/freetype/ftlcdfil.h' (to be accessed with macro - FT_LCD_FILTER_H). - - *IMPORTANT*: This function returns an error - (FT_Err_Unimplemented_Feature) in default builds of the library - for patent reasons. See below. - - - `FT_Get_Gasp' allows you to query the flags of the TrueType - `gasp' table for a given character pixel size. This is useful - to duplicate the text rendering of MS Windows when the native - bytecode interpreter is enabled (which isn't the default for - other patent reasons). - - Its declaration and documentation can be found in file - `include/freetype/ftgasp.h' (to be accessed with macro - FT_GASP_H). - - - III. IMPORTANT CHANGES - - - The auto-hinter has been tuned a lot to improve its results with - serif fonts, resulting in much better font rendering of many web - pages. - - - The unpatented hinter is now part of the default build of the - library; we have added code to automatically support `tricky' - fonts that need it. - - This means that FreeType should `just work' with certain Asian - fonts, like MingLiU, which cannot properly be loaded without a - bytecode interpreter, but which fortunately do not use any of - the patented bytecode opcodes. We detect these fonts by name, - so please report any font file that doesn't seem to work with - FreeType, and we shall do what we can to support it in a next - release. - - Note that the API hasn't changed, so you can still force - unpatented hinting with a special parameter to `FT_Open_Face' as - well. This might be useful in same cases; for example, a PDF - reader might present a user option to activate it to deal with - certain `tricky' embedded fonts which cannot be clearly - identified. - - If you are a developer for embedded systems, you might want to - *disable* the feature to save code space by undefining - TT_CONFIG_OPTION_UNPATENTED_HINTING in file `ftoption.h'. - - - LCD-optimized rendering is now *disabled* in all default builds - of the library, mainly due to patent issues. For more - information see: - - http://lists.gnu.org/archive/html/freetype/2006-09/msg00064.html - - A new configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING - has been introduced in `ftoption.h'; manually define it in this - file if you want to re-enable the feature. - - The change only affects the implementation, not the FreeType - API. This means that clients don't need to be modified, because - the library still generates LCD decimated bitmaps, but with the - added constraint that R=G=B on each triplet. - - The displayed result should be equal to normal anti-aliased - rendering. - - Additionally, if FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not - defined, the new `FT_Library_SetLcdFilter' function returns the - FT_Err_Unimplemented_Feature error code. - - - Some computation bugs in the TrueType bytecode interpreter were - found, which allow us to get rid of very subtle and rare - differences we had experienced with the Windows renderer. - - - It is now possible to cross-compile the library easily. See the - file `docs/INSTALL.CROSS' for details. - - - The file `src/base/ftmac.c' now contains code for Mac OS X only; - its deprecated function `FT_GetFile_From_Mac_Font_Name' always - returns an error even if the QuickDraw framework is available. - The previous version has been moved to `builds/mac/ftmac.c'. - - Selecting configure option `--with-quickdraw-carbon' makes the - build process use the original `ftmac.c' file instead of the Mac - OS X-only version. - - - IV. MISCELLANEOUS - - - Various performance and memory footprint optimizations have been - performed on the TrueType and CFF font loaders, sometimes with - very drastic benefits (e.g., the TrueType loader is now about - 25% faster; FreeType should use less heap memory under nearly - all conditions). - - - The anti-aliased rasterizer has been optimized and is now 15% to - 25% percent faster than in previous versions, depending on - content. - - - The Type 1 loader has been improved; as an example, it now skips - top-level dictionaries properly. - - - Better support for Mac fonts on POSIX systems, plus compilation - fixes for Mac OS X on ppc64 where `ftmac.c' cannot be built. - - - Configuration without `--with-old-mac-fonts' does not include - `ftmac.c' (this was the behaviour in FreeType version 2.1.10). - - - The TrueTypeGX validator (gxvalid) checks the order of glyph IDs - in the kern table. - - -====================================================================== - -CHANGES BETWEEN 2.2.1 and 2.2 - - I. IMPORTANT BUG FIXES - - - Various integer overflows have been fixed. - - - PFB fonts with MacOS resource fork weren't handled correctly on - non-MacOS platforms. - - -====================================================================== - -CHANGES BETWEEN 2.2 and 2.1.10 - -(not released officially) - - I. IMPORTANT BUG FIXES - - - Vertical metrics for SFNT fonts were incorrect sometimes. - - - The FT_HAS_KERNING macro always returned 0. - - - CFF OpenType fonts didn't return correct vertical metrics for - glyphs with outlines. - - - If FreeType was compiled without hinters, all font formats based - on PS outlines weren't scaled correctly. - - - II. IMPORTANT CHANGES - - - Version 2.2 no longer exposes its internals, this is, the header - files located in the `include/freetype/internal' directory of - the source package are not copied anymore by the `make install' - command. Consequently, a number of rogue clients which directly - access FreeType's internal functions and structures won't - compile without modification. - - We provide patches for most of those rogue clients. See the - following page for more information: - - http://www.freetype.org/freetype2/patches/rogue-patches.html - - Note that, as a convenience to our Unix desktop users, version - 2.2 is *binary* compatible with FreeType 2.1.7, which means that - installing this release on an existing distribution shall not - break any working desktop. - - - FreeType's build mechanism has been redesigned. With GNU make - it is now sufficient in most cases to edit two files: - `modules.cfg', to select the library components, and the - configuration file `include/freetype/config/ftoption.h' (which - can be copied to the objects directory). Removing unused module - directories to prevent its compilation and editing - `include/freetype/config/ftmodule.h' is no longer necessary. - - - The LIGHT hinting algorithm produces more pleasant results. - Also, using the FT_LOAD_TARGET_LIGHT flags within FT_Load_Glyph - always forces auto-hinting, as a special exception. This allows - you to experiment with it even if you have enabled the TrueType - bytecode interpreter in your build. - - - The auto hinter now employs a new algorithm for CJK fonts, based - on Akito Hirai's patch. Note that this only works for fonts - with a Unicode charmap at the moment. - - - The following callback function types have changed slightly (by - adding the `const' keyword where appropriate): - - FT_Outline_MoveToFunc - FT_Outline_LineToFunc - FT_Outline_ConicToFunc - FT_Outline_CubicToFunc - FT_SpanFunc - FT_Raster_RenderFunc - - FT_Glyph_TransformFunc - FT_Renderer_RenderFunc - FT_Renderer_TransformFunc - - Note that this doesn't affect binary backward compatibility. - - - On MacOS, new APIs have been added as replacements for legacy - APIs: `FT_New_Face_From_FSRef' for `FT_New_Face_From_FSSpec', - and `FT_GetFile_From_Mac_ATS_Name' for - `FT_GetFile_From_Mac_Name'. Legacy APIs are still available, if - FreeType is built without disabling them. - - - A new API `FT_Select_Size' has been added to select a bitmap - strike by its index. Code using other functions to select - bitmap strikes should be updated to use this function. - - - A new API `FT_Get_SubGlyph_Info' has been added to retrieve - subglyph data. This can be used by rogue clients which used to - access the internal headers to get the corresponding data. - - - In 2.1.10, the behaviour of `FT_Set_Pixel_Sizes' was changed for - BDF/PCF fonts, and only for them. This causes inconsistency. - In this release, we undo the change. The intent of the change - in 2.1.10 is to allow size selection through real dimensions, - which can now be done through `FT_Request_Size'. - - - Some security issues were discovered and fixed in the CFF and - Type 1 loader, causing crashes of FreeType by malformed font - files. - - - III. MISCELLANEOUS - - - The documentation for FT_LOAD_TARGET_XXX and FT_RENDER_MODE_XXX - values now better reflects its usage and differences: One set is - used to specify the hinting algorithm, the other to specify the - pixel rendering mode. - - - `FT_New_Face' and `FT_New_Face_From_FSSpec' in ftmac.c have been - changed to count supported scalable faces (sfnt, LWFN) only, and - to return the number of available faces via face->num_faces. - Unsupported bitmap faces (fbit, NFNT) are ignored. - - - builds/unix/configure has been improved for MacOS X. It now - automatically checks available functions in Carbon library, and - prepare to use newest functions by default. Options to specify - the dependencies of each Carbon APIs (FSSpec, FSRef, old/new - QuickDraw, ATS) are available too. By manual disabling of all - QuickDraw functionality, FreeType can be built without - `deprecated function' warnings on MacOS 10.4.x, but - FT_GetFile_Mac_Name in ftmac.c then is changed to a dummy - function, and returns an `unimplemented' error. For details see - builds/mac/README. - - - SFNT cmap handling has been improved, mainly to run much faster - with CJK fonts. - - - A new function `FT_Get_TrueType_Engine_Type (declared in - `FT_MODULE_H') is provided to determine the status of the - TrueType bytecode interpreter compiled into the library - (patented, unpatented, unimplemented). - - - Vertical metrics of glyphs are synthesized if the font does not - provide such information. You can tell whether the metrics are - synthesized or not by checking the FT_FACE_FLAG_VERTICAL flag of - the face. - - - The demo programs `ftview' and `ftstring' have been rewritten - for better readability. `ftview' has a new switch `-p' to test - FT_New_Memory_Face (instead of FT_New_Face). - - - FreeType now honours bit 1 in the `head' table of TrueType fonts - (meaning `left sidebearing point at x=0'). This helps with some - buggy fonts. - - - Rudimentary support for Adobe's new `SING Glyphlet' format. See - - http://www.adobe.com/products/indesign/sing_gaiji.html - - for more information. - - - The `ftdump' program from the `ft2demos' bundle now shows some - information about charmaps. It also supports a new switch `-v' - to increase verbosity. - - - Better AFM support. This includes track kerning support. - - -====================================================================== - -CHANGES BETWEEN 2.1.10 and 2.1.9 - - I. IMPORTANT BUG FIXES - - - The size comparison for BDF and PCF files could fail sometimes. - - - Some CFF files were still not loaded correctly. Patch from - Derek Noonburg. - - - The stroker still had some serious bugs. - - - Boris Letocha fixed a bug in the TrueType interpreter: The - NPUSHW instruction wasn't skipped correctly in IF clauses. Some - fonts like `Helvetica 75 Bold' failed. - - - Another serious bug in handling TrueType hints caused many - distortions. It has been introduced in version 2.1.8, and it is - highly recommended to upgrade. - - - FreeType didn't properly parse empty Type 1 glyphs. - - - An unbound dynamic buffer growth was fixed in the PFR loader. - - - Several bugs have been fixed in the cache sub-system. - - - FreeType behaved incorrectly when resizing two distinct but very - close character pixel sizes through `FT_Set_Char_Size' (Savannah - bug #12263). - - - The auto-hinter didn't work properly for fonts without a Unicode - charmap -- it even refused to load the glyphs. - - - II. IMPORTANT CHANGES - - - Many fixes have been applied to drastically reduce the amount of - heap memory used by FreeType, especially when using - memory-mapped font files (which is the default on Unix systems - which support them). - - - The auto-hinter has been replaced with a new module, called the - `auto-fitter'. It consumes less memory than its predecessor, - and it is prepared to support non-latin scripts better in next - releases. - - - George Williams contributed code to read kerning data from PFM - files. - - - FreeType now uses the TT_NAME_ID_PREFERRED_FAMILY and - TT_NAME_ID_PREFERRED_SUBFAMILY strings (if available) for - setting family and style in SFNT fonts (patch from Kornfeld - Eliyahu Peter). - - - A new API `FT_Sfnt_Table_Info' (in FT_TRUETYPE_TABLES_H) has - been added to retrieve name and size information of SFNT tables. - - - A new API `FT_OpenType_Validate' (in FT_OPENTYPE_VALIDATE_H) has - been added to validate OpenType tables (BASE, GDEF, GPOS, GSUB, - JSTF). After validation it is no longer necessary to check - for errors in those tables while accessing them. - - Note that this module might be moved to another library in the - future to avoid a tight dependency between FreeType and the - OpenType specification. - - - A new API in FT_BITMAP_H (`FT_Bitmap_New', `FT_Bitmap_Convert', - `FT_Bitmap_Copy', `FT_Bitmap_Embolden', `FT_Bitmap_Done') has - been added. Its use is to convert an FT_Bitmap structure in - 1bpp, 2bpp, 4bpp, or 8bpp format into another 8bpp FT_Bitmap, - probably using a different pitch, and to further manipulate it. - - - A new API `FT_Outline_Embolden' (in FT_OUTLINE_H) gives finer - control how outlines are embolded. - - - `FT_GlyphSlot_Embolden' (in FT_SYNTHESIS_H) now handles bitmaps - also (code contributed by Chia I Wu). Note that this function - is still experimental and may be replaced with a better API. - - - The method how BDF and PCF bitmap fonts are accessed has been - refined. Formerly, FT_Set_Pixel_Sizes and FT_Set_Char_Size - were synonyms in FreeType's BDF and PCF interface. This has - changed now. FT_Set_Pixel_Sizes should be used to select the - actual font dimensions (the `strike', which is the sum of the - `FONT_ASCENT' and `FONT_DESCENT' properties), while - FT_Set_Char_Size selects the `nominal' size (the `PIXELSIZE' - property). In both functions, the width parameter is ignored. - - - III. MISCELLANEOUS - - - The BDF driver no longer converts all returned bitmaps with a - depth of 2bpp or 4bpp to a depth of 8bpp. The documentation has - not mentioned this explicitly, but implementors might have - relied on this after looking into the source files. - - - A new option `--ftversion' has been added to freetype-config to - return the FreeType version. - - - The memory debugger has been updated to dump allocation - statistics on all allocation sources in the library. This is - useful to spot greedy allocations when loading and processing - fonts. - - - We removed a huge array of constant pointers to constant strings - in the `psnames' module. The problem was that compilations in - PIC mode (i.e., when generating a Unix shared object/dll) put - the array into the non-shared writable section of the library - since absolute pointers are not relocatable by nature. - - This reduces the memory consumption by approximately 16KByte per - process linked to FreeType. We now also store the array in a - compressed form (as a trie) which saves about 20KByte of code as - well. - - - Kirill Smelkov provided patches to make src/raster/ftraster.c - compile stand-alone again. - - -====================================================================== - -CHANGES BETWEEN 2.1.9 and 2.1.8 - - I. IMPORTANT BUG FIXES - - - The function `FT_Get_CharMap_Index' was only declared, without - any real code. For consistency, it has been renamed to - `FT_Get_Charmap_Index'. (This function is needed to implement - cmap caches.) - - - `FT_Outline_Get_BBox' sometimes returned incorrect values for - conic outlines (e.g., for TrueType fonts). - - - Handling of `bhed' table has been fixed. - - - The TrueType driver with enabled byte code interpreter sometimes - returned artifacts due to incorrect rounding. This bug has been - introduced after version 2.1.4. - - - The BDF driver dropped the last glyph in the font. - - - The BDF driver now uses the DEFAULT_CHAR property (if available) - to select a glyph shape for the undefined glyph. - - - The stroker failed for closed outlines and single points. - - - II. IMPORTANT CHANGES - - - George Williams contributed code to handle Apple's font - distortion technology found in GX fonts (`avar', `cvar', `fvar', - and `gvar' tables; the Multiple Masters API has been slightly - extended to cope with the new functionality). - - - The `FT_GlyphSlotRec' structure has been extended: The elements - `lsb_delta' and `rsb_delta' give the difference between hinted - and unhinted left and right side bearings if autohinting is - active. Using those values can improve the inter-letter spacing - considerably. See the documentation of `FT_GlyphSlotRec' and - the `ftstring' demo program how to use it. - - - Loading TrueType and Type 1 fonts has been made much faster. - - - The stroker is no longer experimental (but the cache subsystem - still is). - - - III. MISCELLANEOUS - - - A new documentation file `formats.txt' describes various font - formats supported (and not supported) by FreeType. - - -====================================================================== - -CHANGES BETWEEN 2.1.8 and 2.1.7 - - I. IMPORTANT BUG FIXES - - - The native TrueType hinter contained some bugs which prevented - some fonts to be rendered correctly, most notably Legendum.otf. - - - The PostScript hinter now produces improved results. - - - The linear advance width and height values were incorrectly - rounded, making them virtually unusable if not loaded with - FT_LOAD_LINEAR_DESIGN. - - - Indexing CID-keyed CFF fonts is now working: The glyph index is - correctly treated as a CID, similar to FreeType's CID driver - module. Note that CID CMap support is still missing. - - - The FT_FACE_FLAGS_GLYPH_NAMES flag is now set correctly for all - font formats. - - - Some subsetted Type 1 fonts weren't parsed correctly. This bug - has been introduced in 2.1.7. In summary, the Type 1 parser has - become more robust. - - - Non-decimal numbers weren't parsed correctly in PS fonts. - - - The WinFNT driver now correctly reports FT_ENCODING_NONE for all - but one encoding. Use the new FT_WinFNT_ID_XXX values together - with `FT_Get_WinFNT_Header' to get the WinFNT charset ID. - - - The descender metrics (face->size->metrics.descender) for WinFNT - bitmap fonts had the wrong sign. - - - The (emulated) `seac' support for CFF fonts was broken. - - - The `flex' operator didn't work for CFF fonts. - - - PS glyphs which use the `hintmask' operator haven't been - rendered correctly in some cases. - - - Metrics for BDF and PCF bitmap font formats have been fixed. - - - Autohinting is now disabled for glyphs which are vertically - distorted or mirrored (using a transformation matrix). This - fixes a bug which produced zero-height glyphs. - - - The `freetype-config' script now handles --prefix and - --exec-prefix correctly; it also returns the proper --rpath (or - -R) value if FreeType has been built as a shared library. - - - II. IMPORTANT CHANGES - - - Both PCF and BDF drivers now handle the SETWIDTH_NAME and - ADD_STYLE_NAME properties. Values are appended to - face->style_name; example: `Bold SemiCondensed'. - - - The PCF driver now handles bitmap fonts compressed with the LZW - algorithm (extension .pcf.Z, compressed with `compress'). - - - A new API function `FT_Get_CMap_Language_ID' (declared in - `tttables.h') is available to get the language ID of a - TrueType/SFNT cmap. - - - The hexadecimal format of data after the `StartData' command in - CID-keyed Type 1 fonts is now supported. While this can't occur - in file-based fonts, it can happen in document-embedded - resources of PostScript documents. - - - Embedded bitmaps in SFNT-based CFF fonts are now supported. - - - A simple API is now available to control FreeType's tracing - mechanism if compiled with FT_DEBUG_LEVEL_TRACE. See the file - `ftdebug.h' for more details. - - - YAMATO Masatake contributed improved handling of MacOS resource - forks on non-MacOS platforms (for example, Linux can mount MacOS - file systems). - - - Support for MacOS has been improved; there is now a new function - `FT_New_Face_From_FSSpec' similar to `FT_New_Face' except that - it accepts an FSSpec instead of a path. - - - The cache sub-system has been rewritten. - - - There is now support for deinstallation of faces. - - - A new API function `FTC_Manager_RemoveFaceID' has been added - to delete all `idle' nodes that correspond to a given - FTC_FaceID. All `locked' nodes (i.e., those with a reference - count > 0), will be modified to prevent them from appearing in - further lookups (they will be cleaned normally when their - reference count reaches 0). - - - There is now support for point scaling (i.e., providing - character sizes in points + dpis, instead of pixels). - - - Three abstract cache classes are now available: - - FTC_GCache: Used to store one glyph item per cache node, - with the ability to group common attributes into - `families'. This replaces the old - FTC_GlyphCache class. - - FTC_ICache: Used to store one FT_Glyph per cache node. This - extends FTC_GCache. Family definition, family - comparison, and glyph loading are however left - to sub-classes. - - FTC_SCache: Used to store up to 16 small bitmaps per cache - node. This extends FTC_GCache. Family - definition, family comparison and glyph loading - are however left to sub-classes. - - - The file `src/cache/ftcbasic.c' implements: - - FTC_ImageCache: Extends FTC_ICache; implements family - definitions and glyph loading similar to the - old API. - - FTC_SBitCache: Extends FTC_SCache, implements family - definitions and glyph loading similar to the - old API - - Client applications should be able to extend FTC_GCache, - FTC_ICache, or FTC_SCache much more easily (i.e., less code to - write, and less callbacks). For example, one could envision - caches that are capable of storing transformed (obliqued), - stroked, emboldened, or colored glyph images. Use - `ftcbasic.c' as an example. - - - All public APIs are now in `include/freetype/ftcache.h', (to - be accessed as `FT_CACHE_H'). The contents of - `include/freetype/cache/' is only needed by applications that - wish to implement their own caches. - - - There were some major performance improvements through the use - of various programming tricks. Cache hits are up to 70% - faster than in the old code. - - - The FTC_CMapCache has been simplified. Charmaps can only be - accessed by index right now. There is also a new API named - `FT_Charmap_GetIndex' for this purpose. - - - The demo programs have been updated to the new code. The - previous versions will not work with the current one. - - - Using an invalid face index in FT_Open_Face and friends now - causes an error even if the font contains a single face only. - - - III. MISCELLANEOUS - - - Wolfgang Domröse contributed support files for building FreeType - on the Atari using the PureC compiler. Note that the Atari is a - 16bit platform. - - - Vitaliy Pasternak contributed project files for VS.NET 2003. - - -====================================================================== - -CHANGES BETWEEN 2.1.7 and 2.1.6 - - I. IMPORTANT BUG FIXES - - - Updated to newest libtool version, fixing build problems on - various platforms. - - - On Unix platforms, `make install' didn't copy the correct - `ftconfig.h' file. - - Note that version 2.1.7 contains the same library C source code as - version 2.1.6. - - -====================================================================== - -CHANGES BETWEEN 2.1.6 and 2.1.5 - - I. IMPORTANT BUG FIXES - - - The PFR font driver didn't load kerning tables correctly, and - the functions in FT_PFR_H didn't work at all. - - - Type 1 font files in binary format (PFB) with an end-of-file - indicator weren't accepted by the FreeType engine. - - - Fonts which contain /PaintType and /StrokeWidth no longer cause - a segfault. This bug has been introduced in version 2.1.5. - - - Fonts loaded with FT_LOAD_RENDER no longer cause strange - results. This bug has been introduced in version 2.1.5. - - - Some Windows (bitmap) FNT/FON files couldn't be handled - correctly. - - - II. IMPORTANT CHANGES - - - The internal module API has been heavily changed in favor of - massive simplifications within the font engine. This also means - that authors of third-party modules must adapt their code to the - new scheme. - - NOTE: THE NEW SCHEME IS NOT COMPLETED YET. PLEASE WAIT UNTIL A - FINAL ANNOUNCEMENT! - - - The PostScript parser has been enhanced to handle comments and - strings correctly. Additionally, more syntax forms are - recognized. - - - Added the optional unpatented hinting system for TrueType. It - allows typefaces which need hinting to produce correct glyph - forms (e.g., Chinese typefaces from Dynalab) to work acceptably - without infringing Apple patents. This system is compiled only - if TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING is defined in - ftoption.h (activated by default). - - - III. MISCELLANEOUS - - - There is now a guard in the public header files to protect - against inclusion of freetype.h from FreeType 1. - - - Direct inclusion of freetype.h and other public header files no - longer works. You have to use the documented scheme - - #include - #include FT_FREETYPE_H - - to load freetype.h with a symbolic name. This protects against - renaming of public header files (which shouldn't happen but - actually has, avoiding two public header files with the same - name). - - -====================================================================== - -CHANGES BETWEEN 2.1.5 and 2.1.4 - - I. IMPORTANT BUG FIXES - - - Parsing the /CIDFontName field now removes the leading slash to - be in sync with other font drivers. - - - gzip support was buggy. Some fonts could not be read. - - - Fonts which have nested subglyphs more than one level deep no - longer cause a segfault. - - - Creation of synthetic cmaps for fonts in CFF format was broken - partially. - - - Numeric font dictionary entries for synthetic fonts are no - longer overwritten. - - - The font matrix wasn't applied to the advance width for Type1, - CID, and CFF fonts. This caused problems when loading certain - synthetic Type 1 fonts like `Helvetica Narrow'. - - - The test for the charset registry in BDF and PCF fonts is now - case-insensitive. - - - FT_Vector_Rotate sometimes returned strange values due to - rounding errors. - - - The PCF driver now returns the correct number of glyphs - (including an artificial `notdef' glyph at index 0). - - - FreeType now supports buggy CMaps which are contained in many - CJK fonts from Dynalab. - - - Opening an invalid font on a Mac caused a segfault due to - double-freeing memory. - - - BDF fonts with more than 32768 glyphs weren't supported - properly. - - - II. IMPORTANT CHANGES - - - Accessing bitmap font formats has been synchronized. To do that - the FT_Bitmap_Size structure has been extended to contain new - fields `size', `x_ppem', and `y_ppem'. - - - The FNT driver now returns multiple faces, not multiple strikes. - - - The `psnames' module has been updated to the Adobe Glyph List - version 2.0. - - - The `psnames' module now understands `uXXXX[X[X]]' glyph names. - - - The algorithm for guessing the font style has been improved. - - - For fonts in SFNT format, root->height is no longer increased if - the line gap is zero. There exist fonts (containing e.g. form - drawing characters) which intentionally have a zero line gap - value. - - - ft_glyph_bbox_xxx flags are now deprecated in favour of - FT_GLYPH_BBOX_XXX. - - - ft_module_xxx flags are now deprecated in favour of - FT_MODULE_XXX. - - - FT_ENCODING_MS_{SJIS,GB2312,BIG5,WANSUNG,JOHAB} are now - deprecated in favour of - FT_ENCODING_{SJIS,GB2312,GIB5,WANSONG,JOHAB} -- those encodings - are not specific to Microsoft. - - - III. MISCELLANEOUS - - - The autohinter has been further improved; for example, `m' - glyphs now retain its vertical symmetry. - - - Partial support of Mac fonts on non-Mac platforms. - - - `make refdoc' (after first `make') builds the HTML - documentation. You need Python for this. - - - The make build system should now work more reliably on DOS-like - platforms. - - - Support for EMX gcc and Watson C/C++ compilers on MS-DOS has - been added. - - - Better VMS build support. - - - Support for the pkg-config package by providing a `freetype.pc' - file. - - - New configure option --with-old-mac-fonts for Darwin. - - - Some source files have been renamed (mainly to fit into the 8.3 - naming scheme). - - -====================================================================== - -CHANGES BETWEEN 2.1.4 and 2.1.3 - - I. IMPORTANT BUG FIXES - - - Updated to newest libtool version, fixing build problems on - various platforms. - - - A fix in the Gzip stream reader: It couldn't read certain .gz - files properly due to a small typo. In certain cases, FreeType - could also loop endlessly when trying to load tiny gzipped - files. - - - The configure script now tries to use the system-wide zlib when - it finds one (instead of the copy found in src/gzip). And - `freetype-config' has been updated to return relevant flags in - this case when invoked with `--libs' (e.g. `-lzlib'). - - - Certain fonts couldn't be loaded by 2.1.3 because they lacked a - Unicode charmap (e.g. SYMBOL.TTF). FreeType erroneously - rejected them. - - - The CFF loader was modified to accept fonts which only contain a - subset of their reference charset. This prevented the correct - use of PDF-embedded fonts. - - - The logic to detect Unicode charmaps has been modified. This is - required to support fonts which include both 16-bit and 32-bit - charmaps (like very recent asian ones) using the new 10 and 12 - SFNT formats. - - - The TrueType loader now limits the depth of composite glyphs. - This is necessary to prevent broken fonts to break the engine by - blowing the stack with recursive glyph definitions. - - - The CMap cache is now capable of managing UCS-4 character codes - that are mapped through extended charmaps in recent - TrueType/OpenType fonts. - - - The cache sub-system now properly manages out-of-memory - conditions instead of blindly reporting them to the caller. - This means that it will try to empty the cache before restarting - its allocations to see if that can help. - - - The PFR driver didn't return the list of available embedded - bitmaps properly. - - - There was a nasty memory leak when using embedded bitmaps in - certain font formats. - - - II. IMPORTANT CHANGES - - - David Chester contributed some enhancements to the auto-hinter - that significantly increase the quality of its output. The - Postscript hinter was also improved in several ways. - - - The FT_RENDER_MODE_LIGHT render mode was implemented. - - - A new API function called `FT_Get_BDF_Property' has been added - to FT_BDF_H to retrieve BDF properties from BDF _and_ PCF font - files. THIS IS STILL EXPERIMENTAL, since it hasn't been - properly tested yet. - - - A Windows FNT specific API has been added, mostly to access font - headers. This is used by Wine. - - - TrueType tables without an `hmtx' table are now tolerated when - an incremental interface is used. This happens for certain - Type42 fonts passed from Ghostscript to FreeType. - - - The PFR font driver is now capable of returning the font family - and style names when they are available (instead of the sole - `FontID'). This is performed by parsing an *undocumented* - portion of the font file! - - - III. MISCELLANEOUS - - - The path stroker in FT_STROKER_H has entered beta stage. It now - works very well, but its interface might change a bit in the - future. More on this in later releases. - - - The documentation for FT_Size_Metrics didn't appear properly in - the API reference. - - - The file docs/VERSION.DLL has been updated to explain versioning - with FreeType (i.e., comparing release/libtool/so numbers, and - how to use them in autoconf scripts). - - - The installation documentation has been seriously revamped. - Everything is now in the `docs' directory. - - -====================================================================== - -CHANGES BETWEEN 2.1.3 and 2.1.2 - - I. IMPORTANT BUG FIXES - - - FT_Vector_Transform had been incorrectly modified in 2.1.2, - resulting in incorrect transformations being applied (for - example, rotations were processed in opposite angles). - - - The format 8 and 12 TrueType charmap enumeration routines have - been fixed (FT_Get_Next_Char returned invalid values). - - - The PFR font driver returned incorrect advance widths if the - outline and metrics resolution defined in the font file were - different. - - - FT_Glyph_To_Bitmap now returns successfully when called with an - FT_BitmapGlyph argument (it previously returned an error). - - - A bug in the Type 1 loader that prevented valid font bounding - boxes to be loaded from multiple master fonts. - - - The SFNT validation code has been rewritten. FreeType can now - load `broken' fonts that were usable on Windows, but not with - previous versions of the library. - - - The computation of bearings in the BDF driver has been fixed. - - - The Postscript hinter crashed when trying to hint certain glyphs - (more precisely, when trying to apply hints to an empty glyph - outline). - - - The TrueType glyph loader now supports composites in `Apple - format' (they differ slightly from Microsoft/OpenType ones in - the way transformation offsets are computed). - - - FreeType was very slow at opening certain asian CID/CFF fonts, - due to fixed increment in dynamic array re-allocations. This - has been changed to exponential behaviour to get acceptable - performance. - - - - II. IMPORTANT CHANGES - - - The PCF driver now supports gzip-compressed font files natively. - This means that you will be able to use all these bitmap fonts - that come with XFree86 with FreeType (and libXft/libXft2, by - extension). - - - The automatic and postscript hinters have both been updated. - This results in a relatively important increase of rendering - quality since many nasty defaults have been suppressed. Please - visit the web page: - - http://www.freetype.org/hinting/smooth-hinting.html - - for additional details on this topic. - - - The `load_flags' parameter of `FT_Load_Glyph' is now an FT_Int32 - (instead of just being an FT_Int). This breaks source and - binary compatibility for 16bit systems only, while retaining - both of them for 32 and 64 bit ones. - - Some new flags have been added consequently: - - FT_LOAD_NO_AUTOHINT :: Disable the use of the auto-hinter - (but not native format hinters). - - FT_LOAD_TARGET_NORMAL :: Hint and render for normal - anti-aliased displays. - - FT_LOAD_TARGET_MONO :: Hint and render for 1-bit displays. - - FT_LOAD_TARGET_LCD :: Hint and render for horizontal RGB or - BGR sub-pixel displays (like LCD - screens). THIS IS STILL - EXPERIMENTAL! - - FT_LOAD_TARGET_LCD_V :: Same as FT_LOAD_TARGET_LCD, for - vertical sub-pixel displays (like - rotated LCD screens). THIS IS STILL - EXPERIMENTAL! - - FT_LOAD_MONOCHROME is still supported, but only affects - rendering, not the hinting. - - Note that the `ftview' demo program available in the `ft2demos' - package has been updated to support LCD-optimized display on - non-paletted displays (under Win32 and X11). - - - The PFR driver now supports embedded bitmaps (all formats - supported), and returns correct kerning metrics for all glyphs. - - - The TrueType charmap loader now supports certain `broken' fonts - that load under Windows without problems. - - - The cache API has been slightly modified (it's still a beta!): - - - The type FTC_ImageDesc has been removed; it is now replaced - by FTC_ImageTypeRec. Note that one of its fields is a - `load_flag' parameter for FT_Load_Glyph. - - - The field `num_grays' of FT_SBitRec has been changed to - `max_grays' in order to fit within a single byte. Its - maximum value is thus 255 (instead of 256 as previously). - - - III. MISCELLANEOUS - - - Added support for the DESTDIR variable during `make install'. - This simplifies packaging of FreeType. - - - Included modified copies of the ZLib sources in `src/gzip' in - order to support gzip-compressed PCF fonts. We do not use the - system-provided zlib for now, though this is a probable - enhancement for future releases. - - - The DocMaker tool used to generate the on-line API reference has - been completely rewritten. It is now located in - `src/tools/docmaker/docmaker.py'. Features: - - - better cross-referenced output - - more polished output - - uses Python regular expressions (though it didn't speed the - program) - - much more modular structure, which allows for different - `backends' in order to generate HTML, XML, or whatever - format. - - One can regenerate the API reference by calling: - - python src/tools/docmaker/docmaker.py \ - --prefix=ft2 \ - --title=FreeType-2.1.3 \ - --output= - include/freetype/*.h \ - include/freetype/config/*.h \ - include/freetype/cache/*.h - - - A new, experimental, support for incremental font loading (i.e., - loading of fonts where the glyphs are not in the font file - itself, but provided by an external component, like a Postscript - interpreter) has been added by Graham Asher. This is still work - in progress, however. - - - A new, EXPERIMENTAL, path stroker has been added. It doesn't - suffer from severe rounding errors and treat bezier arcs - directly. Still work in progress (i.e. not part of the official - API). See the file for some of the - details. - - - The massive re-formatting of sources and internal re-design is - still under-way. Many internal functions, constants, and types - have been renamed. - - -====================================================================== - -CHANGES BETWEEN 2.1.2 and 2.1.1 - - I. IMPORTANT BUG FIXES - - - Many font drivers didn't select a Unicode charmap by default - when a new face was opened (with the FT_CONFIG_OPTION_USE_CMAPS - options enabled), causing many applications to not be able to - display text correctly with the 2.1.x releases. - - - The PFR driver had a bug in its composite loading code that - produces incorrectly placed accents with many fonts. - - - The Type42 driver crashed sometimes due to a nasty bug. - - - The Type 1 custom encoding charmap didn't handle the case where - the first glyph index wasn't 0. - - - A serious typo in the TrueType composite loader produced - incorrectly placed glyphs in fonts like `Wingdings' and a few - others. - - - II. MISCELLANEOUS - - - The Win32 Visual C++ project file has been updated to include - the PFR driver as well. - - - `freetype.m4' is now installed by default by `make install' on - Unix systems. - - - The function FT_Get_PS_Font_Info now works with CID and Type42 - fonts as well. - - -====================================================================== - -CHANGES BETWEEN 2.1.1 and 2.1.0 - - I. IMPORTANT BUG FIXES - - - The `version_info' returned by `freetype-config' in 2.1.0 - returned an invalid value. It now returns 9:1:3 (2.0.9 returned - 9:0:3). - - - Version 2.1.0 couldn't be linked against applications on Win32 - and Amiga systems due to a new debug function that wasn't - properly propagated to the system-specific directory in - `builds'. - - - Various MacOS and Mac OS X specific fixes. - - - Fixed a bug in the TrueType charmap validation routines that - made version 2.1.0 too restrictive -- many popular fonts have - been rejected. - - - There was still a very small difference between the monochrome - glyph bitmaps produced by FreeType 1.x and FreeType 2.x with the - bytecode interpreter enabled. This was caused by an invalid - flag setting in the TrueType glyph loader, making the rasterizer - change its drop-out control mode. Now the results should - _really_ be completely identical. - - - The TrueType name table loader has been improved to support many - popular though buggy Asian fonts. It now ignores empty name - entries, invalid pointer offsets and a few other incorrect - subtleties. Moreover, name strings are now loaded on demand, - which reduces the memory load of many faces (e.g. the ARIAL.TTF - font file contains a 10kByte name table with 70 names). - - - Fixed a bug in the Postscript hinter that prevented family blues - substitution to happen correctly. - - - II. NEW FEATURES - - - Three new font drivers in this release: - - * A BDF font driver, contributed by Franco Zappa Nardelli, - heavily modified by Werner Lemberg. It also supports - anti-aliased bitmaps (using a slightly extended BDF format). - - * A Type42 font driver, contributed by Roberto Alameda. It is - still experimental but seems to work relatively well. - - * A PFR font driver, contributed by David Turner himself. It - doesn't support PFR hinting -- note that BitStream has at - least two patents on this format! - - - III. MISCELLANEOUS - - - The cache sub-system has been optimized in important ways. - Cache hits are now significantly faster. For example, using the - CMap cache is about twice faster than calling FT_Get_Char_Index - on most platforms. Similarly, using an SBit cache is about five - times faster than loading the bitmaps from a bitmap file, and - 300 to 500 times faster than generating them from a scalable - format. - - Note that you should recompile your sources if you designed a - custom cache class for the FT2 Cache subsystem, since the - changes performed are source, but not binary, compatible. - - -====================================================================== - -CHANGES BETWEEN 2.1.0 and 2.0.9 - - I. IMPORTANT BUG FIXES - - - The TrueType bytecode interpreter has been fixed to produce - _exactly_ the same output as FreeType 1.x. Previous differences - were due to slightly distinct fixed-point computation routines - used to perform dot products and vector length measurements. - - It seems that native TrueType hinting is _extremely_ sensitive - to rounding errors. The required vector computation routines - have been optimized and placed within the `ttinterp.c' file. - - - Fixed the parsing of accelerator tables in the PCF font driver. - - - Fixed the Type1 glyph loader routine used to compute the font's - maximum advance width. - - - II. NEW FEATURES - - - The `configure' script used on Unix systems has been modified to - check that GNU Make is being used to build the library. - Otherwise, it will display a message proposing to use the - GNUMAKE environment variable to name it. - - The Unix-specific file README.UNX has been modified accordingly. - - - III. MISCELLANEOUS - - - The FreeType License in `docs/FTL.TXT' has been updated to - include a proposed preferred disclaimer. If you are using - FreeType in your products, you are encouraged (but not mandated) - to use the following text in your documentation: - - """ - Portions of this software are copyright © 1996-2002 The - FreeType Project (www.freetype.org). All rights reserved. - """ - - - The default size of the render pool has been reduced to 16kByte. - This shouldn't result in any noticeable performance penalty, - unless you are using the engine as-is to render very large and - complex glyphs. - - - The FreeType 2 redesign has begun. More information can be - found at this URL: - - http://www.freetype.org/freetype2/redesign.html - - The following internal changes have been performed within the - sources of this release: - - - Many internal types have been renamed to increase - consistency. The following should be true, except for - public types: - - * All structure types have a name ending in `Rec' (short - for `record'). - - * A pointer-to-structure type has the same name as the - structure, _without_ the `Rec' suffix. - - Example: - - typedef struct FooRec_ - { - ... - - } FooRec, *Foo; - - - Many internal macros have been renamed to increase - consistency. The following should be true: - - * All macros have a name beginning with `FT_'. This - required a few changes like - - ALLOC => FT_ALLOC - FREE => FT_FREE - REALLOC => FT_REALLOC - - * All macros are completely UPPERCASE. This required a - few changes like: - - READ_Short => FT_READ_SHORT - NEXT_Short => FT_NEXT_SHORT - GET_ULongLE => FT_GET_ULONG_LE - MEM_Set => FT_MEM_SET - MEM_Copy => FT_MEM_COPY - etc. - - * Whenever possible, all macro names follow the - FT__ pattern. For example - - ACCESS_Frame => FT_FRAME_ENTER - FORGET_Frame => FT_FRAME_EXIT - EXTRACT_Frame => FT_FRAME_EXTRACT - RELEASE_Frame => FT_FRAME_RELEASE - - FILE_Pos => FT_STREAM_POS - FILE_Seek => FT_STREAM_SEEK - FILE_Read => FT_STREAM_READ - FILE_ReadAt => FT_STREAM_READ_AT - READ_Fields => FT_STREAM_READ_FIELDS - - - Many internal functions have been renamed to follow the - FT__ pattern. For example: - - FT_Seek_Stream => FT_Stream_Seek - FT_Read_Stream_At => FT_Stream_ReadAt - FT_Done_Stream => FT_Stream_Close - FT_New_Stream => FT_Stream_Open - FT_New_Memory_Stream => FT_Stream_OpenMemory - FT_Extract_Frame => FT_Stream_ExtractFrame - - Note that method names do not contain `_'. - - - The FT_ALLOC_ARRAY and FT_REALLOC_ARRAY have been replaced - with FT_NEW_ARRAY and FT_RENEW_ARRAY which do not take a - type as the fourth argument. Instead, the array element - type size is computed automatically from the type of the - target pointer used. - - - A new object class, FT_CMap, has been introduced. These - internal objects are used to model character maps. This - eases the support of additional charmap types within the - engine. - - - A new configuration file named `ftstdlib.h' has been added - to `include/freetype/config'. It is used to define aliases - for _every_ routine of the ISO C library that the font - engine uses. Each aliases has a `ft_' prefix - (e.g. `ft_strlen' is an alias for `strlen'). - - This is used to ease the porting of FreeType 2 to exotic - runtime environments where the ISO C Library isn't available - (e.g. XFree86 extension modules). - - More details are available in the `ChangeLog' file. - - -====================================================================== - -CHANGES BETWEEN 2.0.9 and 2.0.8 - - I. IMPORTANT BUG FIXES - - - Certain fonts like `foxjump.ttf' contain broken name tables with - invalid entries and wild offsets. This caused FreeType to crash - when trying to load them. - - The SFNT `name' table loader has been fixed to be able to - support these strange fonts. - - Moreover, the code in charge of processing this table has been - changed to always favour Windows-formatted entries over other - ones. Hence, a font that works on Windows but not on the Mac - will load cleanly in FreeType and report accurate values for - Family & PostScript names. - - - The CID font driver has been fixed. It unfortunately returned a - Postscript Font name with a leading slash, as in - `/MunhwaGothic-Regular'. - - - FreeType 2 should now compile fine on AIX 4.3.3 as a shared - library. - - - A bug in the Postscript hinter has been found and fixed, - removing un-even stem widths at small pixel sizes (like 14-17). - - This improves the quality of a certain number of Postscript - fonts. - - - II. NEW FEATURES - - - A new function named `FT_Library_Version' has been added to - return the current library's major, minor, and patch version - numbers. This is important since the macros FREETYPE_MAJOR, - FREETYPE_MINOR, and FREETYPE_PATCH cannot be used when the - library is dynamically linked by a program. - - - Two new APIs have been added: `FT_Get_First_Char' and - `FT_Get_Next_Char'. - - Together, these can be used to iterate efficiently over the - currently selected charmap of a given face. Read the API - reference for more details. - - - III. MISCELLANEOUS - - - The FreeType sources are under heavy internal re-factoring. As - a consequence, we have created a branch named `STABLE' on the - CVS to hold all future releases/fixes in the 2.0.x family. - - The HEAD branch now contains the re-factored sources and - shouldn't be used for testing or packaging new releases. In - case you would like to access the 2.0.9 sources from our CVS - repository, use the tag `VER-2-0-9'. - - -====================================================================== - -CHANGES BETWEEN 2.0.8 and 2.0.7 - - I. IMPORTANT BUG FIXES - - - There was a small but nasty bug in `freetype-config.in' which - caused the `freetype-config' script to fail on Unix. - - This didn't prevent the installation of the library or even its - execution, but caused problems when trying to compile many Unix - packages that depend on it. - - - Some TrueType or OpenType fonts embedded in PDF documents do not - have a 'cmap', 'post' and 'name' as is required by the - specification. FreeType no longer refuses to load such fonts. - - - Various fixes to the PCF font driver. - - -====================================================================== - -CHANGES BETWEEN 2.0.7 and 2.0.6 - - I. IMPORTANT BUG FIXES - - - Fixed two bugs in the Type 1 font driver. The first one - resulted in a memory leak in subtle cases. The other one caused - FreeType to crash when trying to load `.gsf' files (Ghostscript - so-called Postscript fonts). - - (This made _many_ KDE applications crash on certain systems. - FreeType _is_ becoming a critical system component on Linux :-) - - - Fixed a memory leak in the CFF font driver. - - - Fixed a memory leak in the PCF font driver. - - - Fixed the Visual C++ project file - `builds/win32/visualc/freetype.dsp' since it didn't include the - Postscript hinter component, causing errors at build time. - - - Fixed a small rendering bug in the anti-aliased renderer that - only occurred when trying to draw thin (less than 1 pixel) - strokes. - - - Fixed `builds/unix/freetype2.a4' which is used to generate a - valid `freetype2.m4' for use with autoconf. - - - Fixed the OpenVMS Makefiles. - - - II. MISCELLANEOUS - - - Added `configure' and `install' scripts to the top-level - directory. A GNU-style installation is thus now easily possible - with - - ./configure - make - make install - - -====================================================================== - -CHANGES BETWEEN 2.0.6 and 2.0.5 - - I. IMPORTANT BUG FIXES - - - It wasn't possible to load embedded bitmaps when the auto-hinter - was used. This is now fixed. - - - The TrueType font driver didn't load some composites properly - (the sub-glyphs were slightly shifted, and this was only - noticeable when using monochrome rendering). - - - Various fixes to the auto-hinter. They merely improve the - output of sans-serif fonts. Note that there are still problems - with serifed fonts and composites (accented characters). - - - All scalable font drivers erroneously returned un-fitted glyph - advances when hinting was requested. This created problems for - a number of layout applications. This is a very old bug that - got undetected mainly because most test/demo program perform - rounding explicitly or implicitly (through the cache). - - - `FT_Glyph_To_Bitmap' did erroneously modify the source glyph in - certain cases. - - - `glnames.py' still contained a bug that made FreeType return - invalid names for certain glyphs. - - - The library crashed when loading certain Type 1 fonts like - `sadn.pfb' (`Stalingrad Normal'), which appear to contain - pathetic font info dictionaries. - - - The TrueType glyph loader is now much more paranoid and checks - everything when loading a given glyph image. This was necessary - to avoid problems (crashes and/or memory overwrites) with broken - fonts that came from a really buggy automatic font converter. - - - II. IMPORTANT UPDATES AND NEW FEATURES - - - Important updates to the Mac-specific parts of the library. - - - The caching sub-system has been completely re-designed, and its - API has evolved (the old one is still supported for backward - compatibility). - - The documentation for it is not yet completed, sorry. For now, - you are encouraged to continue using the old API. However, the - ftview demo program in the ft2demos package has already been - updated to use the new caching functions. - - - A new charmap cache is provided too. See `FTC_CMapCache'. This - is useful to perform character code -> glyph index translations - quickly, without the need for an opened FT_Face. - - - A NEW POSTSCRIPT HINTER module has been added to support native - hints in the following formats: PostScript Type 1, PostScript - CID, and CFF/CEF. - - Please test! Note that the auto-hinter produces better results - for a number of badly-hinted fonts (mostly auto-generated ones) - though. - - - A memory debugger is now part of the standard FreeType sources. - To enable it, define FT_DEBUG_MEMORY in - , and recompile the library. - - Additionally, define the _environment_ variable FT_DEBUG_MEMORY - and run any program using FreeType. When the library is exited, - a summary of memory footprints and possible leaks will be - displayed. - - This works transparently with _any_ program that uses FreeType. - However, you will need a lot of memory to use this (allocated - blocks are never released to the heap to detect double deletes - easily). - - - III. MISCELLANEOUS - - - We are aware of subtle differences between the output of - FreeType versions 1 and 2 when it comes to monochrome - TrueType-hinted glyphs. These are most probably due to small - differences in the monochrome rasterizers and will be worked out - in an upcoming release. - - - We have decided to fork the sources in a `stable' branch, and an - `unstable' one, since FreeType is becoming a critical component - of many Unix systems. - - The next bug-fix releases of the library will be named 2.0.7, - 2.0.8, etc., while the `2.1' branch will contain a version of - the sources where we will start major reworking of the library's - internals, in order to produce FreeType 2.2.0 (or even 3.0) in a - more distant future. - - We also hope that this scheme will allow much more frequent - releases than in the past. - - -====================================================================== - -CHANGES BETWEEN 2.0.5 and 2.0.4 - - NOTE THAT 2.0.5 DOES NOT CONTAIN THE POSTSCRIPT HINTER. THIS MODULE - WILL BE PART OF THE NEXT RELEASE (EITHER 2.0.6 or 2.1) - - - Fixed a bug that made certain glyphs, like `Cacute', `cacute' and - `lslash' unavailable from Unicode charmaps of Postscript fonts. - This prevented the correct display of Polish text, for example. - - - The kerning table of Type 1 fonts was loaded by FreeType, when its - AFM file was attached to its face, but the - FT_FACE_FLAG_HAS_KERNING bit flags was not set correctly, - preventing FT_Get_Kerning to return meaningful values. - - - Improved SFNT (TrueType & OpenType) charmap support. Slightly - better performance, as well as support for the new formats defined - by the OpenType 1.3 specification (8, 10, and 12) - - - Fixed a serious typo in `src/base/ftcalc.c' which caused invalid - computations in certain rare cases, producing ugly artefacts. - - - The size of the EM square is computed with a more accurate - algorithm for Postscript fonts. The old one caused slight errors - with embedded fonts found in PDF documents. - - - Fixed a bug in the cache manager that prevented normal LRU - behaviour within the cache manager, causing unnecessary reloads - (for FT_Face and FT_Size objects only). - - - Added a new function named `FT_Get_Name_Index' to retrieve the - glyph index of a given glyph name, when found in a face. - - - Added a new function named `FT_Get_Postscript_Name' to retrieve - the `unique' Postscript font name of a given face. - - - Added a new public header size named FT_SIZES_H (or - ) providing new FT_Size-management functions: - FT_New_Size, FT_Activate_Size, FT_Done_Size. - - - Fixed a reallocation bug that generated a dangling pointer (and - possibly memory leaks) with Postscript fonts (in - src/psaux/psobjs.c). - - - Many fixes for 16-bit correctness. - - - Removed many pedantic compiler warnings from the sources. - - - Added an Amiga build directory in `builds/amiga'. - - -====================================================================== - -CHANGES BETWEEN 2.0.4 and 2.0.3 - - - Fixed a rather annoying bug that was introduced in 2.0.3. Namely, - the font transformation set through FT_Set_Transform was applied - twice to auto-hinted glyphs, resulting in incorrectly rotated text - output. - - - Fixed _many_ compiler warnings. FT2 should now compile cleanly - with Visual C++'s most pedantic warning level (/W4). It already - compiled fine with GCC and a few other compilers. - - - Fixed a bug that prevented the linear advance width of composite - TrueType glyphs to be correctly returned. - - - Fixed the Visual C++ project files located in - `builds/win32/visualc' (previous versions used older names of the - library). - - - Many 32-bit constants have an `L' appended to their value, in - order to improve the 16-bitness of the code. Someone is actually - trying to use FT2 on an Atari ST machine! - - - Updated the `builds/detect.mk' file in order to automatically - build FT2 on AIX systems. AIX uses `/usr/sbin/init' instead of - `/sbin/init' and wasn't previously detected as a Unix platform by - the FreeType build system. - - - Updated the Unix-specific portions of the build system (new - libtool version, etc.). - - - The SFNT kerning loader now ensures that the table is sorted - (since some problem fonts do not meet this requirement). - - -======================================================================= - -CHANGES BETWEEN 2.0.3 and 2.0.2 - - I. CHANGES TO THE MODULES / FONT DRIVERS - - - THE AUTO-HINTER HAS BEEN SLIGHTLY IMPROVED, in order to fix - several annoying artefacts, mainly: - - - Blue zone alignment of horizontal stems wasn't performed - correctly, resulting in artefacts like the `d' being placed - one pixel below the `b' in some fonts like Time New Roman. - - - Overshoot thresholding wasn't performed correctly, creating - unpleasant artefacts at large character pixel sizes. - - - Composite glyph loading has been simplified. This gets rid - of various artefacts where the components of a composite - glyphs were not correctly spaced. - - These are the last changes to the current auto-hinting module. - A new hinting sub-system is currently in the work in order to - support native hints in Type 1 / CFF / OpenType fonts, as well - as globally improve rendering. - - - The PCF driver has been fixed. It reported invalid glyph - dimensions for the fonts available on Solaris. - - - The Type 1, CID and CFF drivers have been modified to fix the - computation of the EM size. - - - The Type 1 driver has been fixed to avoid a dangerous bug that - crashed the library with non-conforming fonts (i.e. ones that do - not place the .notdef glyph at position 0). - - - The TrueType driver had a rather subtle bug (dangling pointer - when loading composite glyphs) that could crash the library in - rare occasions! - - - II. HIGH-LEVEL API CHANGES - - - The error code enumeration values have been changed. An error - value is decomposed in a generic error code, and a module - number. see for details. - - - A new public header file has been introduced, named - FT_TRIGONOMETRY_H (include/freetype/fttrigon.h), providing - trigonometric functions to compute sines, cosines, arctangents, - etc. with 16.16 fixed precision. The implementation is based on - the CORDIC algorithm and is very fast while being sufficiently - accurate. - - - III. INTERNALS - - - Added BeOS-specific files in the old build sub-system. Note - that no changes were required to compile the library with Jam. - - - The configuration is now capable of automatically detecting - 64-bit integers on a set of predefined compilers (GCC, Visual - C++, Borland C++) and will use them by default. This provides a - small performance boost. - - - A small memory leak that happened when opening 0-sized files - (duh!) have been fixed. - - - Fixed bezier stack depth bug in the routines provided by the - FT_BBOX_H header file. Also fixed similar bugs in the - rasterizers. - - - The outline bounding box code has been rewritten to use direct - computations, instead of bezier sub-division, to compute the - exact bounding box of glyphs. This is slightly slower but more - accurate. - - - The build system has been improved and fixed, mainly to support - `make' on Windows 2000 correctly, avoid problems with `make - distclean' on non Unix systems, etc. - - - Hexadecimal constants have been suffixed with `U' to avoid - problems with certain compilers on 64-bit platforms. - - - A new directory named `src/tools' has been created. It contains - Python scripts and simple unit test programs used to develop the - library. - - - The DocMaker tool has been moved from `docs' to `src/tools' and - has been updated with the following: - - - Now accepts the `--title=XXXX' or `-t XXXX' option from the - command line to set the project's name in the generated API - reference. - - - Now accepts the `--output=DIR' or `-o DIR' option from the - command line to set the output directory for all generated - HTML files. - - - Now accepts the `--prefix=XXXX' or `-p XXX' option from the - command line to set the file prefix to use for all - generated HTML files. - - - Now generates the current time/data on each generated page - in order to distinguish between versions. - - DocMaker can be used with other projects now, not only FT2 - (e.g. MLib, FTLayout, etc.). - - -====================================================================== - -CHANGES BETWEEN 2.0.2 and 2.0.1 - - I. CHANGES TO THE MODULES / FONT DRIVERS - - - THE TRUETYPE BYTECODE INTERPRETER IS NOW TURNED OFF, in order to - avoid legal problems with the Apple patents. It seems that we - mistakenly turned this option on in previous releases of the - build. - - Note that if you want to use the bytecode interpreter in order - to get high-quality TrueType rendering, you will need to toggle - by hand the definition of the - TT_CONFIG_OPTION_BYTECODE_INTERPRETER macro in the file - `include/freetype/config/ftoption.h'. - - - The CFF driver has been improved by Tom Kacvinsky and Sander van - der Wal: - - * Support for `seac' emulation. - * Support for `dotsection'. - * Support for retrieving glyph names through - `FT_Get_Glyph_Name'. - - The first two items are necessary to correctly a large number of - Type 1 fonts converted to the CFF formats by Adobe Acrobat. - - - The Type 1 driver was also improved by Tom & others: - - * Better EM size computation. - * Better support for synthetic (transformed) fonts. - * The Type 1 driver returns the charstrings corresponding to - each glyph in the `glyph->control_data' field after a call to - `FT_Load_Glyph' (thanks Ha Shao). - - - Various other bugfixes, including the following: - - * Fixed a nasty memory leak in the Type 1 driver. - * The autohinter and the pcf driver used static writable data - when they shouldn't. - * Many casts were added to make the code more 64-bits safe. It - also now compiles on Windows XP 64-bits without warnings. - * Some incorrect writable statics were removed in the `autohint' - and `pcf' drivers. FreeType 2 now compiles on Epoc again. - - - II. CHANGES TO THE HIGH-LEVEL API - - - The library header files inclusion scheme has been changed. The - old scheme looked like: - - #include - #include - #include - #include - - Now you should use: - - #include - #include FT_FREETYPE_H - #include FT_GLYPH_H - #include FT_CACHE_H - #include FT_CACHE_IMAGE_H - - NOTE THAT THE OLD INCLUSION SCHEME WILL STILL WORK WITH THIS - RELEASE. HOWEVER, WE DO NOT GUARANTEE THAT THIS WILL STILL BE - TRUE IN THE NEXT ONE (A.K.A. FREETYPE 2.1). - - The file is used to define the header filename - macros. The complete and commented list of macros is available - in the API reference under the section name `Header File Macros' - in Chapter I. - - For more information, see section I of the following document: - - http://www.freetype.org/ - freetype2/docs/tutorial/step1.html - - or - - http://freetype.sourceforge.net/ - freetype2/docs/tutorial/step1.html - - - Many, many comments have been added to the public source file in - order to automatically generate the API Reference through the - `docmaker.py' Python script. - - The latter has been updated to support the grouping of sections - in chapters and better index sort. See: - - http://www.freetype.org/freetype2/docs/reference/ft2-toc.html - - - III. CHANGES TO THE BUILD PROCESS - - - If you are not building FreeType 2 with its own build system - (but with your own Makefiles or project files), you will need to - be aware that the build process has changed a little bit. - - You don't need to put the `src' directory in the include path - when compiling any FT2 component. Instead, simply put the - component's directory in the current include path. - - So, if you were doing something like: - - cc -c -Iinclude -Isrc src/base/ftbase.c - - change the line to: - - cc -c -Iinclude -Isrc/base src/base/ftbase.c - - If you were doing something like: - - cd src/base - cc -c -I../../include -I.. ftbase.c - - change it to: - - cd src/base - cc -c -I../../include ftbase.c - - -====================================================================== - -CHANGES BETWEEN 2.0.1 and 2.0 - - 2.0.1 introduces a few changes: - - - Fixed many bugs related to the support of CFF / OpenType fonts. - These formats are now much better supported though there is - still work planned to deal with charset tables and PDF-embedded - CFF files that use the old `seac' command. - - - The library could not be compiled in debug mode with a very - small number of C compilers whose pre-processors didn't - implement the `##' directive correctly (i.e. per se the ANSI C - specification!) An elegant fix was found. - - - Added support for the free Borland command-line C++ Builder - compiler. Use `make setup bcc32'. Also fixed a few source - lines that generated new warnings with BCC32. - - - Fixed a bug in FT_Outline_Get_BBox when computing the extrema of - a conic Bezier arc. - - - Updated the INSTALL file to add IDE compilation. - - - Other minor bug fixes, from invalid Type 1 style flags to - correct support of synthetic (obliqued) fonts in the - auto-hinter, better support for embedded bitmaps in a SFNT font. - - - Fixed some problems with `freetype-config'. - - Finally, the `standard' scheme for including FreeType headers is now - gradually changing, but this will be explained in a later release - (probably 2.0.2). - - And very special thanks to Tom Kacvinsky and YAMANO-UCHI Hidetoshi - for their contributions! - - -====================================================================== - -CHANGES BETWEEN beta8 and 2.0 - - - Changed the default installation path for public headers from - `include/freetype' to `include/freetype2'. - - Also added a new `freetype-config' that is automatically generated - and installed on Unix and Cygwin systems. The script itself is - used to retrieve the current install path, C compilation flags as - well as linker flags. - - - Fixed several small bugs: - - * Incorrect max advance width for fixed-pitch Type 1 fonts. - * Incorrect glyph names for certain TrueType fonts. - * The glyph advance was not copied when FT_Glyph_To_Bitmap was - called. - * The linearHoriAdvance and linearVertAdvance fields were not - correctly returned for glyphs processed by the auto-hinter. - * `type1z' renamed back to `type1'; the old `type1' module has - been removed. - - - Revamped the build system to make it a lot more generic. This - will allow us to re-use nearly un-modified in lots of other - projects (including FreeType Layout). - - - Changed `cid' to use `psaux' too. - - - Added the cache sub-system. See as well as - the sources in `src/cache'. Note that it compiles but is still - untested for now. - - - Updated `docs/docmaker.py', a draft API reference is available at - http://www.freetype.org/ft2api.html. - - - Changed `type1' to use `psaux'. - - - Created a new module named `psaux' to hold the Type 1 & Type 2 - parsing routines. It should be used by `type1', `cid', and `cff' - in the future. - - - Fixed an important bug in `FT_Glyph_Get_CBox'. - - - Fixed some compiler warnings that happened since the TrueType - bytecode decoder was deactivated by default. - - - Fixed two memory leaks: - - * The memory manager (16 bytes) isn't released in - FT_Done_FreeType! - * Using custom input streams, the copy of the original stream was - never released. - - - Fixed the auto-hinter by performing automatic computation of the - `filling direction' of each glyph. This is done through a simple - and fast approximation, and seems to work (problems spotted by - Werner though). The Arphic fonts are a lot nicer though there are - still a lot of things to do to handle Asian fonts correctly. - - -====================================================================== - -BETA-8 (RELEASE CANDIDATE) CHANGES - - - Deactivated the TrueType bytecode interpreter by default. - - - Deactivated the `src/type1' font driver. Now `src/type1z' is used - by default. - - - Updates to the build system. We now compile the library correctly - under Unix system through `configure' which is automatically - called on the first `make' invocation. - - - Added the auto-hinting module! Fixing some bugs here and there. - - - Found some bugs in the composite loader (seac) of the Type1-based - font drivers. - - - Renamed the directory `freetype2/config' to `freetype2/builds' and - updated all relevant files. - - - Found a memory leak in the `type1' driver. - - - Incorporated Tom's patches to support flex operators correctly in - OpenType/CFF fonts. Now all I need is to support pure CFF and CEF - fonts to be done with this driver :-) - - - Added the Windows FNT/FON driver in `src/winfonts'. For now, it - always `simulates' a Unicode charmap, so it shouldn't be - considered completed right now. - - It is there to be more a proof of concept than anything else - anyway. The driver is a single C source file, that compiles to 3 - Kb of code. - - I'm still working on the PCF/BDF drivers, but I'm too lazy to - finish them now. - - - CHANGES TO THE HIGH-LEVEL API - - * FT_Get_Kerning has a new parameter that allows you to select the - coordinates of the kerning vector (font units, scaled, scaled + - grid-fitted). - * The outline functions are now in and not - part of anymore. - * now contains declarations for - FT_New_Library, FT_Done_Library, FT_Add_Default_Modules. - * The so-called convenience functions have moved from `ftoutln.c' - to `ftglyph.c', and are thus available with this optional - component of the library. They are declared in - now. - * Anti-aliased rendering is now the default for FT_Render_Glyph - (i.e. corresponds to render_mode == 0 == ft_render_mode_normal). - To generate a monochrome bitmap, use ft_render_mode_mono, or the - FT_LOAD_MONOCHROME flag in FT_Load_Glyph/FT_Load_Char. - FT_LOAD_ANTI_ALIAS is still defined, but values to 0. - * now include , - solving a few headaches :-) - * The type FT_GlyphSlotRec has now a `library' field. - - - CHANGES TO THE `ftglyph.h' API - - This API has been severely modified in order to make it simpler, - clearer, and more efficient. It certainly now looks like a real - `glyph factory' object, and allows client applications to manage - (i.e. transform, bbox and render) glyph images without ever - knowing their original format. - - - Added support for CID-keyed fonts to the CFF driver. Maybe - support for pure CFF + CEF fonts should come in? - - - Cleaned up source code in order to avoid two functions with the - same name. Also changed the names of the files in `type1z' from - `t1XXXX' to `z1XXXX' in order to avoid any conflicts. - - `make multi' now works well :-) - - Also removed the use of `cidafm' for now, even if the source files - are still there. This functionality will certainly go into a - specific module. - - - ADDED SUPPORT FOR THE AUTO-HINTER - - It works :-) I have a demo program which simply is a copy of - `ftview' that does a `FT_Add_Module(library, - &autohinter_module_class)' after library initialization, and Type - 1 & OpenType/CFF fonts are now hinted. - - CID fonts are not hinted, as they include no charmap and the - auto-hinter doesn't include `generic' global metrics computations - yet. - - Now, I need to release this thing to the FreeType 2 source. - - - CHANGES TO THE RENDERER MODULES - - The monochrome and smooth renderers are now in two distinct - directories, namely `src/raster1' and `src/smooth'. Note that the - old `src/renderer' is now gone. - - I ditched the 5-gray-levels renderers. Basically, it involved a - simple #define toggle in 'src/raster1/ftraster.c'. - - FT_Render_Glyph, FT_Outline_Render & FT_Outline_Get_Bitmap now - select the best renderer available, depending on render mode. If - the current renderer for a given glyph image format isn't capable - of supporting the render mode, another one will be found in the - library's list. This means that client applications do not need - to switch or set the renderers themselves (as in the latest - change), they'll get what they want automatically. At last. - - Changed the demo programs accordingly. - - - MAJOR INTERNAL REDESIGN: - - A lot of internal modifications have been performed lately on the - source in order to provide the following enhancements: - - * More generic module support: - - The FT_Module type is now defined to represent a handle to a - given module. The file contains the - FT_Module_Class definition, as well as the module-loading public - API. - - The FT_Driver type is still defined, and still represents a - pointer to a font driver. Note that FT_Add_Driver is replaced - by FT_Add_Module, FT_Get_Driver by FT_Get_Module, etc. - - * Support for generic glyph image types: - - The FT_Renderer type is a pointer to a module used to perform - various operations on glyph image. - - Each renderer is capable of handling images in a single format - (e.g. ft_glyph_format_outline). Its functions are used to: - - - transform an glyph image - - render a glyph image into a bitmap - - return the control box (dimensions) of a given glyph image - - The scan converters `ftraster.c' and `ftgrays.c' have been moved - to the new directory `src/renderer', and are used to provide two - default renderer modules. - - One corresponds to the `standard' scan-converter, the other to - the `smooth' one. - - he current renderer can be set through the new function - FT_Set_Renderer. - - The old raster-related function FT_Set_Raster, FT_Get_Raster and - FT_Set_Raster_Mode have now disappeared, in favor of the new: - - FT_Get_Renderer - FT_Set_Renderer - - See the file for more details. - - These changes were necessary to properly support different - scalable formats in the future, like bi-color glyphs, etc. - - * Glyph loader object: - - A new internal object, called a 'glyph loader' has been - introduced in the base layer. It is used by all scalable format - font drivers to load glyphs and composites. - - This object has been created to reduce the code size of each - driver, as each one of them basically re-implemented its - functionality. - - See and the FT_GlyphLoader type for - more information. - - * FT_GlyphSlot has new fields: - - In order to support extended features (see below), the - FT_GlyphSlot structure has a few new fields: - - linearHoriAdvance: - - This field gives the linearly scaled (i.e. scaled but - unhinted) advance width for the glyph, expressed as a 16.16 - fixed pixel value. This is useful to perform WYSIWYG text. - - linearVertAdvance: - This field gives the linearly scaled advance height for the - glyph (relevant in vertical glyph layouts only). This is - useful to perform WYSIWYG text. - - Note that the two above field replace the removed `metrics2' - field in the glyph slot. - - advance: - This field is a vector that gives the transformed advance for - the glyph. By default, it corresponds to the advance width, - unless FT_LOAD_VERTICAL_LAYOUT was specified when calling - FT_Load_Glyph or FT_Load_Char. - - bitmap_left: - This field gives the distance in integer pixels from the - current pen position to the left-most pixel of a glyph image - IF IT IS A BITMAP. It is only valid when the `format' field - is set to `ft_glyph_format_bitmap', for example, after calling - the new function FT_Render_Glyph. - - bitmap_top: - This field gives the distance in integer pixels from the - current pen position (located on the baseline) to the top-most - pixel of the glyph image IF IT IS A BITMAP. Positive values - correspond to upwards Y. - - loader: - This is a new private field for the glyph slot. Client - applications should not touch it. - - - * Support for transforms and direct rendering in FT_Load_Glyph: - - Most of the functionality found in has been - moved to the core library. Hence, the following: - - - A transform can be specified for a face through - FT_Set_Transform. this transform is applied by FT_Load_Glyph - to scalable glyph images (i.e. NOT TO BITMAPS) before the - function returns, unless the bit flag FT_LOAD_IGNORE_TRANSFORM - was set in the load flags. - - - Once a glyph image has been loaded, it can be directly - converted to a bitmap by using the new FT_Render_Glyph - function. Note that this function takes the glyph image from - the glyph slot, and converts it to a bitmap whose properties - are returned in `face.glyph.bitmap', `face.glyph.bitmap_left' - and `face.glyph.bitmap_top'. The original native image might - be lost after the conversion. - - - When using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph - and FT_Load_Char functions will call FT_Render_Glyph - automatically when needed. - - - Reformatted all modules source code in order to get rid of the - basic data types redifinitions (i.e. `TT_Int' instead of `FT_Int', - `T1_Fixed' instead of `FT_Fixed'). Hence the format-specific - prefixes like `TT_', `T1_', `T2_' and `CID_' are only used for - relevant structures. - - -====================================================================== - -OLD CHANGES FOR BETA 7 - - - bug-fixed the OpenType/CFF parser. It now loads and displays my - two fonts nicely, but I'm pretty certain that more testing is - needed :-) - - - fixed the crummy Type 1 hinter, it now handles accented characters - correctly (well, the accent is not always well placed, but that's - another problem..) - - - added the CID-keyed Type 1 driver in `src/cid'. Works pretty well - for only 13 Kb of code ;-) Doesn't read AFM files though, nor the - really useful CMAP files.. - - - fixed two bugs in the smooth renderer (src/base/ftgrays.c). - Thanks to Boris Letocha for spotting them and providing a fix. - - - fixed potential `divide by zero' bugs in ftcalc.c. - - - added source code for the OpenType/CFF driver (still incomplete - though..) - - - modified the SFNT driver slightly to perform more robust header - checks in TT_Load_SFNT_Header. This prevents certain font files - (e.g. some Type 1 Multiple Masters) from being incorrectly - `recognized' as TrueType font files.. - - - moved a lot of stuff from the TrueType driver to the SFNT module, - this allows greater code re-use between font drivers - (e.g. TrueType, OpenType, Compact-TrueType, etc..) - - - added a tiny segment cache to the SFNT Charmap 4 decoder, in order - to minimally speed it up.. - - - added support for Multiple Master fonts in `type1z'. There is - also a new file named which defines functions to - manage them from client applications. - - The new file `src/base/ftmm.c' is also optional to the engine.. - - - various formatting changes (e.g. EXPORT_DEF -> FT_EXPORT_DEF) + - small bug fixes in FT_Load_Glyph, the `type1' driver, etc.. - - - a minor fix to the Type 1 driver to let them apply the font matrix - correctly (used for many oblique fonts..) - - - some fixes for 64-bit systems (mainly changing some FT_TRACE calls - to use %p instead of %lx). Thanks to Karl Robillard. - - - fixed some bugs in the sbit loader (src/base/sfnt/ttsbit.c) + - added a new flag, FT_LOAD_CROP_BITMAP to query that bitmaps be - cropped when loaded from a file (maybe I should move the bitmap - cropper to the base layer ??). - - - changed the default number of gray levels of the smooth renderer - to 256 (instead of the previous 128). Of course, the human eye - can't see any difference ;-) - - - removed TT_MAX_SUBGLYPHS, there is no static limit on the number - of subglyphs in a TrueType font now.. - - -====================================================================== - -OLD CHANGES 16 May 2000 - - - tagged `BETA-6' in the CVS tree. This one is a serious release - candidate even though it doesn't incorporate the auto-hinter yet.. - - - various obsolete files were removed, and copyright header updated - - - finally updated the standard raster to fix the monochrome - rendering bug + re-enable support for 5-gray levels anti-aliasing - (suck, suck..) - - - created new header files, and modified sources accordingly: - - - - simple FreeType types, without the API - - - definition of memory-management macros - - - added the `DSIG' (OpenType Digital Signature) tag to - - - - light update/cleaning of the build system + changes to the sources - in order to get rid of _all_ compiler warnings with three - compilers, i.e: - - gcc with `-ansi -pedantic -Wall -W', Visual C++ with `/W3 /WX' and - LCC - - IMPORTANT NOTE FOR WIN32-LCC USERS: - | - | It seems the C pre-processor that comes with LCC is broken, it - | doesn't recognize the ANSI standard directives # and ## - | correctly when one of the argument is a macro. Also, - | something like: - | - | #define F(x) print##x - | - | F(("hello")) - | - | will get incorrectly translated to: - | - | print "hello") - | - | by its pre-processor. For this reason, you simply cannot build - | FreeType 2 in debug mode with this compiler.. - - - yet another massive grunt work. I've changed the definition of - the EXPORT_DEF, EXPORT_FUNC, BASE_DEF & BASE_FUNC macros. These - now take an argument, which is the function's return value type. - - This is necessary to compile FreeType as a DLL on Windows and - OS/2. Depending on the compiler used, a compiler-specific keyword - like __export or __system must be placed before (VisualC++) or - after (BorlandC++) the type.. - - Of course, this needed a lot of changes throughout the source code - to make it compile again... All cleaned up now, apparently.. - - Note also that there is a new EXPORT_VAR macro defined to allow - the _declaration_ of an exportable public (constant) - variable. This is the case of the raster interfaces (see - ftraster.h and ftgrays.h), as well as each module's interface (see - sfdriver.h, psdriver.h, etc..) - - - new feature: it is now possible to pass extra parameters to font - drivers when creating a new face object. For now, - this capability is unused. It could however prove to - be useful in a near future.. - - the FT_Open_Args structure was changes, as well as the internal - driver interface (the specific `init_face' module function has - now a different signature). - - - updated the tutorial (not finished though). - - - updated the top-level BUILD document - - - fixed a potential memory leak that could occur when loading - embedded bitmaps. - - - added the declaration of FT_New_Memory_Face in - , as it was missing from the public header - (the implementation was already in `ftobjs.c'). - - - the file has been seriously updated in order - to allow the automatic generation of error message tables. See - the comments within it for more information. - - - major directory hierarchy re-organisation. This was done for two - things: - - * first, to ease the `manual' compilation of the library by - requiring at lot less include paths :-) - - * second, to allow external programs to effectively access - internal data fields. For example, this can be extremely - useful if someone wants to write a font producer or a font - manager on top of FreeType. - - Basically, you should now use the 'freetype/' prefix for header - inclusion, as in: - - #include - #include - - Some new include sub-directories are available: - - a. the `freetype/config' directory, contains two files used to - configure the build of the library. Client applications - should not need to look at these normally, but they can if - they want. - - #include - #include - - b. the `freetype/internal' directory, contains header files that - describes library internals. These are the header files that - were previously found in the `src/base' and `src/shared' - directories. - - - As usual, the build system and the demos have been updated to - reflect the change.. - - Here's a layout of the new directory hierarchy: - - TOP_DIR - include/ - freetype/ - freetype.h - ... - config/ - ftoption.h - ftconfig.h - ftmodule.h - - internal/ - ftobjs.h - ftstream.h - ftcalc.h - ... - - src/ - base/ - ... - - sfnt/ - psnames/ - truetype/ - type1/ - type1z/ - - - Compiling a module is now much easier, for example, the following - should work when in the TOP_DIR directory on an ANSI build: - - gcc -c -I./include -I./src/base src/base/ftbase.c - gcc -c -I./include -I./src/sfnt src/sfnt/sfnt.c - etc.. - - (of course, using -Iconfig/ if you provide system-specific - configuration files). - - - updated the structure of FT_Outline_Funcs in order to allow direct - coordinate scaling within the outline decomposition routine (this - is important for virtual `on' points with TrueType outlines) + - updates to the rasters to support this.. - - - updated the OS/2 table loading code in `src/sfnt/ttload.c' in - order to support version 2 of the table (see OpenType 1.2 spec) - - - created `include/tttables.h' and `include/t1tables.h' to allow - client applications to access some of the SFNT and T1 tables of a - face with a procedural interface (see `FT_Get_Sfnt_Table') + - updates to internal source files to reflect the change.. - - - some cleanups in the source code to get rid of warnings when - compiling with the `-Wall -W -ansi -pedantic' options in gcc. - - - debugged and moved the smooth renderer to `src/base/ftgrays.c' and - its header to `include/ftgrays.h' - - - updated TT_MAX_SUBGLYPHS to 96 as some CJK fonts have composites - with up to 80 sub-glyphs !! Thanks to Werner - - -====================================================================== - -OLD CHANGES - 14-apr-2000 - - - fixed a bug in the TrueType glyph loader that prevented the - correct loading of some CJK glyphs in mingli.ttf - - - improved the standard Type 1 hinter in `src/type1' - - - fixed two bugs in the experimental Type 1 driver in `src/type1z' - to handle the new XFree86 4.0 fonts (and a few other ones..) - - - the smooth renderer is now complete and supports sub-banding to - render large glyphs at high speed. However, it is still located - in `demos/src/ftgrays.c' and should move to the library itself in - the next beta. NOTE: The smooth renderer doesn't compile in - stand-alone mode anymore, but this should be fixed RSN.. - - - introduced convenience functions to more easily deal with glyph - images, see `include/ftglyph.h' for more details, as well as the - new demo program named `demos/src/ftstring.c' that demonstrates - its use - - - implemented FT_LOAD_NO_RECURSE in both the TrueType and Type 1 - drivers (this is required by the auto-hinter to improve its - results). - - - changed the raster interface, in order to allow client - applications to provide their own span-drawing callbacks. - However, only the smooth renderer supports this. See - `FT_Raster_Params' in the file `include/ftimage.h'. - - - fixed a small bug in FT_MulFix that caused incorrect transform - computation! - - - Note: The tutorial is out-of-date. - - -====================================================================== - -OLD CHANGES - 12-mar-2000 - - - changed the layout of configuration files : now, all ANSI - configuration files are located in - `freetype2/config'. System-specific over-rides can be placed in - `freetype2/config/'. - - - moved all configuration macros to `config/ftoption.h' - - - improvements in the Type 1 driver with AFM support - - - changed the fields in the FT_Outline structure : the old `flags' - array is re-named `tags', while all ancient flags are encoded into - a single unsigned int named `flags'. - - - introduced new flags in FT_Outline.flags (see - ft_outline_.... enums in `ftimage.h'). - - - changed outline functions to `FT_Outline_' syntax - - - added a smooth anti-alias renderer to the demonstration programs - - - added Mac graphics driver (thanks Just) - - - FT_Open_Face changed in order to received a pointer to a - FT_Open_Args descriptor.. - - - various cleanups, a few more API functions implemented (see - FT_Attach_File) - - - updated some docs - - -====================================================================== - -OLD CHANGES - 22-feb-2000 - - - introduced the `psnames' module. It is used to: - - o convert a Postscript glyph name into the equivalent Unicode - character code (used by the Type 1 driver(s) to synthesize on - the fly a Unicode charmap). - - o provide an interface to retrieve the Postscript names of the - Macintosh, Adobe Standard & Adobe Expert character codes. - (the Macintosh names are used by the SFNT-module postscript - names support routines, while the other two tables are used by - the Type 1 driver(s)). - - - introduced the `type1z' alternate Type 1 driver. This is a (still - experimental) driver for the Type 1 format that will ultimately - replace the one in `src/type1'. It uses pattern matching to load - data from the font, instead of a finite state analyzer. It works - much better than the `old' driver with `broken' fonts. It is also - much smaller (under 15 Kb). - - - the Type 1 drivers (both in `src/type1' and `src/type1z') are - nearly complete. They both provide automatic Unicode charmap - synthesis through the `psnames' module. No re-encoding vector is - needed. (note that they still leak memory due to some code - missing, and I'm getting lazy). - - Trivial AFM support has been added to read kerning information but - wasn't exactly tested as it should ;-) - - - The TrueType glyph loader has been seriously rewritten (see the - file `src/truetype/ttgload.c'. It is now much, much simpler as - well as easier to read, maintain and understand :-) Preliminary - versions introduced a memory leak that has been reported by Jack - Davis, and is now fixed.. - - - introduced the new `ft_glyph_format_plotter', used to represent - stroked outlines like Windows `Vector' fonts, and certain Type 1 - fonts like `Hershey'. The corresponding raster will be written - soon. - - - FT_New_Memory_Face is gone. Likewise, FT_Open_Face has a new - interface that uses a structure to describe the input stream, the - driver (if required), etc.. - - -TODO - - - Write FT_Get_Glyph_Bitmap and FT_Load_Glyph_Bitmap - - - Add a function like FT_Load_Character(face, char_code, load_flags) - that would really embed a call to FT_Get_Char_Index then - FT_Load_Glyph to ease developer's work. - - - Update the tutorial! - - - consider adding support for Multiple Master fonts in the Type 1 - drivers. - - - Test the AFM routines of the Type 1 drivers to check that kerning - information is returned correctly. - - - write a decent auto-gridding component !! We need this to release - FreeType 2.0 gold ! - - -less urgent needs: - - - add a CFF/Type2 driver - - add a BDF driver - - add a FNT/PCF/HBF driver - - add a Speedo driver from the X11 sources - - -====================================================================== - -OLDER CHANGES - 27-jan-2000 - - - updated the `sfnt' module interface to allow several SFNT-based - drivers to co-exist peacefully - - - updated the `T1_Face' type to better separate Postscript font - content from the rest of the FT_Face structure. Might be used - later by the CFF/Type2 driver.. - - - added an experimental replacement Type 1 driver featuring advanced - (and speedy) pattern matching to retrieve the data from postscript - fonts. - - - very minor changes in the implementation of FT_Set_Char_Size and - FT_Set_Pixel_Sizes (they now implement default to lighten the font - driver's code). - - -====================================================================== - -OLD MESSAGE - -This file summarizes the changes that occurred since the last `beta' -of FreeType 2. Because the list is important, it has been divided into -separate sections: - -Table Of Contents: - - I High-Level Interface (easier !) - II Directory Structure - III Glyph Image Formats - IV Build System - V Portability - VI Font Drivers - - ----------------------------------------------------------------------- - -High-Level Interface: - - The high-level API has been considerably simplified. Here is how: - - - resource objects have disappeared. this means that face objects - can now be created with a single function call (see FT_New_Face - and FT_Open_Face) - - - when calling either FT_New_Face & FT_Open_Face, a size object - and a glyph slot object are automatically created for the face, - and can be accessed through `face->glyph' and `face->size' if - one really needs to. In most cases, there's no need to call - FT_New_Size or FT_New_Glyph. - - - similarly, FT_Load_Glyph now only takes a `face' argument - (instead of a glyph slot and a size). Also, its `result' - parameter is gone, as the glyph image type is returned in the - field `face->glyph.format' - - - the list of available charmaps is directly accessible through - `face->charmaps', counting `face->num_charmaps' elements. Each - charmap has an 'encoding' field which specifies which known - encoding it deals with. Valid values are, for example: - - ft_encoding_unicode (for ASCII, Latin-1 and Unicode) - ft_encoding_apple_roman - ft_encoding_sjis - ft_encoding_adobe_standard - ft_encoding_adobe_expert - - other values may be added in the future. Each charmap still - holds its `platform_id' and `encoding_id' values in case the - encoding is too exotic for the current library - - ----------------------------------------------------------------------- - -Directory Structure: - - Should seem obvious to most of you: - - freetype/ - config/ -- configuration sub-makefiles - ansi/ - unix/ -- platform-specific configuration files - win32/ - os2/ - msdos/ - - include/ -- public header files, those to be included - directly by client apps - - src/ -- sources of the library - base/ -- the base layer - sfnt/ -- the sfnt `driver' (see the drivers section - below) - truetype/ -- the truetype driver - type1/ -- the type1 driver - shared/ -- some header files shared between drivers - - demos/ -- demos/tools - - docs/ -- documentation (a bit empty for now) - - ----------------------------------------------------------------------- - -Glyph Image Formats: - - Drivers are now able to register new glyph image formats within the - library. For now, the base layer supports of course bitmaps and - vector outlines, but one could imagine something different like - colored bitmaps, bi-color vectors or whatever else (Metafonts anyone - ??). - - See the file `include/ftimage.h'. Note also that the type - FT_Raster_Map is gone, and is now replaced by FT_Bitmap, which - should encompass all known bitmap types. - - Each new image format must provide at least one `raster', i.e. a - module capable of transforming the glyph image into a bitmap. It's - also possible to change the default raster used for a given glyph - image format. - - The default outline scan-converter now uses 128 levels of grays by - default, which tends to smooth many things. Note that the demo - programs have been updated significantly in order to display these.. - - ----------------------------------------------------------------------- - -Build system: - - You still need GNU Make to build the library. The build system has - been very seriously re-vamped in order to provide things like : - - - automatic host platform detection (reverting to 'config/ansi' if - it is not detected, with pseudo-standard compilation flags) - - - the ability to compile from the Makefiles with very different and - exotic compilers. Note that linking the library can be difficult - for some platforms. - - For example, the file `config/win32/lcclib.bat' is invoked by the - build system to create the `.lib' file with LCC-Win32 because its - librarian has too many flaws to be invoked directly from the - Makefile. - - Here's how it works: - - - the first time you type `make', the build system runs a series of - sub-makefiles in order to detect your host platform. It then - dumps what it found, and creates a file called `config.mk' in the - current directory. This is a sub-Makefile used to define many - important Make variables used to build the library. - - - the second time, the build system detects the `config.mk' then use - it to build the library. All object files go into 'obj' by - default, as well as the library file, but this can easily be - changed. - - Note that you can run `make setup' to force another host platform - detection even if a `config.mk' is present in the current - directory. Another solution is simply to delete the file, then - re-run make. - - Finally, the default compiler for all platforms is gcc (for now, - this will hopefully changed in the future). You can however specify - a different compiler by specifying it after the 'setup' target as - in: - - gnumake setup lcc on Win32 to use the LCC compiler - gnumake setup visualc on Win32 to use Visual C++ - - See the file `config//detect.mk' for a list of supported - compilers for your platforms. - - It should be relatively easy to write new detection rules files and - config.mk.. - - Finally, to build the demo programs, go to `demos' and launch GNU - Make, it will use the `config.mk' in the top directory to build the - test programs.. - - ----------------------------------------------------------------------- - -Portability: - - In the previous beta, a single FT_System object was used to - encompass all low-level operations like thread synchronisation, - memory management and i/o access. This has been greatly simplified: - - - thread synchronisation has been dropped, for the simple reason - that the library is already re-entrant, and that if you really - need two threads accessing the same FT_Library, you should - really synchronize access to it yourself with a simple mutex. - - - memory management is performed through a very simple object - called `FT_Memory', which really is a table containing a table - of pointers to functions like malloc, realloc and free as well - as some user data (closure). - - - resources have disappeared (they created more problems than they - solved), and i/o management have been simplified greatly as a - result. Streams are defined through FT_Stream objects, which - can be either memory-based or disk-based. - - Note that each face has its own stream, which is closed only - when the face object is destroyed. Hence, a function like - TT_Flush_Face in 1.x cannot be directly supported. However, if - you really need something like this, you can easily tailor your - own streams to achieve the same feature at a lower level (and - use FT_Open_Face instead of FT_New_Face to create the face). - - See the file `include/ftsystem.h' for more details, as well as the - implementations found in `config/unix' and `config/ansi'. - - ----------------------------------------------------------------------- - -Font Drivers: - - The Font Driver interface has been modified in order to support - extensions & versioning. - - - The list of the font drivers that are statically linked to the - library at compile time is managed through a new configuration file - called `config//ftmodule.h'. - - This file is autogenerated when invoking `make modules'. This - target will parse all sub-directories of 'src', looking for a - `module.mk' rules file, used to describe the driver to the build - system. - - Hence, one should call `make modules' each time a font driver is - added or removed from the `src' directory. - - Finally, this version provides a `pseudo-driver' in `src/sfnt'. - This driver doesn't support font files directly, but provides - services used by all TrueType-like font drivers. Hence, its code is - shared between the TrueType & OpenType font formats, and possibly - more formats to come if we're lucky.. - - ----------------------------------------------------------------------- - -Extensions support: - - The extensions support is inspired by the one found in 1.x. - - Now, each font driver has its own `extension registry', which lists - which extensions are available for the font faces managed by the - driver. - - Extension ids are now strings, rather than 4-byte tags, as this is - usually more readable. - - Each extension has: - - some data, associated to each face object - - an interface (table of function pointers) - - An extension that is format-specific should simply register itself - to the correct font driver. Here is some example code: - - // Registering an extensions - // - FT_Error FT_Init_XXXX_Extension( FT_Library library ) - { - FT_DriverInterface* tt_driver; - - driver = FT_Get_Driver( library, "truetype" ); - if (!driver) return FT_Err_Unimplemented_Feature; - - return FT_Register_Extension( driver, &extension_class ); - } - - - // Implementing the extensions - // - FT_Error FT_Proceed_Extension_XXX( FT_Face face ) - { - FT_XXX_Extension ext; - FT_XXX_Extension_Interface ext_interface; - - ext = FT_Get_Extension( face, "extensionid", &ext_interface ); - if (!ext) return error; - - return ext_interface->do_it(ext); - } - ------------------------------------------------------------------------- - -Copyright 2000-2015 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. - - -Local Variables: -version-control: never -coding: utf-8 -End: - ---- end of CHANGES --- diff --git a/3party/freetype/docs/CMAKE b/3party/freetype/docs/CMAKE deleted file mode 100644 index 31237ae151..0000000000 --- a/3party/freetype/docs/CMAKE +++ /dev/null @@ -1,2 +0,0 @@ -Support for a cmake build has been contributed. See the remarks in the -top-level `CMakeLists.txt' file for more. diff --git a/3party/freetype/docs/CUSTOMIZE b/3party/freetype/docs/CUSTOMIZE deleted file mode 100644 index 42fc313811..0000000000 --- a/3party/freetype/docs/CUSTOMIZE +++ /dev/null @@ -1,152 +0,0 @@ -How to customize the compilation of the library -=============================================== - - FreeType is highly customizable to fit various needs, and this - document describes how it is possible to select options and - components at compilation time. - - -I. Configuration macros - - The file `include/freetype/config/ftoption.h' contains a list of - commented configuration macros that can be toggled by developers to - indicate which features should be active while building the library. - - These options range from debug level to availability of certain - features, like native TrueType hinting through a bytecode - interpreter. - - We invite you to read this file for more information. You can - change the file's content to suit your needs, or override it with - one of the techniques described below. - - -II. Modules list - - If you use GNU make please edit the top-level file `modules.cfg'. - It contains a list of available FreeType modules and extensions to - be compiled. Change it to suit your own preferences. Be aware that - certain modules depend on others, as described in the file. GNU - make uses `modules.cfg' to generate `ftmodule.h' (in the object - directory). - - If you build FreeType in a directory separate from the source files, - put your customized `modules.cfg' in that directory; that way you - can keep the source files `clean'. - - If you don't use GNU make you have to manually edit the file - `include/freetype/config/ftmodule.h' (which is *not* used with if - compiled with GNU make) to add or remove the drivers and components - you want to compile into the library. See `INSTALL.ANY' for more - information. - - -III. System interface - - FreeType's default interface to the system (i.e., the parts that - deal with memory management and i/o streams) is located in - `src/base/ftsystem.c'. - - The current implementation uses standard C library calls to manage - memory and to read font files. It is however possible to write - custom implementations to suit specific systems. - - To tell the GNU Make-based build system to use a custom system - interface, you have to define the environment variable FTSYS_SRC to - point to the relevant implementation: - - on Unix: - - ./configure - export FTSYS_SRC=foo/my_ftsystem.c - make - make install - - on Windows: - - make setup - set FTSYS_SRC=foo/my_ftsystem.c - make - - -IV. Overriding default configuration and module headers - - It is possible to override the default configuration and module - headers without changing the original files. There are three ways - to do that: - - - 1. With GNU make - - [This is actually a combination of method 2 and 3.] - - Just put your custom `ftoption.h' file into the objects directory - (normally `/objs' if you build in the source tree, or the - directory where you invoke configure if you build in a separate - directory), which GNU make prefers over the standard location. No - action is needed for `ftmodule.h' because it is generated - automatically in the objects directory. - - 2. Using the C include path - - Use the C include path to ensure that your own versions of the - files are used at compile time when the lines - - #include FT_CONFIG_OPTIONS_H - #include FT_CONFIG_MODULES_H - - are compiled. Their default values being - and , you - can do something like: - - custom/ - config/ - ftoption.h => custom options header - ftmodule.h => custom modules list - - include/ => normal FreeType 2 include - ... - - then change the C include path to always give the path to `custom' - before the FreeType 2 `include'. - - - 3. Redefining FT_CONFIG_OPTIONS_H and FT_CONFIG_MODULES_H - - Another way to do the same thing is to redefine the macros used to - name the configuration headers. To do so, you need a custom - `ft2build.h' whose content can be as simple as: - - #ifndef __FT2_BUILD_MY_PLATFORM_H__ - #define __FT2_BUILD_MY_PLATFORM_H__ - - #define FT_CONFIG_OPTIONS_H - #define FT_CONFIG_MODULES_H - - #include - - #endif /* __FT2_BUILD_MY_PLATFORM_H__ */ - - Place those files in a separate directory, e.g., - - custom/ - ft2build.h => custom version described above - my-ftoption.h => custom options header - my-ftmodule.h => custom modules list header - - and change the C include path to ensure that `custom' is always - placed before the FT2 `include' during compilation. - ----------------------------------------------------------------------- - -Copyright 2003-2015 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. - - ---- end of CUSTOMIZE --- diff --git a/3party/freetype/docs/DEBUG b/3party/freetype/docs/DEBUG deleted file mode 100644 index ab2c769ac5..0000000000 --- a/3party/freetype/docs/DEBUG +++ /dev/null @@ -1,204 +0,0 @@ -Debugging within the FreeType sources -===================================== - -I. Configuration macros ------------------------ - -There are several ways to enable debugging features in a FreeType 2 -builds. This is controlled through the definition of special macros -located in the file `ftoptions.h'. The macros are: - - - FT_DEBUG_LEVEL_ERROR - - #define this macro if you want to compile the FT_ERROR macro calls - to print error messages during program execution. This will not - stop the program. Very useful to spot invalid fonts during - development and to code workarounds for them. - - FT_DEBUG_LEVEL_TRACE - - #define this macro if you want to compile both macros FT_ERROR and - FT_TRACE. This also includes the variants FT_TRACE0, FT_TRACE1, - FT_TRACE2, ..., FT_TRACE7. - - The trace macros are used to send debugging messages when an - appropriate `debug level' is configured at runtime through the - FT2_DEBUG environment variable (more on this later). - - FT_DEBUG_MEMORY - - If this macro is #defined, the FreeType engine is linked with a - small but effective debugging memory manager that tracks all - allocations and frees that are performed within the font engine. - - When the FT2_DEBUG_MEMORY environment variable is defined at - runtime, a call to FT_Done_FreeType will dump memory statistics, - including the list of leaked memory blocks with the source - locations where these were allocated. It is always a very good - idea to define this in development builds. This works with _any_ - program linked to FreeType, but requires a big deal of memory (the - debugging memory manager never frees the blocks to the heap in - order to detect double frees). - - When FT2_DEBUG_MEMORY isn't defined at runtime, the debugging - memory manager is ignored, and performance is unaffected. - - -II. Debugging macros --------------------- - -Several macros can be used within the FreeType sources to help -debugging its code: - - - 1. FT_ERROR(( ... )) - - This macro is used to send debug messages that indicate relatively - serious errors (like broken font files), but will not stop the - execution of the running program. Its code is compiled only when - either FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined in - `ftoption.h'. - - Note that you have to use a printf-like signature, but with double - parentheses, like in - - FT_ERROR(( "your %s is not %s\n", "foo", "bar" )); - - - 2. FT_ASSERT( condition ) - - This macro is used to check strong assertions at runtime. If its - condition isn't TRUE, the program will abort with a panic message. - Its code is compiled when either FT_DEBUG_LEVEL_ERROR or - FT_DEBUG_LEVEL_TRACE are defined. You don't need double - parentheses here. For example - - FT_ASSERT( ptr != NULL ); - - - 3. FT_TRACE( level, (message...) ) - - The FT_TRACE macro is used to send general-purpose debugging - messages during program execution. This macro uses an *implicit* - macro named FT_COMPONENT used to name the current FreeType - component being run. - - The developer should always define FT_COMPONENT as appropriate, - for example as in - - #undef FT_COMPONENT - #define FT_COMPONENT trace_io - - The value of the FT_COMPONENT macro is an enumeration named - `trace_XXXX' where `XXXX' is one of the component names defined in - the internal file `internal/fttrace.h'. If you modify FreeType - source and insert new `trace_XXXX' macro, you must register it in - `fttrace.h'. If you insert or remove many trace macros, you can - check the undefined or the unused trace macro by - `src/tools/chktrcmp.py'. - - Each such component is assigned a `debug level', ranging from 0 to - 7, through the use of the FT2_DEBUG environment variable - (described below) when a program linked with FreeType starts. - - When FT_TRACE is called, its level is compared to the one of the - corresponding component. Messages with trace levels *higher* than - the corresponding component level are filtered and never printed. - - This means that trace messages with level 0 are always printed, - those with level 2 are only printed when the component level is - *at least* 2. - - The second parameter to FT_TRACE must contain parentheses and - correspond to a printf-like call, as in - - FT_TRACE( 2, ( "your %s is not %s\n", "foo", "bar" ) ) - - The shortcut macros FT_TRACE0, FT_TRACE1, FT_TRACE2, ..., - FT_TRACE7 can be used with constant level indices, and are much - cleaner to use, as in - - FT_TRACE2(( "your %s is not %s\n", "foo", "bar" )); - - -III. Environment variables --------------------------- - -The following environment variables control debugging output and -behaviour of FreeType at runtime. - - - FT2_DEBUG - - This variable is only used when FreeType is built with - FT_DEBUG_LEVEL_TRACE defined. It contains a list of component - level definitions, following this format: - - component1:level1 component2:level2 component3:level3 ... - - where `componentX' is the name of a tracing component, as defined - in `fttrace.h', but without the `trace_' prefix. `levelX' is the - corresponding level to use at runtime. - - `any' is a special component name that will be interpreted as - `any/all components'. For example, the following definitions - - set FT2_DEBUG=any:2 memory:5 io:4 (on Windows) - export FT2_DEBUG="any:2 memory:5 io:4" (on Linux with bash) - - both stipulate that all components should have level 2, except for - the memory and io components which will be set to trace levels 5 - and 4, respectively. - - - FT2_DEBUG_MEMORY - - This environment variable, when defined, tells FreeType to use a - debugging memory manager that will track leaking memory blocks as - well as other common errors like double frees. It is also capable - of reporting _where_ the leaking blocks were allocated, which - considerably saves time when debugging new additions to the - library. - - This code is only compiled when FreeType is built with the - FT_DEBUG_MEMORY macro #defined in `ftoption.h' though, it will be - ignored in other builds. - - - FT2_ALLOC_TOTAL_MAX - - This variable is ignored if FT2_DEBUG_MEMORY is not defined. It - allows you to specify a maximum heap size for all memory - allocations performed by FreeType. This is very useful to test - the robustness of the font engine and programs that use it in - tight memory conditions. - - If it is undefined, or if its value is not strictly positive, then - no allocation bounds are checked at runtime. - - - FT2_ALLOC_COUNT_MAX - - This variable is ignored if FT2_DEBUG_MEMORY is not defined. It - allows you to specify a maximum number of memory allocations - performed by FreeType before returning the error - FT_Err_Out_Of_Memory. This is useful for debugging and testing - the engine's robustness. - - If it is undefined, or if its value is not strictly positive, then - no allocation bounds are checked at runtime. - ------------------------------------------------------------------------- - -Copyright 2002-2015 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. - - ---- end of DEBUG --- diff --git a/3party/freetype/docs/FTL.TXT b/3party/freetype/docs/FTL.TXT deleted file mode 100644 index bbaba33f47..0000000000 --- a/3party/freetype/docs/FTL.TXT +++ /dev/null @@ -1,169 +0,0 @@ - The FreeType Project LICENSE - ---------------------------- - - 2006-Jan-27 - - Copyright 1996-2002, 2006 by - David Turner, Robert Wilhelm, and Werner Lemberg - - - -Introduction -============ - - The FreeType Project is distributed in several archive packages; - some of them may contain, in addition to the FreeType font engine, - various tools and contributions which rely on, or relate to, the - FreeType Project. - - This license applies to all files found in such packages, and - which do not fall under their own explicit license. The license - affects thus the FreeType font engine, the test programs, - documentation and makefiles, at the very least. - - This license was inspired by the BSD, Artistic, and IJG - (Independent JPEG Group) licenses, which all encourage inclusion - and use of free software in commercial and freeware products - alike. As a consequence, its main points are that: - - o We don't promise that this software works. However, we will be - interested in any kind of bug reports. (`as is' distribution) - - o You can use this software for whatever you want, in parts or - full form, without having to pay us. (`royalty-free' usage) - - o You may not pretend that you wrote this software. If you use - it, or only parts of it, in a program, you must acknowledge - somewhere in your documentation that you have used the - FreeType code. (`credits') - - We specifically permit and encourage the inclusion of this - software, with or without modifications, in commercial products. - We disclaim all warranties covering The FreeType Project and - assume no liability related to The FreeType Project. - - - Finally, many people asked us for a preferred form for a - credit/disclaimer to use in compliance with this license. We thus - encourage you to use the following text: - - """ - Portions of this software are copyright The FreeType - Project (www.freetype.org). All rights reserved. - """ - - Please replace with the value from the FreeType version you - actually use. - - -Legal Terms -=========== - -0. Definitions --------------- - - Throughout this license, the terms `package', `FreeType Project', - and `FreeType archive' refer to the set of files originally - distributed by the authors (David Turner, Robert Wilhelm, and - Werner Lemberg) as the `FreeType Project', be they named as alpha, - beta or final release. - - `You' refers to the licensee, or person using the project, where - `using' is a generic term including compiling the project's source - code as well as linking it to form a `program' or `executable'. - This program is referred to as `a program using the FreeType - engine'. - - This license applies to all files distributed in the original - FreeType Project, including all source code, binaries and - documentation, unless otherwise stated in the file in its - original, unmodified form as distributed in the original archive. - If you are unsure whether or not a particular file is covered by - this license, you must contact us to verify this. - - The FreeType Project is copyright (C) 1996-2000 by David Turner, - Robert Wilhelm, and Werner Lemberg. All rights reserved except as - specified below. - -1. No Warranty --------------- - - THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY - KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS - BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO - USE, OF THE FREETYPE PROJECT. - -2. Redistribution ------------------ - - This license grants a worldwide, royalty-free, perpetual and - irrevocable right and license to use, execute, perform, compile, - display, copy, create derivative works of, distribute and - sublicense the FreeType Project (in both source and object code - forms) and derivative works thereof for any purpose; and to - authorize others to exercise some or all of the rights granted - herein, subject to the following conditions: - - o Redistribution of source code must retain this license file - (`FTL.TXT') unaltered; any additions, deletions or changes to - the original files must be clearly indicated in accompanying - documentation. The copyright notices of the unaltered, - original files must be preserved in all copies of source - files. - - o Redistribution in binary form must provide a disclaimer that - states that the software is based in part of the work of the - FreeType Team, in the distribution documentation. We also - encourage you to put an URL to the FreeType web page in your - documentation, though this isn't mandatory. - - These conditions apply to any software derived from or based on - the FreeType Project, not just the unmodified files. If you use - our work, you must acknowledge us. However, no fee need be paid - to us. - -3. Advertising --------------- - - Neither the FreeType authors and contributors nor you shall use - the name of the other for commercial, advertising, or promotional - purposes without specific prior written permission. - - We suggest, but do not require, that you use one or more of the - following phrases to refer to this software in your documentation - or advertising materials: `FreeType Project', `FreeType Engine', - `FreeType library', or `FreeType Distribution'. - - As you have not signed this license, you are not required to - accept it. However, as the FreeType Project is copyrighted - material, only this license, or another one contracted with the - authors, grants you the right to use, distribute, and modify it. - Therefore, by using, distributing, or modifying the FreeType - Project, you indicate that you understand and accept all the terms - of this license. - -4. Contacts ------------ - - There are two mailing lists related to FreeType: - - o freetype@nongnu.org - - Discusses general use and applications of FreeType, as well as - future and wanted additions to the library and distribution. - If you are looking for support, start in this list if you - haven't found anything to help you in the documentation. - - o freetype-devel@nongnu.org - - Discusses bugs, as well as engine internals, design issues, - specific licenses, porting, etc. - - Our home page can be found at - - http://www.freetype.org - - ---- end of FTL.TXT --- diff --git a/3party/freetype/docs/GPLv2.TXT b/3party/freetype/docs/GPLv2.TXT deleted file mode 100644 index b2fe7b6af3..0000000000 --- a/3party/freetype/docs/GPLv2.TXT +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/3party/freetype/docs/INSTALL b/3party/freetype/docs/INSTALL deleted file mode 100644 index 193c5300a2..0000000000 --- a/3party/freetype/docs/INSTALL +++ /dev/null @@ -1,88 +0,0 @@ - -There are several ways to build the FreeType library, depending on -your system and the level of customization you need. Here is a short -overview of the documentation available: - - -I. Normal installation and upgrades -=================================== - - 1. Unix Systems (including Mac OS X, Cygwin, and MSys on Windows) - - Please read `INSTALL.UNIX' to install or upgrade FreeType 2 on a - Unix system. Note that you *need* GNU Make for automatic - compilation, since other make tools won't work (this includes BSD - Make). - - GNU Make VERSION 3.80 OR NEWER IS NEEDED! - - - 2. On VMS with the `mms' build tool - - See `INSTALL.VMS' for installation instructions on this platform. - - - 3. Other systems using GNU Make - - On non-Unix platforms, it is possible to build the library using - GNU Make utility. Note that *NO OTHER MAKE TOOL WILL WORK*[1]! - This methods supports several compilers on Windows, OS/2, and - BeOS, including MinGW, Visual C++, Borland C++, and more. - - Instructions are provided in the file `INSTALL.GNU'. - - - 4. With an IDE Project File (e.g., for Visual Studio or CodeWarrior) - - We provide a small number of `project files' for various IDEs to - automatically build the library as well. Note that these files - are not supported and only sporadically maintained by FreeType - developers, so don't expect them to work in each release. - - To find them, have a look at the content of the `builds/' - directory, where stands for your OS or environment. - - - 5. Using cmake - - See the top-level `CMakeLists.txt' file for more information. - - - 6. From you own IDE, or own Makefiles - - If you want to create your own project file, follow the - instructions given in the `INSTALL.ANY' document of this - directory. - - -II. Custom builds of the library -================================ - - Customizing the compilation of FreeType is easy, and allows you to - select only the components of the font engine that you really need. - For more details read the file `CUSTOMIZE'. - - ----------------------------------------------------------------------- - -[1] make++, a make tool written in Perl, has sufficient support of GNU - make extensions to build FreeType. See - - http://makepp.sourceforge.net - - for more information; you need version 1.19 or newer, and you must - pass option `--norc-substitution'. - ----------------------------------------------------------------------- - -Copyright 2000-2015 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. - - ---- end of INSTALL --- diff --git a/3party/freetype/docs/INSTALL.ANY b/3party/freetype/docs/INSTALL.ANY deleted file mode 100644 index 23b66e46c8..0000000000 --- a/3party/freetype/docs/INSTALL.ANY +++ /dev/null @@ -1,156 +0,0 @@ -Instructions on how to build FreeType with your own build tool -============================================================== - -See the file `CUSTOMIZE' to learn how to customize FreeType to -specific environments. - - -I. Standard procedure ---------------------- - - * DISABLE PRE-COMPILED HEADERS! This is very important for Visual - C++, because FreeType uses lines like: - - #include FT_FREETYPE_H - - which are not correctly supported by this compiler while being ISO - C compliant! - - * You need to add the directory `include' to your include path when - compiling the library. - - * FreeType 2 is made of several components; each of them is located - in a subdirectory of `freetype2/src'. For example, - `freetype2/src/truetype/' contains the TrueType font driver. - - * DO NOT COMPILE ALL C FILES! Rather, compile the following ones. - - -- base components (required) - - src/base/ftsystem.c - src/base/ftinit.c - src/base/ftdebug.c - - src/base/ftbase.c - - src/base/ftbbox.c -- recommended, see - src/base/ftglyph.c -- recommended, see - - src/base/ftbdf.c -- optional, see - src/base/ftbitmap.c -- optional, see - src/base/ftcid.c -- optional, see - src/base/ftfntfmt.c -- optional, see - src/base/ftfstype.c -- optional - src/base/ftgasp.c -- optional, see - src/base/ftgxval.c -- optional, see - src/base/ftlcdfil.c -- optional, see - src/base/ftmm.c -- optional, see - src/base/ftotval.c -- optional, see - src/base/ftpatent.c -- optional - src/base/ftpfr.c -- optional, see - src/base/ftstroke.c -- optional, see - src/base/ftsynth.c -- optional, see - src/base/fttype1.c -- optional, see - src/base/ftwinfnt.c -- optional, see - - src/base/ftmac.c -- only on the Macintosh - - -- font drivers (optional; at least one is needed) - - src/bdf/bdf.c -- BDF font driver - src/cff/cff.c -- CFF/OpenType font driver - src/cid/type1cid.c -- Type 1 CID-keyed font driver - src/pcf/pcf.c -- PCF font driver - src/pfr/pfr.c -- PFR/TrueDoc font driver - src/sfnt/sfnt.c -- SFNT files support - (TrueType & OpenType) - src/truetype/truetype.c -- TrueType font driver - src/type1/type1.c -- Type 1 font driver - src/type42/type42.c -- Type 42 font driver - src/winfonts/winfnt.c -- Windows FONT / FNT font driver - - -- rasterizers (optional; at least one is needed for vector - formats) - - src/raster/raster.c -- monochrome rasterizer - src/smooth/smooth.c -- anti-aliasing rasterizer - - -- auxiliary modules (optional) - - src/autofit/autofit.c -- auto hinting module - src/cache/ftcache.c -- cache sub-system (in beta) - src/gzip/ftgzip.c -- support for compressed fonts (.gz) - src/lzw/ftlzw.c -- support for compressed fonts (.Z) - src/bzip2/ftbzip2.c -- support for compressed fonts (.bz2) - src/gxvalid/gxvalid.c -- TrueTypeGX/AAT table validation - src/otvalid/otvalid.c -- OpenType table validation - src/psaux/psaux.c -- PostScript Type 1 parsing - src/pshinter/pshinter.c -- PS hinting module - src/psnames/psnames.c -- PostScript glyph names support - - - Notes: - - `ftcache.c' needs `ftglyph.c' - `ftfstype.c' needs `fttype1.c' - `ftglyph.c' needs `ftbitmap.c' - `ftstroke.c' needs `ftglyph.c' - `ftsynth.c' needs `ftbitmap.c' - - `cff.c' needs `sfnt.c', `pshinter.c', and `psnames.c' - `truetype.c' needs `sfnt.c' and `psnames.c' - `type1.c' needs `psaux.c' `pshinter.c', and `psnames.c' - `type1cid.c' needs `psaux.c', `pshinter.c', and `psnames.c' - `type42.c' needs `truetype.c' - - Please consult the central `include/freetype/config/ftoption.h' - configuration file for details on additional libraries necessary - for some optional features. - - - Read the file `CUSTOMIZE' in case you want to compile only a subset - of the drivers, renderers, and optional modules; a detailed - description of the various base extension is given in the top-level - file `modules.cfg'. - - You are done. In case of problems, see the archives of the FreeType - development mailing list. - - -II. Support for flat-directory compilation ------------------------------------------- - - It is possible to put all FreeType 2 source files into a single - directory, with the *exception* of the `include' hierarchy. - - 1. Copy all files in current directory - - cp freetype2/src/base/*.[hc] . - cp freetype2/src/raster1/*.[hc] . - cp freetype2/src/smooth/*.[hc] . - etc. - - 2. Compile sources - - cc -c -Iinclude -DFT2_BUILD_LIBRARY ftsystem.c - cc -c -Iinclude -DFT2_BUILD_LIBRARY ftinit.c - cc -c -Iinclude -DFT2_BUILD_LIBRARY ftdebug.c - cc -c -Iinclude -DFT2_BUILD_LIBRARY ftbase.c - etc. - - You don't need to define the FT_FLAT_COMPILATION macro (as this - was required in previous releases of FreeType 2). - ----------------------------------------------------------------------- - -Copyright 2003-2015 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. - - ---- end of INSTALL.ANY --- diff --git a/3party/freetype/docs/INSTALL.CROSS b/3party/freetype/docs/INSTALL.CROSS deleted file mode 100644 index a83638d644..0000000000 --- a/3party/freetype/docs/INSTALL.CROSS +++ /dev/null @@ -1,177 +0,0 @@ -This document contains instructions on how to cross-build the FreeType -library on Unix systems, for example, building binaries for Linux/MIPS -on FreeBSD/i386. Before reading this document, please consult the -file `INSTALL.UNIX' for required tools and the basic self-building -procedure. - - - 1. Required Tools - ----------------- - - For self-building the FreeType library on a Unix system, GNU Make - 3.80 or newer is required. `INSTALL.UNIX' contains hints how to - check the installed `make'. - - The GNU C compiler to cross-build the target system is required. - Currently, using a non-GNU cross compiler is untested. The cross - compiler is expected to be installed with a system prefix. For - example, if your building system is FreeBSD/i386 and the target - system is Linux/MIPS, the cross compiler should be installed with - the name `mips-ip22-linuxelf-gcc'. - - A C compiler for a self-build is required also, to build a tool - (`apinames') that is executed during the build procedure. Non-GNU - self compilers are acceptable, but such a setup is untested. - - - 2. Configuration - ---------------- - - 2.1. Building and target system - - To configure a cross-build, the options `--host=' and - `--build=' must be passed to the `configure' script. - For example, if your build system is FreeBSD/i386 and the target - system is Linux/MIPS, say - - ./configure \ - --build=i386-unknown-freebsd \ - --host=mips-ip22-linuxelf \ - [other options] - - It should be noted that `--host=' specifies the system - where the built binaries will be executed, not the system where - the build actually happens. Older versions of GNU autoconf use - the option pair `--host=' and `--target='. This is broken and - doesn't work. Similarly, an explicit CC specification like - - env CC=mips-ip22-linux-gcc ./configure # BAD - - or - - env CC=/usr/local/mips-ip22-linux/bin/gcc ./configure # BAD - - doesn't work either; such a configuration confuses the - `configure' script while trying to find the cross and native C - compilers. - - - 2.2. The prefix to install FreeType2 - - Setting `--prefix=' properly is important. The prefix - to install FreeType2 is written into the `freetype-config' - script and `freetype2.pc' configuration file. - - If the built FreeType 2 library is used as a part of the - cross-building system, the prefix is expected to be different - from the self-building system. For example, a configuration - with `--prefix=/usr/local' installs binaries into the - system-wide `/usr/local' directory, which then can't be executed - due to the incorrect architecture. This causes confusion in - configuration of all applications that use FreeType2. Instead, - use a prefix to install the cross-build into a separate system - tree, for example, `--prefix=/usr/local/mips-ip22-linux/'. - - On the other hand, if the built FreeType 2 library is used as a - part of the target system, the prefix to install should reflect - the file system structure of the target system. - - - 2.3. Library dependencies - - FreeType normally depends on external libraries like `libpng' or - `libharfbuzz'. The easiest case is to deactivate all such - dependencies using the `--without-XXX' configuration options. - However, if you want to use those libraries, you should ensure - that they are available both on the target system and as - (cross-compiled) libraries on the build system. - - FreeType uses `pkg-config' to find most of the libraries; the - other libraries it links to are expected in the standard system - directories. Since the default pkg-config's meta-information - files (like `harfbuzz.pc') of the build platform don't work, use - one of the two possible solutions below. - - o Use pkg-config's meta-information files that are adjusted to - cross-compile and cross-link with the target platform's - libraries. Make sure those files are found before the build - system's default files. Example: - - ./configure \ - --build=i386-unknown-freebsd \ - --host=mips-ip22-linuxelf \ - PKG_CONFIG_LIBDIR="/usr/local/mips-ip22-linux/lib/pkgconfig" \ - [other options] - - See the manpage of `pkg-config' for more details. - - o Set variables like LIBPNG_LIBS as additional options to the - `configure' script, overriding the values `pkg-config' would - provide. `configure --help' shows the available environment - variables. Example: - - ./configure \ - --build=i386-unknown-freebsd \ - --host=mips-ip22-linuxelf \ - LIBPNG_CFLAGS="-I/usr/local/mips-ip22-linux/include" \ - LIBPNG_LIBS="-L/usr/local/mips-ip22-linux/lib -lpng12" \ - [other options] - - - 3. Building command - ------------------- - - If the configuration finishes successfully, invoking GNU make - builds FreeType2. Just say - - make - - or - - gmake - - depending on the name the GNU make binary actually has. - - - 4. Installation - --------------- - - Saying - - make install - - as usual to install FreeType2 into the directory tree specified by - the argument of the `--prefix' option. - - As noted in section 2.2, FreeType2 is sometimes configured to be - installed into the system directory of the target system, and - should not be installed in the cross-building system. In such - cases, the make variable `DESTDIR' is useful to change the root - directory in the installation. For example, after - - make DESTDIR=/mnt/target_system_root/ install - - the built FreeType2 library files are installed into the directory - `/mnt/target_system_root//lib'. - - - 5. TODO - ------- - - Cross building between Cygwin (or MSys) and Unix must be tested. - - ----------------------------------------------------------------------- - -Copyright 2006-2015 by -suzuki toshiya, 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. - - ---- end of INSTALL.CROSS --- diff --git a/3party/freetype/docs/INSTALL.GNU b/3party/freetype/docs/INSTALL.GNU deleted file mode 100644 index 1a7c097978..0000000000 --- a/3party/freetype/docs/INSTALL.GNU +++ /dev/null @@ -1,161 +0,0 @@ -This document contains instructions how to build the FreeType library -on non-Unix systems with the help of GNU Make. Note that if you are -running Cygwin or MinGW/MSYS in Windows, you should follow the -instructions in the file `INSTALL.UNIX' instead. - - - FreeType 2 includes a powerful and flexible build system that allows - you to easily compile it on a great variety of platforms from the - command line. To do so, just follow these simple instructions. - - 1. Install GNU Make - ------------------- - - Because GNU Make is the only Make tool supported to compile - FreeType 2, you should install it on your machine. - - The FreeType 2 build system relies on many features special to GNU - Make. - - NEARLY ALL OTHER MAKE TOOLS FAIL, INCLUDING `BSD MAKE', SO REALLY - INSTALL A RECENT VERSION OF GNU MAKE ON YOUR SYSTEM! - - Note that make++, a make tool written in Perl, supports enough - features of GNU make to compile FreeType. See - - http://makepp.sourceforge.net - - for more information; you need version 1.19 or newer, and you must - pass option `--norc-substitution'. - - Make sure that you are invoking GNU Make from the command line, by - typing something like: - - make -v - - to display its version number. - - VERSION 3.80 OR NEWER IS NEEDED! - - - 2. Invoke `make' - ---------------- - - Go to the root directory of FreeType 2, then simply invoke GNU - Make from the command line. This will launch the FreeType 2 host - platform detection routines. A summary will be displayed, for - example, on Win32. - - - ============================================================== - FreeType build system -- automatic system detection - - The following settings are used: - - platform windows - compiler gcc - configuration directory .\builds\windows - configuration rules .\builds\windows\w32-gcc.mk - - If this does not correspond to your system or settings please - remove the file 'config.mk' from this directory then read the - INSTALL file for help. - - Otherwise, simply type 'make' again to build the library - or 'make refdoc' to build the API reference (the latter needs - python). - ============================================================= - - - If the detected settings correspond to your platform and compiler, - skip to step 5. Note that if your platform is completely alien to - the build system, the detected platform will be `ansi'. - - - 3. Configure the build system for a different compiler - ------------------------------------------------------ - - If the build system correctly detected your platform, but you want - to use a different compiler than the one specified in the summary - (for most platforms, gcc is the default compiler), invoke GNU Make - with - - make setup - - Examples: - - to use Visual C++ on Win32, type: `make setup visualc' - to use Borland C++ on Win32, type `make setup bcc32' - to use Watcom C++ on Win32, type `make setup watcom' - to use Intel C++ on Win32, type `make setup intelc' - to use LCC-Win32 on Win32, type: `make setup lcc' - to use Watcom C++ on OS/2, type `make setup watcom' - to use VisualAge C++ on OS/2, type `make setup visualage' - - The name to use is platform-dependent. The list of - available compilers for your system is available in the file - `builds//detect.mk'. - - If you are satisfied by the new configuration summary, skip to - step 5. - - - 4. Configure the build system for an unknown platform/compiler - -------------------------------------------------------------- - - The auto-detection/setup phase of the build system copies a file - to the current directory under the name `config.mk'. - - For example, on OS/2+gcc, it would simply copy - `builds/os2/os2-gcc.mk' to `./config.mk'. - - If for some reason your platform isn't correctly detected, copy - manually the configuration sub-makefile to `./config.mk' and go to - step 5. - - Note that this file is a sub-Makefile used to specify Make - variables for compiler and linker invocation during the build. - You can easily create your own version from one of the existing - configuration files, then copy it to the current directory under - the name `./config.mk'. - - - 5. Build the library - -------------------- - - The auto-detection/setup phase should have copied a file in the - current directory, called `./config.mk'. This file contains - definitions of various Make variables used to invoke the compiler - and linker during the build. [It has also generated a file called - `ftmodule.h' in the objects directory (which is normally - `/objs/'); please read the file `docs/CUSTOMIZE' for - customization of FreeType.] - - To launch the build, simply invoke GNU Make again: The top - Makefile will detect the configuration file and run the build with - it. - - - Final note - - The above instructions build a _statically_ linked library of the - font engine in the `objs' directory. On Windows, you can build a - DLL either with MinGW (within an MSYS shell, following the - instructions in `INSTALL.UNIX'), or you use one of the Visual C++ - project files; see the subdirectories of `builds/windows'. For - everything else, you are on your own, and you might follow the - instructions in `INSTALL.ANY' to create your own Makefiles. - ----------------------------------------------------------------------- - -Copyright 2003-2015 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. - - ---- end of INSTALL.GNU --- diff --git a/3party/freetype/docs/INSTALL.MAC b/3party/freetype/docs/INSTALL.MAC deleted file mode 100644 index 42bb0d8637..0000000000 --- a/3party/freetype/docs/INSTALL.MAC +++ /dev/null @@ -1,32 +0,0 @@ -Please follow the instructions in INSTALL.UNIX to install FreeType on -Mac OS X. - -Currently FreeType2 functions based on some deprecated Carbon APIs -return FT_Err_Unimplemented_Feature always, even if FreeType2 is -configured and built on the system that deprecated Carbon APIs are -available. To enable deprecated FreeType2 functions as far as possible, -replace src/base/ftmac.c by builds/mac/ftmac.c. - -Starting with Mac OS X 10.5, gcc defaults the deployment target -to 10.5. In previous versions of Mac OS X, this defaulted to 10.1. -If you want your built binaries to run only on 10.5, this change -does not concern you. If you want them to also run on older versions -of Mac OS X, then you must either set the MACOSX_DEPLOYMENT_TARGET -environment variable or pass -mmacosx-version-min to gcc. You should -specify the oldest version of Mac OS you want the code to run on. -For example, if you use Bourne shell: - - export MACOSX_DEPLOYMENT_TARGET=10.2 - -or, if you use C shell: - - setenv MACOSX_DEPLOYMENT_TARGET 10.2 - -Alternatively, you could pass "-mmacosx-version-min=10.2" to gcc. - -Here the number 10.2 is the lowest version that the built binaries -can run on. In the cases in above, the built binaries will run on -Mac OS X 10.2 and later, but _not_ earlier. If you want to run on -earlier, you have to set lower version, e.g. 10.0. - -For classic Mac OS (Mac OS 7, 8, 9) please refer to builds/mac/README. diff --git a/3party/freetype/docs/INSTALL.UNIX b/3party/freetype/docs/INSTALL.UNIX deleted file mode 100644 index 0dab2c60a1..0000000000 --- a/3party/freetype/docs/INSTALL.UNIX +++ /dev/null @@ -1,115 +0,0 @@ -This document contains instructions on how to build the FreeType -library on Unix systems. This also works for emulations like Cygwin -or MSys on Win32: - - - 1. Ensure that you are using GNU Make - ------------------------------------- - - The FreeType build system _exclusively_ works with GNU Make. You - will not be able to compile the library with the instructions - below using any other alternative (including BSD Make). - - Check that you have GNU make by running the command: - - make -v - - This should dump some text that begins with: - - GNU Make - Copyright (C) Free Software Foundation Inc. - - Note that version 3.80 or higher is *required* or the build will - fail. - - It is also fine to have GNU Make under another name (e.g. 'gmake') - if you use the MAKE variable as described below. - - As a special exception, 'makepp' can also be used to build - FreeType 2. See the file docs/MAKEPP for details. - - - 2. Regenerate the configure script if needed - -------------------------------------------- - - This only applies if you are building a git snapshot or checkout, - *not* if you grabbed the sources of an official release. - - You need to invoke the `autogen.sh' script in the top-level - directory in order to create the `configure' script for your - platform. Normally, this simply means typing: - - sh autogen.sh - - In case of problems, you may need to install or upgrade Automake, - Autoconf or Libtool. See README.git in the top-level directory - for more information. - - - 3. Build and install the library - -------------------------------- - - The following should work on all Unix systems where the `make' - command invokes GNU Make: - - ./configure [options] - make - make install (as root) - - The default installation path is `/usr/local'. It can be changed - with the `--prefix=' option. Example: - - ./configure --prefix=/usr - - When using a different command to invoke GNU Make, use the MAKE - variable. For example, if `gmake' is the command to use on your - system, do something like: - - MAKE=gmake ./configure [options] - gmake - gmake install (as root) - - If this still doesn't work, there must be a problem with your - system (e.g., you are using a very old version of GNU Make). - - It is possible to compile FreeType in a different directory. - Assuming the FreeType source files in directory `/src/freetype' a - compilation in directory `foo' works as follows: - - cd foo - /src/freetype/configure [options] - make - make install - - - 3.1 Interdependency with HarfBuzz - ................................. - - Note that there is a chicken-and-egg problem currently since the - HarfBuzz library (used by the auto-hinter to improve support of - OpenType fonts) depends on FreeType, which can be solved as - follows in case HarfBuzz is not yet installed on your system. - - 1. Call FreeType's `configure' script with option - `--without-harfbuzz', then compile and install FreeType. - - 2. Compile and install HarfBuzz. - - 3. Call FreeType's `configure' script without option - `--without-harfbuzz' (after executing `make distclean'), then - compile and install FreeType again. - - ----------------------------------------------------------------------- - -Copyright 2003-2015 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. - - ---- end of INSTALL.UNIX --- diff --git a/3party/freetype/docs/INSTALL.VMS b/3party/freetype/docs/INSTALL.VMS deleted file mode 100644 index 48a323eaef..0000000000 --- a/3party/freetype/docs/INSTALL.VMS +++ /dev/null @@ -1,62 +0,0 @@ -How to build the freetype2 library on VMS ------------------------------------------ - -It is actually very straightforward to install the Freetype2 library. -Just execute vms_make.com from the toplevel directory to build the -library. This procedure currently accepts the following options: - -DEBUG - Build the library with debug information and without optimization. - -lopts= - Options to pass to the link command e.g. lopts=/traceback - -ccopt= - Options to pass to the C compiler e.g. ccopt=/float=ieee - -In case you did download the demos, place them in a separate directory -sharing the same toplevel as the directory of Freetype2 and follow the -same instructions as above for the demos from there. The build -process relies on this to figure the location of the Freetype2 include -files. - - -To rebuild the sources it is necessary to have MMS/MMK installed on -the system. - -The library is available in the directory - - [.LIB] - -To compile applications using FreeType 2 you have to define the -logical FREETYPE pointing to the directory - - [.INCLUDE.FREETYPE] - -i.e., if the directory in which this INSTALL.VMS file is located is -$disk:[freetype] then define the logical with - - define freetype $disk:[freetype.include.freetype] - -This version has been tested with Compaq C V6.2-006 on OpenVMS Alpha -V7.2-1. - - - Any problems can be reported to - - Jouk Jansen or - Martin P.J. Zinser - ------------------------------------------------------------------------- - -Copyright 2000-2015 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. - - ---- end of INSTALL.VMS --- diff --git a/3party/freetype/docs/LICENSE.TXT b/3party/freetype/docs/LICENSE.TXT deleted file mode 100644 index 99dc342d76..0000000000 --- a/3party/freetype/docs/LICENSE.TXT +++ /dev/null @@ -1,37 +0,0 @@ - -The FreeType 2 font engine is copyrighted work and cannot be used -legally without a software license. In order to make this project -usable to a vast majority of developers, we distribute it under two -mutually exclusive open-source licenses. - -This means that *you* must choose *one* of the two licenses described -below, then obey all its terms and conditions when using FreeType 2 in -any of your projects or products. - - - The FreeType License, found in the file `FTL.TXT', which is similar - to the original BSD license *with* an advertising clause that forces - you to explicitly cite the FreeType project in your product's - documentation. All details are in the license file. This license - is suited to products which don't use the GNU General Public - License. - - Note that this license is compatible to the GNU General Public - License version 3, but not version 2. - - - The GNU General Public License version 2, found in `GPLv2.TXT' (any - later version can be used also), for programs which already use the - GPL. Note that the FTL is incompatible with GPLv2 due to its - advertisement clause. - -The contributed BDF and PCF drivers come with a license similar to that -of the X Window System. It is compatible to the above two licenses (see -file src/bdf/README and src/pcf/README). - -The gzip module uses the zlib license (see src/gzip/zlib.h) which too is -compatible to the above two licenses. - -The MD5 checksum support (only used for debugging in development builds) -is in the public domain. - - ---- end of LICENSE.TXT --- diff --git a/3party/freetype/docs/MAKEPP b/3party/freetype/docs/MAKEPP deleted file mode 100644 index 58eaf551df..0000000000 --- a/3party/freetype/docs/MAKEPP +++ /dev/null @@ -1,5 +0,0 @@ -As a special exception, FreeType can also be built with the 'makepp' -build tool, available from http://makepp.sourceforge.net. - -Note, however. that you will need at least version 1.19 and pass the -option --norc-substitution to have it work correctly. diff --git a/3party/freetype/docs/PROBLEMS b/3party/freetype/docs/PROBLEMS deleted file mode 100644 index 40bdc35a67..0000000000 --- a/3party/freetype/docs/PROBLEMS +++ /dev/null @@ -1,90 +0,0 @@ -This file describes various problems that have been encountered in -compiling, installing and running FreeType 2. Suggestions for -additions or other improvements to this file are welcome. - ----------------------------------------------------------------------- - -Running Problems -================ - - -* Some Type 1, Multiple Masters, and CID-keyed PostScript fonts aren't - handled correctly. - ------ - -Of course, there might be bugs in FreeType, but some fonts based on -the PostScript format can't be handled indeed. The reason is that -FreeType doesn't contain a full PostScript interpreter but applies -pattern matching instead. In case a font doesn't follow the standard -structure of the given font format, FreeType fails. A typical example -is Adobe's `Optima' font family which contains extra code to switch -between low and high resolution versions of the glyphs. - -It might be possible to patch FreeType in some situations, though. -Please report failing fonts so that we investigate the problem and set -up a list of such problematic fonts. - - -* Why do identical FreeType versions render differently on different - platforms? - ------ - -Different distributions compile FreeType with different options. The -developer version of a distribution's FreeType package, which is -needed to compile your program against FreeType, includes the file -ftoption.h. Compare each platform's copy of ftoption.h to find the -differences. - - ----------------------------------------------------------------------- - - -Compilation Problems -==================== - - -* I get an `internal compilation error' (ICE) while compiling FreeType - 2.2.1 with Intel C++. - - This has been reported for the following compiler version: - - Intel(R) C++ Compiler for 32-bit applications, - Version 9.0 Build 20050430Z Package ID: W_CC_P_9.0.019 - ------ - -The best solution is to update the compiler to version - - Intel(R) C++ Compiler for 32-bit applications, - Version 9.1 Build 20060323Z Package ID: W_CC_P_9.1.022 - -or newer. If this isn't feasible, apply the following patch. - - ---- src/cache/ftcbasic.c 20 Mar 2006 12:10:24 -0000 1.20 -+++ src/cache/ftcbasic.c.patched 15 May 2006 02:51:02 -0000 -@@ -252,7 +252,7 @@ - */ - - FT_CALLBACK_TABLE_DEF -- const FTC_IFamilyClassRec ftc_basic_image_family_class = -+ FTC_IFamilyClassRec ftc_basic_image_family_class = - { - { - sizeof ( FTC_BasicFamilyRec ), -@@ -266,7 +266,7 @@ - - - FT_CALLBACK_TABLE_DEF -- const FTC_GCacheClassRec ftc_basic_image_cache_class = -+ FTC_GCacheClassRec ftc_basic_image_cache_class = - { - { - ftc_inode_new, - - ----------------------------------------------------------------------- - ---- end of PROBLEMS --- diff --git a/3party/freetype/docs/TODO b/3party/freetype/docs/TODO deleted file mode 100644 index 43eeae349e..0000000000 --- a/3party/freetype/docs/TODO +++ /dev/null @@ -1,40 +0,0 @@ -Here is a list of items that need to be addressed in FreeType 2 ---------------------------------------------------------------- - -* Implement stem3/counter hints properly in the Postscript hinter. - -* Add CIDCMap support to the CID driver. - -* Add track kerning support to the PFR driver. - -* Add kerning (AFM file) support to the CID driver. - - -Here is a list of bugs which should be handled ----------------------------------------------- - -Other bugs have been registered at the savannah bugzilla of FreeType. - -* CID driver: - Handle the case where a CID font has a top-level font matrix also - (see PLRM, 5.11.3, Type 0 CIDFonts). Since CID_FaceInfoRec lacks - a font_matrix entry we have to directly apply it to all subfont - matrices. - -* CID driver: - Use top-level font matrix entry for setting the upem value, not the - entries in the FDarray. If absent, use 1000. - ------------------------------------------------------------------------- - -Copyright 2001-2015 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. - - ---- end of TODO --- diff --git a/3party/freetype/docs/VERSION.DLL b/3party/freetype/docs/VERSION.DLL deleted file mode 100644 index f219c9ac97..0000000000 --- a/3party/freetype/docs/VERSION.DLL +++ /dev/null @@ -1,129 +0,0 @@ -Due to our use of `libtool' to generate and install the FreeType 2 -libraries on Unix systems, as well as other historical events, it is -generally very difficult to know precisely which release of the font -engine is installed on a given system. - -This file tries to explain why and to document ways to properly detect -FreeType on Unix. - - -1. Version and Release numbers ------------------------------- - -For each new public release of FreeType 2, there are generally *three* -distinct `version' numbers to consider: - - * The official FreeType 2 release number, like 2.3.1 or 2.4.10. - - * The libtool (and Unix) specific version number, like 13.0.7. This - is what `freetype-config --version' returns. - - * The platform-specific shared object number, used for example when - the library is installed as `/usr/lib/libfreetype.so.6.7.1'. - -The platform-specific number is, unsurprisingly, platform-specific and -varies with the operating system you are using (several variants of -Linux, FreeBSD, Solaris, etc.). You should thus _never_ use it, even -for simple tests. - -The libtool-specific number does not equal the release number but is -tied to it. - -The release number is available at *compile* time through the following -macros defined in FT_FREETYPE_H: - - - FREETYPE_MAJOR: major release number - - FREETYPE_MINOR: minor release number - - FREETYPE_PATCH: patch release number - -See below for a small autoconf fragment. - -The release number is also available at *runtime* through the -`FT_Library_Version' API. - - -2. History ----------- - -The following table gives, for all releases since 2.3.0, the -corresponding libtool number, as well as the shared object number found -on _most_ systems, but not all of them: - - - release libtool so - ------------------------------- - 2.6.0 18.0.12 6.12.0 - 2.5.5 17.4.11 6.11.4 - 2.5.4 17.3.11 6.11.3 - 2.5.3 17.2.11 6.11.2 - 2.5.2 17.1.11 6.11.1 - 2.5.1 17.0.11 6.11.0 - 2.5.0 16.2.10 6.10.2 - 2.4.12 16.1.10 6.10.1 - 2.4.11 16.0.10 6.10.0 - 2.4.10 15.0.9 6.9.0 - 2.4.9 14.1.8 6.8.1 - 2.4.8 14.0.8 6.8.0 - 2.4.7 13.2.7 6.7.2 - 2.4.6 13.1.7 6.7.1 - 2.4.5 13.0.7 6.7.0 - 2.4.4 12.2.6 6.6.2 - 2.4.3 12.1.6 6.6.1 - 2.4.2 12.0.6 6.6.0 - 2.4.1 11.1.5 6.5.1 - 2.4.0 11.0.5 6.5.0 - 2.3.12 10.0.4 6.4.0 - 2.3.11 9.22.3 6.3.22 - 2.3.10 9.21.3 6.3.21 - 2.3.9 9.20.3 6.3.20 - 2.3.8 9.19.3 6.3.19 - 2.3.7 9.18.3 6.3.18 - 2.3.6 9.17.3 6.3.17 - 2.3.5 9.16.3 6.3.16 - 2.3.4 9.15.3 6.3.15 - 2.3.3 9.14.3 6.3.14 - 2.3.2 9.13.3 6.3.13 - 2.3.1 9.12.3 6.3.12 - 2.3.0 9.11.3 6.3.11 - - -3. Autoconf Code Fragment -------------------------- - -Lars Clausen contributed the following autoconf fragment to detect which -version of FreeType is installed on a system. This one tests for a -version that is at least 2.0.9; you should change it to check against -other release numbers. - - - AC_MSG_CHECKING([whether FreeType version is 2.0.9 or higher]) - old_CPPFLAGS="$CPPFLAGS" - CPPFLAGS=`freetype-config --cflags` - AC_TRY_CPP([ - -#include -#include FT_FREETYPE_H -#if (FREETYPE_MAJOR*1000 + FREETYPE_MINOR)*1000 + FREETYPE_PATCH < 2000009 -#error Freetype version too low. -#endif - ], - [AC_MSG_RESULT(yes) - FREETYPE_LIBS=`freetype-config --libs` - AC_SUBST(FREETYPE_LIBS) - AC_DEFINE(HAVE_FREETYPE,1,[Define if you have the FreeType2 library]) - CPPFLAGS="$old_CPPFLAGS"], - [AC_MSG_ERROR([Need FreeType library version 2.0.9 or higher])]) - ------------------------------------------------------------------------- - -Copyright 2002-2015 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. - - ---- end of VERSION.DLL --- diff --git a/3party/freetype/docs/formats.txt b/3party/freetype/docs/formats.txt deleted file mode 100644 index 2439198504..0000000000 --- a/3party/freetype/docs/formats.txt +++ /dev/null @@ -1,178 +0,0 @@ -This file contains a list of various font formats. It gives the -reference document and whether it is supported in FreeType 2. - - - file type: - The only special case is `MAC'; on older Mac OS versions, a `file' - is stored as a data and a resource fork, this is, within two - separate data chunks. In all other cases, the font data is stored - in a single file. - - wrapper format: - The format used to represent the font data. In the table below it - is used only if the font format differs. Possible values are `SFNT' - (binary), `PS' (a text header, followed by binary or text data), - `LZW' (compressed with either `gzip' or `compress'), and - `BZ2' (compressed with `bzip2`). - - font format: - How the font is to be accessed, possibly after converting the file - type and wrapper format into a generic form. Bitmap formats are - `BDF', `PCF', and one form of `WINFNT'; all others are vector - formats. - - font type: - Sub-formats of the font format. `SBIT' and `MACSBIT' are bitmap - formats, `MM' and `VAR' support optical axes. - - glyph access: - If not specified, the glyph access is `standard' to the font format. - Values are `CID' for CID-keyed fonts, `SYNTHETIC' for fonts which - are modified versions of other fonts by means of a transformation - matrix, `COLLECTION' for collecting multiple fonts (sharing most of - the data) into a single file, and `TYPE_0' for PS fonts which are to - be accessed in a tree-like structure. - - FreeType driver: - The module in the FreeType library which handles the specific font - format. A missing entry means that FreeType doesn't support the - font format (yet). - - -Please send additions and/or corrections to wl@gnu.org or to the -FreeType developer's list at freetype-devel@nongnu.org (for subscribers -only). If you can provide a font example for a format which isn't -supported yet please send a mail too. - - -file wrapper font font glyph FreeType reference -type format format type access driver documents ----------------------------------------------------------------------------- - ---- --- BDF --- --- bdf 5005.BDF_Spec.pdf, X11 - - ---- SFNT PS TYPE_1 --- type1 Type 1 GX Font Format - (for the Mac) [3] -MAC SFNT PS TYPE_1 --- type1 Type 1 GX Font Format - (for the Mac) [3] ---- SFNT PS TYPE_1 CID cid 5180.sfnt.pdf (for the Mac) - [3] -MAC SFNT PS TYPE_1 CID cid 5180.sfnt.pdf (for the Mac) - [3] ---- SFNT PS CFF --- cff OT spec, 5176.CFF.pdf - (`OTTO' format) -MAC SFNT PS CFF --- cff OT spec, 5176.CFF.pdf - (`OTTO' format) ---- SFNT PS CFF CID cff OT spec, 5176.CFF.pdf -MAC SFNT PS CFF CID cff OT spec, 5176.CFF.pdf ---- SFNT PS CFF SYNTHETIC --- OT spec, 5176.CFF.pdf -MAC SFNT PS CFF SYNTHETIC --- OT spec, 5176.CFF.pdf ---- SFNT TT SBIT --- sfnt XFree86 (bitmaps only; - with `head' table) ---- SFNT TT MACSBIT --- sfnt OT spec (for the Mac; - bitmaps only; `bhed' table) -MAC SFNT TT MACSBIT --- sfnt OT spec (for the Mac; - bitmaps only; `bhed' table) ---- SFNT TT --- --- truetype OT spec (`normal' TT font) -MAC SFNT TT --- --- truetype OT spec (`normal' TT font) -MAC SFNT TT VAR --- truetype GX spec (`?var' tables) ---- SFNT TT --- COLLECTION truetype OT spec (this can't be CFF) -MAC SFNT TT --- COLLECTION truetype OT spec (this can't be CFF) - - ---- --- PS TYPE_1 --- type1 T1_SPEC.pdf - (`normal' Type 1 font) -MAC --- PS TYPE_1 --- type1 T1_SPEC.pdf - (`normal' Type 1 font) ---- --- PS TYPE_1 CID cid PLRM.pdf (CID Font Type 0; - Type 9 font) ---- --- PS MM --- type1 5015.Type1_Supp.pdf - (Multiple Masters) ---- --- PS CFF --- cff 5176.CFF.pdf (`pure' CFF) ---- --- PS CFF CID cff 5176.CFF.pdf (`pure' CFF) ---- --- PS CFF SYNTHETIC --- 5176.CFF.pdf (`pure' CFF) ---- PS PS CFF --- --- PLRM.pdf (Type 2) [1] ---- PS PS CFF CID --- PLRM.pdf (Type 2) [1] ---- PS PS CFF SYNTHETIC --- PLRM.pdf (Type 2) [1] ---- --- PS --- TYPE_0 --- PLRM.pdf ---- --- PS TYPE_3 --- --- PLRM.pdf (never supported) ---- --- PS TYPE_3 CID --- PLRM.pdf (CID Font Type 1; - Type 10 font; never supported) ---- PS PS TYPE_14 --- --- PLRM.pdf (Chameleon font; - Type 14 font; never supported?) ---- --- PS TYPE_32 CID --- PLRM.pdf (CID Font Type 4; - Type 32 font; never supported?) ---- PS TT --- --- type42 5012.Type42_Spec.pdf - (Type 42 font) ---- PS TT --- CID --- PLRM.pdf (CID Font Type 2; - Type 11 font) - - ---- ? ? CEF ? cff ? - - ---- --- PCF --- --- pcf X11 [4] ---- LZW PCF --- --- pcf X11 [4] ---- BZ2 PCF --- --- pcf X11 [4] - - ---- --- PFR PFR0 --- pfr [2] ---- --- PFR PFR1 --- --- (undocumented, proprietary; - probably never supported) - - ---- --- WINFNT --- --- winfonts Windows developer's notes [5] ---- --- WINFNT VECTOR --- --- Windows developer's notes [5] - - -[1] Support should be rather simple since this is identical to `CFF' but - in a PS wrapper. - -[2] Official PFR specification: - - http://www.bitstream.com/categories/developer/truedoc/pfrspec.html - http://www.bitstream.com/categories/developer/truedoc/pfrspec1.2.pdf - - The syntax of the auxiliary data is not defined there, but is - partially defined in MHP 1.0.3 (also called ETSI TS 101812 V1.3.1) - section 7.4. - - http://www.etsi.org/ - http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=18799 - - (free registration required). - -[3] Support is rudimentary currently; some tables are not loaded yet. - -[4] See - - THE X WINDOW SYSTEM SERVER: X VERSION 11, RELEASE 5 - Elias Israel, Erik Fortune, Digital Press, 1992 - ISBN 1-55558-096-3 - - for a specification given in Appendix D on pgs. 436-450. However, - this information might be out of date; unfortunately, there is no - PCF specification available online, and this book is out of print. - George Williams deduced the font format from the X11 sources and - documented it for his FontForge font editor: - - http://fontforge.sourceforge.net/pcf-format.html - -[5] This is from MS Windows 3; see Microsoft's Knowledge Base article at - - http://support.microsoft.com/kb/65123 - ------------------------------------------------------------------------- - -Copyright 2004-2015 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. - - ---- end of formats.txt --- diff --git a/3party/freetype/docs/freetype-config.1 b/3party/freetype/docs/freetype-config.1 deleted file mode 100644 index cdab34b513..0000000000 --- a/3party/freetype/docs/freetype-config.1 +++ /dev/null @@ -1,108 +0,0 @@ -.TH FREETYPE-CONFIG 1 "June 2015" "FreeType 2.6" -. -. -.SH NAME -. -freetype-config \- Get information about a libfreetype installation -. -. -.SH SYNOPSIS -. -.B freetype-config -.RI [ options ] -. -. -.SH DESCRIPTION -. -.B freetype-config -returns information needed for compiling and linking programs with the -FreeType library, such as linker flags and compilation parameters. -. -Alternatively, it can be used to query information about the -FreeType library version installed on the system, such as the -installation (directory path) prefix or the FreeType version number. -. -.PP -This program is part of the FreeType package. -. -. -.SH OPTIONS -. -There are two types of options: output/display selection options, and -path override options. -. -. -.SS Output selection options -. -Only one of the output selection options should be given at each program -invocation. -. -.TP -.B \-\-prefix -Return the prefix value of the installed FreeType library (the default -prefix will be `/usr' in most cases for distribution-installed -packages). -. -.TP -.B \-\-exec-prefix -Return the executable prefix value of the installed FreeType library -(will often be the same as the prefix value). -. -.TP -.B \-\-ftversion -Return the FreeType version number. -. -.TP -.B \-\-version -Return the `libtool version' of the FreeType library. -. -.TP -.B \-\-libtool -Return the library name for linking with libtool. -. -.TP -.B \-\-libs -Return compiler flags for linking with the installed FreeType library. -. -.TP -.B \-\-cflags -Return compiler flags for compiling against the installed FreeType library. -. -.TP -.B \-\-static -Make command line options display flags for static linking. -. -. -.SS Path override options -. -These affect any selected output option, except the libtool version -returned by `--version'. -. -.TP -.BI \-\-prefix= PREFIX -Override `--prefix' value with -.IR PREFIX . -. -.TP -.BI \-\-exec-prefix= EPREFIX -Override `--exec-prefix' value with -.IR EPREFIX . -. -. -.SH BUGS -In case the libraries FreeType links to are located in non-standard -directories, the output from option -.B \-\-libs -might be incomplete. -It is thus recommended to use the -.BR pkg-config (1) -interface instead, which is able to correctly resolve all dependencies. -. -. -.SH AUTHOR -. -This manual page was contributed by Nis Martensen , -with further refinements from the FreeType team. -. -. -.\" eof diff --git a/3party/freetype/docs/raster.txt b/3party/freetype/docs/raster.txt deleted file mode 100644 index dc55d64e59..0000000000 --- a/3party/freetype/docs/raster.txt +++ /dev/null @@ -1,635 +0,0 @@ - - How FreeType's rasterizer work - - by David Turner - - Revised 2007-Feb-01 - - -This file is an attempt to explain the internals of the FreeType -rasterizer. The rasterizer is of quite general purpose and could -easily be integrated into other programs. - - - I. Introduction - - II. Rendering Technology - 1. Requirements - 2. Profiles and Spans - a. Sweeping the Shape - b. Decomposing Outlines into Profiles - c. The Render Pool - d. Computing Profiles Extents - e. Computing Profiles Coordinates - f. Sweeping and Sorting the Spans - - -I. Introduction -=============== - - A rasterizer is a library in charge of converting a vectorial - representation of a shape into a bitmap. The FreeType rasterizer - has been originally developed to render the glyphs found in - TrueType files, made up of segments and second-order Béziers. - Meanwhile it has been extended to render third-order Bézier curves - also. This document is an explanation of its design and - implementation. - - While these explanations start from the basics, a knowledge of - common rasterization techniques is assumed. - - -II. Rendering Technology -======================== - -1. Requirements ---------------- - - We assume that all scaling, rotating, hinting, etc., has been - already done. The glyph is thus described by a list of points in - the device space. - - - All point coordinates are in the 26.6 fixed float format. The - used orientation is: - - - ^ y - | reference orientation - | - *----> x - 0 - - - `26.6' means that 26 bits are used for the integer part of a - value and 6 bits are used for the fractional part. - Consequently, the `distance' between two neighbouring pixels is - 64 `units' (1 unit = 1/64th of a pixel). - - Note that, for the rasterizer, pixel centers are located at - integer coordinates. The TrueType bytecode interpreter, - however, assumes that the lower left edge of a pixel (which is - taken to be a square with a length of 1 unit) has integer - coordinates. - - - ^ y ^ y - | | - | (1,1) | (0.5,0.5) - +-----------+ +-----+-----+ - | | | | | - | | | | | - | | | o-----+-----> x - | | | (0,0) | - | | | | - o-----------+-----> x +-----------+ - (0,0) (-0.5,-0.5) - - TrueType bytecode interpreter FreeType rasterizer - - - A pixel line in the target bitmap is called a `scanline'. - - - A glyph is usually made of several contours, also called - `outlines'. A contour is simply a closed curve that delimits an - outer or inner region of the glyph. It is described by a series - of successive points of the points table. - - Each point of the glyph has an associated flag that indicates - whether it is `on' or `off' the curve. Two successive `on' - points indicate a line segment joining the two points. - - One `off' point amidst two `on' points indicates a second-degree - (conic) Bézier parametric arc, defined by these three points - (the `off' point being the control point, and the `on' ones the - start and end points). Similarly, a third-degree (cubic) Bézier - curve is described by four points (two `off' control points - between two `on' points). - - Finally, for second-order curves only, two successive `off' - points forces the rasterizer to create, during rendering, an - `on' point amidst them, at their exact middle. This greatly - facilitates the definition of successive Bézier arcs. - - The parametric form of a second-order Bézier curve is: - - P(t) = (1-t)^2*P1 + 2*t*(1-t)*P2 + t^2*P3 - - (P1 and P3 are the end points, P2 the control point.) - - The parametric form of a third-order Bézier curve is: - - P(t) = (1-t)^3*P1 + 3*t*(1-t)^2*P2 + 3*t^2*(1-t)*P3 + t^3*P4 - - (P1 and P4 are the end points, P2 and P3 the control points.) - - For both formulae, t is a real number in the range [0..1]. - - Note that the rasterizer does not use these formulae directly. - They exhibit, however, one very useful property of Bézier arcs: - Each point of the curve is a weighted average of the control - points. - - As all weights are positive and always sum up to 1, whatever the - value of t, each arc point lies within the triangle (polygon) - defined by the arc's three (four) control points. - - In the following, only second-order curves are discussed since - rasterization of third-order curves is completely identical. - - Here some samples for second-order curves. - - - * # on curve - * off curve - __---__ - #-__ _-- -_ - --__ _- - - --__ # \ - --__ # - -# - Two `on' points - Two `on' points and one `off' point - between them - - * - # __ Two `on' points with two `off' - \ - - points between them. The point - \ / \ marked `0' is the middle of the - - 0 \ `off' points, and is a `virtual - -_ _- # on' point where the curve passes. - -- It does not appear in the point - * list. - - -2. Profiles and Spans ---------------------- - - The following is a basic explanation of the _kind_ of computations - made by the rasterizer to build a bitmap from a vector - representation. Note that the actual implementation is slightly - different, due to performance tuning and other factors. - - However, the following ideas remain in the same category, and are - more convenient to understand. - - - a. Sweeping the Shape - - The best way to fill a shape is to decompose it into a number of - simple horizontal segments, then turn them on in the target - bitmap. These segments are called `spans'. - - __---__ - _-- -_ - _- - - - \ - / \ - / \ - | \ - - __---__ Example: filling a shape - _----------_ with spans. - _-------------- - ----------------\ - /-----------------\ This is typically done from the top - / \ to the bottom of the shape, in a - | | \ movement called a `sweep'. - V - - __---__ - _----------_ - _-------------- - ----------------\ - /-----------------\ - /-------------------\ - |---------------------\ - - - In order to draw a span, the rasterizer must compute its - coordinates, which are simply the x coordinates of the shape's - contours, taken on the y scanlines. - - - /---/ |---| Note that there are usually - /---/ |---| several spans per scanline. - | /---/ |---| - | /---/_______|---| When rendering this shape to the - V /----------------| current scanline y, we must - /-----------------| compute the x values of the - a /----| |---| points a, b, c, and d. - - - - * * - - - - * * - - y - - / / b c| |d - - - /---/ |---| - /---/ |---| And then turn on the spans a-b - /---/ |---| and c-d. - /---/_______|---| - /----------------| - /-----------------| - a /----| |---| - - - - ####### - - - - ##### - - y - - / / b c| |d - - - b. Decomposing Outlines into Profiles - - For each scanline during the sweep, we need the following - information: - - o The number of spans on the current scanline, given by the - number of shape points intersecting the scanline (these are - the points a, b, c, and d in the above example). - - o The x coordinates of these points. - - x coordinates are computed before the sweep, in a phase called - `decomposition' which converts the glyph into *profiles*. - - Put it simply, a `profile' is a contour's portion that can only - be either ascending or descending, i.e., it is monotonic in the - vertical direction (we also say y-monotonic). There is no such - thing as a horizontal profile, as we shall see. - - Here are a few examples: - - - this square - 1 2 - ---->---- is made of two - | | | | - | | profiles | | - ^ v ^ + v - | | | | - | | | | - ----<---- - - up down - - - this triangle - - P2 1 2 - - |\ is made of two | \ - ^ | \ \ | \ - | | \ \ profiles | \ | - | | \ v ^ | \ | - | \ | | + \ v - | \ | | \ - P1 ---___ \ ---___ \ - ---_\ ---_ \ - <--__ P3 up down - - - - A more general contour can be made of more than two profiles: - - __ ^ - / | / ___ / | - / | / | / | / | - | | / / => | v / / - | | | | | | ^ | - ^ | |___| | | ^ + | + | + v - | | | v | | - | | | up | - |___________| | down | - - <-- up down - - - Successive profiles are always joined by horizontal segments - that are not part of the profiles themselves. - - For the rasterizer, a profile is simply an *array* that - associates one horizontal *pixel* coordinate to each bitmap - *scanline* crossed by the contour's section containing the - profile. Note that profiles are *oriented* up or down along the - glyph's original flow orientation. - - In other graphics libraries, profiles are also called `edges' or - `edgelists'. - - - c. The Render Pool - - FreeType has been designed to be able to run well on _very_ - light systems, including embedded systems with very few memory. - - A render pool will be allocated once; the rasterizer uses this - pool for all its needs by managing this memory directly in it. - The algorithms that are used for profile computation make it - possible to use the pool as a simple growing heap. This means - that this memory management is actually quite easy and faster - than any kind of malloc()/free() combination. - - Moreover, we'll see later that the rasterizer is able, when - dealing with profiles too large and numerous to lie all at once - in the render pool, to immediately decompose recursively the - rendering process into independent sub-tasks, each taking less - memory to be performed (see `sub-banding' below). - - The render pool doesn't need to be large. A 4KByte pool is - enough for nearly all renditions, though nearly 100% slower than - a more comfortable 16KByte or 32KByte pool (that was tested with - complex glyphs at sizes over 500 pixels). - - - d. Computing Profiles Extents - - Remember that a profile is an array, associating a _scanline_ to - the x pixel coordinate of its intersection with a contour. - - Though it's not exactly how the FreeType rasterizer works, it is - convenient to think that we need a profile's height before - allocating it in the pool and computing its coordinates. - - The profile's height is the number of scanlines crossed by the - y-monotonic section of a contour. We thus need to compute these - sections from the vectorial description. In order to do that, - we are obliged to compute all (local and global) y extrema of - the glyph (minima and maxima). - - - P2 For instance, this triangle has only - two y-extrema, which are simply - |\ - | \ P2.y as a vertical maximum - | \ P3.y as a vertical minimum - | \ - | \ P1.y is not a vertical extremum (though - | \ it is a horizontal minimum, which we - P1 ---___ \ don't need). - ---_\ - P3 - - - Note that the extrema are expressed in pixel units, not in - scanlines. The triangle's height is certainly (P3.y-P2.y+1) - pixel units, but its profiles' heights are computed in - scanlines. The exact conversion is simple: - - - min scanline = FLOOR ( min y ) - - max scanline = CEILING( max y ) - - A problem arises with Bézier Arcs. While a segment is always - necessarily y-monotonic (i.e., flat, ascending, or descending), - which makes extrema computations easy, the ascent of an arc can - vary between its control points. - - - P2 - * - # on curve - * off curve - __-x--_ - _-- -_ - P1 _- - A non y-monotonic Bézier arc. - # \ - - The arc goes from P1 to P3. - \ - \ P3 - # - - - We first need to be able to easily detect non-monotonic arcs, - according to their control points. I will state here, without - proof, that the monotony condition can be expressed as: - - P1.y <= P2.y <= P3.y for an ever-ascending arc - - P1.y >= P2.y >= P3.y for an ever-descending arc - - with the special case of - - P1.y = P2.y = P3.y where the arc is said to be `flat'. - - As you can see, these conditions can be very easily tested. - They are, however, extremely important, as any arc that does not - satisfy them necessarily contains an extremum. - - Note also that a monotonic arc can contain an extremum too, - which is then one of its `on' points: - - - P1 P2 - #---__ * P1P2P3 is ever-descending, but P1 - -_ is an y-extremum. - - - ---_ \ - -> \ - \ P3 - # - - - Let's go back to our previous example: - - - P2 - * - # on curve - * off curve - __-x--_ - _-- -_ - P1 _- - A non-y-monotonic Bézier arc. - # \ - - Here we have - \ P2.y >= P1.y && - \ P3 P2.y >= P3.y (!) - # - - - We need to compute the vertical maximum of this arc to be able - to compute a profile's height (the point marked by an `x'). The - arc's equation indicates that a direct computation is possible, - but we rely on a different technique, which use will become - apparent soon. - - Bézier arcs have the special property of being very easily - decomposed into two sub-arcs, which are themselves Bézier arcs. - Moreover, it is easy to prove that there is at most one vertical - extremum on each Bézier arc (for second-degree curves; similar - conditions can be found for third-order arcs). - - For instance, the following arc P1P2P3 can be decomposed into - two sub-arcs Q1Q2Q3 and R1R2R3: - - - P2 - * - # on curve - * off curve - - - original Bézier arc P1P2P3. - __---__ - _-- --_ - _- -_ - - - - / \ - / \ - # # - P1 P3 - - - - P2 - * - - - - Q3 Decomposed into two subarcs - Q2 R2 Q1Q2Q3 and R1R2R3 - * __-#-__ * - _-- --_ - _- R1 -_ Q1 = P1 R3 = P3 - - - Q2 = (P1+P2)/2 R2 = (P2+P3)/2 - / \ - / \ Q3 = R1 = (Q2+R2)/2 - # # - Q1 R3 Note that Q2, R2, and Q3=R1 - are on a single line which is - tangent to the curve. - - - We have then decomposed a non-y-monotonic Bézier curve into two - smaller sub-arcs. Note that in the above drawing, both sub-arcs - are monotonic, and that the extremum is then Q3=R1. However, in - a more general case, only one sub-arc is guaranteed to be - monotonic. Getting back to our former example: - - - Q2 - * - - __-x--_ R1 - _-- #_ - Q1 _- Q3 - R2 - # \ * - - - \ - \ R3 - # - - - Here, we see that, though Q1Q2Q3 is still non-monotonic, R1R2R3 - is ever descending: We thus know that it doesn't contain the - extremum. We can then re-subdivide Q1Q2Q3 into two sub-arcs and - go on recursively, stopping when we encounter two monotonic - subarcs, or when the subarcs become simply too small. - - We will finally find the vertical extremum. Note that the - iterative process of finding an extremum is called `flattening'. - - - e. Computing Profiles Coordinates - - Once we have the height of each profile, we are able to allocate - it in the render pool. The next task is to compute coordinates - for each scanline. - - In the case of segments, the computation is straightforward, - using the Euclidean algorithm (also known as Bresenham). - However, for Bézier arcs, the job is a little more complicated. - - We assume that all Béziers that are part of a profile are the - result of flattening the curve, which means that they are all - y-monotonic (ascending or descending, and never flat). We now - have to compute the intersections of arcs with the profile's - scanlines. One way is to use a similar scheme to flattening - called `stepping'. - - - Consider this arc, going from P1 to - --------------------- P3. Suppose that we need to - compute its intersections with the - drawn scanlines. As already - --------------------- mentioned this can be done - directly, but the involved - * P2 _---# P3 algorithm is far too slow. - ------------- _-- -- - _- - _/ Instead, it is still possible to - ---------/----------- use the decomposition property in - / the same recursive way, i.e., - | subdivide the arc into subarcs - ------|-------------- until these get too small to cross - | more than one scanline! - | - -----|--------------- This is very easily done using a - | rasterizer-managed stack of - | subarcs. - # P1 - - - f. Sweeping and Sorting the Spans - - Once all our profiles have been computed, we begin the sweep to - build (and fill) the spans. - - As both the TrueType and Type 1 specifications use the winding - fill rule (but with opposite directions), we place, on each - scanline, the present profiles in two separate lists. - - One list, called the `left' one, only contains ascending - profiles, while the other `right' list contains the descending - profiles. - - As each glyph is made of closed curves, a simple geometric - property ensures that the two lists contain the same number of - elements. - - Creating spans is thus straightforward: - - 1. We sort each list in increasing horizontal order. - - 2. We pair each value of the left list with its corresponding - value in the right list. - - - / / | | For example, we have here - / / | | four profiles. Two of - >/ / | | | them are ascending (1 & - 1// / ^ | | | 2 3), while the two others - // // 3| | | v are descending (2 & 4). - / //4 | | | On the given scanline, - a / /< | | the left list is (1,3), - - - - *-----* - - - - *---* - - y - and the right one is - / / b c| |d (4,2) (sorted). - - There are then two spans, joining - 1 to 4 (i.e. a-b) and 3 to 2 - (i.e. c-d)! - - - Sorting doesn't necessarily take much time, as in 99 cases out - of 100, the lists' order is kept from one scanline to the next. - We can thus implement it with two simple singly-linked lists, - sorted by a classic bubble-sort, which takes a minimum amount of - time when the lists are already sorted. - - A previous version of the rasterizer used more elaborate - structures, like arrays to perform `faster' sorting. It turned - out that this old scheme is not faster than the one described - above. - - Once the spans have been `created', we can simply draw them in - the target bitmap. - ------------------------------------------------------------------------- - -Copyright 2003-2015 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. - - ---- end of raster.txt --- - -Local Variables: -coding: utf-8 -End: diff --git a/3party/freetype/docs/reference/README b/3party/freetype/docs/reference/README deleted file mode 100644 index 51b04d6f15..0000000000 --- a/3party/freetype/docs/reference/README +++ /dev/null @@ -1,5 +0,0 @@ -After saying `make refdoc' this directory contains the FreeType API -reference. You need python to make this target. - -This also works with Jam: Just type `jam refdoc' in the main directory. - diff --git a/3party/freetype/docs/release b/3party/freetype/docs/release deleted file mode 100644 index 4c692e9eb2..0000000000 --- a/3party/freetype/docs/release +++ /dev/null @@ -1,202 +0,0 @@ -How to prepare a new release ----------------------------- - -. include/freetype/freetype.h: Update FREETYPE_MAJOR, FREETYPE_MINOR, - and FREETYPE_PATCH. - -. Update version numbers in all files where necessary (for example, do - a grep for both `2.3.1' and `231' for release 2.3.1). - -. builds/unix/configure.raw: Update `version_info'. - -. docs/CHANGES: Document differences to last release. - -. README: Update. - -. docs/VERSION.DLL: Document changed `version_info'. - -. ChangeLog: Announce new release (both in the freetype2 and - freetype2-demos modules). - -. Clone the git archive to another directory with - - git clone -l -s . ../freetype2.test - - or something like this and run - - make distclean; make devel; make - make distclean; make devel; make multi - make distclean; make devel CC=g++; make CC=g++ - make distclean; make devel CC=g++; make multi CC=g++ - - sh autogen.sh - make distclean; ./configure; make - make distclean; ./configure CC=g++; make - - in the cloned repository to test compilation with both gcc and g++. - -. Test C++ compilation for freetype2-demos too (using `git clone' as - above). - -. Run src/tools/chktrcmp.py and check that there are no undefined - trace_XXXX macros. - -. After pushing the new release, tag the git repositories (freetype2, - freetype2-demos) with - - git tag VER- -m "" -u - - and push the tags with - - git push --tags - -. Check with - - git clean -ndx - - that the git directory is really clean (and remove extraneous files - if necessary). - -. Say `make dist' in both the freetype2 and freetype2-demos modules - to generate the .tar.gz, .tar.bz2, and .zip files. - -. Create the doc bundles (freetype-doc-.tar.gz, - freetype-doc-.tar.bz2, ftdoc.zip). This is - everything in - - /freetype2/docs - - except the `reference' subdirectory. Do *not* use option `-l' from - zip! - -. Run the following script (with updated `$VERSION', `$SAVANNAH_USER', - and $SOURCEFORGE_USER variables) to sign and upload the bundles to - both Savannah and SourceForge. The signing code has been taken from - the `gnupload' script (part of the automake bundle). - - #!/bin/sh - - VERSION=2.5.1 - SAVANNAH_USER=wl - SOURCEFORGE_USER=wlemb - - ##################################################################### - - GPG='/usr/bin/gpg --batch --no-tty' - - version=`echo $VERSION | sed "s/\\.//g"` - - FREETYPE_PACKAGES="freetype-$VERSION.tar.gz \ - freetype-$VERSION.tar.bz2 \ - ft$version.zip" - FT2DEMOS_PACKAGES="ft2demos-$VERSION.tar.gz \ - ft2demos-$VERSION.tar.bz2 \ - ftdmo$version.zip" - FTDOC_PACKAGES="freetype-doc-$VERSION.tar.gz \ - freetype-doc-$VERSION.tar.bz2 \ - ftdoc$version.zip" - - PACKAGE_LIST="$FREETYPE_PACKAGES \ - $FT2DEMOS_PACKAGES \ - $FTDOC_PACKAGES" - - set -e - unset passphrase - - PATH=/empty echo -n "Enter GPG passphrase: " - stty -echo - read -r passphrase - stty echo - echo - - for f in $PACKAGE_LIST; do - if test ! -f $f; then - echo "$0: Cannot find \`$f'" 1>&2 - exit 1 - else - : - fi - done - - for f in $PACKAGE_LIST; do - echo "Signing $f..." - rm -f $f.sig - echo $passphrase | $GPG --passphrase-fd 0 -ba -o $f.sig $f - done - - FREETYPE_SIGNATURES= - for i in $FREETYPE_PACKAGES; do - FREETYPE_SIGNATURES="$FREETYPE_SIGNATURES $i.sig" - done - - FT2DEMOS_SIGNATURES= - for i in $FT2DEMOS_PACKAGES; do - FT2DEMOS_SIGNATURES="$FT2DEMOS_SIGNATURES $i.sig" - done - - FTDOC_SIGNATURES= - for i in $FTDOC_PACKAGES; do - FTDOC_SIGNATURES="$FTDOC_SIGNATURES $i.sig" - done - - SIGNATURE_LIST="$FREETYPE_SIGNATURES \ - $FT2DEMOS_SIGNATURES \ - $FTDOC_SIGNATURES" - - scp $PACKAGE_LIST $SIGNATURE_LIST \ - $SAVANNAH_USER@dl.sv.nongnu.org:/releases/freetype/ - - rsync -avP -e ssh $FREETYPE_PACKAGES $FREETYPE_SIGNATURES \ - $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype2/$VERSION/ - rsync -avP -e ssh $FT2DEMOS_PACKAGES $FT2DEMOS_SIGNATURES \ - $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype-demos/$VERSION/ - rsync -avP -e ssh $FTDOC_PACKAGES $FTDOC_SIGNATURES \ - $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype-docs/$VERSION/ - - # EOF - -. Prepare a README for SourceForge and upload it with the following - script (with updated `$VERSION' and $SOURCEFORGE_USER variables). - - #!/bin/sh - - VERSION=2.5.1 - SOURCEFORGE_USER=wlemb - - ##################################################################### - - rsync -avP -e ssh README \ - $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype2/$VERSION/ - - # EOF - -. On SourceForge, tag the just uploaded `ftXXX.zip' and - `freetype-XXX.tar.bz2' files as the default files to download for - `Windows' and `Others', respectively. - -. Copy the reference files (generated by `make dist') to - - /freetype2/docs/reference - -. Update the `freetype-web' repository. `git push' then automatically - triggers an update of the public web pages within ten minutes, due - to a cron script (on wl@freedesktop.org) that rsyncs with - - freedesktop.org://srv/freetype.freedesktop.org/www - -. Announce new release on freetype-announce@nongnu.org and to relevant - newsgroups. - ----------------------------------------------------------------------- - -Copyright 2003-2015 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. - - ---- end of release --- diff --git a/3party/freetype/include/freetype/config/ftconfig.h b/3party/freetype/include/freetype/config/ftconfig.h deleted file mode 100644 index d4d79936df..0000000000 --- a/3party/freetype/include/freetype/config/ftconfig.h +++ /dev/null @@ -1,467 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftconfig.h */ -/* */ -/* ANSI-specific configuration file (specification only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This header file contains a number of macro definitions that are used */ - /* by the rest of the engine. Most of the macros here are automatically */ - /* determined at compile time, and you should not need to change it to */ - /* port FreeType, except to compile the library with a non-ANSI */ - /* compiler. */ - /* */ - /* Note however that if some specific modifications are needed, we */ - /* advise you to place a modified copy in your build directory. */ - /* */ - /* The build directory is usually `builds/', and contains */ - /* system-specific files that are always included first when building */ - /* the library. */ - /* */ - /* This ANSI version should stay in `include/config/'. */ - /* */ - /*************************************************************************/ - -#ifndef __FTCONFIG_H__ -#define __FTCONFIG_H__ - -#include -#include FT_CONFIG_OPTIONS_H -#include FT_CONFIG_STANDARD_LIBRARY_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ - /* */ - /* These macros can be toggled to suit a specific system. The current */ - /* ones are defaults used to compile FreeType in an ANSI C environment */ - /* (16bit compilers are also supported). Copy this file to your own */ - /* `builds/' directory, and edit it to port the engine. */ - /* */ - /*************************************************************************/ - - - /* There are systems (like the Texas Instruments 'C54x) where a `char' */ - /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ - /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ - /* is probably unexpected. */ - /* */ - /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ - /* `char' type. */ - -#ifndef FT_CHAR_BIT -#define FT_CHAR_BIT CHAR_BIT -#endif - - - /* The size of an `int' type. */ -#if FT_UINT_MAX == 0xFFFFUL -#define FT_SIZEOF_INT (16 / FT_CHAR_BIT) -#elif FT_UINT_MAX == 0xFFFFFFFFUL -#define FT_SIZEOF_INT (32 / FT_CHAR_BIT) -#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL -#define FT_SIZEOF_INT (64 / FT_CHAR_BIT) -#else -#error "Unsupported size of `int' type!" -#endif - - /* The size of a `long' type. A five-byte `long' (as used e.g. on the */ - /* DM642) is recognized but avoided. */ -#if FT_ULONG_MAX == 0xFFFFFFFFUL -#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) -#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL -#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) -#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL -#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT) -#else -#error "Unsupported size of `long' type!" -#endif - - - /* FT_UNUSED is a macro used to indicate that a given parameter is not */ - /* used -- this is only used to get rid of unpleasant compiler warnings */ -#ifndef FT_UNUSED -#define FT_UNUSED( arg ) ( (arg) = (arg) ) -#endif - - - /*************************************************************************/ - /* */ - /* AUTOMATIC CONFIGURATION MACROS */ - /* */ - /* These macros are computed from the ones defined above. Don't touch */ - /* their definition, unless you know precisely what you are doing. No */ - /* porter should need to mess with them. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Mac support */ - /* */ - /* This is the only necessary change, so it is defined here instead */ - /* providing a new configuration file. */ - /* */ -#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) - /* no Carbon frameworks for 64bit 10.4.x */ - /* AvailabilityMacros.h is available since Mac OS X 10.2, */ - /* so guess the system version by maximum errno before inclusion */ -#include -#ifdef ECANCELED /* defined since 10.2 */ -#include "AvailabilityMacros.h" -#endif -#if defined( __LP64__ ) && \ - ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) -#undef FT_MACINTOSH -#endif - -#elif defined( __SC__ ) || defined( __MRC__ ) - /* Classic MacOS compilers */ -#include "ConditionalMacros.h" -#if TARGET_OS_MAC -#define FT_MACINTOSH 1 -#endif - -#endif - - - /*************************************************************************/ - /* */ - /*
    */ - /* basic_types */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Int16 */ - /* */ - /* */ - /* A typedef for a 16bit signed integer type. */ - /* */ - typedef signed short FT_Int16; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_UInt16 */ - /* */ - /* */ - /* A typedef for a 16bit unsigned integer type. */ - /* */ - typedef unsigned short FT_UInt16; - - /* */ - - - /* this #if 0 ... #endif clause is for documentation purposes */ -#if 0 - - /*************************************************************************/ - /* */ - /* */ - /* FT_Int32 */ - /* */ - /* */ - /* A typedef for a 32bit signed integer type. The size depends on */ - /* the configuration. */ - /* */ - typedef signed XXX FT_Int32; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_UInt32 */ - /* */ - /* A typedef for a 32bit unsigned integer type. The size depends on */ - /* the configuration. */ - /* */ - typedef unsigned XXX FT_UInt32; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Int64 */ - /* */ - /* A typedef for a 64bit signed integer type. The size depends on */ - /* the configuration. Only defined if there is real 64bit support; */ - /* otherwise, it gets emulated with a structure (if necessary). */ - /* */ - typedef signed XXX FT_Int64; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_UInt64 */ - /* */ - /* A typedef for a 64bit unsigned integer type. The size depends on */ - /* the configuration. Only defined if there is real 64bit support; */ - /* otherwise, it gets emulated with a structure (if necessary). */ - /* */ - typedef unsigned XXX FT_UInt64; - - /* */ - -#endif - -#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT) - - typedef signed int FT_Int32; - typedef unsigned int FT_UInt32; - -#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT) - - typedef signed long FT_Int32; - typedef unsigned long FT_UInt32; - -#else -#error "no 32bit type found -- please check your configuration files" -#endif - - - /* look up an integer type that is at least 32 bits */ -#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT) - - typedef int FT_Fast; - typedef unsigned int FT_UFast; - -#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT) - - typedef long FT_Fast; - typedef unsigned long FT_UFast; - -#endif - - - /* determine whether we have a 64-bit int type for platforms without */ - /* Autoconf */ -#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) - - /* FT_LONG64 must be defined if a 64-bit type is available */ -#define FT_LONG64 -#define FT_INT64 long -#define FT_UINT64 unsigned long - - /*************************************************************************/ - /* */ - /* A 64-bit data type may create compilation problems if you compile */ - /* in strict ANSI mode. To avoid them, we disable other 64-bit data */ - /* types if __STDC__ is defined. You can however ignore this rule */ - /* by defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ - /* */ -#elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 ) - -#if defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 -#define FT_UINT64 unsigned __int64 - -#elif defined( __BORLANDC__ ) /* Borland C++ */ - - /* XXXX: We should probably check the value of __BORLANDC__ in order */ - /* to test the compiler version. */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 -#define FT_UINT64 unsigned __int64 - -#elif defined( __WATCOMC__ ) /* Watcom C++ */ - - /* Watcom doesn't provide 64-bit data types */ - -#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ - -#define FT_LONG64 -#define FT_INT64 long long int -#define FT_UINT64 unsigned long long int - -#elif defined( __GNUC__ ) - - /* GCC provides the `long long' type */ -#define FT_LONG64 -#define FT_INT64 long long int -#define FT_UINT64 unsigned long long int - -#endif /* _MSC_VER */ - -#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ - -#ifdef FT_LONG64 - typedef FT_INT64 FT_Int64; - typedef FT_UINT64 FT_UInt64; -#endif - - - /*************************************************************************/ - /* */ - /* miscellaneous */ - /* */ - /*************************************************************************/ - - -#define FT_BEGIN_STMNT do { -#define FT_END_STMNT } while ( 0 ) -#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT - - - /* typeof condition taken from gnulib's `intprops.h' header file */ -#if ( __GNUC__ >= 2 || \ - defined( __IBM__TYPEOF__ ) || \ - ( __SUNPRO_C >= 0x5110 && !__STDC__ ) ) -#define FT_TYPEOF( type ) (__typeof__ (type)) -#else -#define FT_TYPEOF( type ) /* empty */ -#endif - - -#ifdef FT_MAKE_OPTION_SINGLE_OBJECT - -#define FT_LOCAL( x ) static x -#define FT_LOCAL_DEF( x ) static x - -#else - -#ifdef __cplusplus -#define FT_LOCAL( x ) extern "C" x -#define FT_LOCAL_DEF( x ) extern "C" x -#else -#define FT_LOCAL( x ) extern x -#define FT_LOCAL_DEF( x ) x -#endif - -#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ - -#define FT_LOCAL_ARRAY( x ) extern const x -#define FT_LOCAL_ARRAY_DEF( x ) const x - - -#ifndef FT_BASE - -#ifdef __cplusplus -#define FT_BASE( x ) extern "C" x -#else -#define FT_BASE( x ) extern x -#endif - -#endif /* !FT_BASE */ - - -#ifndef FT_BASE_DEF - -#ifdef __cplusplus -#define FT_BASE_DEF( x ) x -#else -#define FT_BASE_DEF( x ) x -#endif - -#endif /* !FT_BASE_DEF */ - - -#ifndef FT_EXPORT - -#ifdef __cplusplus -#define FT_EXPORT( x ) extern "C" x -#else -#define FT_EXPORT( x ) extern x -#endif - -#endif /* !FT_EXPORT */ - - -#ifndef FT_EXPORT_DEF - -#ifdef __cplusplus -#define FT_EXPORT_DEF( x ) extern "C" x -#else -#define FT_EXPORT_DEF( x ) extern x -#endif - -#endif /* !FT_EXPORT_DEF */ - - -#ifndef FT_EXPORT_VAR - -#ifdef __cplusplus -#define FT_EXPORT_VAR( x ) extern "C" x -#else -#define FT_EXPORT_VAR( x ) extern x -#endif - -#endif /* !FT_EXPORT_VAR */ - - /* The following macros are needed to compile the library with a */ - /* C++ compiler and with 16bit compilers. */ - /* */ - - /* This is special. Within C++, you must specify `extern "C"' for */ - /* functions which are used via function pointers, and you also */ - /* must do that for structures which contain function pointers to */ - /* assure C linkage -- it's not possible to have (local) anonymous */ - /* functions which are accessed by (global) function pointers. */ - /* */ - /* */ - /* FT_CALLBACK_DEF is used to _define_ a callback function. */ - /* */ - /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ - /* contains pointers to callback functions. */ - /* */ - /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ - /* that contains pointers to callback functions. */ - /* */ - /* */ - /* Some 16bit compilers have to redefine these macros to insert */ - /* the infamous `_cdecl' or `__fastcall' declarations. */ - /* */ -#ifndef FT_CALLBACK_DEF -#ifdef __cplusplus -#define FT_CALLBACK_DEF( x ) extern "C" x -#else -#define FT_CALLBACK_DEF( x ) static x -#endif -#endif /* FT_CALLBACK_DEF */ - -#ifndef FT_CALLBACK_TABLE -#ifdef __cplusplus -#define FT_CALLBACK_TABLE extern "C" -#define FT_CALLBACK_TABLE_DEF extern "C" -#else -#define FT_CALLBACK_TABLE extern -#define FT_CALLBACK_TABLE_DEF /* nothing */ -#endif -#endif /* FT_CALLBACK_TABLE */ - - -FT_END_HEADER - - -#endif /* __FTCONFIG_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/config/ftheader.h b/3party/freetype/include/freetype/config/ftheader.h deleted file mode 100644 index 55f833db0f..0000000000 --- a/3party/freetype/include/freetype/config/ftheader.h +++ /dev/null @@ -1,834 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftheader.h */ -/* */ -/* Build macros of the FreeType 2 library. */ -/* */ -/* Copyright 1996-2015 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 __FT_HEADER_H__ -#define __FT_HEADER_H__ - - - /*@***********************************************************************/ - /* */ - /* */ - /* FT_BEGIN_HEADER */ - /* */ - /* */ - /* This macro is used in association with @FT_END_HEADER in header */ - /* files to ensure that the declarations within are properly */ - /* encapsulated in an `extern "C" { .. }' block when included from a */ - /* C++ compiler. */ - /* */ -#ifdef __cplusplus -#define FT_BEGIN_HEADER extern "C" { -#else -#define FT_BEGIN_HEADER /* nothing */ -#endif - - - /*@***********************************************************************/ - /* */ - /* */ - /* FT_END_HEADER */ - /* */ - /* */ - /* This macro is used in association with @FT_BEGIN_HEADER in header */ - /* files to ensure that the declarations within are properly */ - /* encapsulated in an `extern "C" { .. }' block when included from a */ - /* C++ compiler. */ - /* */ -#ifdef __cplusplus -#define FT_END_HEADER } -#else -#define FT_END_HEADER /* nothing */ -#endif - - - /*************************************************************************/ - /* */ - /* Aliases for the FreeType 2 public and configuration files. */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /*
    */ - /* header_file_macros */ - /* */ - /* */ - /* Header File Macros */ - /* */ - /* <Abstract> */ - /* Macro definitions used to #include specific header files. */ - /* */ - /* <Description> */ - /* The following macros are defined to the name of specific */ - /* FreeType~2 header files. They can be used directly in #include */ - /* statements as in: */ - /* */ - /* { */ - /* #include FT_FREETYPE_H */ - /* #include FT_MULTIPLE_MASTERS_H */ - /* #include FT_GLYPH_H */ - /* } */ - /* */ - /* There are several reasons why we are now using macros to name */ - /* public header files. The first one is that such macros are not */ - /* limited to the infamous 8.3~naming rule required by DOS (and */ - /* `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h'). */ - /* */ - /* The second reason is that it allows for more flexibility in the */ - /* way FreeType~2 is installed on a given system. */ - /* */ - /*************************************************************************/ - - - /* configuration files */ - - /************************************************************************* - * - * @macro: - * FT_CONFIG_CONFIG_H - * - * @description: - * A macro used in #include statements to name the file containing - * FreeType~2 configuration data. - * - */ -#ifndef FT_CONFIG_CONFIG_H -#define FT_CONFIG_CONFIG_H <freetype/config/ftconfig.h> -#endif - - - /************************************************************************* - * - * @macro: - * FT_CONFIG_STANDARD_LIBRARY_H - * - * @description: - * A macro used in #include statements to name the file containing - * FreeType~2 interface to the standard C library functions. - * - */ -#ifndef FT_CONFIG_STANDARD_LIBRARY_H -#define FT_CONFIG_STANDARD_LIBRARY_H <freetype/config/ftstdlib.h> -#endif - - - /************************************************************************* - * - * @macro: - * FT_CONFIG_OPTIONS_H - * - * @description: - * A macro used in #include statements to name the file containing - * FreeType~2 project-specific configuration options. - * - */ -#ifndef FT_CONFIG_OPTIONS_H -#define FT_CONFIG_OPTIONS_H <freetype/config/ftoption.h> -#endif - - - /************************************************************************* - * - * @macro: - * FT_CONFIG_MODULES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * list of FreeType~2 modules that are statically linked to new library - * instances in @FT_Init_FreeType. - * - */ -#ifndef FT_CONFIG_MODULES_H -#define FT_CONFIG_MODULES_H <freetype/config/ftmodule.h> -#endif - - /* */ - - /* public headers */ - - /************************************************************************* - * - * @macro: - * FT_FREETYPE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * base FreeType~2 API. - * - */ -#define FT_FREETYPE_H <freetype/freetype.h> - - - /************************************************************************* - * - * @macro: - * FT_ERRORS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * list of FreeType~2 error codes (and messages). - * - * It is included by @FT_FREETYPE_H. - * - */ -#define FT_ERRORS_H <freetype/fterrors.h> - - - /************************************************************************* - * - * @macro: - * FT_MODULE_ERRORS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * list of FreeType~2 module error offsets (and messages). - * - */ -#define FT_MODULE_ERRORS_H <freetype/ftmoderr.h> - - - /************************************************************************* - * - * @macro: - * FT_SYSTEM_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 interface to low-level operations (i.e., memory management - * and stream i/o). - * - * It is included by @FT_FREETYPE_H. - * - */ -#define FT_SYSTEM_H <freetype/ftsystem.h> - - - /************************************************************************* - * - * @macro: - * FT_IMAGE_H - * - * @description: - * A macro used in #include statements to name the file containing type - * definitions related to glyph images (i.e., bitmaps, outlines, - * scan-converter parameters). - * - * It is included by @FT_FREETYPE_H. - * - */ -#define FT_IMAGE_H <freetype/ftimage.h> - - - /************************************************************************* - * - * @macro: - * FT_TYPES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * basic data types defined by FreeType~2. - * - * It is included by @FT_FREETYPE_H. - * - */ -#define FT_TYPES_H <freetype/fttypes.h> - - - /************************************************************************* - * - * @macro: - * FT_LIST_H - * - * @description: - * A macro used in #include statements to name the file containing the - * list management API of FreeType~2. - * - * (Most applications will never need to include this file.) - * - */ -#define FT_LIST_H <freetype/ftlist.h> - - - /************************************************************************* - * - * @macro: - * FT_OUTLINE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * scalable outline management API of FreeType~2. - * - */ -#define FT_OUTLINE_H <freetype/ftoutln.h> - - - /************************************************************************* - * - * @macro: - * FT_SIZES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * API which manages multiple @FT_Size objects per face. - * - */ -#define FT_SIZES_H <freetype/ftsizes.h> - - - /************************************************************************* - * - * @macro: - * FT_MODULE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * module management API of FreeType~2. - * - */ -#define FT_MODULE_H <freetype/ftmodapi.h> - - - /************************************************************************* - * - * @macro: - * FT_RENDER_H - * - * @description: - * A macro used in #include statements to name the file containing the - * renderer module management API of FreeType~2. - * - */ -#define FT_RENDER_H <freetype/ftrender.h> - - - /************************************************************************* - * - * @macro: - * FT_AUTOHINTER_H - * - * @description: - * A macro used in #include statements to name the file containing - * structures and macros related to the auto-hinting module. - * - */ -#define FT_AUTOHINTER_H <freetype/ftautoh.h> - - - /************************************************************************* - * - * @macro: - * FT_CFF_DRIVER_H - * - * @description: - * A macro used in #include statements to name the file containing - * structures and macros related to the CFF driver module. - * - */ -#define FT_CFF_DRIVER_H <freetype/ftcffdrv.h> - - - /************************************************************************* - * - * @macro: - * FT_TRUETYPE_DRIVER_H - * - * @description: - * A macro used in #include statements to name the file containing - * structures and macros related to the TrueType driver module. - * - */ -#define FT_TRUETYPE_DRIVER_H <freetype/ftttdrv.h> - - - /************************************************************************* - * - * @macro: - * FT_TYPE1_TABLES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * types and API specific to the Type~1 format. - * - */ -#define FT_TYPE1_TABLES_H <freetype/t1tables.h> - - - /************************************************************************* - * - * @macro: - * FT_TRUETYPE_IDS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * enumeration values which identify name strings, languages, encodings, - * etc. This file really contains a _large_ set of constant macro - * definitions, taken from the TrueType and OpenType specifications. - * - */ -#define FT_TRUETYPE_IDS_H <freetype/ttnameid.h> - - - /************************************************************************* - * - * @macro: - * FT_TRUETYPE_TABLES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * types and API specific to the TrueType (as well as OpenType) format. - * - */ -#define FT_TRUETYPE_TABLES_H <freetype/tttables.h> - - - /************************************************************************* - * - * @macro: - * FT_TRUETYPE_TAGS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * definitions of TrueType four-byte `tags' which identify blocks in - * SFNT-based font formats (i.e., TrueType and OpenType). - * - */ -#define FT_TRUETYPE_TAGS_H <freetype/tttags.h> - - - /************************************************************************* - * - * @macro: - * FT_BDF_H - * - * @description: - * A macro used in #include statements to name the file containing the - * definitions of an API which accesses BDF-specific strings from a - * face. - * - */ -#define FT_BDF_H <freetype/ftbdf.h> - - - /************************************************************************* - * - * @macro: - * FT_CID_H - * - * @description: - * A macro used in #include statements to name the file containing the - * definitions of an API which access CID font information from a - * face. - * - */ -#define FT_CID_H <freetype/ftcid.h> - - - /************************************************************************* - * - * @macro: - * FT_GZIP_H - * - * @description: - * A macro used in #include statements to name the file containing the - * definitions of an API which supports gzip-compressed files. - * - */ -#define FT_GZIP_H <freetype/ftgzip.h> - - - /************************************************************************* - * - * @macro: - * FT_LZW_H - * - * @description: - * A macro used in #include statements to name the file containing the - * definitions of an API which supports LZW-compressed files. - * - */ -#define FT_LZW_H <freetype/ftlzw.h> - - - /************************************************************************* - * - * @macro: - * FT_BZIP2_H - * - * @description: - * A macro used in #include statements to name the file containing the - * definitions of an API which supports bzip2-compressed files. - * - */ -#define FT_BZIP2_H <freetype/ftbzip2.h> - - - /************************************************************************* - * - * @macro: - * FT_WINFONTS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * definitions of an API which supports Windows FNT files. - * - */ -#define FT_WINFONTS_H <freetype/ftwinfnt.h> - - - /************************************************************************* - * - * @macro: - * FT_GLYPH_H - * - * @description: - * A macro used in #include statements to name the file containing the - * API of the optional glyph management component. - * - */ -#define FT_GLYPH_H <freetype/ftglyph.h> - - - /************************************************************************* - * - * @macro: - * FT_BITMAP_H - * - * @description: - * A macro used in #include statements to name the file containing the - * API of the optional bitmap conversion component. - * - */ -#define FT_BITMAP_H <freetype/ftbitmap.h> - - - /************************************************************************* - * - * @macro: - * FT_BBOX_H - * - * @description: - * A macro used in #include statements to name the file containing the - * API of the optional exact bounding box computation routines. - * - */ -#define FT_BBOX_H <freetype/ftbbox.h> - - - /************************************************************************* - * - * @macro: - * FT_CACHE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * API of the optional FreeType~2 cache sub-system. - * - */ -#define FT_CACHE_H <freetype/ftcache.h> - - - /************************************************************************* - * - * @macro: - * FT_CACHE_IMAGE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * `glyph image' API of the FreeType~2 cache sub-system. - * - * It is used to define a cache for @FT_Glyph elements. You can also - * use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to - * store small glyph bitmaps, as it will use less memory. - * - * This macro is deprecated. Simply include @FT_CACHE_H to have all - * glyph image-related cache declarations. - * - */ -#define FT_CACHE_IMAGE_H FT_CACHE_H - - - /************************************************************************* - * - * @macro: - * FT_CACHE_SMALL_BITMAPS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * `small bitmaps' API of the FreeType~2 cache sub-system. - * - * It is used to define a cache for small glyph bitmaps in a relatively - * memory-efficient way. You can also use the API defined in - * @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images, - * including scalable outlines. - * - * This macro is deprecated. Simply include @FT_CACHE_H to have all - * small bitmaps-related cache declarations. - * - */ -#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H - - - /************************************************************************* - * - * @macro: - * FT_CACHE_CHARMAP_H - * - * @description: - * A macro used in #include statements to name the file containing the - * `charmap' API of the FreeType~2 cache sub-system. - * - * This macro is deprecated. Simply include @FT_CACHE_H to have all - * charmap-based cache declarations. - * - */ -#define FT_CACHE_CHARMAP_H FT_CACHE_H - - - /************************************************************************* - * - * @macro: - * FT_MAC_H - * - * @description: - * A macro used in #include statements to name the file containing the - * Macintosh-specific FreeType~2 API. The latter is used to access - * fonts embedded in resource forks. - * - * This header file must be explicitly included by client applications - * compiled on the Mac (note that the base API still works though). - * - */ -#define FT_MAC_H <freetype/ftmac.h> - - - /************************************************************************* - * - * @macro: - * FT_MULTIPLE_MASTERS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * optional multiple-masters management API of FreeType~2. - * - */ -#define FT_MULTIPLE_MASTERS_H <freetype/ftmm.h> - - - /************************************************************************* - * - * @macro: - * FT_SFNT_NAMES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * optional FreeType~2 API which accesses embedded `name' strings in - * SFNT-based font formats (i.e., TrueType and OpenType). - * - */ -#define FT_SFNT_NAMES_H <freetype/ftsnames.h> - - - /************************************************************************* - * - * @macro: - * FT_OPENTYPE_VALIDATE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * optional FreeType~2 API which validates OpenType tables (BASE, GDEF, - * GPOS, GSUB, JSTF). - * - */ -#define FT_OPENTYPE_VALIDATE_H <freetype/ftotval.h> - - - /************************************************************************* - * - * @macro: - * FT_GX_VALIDATE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat, - * mort, morx, bsln, just, kern, opbd, trak, prop). - * - */ -#define FT_GX_VALIDATE_H <freetype/ftgxval.h> - - - /************************************************************************* - * - * @macro: - * FT_PFR_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which accesses PFR-specific data. - * - */ -#define FT_PFR_H <freetype/ftpfr.h> - - - /************************************************************************* - * - * @macro: - * FT_STROKER_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which provides functions to stroke outline paths. - */ -#define FT_STROKER_H <freetype/ftstroke.h> - - - /************************************************************************* - * - * @macro: - * FT_SYNTHESIS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which performs artificial obliquing and emboldening. - */ -#define FT_SYNTHESIS_H <freetype/ftsynth.h> - - - /************************************************************************* - * - * @macro: - * FT_FONT_FORMATS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which provides functions specific to font formats. - */ -#define FT_FONT_FORMATS_H <freetype/ftfntfmt.h> - - /* deprecated */ -#define FT_XFREE86_H FT_FONT_FORMATS_H - - - /************************************************************************* - * - * @macro: - * FT_TRIGONOMETRY_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which performs trigonometric computations (e.g., - * cosines and arc tangents). - */ -#define FT_TRIGONOMETRY_H <freetype/fttrigon.h> - - - /************************************************************************* - * - * @macro: - * FT_LCD_FILTER_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which performs color filtering for subpixel rendering. - */ -#define FT_LCD_FILTER_H <freetype/ftlcdfil.h> - - - /************************************************************************* - * - * @macro: - * FT_UNPATENTED_HINTING_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which performs color filtering for subpixel rendering. - */ -#define FT_UNPATENTED_HINTING_H <freetype/ttunpat.h> - - - /************************************************************************* - * - * @macro: - * FT_INCREMENTAL_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which performs color filtering for subpixel rendering. - */ -#define FT_INCREMENTAL_H <freetype/ftincrem.h> - - - /************************************************************************* - * - * @macro: - * FT_GASP_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which returns entries from the TrueType GASP table. - */ -#define FT_GASP_H <freetype/ftgasp.h> - - - /************************************************************************* - * - * @macro: - * FT_ADVANCES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which returns individual and ranged glyph advances. - */ -#define FT_ADVANCES_H <freetype/ftadvanc.h> - - - /* */ - -#define FT_ERROR_DEFINITIONS_H <freetype/fterrdef.h> - - - /* The internals of the cache sub-system are no longer exposed. We */ - /* default to FT_CACHE_H at the moment just in case, but we know of */ - /* no rogue client that uses them. */ - /* */ -#define FT_CACHE_MANAGER_H <freetype/ftcache.h> -#define FT_CACHE_INTERNAL_MRU_H <freetype/ftcache.h> -#define FT_CACHE_INTERNAL_MANAGER_H <freetype/ftcache.h> -#define FT_CACHE_INTERNAL_CACHE_H <freetype/ftcache.h> -#define FT_CACHE_INTERNAL_GLYPH_H <freetype/ftcache.h> -#define FT_CACHE_INTERNAL_IMAGE_H <freetype/ftcache.h> -#define FT_CACHE_INTERNAL_SBITS_H <freetype/ftcache.h> - - -#define FT_INCREMENTAL_H <freetype/ftincrem.h> - -#define FT_TRUETYPE_UNPATENTED_H <freetype/ttunpat.h> - - - /* - * Include internal headers definitions from <internal/...> - * only when building the library. - */ -#ifdef FT2_BUILD_LIBRARY -#define FT_INTERNAL_INTERNAL_H <freetype/internal/internal.h> -#include FT_INTERNAL_INTERNAL_H -#endif /* FT2_BUILD_LIBRARY */ - - -#endif /* __FT2_BUILD_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/config/ftmodule.h b/3party/freetype/include/freetype/config/ftmodule.h deleted file mode 100644 index 76d271a74b..0000000000 --- a/3party/freetype/include/freetype/config/ftmodule.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file registers the FreeType modules compiled into the library. - * - * If you use GNU make, this file IS NOT USED! Instead, it is created in - * the objects directory (normally `<topdir>/objs/') based on information - * from `<topdir>/modules.cfg'. - * - * Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile - * FreeType without GNU make. - * - */ - -FT_USE_MODULE( FT_Module_Class, autofit_module_class ) -FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) -FT_USE_MODULE( FT_Module_Class, psaux_module_class ) -FT_USE_MODULE( FT_Module_Class, psnames_module_class ) -FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) -FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) -FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) - -/* EOF */ diff --git a/3party/freetype/include/freetype/config/ftoption.h b/3party/freetype/include/freetype/config/ftoption.h deleted file mode 100644 index 8db9e980c6..0000000000 --- a/3party/freetype/include/freetype/config/ftoption.h +++ /dev/null @@ -1,886 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftoption.h */ -/* */ -/* User-selectable configuration macros (specification only). */ -/* */ -/* Copyright 1996-2015 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 __FTOPTION_H__ -#define __FTOPTION_H__ - - -#include <ft2build.h> - - -FT_BEGIN_HEADER - - /*************************************************************************/ - /* */ - /* USER-SELECTABLE CONFIGURATION MACROS */ - /* */ - /* This file contains the default configuration macro definitions for */ - /* a standard build of the FreeType library. There are three ways to */ - /* use this file to build project-specific versions of the library: */ - /* */ - /* - You can modify this file by hand, but this is not recommended in */ - /* cases where you would like to build several versions of the */ - /* library from a single source directory. */ - /* */ - /* - You can put a copy of this file in your build directory, more */ - /* precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD' */ - /* is the name of a directory that is included _before_ the FreeType */ - /* include path during compilation. */ - /* */ - /* The default FreeType Makefiles and Jamfiles use the build */ - /* directory `builds/<system>' by default, but you can easily change */ - /* that for your own projects. */ - /* */ - /* - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it */ - /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */ - /* locate this file during the build. For example, */ - /* */ - /* #define FT_CONFIG_OPTIONS_H <myftoptions.h> */ - /* #include <freetype/config/ftheader.h> */ - /* */ - /* will use `$BUILD/myftoptions.h' instead of this file for macro */ - /* definitions. */ - /* */ - /* Note also that you can similarly pre-define the macro */ - /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */ - /* that are statically linked to the library at compile time. By */ - /* default, this file is <freetype/config/ftmodule.h>. */ - /* */ - /* We highly recommend using the third method whenever possible. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Uncomment the line below if you want to activate sub-pixel rendering */ - /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */ - /* */ - /* Note that this feature is covered by several Microsoft patents */ - /* and should not be activated in any default build of the library. */ - /* */ - /* This macro has no impact on the FreeType API, only on its */ - /* _implementation_. For example, using FT_RENDER_MODE_LCD when calling */ - /* FT_Render_Glyph still generates a bitmap that is 3 times wider than */ - /* the original size in case this macro isn't defined; however, each */ - /* triplet of subpixels has R=G=B. */ - /* */ - /* This is done to allow FreeType clients to run unmodified, forcing */ - /* them to display normal gray-level anti-aliased glyphs. */ - /* */ -/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ - - - /*************************************************************************/ - /* */ - /* Many compilers provide a non-ANSI 64-bit data type that can be used */ - /* by FreeType to speed up some computations. However, this will create */ - /* some problems when compiling the library in strict ANSI mode. */ - /* */ - /* For this reason, the use of 64-bit integers is normally disabled when */ - /* the __STDC__ macro is defined. You can however disable this by */ - /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */ - /* */ - /* For most compilers, this will only create compilation warnings when */ - /* building the library. */ - /* */ - /* ObNote: The compiler-specific 64-bit integers are detected in the */ - /* file `ftconfig.h' either statically or through the */ - /* `configure' script on supported platforms. */ - /* */ -#undef FT_CONFIG_OPTION_FORCE_INT64 - - - /*************************************************************************/ - /* */ - /* If this macro is defined, do not try to use an assembler version of */ - /* performance-critical functions (e.g. FT_MulFix). You should only do */ - /* that to verify that the assembler function works properly, or to */ - /* execute benchmark tests of the various implementations. */ -/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ - - - /*************************************************************************/ - /* */ - /* If this macro is defined, try to use an inlined assembler version of */ - /* the `FT_MulFix' function, which is a `hotspot' when loading and */ - /* hinting glyphs, and which should be executed as fast as possible. */ - /* */ - /* Note that if your compiler or CPU is not supported, this will default */ - /* to the standard and portable implementation found in `ftcalc.c'. */ - /* */ -#define FT_CONFIG_OPTION_INLINE_MULFIX - - - /*************************************************************************/ - /* */ - /* LZW-compressed file support. */ - /* */ - /* FreeType now handles font files that have been compressed with the */ - /* `compress' program. This is mostly used to parse many of the PCF */ - /* files that come with various X11 distributions. The implementation */ - /* uses NetBSD's `zopen' to partially uncompress the file on the fly */ - /* (see src/lzw/ftgzip.c). */ - /* */ - /* Define this macro if you want to enable this `feature'. */ - /* */ -#define FT_CONFIG_OPTION_USE_LZW - - - /*************************************************************************/ - /* */ - /* Gzip-compressed file support. */ - /* */ - /* FreeType now handles font files that have been compressed with the */ - /* `gzip' program. This is mostly used to parse many of the PCF files */ - /* that come with XFree86. The implementation uses `zlib' to */ - /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */ - /* */ - /* Define this macro if you want to enable this `feature'. See also */ - /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ - /* */ -#define FT_CONFIG_OPTION_USE_ZLIB - - - /*************************************************************************/ - /* */ - /* ZLib library selection */ - /* */ - /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ - /* It allows FreeType's `ftgzip' component to link to the system's */ - /* installation of the ZLib library. This is useful on systems like */ - /* Unix or VMS where it generally is already available. */ - /* */ - /* If you let it undefined, the component will use its own copy */ - /* of the zlib sources instead. These have been modified to be */ - /* included directly within the component and *not* export external */ - /* function names. This allows you to link any program with FreeType */ - /* _and_ ZLib without linking conflicts. */ - /* */ - /* Do not #undef this macro here since the build system might define */ - /* it for certain configurations only. */ - /* */ -#define FT_CONFIG_OPTION_SYSTEM_ZLIB - - - /*************************************************************************/ - /* */ - /* Bzip2-compressed file support. */ - /* */ - /* FreeType now handles font files that have been compressed with the */ - /* `bzip2' program. This is mostly used to parse many of the PCF */ - /* files that come with XFree86. The implementation uses `libbz2' to */ - /* partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */ - /* Contrary to gzip, bzip2 currently is not included and need to use */ - /* the system available bzip2 implementation. */ - /* */ - /* Define this macro if you want to enable this `feature'. */ - /* */ -/* #define FT_CONFIG_OPTION_USE_BZIP2 */ - - - /*************************************************************************/ - /* */ - /* Define to disable the use of file stream functions and types, FILE, */ - /* fopen() etc. Enables the use of smaller system libraries on embedded */ - /* systems that have multiple system libraries, some with or without */ - /* file stream support, in the cases where file stream support is not */ - /* necessary such as memory loading of font files. */ - /* */ -/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ - - - /*************************************************************************/ - /* */ - /* PNG bitmap support. */ - /* */ - /* FreeType now handles loading color bitmap glyphs in the PNG format. */ - /* This requires help from the external libpng library. Uncompressed */ - /* color bitmaps do not need any external libraries and will be */ - /* supported regardless of this configuration. */ - /* */ - /* Define this macro if you want to enable this `feature'. */ - /* */ -/* #define FT_CONFIG_OPTION_USE_PNG */ - - - /*************************************************************************/ - /* */ - /* HarfBuzz support. */ - /* */ - /* FreeType uses the HarfBuzz library to improve auto-hinting of */ - /* OpenType fonts. If available, many glyphs not directly addressable */ - /* by a font's character map will be hinted also. */ - /* */ - /* Define this macro if you want to enable this `feature'. */ - /* */ -/* #define FT_CONFIG_OPTION_USE_HARFBUZZ */ - - - /*************************************************************************/ - /* */ - /* DLL export compilation */ - /* */ - /* When compiling FreeType as a DLL, some systems/compilers need a */ - /* special keyword in front OR after the return type of function */ - /* declarations. */ - /* */ - /* Two macros are used within the FreeType source code to define */ - /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */ - /* */ - /* FT_EXPORT( return_type ) */ - /* */ - /* is used in a function declaration, as in */ - /* */ - /* FT_EXPORT( FT_Error ) */ - /* FT_Init_FreeType( FT_Library* alibrary ); */ - /* */ - /* */ - /* FT_EXPORT_DEF( return_type ) */ - /* */ - /* is used in a function definition, as in */ - /* */ - /* FT_EXPORT_DEF( FT_Error ) */ - /* FT_Init_FreeType( FT_Library* alibrary ) */ - /* { */ - /* ... some code ... */ - /* return FT_Err_Ok; */ - /* } */ - /* */ - /* You can provide your own implementation of FT_EXPORT and */ - /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */ - /* will be later automatically defined as `extern return_type' to */ - /* allow normal compilation. */ - /* */ - /* Do not #undef these macros here since the build system might define */ - /* them for certain configurations only. */ - /* */ -/* #define FT_EXPORT(x) extern x */ -/* #define FT_EXPORT_DEF(x) x */ - - - /*************************************************************************/ - /* */ - /* Glyph Postscript Names handling */ - /* */ - /* By default, FreeType 2 is compiled with the `psnames' module. This */ - /* module is in charge of converting a glyph name string into a */ - /* Unicode value, or return a Macintosh standard glyph name for the */ - /* use with the TrueType `post' table. */ - /* */ - /* Undefine this macro if you do not want `psnames' compiled in your */ - /* build of FreeType. This has the following effects: */ - /* */ - /* - The TrueType driver will provide its own set of glyph names, */ - /* if you build it to support postscript names in the TrueType */ - /* `post' table. */ - /* */ - /* - The Type 1 driver will not be able to synthesize a Unicode */ - /* charmap out of the glyphs found in the fonts. */ - /* */ - /* You would normally undefine this configuration macro when building */ - /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */ - /* */ -#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES - - - /*************************************************************************/ - /* */ - /* Postscript Names to Unicode Values support */ - /* */ - /* By default, FreeType 2 is built with the `PSNames' module compiled */ - /* in. Among other things, the module is used to convert a glyph name */ - /* into a Unicode value. This is especially useful in order to */ - /* synthesize on the fly a Unicode charmap from the CFF/Type 1 driver */ - /* through a big table named the `Adobe Glyph List' (AGL). */ - /* */ - /* Undefine this macro if you do not want the Adobe Glyph List */ - /* compiled in your `PSNames' module. The Type 1 driver will not be */ - /* able to synthesize a Unicode charmap out of the glyphs found in the */ - /* fonts. */ - /* */ -#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - - - /*************************************************************************/ - /* */ - /* Support for Mac fonts */ - /* */ - /* Define this macro if you want support for outline fonts in Mac */ - /* format (mac dfont, mac resource, macbinary containing a mac */ - /* resource) on non-Mac platforms. */ - /* */ - /* Note that the `FOND' resource isn't checked. */ - /* */ -#define FT_CONFIG_OPTION_MAC_FONTS - - - /*************************************************************************/ - /* */ - /* Guessing methods to access embedded resource forks */ - /* */ - /* Enable extra Mac fonts support on non-Mac platforms (e.g. */ - /* GNU/Linux). */ - /* */ - /* Resource forks which include fonts data are stored sometimes in */ - /* locations which users or developers don't expected. In some cases, */ - /* resource forks start with some offset from the head of a file. In */ - /* other cases, the actual resource fork is stored in file different */ - /* from what the user specifies. If this option is activated, */ - /* FreeType tries to guess whether such offsets or different file */ - /* names must be used. */ - /* */ - /* Note that normal, direct access of resource forks is controlled via */ - /* the FT_CONFIG_OPTION_MAC_FONTS option. */ - /* */ -#ifdef FT_CONFIG_OPTION_MAC_FONTS -#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK -#endif - - - /*************************************************************************/ - /* */ - /* Allow the use of FT_Incremental_Interface to load typefaces that */ - /* contain no glyph data, but supply it via a callback function. */ - /* This is required by clients supporting document formats which */ - /* supply font data incrementally as the document is parsed, such */ - /* as the Ghostscript interpreter for the PostScript language. */ - /* */ -#define FT_CONFIG_OPTION_INCREMENTAL - - - /*************************************************************************/ - /* */ - /* The size in bytes of the render pool used by the scan-line converter */ - /* to do all of its work. */ - /* */ -#define FT_RENDER_POOL_SIZE 16384L - - - /*************************************************************************/ - /* */ - /* FT_MAX_MODULES */ - /* */ - /* The maximum number of modules that can be registered in a single */ - /* FreeType library object. 32 is the default. */ - /* */ -#define FT_MAX_MODULES 32 - - - /*************************************************************************/ - /* */ - /* Debug level */ - /* */ - /* FreeType can be compiled in debug or trace mode. In debug mode, */ - /* errors are reported through the `ftdebug' component. In trace */ - /* mode, additional messages are sent to the standard output during */ - /* execution. */ - /* */ - /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */ - /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */ - /* */ - /* Don't define any of these macros to compile in `release' mode! */ - /* */ - /* Do not #undef these macros here since the build system might define */ - /* them for certain configurations only. */ - /* */ -/* #define FT_DEBUG_LEVEL_ERROR */ -/* #define FT_DEBUG_LEVEL_TRACE */ - - - /*************************************************************************/ - /* */ - /* Autofitter debugging */ - /* */ - /* If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to */ - /* control the autofitter behaviour for debugging purposes with global */ - /* boolean variables (consequently, you should *never* enable this */ - /* while compiling in `release' mode): */ - /* */ - /* _af_debug_disable_horz_hints */ - /* _af_debug_disable_vert_hints */ - /* _af_debug_disable_blue_hints */ - /* */ - /* Additionally, the following functions provide dumps of various */ - /* internal autofit structures to stdout (using `printf'): */ - /* */ - /* af_glyph_hints_dump_points */ - /* af_glyph_hints_dump_segments */ - /* af_glyph_hints_dump_edges */ - /* af_glyph_hints_get_num_segments */ - /* af_glyph_hints_get_segment_offset */ - /* */ - /* As an argument, they use another global variable: */ - /* */ - /* _af_debug_hints */ - /* */ - /* Please have a look at the `ftgrid' demo program to see how those */ - /* variables and macros should be used. */ - /* */ - /* Do not #undef these macros here since the build system might define */ - /* them for certain configurations only. */ - /* */ -/* #define FT_DEBUG_AUTOFIT */ - - - /*************************************************************************/ - /* */ - /* Memory Debugging */ - /* */ - /* FreeType now comes with an integrated memory debugger that is */ - /* capable of detecting simple errors like memory leaks or double */ - /* deletes. To compile it within your build of the library, you */ - /* should define FT_DEBUG_MEMORY here. */ - /* */ - /* Note that the memory debugger is only activated at runtime when */ - /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */ - /* */ - /* Do not #undef this macro here since the build system might define */ - /* it for certain configurations only. */ - /* */ -/* #define FT_DEBUG_MEMORY */ - - - /*************************************************************************/ - /* */ - /* Module errors */ - /* */ - /* If this macro is set (which is _not_ the default), the higher byte */ - /* of an error code gives the module in which the error has occurred, */ - /* while the lower byte is the real error code. */ - /* */ - /* Setting this macro makes sense for debugging purposes only, since */ - /* it would break source compatibility of certain programs that use */ - /* FreeType 2. */ - /* */ - /* More details can be found in the files ftmoderr.h and fterrors.h. */ - /* */ -#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS - - - /*************************************************************************/ - /* */ - /* Position Independent Code */ - /* */ - /* If this macro is set (which is _not_ the default), FreeType2 will */ - /* avoid creating constants that require address fixups. Instead the */ - /* constants will be moved into a struct and additional intialization */ - /* code will be used. */ - /* */ - /* Setting this macro is needed for systems that prohibit address */ - /* fixups, such as BREW. */ - /* */ -/* #define FT_CONFIG_OPTION_PIC */ - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */ - /* embedded bitmaps in all formats using the SFNT module (namely */ - /* TrueType & OpenType). */ - /* */ -#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */ - /* load and enumerate the glyph Postscript names in a TrueType or */ - /* OpenType file. */ - /* */ - /* Note that when you do not compile the `PSNames' module by undefining */ - /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */ - /* contain additional code used to read the PS Names table from a font. */ - /* */ - /* (By default, the module uses `PSNames' to extract glyph names.) */ - /* */ -#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */ - /* access the internal name table in a SFNT-based format like TrueType */ - /* or OpenType. The name table contains various strings used to */ - /* describe the font, like family name, copyright, version, etc. It */ - /* does not contain any glyph name though. */ - /* */ - /* Accessing SFNT names is done through the functions declared in */ - /* `ftsnames.h'. */ - /* */ -#define TT_CONFIG_OPTION_SFNT_NAMES - - - /*************************************************************************/ - /* */ - /* TrueType CMap support */ - /* */ - /* Here you can fine-tune which TrueType CMap table format shall be */ - /* supported. */ -#define TT_CONFIG_CMAP_FORMAT_0 -#define TT_CONFIG_CMAP_FORMAT_2 -#define TT_CONFIG_CMAP_FORMAT_4 -#define TT_CONFIG_CMAP_FORMAT_6 -#define TT_CONFIG_CMAP_FORMAT_8 -#define TT_CONFIG_CMAP_FORMAT_10 -#define TT_CONFIG_CMAP_FORMAT_12 -#define TT_CONFIG_CMAP_FORMAT_13 -#define TT_CONFIG_CMAP_FORMAT_14 - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ - /* a bytecode interpreter in the TrueType driver. */ - /* */ - /* By undefining this, you will only compile the code necessary to load */ - /* TrueType glyphs without hinting. */ - /* */ - /* Do not #undef this macro here, since the build system might */ - /* define it for certain configurations only. */ - /* */ -#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile */ - /* EXPERIMENTAL subpixel hinting support into the TrueType driver. This */ - /* replaces the native TrueType hinting mechanism when anything but */ - /* FT_RENDER_MODE_MONO is requested. */ - /* */ - /* Enabling this causes the TrueType driver to ignore instructions under */ - /* certain conditions. This is done in accordance with the guide here, */ - /* with some minor differences: */ - /* */ - /* http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */ - /* */ - /* By undefining this, you only compile the code necessary to hint */ - /* TrueType glyphs with native TT hinting. */ - /* */ - /* This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be */ - /* defined. */ - /* */ -/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - - /*************************************************************************/ - /* */ - /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */ - /* of the TrueType bytecode interpreter is used that doesn't implement */ - /* any of the patented opcodes and algorithms. The patents related to */ - /* TrueType hinting have expired worldwide since May 2010; this option */ - /* is now deprecated. */ - /* */ - /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* */ - /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, */ - /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ - /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */ - /* */ - /* This macro is only useful for a small number of font files (mostly */ - /* for Asian scripts) that require bytecode interpretation to properly */ - /* load glyphs. For all other fonts, this produces unpleasant results, */ - /* thus the unpatented interpreter is never used to load glyphs from */ - /* TrueType fonts unless one of the following two options is used. */ - /* */ - /* - The unpatented interpreter is explicitly activated by the user */ - /* through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag */ - /* when opening the FT_Face. */ - /* */ - /* - FreeType detects that the FT_Face corresponds to one of the */ - /* `trick' fonts (e.g., `Mingliu') it knows about. The font engine */ - /* contains a hard-coded list of font names and other matching */ - /* parameters (see function `tt_face_init' in file */ - /* `src/truetype/ttobjs.c'). */ - /* */ - /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */ - /* */ - /* { */ - /* FT_Parameter parameter; */ - /* FT_Open_Args open_args; */ - /* */ - /* */ - /* parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; */ - /* */ - /* open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; */ - /* open_args.pathname = my_font_pathname; */ - /* open_args.num_params = 1; */ - /* open_args.params = ¶meter; */ - /* */ - /* error = FT_Open_Face( library, &open_args, index, &face ); */ - /* ... */ - /* } */ - /* */ -/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */ - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */ - /* TrueType glyph loader to use Apple's definition of how to handle */ - /* component offsets in composite glyphs. */ - /* */ - /* Apple and MS disagree on the default behavior of component offsets */ - /* in composites. Apple says that they should be scaled by the scaling */ - /* factors in the transformation matrix (roughly, it's more complex) */ - /* while MS says they should not. OpenType defines two bits in the */ - /* composite flags array which can be used to disambiguate, but old */ - /* fonts will not have them. */ - /* */ - /* http://www.microsoft.com/typography/otspec/glyf.htm */ - /* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html */ - /* */ -#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */ - /* support for Apple's distortable font technology (fvar, gvar, cvar, */ - /* and avar tables). This has many similarities to Type 1 Multiple */ - /* Masters support. */ - /* */ -#define TT_CONFIG_OPTION_GX_VAR_SUPPORT - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_BDF if you want to include support for */ - /* an embedded `BDF ' table within SFNT-based bitmap formats. */ - /* */ -#define TT_CONFIG_OPTION_BDF - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* T1_MAX_DICT_DEPTH is the maximum depth of nest dictionaries and */ - /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */ - /* required. */ - /* */ -#define T1_MAX_DICT_DEPTH 5 - - - /*************************************************************************/ - /* */ - /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ - /* calls during glyph loading. */ - /* */ -#define T1_MAX_SUBRS_CALLS 16 - - - /*************************************************************************/ - /* */ - /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ - /* minimum of 16 is required. */ - /* */ - /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */ - /* */ -#define T1_MAX_CHARSTRINGS_OPERANDS 256 - - - /*************************************************************************/ - /* */ - /* Define this configuration macro if you want to prevent the */ - /* compilation of `t1afm', which is in charge of reading Type 1 AFM */ - /* files into an existing face. Note that if set, the T1 driver will be */ - /* unable to produce kerning distances. */ - /* */ -#undef T1_CONFIG_OPTION_NO_AFM - - - /*************************************************************************/ - /* */ - /* Define this configuration macro if you want to prevent the */ - /* compilation of the Multiple Masters font support in the Type 1 */ - /* driver. */ - /* */ -#undef T1_CONFIG_OPTION_NO_MM_SUPPORT - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** C F F D R I V E R C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Using CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4} it is */ - /* possible to set up the default values of the four control points that */ - /* define the stem darkening behaviour of the (new) CFF engine. For */ - /* more details please read the documentation of the */ - /* `darkening-parameters' property of the cff driver module (file */ - /* `ftcffdrv.h'), which allows the control at run-time. */ - /* */ - /* Do *not* undefine these macros! */ - /* */ -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 500 -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 400 - -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 1000 -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 275 - -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 1667 -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 275 - -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 2333 -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 0 - - - /*************************************************************************/ - /* */ - /* CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF */ - /* engine gets compiled into FreeType. If defined, it is possible to */ - /* switch between the two engines using the `hinting-engine' property of */ - /* the cff driver module. */ - /* */ -/* #define CFF_CONFIG_OPTION_OLD_ENGINE */ - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Compile autofit module with CJK (Chinese, Japanese, Korean) script */ - /* support. */ - /* */ -#define AF_CONFIG_OPTION_CJK - - /*************************************************************************/ - /* */ - /* Compile autofit module with Indic script support. */ - /* */ -#define AF_CONFIG_OPTION_INDIC - - /*************************************************************************/ - /* */ - /* Compile autofit module with warp hinting. The idea of the warping */ - /* code is to slightly scale and shift a glyph within a single dimension */ - /* so that as much of its segments are aligned (more or less) on the */ - /* grid. To find out the optimal scaling and shifting value, various */ - /* parameter combinations are tried and scored. */ - /* */ - /* This experimental option is active only if the rendering mode is */ - /* FT_RENDER_MODE_LIGHT; you can switch warping on and off with the */ - /* `warping' property of the auto-hinter (see file `ftautoh.h' for more */ - /* information; by default it is switched off). */ - /* */ -#define AF_CONFIG_OPTION_USE_WARPER - - /* */ - - - /* - * This macro is obsolete. Support has been removed in FreeType - * version 2.5. - */ -/* #define FT_CONFIG_OPTION_OLD_INTERNALS */ - - - /* - * This macro is defined if either unpatented or native TrueType - * hinting is requested by the definitions above. - */ -#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER -#define TT_USE_BYTECODE_INTERPRETER -#undef TT_CONFIG_OPTION_UNPATENTED_HINTING -#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING -#define TT_USE_BYTECODE_INTERPRETER -#endif - - - /* - * Check CFF darkening parameters. The checks are the same as in function - * `cff_property_set' in file `cffdrivr.c'. - */ -#if CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 < 0 || \ - \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 < 0 || \ - \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 > \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 > \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 > \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 || \ - \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 > 500 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 > 500 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 > 500 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 > 500 -#error "Invalid CFF darkening parameters!" -#endif - -FT_END_HEADER - - -#endif /* __FTOPTION_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/config/ftstdlib.h b/3party/freetype/include/freetype/config/ftstdlib.h deleted file mode 100644 index 4b471d4d15..0000000000 --- a/3party/freetype/include/freetype/config/ftstdlib.h +++ /dev/null @@ -1,174 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftstdlib.h */ -/* */ -/* ANSI-specific library and header configuration file (specification */ -/* only). */ -/* */ -/* Copyright 2002-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to group all #includes to the ANSI C library that */ - /* FreeType normally requires. It also defines macros to rename the */ - /* standard functions within the FreeType source code. */ - /* */ - /* Load a file which defines __FTSTDLIB_H__ before this one to override */ - /* it. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTSTDLIB_H__ -#define __FTSTDLIB_H__ - - -#include <stddef.h> - -#define ft_ptrdiff_t ptrdiff_t - - - /**********************************************************************/ - /* */ - /* integer limits */ - /* */ - /* UINT_MAX and ULONG_MAX are used to automatically compute the size */ - /* of `int' and `long' in bytes at compile-time. So far, this works */ - /* for all platforms the library has been tested on. */ - /* */ - /* Note that on the extremely rare platforms that do not provide */ - /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some */ - /* old Crays where `int' is 36 bits), we do not make any guarantee */ - /* about the correct behaviour of FT2 with all fonts. */ - /* */ - /* In these case, `ftconfig.h' will refuse to compile anyway with a */ - /* message like `couldn't find 32-bit type' or something similar. */ - /* */ - /**********************************************************************/ - - -#include <limits.h> - -#define FT_CHAR_BIT CHAR_BIT -#define FT_USHORT_MAX USHRT_MAX -#define FT_INT_MAX INT_MAX -#define FT_INT_MIN INT_MIN -#define FT_UINT_MAX UINT_MAX -#define FT_LONG_MAX LONG_MAX -#define FT_ULONG_MAX ULONG_MAX - - - /**********************************************************************/ - /* */ - /* character and string processing */ - /* */ - /**********************************************************************/ - - -#include <string.h> - -#define ft_memchr memchr -#define ft_memcmp memcmp -#define ft_memcpy memcpy -#define ft_memmove memmove -#define ft_memset memset -#define ft_strcat strcat -#define ft_strcmp strcmp -#define ft_strcpy strcpy -#define ft_strlen strlen -#define ft_strncmp strncmp -#define ft_strncpy strncpy -#define ft_strrchr strrchr -#define ft_strstr strstr - - - /**********************************************************************/ - /* */ - /* file handling */ - /* */ - /**********************************************************************/ - - -#include <stdio.h> - -#define FT_FILE FILE -#define ft_fclose fclose -#define ft_fopen fopen -#define ft_fread fread -#define ft_fseek fseek -#define ft_ftell ftell -#define ft_sprintf sprintf - - - /**********************************************************************/ - /* */ - /* sorting */ - /* */ - /**********************************************************************/ - - -#include <stdlib.h> - -#define ft_qsort qsort - - - /**********************************************************************/ - /* */ - /* memory allocation */ - /* */ - /**********************************************************************/ - - -#define ft_scalloc calloc -#define ft_sfree free -#define ft_smalloc malloc -#define ft_srealloc realloc - - - /**********************************************************************/ - /* */ - /* miscellaneous */ - /* */ - /**********************************************************************/ - - -#define ft_atol atol - - - /**********************************************************************/ - /* */ - /* execution control */ - /* */ - /**********************************************************************/ - - -#include <setjmp.h> - -#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ - /* jmp_buf is defined as a macro */ - /* on certain platforms */ - -#define ft_longjmp longjmp -#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */ - - - /* the following is only used for debugging purposes, i.e., if */ - /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined */ - -#include <stdarg.h> - - -#endif /* __FTSTDLIB_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/freetype.h b/3party/freetype/include/freetype/freetype.h deleted file mode 100644 index f3a9d6fd71..0000000000 --- a/3party/freetype/include/freetype/freetype.h +++ /dev/null @@ -1,4177 +0,0 @@ -/***************************************************************************/ -/* */ -/* freetype.h */ -/* */ -/* FreeType high-level API and common types (specification only). */ -/* */ -/* Copyright 1996-2015 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 __FREETYPE_H__ -#define __FREETYPE_H__ - - -#ifndef FT_FREETYPE_H -#error "`ft2build.h' hasn't been included yet!" -#error "Please always use macros to include FreeType header files." -#error "Example:" -#error " #include <ft2build.h>" -#error " #include FT_FREETYPE_H" -#endif - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_TYPES_H -#include FT_ERRORS_H - - -FT_BEGIN_HEADER - - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* header_inclusion */ - /* */ - /* <Title> */ - /* FreeType's header inclusion scheme */ - /* */ - /* <Abstract> */ - /* How client applications should include FreeType header files. */ - /* */ - /* <Description> */ - /* To be as flexible as possible (and for historical reasons), */ - /* FreeType uses a very special inclusion scheme to load header */ - /* files, for example */ - /* */ - /* { */ - /* #include <ft2build.h> */ - /* */ - /* #include FT_FREETYPE_H */ - /* #include FT_OUTLINE_H */ - /* } */ - /* */ - /* A compiler and its preprocessor only needs an include path to find */ - /* the file `ft2build.h'; the exact locations and names of the other */ - /* FreeType header files are hidden by preprocessor macro names, */ - /* loaded by `ft2build.h'. The API documentation always gives the */ - /* header macro name needed for a particular function. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* user_allocation */ - /* */ - /* <Title> */ - /* User allocation */ - /* */ - /* <Abstract> */ - /* How client applications should allocate FreeType data structures. */ - /* */ - /* <Description> */ - /* FreeType assumes that structures allocated by the user and passed */ - /* as arguments are zeroed out except for the actual data. In other */ - /* words, it is recommended to use `calloc' (or variants of it) */ - /* instead of `malloc' for allocation. */ - /* */ - /*************************************************************************/ - - - - /*************************************************************************/ - /*************************************************************************/ - /* */ - /* B A S I C T Y P E S */ - /* */ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* base_interface */ - /* */ - /* <Title> */ - /* Base Interface */ - /* */ - /* <Abstract> */ - /* The FreeType~2 base font interface. */ - /* */ - /* <Description> */ - /* This section describes the most important public high-level API */ - /* functions of FreeType~2. */ - /* */ - /* <Order> */ - /* FT_Library */ - /* FT_Face */ - /* FT_Size */ - /* FT_GlyphSlot */ - /* FT_CharMap */ - /* FT_Encoding */ - /* FT_ENC_TAG */ - /* */ - /* FT_FaceRec */ - /* */ - /* FT_FACE_FLAG_SCALABLE */ - /* FT_FACE_FLAG_FIXED_SIZES */ - /* FT_FACE_FLAG_FIXED_WIDTH */ - /* FT_FACE_FLAG_HORIZONTAL */ - /* FT_FACE_FLAG_VERTICAL */ - /* FT_FACE_FLAG_COLOR */ - /* FT_FACE_FLAG_SFNT */ - /* FT_FACE_FLAG_CID_KEYED */ - /* FT_FACE_FLAG_TRICKY */ - /* FT_FACE_FLAG_KERNING */ - /* FT_FACE_FLAG_MULTIPLE_MASTERS */ - /* FT_FACE_FLAG_GLYPH_NAMES */ - /* FT_FACE_FLAG_EXTERNAL_STREAM */ - /* FT_FACE_FLAG_HINTER */ - /* FT_FACE_FLAG_TRICKY */ - /* */ - /* FT_HAS_HORIZONTAL */ - /* FT_HAS_VERTICAL */ - /* FT_HAS_KERNING */ - /* FT_HAS_FIXED_SIZES */ - /* FT_HAS_GLYPH_NAMES */ - /* FT_HAS_MULTIPLE_MASTERS */ - /* FT_HAS_COLOR */ - /* */ - /* FT_IS_SFNT */ - /* FT_IS_SCALABLE */ - /* FT_IS_FIXED_WIDTH */ - /* FT_IS_CID_KEYED */ - /* FT_IS_TRICKY */ - /* */ - /* FT_STYLE_FLAG_BOLD */ - /* FT_STYLE_FLAG_ITALIC */ - /* */ - /* FT_SizeRec */ - /* FT_Size_Metrics */ - /* */ - /* FT_GlyphSlotRec */ - /* FT_Glyph_Metrics */ - /* FT_SubGlyph */ - /* */ - /* FT_Bitmap_Size */ - /* */ - /* FT_Init_FreeType */ - /* FT_Done_FreeType */ - /* */ - /* FT_New_Face */ - /* FT_Done_Face */ - /* FT_Reference_Face */ - /* FT_New_Memory_Face */ - /* FT_Open_Face */ - /* FT_Open_Args */ - /* FT_Parameter */ - /* FT_Attach_File */ - /* FT_Attach_Stream */ - /* */ - /* FT_Set_Char_Size */ - /* FT_Set_Pixel_Sizes */ - /* FT_Request_Size */ - /* FT_Select_Size */ - /* FT_Size_Request_Type */ - /* FT_Size_RequestRec */ - /* FT_Size_Request */ - /* FT_Set_Transform */ - /* FT_Load_Glyph */ - /* FT_Get_Char_Index */ - /* FT_Get_First_Char */ - /* FT_Get_Next_Char */ - /* FT_Get_Name_Index */ - /* FT_Load_Char */ - /* */ - /* FT_OPEN_MEMORY */ - /* FT_OPEN_STREAM */ - /* FT_OPEN_PATHNAME */ - /* FT_OPEN_DRIVER */ - /* FT_OPEN_PARAMS */ - /* */ - /* FT_LOAD_DEFAULT */ - /* FT_LOAD_RENDER */ - /* FT_LOAD_MONOCHROME */ - /* FT_LOAD_LINEAR_DESIGN */ - /* FT_LOAD_NO_SCALE */ - /* FT_LOAD_NO_HINTING */ - /* FT_LOAD_NO_BITMAP */ - /* FT_LOAD_NO_AUTOHINT */ - /* FT_LOAD_COLOR */ - /* */ - /* FT_LOAD_VERTICAL_LAYOUT */ - /* FT_LOAD_IGNORE_TRANSFORM */ - /* FT_LOAD_FORCE_AUTOHINT */ - /* FT_LOAD_NO_RECURSE */ - /* FT_LOAD_PEDANTIC */ - /* */ - /* FT_LOAD_TARGET_NORMAL */ - /* FT_LOAD_TARGET_LIGHT */ - /* FT_LOAD_TARGET_MONO */ - /* FT_LOAD_TARGET_LCD */ - /* FT_LOAD_TARGET_LCD_V */ - /* */ - /* FT_LOAD_TARGET_MODE */ - /* */ - /* FT_Render_Glyph */ - /* FT_Render_Mode */ - /* FT_Get_Kerning */ - /* FT_Kerning_Mode */ - /* FT_Get_Track_Kerning */ - /* FT_Get_Glyph_Name */ - /* FT_Get_Postscript_Name */ - /* */ - /* FT_CharMapRec */ - /* FT_Select_Charmap */ - /* FT_Set_Charmap */ - /* FT_Get_Charmap_Index */ - /* */ - /* FT_Get_FSType_Flags */ - /* FT_Get_SubGlyph_Info */ - /* */ - /* FT_Face_Internal */ - /* FT_Size_Internal */ - /* FT_Slot_Internal */ - /* */ - /* FT_FACE_FLAG_XXX */ - /* FT_STYLE_FLAG_XXX */ - /* FT_OPEN_XXX */ - /* FT_LOAD_XXX */ - /* FT_LOAD_TARGET_XXX */ - /* FT_SUBGLYPH_FLAG_XXX */ - /* FT_FSTYPE_XXX */ - /* */ - /* FT_HAS_FAST_GLYPHS */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Glyph_Metrics */ - /* */ - /* <Description> */ - /* A structure used to model the metrics of a single glyph. The */ - /* values are expressed in 26.6 fractional pixel format; if the flag */ - /* @FT_LOAD_NO_SCALE has been used while loading the glyph, values */ - /* are expressed in font units instead. */ - /* */ - /* <Fields> */ - /* width :: */ - /* The glyph's width. */ - /* */ - /* height :: */ - /* The glyph's height. */ - /* */ - /* horiBearingX :: */ - /* Left side bearing for horizontal layout. */ - /* */ - /* horiBearingY :: */ - /* Top side bearing for horizontal layout. */ - /* */ - /* horiAdvance :: */ - /* Advance width for horizontal layout. */ - /* */ - /* vertBearingX :: */ - /* Left side bearing for vertical layout. */ - /* */ - /* vertBearingY :: */ - /* Top side bearing for vertical layout. Larger positive values */ - /* mean further below the vertical glyph origin. */ - /* */ - /* vertAdvance :: */ - /* Advance height for vertical layout. Positive values mean the */ - /* glyph has a positive advance downward. */ - /* */ - /* <Note> */ - /* If not disabled with @FT_LOAD_NO_HINTING, the values represent */ - /* dimensions of the hinted glyph (in case hinting is applicable). */ - /* */ - /* Stroking a glyph with an outside border does not increase */ - /* `horiAdvance' or `vertAdvance'; you have to manually adjust these */ - /* values to account for the added width and height. */ - /* */ - typedef struct FT_Glyph_Metrics_ - { - FT_Pos width; - FT_Pos height; - - FT_Pos horiBearingX; - FT_Pos horiBearingY; - FT_Pos horiAdvance; - - FT_Pos vertBearingX; - FT_Pos vertBearingY; - FT_Pos vertAdvance; - - } FT_Glyph_Metrics; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Bitmap_Size */ - /* */ - /* <Description> */ - /* This structure models the metrics of a bitmap strike (i.e., a set */ - /* of glyphs for a given point size and resolution) in a bitmap font. */ - /* It is used for the `available_sizes' field of @FT_Face. */ - /* */ - /* <Fields> */ - /* height :: The vertical distance, in pixels, between two */ - /* consecutive baselines. It is always positive. */ - /* */ - /* width :: The average width, in pixels, of all glyphs in the */ - /* strike. */ - /* */ - /* size :: The nominal size of the strike in 26.6 fractional */ - /* points. This field is not very useful. */ - /* */ - /* x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional */ - /* pixels. */ - /* */ - /* y_ppem :: The vertical ppem (nominal height) in 26.6 fractional */ - /* pixels. */ - /* */ - /* <Note> */ - /* Windows FNT: */ - /* The nominal size given in a FNT font is not reliable. Thus when */ - /* the driver finds it incorrect, it sets `size' to some calculated */ - /* values and sets `x_ppem' and `y_ppem' to the pixel width and */ - /* height given in the font, respectively. */ - /* */ - /* TrueType embedded bitmaps: */ - /* `size', `width', and `height' values are not contained in the */ - /* bitmap strike itself. They are computed from the global font */ - /* parameters. */ - /* */ - typedef struct FT_Bitmap_Size_ - { - FT_Short height; - FT_Short width; - - FT_Pos size; - - FT_Pos x_ppem; - FT_Pos y_ppem; - - } FT_Bitmap_Size; - - - /*************************************************************************/ - /*************************************************************************/ - /* */ - /* O B J E C T C L A S S E S */ - /* */ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Library */ - /* */ - /* <Description> */ - /* A handle to a FreeType library instance. Each `library' is */ - /* completely independent from the others; it is the `root' of a set */ - /* of objects like fonts, faces, sizes, etc. */ - /* */ - /* It also embeds a memory manager (see @FT_Memory), as well as a */ - /* scan-line converter object (see @FT_Raster). */ - /* */ - /* In multi-threaded applications it is easiest to use one */ - /* `FT_Library' object per thread. In case this is too cumbersome, */ - /* a single `FT_Library' object across threads is possible also */ - /* (since FreeType version 2.5.6), as long as a mutex lock is used */ - /* around @FT_New_Face and @FT_Done_Face. */ - /* */ - /* <Note> */ - /* Library objects are normally created by @FT_Init_FreeType, and */ - /* destroyed with @FT_Done_FreeType. If you need reference-counting */ - /* (cf. @FT_Reference_Library), use @FT_New_Library and */ - /* @FT_Done_Library. */ - /* */ - typedef struct FT_LibraryRec_ *FT_Library; - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* module_management */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Module */ - /* */ - /* <Description> */ - /* A handle to a given FreeType module object. Each module can be a */ - /* font driver, a renderer, or anything else that provides services */ - /* to the formers. */ - /* */ - typedef struct FT_ModuleRec_* FT_Module; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Driver */ - /* */ - /* <Description> */ - /* A handle to a given FreeType font driver object. Each font driver */ - /* is a special module capable of creating faces from font files. */ - /* */ - typedef struct FT_DriverRec_* FT_Driver; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Renderer */ - /* */ - /* <Description> */ - /* A handle to a given FreeType renderer. A renderer is a special */ - /* module in charge of converting a glyph image to a bitmap, when */ - /* necessary. Each renderer supports a given glyph image format, and */ - /* one or more target surface depths. */ - /* */ - typedef struct FT_RendererRec_* FT_Renderer; - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* base_interface */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Face */ - /* */ - /* <Description> */ - /* A handle to a given typographic face object. A face object models */ - /* a given typeface, in a given style. */ - /* */ - /* <Note> */ - /* Each face object also owns a single @FT_GlyphSlot object, as well */ - /* as one or more @FT_Size objects. */ - /* */ - /* Use @FT_New_Face or @FT_Open_Face to create a new face object from */ - /* a given filepathname or a custom input stream. */ - /* */ - /* Use @FT_Done_Face to destroy it (along with its slot and sizes). */ - /* */ - /* An `FT_Face' object can only be safely used from one thread at a */ - /* time. Similarly, creation and destruction of `FT_Face' with the */ - /* same @FT_Library object can only be done from one thread at a */ - /* time. On the other hand, functions like @FT_Load_Glyph and its */ - /* siblings are thread-safe and do not need the lock to be held as */ - /* long as the same `FT_Face' object is not used from multiple */ - /* threads at the same time. */ - /* */ - /* <Also> */ - /* See @FT_FaceRec for the publicly accessible fields of a given face */ - /* object. */ - /* */ - typedef struct FT_FaceRec_* FT_Face; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Size */ - /* */ - /* <Description> */ - /* A handle to an object used to model a face scaled to a given */ - /* character size. */ - /* */ - /* <Note> */ - /* Each @FT_Face has an _active_ @FT_Size object that is used by */ - /* functions like @FT_Load_Glyph to determine the scaling */ - /* transformation that in turn is used to load and hint glyphs and */ - /* metrics. */ - /* */ - /* You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, */ - /* @FT_Request_Size or even @FT_Select_Size to change the content */ - /* (i.e., the scaling values) of the active @FT_Size. */ - /* */ - /* You can use @FT_New_Size to create additional size objects for a */ - /* given @FT_Face, but they won't be used by other functions until */ - /* you activate it through @FT_Activate_Size. Only one size can be */ - /* activated at any given time per face. */ - /* */ - /* <Also> */ - /* See @FT_SizeRec for the publicly accessible fields of a given size */ - /* object. */ - /* */ - typedef struct FT_SizeRec_* FT_Size; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_GlyphSlot */ - /* */ - /* <Description> */ - /* A handle to a given `glyph slot'. A slot is a container where it */ - /* is possible to load any of the glyphs contained in its parent */ - /* face. */ - /* */ - /* In other words, each time you call @FT_Load_Glyph or */ - /* @FT_Load_Char, the slot's content is erased by the new glyph data, */ - /* i.e., the glyph's metrics, its image (bitmap or outline), and */ - /* other control information. */ - /* */ - /* <Also> */ - /* See @FT_GlyphSlotRec for the publicly accessible glyph fields. */ - /* */ - typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_CharMap */ - /* */ - /* <Description> */ - /* A handle to a given character map. A charmap is used to translate */ - /* character codes in a given encoding into glyph indexes for its */ - /* parent's face. Some font formats may provide several charmaps per */ - /* font. */ - /* */ - /* Each face object owns zero or more charmaps, but only one of them */ - /* can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char. */ - /* */ - /* The list of available charmaps in a face is available through the */ - /* `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec. */ - /* */ - /* The currently active charmap is available as `face->charmap'. */ - /* You should call @FT_Set_Charmap to change it. */ - /* */ - /* <Note> */ - /* When a new face is created (either through @FT_New_Face or */ - /* @FT_Open_Face), the library looks for a Unicode charmap within */ - /* the list and automatically activates it. */ - /* */ - /* <Also> */ - /* See @FT_CharMapRec for the publicly accessible fields of a given */ - /* character map. */ - /* */ - typedef struct FT_CharMapRec_* FT_CharMap; - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_ENC_TAG */ - /* */ - /* <Description> */ - /* This macro converts four-letter tags into an unsigned long. It is */ - /* used to define `encoding' identifiers (see @FT_Encoding). */ - /* */ - /* <Note> */ - /* Since many 16-bit compilers don't like 32-bit enumerations, you */ - /* should redefine this macro in case of problems to something like */ - /* this: */ - /* */ - /* { */ - /* #define FT_ENC_TAG( value, a, b, c, d ) value */ - /* } */ - /* */ - /* to get a simple enumeration without assigning special numbers. */ - /* */ - -#ifndef FT_ENC_TAG -#define FT_ENC_TAG( value, a, b, c, d ) \ - value = ( ( (FT_UInt32)(a) << 24 ) | \ - ( (FT_UInt32)(b) << 16 ) | \ - ( (FT_UInt32)(c) << 8 ) | \ - (FT_UInt32)(d) ) - -#endif /* FT_ENC_TAG */ - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Encoding */ - /* */ - /* <Description> */ - /* An enumeration used to specify character sets supported by */ - /* charmaps. Used in the @FT_Select_Charmap API function. */ - /* */ - /* <Note> */ - /* Despite the name, this enumeration lists specific character */ - /* repertories (i.e., charsets), and not text encoding methods (e.g., */ - /* UTF-8, UTF-16, etc.). */ - /* */ - /* Other encodings might be defined in the future. */ - /* */ - /* <Values> */ - /* FT_ENCODING_NONE :: */ - /* The encoding value~0 is reserved. */ - /* */ - /* FT_ENCODING_UNICODE :: */ - /* Corresponds to the Unicode character set. This value covers */ - /* all versions of the Unicode repertoire, including ASCII and */ - /* Latin-1. Most fonts include a Unicode charmap, but not all */ - /* of them. */ - /* */ - /* For example, if you want to access Unicode value U+1F028 (and */ - /* the font contains it), use value 0x1F028 as the input value for */ - /* @FT_Get_Char_Index. */ - /* */ - /* FT_ENCODING_MS_SYMBOL :: */ - /* Corresponds to the Microsoft Symbol encoding, used to encode */ - /* mathematical symbols and wingdings. For more information, see */ - /* `http://www.microsoft.com/typography/otspec/recom.htm', */ - /* `http://www.kostis.net/charsets/symbol.htm', and */ - /* `http://www.kostis.net/charsets/wingding.htm'. */ - /* */ - /* This encoding uses character codes from the PUA (Private Unicode */ - /* Area) in the range U+F020-U+F0FF. */ - /* */ - /* FT_ENCODING_SJIS :: */ - /* Corresponds to Japanese SJIS encoding. More info at */ - /* at `http://en.wikipedia.org/wiki/Shift_JIS'. */ - /* See note on multi-byte encodings below. */ - /* */ - /* FT_ENCODING_GB2312 :: */ - /* Corresponds to an encoding system for Simplified Chinese as used */ - /* used in mainland China. */ - /* */ - /* FT_ENCODING_BIG5 :: */ - /* Corresponds to an encoding system for Traditional Chinese as */ - /* used in Taiwan and Hong Kong. */ - /* */ - /* FT_ENCODING_WANSUNG :: */ - /* Corresponds to the Korean encoding system known as Wansung. */ - /* For more information see */ - /* `https://msdn.microsoft.com/en-US/goglobal/cc305154'. */ - /* */ - /* FT_ENCODING_JOHAB :: */ - /* The Korean standard character set (KS~C 5601-1992), which */ - /* corresponds to MS Windows code page 1361. This character set */ - /* includes all possible Hangeul character combinations. */ - /* */ - /* FT_ENCODING_ADOBE_LATIN_1 :: */ - /* Corresponds to a Latin-1 encoding as defined in a Type~1 */ - /* PostScript font. It is limited to 256 character codes. */ - /* */ - /* FT_ENCODING_ADOBE_STANDARD :: */ - /* Corresponds to the Adobe Standard encoding, as found in Type~1, */ - /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ - /* codes. */ - /* */ - /* FT_ENCODING_ADOBE_EXPERT :: */ - /* Corresponds to the Adobe Expert encoding, as found in Type~1, */ - /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ - /* codes. */ - /* */ - /* FT_ENCODING_ADOBE_CUSTOM :: */ - /* Corresponds to a custom encoding, as found in Type~1, CFF, and */ - /* OpenType/CFF fonts. It is limited to 256 character codes. */ - /* */ - /* FT_ENCODING_APPLE_ROMAN :: */ - /* Corresponds to the 8-bit Apple roman encoding. Many TrueType */ - /* and OpenType fonts contain a charmap for this encoding, since */ - /* older versions of Mac OS are able to use it. */ - /* */ - /* FT_ENCODING_OLD_LATIN_2 :: */ - /* This value is deprecated and was never used nor reported by */ - /* FreeType. Don't use or test for it. */ - /* */ - /* FT_ENCODING_MS_SJIS :: */ - /* Same as FT_ENCODING_SJIS. Deprecated. */ - /* */ - /* FT_ENCODING_MS_GB2312 :: */ - /* Same as FT_ENCODING_GB2312. Deprecated. */ - /* */ - /* FT_ENCODING_MS_BIG5 :: */ - /* Same as FT_ENCODING_BIG5. Deprecated. */ - /* */ - /* FT_ENCODING_MS_WANSUNG :: */ - /* Same as FT_ENCODING_WANSUNG. Deprecated. */ - /* */ - /* FT_ENCODING_MS_JOHAB :: */ - /* Same as FT_ENCODING_JOHAB. Deprecated. */ - /* */ - /* <Note> */ - /* By default, FreeType automatically synthesizes a Unicode charmap */ - /* for PostScript fonts, using their glyph names dictionaries. */ - /* However, it also reports the encodings defined explicitly in the */ - /* font file, for the cases when they are needed, with the Adobe */ - /* values as well. */ - /* */ - /* FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap */ - /* is neither Unicode nor ISO-8859-1 (otherwise it is set to */ - /* FT_ENCODING_UNICODE). Use @FT_Get_BDF_Charset_ID to find out */ - /* which encoding is really present. If, for example, the */ - /* `cs_registry' field is `KOI8' and the `cs_encoding' field is `R', */ - /* the font is encoded in KOI8-R. */ - /* */ - /* FT_ENCODING_NONE is always set (with a single exception) by the */ - /* winfonts driver. Use @FT_Get_WinFNT_Header and examine the */ - /* `charset' field of the @FT_WinFNT_HeaderRec structure to find out */ - /* which encoding is really present. For example, */ - /* @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for */ - /* Russian). */ - /* */ - /* FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */ - /* and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to */ - /* FT_ENCODING_APPLE_ROMAN). */ - /* */ - /* If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function */ - /* @FT_Get_CMap_Language_ID to query the Mac language ID that may */ - /* be needed to be able to distinguish Apple encoding variants. See */ - /* */ - /* http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt */ - /* */ - /* to get an idea how to do that. Basically, if the language ID */ - /* is~0, don't use it, otherwise subtract 1 from the language ID. */ - /* Then examine `encoding_id'. If, for example, `encoding_id' is */ - /* @TT_MAC_ID_ROMAN and the language ID (minus~1) is */ - /* `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman. */ - /* @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi */ - /* variant the Arabic encoding. */ - /* */ - typedef enum FT_Encoding_ - { - FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), - - FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ), - FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), - - FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ), - FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ), - FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ), - FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ), - FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ), - - /* for backwards compatibility */ - FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, - FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312, - FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, - FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, - FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, - - FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ), - FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ), - FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ), - FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ), - - FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ), - - FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' ) - - } FT_Encoding; - - - /* these constants are deprecated; use the corresponding `FT_Encoding' */ - /* values instead */ -#define ft_encoding_none FT_ENCODING_NONE -#define ft_encoding_unicode FT_ENCODING_UNICODE -#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL -#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 -#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 -#define ft_encoding_sjis FT_ENCODING_SJIS -#define ft_encoding_gb2312 FT_ENCODING_GB2312 -#define ft_encoding_big5 FT_ENCODING_BIG5 -#define ft_encoding_wansung FT_ENCODING_WANSUNG -#define ft_encoding_johab FT_ENCODING_JOHAB - -#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD -#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT -#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM -#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_CharMapRec */ - /* */ - /* <Description> */ - /* The base charmap structure. */ - /* */ - /* <Fields> */ - /* face :: A handle to the parent face object. */ - /* */ - /* encoding :: An @FT_Encoding tag identifying the charmap. Use */ - /* this with @FT_Select_Charmap. */ - /* */ - /* platform_id :: An ID number describing the platform for the */ - /* following encoding ID. This comes directly from */ - /* the TrueType specification and should be emulated */ - /* for other formats. */ - /* */ - /* encoding_id :: A platform specific encoding number. This also */ - /* comes from the TrueType specification and should be */ - /* emulated similarly. */ - /* */ - typedef struct FT_CharMapRec_ - { - FT_Face face; - FT_Encoding encoding; - FT_UShort platform_id; - FT_UShort encoding_id; - - } FT_CharMapRec; - - - /*************************************************************************/ - /*************************************************************************/ - /* */ - /* B A S E O B J E C T C L A S S E S */ - /* */ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Face_Internal */ - /* */ - /* <Description> */ - /* An opaque handle to an `FT_Face_InternalRec' structure, used to */ - /* model private data of a given @FT_Face object. */ - /* */ - /* This structure might change between releases of FreeType~2 and is */ - /* not generally available to client applications. */ - /* */ - typedef struct FT_Face_InternalRec_* FT_Face_Internal; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_FaceRec */ - /* */ - /* <Description> */ - /* FreeType root face class structure. A face object models a */ - /* typeface in a font file. */ - /* */ - /* <Fields> */ - /* num_faces :: The number of faces in the font file. Some */ - /* font formats can have multiple faces in */ - /* a font file. */ - /* */ - /* face_index :: This field holds two different values. */ - /* Bits 0-15 are the index of the face in the */ - /* font file (starting with value~0). They */ - /* are set to~0 if there is only one face in */ - /* the font file. */ - /* */ - /* Bits 16-30 are relevant to GX variation */ - /* fonts only, holding the named instance */ - /* index for the current face index (starting */ - /* with value~1; value~0 indicates font access */ - /* without GX variation data). For non-GX */ - /* fonts, bits 16-30 are ignored. If we have */ - /* the third named instance of face~4, say, */ - /* `face_index' is set to 0x00030004. */ - /* */ - /* Bit 31 is always zero (this is, */ - /* `face_index' is always a positive value). */ - /* */ - /* face_flags :: A set of bit flags that give important */ - /* information about the face; see */ - /* @FT_FACE_FLAG_XXX for the details. */ - /* */ - /* style_flags :: The lower 16~bits contain a set of bit */ - /* flags indicating the style of the face; see */ - /* @FT_STYLE_FLAG_XXX for the details. Bits */ - /* 16-30 hold the number of named instances */ - /* available for the current face if we have a */ - /* GX variation (sub)font. Bit 31 is always */ - /* zero (this is, `style_flags' is always a */ - /* positive value). */ - /* */ - /* num_glyphs :: The number of glyphs in the face. If the */ - /* face is scalable and has sbits (see */ - /* `num_fixed_sizes'), it is set to the number */ - /* of outline glyphs. */ - /* */ - /* For CID-keyed fonts, this value gives the */ - /* highest CID used in the font. */ - /* */ - /* family_name :: The face's family name. This is an ASCII */ - /* string, usually in English, that describes */ - /* the typeface's family (like `Times New */ - /* Roman', `Bodoni', `Garamond', etc). This */ - /* is a least common denominator used to list */ - /* fonts. Some formats (TrueType & OpenType) */ - /* provide localized and Unicode versions of */ - /* this string. Applications should use the */ - /* format specific interface to access them. */ - /* Can be NULL (e.g., in fonts embedded in a */ - /* PDF file). */ - /* */ - /* In case the font doesn't provide a specific */ - /* family name entry, FreeType tries to */ - /* synthesize one, deriving it from other name */ - /* entries. */ - /* */ - /* style_name :: The face's style name. This is an ASCII */ - /* string, usually in English, that describes */ - /* the typeface's style (like `Italic', */ - /* `Bold', `Condensed', etc). Not all font */ - /* formats provide a style name, so this field */ - /* is optional, and can be set to NULL. As */ - /* for `family_name', some formats provide */ - /* localized and Unicode versions of this */ - /* string. Applications should use the format */ - /* specific interface to access them. */ - /* */ - /* num_fixed_sizes :: The number of bitmap strikes in the face. */ - /* Even if the face is scalable, there might */ - /* still be bitmap strikes, which are called */ - /* `sbits' in that case. */ - /* */ - /* available_sizes :: An array of @FT_Bitmap_Size for all bitmap */ - /* strikes in the face. It is set to NULL if */ - /* there is no bitmap strike. */ - /* */ - /* num_charmaps :: The number of charmaps in the face. */ - /* */ - /* charmaps :: An array of the charmaps of the face. */ - /* */ - /* generic :: A field reserved for client uses. See the */ - /* @FT_Generic type description. */ - /* */ - /* bbox :: The font bounding box. Coordinates are */ - /* expressed in font units (see */ - /* `units_per_EM'). The box is large enough */ - /* to contain any glyph from the font. Thus, */ - /* `bbox.yMax' can be seen as the `maximum */ - /* ascender', and `bbox.yMin' as the `minimum */ - /* descender'. Only relevant for scalable */ - /* formats. */ - /* */ - /* Note that the bounding box might be off by */ - /* (at least) one pixel for hinted fonts. See */ - /* @FT_Size_Metrics for further discussion. */ - /* */ - /* units_per_EM :: The number of font units per EM square for */ - /* this face. This is typically 2048 for */ - /* TrueType fonts, and 1000 for Type~1 fonts. */ - /* Only relevant for scalable formats. */ - /* */ - /* ascender :: The typographic ascender of the face, */ - /* expressed in font units. For font formats */ - /* not having this information, it is set to */ - /* `bbox.yMax'. Only relevant for scalable */ - /* formats. */ - /* */ - /* descender :: The typographic descender of the face, */ - /* expressed in font units. For font formats */ - /* not having this information, it is set to */ - /* `bbox.yMin'. Note that this field is */ - /* usually negative. Only relevant for */ - /* scalable formats. */ - /* */ - /* height :: This value is the vertical distance */ - /* between two consecutive baselines, */ - /* expressed in font units. It is always */ - /* positive. Only relevant for scalable */ - /* formats. */ - /* */ - /* If you want the global glyph height, use */ - /* `ascender - descender'. */ - /* */ - /* max_advance_width :: The maximum advance width, in font units, */ - /* for all glyphs in this face. This can be */ - /* used to make word wrapping computations */ - /* faster. Only relevant for scalable */ - /* formats. */ - /* */ - /* max_advance_height :: The maximum advance height, in font units, */ - /* for all glyphs in this face. This is only */ - /* relevant for vertical layouts, and is set */ - /* to `height' for fonts that do not provide */ - /* vertical metrics. Only relevant for */ - /* scalable formats. */ - /* */ - /* underline_position :: The position, in font units, of the */ - /* underline line for this face. It is the */ - /* center of the underlining stem. Only */ - /* relevant for scalable formats. */ - /* */ - /* underline_thickness :: The thickness, in font units, of the */ - /* underline for this face. Only relevant for */ - /* scalable formats. */ - /* */ - /* glyph :: The face's associated glyph slot(s). */ - /* */ - /* size :: The current active size for this face. */ - /* */ - /* charmap :: The current active charmap for this face. */ - /* */ - /* <Note> */ - /* Fields may be changed after a call to @FT_Attach_File or */ - /* @FT_Attach_Stream. */ - /* */ - typedef struct FT_FaceRec_ - { - FT_Long num_faces; - FT_Long face_index; - - FT_Long face_flags; - FT_Long style_flags; - - FT_Long num_glyphs; - - FT_String* family_name; - FT_String* style_name; - - FT_Int num_fixed_sizes; - FT_Bitmap_Size* available_sizes; - - FT_Int num_charmaps; - FT_CharMap* charmaps; - - FT_Generic generic; - - /*# The following member variables (down to `underline_thickness') */ - /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ - /*# for bitmap fonts. */ - FT_BBox bbox; - - FT_UShort units_per_EM; - FT_Short ascender; - FT_Short descender; - FT_Short height; - - FT_Short max_advance_width; - FT_Short max_advance_height; - - FT_Short underline_position; - FT_Short underline_thickness; - - FT_GlyphSlot glyph; - FT_Size size; - FT_CharMap charmap; - - /*@private begin */ - - FT_Driver driver; - FT_Memory memory; - FT_Stream stream; - - FT_ListRec sizes_list; - - FT_Generic autohint; /* face-specific auto-hinter data */ - void* extensions; /* unused */ - - FT_Face_Internal internal; - - /*@private end */ - - } FT_FaceRec; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_FACE_FLAG_XXX */ - /* */ - /* <Description> */ - /* A list of bit flags used in the `face_flags' field of the */ - /* @FT_FaceRec structure. They inform client applications of */ - /* properties of the corresponding face. */ - /* */ - /* <Values> */ - /* FT_FACE_FLAG_SCALABLE :: */ - /* Indicates that the face contains outline glyphs. This doesn't */ - /* prevent bitmap strikes, i.e., a face can have both this and */ - /* and @FT_FACE_FLAG_FIXED_SIZES set. */ - /* */ - /* FT_FACE_FLAG_FIXED_SIZES :: */ - /* Indicates that the face contains bitmap strikes. See also the */ - /* `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec. */ - /* */ - /* FT_FACE_FLAG_FIXED_WIDTH :: */ - /* Indicates that the face contains fixed-width characters (like */ - /* Courier, Lucido, MonoType, etc.). */ - /* */ - /* FT_FACE_FLAG_SFNT :: */ - /* Indicates that the face uses the `sfnt' storage scheme. For */ - /* now, this means TrueType and OpenType. */ - /* */ - /* FT_FACE_FLAG_HORIZONTAL :: */ - /* Indicates that the face contains horizontal glyph metrics. This */ - /* should be set for all common formats. */ - /* */ - /* FT_FACE_FLAG_VERTICAL :: */ - /* Indicates that the face contains vertical glyph metrics. This */ - /* is only available in some formats, not all of them. */ - /* */ - /* FT_FACE_FLAG_KERNING :: */ - /* Indicates that the face contains kerning information. If set, */ - /* the kerning distance can be retrieved through the function */ - /* @FT_Get_Kerning. Otherwise the function always return the */ - /* vector (0,0). Note that FreeType doesn't handle kerning data */ - /* from the `GPOS' table (as present in some OpenType fonts). */ - /* */ - /* FT_FACE_FLAG_FAST_GLYPHS :: */ - /* THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. */ - /* */ - /* FT_FACE_FLAG_MULTIPLE_MASTERS :: */ - /* Indicates that the font contains multiple masters and is capable */ - /* of interpolating between them. See the multiple-masters */ - /* specific API for details. */ - /* */ - /* FT_FACE_FLAG_GLYPH_NAMES :: */ - /* Indicates that the font contains glyph names that can be */ - /* retrieved through @FT_Get_Glyph_Name. Note that some TrueType */ - /* fonts contain broken glyph name tables. Use the function */ - /* @FT_Has_PS_Glyph_Names when needed. */ - /* */ - /* FT_FACE_FLAG_EXTERNAL_STREAM :: */ - /* Used internally by FreeType to indicate that a face's stream was */ - /* provided by the client application and should not be destroyed */ - /* when @FT_Done_Face is called. Don't read or test this flag. */ - /* */ - /* FT_FACE_FLAG_HINTER :: */ - /* Set if the font driver has a hinting machine of its own. For */ - /* example, with TrueType fonts, it makes sense to use data from */ - /* the SFNT `gasp' table only if the native TrueType hinting engine */ - /* (with the bytecode interpreter) is available and active. */ - /* */ - /* FT_FACE_FLAG_CID_KEYED :: */ - /* Set if the font is CID-keyed. In that case, the font is not */ - /* accessed by glyph indices but by CID values. For subsetted */ - /* CID-keyed fonts this has the consequence that not all index */ - /* values are a valid argument to FT_Load_Glyph. Only the CID */ - /* values for which corresponding glyphs in the subsetted font */ - /* exist make FT_Load_Glyph return successfully; in all other cases */ - /* you get an `FT_Err_Invalid_Argument' error. */ - /* */ - /* Note that CID-keyed fonts that are in an SFNT wrapper don't */ - /* have this flag set since the glyphs are accessed in the normal */ - /* way (using contiguous indices); the `CID-ness' isn't visible to */ - /* the application. */ - /* */ - /* FT_FACE_FLAG_TRICKY :: */ - /* Set if the font is `tricky', this is, it always needs the */ - /* font format's native hinting engine to get a reasonable result. */ - /* A typical example is the Chinese font `mingli.ttf' that uses */ - /* TrueType bytecode instructions to move and scale all of its */ - /* subglyphs. */ - /* */ - /* It is not possible to auto-hint such fonts using */ - /* @FT_LOAD_FORCE_AUTOHINT; it will also ignore */ - /* @FT_LOAD_NO_HINTING. You have to set both @FT_LOAD_NO_HINTING */ - /* and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */ - /* probably never want this except for demonstration purposes. */ - /* */ - /* Currently, there are about a dozen TrueType fonts in the list of */ - /* tricky fonts; they are hard-coded in file `ttobjs.c'. */ - /* */ - /* FT_FACE_FLAG_COLOR :: */ - /* Set if the font has color glyph tables. To access color glyphs */ - /* use @FT_LOAD_COLOR. */ - /* */ -#define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) -#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) -#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) -#define FT_FACE_FLAG_SFNT ( 1L << 3 ) -#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 ) -#define FT_FACE_FLAG_VERTICAL ( 1L << 5 ) -#define FT_FACE_FLAG_KERNING ( 1L << 6 ) -#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 ) -#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) -#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) -#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) -#define FT_FACE_FLAG_HINTER ( 1L << 11 ) -#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 ) -#define FT_FACE_FLAG_TRICKY ( 1L << 13 ) -#define FT_FACE_FLAG_COLOR ( 1L << 14 ) - - - /************************************************************************* - * - * @macro: - * FT_HAS_HORIZONTAL( face ) - * - * @description: - * A macro that returns true whenever a face object contains - * horizontal metrics (this is true for all font formats though). - * - * @also: - * @FT_HAS_VERTICAL can be used to check for vertical metrics. - * - */ -#define FT_HAS_HORIZONTAL( face ) \ - ( face->face_flags & FT_FACE_FLAG_HORIZONTAL ) - - - /************************************************************************* - * - * @macro: - * FT_HAS_VERTICAL( face ) - * - * @description: - * A macro that returns true whenever a face object contains real - * vertical metrics (and not only synthesized ones). - * - */ -#define FT_HAS_VERTICAL( face ) \ - ( face->face_flags & FT_FACE_FLAG_VERTICAL ) - - - /************************************************************************* - * - * @macro: - * FT_HAS_KERNING( face ) - * - * @description: - * A macro that returns true whenever a face object contains kerning - * data that can be accessed with @FT_Get_Kerning. - * - */ -#define FT_HAS_KERNING( face ) \ - ( face->face_flags & FT_FACE_FLAG_KERNING ) - - - /************************************************************************* - * - * @macro: - * FT_IS_SCALABLE( face ) - * - * @description: - * A macro that returns true whenever a face object contains a scalable - * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF, - * and PFR font formats. - * - */ -#define FT_IS_SCALABLE( face ) \ - ( face->face_flags & FT_FACE_FLAG_SCALABLE ) - - - /************************************************************************* - * - * @macro: - * FT_IS_SFNT( face ) - * - * @description: - * A macro that returns true whenever a face object contains a font - * whose format is based on the SFNT storage scheme. This usually - * means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded - * bitmap fonts. - * - * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and - * @FT_TRUETYPE_TABLES_H are available. - * - */ -#define FT_IS_SFNT( face ) \ - ( face->face_flags & FT_FACE_FLAG_SFNT ) - - - /************************************************************************* - * - * @macro: - * FT_IS_FIXED_WIDTH( face ) - * - * @description: - * A macro that returns true whenever a face object contains a font face - * that contains fixed-width (or `monospace', `fixed-pitch', etc.) - * glyphs. - * - */ -#define FT_IS_FIXED_WIDTH( face ) \ - ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) - - - /************************************************************************* - * - * @macro: - * FT_HAS_FIXED_SIZES( face ) - * - * @description: - * A macro that returns true whenever a face object contains some - * embedded bitmaps. See the `available_sizes' field of the - * @FT_FaceRec structure. - * - */ -#define FT_HAS_FIXED_SIZES( face ) \ - ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES ) - - - /************************************************************************* - * - * @macro: - * FT_HAS_FAST_GLYPHS( face ) - * - * @description: - * Deprecated. - * - */ -#define FT_HAS_FAST_GLYPHS( face ) 0 - - - /************************************************************************* - * - * @macro: - * FT_HAS_GLYPH_NAMES( face ) - * - * @description: - * A macro that returns true whenever a face object contains some glyph - * names that can be accessed through @FT_Get_Glyph_Name. - * - */ -#define FT_HAS_GLYPH_NAMES( face ) \ - ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) - - - /************************************************************************* - * - * @macro: - * FT_HAS_MULTIPLE_MASTERS( face ) - * - * @description: - * A macro that returns true whenever a face object contains some - * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H - * are then available to choose the exact design you want. - * - */ -#define FT_HAS_MULTIPLE_MASTERS( face ) \ - ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) - - - /************************************************************************* - * - * @macro: - * FT_IS_CID_KEYED( face ) - * - * @description: - * A macro that returns true whenever a face object contains a CID-keyed - * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more - * details. - * - * If this macro is true, all functions defined in @FT_CID_H are - * available. - * - */ -#define FT_IS_CID_KEYED( face ) \ - ( face->face_flags & FT_FACE_FLAG_CID_KEYED ) - - - /************************************************************************* - * - * @macro: - * FT_IS_TRICKY( face ) - * - * @description: - * A macro that returns true whenever a face represents a `tricky' font. - * See the discussion of @FT_FACE_FLAG_TRICKY for more details. - * - */ -#define FT_IS_TRICKY( face ) \ - ( face->face_flags & FT_FACE_FLAG_TRICKY ) - - - /************************************************************************* - * - * @macro: - * FT_HAS_COLOR( face ) - * - * @description: - * A macro that returns true whenever a face object contains - * tables for color glyphs. - * - */ -#define FT_HAS_COLOR( face ) \ - ( face->face_flags & FT_FACE_FLAG_COLOR ) - - - /*************************************************************************/ - /* */ - /* <Const> */ - /* FT_STYLE_FLAG_XXX */ - /* */ - /* <Description> */ - /* A list of bit flags used to indicate the style of a given face. */ - /* These are used in the `style_flags' field of @FT_FaceRec. */ - /* */ - /* <Values> */ - /* FT_STYLE_FLAG_ITALIC :: */ - /* Indicates that a given face style is italic or oblique. */ - /* */ - /* FT_STYLE_FLAG_BOLD :: */ - /* Indicates that a given face is bold. */ - /* */ - /* <Note> */ - /* The style information as provided by FreeType is very basic. More */ - /* details are beyond the scope and should be done on a higher level */ - /* (for example, by analyzing various fields of the `OS/2' table in */ - /* SFNT based fonts). */ - /* */ -#define FT_STYLE_FLAG_ITALIC ( 1 << 0 ) -#define FT_STYLE_FLAG_BOLD ( 1 << 1 ) - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Size_Internal */ - /* */ - /* <Description> */ - /* An opaque handle to an `FT_Size_InternalRec' structure, used to */ - /* model private data of a given @FT_Size object. */ - /* */ - typedef struct FT_Size_InternalRec_* FT_Size_Internal; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Size_Metrics */ - /* */ - /* <Description> */ - /* The size metrics structure gives the metrics of a size object. */ - /* */ - /* <Fields> */ - /* x_ppem :: The width of the scaled EM square in pixels, hence */ - /* the term `ppem' (pixels per EM). It is also */ - /* referred to as `nominal width'. */ - /* */ - /* y_ppem :: The height of the scaled EM square in pixels, */ - /* hence the term `ppem' (pixels per EM). It is also */ - /* referred to as `nominal height'. */ - /* */ - /* x_scale :: A 16.16 fractional scaling value used to convert */ - /* horizontal metrics from font units to 26.6 */ - /* fractional pixels. Only relevant for scalable */ - /* font formats. */ - /* */ - /* y_scale :: A 16.16 fractional scaling value used to convert */ - /* vertical metrics from font units to 26.6 */ - /* fractional pixels. Only relevant for scalable */ - /* font formats. */ - /* */ - /* ascender :: The ascender in 26.6 fractional pixels. See */ - /* @FT_FaceRec for the details. */ - /* */ - /* descender :: The descender in 26.6 fractional pixels. See */ - /* @FT_FaceRec for the details. */ - /* */ - /* height :: The height in 26.6 fractional pixels. See */ - /* @FT_FaceRec for the details. */ - /* */ - /* max_advance :: The maximum advance width in 26.6 fractional */ - /* pixels. See @FT_FaceRec for the details. */ - /* */ - /* <Note> */ - /* The scaling values, if relevant, are determined first during a */ - /* size changing operation. The remaining fields are then set by the */ - /* driver. For scalable formats, they are usually set to scaled */ - /* values of the corresponding fields in @FT_FaceRec. */ - /* */ - /* Note that due to glyph hinting, these values might not be exact */ - /* for certain fonts. Thus they must be treated as unreliable */ - /* with an error margin of at least one pixel! */ - /* */ - /* Indeed, the only way to get the exact metrics is to render _all_ */ - /* glyphs. As this would be a definite performance hit, it is up to */ - /* client applications to perform such computations. */ - /* */ - /* The FT_Size_Metrics structure is valid for bitmap fonts also. */ - /* */ - typedef struct FT_Size_Metrics_ - { - FT_UShort x_ppem; /* horizontal pixels per EM */ - FT_UShort y_ppem; /* vertical pixels per EM */ - - FT_Fixed x_scale; /* scaling values used to convert font */ - FT_Fixed y_scale; /* units to 26.6 fractional pixels */ - - FT_Pos ascender; /* ascender in 26.6 frac. pixels */ - FT_Pos descender; /* descender in 26.6 frac. pixels */ - FT_Pos height; /* text height in 26.6 frac. pixels */ - FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */ - - } FT_Size_Metrics; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_SizeRec */ - /* */ - /* <Description> */ - /* FreeType root size class structure. A size object models a face */ - /* object at a given size. */ - /* */ - /* <Fields> */ - /* face :: Handle to the parent face object. */ - /* */ - /* generic :: A typeless pointer, unused by the FreeType library or */ - /* any of its drivers. It can be used by client */ - /* applications to link their own data to each size */ - /* object. */ - /* */ - /* metrics :: Metrics for this size object. This field is read-only. */ - /* */ - typedef struct FT_SizeRec_ - { - FT_Face face; /* parent face object */ - FT_Generic generic; /* generic pointer for client uses */ - FT_Size_Metrics metrics; /* size metrics */ - FT_Size_Internal internal; - - } FT_SizeRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_SubGlyph */ - /* */ - /* <Description> */ - /* The subglyph structure is an internal object used to describe */ - /* subglyphs (for example, in the case of composites). */ - /* */ - /* <Note> */ - /* The subglyph implementation is not part of the high-level API, */ - /* hence the forward structure declaration. */ - /* */ - /* You can however retrieve subglyph information with */ - /* @FT_Get_SubGlyph_Info. */ - /* */ - typedef struct FT_SubGlyphRec_* FT_SubGlyph; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Slot_Internal */ - /* */ - /* <Description> */ - /* An opaque handle to an `FT_Slot_InternalRec' structure, used to */ - /* model private data of a given @FT_GlyphSlot object. */ - /* */ - typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_GlyphSlotRec */ - /* */ - /* <Description> */ - /* FreeType root glyph slot class structure. A glyph slot is a */ - /* container where individual glyphs can be loaded, be they in */ - /* outline or bitmap format. */ - /* */ - /* <Fields> */ - /* library :: A handle to the FreeType library instance */ - /* this slot belongs to. */ - /* */ - /* face :: A handle to the parent face object. */ - /* */ - /* next :: In some cases (like some font tools), several */ - /* glyph slots per face object can be a good */ - /* thing. As this is rare, the glyph slots are */ - /* listed through a direct, single-linked list */ - /* using its `next' field. */ - /* */ - /* generic :: A typeless pointer unused by the FreeType */ - /* library or any of its drivers. It can be */ - /* used by client applications to link their own */ - /* data to each glyph slot object. */ - /* */ - /* metrics :: The metrics of the last loaded glyph in the */ - /* slot. The returned values depend on the last */ - /* load flags (see the @FT_Load_Glyph API */ - /* function) and can be expressed either in 26.6 */ - /* fractional pixels or font units. */ - /* */ - /* Note that even when the glyph image is */ - /* transformed, the metrics are not. */ - /* */ - /* linearHoriAdvance :: The advance width of the unhinted glyph. */ - /* Its value is expressed in 16.16 fractional */ - /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ - /* when loading the glyph. This field can be */ - /* important to perform correct WYSIWYG layout. */ - /* Only relevant for outline glyphs. */ - /* */ - /* linearVertAdvance :: The advance height of the unhinted glyph. */ - /* Its value is expressed in 16.16 fractional */ - /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ - /* when loading the glyph. This field can be */ - /* important to perform correct WYSIWYG layout. */ - /* Only relevant for outline glyphs. */ - /* */ - /* advance :: This shorthand is, depending on */ - /* @FT_LOAD_IGNORE_TRANSFORM, the transformed */ - /* (hinted) advance width for the glyph, in 26.6 */ - /* fractional pixel format. As specified with */ - /* @FT_LOAD_VERTICAL_LAYOUT, it uses either the */ - /* `horiAdvance' or the `vertAdvance' value of */ - /* `metrics' field. */ - /* */ - /* format :: This field indicates the format of the image */ - /* contained in the glyph slot. Typically */ - /* @FT_GLYPH_FORMAT_BITMAP, */ - /* @FT_GLYPH_FORMAT_OUTLINE, or */ - /* @FT_GLYPH_FORMAT_COMPOSITE, but others are */ - /* possible. */ - /* */ - /* bitmap :: This field is used as a bitmap descriptor */ - /* when the slot format is */ - /* @FT_GLYPH_FORMAT_BITMAP. Note that the */ - /* address and content of the bitmap buffer can */ - /* change between calls of @FT_Load_Glyph and a */ - /* few other functions. */ - /* */ - /* bitmap_left :: The bitmap's left bearing expressed in */ - /* integer pixels. Only valid if the format is */ - /* @FT_GLYPH_FORMAT_BITMAP, this is, if the */ - /* glyph slot contains a bitmap. */ - /* */ - /* bitmap_top :: The bitmap's top bearing expressed in integer */ - /* pixels. Remember that this is the distance */ - /* from the baseline to the top-most glyph */ - /* scanline, upwards y~coordinates being */ - /* *positive*. */ - /* */ - /* outline :: The outline descriptor for the current glyph */ - /* image if its format is */ - /* @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is */ - /* loaded, `outline' can be transformed, */ - /* distorted, embolded, etc. However, it must */ - /* not be freed. */ - /* */ - /* num_subglyphs :: The number of subglyphs in a composite glyph. */ - /* This field is only valid for the composite */ - /* glyph format that should normally only be */ - /* loaded with the @FT_LOAD_NO_RECURSE flag. */ - /* */ - /* subglyphs :: An array of subglyph descriptors for */ - /* composite glyphs. There are `num_subglyphs' */ - /* elements in there. Currently internal to */ - /* FreeType. */ - /* */ - /* control_data :: Certain font drivers can also return the */ - /* control data for a given glyph image (e.g. */ - /* TrueType bytecode, Type~1 charstrings, etc.). */ - /* This field is a pointer to such data. */ - /* */ - /* control_len :: This is the length in bytes of the control */ - /* data. */ - /* */ - /* other :: Really wicked formats can use this pointer to */ - /* present their own glyph image to client */ - /* applications. Note that the application */ - /* needs to know about the image format. */ - /* */ - /* lsb_delta :: The difference between hinted and unhinted */ - /* left side bearing while auto-hinting is */ - /* active. Zero otherwise. */ - /* */ - /* rsb_delta :: The difference between hinted and unhinted */ - /* right side bearing while auto-hinting is */ - /* active. Zero otherwise. */ - /* */ - /* <Note> */ - /* If @FT_Load_Glyph is called with default flags (see */ - /* @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in */ - /* its native format (e.g., an outline glyph for TrueType and Type~1 */ - /* formats). */ - /* */ - /* This image can later be converted into a bitmap by calling */ - /* @FT_Render_Glyph. This function finds the current renderer for */ - /* the native image's format, then invokes it. */ - /* */ - /* The renderer is in charge of transforming the native image through */ - /* the slot's face transformation fields, then converting it into a */ - /* bitmap that is returned in `slot->bitmap'. */ - /* */ - /* Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */ - /* to specify the position of the bitmap relative to the current pen */ - /* position (e.g., coordinates (0,0) on the baseline). Of course, */ - /* `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP. */ - /* */ - /* <Note> */ - /* Here is a small pseudo code fragment that shows how to use */ - /* `lsb_delta' and `rsb_delta': */ - /* */ - /* { */ - /* FT_Pos origin_x = 0; */ - /* FT_Pos prev_rsb_delta = 0; */ - /* */ - /* */ - /* for all glyphs do */ - /* <compute kern between current and previous glyph and add it to */ - /* `origin_x'> */ - /* */ - /* <load glyph with `FT_Load_Glyph'> */ - /* */ - /* if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 ) */ - /* origin_x -= 64; */ - /* else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 ) */ - /* origin_x += 64; */ - /* */ - /* prev_rsb_delta = face->glyph->rsb_delta; */ - /* */ - /* <save glyph image, or render glyph, or ...> */ - /* */ - /* origin_x += face->glyph->advance.x; */ - /* endfor */ - /* } */ - /* */ - typedef struct FT_GlyphSlotRec_ - { - FT_Library library; - FT_Face face; - FT_GlyphSlot next; - FT_UInt reserved; /* retained for binary compatibility */ - FT_Generic generic; - - FT_Glyph_Metrics metrics; - FT_Fixed linearHoriAdvance; - FT_Fixed linearVertAdvance; - FT_Vector advance; - - FT_Glyph_Format format; - - FT_Bitmap bitmap; - FT_Int bitmap_left; - FT_Int bitmap_top; - - FT_Outline outline; - - FT_UInt num_subglyphs; - FT_SubGlyph subglyphs; - - void* control_data; - long control_len; - - FT_Pos lsb_delta; - FT_Pos rsb_delta; - - void* other; - - FT_Slot_Internal internal; - - } FT_GlyphSlotRec; - - - /*************************************************************************/ - /*************************************************************************/ - /* */ - /* F U N C T I O N S */ - /* */ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Init_FreeType */ - /* */ - /* <Description> */ - /* Initialize a new FreeType library object. The set of modules */ - /* that are registered by this function is determined at build time. */ - /* */ - /* <Output> */ - /* alibrary :: A handle to a new library object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* In case you want to provide your own memory allocating routines, */ - /* use @FT_New_Library instead, followed by a call to */ - /* @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module). */ - /* */ - /* See the documentation of @FT_Library and @FT_Face for */ - /* multi-threading issues. */ - /* */ - /* If you need reference-counting (cf. @FT_Reference_Library), use */ - /* @FT_New_Library and @FT_Done_Library. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Init_FreeType( FT_Library *alibrary ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_FreeType */ - /* */ - /* <Description> */ - /* Destroy a given FreeType library object and all of its children, */ - /* including resources, drivers, faces, sizes, etc. */ - /* */ - /* <Input> */ - /* library :: A handle to the target library object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Done_FreeType( FT_Library library ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_OPEN_XXX */ - /* */ - /* <Description> */ - /* A list of bit field constants used within the `flags' field of the */ - /* @FT_Open_Args structure. */ - /* */ - /* <Values> */ - /* FT_OPEN_MEMORY :: This is a memory-based stream. */ - /* */ - /* FT_OPEN_STREAM :: Copy the stream from the `stream' field. */ - /* */ - /* FT_OPEN_PATHNAME :: Create a new input stream from a C~path */ - /* name. */ - /* */ - /* FT_OPEN_DRIVER :: Use the `driver' field. */ - /* */ - /* FT_OPEN_PARAMS :: Use the `num_params' and `params' fields. */ - /* */ - /* <Note> */ - /* The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME' */ - /* flags are mutually exclusive. */ - /* */ -#define FT_OPEN_MEMORY 0x1 -#define FT_OPEN_STREAM 0x2 -#define FT_OPEN_PATHNAME 0x4 -#define FT_OPEN_DRIVER 0x8 -#define FT_OPEN_PARAMS 0x10 - - - /* these constants are deprecated; use the corresponding `FT_OPEN_XXX' */ - /* values instead */ -#define ft_open_memory FT_OPEN_MEMORY -#define ft_open_stream FT_OPEN_STREAM -#define ft_open_pathname FT_OPEN_PATHNAME -#define ft_open_driver FT_OPEN_DRIVER -#define ft_open_params FT_OPEN_PARAMS - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Parameter */ - /* */ - /* <Description> */ - /* A simple structure used to pass more or less generic parameters to */ - /* @FT_Open_Face. */ - /* */ - /* <Fields> */ - /* tag :: A four-byte identification tag. */ - /* */ - /* data :: A pointer to the parameter data. */ - /* */ - /* <Note> */ - /* The ID and function of parameters are driver-specific. See the */ - /* various FT_PARAM_TAG_XXX flags for more information. */ - /* */ - typedef struct FT_Parameter_ - { - FT_ULong tag; - FT_Pointer data; - - } FT_Parameter; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Open_Args */ - /* */ - /* <Description> */ - /* A structure used to indicate how to open a new font file or */ - /* stream. A pointer to such a structure can be used as a parameter */ - /* for the functions @FT_Open_Face and @FT_Attach_Stream. */ - /* */ - /* <Fields> */ - /* flags :: A set of bit flags indicating how to use the */ - /* structure. */ - /* */ - /* memory_base :: The first byte of the file in memory. */ - /* */ - /* memory_size :: The size in bytes of the file in memory. */ - /* */ - /* pathname :: A pointer to an 8-bit file pathname. */ - /* */ - /* stream :: A handle to a source stream object. */ - /* */ - /* driver :: This field is exclusively used by @FT_Open_Face; */ - /* it simply specifies the font driver to use to open */ - /* the face. If set to~0, FreeType tries to load the */ - /* face with each one of the drivers in its list. */ - /* */ - /* num_params :: The number of extra parameters. */ - /* */ - /* params :: Extra parameters passed to the font driver when */ - /* opening a new face. */ - /* */ - /* <Note> */ - /* The stream type is determined by the contents of `flags' that */ - /* are tested in the following order by @FT_Open_Face: */ - /* */ - /* If the @FT_OPEN_MEMORY bit is set, assume that this is a */ - /* memory file of `memory_size' bytes, located at `memory_address'. */ - /* The data are are not copied, and the client is responsible for */ - /* releasing and destroying them _after_ the corresponding call to */ - /* @FT_Done_Face. */ - /* */ - /* Otherwise, if the @FT_OPEN_STREAM bit is set, assume that a */ - /* custom input stream `stream' is used. */ - /* */ - /* Otherwise, if the @FT_OPEN_PATHNAME bit is set, assume that this */ - /* is a normal file and use `pathname' to open it. */ - /* */ - /* If the @FT_OPEN_DRIVER bit is set, @FT_Open_Face only tries to */ - /* open the file with the driver whose handler is in `driver'. */ - /* */ - /* If the @FT_OPEN_PARAMS bit is set, the parameters given by */ - /* `num_params' and `params' is used. They are ignored otherwise. */ - /* */ - /* Ideally, both the `pathname' and `params' fields should be tagged */ - /* as `const'; this is missing for API backwards compatibility. In */ - /* other words, applications should treat them as read-only. */ - /* */ - typedef struct FT_Open_Args_ - { - FT_UInt flags; - const FT_Byte* memory_base; - FT_Long memory_size; - FT_String* pathname; - FT_Stream stream; - FT_Module driver; - FT_Int num_params; - FT_Parameter* params; - - } FT_Open_Args; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Face */ - /* */ - /* <Description> */ - /* This function calls @FT_Open_Face to open a font by its pathname. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library resource. */ - /* */ - /* <Input> */ - /* pathname :: A path to the font file. */ - /* */ - /* face_index :: See @FT_Open_Face for a detailed description of this */ - /* parameter. */ - /* */ - /* <Output> */ - /* aface :: A handle to a new face object. If `face_index' is */ - /* greater than or equal to zero, it must be non-NULL. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* Use @FT_Done_Face to destroy the created @FT_Face object (along */ - /* with its slot and sizes). */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Face( FT_Library library, - const char* filepathname, - FT_Long face_index, - FT_Face *aface ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Memory_Face */ - /* */ - /* <Description> */ - /* This function calls @FT_Open_Face to open a font that has been */ - /* loaded into memory. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library resource. */ - /* */ - /* <Input> */ - /* file_base :: A pointer to the beginning of the font data. */ - /* */ - /* file_size :: The size of the memory chunk used by the font data. */ - /* */ - /* face_index :: See @FT_Open_Face for a detailed description of this */ - /* parameter. */ - /* */ - /* <Output> */ - /* aface :: A handle to a new face object. If `face_index' is */ - /* greater than or equal to zero, it must be non-NULL. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* You must not deallocate the memory before calling @FT_Done_Face. */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Memory_Face( FT_Library library, - const FT_Byte* file_base, - FT_Long file_size, - FT_Long face_index, - FT_Face *aface ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Open_Face */ - /* */ - /* <Description> */ - /* Create a face object from a given resource described by */ - /* @FT_Open_Args. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library resource. */ - /* */ - /* <Input> */ - /* args :: A pointer to an `FT_Open_Args' structure that must */ - /* be filled by the caller. */ - /* */ - /* face_index :: This field holds two different values. Bits 0-15 */ - /* are the index of the face in the font file (starting */ - /* with value~0). Set it to~0 if there is only one */ - /* face in the font file. */ - /* */ - /* Bits 16-30 are relevant to GX variation fonts only, */ - /* specifying the named instance index for the current */ - /* face index (starting with value~1; value~0 makes */ - /* FreeType ignore named instances). For non-GX fonts, */ - /* bits 16-30 are ignored. Assuming that you want to */ - /* access the third named instance in face~4, */ - /* `face_index' should be set to 0x00030004. If you */ - /* want to access face~4 without GX variation handling, */ - /* simply set `face_index' to value~4. */ - /* */ - /* FT_Open_Face and its siblings can be used to quickly */ - /* check whether the font format of a given font */ - /* resource is supported by FreeType. In general, if */ - /* the `face_index' argument is negative, the */ - /* function's return value is~0 if the font format is */ - /* recognized, or non-zero otherwise. The function */ - /* allocates a more or less empty face handle in */ - /* `*aface' (if `aface' isn't NULL); the only two */ - /* useful fields in this special case are */ - /* `face->num_faces' and `face->style_flags'. For any */ - /* negative value of `face_index', `face->num_faces' */ - /* gives the number of faces within the font file. For */ - /* the negative value `-(N+1)' (with `N' a 16-bit */ - /* value), bits 16-30 in `face->style_flags' give the */ - /* number of named instances in face `N' if we have a */ - /* GX variation font (or zero otherwise). After */ - /* examination, the returned @FT_Face structure should */ - /* be deallocated with a call to @FT_Done_Face. */ - /* */ - /* <Output> */ - /* aface :: A handle to a new face object. If `face_index' is */ - /* greater than or equal to zero, it must be non-NULL. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* Unlike FreeType 1.x, this function automatically creates a glyph */ - /* slot for the face object that can be accessed directly through */ - /* `face->glyph'. */ - /* */ - /* Each new face object created with this function also owns a */ - /* default @FT_Size object, accessible as `face->size'. */ - /* */ - /* One @FT_Library instance can have multiple face objects, this is, */ - /* @FT_Open_Face and its siblings can be called multiple times using */ - /* the same `library' argument. */ - /* */ - /* See the discussion of reference counters in the description of */ - /* @FT_Reference_Face. */ - /* */ - /* To loop over all faces, use code similar to the following snippet */ - /* (omitting the error handling). */ - /* */ - /* { */ - /* ... */ - /* FT_Face face; */ - /* FT_Long i, num_faces; */ - /* */ - /* */ - /* error = FT_Open_Face( library, args, -1, &face ); */ - /* if ( error ) { ... } */ - /* */ - /* num_faces = face->num_faces; */ - /* FT_Done_Face( face ); */ - /* */ - /* for ( i = 0; i < num_faces; i++ ) */ - /* { */ - /* ... */ - /* error = FT_Open_Face( library, args, i, &face ); */ - /* ... */ - /* FT_Done_Face( face ); */ - /* ... */ - /* } */ - /* } */ - /* */ - /* To loop over all valid values for `face_index', use something */ - /* similar to the following snippet, again without error handling. */ - /* The code accesses all faces immediately (thus only a single call */ - /* of `FT_Open_Face' within the do-loop), with and without named */ - /* instances. */ - /* */ - /* { */ - /* ... */ - /* FT_Face face; */ - /* */ - /* FT_Long num_faces = 0; */ - /* FT_Long num_instances = 0; */ - /* */ - /* FT_Long face_idx = 0; */ - /* FT_Long instance_idx = 0; */ - /* */ - /* */ - /* do */ - /* { */ - /* FT_Long id = ( instance_idx << 16 ) + face_idx; */ - /* */ - /* */ - /* error = FT_Open_Face( library, args, id, &face ); */ - /* if ( error ) { ... } */ - /* */ - /* num_faces = face->num_faces; */ - /* num_instances = face->style_flags >> 16; */ - /* */ - /* ... */ - /* */ - /* FT_Done_Face( face ); */ - /* */ - /* if ( instance_idx < num_instances ) */ - /* instance_idx++; */ - /* else */ - /* { */ - /* face_idx++; */ - /* instance_idx = 0; */ - /* } */ - /* */ - /* } while ( face_idx < num_faces ) */ - /* } */ - /* */ - FT_EXPORT( FT_Error ) - FT_Open_Face( FT_Library library, - const FT_Open_Args* args, - FT_Long face_index, - FT_Face *aface ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Attach_File */ - /* */ - /* <Description> */ - /* This function calls @FT_Attach_Stream to attach a file. */ - /* */ - /* <InOut> */ - /* face :: The target face object. */ - /* */ - /* <Input> */ - /* filepathname :: The pathname. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Attach_File( FT_Face face, - const char* filepathname ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Attach_Stream */ - /* */ - /* <Description> */ - /* `Attach' data to a face object. Normally, this is used to read */ - /* additional information for the face object. For example, you can */ - /* attach an AFM file that comes with a Type~1 font to get the */ - /* kerning values and other metrics. */ - /* */ - /* <InOut> */ - /* face :: The target face object. */ - /* */ - /* <Input> */ - /* parameters :: A pointer to @FT_Open_Args that must be filled by */ - /* the caller. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The meaning of the `attach' (i.e., what really happens when the */ - /* new file is read) is not fixed by FreeType itself. It really */ - /* depends on the font format (and thus the font driver). */ - /* */ - /* Client applications are expected to know what they are doing */ - /* when invoking this function. Most drivers simply do not implement */ - /* file attachments. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Attach_Stream( FT_Face face, - FT_Open_Args* parameters ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Reference_Face */ - /* */ - /* <Description> */ - /* A counter gets initialized to~1 at the time an @FT_Face structure */ - /* is created. This function increments the counter. @FT_Done_Face */ - /* then only destroys a face if the counter is~1, otherwise it simply */ - /* decrements the counter. */ - /* */ - /* This function helps in managing life-cycles of structures that */ - /* reference @FT_Face objects. */ - /* */ - /* <Input> */ - /* face :: A handle to a target face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Since> */ - /* 2.4.2 */ - /* */ - FT_EXPORT( FT_Error ) - FT_Reference_Face( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_Face */ - /* */ - /* <Description> */ - /* Discard a given face object, as well as all of its child slots and */ - /* sizes. */ - /* */ - /* <Input> */ - /* face :: A handle to a target face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* See the discussion of reference counters in the description of */ - /* @FT_Reference_Face. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Done_Face( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Select_Size */ - /* */ - /* <Description> */ - /* Select a bitmap strike. */ - /* */ - /* <InOut> */ - /* face :: A handle to a target face object. */ - /* */ - /* <Input> */ - /* strike_index :: The index of the bitmap strike in the */ - /* `available_sizes' field of @FT_FaceRec structure. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Select_Size( FT_Face face, - FT_Int strike_index ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Size_Request_Type */ - /* */ - /* <Description> */ - /* An enumeration type that lists the supported size request types. */ - /* */ - /* <Values> */ - /* FT_SIZE_REQUEST_TYPE_NOMINAL :: */ - /* The nominal size. The `units_per_EM' field of @FT_FaceRec is */ - /* used to determine both scaling values. */ - /* */ - /* FT_SIZE_REQUEST_TYPE_REAL_DIM :: */ - /* The real dimension. The sum of the the `ascender' and (minus */ - /* of) the `descender' fields of @FT_FaceRec are used to determine */ - /* both scaling values. */ - /* */ - /* FT_SIZE_REQUEST_TYPE_BBOX :: */ - /* The font bounding box. The width and height of the `bbox' field */ - /* of @FT_FaceRec are used to determine the horizontal and vertical */ - /* scaling value, respectively. */ - /* */ - /* FT_SIZE_REQUEST_TYPE_CELL :: */ - /* The `max_advance_width' field of @FT_FaceRec is used to */ - /* determine the horizontal scaling value; the vertical scaling */ - /* value is determined the same way as */ - /* @FT_SIZE_REQUEST_TYPE_REAL_DIM does. Finally, both scaling */ - /* values are set to the smaller one. This type is useful if you */ - /* want to specify the font size for, say, a window of a given */ - /* dimension and 80x24 cells. */ - /* */ - /* FT_SIZE_REQUEST_TYPE_SCALES :: */ - /* Specify the scaling values directly. */ - /* */ - /* <Note> */ - /* The above descriptions only apply to scalable formats. For bitmap */ - /* formats, the behaviour is up to the driver. */ - /* */ - /* See the note section of @FT_Size_Metrics if you wonder how size */ - /* requesting relates to scaling values. */ - /* */ - typedef enum FT_Size_Request_Type_ - { - FT_SIZE_REQUEST_TYPE_NOMINAL, - FT_SIZE_REQUEST_TYPE_REAL_DIM, - FT_SIZE_REQUEST_TYPE_BBOX, - FT_SIZE_REQUEST_TYPE_CELL, - FT_SIZE_REQUEST_TYPE_SCALES, - - FT_SIZE_REQUEST_TYPE_MAX - - } FT_Size_Request_Type; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Size_RequestRec */ - /* */ - /* <Description> */ - /* A structure used to model a size request. */ - /* */ - /* <Fields> */ - /* type :: See @FT_Size_Request_Type. */ - /* */ - /* width :: The desired width. */ - /* */ - /* height :: The desired height. */ - /* */ - /* horiResolution :: The horizontal resolution. If set to zero, */ - /* `width' is treated as a 26.6 fractional pixel */ - /* value. */ - /* */ - /* vertResolution :: The vertical resolution. If set to zero, */ - /* `height' is treated as a 26.6 fractional pixel */ - /* value. */ - /* */ - /* <Note> */ - /* If `width' is zero, then the horizontal scaling value is set equal */ - /* to the vertical scaling value, and vice versa. */ - /* */ - typedef struct FT_Size_RequestRec_ - { - FT_Size_Request_Type type; - FT_Long width; - FT_Long height; - FT_UInt horiResolution; - FT_UInt vertResolution; - - } FT_Size_RequestRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Size_Request */ - /* */ - /* <Description> */ - /* A handle to a size request structure. */ - /* */ - typedef struct FT_Size_RequestRec_ *FT_Size_Request; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Request_Size */ - /* */ - /* <Description> */ - /* Resize the scale of the active @FT_Size object in a face. */ - /* */ - /* <InOut> */ - /* face :: A handle to a target face object. */ - /* */ - /* <Input> */ - /* req :: A pointer to a @FT_Size_RequestRec. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* Although drivers may select the bitmap strike matching the */ - /* request, you should not rely on this if you intend to select a */ - /* particular bitmap strike. Use @FT_Select_Size instead in that */ - /* case. */ - /* */ - /* The relation between the requested size and the resulting glyph */ - /* size is dependent entirely on how the size is defined in the */ - /* source face. The font designer chooses the final size of each */ - /* glyph relative to this size. For more information refer to */ - /* `http://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html' */ - /* */ - /* Don't use this function if you are using the FreeType cache API. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Request_Size( FT_Face face, - FT_Size_Request req ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Char_Size */ - /* */ - /* <Description> */ - /* This function calls @FT_Request_Size to request the nominal size */ - /* (in points). */ - /* */ - /* <InOut> */ - /* face :: A handle to a target face object. */ - /* */ - /* <Input> */ - /* char_width :: The nominal width, in 26.6 fractional points. */ - /* */ - /* char_height :: The nominal height, in 26.6 fractional points. */ - /* */ - /* horz_resolution :: The horizontal resolution in dpi. */ - /* */ - /* vert_resolution :: The vertical resolution in dpi. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* If either the character width or height is zero, it is set equal */ - /* to the other value. */ - /* */ - /* If either the horizontal or vertical resolution is zero, it is set */ - /* equal to the other value. */ - /* */ - /* A character width or height smaller than 1pt is set to 1pt; if */ - /* both resolution values are zero, they are set to 72dpi. */ - /* */ - /* Don't use this function if you are using the FreeType cache API. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_Char_Size( FT_Face face, - FT_F26Dot6 char_width, - FT_F26Dot6 char_height, - FT_UInt horz_resolution, - FT_UInt vert_resolution ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Pixel_Sizes */ - /* */ - /* <Description> */ - /* This function calls @FT_Request_Size to request the nominal size */ - /* (in pixels). */ - /* */ - /* <InOut> */ - /* face :: A handle to the target face object. */ - /* */ - /* <Input> */ - /* pixel_width :: The nominal width, in pixels. */ - /* */ - /* pixel_height :: The nominal height, in pixels. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* You should not rely on the resulting glyphs matching, or being */ - /* constrained, to this pixel size. Refer to @FT_Request_Size to */ - /* understand how requested sizes relate to actual sizes. */ - /* */ - /* Don't use this function if you are using the FreeType cache API. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_Pixel_Sizes( FT_Face face, - FT_UInt pixel_width, - FT_UInt pixel_height ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Load_Glyph */ - /* */ - /* <Description> */ - /* A function used to load a single glyph into the glyph slot of a */ - /* face object. */ - /* */ - /* <InOut> */ - /* face :: A handle to the target face object where the glyph */ - /* is loaded. */ - /* */ - /* <Input> */ - /* glyph_index :: The index of the glyph in the font file. For */ - /* CID-keyed fonts (either in PS or in CFF format) */ - /* this argument specifies the CID value. */ - /* */ - /* load_flags :: A flag indicating what to load for this glyph. The */ - /* @FT_LOAD_XXX constants can be used to control the */ - /* glyph loading process (e.g., whether the outline */ - /* should be scaled, whether to load bitmaps or not, */ - /* whether to hint the outline, etc). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The loaded glyph may be transformed. See @FT_Set_Transform for */ - /* the details. */ - /* */ - /* For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is */ - /* returned for invalid CID values (this is, for CID values that */ - /* don't have a corresponding glyph in the font). See the discussion */ - /* of the @FT_FACE_FLAG_CID_KEYED flag for more details. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Load_Glyph( FT_Face face, - FT_UInt glyph_index, - FT_Int32 load_flags ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Load_Char */ - /* */ - /* <Description> */ - /* A function used to load a single glyph into the glyph slot of a */ - /* face object, according to its character code. */ - /* */ - /* <InOut> */ - /* face :: A handle to a target face object where the glyph */ - /* is loaded. */ - /* */ - /* <Input> */ - /* char_code :: The glyph's character code, according to the */ - /* current charmap used in the face. */ - /* */ - /* load_flags :: A flag indicating what to load for this glyph. The */ - /* @FT_LOAD_XXX constants can be used to control the */ - /* glyph loading process (e.g., whether the outline */ - /* should be scaled, whether to load bitmaps or not, */ - /* whether to hint the outline, etc). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Load_Char( FT_Face face, - FT_ULong char_code, - FT_Int32 load_flags ); - - - /************************************************************************* - * - * @enum: - * FT_LOAD_XXX - * - * @description: - * A list of bit field constants used with @FT_Load_Glyph to indicate - * what kind of operations to perform during glyph loading. - * - * @values: - * FT_LOAD_DEFAULT :: - * Corresponding to~0, this value is used as the default glyph load - * operation. In this case, the following happens: - * - * 1. FreeType looks for a bitmap for the glyph corresponding to the - * face's current size. If one is found, the function returns. - * The bitmap data can be accessed from the glyph slot (see note - * below). - * - * 2. If no embedded bitmap is searched or found, FreeType looks for a - * scalable outline. If one is found, it is loaded from the font - * file, scaled to device pixels, then `hinted' to the pixel grid - * in order to optimize it. The outline data can be accessed from - * the glyph slot (see note below). - * - * Note that by default, the glyph loader doesn't render outlines into - * bitmaps. The following flags are used to modify this default - * behaviour to more specific and useful cases. - * - * FT_LOAD_NO_SCALE :: - * Don't scale the loaded outline glyph but keep it in font units. - * - * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and - * unsets @FT_LOAD_RENDER. - * - * If the font is `tricky' (see @FT_FACE_FLAG_TRICKY for more), using - * FT_LOAD_NO_SCALE usually yields meaningless outlines because the - * subglyphs must be scaled and positioned with hinting instructions. - * This can be solved by loading the font without FT_LOAD_NO_SCALE and - * setting the character size to `font->units_per_EM'. - * - * FT_LOAD_NO_HINTING :: - * Disable hinting. This generally generates `blurrier' bitmap glyphs - * when the glyph are rendered in any of the anti-aliased modes. See - * also the note below. - * - * This flag is implied by @FT_LOAD_NO_SCALE. - * - * FT_LOAD_RENDER :: - * Call @FT_Render_Glyph after the glyph is loaded. By default, the - * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be - * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME. - * - * This flag is unset by @FT_LOAD_NO_SCALE. - * - * FT_LOAD_NO_BITMAP :: - * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this - * flag. - * - * @FT_LOAD_NO_SCALE always sets this flag. - * - * FT_LOAD_VERTICAL_LAYOUT :: - * Load the glyph for vertical text layout. In particular, the - * `advance' value in the @FT_GlyphSlotRec structure is set to the - * `vertAdvance' value of the `metrics' field. - * - * In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use - * this flag currently. Reason is that in this case vertical metrics - * get synthesized, and those values are not always consistent across - * various font formats. - * - * FT_LOAD_FORCE_AUTOHINT :: - * Indicates that the auto-hinter is preferred over the font's native - * hinter. See also the note below. - * - * FT_LOAD_PEDANTIC :: - * Indicates that the font driver should perform pedantic verifications - * during glyph loading. This is mostly used to detect broken glyphs - * in fonts. By default, FreeType tries to handle broken fonts also. - * - * In particular, errors from the TrueType bytecode engine are not - * passed to the application if this flag is not set; this might - * result in partially hinted or distorted glyphs in case a glyph's - * bytecode is buggy. - * - * FT_LOAD_NO_RECURSE :: - * Indicate that the font driver should not load composite glyphs - * recursively. Instead, it should set the `num_subglyph' and - * `subglyphs' values of the glyph slot accordingly, and set - * `glyph->format' to @FT_GLYPH_FORMAT_COMPOSITE. The description of - * subglyphs can then be accessed with @FT_Get_SubGlyph_Info. - * - * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM. - * - * FT_LOAD_IGNORE_TRANSFORM :: - * Indicates that the transform matrix set by @FT_Set_Transform should - * be ignored. - * - * FT_LOAD_MONOCHROME :: - * This flag is used with @FT_LOAD_RENDER to indicate that you want to - * render an outline glyph to a 1-bit monochrome bitmap glyph, with - * 8~pixels packed into each byte of the bitmap data. - * - * Note that this has no effect on the hinting algorithm used. You - * should rather use @FT_LOAD_TARGET_MONO so that the - * monochrome-optimized hinting algorithm is used. - * - * FT_LOAD_LINEAR_DESIGN :: - * Indicates that the `linearHoriAdvance' and `linearVertAdvance' - * fields of @FT_GlyphSlotRec should be kept in font units. See - * @FT_GlyphSlotRec for details. - * - * FT_LOAD_NO_AUTOHINT :: - * Disable auto-hinter. See also the note below. - * - * FT_LOAD_COLOR :: - * This flag is used to request loading of color embedded-bitmap - * images. The resulting color bitmaps, if available, will have the - * @FT_PIXEL_MODE_BGRA format. When the flag is not used and color - * bitmaps are found, they will be converted to 256-level gray - * bitmaps transparently. Those bitmaps will be in the - * @FT_PIXEL_MODE_GRAY format. - * - * FT_LOAD_CROP_BITMAP :: - * Ignored. Deprecated. - * - * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH :: - * Ignored. Deprecated. - * - * @note: - * By default, hinting is enabled and the font's native hinter (see - * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can - * disable hinting by setting @FT_LOAD_NO_HINTING or change the - * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set - * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be - * used at all. - * - * See the description of @FT_FACE_FLAG_TRICKY for a special exception - * (affecting only a handful of Asian fonts). - * - * Besides deciding which hinter to use, you can also decide which - * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details. - * - * Note that the auto-hinter needs a valid Unicode cmap (either a native - * one or synthesized by FreeType) for producing correct results. If a - * font provides an incorrect mapping (for example, assigning the - * character code U+005A, LATIN CAPITAL LETTER Z, to a glyph depicting a - * mathematical integral sign), the auto-hinter might produce useless - * results. - * - */ -#define FT_LOAD_DEFAULT 0x0 -#define FT_LOAD_NO_SCALE ( 1L << 0 ) -#define FT_LOAD_NO_HINTING ( 1L << 1 ) -#define FT_LOAD_RENDER ( 1L << 2 ) -#define FT_LOAD_NO_BITMAP ( 1L << 3 ) -#define FT_LOAD_VERTICAL_LAYOUT ( 1L << 4 ) -#define FT_LOAD_FORCE_AUTOHINT ( 1L << 5 ) -#define FT_LOAD_CROP_BITMAP ( 1L << 6 ) -#define FT_LOAD_PEDANTIC ( 1L << 7 ) -#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ( 1L << 9 ) -#define FT_LOAD_NO_RECURSE ( 1L << 10 ) -#define FT_LOAD_IGNORE_TRANSFORM ( 1L << 11 ) -#define FT_LOAD_MONOCHROME ( 1L << 12 ) -#define FT_LOAD_LINEAR_DESIGN ( 1L << 13 ) -#define FT_LOAD_NO_AUTOHINT ( 1L << 15 ) - /* Bits 16..19 are used by `FT_LOAD_TARGET_' */ -#define FT_LOAD_COLOR ( 1L << 20 ) - - /* */ - - /* used internally only by certain font drivers! */ -#define FT_LOAD_ADVANCE_ONLY ( 1L << 8 ) -#define FT_LOAD_SBITS_ONLY ( 1L << 14 ) - - - /************************************************************************** - * - * @enum: - * FT_LOAD_TARGET_XXX - * - * @description: - * A list of values that are used to select a specific hinting algorithm - * to use by the hinter. You should OR one of these values to your - * `load_flags' when calling @FT_Load_Glyph. - * - * Note that font's native hinters may ignore the hinting algorithm you - * have specified (e.g., the TrueType bytecode interpreter). You can set - * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used. - * - * Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it - * always implies @FT_LOAD_FORCE_AUTOHINT. - * - * @values: - * FT_LOAD_TARGET_NORMAL :: - * This corresponds to the default hinting algorithm, optimized for - * standard gray-level rendering. For monochrome output, use - * @FT_LOAD_TARGET_MONO instead. - * - * FT_LOAD_TARGET_LIGHT :: - * A lighter hinting algorithm for non-monochrome modes. Many - * generated glyphs are more fuzzy but better resemble its original - * shape. A bit like rendering on Mac OS~X. - * - * As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT. - * - * FT_LOAD_TARGET_MONO :: - * Strong hinting algorithm that should only be used for monochrome - * output. The result is probably unpleasant if the glyph is rendered - * in non-monochrome modes. - * - * FT_LOAD_TARGET_LCD :: - * A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally - * decimated LCD displays. - * - * FT_LOAD_TARGET_LCD_V :: - * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically - * decimated LCD displays. - * - * @note: - * You should use only _one_ of the FT_LOAD_TARGET_XXX values in your - * `load_flags'. They can't be ORed. - * - * If @FT_LOAD_RENDER is also set, the glyph is rendered in the - * corresponding mode (i.e., the mode that matches the used algorithm - * best). An exeption is FT_LOAD_TARGET_MONO since it implies - * @FT_LOAD_MONOCHROME. - * - * You can use a hinting algorithm that doesn't correspond to the same - * rendering mode. As an example, it is possible to use the `light' - * hinting algorithm and have the results rendered in horizontal LCD - * pixel mode, with code like - * - * { - * FT_Load_Glyph( face, glyph_index, - * load_flags | FT_LOAD_TARGET_LIGHT ); - * - * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); - * } - * - */ -#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 ) - -#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ) -#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ) -#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ) -#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD ) -#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V ) - - - /************************************************************************** - * - * @macro: - * FT_LOAD_TARGET_MODE - * - * @description: - * Return the @FT_Render_Mode corresponding to a given - * @FT_LOAD_TARGET_XXX value. - * - */ -#define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) ) - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Transform */ - /* */ - /* <Description> */ - /* A function used to set the transformation that is applied to glyph */ - /* images when they are loaded into a glyph slot through */ - /* @FT_Load_Glyph. */ - /* */ - /* <InOut> */ - /* face :: A handle to the source face object. */ - /* */ - /* <Input> */ - /* matrix :: A pointer to the transformation's 2x2 matrix. Use~0 for */ - /* the identity matrix. */ - /* delta :: A pointer to the translation vector. Use~0 for the null */ - /* vector. */ - /* */ - /* <Note> */ - /* The transformation is only applied to scalable image formats after */ - /* the glyph has been loaded. It means that hinting is unaltered by */ - /* the transformation and is performed on the character size given in */ - /* the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. */ - /* */ - /* Note that this also transforms the `face.glyph.advance' field, but */ - /* *not* the values in `face.glyph.metrics'. */ - /* */ - FT_EXPORT( void ) - FT_Set_Transform( FT_Face face, - FT_Matrix* matrix, - FT_Vector* delta ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Render_Mode */ - /* */ - /* <Description> */ - /* An enumeration type that lists the render modes supported by */ - /* FreeType~2. Each mode corresponds to a specific type of scanline */ - /* conversion performed on the outline. */ - /* */ - /* For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode' */ - /* field in the @FT_GlyphSlotRec structure gives the format of the */ - /* returned bitmap. */ - /* */ - /* All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity. */ - /* */ - /* <Values> */ - /* FT_RENDER_MODE_NORMAL :: */ - /* This is the default render mode; it corresponds to 8-bit */ - /* anti-aliased bitmaps. */ - /* */ - /* FT_RENDER_MODE_LIGHT :: */ - /* This is equivalent to @FT_RENDER_MODE_NORMAL. It is only */ - /* defined as a separate value because render modes are also used */ - /* indirectly to define hinting algorithm selectors. See */ - /* @FT_LOAD_TARGET_XXX for details. */ - /* */ - /* FT_RENDER_MODE_MONO :: */ - /* This mode corresponds to 1-bit bitmaps (with 2~levels of */ - /* opacity). */ - /* */ - /* FT_RENDER_MODE_LCD :: */ - /* This mode corresponds to horizontal RGB and BGR sub-pixel */ - /* displays like LCD screens. It produces 8-bit bitmaps that are */ - /* 3~times the width of the original glyph outline in pixels, and */ - /* which use the @FT_PIXEL_MODE_LCD mode. */ - /* */ - /* FT_RENDER_MODE_LCD_V :: */ - /* This mode corresponds to vertical RGB and BGR sub-pixel displays */ - /* (like PDA screens, rotated LCD displays, etc.). It produces */ - /* 8-bit bitmaps that are 3~times the height of the original */ - /* glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode. */ - /* */ - /* <Note> */ - /* The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */ - /* filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */ - /* (not active in the default builds). It is up to the caller to */ - /* either call @FT_Library_SetLcdFilter (if available) or do the */ - /* filtering itself. */ - /* */ - /* The selected render mode only affects vector glyphs of a font. */ - /* Embedded bitmaps often have a different pixel mode like */ - /* @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform */ - /* them into 8-bit pixmaps. */ - /* */ - typedef enum FT_Render_Mode_ - { - FT_RENDER_MODE_NORMAL = 0, - FT_RENDER_MODE_LIGHT, - FT_RENDER_MODE_MONO, - FT_RENDER_MODE_LCD, - FT_RENDER_MODE_LCD_V, - - FT_RENDER_MODE_MAX - - } FT_Render_Mode; - - - /* these constants are deprecated; use the corresponding */ - /* `FT_Render_Mode' values instead */ -#define ft_render_mode_normal FT_RENDER_MODE_NORMAL -#define ft_render_mode_mono FT_RENDER_MODE_MONO - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Render_Glyph */ - /* */ - /* <Description> */ - /* Convert a given glyph image to a bitmap. It does so by inspecting */ - /* the glyph image format, finding the relevant renderer, and */ - /* invoking it. */ - /* */ - /* <InOut> */ - /* slot :: A handle to the glyph slot containing the image to */ - /* convert. */ - /* */ - /* <Input> */ - /* render_mode :: This is the render mode used to render the glyph */ - /* image into a bitmap. See @FT_Render_Mode for a */ - /* list of possible values. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* To get meaningful results, font scaling values must be set with */ - /* functions like @FT_Set_Char_Size before calling FT_Render_Glyph. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Render_Glyph( FT_GlyphSlot slot, - FT_Render_Mode render_mode ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Kerning_Mode */ - /* */ - /* <Description> */ - /* An enumeration used to specify which kerning values to return in */ - /* @FT_Get_Kerning. */ - /* */ - /* <Values> */ - /* FT_KERNING_DEFAULT :: Return scaled and grid-fitted kerning */ - /* distances (value is~0). */ - /* */ - /* FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning */ - /* distances. */ - /* */ - /* FT_KERNING_UNSCALED :: Return the kerning vector in original font */ - /* units. */ - /* */ - typedef enum FT_Kerning_Mode_ - { - FT_KERNING_DEFAULT = 0, - FT_KERNING_UNFITTED, - FT_KERNING_UNSCALED - - } FT_Kerning_Mode; - - - /* these constants are deprecated; use the corresponding */ - /* `FT_Kerning_Mode' values instead */ -#define ft_kerning_default FT_KERNING_DEFAULT -#define ft_kerning_unfitted FT_KERNING_UNFITTED -#define ft_kerning_unscaled FT_KERNING_UNSCALED - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Kerning */ - /* */ - /* <Description> */ - /* Return the kerning vector between two glyphs of a same face. */ - /* */ - /* <Input> */ - /* face :: A handle to a source face object. */ - /* */ - /* left_glyph :: The index of the left glyph in the kern pair. */ - /* */ - /* right_glyph :: The index of the right glyph in the kern pair. */ - /* */ - /* kern_mode :: See @FT_Kerning_Mode for more information. */ - /* Determines the scale and dimension of the returned */ - /* kerning vector. */ - /* */ - /* <Output> */ - /* akerning :: The kerning vector. This is either in font units */ - /* or in pixels (26.6 format) for scalable formats, */ - /* and in pixels for fixed-sizes formats. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* Only horizontal layouts (left-to-right & right-to-left) are */ - /* supported by this method. Other layouts, or more sophisticated */ - /* kernings, are out of the scope of this API function -- they can be */ - /* implemented through format-specific interfaces. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Kerning( FT_Face face, - FT_UInt left_glyph, - FT_UInt right_glyph, - FT_UInt kern_mode, - FT_Vector *akerning ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Track_Kerning */ - /* */ - /* <Description> */ - /* Return the track kerning for a given face object at a given size. */ - /* */ - /* <Input> */ - /* face :: A handle to a source face object. */ - /* */ - /* point_size :: The point size in 16.16 fractional points. */ - /* */ - /* degree :: The degree of tightness. Increasingly negative */ - /* values represent tighter track kerning, while */ - /* increasingly positive values represent looser track */ - /* kerning. Value zero means no track kerning. */ - /* */ - /* <Output> */ - /* akerning :: The kerning in 16.16 fractional points, to be */ - /* uniformly applied between all glyphs. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* Currently, only the Type~1 font driver supports track kerning, */ - /* using data from AFM files (if attached with @FT_Attach_File or */ - /* @FT_Attach_Stream). */ - /* */ - /* Only very few AFM files come with track kerning data; please refer */ - /* to the Adobe's AFM specification for more details. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Track_Kerning( FT_Face face, - FT_Fixed point_size, - FT_Int degree, - FT_Fixed* akerning ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Glyph_Name */ - /* */ - /* <Description> */ - /* Retrieve the ASCII name of a given glyph in a face. This only */ - /* works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1. */ - /* */ - /* <Input> */ - /* face :: A handle to a source face object. */ - /* */ - /* glyph_index :: The glyph index. */ - /* */ - /* buffer_max :: The maximum number of bytes available in the */ - /* buffer. */ - /* */ - /* <Output> */ - /* buffer :: A pointer to a target buffer where the name is */ - /* copied to. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* An error is returned if the face doesn't provide glyph names or if */ - /* the glyph index is invalid. In all cases of failure, the first */ - /* byte of `buffer' is set to~0 to indicate an empty name. */ - /* */ - /* The glyph name is truncated to fit within the buffer if it is too */ - /* long. The returned string is always zero-terminated. */ - /* */ - /* Be aware that FreeType reorders glyph indices internally so that */ - /* glyph index~0 always corresponds to the `missing glyph' (called */ - /* `.notdef'). */ - /* */ - /* This function always returns an error if the config macro */ - /* `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is not defined in `ftoptions.h'. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Glyph_Name( FT_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Postscript_Name */ - /* */ - /* <Description> */ - /* Retrieve the ASCII PostScript name of a given face, if available. */ - /* This only works with PostScript and TrueType fonts. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* <Return> */ - /* A pointer to the face's PostScript name. NULL if unavailable. */ - /* */ - /* <Note> */ - /* The returned pointer is owned by the face and is destroyed with */ - /* it. */ - /* */ - FT_EXPORT( const char* ) - FT_Get_Postscript_Name( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Select_Charmap */ - /* */ - /* <Description> */ - /* Select a given charmap by its encoding tag (as listed in */ - /* `freetype.h'). */ - /* */ - /* <InOut> */ - /* face :: A handle to the source face object. */ - /* */ - /* <Input> */ - /* encoding :: A handle to the selected encoding. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* This function returns an error if no charmap in the face */ - /* corresponds to the encoding queried here. */ - /* */ - /* Because many fonts contain more than a single cmap for Unicode */ - /* encoding, this function has some special code to select the one */ - /* that covers Unicode best (`best' in the sense that a UCS-4 cmap is */ - /* preferred to a UCS-2 cmap). It is thus preferable to */ - /* @FT_Set_Charmap in this case. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Select_Charmap( FT_Face face, - FT_Encoding encoding ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Charmap */ - /* */ - /* <Description> */ - /* Select a given charmap for character code to glyph index mapping. */ - /* */ - /* <InOut> */ - /* face :: A handle to the source face object. */ - /* */ - /* <Input> */ - /* charmap :: A handle to the selected charmap. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* This function returns an error if the charmap is not part of */ - /* the face (i.e., if it is not listed in the `face->charmaps' */ - /* table). */ - /* */ - /* It also fails if a type~14 charmap is selected. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_Charmap( FT_Face face, - FT_CharMap charmap ); - - - /************************************************************************* - * - * @function: - * FT_Get_Charmap_Index - * - * @description: - * Retrieve index of a given charmap. - * - * @input: - * charmap :: - * A handle to a charmap. - * - * @return: - * The index into the array of character maps within the face to which - * `charmap' belongs. If an error occurs, -1 is returned. - * - */ - FT_EXPORT( FT_Int ) - FT_Get_Charmap_Index( FT_CharMap charmap ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Char_Index */ - /* */ - /* <Description> */ - /* Return the glyph index of a given character code. This function */ - /* uses a charmap object to do the mapping. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* charcode :: The character code. */ - /* */ - /* <Return> */ - /* The glyph index. 0~means `undefined character code'. */ - /* */ - /* <Note> */ - /* If you use FreeType to manipulate the contents of font files */ - /* directly, be aware that the glyph index returned by this function */ - /* doesn't always correspond to the internal indices used within the */ - /* file. This is done to ensure that value~0 always corresponds to */ - /* the `missing glyph'. If the first glyph is not named `.notdef', */ - /* then for Type~1 and Type~42 fonts, `.notdef' will be moved into */ - /* the glyph ID~0 position, and whatever was there will be moved to */ - /* the position `.notdef' had. For Type~1 fonts, if there is no */ - /* `.notdef' glyph at all, then one will be created at index~0 and */ - /* whatever was there will be moved to the last index -- Type~42 */ - /* fonts are considered invalid under this condition. */ - /* */ - FT_EXPORT( FT_UInt ) - FT_Get_Char_Index( FT_Face face, - FT_ULong charcode ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_First_Char */ - /* */ - /* <Description> */ - /* This function is used to return the first character code in the */ - /* current charmap of a given face. It also returns the */ - /* corresponding glyph index. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* <Output> */ - /* agindex :: Glyph index of first character code. 0~if charmap is */ - /* empty. */ - /* */ - /* <Return> */ - /* The charmap's first character code. */ - /* */ - /* <Note> */ - /* You should use this function with @FT_Get_Next_Char to be able to */ - /* parse all character codes available in a given charmap. The code */ - /* should look like this: */ - /* */ - /* { */ - /* FT_ULong charcode; */ - /* FT_UInt gindex; */ - /* */ - /* */ - /* charcode = FT_Get_First_Char( face, &gindex ); */ - /* while ( gindex != 0 ) */ - /* { */ - /* ... do something with (charcode,gindex) pair ... */ - /* */ - /* charcode = FT_Get_Next_Char( face, charcode, &gindex ); */ - /* } */ - /* } */ - /* */ - /* Note that `*agindex' is set to~0 if the charmap is empty. The */ - /* result itself can be~0 in two cases: if the charmap is empty or */ - /* if the value~0 is the first valid character code. */ - /* */ - FT_EXPORT( FT_ULong ) - FT_Get_First_Char( FT_Face face, - FT_UInt *agindex ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Next_Char */ - /* */ - /* <Description> */ - /* This function is used to return the next character code in the */ - /* current charmap of a given face following the value `char_code', */ - /* as well as the corresponding glyph index. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* char_code :: The starting character code. */ - /* */ - /* <Output> */ - /* agindex :: Glyph index of next character code. 0~if charmap */ - /* is empty. */ - /* */ - /* <Return> */ - /* The charmap's next character code. */ - /* */ - /* <Note> */ - /* You should use this function with @FT_Get_First_Char to walk */ - /* over all character codes available in a given charmap. See the */ - /* note for this function for a simple code example. */ - /* */ - /* Note that `*agindex' is set to~0 when there are no more codes in */ - /* the charmap. */ - /* */ - FT_EXPORT( FT_ULong ) - FT_Get_Next_Char( FT_Face face, - FT_ULong char_code, - FT_UInt *agindex ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Name_Index */ - /* */ - /* <Description> */ - /* Return the glyph index of a given glyph name. This function uses */ - /* driver specific objects to do the translation. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* glyph_name :: The glyph name. */ - /* */ - /* <Return> */ - /* The glyph index. 0~means `undefined character code'. */ - /* */ - FT_EXPORT( FT_UInt ) - FT_Get_Name_Index( FT_Face face, - FT_String* glyph_name ); - - - /************************************************************************* - * - * @macro: - * FT_SUBGLYPH_FLAG_XXX - * - * @description: - * A list of constants used to describe subglyphs. Please refer to the - * TrueType specification for the meaning of the various flags. - * - * @values: - * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS :: - * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES :: - * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID :: - * FT_SUBGLYPH_FLAG_SCALE :: - * FT_SUBGLYPH_FLAG_XY_SCALE :: - * FT_SUBGLYPH_FLAG_2X2 :: - * FT_SUBGLYPH_FLAG_USE_MY_METRICS :: - * - */ -#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 -#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 -#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 -#define FT_SUBGLYPH_FLAG_SCALE 8 -#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 -#define FT_SUBGLYPH_FLAG_2X2 0x80 -#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 - - - /************************************************************************* - * - * @func: - * FT_Get_SubGlyph_Info - * - * @description: - * Retrieve a description of a given subglyph. Only use it if - * `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is - * returned otherwise. - * - * @input: - * glyph :: - * The source glyph slot. - * - * sub_index :: - * The index of the subglyph. Must be less than - * `glyph->num_subglyphs'. - * - * @output: - * p_index :: - * The glyph index of the subglyph. - * - * p_flags :: - * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX. - * - * p_arg1 :: - * The subglyph's first argument (if any). - * - * p_arg2 :: - * The subglyph's second argument (if any). - * - * p_transform :: - * The subglyph transformation (if any). - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The values of `*p_arg1', `*p_arg2', and `*p_transform' must be - * interpreted depending on the flags returned in `*p_flags'. See the - * TrueType specification for details. - * - */ - FT_EXPORT( FT_Error ) - FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, - FT_UInt sub_index, - FT_Int *p_index, - FT_UInt *p_flags, - FT_Int *p_arg1, - FT_Int *p_arg2, - FT_Matrix *p_transform ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_FSTYPE_XXX */ - /* */ - /* <Description> */ - /* A list of bit flags used in the `fsType' field of the OS/2 table */ - /* in a TrueType or OpenType font and the `FSType' entry in a */ - /* PostScript font. These bit flags are returned by */ - /* @FT_Get_FSType_Flags; they inform client applications of embedding */ - /* and subsetting restrictions associated with a font. */ - /* */ - /* See */ - /* http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf */ - /* for more details. */ - /* */ - /* <Values> */ - /* FT_FSTYPE_INSTALLABLE_EMBEDDING :: */ - /* Fonts with no fsType bit set may be embedded and permanently */ - /* installed on the remote system by an application. */ - /* */ - /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING :: */ - /* Fonts that have only this bit set must not be modified, embedded */ - /* or exchanged in any manner without first obtaining permission of */ - /* the font software copyright owner. */ - /* */ - /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: */ - /* If this bit is set, the font may be embedded and temporarily */ - /* loaded on the remote system. Documents containing Preview & */ - /* Print fonts must be opened `read-only'; no edits can be applied */ - /* to the document. */ - /* */ - /* FT_FSTYPE_EDITABLE_EMBEDDING :: */ - /* If this bit is set, the font may be embedded but must only be */ - /* installed temporarily on other systems. In contrast to Preview */ - /* & Print fonts, documents containing editable fonts may be opened */ - /* for reading, editing is permitted, and changes may be saved. */ - /* */ - /* FT_FSTYPE_NO_SUBSETTING :: */ - /* If this bit is set, the font may not be subsetted prior to */ - /* embedding. */ - /* */ - /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: */ - /* If this bit is set, only bitmaps contained in the font may be */ - /* embedded; no outline data may be embedded. If there are no */ - /* bitmaps available in the font, then the font is unembeddable. */ - /* */ - /* <Note> */ - /* The flags are ORed together, thus more than a single value can be */ - /* returned. */ - /* */ - /* While the fsType flags can indicate that a font may be embedded, a */ - /* license with the font vendor may be separately required to use the */ - /* font in this way. */ - /* */ -#define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000 -#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002 -#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING 0x0004 -#define FT_FSTYPE_EDITABLE_EMBEDDING 0x0008 -#define FT_FSTYPE_NO_SUBSETTING 0x0100 -#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY 0x0200 - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_FSType_Flags */ - /* */ - /* <Description> */ - /* Return the fsType flags for a font. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* <Return> */ - /* The fsType flags, @FT_FSTYPE_XXX. */ - /* */ - /* <Note> */ - /* Use this function rather than directly reading the `fs_type' field */ - /* in the @PS_FontInfoRec structure, which is only guaranteed to */ - /* return the correct results for Type~1 fonts. */ - /* */ - /* <Since> */ - /* 2.3.8 */ - /* */ - FT_EXPORT( FT_UShort ) - FT_Get_FSType_Flags( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* glyph_variants */ - /* */ - /* <Title> */ - /* Glyph Variants */ - /* */ - /* <Abstract> */ - /* The FreeType~2 interface to Unicode Ideographic Variation */ - /* Sequences (IVS), using the SFNT cmap format~14. */ - /* */ - /* <Description> */ - /* Many CJK characters have variant forms. They are a sort of grey */ - /* area somewhere between being totally irrelevant and semantically */ - /* distinct; for this reason, the Unicode consortium decided to */ - /* introduce Ideographic Variation Sequences (IVS), consisting of a */ - /* Unicode base character and one of 240 variant selectors */ - /* (U+E0100-U+E01EF), instead of further extending the already huge */ - /* code range for CJK characters. */ - /* */ - /* An IVS is registered and unique; for further details please refer */ - /* to Unicode Technical Standard #37, the Ideographic Variation */ - /* Database: */ - /* */ - /* http://www.unicode.org/reports/tr37/ */ - /* */ - /* To date (November 2014), the character with the most variants is */ - /* U+9089, having 32 such IVS. */ - /* */ - /* Adobe and MS decided to support IVS with a new cmap subtable */ - /* (format~14). It is an odd subtable because it is not a mapping of */ - /* input code points to glyphs, but contains lists of all variants */ - /* supported by the font. */ - /* */ - /* A variant may be either `default' or `non-default'. A default */ - /* variant is the one you will get for that code point if you look it */ - /* up in the standard Unicode cmap. A non-default variant is a */ - /* different glyph. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_GetCharVariantIndex */ - /* */ - /* <Description> */ - /* Return the glyph index of a given character code as modified by */ - /* the variation selector. */ - /* */ - /* <Input> */ - /* face :: */ - /* A handle to the source face object. */ - /* */ - /* charcode :: */ - /* The character code point in Unicode. */ - /* */ - /* variantSelector :: */ - /* The Unicode code point of the variation selector. */ - /* */ - /* <Return> */ - /* The glyph index. 0~means either `undefined character code', or */ - /* `undefined selector code', or `no variation selector cmap */ - /* subtable', or `current CharMap is not Unicode'. */ - /* */ - /* <Note> */ - /* If you use FreeType to manipulate the contents of font files */ - /* directly, be aware that the glyph index returned by this function */ - /* doesn't always correspond to the internal indices used within */ - /* the file. This is done to ensure that value~0 always corresponds */ - /* to the `missing glyph'. */ - /* */ - /* This function is only meaningful if */ - /* a) the font has a variation selector cmap sub table, */ - /* and */ - /* b) the current charmap has a Unicode encoding. */ - /* */ - /* <Since> */ - /* 2.3.6 */ - /* */ - FT_EXPORT( FT_UInt ) - FT_Face_GetCharVariantIndex( FT_Face face, - FT_ULong charcode, - FT_ULong variantSelector ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_GetCharVariantIsDefault */ - /* */ - /* <Description> */ - /* Check whether this variant of this Unicode character is the one to */ - /* be found in the `cmap'. */ - /* */ - /* <Input> */ - /* face :: */ - /* A handle to the source face object. */ - /* */ - /* charcode :: */ - /* The character codepoint in Unicode. */ - /* */ - /* variantSelector :: */ - /* The Unicode codepoint of the variation selector. */ - /* */ - /* <Return> */ - /* 1~if found in the standard (Unicode) cmap, 0~if found in the */ - /* variation selector cmap, or -1 if it is not a variant. */ - /* */ - /* <Note> */ - /* This function is only meaningful if the font has a variation */ - /* selector cmap subtable. */ - /* */ - /* <Since> */ - /* 2.3.6 */ - /* */ - FT_EXPORT( FT_Int ) - FT_Face_GetCharVariantIsDefault( FT_Face face, - FT_ULong charcode, - FT_ULong variantSelector ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_GetVariantSelectors */ - /* */ - /* <Description> */ - /* Return a zero-terminated list of Unicode variant selectors found */ - /* in the font. */ - /* */ - /* <Input> */ - /* face :: */ - /* A handle to the source face object. */ - /* */ - /* <Return> */ - /* A pointer to an array of selector code points, or NULL if there is */ - /* no valid variant selector cmap subtable. */ - /* */ - /* <Note> */ - /* The last item in the array is~0; the array is owned by the */ - /* @FT_Face object but can be overwritten or released on the next */ - /* call to a FreeType function. */ - /* */ - /* <Since> */ - /* 2.3.6 */ - /* */ - FT_EXPORT( FT_UInt32* ) - FT_Face_GetVariantSelectors( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_GetVariantsOfChar */ - /* */ - /* <Description> */ - /* Return a zero-terminated list of Unicode variant selectors found */ - /* for the specified character code. */ - /* */ - /* <Input> */ - /* face :: */ - /* A handle to the source face object. */ - /* */ - /* charcode :: */ - /* The character codepoint in Unicode. */ - /* */ - /* <Return> */ - /* A pointer to an array of variant selector code points that are */ - /* active for the given character, or NULL if the corresponding list */ - /* is empty. */ - /* */ - /* <Note> */ - /* The last item in the array is~0; the array is owned by the */ - /* @FT_Face object but can be overwritten or released on the next */ - /* call to a FreeType function. */ - /* */ - /* <Since> */ - /* 2.3.6 */ - /* */ - FT_EXPORT( FT_UInt32* ) - FT_Face_GetVariantsOfChar( FT_Face face, - FT_ULong charcode ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_GetCharsOfVariant */ - /* */ - /* <Description> */ - /* Return a zero-terminated list of Unicode character codes found for */ - /* the specified variant selector. */ - /* */ - /* <Input> */ - /* face :: */ - /* A handle to the source face object. */ - /* */ - /* variantSelector :: */ - /* The variant selector code point in Unicode. */ - /* */ - /* <Return> */ - /* A list of all the code points that are specified by this selector */ - /* (both default and non-default codes are returned) or NULL if there */ - /* is no valid cmap or the variant selector is invalid. */ - /* */ - /* <Note> */ - /* The last item in the array is~0; the array is owned by the */ - /* @FT_Face object but can be overwritten or released on the next */ - /* call to a FreeType function. */ - /* */ - /* <Since> */ - /* 2.3.6 */ - /* */ - FT_EXPORT( FT_UInt32* ) - FT_Face_GetCharsOfVariant( FT_Face face, - FT_ULong variantSelector ); - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* computations */ - /* */ - /* <Title> */ - /* Computations */ - /* */ - /* <Abstract> */ - /* Crunching fixed numbers and vectors. */ - /* */ - /* <Description> */ - /* This section contains various functions used to perform */ - /* computations on 16.16 fixed-float numbers or 2d vectors. */ - /* */ - /* <Order> */ - /* FT_MulDiv */ - /* FT_MulFix */ - /* FT_DivFix */ - /* FT_RoundFix */ - /* FT_CeilFix */ - /* FT_FloorFix */ - /* FT_Vector_Transform */ - /* FT_Matrix_Multiply */ - /* FT_Matrix_Invert */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_MulDiv */ - /* */ - /* <Description> */ - /* A very simple function used to perform the computation `(a*b)/c' */ - /* with maximum accuracy (it uses a 64-bit intermediate integer */ - /* whenever necessary). */ - /* */ - /* This function isn't necessarily as fast as some processor specific */ - /* operations, but is at least completely portable. */ - /* */ - /* <Input> */ - /* a :: The first multiplier. */ - /* b :: The second multiplier. */ - /* c :: The divisor. */ - /* */ - /* <Return> */ - /* The result of `(a*b)/c'. This function never traps when trying to */ - /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ - /* on the signs of `a' and `b'. */ - /* */ - FT_EXPORT( FT_Long ) - FT_MulDiv( FT_Long a, - FT_Long b, - FT_Long c ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_MulFix */ - /* */ - /* <Description> */ - /* A very simple function used to perform the computation */ - /* `(a*b)/0x10000' with maximum accuracy. Most of the time this is */ - /* used to multiply a given value by a 16.16 fixed-point factor. */ - /* */ - /* <Input> */ - /* a :: The first multiplier. */ - /* b :: The second multiplier. Use a 16.16 factor here whenever */ - /* possible (see note below). */ - /* */ - /* <Return> */ - /* The result of `(a*b)/0x10000'. */ - /* */ - /* <Note> */ - /* This function has been optimized for the case where the absolute */ - /* value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */ - /* As this happens mainly when scaling from notional units to */ - /* fractional pixels in FreeType, it resulted in noticeable speed */ - /* improvements between versions 2.x and 1.x. */ - /* */ - /* As a conclusion, always try to place a 16.16 factor as the */ - /* _second_ argument of this function; this can make a great */ - /* difference. */ - /* */ - FT_EXPORT( FT_Long ) - FT_MulFix( FT_Long a, - FT_Long b ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_DivFix */ - /* */ - /* <Description> */ - /* A very simple function used to perform the computation */ - /* `(a*0x10000)/b' with maximum accuracy. Most of the time, this is */ - /* used to divide a given value by a 16.16 fixed-point factor. */ - /* */ - /* <Input> */ - /* a :: The numerator. */ - /* b :: The denominator. Use a 16.16 factor here. */ - /* */ - /* <Return> */ - /* The result of `(a*0x10000)/b'. */ - /* */ - FT_EXPORT( FT_Long ) - FT_DivFix( FT_Long a, - FT_Long b ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_RoundFix */ - /* */ - /* <Description> */ - /* A very simple function used to round a 16.16 fixed number. */ - /* */ - /* <Input> */ - /* a :: The number to be rounded. */ - /* */ - /* <Return> */ - /* The result of `(a + 0x8000) & -0x10000'. */ - /* */ - FT_EXPORT( FT_Fixed ) - FT_RoundFix( FT_Fixed a ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_CeilFix */ - /* */ - /* <Description> */ - /* A very simple function used to compute the ceiling function of a */ - /* 16.16 fixed number. */ - /* */ - /* <Input> */ - /* a :: The number for which the ceiling function is to be computed. */ - /* */ - /* <Return> */ - /* The result of `(a + 0x10000 - 1) & -0x10000'. */ - /* */ - FT_EXPORT( FT_Fixed ) - FT_CeilFix( FT_Fixed a ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_FloorFix */ - /* */ - /* <Description> */ - /* A very simple function used to compute the floor function of a */ - /* 16.16 fixed number. */ - /* */ - /* <Input> */ - /* a :: The number for which the floor function is to be computed. */ - /* */ - /* <Return> */ - /* The result of `a & -0x10000'. */ - /* */ - FT_EXPORT( FT_Fixed ) - FT_FloorFix( FT_Fixed a ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Vector_Transform */ - /* */ - /* <Description> */ - /* Transform a single vector through a 2x2 matrix. */ - /* */ - /* <InOut> */ - /* vector :: The target vector to transform. */ - /* */ - /* <Input> */ - /* matrix :: A pointer to the source 2x2 matrix. */ - /* */ - /* <Note> */ - /* The result is undefined if either `vector' or `matrix' is invalid. */ - /* */ - FT_EXPORT( void ) - FT_Vector_Transform( FT_Vector* vec, - const FT_Matrix* matrix ); - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* version */ - /* */ - /* <Title> */ - /* FreeType Version */ - /* */ - /* <Abstract> */ - /* Functions and macros related to FreeType versions. */ - /* */ - /* <Description> */ - /* Note that those functions and macros are of limited use because */ - /* even a new release of FreeType with only documentation changes */ - /* increases the version number. */ - /* */ - /* <Order> */ - /* FT_Library_Version */ - /* */ - /* FREETYPE_MAJOR */ - /* FREETYPE_MINOR */ - /* FREETYPE_PATCH */ - /* */ - /* FT_Face_CheckTrueTypePatents */ - /* FT_Face_SetUnpatentedHinting */ - /* */ - /* FREETYPE_XXX */ - /* */ - /*************************************************************************/ - - - /************************************************************************* - * - * @enum: - * FREETYPE_XXX - * - * @description: - * These three macros identify the FreeType source code version. - * Use @FT_Library_Version to access them at runtime. - * - * @values: - * FREETYPE_MAJOR :: The major version number. - * FREETYPE_MINOR :: The minor version number. - * FREETYPE_PATCH :: The patch level. - * - * @note: - * The version number of FreeType if built as a dynamic link library - * with the `libtool' package is _not_ controlled by these three - * macros. - * - */ -#define FREETYPE_MAJOR 2 -#define FREETYPE_MINOR 6 -#define FREETYPE_PATCH 0 - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Library_Version */ - /* */ - /* <Description> */ - /* Return the version of the FreeType library being used. This is */ - /* useful when dynamically linking to the library, since one cannot */ - /* use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and */ - /* @FREETYPE_PATCH. */ - /* */ - /* <Input> */ - /* library :: A source library handle. */ - /* */ - /* <Output> */ - /* amajor :: The major version number. */ - /* */ - /* aminor :: The minor version number. */ - /* */ - /* apatch :: The patch version number. */ - /* */ - /* <Note> */ - /* The reason why this function takes a `library' argument is because */ - /* certain programs implement library initialization in a custom way */ - /* that doesn't use @FT_Init_FreeType. */ - /* */ - /* In such cases, the library version might not be available before */ - /* the library object has been created. */ - /* */ - FT_EXPORT( void ) - FT_Library_Version( FT_Library library, - FT_Int *amajor, - FT_Int *aminor, - FT_Int *apatch ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_CheckTrueTypePatents */ - /* */ - /* <Description> */ - /* Parse all bytecode instructions of a TrueType font file to check */ - /* whether any of the patented opcodes are used. This is only useful */ - /* if you want to be able to use the unpatented hinter with */ - /* fonts that do *not* use these opcodes. */ - /* */ - /* Note that this function parses *all* glyph instructions in the */ - /* font file, which may be slow. */ - /* */ - /* <Input> */ - /* face :: A face handle. */ - /* */ - /* <Return> */ - /* 1~if this is a TrueType font that uses one of the patented */ - /* opcodes, 0~otherwise. */ - /* */ - /* <Note> */ - /* Since May 2010, TrueType hinting is no longer patented. */ - /* */ - /* <Since> */ - /* 2.3.5 */ - /* */ - FT_EXPORT( FT_Bool ) - FT_Face_CheckTrueTypePatents( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_SetUnpatentedHinting */ - /* */ - /* <Description> */ - /* Enable or disable the unpatented hinter for a given face. */ - /* Only enable it if you have determined that the face doesn't */ - /* use any patented opcodes (see @FT_Face_CheckTrueTypePatents). */ - /* */ - /* <Input> */ - /* face :: A face handle. */ - /* */ - /* value :: New boolean setting. */ - /* */ - /* <Return> */ - /* The old setting value. This will always be false if this is not */ - /* an SFNT font, or if the unpatented hinter is not compiled in this */ - /* instance of the library. */ - /* */ - /* <Note> */ - /* Since May 2010, TrueType hinting is no longer patented. */ - /* */ - /* <Since> */ - /* 2.3.5 */ - /* */ - FT_EXPORT( FT_Bool ) - FT_Face_SetUnpatentedHinting( FT_Face face, - FT_Bool value ); - - /* */ - - -FT_END_HEADER - -#endif /* __FREETYPE_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftadvanc.h b/3party/freetype/include/freetype/ftadvanc.h deleted file mode 100644 index b4d2aed567..0000000000 --- a/3party/freetype/include/freetype/ftadvanc.h +++ /dev/null @@ -1,187 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftadvanc.h */ -/* */ -/* Quick computation of advance widths (specification only). */ -/* */ -/* Copyright 2008-2015 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 __FTADVANC_H__ -#define __FTADVANC_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /************************************************************************** - * - * @section: - * quick_advance - * - * @title: - * Quick retrieval of advance values - * - * @abstract: - * Retrieve horizontal and vertical advance values without processing - * glyph outlines, if possible. - * - * @description: - * This section contains functions to quickly extract advance values - * without handling glyph outlines, if possible. - * - * @order: - * FT_Get_Advance - * FT_Get_Advances - * - */ - - - /*************************************************************************/ - /* */ - /* <Const> */ - /* FT_ADVANCE_FLAG_FAST_ONLY */ - /* */ - /* <Description> */ - /* A bit-flag to be OR-ed with the `flags' parameter of the */ - /* @FT_Get_Advance and @FT_Get_Advances functions. */ - /* */ - /* If set, it indicates that you want these functions to fail if the */ - /* corresponding hinting mode or font driver doesn't allow for very */ - /* quick advance computation. */ - /* */ - /* Typically, glyphs that are either unscaled, unhinted, bitmapped, */ - /* or light-hinted can have their advance width computed very */ - /* quickly. */ - /* */ - /* Normal and bytecode hinted modes that require loading, scaling, */ - /* and hinting of the glyph outline, are extremely slow by */ - /* comparison. */ - /* */ -#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000L - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Advance */ - /* */ - /* <Description> */ - /* Retrieve the advance value of a given glyph outline in an */ - /* @FT_Face. */ - /* */ - /* <Input> */ - /* face :: The source @FT_Face handle. */ - /* */ - /* gindex :: The glyph index. */ - /* */ - /* load_flags :: A set of bit flags similar to those used when */ - /* calling @FT_Load_Glyph, used to determine what kind */ - /* of advances you need. */ - /* <Output> */ - /* padvance :: The advance value. If scaling is performed (based on */ - /* the value of `load_flags'), the advance value is in */ - /* 16.16 format. Otherwise, it is in font units. */ - /* */ - /* If @FT_LOAD_VERTICAL_LAYOUT is set, this is the */ - /* vertical advance corresponding to a vertical layout. */ - /* Otherwise, it is the horizontal advance in a */ - /* horizontal layout. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */ - /* if the corresponding font backend doesn't have a quick way to */ - /* retrieve the advances. */ - /* */ - /* A scaled advance is returned in 16.16 format but isn't transformed */ - /* by the affine transformation specified by @FT_Set_Transform. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Advance( FT_Face face, - FT_UInt gindex, - FT_Int32 load_flags, - FT_Fixed *padvance ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Advances */ - /* */ - /* <Description> */ - /* Retrieve the advance values of several glyph outlines in an */ - /* @FT_Face. */ - /* */ - /* <Input> */ - /* face :: The source @FT_Face handle. */ - /* */ - /* start :: The first glyph index. */ - /* */ - /* count :: The number of advance values you want to retrieve. */ - /* */ - /* load_flags :: A set of bit flags similar to those used when */ - /* calling @FT_Load_Glyph. */ - /* */ - /* <Output> */ - /* padvance :: The advance values. This array, to be provided by the */ - /* caller, must contain at least `count' elements. */ - /* */ - /* If scaling is performed (based on the value of */ - /* `load_flags'), the advance values are in 16.16 format. */ - /* Otherwise, they are in font units. */ - /* */ - /* If @FT_LOAD_VERTICAL_LAYOUT is set, these are the */ - /* vertical advances corresponding to a vertical layout. */ - /* Otherwise, they are the horizontal advances in a */ - /* horizontal layout. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */ - /* if the corresponding font backend doesn't have a quick way to */ - /* retrieve the advances. */ - /* */ - /* Scaled advances are returned in 16.16 format but aren't */ - /* transformed by the affine transformation specified by */ - /* @FT_Set_Transform. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Advances( FT_Face face, - FT_UInt start, - FT_UInt count, - FT_Int32 load_flags, - FT_Fixed *padvances ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTADVANC_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftautoh.h b/3party/freetype/include/freetype/ftautoh.h deleted file mode 100644 index cf7b76f492..0000000000 --- a/3party/freetype/include/freetype/ftautoh.h +++ /dev/null @@ -1,450 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftautoh.h */ -/* */ -/* FreeType API for controlling the auto-hinter (specification only). */ -/* */ -/* Copyright 2012-2015 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 __FTAUTOH_H__ -#define __FTAUTOH_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /************************************************************************** - * - * @section: - * auto_hinter - * - * @title: - * The auto-hinter - * - * @abstract: - * Controlling the auto-hinting module. - * - * @description: - * While FreeType's auto-hinter doesn't expose API functions by itself, - * it is possible to control its behaviour with @FT_Property_Set and - * @FT_Property_Get. The following lists the available properties - * together with the necessary macros and structures. - * - * Note that the auto-hinter's module name is `autofitter' for - * historical reasons. - * - */ - - - /************************************************************************** - * - * @property: - * glyph-to-script-map - * - * @description: - * *Experimental* *only* - * - * The auto-hinter provides various script modules to hint glyphs. - * Examples of supported scripts are Latin or CJK. Before a glyph is - * auto-hinted, the Unicode character map of the font gets examined, and - * the script is then determined based on Unicode character ranges, see - * below. - * - * OpenType fonts, however, often provide much more glyphs than - * character codes (small caps, superscripts, ligatures, swashes, etc.), - * to be controlled by so-called `features'. Handling OpenType features - * can be quite complicated and thus needs a separate library on top of - * FreeType. - * - * The mapping between glyph indices and scripts (in the auto-hinter - * sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an - * array with `num_glyphs' elements, as found in the font's @FT_Face - * structure. The `glyph-to-script-map' property returns a pointer to - * this array, which can be modified as needed. Note that the - * modification should happen before the first glyph gets processed by - * the auto-hinter so that the global analysis of the font shapes - * actually uses the modified mapping. - * - * The following example code demonstrates how to access it (omitting - * the error handling). - * - * { - * FT_Library library; - * FT_Face face; - * FT_Prop_GlyphToScriptMap prop; - * - * - * FT_Init_FreeType( &library ); - * FT_New_Face( library, "foo.ttf", 0, &face ); - * - * prop.face = face; - * - * FT_Property_Get( library, "autofitter", - * "glyph-to-script-map", &prop ); - * - * // adjust `prop.map' as needed right here - * - * FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT ); - * } - * - */ - - - /************************************************************************** - * - * @enum: - * FT_AUTOHINTER_SCRIPT_XXX - * - * @description: - * *Experimental* *only* - * - * A list of constants used for the @glyph-to-script-map property to - * specify the script submodule the auto-hinter should use for hinting a - * particular glyph. - * - * @values: - * FT_AUTOHINTER_SCRIPT_NONE :: - * Don't auto-hint this glyph. - * - * FT_AUTOHINTER_SCRIPT_LATIN :: - * Apply the latin auto-hinter. For the auto-hinter, `latin' is a - * very broad term, including Cyrillic and Greek also since characters - * from those scripts share the same design constraints. - * - * By default, characters from the following Unicode ranges are - * assigned to this submodule. - * - * { - * U+0020 - U+007F // Basic Latin (no control characters) - * U+00A0 - U+00FF // Latin-1 Supplement (no control characters) - * U+0100 - U+017F // Latin Extended-A - * U+0180 - U+024F // Latin Extended-B - * U+0250 - U+02AF // IPA Extensions - * U+02B0 - U+02FF // Spacing Modifier Letters - * U+0300 - U+036F // Combining Diacritical Marks - * U+0370 - U+03FF // Greek and Coptic - * U+0400 - U+04FF // Cyrillic - * U+0500 - U+052F // Cyrillic Supplement - * U+1D00 - U+1D7F // Phonetic Extensions - * U+1D80 - U+1DBF // Phonetic Extensions Supplement - * U+1DC0 - U+1DFF // Combining Diacritical Marks Supplement - * U+1E00 - U+1EFF // Latin Extended Additional - * U+1F00 - U+1FFF // Greek Extended - * U+2000 - U+206F // General Punctuation - * U+2070 - U+209F // Superscripts and Subscripts - * U+20A0 - U+20CF // Currency Symbols - * U+2150 - U+218F // Number Forms - * U+2460 - U+24FF // Enclosed Alphanumerics - * U+2C60 - U+2C7F // Latin Extended-C - * U+2DE0 - U+2DFF // Cyrillic Extended-A - * U+2E00 - U+2E7F // Supplemental Punctuation - * U+A640 - U+A69F // Cyrillic Extended-B - * U+A720 - U+A7FF // Latin Extended-D - * U+FB00 - U+FB06 // Alphab. Present. Forms (Latin Ligatures) - * U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols - * U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement - * } - * - * FT_AUTOHINTER_SCRIPT_CJK :: - * Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old - * Vietnamese, and some other scripts. - * - * By default, characters from the following Unicode ranges are - * assigned to this submodule. - * - * { - * U+1100 - U+11FF // Hangul Jamo - * U+2E80 - U+2EFF // CJK Radicals Supplement - * U+2F00 - U+2FDF // Kangxi Radicals - * U+2FF0 - U+2FFF // Ideographic Description Characters - * U+3000 - U+303F // CJK Symbols and Punctuation - * U+3040 - U+309F // Hiragana - * U+30A0 - U+30FF // Katakana - * U+3100 - U+312F // Bopomofo - * U+3130 - U+318F // Hangul Compatibility Jamo - * U+3190 - U+319F // Kanbun - * U+31A0 - U+31BF // Bopomofo Extended - * U+31C0 - U+31EF // CJK Strokes - * U+31F0 - U+31FF // Katakana Phonetic Extensions - * U+3200 - U+32FF // Enclosed CJK Letters and Months - * U+3300 - U+33FF // CJK Compatibility - * U+3400 - U+4DBF // CJK Unified Ideographs Extension A - * U+4DC0 - U+4DFF // Yijing Hexagram Symbols - * U+4E00 - U+9FFF // CJK Unified Ideographs - * U+A960 - U+A97F // Hangul Jamo Extended-A - * U+AC00 - U+D7AF // Hangul Syllables - * U+D7B0 - U+D7FF // Hangul Jamo Extended-B - * U+F900 - U+FAFF // CJK Compatibility Ideographs - * U+FE10 - U+FE1F // Vertical forms - * U+FE30 - U+FE4F // CJK Compatibility Forms - * U+FF00 - U+FFEF // Halfwidth and Fullwidth Forms - * U+1B000 - U+1B0FF // Kana Supplement - * U+1D300 - U+1D35F // Tai Xuan Hing Symbols - * U+1F200 - U+1F2FF // Enclosed Ideographic Supplement - * U+20000 - U+2A6DF // CJK Unified Ideographs Extension B - * U+2A700 - U+2B73F // CJK Unified Ideographs Extension C - * U+2B740 - U+2B81F // CJK Unified Ideographs Extension D - * U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement - * } - * - * FT_AUTOHINTER_SCRIPT_INDIC :: - * Apply the indic auto-hinter, covering all major scripts from the - * Indian sub-continent and some other related scripts like Thai, Lao, - * or Tibetan. - * - * By default, characters from the following Unicode ranges are - * assigned to this submodule. - * - * { - * U+0900 - U+0DFF // Indic Range - * U+0F00 - U+0FFF // Tibetan - * U+1900 - U+194F // Limbu - * U+1B80 - U+1BBF // Sundanese - * U+1C80 - U+1CDF // Meetei Mayak - * U+A800 - U+A82F // Syloti Nagri - * U+11800 - U+118DF // Sharada - * } - * - * Note that currently Indic support is rudimentary only, missing blue - * zone support. - * - */ -#define FT_AUTOHINTER_SCRIPT_NONE 0 -#define FT_AUTOHINTER_SCRIPT_LATIN 1 -#define FT_AUTOHINTER_SCRIPT_CJK 2 -#define FT_AUTOHINTER_SCRIPT_INDIC 3 - - - /************************************************************************** - * - * @struct: - * FT_Prop_GlyphToScriptMap - * - * @description: - * *Experimental* *only* - * - * The data exchange structure for the @glyph-to-script-map property. - * - */ - typedef struct FT_Prop_GlyphToScriptMap_ - { - FT_Face face; - FT_Byte* map; - - } FT_Prop_GlyphToScriptMap; - - - /************************************************************************** - * - * @property: - * fallback-script - * - * @description: - * *Experimental* *only* - * - * If no auto-hinter script module can be assigned to a glyph, a - * fallback script gets assigned to it (see also the - * @glyph-to-script-map property). By default, this is - * @FT_AUTOHINTER_SCRIPT_CJK. Using the `fallback-script' property, - * this fallback value can be changed. - * - * { - * FT_Library library; - * FT_UInt fallback_script = FT_AUTOHINTER_SCRIPT_NONE; - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "autofitter", - * "fallback-script", &fallback_script ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - * It's important to use the right timing for changing this value: The - * creation of the glyph-to-script map that eventually uses the - * fallback script value gets triggered either by setting or reading a - * face-specific property like @glyph-to-script-map, or by auto-hinting - * any glyph from that face. In particular, if you have already created - * an @FT_Face structure but not loaded any glyph (using the - * auto-hinter), a change of the fallback script will affect this face. - * - */ - - - /************************************************************************** - * - * @property: - * default-script - * - * @description: - * *Experimental* *only* - * - * If FreeType gets compiled with FT_CONFIG_OPTION_USE_HARFBUZZ to make - * the HarfBuzz library access OpenType features for getting better - * glyph coverages, this property sets the (auto-fitter) script to be - * used for the default (OpenType) script data of a font's GSUB table. - * Features for the default script are intended for all scripts not - * explicitly handled in GSUB; an example is a `dlig' feature, - * containing the combination of the characters `T', `E', and `L' to - * form a `TEL' ligature. - * - * By default, this is @FT_AUTOHINTER_SCRIPT_LATIN. Using the - * `default-script' property, this default value can be changed. - * - * { - * FT_Library library; - * FT_UInt default_script = FT_AUTOHINTER_SCRIPT_NONE; - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "autofitter", - * "default-script", &default_script ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - * It's important to use the right timing for changing this value: The - * creation of the glyph-to-script map that eventually uses the - * default script value gets triggered either by setting or reading a - * face-specific property like @glyph-to-script-map, or by auto-hinting - * any glyph from that face. In particular, if you have already created - * an @FT_Face structure but not loaded any glyph (using the - * auto-hinter), a change of the default script will affect this face. - * - */ - - - /************************************************************************** - * - * @property: - * increase-x-height - * - * @description: - * For ppem values in the range 6~<= ppem <= `increase-x-height', round - * up the font's x~height much more often than normally. If the value - * is set to~0, which is the default, this feature is switched off. Use - * this property to improve the legibility of small font sizes if - * necessary. - * - * { - * FT_Library library; - * FT_Face face; - * FT_Prop_IncreaseXHeight prop; - * - * - * FT_Init_FreeType( &library ); - * FT_New_Face( library, "foo.ttf", 0, &face ); - * FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 ); - * - * prop.face = face; - * prop.limit = 14; - * - * FT_Property_Set( library, "autofitter", - * "increase-x-height", &prop ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - * Set this value right after calling @FT_Set_Char_Size, but before - * loading any glyph (using the auto-hinter). - * - */ - - - /************************************************************************** - * - * @struct: - * FT_Prop_IncreaseXHeight - * - * @description: - * The data exchange structure for the @increase-x-height property. - * - */ - typedef struct FT_Prop_IncreaseXHeight_ - { - FT_Face face; - FT_UInt limit; - - } FT_Prop_IncreaseXHeight; - - - /************************************************************************** - * - * @property: - * warping - * - * @description: - * *Experimental* *only* - * - * If FreeType gets compiled with option AF_CONFIG_OPTION_USE_WARPER to - * activate the warp hinting code in the auto-hinter, this property - * switches warping on and off. - * - * Warping only works in `light' auto-hinting mode. The idea of the - * code is to slightly scale and shift a glyph along the non-hinted - * dimension (which is usually the horizontal axis) so that as much of - * its segments are aligned (more or less) to the grid. To find out a - * glyph's optimal scaling and shifting value, various parameter - * combinations are tried and scored. - * - * By default, warping is off. The example below shows how to switch on - * warping (omitting the error handling). - * - * { - * FT_Library library; - * FT_Bool warping = 1; - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "autofitter", - * "warping", &warping ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - * The warping code can also change advance widths. Have a look at the - * `lsb_delta' and `rsb_delta' fields in the @FT_GlyphSlotRec structure - * for details on improving inter-glyph distances while rendering. - * - * Since warping is a global property of the auto-hinter it is best to - * change its value before rendering any face. Otherwise, you should - * reload all faces that get auto-hinted in `light' hinting mode. - * - */ - - - /* */ - - -FT_END_HEADER - -#endif /* __FTAUTOH_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftbbox.h b/3party/freetype/include/freetype/ftbbox.h deleted file mode 100644 index 9d9d040767..0000000000 --- a/3party/freetype/include/freetype/ftbbox.h +++ /dev/null @@ -1,101 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbbox.h */ -/* */ -/* FreeType exact bbox computation (specification). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This component has a _single_ role: to compute exact outline bounding */ - /* boxes. */ - /* */ - /* It is separated from the rest of the engine for various technical */ - /* reasons. It may well be integrated in `ftoutln' later. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTBBOX_H__ -#define __FTBBOX_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* outline_processing */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Get_BBox */ - /* */ - /* <Description> */ - /* Compute the exact bounding box of an outline. This is slower */ - /* than computing the control box. However, it uses an advanced */ - /* algorithm that returns _very_ quickly when the two boxes */ - /* coincide. Otherwise, the outline Bézier arcs are traversed to */ - /* extract their extrema. */ - /* */ - /* <Input> */ - /* outline :: A pointer to the source outline. */ - /* */ - /* <Output> */ - /* abbox :: The outline's exact bounding box. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* If the font is tricky and the glyph has been loaded with */ - /* @FT_LOAD_NO_SCALE, the resulting BBox is meaningless. To get */ - /* reasonable values for the BBox it is necessary to load the glyph */ - /* at a large ppem value (so that the hinting instructions can */ - /* properly shift and scale the subglyphs), then extracting the BBox, */ - /* which can be eventually converted back to font units. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Get_BBox( FT_Outline* outline, - FT_BBox *abbox ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTBBOX_H__ */ - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/3party/freetype/include/freetype/ftbdf.h b/3party/freetype/include/freetype/ftbdf.h deleted file mode 100644 index 0bdabf481c..0000000000 --- a/3party/freetype/include/freetype/ftbdf.h +++ /dev/null @@ -1,210 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbdf.h */ -/* */ -/* FreeType API for accessing BDF-specific strings (specification). */ -/* */ -/* Copyright 2002-2015 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 __FTBDF_H__ -#define __FTBDF_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* bdf_fonts */ - /* */ - /* <Title> */ - /* BDF and PCF Files */ - /* */ - /* <Abstract> */ - /* BDF and PCF specific API. */ - /* */ - /* <Description> */ - /* This section contains the declaration of functions specific to BDF */ - /* and PCF fonts. */ - /* */ - /*************************************************************************/ - - - /********************************************************************** - * - * @enum: - * BDF_PropertyType - * - * @description: - * A list of BDF property types. - * - * @values: - * BDF_PROPERTY_TYPE_NONE :: - * Value~0 is used to indicate a missing property. - * - * BDF_PROPERTY_TYPE_ATOM :: - * Property is a string atom. - * - * BDF_PROPERTY_TYPE_INTEGER :: - * Property is a 32-bit signed integer. - * - * BDF_PROPERTY_TYPE_CARDINAL :: - * Property is a 32-bit unsigned integer. - */ - typedef enum BDF_PropertyType_ - { - BDF_PROPERTY_TYPE_NONE = 0, - BDF_PROPERTY_TYPE_ATOM = 1, - BDF_PROPERTY_TYPE_INTEGER = 2, - BDF_PROPERTY_TYPE_CARDINAL = 3 - - } BDF_PropertyType; - - - /********************************************************************** - * - * @type: - * BDF_Property - * - * @description: - * A handle to a @BDF_PropertyRec structure to model a given - * BDF/PCF property. - */ - typedef struct BDF_PropertyRec_* BDF_Property; - - - /********************************************************************** - * - * @struct: - * BDF_PropertyRec - * - * @description: - * This structure models a given BDF/PCF property. - * - * @fields: - * type :: - * The property type. - * - * u.atom :: - * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM. May be - * NULL, indicating an empty string. - * - * u.integer :: - * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER. - * - * u.cardinal :: - * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL. - */ - typedef struct BDF_PropertyRec_ - { - BDF_PropertyType type; - union { - const char* atom; - FT_Int32 integer; - FT_UInt32 cardinal; - - } u; - - } BDF_PropertyRec; - - - /********************************************************************** - * - * @function: - * FT_Get_BDF_Charset_ID - * - * @description: - * Retrieve a BDF font character set identity, according to - * the BDF specification. - * - * @input: - * face :: - * A handle to the input face. - * - * @output: - * acharset_encoding :: - * Charset encoding, as a C~string, owned by the face. - * - * acharset_registry :: - * Charset registry, as a C~string, owned by the face. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with BDF faces, returning an error otherwise. - */ - FT_EXPORT( FT_Error ) - FT_Get_BDF_Charset_ID( FT_Face face, - const char* *acharset_encoding, - const char* *acharset_registry ); - - - /********************************************************************** - * - * @function: - * FT_Get_BDF_Property - * - * @description: - * Retrieve a BDF property from a BDF or PCF font file. - * - * @input: - * face :: A handle to the input face. - * - * name :: The property name. - * - * @output: - * aproperty :: The property. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function works with BDF _and_ PCF fonts. It returns an error - * otherwise. It also returns an error if the property is not in the - * font. - * - * A `property' is a either key-value pair within the STARTPROPERTIES - * ... ENDPROPERTIES block of a BDF font or a key-value pair from the - * `info->props' array within a `FontRec' structure of a PCF font. - * - * Integer properties are always stored as `signed' within PCF fonts; - * consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value - * for BDF fonts only. - * - * In case of error, `aproperty->type' is always set to - * @BDF_PROPERTY_TYPE_NONE. - */ - FT_EXPORT( FT_Error ) - FT_Get_BDF_Property( FT_Face face, - const char* prop_name, - BDF_PropertyRec *aproperty ); - - /* */ - -FT_END_HEADER - -#endif /* __FTBDF_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftbitmap.h b/3party/freetype/include/freetype/ftbitmap.h deleted file mode 100644 index 46cc47b7d1..0000000000 --- a/3party/freetype/include/freetype/ftbitmap.h +++ /dev/null @@ -1,240 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbitmap.h */ -/* */ -/* FreeType utility functions for bitmaps (specification). */ -/* */ -/* Copyright 2004-2015 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 __FTBITMAP_H__ -#define __FTBITMAP_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* bitmap_handling */ - /* */ - /* <Title> */ - /* Bitmap Handling */ - /* */ - /* <Abstract> */ - /* Handling FT_Bitmap objects. */ - /* */ - /* <Description> */ - /* This section contains functions for handling @FT_Bitmap objects. */ - /* Note that none of the functions changes the bitmap's `flow' (as */ - /* indicated by the sign of the `pitch' field in `FT_Bitmap'). */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Bitmap_Init */ - /* */ - /* <Description> */ - /* Initialize a pointer to an @FT_Bitmap structure. */ - /* */ - /* <InOut> */ - /* abitmap :: A pointer to the bitmap structure. */ - /* */ - /* <Note> */ - /* A deprecated name for the same function is `FT_Bitmap_New'. */ - /* */ - FT_EXPORT( void ) - FT_Bitmap_Init( FT_Bitmap *abitmap ); - - - /* deprecated */ - FT_EXPORT( void ) - FT_Bitmap_New( FT_Bitmap *abitmap ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Bitmap_Copy */ - /* */ - /* <Description> */ - /* Copy a bitmap into another one. */ - /* */ - /* <Input> */ - /* library :: A handle to a library object. */ - /* */ - /* source :: A handle to the source bitmap. */ - /* */ - /* <Output> */ - /* target :: A handle to the target bitmap. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Bitmap_Copy( FT_Library library, - const FT_Bitmap *source, - FT_Bitmap *target); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Bitmap_Embolden */ - /* */ - /* <Description> */ - /* Embolden a bitmap. The new bitmap will be about `xStrength' */ - /* pixels wider and `yStrength' pixels higher. The left and bottom */ - /* borders are kept unchanged. */ - /* */ - /* <Input> */ - /* library :: A handle to a library object. */ - /* */ - /* xStrength :: How strong the glyph is emboldened horizontally. */ - /* Expressed in 26.6 pixel format. */ - /* */ - /* yStrength :: How strong the glyph is emboldened vertically. */ - /* Expressed in 26.6 pixel format. */ - /* */ - /* <InOut> */ - /* bitmap :: A handle to the target bitmap. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The current implementation restricts `xStrength' to be less than */ - /* or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. */ - /* */ - /* If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, */ - /* you should call @FT_GlyphSlot_Own_Bitmap on the slot first. */ - /* */ - /* Bitmaps in @FT_PIXEL_MODE_GRAY2 and @FT_PIXEL_MODE_GRAY@ format */ - /* are converted to @FT_PIXEL_MODE_GRAY format (i.e., 8bpp). */ - /* */ - FT_EXPORT( FT_Error ) - FT_Bitmap_Embolden( FT_Library library, - FT_Bitmap* bitmap, - FT_Pos xStrength, - FT_Pos yStrength ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Bitmap_Convert */ - /* */ - /* <Description> */ - /* Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp */ - /* to a bitmap object with depth 8bpp, making the number of used */ - /* bytes line (a.k.a. the `pitch') a multiple of `alignment'. */ - /* */ - /* <Input> */ - /* library :: A handle to a library object. */ - /* */ - /* source :: The source bitmap. */ - /* */ - /* alignment :: The pitch of the bitmap is a multiple of this */ - /* parameter. Common values are 1, 2, or 4. */ - /* */ - /* <Output> */ - /* target :: The target bitmap. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* It is possible to call @FT_Bitmap_Convert multiple times without */ - /* calling @FT_Bitmap_Done (the memory is simply reallocated). */ - /* */ - /* Use @FT_Bitmap_Done to finally remove the bitmap object. */ - /* */ - /* The `library' argument is taken to have access to FreeType's */ - /* memory handling functions. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Bitmap_Convert( FT_Library library, - const FT_Bitmap *source, - FT_Bitmap *target, - FT_Int alignment ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_GlyphSlot_Own_Bitmap */ - /* */ - /* <Description> */ - /* Make sure that a glyph slot owns `slot->bitmap'. */ - /* */ - /* <Input> */ - /* slot :: The glyph slot. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* This function is to be used in combination with */ - /* @FT_Bitmap_Embolden. */ - /* */ - FT_EXPORT( FT_Error ) - FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Bitmap_Done */ - /* */ - /* <Description> */ - /* Destroy a bitmap object initialized with @FT_Bitmap_Init. */ - /* */ - /* <Input> */ - /* library :: A handle to a library object. */ - /* */ - /* bitmap :: The bitmap object to be freed. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The `library' argument is taken to have access to FreeType's */ - /* memory handling functions. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Bitmap_Done( FT_Library library, - FT_Bitmap *bitmap ); - - - /* */ - - -FT_END_HEADER - -#endif /* __FTBITMAP_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftbzip2.h b/3party/freetype/include/freetype/ftbzip2.h deleted file mode 100644 index c25f9469df..0000000000 --- a/3party/freetype/include/freetype/ftbzip2.h +++ /dev/null @@ -1,102 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbzip2.h */ -/* */ -/* Bzip2-compressed stream support. */ -/* */ -/* Copyright 2010-2015 by */ -/* Joel Klinghed. */ -/* */ -/* 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 __FTBZIP2_H__ -#define __FTBZIP2_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - /*************************************************************************/ - /* */ - /* <Section> */ - /* bzip2 */ - /* */ - /* <Title> */ - /* BZIP2 Streams */ - /* */ - /* <Abstract> */ - /* Using bzip2-compressed font files. */ - /* */ - /* <Description> */ - /* This section contains the declaration of Bzip2-specific functions. */ - /* */ - /*************************************************************************/ - - - /************************************************************************ - * - * @function: - * FT_Stream_OpenBzip2 - * - * @description: - * Open a new stream to parse bzip2-compressed font files. This is - * mainly used to support the compressed `*.pcf.bz2' fonts that come - * with XFree86. - * - * @input: - * stream :: - * The target embedding stream. - * - * source :: - * The source stream. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The source stream must be opened _before_ calling this function. - * - * Calling the internal function `FT_Stream_Close' on the new stream will - * *not* call `FT_Stream_Close' on the source stream. None of the stream - * objects will be released to the heap. - * - * The stream implementation is very basic and resets the decompression - * process each time seeking backwards is needed within the stream. - * - * In certain builds of the library, bzip2 compression recognition is - * automatically handled when calling @FT_New_Face or @FT_Open_Face. - * This means that if no font driver is capable of handling the raw - * compressed file, the library will try to open a bzip2 compressed stream - * from it and re-open the face with it. - * - * This function may return `FT_Err_Unimplemented_Feature' if your build - * of FreeType was not compiled with bzip2 support. - */ - FT_EXPORT( FT_Error ) - FT_Stream_OpenBzip2( FT_Stream stream, - FT_Stream source ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTBZIP2_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftcache.h b/3party/freetype/include/freetype/ftcache.h deleted file mode 100644 index 7fbd2232be..0000000000 --- a/3party/freetype/include/freetype/ftcache.h +++ /dev/null @@ -1,1082 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcache.h */ -/* */ -/* FreeType Cache subsystem (specification). */ -/* */ -/* Copyright 1996-2015 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 __FTCACHE_H__ -#define __FTCACHE_H__ - - -#include <ft2build.h> -#include FT_GLYPH_H -#include FT_STROKER_H - - -FT_BEGIN_HEADER - - - /************************************************************************* - * - * <Section> - * cache_subsystem - * - * <Title> - * Cache Sub-System - * - * <Abstract> - * How to cache face, size, and glyph data with FreeType~2. - * - * <Description> - * This section describes the FreeType~2 cache sub-system, which is used - * to limit the number of concurrently opened @FT_Face and @FT_Size - * objects, as well as caching information like character maps and glyph - * images while limiting their maximum memory usage. - * - * Note that all types and functions begin with the `FTC_' prefix. - * - * The cache is highly portable and thus doesn't know anything about the - * fonts installed on your system, or how to access them. This implies - * the following scheme: - * - * First, available or installed font faces are uniquely identified by - * @FTC_FaceID values, provided to the cache by the client. Note that - * the cache only stores and compares these values, and doesn't try to - * interpret them in any way. - * - * Second, the cache calls, only when needed, a client-provided function - * to convert an @FTC_FaceID into a new @FT_Face object. The latter is - * then completely managed by the cache, including its termination - * through @FT_Done_Face. To monitor termination of face objects, the - * finalizer callback in the `generic' field of the @FT_Face object can - * be used, which might also be used to store the @FTC_FaceID of the - * face. - * - * Clients are free to map face IDs to anything else. The most simple - * usage is to associate them to a (pathname,face_index) pair that is - * used to call @FT_New_Face. However, more complex schemes are also - * possible. - * - * Note that for the cache to work correctly, the face ID values must be - * *persistent*, which means that the contents they point to should not - * change at runtime, or that their value should not become invalid. - * - * If this is unavoidable (e.g., when a font is uninstalled at runtime), - * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let - * the cache get rid of any references to the old @FTC_FaceID it may - * keep internally. Failure to do so will lead to incorrect behaviour - * or even crashes. - * - * To use the cache, start with calling @FTC_Manager_New to create a new - * @FTC_Manager object, which models a single cache instance. You can - * then look up @FT_Face and @FT_Size objects with - * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively. - * - * If you want to use the charmap caching, call @FTC_CMapCache_New, then - * later use @FTC_CMapCache_Lookup to perform the equivalent of - * @FT_Get_Char_Index, only much faster. - * - * If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then - * later use @FTC_ImageCache_Lookup to retrieve the corresponding - * @FT_Glyph objects from the cache. - * - * If you need lots of small bitmaps, it is much more memory efficient - * to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This - * returns @FTC_SBitRec structures, which are used to store small - * bitmaps directly. (A small bitmap is one whose metrics and - * dimensions all fit into 8-bit integers). - * - * We hope to also provide a kerning cache in the near future. - * - * - * <Order> - * FTC_Manager - * FTC_FaceID - * FTC_Face_Requester - * - * FTC_Manager_New - * FTC_Manager_Reset - * FTC_Manager_Done - * FTC_Manager_LookupFace - * FTC_Manager_LookupSize - * FTC_Manager_RemoveFaceID - * - * FTC_Node - * FTC_Node_Unref - * - * FTC_ImageCache - * FTC_ImageCache_New - * FTC_ImageCache_Lookup - * - * FTC_SBit - * FTC_SBitCache - * FTC_SBitCache_New - * FTC_SBitCache_Lookup - * - * FTC_CMapCache - * FTC_CMapCache_New - * FTC_CMapCache_Lookup - * - *************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** BASIC TYPE DEFINITIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /************************************************************************* - * - * @type: FTC_FaceID - * - * @description: - * An opaque pointer type that is used to identity face objects. The - * contents of such objects is application-dependent. - * - * These pointers are typically used to point to a user-defined - * structure containing a font file path, and face index. - * - * @note: - * Never use NULL as a valid @FTC_FaceID. - * - * Face IDs are passed by the client to the cache manager that calls, - * when needed, the @FTC_Face_Requester to translate them into new - * @FT_Face objects. - * - * If the content of a given face ID changes at runtime, or if the value - * becomes invalid (e.g., when uninstalling a font), you should - * immediately call @FTC_Manager_RemoveFaceID before any other cache - * function. - * - * Failure to do so will result in incorrect behaviour or even - * memory leaks and crashes. - */ - typedef FT_Pointer FTC_FaceID; - - - /************************************************************************ - * - * @functype: - * FTC_Face_Requester - * - * @description: - * A callback function provided by client applications. It is used by - * the cache manager to translate a given @FTC_FaceID into a new valid - * @FT_Face object, on demand. - * - * <Input> - * face_id :: - * The face ID to resolve. - * - * library :: - * A handle to a FreeType library object. - * - * req_data :: - * Application-provided request data (see note below). - * - * <Output> - * aface :: - * A new @FT_Face handle. - * - * <Return> - * FreeType error code. 0~means success. - * - * <Note> - * The third parameter `req_data' is the same as the one passed by the - * client when @FTC_Manager_New is called. - * - * The face requester should not perform funny things on the returned - * face object, like creating a new @FT_Size for it, or setting a - * transformation through @FT_Set_Transform! - */ - typedef FT_Error - (*FTC_Face_Requester)( FTC_FaceID face_id, - FT_Library library, - FT_Pointer req_data, - FT_Face* aface ); - - /* */ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CACHE MANAGER OBJECT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FTC_Manager */ - /* */ - /* <Description> */ - /* This object corresponds to one instance of the cache-subsystem. */ - /* It is used to cache one or more @FT_Face objects, along with */ - /* corresponding @FT_Size objects. */ - /* */ - /* The manager intentionally limits the total number of opened */ - /* @FT_Face and @FT_Size objects to control memory usage. See the */ - /* `max_faces' and `max_sizes' parameters of @FTC_Manager_New. */ - /* */ - /* The manager is also used to cache `nodes' of various types while */ - /* limiting their total memory usage. */ - /* */ - /* All limitations are enforced by keeping lists of managed objects */ - /* in most-recently-used order, and flushing old nodes to make room */ - /* for new ones. */ - /* */ - typedef struct FTC_ManagerRec_* FTC_Manager; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FTC_Node */ - /* */ - /* <Description> */ - /* An opaque handle to a cache node object. Each cache node is */ - /* reference-counted. A node with a count of~0 might be flushed */ - /* out of a full cache whenever a lookup request is performed. */ - /* */ - /* If you look up nodes, you have the ability to `acquire' them, */ - /* i.e., to increment their reference count. This will prevent the */ - /* node from being flushed out of the cache until you explicitly */ - /* `release' it (see @FTC_Node_Unref). */ - /* */ - /* See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. */ - /* */ - typedef struct FTC_NodeRec_* FTC_Node; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_Manager_New */ - /* */ - /* <Description> */ - /* Create a new cache manager. */ - /* */ - /* <Input> */ - /* library :: The parent FreeType library handle to use. */ - /* */ - /* max_faces :: Maximum number of opened @FT_Face objects managed by */ - /* this cache instance. Use~0 for defaults. */ - /* */ - /* max_sizes :: Maximum number of opened @FT_Size objects managed by */ - /* this cache instance. Use~0 for defaults. */ - /* */ - /* max_bytes :: Maximum number of bytes to use for cached data nodes. */ - /* Use~0 for defaults. Note that this value does not */ - /* account for managed @FT_Face and @FT_Size objects. */ - /* */ - /* requester :: An application-provided callback used to translate */ - /* face IDs into real @FT_Face objects. */ - /* */ - /* req_data :: A generic pointer that is passed to the requester */ - /* each time it is called (see @FTC_Face_Requester). */ - /* */ - /* <Output> */ - /* amanager :: A handle to a new manager object. 0~in case of */ - /* failure. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_Manager_New( FT_Library library, - FT_UInt max_faces, - FT_UInt max_sizes, - FT_ULong max_bytes, - FTC_Face_Requester requester, - FT_Pointer req_data, - FTC_Manager *amanager ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_Manager_Reset */ - /* */ - /* <Description> */ - /* Empty a given cache manager. This simply gets rid of all the */ - /* currently cached @FT_Face and @FT_Size objects within the manager. */ - /* */ - /* <InOut> */ - /* manager :: A handle to the manager. */ - /* */ - FT_EXPORT( void ) - FTC_Manager_Reset( FTC_Manager manager ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_Manager_Done */ - /* */ - /* <Description> */ - /* Destroy a given manager after emptying it. */ - /* */ - /* <Input> */ - /* manager :: A handle to the target cache manager object. */ - /* */ - FT_EXPORT( void ) - FTC_Manager_Done( FTC_Manager manager ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_Manager_LookupFace */ - /* */ - /* <Description> */ - /* Retrieve the @FT_Face object that corresponds to a given face ID */ - /* through a cache manager. */ - /* */ - /* <Input> */ - /* manager :: A handle to the cache manager. */ - /* */ - /* face_id :: The ID of the face object. */ - /* */ - /* <Output> */ - /* aface :: A handle to the face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The returned @FT_Face object is always owned by the manager. You */ - /* should never try to discard it yourself. */ - /* */ - /* The @FT_Face object doesn't necessarily have a current size object */ - /* (i.e., face->size can be~0). If you need a specific `font size', */ - /* use @FTC_Manager_LookupSize instead. */ - /* */ - /* Never change the face's transformation matrix (i.e., never call */ - /* the @FT_Set_Transform function) on a returned face! If you need */ - /* to transform glyphs, do it yourself after glyph loading. */ - /* */ - /* When you perform a lookup, out-of-memory errors are detected */ - /* _within_ the lookup and force incremental flushes of the cache */ - /* until enough memory is released for the lookup to succeed. */ - /* */ - /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ - /* already been completely flushed, and still no memory was available */ - /* for the operation. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_Manager_LookupFace( FTC_Manager manager, - FTC_FaceID face_id, - FT_Face *aface ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FTC_ScalerRec */ - /* */ - /* <Description> */ - /* A structure used to describe a given character size in either */ - /* pixels or points to the cache manager. See */ - /* @FTC_Manager_LookupSize. */ - /* */ - /* <Fields> */ - /* face_id :: The source face ID. */ - /* */ - /* width :: The character width. */ - /* */ - /* height :: The character height. */ - /* */ - /* pixel :: A Boolean. If 1, the `width' and `height' fields are */ - /* interpreted as integer pixel character sizes. */ - /* Otherwise, they are expressed as 1/64th of points. */ - /* */ - /* x_res :: Only used when `pixel' is value~0 to indicate the */ - /* horizontal resolution in dpi. */ - /* */ - /* y_res :: Only used when `pixel' is value~0 to indicate the */ - /* vertical resolution in dpi. */ - /* */ - /* <Note> */ - /* This type is mainly used to retrieve @FT_Size objects through the */ - /* cache manager. */ - /* */ - typedef struct FTC_ScalerRec_ - { - FTC_FaceID face_id; - FT_UInt width; - FT_UInt height; - FT_Int pixel; - FT_UInt x_res; - FT_UInt y_res; - - } FTC_ScalerRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FTC_Scaler */ - /* */ - /* <Description> */ - /* A handle to an @FTC_ScalerRec structure. */ - /* */ - typedef struct FTC_ScalerRec_* FTC_Scaler; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_Manager_LookupSize */ - /* */ - /* <Description> */ - /* Retrieve the @FT_Size object that corresponds to a given */ - /* @FTC_ScalerRec pointer through a cache manager. */ - /* */ - /* <Input> */ - /* manager :: A handle to the cache manager. */ - /* */ - /* scaler :: A scaler handle. */ - /* */ - /* <Output> */ - /* asize :: A handle to the size object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The returned @FT_Size object is always owned by the manager. You */ - /* should never try to discard it by yourself. */ - /* */ - /* You can access the parent @FT_Face object simply as `size->face' */ - /* if you need it. Note that this object is also owned by the */ - /* manager. */ - /* */ - /* <Note> */ - /* When you perform a lookup, out-of-memory errors are detected */ - /* _within_ the lookup and force incremental flushes of the cache */ - /* until enough memory is released for the lookup to succeed. */ - /* */ - /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ - /* already been completely flushed, and still no memory is available */ - /* for the operation. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_Manager_LookupSize( FTC_Manager manager, - FTC_Scaler scaler, - FT_Size *asize ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_Node_Unref */ - /* */ - /* <Description> */ - /* Decrement a cache node's internal reference count. When the count */ - /* reaches 0, it is not destroyed but becomes eligible for subsequent */ - /* cache flushes. */ - /* */ - /* <Input> */ - /* node :: The cache node handle. */ - /* */ - /* manager :: The cache manager handle. */ - /* */ - FT_EXPORT( void ) - FTC_Node_Unref( FTC_Node node, - FTC_Manager manager ); - - - /************************************************************************* - * - * @function: - * FTC_Manager_RemoveFaceID - * - * @description: - * A special function used to indicate to the cache manager that - * a given @FTC_FaceID is no longer valid, either because its - * content changed, or because it was deallocated or uninstalled. - * - * @input: - * manager :: - * The cache manager handle. - * - * face_id :: - * The @FTC_FaceID to be removed. - * - * @note: - * This function flushes all nodes from the cache corresponding to this - * `face_id', with the exception of nodes with a non-null reference - * count. - * - * Such nodes are however modified internally so as to never appear - * in later lookups with the same `face_id' value, and to be immediately - * destroyed when released by all their users. - * - */ - FT_EXPORT( void ) - FTC_Manager_RemoveFaceID( FTC_Manager manager, - FTC_FaceID face_id ); - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* cache_subsystem */ - /* */ - /*************************************************************************/ - - /************************************************************************* - * - * @type: - * FTC_CMapCache - * - * @description: - * An opaque handle used to model a charmap cache. This cache is to - * hold character codes -> glyph indices mappings. - * - */ - typedef struct FTC_CMapCacheRec_* FTC_CMapCache; - - - /************************************************************************* - * - * @function: - * FTC_CMapCache_New - * - * @description: - * Create a new charmap cache. - * - * @input: - * manager :: - * A handle to the cache manager. - * - * @output: - * acache :: - * A new cache handle. NULL in case of error. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * Like all other caches, this one will be destroyed with the cache - * manager. - * - */ - FT_EXPORT( FT_Error ) - FTC_CMapCache_New( FTC_Manager manager, - FTC_CMapCache *acache ); - - - /************************************************************************ - * - * @function: - * FTC_CMapCache_Lookup - * - * @description: - * Translate a character code into a glyph index, using the charmap - * cache. - * - * @input: - * cache :: - * A charmap cache handle. - * - * face_id :: - * The source face ID. - * - * cmap_index :: - * The index of the charmap in the source face. Any negative value - * means to use the cache @FT_Face's default charmap. - * - * char_code :: - * The character code (in the corresponding charmap). - * - * @return: - * Glyph index. 0~means `no glyph'. - * - */ - FT_EXPORT( FT_UInt ) - FTC_CMapCache_Lookup( FTC_CMapCache cache, - FTC_FaceID face_id, - FT_Int cmap_index, - FT_UInt32 char_code ); - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* cache_subsystem */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** IMAGE CACHE OBJECT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /************************************************************************* - * - * @struct: - * FTC_ImageTypeRec - * - * @description: - * A structure used to model the type of images in a glyph cache. - * - * @fields: - * face_id :: - * The face ID. - * - * width :: - * The width in pixels. - * - * height :: - * The height in pixels. - * - * flags :: - * The load flags, as in @FT_Load_Glyph. - * - */ - typedef struct FTC_ImageTypeRec_ - { - FTC_FaceID face_id; - FT_UInt width; - FT_UInt height; - FT_Int32 flags; - - } FTC_ImageTypeRec; - - - /************************************************************************* - * - * @type: - * FTC_ImageType - * - * @description: - * A handle to an @FTC_ImageTypeRec structure. - * - */ - typedef struct FTC_ImageTypeRec_* FTC_ImageType; - - - /* */ - - -#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ - ( (d1)->face_id == (d2)->face_id && \ - (d1)->width == (d2)->width && \ - (d1)->flags == (d2)->flags ) - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FTC_ImageCache */ - /* */ - /* <Description> */ - /* A handle to a glyph image cache object. They are designed to */ - /* hold many distinct glyph images while not exceeding a certain */ - /* memory threshold. */ - /* */ - typedef struct FTC_ImageCacheRec_* FTC_ImageCache; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_ImageCache_New */ - /* */ - /* <Description> */ - /* Create a new glyph image cache. */ - /* */ - /* <Input> */ - /* manager :: The parent manager for the image cache. */ - /* */ - /* <Output> */ - /* acache :: A handle to the new glyph image cache object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_ImageCache_New( FTC_Manager manager, - FTC_ImageCache *acache ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_ImageCache_Lookup */ - /* */ - /* <Description> */ - /* Retrieve a given glyph image from a glyph image cache. */ - /* */ - /* <Input> */ - /* cache :: A handle to the source glyph image cache. */ - /* */ - /* type :: A pointer to a glyph image type descriptor. */ - /* */ - /* gindex :: The glyph index to retrieve. */ - /* */ - /* <Output> */ - /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */ - /* failure. */ - /* */ - /* anode :: Used to return the address of of the corresponding cache */ - /* node after incrementing its reference count (see note */ - /* below). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The returned glyph is owned and managed by the glyph image cache. */ - /* Never try to transform or discard it manually! You can however */ - /* create a copy with @FT_Glyph_Copy and modify the new one. */ - /* */ - /* If `anode' is _not_ NULL, it receives the address of the cache */ - /* node containing the glyph image, after increasing its reference */ - /* count. This ensures that the node (as well as the @FT_Glyph) will */ - /* always be kept in the cache until you call @FTC_Node_Unref to */ - /* `release' it. */ - /* */ - /* If `anode' is NULL, the cache node is left unchanged, which means */ - /* that the @FT_Glyph could be flushed out of the cache on the next */ - /* call to one of the caching sub-system APIs. Don't assume that it */ - /* is persistent! */ - /* */ - FT_EXPORT( FT_Error ) - FTC_ImageCache_Lookup( FTC_ImageCache cache, - FTC_ImageType type, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_ImageCache_LookupScaler */ - /* */ - /* <Description> */ - /* A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec */ - /* to specify the face ID and its size. */ - /* */ - /* <Input> */ - /* cache :: A handle to the source glyph image cache. */ - /* */ - /* scaler :: A pointer to a scaler descriptor. */ - /* */ - /* load_flags :: The corresponding load flags. */ - /* */ - /* gindex :: The glyph index to retrieve. */ - /* */ - /* <Output> */ - /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */ - /* failure. */ - /* */ - /* anode :: Used to return the address of of the corresponding */ - /* cache node after incrementing its reference count */ - /* (see note below). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The returned glyph is owned and managed by the glyph image cache. */ - /* Never try to transform or discard it manually! You can however */ - /* create a copy with @FT_Glyph_Copy and modify the new one. */ - /* */ - /* If `anode' is _not_ NULL, it receives the address of the cache */ - /* node containing the glyph image, after increasing its reference */ - /* count. This ensures that the node (as well as the @FT_Glyph) will */ - /* always be kept in the cache until you call @FTC_Node_Unref to */ - /* `release' it. */ - /* */ - /* If `anode' is NULL, the cache node is left unchanged, which means */ - /* that the @FT_Glyph could be flushed out of the cache on the next */ - /* call to one of the caching sub-system APIs. Don't assume that it */ - /* is persistent! */ - /* */ - /* Calls to @FT_Set_Char_Size and friends have no effect on cached */ - /* glyphs; you should always use the FreeType cache API instead. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_ImageCache_LookupScaler( FTC_ImageCache cache, - FTC_Scaler scaler, - FT_ULong load_flags, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ); - - /// stroked image cache - - FT_EXPORT( FT_Error ) - FTC_StrokedImageCache_New( FTC_Manager manager, - FTC_ImageCache *acache); - - FT_EXPORT( FT_Error ) - FTC_StrokedImageCache_Lookup( FTC_ImageCache cache, - FTC_ImageType type, - FT_Stroker stroker, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ); - - FT_EXPORT( FT_Error ) - FTC_StrokedImageCache_LookupScaler( FTC_ImageCache cache, - FTC_Scaler scaler, - FT_Stroker stroker, - FT_ULong load_flags, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ); - - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FTC_SBit */ - /* */ - /* <Description> */ - /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */ - /* structure for details. */ - /* */ - typedef struct FTC_SBitRec_* FTC_SBit; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FTC_SBitRec */ - /* */ - /* <Description> */ - /* A very compact structure used to describe a small glyph bitmap. */ - /* */ - /* <Fields> */ - /* width :: The bitmap width in pixels. */ - /* */ - /* height :: The bitmap height in pixels. */ - /* */ - /* left :: The horizontal distance from the pen position to the */ - /* left bitmap border (a.k.a. `left side bearing', or */ - /* `lsb'). */ - /* */ - /* top :: The vertical distance from the pen position (on the */ - /* baseline) to the upper bitmap border (a.k.a. `top */ - /* side bearing'). The distance is positive for upwards */ - /* y~coordinates. */ - /* */ - /* format :: The format of the glyph bitmap (monochrome or gray). */ - /* */ - /* max_grays :: Maximum gray level value (in the range 1 to~255). */ - /* */ - /* pitch :: The number of bytes per bitmap line. May be positive */ - /* or negative. */ - /* */ - /* xadvance :: The horizontal advance width in pixels. */ - /* */ - /* yadvance :: The vertical advance height in pixels. */ - /* */ - /* buffer :: A pointer to the bitmap pixels. */ - /* */ - typedef struct FTC_SBitRec_ - { - FT_Byte width; - FT_Byte height; - FT_Char left; - FT_Char top; - - FT_Byte format; - FT_Byte max_grays; - FT_Short pitch; - FT_Char xadvance; - FT_Char yadvance; - - FT_Byte* buffer; - - } FTC_SBitRec; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FTC_SBitCache */ - /* */ - /* <Description> */ - /* A handle to a small bitmap cache. These are special cache objects */ - /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */ - /* much more efficient way than the traditional glyph image cache */ - /* implemented by @FTC_ImageCache. */ - /* */ - typedef struct FTC_SBitCacheRec_* FTC_SBitCache; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_SBitCache_New */ - /* */ - /* <Description> */ - /* Create a new cache to store small glyph bitmaps. */ - /* */ - /* <Input> */ - /* manager :: A handle to the source cache manager. */ - /* */ - /* <Output> */ - /* acache :: A handle to the new sbit cache. NULL in case of error. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_SBitCache_New( FTC_Manager manager, - FTC_SBitCache *acache ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_SBitCache_Lookup */ - /* */ - /* <Description> */ - /* Look up a given small glyph bitmap in a given sbit cache and */ - /* `lock' it to prevent its flushing from the cache until needed. */ - /* */ - /* <Input> */ - /* cache :: A handle to the source sbit cache. */ - /* */ - /* type :: A pointer to the glyph image type descriptor. */ - /* */ - /* gindex :: The glyph index. */ - /* */ - /* <Output> */ - /* sbit :: A handle to a small bitmap descriptor. */ - /* */ - /* anode :: Used to return the address of of the corresponding cache */ - /* node after incrementing its reference count (see note */ - /* below). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The small bitmap descriptor and its bit buffer are owned by the */ - /* cache and should never be freed by the application. They might */ - /* as well disappear from memory on the next cache lookup, so don't */ - /* treat them as persistent data. */ - /* */ - /* The descriptor's `buffer' field is set to~0 to indicate a missing */ - /* glyph bitmap. */ - /* */ - /* If `anode' is _not_ NULL, it receives the address of the cache */ - /* node containing the bitmap, after increasing its reference count. */ - /* This ensures that the node (as well as the image) will always be */ - /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ - /* */ - /* If `anode' is NULL, the cache node is left unchanged, which means */ - /* that the bitmap could be flushed out of the cache on the next */ - /* call to one of the caching sub-system APIs. Don't assume that it */ - /* is persistent! */ - /* */ - FT_EXPORT( FT_Error ) - FTC_SBitCache_Lookup( FTC_SBitCache cache, - FTC_ImageType type, - FT_UInt gindex, - FTC_SBit *sbit, - FTC_Node *anode ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_SBitCache_LookupScaler */ - /* */ - /* <Description> */ - /* A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec */ - /* to specify the face ID and its size. */ - /* */ - /* <Input> */ - /* cache :: A handle to the source sbit cache. */ - /* */ - /* scaler :: A pointer to the scaler descriptor. */ - /* */ - /* load_flags :: The corresponding load flags. */ - /* */ - /* gindex :: The glyph index. */ - /* */ - /* <Output> */ - /* sbit :: A handle to a small bitmap descriptor. */ - /* */ - /* anode :: Used to return the address of of the corresponding */ - /* cache node after incrementing its reference count */ - /* (see note below). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The small bitmap descriptor and its bit buffer are owned by the */ - /* cache and should never be freed by the application. They might */ - /* as well disappear from memory on the next cache lookup, so don't */ - /* treat them as persistent data. */ - /* */ - /* The descriptor's `buffer' field is set to~0 to indicate a missing */ - /* glyph bitmap. */ - /* */ - /* If `anode' is _not_ NULL, it receives the address of the cache */ - /* node containing the bitmap, after increasing its reference count. */ - /* This ensures that the node (as well as the image) will always be */ - /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ - /* */ - /* If `anode' is NULL, the cache node is left unchanged, which means */ - /* that the bitmap could be flushed out of the cache on the next */ - /* call to one of the caching sub-system APIs. Don't assume that it */ - /* is persistent! */ - /* */ - FT_EXPORT( FT_Error ) - FTC_SBitCache_LookupScaler( FTC_SBitCache cache, - FTC_Scaler scaler, - FT_ULong load_flags, - FT_UInt gindex, - FTC_SBit *sbit, - FTC_Node *anode ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTCACHE_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftcffdrv.h b/3party/freetype/include/freetype/ftcffdrv.h deleted file mode 100644 index 6c8e416cee..0000000000 --- a/3party/freetype/include/freetype/ftcffdrv.h +++ /dev/null @@ -1,262 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcffdrv.h */ -/* */ -/* FreeType API for controlling the CFF driver (specification only). */ -/* */ -/* Copyright 2013-2015 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 __FTCFFDRV_H__ -#define __FTCFFDRV_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /************************************************************************** - * - * @section: - * cff_driver - * - * @title: - * The CFF driver - * - * @abstract: - * Controlling the CFF driver module. - * - * @description: - * While FreeType's CFF driver doesn't expose API functions by itself, - * it is possible to control its behaviour with @FT_Property_Set and - * @FT_Property_Get. The list below gives the available properties - * together with the necessary macros and structures. - * - * The CFF driver's module name is `cff'. - * - * *Hinting* *and* *antialiasing* *principles* *of* *the* *new* *engine* - * - * The rasterizer is positioning horizontal features (e.g., ascender - * height & x-height, or crossbars) on the pixel grid and minimizing the - * amount of antialiasing applied to them, while placing vertical - * features (vertical stems) on the pixel grid without hinting, thus - * representing the stem position and weight accurately. Sometimes the - * vertical stems may be only partially black. In this context, - * `antialiasing' means that stems are not positioned exactly on pixel - * borders, causing a fuzzy appearance. - * - * There are two principles behind this approach. - * - * 1) No hinting in the horizontal direction: Unlike `superhinted' - * TrueType, which changes glyph widths to accommodate regular - * inter-glyph spacing, Adobe's approach is `faithful to the design' in - * representing both the glyph width and the inter-glyph spacing - * designed for the font. This makes the screen display as close as it - * can be to the result one would get with infinite resolution, while - * preserving what is considered the key characteristics of each glyph. - * Note that the distances between unhinted and grid-fitted positions at - * small sizes are comparable to kerning values and thus would be - * noticeable (and distracting) while reading if hinting were applied. - * - * One of the reasons to not hint horizontally is antialiasing for LCD - * screens: The pixel geometry of modern displays supplies three - * vertical sub-pixels as the eye moves horizontally across each visible - * pixel. On devices where we can be certain this characteristic is - * present a rasterizer can take advantage of the sub-pixels to add - * increments of weight. In Western writing systems this turns out to - * be the more critical direction anyway; the weights and spacing of - * vertical stems (see above) are central to Armenian, Cyrillic, Greek, - * and Latin type designs. Even when the rasterizer uses greyscale - * antialiasing instead of color (a necessary compromise when one - * doesn't know the screen characteristics), the unhinted vertical - * features preserve the design's weight and spacing much better than - * aliased type would. - * - * 2) Aligment in the vertical direction: Weights and spacing along the - * y~axis are less critical; what is much more important is the visual - * alignment of related features (like cap-height and x-height). The - * sense of alignment for these is enhanced by the sharpness of grid-fit - * edges, while the cruder vertical resolution (full pixels instead of - * 1/3 pixels) is less of a problem. - * - * On the technical side, horizontal alignment zones for ascender, - * x-height, and other important height values (traditionally called - * `blue zones') as defined in the font are positioned independently, - * each being rounded to the nearest pixel edge, taking care of - * overshoot suppression at small sizes, stem darkening, and scaling. - * - * Hstems (this is, hint values defined in the font to help align - * horizontal features) that fall within a blue zone are said to be - * `captured' and are aligned to that zone. Uncaptured stems are moved - * in one of four ways, top edge up or down, bottom edge up or down. - * Unless there are conflicting hstems, the smallest movement is taken - * to minimize distortion. - * - * @order: - * hinting-engine - * no-stem-darkening - * darkening-parameters - * - */ - - - /************************************************************************** - * - * @property: - * hinting-engine - * - * @description: - * Thanks to Adobe, which contributed a new hinting (and parsing) - * engine, an application can select between `freetype' and `adobe' if - * compiled with CFF_CONFIG_OPTION_OLD_ENGINE. If this configuration - * macro isn't defined, `hinting-engine' does nothing. - * - * The default engine is `freetype' if CFF_CONFIG_OPTION_OLD_ENGINE is - * defined, and `adobe' otherwise. - * - * The following example code demonstrates how to select Adobe's hinting - * engine (omitting the error handling). - * - * { - * FT_Library library; - * FT_UInt hinting_engine = FT_CFF_HINTING_ADOBE; - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "cff", - * "hinting-engine", &hinting_engine ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - */ - - - /************************************************************************** - * - * @enum: - * FT_CFF_HINTING_XXX - * - * @description: - * A list of constants used for the @hinting-engine property to select - * the hinting engine for CFF fonts. - * - * @values: - * FT_CFF_HINTING_FREETYPE :: - * Use the old FreeType hinting engine. - * - * FT_CFF_HINTING_ADOBE :: - * Use the hinting engine contributed by Adobe. - * - */ -#define FT_CFF_HINTING_FREETYPE 0 -#define FT_CFF_HINTING_ADOBE 1 - - - /************************************************************************** - * - * @property: - * no-stem-darkening - * - * @description: - * By default, the Adobe CFF engine darkens stems at smaller sizes, - * regardless of hinting, to enhance contrast. This feature requires - * a rendering system with proper gamma correction. Setting this - * property, stem darkening gets switched off. - * - * Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set. - * - * { - * FT_Library library; - * FT_Bool no_stem_darkening = TRUE; - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "cff", - * "no-stem-darkening", &no_stem_darkening ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - */ - - - /************************************************************************** - * - * @property: - * darkening-parameters - * - * @description: - * By default, the Adobe CFF engine darkens stems as follows (if the - * `no-stem-darkening' property isn't set): - * - * { - * stem width <= 0.5px: darkening amount = 0.4px - * stem width = 1px: darkening amount = 0.275px - * stem width = 1.667px: darkening amount = 0.275px - * stem width >= 2.333px: darkening amount = 0px - * } - * - * and piecewise linear in-between. At configuration time, these four - * control points can be set with the macro - * `CFF_CONFIG_OPTION_DARKENING_PARAMETERS'. At runtime, the control - * points can be changed using the `darkening-parameters' property, as - * the following example demonstrates. - * - * { - * FT_Library library; - * FT_Int darken_params[8] = { 500, 300, // x1, y1 - * 1000, 200, // x2, y2 - * 1500, 100, // x3, y3 - * 2000, 0 }; // x4, y4 - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "cff", - * "darkening-parameters", darken_params ); - * } - * - * The x~values give the stem width, and the y~values the darkening - * amount. The unit is 1000th of pixels. All coordinate values must be - * positive; the x~values must be monotonically increasing; the - * y~values must be monotonically decreasing and smaller than or - * equal to 500 (corresponding to half a pixel); the slope of each - * linear piece must be shallower than -1 (e.g., -.4). - * - * @note: - * This property can be used with @FT_Property_Get also. - * - */ - - /* */ - - -FT_END_HEADER - - -#endif /* __FTCFFDRV_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftchapters.h b/3party/freetype/include/freetype/ftchapters.h deleted file mode 100644 index ab4389530e..0000000000 --- a/3party/freetype/include/freetype/ftchapters.h +++ /dev/null @@ -1,135 +0,0 @@ -/***************************************************************************/ -/* */ -/* This file defines the structure of the FreeType reference. */ -/* It is used by the python script that generates the HTML files. */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* <Chapter> */ -/* general_remarks */ -/* */ -/* <Title> */ -/* General Remarks */ -/* */ -/* <Sections> */ -/* header_inclusion */ -/* user_allocation */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* <Chapter> */ -/* core_api */ -/* */ -/* <Title> */ -/* Core API */ -/* */ -/* <Sections> */ -/* version */ -/* basic_types */ -/* base_interface */ -/* glyph_variants */ -/* glyph_management */ -/* mac_specific */ -/* sizes_management */ -/* header_file_macros */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* <Chapter> */ -/* format_specific */ -/* */ -/* <Title> */ -/* Format-Specific API */ -/* */ -/* <Sections> */ -/* multiple_masters */ -/* truetype_tables */ -/* type1_tables */ -/* sfnt_names */ -/* bdf_fonts */ -/* cid_fonts */ -/* pfr_fonts */ -/* winfnt_fonts */ -/* font_formats */ -/* gasp_table */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* <Chapter> */ -/* module_specific */ -/* */ -/* <Title> */ -/* Controlling FreeType Modules */ -/* */ -/* <Sections> */ -/* auto_hinter */ -/* cff_driver */ -/* tt_driver */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* <Chapter> */ -/* cache_subsystem */ -/* */ -/* <Title> */ -/* Cache Sub-System */ -/* */ -/* <Sections> */ -/* cache_subsystem */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* <Chapter> */ -/* support_api */ -/* */ -/* <Title> */ -/* Support API */ -/* */ -/* <Sections> */ -/* computations */ -/* list_processing */ -/* outline_processing */ -/* quick_advance */ -/* bitmap_handling */ -/* raster */ -/* glyph_stroker */ -/* system_interface */ -/* module_management */ -/* gzip */ -/* lzw */ -/* bzip2 */ -/* lcd_filtering */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* <Chapter> */ -/* error_codes */ -/* */ -/* <Title> */ -/* Error Codes */ -/* */ -/* <Sections> */ -/* error_enumerations */ -/* error_code_values */ -/* */ -/***************************************************************************/ diff --git a/3party/freetype/include/freetype/ftcid.h b/3party/freetype/include/freetype/ftcid.h deleted file mode 100644 index 05741c85b7..0000000000 --- a/3party/freetype/include/freetype/ftcid.h +++ /dev/null @@ -1,168 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcid.h */ -/* */ -/* FreeType API for accessing CID font information (specification). */ -/* */ -/* Copyright 2007-2015 by */ -/* Dereg Clegg and Michael Toftdal. */ -/* */ -/* 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 __FTCID_H__ -#define __FTCID_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* cid_fonts */ - /* */ - /* <Title> */ - /* CID Fonts */ - /* */ - /* <Abstract> */ - /* CID-keyed font specific API. */ - /* */ - /* <Description> */ - /* This section contains the declaration of CID-keyed font specific */ - /* functions. */ - /* */ - /*************************************************************************/ - - - /********************************************************************** - * - * @function: - * FT_Get_CID_Registry_Ordering_Supplement - * - * @description: - * Retrieve the Registry/Ordering/Supplement triple (also known as the - * "R/O/S") from a CID-keyed font. - * - * @input: - * face :: - * A handle to the input face. - * - * @output: - * registry :: - * The registry, as a C~string, owned by the face. - * - * ordering :: - * The ordering, as a C~string, owned by the face. - * - * supplement :: - * The supplement. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with CID faces, returning an error - * otherwise. - * - * @since: - * 2.3.6 - */ - FT_EXPORT( FT_Error ) - FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, - const char* *registry, - const char* *ordering, - FT_Int *supplement); - - - /********************************************************************** - * - * @function: - * FT_Get_CID_Is_Internally_CID_Keyed - * - * @description: - * Retrieve the type of the input face, CID keyed or not. In - * constrast to the @FT_IS_CID_KEYED macro this function returns - * successfully also for CID-keyed fonts in an SNFT wrapper. - * - * @input: - * face :: - * A handle to the input face. - * - * @output: - * is_cid :: - * The type of the face as an @FT_Bool. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with CID faces and OpenType fonts, - * returning an error otherwise. - * - * @since: - * 2.3.9 - */ - FT_EXPORT( FT_Error ) - FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, - FT_Bool *is_cid ); - - - /********************************************************************** - * - * @function: - * FT_Get_CID_From_Glyph_Index - * - * @description: - * Retrieve the CID of the input glyph index. - * - * @input: - * face :: - * A handle to the input face. - * - * glyph_index :: - * The input glyph index. - * - * @output: - * cid :: - * The CID as an @FT_UInt. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with CID faces and OpenType fonts, - * returning an error otherwise. - * - * @since: - * 2.3.9 - */ - FT_EXPORT( FT_Error ) - FT_Get_CID_From_Glyph_Index( FT_Face face, - FT_UInt glyph_index, - FT_UInt *cid ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTCID_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/fterrdef.h b/3party/freetype/include/freetype/fterrdef.h deleted file mode 100644 index d865da7127..0000000000 --- a/3party/freetype/include/freetype/fterrdef.h +++ /dev/null @@ -1,276 +0,0 @@ -/***************************************************************************/ -/* */ -/* fterrdef.h */ -/* */ -/* FreeType error codes (specification). */ -/* */ -/* Copyright 2002-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* error_code_values */ - /* */ - /* <Title> */ - /* Error Code Values */ - /* */ - /* <Abstract> */ - /* All possible error codes returned by FreeType functions. */ - /* */ - /* <Description> */ - /* The list below is taken verbatim from the file `fterrdef.h' */ - /* (loaded automatically by including `FT_FREETYPE_H'). The first */ - /* argument of the `FT_ERROR_DEF_' macro is the error label; by */ - /* default, the prefix `FT_Err_' gets added so that you get error */ - /* names like `FT_Err_Cannot_Open_Resource'. The second argument is */ - /* the error code, and the last argument an error string, which is not */ - /* used by FreeType. */ - /* */ - /* Within your application you should *only* use error names and */ - /* *never* its numeric values! The latter might (and actually do) */ - /* change in forthcoming FreeType versions. */ - /* */ - /* Macro `FT_NOERRORDEF_' defines `FT_Err_Ok', which is always zero. */ - /* See the `Error Enumerations' subsection how to automatically */ - /* generate a list of error strings. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Err_XXX */ - /* */ - /*************************************************************************/ - - /* generic errors */ - - FT_NOERRORDEF_( Ok, 0x00, - "no error" ) - - FT_ERRORDEF_( Cannot_Open_Resource, 0x01, - "cannot open resource" ) - FT_ERRORDEF_( Unknown_File_Format, 0x02, - "unknown file format" ) - FT_ERRORDEF_( Invalid_File_Format, 0x03, - "broken file" ) - FT_ERRORDEF_( Invalid_Version, 0x04, - "invalid FreeType version" ) - FT_ERRORDEF_( Lower_Module_Version, 0x05, - "module version is too low" ) - FT_ERRORDEF_( Invalid_Argument, 0x06, - "invalid argument" ) - FT_ERRORDEF_( Unimplemented_Feature, 0x07, - "unimplemented feature" ) - FT_ERRORDEF_( Invalid_Table, 0x08, - "broken table" ) - FT_ERRORDEF_( Invalid_Offset, 0x09, - "broken offset within table" ) - FT_ERRORDEF_( Array_Too_Large, 0x0A, - "array allocation size too large" ) - FT_ERRORDEF_( Missing_Module, 0x0B, - "missing module" ) - FT_ERRORDEF_( Missing_Property, 0x0C, - "missing property" ) - - /* glyph/character errors */ - - FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, - "invalid glyph index" ) - FT_ERRORDEF_( Invalid_Character_Code, 0x11, - "invalid character code" ) - FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, - "unsupported glyph image format" ) - FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, - "cannot render this glyph format" ) - FT_ERRORDEF_( Invalid_Outline, 0x14, - "invalid outline" ) - FT_ERRORDEF_( Invalid_Composite, 0x15, - "invalid composite glyph" ) - FT_ERRORDEF_( Too_Many_Hints, 0x16, - "too many hints" ) - FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, - "invalid pixel size" ) - - /* handle errors */ - - FT_ERRORDEF_( Invalid_Handle, 0x20, - "invalid object handle" ) - FT_ERRORDEF_( Invalid_Library_Handle, 0x21, - "invalid library handle" ) - FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, - "invalid module handle" ) - FT_ERRORDEF_( Invalid_Face_Handle, 0x23, - "invalid face handle" ) - FT_ERRORDEF_( Invalid_Size_Handle, 0x24, - "invalid size handle" ) - FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, - "invalid glyph slot handle" ) - FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, - "invalid charmap handle" ) - FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, - "invalid cache manager handle" ) - FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, - "invalid stream handle" ) - - /* driver errors */ - - FT_ERRORDEF_( Too_Many_Drivers, 0x30, - "too many modules" ) - FT_ERRORDEF_( Too_Many_Extensions, 0x31, - "too many extensions" ) - - /* memory errors */ - - FT_ERRORDEF_( Out_Of_Memory, 0x40, - "out of memory" ) - FT_ERRORDEF_( Unlisted_Object, 0x41, - "unlisted object" ) - - /* stream errors */ - - FT_ERRORDEF_( Cannot_Open_Stream, 0x51, - "cannot open stream" ) - FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, - "invalid stream seek" ) - FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, - "invalid stream skip" ) - FT_ERRORDEF_( Invalid_Stream_Read, 0x54, - "invalid stream read" ) - FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, - "invalid stream operation" ) - FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, - "invalid frame operation" ) - FT_ERRORDEF_( Nested_Frame_Access, 0x57, - "nested frame access" ) - FT_ERRORDEF_( Invalid_Frame_Read, 0x58, - "invalid frame read" ) - - /* raster errors */ - - FT_ERRORDEF_( Raster_Uninitialized, 0x60, - "raster uninitialized" ) - FT_ERRORDEF_( Raster_Corrupted, 0x61, - "raster corrupted" ) - FT_ERRORDEF_( Raster_Overflow, 0x62, - "raster overflow" ) - FT_ERRORDEF_( Raster_Negative_Height, 0x63, - "negative height while rastering" ) - - /* cache errors */ - - FT_ERRORDEF_( Too_Many_Caches, 0x70, - "too many registered caches" ) - - /* TrueType and SFNT errors */ - - FT_ERRORDEF_( Invalid_Opcode, 0x80, - "invalid opcode" ) - FT_ERRORDEF_( Too_Few_Arguments, 0x81, - "too few arguments" ) - FT_ERRORDEF_( Stack_Overflow, 0x82, - "stack overflow" ) - FT_ERRORDEF_( Code_Overflow, 0x83, - "code overflow" ) - FT_ERRORDEF_( Bad_Argument, 0x84, - "bad argument" ) - FT_ERRORDEF_( Divide_By_Zero, 0x85, - "division by zero" ) - FT_ERRORDEF_( Invalid_Reference, 0x86, - "invalid reference" ) - FT_ERRORDEF_( Debug_OpCode, 0x87, - "found debug opcode" ) - FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, - "found ENDF opcode in execution stream" ) - FT_ERRORDEF_( Nested_DEFS, 0x89, - "nested DEFS" ) - FT_ERRORDEF_( Invalid_CodeRange, 0x8A, - "invalid code range" ) - FT_ERRORDEF_( Execution_Too_Long, 0x8B, - "execution context too long" ) - FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, - "too many function definitions" ) - FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, - "too many instruction definitions" ) - FT_ERRORDEF_( Table_Missing, 0x8E, - "SFNT font table missing" ) - FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, - "horizontal header (hhea) table missing" ) - FT_ERRORDEF_( Locations_Missing, 0x90, - "locations (loca) table missing" ) - FT_ERRORDEF_( Name_Table_Missing, 0x91, - "name table missing" ) - FT_ERRORDEF_( CMap_Table_Missing, 0x92, - "character map (cmap) table missing" ) - FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, - "horizontal metrics (hmtx) table missing" ) - FT_ERRORDEF_( Post_Table_Missing, 0x94, - "PostScript (post) table missing" ) - FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, - "invalid horizontal metrics" ) - FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, - "invalid character map (cmap) format" ) - FT_ERRORDEF_( Invalid_PPem, 0x97, - "invalid ppem value" ) - FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, - "invalid vertical metrics" ) - FT_ERRORDEF_( Could_Not_Find_Context, 0x99, - "could not find context" ) - FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, - "invalid PostScript (post) table format" ) - FT_ERRORDEF_( Invalid_Post_Table, 0x9B, - "invalid PostScript (post) table" ) - - /* CFF, CID, and Type 1 errors */ - - FT_ERRORDEF_( Syntax_Error, 0xA0, - "opcode syntax error" ) - FT_ERRORDEF_( Stack_Underflow, 0xA1, - "argument stack underflow" ) - FT_ERRORDEF_( Ignore, 0xA2, - "ignore" ) - FT_ERRORDEF_( No_Unicode_Glyph_Name, 0xA3, - "no Unicode glyph name found" ) - FT_ERRORDEF_( Glyph_Too_Big, 0xA4, - "glyph to big for hinting" ) - - /* BDF errors */ - - FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, - "`STARTFONT' field missing" ) - FT_ERRORDEF_( Missing_Font_Field, 0xB1, - "`FONT' field missing" ) - FT_ERRORDEF_( Missing_Size_Field, 0xB2, - "`SIZE' field missing" ) - FT_ERRORDEF_( Missing_Fontboundingbox_Field, 0xB3, - "`FONTBOUNDINGBOX' field missing" ) - FT_ERRORDEF_( Missing_Chars_Field, 0xB4, - "`CHARS' field missing" ) - FT_ERRORDEF_( Missing_Startchar_Field, 0xB5, - "`STARTCHAR' field missing" ) - FT_ERRORDEF_( Missing_Encoding_Field, 0xB6, - "`ENCODING' field missing" ) - FT_ERRORDEF_( Missing_Bbx_Field, 0xB7, - "`BBX' field missing" ) - FT_ERRORDEF_( Bbx_Too_Big, 0xB8, - "`BBX' too big" ) - FT_ERRORDEF_( Corrupted_Font_Header, 0xB9, - "Font header corrupted or missing fields" ) - FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xBA, - "Font glyphs corrupted or missing fields" ) - - /* */ - - -/* END */ diff --git a/3party/freetype/include/freetype/fterrors.h b/3party/freetype/include/freetype/fterrors.h deleted file mode 100644 index 0507b9ad7d..0000000000 --- a/3party/freetype/include/freetype/fterrors.h +++ /dev/null @@ -1,216 +0,0 @@ -/***************************************************************************/ -/* */ -/* fterrors.h */ -/* */ -/* FreeType error code handling (specification). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* error_enumerations */ - /* */ - /* <Title> */ - /* Error Enumerations */ - /* */ - /* <Abstract> */ - /* How to handle errors and error strings. */ - /* */ - /* <Description> */ - /* The header file `fterrors.h' (which is automatically included by */ - /* `freetype.h' defines the handling of FreeType's enumeration */ - /* constants. It can also be used to generate error message strings */ - /* with a small macro trick explained below. */ - /* */ - /* *Error* *Formats* */ - /* */ - /* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be */ - /* defined in `ftoption.h' in order to make the higher byte indicate */ - /* the module where the error has happened (this is not compatible */ - /* with standard builds of FreeType 2, however). See the file */ - /* `ftmoderr.h' for more details. */ - /* */ - /* *Error* *Message* *Strings* */ - /* */ - /* Error definitions are set up with special macros that allow client */ - /* applications to build a table of error message strings. The */ - /* strings are not included in a normal build of FreeType 2 to */ - /* save space (most client applications do not use them). */ - /* */ - /* To do so, you have to define the following macros before including */ - /* this file. */ - /* */ - /* { */ - /* FT_ERROR_START_LIST */ - /* } */ - /* */ - /* This macro is called before anything else to define the start of */ - /* the error list. It is followed by several FT_ERROR_DEF calls. */ - /* */ - /* { */ - /* FT_ERROR_DEF( e, v, s ) */ - /* } */ - /* */ - /* This macro is called to define one single error. `e' is the error */ - /* code identifier (e.g., `Invalid_Argument'), `v' is the error's */ - /* numerical value, and `s' is the corresponding error string. */ - /* */ - /* { */ - /* FT_ERROR_END_LIST */ - /* } */ - /* */ - /* This macro ends the list. */ - /* */ - /* Additionally, you have to undefine `__FTERRORS_H__' before */ - /* #including this file. */ - /* */ - /* Here is a simple example. */ - /* */ - /* { */ - /* #undef __FTERRORS_H__ */ - /* #define FT_ERRORDEF( e, v, s ) { e, s }, */ - /* #define FT_ERROR_START_LIST { */ - /* #define FT_ERROR_END_LIST { 0, NULL } }; */ - /* */ - /* const struct */ - /* { */ - /* int err_code; */ - /* const char* err_msg; */ - /* } ft_errors[] = */ - /* */ - /* #include FT_ERRORS_H */ - /* } */ - /* */ - /* Note that `FT_Err_Ok' is _not_ defined with `FT_ERRORDEF' but with */ - /* `FT_NOERRORDEF'; it is always zero. */ - /* */ - /*************************************************************************/ - - /* */ - -#ifndef __FTERRORS_H__ -#define __FTERRORS_H__ - - - /* include module base error codes */ -#include FT_MODULE_ERRORS_H - - - /*******************************************************************/ - /*******************************************************************/ - /***** *****/ - /***** SETUP MACROS *****/ - /***** *****/ - /*******************************************************************/ - /*******************************************************************/ - - -#undef FT_NEED_EXTERN_C - - - /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ - /* By default, we use `FT_Err_'. */ - /* */ -#ifndef FT_ERR_PREFIX -#define FT_ERR_PREFIX FT_Err_ -#endif - - - /* FT_ERR_BASE is used as the base for module-specific errors. */ - /* */ -#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS - -#ifndef FT_ERR_BASE -#define FT_ERR_BASE FT_Mod_Err_Base -#endif - -#else - -#undef FT_ERR_BASE -#define FT_ERR_BASE 0 - -#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ - - - /* If FT_ERRORDEF is not defined, we need to define a simple */ - /* enumeration type. */ - /* */ -#ifndef FT_ERRORDEF - -#define FT_ERRORDEF( e, v, s ) e = v, -#define FT_ERROR_START_LIST enum { -#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; - -#ifdef __cplusplus -#define FT_NEED_EXTERN_C - extern "C" { -#endif - -#endif /* !FT_ERRORDEF */ - - - /* this macro is used to define an error */ -#define FT_ERRORDEF_( e, v, s ) \ - FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) - - /* this is only used for <module>_Err_Ok, which must be 0! */ -#define FT_NOERRORDEF_( e, v, s ) \ - FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) - - -#ifdef FT_ERROR_START_LIST - FT_ERROR_START_LIST -#endif - - - /* now include the error codes */ -#include FT_ERROR_DEFINITIONS_H - - -#ifdef FT_ERROR_END_LIST - FT_ERROR_END_LIST -#endif - - - /*******************************************************************/ - /*******************************************************************/ - /***** *****/ - /***** SIMPLE CLEANUP *****/ - /***** *****/ - /*******************************************************************/ - /*******************************************************************/ - -#ifdef FT_NEED_EXTERN_C - } -#endif - -#undef FT_ERROR_START_LIST -#undef FT_ERROR_END_LIST - -#undef FT_ERRORDEF -#undef FT_ERRORDEF_ -#undef FT_NOERRORDEF_ - -#undef FT_NEED_EXTERN_C -#undef FT_ERR_BASE - - /* FT_ERR_PREFIX is needed internally */ -#ifndef FT2_BUILD_LIBRARY -#undef FT_ERR_PREFIX -#endif - -#endif /* __FTERRORS_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftfntfmt.h b/3party/freetype/include/freetype/ftfntfmt.h deleted file mode 100644 index 1f8ff28f10..0000000000 --- a/3party/freetype/include/freetype/ftfntfmt.h +++ /dev/null @@ -1,92 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftfntfmt.h */ -/* */ -/* Support functions for font formats. */ -/* */ -/* Copyright 2002-2015 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 __FTFNTFMT_H__ -#define __FTFNTFMT_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* font_formats */ - /* */ - /* <Title> */ - /* Font Formats */ - /* */ - /* <Abstract> */ - /* Getting the font format. */ - /* */ - /* <Description> */ - /* The single function in this section can be used to get the font */ - /* format. Note that this information is not needed normally; */ - /* however, there are special cases (like in PDF devices) where it is */ - /* important to differentiate, in spite of FreeType's uniform API. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Font_Format */ - /* */ - /* <Description> */ - /* Return a string describing the format of a given face. Possible */ - /* values are `TrueType', `Type~1', `BDF', `PCF', `Type~42', */ - /* `CID~Type~1', `CFF', `PFR', and `Windows~FNT'. */ - /* */ - /* The return value is suitable to be used as an X11 FONT_PROPERTY. */ - /* */ - /* <Input> */ - /* face :: */ - /* Input face handle. */ - /* */ - /* <Return> */ - /* Font format string. NULL in case of error. */ - /* */ - /* <Note> */ - /* A deprecated name for the same function is */ - /* `FT_Get_X11_Font_Format'. */ - /* */ - FT_EXPORT( const char* ) - FT_Get_Font_Format( FT_Face face ); - - - /* deprecated */ - FT_EXPORT( const char* ) - FT_Get_X11_Font_Format( FT_Face face ); - - - /* */ - - -FT_END_HEADER - -#endif /* __FTFNTFMT_H__ */ diff --git a/3party/freetype/include/freetype/ftgasp.h b/3party/freetype/include/freetype/ftgasp.h deleted file mode 100644 index 9a9b6321b3..0000000000 --- a/3party/freetype/include/freetype/ftgasp.h +++ /dev/null @@ -1,129 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgasp.h */ -/* */ -/* Access of TrueType's `gasp' table (specification). */ -/* */ -/* Copyright 2007-2015 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 _FT_GASP_H_ -#define _FT_GASP_H_ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - - /*************************************************************************** - * - * @section: - * gasp_table - * - * @title: - * Gasp Table - * - * @abstract: - * Retrieving TrueType `gasp' table entries. - * - * @description: - * The function @FT_Get_Gasp can be used to query a TrueType or OpenType - * font for specific entries in its `gasp' table, if any. This is - * mainly useful when implementing native TrueType hinting with the - * bytecode interpreter to duplicate the Windows text rendering results. - */ - - /************************************************************************* - * - * @enum: - * FT_GASP_XXX - * - * @description: - * A list of values and/or bit-flags returned by the @FT_Get_Gasp - * function. - * - * @values: - * FT_GASP_NO_TABLE :: - * This special value means that there is no GASP table in this face. - * It is up to the client to decide what to do. - * - * FT_GASP_DO_GRIDFIT :: - * Grid-fitting and hinting should be performed at the specified ppem. - * This *really* means TrueType bytecode interpretation. If this bit - * is not set, no hinting gets applied. - * - * FT_GASP_DO_GRAY :: - * Anti-aliased rendering should be performed at the specified ppem. - * If not set, do monochrome rendering. - * - * FT_GASP_SYMMETRIC_SMOOTHING :: - * If set, smoothing along multiple axes must be used with ClearType. - * - * FT_GASP_SYMMETRIC_GRIDFIT :: - * Grid-fitting must be used with ClearType's symmetric smoothing. - * - * @note: - * The bit-flags `FT_GASP_DO_GRIDFIT' and `FT_GASP_DO_GRAY' are to be - * used for standard font rasterization only. Independently of that, - * `FT_GASP_SYMMETRIC_SMOOTHING' and `FT_GASP_SYMMETRIC_GRIDFIT' are to - * be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT' and - * `FT_GASP_DO_GRAY' are consequently ignored). - * - * `ClearType' is Microsoft's implementation of LCD rendering, partly - * protected by patents. - * - * @since: - * 2.3.0 - */ -#define FT_GASP_NO_TABLE -1 -#define FT_GASP_DO_GRIDFIT 0x01 -#define FT_GASP_DO_GRAY 0x02 -#define FT_GASP_SYMMETRIC_SMOOTHING 0x08 -#define FT_GASP_SYMMETRIC_GRIDFIT 0x10 - - - /************************************************************************* - * - * @func: - * FT_Get_Gasp - * - * @description: - * Read the `gasp' table from a TrueType or OpenType font file and - * return the entry corresponding to a given character pixel size. - * - * @input: - * face :: The source face handle. - * ppem :: The vertical character pixel size. - * - * @return: - * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no - * `gasp' table in the face. - * - * @since: - * 2.3.0 - */ - FT_EXPORT( FT_Int ) - FT_Get_Gasp( FT_Face face, - FT_UInt ppem ); - - /* */ - - -#endif /* _FT_GASP_H_ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftglyph.h b/3party/freetype/include/freetype/ftglyph.h deleted file mode 100644 index 803ad39621..0000000000 --- a/3party/freetype/include/freetype/ftglyph.h +++ /dev/null @@ -1,605 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftglyph.h */ -/* */ -/* FreeType convenience functions to handle glyphs (specification). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file contains the definition of several convenience functions */ - /* that can be used by client applications to easily retrieve glyph */ - /* bitmaps and outlines from a given face. */ - /* */ - /* These functions should be optional if you are writing a font server */ - /* or text layout engine on top of FreeType. However, they are pretty */ - /* handy for many other simple uses of the library. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTGLYPH_H__ -#define __FTGLYPH_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* glyph_management */ - /* */ - /* <Title> */ - /* Glyph Management */ - /* */ - /* <Abstract> */ - /* Generic interface to manage individual glyph data. */ - /* */ - /* <Description> */ - /* This section contains definitions used to manage glyph data */ - /* through generic FT_Glyph objects. Each of them can contain a */ - /* bitmap, a vector outline, or even images in other formats. */ - /* */ - /*************************************************************************/ - - - /* forward declaration to a private type */ - typedef struct FT_Glyph_Class_ FT_Glyph_Class; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Glyph */ - /* */ - /* <Description> */ - /* Handle to an object used to model generic glyph images. It is a */ - /* pointer to the @FT_GlyphRec structure and can contain a glyph */ - /* bitmap or pointer. */ - /* */ - /* <Note> */ - /* Glyph objects are not owned by the library. You must thus release */ - /* them manually (through @FT_Done_Glyph) _before_ calling */ - /* @FT_Done_FreeType. */ - /* */ - typedef struct FT_GlyphRec_* FT_Glyph; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_GlyphRec */ - /* */ - /* <Description> */ - /* The root glyph structure contains a given glyph image plus its */ - /* advance width in 16.16 fixed-point format. */ - /* */ - /* <Fields> */ - /* library :: A handle to the FreeType library object. */ - /* */ - /* clazz :: A pointer to the glyph's class. Private. */ - /* */ - /* format :: The format of the glyph's image. */ - /* */ - /* advance :: A 16.16 vector that gives the glyph's advance width. */ - /* */ - typedef struct FT_GlyphRec_ - { - FT_Library library; - const FT_Glyph_Class* clazz; - FT_Glyph_Format format; - FT_Vector advance; - - } FT_GlyphRec; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_BitmapGlyph */ - /* */ - /* <Description> */ - /* A handle to an object used to model a bitmap glyph image. This is */ - /* a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. */ - /* */ - typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_BitmapGlyphRec */ - /* */ - /* <Description> */ - /* A structure used for bitmap glyph images. This really is a */ - /* `sub-class' of @FT_GlyphRec. */ - /* */ - /* <Fields> */ - /* root :: The root @FT_Glyph fields. */ - /* */ - /* left :: The left-side bearing, i.e., the horizontal distance */ - /* from the current pen position to the left border of the */ - /* glyph bitmap. */ - /* */ - /* top :: The top-side bearing, i.e., the vertical distance from */ - /* the current pen position to the top border of the glyph */ - /* bitmap. This distance is positive for upwards~y! */ - /* */ - /* bitmap :: A descriptor for the bitmap. */ - /* */ - /* <Note> */ - /* You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have */ - /* `glyph->format == FT_GLYPH_FORMAT_BITMAP'. This lets you access */ - /* the bitmap's contents easily. */ - /* */ - /* The corresponding pixel buffer is always owned by @FT_BitmapGlyph */ - /* and is thus created and destroyed with it. */ - /* */ - typedef struct FT_BitmapGlyphRec_ - { - FT_GlyphRec root; - FT_Int left; - FT_Int top; - FT_Bitmap bitmap; - - } FT_BitmapGlyphRec; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_OutlineGlyph */ - /* */ - /* <Description> */ - /* A handle to an object used to model an outline glyph image. This */ - /* is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */ - /* */ - typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_OutlineGlyphRec */ - /* */ - /* <Description> */ - /* A structure used for outline (vectorial) glyph images. This */ - /* really is a `sub-class' of @FT_GlyphRec. */ - /* */ - /* <Fields> */ - /* root :: The root @FT_Glyph fields. */ - /* */ - /* outline :: A descriptor for the outline. */ - /* */ - /* <Note> */ - /* You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have */ - /* `glyph->format == FT_GLYPH_FORMAT_OUTLINE'. This lets you access */ - /* the outline's content easily. */ - /* */ - /* As the outline is extracted from a glyph slot, its coordinates are */ - /* expressed normally in 26.6 pixels, unless the flag */ - /* @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */ - /* */ - /* The outline's tables are always owned by the object and are */ - /* destroyed with it. */ - /* */ - typedef struct FT_OutlineGlyphRec_ - { - FT_GlyphRec root; - FT_Outline outline; - - } FT_OutlineGlyphRec; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Glyph */ - /* */ - /* <Description> */ - /* A function used to extract a glyph image from a slot. Note that */ - /* the created @FT_Glyph object must be released with @FT_Done_Glyph. */ - /* */ - /* <Input> */ - /* slot :: A handle to the source glyph slot. */ - /* */ - /* <Output> */ - /* aglyph :: A handle to the glyph object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Glyph( FT_GlyphSlot slot, - FT_Glyph *aglyph ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Glyph_Copy */ - /* */ - /* <Description> */ - /* A function used to copy a glyph image. Note that the created */ - /* @FT_Glyph object must be released with @FT_Done_Glyph. */ - /* */ - /* <Input> */ - /* source :: A handle to the source glyph object. */ - /* */ - /* <Output> */ - /* target :: A handle to the target glyph object. 0~in case of */ - /* error. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Glyph_Copy( FT_Glyph source, - FT_Glyph *target ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Glyph_Transform */ - /* */ - /* <Description> */ - /* Transform a glyph image if its format is scalable. */ - /* */ - /* <InOut> */ - /* glyph :: A handle to the target glyph object. */ - /* */ - /* <Input> */ - /* matrix :: A pointer to a 2x2 matrix to apply. */ - /* */ - /* delta :: A pointer to a 2d vector to apply. Coordinates are */ - /* expressed in 1/64th of a pixel. */ - /* */ - /* <Return> */ - /* FreeType error code (if not 0, the glyph format is not scalable). */ - /* */ - /* <Note> */ - /* The 2x2 transformation matrix is also applied to the glyph's */ - /* advance vector. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Glyph_Transform( FT_Glyph glyph, - FT_Matrix* matrix, - FT_Vector* delta ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Glyph_BBox_Mode */ - /* */ - /* <Description> */ - /* The mode how the values of @FT_Glyph_Get_CBox are returned. */ - /* */ - /* <Values> */ - /* FT_GLYPH_BBOX_UNSCALED :: */ - /* Return unscaled font units. */ - /* */ - /* FT_GLYPH_BBOX_SUBPIXELS :: */ - /* Return unfitted 26.6 coordinates. */ - /* */ - /* FT_GLYPH_BBOX_GRIDFIT :: */ - /* Return grid-fitted 26.6 coordinates. */ - /* */ - /* FT_GLYPH_BBOX_TRUNCATE :: */ - /* Return coordinates in integer pixels. */ - /* */ - /* FT_GLYPH_BBOX_PIXELS :: */ - /* Return grid-fitted pixel coordinates. */ - /* */ - typedef enum FT_Glyph_BBox_Mode_ - { - FT_GLYPH_BBOX_UNSCALED = 0, - FT_GLYPH_BBOX_SUBPIXELS = 0, - FT_GLYPH_BBOX_GRIDFIT = 1, - FT_GLYPH_BBOX_TRUNCATE = 2, - FT_GLYPH_BBOX_PIXELS = 3 - - } FT_Glyph_BBox_Mode; - - - /* these constants are deprecated; use the corresponding */ - /* `FT_Glyph_BBox_Mode' values instead */ -#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED -#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS -#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT -#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE -#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Glyph_Get_CBox */ - /* */ - /* <Description> */ - /* Return a glyph's `control box'. The control box encloses all the */ - /* outline's points, including Bézier control points. Though it */ - /* coincides with the exact bounding box for most glyphs, it can be */ - /* slightly larger in some situations (like when rotating an outline */ - /* that contains Bézier outside arcs). */ - /* */ - /* Computing the control box is very fast, while getting the bounding */ - /* box can take much more time as it needs to walk over all segments */ - /* and arcs in the outline. To get the latter, you can use the */ - /* `ftbbox' component, which is dedicated to this single task. */ - /* */ - /* <Input> */ - /* glyph :: A handle to the source glyph object. */ - /* */ - /* mode :: The mode that indicates how to interpret the returned */ - /* bounding box values. */ - /* */ - /* <Output> */ - /* acbox :: The glyph coordinate bounding box. Coordinates are */ - /* expressed in 1/64th of pixels if it is grid-fitted. */ - /* */ - /* <Note> */ - /* Coordinates are relative to the glyph origin, using the y~upwards */ - /* convention. */ - /* */ - /* If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode' */ - /* must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font */ - /* units in 26.6 pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS */ - /* is another name for this constant. */ - /* */ - /* If the font is tricky and the glyph has been loaded with */ - /* @FT_LOAD_NO_SCALE, the resulting CBox is meaningless. To get */ - /* reasonable values for the CBox it is necessary to load the glyph */ - /* at a large ppem value (so that the hinting instructions can */ - /* properly shift and scale the subglyphs), then extracting the CBox, */ - /* which can be eventually converted back to font units. */ - /* */ - /* Note that the maximum coordinates are exclusive, which means that */ - /* one can compute the width and height of the glyph image (be it in */ - /* integer or 26.6 pixels) as: */ - /* */ - /* { */ - /* width = bbox.xMax - bbox.xMin; */ - /* height = bbox.yMax - bbox.yMin; */ - /* } */ - /* */ - /* Note also that for 26.6 coordinates, if `bbox_mode' is set to */ - /* @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, */ - /* which corresponds to: */ - /* */ - /* { */ - /* bbox.xMin = FLOOR(bbox.xMin); */ - /* bbox.yMin = FLOOR(bbox.yMin); */ - /* bbox.xMax = CEILING(bbox.xMax); */ - /* bbox.yMax = CEILING(bbox.yMax); */ - /* } */ - /* */ - /* To get the bbox in pixel coordinates, set `bbox_mode' to */ - /* @FT_GLYPH_BBOX_TRUNCATE. */ - /* */ - /* To get the bbox in grid-fitted pixel coordinates, set `bbox_mode' */ - /* to @FT_GLYPH_BBOX_PIXELS. */ - /* */ - FT_EXPORT( void ) - FT_Glyph_Get_CBox( FT_Glyph glyph, - FT_UInt bbox_mode, - FT_BBox *acbox ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Glyph_To_Bitmap */ - /* */ - /* <Description> */ - /* Convert a given glyph object to a bitmap glyph object. */ - /* */ - /* <InOut> */ - /* the_glyph :: A pointer to a handle to the target glyph. */ - /* */ - /* <Input> */ - /* render_mode :: An enumeration that describes how the data is */ - /* rendered. */ - /* */ - /* origin :: A pointer to a vector used to translate the glyph */ - /* image before rendering. Can be~0 (if no */ - /* translation). The origin is expressed in */ - /* 26.6 pixels. */ - /* */ - /* destroy :: A boolean that indicates that the original glyph */ - /* image should be destroyed by this function. It is */ - /* never destroyed in case of error. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* This function does nothing if the glyph format isn't scalable. */ - /* */ - /* The glyph image is translated with the `origin' vector before */ - /* rendering. */ - /* */ - /* The first parameter is a pointer to an @FT_Glyph handle, that will */ - /* be _replaced_ by this function (with newly allocated data). */ - /* Typically, you would use (omitting error handling): */ - /* */ - /* */ - /* { */ - /* FT_Glyph glyph; */ - /* FT_BitmapGlyph glyph_bitmap; */ - /* */ - /* */ - /* // load glyph */ - /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT ); */ - /* */ - /* // extract glyph image */ - /* error = FT_Get_Glyph( face->glyph, &glyph ); */ - /* */ - /* // convert to a bitmap (default render mode + destroying old) */ - /* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) */ - /* { */ - /* error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, */ - /* 0, 1 ); */ - /* if ( error ) // `glyph' unchanged */ - /* ... */ - /* } */ - /* */ - /* // access bitmap content by typecasting */ - /* glyph_bitmap = (FT_BitmapGlyph)glyph; */ - /* */ - /* // do funny stuff with it, like blitting/drawing */ - /* ... */ - /* */ - /* // discard glyph image (bitmap or not) */ - /* FT_Done_Glyph( glyph ); */ - /* } */ - /* */ - /* */ - /* Here another example, again without error handling: */ - /* */ - /* */ - /* { */ - /* FT_Glyph glyphs[MAX_GLYPHS] */ - /* */ - /* */ - /* ... */ - /* */ - /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ - /* error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || */ - /* FT_Get_Glyph ( face->glyph, &glyph[idx] ); */ - /* */ - /* ... */ - /* */ - /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ - /* { */ - /* FT_Glyph bitmap = glyphs[idx]; */ - /* */ - /* */ - /* ... */ - /* */ - /* // after this call, `bitmap' no longer points into */ - /* // the `glyphs' array (and the old value isn't destroyed) */ - /* FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); */ - /* */ - /* ... */ - /* */ - /* FT_Done_Glyph( bitmap ); */ - /* } */ - /* */ - /* ... */ - /* */ - /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ - /* FT_Done_Glyph( glyphs[idx] ); */ - /* } */ - /* */ - FT_EXPORT( FT_Error ) - FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, - FT_Render_Mode render_mode, - FT_Vector* origin, - FT_Bool destroy ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_Glyph */ - /* */ - /* <Description> */ - /* Destroy a given glyph. */ - /* */ - /* <Input> */ - /* glyph :: A handle to the target glyph object. */ - /* */ - FT_EXPORT( void ) - FT_Done_Glyph( FT_Glyph glyph ); - - /* */ - - - /* other helpful functions */ - - /*************************************************************************/ - /* */ - /* <Section> */ - /* computations */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Matrix_Multiply */ - /* */ - /* <Description> */ - /* Perform the matrix operation `b = a*b'. */ - /* */ - /* <Input> */ - /* a :: A pointer to matrix `a'. */ - /* */ - /* <InOut> */ - /* b :: A pointer to matrix `b'. */ - /* */ - /* <Note> */ - /* The result is undefined if either `a' or `b' is zero. */ - /* */ - FT_EXPORT( void ) - FT_Matrix_Multiply( const FT_Matrix* a, - FT_Matrix* b ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Matrix_Invert */ - /* */ - /* <Description> */ - /* Invert a 2x2 matrix. Return an error if it can't be inverted. */ - /* */ - /* <InOut> */ - /* matrix :: A pointer to the target matrix. Remains untouched in */ - /* case of error. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Matrix_Invert( FT_Matrix* matrix ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTGLYPH_H__ */ - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/3party/freetype/include/freetype/ftgxval.h b/3party/freetype/include/freetype/ftgxval.h deleted file mode 100644 index 0e9ac1dad3..0000000000 --- a/3party/freetype/include/freetype/ftgxval.h +++ /dev/null @@ -1,357 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgxval.h */ -/* */ -/* FreeType API for validating TrueTypeGX/AAT tables (specification). */ -/* */ -/* Copyright 2004-2015 by */ -/* Masatake YAMATO, Redhat K.K, */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTGXVAL_H__ -#define __FTGXVAL_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* gx_validation */ - /* */ - /* <Title> */ - /* TrueTypeGX/AAT Validation */ - /* */ - /* <Abstract> */ - /* An API to validate TrueTypeGX/AAT tables. */ - /* */ - /* <Description> */ - /* This section contains the declaration of functions to validate */ - /* some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, */ - /* trak, prop, lcar). */ - /* */ - /* <Order> */ - /* FT_TrueTypeGX_Validate */ - /* FT_TrueTypeGX_Free */ - /* */ - /* FT_ClassicKern_Validate */ - /* FT_ClassicKern_Free */ - /* */ - /* FT_VALIDATE_GX_LENGTH */ - /* FT_VALIDATE_GXXXX */ - /* FT_VALIDATE_CKERNXXX */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* */ - /* Warning: Use FT_VALIDATE_XXX to validate a table. */ - /* Following definitions are for gxvalid developers. */ - /* */ - /* */ - /*************************************************************************/ - -#define FT_VALIDATE_feat_INDEX 0 -#define FT_VALIDATE_mort_INDEX 1 -#define FT_VALIDATE_morx_INDEX 2 -#define FT_VALIDATE_bsln_INDEX 3 -#define FT_VALIDATE_just_INDEX 4 -#define FT_VALIDATE_kern_INDEX 5 -#define FT_VALIDATE_opbd_INDEX 6 -#define FT_VALIDATE_trak_INDEX 7 -#define FT_VALIDATE_prop_INDEX 8 -#define FT_VALIDATE_lcar_INDEX 9 -#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX - - - /************************************************************************* - * - * @macro: - * FT_VALIDATE_GX_LENGTH - * - * @description: - * The number of tables checked in this module. Use it as a parameter - * for the `table-length' argument of function @FT_TrueTypeGX_Validate. - */ -#define FT_VALIDATE_GX_LENGTH (FT_VALIDATE_GX_LAST_INDEX + 1) - - /* */ - - /* Up to 0x1000 is used by otvalid. - Ox2xxx is reserved for feature OT extension. */ -#define FT_VALIDATE_GX_START 0x4000 -#define FT_VALIDATE_GX_BITFIELD( tag ) \ - ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX ) - - - /********************************************************************** - * - * @enum: - * FT_VALIDATE_GXXXX - * - * @description: - * A list of bit-field constants used with @FT_TrueTypeGX_Validate to - * indicate which TrueTypeGX/AAT Type tables should be validated. - * - * @values: - * FT_VALIDATE_feat :: - * Validate `feat' table. - * - * FT_VALIDATE_mort :: - * Validate `mort' table. - * - * FT_VALIDATE_morx :: - * Validate `morx' table. - * - * FT_VALIDATE_bsln :: - * Validate `bsln' table. - * - * FT_VALIDATE_just :: - * Validate `just' table. - * - * FT_VALIDATE_kern :: - * Validate `kern' table. - * - * FT_VALIDATE_opbd :: - * Validate `opbd' table. - * - * FT_VALIDATE_trak :: - * Validate `trak' table. - * - * FT_VALIDATE_prop :: - * Validate `prop' table. - * - * FT_VALIDATE_lcar :: - * Validate `lcar' table. - * - * FT_VALIDATE_GX :: - * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern, - * opbd, trak, prop and lcar). - * - */ - -#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat ) -#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort ) -#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx ) -#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln ) -#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just ) -#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern ) -#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd ) -#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak ) -#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop ) -#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar ) - -#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \ - FT_VALIDATE_mort | \ - FT_VALIDATE_morx | \ - FT_VALIDATE_bsln | \ - FT_VALIDATE_just | \ - FT_VALIDATE_kern | \ - FT_VALIDATE_opbd | \ - FT_VALIDATE_trak | \ - FT_VALIDATE_prop | \ - FT_VALIDATE_lcar ) - - - /********************************************************************** - * - * @function: - * FT_TrueTypeGX_Validate - * - * @description: - * Validate various TrueTypeGX tables to assure that all offsets and - * indices are valid. The idea is that a higher-level library that - * actually does the text layout can access those tables without - * error checking (which can be quite time consuming). - * - * @input: - * face :: - * A handle to the input face. - * - * validation_flags :: - * A bit field that specifies the tables to be validated. See - * @FT_VALIDATE_GXXXX for possible values. - * - * table_length :: - * The size of the `tables' array. Normally, @FT_VALIDATE_GX_LENGTH - * should be passed. - * - * @output: - * tables :: - * The array where all validated sfnt tables are stored. - * The array itself must be allocated by a client. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with TrueTypeGX fonts, returning an error - * otherwise. - * - * After use, the application should deallocate the buffers pointed to by - * each `tables' element, by calling @FT_TrueTypeGX_Free. A NULL value - * indicates that the table either doesn't exist in the font, the - * application hasn't asked for validation, or the validator doesn't have - * the ability to validate the sfnt table. - */ - FT_EXPORT( FT_Error ) - FT_TrueTypeGX_Validate( FT_Face face, - FT_UInt validation_flags, - FT_Bytes tables[FT_VALIDATE_GX_LENGTH], - FT_UInt table_length ); - - - /********************************************************************** - * - * @function: - * FT_TrueTypeGX_Free - * - * @description: - * Free the buffer allocated by TrueTypeGX validator. - * - * @input: - * face :: - * A handle to the input face. - * - * table :: - * The pointer to the buffer allocated by - * @FT_TrueTypeGX_Validate. - * - * @note: - * This function must be used to free the buffer allocated by - * @FT_TrueTypeGX_Validate only. - */ - FT_EXPORT( void ) - FT_TrueTypeGX_Free( FT_Face face, - FT_Bytes table ); - - - /********************************************************************** - * - * @enum: - * FT_VALIDATE_CKERNXXX - * - * @description: - * A list of bit-field constants used with @FT_ClassicKern_Validate - * to indicate the classic kern dialect or dialects. If the selected - * type doesn't fit, @FT_ClassicKern_Validate regards the table as - * invalid. - * - * @values: - * FT_VALIDATE_MS :: - * Handle the `kern' table as a classic Microsoft kern table. - * - * FT_VALIDATE_APPLE :: - * Handle the `kern' table as a classic Apple kern table. - * - * FT_VALIDATE_CKERN :: - * Handle the `kern' as either classic Apple or Microsoft kern table. - */ -#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 ) -#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 ) - -#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE ) - - - /********************************************************************** - * - * @function: - * FT_ClassicKern_Validate - * - * @description: - * Validate classic (16-bit format) kern table to assure that the offsets - * and indices are valid. The idea is that a higher-level library that - * actually does the text layout can access those tables without error - * checking (which can be quite time consuming). - * - * The `kern' table validator in @FT_TrueTypeGX_Validate deals with both - * the new 32-bit format and the classic 16-bit format, while - * FT_ClassicKern_Validate only supports the classic 16-bit format. - * - * @input: - * face :: - * A handle to the input face. - * - * validation_flags :: - * A bit field that specifies the dialect to be validated. See - * @FT_VALIDATE_CKERNXXX for possible values. - * - * @output: - * ckern_table :: - * A pointer to the kern table. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * After use, the application should deallocate the buffers pointed to by - * `ckern_table', by calling @FT_ClassicKern_Free. A NULL value - * indicates that the table doesn't exist in the font. - */ - FT_EXPORT( FT_Error ) - FT_ClassicKern_Validate( FT_Face face, - FT_UInt validation_flags, - FT_Bytes *ckern_table ); - - - /********************************************************************** - * - * @function: - * FT_ClassicKern_Free - * - * @description: - * Free the buffer allocated by classic Kern validator. - * - * @input: - * face :: - * A handle to the input face. - * - * table :: - * The pointer to the buffer that is allocated by - * @FT_ClassicKern_Validate. - * - * @note: - * This function must be used to free the buffer allocated by - * @FT_ClassicKern_Validate only. - */ - FT_EXPORT( void ) - FT_ClassicKern_Free( FT_Face face, - FT_Bytes table ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTGXVAL_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftgzip.h b/3party/freetype/include/freetype/ftgzip.h deleted file mode 100644 index b3a532d5e1..0000000000 --- a/3party/freetype/include/freetype/ftgzip.h +++ /dev/null @@ -1,148 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgzip.h */ -/* */ -/* Gzip-compressed stream support. */ -/* */ -/* Copyright 2002-2015 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 __FTGZIP_H__ -#define __FTGZIP_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - /*************************************************************************/ - /* */ - /* <Section> */ - /* gzip */ - /* */ - /* <Title> */ - /* GZIP Streams */ - /* */ - /* <Abstract> */ - /* Using gzip-compressed font files. */ - /* */ - /* <Description> */ - /* This section contains the declaration of Gzip-specific functions. */ - /* */ - /*************************************************************************/ - - - /************************************************************************ - * - * @function: - * FT_Stream_OpenGzip - * - * @description: - * Open a new stream to parse gzip-compressed font files. This is - * mainly used to support the compressed `*.pcf.gz' fonts that come - * with XFree86. - * - * @input: - * stream :: - * The target embedding stream. - * - * source :: - * The source stream. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The source stream must be opened _before_ calling this function. - * - * Calling the internal function `FT_Stream_Close' on the new stream will - * *not* call `FT_Stream_Close' on the source stream. None of the stream - * objects will be released to the heap. - * - * The stream implementation is very basic and resets the decompression - * process each time seeking backwards is needed within the stream. - * - * In certain builds of the library, gzip compression recognition is - * automatically handled when calling @FT_New_Face or @FT_Open_Face. - * This means that if no font driver is capable of handling the raw - * compressed file, the library will try to open a gzipped stream from - * it and re-open the face with it. - * - * This function may return `FT_Err_Unimplemented_Feature' if your build - * of FreeType was not compiled with zlib support. - */ - FT_EXPORT( FT_Error ) - FT_Stream_OpenGzip( FT_Stream stream, - FT_Stream source ); - - - /************************************************************************ - * - * @function: - * FT_Gzip_Uncompress - * - * @description: - * Decompress a zipped input buffer into an output buffer. This function - * is modeled after zlib's `uncompress' function. - * - * @input: - * memory :: - * A FreeType memory handle. - * - * input :: - * The input buffer. - * - * input_len :: - * The length of the input buffer. - * - * @output: - * output:: - * The output buffer. - * - * @inout: - * output_len :: - * Before calling the function, this is the the total size of the - * output buffer, which must be large enough to hold the entire - * uncompressed data (so the size of the uncompressed data must be - * known in advance). After calling the function, `output_len' is the - * size of the used data in `output'. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function may return `FT_Err_Unimplemented_Feature' if your build - * of FreeType was not compiled with zlib support. - */ - FT_EXPORT( FT_Error ) - FT_Gzip_Uncompress( FT_Memory memory, - FT_Byte* output, - FT_ULong* output_len, - const FT_Byte* input, - FT_ULong input_len ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTGZIP_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftimage.h b/3party/freetype/include/freetype/ftimage.h deleted file mode 100644 index 82f284c4f9..0000000000 --- a/3party/freetype/include/freetype/ftimage.h +++ /dev/null @@ -1,1214 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftimage.h */ -/* */ -/* FreeType glyph image formats and default raster interface */ -/* (specification). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* Note: A `raster' is simply a scan-line converter, used to render */ - /* FT_Outlines into FT_Bitmaps. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTIMAGE_H__ -#define __FTIMAGE_H__ - - - /* _STANDALONE_ is from ftgrays.c */ -#ifndef _STANDALONE_ -#include <ft2build.h> -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* basic_types */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Pos */ - /* */ - /* <Description> */ - /* The type FT_Pos is used to store vectorial coordinates. Depending */ - /* on the context, these can represent distances in integer font */ - /* units, or 16.16, or 26.6 fixed-point pixel coordinates. */ - /* */ - typedef signed long FT_Pos; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Vector */ - /* */ - /* <Description> */ - /* A simple structure used to store a 2D vector; coordinates are of */ - /* the FT_Pos type. */ - /* */ - /* <Fields> */ - /* x :: The horizontal coordinate. */ - /* y :: The vertical coordinate. */ - /* */ - typedef struct FT_Vector_ - { - FT_Pos x; - FT_Pos y; - - } FT_Vector; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_BBox */ - /* */ - /* <Description> */ - /* A structure used to hold an outline's bounding box, i.e., the */ - /* coordinates of its extrema in the horizontal and vertical */ - /* directions. */ - /* */ - /* <Fields> */ - /* xMin :: The horizontal minimum (left-most). */ - /* */ - /* yMin :: The vertical minimum (bottom-most). */ - /* */ - /* xMax :: The horizontal maximum (right-most). */ - /* */ - /* yMax :: The vertical maximum (top-most). */ - /* */ - /* <Note> */ - /* The bounding box is specified with the coordinates of the lower */ - /* left and the upper right corner. In PostScript, those values are */ - /* often called (llx,lly) and (urx,ury), respectively. */ - /* */ - /* If `yMin' is negative, this value gives the glyph's descender. */ - /* Otherwise, the glyph doesn't descend below the baseline. */ - /* Similarly, if `ymax' is positive, this value gives the glyph's */ - /* ascender. */ - /* */ - /* `xMin' gives the horizontal distance from the glyph's origin to */ - /* the left edge of the glyph's bounding box. If `xMin' is negative, */ - /* the glyph extends to the left of the origin. */ - /* */ - typedef struct FT_BBox_ - { - FT_Pos xMin, yMin; - FT_Pos xMax, yMax; - - } FT_BBox; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Pixel_Mode */ - /* */ - /* <Description> */ - /* An enumeration type used to describe the format of pixels in a */ - /* given bitmap. Note that additional formats may be added in the */ - /* future. */ - /* */ - /* <Values> */ - /* FT_PIXEL_MODE_NONE :: */ - /* Value~0 is reserved. */ - /* */ - /* FT_PIXEL_MODE_MONO :: */ - /* A monochrome bitmap, using 1~bit per pixel. Note that pixels */ - /* are stored in most-significant order (MSB), which means that */ - /* the left-most pixel in a byte has value 128. */ - /* */ - /* FT_PIXEL_MODE_GRAY :: */ - /* An 8-bit bitmap, generally used to represent anti-aliased glyph */ - /* images. Each pixel is stored in one byte. Note that the number */ - /* of `gray' levels is stored in the `num_grays' field of the */ - /* @FT_Bitmap structure (it generally is 256). */ - /* */ - /* FT_PIXEL_MODE_GRAY2 :: */ - /* A 2-bit per pixel bitmap, used to represent embedded */ - /* anti-aliased bitmaps in font files according to the OpenType */ - /* specification. We haven't found a single font using this */ - /* format, however. */ - /* */ - /* FT_PIXEL_MODE_GRAY4 :: */ - /* A 4-bit per pixel bitmap, representing embedded anti-aliased */ - /* bitmaps in font files according to the OpenType specification. */ - /* We haven't found a single font using this format, however. */ - /* */ - /* FT_PIXEL_MODE_LCD :: */ - /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */ - /* used for display on LCD displays; the bitmap is three times */ - /* wider than the original glyph image. See also */ - /* @FT_RENDER_MODE_LCD. */ - /* */ - /* FT_PIXEL_MODE_LCD_V :: */ - /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */ - /* used for display on rotated LCD displays; the bitmap is three */ - /* times taller than the original glyph image. See also */ - /* @FT_RENDER_MODE_LCD_V. */ - /* */ - /* FT_PIXEL_MODE_BGRA :: */ - /* An image with four 8-bit channels per pixel, representing a */ - /* color image (such as emoticons) with alpha channel. For each */ - /* pixel, the format is BGRA, which means, the blue channel comes */ - /* first in memory. The color channels are pre-multiplied and in */ - /* the sRGB colorspace. For example, full red at half-translucent */ - /* opacity will be represented as `00,00,80,80', not `00,00,FF,80'. */ - /* See also @FT_LOAD_COLOR. */ - /* */ - typedef enum FT_Pixel_Mode_ - { - FT_PIXEL_MODE_NONE = 0, - FT_PIXEL_MODE_MONO, - FT_PIXEL_MODE_GRAY, - FT_PIXEL_MODE_GRAY2, - FT_PIXEL_MODE_GRAY4, - FT_PIXEL_MODE_LCD, - FT_PIXEL_MODE_LCD_V, - FT_PIXEL_MODE_BGRA, - - FT_PIXEL_MODE_MAX /* do not remove */ - - } FT_Pixel_Mode; - - - /* these constants are deprecated; use the corresponding `FT_Pixel_Mode' */ - /* values instead. */ -#define ft_pixel_mode_none FT_PIXEL_MODE_NONE -#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO -#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY -#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2 -#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4 - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Bitmap */ - /* */ - /* <Description> */ - /* A structure used to describe a bitmap or pixmap to the raster. */ - /* Note that we now manage pixmaps of various depths through the */ - /* `pixel_mode' field. */ - /* */ - /* <Fields> */ - /* rows :: The number of bitmap rows. */ - /* */ - /* width :: The number of pixels in bitmap row. */ - /* */ - /* pitch :: The pitch's absolute value is the number of bytes */ - /* taken by one bitmap row, including padding. */ - /* However, the pitch is positive when the bitmap has */ - /* a `down' flow, and negative when it has an `up' */ - /* flow. In all cases, the pitch is an offset to add */ - /* to a bitmap pointer in order to go down one row. */ - /* */ - /* Note that `padding' means the alignment of a */ - /* bitmap to a byte border, and FreeType functions */ - /* normally align to the smallest possible integer */ - /* value. */ - /* */ - /* For the B/W rasterizer, `pitch' is always an even */ - /* number. */ - /* */ - /* To change the pitch of a bitmap (say, to make it a */ - /* multiple of 4), use @FT_Bitmap_Convert. */ - /* Alternatively, you might use callback functions to */ - /* directly render to the application's surface; see */ - /* the file `example2.cpp' in the tutorial for a */ - /* demonstration. */ - /* */ - /* buffer :: A typeless pointer to the bitmap buffer. This */ - /* value should be aligned on 32-bit boundaries in */ - /* most cases. */ - /* */ - /* num_grays :: This field is only used with */ - /* @FT_PIXEL_MODE_GRAY; it gives the number of gray */ - /* levels used in the bitmap. */ - /* */ - /* pixel_mode :: The pixel mode, i.e., how pixel bits are stored. */ - /* See @FT_Pixel_Mode for possible values. */ - /* */ - /* palette_mode :: This field is intended for paletted pixel modes; */ - /* it indicates how the palette is stored. Not */ - /* used currently. */ - /* */ - /* palette :: A typeless pointer to the bitmap palette; this */ - /* field is intended for paletted pixel modes. Not */ - /* used currently. */ - /* */ - typedef struct FT_Bitmap_ - { - unsigned int rows; - unsigned int width; - int pitch; - unsigned char* buffer; - unsigned short num_grays; - unsigned char pixel_mode; - unsigned char palette_mode; - void* palette; - - } FT_Bitmap; - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* outline_processing */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Outline */ - /* */ - /* <Description> */ - /* This structure is used to describe an outline to the scan-line */ - /* converter. */ - /* */ - /* <Fields> */ - /* n_contours :: The number of contours in the outline. */ - /* */ - /* n_points :: The number of points in the outline. */ - /* */ - /* points :: A pointer to an array of `n_points' @FT_Vector */ - /* elements, giving the outline's point coordinates. */ - /* */ - /* tags :: A pointer to an array of `n_points' chars, giving */ - /* each outline point's type. */ - /* */ - /* If bit~0 is unset, the point is `off' the curve, */ - /* i.e., a Bézier control point, while it is `on' if */ - /* set. */ - /* */ - /* Bit~1 is meaningful for `off' points only. If set, */ - /* it indicates a third-order Bézier arc control point; */ - /* and a second-order control point if unset. */ - /* */ - /* If bit~2 is set, bits 5-7 contain the drop-out mode */ - /* (as defined in the OpenType specification; the value */ - /* is the same as the argument to the SCANMODE */ - /* instruction). */ - /* */ - /* Bits 3 and~4 are reserved for internal purposes. */ - /* */ - /* contours :: An array of `n_contours' shorts, giving the end */ - /* point of each contour within the outline. For */ - /* example, the first contour is defined by the points */ - /* `0' to `contours[0]', the second one is defined by */ - /* the points `contours[0]+1' to `contours[1]', etc. */ - /* */ - /* flags :: A set of bit flags used to characterize the outline */ - /* and give hints to the scan-converter and hinter on */ - /* how to convert/grid-fit it. See @FT_OUTLINE_XXX. */ - /* */ - /* <Note> */ - /* The B/W rasterizer only checks bit~2 in the `tags' array for the */ - /* first point of each contour. The drop-out mode as given with */ - /* @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and */ - /* @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden. */ - /* */ - typedef struct FT_Outline_ - { - short n_contours; /* number of contours in glyph */ - short n_points; /* number of points in the glyph */ - - FT_Vector* points; /* the outline's points */ - char* tags; /* the points flags */ - short* contours; /* the contour end points */ - - int flags; /* outline masks */ - - } FT_Outline; - - /* */ - - /* Following limits must be consistent with */ - /* FT_Outline.{n_contours,n_points} */ -#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX -#define FT_OUTLINE_POINTS_MAX SHRT_MAX - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_OUTLINE_XXX */ - /* */ - /* <Description> */ - /* A list of bit-field constants use for the flags in an outline's */ - /* `flags' field. */ - /* */ - /* <Values> */ - /* FT_OUTLINE_NONE :: */ - /* Value~0 is reserved. */ - /* */ - /* FT_OUTLINE_OWNER :: */ - /* If set, this flag indicates that the outline's field arrays */ - /* (i.e., `points', `flags', and `contours') are `owned' by the */ - /* outline object, and should thus be freed when it is destroyed. */ - /* */ - /* FT_OUTLINE_EVEN_ODD_FILL :: */ - /* By default, outlines are filled using the non-zero winding rule. */ - /* If set to 1, the outline will be filled using the even-odd fill */ - /* rule (only works with the smooth rasterizer). */ - /* */ - /* FT_OUTLINE_REVERSE_FILL :: */ - /* By default, outside contours of an outline are oriented in */ - /* clock-wise direction, as defined in the TrueType specification. */ - /* This flag is set if the outline uses the opposite direction */ - /* (typically for Type~1 fonts). This flag is ignored by the scan */ - /* converter. */ - /* */ - /* FT_OUTLINE_IGNORE_DROPOUTS :: */ - /* By default, the scan converter will try to detect drop-outs in */ - /* an outline and correct the glyph bitmap to ensure consistent */ - /* shape continuity. If set, this flag hints the scan-line */ - /* converter to ignore such cases. See below for more information. */ - /* */ - /* FT_OUTLINE_SMART_DROPOUTS :: */ - /* Select smart dropout control. If unset, use simple dropout */ - /* control. Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See */ - /* below for more information. */ - /* */ - /* FT_OUTLINE_INCLUDE_STUBS :: */ - /* If set, turn pixels on for `stubs', otherwise exclude them. */ - /* Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for */ - /* more information. */ - /* */ - /* FT_OUTLINE_HIGH_PRECISION :: */ - /* This flag indicates that the scan-line converter should try to */ - /* convert this outline to bitmaps with the highest possible */ - /* quality. It is typically set for small character sizes. Note */ - /* that this is only a hint that might be completely ignored by a */ - /* given scan-converter. */ - /* */ - /* FT_OUTLINE_SINGLE_PASS :: */ - /* This flag is set to force a given scan-converter to only use a */ - /* single pass over the outline to render a bitmap glyph image. */ - /* Normally, it is set for very large character sizes. It is only */ - /* a hint that might be completely ignored by a given */ - /* scan-converter. */ - /* */ - /* <Note> */ - /* The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */ - /* and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth */ - /* rasterizer. */ - /* */ - /* There exists a second mechanism to pass the drop-out mode to the */ - /* B/W rasterizer; see the `tags' field in @FT_Outline. */ - /* */ - /* Please refer to the description of the `SCANTYPE' instruction in */ - /* the OpenType specification (in file `ttinst1.doc') how simple */ - /* drop-outs, smart drop-outs, and stubs are defined. */ - /* */ -#define FT_OUTLINE_NONE 0x0 -#define FT_OUTLINE_OWNER 0x1 -#define FT_OUTLINE_EVEN_ODD_FILL 0x2 -#define FT_OUTLINE_REVERSE_FILL 0x4 -#define FT_OUTLINE_IGNORE_DROPOUTS 0x8 -#define FT_OUTLINE_SMART_DROPOUTS 0x10 -#define FT_OUTLINE_INCLUDE_STUBS 0x20 - -#define FT_OUTLINE_HIGH_PRECISION 0x100 -#define FT_OUTLINE_SINGLE_PASS 0x200 - - - /* these constants are deprecated; use the corresponding */ - /* `FT_OUTLINE_XXX' values instead */ -#define ft_outline_none FT_OUTLINE_NONE -#define ft_outline_owner FT_OUTLINE_OWNER -#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL -#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL -#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS -#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION -#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS - - /* */ - -#define FT_CURVE_TAG( flag ) ( flag & 3 ) - -#define FT_CURVE_TAG_ON 1 -#define FT_CURVE_TAG_CONIC 0 -#define FT_CURVE_TAG_CUBIC 2 - -#define FT_CURVE_TAG_HAS_SCANMODE 4 - -#define FT_CURVE_TAG_TOUCH_X 8 /* reserved for the TrueType hinter */ -#define FT_CURVE_TAG_TOUCH_Y 16 /* reserved for the TrueType hinter */ - -#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \ - FT_CURVE_TAG_TOUCH_Y ) - -#define FT_Curve_Tag_On FT_CURVE_TAG_ON -#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC -#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC -#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X -#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Outline_MoveToFunc */ - /* */ - /* <Description> */ - /* A function pointer type used to describe the signature of a `move */ - /* to' function during outline walking/decomposition. */ - /* */ - /* A `move to' is emitted to start a new contour in an outline. */ - /* */ - /* <Input> */ - /* to :: A pointer to the target point of the `move to'. */ - /* */ - /* user :: A typeless pointer, which is passed from the caller of the */ - /* decomposition function. */ - /* */ - /* <Return> */ - /* Error code. 0~means success. */ - /* */ - typedef int - (*FT_Outline_MoveToFunc)( const FT_Vector* to, - void* user ); - -#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Outline_LineToFunc */ - /* */ - /* <Description> */ - /* A function pointer type used to describe the signature of a `line */ - /* to' function during outline walking/decomposition. */ - /* */ - /* A `line to' is emitted to indicate a segment in the outline. */ - /* */ - /* <Input> */ - /* to :: A pointer to the target point of the `line to'. */ - /* */ - /* user :: A typeless pointer, which is passed from the caller of the */ - /* decomposition function. */ - /* */ - /* <Return> */ - /* Error code. 0~means success. */ - /* */ - typedef int - (*FT_Outline_LineToFunc)( const FT_Vector* to, - void* user ); - -#define FT_Outline_LineTo_Func FT_Outline_LineToFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Outline_ConicToFunc */ - /* */ - /* <Description> */ - /* A function pointer type used to describe the signature of a `conic */ - /* to' function during outline walking or decomposition. */ - /* */ - /* A `conic to' is emitted to indicate a second-order Bézier arc in */ - /* the outline. */ - /* */ - /* <Input> */ - /* control :: An intermediate control point between the last position */ - /* and the new target in `to'. */ - /* */ - /* to :: A pointer to the target end point of the conic arc. */ - /* */ - /* user :: A typeless pointer, which is passed from the caller of */ - /* the decomposition function. */ - /* */ - /* <Return> */ - /* Error code. 0~means success. */ - /* */ - typedef int - (*FT_Outline_ConicToFunc)( const FT_Vector* control, - const FT_Vector* to, - void* user ); - -#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Outline_CubicToFunc */ - /* */ - /* <Description> */ - /* A function pointer type used to describe the signature of a `cubic */ - /* to' function during outline walking or decomposition. */ - /* */ - /* A `cubic to' is emitted to indicate a third-order Bézier arc. */ - /* */ - /* <Input> */ - /* control1 :: A pointer to the first Bézier control point. */ - /* */ - /* control2 :: A pointer to the second Bézier control point. */ - /* */ - /* to :: A pointer to the target end point. */ - /* */ - /* user :: A typeless pointer, which is passed from the caller of */ - /* the decomposition function. */ - /* */ - /* <Return> */ - /* Error code. 0~means success. */ - /* */ - typedef int - (*FT_Outline_CubicToFunc)( const FT_Vector* control1, - const FT_Vector* control2, - const FT_Vector* to, - void* user ); - -#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Outline_Funcs */ - /* */ - /* <Description> */ - /* A structure to hold various function pointers used during outline */ - /* decomposition in order to emit segments, conic, and cubic Béziers. */ - /* */ - /* <Fields> */ - /* move_to :: The `move to' emitter. */ - /* */ - /* line_to :: The segment emitter. */ - /* */ - /* conic_to :: The second-order Bézier arc emitter. */ - /* */ - /* cubic_to :: The third-order Bézier arc emitter. */ - /* */ - /* shift :: The shift that is applied to coordinates before they */ - /* are sent to the emitter. */ - /* */ - /* delta :: The delta that is applied to coordinates before they */ - /* are sent to the emitter, but after the shift. */ - /* */ - /* <Note> */ - /* The point coordinates sent to the emitters are the transformed */ - /* version of the original coordinates (this is important for high */ - /* accuracy during scan-conversion). The transformation is simple: */ - /* */ - /* { */ - /* x' = (x << shift) - delta */ - /* y' = (x << shift) - delta */ - /* } */ - /* */ - /* Set the values of `shift' and `delta' to~0 to get the original */ - /* point coordinates. */ - /* */ - typedef struct FT_Outline_Funcs_ - { - FT_Outline_MoveToFunc move_to; - FT_Outline_LineToFunc line_to; - FT_Outline_ConicToFunc conic_to; - FT_Outline_CubicToFunc cubic_to; - - int shift; - FT_Pos delta; - - } FT_Outline_Funcs; - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* basic_types */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_IMAGE_TAG */ - /* */ - /* <Description> */ - /* This macro converts four-letter tags to an unsigned long type. */ - /* */ - /* <Note> */ - /* Since many 16-bit compilers don't like 32-bit enumerations, you */ - /* should redefine this macro in case of problems to something like */ - /* this: */ - /* */ - /* { */ - /* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value */ - /* } */ - /* */ - /* to get a simple enumeration without assigning special numbers. */ - /* */ -#ifndef FT_IMAGE_TAG -#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \ - value = ( ( (unsigned long)_x1 << 24 ) | \ - ( (unsigned long)_x2 << 16 ) | \ - ( (unsigned long)_x3 << 8 ) | \ - (unsigned long)_x4 ) -#endif /* FT_IMAGE_TAG */ - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Glyph_Format */ - /* */ - /* <Description> */ - /* An enumeration type used to describe the format of a given glyph */ - /* image. Note that this version of FreeType only supports two image */ - /* formats, even though future font drivers will be able to register */ - /* their own format. */ - /* */ - /* <Values> */ - /* FT_GLYPH_FORMAT_NONE :: */ - /* The value~0 is reserved. */ - /* */ - /* FT_GLYPH_FORMAT_COMPOSITE :: */ - /* The glyph image is a composite of several other images. This */ - /* format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to */ - /* report compound glyphs (like accented characters). */ - /* */ - /* FT_GLYPH_FORMAT_BITMAP :: */ - /* The glyph image is a bitmap, and can be described as an */ - /* @FT_Bitmap. You generally need to access the `bitmap' field of */ - /* the @FT_GlyphSlotRec structure to read it. */ - /* */ - /* FT_GLYPH_FORMAT_OUTLINE :: */ - /* The glyph image is a vectorial outline made of line segments */ - /* and Bézier arcs; it can be described as an @FT_Outline; you */ - /* generally want to access the `outline' field of the */ - /* @FT_GlyphSlotRec structure to read it. */ - /* */ - /* FT_GLYPH_FORMAT_PLOTTER :: */ - /* The glyph image is a vectorial path with no inside and outside */ - /* contours. Some Type~1 fonts, like those in the Hershey family, */ - /* contain glyphs in this format. These are described as */ - /* @FT_Outline, but FreeType isn't currently capable of rendering */ - /* them correctly. */ - /* */ - typedef enum FT_Glyph_Format_ - { - FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ), - - FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ), - FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ), - FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ), - FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ) - - } FT_Glyph_Format; - - - /* these constants are deprecated; use the corresponding */ - /* `FT_Glyph_Format' values instead. */ -#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE -#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE -#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP -#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE -#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** R A S T E R D E F I N I T I O N S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* A raster is a scan converter, in charge of rendering an outline into */ - /* a a bitmap. This section contains the public API for rasters. */ - /* */ - /* Note that in FreeType 2, all rasters are now encapsulated within */ - /* specific modules called `renderers'. See `ftrender.h' for more */ - /* details on renderers. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* raster */ - /* */ - /* <Title> */ - /* Scanline Converter */ - /* */ - /* <Abstract> */ - /* How vectorial outlines are converted into bitmaps and pixmaps. */ - /* */ - /* <Description> */ - /* This section contains technical definitions. */ - /* */ - /* <Order> */ - /* FT_Raster */ - /* FT_Span */ - /* FT_SpanFunc */ - /* */ - /* FT_Raster_Params */ - /* FT_RASTER_FLAG_XXX */ - /* */ - /* FT_Raster_NewFunc */ - /* FT_Raster_DoneFunc */ - /* FT_Raster_ResetFunc */ - /* FT_Raster_SetModeFunc */ - /* FT_Raster_RenderFunc */ - /* FT_Raster_Funcs */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Raster */ - /* */ - /* <Description> */ - /* An opaque handle (pointer) to a raster object. Each object can be */ - /* used independently to convert an outline into a bitmap or pixmap. */ - /* */ - typedef struct FT_RasterRec_* FT_Raster; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Span */ - /* */ - /* <Description> */ - /* A structure used to model a single span of gray pixels when */ - /* rendering an anti-aliased bitmap. */ - /* */ - /* <Fields> */ - /* x :: The span's horizontal start position. */ - /* */ - /* len :: The span's length in pixels. */ - /* */ - /* coverage :: The span color/coverage, ranging from 0 (background) */ - /* to 255 (foreground). */ - /* */ - /* <Note> */ - /* This structure is used by the span drawing callback type named */ - /* @FT_SpanFunc that takes the y~coordinate of the span as a */ - /* parameter. */ - /* */ - /* The coverage value is always between 0 and 255. If you want less */ - /* gray values, the callback function has to reduce them. */ - /* */ - typedef struct FT_Span_ - { - short x; - unsigned short len; - unsigned char coverage; - - } FT_Span; - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_SpanFunc */ - /* */ - /* <Description> */ - /* A function used as a call-back by the anti-aliased renderer in */ - /* order to let client applications draw themselves the gray pixel */ - /* spans on each scan line. */ - /* */ - /* <Input> */ - /* y :: The scanline's y~coordinate. */ - /* */ - /* count :: The number of spans to draw on this scanline. */ - /* */ - /* spans :: A table of `count' spans to draw on the scanline. */ - /* */ - /* user :: User-supplied data that is passed to the callback. */ - /* */ - /* <Note> */ - /* This callback allows client applications to directly render the */ - /* gray spans of the anti-aliased bitmap to any kind of surfaces. */ - /* */ - /* This can be used to write anti-aliased outlines directly to a */ - /* given background bitmap, and even perform translucency. */ - /* */ - /* Note that the `count' field cannot be greater than a fixed value */ - /* defined by the `FT_MAX_GRAY_SPANS' configuration macro in */ - /* `ftoption.h'. By default, this value is set to~32, which means */ - /* that if there are more than 32~spans on a given scanline, the */ - /* callback is called several times with the same `y' parameter in */ - /* order to draw all callbacks. */ - /* */ - /* Otherwise, the callback is only called once per scan-line, and */ - /* only for those scanlines that do have `gray' pixels on them. */ - /* */ - typedef void - (*FT_SpanFunc)( int y, - int count, - const FT_Span* spans, - void* user ); - -#define FT_Raster_Span_Func FT_SpanFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_BitTest_Func */ - /* */ - /* <Description> */ - /* Deprecated, unimplemented. */ - /* */ - typedef int - (*FT_Raster_BitTest_Func)( int y, - int x, - void* user ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_BitSet_Func */ - /* */ - /* <Description> */ - /* Deprecated, unimplemented. */ - /* */ - typedef void - (*FT_Raster_BitSet_Func)( int y, - int x, - void* user ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_RASTER_FLAG_XXX */ - /* */ - /* <Description> */ - /* A list of bit flag constants as used in the `flags' field of a */ - /* @FT_Raster_Params structure. */ - /* */ - /* <Values> */ - /* FT_RASTER_FLAG_DEFAULT :: This value is 0. */ - /* */ - /* FT_RASTER_FLAG_AA :: This flag is set to indicate that an */ - /* anti-aliased glyph image should be */ - /* generated. Otherwise, it will be */ - /* monochrome (1-bit). */ - /* */ - /* FT_RASTER_FLAG_DIRECT :: This flag is set to indicate direct */ - /* rendering. In this mode, client */ - /* applications must provide their own span */ - /* callback. This lets them directly */ - /* draw or compose over an existing bitmap. */ - /* If this bit is not set, the target */ - /* pixmap's buffer _must_ be zeroed before */ - /* rendering. */ - /* */ - /* Direct rendering is only possible with */ - /* anti-aliased glyphs. */ - /* */ - /* FT_RASTER_FLAG_CLIP :: This flag is only used in direct */ - /* rendering mode. If set, the output will */ - /* be clipped to a box specified in the */ - /* `clip_box' field of the */ - /* @FT_Raster_Params structure. */ - /* */ - /* Note that by default, the glyph bitmap */ - /* is clipped to the target pixmap, except */ - /* in direct rendering mode where all spans */ - /* are generated if no clipping box is set. */ - /* */ -#define FT_RASTER_FLAG_DEFAULT 0x0 -#define FT_RASTER_FLAG_AA 0x1 -#define FT_RASTER_FLAG_DIRECT 0x2 -#define FT_RASTER_FLAG_CLIP 0x4 - - /* these constants are deprecated; use the corresponding */ - /* `FT_RASTER_FLAG_XXX' values instead */ -#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT -#define ft_raster_flag_aa FT_RASTER_FLAG_AA -#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT -#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Raster_Params */ - /* */ - /* <Description> */ - /* A structure to hold the arguments used by a raster's render */ - /* function. */ - /* */ - /* <Fields> */ - /* target :: The target bitmap. */ - /* */ - /* source :: A pointer to the source glyph image (e.g., an */ - /* @FT_Outline). */ - /* */ - /* flags :: The rendering flags. */ - /* */ - /* gray_spans :: The gray span drawing callback. */ - /* */ - /* black_spans :: Unused. */ - /* */ - /* bit_test :: Unused. */ - /* */ - /* bit_set :: Unused. */ - /* */ - /* user :: User-supplied data that is passed to each drawing */ - /* callback. */ - /* */ - /* clip_box :: An optional clipping box. It is only used in */ - /* direct rendering mode. Note that coordinates here */ - /* should be expressed in _integer_ pixels (and not in */ - /* 26.6 fixed-point units). */ - /* */ - /* <Note> */ - /* An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA */ - /* bit flag is set in the `flags' field, otherwise a monochrome */ - /* bitmap is generated. */ - /* */ - /* If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the */ - /* raster will call the `gray_spans' callback to draw gray pixel */ - /* spans. This allows direct composition over a pre-existing bitmap */ - /* through user-provided callbacks to perform the span drawing and */ - /* composition. Not supported by the monochrome rasterizer. */ - /* */ - typedef struct FT_Raster_Params_ - { - const FT_Bitmap* target; - const void* source; - int flags; - FT_SpanFunc gray_spans; - FT_SpanFunc black_spans; /* unused */ - FT_Raster_BitTest_Func bit_test; /* unused */ - FT_Raster_BitSet_Func bit_set; /* unused */ - void* user; - FT_BBox clip_box; - - } FT_Raster_Params; - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_NewFunc */ - /* */ - /* <Description> */ - /* A function used to create a new raster object. */ - /* */ - /* <Input> */ - /* memory :: A handle to the memory allocator. */ - /* */ - /* <Output> */ - /* raster :: A handle to the new raster object. */ - /* */ - /* <Return> */ - /* Error code. 0~means success. */ - /* */ - /* <Note> */ - /* The `memory' parameter is a typeless pointer in order to avoid */ - /* un-wanted dependencies on the rest of the FreeType code. In */ - /* practice, it is an @FT_Memory object, i.e., a handle to the */ - /* standard FreeType memory allocator. However, this field can be */ - /* completely ignored by a given raster implementation. */ - /* */ - typedef int - (*FT_Raster_NewFunc)( void* memory, - FT_Raster* raster ); - -#define FT_Raster_New_Func FT_Raster_NewFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_DoneFunc */ - /* */ - /* <Description> */ - /* A function used to destroy a given raster object. */ - /* */ - /* <Input> */ - /* raster :: A handle to the raster object. */ - /* */ - typedef void - (*FT_Raster_DoneFunc)( FT_Raster raster ); - -#define FT_Raster_Done_Func FT_Raster_DoneFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_ResetFunc */ - /* */ - /* <Description> */ - /* FreeType used to provide an area of memory called the `render */ - /* pool' available to all registered rasters. This was not thread */ - /* safe however and now FreeType never allocates this pool. NULL */ - /* is always passed in as pool_base. */ - /* */ - /* This function is called each time the render pool changes, or just */ - /* after a new raster object is created. */ - /* */ - /* <Input> */ - /* raster :: A handle to the new raster object. */ - /* */ - /* pool_base :: The address in memory of the render pool. */ - /* */ - /* pool_size :: The size in bytes of the render pool. */ - /* */ - /* <Note> */ - /* Rasters should ignore the render pool and rely on dynamic or stack */ - /* allocation if they want to (a handle to the memory allocator is */ - /* passed to the raster constructor). */ - /* */ - typedef void - (*FT_Raster_ResetFunc)( FT_Raster raster, - unsigned char* pool_base, - unsigned long pool_size ); - -#define FT_Raster_Reset_Func FT_Raster_ResetFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_SetModeFunc */ - /* */ - /* <Description> */ - /* This function is a generic facility to change modes or attributes */ - /* in a given raster. This can be used for debugging purposes, or */ - /* simply to allow implementation-specific `features' in a given */ - /* raster module. */ - /* */ - /* <Input> */ - /* raster :: A handle to the new raster object. */ - /* */ - /* mode :: A 4-byte tag used to name the mode or property. */ - /* */ - /* args :: A pointer to the new mode/property to use. */ - /* */ - typedef int - (*FT_Raster_SetModeFunc)( FT_Raster raster, - unsigned long mode, - void* args ); - -#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_RenderFunc */ - /* */ - /* <Description> */ - /* Invoke a given raster to scan-convert a given glyph image into a */ - /* target bitmap. */ - /* */ - /* <Input> */ - /* raster :: A handle to the raster object. */ - /* */ - /* params :: A pointer to an @FT_Raster_Params structure used to */ - /* store the rendering parameters. */ - /* */ - /* <Return> */ - /* Error code. 0~means success. */ - /* */ - /* <Note> */ - /* The exact format of the source image depends on the raster's glyph */ - /* format defined in its @FT_Raster_Funcs structure. It can be an */ - /* @FT_Outline or anything else in order to support a large array of */ - /* glyph formats. */ - /* */ - /* Note also that the render function can fail and return a */ - /* `FT_Err_Unimplemented_Feature' error code if the raster used does */ - /* not support direct composition. */ - /* */ - /* XXX: For now, the standard raster doesn't support direct */ - /* composition but this should change for the final release (see */ - /* the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c' */ - /* for examples of distinct implementations that support direct */ - /* composition). */ - /* */ - typedef int - (*FT_Raster_RenderFunc)( FT_Raster raster, - const FT_Raster_Params* params ); - -#define FT_Raster_Render_Func FT_Raster_RenderFunc - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Raster_Funcs */ - /* */ - /* <Description> */ - /* A structure used to describe a given raster class to the library. */ - /* */ - /* <Fields> */ - /* glyph_format :: The supported glyph format for this raster. */ - /* */ - /* raster_new :: The raster constructor. */ - /* */ - /* raster_reset :: Used to reset the render pool within the raster. */ - /* */ - /* raster_render :: A function to render a glyph into a given bitmap. */ - /* */ - /* raster_done :: The raster destructor. */ - /* */ - typedef struct FT_Raster_Funcs_ - { - FT_Glyph_Format glyph_format; - FT_Raster_NewFunc raster_new; - FT_Raster_ResetFunc raster_reset; - FT_Raster_SetModeFunc raster_set_mode; - FT_Raster_RenderFunc raster_render; - FT_Raster_DoneFunc raster_done; - - } FT_Raster_Funcs; - - /* */ - - -FT_END_HEADER - -#endif /* __FTIMAGE_H__ */ - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/3party/freetype/include/freetype/ftincrem.h b/3party/freetype/include/freetype/ftincrem.h deleted file mode 100644 index 840af25b05..0000000000 --- a/3party/freetype/include/freetype/ftincrem.h +++ /dev/null @@ -1,354 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftincrem.h */ -/* */ -/* FreeType incremental loading (specification). */ -/* */ -/* Copyright 2002-2015 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 __FTINCREM_H__ -#define __FTINCREM_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - /*************************************************************************** - * - * @section: - * incremental - * - * @title: - * Incremental Loading - * - * @abstract: - * Custom Glyph Loading. - * - * @description: - * This section contains various functions used to perform so-called - * `incremental' glyph loading. This is a mode where all glyphs loaded - * from a given @FT_Face are provided by the client application. - * - * Apart from that, all other tables are loaded normally from the font - * file. This mode is useful when FreeType is used within another - * engine, e.g., a PostScript Imaging Processor. - * - * To enable this mode, you must use @FT_Open_Face, passing an - * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an - * @FT_Incremental_Interface value. See the comments for - * @FT_Incremental_InterfaceRec for an example. - * - */ - - - /*************************************************************************** - * - * @type: - * FT_Incremental - * - * @description: - * An opaque type describing a user-provided object used to implement - * `incremental' glyph loading within FreeType. This is used to support - * embedded fonts in certain environments (e.g., PostScript interpreters), - * where the glyph data isn't in the font file, or must be overridden by - * different values. - * - * @note: - * It is up to client applications to create and implement @FT_Incremental - * objects, as long as they provide implementations for the methods - * @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc - * and @FT_Incremental_GetGlyphMetricsFunc. - * - * See the description of @FT_Incremental_InterfaceRec to understand how - * to use incremental objects with FreeType. - * - */ - typedef struct FT_IncrementalRec_* FT_Incremental; - - - /*************************************************************************** - * - * @struct: - * FT_Incremental_MetricsRec - * - * @description: - * A small structure used to contain the basic glyph metrics returned - * by the @FT_Incremental_GetGlyphMetricsFunc method. - * - * @fields: - * bearing_x :: - * Left bearing, in font units. - * - * bearing_y :: - * Top bearing, in font units. - * - * advance :: - * Horizontal component of glyph advance, in font units. - * - * advance_v :: - * Vertical component of glyph advance, in font units. - * - * @note: - * These correspond to horizontal or vertical metrics depending on the - * value of the `vertical' argument to the function - * @FT_Incremental_GetGlyphMetricsFunc. - * - */ - typedef struct FT_Incremental_MetricsRec_ - { - FT_Long bearing_x; - FT_Long bearing_y; - FT_Long advance; - FT_Long advance_v; /* since 2.3.12 */ - - } FT_Incremental_MetricsRec; - - - /*************************************************************************** - * - * @struct: - * FT_Incremental_Metrics - * - * @description: - * A handle to an @FT_Incremental_MetricsRec structure. - * - */ - typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics; - - - /*************************************************************************** - * - * @type: - * FT_Incremental_GetGlyphDataFunc - * - * @description: - * A function called by FreeType to access a given glyph's data bytes - * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is - * enabled. - * - * Note that the format of the glyph's data bytes depends on the font - * file format. For TrueType, it must correspond to the raw bytes within - * the `glyf' table. For PostScript formats, it must correspond to the - * *unencrypted* charstring bytes, without any `lenIV' header. It is - * undefined for any other format. - * - * @input: - * incremental :: - * Handle to an opaque @FT_Incremental handle provided by the client - * application. - * - * glyph_index :: - * Index of relevant glyph. - * - * @output: - * adata :: - * A structure describing the returned glyph data bytes (which will be - * accessed as a read-only byte block). - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * If this function returns successfully the method - * @FT_Incremental_FreeGlyphDataFunc will be called later to release - * the data bytes. - * - * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for - * compound glyphs. - * - */ - typedef FT_Error - (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental, - FT_UInt glyph_index, - FT_Data* adata ); - - - /*************************************************************************** - * - * @type: - * FT_Incremental_FreeGlyphDataFunc - * - * @description: - * A function used to release the glyph data bytes returned by a - * successful call to @FT_Incremental_GetGlyphDataFunc. - * - * @input: - * incremental :: - * A handle to an opaque @FT_Incremental handle provided by the client - * application. - * - * data :: - * A structure describing the glyph data bytes (which will be accessed - * as a read-only byte block). - * - */ - typedef void - (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental, - FT_Data* data ); - - - /*************************************************************************** - * - * @type: - * FT_Incremental_GetGlyphMetricsFunc - * - * @description: - * A function used to retrieve the basic metrics of a given glyph index - * before accessing its data. This is necessary because, in certain - * formats like TrueType, the metrics are stored in a different place from - * the glyph images proper. - * - * @input: - * incremental :: - * A handle to an opaque @FT_Incremental handle provided by the client - * application. - * - * glyph_index :: - * Index of relevant glyph. - * - * vertical :: - * If true, return vertical metrics. - * - * ametrics :: - * This parameter is used for both input and output. - * The original glyph metrics, if any, in font units. If metrics are - * not available all the values must be set to zero. - * - * @output: - * ametrics :: - * The replacement glyph metrics in font units. - * - */ - typedef FT_Error - (*FT_Incremental_GetGlyphMetricsFunc) - ( FT_Incremental incremental, - FT_UInt glyph_index, - FT_Bool vertical, - FT_Incremental_MetricsRec *ametrics ); - - - /************************************************************************** - * - * @struct: - * FT_Incremental_FuncsRec - * - * @description: - * A table of functions for accessing fonts that load data - * incrementally. Used in @FT_Incremental_InterfaceRec. - * - * @fields: - * get_glyph_data :: - * The function to get glyph data. Must not be null. - * - * free_glyph_data :: - * The function to release glyph data. Must not be null. - * - * get_glyph_metrics :: - * The function to get glyph metrics. May be null if the font does - * not provide overriding glyph metrics. - * - */ - typedef struct FT_Incremental_FuncsRec_ - { - FT_Incremental_GetGlyphDataFunc get_glyph_data; - FT_Incremental_FreeGlyphDataFunc free_glyph_data; - FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics; - - } FT_Incremental_FuncsRec; - - - /*************************************************************************** - * - * @struct: - * FT_Incremental_InterfaceRec - * - * @description: - * A structure to be used with @FT_Open_Face to indicate that the user - * wants to support incremental glyph loading. You should use it with - * @FT_PARAM_TAG_INCREMENTAL as in the following example: - * - * { - * FT_Incremental_InterfaceRec inc_int; - * FT_Parameter parameter; - * FT_Open_Args open_args; - * - * - * // set up incremental descriptor - * inc_int.funcs = my_funcs; - * inc_int.object = my_object; - * - * // set up optional parameter - * parameter.tag = FT_PARAM_TAG_INCREMENTAL; - * parameter.data = &inc_int; - * - * // set up FT_Open_Args structure - * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; - * open_args.pathname = my_font_pathname; - * open_args.num_params = 1; - * open_args.params = ¶meter; // we use one optional argument - * - * // open the font - * error = FT_Open_Face( library, &open_args, index, &face ); - * ... - * } - * - */ - typedef struct FT_Incremental_InterfaceRec_ - { - const FT_Incremental_FuncsRec* funcs; - FT_Incremental object; - - } FT_Incremental_InterfaceRec; - - - /*************************************************************************** - * - * @type: - * FT_Incremental_Interface - * - * @description: - * A pointer to an @FT_Incremental_InterfaceRec structure. - * - */ - typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface; - - - /*************************************************************************** - * - * @constant: - * FT_PARAM_TAG_INCREMENTAL - * - * @description: - * A constant used as the tag of @FT_Parameter structures to indicate - * an incremental loading object to be used by FreeType. - * - */ -#define FT_PARAM_TAG_INCREMENTAL FT_MAKE_TAG( 'i', 'n', 'c', 'r' ) - - /* */ - - -FT_END_HEADER - -#endif /* __FTINCREM_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftlcdfil.h b/3party/freetype/include/freetype/ftlcdfil.h deleted file mode 100644 index 4cd999a4b3..0000000000 --- a/3party/freetype/include/freetype/ftlcdfil.h +++ /dev/null @@ -1,251 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftlcdfil.h */ -/* */ -/* FreeType API for color filtering of subpixel bitmap glyphs */ -/* (specification). */ -/* */ -/* Copyright 2006-2015 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 __FT_LCD_FILTER_H__ -#define __FT_LCD_FILTER_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - /*************************************************************************** - * - * @section: - * lcd_filtering - * - * @title: - * LCD Filtering - * - * @abstract: - * Reduce color fringes of LCD-optimized bitmaps. - * - * @description: - * The @FT_Library_SetLcdFilter API can be used to specify a low-pass - * filter, which is then applied to LCD-optimized bitmaps generated - * through @FT_Render_Glyph. This is useful to reduce color fringes - * that would occur with unfiltered rendering. - * - * Note that no filter is active by default, and that this function is - * *not* implemented in default builds of the library. You need to - * #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file - * in order to activate it. - * - * FreeType generates alpha coverage maps, which are linear by nature. - * For instance, the value 0x80 in bitmap representation means that - * (within numerical precision) 0x80/0xFF fraction of that pixel is - * covered by the glyph's outline. The blending function for placing - * text over a background is - * - * { - * dst = alpha * src + (1 - alpha) * dst , - * } - * - * which is known as OVER. However, when calculating the output of the - * OVER operator, the source colors should first be transformed to a - * linear color space, then alpha blended in that space, and transformed - * back to the output color space. - * - * When linear light blending is used, the default FIR5 filtering - * weights (as given by FT_LCD_FILTER_DEFAULT) are no longer optimal, as - * they have been designed for black on white rendering while lacking - * gamma correction. To preserve color neutrality, weights for a FIR5 - * filter should be chosen according to two free parameters `a' and `c', - * and the FIR weights should be - * - * { - * [a - c, a + c, 2 * a, a + c, a - c] . - * } - * - * This formula generates equal weights for all the color primaries - * across the filter kernel, which makes it colorless. One suggested - * set of weights is - * - * { - * [0x10, 0x50, 0x60, 0x50, 0x10] , - * } - * - * where `a' has value 0x30 and `b' value 0x20. The weights in filter - * may have a sum larger than 0x100, which increases coloration slightly - * but also improves contrast. - */ - - - /**************************************************************************** - * - * @enum: - * FT_LcdFilter - * - * @description: - * A list of values to identify various types of LCD filters. - * - * @values: - * FT_LCD_FILTER_NONE :: - * Do not perform filtering. When used with subpixel rendering, this - * results in sometimes severe color fringes. - * - * FT_LCD_FILTER_DEFAULT :: - * The default filter reduces color fringes considerably, at the cost - * of a slight blurriness in the output. - * - * FT_LCD_FILTER_LIGHT :: - * The light filter is a variant that produces less blurriness at the - * cost of slightly more color fringes than the default one. It might - * be better, depending on taste, your monitor, or your personal vision. - * - * FT_LCD_FILTER_LEGACY :: - * This filter corresponds to the original libXft color filter. It - * provides high contrast output but can exhibit really bad color - * fringes if glyphs are not extremely well hinted to the pixel grid. - * In other words, it only works well if the TrueType bytecode - * interpreter is enabled *and* high-quality hinted fonts are used. - * - * This filter is only provided for comparison purposes, and might be - * disabled or stay unsupported in the future. - * - * @since: - * 2.3.0 - */ - typedef enum FT_LcdFilter_ - { - FT_LCD_FILTER_NONE = 0, - FT_LCD_FILTER_DEFAULT = 1, - FT_LCD_FILTER_LIGHT = 2, - FT_LCD_FILTER_LEGACY = 16, - - FT_LCD_FILTER_MAX /* do not remove */ - - } FT_LcdFilter; - - - /************************************************************************** - * - * @func: - * FT_Library_SetLcdFilter - * - * @description: - * This function is used to apply color filtering to LCD decimated - * bitmaps, like the ones used when calling @FT_Render_Glyph with - * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V. - * - * @input: - * library :: - * A handle to the target library instance. - * - * filter :: - * The filter type. - * - * You can use @FT_LCD_FILTER_NONE here to disable this feature, or - * @FT_LCD_FILTER_DEFAULT to use a default filter that should work - * well on most LCD screens. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This feature is always disabled by default. Clients must make an - * explicit call to this function with a `filter' value other than - * @FT_LCD_FILTER_NONE in order to enable it. - * - * Due to *PATENTS* covering subpixel rendering, this function doesn't - * do anything except returning `FT_Err_Unimplemented_Feature' if the - * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not - * defined in your build of the library, which should correspond to all - * default builds of FreeType. - * - * The filter affects glyph bitmaps rendered through @FT_Render_Glyph, - * @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char. - * - * It does _not_ affect the output of @FT_Outline_Render and - * @FT_Outline_Get_Bitmap. - * - * If this feature is activated, the dimensions of LCD glyph bitmaps are - * either larger or taller than the dimensions of the corresponding - * outline with regards to the pixel grid. For example, for - * @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and - * up to 3~pixels to the right. - * - * The bitmap offset values are adjusted correctly, so clients shouldn't - * need to modify their layout and glyph positioning code when enabling - * the filter. - * - * @since: - * 2.3.0 - */ - FT_EXPORT( FT_Error ) - FT_Library_SetLcdFilter( FT_Library library, - FT_LcdFilter filter ); - - - /************************************************************************** - * - * @func: - * FT_Library_SetLcdFilterWeights - * - * @description: - * Use this function to override the filter weights selected by - * @FT_Library_SetLcdFilter. By default, FreeType uses the quintuple - * (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10, - * 0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and - * FT_LCD_FILTER_LEGACY. - * - * @input: - * library :: - * A handle to the target library instance. - * - * weights :: - * A pointer to an array; the function copies the first five bytes and - * uses them to specify the filter weights. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * Due to *PATENTS* covering subpixel rendering, this function doesn't - * do anything except returning `FT_Err_Unimplemented_Feature' if the - * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not - * defined in your build of the library, which should correspond to all - * default builds of FreeType. - * - * This function must be called after @FT_Library_SetLcdFilter to have - * any effect. - * - * @since: - * 2.4.0 - */ - FT_EXPORT( FT_Error ) - FT_Library_SetLcdFilterWeights( FT_Library library, - unsigned char *weights ); - - /* */ - - -FT_END_HEADER - -#endif /* __FT_LCD_FILTER_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftlist.h b/3party/freetype/include/freetype/ftlist.h deleted file mode 100644 index 12b48c78f7..0000000000 --- a/3party/freetype/include/freetype/ftlist.h +++ /dev/null @@ -1,276 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftlist.h */ -/* */ -/* Generic list support for FreeType (specification). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file implements functions relative to list processing. Its */ - /* data structures are defined in `freetype.h'. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTLIST_H__ -#define __FTLIST_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* list_processing */ - /* */ - /* <Title> */ - /* List Processing */ - /* */ - /* <Abstract> */ - /* Simple management of lists. */ - /* */ - /* <Description> */ - /* This section contains various definitions related to list */ - /* processing using doubly-linked nodes. */ - /* */ - /* <Order> */ - /* FT_List */ - /* FT_ListNode */ - /* FT_ListRec */ - /* FT_ListNodeRec */ - /* */ - /* FT_List_Add */ - /* FT_List_Insert */ - /* FT_List_Find */ - /* FT_List_Remove */ - /* FT_List_Up */ - /* FT_List_Iterate */ - /* FT_List_Iterator */ - /* FT_List_Finalize */ - /* FT_List_Destructor */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Find */ - /* */ - /* <Description> */ - /* Find the list node for a given listed object. */ - /* */ - /* <Input> */ - /* list :: A pointer to the parent list. */ - /* data :: The address of the listed object. */ - /* */ - /* <Return> */ - /* List node. NULL if it wasn't found. */ - /* */ - FT_EXPORT( FT_ListNode ) - FT_List_Find( FT_List list, - void* data ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Add */ - /* */ - /* <Description> */ - /* Append an element to the end of a list. */ - /* */ - /* <InOut> */ - /* list :: A pointer to the parent list. */ - /* node :: The node to append. */ - /* */ - FT_EXPORT( void ) - FT_List_Add( FT_List list, - FT_ListNode node ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Insert */ - /* */ - /* <Description> */ - /* Insert an element at the head of a list. */ - /* */ - /* <InOut> */ - /* list :: A pointer to parent list. */ - /* node :: The node to insert. */ - /* */ - FT_EXPORT( void ) - FT_List_Insert( FT_List list, - FT_ListNode node ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Remove */ - /* */ - /* <Description> */ - /* Remove a node from a list. This function doesn't check whether */ - /* the node is in the list! */ - /* */ - /* <Input> */ - /* node :: The node to remove. */ - /* */ - /* <InOut> */ - /* list :: A pointer to the parent list. */ - /* */ - FT_EXPORT( void ) - FT_List_Remove( FT_List list, - FT_ListNode node ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Up */ - /* */ - /* <Description> */ - /* Move a node to the head/top of a list. Used to maintain LRU */ - /* lists. */ - /* */ - /* <InOut> */ - /* list :: A pointer to the parent list. */ - /* node :: The node to move. */ - /* */ - FT_EXPORT( void ) - FT_List_Up( FT_List list, - FT_ListNode node ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_List_Iterator */ - /* */ - /* <Description> */ - /* An FT_List iterator function that is called during a list parse */ - /* by @FT_List_Iterate. */ - /* */ - /* <Input> */ - /* node :: The current iteration list node. */ - /* */ - /* user :: A typeless pointer passed to @FT_List_Iterate. */ - /* Can be used to point to the iteration's state. */ - /* */ - typedef FT_Error - (*FT_List_Iterator)( FT_ListNode node, - void* user ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Iterate */ - /* */ - /* <Description> */ - /* Parse a list and calls a given iterator function on each element. */ - /* Note that parsing is stopped as soon as one of the iterator calls */ - /* returns a non-zero value. */ - /* */ - /* <Input> */ - /* list :: A handle to the list. */ - /* iterator :: An iterator function, called on each node of the list. */ - /* user :: A user-supplied field that is passed as the second */ - /* argument to the iterator. */ - /* */ - /* <Return> */ - /* The result (a FreeType error code) of the last iterator call. */ - /* */ - FT_EXPORT( FT_Error ) - FT_List_Iterate( FT_List list, - FT_List_Iterator iterator, - void* user ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_List_Destructor */ - /* */ - /* <Description> */ - /* An @FT_List iterator function that is called during a list */ - /* finalization by @FT_List_Finalize to destroy all elements in a */ - /* given list. */ - /* */ - /* <Input> */ - /* system :: The current system object. */ - /* */ - /* data :: The current object to destroy. */ - /* */ - /* user :: A typeless pointer passed to @FT_List_Iterate. It can */ - /* be used to point to the iteration's state. */ - /* */ - typedef void - (*FT_List_Destructor)( FT_Memory memory, - void* data, - void* user ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Finalize */ - /* */ - /* <Description> */ - /* Destroy all elements in the list as well as the list itself. */ - /* */ - /* <Input> */ - /* list :: A handle to the list. */ - /* */ - /* destroy :: A list destructor that will be applied to each element */ - /* of the list. Set this to NULL if not needed. */ - /* */ - /* memory :: The current memory object that handles deallocation. */ - /* */ - /* user :: A user-supplied field that is passed as the last */ - /* argument to the destructor. */ - /* */ - /* <Note> */ - /* This function expects that all nodes added by @FT_List_Add or */ - /* @FT_List_Insert have been dynamically allocated. */ - /* */ - FT_EXPORT( void ) - FT_List_Finalize( FT_List list, - FT_List_Destructor destroy, - FT_Memory memory, - void* user ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTLIST_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftlzw.h b/3party/freetype/include/freetype/ftlzw.h deleted file mode 100644 index d3ec28e554..0000000000 --- a/3party/freetype/include/freetype/ftlzw.h +++ /dev/null @@ -1,99 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftlzw.h */ -/* */ -/* LZW-compressed stream support. */ -/* */ -/* Copyright 2004-2015 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 __FTLZW_H__ -#define __FTLZW_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - /*************************************************************************/ - /* */ - /* <Section> */ - /* lzw */ - /* */ - /* <Title> */ - /* LZW Streams */ - /* */ - /* <Abstract> */ - /* Using LZW-compressed font files. */ - /* */ - /* <Description> */ - /* This section contains the declaration of LZW-specific functions. */ - /* */ - /*************************************************************************/ - - /************************************************************************ - * - * @function: - * FT_Stream_OpenLZW - * - * @description: - * Open a new stream to parse LZW-compressed font files. This is - * mainly used to support the compressed `*.pcf.Z' fonts that come - * with XFree86. - * - * @input: - * stream :: The target embedding stream. - * - * source :: The source stream. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The source stream must be opened _before_ calling this function. - * - * Calling the internal function `FT_Stream_Close' on the new stream will - * *not* call `FT_Stream_Close' on the source stream. None of the stream - * objects will be released to the heap. - * - * The stream implementation is very basic and resets the decompression - * process each time seeking backwards is needed within the stream - * - * In certain builds of the library, LZW compression recognition is - * automatically handled when calling @FT_New_Face or @FT_Open_Face. - * This means that if no font driver is capable of handling the raw - * compressed file, the library will try to open a LZW stream from it - * and re-open the face with it. - * - * This function may return `FT_Err_Unimplemented_Feature' if your build - * of FreeType was not compiled with LZW support. - */ - FT_EXPORT( FT_Error ) - FT_Stream_OpenLZW( FT_Stream stream, - FT_Stream source ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTLZW_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftmac.h b/3party/freetype/include/freetype/ftmac.h deleted file mode 100644 index 14c55cfe2b..0000000000 --- a/3party/freetype/include/freetype/ftmac.h +++ /dev/null @@ -1,274 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmac.h */ -/* */ -/* Additional Mac-specific API. */ -/* */ -/* Copyright 1996-2015 by */ -/* Just van Rossum, 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. */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* NOTE: Include this file after FT_FREETYPE_H and after any */ -/* Mac-specific headers (because this header uses Mac types such as */ -/* Handle, FSSpec, FSRef, etc.) */ -/* */ -/***************************************************************************/ - - -#ifndef __FTMAC_H__ -#define __FTMAC_H__ - - -#include <ft2build.h> - - -FT_BEGIN_HEADER - - -/* gcc-3.4.1 and later can warn about functions tagged as deprecated */ -#ifndef FT_DEPRECATED_ATTRIBUTE -#if defined(__GNUC__) && \ - ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))) -#define FT_DEPRECATED_ATTRIBUTE __attribute__((deprecated)) -#else -#define FT_DEPRECATED_ATTRIBUTE -#endif -#endif - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* mac_specific */ - /* */ - /* <Title> */ - /* Mac Specific Interface */ - /* */ - /* <Abstract> */ - /* Only available on the Macintosh. */ - /* */ - /* <Description> */ - /* The following definitions are only available if FreeType is */ - /* compiled on a Macintosh. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Face_From_FOND */ - /* */ - /* <Description> */ - /* Create a new face object from a FOND resource. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library resource. */ - /* */ - /* <Input> */ - /* fond :: A FOND resource. */ - /* */ - /* face_index :: Only supported for the -1 `sanity check' special */ - /* case. */ - /* */ - /* <Output> */ - /* aface :: A handle to a new face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Notes> */ - /* This function can be used to create @FT_Face objects from fonts */ - /* that are installed in the system as follows. */ - /* */ - /* { */ - /* fond = GetResource( 'FOND', fontName ); */ - /* error = FT_New_Face_From_FOND( library, fond, 0, &face ); */ - /* } */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Face_From_FOND( FT_Library library, - Handle fond, - FT_Long face_index, - FT_Face *aface ) - FT_DEPRECATED_ATTRIBUTE; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_GetFile_From_Mac_Name */ - /* */ - /* <Description> */ - /* Return an FSSpec for the disk file containing the named font. */ - /* */ - /* <Input> */ - /* fontName :: Mac OS name of the font (e.g., Times New Roman */ - /* Bold). */ - /* */ - /* <Output> */ - /* pathSpec :: FSSpec to the file. For passing to */ - /* @FT_New_Face_From_FSSpec. */ - /* */ - /* face_index :: Index of the face. For passing to */ - /* @FT_New_Face_From_FSSpec. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_GetFile_From_Mac_Name( const char* fontName, - FSSpec* pathSpec, - FT_Long* face_index ) - FT_DEPRECATED_ATTRIBUTE; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_GetFile_From_Mac_ATS_Name */ - /* */ - /* <Description> */ - /* Return an FSSpec for the disk file containing the named font. */ - /* */ - /* <Input> */ - /* fontName :: Mac OS name of the font in ATS framework. */ - /* */ - /* <Output> */ - /* pathSpec :: FSSpec to the file. For passing to */ - /* @FT_New_Face_From_FSSpec. */ - /* */ - /* face_index :: Index of the face. For passing to */ - /* @FT_New_Face_From_FSSpec. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_GetFile_From_Mac_ATS_Name( const char* fontName, - FSSpec* pathSpec, - FT_Long* face_index ) - FT_DEPRECATED_ATTRIBUTE; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_GetFilePath_From_Mac_ATS_Name */ - /* */ - /* <Description> */ - /* Return a pathname of the disk file and face index for given font */ - /* name that is handled by ATS framework. */ - /* */ - /* <Input> */ - /* fontName :: Mac OS name of the font in ATS framework. */ - /* */ - /* <Output> */ - /* path :: Buffer to store pathname of the file. For passing */ - /* to @FT_New_Face. The client must allocate this */ - /* buffer before calling this function. */ - /* */ - /* maxPathSize :: Lengths of the buffer `path' that client allocated. */ - /* */ - /* face_index :: Index of the face. For passing to @FT_New_Face. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, - UInt8* path, - UInt32 maxPathSize, - FT_Long* face_index ) - FT_DEPRECATED_ATTRIBUTE; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Face_From_FSSpec */ - /* */ - /* <Description> */ - /* Create a new face object from a given resource and typeface index */ - /* using an FSSpec to the font file. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library resource. */ - /* */ - /* <Input> */ - /* spec :: FSSpec to the font file. */ - /* */ - /* face_index :: The index of the face within the resource. The */ - /* first face has index~0. */ - /* <Output> */ - /* aface :: A handle to a new face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* @FT_New_Face_From_FSSpec is identical to @FT_New_Face except */ - /* it accepts an FSSpec instead of a path. */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Face_From_FSSpec( FT_Library library, - const FSSpec *spec, - FT_Long face_index, - FT_Face *aface ) - FT_DEPRECATED_ATTRIBUTE; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Face_From_FSRef */ - /* */ - /* <Description> */ - /* Create a new face object from a given resource and typeface index */ - /* using an FSRef to the font file. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library resource. */ - /* */ - /* <Input> */ - /* spec :: FSRef to the font file. */ - /* */ - /* face_index :: The index of the face within the resource. The */ - /* first face has index~0. */ - /* <Output> */ - /* aface :: A handle to a new face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* @FT_New_Face_From_FSRef is identical to @FT_New_Face except */ - /* it accepts an FSRef instead of a path. */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Face_From_FSRef( FT_Library library, - const FSRef *ref, - FT_Long face_index, - FT_Face *aface ) - FT_DEPRECATED_ATTRIBUTE; - - /* */ - - -FT_END_HEADER - - -#endif /* __FTMAC_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftmm.h b/3party/freetype/include/freetype/ftmm.h deleted file mode 100644 index 6ef47987e6..0000000000 --- a/3party/freetype/include/freetype/ftmm.h +++ /dev/null @@ -1,379 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmm.h */ -/* */ -/* FreeType Multiple Master font interface (specification). */ -/* */ -/* Copyright 1996-2015 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 __FTMM_H__ -#define __FTMM_H__ - - -#include <ft2build.h> -#include FT_TYPE1_TABLES_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* multiple_masters */ - /* */ - /* <Title> */ - /* Multiple Masters */ - /* */ - /* <Abstract> */ - /* How to manage Multiple Masters fonts. */ - /* */ - /* <Description> */ - /* The following types and functions are used to manage Multiple */ - /* Master fonts, i.e., the selection of specific design instances by */ - /* setting design axis coordinates. */ - /* */ - /* George Williams has extended this interface to make it work with */ - /* both Type~1 Multiple Masters fonts and GX distortable (var) */ - /* fonts. Some of these routines only work with MM fonts, others */ - /* will work with both types. They are similar enough that a */ - /* consistent interface makes sense. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_MM_Axis */ - /* */ - /* <Description> */ - /* A simple structure used to model a given axis in design space for */ - /* Multiple Masters fonts. */ - /* */ - /* This structure can't be used for GX var fonts. */ - /* */ - /* <Fields> */ - /* name :: The axis's name. */ - /* */ - /* minimum :: The axis's minimum design coordinate. */ - /* */ - /* maximum :: The axis's maximum design coordinate. */ - /* */ - typedef struct FT_MM_Axis_ - { - FT_String* name; - FT_Long minimum; - FT_Long maximum; - - } FT_MM_Axis; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Multi_Master */ - /* */ - /* <Description> */ - /* A structure used to model the axes and space of a Multiple Masters */ - /* font. */ - /* */ - /* This structure can't be used for GX var fonts. */ - /* */ - /* <Fields> */ - /* num_axis :: Number of axes. Cannot exceed~4. */ - /* */ - /* num_designs :: Number of designs; should be normally 2^num_axis */ - /* even though the Type~1 specification strangely */ - /* allows for intermediate designs to be present. */ - /* This number cannot exceed~16. */ - /* */ - /* axis :: A table of axis descriptors. */ - /* */ - typedef struct FT_Multi_Master_ - { - FT_UInt num_axis; - FT_UInt num_designs; - FT_MM_Axis axis[T1_MAX_MM_AXIS]; - - } FT_Multi_Master; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Var_Axis */ - /* */ - /* <Description> */ - /* A simple structure used to model a given axis in design space for */ - /* Multiple Masters and GX var fonts. */ - /* */ - /* <Fields> */ - /* name :: The axis's name. */ - /* Not always meaningful for GX. */ - /* */ - /* minimum :: The axis's minimum design coordinate. */ - /* */ - /* def :: The axis's default design coordinate. */ - /* FreeType computes meaningful default values for MM; it */ - /* is then an integer value, not in 16.16 format. */ - /* */ - /* maximum :: The axis's maximum design coordinate. */ - /* */ - /* tag :: The axis's tag (the GX equivalent to `name'). */ - /* FreeType provides default values for MM if possible. */ - /* */ - /* strid :: The entry in `name' table (another GX version of */ - /* `name'). */ - /* Not meaningful for MM. */ - /* */ - typedef struct FT_Var_Axis_ - { - FT_String* name; - - FT_Fixed minimum; - FT_Fixed def; - FT_Fixed maximum; - - FT_ULong tag; - FT_UInt strid; - - } FT_Var_Axis; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Var_Named_Style */ - /* */ - /* <Description> */ - /* A simple structure used to model a named style in a GX var font. */ - /* */ - /* This structure can't be used for MM fonts. */ - /* */ - /* <Fields> */ - /* coords :: The design coordinates for this style. */ - /* This is an array with one entry for each axis. */ - /* */ - /* strid :: The entry in `name' table identifying this style. */ - /* */ - typedef struct FT_Var_Named_Style_ - { - FT_Fixed* coords; - FT_UInt strid; - - } FT_Var_Named_Style; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_MM_Var */ - /* */ - /* <Description> */ - /* A structure used to model the axes and space of a Multiple Masters */ - /* or GX var distortable font. */ - /* */ - /* Some fields are specific to one format and not to the other. */ - /* */ - /* <Fields> */ - /* num_axis :: The number of axes. The maximum value is~4 for */ - /* MM; no limit in GX. */ - /* */ - /* num_designs :: The number of designs; should be normally */ - /* 2^num_axis for MM fonts. Not meaningful for GX */ - /* (where every glyph could have a different */ - /* number of designs). */ - /* */ - /* num_namedstyles :: The number of named styles; only meaningful for */ - /* GX that allows certain design coordinates to */ - /* have a string ID (in the `name' table) */ - /* associated with them. The font can tell the */ - /* user that, for example, Weight=1.5 is `Bold'. */ - /* */ - /* axis :: An axis descriptor table. */ - /* GX fonts contain slightly more data than MM. */ - /* */ - /* namedstyle :: A named style table. */ - /* Only meaningful with GX. */ - /* */ - typedef struct FT_MM_Var_ - { - FT_UInt num_axis; - FT_UInt num_designs; - FT_UInt num_namedstyles; - FT_Var_Axis* axis; - FT_Var_Named_Style* namedstyle; - - } FT_MM_Var; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Multi_Master */ - /* */ - /* <Description> */ - /* Retrieve the Multiple Master descriptor of a given font. */ - /* */ - /* This function can't be used with GX fonts. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face. */ - /* */ - /* <Output> */ - /* amaster :: The Multiple Masters descriptor. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Multi_Master( FT_Face face, - FT_Multi_Master *amaster ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_MM_Var */ - /* */ - /* <Description> */ - /* Retrieve the Multiple Master/GX var descriptor of a given font. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face. */ - /* */ - /* <Output> */ - /* amaster :: The Multiple Masters/GX var descriptor. */ - /* Allocates a data structure, which the user must free. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_MM_Var( FT_Face face, - FT_MM_Var* *amaster ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_MM_Design_Coordinates */ - /* */ - /* <Description> */ - /* For Multiple Masters fonts, choose an interpolated font design */ - /* through design coordinates. */ - /* */ - /* This function can't be used with GX fonts. */ - /* */ - /* <InOut> */ - /* face :: A handle to the source face. */ - /* */ - /* <Input> */ - /* num_coords :: The number of available design coordinates. If it */ - /* is larger than the number of axes, ignore the excess */ - /* values. If it is smaller than the number of axes, */ - /* use default values for the remaining axes. */ - /* */ - /* coords :: An array of design coordinates. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_MM_Design_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Var_Design_Coordinates */ - /* */ - /* <Description> */ - /* For Multiple Master or GX Var fonts, choose an interpolated font */ - /* design through design coordinates. */ - /* */ - /* <InOut> */ - /* face :: A handle to the source face. */ - /* */ - /* <Input> */ - /* num_coords :: The number of available design coordinates. If it */ - /* is larger than the number of axes, ignore the excess */ - /* values. If it is smaller than the number of axes, */ - /* use default values for the remaining axes. */ - /* */ - /* coords :: An array of design coordinates. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_Var_Design_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_MM_Blend_Coordinates */ - /* */ - /* <Description> */ - /* For Multiple Masters and GX var fonts, choose an interpolated font */ - /* design through normalized blend coordinates. */ - /* */ - /* <InOut> */ - /* face :: A handle to the source face. */ - /* */ - /* <Input> */ - /* num_coords :: The number of available design coordinates. If it */ - /* is larger than the number of axes, ignore the excess */ - /* values. If it is smaller than the number of axes, */ - /* use default values for the remaining axes. */ - /* */ - /* coords :: The design coordinates array (each element must be */ - /* between 0 and 1.0). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_MM_Blend_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Var_Blend_Coordinates */ - /* */ - /* <Description> */ - /* This is another name of @FT_Set_MM_Blend_Coordinates. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_Var_Blend_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTMM_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftmodapi.h b/3party/freetype/include/freetype/ftmodapi.h deleted file mode 100644 index 544279a68a..0000000000 --- a/3party/freetype/include/freetype/ftmodapi.h +++ /dev/null @@ -1,669 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmodapi.h */ -/* */ -/* FreeType modules public interface (specification). */ -/* */ -/* Copyright 1996-2015 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 __FTMODAPI_H__ -#define __FTMODAPI_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* module_management */ - /* */ - /* <Title> */ - /* Module Management */ - /* */ - /* <Abstract> */ - /* How to add, upgrade, remove, and control modules from FreeType. */ - /* */ - /* <Description> */ - /* The definitions below are used to manage modules within FreeType. */ - /* Modules can be added, upgraded, and removed at runtime. */ - /* Additionally, some module properties can be controlled also. */ - /* */ - /* Here is a list of possible values of the `module_name' field in */ - /* the @FT_Module_Class structure. */ - /* */ - /* { */ - /* autofitter */ - /* bdf */ - /* cff */ - /* gxvalid */ - /* otvalid */ - /* pcf */ - /* pfr */ - /* psaux */ - /* pshinter */ - /* psnames */ - /* raster1 */ - /* sfnt */ - /* smooth, smooth-lcd, smooth-lcdv */ - /* truetype */ - /* type1 */ - /* type42 */ - /* t1cid */ - /* winfonts */ - /* } */ - /* */ - /* Note that the FreeType Cache sub-system is not a FreeType module. */ - /* */ - /* <Order> */ - /* FT_Module */ - /* FT_Module_Constructor */ - /* FT_Module_Destructor */ - /* FT_Module_Requester */ - /* FT_Module_Class */ - /* */ - /* FT_Add_Module */ - /* FT_Get_Module */ - /* FT_Remove_Module */ - /* FT_Add_Default_Modules */ - /* */ - /* FT_Property_Set */ - /* FT_Property_Get */ - /* */ - /* FT_New_Library */ - /* FT_Done_Library */ - /* FT_Reference_Library */ - /* */ - /* FT_Renderer */ - /* FT_Renderer_Class */ - /* */ - /* FT_Get_Renderer */ - /* FT_Set_Renderer */ - /* */ - /* FT_Set_Debug_Hook */ - /* */ - /*************************************************************************/ - - - /* module bit flags */ -#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */ -#define FT_MODULE_RENDERER 2 /* this module is a renderer */ -#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */ -#define FT_MODULE_STYLER 8 /* this module is a styler */ - -#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */ - /* scalable fonts */ -#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */ - /* support vector outlines */ -#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */ - /* own hinter */ - - - /* deprecated values */ -#define ft_module_font_driver FT_MODULE_FONT_DRIVER -#define ft_module_renderer FT_MODULE_RENDERER -#define ft_module_hinter FT_MODULE_HINTER -#define ft_module_styler FT_MODULE_STYLER - -#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE -#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES -#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER - - - typedef FT_Pointer FT_Module_Interface; - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Module_Constructor */ - /* */ - /* <Description> */ - /* A function used to initialize (not create) a new module object. */ - /* */ - /* <Input> */ - /* module :: The module to initialize. */ - /* */ - typedef FT_Error - (*FT_Module_Constructor)( FT_Module module ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Module_Destructor */ - /* */ - /* <Description> */ - /* A function used to finalize (not destroy) a given module object. */ - /* */ - /* <Input> */ - /* module :: The module to finalize. */ - /* */ - typedef void - (*FT_Module_Destructor)( FT_Module module ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Module_Requester */ - /* */ - /* <Description> */ - /* A function used to query a given module for a specific interface. */ - /* */ - /* <Input> */ - /* module :: The module to be searched. */ - /* */ - /* name :: The name of the interface in the module. */ - /* */ - typedef FT_Module_Interface - (*FT_Module_Requester)( FT_Module module, - const char* name ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Module_Class */ - /* */ - /* <Description> */ - /* The module class descriptor. */ - /* */ - /* <Fields> */ - /* module_flags :: Bit flags describing the module. */ - /* */ - /* module_size :: The size of one module object/instance in */ - /* bytes. */ - /* */ - /* module_name :: The name of the module. */ - /* */ - /* module_version :: The version, as a 16.16 fixed number */ - /* (major.minor). */ - /* */ - /* module_requires :: The version of FreeType this module requires, */ - /* as a 16.16 fixed number (major.minor). Starts */ - /* at version 2.0, i.e., 0x20000. */ - /* */ - /* module_init :: The initializing function. */ - /* */ - /* module_done :: The finalizing function. */ - /* */ - /* get_interface :: The interface requesting function. */ - /* */ - typedef struct FT_Module_Class_ - { - FT_ULong module_flags; - FT_Long module_size; - const FT_String* module_name; - FT_Fixed module_version; - FT_Fixed module_requires; - - const void* module_interface; - - FT_Module_Constructor module_init; - FT_Module_Destructor module_done; - FT_Module_Requester get_interface; - - } FT_Module_Class; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Add_Module */ - /* */ - /* <Description> */ - /* Add a new module to a given library instance. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library object. */ - /* */ - /* <Input> */ - /* clazz :: A pointer to class descriptor for the module. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* An error will be returned if a module already exists by that name, */ - /* or if the module requires a version of FreeType that is too great. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Add_Module( FT_Library library, - const FT_Module_Class* clazz ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Module */ - /* */ - /* <Description> */ - /* Find a module by its name. */ - /* */ - /* <Input> */ - /* library :: A handle to the library object. */ - /* */ - /* module_name :: The module's name (as an ASCII string). */ - /* */ - /* <Return> */ - /* A module handle. 0~if none was found. */ - /* */ - /* <Note> */ - /* FreeType's internal modules aren't documented very well, and you */ - /* should look up the source code for details. */ - /* */ - FT_EXPORT( FT_Module ) - FT_Get_Module( FT_Library library, - const char* module_name ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Remove_Module */ - /* */ - /* <Description> */ - /* Remove a given module from a library instance. */ - /* */ - /* <InOut> */ - /* library :: A handle to a library object. */ - /* */ - /* <Input> */ - /* module :: A handle to a module object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The module object is destroyed by the function in case of success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Remove_Module( FT_Library library, - FT_Module module ); - - - /********************************************************************** - * - * @function: - * FT_Property_Set - * - * @description: - * Set a property for a given module. - * - * @input: - * library :: - * A handle to the library the module is part of. - * - * module_name :: - * The module name. - * - * property_name :: - * The property name. Properties are described in the `Synopsis' - * subsection of the module's documentation. - * - * Note that only a few modules have properties. - * - * value :: - * A generic pointer to a variable or structure that gives the new - * value of the property. The exact definition of `value' is - * dependent on the property; see the `Synopsis' subsection of the - * module's documentation. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * If `module_name' isn't a valid module name, or `property_name' - * doesn't specify a valid property, or if `value' doesn't represent a - * valid value for the given property, an error is returned. - * - * The following example sets property `bar' (a simple integer) in - * module `foo' to value~1. - * - * { - * FT_UInt bar; - * - * - * bar = 1; - * FT_Property_Set( library, "foo", "bar", &bar ); - * } - * - * Note that the FreeType Cache sub-system doesn't recognize module - * property changes. To avoid glyph lookup confusion within the cache - * you should call @FTC_Manager_Reset to completely flush the cache if - * a module property gets changed after @FTC_Manager_New has been - * called. - * - * It is not possible to set properties of the FreeType Cache - * sub-system itself with FT_Property_Set; use @FTC_Property_Set - * instead. - * - * @since: - * 2.4.11 - * - */ - FT_EXPORT( FT_Error ) - FT_Property_Set( FT_Library library, - const FT_String* module_name, - const FT_String* property_name, - const void* value ); - - - /********************************************************************** - * - * @function: - * FT_Property_Get - * - * @description: - * Get a module's property value. - * - * @input: - * library :: - * A handle to the library the module is part of. - * - * module_name :: - * The module name. - * - * property_name :: - * The property name. Properties are described in the `Synopsis' - * subsection of the module's documentation. - * - * @inout: - * value :: - * A generic pointer to a variable or structure that gives the - * value of the property. The exact definition of `value' is - * dependent on the property; see the `Synopsis' subsection of the - * module's documentation. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * If `module_name' isn't a valid module name, or `property_name' - * doesn't specify a valid property, or if `value' doesn't represent a - * valid value for the given property, an error is returned. - * - * The following example gets property `baz' (a range) in module `foo'. - * - * { - * typedef range_ - * { - * FT_Int32 min; - * FT_Int32 max; - * - * } range; - * - * range baz; - * - * - * FT_Property_Get( library, "foo", "baz", &baz ); - * } - * - * It is not possible to retrieve properties of the FreeType Cache - * sub-system with FT_Property_Get; use @FTC_Property_Get instead. - * - * @since: - * 2.4.11 - * - */ - FT_EXPORT( FT_Error ) - FT_Property_Get( FT_Library library, - const FT_String* module_name, - const FT_String* property_name, - void* value ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Reference_Library */ - /* */ - /* <Description> */ - /* A counter gets initialized to~1 at the time an @FT_Library */ - /* structure is created. This function increments the counter. */ - /* @FT_Done_Library then only destroys a library if the counter is~1, */ - /* otherwise it simply decrements the counter. */ - /* */ - /* This function helps in managing life-cycles of structures that */ - /* reference @FT_Library objects. */ - /* */ - /* <Input> */ - /* library :: A handle to a target library object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Since> */ - /* 2.4.2 */ - /* */ - FT_EXPORT( FT_Error ) - FT_Reference_Library( FT_Library library ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Library */ - /* */ - /* <Description> */ - /* This function is used to create a new FreeType library instance */ - /* from a given memory object. It is thus possible to use libraries */ - /* with distinct memory allocators within the same program. Note, */ - /* however, that the used @FT_Memory structure is expected to remain */ - /* valid for the life of the @FT_Library object. */ - /* */ - /* Normally, you would call this function (followed by a call to */ - /* @FT_Add_Default_Modules or a series of calls to @FT_Add_Module) */ - /* instead of @FT_Init_FreeType to initialize the FreeType library. */ - /* */ - /* Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a */ - /* library instance. */ - /* */ - /* <Input> */ - /* memory :: A handle to the original memory object. */ - /* */ - /* <Output> */ - /* alibrary :: A pointer to handle of a new library object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* See the discussion of reference counters in the description of */ - /* @FT_Reference_Library. */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Library( FT_Memory memory, - FT_Library *alibrary ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_Library */ - /* */ - /* <Description> */ - /* Discard a given library object. This closes all drivers and */ - /* discards all resource objects. */ - /* */ - /* <Input> */ - /* library :: A handle to the target library. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* See the discussion of reference counters in the description of */ - /* @FT_Reference_Library. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Done_Library( FT_Library library ); - - /* */ - - typedef void - (*FT_DebugHook_Func)( void* arg ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Debug_Hook */ - /* */ - /* <Description> */ - /* Set a debug hook function for debugging the interpreter of a font */ - /* format. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library object. */ - /* */ - /* <Input> */ - /* hook_index :: The index of the debug hook. You should use the */ - /* values defined in `ftobjs.h', e.g., */ - /* `FT_DEBUG_HOOK_TRUETYPE'. */ - /* */ - /* debug_hook :: The function used to debug the interpreter. */ - /* */ - /* <Note> */ - /* Currently, four debug hook slots are available, but only two (for */ - /* the TrueType and the Type~1 interpreter) are defined. */ - /* */ - /* Since the internal headers of FreeType are no longer installed, */ - /* the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly. */ - /* This is a bug and will be fixed in a forthcoming release. */ - /* */ - FT_EXPORT( void ) - FT_Set_Debug_Hook( FT_Library library, - FT_UInt hook_index, - FT_DebugHook_Func debug_hook ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Add_Default_Modules */ - /* */ - /* <Description> */ - /* Add the set of default drivers to a given library object. */ - /* This is only useful when you create a library object with */ - /* @FT_New_Library (usually to plug a custom memory manager). */ - /* */ - /* <InOut> */ - /* library :: A handle to a new library object. */ - /* */ - FT_EXPORT( void ) - FT_Add_Default_Modules( FT_Library library ); - - - - /************************************************************************** - * - * @section: - * truetype_engine - * - * @title: - * The TrueType Engine - * - * @abstract: - * TrueType bytecode support. - * - * @description: - * This section contains a function used to query the level of TrueType - * bytecode support compiled in this version of the library. - * - */ - - - /************************************************************************** - * - * @enum: - * FT_TrueTypeEngineType - * - * @description: - * A list of values describing which kind of TrueType bytecode - * engine is implemented in a given FT_Library instance. It is used - * by the @FT_Get_TrueType_Engine_Type function. - * - * @values: - * FT_TRUETYPE_ENGINE_TYPE_NONE :: - * The library doesn't implement any kind of bytecode interpreter. - * - * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED :: - * The library implements a bytecode interpreter that doesn't - * support the patented operations of the TrueType virtual machine. - * - * Its main use is to load certain Asian fonts that position and - * scale glyph components with bytecode instructions. It produces - * bad output for most other fonts. - * - * FT_TRUETYPE_ENGINE_TYPE_PATENTED :: - * The library implements a bytecode interpreter that covers - * the full instruction set of the TrueType virtual machine (this - * was governed by patents until May 2010, hence the name). - * - * @since: - * 2.2 - * - */ - typedef enum FT_TrueTypeEngineType_ - { - FT_TRUETYPE_ENGINE_TYPE_NONE = 0, - FT_TRUETYPE_ENGINE_TYPE_UNPATENTED, - FT_TRUETYPE_ENGINE_TYPE_PATENTED - - } FT_TrueTypeEngineType; - - - /************************************************************************** - * - * @func: - * FT_Get_TrueType_Engine_Type - * - * @description: - * Return an @FT_TrueTypeEngineType value to indicate which level of - * the TrueType virtual machine a given library instance supports. - * - * @input: - * library :: - * A library instance. - * - * @return: - * A value indicating which level is supported. - * - * @since: - * 2.2 - * - */ - FT_EXPORT( FT_TrueTypeEngineType ) - FT_Get_TrueType_Engine_Type( FT_Library library ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTMODAPI_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftmoderr.h b/3party/freetype/include/freetype/ftmoderr.h deleted file mode 100644 index 9d7f981409..0000000000 --- a/3party/freetype/include/freetype/ftmoderr.h +++ /dev/null @@ -1,194 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmoderr.h */ -/* */ -/* FreeType module error offsets (specification). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the FreeType module error codes. */ - /* */ - /* If the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in `ftoption.h' is */ - /* set, the lower byte of an error value identifies the error code as */ - /* usual. In addition, the higher byte identifies the module. For */ - /* example, the error `FT_Err_Invalid_File_Format' has value 0x0003, the */ - /* error `TT_Err_Invalid_File_Format' has value 0x1303, the error */ - /* `T1_Err_Invalid_File_Format' has value 0x1403, etc. */ - /* */ - /* Note that `FT_Err_Ok', `TT_Err_Ok', etc. are always equal to zero, */ - /* including the high byte. */ - /* */ - /* If FT_CONFIG_OPTION_USE_MODULE_ERRORS isn't set, the higher byte of */ - /* an error value is set to zero. */ - /* */ - /* To hide the various `XXX_Err_' prefixes in the source code, FreeType */ - /* provides some macros in `fttypes.h'. */ - /* */ - /* FT_ERR( err ) */ - /* Add current error module prefix (as defined with the */ - /* `FT_ERR_PREFIX' macro) to `err'. For example, in the BDF module */ - /* the line */ - /* */ - /* error = FT_ERR( Invalid_Outline ); */ - /* */ - /* expands to */ - /* */ - /* error = BDF_Err_Invalid_Outline; */ - /* */ - /* For simplicity, you can always use `FT_Err_Ok' directly instead */ - /* of `FT_ERR( Ok )'. */ - /* */ - /* FT_ERR_EQ( errcode, err ) */ - /* FT_ERR_NEQ( errcode, err ) */ - /* Compare error code `errcode' with the error `err' for equality */ - /* and inequality, respectively. Example: */ - /* */ - /* if ( FT_ERR_EQ( error, Invalid_Outline ) ) */ - /* ... */ - /* */ - /* Using this macro you don't have to think about error prefixes. */ - /* Of course, if module errors are not active, the above example is */ - /* the same as */ - /* */ - /* if ( error == FT_Err_Invalid_Outline ) */ - /* ... */ - /* */ - /* FT_ERROR_BASE( errcode ) */ - /* FT_ERROR_MODULE( errcode ) */ - /* Get base error and module error code, respectively. */ - /* */ - /* */ - /* It can also be used to create a module error message table easily */ - /* with something like */ - /* */ - /* { */ - /* #undef __FTMODERR_H__ */ - /* #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, */ - /* #define FT_MODERR_START_LIST { */ - /* #define FT_MODERR_END_LIST { 0, 0 } }; */ - /* */ - /* const struct */ - /* { */ - /* int mod_err_offset; */ - /* const char* mod_err_msg */ - /* } ft_mod_errors[] = */ - /* */ - /* #include FT_MODULE_ERRORS_H */ - /* } */ - /* */ - /*************************************************************************/ - - -#ifndef __FTMODERR_H__ -#define __FTMODERR_H__ - - - /*******************************************************************/ - /*******************************************************************/ - /***** *****/ - /***** SETUP MACROS *****/ - /***** *****/ - /*******************************************************************/ - /*******************************************************************/ - - -#undef FT_NEED_EXTERN_C - -#ifndef FT_MODERRDEF - -#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS -#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v, -#else -#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0, -#endif - -#define FT_MODERR_START_LIST enum { -#define FT_MODERR_END_LIST FT_Mod_Err_Max }; - -#ifdef __cplusplus -#define FT_NEED_EXTERN_C - extern "C" { -#endif - -#endif /* !FT_MODERRDEF */ - - - /*******************************************************************/ - /*******************************************************************/ - /***** *****/ - /***** LIST MODULE ERROR BASES *****/ - /***** *****/ - /*******************************************************************/ - /*******************************************************************/ - - -#ifdef FT_MODERR_START_LIST - FT_MODERR_START_LIST -#endif - - - FT_MODERRDEF( Base, 0x000, "base module" ) - FT_MODERRDEF( Autofit, 0x100, "autofitter module" ) - FT_MODERRDEF( BDF, 0x200, "BDF module" ) - FT_MODERRDEF( Bzip2, 0x300, "Bzip2 module" ) - FT_MODERRDEF( Cache, 0x400, "cache module" ) - FT_MODERRDEF( CFF, 0x500, "CFF module" ) - FT_MODERRDEF( CID, 0x600, "CID module" ) - FT_MODERRDEF( Gzip, 0x700, "Gzip module" ) - FT_MODERRDEF( LZW, 0x800, "LZW module" ) - FT_MODERRDEF( OTvalid, 0x900, "OpenType validation module" ) - FT_MODERRDEF( PCF, 0xA00, "PCF module" ) - FT_MODERRDEF( PFR, 0xB00, "PFR module" ) - FT_MODERRDEF( PSaux, 0xC00, "PS auxiliary module" ) - FT_MODERRDEF( PShinter, 0xD00, "PS hinter module" ) - FT_MODERRDEF( PSnames, 0xE00, "PS names module" ) - FT_MODERRDEF( Raster, 0xF00, "raster module" ) - FT_MODERRDEF( SFNT, 0x1000, "SFNT module" ) - FT_MODERRDEF( Smooth, 0x1100, "smooth raster module" ) - FT_MODERRDEF( TrueType, 0x1200, "TrueType module" ) - FT_MODERRDEF( Type1, 0x1300, "Type 1 module" ) - FT_MODERRDEF( Type42, 0x1400, "Type 42 module" ) - FT_MODERRDEF( Winfonts, 0x1500, "Windows FON/FNT module" ) - FT_MODERRDEF( GXvalid, 0x1600, "GX validation module" ) - - -#ifdef FT_MODERR_END_LIST - FT_MODERR_END_LIST -#endif - - - /*******************************************************************/ - /*******************************************************************/ - /***** *****/ - /***** CLEANUP *****/ - /***** *****/ - /*******************************************************************/ - /*******************************************************************/ - - -#ifdef FT_NEED_EXTERN_C - } -#endif - -#undef FT_MODERR_START_LIST -#undef FT_MODERR_END_LIST -#undef FT_MODERRDEF -#undef FT_NEED_EXTERN_C - - -#endif /* __FTMODERR_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftotval.h b/3party/freetype/include/freetype/ftotval.h deleted file mode 100644 index e744b713fb..0000000000 --- a/3party/freetype/include/freetype/ftotval.h +++ /dev/null @@ -1,204 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftotval.h */ -/* */ -/* FreeType API for validating OpenType tables (specification). */ -/* */ -/* Copyright 2004-2015 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. */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* */ -/* Warning: This module might be moved to a different library in the */ -/* future to avoid a tight dependency between FreeType and the */ -/* OpenType specification. */ -/* */ -/* */ -/***************************************************************************/ - - -#ifndef __FTOTVAL_H__ -#define __FTOTVAL_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* ot_validation */ - /* */ - /* <Title> */ - /* OpenType Validation */ - /* */ - /* <Abstract> */ - /* An API to validate OpenType tables. */ - /* */ - /* <Description> */ - /* This section contains the declaration of functions to validate */ - /* some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). */ - /* */ - /* <Order> */ - /* FT_OpenType_Validate */ - /* FT_OpenType_Free */ - /* */ - /* FT_VALIDATE_OTXXX */ - /* */ - /*************************************************************************/ - - - /********************************************************************** - * - * @enum: - * FT_VALIDATE_OTXXX - * - * @description: - * A list of bit-field constants used with @FT_OpenType_Validate to - * indicate which OpenType tables should be validated. - * - * @values: - * FT_VALIDATE_BASE :: - * Validate BASE table. - * - * FT_VALIDATE_GDEF :: - * Validate GDEF table. - * - * FT_VALIDATE_GPOS :: - * Validate GPOS table. - * - * FT_VALIDATE_GSUB :: - * Validate GSUB table. - * - * FT_VALIDATE_JSTF :: - * Validate JSTF table. - * - * FT_VALIDATE_MATH :: - * Validate MATH table. - * - * FT_VALIDATE_OT :: - * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). - * - */ -#define FT_VALIDATE_BASE 0x0100 -#define FT_VALIDATE_GDEF 0x0200 -#define FT_VALIDATE_GPOS 0x0400 -#define FT_VALIDATE_GSUB 0x0800 -#define FT_VALIDATE_JSTF 0x1000 -#define FT_VALIDATE_MATH 0x2000 - -#define FT_VALIDATE_OT FT_VALIDATE_BASE | \ - FT_VALIDATE_GDEF | \ - FT_VALIDATE_GPOS | \ - FT_VALIDATE_GSUB | \ - FT_VALIDATE_JSTF | \ - FT_VALIDATE_MATH - - /********************************************************************** - * - * @function: - * FT_OpenType_Validate - * - * @description: - * Validate various OpenType tables to assure that all offsets and - * indices are valid. The idea is that a higher-level library that - * actually does the text layout can access those tables without - * error checking (which can be quite time consuming). - * - * @input: - * face :: - * A handle to the input face. - * - * validation_flags :: - * A bit field that specifies the tables to be validated. See - * @FT_VALIDATE_OTXXX for possible values. - * - * @output: - * BASE_table :: - * A pointer to the BASE table. - * - * GDEF_table :: - * A pointer to the GDEF table. - * - * GPOS_table :: - * A pointer to the GPOS table. - * - * GSUB_table :: - * A pointer to the GSUB table. - * - * JSTF_table :: - * A pointer to the JSTF table. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with OpenType fonts, returning an error - * otherwise. - * - * After use, the application should deallocate the five tables with - * @FT_OpenType_Free. A NULL value indicates that the table either - * doesn't exist in the font, or the application hasn't asked for - * validation. - */ - FT_EXPORT( FT_Error ) - FT_OpenType_Validate( FT_Face face, - FT_UInt validation_flags, - FT_Bytes *BASE_table, - FT_Bytes *GDEF_table, - FT_Bytes *GPOS_table, - FT_Bytes *GSUB_table, - FT_Bytes *JSTF_table ); - - /********************************************************************** - * - * @function: - * FT_OpenType_Free - * - * @description: - * Free the buffer allocated by OpenType validator. - * - * @input: - * face :: - * A handle to the input face. - * - * table :: - * The pointer to the buffer that is allocated by - * @FT_OpenType_Validate. - * - * @note: - * This function must be used to free the buffer allocated by - * @FT_OpenType_Validate only. - */ - FT_EXPORT( void ) - FT_OpenType_Free( FT_Face face, - FT_Bytes table ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTOTVAL_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftoutln.h b/3party/freetype/include/freetype/ftoutln.h deleted file mode 100644 index 106cfde06d..0000000000 --- a/3party/freetype/include/freetype/ftoutln.h +++ /dev/null @@ -1,574 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftoutln.h */ -/* */ -/* Support for the FT_Outline type used to store glyph shapes of */ -/* most scalable font formats (specification). */ -/* */ -/* Copyright 1996-2015 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 __FTOUTLN_H__ -#define __FTOUTLN_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* outline_processing */ - /* */ - /* <Title> */ - /* Outline Processing */ - /* */ - /* <Abstract> */ - /* Functions to create, transform, and render vectorial glyph images. */ - /* */ - /* <Description> */ - /* This section contains routines used to create and destroy scalable */ - /* glyph images known as `outlines'. These can also be measured, */ - /* transformed, and converted into bitmaps and pixmaps. */ - /* */ - /* <Order> */ - /* FT_Outline */ - /* FT_Outline_New */ - /* FT_Outline_Done */ - /* FT_Outline_Copy */ - /* FT_Outline_Translate */ - /* FT_Outline_Transform */ - /* FT_Outline_Embolden */ - /* FT_Outline_EmboldenXY */ - /* FT_Outline_Reverse */ - /* FT_Outline_Check */ - /* */ - /* FT_Outline_Get_CBox */ - /* FT_Outline_Get_BBox */ - /* */ - /* FT_Outline_Get_Bitmap */ - /* FT_Outline_Render */ - /* FT_Outline_Decompose */ - /* FT_Outline_Funcs */ - /* FT_Outline_MoveToFunc */ - /* FT_Outline_LineToFunc */ - /* FT_Outline_ConicToFunc */ - /* FT_Outline_CubicToFunc */ - /* */ - /* FT_Orientation */ - /* FT_Outline_Get_Orientation */ - /* */ - /* FT_OUTLINE_XXX */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Decompose */ - /* */ - /* <Description> */ - /* Walk over an outline's structure to decompose it into individual */ - /* segments and Bézier arcs. This function also emits `move to' */ - /* operations to indicate the start of new contours in the outline. */ - /* */ - /* <Input> */ - /* outline :: A pointer to the source target. */ - /* */ - /* func_interface :: A table of `emitters', i.e., function pointers */ - /* called during decomposition to indicate path */ - /* operations. */ - /* */ - /* <InOut> */ - /* user :: A typeless pointer that is passed to each */ - /* emitter during the decomposition. It can be */ - /* used to store the state during the */ - /* decomposition. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* A contour that contains a single point only is represented by a */ - /* `move to' operation followed by `line to' to the same point. In */ - /* most cases, it is best to filter this out before using the */ - /* outline for stroking purposes (otherwise it would result in a */ - /* visible dot when round caps are used). */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Decompose( FT_Outline* outline, - const FT_Outline_Funcs* func_interface, - void* user ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_New */ - /* */ - /* <Description> */ - /* Create a new outline of a given size. */ - /* */ - /* <Input> */ - /* library :: A handle to the library object from where the */ - /* outline is allocated. Note however that the new */ - /* outline will *not* necessarily be *freed*, when */ - /* destroying the library, by @FT_Done_FreeType. */ - /* */ - /* numPoints :: The maximum number of points within the outline. */ - /* Must be smaller than or equal to 0xFFFF (65535). */ - /* */ - /* numContours :: The maximum number of contours within the outline. */ - /* This value must be in the range 0 to `numPoints'. */ - /* */ - /* <Output> */ - /* anoutline :: A handle to the new outline. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The reason why this function takes a `library' parameter is simply */ - /* to use the library's memory allocator. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_New( FT_Library library, - FT_UInt numPoints, - FT_Int numContours, - FT_Outline *anoutline ); - - - FT_EXPORT( FT_Error ) - FT_Outline_New_Internal( FT_Memory memory, - FT_UInt numPoints, - FT_Int numContours, - FT_Outline *anoutline ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Done */ - /* */ - /* <Description> */ - /* Destroy an outline created with @FT_Outline_New. */ - /* */ - /* <Input> */ - /* library :: A handle of the library object used to allocate the */ - /* outline. */ - /* */ - /* outline :: A pointer to the outline object to be discarded. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* If the outline's `owner' field is not set, only the outline */ - /* descriptor will be released. */ - /* */ - /* The reason why this function takes an `library' parameter is */ - /* simply to use ft_mem_free(). */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Done( FT_Library library, - FT_Outline* outline ); - - - FT_EXPORT( FT_Error ) - FT_Outline_Done_Internal( FT_Memory memory, - FT_Outline* outline ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Check */ - /* */ - /* <Description> */ - /* Check the contents of an outline descriptor. */ - /* */ - /* <Input> */ - /* outline :: A handle to a source outline. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Check( FT_Outline* outline ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Get_CBox */ - /* */ - /* <Description> */ - /* Return an outline's `control box'. The control box encloses all */ - /* the outline's points, including Bézier control points. Though it */ - /* coincides with the exact bounding box for most glyphs, it can be */ - /* slightly larger in some situations (like when rotating an outline */ - /* that contains Bézier outside arcs). */ - /* */ - /* Computing the control box is very fast, while getting the bounding */ - /* box can take much more time as it needs to walk over all segments */ - /* and arcs in the outline. To get the latter, you can use the */ - /* `ftbbox' component, which is dedicated to this single task. */ - /* */ - /* <Input> */ - /* outline :: A pointer to the source outline descriptor. */ - /* */ - /* <Output> */ - /* acbox :: The outline's control box. */ - /* */ - /* <Note> */ - /* See @FT_Glyph_Get_CBox for a discussion of tricky fonts. */ - /* */ - FT_EXPORT( void ) - FT_Outline_Get_CBox( const FT_Outline* outline, - FT_BBox *acbox ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Translate */ - /* */ - /* <Description> */ - /* Apply a simple translation to the points of an outline. */ - /* */ - /* <InOut> */ - /* outline :: A pointer to the target outline descriptor. */ - /* */ - /* <Input> */ - /* xOffset :: The horizontal offset. */ - /* */ - /* yOffset :: The vertical offset. */ - /* */ - FT_EXPORT( void ) - FT_Outline_Translate( const FT_Outline* outline, - FT_Pos xOffset, - FT_Pos yOffset ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Copy */ - /* */ - /* <Description> */ - /* Copy an outline into another one. Both objects must have the */ - /* same sizes (number of points & number of contours) when this */ - /* function is called. */ - /* */ - /* <Input> */ - /* source :: A handle to the source outline. */ - /* */ - /* <Output> */ - /* target :: A handle to the target outline. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Copy( const FT_Outline* source, - FT_Outline *target ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Transform */ - /* */ - /* <Description> */ - /* Apply a simple 2x2 matrix to all of an outline's points. Useful */ - /* for applying rotations, slanting, flipping, etc. */ - /* */ - /* <InOut> */ - /* outline :: A pointer to the target outline descriptor. */ - /* */ - /* <Input> */ - /* matrix :: A pointer to the transformation matrix. */ - /* */ - /* <Note> */ - /* You can use @FT_Outline_Translate if you need to translate the */ - /* outline's points. */ - /* */ - FT_EXPORT( void ) - FT_Outline_Transform( const FT_Outline* outline, - const FT_Matrix* matrix ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Embolden */ - /* */ - /* <Description> */ - /* Embolden an outline. The new outline will be at most 4~times */ - /* `strength' pixels wider and higher. You may think of the left and */ - /* bottom borders as unchanged. */ - /* */ - /* Negative `strength' values to reduce the outline thickness are */ - /* possible also. */ - /* */ - /* <InOut> */ - /* outline :: A handle to the target outline. */ - /* */ - /* <Input> */ - /* strength :: How strong the glyph is emboldened. Expressed in */ - /* 26.6 pixel format. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The used algorithm to increase or decrease the thickness of the */ - /* glyph doesn't change the number of points; this means that certain */ - /* situations like acute angles or intersections are sometimes */ - /* handled incorrectly. */ - /* */ - /* If you need `better' metrics values you should call */ - /* @FT_Outline_Get_CBox or @FT_Outline_Get_BBox. */ - /* */ - /* Example call: */ - /* */ - /* { */ - /* FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); */ - /* if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE ) */ - /* FT_Outline_Embolden( &face->slot->outline, strength ); */ - /* } */ - /* */ - /* To get meaningful results, font scaling values must be set with */ - /* functions like @FT_Set_Char_Size before calling FT_Render_Glyph. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Embolden( FT_Outline* outline, - FT_Pos strength ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_EmboldenXY */ - /* */ - /* <Description> */ - /* Embolden an outline. The new outline will be `xstrength' pixels */ - /* wider and `ystrength' pixels higher. Otherwise, it is similar to */ - /* @FT_Outline_Embolden, which uses the same strength in both */ - /* directions. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_EmboldenXY( FT_Outline* outline, - FT_Pos xstrength, - FT_Pos ystrength ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Reverse */ - /* */ - /* <Description> */ - /* Reverse the drawing direction of an outline. This is used to */ - /* ensure consistent fill conventions for mirrored glyphs. */ - /* */ - /* <InOut> */ - /* outline :: A pointer to the target outline descriptor. */ - /* */ - /* <Note> */ - /* This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in */ - /* the outline's `flags' field. */ - /* */ - /* It shouldn't be used by a normal client application, unless it */ - /* knows what it is doing. */ - /* */ - FT_EXPORT( void ) - FT_Outline_Reverse( FT_Outline* outline ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Get_Bitmap */ - /* */ - /* <Description> */ - /* Render an outline within a bitmap. The outline's image is simply */ - /* OR-ed to the target bitmap. */ - /* */ - /* <Input> */ - /* library :: A handle to a FreeType library object. */ - /* */ - /* outline :: A pointer to the source outline descriptor. */ - /* */ - /* <InOut> */ - /* abitmap :: A pointer to the target bitmap descriptor. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* This function does NOT CREATE the bitmap, it only renders an */ - /* outline image within the one you pass to it! Consequently, the */ - /* various fields in `abitmap' should be set accordingly. */ - /* */ - /* It will use the raster corresponding to the default glyph format. */ - /* */ - /* The value of the `num_grays' field in `abitmap' is ignored. If */ - /* you select the gray-level rasterizer, and you want less than 256 */ - /* gray levels, you have to use @FT_Outline_Render directly. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Get_Bitmap( FT_Library library, - FT_Outline* outline, - const FT_Bitmap *abitmap ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Render */ - /* */ - /* <Description> */ - /* Render an outline within a bitmap using the current scan-convert. */ - /* This function uses an @FT_Raster_Params structure as an argument, */ - /* allowing advanced features like direct composition, translucency, */ - /* etc. */ - /* */ - /* <Input> */ - /* library :: A handle to a FreeType library object. */ - /* */ - /* outline :: A pointer to the source outline descriptor. */ - /* */ - /* <InOut> */ - /* params :: A pointer to an @FT_Raster_Params structure used to */ - /* describe the rendering operation. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* You should know what you are doing and how @FT_Raster_Params works */ - /* to use this function. */ - /* */ - /* The field `params.source' will be set to `outline' before the scan */ - /* converter is called, which means that the value you give to it is */ - /* actually ignored. */ - /* */ - /* The gray-level rasterizer always uses 256 gray levels. If you */ - /* want less gray levels, you have to provide your own span callback. */ - /* See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the */ - /* @FT_Raster_Params structure for more details. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Render( FT_Library library, - FT_Outline* outline, - FT_Raster_Params* params ); - - - /************************************************************************** - * - * @enum: - * FT_Orientation - * - * @description: - * A list of values used to describe an outline's contour orientation. - * - * The TrueType and PostScript specifications use different conventions - * to determine whether outline contours should be filled or unfilled. - * - * @values: - * FT_ORIENTATION_TRUETYPE :: - * According to the TrueType specification, clockwise contours must - * be filled, and counter-clockwise ones must be unfilled. - * - * FT_ORIENTATION_POSTSCRIPT :: - * According to the PostScript specification, counter-clockwise contours - * must be filled, and clockwise ones must be unfilled. - * - * FT_ORIENTATION_FILL_RIGHT :: - * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to - * remember that in TrueType, everything that is to the right of - * the drawing direction of a contour must be filled. - * - * FT_ORIENTATION_FILL_LEFT :: - * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to - * remember that in PostScript, everything that is to the left of - * the drawing direction of a contour must be filled. - * - * FT_ORIENTATION_NONE :: - * The orientation cannot be determined. That is, different parts of - * the glyph have different orientation. - * - */ - typedef enum FT_Orientation_ - { - FT_ORIENTATION_TRUETYPE = 0, - FT_ORIENTATION_POSTSCRIPT = 1, - FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, - FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT, - FT_ORIENTATION_NONE - - } FT_Orientation; - - - /************************************************************************** - * - * @function: - * FT_Outline_Get_Orientation - * - * @description: - * This function analyzes a glyph outline and tries to compute its - * fill orientation (see @FT_Orientation). This is done by integrating - * the total area covered by the outline. The positive integral - * corresponds to the clockwise orientation and @FT_ORIENTATION_POSTSCRIPT - * is returned. The negative integral corresponds to the counter-clockwise - * orientation and @FT_ORIENTATION_TRUETYPE is returned. - * - * Note that this will return @FT_ORIENTATION_TRUETYPE for empty - * outlines. - * - * @input: - * outline :: - * A handle to the source outline. - * - * @return: - * The orientation. - * - */ - FT_EXPORT( FT_Orientation ) - FT_Outline_Get_Orientation( FT_Outline* outline ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTOUTLN_H__ */ - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/3party/freetype/include/freetype/ftpfr.h b/3party/freetype/include/freetype/ftpfr.h deleted file mode 100644 index a1c02a2f5e..0000000000 --- a/3party/freetype/include/freetype/ftpfr.h +++ /dev/null @@ -1,172 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftpfr.h */ -/* */ -/* FreeType API for accessing PFR-specific data (specification only). */ -/* */ -/* Copyright 2002-2015 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 __FTPFR_H__ -#define __FTPFR_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* pfr_fonts */ - /* */ - /* <Title> */ - /* PFR Fonts */ - /* */ - /* <Abstract> */ - /* PFR/TrueDoc specific API. */ - /* */ - /* <Description> */ - /* This section contains the declaration of PFR-specific functions. */ - /* */ - /*************************************************************************/ - - - /********************************************************************** - * - * @function: - * FT_Get_PFR_Metrics - * - * @description: - * Return the outline and metrics resolutions of a given PFR face. - * - * @input: - * face :: Handle to the input face. It can be a non-PFR face. - * - * @output: - * aoutline_resolution :: - * Outline resolution. This is equivalent to `face->units_per_EM' - * for non-PFR fonts. Optional (parameter can be NULL). - * - * ametrics_resolution :: - * Metrics resolution. This is equivalent to `outline_resolution' - * for non-PFR fonts. Optional (parameter can be NULL). - * - * ametrics_x_scale :: - * A 16.16 fixed-point number used to scale distance expressed - * in metrics units to device sub-pixels. This is equivalent to - * `face->size->x_scale', but for metrics only. Optional (parameter - * can be NULL). - * - * ametrics_y_scale :: - * Same as `ametrics_x_scale' but for the vertical direction. - * optional (parameter can be NULL). - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * If the input face is not a PFR, this function will return an error. - * However, in all cases, it will return valid values. - */ - FT_EXPORT( FT_Error ) - FT_Get_PFR_Metrics( FT_Face face, - FT_UInt *aoutline_resolution, - FT_UInt *ametrics_resolution, - FT_Fixed *ametrics_x_scale, - FT_Fixed *ametrics_y_scale ); - - - /********************************************************************** - * - * @function: - * FT_Get_PFR_Kerning - * - * @description: - * Return the kerning pair corresponding to two glyphs in a PFR face. - * The distance is expressed in metrics units, unlike the result of - * @FT_Get_Kerning. - * - * @input: - * face :: A handle to the input face. - * - * left :: Index of the left glyph. - * - * right :: Index of the right glyph. - * - * @output: - * avector :: A kerning vector. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function always return distances in original PFR metrics - * units. This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED - * mode, which always returns distances converted to outline units. - * - * You can use the value of the `x_scale' and `y_scale' parameters - * returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels. - */ - FT_EXPORT( FT_Error ) - FT_Get_PFR_Kerning( FT_Face face, - FT_UInt left, - FT_UInt right, - FT_Vector *avector ); - - - /********************************************************************** - * - * @function: - * FT_Get_PFR_Advance - * - * @description: - * Return a given glyph advance, expressed in original metrics units, - * from a PFR font. - * - * @input: - * face :: A handle to the input face. - * - * gindex :: The glyph index. - * - * @output: - * aadvance :: The glyph advance in metrics units. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics - * to convert the advance to device sub-pixels (i.e., 1/64th of pixels). - */ - FT_EXPORT( FT_Error ) - FT_Get_PFR_Advance( FT_Face face, - FT_UInt gindex, - FT_Pos *aadvance ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTPFR_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftrender.h b/3party/freetype/include/freetype/ftrender.h deleted file mode 100644 index ec8da700b1..0000000000 --- a/3party/freetype/include/freetype/ftrender.h +++ /dev/null @@ -1,232 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftrender.h */ -/* */ -/* FreeType renderer modules public interface (specification). */ -/* */ -/* Copyright 1996-2015 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 __FTRENDER_H__ -#define __FTRENDER_H__ - - -#include <ft2build.h> -#include FT_MODULE_H -#include FT_GLYPH_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* module_management */ - /* */ - /*************************************************************************/ - - - /* create a new glyph object */ - typedef FT_Error - (*FT_Glyph_InitFunc)( FT_Glyph glyph, - FT_GlyphSlot slot ); - - /* destroys a given glyph object */ - typedef void - (*FT_Glyph_DoneFunc)( FT_Glyph glyph ); - - typedef void - (*FT_Glyph_TransformFunc)( FT_Glyph glyph, - const FT_Matrix* matrix, - const FT_Vector* delta ); - - typedef void - (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph, - FT_BBox* abbox ); - - typedef FT_Error - (*FT_Glyph_CopyFunc)( FT_Glyph source, - FT_Glyph target ); - - typedef FT_Error - (*FT_Glyph_PrepareFunc)( FT_Glyph glyph, - FT_GlyphSlot slot ); - -/* deprecated */ -#define FT_Glyph_Init_Func FT_Glyph_InitFunc -#define FT_Glyph_Done_Func FT_Glyph_DoneFunc -#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc -#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc -#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc -#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc - - - struct FT_Glyph_Class_ - { - FT_Long glyph_size; - FT_Glyph_Format glyph_format; - FT_Glyph_InitFunc glyph_init; - FT_Glyph_DoneFunc glyph_done; - FT_Glyph_CopyFunc glyph_copy; - FT_Glyph_TransformFunc glyph_transform; - FT_Glyph_GetBBoxFunc glyph_bbox; - FT_Glyph_PrepareFunc glyph_prepare; - }; - - - typedef FT_Error - (*FT_Renderer_RenderFunc)( FT_Renderer renderer, - FT_GlyphSlot slot, - FT_UInt mode, - const FT_Vector* origin ); - - typedef FT_Error - (*FT_Renderer_TransformFunc)( FT_Renderer renderer, - FT_GlyphSlot slot, - const FT_Matrix* matrix, - const FT_Vector* delta ); - - - typedef void - (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer, - FT_GlyphSlot slot, - FT_BBox* cbox ); - - - typedef FT_Error - (*FT_Renderer_SetModeFunc)( FT_Renderer renderer, - FT_ULong mode_tag, - FT_Pointer mode_ptr ); - -/* deprecated identifiers */ -#define FTRenderer_render FT_Renderer_RenderFunc -#define FTRenderer_transform FT_Renderer_TransformFunc -#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc -#define FTRenderer_setMode FT_Renderer_SetModeFunc - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Renderer_Class */ - /* */ - /* <Description> */ - /* The renderer module class descriptor. */ - /* */ - /* <Fields> */ - /* root :: The root @FT_Module_Class fields. */ - /* */ - /* glyph_format :: The glyph image format this renderer handles. */ - /* */ - /* render_glyph :: A method used to render the image that is in a */ - /* given glyph slot into a bitmap. */ - /* */ - /* transform_glyph :: A method used to transform the image that is in */ - /* a given glyph slot. */ - /* */ - /* get_glyph_cbox :: A method used to access the glyph's cbox. */ - /* */ - /* set_mode :: A method used to pass additional parameters. */ - /* */ - /* raster_class :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. */ - /* This is a pointer to its raster's class. */ - /* */ - typedef struct FT_Renderer_Class_ - { - FT_Module_Class root; - - FT_Glyph_Format glyph_format; - - FT_Renderer_RenderFunc render_glyph; - FT_Renderer_TransformFunc transform_glyph; - FT_Renderer_GetCBoxFunc get_glyph_cbox; - FT_Renderer_SetModeFunc set_mode; - - FT_Raster_Funcs* raster_class; - - } FT_Renderer_Class; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Renderer */ - /* */ - /* <Description> */ - /* Retrieve the current renderer for a given glyph format. */ - /* */ - /* <Input> */ - /* library :: A handle to the library object. */ - /* */ - /* format :: The glyph format. */ - /* */ - /* <Return> */ - /* A renderer handle. 0~if none found. */ - /* */ - /* <Note> */ - /* An error will be returned if a module already exists by that name, */ - /* or if the module requires a version of FreeType that is too great. */ - /* */ - /* To add a new renderer, simply use @FT_Add_Module. To retrieve a */ - /* renderer by its name, use @FT_Get_Module. */ - /* */ - FT_EXPORT( FT_Renderer ) - FT_Get_Renderer( FT_Library library, - FT_Glyph_Format format ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Renderer */ - /* */ - /* <Description> */ - /* Set the current renderer to use, and set additional mode. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library object. */ - /* */ - /* <Input> */ - /* renderer :: A handle to the renderer object. */ - /* */ - /* num_params :: The number of additional parameters. */ - /* */ - /* parameters :: Additional parameters. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* In case of success, the renderer will be used to convert glyph */ - /* images in the renderer's known format into bitmaps. */ - /* */ - /* This doesn't change the current renderer for other formats. */ - /* */ - /* Currently, no FreeType renderer module uses `parameters'; you */ - /* should thus always pass NULL as the value. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_Renderer( FT_Library library, - FT_Renderer renderer, - FT_UInt num_params, - FT_Parameter* parameters ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTRENDER_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftsizes.h b/3party/freetype/include/freetype/ftsizes.h deleted file mode 100644 index bef8424715..0000000000 --- a/3party/freetype/include/freetype/ftsizes.h +++ /dev/null @@ -1,159 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsizes.h */ -/* */ -/* FreeType size objects management (specification). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Typical application would normally not need to use these functions. */ - /* However, they have been placed in a public API for the rare cases */ - /* where they are needed. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTSIZES_H__ -#define __FTSIZES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* sizes_management */ - /* */ - /* <Title> */ - /* Size Management */ - /* */ - /* <Abstract> */ - /* Managing multiple sizes per face. */ - /* */ - /* <Description> */ - /* When creating a new face object (e.g., with @FT_New_Face), an */ - /* @FT_Size object is automatically created and used to store all */ - /* pixel-size dependent information, available in the `face->size' */ - /* field. */ - /* */ - /* It is however possible to create more sizes for a given face, */ - /* mostly in order to manage several character pixel sizes of the */ - /* same font family and style. See @FT_New_Size and @FT_Done_Size. */ - /* */ - /* Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only */ - /* modify the contents of the current `active' size; you thus need */ - /* to use @FT_Activate_Size to change it. */ - /* */ - /* 99% of applications won't need the functions provided here, */ - /* especially if they use the caching sub-system, so be cautious */ - /* when using these. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Size */ - /* */ - /* <Description> */ - /* Create a new size object from a given face object. */ - /* */ - /* <Input> */ - /* face :: A handle to a parent face object. */ - /* */ - /* <Output> */ - /* asize :: A handle to a new size object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* You need to call @FT_Activate_Size in order to select the new size */ - /* for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, */ - /* @FT_Load_Glyph, @FT_Load_Char, etc. */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Size( FT_Face face, - FT_Size* size ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_Size */ - /* */ - /* <Description> */ - /* Discard a given size object. Note that @FT_Done_Face */ - /* automatically discards all size objects allocated with */ - /* @FT_New_Size. */ - /* */ - /* <Input> */ - /* size :: A handle to a target size object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Done_Size( FT_Size size ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Activate_Size */ - /* */ - /* <Description> */ - /* Even though it is possible to create several size objects for a */ - /* given face (see @FT_New_Size for details), functions like */ - /* @FT_Load_Glyph or @FT_Load_Char only use the one that has been */ - /* activated last to determine the `current character pixel size'. */ - /* */ - /* This function can be used to `activate' a previously created size */ - /* object. */ - /* */ - /* <Input> */ - /* size :: A handle to a target size object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* If `face' is the size's parent face object, this function changes */ - /* the value of `face->size' to the input size handle. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Activate_Size( FT_Size size ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTSIZES_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftsnames.h b/3party/freetype/include/freetype/ftsnames.h deleted file mode 100644 index 0f7fbe1744..0000000000 --- a/3party/freetype/include/freetype/ftsnames.h +++ /dev/null @@ -1,200 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsnames.h */ -/* */ -/* Simple interface to access SFNT name tables (which are used */ -/* to hold font names, copyright info, notices, etc.) (specification). */ -/* */ -/* This is _not_ used to retrieve glyph names! */ -/* */ -/* Copyright 1996-2015 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 __FT_SFNT_NAMES_H__ -#define __FT_SFNT_NAMES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* sfnt_names */ - /* */ - /* <Title> */ - /* SFNT Names */ - /* */ - /* <Abstract> */ - /* Access the names embedded in TrueType and OpenType files. */ - /* */ - /* <Description> */ - /* The TrueType and OpenType specifications allow the inclusion of */ - /* a special `names table' in font files. This table contains */ - /* textual (and internationalized) information regarding the font, */ - /* like family name, copyright, version, etc. */ - /* */ - /* The definitions below are used to access them if available. */ - /* */ - /* Note that this has nothing to do with glyph names! */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_SfntName */ - /* */ - /* <Description> */ - /* A structure used to model an SFNT `name' table entry. */ - /* */ - /* <Fields> */ - /* platform_id :: The platform ID for `string'. */ - /* */ - /* encoding_id :: The encoding ID for `string'. */ - /* */ - /* language_id :: The language ID for `string'. */ - /* */ - /* name_id :: An identifier for `string'. */ - /* */ - /* string :: The `name' string. Note that its format differs */ - /* depending on the (platform,encoding) pair. It can */ - /* be a Pascal String, a UTF-16 one, etc. */ - /* */ - /* Generally speaking, the string is not */ - /* zero-terminated. Please refer to the TrueType */ - /* specification for details. */ - /* */ - /* string_len :: The length of `string' in bytes. */ - /* */ - /* <Note> */ - /* Possible values for `platform_id', `encoding_id', `language_id', */ - /* and `name_id' are given in the file `ttnameid.h'. For details */ - /* please refer to the TrueType or OpenType specification. */ - /* */ - /* See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, */ - /* @TT_ISO_ID_XXX, and @TT_MS_ID_XXX. */ - /* */ - typedef struct FT_SfntName_ - { - FT_UShort platform_id; - FT_UShort encoding_id; - FT_UShort language_id; - FT_UShort name_id; - - FT_Byte* string; /* this string is *not* null-terminated! */ - FT_UInt string_len; /* in bytes */ - - } FT_SfntName; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Sfnt_Name_Count */ - /* */ - /* <Description> */ - /* Retrieve the number of name strings in the SFNT `name' table. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face. */ - /* */ - /* <Return> */ - /* The number of strings in the `name' table. */ - /* */ - FT_EXPORT( FT_UInt ) - FT_Get_Sfnt_Name_Count( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Sfnt_Name */ - /* */ - /* <Description> */ - /* Retrieve a string of the SFNT `name' table for a given index. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face. */ - /* */ - /* idx :: The index of the `name' string. */ - /* */ - /* <Output> */ - /* aname :: The indexed @FT_SfntName structure. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The `string' array returned in the `aname' structure is not */ - /* null-terminated. The application should deallocate it if it is no */ - /* longer in use. */ - /* */ - /* Use @FT_Get_Sfnt_Name_Count to get the total number of available */ - /* `name' table entries, then do a loop until you get the right */ - /* platform, encoding, and name ID. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Sfnt_Name( FT_Face face, - FT_UInt idx, - FT_SfntName *aname ); - - - /*************************************************************************** - * - * @constant: - * FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY - * - * @description: - * A constant used as the tag of @FT_Parameter structures to make - * FT_Open_Face() ignore preferred family subfamily names in `name' - * table since OpenType version 1.4. For backwards compatibility with - * legacy systems that have a 4-face-per-family restriction. - * - */ -#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY FT_MAKE_TAG( 'i', 'g', 'p', 'f' ) - - - /*************************************************************************** - * - * @constant: - * FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY - * - * @description: - * A constant used as the tag of @FT_Parameter structures to make - * FT_Open_Face() ignore preferred subfamily names in `name' table since - * OpenType version 1.4. For backwards compatibility with legacy - * systems that have a 4-face-per-family restriction. - * - */ -#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY FT_MAKE_TAG( 'i', 'g', 'p', 's' ) - - /* */ - - -FT_END_HEADER - -#endif /* __FT_SFNT_NAMES_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftstroke.h b/3party/freetype/include/freetype/ftstroke.h deleted file mode 100644 index 7ebb1e7404..0000000000 --- a/3party/freetype/include/freetype/ftstroke.h +++ /dev/null @@ -1,785 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftstroke.h */ -/* */ -/* FreeType path stroker (specification). */ -/* */ -/* Copyright 2002-2015 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 __FT_STROKE_H__ -#define __FT_STROKE_H__ - -#include <ft2build.h> -#include FT_OUTLINE_H -#include FT_GLYPH_H - - -FT_BEGIN_HEADER - - - /************************************************************************ - * - * @section: - * glyph_stroker - * - * @title: - * Glyph Stroker - * - * @abstract: - * Generating bordered and stroked glyphs. - * - * @description: - * This component generates stroked outlines of a given vectorial - * glyph. It also allows you to retrieve the `outside' and/or the - * `inside' borders of the stroke. - * - * This can be useful to generate `bordered' glyph, i.e., glyphs - * displayed with a coloured (and anti-aliased) border around their - * shape. - * - * @order: - * FT_Stroker - * - * FT_Stroker_LineJoin - * FT_Stroker_LineCap - * FT_StrokerBorder - * - * FT_Outline_GetInsideBorder - * FT_Outline_GetOutsideBorder - * - * FT_Glyph_Stroke - * FT_Glyph_StrokeBorder - * - * FT_Stroker_New - * FT_Stroker_Set - * FT_Stroker_Rewind - * FT_Stroker_ParseOutline - * FT_Stroker_Done - * - * FT_Stroker_BeginSubPath - * FT_Stroker_EndSubPath - * - * FT_Stroker_LineTo - * FT_Stroker_ConicTo - * FT_Stroker_CubicTo - * - * FT_Stroker_GetBorderCounts - * FT_Stroker_ExportBorder - * FT_Stroker_GetCounts - * FT_Stroker_Export - * - */ - - - /************************************************************** - * - * @type: - * FT_Stroker - * - * @description: - * Opaque handle to a path stroker object. - */ - typedef struct FT_StrokerRec_* FT_Stroker; - - - /************************************************************** - * - * @enum: - * FT_Stroker_LineJoin - * - * @description: - * These values determine how two joining lines are rendered - * in a stroker. - * - * @values: - * FT_STROKER_LINEJOIN_ROUND :: - * Used to render rounded line joins. Circular arcs are used - * to join two lines smoothly. - * - * FT_STROKER_LINEJOIN_BEVEL :: - * Used to render beveled line joins. The outer corner of - * the joined lines is filled by enclosing the triangular - * region of the corner with a straight line between the - * outer corners of each stroke. - * - * FT_STROKER_LINEJOIN_MITER_FIXED :: - * Used to render mitered line joins, with fixed bevels if the - * miter limit is exceeded. The outer edges of the strokes - * for the two segments are extended until they meet at an - * angle. If the segments meet at too sharp an angle (such - * that the miter would extend from the intersection of the - * segments a distance greater than the product of the miter - * limit value and the border radius), then a bevel join (see - * above) is used instead. This prevents long spikes being - * created. FT_STROKER_LINEJOIN_MITER_FIXED generates a miter - * line join as used in PostScript and PDF. - * - * FT_STROKER_LINEJOIN_MITER_VARIABLE :: - * FT_STROKER_LINEJOIN_MITER :: - * Used to render mitered line joins, with variable bevels if - * the miter limit is exceeded. The intersection of the - * strokes is clipped at a line perpendicular to the bisector - * of the angle between the strokes, at the distance from the - * intersection of the segments equal to the product of the - * miter limit value and the border radius. This prevents - * long spikes being created. - * FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line - * join as used in XPS. FT_STROKER_LINEJOIN_MITER is an alias - * for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for - * backwards compatibility. - */ - typedef enum FT_Stroker_LineJoin_ - { - FT_STROKER_LINEJOIN_ROUND = 0, - FT_STROKER_LINEJOIN_BEVEL = 1, - FT_STROKER_LINEJOIN_MITER_VARIABLE = 2, - FT_STROKER_LINEJOIN_MITER = FT_STROKER_LINEJOIN_MITER_VARIABLE, - FT_STROKER_LINEJOIN_MITER_FIXED = 3 - - } FT_Stroker_LineJoin; - - - /************************************************************** - * - * @enum: - * FT_Stroker_LineCap - * - * @description: - * These values determine how the end of opened sub-paths are - * rendered in a stroke. - * - * @values: - * FT_STROKER_LINECAP_BUTT :: - * The end of lines is rendered as a full stop on the last - * point itself. - * - * FT_STROKER_LINECAP_ROUND :: - * The end of lines is rendered as a half-circle around the - * last point. - * - * FT_STROKER_LINECAP_SQUARE :: - * The end of lines is rendered as a square around the - * last point. - */ - typedef enum FT_Stroker_LineCap_ - { - FT_STROKER_LINECAP_BUTT = 0, - FT_STROKER_LINECAP_ROUND, - FT_STROKER_LINECAP_SQUARE - - } FT_Stroker_LineCap; - - - /************************************************************** - * - * @enum: - * FT_StrokerBorder - * - * @description: - * These values are used to select a given stroke border - * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. - * - * @values: - * FT_STROKER_BORDER_LEFT :: - * Select the left border, relative to the drawing direction. - * - * FT_STROKER_BORDER_RIGHT :: - * Select the right border, relative to the drawing direction. - * - * @note: - * Applications are generally interested in the `inside' and `outside' - * borders. However, there is no direct mapping between these and the - * `left' and `right' ones, since this really depends on the glyph's - * drawing orientation, which varies between font formats. - * - * You can however use @FT_Outline_GetInsideBorder and - * @FT_Outline_GetOutsideBorder to get these. - */ - typedef enum FT_StrokerBorder_ - { - FT_STROKER_BORDER_LEFT = 0, - FT_STROKER_BORDER_RIGHT - - } FT_StrokerBorder; - - - /************************************************************** - * - * @function: - * FT_Outline_GetInsideBorder - * - * @description: - * Retrieve the @FT_StrokerBorder value corresponding to the - * `inside' borders of a given outline. - * - * @input: - * outline :: - * The source outline handle. - * - * @return: - * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid - * outlines. - */ - FT_EXPORT( FT_StrokerBorder ) - FT_Outline_GetInsideBorder( FT_Outline* outline ); - - - /************************************************************** - * - * @function: - * FT_Outline_GetOutsideBorder - * - * @description: - * Retrieve the @FT_StrokerBorder value corresponding to the - * `outside' borders of a given outline. - * - * @input: - * outline :: - * The source outline handle. - * - * @return: - * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid - * outlines. - */ - FT_EXPORT( FT_StrokerBorder ) - FT_Outline_GetOutsideBorder( FT_Outline* outline ); - - - /************************************************************** - * - * @function: - * FT_Stroker_New - * - * @description: - * Create a new stroker object. - * - * @input: - * library :: - * FreeType library handle. - * - * @output: - * astroker :: - * A new stroker object handle. NULL in case of error. - * - * @return: - * FreeType error code. 0~means success. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_New( FT_Library library, - FT_Stroker *astroker ); - - - /************************************************************** - * - * @function: - * FT_Stroker_Set - * - * @description: - * Reset a stroker object's attributes. - * - * @input: - * stroker :: - * The target stroker handle. - * - * radius :: - * The border radius. - * - * line_cap :: - * The line cap style. - * - * line_join :: - * The line join style. - * - * miter_limit :: - * The miter limit for the FT_STROKER_LINEJOIN_MITER_FIXED and - * FT_STROKER_LINEJOIN_MITER_VARIABLE line join styles, - * expressed as 16.16 fixed-point value. - * - * @note: - * The radius is expressed in the same units as the outline - * coordinates. - * - * This function calls @FT_Stroker_Rewind automatically. - */ - FT_EXPORT( void ) - FT_Stroker_Set( FT_Stroker stroker, - FT_Fixed radius, - FT_Stroker_LineCap line_cap, - FT_Stroker_LineJoin line_join, - FT_Fixed miter_limit ); - - - /************************************************************** - * - * @function: - * FT_Stroker_Rewind - * - * @description: - * Reset a stroker object without changing its attributes. - * You should call this function before beginning a new - * series of calls to @FT_Stroker_BeginSubPath or - * @FT_Stroker_EndSubPath. - * - * @input: - * stroker :: - * The target stroker handle. - */ - FT_EXPORT( void ) - FT_Stroker_Rewind( FT_Stroker stroker ); - - - /************************************************************** - * - * @function: - * FT_Stroker_ParseOutline - * - * @description: - * A convenience function used to parse a whole outline with - * the stroker. The resulting outline(s) can be retrieved - * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export. - * - * @input: - * stroker :: - * The target stroker handle. - * - * outline :: - * The source outline. - * - * opened :: - * A boolean. If~1, the outline is treated as an open path instead - * of a closed one. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * If `opened' is~0 (the default), the outline is treated as a closed - * path, and the stroker generates two distinct `border' outlines. - * - * If `opened' is~1, the outline is processed as an open path, and the - * stroker generates a single `stroke' outline. - * - * This function calls @FT_Stroker_Rewind automatically. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_ParseOutline( FT_Stroker stroker, - FT_Outline* outline, - FT_Bool opened ); - - - /************************************************************** - * - * @function: - * FT_Stroker_BeginSubPath - * - * @description: - * Start a new sub-path in the stroker. - * - * @input: - * stroker :: - * The target stroker handle. - * - * to :: - * A pointer to the start vector. - * - * open :: - * A boolean. If~1, the sub-path is treated as an open one. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function is useful when you need to stroke a path that is - * not stored as an @FT_Outline object. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_BeginSubPath( FT_Stroker stroker, - FT_Vector* to, - FT_Bool open ); - - - /************************************************************** - * - * @function: - * FT_Stroker_EndSubPath - * - * @description: - * Close the current sub-path in the stroker. - * - * @input: - * stroker :: - * The target stroker handle. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * You should call this function after @FT_Stroker_BeginSubPath. - * If the subpath was not `opened', this function `draws' a - * single line segment to the start position when needed. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_EndSubPath( FT_Stroker stroker ); - - - /************************************************************** - * - * @function: - * FT_Stroker_LineTo - * - * @description: - * `Draw' a single line segment in the stroker's current sub-path, - * from the last position. - * - * @input: - * stroker :: - * The target stroker handle. - * - * to :: - * A pointer to the destination point. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * You should call this function between @FT_Stroker_BeginSubPath and - * @FT_Stroker_EndSubPath. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_LineTo( FT_Stroker stroker, - FT_Vector* to ); - - - /************************************************************** - * - * @function: - * FT_Stroker_ConicTo - * - * @description: - * `Draw' a single quadratic Bézier in the stroker's current sub-path, - * from the last position. - * - * @input: - * stroker :: - * The target stroker handle. - * - * control :: - * A pointer to a Bézier control point. - * - * to :: - * A pointer to the destination point. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * You should call this function between @FT_Stroker_BeginSubPath and - * @FT_Stroker_EndSubPath. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_ConicTo( FT_Stroker stroker, - FT_Vector* control, - FT_Vector* to ); - - - /************************************************************** - * - * @function: - * FT_Stroker_CubicTo - * - * @description: - * `Draw' a single cubic Bézier in the stroker's current sub-path, - * from the last position. - * - * @input: - * stroker :: - * The target stroker handle. - * - * control1 :: - * A pointer to the first Bézier control point. - * - * control2 :: - * A pointer to second Bézier control point. - * - * to :: - * A pointer to the destination point. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * You should call this function between @FT_Stroker_BeginSubPath and - * @FT_Stroker_EndSubPath. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_CubicTo( FT_Stroker stroker, - FT_Vector* control1, - FT_Vector* control2, - FT_Vector* to ); - - - /************************************************************** - * - * @function: - * FT_Stroker_GetBorderCounts - * - * @description: - * Call this function once you have finished parsing your paths - * with the stroker. It returns the number of points and - * contours necessary to export one of the `border' or `stroke' - * outlines generated by the stroker. - * - * @input: - * stroker :: - * The target stroker handle. - * - * border :: - * The border index. - * - * @output: - * anum_points :: - * The number of points. - * - * anum_contours :: - * The number of contours. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * When an outline, or a sub-path, is `closed', the stroker generates - * two independent `border' outlines, named `left' and `right'. - * - * When the outline, or a sub-path, is `opened', the stroker merges - * the `border' outlines with caps. The `left' border receives all - * points, while the `right' border becomes empty. - * - * Use the function @FT_Stroker_GetCounts instead if you want to - * retrieve the counts associated to both borders. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_GetBorderCounts( FT_Stroker stroker, - FT_StrokerBorder border, - FT_UInt *anum_points, - FT_UInt *anum_contours ); - - - /************************************************************** - * - * @function: - * FT_Stroker_ExportBorder - * - * @description: - * Call this function after @FT_Stroker_GetBorderCounts to - * export the corresponding border to your own @FT_Outline - * structure. - * - * Note that this function appends the border points and - * contours to your outline, but does not try to resize its - * arrays. - * - * @input: - * stroker :: - * The target stroker handle. - * - * border :: - * The border index. - * - * outline :: - * The target outline handle. - * - * @note: - * Always call this function after @FT_Stroker_GetBorderCounts to - * get sure that there is enough room in your @FT_Outline object to - * receive all new data. - * - * When an outline, or a sub-path, is `closed', the stroker generates - * two independent `border' outlines, named `left' and `right'. - * - * When the outline, or a sub-path, is `opened', the stroker merges - * the `border' outlines with caps. The `left' border receives all - * points, while the `right' border becomes empty. - * - * Use the function @FT_Stroker_Export instead if you want to - * retrieve all borders at once. - */ - FT_EXPORT( void ) - FT_Stroker_ExportBorder( FT_Stroker stroker, - FT_StrokerBorder border, - FT_Outline* outline ); - - - /************************************************************** - * - * @function: - * FT_Stroker_GetCounts - * - * @description: - * Call this function once you have finished parsing your paths - * with the stroker. It returns the number of points and - * contours necessary to export all points/borders from the stroked - * outline/path. - * - * @input: - * stroker :: - * The target stroker handle. - * - * @output: - * anum_points :: - * The number of points. - * - * anum_contours :: - * The number of contours. - * - * @return: - * FreeType error code. 0~means success. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_GetCounts( FT_Stroker stroker, - FT_UInt *anum_points, - FT_UInt *anum_contours ); - - - /************************************************************** - * - * @function: - * FT_Stroker_Export - * - * @description: - * Call this function after @FT_Stroker_GetBorderCounts to - * export all borders to your own @FT_Outline structure. - * - * Note that this function appends the border points and - * contours to your outline, but does not try to resize its - * arrays. - * - * @input: - * stroker :: - * The target stroker handle. - * - * outline :: - * The target outline handle. - */ - FT_EXPORT( void ) - FT_Stroker_Export( FT_Stroker stroker, - FT_Outline* outline ); - - - /************************************************************** - * - * @function: - * FT_Stroker_Done - * - * @description: - * Destroy a stroker object. - * - * @input: - * stroker :: - * A stroker handle. Can be NULL. - */ - FT_EXPORT( void ) - FT_Stroker_Done( FT_Stroker stroker ); - - - /************************************************************** - * - * @function: - * FT_Glyph_Stroke - * - * @description: - * Stroke a given outline glyph object with a given stroker. - * - * @inout: - * pglyph :: - * Source glyph handle on input, new glyph handle on output. - * - * @input: - * stroker :: - * A stroker handle. - * - * destroy :: - * A Boolean. If~1, the source glyph object is destroyed - * on success. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The source glyph is untouched in case of error. - * - * Adding stroke may yield a significantly wider and taller glyph - * depending on how large of a radius was used to stroke the glyph. You - * may need to manually adjust horizontal and vertical advance amounts - * to account for this added size. - */ - FT_EXPORT( FT_Error ) - FT_Glyph_Stroke( FT_Glyph *pglyph, - FT_Stroker stroker, - FT_Bool destroy ); - - - /************************************************************** - * - * @function: - * FT_Glyph_StrokeBorder - * - * @description: - * Stroke a given outline glyph object with a given stroker, but - * only return either its inside or outside border. - * - * @inout: - * pglyph :: - * Source glyph handle on input, new glyph handle on output. - * - * @input: - * stroker :: - * A stroker handle. - * - * inside :: - * A Boolean. If~1, return the inside border, otherwise - * the outside border. - * - * destroy :: - * A Boolean. If~1, the source glyph object is destroyed - * on success. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The source glyph is untouched in case of error. - * - * Adding stroke may yield a significantly wider and taller glyph - * depending on how large of a radius was used to stroke the glyph. You - * may need to manually adjust horizontal and vertical advance amounts - * to account for this added size. - */ - FT_EXPORT( FT_Error ) - FT_Glyph_StrokeBorder( FT_Glyph *pglyph, - FT_Stroker stroker, - FT_Bool inside, - FT_Bool destroy ); - - /* */ - -FT_END_HEADER - -#endif /* __FT_STROKE_H__ */ - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/3party/freetype/include/freetype/ftsynth.h b/3party/freetype/include/freetype/ftsynth.h deleted file mode 100644 index fbcbad871a..0000000000 --- a/3party/freetype/include/freetype/ftsynth.h +++ /dev/null @@ -1,84 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsynth.h */ -/* */ -/* FreeType synthesizing code for emboldening and slanting */ -/* (specification). */ -/* */ -/* Copyright 2000-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /********* *********/ - /********* WARNING, THIS IS ALPHA CODE! THIS API *********/ - /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/ - /********* FREETYPE DEVELOPMENT TEAM *********/ - /********* *********/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* Main reason for not lifting the functions in this module to a */ - /* `standard' API is that the used parameters for emboldening and */ - /* slanting are not configurable. Consider the functions as a */ - /* code resource that should be copied into the application and */ - /* adapted to the particular needs. */ - - -#ifndef __FTSYNTH_H__ -#define __FTSYNTH_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - /* Embolden a glyph by a `reasonable' value (which is highly a matter of */ - /* taste). This function is actually a convenience function, providing */ - /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden. */ - /* */ - /* For emboldened outlines the height, width, and advance metrics are */ - /* increased by the strength of the emboldening -- this even affects */ - /* mono-width fonts! */ - /* */ - /* You can also call @FT_Outline_Get_CBox to get precise values. */ - FT_EXPORT( void ) - FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); - - /* Slant an outline glyph to the right by about 12 degrees. */ - FT_EXPORT( void ) - FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTSYNTH_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftsystem.h b/3party/freetype/include/freetype/ftsystem.h deleted file mode 100644 index 2bc999910b..0000000000 --- a/3party/freetype/include/freetype/ftsystem.h +++ /dev/null @@ -1,355 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsystem.h */ -/* */ -/* FreeType low-level system interface definition (specification). */ -/* */ -/* Copyright 1996-2015 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 __FTSYSTEM_H__ -#define __FTSYSTEM_H__ - - -#include <ft2build.h> - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* system_interface */ - /* */ - /* <Title> */ - /* System Interface */ - /* */ - /* <Abstract> */ - /* How FreeType manages memory and i/o. */ - /* */ - /* <Description> */ - /* This section contains various definitions related to memory */ - /* management and i/o access. You need to understand this */ - /* information if you want to use a custom memory manager or you own */ - /* i/o streams. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* M E M O R Y M A N A G E M E N T */ - /* */ - /*************************************************************************/ - - - /************************************************************************* - * - * @type: - * FT_Memory - * - * @description: - * A handle to a given memory manager object, defined with an - * @FT_MemoryRec structure. - * - */ - typedef struct FT_MemoryRec_* FT_Memory; - - - /************************************************************************* - * - * @functype: - * FT_Alloc_Func - * - * @description: - * A function used to allocate `size' bytes from `memory'. - * - * @input: - * memory :: - * A handle to the source memory manager. - * - * size :: - * The size in bytes to allocate. - * - * @return: - * Address of new memory block. 0~in case of failure. - * - */ - typedef void* - (*FT_Alloc_Func)( FT_Memory memory, - long size ); - - - /************************************************************************* - * - * @functype: - * FT_Free_Func - * - * @description: - * A function used to release a given block of memory. - * - * @input: - * memory :: - * A handle to the source memory manager. - * - * block :: - * The address of the target memory block. - * - */ - typedef void - (*FT_Free_Func)( FT_Memory memory, - void* block ); - - - /************************************************************************* - * - * @functype: - * FT_Realloc_Func - * - * @description: - * A function used to re-allocate a given block of memory. - * - * @input: - * memory :: - * A handle to the source memory manager. - * - * cur_size :: - * The block's current size in bytes. - * - * new_size :: - * The block's requested new size. - * - * block :: - * The block's current address. - * - * @return: - * New block address. 0~in case of memory shortage. - * - * @note: - * In case of error, the old block must still be available. - * - */ - typedef void* - (*FT_Realloc_Func)( FT_Memory memory, - long cur_size, - long new_size, - void* block ); - - - /************************************************************************* - * - * @struct: - * FT_MemoryRec - * - * @description: - * A structure used to describe a given memory manager to FreeType~2. - * - * @fields: - * user :: - * A generic typeless pointer for user data. - * - * alloc :: - * A pointer type to an allocation function. - * - * free :: - * A pointer type to an memory freeing function. - * - * realloc :: - * A pointer type to a reallocation function. - * - */ - struct FT_MemoryRec_ - { - void* user; - FT_Alloc_Func alloc; - FT_Free_Func free; - FT_Realloc_Func realloc; - }; - - - /*************************************************************************/ - /* */ - /* I / O M A N A G E M E N T */ - /* */ - /*************************************************************************/ - - - /************************************************************************* - * - * @type: - * FT_Stream - * - * @description: - * A handle to an input stream. - * - * @also: - * See @FT_StreamRec for the publicly accessible fields of a given - * stream object. - * - */ - typedef struct FT_StreamRec_* FT_Stream; - - - /************************************************************************* - * - * @struct: - * FT_StreamDesc - * - * @description: - * A union type used to store either a long or a pointer. This is used - * to store a file descriptor or a `FILE*' in an input stream. - * - */ - typedef union FT_StreamDesc_ - { - long value; - void* pointer; - - } FT_StreamDesc; - - - /************************************************************************* - * - * @functype: - * FT_Stream_IoFunc - * - * @description: - * A function used to seek and read data from a given input stream. - * - * @input: - * stream :: - * A handle to the source stream. - * - * offset :: - * The offset of read in stream (always from start). - * - * buffer :: - * The address of the read buffer. - * - * count :: - * The number of bytes to read from the stream. - * - * @return: - * The number of bytes effectively read by the stream. - * - * @note: - * This function might be called to perform a seek or skip operation - * with a `count' of~0. A non-zero return value then indicates an - * error. - * - */ - typedef unsigned long - (*FT_Stream_IoFunc)( FT_Stream stream, - unsigned long offset, - unsigned char* buffer, - unsigned long count ); - - - /************************************************************************* - * - * @functype: - * FT_Stream_CloseFunc - * - * @description: - * A function used to close a given input stream. - * - * @input: - * stream :: - * A handle to the target stream. - * - */ - typedef void - (*FT_Stream_CloseFunc)( FT_Stream stream ); - - - /************************************************************************* - * - * @struct: - * FT_StreamRec - * - * @description: - * A structure used to describe an input stream. - * - * @input: - * base :: - * For memory-based streams, this is the address of the first stream - * byte in memory. This field should always be set to NULL for - * disk-based streams. - * - * size :: - * The stream size in bytes. - * - * In case of compressed streams where the size is unknown before - * actually doing the decompression, the value is set to 0x7FFFFFFF. - * (Note that this size value can occur for normal streams also; it is - * thus just a hint.) - * - * pos :: - * The current position within the stream. - * - * descriptor :: - * This field is a union that can hold an integer or a pointer. It is - * used by stream implementations to store file descriptors or `FILE*' - * pointers. - * - * pathname :: - * This field is completely ignored by FreeType. However, it is often - * useful during debugging to use it to store the stream's filename - * (where available). - * - * read :: - * The stream's input function. - * - * close :: - * The stream's close function. - * - * memory :: - * The memory manager to use to preload frames. This is set - * internally by FreeType and shouldn't be touched by stream - * implementations. - * - * cursor :: - * This field is set and used internally by FreeType when parsing - * frames. - * - * limit :: - * This field is set and used internally by FreeType when parsing - * frames. - * - */ - typedef struct FT_StreamRec_ - { - unsigned char* base; - unsigned long size; - unsigned long pos; - - FT_StreamDesc descriptor; - FT_StreamDesc pathname; - FT_Stream_IoFunc read; - FT_Stream_CloseFunc close; - - FT_Memory memory; - unsigned char* cursor; - unsigned char* limit; - - } FT_StreamRec; - - /* */ - - -FT_END_HEADER - -#endif /* __FTSYSTEM_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/fttrigon.h b/3party/freetype/include/freetype/fttrigon.h deleted file mode 100644 index 3d821ba16a..0000000000 --- a/3party/freetype/include/freetype/fttrigon.h +++ /dev/null @@ -1,350 +0,0 @@ -/***************************************************************************/ -/* */ -/* fttrigon.h */ -/* */ -/* FreeType trigonometric functions (specification). */ -/* */ -/* Copyright 2001-2015 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 __FTTRIGON_H__ -#define __FTTRIGON_H__ - -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* computations */ - /* */ - /*************************************************************************/ - - - /************************************************************************* - * - * @type: - * FT_Angle - * - * @description: - * This type is used to model angle values in FreeType. Note that the - * angle is a 16.16 fixed-point value expressed in degrees. - * - */ - typedef FT_Fixed FT_Angle; - - - /************************************************************************* - * - * @macro: - * FT_ANGLE_PI - * - * @description: - * The angle pi expressed in @FT_Angle units. - * - */ -#define FT_ANGLE_PI ( 180L << 16 ) - - - /************************************************************************* - * - * @macro: - * FT_ANGLE_2PI - * - * @description: - * The angle 2*pi expressed in @FT_Angle units. - * - */ -#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 ) - - - /************************************************************************* - * - * @macro: - * FT_ANGLE_PI2 - * - * @description: - * The angle pi/2 expressed in @FT_Angle units. - * - */ -#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 ) - - - /************************************************************************* - * - * @macro: - * FT_ANGLE_PI4 - * - * @description: - * The angle pi/4 expressed in @FT_Angle units. - * - */ -#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 ) - - - /************************************************************************* - * - * @function: - * FT_Sin - * - * @description: - * Return the sinus of a given angle in fixed-point format. - * - * @input: - * angle :: - * The input angle. - * - * @return: - * The sinus value. - * - * @note: - * If you need both the sinus and cosinus for a given angle, use the - * function @FT_Vector_Unit. - * - */ - FT_EXPORT( FT_Fixed ) - FT_Sin( FT_Angle angle ); - - - /************************************************************************* - * - * @function: - * FT_Cos - * - * @description: - * Return the cosinus of a given angle in fixed-point format. - * - * @input: - * angle :: - * The input angle. - * - * @return: - * The cosinus value. - * - * @note: - * If you need both the sinus and cosinus for a given angle, use the - * function @FT_Vector_Unit. - * - */ - FT_EXPORT( FT_Fixed ) - FT_Cos( FT_Angle angle ); - - - /************************************************************************* - * - * @function: - * FT_Tan - * - * @description: - * Return the tangent of a given angle in fixed-point format. - * - * @input: - * angle :: - * The input angle. - * - * @return: - * The tangent value. - * - */ - FT_EXPORT( FT_Fixed ) - FT_Tan( FT_Angle angle ); - - - /************************************************************************* - * - * @function: - * FT_Atan2 - * - * @description: - * Return the arc-tangent corresponding to a given vector (x,y) in - * the 2d plane. - * - * @input: - * x :: - * The horizontal vector coordinate. - * - * y :: - * The vertical vector coordinate. - * - * @return: - * The arc-tangent value (i.e. angle). - * - */ - FT_EXPORT( FT_Angle ) - FT_Atan2( FT_Fixed x, - FT_Fixed y ); - - - /************************************************************************* - * - * @function: - * FT_Angle_Diff - * - * @description: - * Return the difference between two angles. The result is always - * constrained to the ]-PI..PI] interval. - * - * @input: - * angle1 :: - * First angle. - * - * angle2 :: - * Second angle. - * - * @return: - * Constrained value of `value2-value1'. - * - */ - FT_EXPORT( FT_Angle ) - FT_Angle_Diff( FT_Angle angle1, - FT_Angle angle2 ); - - - /************************************************************************* - * - * @function: - * FT_Vector_Unit - * - * @description: - * Return the unit vector corresponding to a given angle. After the - * call, the value of `vec.x' will be `sin(angle)', and the value of - * `vec.y' will be `cos(angle)'. - * - * This function is useful to retrieve both the sinus and cosinus of a - * given angle quickly. - * - * @output: - * vec :: - * The address of target vector. - * - * @input: - * angle :: - * The input angle. - * - */ - FT_EXPORT( void ) - FT_Vector_Unit( FT_Vector* vec, - FT_Angle angle ); - - - /************************************************************************* - * - * @function: - * FT_Vector_Rotate - * - * @description: - * Rotate a vector by a given angle. - * - * @inout: - * vec :: - * The address of target vector. - * - * @input: - * angle :: - * The input angle. - * - */ - FT_EXPORT( void ) - FT_Vector_Rotate( FT_Vector* vec, - FT_Angle angle ); - - - /************************************************************************* - * - * @function: - * FT_Vector_Length - * - * @description: - * Return the length of a given vector. - * - * @input: - * vec :: - * The address of target vector. - * - * @return: - * The vector length, expressed in the same units that the original - * vector coordinates. - * - */ - FT_EXPORT( FT_Fixed ) - FT_Vector_Length( FT_Vector* vec ); - - - /************************************************************************* - * - * @function: - * FT_Vector_Polarize - * - * @description: - * Compute both the length and angle of a given vector. - * - * @input: - * vec :: - * The address of source vector. - * - * @output: - * length :: - * The vector length. - * - * angle :: - * The vector angle. - * - */ - FT_EXPORT( void ) - FT_Vector_Polarize( FT_Vector* vec, - FT_Fixed *length, - FT_Angle *angle ); - - - /************************************************************************* - * - * @function: - * FT_Vector_From_Polar - * - * @description: - * Compute vector coordinates from a length and angle. - * - * @output: - * vec :: - * The address of source vector. - * - * @input: - * length :: - * The vector length. - * - * angle :: - * The vector angle. - * - */ - FT_EXPORT( void ) - FT_Vector_From_Polar( FT_Vector* vec, - FT_Fixed length, - FT_Angle angle ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTTRIGON_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftttdrv.h b/3party/freetype/include/freetype/ftttdrv.h deleted file mode 100644 index f56040b828..0000000000 --- a/3party/freetype/include/freetype/ftttdrv.h +++ /dev/null @@ -1,233 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftttdrv.h */ -/* */ -/* FreeType API for controlling the TrueType driver */ -/* (specification only). */ -/* */ -/* Copyright 2013-2015 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 __FTTTDRV_H__ -#define __FTTTDRV_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /************************************************************************** - * - * @section: - * tt_driver - * - * @title: - * The TrueType driver - * - * @abstract: - * Controlling the TrueType driver module. - * - * @description: - * While FreeType's TrueType driver doesn't expose API functions by - * itself, it is possible to control its behaviour with @FT_Property_Set - * and @FT_Property_Get. The following lists the available properties - * together with the necessary macros and structures. - * - * The TrueType driver's module name is `truetype'. - * - */ - - - /************************************************************************** - * - * @property: - * interpreter-version - * - * @description: - * Currently, two versions are available, representing the bytecode - * interpreter with and without subpixel hinting support, - * respectively. The default is subpixel support if - * TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel - * support otherwise (since it isn't available then). - * - * If subpixel hinting is on, many TrueType bytecode instructions behave - * differently compared to B/W or grayscale rendering (except if `native - * ClearType' is selected by the font). The main idea is to render at a - * much increased horizontal resolution, then sampling down the created - * output to subpixel precision. However, many older fonts are not - * suited to this and must be specially taken care of by applying - * (hardcoded) font-specific tweaks. - * - * Details on subpixel hinting and some of the necessary tweaks can be - * found in Greg Hitchcock's whitepaper at - * `http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'. - * - * The following example code demonstrates how to activate subpixel - * hinting (omitting the error handling). - * - * { - * FT_Library library; - * FT_Face face; - * FT_UInt interpreter_version = TT_INTERPRETER_VERSION_38; - * - * - * FT_Init_FreeType( &library ); - * - * FT_Property_Set( library, "truetype", - * "interpreter-version", - * &interpreter_version ); - * } - * - * @note: - * This property can be used with @FT_Property_Get also. - * - */ - - - /************************************************************************** - * - * @enum: - * TT_INTERPRETER_VERSION_XXX - * - * @description: - * A list of constants used for the @interpreter-version property to - * select the hinting engine for Truetype fonts. - * - * The numeric value in the constant names represents the version - * number as returned by the `GETINFO' bytecode instruction. - * - * @values: - * TT_INTERPRETER_VERSION_35 :: - * Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in - * Windows~98; only grayscale and B/W rasterizing is supported. - * - * TT_INTERPRETER_VERSION_38 :: - * Version~38 corresponds to MS rasterizer v.1.9; it is roughly - * equivalent to the hinting provided by DirectWrite ClearType (as - * can be found, for example, in the Internet Explorer~9 running on - * Windows~7). - * - * @note: - * This property controls the behaviour of the bytecode interpreter - * and thus how outlines get hinted. It does *not* control how glyph - * get rasterized! In particular, it does not control subpixel color - * filtering. - * - * If FreeType has not been compiled with configuration option - * FT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 causes an - * `FT_Err_Unimplemented_Feature' error. - * - * Depending on the graphics framework, Microsoft uses different - * bytecode and rendering engines. As a consequence, the version - * numbers returned by a call to the `GETINFO' bytecode instruction are - * more convoluted than desired. - * - * Here are two tables that try to shed some light on the possible - * values for the MS rasterizer engine, together with the additional - * features introduced by it. - * - * { - * GETINFO framework version feature - * ------------------------------------------------------------------- - * 3 GDI (Win 3.1), v1.0 16-bit, first version - * TrueImage - * 33 GDI (Win NT 3.1), v1.5 32-bit - * HP Laserjet - * 34 GDI (Win 95) v1.6 font smoothing, - * new SCANTYPE opcode - * 35 GDI (Win 98/2000) v1.7 (UN)SCALED_COMPONENT_OFFSET - * bits in composite glyphs - * 36 MGDI (Win CE 2) v1.6+ classic ClearType - * 37 GDI (XP and later), v1.8 ClearType - * GDI+ old (before Vista) - * 38 GDI+ old (Vista, Win 7), v1.9 subpixel ClearType, - * WPF Y-direction ClearType, - * additional error checking - * 39 DWrite (before Win 8) v2.0 subpixel ClearType flags - * in GETINFO opcode, - * bug fixes - * 40 GDI+ (after Win 7), v2.1 Y-direction ClearType flag - * DWrite (Win 8) in GETINFO opcode, - * Gray ClearType - * } - * - * The `version' field gives a rough orientation only, since some - * applications provided certain features much earlier (as an example, - * Microsoft Reader used subpixel and Y-direction ClearType already in - * Windows 2000). Similarly, updates to a given framework might include - * improved hinting support. - * - * { - * version sampling rendering comment - * x y x y - * -------------------------------------------------------------- - * v1.0 normal normal B/W B/W bi-level - * v1.6 high high gray gray grayscale - * v1.8 high normal color-filter B/W (GDI) ClearType - * v1.9 high high color-filter gray Color ClearType - * v2.1 high normal gray B/W Gray ClearType - * v2.1 high high gray gray Gray ClearType - * } - * - * Color and Gray ClearType are the two available variants of - * `Y-direction ClearType', meaning grayscale rasterization along the - * Y-direction; the name used in the TrueType specification for this - * feature is `symmetric smoothing'. `Classic ClearType' is the - * original algorithm used before introducing a modified version in - * Win~XP. Another name for v1.6's grayscale rendering is `font - * smoothing', and `Color ClearType' is sometimes also called `DWrite - * ClearType'. To differentiate between today's Color ClearType and the - * earlier ClearType variant with B/W rendering along the vertical axis, - * the latter is sometimes called `GDI ClearType'. - * - * `Normal' and `high' sampling describe the (virtual) resolution to - * access the rasterized outline after the hinting process. `Normal' - * means 1 sample per grid line (i.e., B/W). In the current Microsoft - * implementation, `high' means an extra virtual resolution of 16x16 (or - * 16x1) grid lines per pixel for bytecode instructions like `MIRP'. - * After hinting, these 16 grid lines are mapped to 6x5 (or 6x1) grid - * lines for color filtering if Color ClearType is activated. - * - * Note that `Gray ClearType' is essentially the same as v1.6's - * grayscale rendering. However, the GETINFO instruction handles it - * differently: v1.6 returns bit~12 (hinting for grayscale), while v2.1 - * returns bits~13 (hinting for ClearType), 18 (symmetrical smoothing), - * and~19 (Gray ClearType). Also, this mode respects bits 2 and~3 for - * the version~1 gasp table exclusively (like Color ClearType), while - * v1.6 only respects the values of version~0 (bits 0 and~1). - * - * FreeType doesn't provide all capabilities of the most recent - * ClearType incarnation, thus we identify our subpixel support as - * version~38. - * - */ -#define TT_INTERPRETER_VERSION_35 35 -#define TT_INTERPRETER_VERSION_38 38 - - /* */ - - -FT_END_HEADER - - -#endif /* __FTTTDRV_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/fttypes.h b/3party/freetype/include/freetype/fttypes.h deleted file mode 100644 index 706a1be4ef..0000000000 --- a/3party/freetype/include/freetype/fttypes.h +++ /dev/null @@ -1,602 +0,0 @@ -/***************************************************************************/ -/* */ -/* fttypes.h */ -/* */ -/* FreeType simple types definitions (specification only). */ -/* */ -/* Copyright 1996-2015 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 __FTTYPES_H__ -#define __FTTYPES_H__ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_SYSTEM_H -#include FT_IMAGE_H - -#include <stddef.h> - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* basic_types */ - /* */ - /* <Title> */ - /* Basic Data Types */ - /* */ - /* <Abstract> */ - /* The basic data types defined by the library. */ - /* */ - /* <Description> */ - /* This section contains the basic data types defined by FreeType~2, */ - /* ranging from simple scalar types to bitmap descriptors. More */ - /* font-specific structures are defined in a different section. */ - /* */ - /* <Order> */ - /* FT_Byte */ - /* FT_Bytes */ - /* FT_Char */ - /* FT_Int */ - /* FT_UInt */ - /* FT_Int16 */ - /* FT_UInt16 */ - /* FT_Int32 */ - /* FT_UInt32 */ - /* FT_Int64 */ - /* FT_UInt64 */ - /* FT_Short */ - /* FT_UShort */ - /* FT_Long */ - /* FT_ULong */ - /* FT_Bool */ - /* FT_Offset */ - /* FT_PtrDist */ - /* FT_String */ - /* FT_Tag */ - /* FT_Error */ - /* FT_Fixed */ - /* FT_Pointer */ - /* FT_Pos */ - /* FT_Vector */ - /* FT_BBox */ - /* FT_Matrix */ - /* FT_FWord */ - /* FT_UFWord */ - /* FT_F2Dot14 */ - /* FT_UnitVector */ - /* FT_F26Dot6 */ - /* FT_Data */ - /* */ - /* FT_MAKE_TAG */ - /* */ - /* FT_Generic */ - /* FT_Generic_Finalizer */ - /* */ - /* FT_Bitmap */ - /* FT_Pixel_Mode */ - /* FT_Palette_Mode */ - /* FT_Glyph_Format */ - /* FT_IMAGE_TAG */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Bool */ - /* */ - /* <Description> */ - /* A typedef of unsigned char, used for simple booleans. As usual, */ - /* values 1 and~0 represent true and false, respectively. */ - /* */ - typedef unsigned char FT_Bool; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_FWord */ - /* */ - /* <Description> */ - /* A signed 16-bit integer used to store a distance in original font */ - /* units. */ - /* */ - typedef signed short FT_FWord; /* distance in FUnits */ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_UFWord */ - /* */ - /* <Description> */ - /* An unsigned 16-bit integer used to store a distance in original */ - /* font units. */ - /* */ - typedef unsigned short FT_UFWord; /* unsigned distance */ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Char */ - /* */ - /* <Description> */ - /* A simple typedef for the _signed_ char type. */ - /* */ - typedef signed char FT_Char; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Byte */ - /* */ - /* <Description> */ - /* A simple typedef for the _unsigned_ char type. */ - /* */ - typedef unsigned char FT_Byte; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Bytes */ - /* */ - /* <Description> */ - /* A typedef for constant memory areas. */ - /* */ - typedef const FT_Byte* FT_Bytes; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Tag */ - /* */ - /* <Description> */ - /* A typedef for 32-bit tags (as used in the SFNT format). */ - /* */ - typedef FT_UInt32 FT_Tag; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_String */ - /* */ - /* <Description> */ - /* A simple typedef for the char type, usually used for strings. */ - /* */ - typedef char FT_String; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Short */ - /* */ - /* <Description> */ - /* A typedef for signed short. */ - /* */ - typedef signed short FT_Short; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_UShort */ - /* */ - /* <Description> */ - /* A typedef for unsigned short. */ - /* */ - typedef unsigned short FT_UShort; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Int */ - /* */ - /* <Description> */ - /* A typedef for the int type. */ - /* */ - typedef signed int FT_Int; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_UInt */ - /* */ - /* <Description> */ - /* A typedef for the unsigned int type. */ - /* */ - typedef unsigned int FT_UInt; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Long */ - /* */ - /* <Description> */ - /* A typedef for signed long. */ - /* */ - typedef signed long FT_Long; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_ULong */ - /* */ - /* <Description> */ - /* A typedef for unsigned long. */ - /* */ - typedef unsigned long FT_ULong; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_F2Dot14 */ - /* */ - /* <Description> */ - /* A signed 2.14 fixed-point type used for unit vectors. */ - /* */ - typedef signed short FT_F2Dot14; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_F26Dot6 */ - /* */ - /* <Description> */ - /* A signed 26.6 fixed-point type used for vectorial pixel */ - /* coordinates. */ - /* */ - typedef signed long FT_F26Dot6; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Fixed */ - /* */ - /* <Description> */ - /* This type is used to store 16.16 fixed-point values, like scaling */ - /* values or matrix coefficients. */ - /* */ - typedef signed long FT_Fixed; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Error */ - /* */ - /* <Description> */ - /* The FreeType error code type. A value of~0 is always interpreted */ - /* as a successful operation. */ - /* */ - typedef int FT_Error; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Pointer */ - /* */ - /* <Description> */ - /* A simple typedef for a typeless pointer. */ - /* */ - typedef void* FT_Pointer; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Offset */ - /* */ - /* <Description> */ - /* This is equivalent to the ANSI~C `size_t' type, i.e., the largest */ - /* _unsigned_ integer type used to express a file size or position, */ - /* or a memory block size. */ - /* */ - typedef size_t FT_Offset; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_PtrDist */ - /* */ - /* <Description> */ - /* This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the */ - /* largest _signed_ integer type used to express the distance */ - /* between two pointers. */ - /* */ - typedef ft_ptrdiff_t FT_PtrDist; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_UnitVector */ - /* */ - /* <Description> */ - /* A simple structure used to store a 2D vector unit vector. Uses */ - /* FT_F2Dot14 types. */ - /* */ - /* <Fields> */ - /* x :: Horizontal coordinate. */ - /* */ - /* y :: Vertical coordinate. */ - /* */ - typedef struct FT_UnitVector_ - { - FT_F2Dot14 x; - FT_F2Dot14 y; - - } FT_UnitVector; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Matrix */ - /* */ - /* <Description> */ - /* A simple structure used to store a 2x2 matrix. Coefficients are */ - /* in 16.16 fixed-point format. The computation performed is: */ - /* */ - /* { */ - /* x' = x*xx + y*xy */ - /* y' = x*yx + y*yy */ - /* } */ - /* */ - /* <Fields> */ - /* xx :: Matrix coefficient. */ - /* */ - /* xy :: Matrix coefficient. */ - /* */ - /* yx :: Matrix coefficient. */ - /* */ - /* yy :: Matrix coefficient. */ - /* */ - typedef struct FT_Matrix_ - { - FT_Fixed xx, xy; - FT_Fixed yx, yy; - - } FT_Matrix; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Data */ - /* */ - /* <Description> */ - /* Read-only binary data represented as a pointer and a length. */ - /* */ - /* <Fields> */ - /* pointer :: The data. */ - /* */ - /* length :: The length of the data in bytes. */ - /* */ - typedef struct FT_Data_ - { - const FT_Byte* pointer; - FT_Int length; - - } FT_Data; - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Generic_Finalizer */ - /* */ - /* <Description> */ - /* Describe a function used to destroy the `client' data of any */ - /* FreeType object. See the description of the @FT_Generic type for */ - /* details of usage. */ - /* */ - /* <Input> */ - /* The address of the FreeType object that is under finalization. */ - /* Its client data is accessed through its `generic' field. */ - /* */ - typedef void (*FT_Generic_Finalizer)(void* object); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Generic */ - /* */ - /* <Description> */ - /* Client applications often need to associate their own data to a */ - /* variety of FreeType core objects. For example, a text layout API */ - /* might want to associate a glyph cache to a given size object. */ - /* */ - /* Some FreeType object contains a `generic' field, of type */ - /* FT_Generic, which usage is left to client applications and font */ - /* servers. */ - /* */ - /* It can be used to store a pointer to client-specific data, as well */ - /* as the address of a `finalizer' function, which will be called by */ - /* FreeType when the object is destroyed (for example, the previous */ - /* client example would put the address of the glyph cache destructor */ - /* in the `finalizer' field). */ - /* */ - /* <Fields> */ - /* data :: A typeless pointer to any client-specified data. This */ - /* field is completely ignored by the FreeType library. */ - /* */ - /* finalizer :: A pointer to a `generic finalizer' function, which */ - /* will be called when the object is destroyed. If this */ - /* field is set to NULL, no code will be called. */ - /* */ - typedef struct FT_Generic_ - { - void* data; - FT_Generic_Finalizer finalizer; - - } FT_Generic; - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_MAKE_TAG */ - /* */ - /* <Description> */ - /* This macro converts four-letter tags that are used to label */ - /* TrueType tables into an unsigned long, to be used within FreeType. */ - /* */ - /* <Note> */ - /* The produced values *must* be 32-bit integers. Don't redefine */ - /* this macro. */ - /* */ -#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ - (FT_Tag) \ - ( ( (FT_ULong)_x1 << 24 ) | \ - ( (FT_ULong)_x2 << 16 ) | \ - ( (FT_ULong)_x3 << 8 ) | \ - (FT_ULong)_x4 ) - - - /*************************************************************************/ - /*************************************************************************/ - /* */ - /* L I S T M A N A G E M E N T */ - /* */ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* list_processing */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_ListNode */ - /* */ - /* <Description> */ - /* Many elements and objects in FreeType are listed through an */ - /* @FT_List record (see @FT_ListRec). As its name suggests, an */ - /* FT_ListNode is a handle to a single list element. */ - /* */ - typedef struct FT_ListNodeRec_* FT_ListNode; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_List */ - /* */ - /* <Description> */ - /* A handle to a list record (see @FT_ListRec). */ - /* */ - typedef struct FT_ListRec_* FT_List; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_ListNodeRec */ - /* */ - /* <Description> */ - /* A structure used to hold a single list element. */ - /* */ - /* <Fields> */ - /* prev :: The previous element in the list. NULL if first. */ - /* */ - /* next :: The next element in the list. NULL if last. */ - /* */ - /* data :: A typeless pointer to the listed object. */ - /* */ - typedef struct FT_ListNodeRec_ - { - FT_ListNode prev; - FT_ListNode next; - void* data; - - } FT_ListNodeRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_ListRec */ - /* */ - /* <Description> */ - /* A structure used to hold a simple doubly-linked list. These are */ - /* used in many parts of FreeType. */ - /* */ - /* <Fields> */ - /* head :: The head (first element) of doubly-linked list. */ - /* */ - /* tail :: The tail (last element) of doubly-linked list. */ - /* */ - typedef struct FT_ListRec_ - { - FT_ListNode head; - FT_ListNode tail; - - } FT_ListRec; - - /* */ - - -#define FT_IS_EMPTY( list ) ( (list).head == 0 ) -#define FT_BOOL( x ) ( (FT_Bool)( x ) ) - - /* concatenate C tokens */ -#define FT_ERR_XCAT( x, y ) x ## y -#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) - - /* see `ftmoderr.h' for descriptions of the following macros */ - -#define FT_ERR( e ) FT_ERR_CAT( FT_ERR_PREFIX, e ) - -#define FT_ERROR_BASE( x ) ( (x) & 0xFF ) -#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U ) - -#define FT_ERR_EQ( x, e ) \ - ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) ) -#define FT_ERR_NEQ( x, e ) \ - ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) ) - - -FT_END_HEADER - -#endif /* __FTTYPES_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ftwinfnt.h b/3party/freetype/include/freetype/ftwinfnt.h deleted file mode 100644 index caedaa1cc7..0000000000 --- a/3party/freetype/include/freetype/ftwinfnt.h +++ /dev/null @@ -1,275 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftwinfnt.h */ -/* */ -/* FreeType API for accessing Windows fnt-specific data. */ -/* */ -/* Copyright 2003-2015 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 __FTWINFNT_H__ -#define __FTWINFNT_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* winfnt_fonts */ - /* */ - /* <Title> */ - /* Window FNT Files */ - /* */ - /* <Abstract> */ - /* Windows FNT specific API. */ - /* */ - /* <Description> */ - /* This section contains the declaration of Windows FNT specific */ - /* functions. */ - /* */ - /*************************************************************************/ - - - /************************************************************************* - * - * @enum: - * FT_WinFNT_ID_XXX - * - * @description: - * A list of valid values for the `charset' byte in - * @FT_WinFNT_HeaderRec. Exact mapping tables for the various cpXXXX - * encodings (except for cp1361) can be found at - * ftp://ftp.unicode.org/Public in the MAPPINGS/VENDORS/MICSFT/WINDOWS - * subdirectory. cp1361 is roughly a superset of - * MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT. - * - * @values: - * FT_WinFNT_ID_DEFAULT :: - * This is used for font enumeration and font creation as a - * `don't care' value. Valid font files don't contain this value. - * When querying for information about the character set of the font - * that is currently selected into a specified device context, this - * return value (of the related Windows API) simply denotes failure. - * - * FT_WinFNT_ID_SYMBOL :: - * There is no known mapping table available. - * - * FT_WinFNT_ID_MAC :: - * Mac Roman encoding. - * - * FT_WinFNT_ID_OEM :: - * From Michael Pöttgen <michael@poettgen.de>: - * - * The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM - * is used for the charset of vector fonts, like `modern.fon', - * `roman.fon', and `script.fon' on Windows. - * - * The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value - * specifies a character set that is operating-system dependent. - * - * The `IFIMETRICS' documentation from the `Windows Driver - * Development Kit' says: This font supports an OEM-specific - * character set. The OEM character set is system dependent. - * - * In general OEM, as opposed to ANSI (i.e., cp1252), denotes the - * second default codepage that most international versions of - * Windows have. It is one of the OEM codepages from - * - * https://msdn.microsoft.com/en-us/goglobal/bb964655, - * - * and is used for the `DOS boxes', to support legacy applications. - * A German Windows version for example usually uses ANSI codepage - * 1252 and OEM codepage 850. - * - * FT_WinFNT_ID_CP874 :: - * A superset of Thai TIS 620 and ISO 8859-11. - * - * FT_WinFNT_ID_CP932 :: - * A superset of Japanese Shift-JIS (with minor deviations). - * - * FT_WinFNT_ID_CP936 :: - * A superset of simplified Chinese GB 2312-1980 (with different - * ordering and minor deviations). - * - * FT_WinFNT_ID_CP949 :: - * A superset of Korean Hangul KS~C 5601-1987 (with different - * ordering and minor deviations). - * - * FT_WinFNT_ID_CP950 :: - * A superset of traditional Chinese Big~5 ETen (with different - * ordering and minor deviations). - * - * FT_WinFNT_ID_CP1250 :: - * A superset of East European ISO 8859-2 (with slightly different - * ordering). - * - * FT_WinFNT_ID_CP1251 :: - * A superset of Russian ISO 8859-5 (with different ordering). - * - * FT_WinFNT_ID_CP1252 :: - * ANSI encoding. A superset of ISO 8859-1. - * - * FT_WinFNT_ID_CP1253 :: - * A superset of Greek ISO 8859-7 (with minor modifications). - * - * FT_WinFNT_ID_CP1254 :: - * A superset of Turkish ISO 8859-9. - * - * FT_WinFNT_ID_CP1255 :: - * A superset of Hebrew ISO 8859-8 (with some modifications). - * - * FT_WinFNT_ID_CP1256 :: - * A superset of Arabic ISO 8859-6 (with different ordering). - * - * FT_WinFNT_ID_CP1257 :: - * A superset of Baltic ISO 8859-13 (with some deviations). - * - * FT_WinFNT_ID_CP1258 :: - * For Vietnamese. This encoding doesn't cover all necessary - * characters. - * - * FT_WinFNT_ID_CP1361 :: - * Korean (Johab). - */ - -#define FT_WinFNT_ID_CP1252 0 -#define FT_WinFNT_ID_DEFAULT 1 -#define FT_WinFNT_ID_SYMBOL 2 -#define FT_WinFNT_ID_MAC 77 -#define FT_WinFNT_ID_CP932 128 -#define FT_WinFNT_ID_CP949 129 -#define FT_WinFNT_ID_CP1361 130 -#define FT_WinFNT_ID_CP936 134 -#define FT_WinFNT_ID_CP950 136 -#define FT_WinFNT_ID_CP1253 161 -#define FT_WinFNT_ID_CP1254 162 -#define FT_WinFNT_ID_CP1258 163 -#define FT_WinFNT_ID_CP1255 177 -#define FT_WinFNT_ID_CP1256 178 -#define FT_WinFNT_ID_CP1257 186 -#define FT_WinFNT_ID_CP1251 204 -#define FT_WinFNT_ID_CP874 222 -#define FT_WinFNT_ID_CP1250 238 -#define FT_WinFNT_ID_OEM 255 - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_WinFNT_HeaderRec */ - /* */ - /* <Description> */ - /* Windows FNT Header info. */ - /* */ - typedef struct FT_WinFNT_HeaderRec_ - { - FT_UShort version; - FT_ULong file_size; - FT_Byte copyright[60]; - FT_UShort file_type; - FT_UShort nominal_point_size; - FT_UShort vertical_resolution; - FT_UShort horizontal_resolution; - FT_UShort ascent; - FT_UShort internal_leading; - FT_UShort external_leading; - FT_Byte italic; - FT_Byte underline; - FT_Byte strike_out; - FT_UShort weight; - FT_Byte charset; - FT_UShort pixel_width; - FT_UShort pixel_height; - FT_Byte pitch_and_family; - FT_UShort avg_width; - FT_UShort max_width; - FT_Byte first_char; - FT_Byte last_char; - FT_Byte default_char; - FT_Byte break_char; - FT_UShort bytes_per_row; - FT_ULong device_offset; - FT_ULong face_name_offset; - FT_ULong bits_pointer; - FT_ULong bits_offset; - FT_Byte reserved; - FT_ULong flags; - FT_UShort A_space; - FT_UShort B_space; - FT_UShort C_space; - FT_UShort color_table_offset; - FT_ULong reserved1[4]; - - } FT_WinFNT_HeaderRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_WinFNT_Header */ - /* */ - /* <Description> */ - /* A handle to an @FT_WinFNT_HeaderRec structure. */ - /* */ - typedef struct FT_WinFNT_HeaderRec_* FT_WinFNT_Header; - - - /********************************************************************** - * - * @function: - * FT_Get_WinFNT_Header - * - * @description: - * Retrieve a Windows FNT font info header. - * - * @input: - * face :: A handle to the input face. - * - * @output: - * aheader :: The WinFNT header. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with Windows FNT faces, returning an error - * otherwise. - */ - FT_EXPORT( FT_Error ) - FT_Get_WinFNT_Header( FT_Face face, - FT_WinFNT_HeaderRec *aheader ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTWINFNT_H__ */ - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/3party/freetype/include/freetype/internal/autohint.h b/3party/freetype/include/freetype/internal/autohint.h deleted file mode 100644 index 8d5a9773cb..0000000000 --- a/3party/freetype/include/freetype/internal/autohint.h +++ /dev/null @@ -1,244 +0,0 @@ -/***************************************************************************/ -/* */ -/* autohint.h */ -/* */ -/* High-level `autohint' module-specific interface (specification). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* The auto-hinter is used to load and automatically hint glyphs if a */ - /* format-specific hinter isn't available. */ - /* */ - /*************************************************************************/ - - -#ifndef __AUTOHINT_H__ -#define __AUTOHINT_H__ - - - /*************************************************************************/ - /* */ - /* A small technical note regarding automatic hinting in order to */ - /* clarify this module interface. */ - /* */ - /* An automatic hinter might compute two kinds of data for a given face: */ - /* */ - /* - global hints: Usually some metrics that describe global properties */ - /* of the face. It is computed by scanning more or less */ - /* aggressively the glyphs in the face, and thus can be */ - /* very slow to compute (even if the size of global */ - /* hints is really small). */ - /* */ - /* - glyph hints: These describe some important features of the glyph */ - /* outline, as well as how to align them. They are */ - /* generally much faster to compute than global hints. */ - /* */ - /* The current FreeType auto-hinter does a pretty good job while */ - /* performing fast computations for both global and glyph hints. */ - /* However, we might be interested in introducing more complex and */ - /* powerful algorithms in the future, like the one described in the John */ - /* D. Hobby paper, which unfortunately requires a lot more horsepower. */ - /* */ - /* Because a sufficiently sophisticated font management system would */ - /* typically implement an LRU cache of opened face objects to reduce */ - /* memory usage, it is a good idea to be able to avoid recomputing */ - /* global hints every time the same face is re-opened. */ - /* */ - /* We thus provide the ability to cache global hints outside of the face */ - /* object, in order to speed up font re-opening time. Of course, this */ - /* feature is purely optional, so most client programs won't even notice */ - /* it. */ - /* */ - /* I initially thought that it would be a good idea to cache the glyph */ - /* hints too. However, my general idea now is that if you really need */ - /* to cache these too, you are simply in need of a new font format, */ - /* where all this information could be stored within the font file and */ - /* decoded on the fly. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - typedef struct FT_AutoHinterRec_ *FT_AutoHinter; - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_AutoHinter_GlobalGetFunc */ - /* */ - /* <Description> */ - /* Retrieve the global hints computed for a given face object. The */ - /* resulting data is dissociated from the face and will survive a */ - /* call to FT_Done_Face(). It must be discarded through the API */ - /* FT_AutoHinter_GlobalDoneFunc(). */ - /* */ - /* <Input> */ - /* hinter :: A handle to the source auto-hinter. */ - /* */ - /* face :: A handle to the source face object. */ - /* */ - /* <Output> */ - /* global_hints :: A typeless pointer to the global hints. */ - /* */ - /* global_len :: The size in bytes of the global hints. */ - /* */ - typedef void - (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter hinter, - FT_Face face, - void** global_hints, - long* global_len ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_AutoHinter_GlobalDoneFunc */ - /* */ - /* <Description> */ - /* Discard the global hints retrieved through */ - /* FT_AutoHinter_GlobalGetFunc(). This is the only way these hints */ - /* are freed from memory. */ - /* */ - /* <Input> */ - /* hinter :: A handle to the auto-hinter module. */ - /* */ - /* global :: A pointer to retrieved global hints to discard. */ - /* */ - typedef void - (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter hinter, - void* global ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_AutoHinter_GlobalResetFunc */ - /* */ - /* <Description> */ - /* This function is used to recompute the global metrics in a given */ - /* font. This is useful when global font data changes (e.g. Multiple */ - /* Masters fonts where blend coordinates change). */ - /* */ - /* <Input> */ - /* hinter :: A handle to the source auto-hinter. */ - /* */ - /* face :: A handle to the face. */ - /* */ - typedef void - (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter hinter, - FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_AutoHinter_GlyphLoadFunc */ - /* */ - /* <Description> */ - /* This function is used to load, scale, and automatically hint a */ - /* glyph from a given face. */ - /* */ - /* <Input> */ - /* face :: A handle to the face. */ - /* */ - /* glyph_index :: The glyph index. */ - /* */ - /* load_flags :: The load flags. */ - /* */ - /* <Note> */ - /* This function is capable of loading composite glyphs by hinting */ - /* each sub-glyph independently (which improves quality). */ - /* */ - /* It will call the font driver with @FT_Load_Glyph, with */ - /* @FT_LOAD_NO_SCALE set. */ - /* */ - typedef FT_Error - (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter hinter, - FT_GlyphSlot slot, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_AutoHinter_InterfaceRec */ - /* */ - /* <Description> */ - /* The auto-hinter module's interface. */ - /* */ - typedef struct FT_AutoHinter_InterfaceRec_ - { - FT_AutoHinter_GlobalResetFunc reset_face; - FT_AutoHinter_GlobalGetFunc get_global_hints; - FT_AutoHinter_GlobalDoneFunc done_global_hints; - FT_AutoHinter_GlyphLoadFunc load_glyph; - - } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_AUTOHINTER_INTERFACE( \ - class_, \ - reset_face_, \ - get_global_hints_, \ - done_global_hints_, \ - load_glyph_ ) \ - FT_CALLBACK_TABLE_DEF \ - const FT_AutoHinter_InterfaceRec class_ = \ - { \ - reset_face_, \ - get_global_hints_, \ - done_global_hints_, \ - load_glyph_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_AUTOHINTER_INTERFACE( \ - class_, \ - reset_face_, \ - get_global_hints_, \ - done_global_hints_, \ - load_glyph_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Library library, \ - FT_AutoHinter_InterfaceRec* clazz ) \ - { \ - FT_UNUSED( library ); \ - \ - clazz->reset_face = reset_face_; \ - clazz->get_global_hints = get_global_hints_; \ - clazz->done_global_hints = done_global_hints_; \ - clazz->load_glyph = load_glyph_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - -FT_END_HEADER - -#endif /* __AUTOHINT_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/ftcalc.h b/3party/freetype/include/freetype/internal/ftcalc.h deleted file mode 100644 index 67ade7e5f9..0000000000 --- a/3party/freetype/include/freetype/internal/ftcalc.h +++ /dev/null @@ -1,418 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcalc.h */ -/* */ -/* Arithmetic computations (specification). */ -/* */ -/* Copyright 1996-2015 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 __FTCALC_H__ -#define __FTCALC_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */ - /* */ - /*************************************************************************/ - -#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER - /* Provide assembler fragments for performance-critical functions. */ - /* These must be defined `static __inline__' with GCC. */ - -#if defined( __CC_ARM ) || defined( __ARMCC__ ) /* RVCT */ - -#define FT_MULFIX_ASSEMBLER FT_MulFix_arm - - /* documentation is in freetype.h */ - - static __inline FT_Int32 - FT_MulFix_arm( FT_Int32 a, - FT_Int32 b ) - { - register FT_Int32 t, t2; - - - __asm - { - smull t2, t, b, a /* (lo=t2,hi=t) = a*b */ - mov a, t, asr #31 /* a = (hi >> 31) */ - add a, a, #0x8000 /* a += 0x8000 */ - adds t2, t2, a /* t2 += a */ - adc t, t, #0 /* t += carry */ - mov a, t2, lsr #16 /* a = t2 >> 16 */ - orr a, a, t, lsl #16 /* a |= t << 16 */ - } - return a; - } - -#endif /* __CC_ARM || __ARMCC__ */ - - -#ifdef __GNUC__ - -#if defined( __arm__ ) && \ - ( !defined( __thumb__ ) || defined( __thumb2__ ) ) && \ - !( defined( __CC_ARM ) || defined( __ARMCC__ ) ) - -#define FT_MULFIX_ASSEMBLER FT_MulFix_arm - - /* documentation is in freetype.h */ - - static __inline__ FT_Int32 - FT_MulFix_arm( FT_Int32 a, - FT_Int32 b ) - { - register FT_Int32 t, t2; - - - __asm__ __volatile__ ( - "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ - "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ -#if defined( __clang__ ) && defined( __thumb2__ ) - "add.w %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ -#else - "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ -#endif - "adds %1, %1, %0\n\t" /* %1 += %0 */ - "adc %2, %2, #0\n\t" /* %2 += carry */ - "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ - "orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ - : "=r"(a), "=&r"(t2), "=&r"(t) - : "r"(a), "r"(b) - : "cc" ); - return a; - } - -#endif /* __arm__ && */ - /* ( __thumb2__ || !__thumb__ ) && */ - /* !( __CC_ARM || __ARMCC__ ) */ - - -#if defined( __i386__ ) - -#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 - - /* documentation is in freetype.h */ - - static __inline__ FT_Int32 - FT_MulFix_i386( FT_Int32 a, - FT_Int32 b ) - { - register FT_Int32 result; - - - __asm__ __volatile__ ( - "imul %%edx\n" - "movl %%edx, %%ecx\n" - "sarl $31, %%ecx\n" - "addl $0x8000, %%ecx\n" - "addl %%ecx, %%eax\n" - "adcl $0, %%edx\n" - "shrl $16, %%eax\n" - "shll $16, %%edx\n" - "addl %%edx, %%eax\n" - : "=a"(result), "=d"(b) - : "a"(a), "d"(b) - : "%ecx", "cc" ); - return result; - } - -#endif /* i386 */ - -#endif /* __GNUC__ */ - - -#ifdef _MSC_VER /* Visual C++ */ - -#ifdef _M_IX86 - -#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 - - /* documentation is in freetype.h */ - - static __inline FT_Int32 - FT_MulFix_i386( FT_Int32 a, - FT_Int32 b ) - { - register FT_Int32 result; - - __asm - { - mov eax, a - mov edx, b - imul edx - mov ecx, edx - sar ecx, 31 - add ecx, 8000h - add eax, ecx - adc edx, 0 - shr eax, 16 - shl edx, 16 - add eax, edx - mov result, eax - } - return result; - } - -#endif /* _M_IX86 */ - -#endif /* _MSC_VER */ - - -#if defined( __GNUC__ ) && defined( __x86_64__ ) - -#define FT_MULFIX_ASSEMBLER FT_MulFix_x86_64 - - static __inline__ FT_Int32 - FT_MulFix_x86_64( FT_Int32 a, - FT_Int32 b ) - { - /* Temporarily disable the warning that C90 doesn't support */ - /* `long long'. */ -#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 ) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wlong-long" -#endif - -#if 1 - /* Technically not an assembly fragment, but GCC does a really good */ - /* job at inlining it and generating good machine code for it. */ - long long ret, tmp; - - - ret = (long long)a * b; - tmp = ret >> 63; - ret += 0x8000 + tmp; - - return (FT_Int32)( ret >> 16 ); -#else - - /* For some reason, GCC 4.6 on Ubuntu 12.04 generates invalid machine */ - /* code from the lines below. The main issue is that `wide_a' is not */ - /* properly initialized by sign-extending `a'. Instead, the generated */ - /* machine code assumes that the register that contains `a' on input */ - /* can be used directly as a 64-bit value, which is wrong most of the */ - /* time. */ - long long wide_a = (long long)a; - long long wide_b = (long long)b; - long long result; - - - __asm__ __volatile__ ( - "imul %2, %1\n" - "mov %1, %0\n" - "sar $63, %0\n" - "lea 0x8000(%1, %0), %0\n" - "sar $16, %0\n" - : "=&r"(result), "=&r"(wide_a) - : "r"(wide_b) - : "cc" ); - - return (FT_Int32)result; -#endif - -#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 ) -#pragma GCC diagnostic pop -#endif - } - -#endif /* __GNUC__ && __x86_64__ */ - -#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ - - -#ifdef FT_CONFIG_OPTION_INLINE_MULFIX -#ifdef FT_MULFIX_ASSEMBLER -#define FT_MulFix( a, b ) FT_MULFIX_ASSEMBLER( (FT_Int32)(a), (FT_Int32)(b) ) -#endif -#endif - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_MulDiv_No_Round */ - /* */ - /* <Description> */ - /* A very simple function used to perform the computation `(a*b)/c' */ - /* (without rounding) with maximum accuracy (it uses a 64-bit */ - /* intermediate integer whenever necessary). */ - /* */ - /* This function isn't necessarily as fast as some processor specific */ - /* operations, but is at least completely portable. */ - /* */ - /* <Input> */ - /* a :: The first multiplier. */ - /* b :: The second multiplier. */ - /* c :: The divisor. */ - /* */ - /* <Return> */ - /* The result of `(a*b)/c'. This function never traps when trying to */ - /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ - /* on the signs of `a' and `b'. */ - /* */ - FT_BASE( FT_Long ) - FT_MulDiv_No_Round( FT_Long a, - FT_Long b, - FT_Long c ); - - - /* - * A variant of FT_Matrix_Multiply which scales its result afterwards. - * The idea is that both `a' and `b' are scaled by factors of 10 so that - * the values are as precise as possible to get a correct result during - * the 64bit multiplication. Let `sa' and `sb' be the scaling factors of - * `a' and `b', respectively, then the scaling factor of the result is - * `sa*sb'. - */ - FT_BASE( void ) - FT_Matrix_Multiply_Scaled( const FT_Matrix* a, - FT_Matrix *b, - FT_Long scaling ); - - - /* - * A variant of FT_Vector_Transform. See comments for - * FT_Matrix_Multiply_Scaled. - */ - FT_BASE( void ) - FT_Vector_Transform_Scaled( FT_Vector* vector, - const FT_Matrix* matrix, - FT_Long scaling ); - - - /* - * This function normalizes a vector and returns its original length. - * The normalized vector is a 16.16 fixed-point unit vector with length - * close to 0x10000. The accuracy of the returned length is limited to - * 16 bits also. The function utilizes quick inverse square root - * approximation without divisions and square roots relying on Newton's - * iterations instead. - */ - FT_BASE( FT_UInt32 ) - FT_Vector_NormLen( FT_Vector* vector ); - - - /* - * Return -1, 0, or +1, depending on the orientation of a given corner. - * We use the Cartesian coordinate system, with positive vertical values - * going upwards. The function returns +1 if the corner turns to the - * left, -1 to the right, and 0 for undecidable cases. - */ - FT_BASE( FT_Int ) - ft_corner_orientation( FT_Pos in_x, - FT_Pos in_y, - FT_Pos out_x, - FT_Pos out_y ); - - - /* - * Return TRUE if a corner is flat or nearly flat. This is equivalent to - * saying that the corner point is close to its neighbors, or inside an - * ellipse defined by the neighbor focal points to be more precise. - */ - FT_BASE( FT_Int ) - ft_corner_is_flat( FT_Pos in_x, - FT_Pos in_y, - FT_Pos out_x, - FT_Pos out_y ); - - - /* - * Return the most significant bit index. - */ - -#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER -#if defined( __GNUC__ ) && \ - ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 4 ) ) - -#if FT_SIZEOF_INT == 4 - -#define FT_MSB( x ) ( 31 - __builtin_clz( x ) ) - -#elif FT_SIZEOF_LONG == 4 - -#define FT_MSB( x ) ( 31 - __builtin_clzl( x ) ) - -#endif - -#endif /* __GNUC__ */ -#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ - -#ifndef FT_MSB - - FT_BASE( FT_Int ) - FT_MSB( FT_UInt32 z ); - -#endif - - - /* - * Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses - * two fixed-point arguments instead. - */ - FT_BASE( FT_Fixed ) - FT_Hypot( FT_Fixed x, - FT_Fixed y ); - - -#if 0 - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_SqrtFixed */ - /* */ - /* <Description> */ - /* Computes the square root of a 16.16 fixed-point value. */ - /* */ - /* <Input> */ - /* x :: The value to compute the root for. */ - /* */ - /* <Return> */ - /* The result of `sqrt(x)'. */ - /* */ - /* <Note> */ - /* This function is not very fast. */ - /* */ - FT_BASE( FT_Int32 ) - FT_SqrtFixed( FT_Int32 x ); - -#endif /* 0 */ - - -#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 ) -#define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 ) -#define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 ) -#define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) << 2 ) -#define FLOAT_TO_FIXED( x ) ( (FT_Long)( x * 65536.0 ) ) -#define FIXED_TO_INT( x ) ( FT_RoundFix( x ) >> 16 ) - -#define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \ - : ( -( ( 32 - (x) ) & -64 ) ) ) - - -FT_END_HEADER - -#endif /* __FTCALC_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/ftdebug.h b/3party/freetype/include/freetype/internal/ftdebug.h deleted file mode 100644 index 216c73031e..0000000000 --- a/3party/freetype/include/freetype/internal/ftdebug.h +++ /dev/null @@ -1,255 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftdebug.h */ -/* */ -/* Debugging and logging component (specification). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/* */ -/* IMPORTANT: A description of FreeType's debugging support can be */ -/* found in `docs/DEBUG.TXT'. Read it if you need to use or */ -/* understand this code. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTDEBUG_H__ -#define __FTDEBUG_H__ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */ - /* is already defined; this simplifies the following #ifdefs */ - /* */ -#ifdef FT_DEBUG_LEVEL_TRACE -#undef FT_DEBUG_LEVEL_ERROR -#define FT_DEBUG_LEVEL_ERROR -#endif - - - /*************************************************************************/ - /* */ - /* Define the trace enums as well as the trace levels array when they */ - /* are needed. */ - /* */ - /*************************************************************************/ - -#ifdef FT_DEBUG_LEVEL_TRACE - -#define FT_TRACE_DEF( x ) trace_ ## x , - - /* defining the enumeration */ - typedef enum FT_Trace_ - { -#include FT_INTERNAL_TRACE_H - trace_count - - } FT_Trace; - - - /* defining the array of trace levels, provided by `src/base/ftdebug.c' */ - extern int ft_trace_levels[trace_count]; - -#undef FT_TRACE_DEF - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - - /*************************************************************************/ - /* */ - /* Define the FT_TRACE macro */ - /* */ - /* IMPORTANT! */ - /* */ - /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */ - /* value before using any TRACE macro. */ - /* */ - /*************************************************************************/ - -#ifdef FT_DEBUG_LEVEL_TRACE - -#define FT_TRACE( level, varformat ) \ - do \ - { \ - if ( ft_trace_levels[FT_COMPONENT] >= level ) \ - FT_Message varformat; \ - } while ( 0 ) - -#else /* !FT_DEBUG_LEVEL_TRACE */ - -#define FT_TRACE( level, varformat ) do { } while ( 0 ) /* nothing */ - -#endif /* !FT_DEBUG_LEVEL_TRACE */ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Trace_Get_Count */ - /* */ - /* <Description> */ - /* Return the number of available trace components. */ - /* */ - /* <Return> */ - /* The number of trace components. 0 if FreeType 2 is not built with */ - /* FT_DEBUG_LEVEL_TRACE definition. */ - /* */ - /* <Note> */ - /* This function may be useful if you want to access elements of */ - /* the internal `ft_trace_levels' array by an index. */ - /* */ - FT_BASE( FT_Int ) - FT_Trace_Get_Count( void ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Trace_Get_Name */ - /* */ - /* <Description> */ - /* Return the name of a trace component. */ - /* */ - /* <Input> */ - /* The index of the trace component. */ - /* */ - /* <Return> */ - /* The name of the trace component. This is a statically allocated */ - /* C string, so do not free it after use. NULL if FreeType 2 is not */ - /* built with FT_DEBUG_LEVEL_TRACE definition. */ - /* */ - /* <Note> */ - /* Use @FT_Trace_Get_Count to get the number of available trace */ - /* components. */ - /* */ - /* This function may be useful if you want to control FreeType 2's */ - /* debug level in your application. */ - /* */ - FT_BASE( const char* ) - FT_Trace_Get_Name( FT_Int idx ); - - - /*************************************************************************/ - /* */ - /* You need two opening and closing parentheses! */ - /* */ - /* Example: FT_TRACE0(( "Value is %i", foo )) */ - /* */ - /* Output of the FT_TRACEX macros is sent to stderr. */ - /* */ - /*************************************************************************/ - -#define FT_TRACE0( varformat ) FT_TRACE( 0, varformat ) -#define FT_TRACE1( varformat ) FT_TRACE( 1, varformat ) -#define FT_TRACE2( varformat ) FT_TRACE( 2, varformat ) -#define FT_TRACE3( varformat ) FT_TRACE( 3, varformat ) -#define FT_TRACE4( varformat ) FT_TRACE( 4, varformat ) -#define FT_TRACE5( varformat ) FT_TRACE( 5, varformat ) -#define FT_TRACE6( varformat ) FT_TRACE( 6, varformat ) -#define FT_TRACE7( varformat ) FT_TRACE( 7, varformat ) - - - /*************************************************************************/ - /* */ - /* Define the FT_ERROR macro. */ - /* */ - /* Output of this macro is sent to stderr. */ - /* */ - /*************************************************************************/ - -#ifdef FT_DEBUG_LEVEL_ERROR - -#define FT_ERROR( varformat ) FT_Message varformat - -#else /* !FT_DEBUG_LEVEL_ERROR */ - -#define FT_ERROR( varformat ) do { } while ( 0 ) /* nothing */ - -#endif /* !FT_DEBUG_LEVEL_ERROR */ - - - /*************************************************************************/ - /* */ - /* Define the FT_ASSERT and FT_THROW macros. The call to `FT_Throw' */ - /* makes it possible to easily set a breakpoint at this function. */ - /* */ - /*************************************************************************/ - -#ifdef FT_DEBUG_LEVEL_ERROR - -#define FT_ASSERT( condition ) \ - do \ - { \ - if ( !( condition ) ) \ - FT_Panic( "assertion failed on line %d of file %s\n", \ - __LINE__, __FILE__ ); \ - } while ( 0 ) - -#define FT_THROW( e ) \ - ( FT_Throw( FT_ERR_CAT( FT_ERR_PREFIX, e ), \ - __LINE__, \ - __FILE__ ) | \ - FT_ERR_CAT( FT_ERR_PREFIX, e ) ) - -#else /* !FT_DEBUG_LEVEL_ERROR */ - -#define FT_ASSERT( condition ) do { } while ( 0 ) - -#define FT_THROW( e ) FT_ERR_CAT( FT_ERR_PREFIX, e ) - -#endif /* !FT_DEBUG_LEVEL_ERROR */ - - - /*************************************************************************/ - /* */ - /* Define `FT_Message' and `FT_Panic' when needed. */ - /* */ - /*************************************************************************/ - -#ifdef FT_DEBUG_LEVEL_ERROR - -#include "stdio.h" /* for vfprintf() */ - - /* print a message */ - FT_BASE( void ) - FT_Message( const char* fmt, - ... ); - - /* print a message and exit */ - FT_BASE( void ) - FT_Panic( const char* fmt, - ... ); - - /* report file name and line number of an error */ - FT_BASE( int ) - FT_Throw( FT_Error error, - int line, - const char* file ); - -#endif /* FT_DEBUG_LEVEL_ERROR */ - - - FT_BASE( void ) - ft_debug_init( void ); - -FT_END_HEADER - -#endif /* __FTDEBUG_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/ftdriver.h b/3party/freetype/include/freetype/internal/ftdriver.h deleted file mode 100644 index 16856d3df8..0000000000 --- a/3party/freetype/include/freetype/internal/ftdriver.h +++ /dev/null @@ -1,409 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftdriver.h */ -/* */ -/* FreeType font driver interface (specification). */ -/* */ -/* Copyright 1996-2015 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 __FTDRIVER_H__ -#define __FTDRIVER_H__ - - -#include <ft2build.h> -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - - typedef FT_Error - (*FT_Face_InitFunc)( FT_Stream stream, - FT_Face face, - FT_Int typeface_index, - FT_Int num_params, - FT_Parameter* parameters ); - - typedef void - (*FT_Face_DoneFunc)( FT_Face face ); - - - typedef FT_Error - (*FT_Size_InitFunc)( FT_Size size ); - - typedef void - (*FT_Size_DoneFunc)( FT_Size size ); - - - typedef FT_Error - (*FT_Slot_InitFunc)( FT_GlyphSlot slot ); - - typedef void - (*FT_Slot_DoneFunc)( FT_GlyphSlot slot ); - - - typedef FT_Error - (*FT_Size_RequestFunc)( FT_Size size, - FT_Size_Request req ); - - typedef FT_Error - (*FT_Size_SelectFunc)( FT_Size size, - FT_ULong size_index ); - - typedef FT_Error - (*FT_Slot_LoadFunc)( FT_GlyphSlot slot, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ); - - - typedef FT_UInt - (*FT_CharMap_CharIndexFunc)( FT_CharMap charmap, - FT_Long charcode ); - - typedef FT_Long - (*FT_CharMap_CharNextFunc)( FT_CharMap charmap, - FT_Long charcode ); - - - typedef FT_Error - (*FT_Face_GetKerningFunc)( FT_Face face, - FT_UInt left_glyph, - FT_UInt right_glyph, - FT_Vector* kerning ); - - - typedef FT_Error - (*FT_Face_AttachFunc)( FT_Face face, - FT_Stream stream ); - - - typedef FT_Error - (*FT_Face_GetAdvancesFunc)( FT_Face face, - FT_UInt first, - FT_UInt count, - FT_Int32 flags, - FT_Fixed* advances ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Driver_ClassRec */ - /* */ - /* <Description> */ - /* The font driver class. This structure mostly contains pointers to */ - /* driver methods. */ - /* */ - /* <Fields> */ - /* root :: The parent module. */ - /* */ - /* face_object_size :: The size of a face object in bytes. */ - /* */ - /* size_object_size :: The size of a size object in bytes. */ - /* */ - /* slot_object_size :: The size of a glyph object in bytes. */ - /* */ - /* init_face :: The format-specific face constructor. */ - /* */ - /* done_face :: The format-specific face destructor. */ - /* */ - /* init_size :: The format-specific size constructor. */ - /* */ - /* done_size :: The format-specific size destructor. */ - /* */ - /* init_slot :: The format-specific slot constructor. */ - /* */ - /* done_slot :: The format-specific slot destructor. */ - /* */ - /* */ - /* load_glyph :: A function handle to load a glyph to a slot. */ - /* This field is mandatory! */ - /* */ - /* get_kerning :: A function handle to return the unscaled */ - /* kerning for a given pair of glyphs. Can be */ - /* set to 0 if the format doesn't support */ - /* kerning. */ - /* */ - /* attach_file :: This function handle is used to read */ - /* additional data for a face from another */ - /* file/stream. For example, this can be used to */ - /* add data from AFM or PFM files on a Type 1 */ - /* face, or a CIDMap on a CID-keyed face. */ - /* */ - /* get_advances :: A function handle used to return advance */ - /* widths of `count' glyphs (in font units), */ - /* starting at `first'. The `vertical' flag must */ - /* be set to get vertical advance heights. The */ - /* `advances' buffer is caller-allocated. */ - /* The idea of this function is to be able to */ - /* perform device-independent text layout without */ - /* loading a single glyph image. */ - /* */ - /* request_size :: A handle to a function used to request the new */ - /* character size. Can be set to 0 if the */ - /* scaling done in the base layer suffices. */ - /* */ - /* select_size :: A handle to a function used to select a new */ - /* fixed size. It is used only if */ - /* @FT_FACE_FLAG_FIXED_SIZES is set. Can be set */ - /* to 0 if the scaling done in the base layer */ - /* suffices. */ - /* <Note> */ - /* Most function pointers, with the exception of `load_glyph', can be */ - /* set to 0 to indicate a default behaviour. */ - /* */ - typedef struct FT_Driver_ClassRec_ - { - FT_Module_Class root; - - FT_Long face_object_size; - FT_Long size_object_size; - FT_Long slot_object_size; - - FT_Face_InitFunc init_face; - FT_Face_DoneFunc done_face; - - FT_Size_InitFunc init_size; - FT_Size_DoneFunc done_size; - - FT_Slot_InitFunc init_slot; - FT_Slot_DoneFunc done_slot; - - FT_Slot_LoadFunc load_glyph; - - FT_Face_GetKerningFunc get_kerning; - FT_Face_AttachFunc attach_file; - FT_Face_GetAdvancesFunc get_advances; - - /* since version 2.2 */ - FT_Size_RequestFunc request_size; - FT_Size_SelectFunc select_size; - - } FT_Driver_ClassRec, *FT_Driver_Class; - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DECLARE_DRIVER */ - /* */ - /* <Description> */ - /* Used to create a forward declaration of an FT_Driver_ClassRec */ - /* struct instance. */ - /* */ - /* <Macro> */ - /* FT_DEFINE_DRIVER */ - /* */ - /* <Description> */ - /* Used to initialize an instance of FT_Driver_ClassRec struct. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is defined a `create' function has to be */ - /* called with a pointer where the allocated structure is returned. */ - /* And when it is no longer needed a `destroy' function needs to be */ - /* called to release that allocation. */ - /* */ - /* `fcinit.c' (ft_create_default_module_classes) already contains a */ - /* mechanism to call these functions for the default modules */ - /* described in `ftmodule.h'. */ - /* */ - /* Notice that the created `create' and `destroy' functions call */ - /* `pic_init' and `pic_free' to allow you to manually allocate and */ - /* initialize any additional global data, like a module specific */ - /* interface, and put them in the global pic container defined in */ - /* `ftpic.h'. If you don't need them just implement the functions as */ - /* empty to resolve the link error. Also the `pic_init' and */ - /* `pic_free' functions should be declared in `pic.h', to be referred */ - /* by driver definition calling `FT_DEFINE_DRIVER' in following. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ - /* allocated in the global scope (or the scope where the macro is */ - /* used). */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DECLARE_DRIVER( class_ ) \ - FT_CALLBACK_TABLE \ - const FT_Driver_ClassRec class_; - -#define FT_DEFINE_DRIVER( \ - class_, \ - flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_, \ - face_object_size_, \ - size_object_size_, \ - slot_object_size_, \ - init_face_, \ - done_face_, \ - init_size_, \ - done_size_, \ - init_slot_, \ - done_slot_, \ - load_glyph_, \ - get_kerning_, \ - attach_file_, \ - get_advances_, \ - request_size_, \ - select_size_ ) \ - FT_CALLBACK_TABLE_DEF \ - const FT_Driver_ClassRec class_ = \ - { \ - FT_DEFINE_ROOT_MODULE( flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_ ) \ - \ - face_object_size_, \ - size_object_size_, \ - slot_object_size_, \ - \ - init_face_, \ - done_face_, \ - \ - init_size_, \ - done_size_, \ - \ - init_slot_, \ - done_slot_, \ - \ - load_glyph_, \ - \ - get_kerning_, \ - attach_file_, \ - get_advances_, \ - \ - request_size_, \ - select_size_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DECLARE_DRIVER( class_ ) FT_DECLARE_MODULE( class_ ) - -#define FT_DEFINE_DRIVER( \ - class_, \ - flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_, \ - face_object_size_, \ - size_object_size_, \ - slot_object_size_, \ - init_face_, \ - done_face_, \ - init_size_, \ - done_size_, \ - init_slot_, \ - done_slot_, \ - load_glyph_, \ - get_kerning_, \ - attach_file_, \ - get_advances_, \ - request_size_, \ - select_size_ ) \ - void \ - FT_Destroy_Class_ ## class_( FT_Library library, \ - FT_Module_Class* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - FT_Driver_Class dclazz = (FT_Driver_Class)clazz; \ - \ - \ - class_ ## _pic_free( library ); \ - if ( dclazz ) \ - FT_FREE( dclazz ); \ - } \ - \ - \ - FT_Error \ - FT_Create_Class_ ## class_( FT_Library library, \ - FT_Module_Class** output_class ) \ - { \ - FT_Driver_Class clazz = NULL; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - \ - if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \ - return error; \ - \ - error = class_ ## _pic_init( library ); \ - if ( error ) \ - { \ - FT_FREE( clazz ); \ - return error; \ - } \ - \ - FT_DEFINE_ROOT_MODULE( flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_ ) \ - \ - clazz->face_object_size = face_object_size_; \ - clazz->size_object_size = size_object_size_; \ - clazz->slot_object_size = slot_object_size_; \ - \ - clazz->init_face = init_face_; \ - clazz->done_face = done_face_; \ - \ - clazz->init_size = init_size_; \ - clazz->done_size = done_size_; \ - \ - clazz->init_slot = init_slot_; \ - clazz->done_slot = done_slot_; \ - \ - clazz->load_glyph = load_glyph_; \ - \ - clazz->get_kerning = get_kerning_; \ - clazz->attach_file = attach_file_; \ - clazz->get_advances = get_advances_; \ - \ - clazz->request_size = request_size_; \ - clazz->select_size = select_size_; \ - \ - *output_class = (FT_Module_Class*)clazz; \ - \ - return FT_Err_Ok; \ - } - - -#endif /* FT_CONFIG_OPTION_PIC */ - -FT_END_HEADER - -#endif /* __FTDRIVER_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/ftgloadr.h b/3party/freetype/include/freetype/internal/ftgloadr.h deleted file mode 100644 index 970dd70cc3..0000000000 --- a/3party/freetype/include/freetype/internal/ftgloadr.h +++ /dev/null @@ -1,172 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgloadr.h */ -/* */ -/* The FreeType glyph loader (specification). */ -/* */ -/* Copyright 2002-2015 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 __FTGLOADR_H__ -#define __FTGLOADR_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_GlyphLoader */ - /* */ - /* <Description> */ - /* The glyph loader is an internal object used to load several glyphs */ - /* together (for example, in the case of composites). */ - /* */ - /* <Note> */ - /* The glyph loader implementation is not part of the high-level API, */ - /* hence the forward structure declaration. */ - /* */ - typedef struct FT_GlyphLoaderRec_* FT_GlyphLoader ; - - -#if 0 /* moved to freetype.h in version 2.2 */ -#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 -#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 -#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 -#define FT_SUBGLYPH_FLAG_SCALE 8 -#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 -#define FT_SUBGLYPH_FLAG_2X2 0x80 -#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 -#endif - - - typedef struct FT_SubGlyphRec_ - { - FT_Int index; - FT_UShort flags; - FT_Int arg1; - FT_Int arg2; - FT_Matrix transform; - - } FT_SubGlyphRec; - - - typedef struct FT_GlyphLoadRec_ - { - FT_Outline outline; /* outline */ - FT_Vector* extra_points; /* extra points table */ - FT_Vector* extra_points2; /* second extra points table */ - FT_UInt num_subglyphs; /* number of subglyphs */ - FT_SubGlyph subglyphs; /* subglyphs */ - - } FT_GlyphLoadRec, *FT_GlyphLoad; - - - typedef struct FT_GlyphLoaderRec_ - { - FT_Memory memory; - FT_UInt max_points; - FT_UInt max_contours; - FT_UInt max_subglyphs; - FT_Bool use_extra; - - FT_GlyphLoadRec base; - FT_GlyphLoadRec current; - - void* other; /* for possible future extension? */ - - } FT_GlyphLoaderRec; - - - /* create new empty glyph loader */ - FT_BASE( FT_Error ) - FT_GlyphLoader_New( FT_Memory memory, - FT_GlyphLoader *aloader ); - - /* add an extra points table to a glyph loader */ - FT_BASE( FT_Error ) - FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ); - - /* destroy a glyph loader */ - FT_BASE( void ) - FT_GlyphLoader_Done( FT_GlyphLoader loader ); - - /* reset a glyph loader (frees everything int it) */ - FT_BASE( void ) - FT_GlyphLoader_Reset( FT_GlyphLoader loader ); - - /* rewind a glyph loader */ - FT_BASE( void ) - FT_GlyphLoader_Rewind( FT_GlyphLoader loader ); - - /* check that there is enough space to add `n_points' and `n_contours' */ - /* to the glyph loader */ - FT_BASE( FT_Error ) - FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, - FT_UInt n_points, - FT_UInt n_contours ); - - -#define FT_GLYPHLOADER_CHECK_P( _loader, _count ) \ - ( (_count) == 0 || \ - ( (FT_UInt)(_loader)->base.outline.n_points + \ - (FT_UInt)(_loader)->current.outline.n_points + \ - (FT_UInt)(_count) ) <= (_loader)->max_points ) - -#define FT_GLYPHLOADER_CHECK_C( _loader, _count ) \ - ( (_count) == 0 || \ - ( (FT_UInt)(_loader)->base.outline.n_contours + \ - (FT_UInt)(_loader)->current.outline.n_contours + \ - (FT_UInt)(_count) ) <= (_loader)->max_contours ) - -#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points, _contours ) \ - ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points ) && \ - FT_GLYPHLOADER_CHECK_C( _loader, _contours ) ) \ - ? 0 \ - : FT_GlyphLoader_CheckPoints( (_loader), \ - (FT_UInt)(_points), \ - (FT_UInt)(_contours) ) ) - - - /* check that there is enough space to add `n_subs' sub-glyphs to */ - /* a glyph loader */ - FT_BASE( FT_Error ) - FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, - FT_UInt n_subs ); - - /* prepare a glyph loader, i.e. empty the current glyph */ - FT_BASE( void ) - FT_GlyphLoader_Prepare( FT_GlyphLoader loader ); - - /* add the current glyph to the base glyph */ - FT_BASE( void ) - FT_GlyphLoader_Add( FT_GlyphLoader loader ); - - /* copy points from one glyph loader to another */ - FT_BASE( FT_Error ) - FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, - FT_GlyphLoader source ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTGLOADR_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/ftmemory.h b/3party/freetype/include/freetype/internal/ftmemory.h deleted file mode 100644 index c0c553b4fc..0000000000 --- a/3party/freetype/include/freetype/internal/ftmemory.h +++ /dev/null @@ -1,386 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmemory.h */ -/* */ -/* The FreeType memory management macros (specification). */ -/* */ -/* Copyright 1996-2015 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 __FTMEMORY_H__ -#define __FTMEMORY_H__ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_TYPES_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_SET_ERROR */ - /* */ - /* <Description> */ - /* This macro is used to set an implicit `error' variable to a given */ - /* expression's value (usually a function call), and convert it to a */ - /* boolean which is set whenever the value is != 0. */ - /* */ -#undef FT_SET_ERROR -#define FT_SET_ERROR( expression ) \ - ( ( error = (expression) ) != 0 ) - - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** M E M O R Y ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* - * C++ refuses to handle statements like p = (void*)anything, with `p' a - * typed pointer. Since we don't have a `typeof' operator in standard - * C++, we have to use a template to emulate it. - */ - -#ifdef __cplusplus - - extern "C++" - template <typename T> inline T* - cplusplus_typeof( T*, - void *v ) - { - return static_cast <T*> ( v ); - } - -#define FT_ASSIGNP( p, val ) (p) = cplusplus_typeof( (p), (val) ) - -#else - -#define FT_ASSIGNP( p, val ) (p) = (val) - -#endif - - - -#ifdef FT_DEBUG_MEMORY - - FT_BASE( const char* ) _ft_debug_file; - FT_BASE( long ) _ft_debug_lineno; - -#define FT_DEBUG_INNER( exp ) ( _ft_debug_file = __FILE__, \ - _ft_debug_lineno = __LINE__, \ - (exp) ) - -#define FT_ASSIGNP_INNER( p, exp ) ( _ft_debug_file = __FILE__, \ - _ft_debug_lineno = __LINE__, \ - FT_ASSIGNP( p, exp ) ) - -#else /* !FT_DEBUG_MEMORY */ - -#define FT_DEBUG_INNER( exp ) (exp) -#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp ) - -#endif /* !FT_DEBUG_MEMORY */ - - - /* - * The allocation functions return a pointer, and the error code - * is written to through the `p_error' parameter. See below for - * for documentation. - */ - - FT_BASE( FT_Pointer ) - ft_mem_alloc( FT_Memory memory, - FT_Long size, - FT_Error *p_error ); - - FT_BASE( FT_Pointer ) - ft_mem_qalloc( FT_Memory memory, - FT_Long size, - FT_Error *p_error ); - - FT_BASE( FT_Pointer ) - ft_mem_realloc( FT_Memory memory, - FT_Long item_size, - FT_Long cur_count, - FT_Long new_count, - void* block, - FT_Error *p_error ); - - FT_BASE( FT_Pointer ) - ft_mem_qrealloc( FT_Memory memory, - FT_Long item_size, - FT_Long cur_count, - FT_Long new_count, - void* block, - FT_Error *p_error ); - - FT_BASE( void ) - ft_mem_free( FT_Memory memory, - const void* P ); - - -#define FT_MEM_ALLOC( ptr, size ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, \ - (FT_Long)(size), \ - &error ) ) - -#define FT_MEM_FREE( ptr ) \ - FT_BEGIN_STMNT \ - ft_mem_free( memory, (ptr) ); \ - (ptr) = NULL; \ - FT_END_STMNT - -#define FT_MEM_NEW( ptr ) \ - FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) ) - -#define FT_MEM_REALLOC( ptr, cursz, newsz ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ - 1, \ - (FT_Long)(cursz), \ - (FT_Long)(newsz), \ - (ptr), \ - &error ) ) - -#define FT_MEM_QALLOC( ptr, size ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, \ - (FT_Long)(size), \ - &error ) ) - -#define FT_MEM_QNEW( ptr ) \ - FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) ) - -#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ - 1, \ - (FT_Long)(cursz), \ - (FT_Long)(newsz), \ - (ptr), \ - &error ) ) - -#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ - (FT_Long)(item_size), \ - 0, \ - (FT_Long)(count), \ - NULL, \ - &error ) ) - -#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ - (FT_Long)(itmsz), \ - (FT_Long)(oldcnt), \ - (FT_Long)(newcnt), \ - (ptr), \ - &error ) ) - -#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ - (FT_Long)(item_size), \ - 0, \ - (FT_Long)(count), \ - NULL, \ - &error ) ) - -#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \ - FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ - (FT_Long)(itmsz), \ - (FT_Long)(oldcnt), \ - (FT_Long)(newcnt), \ - (ptr), \ - &error ) ) - - -#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 ) - - -#define FT_MEM_SET( dest, byte, count ) \ - ft_memset( dest, byte, (FT_Offset)(count) ) - -#define FT_MEM_COPY( dest, source, count ) \ - ft_memcpy( dest, source, (FT_Offset)(count) ) - -#define FT_MEM_MOVE( dest, source, count ) \ - ft_memmove( dest, source, (FT_Offset)(count) ) - - -#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) - -#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) - - -#define FT_ARRAY_ZERO( dest, count ) \ - FT_MEM_ZERO( dest, \ - (FT_Offset)(count) * sizeof ( *(dest) ) ) - -#define FT_ARRAY_COPY( dest, source, count ) \ - FT_MEM_COPY( dest, \ - source, \ - (FT_Offset)(count) * sizeof ( *(dest) ) ) - -#define FT_ARRAY_MOVE( dest, source, count ) \ - FT_MEM_MOVE( dest, \ - source, \ - (FT_Offset)(count) * sizeof ( *(dest) ) ) - - - /* - * Return the maximum number of addressable elements in an array. - * We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid - * any problems. - */ -#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) ) - -#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) ) - - - /*************************************************************************/ - /* */ - /* The following functions macros expect that their pointer argument is */ - /* _typed_ in order to automatically compute array element sizes. */ - /* */ - -#define FT_MEM_NEW_ARRAY( ptr, count ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ - sizeof ( *(ptr) ), \ - 0, \ - (FT_Long)(count), \ - NULL, \ - &error ) ) - -#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ - sizeof ( *(ptr) ), \ - (FT_Long)(cursz), \ - (FT_Long)(newsz), \ - (ptr), \ - &error ) ) - -#define FT_MEM_QNEW_ARRAY( ptr, count ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ - sizeof ( *(ptr) ), \ - 0, \ - (FT_Long)(count), \ - NULL, \ - &error ) ) - -#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ - sizeof ( *(ptr) ), \ - (FT_Long)(cursz), \ - (FT_Long)(newsz), \ - (ptr), \ - &error ) ) - -#define FT_ALLOC( ptr, size ) \ - FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) ) - -#define FT_REALLOC( ptr, cursz, newsz ) \ - FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) ) - -#define FT_ALLOC_MULT( ptr, count, item_size ) \ - FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) ) - -#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ - FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \ - newcnt, itmsz ) ) - -#define FT_QALLOC( ptr, size ) \ - FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) ) - -#define FT_QREALLOC( ptr, cursz, newsz ) \ - FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) ) - -#define FT_QALLOC_MULT( ptr, count, item_size ) \ - FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) ) - -#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ - FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \ - newcnt, itmsz ) ) - -#define FT_FREE( ptr ) FT_MEM_FREE( ptr ) - -#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) ) - -#define FT_NEW_ARRAY( ptr, count ) \ - FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) - -#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \ - FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) - -#define FT_QNEW( ptr ) \ - FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) ) - -#define FT_QNEW_ARRAY( ptr, count ) \ - FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) - -#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \ - FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) - - - FT_BASE( FT_Pointer ) - ft_mem_strdup( FT_Memory memory, - const char* str, - FT_Error *p_error ); - - FT_BASE( FT_Pointer ) - ft_mem_dup( FT_Memory memory, - const void* address, - FT_ULong size, - FT_Error *p_error ); - - -#define FT_MEM_STRDUP( dst, str ) \ - (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error ) - -#define FT_STRDUP( dst, str ) \ - FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) ) - -#define FT_MEM_DUP( dst, address, size ) \ - (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error ) - -#define FT_DUP( dst, address, size ) \ - FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) ) - - - /* Return >= 1 if a truncation occurs. */ - /* Return 0 if the source string fits the buffer. */ - /* This is *not* the same as strlcpy(). */ - FT_BASE( FT_Int ) - ft_mem_strcpyn( char* dst, - const char* src, - FT_ULong size ); - -#define FT_STRCPYN( dst, src, size ) \ - ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) ) - - /* */ - - -FT_END_HEADER - -#endif /* __FTMEMORY_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/ftobjs.h b/3party/freetype/include/freetype/internal/ftobjs.h deleted file mode 100644 index da5582dc3f..0000000000 --- a/3party/freetype/include/freetype/internal/ftobjs.h +++ /dev/null @@ -1,1571 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftobjs.h */ -/* */ -/* The FreeType private base classes (specification). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file contains the definition of all internal FreeType classes. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTOBJS_H__ -#define __FTOBJS_H__ - -#include <ft2build.h> -#include FT_RENDER_H -#include FT_SIZES_H -#include FT_LCD_FILTER_H -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_GLYPH_LOADER_H -#include FT_INTERNAL_DRIVER_H -#include FT_INTERNAL_AUTOHINT_H -#include FT_INTERNAL_SERVICE_H -#include FT_INTERNAL_PIC_H - -#ifdef FT_CONFIG_OPTION_INCREMENTAL -#include FT_INCREMENTAL_H -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* Some generic definitions. */ - /* */ -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef NULL -#define NULL (void*)0 -#endif - - - /*************************************************************************/ - /* */ - /* The min and max functions missing in C. As usual, be careful not to */ - /* write things like FT_MIN( a++, b++ ) to avoid side effects. */ - /* */ -#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) -#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) - -#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) - - /* - * Approximate sqrt(x*x+y*y) using the `alpha max plus beta min' - * algorithm. We use alpha = 1, beta = 3/8, giving us results with a - * largest error less than 7% compared to the exact value. - */ -#define FT_HYPOT( x, y ) \ - ( x = FT_ABS( x ), \ - y = FT_ABS( y ), \ - x > y ? x + ( 3 * y >> 3 ) \ - : y + ( 3 * x >> 3 ) ) - - /* we use FT_TYPEOF to suppress signedness compilation warnings */ -#define FT_PAD_FLOOR( x, n ) ( (x) & ~FT_TYPEOF( x )( (n)-1 ) ) -#define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + ((n)/2), n ) -#define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + ((n)-1), n ) - -#define FT_PIX_FLOOR( x ) ( (x) & ~FT_TYPEOF( x )63 ) -#define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 ) -#define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 ) - - - /* - * character classification functions -- since these are used to parse - * font files, we must not use those in <ctypes.h> which are - * locale-dependent - */ -#define ft_isdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U ) - -#define ft_isxdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U || \ - ( (unsigned)(x) - 'a' ) < 6U || \ - ( (unsigned)(x) - 'A' ) < 6U ) - - /* the next two macros assume ASCII representation */ -#define ft_isupper( x ) ( ( (unsigned)(x) - 'A' ) < 26U ) -#define ft_islower( x ) ( ( (unsigned)(x) - 'a' ) < 26U ) - -#define ft_isalpha( x ) ( ft_isupper( x ) || ft_islower( x ) ) -#define ft_isalnum( x ) ( ft_isdigit( x ) || ft_isalpha( x ) ) - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** C H A R M A P S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /* handle to internal charmap object */ - typedef struct FT_CMapRec_* FT_CMap; - - /* handle to charmap class structure */ - typedef const struct FT_CMap_ClassRec_* FT_CMap_Class; - - /* internal charmap object structure */ - typedef struct FT_CMapRec_ - { - FT_CharMapRec charmap; - FT_CMap_Class clazz; - - } FT_CMapRec; - - /* typecase any pointer to a charmap handle */ -#define FT_CMAP( x ) ((FT_CMap)( x )) - - /* obvious macros */ -#define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id -#define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id -#define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding -#define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face - - - /* class method definitions */ - typedef FT_Error - (*FT_CMap_InitFunc)( FT_CMap cmap, - FT_Pointer init_data ); - - typedef void - (*FT_CMap_DoneFunc)( FT_CMap cmap ); - - typedef FT_UInt - (*FT_CMap_CharIndexFunc)( FT_CMap cmap, - FT_UInt32 char_code ); - - typedef FT_UInt - (*FT_CMap_CharNextFunc)( FT_CMap cmap, - FT_UInt32 *achar_code ); - - typedef FT_UInt - (*FT_CMap_CharVarIndexFunc)( FT_CMap cmap, - FT_CMap unicode_cmap, - FT_UInt32 char_code, - FT_UInt32 variant_selector ); - - typedef FT_Bool - (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap cmap, - FT_UInt32 char_code, - FT_UInt32 variant_selector ); - - typedef FT_UInt32 * - (*FT_CMap_VariantListFunc)( FT_CMap cmap, - FT_Memory mem ); - - typedef FT_UInt32 * - (*FT_CMap_CharVariantListFunc)( FT_CMap cmap, - FT_Memory mem, - FT_UInt32 char_code ); - - typedef FT_UInt32 * - (*FT_CMap_VariantCharListFunc)( FT_CMap cmap, - FT_Memory mem, - FT_UInt32 variant_selector ); - - - typedef struct FT_CMap_ClassRec_ - { - FT_ULong size; - FT_CMap_InitFunc init; - FT_CMap_DoneFunc done; - FT_CMap_CharIndexFunc char_index; - FT_CMap_CharNextFunc char_next; - - /* Subsequent entries are special ones for format 14 -- the variant */ - /* selector subtable which behaves like no other */ - - FT_CMap_CharVarIndexFunc char_var_index; - FT_CMap_CharVarIsDefaultFunc char_var_default; - FT_CMap_VariantListFunc variant_list; - FT_CMap_CharVariantListFunc charvariant_list; - FT_CMap_VariantCharListFunc variantchar_list; - - } FT_CMap_ClassRec; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DECLARE_CMAP_CLASS( class_ ) \ - FT_CALLBACK_TABLE const FT_CMap_ClassRec class_; - -#define FT_DEFINE_CMAP_CLASS( \ - class_, \ - size_, \ - init_, \ - done_, \ - char_index_, \ - char_next_, \ - char_var_index_, \ - char_var_default_, \ - variant_list_, \ - charvariant_list_, \ - variantchar_list_ ) \ - FT_CALLBACK_TABLE_DEF \ - const FT_CMap_ClassRec class_ = \ - { \ - size_, \ - init_, \ - done_, \ - char_index_, \ - char_next_, \ - char_var_index_, \ - char_var_default_, \ - variant_list_, \ - charvariant_list_, \ - variantchar_list_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DECLARE_CMAP_CLASS( class_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Library library, \ - FT_CMap_ClassRec* clazz ); - -#define FT_DEFINE_CMAP_CLASS( \ - class_, \ - size_, \ - init_, \ - done_, \ - char_index_, \ - char_next_, \ - char_var_index_, \ - char_var_default_, \ - variant_list_, \ - charvariant_list_, \ - variantchar_list_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Library library, \ - FT_CMap_ClassRec* clazz ) \ - { \ - FT_UNUSED( library ); \ - \ - clazz->size = size_; \ - clazz->init = init_; \ - clazz->done = done_; \ - clazz->char_index = char_index_; \ - clazz->char_next = char_next_; \ - clazz->char_var_index = char_var_index_; \ - clazz->char_var_default = char_var_default_; \ - clazz->variant_list = variant_list_; \ - clazz->charvariant_list = charvariant_list_; \ - clazz->variantchar_list = variantchar_list_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - - /* create a new charmap and add it to charmap->face */ - FT_BASE( FT_Error ) - FT_CMap_New( FT_CMap_Class clazz, - FT_Pointer init_data, - FT_CharMap charmap, - FT_CMap *acmap ); - - /* destroy a charmap and remove it from face's list */ - FT_BASE( void ) - FT_CMap_Done( FT_CMap cmap ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Face_InternalRec */ - /* */ - /* <Description> */ - /* This structure contains the internal fields of each FT_Face */ - /* object. These fields may change between different releases of */ - /* FreeType. */ - /* */ - /* <Fields> */ - /* max_points :: */ - /* The maximum number of points used to store the vectorial outline */ - /* of any glyph in this face. If this value cannot be known in */ - /* advance, or if the face isn't scalable, this should be set to 0. */ - /* Only relevant for scalable formats. */ - /* */ - /* max_contours :: */ - /* The maximum number of contours used to store the vectorial */ - /* outline of any glyph in this face. If this value cannot be */ - /* known in advance, or if the face isn't scalable, this should be */ - /* set to 0. Only relevant for scalable formats. */ - /* */ - /* transform_matrix :: */ - /* A 2x2 matrix of 16.16 coefficients used to transform glyph */ - /* outlines after they are loaded from the font. Only used by the */ - /* convenience functions. */ - /* */ - /* transform_delta :: */ - /* A translation vector used to transform glyph outlines after they */ - /* are loaded from the font. Only used by the convenience */ - /* functions. */ - /* */ - /* transform_flags :: */ - /* Some flags used to classify the transform. Only used by the */ - /* convenience functions. */ - /* */ - /* services :: */ - /* A cache for frequently used services. It should be only */ - /* accessed with the macro `FT_FACE_LOOKUP_SERVICE'. */ - /* */ - /* incremental_interface :: */ - /* If non-null, the interface through which glyph data and metrics */ - /* are loaded incrementally for faces that do not provide all of */ - /* this data when first opened. This field exists only if */ - /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */ - /* */ - /* ignore_unpatented_hinter :: */ - /* This boolean flag instructs the glyph loader to ignore the */ - /* native font hinter, if one is found. This is exclusively used */ - /* in the case when the unpatented hinter is compiled within the */ - /* library. */ - /* */ - /* refcount :: */ - /* A counter initialized to~1 at the time an @FT_Face structure is */ - /* created. @FT_Reference_Face increments this counter, and */ - /* @FT_Done_Face only destroys a face if the counter is~1, */ - /* otherwise it simply decrements it. */ - /* */ - typedef struct FT_Face_InternalRec_ - { - FT_Matrix transform_matrix; - FT_Vector transform_delta; - FT_Int transform_flags; - - FT_ServiceCacheRec services; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - FT_Incremental_InterfaceRec* incremental_interface; -#endif - - FT_Bool ignore_unpatented_hinter; - FT_Int refcount; - - } FT_Face_InternalRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Slot_InternalRec */ - /* */ - /* <Description> */ - /* This structure contains the internal fields of each FT_GlyphSlot */ - /* object. These fields may change between different releases of */ - /* FreeType. */ - /* */ - /* <Fields> */ - /* loader :: The glyph loader object used to load outlines */ - /* into the glyph slot. */ - /* */ - /* flags :: Possible values are zero or */ - /* FT_GLYPH_OWN_BITMAP. The latter indicates */ - /* that the FT_GlyphSlot structure owns the */ - /* bitmap buffer. */ - /* */ - /* glyph_transformed :: Boolean. Set to TRUE when the loaded glyph */ - /* must be transformed through a specific */ - /* font transformation. This is _not_ the same */ - /* as the face transform set through */ - /* FT_Set_Transform(). */ - /* */ - /* glyph_matrix :: The 2x2 matrix corresponding to the glyph */ - /* transformation, if necessary. */ - /* */ - /* glyph_delta :: The 2d translation vector corresponding to */ - /* the glyph transformation, if necessary. */ - /* */ - /* glyph_hints :: Format-specific glyph hints management. */ - /* */ - -#define FT_GLYPH_OWN_BITMAP 0x1U - - typedef struct FT_Slot_InternalRec_ - { - FT_GlyphLoader loader; - FT_UInt flags; - FT_Bool glyph_transformed; - FT_Matrix glyph_matrix; - FT_Vector glyph_delta; - void* glyph_hints; - - } FT_GlyphSlot_InternalRec; - - -#if 0 - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Size_InternalRec */ - /* */ - /* <Description> */ - /* This structure contains the internal fields of each FT_Size */ - /* object. Currently, it's empty. */ - /* */ - /*************************************************************************/ - - typedef struct FT_Size_InternalRec_ - { - /* empty */ - - } FT_Size_InternalRec; - -#endif - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** M O D U L E S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_ModuleRec */ - /* */ - /* <Description> */ - /* A module object instance. */ - /* */ - /* <Fields> */ - /* clazz :: A pointer to the module's class. */ - /* */ - /* library :: A handle to the parent library object. */ - /* */ - /* memory :: A handle to the memory manager. */ - /* */ - typedef struct FT_ModuleRec_ - { - FT_Module_Class* clazz; - FT_Library library; - FT_Memory memory; - - } FT_ModuleRec; - - - /* typecast an object to an FT_Module */ -#define FT_MODULE( x ) ((FT_Module)( x )) -#define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz -#define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library -#define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory - - -#define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_FONT_DRIVER ) - -#define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_RENDERER ) - -#define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_HINTER ) - -#define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_STYLER ) - -#define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_DRIVER_SCALABLE ) - -#define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_DRIVER_NO_OUTLINES ) - -#define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_DRIVER_HAS_HINTER ) - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Module_Interface */ - /* */ - /* <Description> */ - /* Finds a module and returns its specific interface as a typeless */ - /* pointer. */ - /* */ - /* <Input> */ - /* library :: A handle to the library object. */ - /* */ - /* module_name :: The module's name (as an ASCII string). */ - /* */ - /* <Return> */ - /* A module-specific interface if available, 0 otherwise. */ - /* */ - /* <Note> */ - /* You should better be familiar with FreeType internals to know */ - /* which module to look for, and what its interface is :-) */ - /* */ - FT_BASE( const void* ) - FT_Get_Module_Interface( FT_Library library, - const char* mod_name ); - - FT_BASE( FT_Pointer ) - ft_module_get_service( FT_Module module, - const char* service_id ); - - /* */ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** F A C E, S I Z E & G L Y P H S L O T O B J E C T S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /* a few macros used to perform easy typecasts with minimal brain damage */ - -#define FT_FACE( x ) ((FT_Face)(x)) -#define FT_SIZE( x ) ((FT_Size)(x)) -#define FT_SLOT( x ) ((FT_GlyphSlot)(x)) - -#define FT_FACE_DRIVER( x ) FT_FACE( x )->driver -#define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library -#define FT_FACE_MEMORY( x ) FT_FACE( x )->memory -#define FT_FACE_STREAM( x ) FT_FACE( x )->stream - -#define FT_SIZE_FACE( x ) FT_SIZE( x )->face -#define FT_SLOT_FACE( x ) FT_SLOT( x )->face - -#define FT_FACE_SLOT( x ) FT_FACE( x )->glyph -#define FT_FACE_SIZE( x ) FT_FACE( x )->size - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_GlyphSlot */ - /* */ - /* <Description> */ - /* It is sometimes useful to have more than one glyph slot for a */ - /* given face object. This function is used to create additional */ - /* slots. All of them are automatically discarded when the face is */ - /* destroyed. */ - /* */ - /* <Input> */ - /* face :: A handle to a parent face object. */ - /* */ - /* <Output> */ - /* aslot :: A handle to a new glyph slot object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_BASE( FT_Error ) - FT_New_GlyphSlot( FT_Face face, - FT_GlyphSlot *aslot ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_GlyphSlot */ - /* */ - /* <Description> */ - /* Destroys a given glyph slot. Remember however that all slots are */ - /* automatically destroyed with its parent. Using this function is */ - /* not always mandatory. */ - /* */ - /* <Input> */ - /* slot :: A handle to a target glyph slot. */ - /* */ - FT_BASE( void ) - FT_Done_GlyphSlot( FT_GlyphSlot slot ); - - /* */ - -#define FT_REQUEST_WIDTH( req ) \ - ( (req)->horiResolution \ - ? ( (req)->width * (FT_Pos)(req)->horiResolution + 36 ) / 72 \ - : (req)->width ) - -#define FT_REQUEST_HEIGHT( req ) \ - ( (req)->vertResolution \ - ? ( (req)->height * (FT_Pos)(req)->vertResolution + 36 ) / 72 \ - : (req)->height ) - - - /* Set the metrics according to a bitmap strike. */ - FT_BASE( void ) - FT_Select_Metrics( FT_Face face, - FT_ULong strike_index ); - - - /* Set the metrics according to a size request. */ - FT_BASE( void ) - FT_Request_Metrics( FT_Face face, - FT_Size_Request req ); - - - /* Match a size request against `available_sizes'. */ - FT_BASE( FT_Error ) - FT_Match_Size( FT_Face face, - FT_Size_Request req, - FT_Bool ignore_width, - FT_ULong* size_index ); - - - /* Use the horizontal metrics to synthesize the vertical metrics. */ - /* If `advance' is zero, it is also synthesized. */ - FT_BASE( void ) - ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, - FT_Pos advance ); - - - /* Free the bitmap of a given glyphslot when needed (i.e., only when it */ - /* was allocated with ft_glyphslot_alloc_bitmap). */ - FT_BASE( void ) - ft_glyphslot_free_bitmap( FT_GlyphSlot slot ); - - - /* Allocate a new bitmap buffer in a glyph slot. */ - FT_BASE( FT_Error ) - ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, - FT_ULong size ); - - - /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */ - /* will not be freed by a later call to ft_glyphslot_free_bitmap. */ - FT_BASE( void ) - ft_glyphslot_set_bitmap( FT_GlyphSlot slot, - FT_Byte* buffer ); - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** R E N D E R E R S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#define FT_RENDERER( x ) ((FT_Renderer)( x )) -#define FT_GLYPH( x ) ((FT_Glyph)( x )) -#define FT_BITMAP_GLYPH( x ) ((FT_BitmapGlyph)( x )) -#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x )) - - - typedef struct FT_RendererRec_ - { - FT_ModuleRec root; - FT_Renderer_Class* clazz; - FT_Glyph_Format glyph_format; - FT_Glyph_Class glyph_class; - - FT_Raster raster; - FT_Raster_Render_Func raster_render; - FT_Renderer_RenderFunc render; - - } FT_RendererRec; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** F O N T D R I V E R S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* typecast a module into a driver easily */ -#define FT_DRIVER( x ) ((FT_Driver)(x)) - - /* typecast a module as a driver, and get its driver class */ -#define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_DriverRec */ - /* */ - /* <Description> */ - /* The root font driver class. A font driver is responsible for */ - /* managing and loading font files of a given format. */ - /* */ - /* <Fields> */ - /* root :: Contains the fields of the root module class. */ - /* */ - /* clazz :: A pointer to the font driver's class. Note that */ - /* this is NOT root.clazz. `class' wasn't used */ - /* as it is a reserved word in C++. */ - /* */ - /* faces_list :: The list of faces currently opened by this */ - /* driver. */ - /* */ - /* glyph_loader :: Unused. Used to be glyph loader for all faces */ - /* managed by this driver. */ - /* */ - typedef struct FT_DriverRec_ - { - FT_ModuleRec root; - FT_Driver_Class clazz; - FT_ListRec faces_list; - FT_GlyphLoader glyph_loader; - - } FT_DriverRec; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** L I B R A R I E S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* This hook is used by the TrueType debugger. It must be set to an */ - /* alternate truetype bytecode interpreter function. */ -#define FT_DEBUG_HOOK_TRUETYPE 0 - - - /* Set this debug hook to a non-null pointer to force unpatented hinting */ - /* for all faces when both TT_USE_BYTECODE_INTERPRETER and */ - /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined. This is only used */ - /* during debugging. */ -#define FT_DEBUG_HOOK_UNPATENTED_HINTING 1 - - - typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap, - FT_Render_Mode render_mode, - FT_Library library ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_LibraryRec */ - /* */ - /* <Description> */ - /* The FreeType library class. This is the root of all FreeType */ - /* data. Use FT_New_Library() to create a library object, and */ - /* FT_Done_Library() to discard it and all child objects. */ - /* */ - /* <Fields> */ - /* memory :: The library's memory object. Manages memory */ - /* allocation. */ - /* */ - /* version_major :: The major version number of the library. */ - /* */ - /* version_minor :: The minor version number of the library. */ - /* */ - /* version_patch :: The current patch level of the library. */ - /* */ - /* num_modules :: The number of modules currently registered */ - /* within this library. This is set to 0 for new */ - /* libraries. New modules are added through the */ - /* FT_Add_Module() API function. */ - /* */ - /* modules :: A table used to store handles to the currently */ - /* registered modules. Note that each font driver */ - /* contains a list of its opened faces. */ - /* */ - /* renderers :: The list of renderers currently registered */ - /* within the library. */ - /* */ - /* cur_renderer :: The current outline renderer. This is a */ - /* shortcut used to avoid parsing the list on */ - /* each call to FT_Outline_Render(). It is a */ - /* handle to the current renderer for the */ - /* FT_GLYPH_FORMAT_OUTLINE format. */ - /* */ - /* auto_hinter :: XXX */ - /* */ - /* raster_pool :: The raster object's render pool. This can */ - /* ideally be changed dynamically at run-time. */ - /* */ - /* raster_pool_size :: The size of the render pool in bytes. */ - /* */ - /* debug_hooks :: XXX */ - /* */ - /* lcd_filter :: If subpixel rendering is activated, the */ - /* selected LCD filter mode. */ - /* */ - /* lcd_extra :: If subpixel rendering is activated, the number */ - /* of extra pixels needed for the LCD filter. */ - /* */ - /* lcd_weights :: If subpixel rendering is activated, the LCD */ - /* filter weights, if any. */ - /* */ - /* lcd_filter_func :: If subpixel rendering is activated, the LCD */ - /* filtering callback function. */ - /* */ - /* pic_container :: Contains global structs and tables, instead */ - /* of defining them globallly. */ - /* */ - /* refcount :: A counter initialized to~1 at the time an */ - /* @FT_Library structure is created. */ - /* @FT_Reference_Library increments this counter, */ - /* and @FT_Done_Library only destroys a library */ - /* if the counter is~1, otherwise it simply */ - /* decrements it. */ - /* */ - typedef struct FT_LibraryRec_ - { - FT_Memory memory; /* library's memory manager */ - - FT_Int version_major; - FT_Int version_minor; - FT_Int version_patch; - - FT_UInt num_modules; - FT_Module modules[FT_MAX_MODULES]; /* module objects */ - - FT_ListRec renderers; /* list of renderers */ - FT_Renderer cur_renderer; /* current outline renderer */ - FT_Module auto_hinter; - - FT_Byte* raster_pool; /* scan-line conversion */ - /* render pool */ - FT_ULong raster_pool_size; /* size of render pool in bytes */ - - FT_DebugHook_Func debug_hooks[4]; - -#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - FT_LcdFilter lcd_filter; - FT_Int lcd_extra; /* number of extra pixels */ - FT_Byte lcd_weights[7]; /* filter weights, if any */ - FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ -#endif - -#ifdef FT_CONFIG_OPTION_PIC - FT_PIC_Container pic_container; -#endif - - FT_Int refcount; - - } FT_LibraryRec; - - - FT_BASE( FT_Renderer ) - FT_Lookup_Renderer( FT_Library library, - FT_Glyph_Format format, - FT_ListNode* node ); - - FT_BASE( FT_Error ) - FT_Render_Glyph_Internal( FT_Library library, - FT_GlyphSlot slot, - FT_Render_Mode render_mode ); - - typedef const char* - (*FT_Face_GetPostscriptNameFunc)( FT_Face face ); - - typedef FT_Error - (*FT_Face_GetGlyphNameFunc)( FT_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ); - - typedef FT_UInt - (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face, - FT_String* glyph_name ); - - -#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Memory */ - /* */ - /* <Description> */ - /* Creates a new memory object. */ - /* */ - /* <Return> */ - /* A pointer to the new memory object. 0 in case of error. */ - /* */ - FT_BASE( FT_Memory ) - FT_New_Memory( void ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_Memory */ - /* */ - /* <Description> */ - /* Discards memory manager. */ - /* */ - /* <Input> */ - /* memory :: A handle to the memory manager. */ - /* */ - FT_BASE( void ) - FT_Done_Memory( FT_Memory memory ); - -#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ - - - /* Define default raster's interface. The default raster is located in */ - /* `src/base/ftraster.c'. */ - /* */ - /* Client applications can register new rasters through the */ - /* FT_Set_Raster() API. */ - -#ifndef FT_NO_DEFAULT_RASTER - FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster; -#endif - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** P I C S U P P O R T ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* PIC support macros for ftimage.h */ - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DEFINE_OUTLINE_FUNCS */ - /* */ - /* <Description> */ - /* Used to initialize an instance of FT_Outline_Funcs struct. */ - /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ - /* be called with a pre-allocated structure to be filled. */ - /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ - /* allocated in the global scope (or the scope where the macro */ - /* is used). */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_OUTLINE_FUNCS( \ - class_, \ - move_to_, \ - line_to_, \ - conic_to_, \ - cubic_to_, \ - shift_, \ - delta_ ) \ - static const FT_Outline_Funcs class_ = \ - { \ - move_to_, \ - line_to_, \ - conic_to_, \ - cubic_to_, \ - shift_, \ - delta_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_OUTLINE_FUNCS( \ - class_, \ - move_to_, \ - line_to_, \ - conic_to_, \ - cubic_to_, \ - shift_, \ - delta_ ) \ - static FT_Error \ - Init_Class_ ## class_( FT_Outline_Funcs* clazz ) \ - { \ - clazz->move_to = move_to_; \ - clazz->line_to = line_to_; \ - clazz->conic_to = conic_to_; \ - clazz->cubic_to = cubic_to_; \ - clazz->shift = shift_; \ - clazz->delta = delta_; \ - \ - return FT_Err_Ok; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DEFINE_RASTER_FUNCS */ - /* */ - /* <Description> */ - /* Used to initialize an instance of FT_Raster_Funcs struct. */ - /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ - /* be called with a pre-allocated structure to be filled. */ - /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ - /* allocated in the global scope (or the scope where the macro */ - /* is used). */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_RASTER_FUNCS( \ - class_, \ - glyph_format_, \ - raster_new_, \ - raster_reset_, \ - raster_set_mode_, \ - raster_render_, \ - raster_done_ ) \ - const FT_Raster_Funcs class_ = \ - { \ - glyph_format_, \ - raster_new_, \ - raster_reset_, \ - raster_set_mode_, \ - raster_render_, \ - raster_done_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_RASTER_FUNCS( \ - class_, \ - glyph_format_, \ - raster_new_, \ - raster_reset_, \ - raster_set_mode_, \ - raster_render_, \ - raster_done_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Raster_Funcs* clazz ) \ - { \ - clazz->glyph_format = glyph_format_; \ - clazz->raster_new = raster_new_; \ - clazz->raster_reset = raster_reset_; \ - clazz->raster_set_mode = raster_set_mode_; \ - clazz->raster_render = raster_render_; \ - clazz->raster_done = raster_done_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - - /* PIC support macros for ftrender.h */ - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DEFINE_GLYPH */ - /* */ - /* <Description> */ - /* Used to initialize an instance of FT_Glyph_Class struct. */ - /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ - /* be called with a pre-allocated stcture to be filled. */ - /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ - /* allocated in the global scope (or the scope where the macro */ - /* is used). */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_GLYPH( \ - class_, \ - size_, \ - format_, \ - init_, \ - done_, \ - copy_, \ - transform_, \ - bbox_, \ - prepare_ ) \ - FT_CALLBACK_TABLE_DEF \ - const FT_Glyph_Class class_ = \ - { \ - size_, \ - format_, \ - init_, \ - done_, \ - copy_, \ - transform_, \ - bbox_, \ - prepare_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_GLYPH( \ - class_, \ - size_, \ - format_, \ - init_, \ - done_, \ - copy_, \ - transform_, \ - bbox_, \ - prepare_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Glyph_Class* clazz ) \ - { \ - clazz->glyph_size = size_; \ - clazz->glyph_format = format_; \ - clazz->glyph_init = init_; \ - clazz->glyph_done = done_; \ - clazz->glyph_copy = copy_; \ - clazz->glyph_transform = transform_; \ - clazz->glyph_bbox = bbox_; \ - clazz->glyph_prepare = prepare_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DECLARE_RENDERER */ - /* */ - /* <Description> */ - /* Used to create a forward declaration of a */ - /* FT_Renderer_Class struct instance. */ - /* */ - /* <Macro> */ - /* FT_DEFINE_RENDERER */ - /* */ - /* <Description> */ - /* Used to initialize an instance of FT_Renderer_Class struct. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is defined a `create' funtion will need */ - /* to be called with a pointer where the allocated structure is */ - /* returned. And when it is no longer needed a `destroy' function */ - /* needs to be called to release that allocation. */ - /* `fcinit.c' (ft_create_default_module_classes) already contains */ - /* a mechanism to call these functions for the default modules */ - /* described in `ftmodule.h'. */ - /* */ - /* Notice that the created `create' and `destroy' functions call */ - /* `pic_init' and `pic_free' to allow you to manually allocate and */ - /* initialize any additional global data, like a module specific */ - /* interface, and put them in the global pic container defined in */ - /* `ftpic.h'. If you don't need them just implement the functions as */ - /* empty to resolve the link error. Also the `pic_init' and */ - /* `pic_free' functions should be declared in `pic.h', to be referred */ - /* by the renderer definition calling `FT_DEFINE_RENDERER' in the */ - /* following. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ - /* allocated in the global scope (or the scope where the macro */ - /* is used). */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DECLARE_RENDERER( class_ ) \ - FT_EXPORT_VAR( const FT_Renderer_Class ) class_; - -#define FT_DEFINE_RENDERER( \ - class_, \ - flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_, \ - glyph_format_, \ - render_glyph_, \ - transform_glyph_, \ - get_glyph_cbox_, \ - set_mode_, \ - raster_class_ ) \ - FT_CALLBACK_TABLE_DEF \ - const FT_Renderer_Class class_ = \ - { \ - FT_DEFINE_ROOT_MODULE( flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_ ) \ - glyph_format_, \ - \ - render_glyph_, \ - transform_glyph_, \ - get_glyph_cbox_, \ - set_mode_, \ - \ - raster_class_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DECLARE_RENDERER( class_ ) FT_DECLARE_MODULE( class_ ) - -#define FT_DEFINE_RENDERER( \ - class_, \ - flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_, \ - glyph_format_, \ - render_glyph_, \ - transform_glyph_, \ - get_glyph_cbox_, \ - set_mode_, \ - raster_class_ ) \ - void \ - FT_Destroy_Class_ ## class_( FT_Library library, \ - FT_Module_Class* clazz ) \ - { \ - FT_Renderer_Class* rclazz = (FT_Renderer_Class*)clazz; \ - FT_Memory memory = library->memory; \ - \ - \ - class_ ## _pic_free( library ); \ - if ( rclazz ) \ - FT_FREE( rclazz ); \ - } \ - \ - \ - FT_Error \ - FT_Create_Class_ ## class_( FT_Library library, \ - FT_Module_Class** output_class ) \ - { \ - FT_Renderer_Class* clazz = NULL; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - \ - if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \ - return error; \ - \ - error = class_ ## _pic_init( library ); \ - if ( error ) \ - { \ - FT_FREE( clazz ); \ - return error; \ - } \ - \ - FT_DEFINE_ROOT_MODULE( flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_ ) \ - \ - clazz->glyph_format = glyph_format_; \ - \ - clazz->render_glyph = render_glyph_; \ - clazz->transform_glyph = transform_glyph_; \ - clazz->get_glyph_cbox = get_glyph_cbox_; \ - clazz->set_mode = set_mode_; \ - \ - clazz->raster_class = raster_class_; \ - \ - *output_class = (FT_Module_Class*)clazz; \ - \ - return FT_Err_Ok; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - - /* PIC support macros for ftmodapi.h **/ - - -#ifdef FT_CONFIG_OPTION_PIC - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Module_Creator */ - /* */ - /* <Description> */ - /* A function used to create (allocate) a new module class object. */ - /* The object's members are initialized, but the module itself is */ - /* not. */ - /* */ - /* <Input> */ - /* memory :: A handle to the memory manager. */ - /* output_class :: Initialized with the newly allocated class. */ - /* */ - typedef FT_Error - (*FT_Module_Creator)( FT_Memory memory, - FT_Module_Class** output_class ); - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Module_Destroyer */ - /* */ - /* <Description> */ - /* A function used to destroy (deallocate) a module class object. */ - /* */ - /* <Input> */ - /* memory :: A handle to the memory manager. */ - /* clazz :: Module class to destroy. */ - /* */ - typedef void - (*FT_Module_Destroyer)( FT_Memory memory, - FT_Module_Class* clazz ); - -#endif - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DECLARE_MODULE */ - /* */ - /* <Description> */ - /* Used to create a forward declaration of a */ - /* FT_Module_Class struct instance. */ - /* */ - /* <Macro> */ - /* FT_DEFINE_MODULE */ - /* */ - /* <Description> */ - /* Used to initialize an instance of an FT_Module_Class struct. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is defined a `create' funtion needs to */ - /* be called with a pointer where the allocated structure is */ - /* returned. And when it is no longer needed a `destroy' function */ - /* needs to be called to release that allocation. */ - /* `fcinit.c' (ft_create_default_module_classes) already contains */ - /* a mechanism to call these functions for the default modules */ - /* described in `ftmodule.h'. */ - /* */ - /* Notice that the created `create' and `destroy' functions call */ - /* `pic_init' and `pic_free' to allow you to manually allocate and */ - /* initialize any additional global data, like a module specific */ - /* interface, and put them in the global pic container defined in */ - /* `ftpic.h'. If you don't need them just implement the functions as */ - /* empty to resolve the link error. Also the `pic_init' and */ - /* `pic_free' functions should be declared in `pic.h', to be referred */ - /* by the module definition calling `FT_DEFINE_MODULE' in the */ - /* following. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ - /* allocated in the global scope (or the scope where the macro */ - /* is used). */ - /* */ - /* <Macro> */ - /* FT_DEFINE_ROOT_MODULE */ - /* */ - /* <Description> */ - /* Used to initialize an instance of an FT_Module_Class struct inside */ - /* another struct that contains it or in a function that initializes */ - /* that containing struct. */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DECLARE_MODULE( class_ ) \ - FT_CALLBACK_TABLE \ - const FT_Module_Class class_; - -#define FT_DEFINE_ROOT_MODULE( \ - flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_ ) \ - { \ - flags_, \ - size_, \ - \ - name_, \ - version_, \ - requires_, \ - \ - interface_, \ - \ - init_, \ - done_, \ - get_interface_, \ - }, - -#define FT_DEFINE_MODULE( \ - class_, \ - flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_ ) \ - FT_CALLBACK_TABLE_DEF \ - const FT_Module_Class class_ = \ - { \ - flags_, \ - size_, \ - \ - name_, \ - version_, \ - requires_, \ - \ - interface_, \ - \ - init_, \ - done_, \ - get_interface_, \ - }; - - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DECLARE_MODULE( class_ ) \ - FT_Error \ - FT_Create_Class_ ## class_( FT_Library library, \ - FT_Module_Class** output_class ); \ - void \ - FT_Destroy_Class_ ## class_( FT_Library library, \ - FT_Module_Class* clazz ); - -#define FT_DEFINE_ROOT_MODULE( \ - flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_ ) \ - clazz->root.module_flags = flags_; \ - clazz->root.module_size = size_; \ - clazz->root.module_name = name_; \ - clazz->root.module_version = version_; \ - clazz->root.module_requires = requires_; \ - \ - clazz->root.module_interface = interface_; \ - \ - clazz->root.module_init = init_; \ - clazz->root.module_done = done_; \ - clazz->root.get_interface = get_interface_; - -#define FT_DEFINE_MODULE( \ - class_, \ - flags_, \ - size_, \ - name_, \ - version_, \ - requires_, \ - interface_, \ - init_, \ - done_, \ - get_interface_ ) \ - void \ - FT_Destroy_Class_ ## class_( FT_Library library, \ - FT_Module_Class* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - \ - \ - class_ ## _pic_free( library ); \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - \ - FT_Error \ - FT_Create_Class_ ## class_( FT_Library library, \ - FT_Module_Class** output_class ) \ - { \ - FT_Memory memory = library->memory; \ - FT_Module_Class* clazz = NULL; \ - FT_Error error; \ - \ - \ - if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \ - return error; \ - error = class_ ## _pic_init( library ); \ - if ( error ) \ - { \ - FT_FREE( clazz ); \ - return error; \ - } \ - \ - clazz->module_flags = flags_; \ - clazz->module_size = size_; \ - clazz->module_name = name_; \ - clazz->module_version = version_; \ - clazz->module_requires = requires_; \ - \ - clazz->module_interface = interface_; \ - \ - clazz->module_init = init_; \ - clazz->module_done = done_; \ - clazz->get_interface = get_interface_; \ - \ - *output_class = clazz; \ - \ - return FT_Err_Ok; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -FT_END_HEADER - -#endif /* __FTOBJS_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/ftpic.h b/3party/freetype/include/freetype/internal/ftpic.h deleted file mode 100644 index 7f9154f419..0000000000 --- a/3party/freetype/include/freetype/internal/ftpic.h +++ /dev/null @@ -1,71 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftpic.h */ -/* */ -/* The FreeType position independent code services (declaration). */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* Modules that ordinarily have const global data that need address */ - /* can instead define pointers here. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTPIC_H__ -#define __FTPIC_H__ - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC - - typedef struct FT_PIC_Container_ - { - /* pic containers for base */ - void* base; - - /* pic containers for modules */ - void* autofit; - void* cff; - void* pshinter; - void* psnames; - void* raster; - void* sfnt; - void* smooth; - void* truetype; - - } FT_PIC_Container; - - - /* Initialize the various function tables, structs, etc. */ - /* stored in the container. */ - FT_BASE( FT_Error ) - ft_pic_container_init( FT_Library library ); - - - /* Destroy the contents of the container. */ - FT_BASE( void ) - ft_pic_container_destroy( FT_Library library ); - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* __FTPIC_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/ftrfork.h b/3party/freetype/include/freetype/internal/ftrfork.h deleted file mode 100644 index da61ca75b5..0000000000 --- a/3party/freetype/include/freetype/internal/ftrfork.h +++ /dev/null @@ -1,266 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftrfork.h */ -/* */ -/* Embedded resource forks accessor (specification). */ -/* */ -/* Copyright 2004-2015 by */ -/* Masatake YAMATO and Redhat K.K. */ -/* */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* Development of the code in this file is support of */ -/* Information-technology Promotion Agency, Japan. */ -/***************************************************************************/ - - -#ifndef __FTRFORK_H__ -#define __FTRFORK_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H - - -FT_BEGIN_HEADER - - - /* Number of guessing rules supported in `FT_Raccess_Guess'. */ - /* Don't forget to increment the number if you add a new guessing rule. */ -#define FT_RACCESS_N_RULES 9 - - - /* A structure to describe a reference in a resource by its resource ID */ - /* and internal offset. The `POST' resource expects to be concatenated */ - /* by the order of resource IDs instead of its appearance in the file. */ - - typedef struct FT_RFork_Ref_ - { - FT_UShort res_id; - FT_Long offset; - - } FT_RFork_Ref; - -#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK - typedef FT_Error - (*ft_raccess_guess_func)( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - typedef enum FT_RFork_Rule_ { - FT_RFork_Rule_invalid = -2, - FT_RFork_Rule_uknown, /* -1 */ - FT_RFork_Rule_apple_double, - FT_RFork_Rule_apple_single, - FT_RFork_Rule_darwin_ufs_export, - FT_RFork_Rule_darwin_newvfs, - FT_RFork_Rule_darwin_hfsplus, - FT_RFork_Rule_vfat, - FT_RFork_Rule_linux_cap, - FT_RFork_Rule_linux_double, - FT_RFork_Rule_linux_netatalk - } FT_RFork_Rule; - - /* For fast translation between rule index and rule type, - * the macros FT_RFORK_xxx should be kept consistent with - * the raccess_guess_funcs table - */ - typedef struct ft_raccess_guess_rec_ { - ft_raccess_guess_func func; - FT_RFork_Rule type; - } ft_raccess_guess_rec; - -#ifndef FT_CONFIG_OPTION_PIC - - /* this array is a storage in non-PIC mode, so ; is needed in END */ -#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \ - static const type name[] = { -#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \ - { raccess_guess_ ## func_suffix, \ - FT_RFork_Rule_ ## type_suffix }, -#define CONST_FT_RFORK_RULE_ARRAY_END }; - -#else /* FT_CONFIG_OPTION_PIC */ - - /* this array is a function in PIC mode, so no ; is needed in END */ -#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \ - void \ - FT_Init_Table_ ## name( type* storage ) \ - { \ - type* local = storage; \ - \ - \ - int i = 0; -#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \ - local[i].func = raccess_guess_ ## func_suffix; \ - local[i].type = FT_RFork_Rule_ ## type_suffix; \ - i++; -#define CONST_FT_RFORK_RULE_ARRAY_END } - -#endif /* FT_CONFIG_OPTION_PIC */ - -#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Raccess_Guess */ - /* */ - /* <Description> */ - /* Guess a file name and offset where the actual resource fork is */ - /* stored. The macro FT_RACCESS_N_RULES holds the number of */ - /* guessing rules; the guessed result for the Nth rule is */ - /* represented as a triplet: a new file name (new_names[N]), a file */ - /* offset (offsets[N]), and an error code (errors[N]). */ - /* */ - /* <Input> */ - /* library :: */ - /* A FreeType library instance. */ - /* */ - /* stream :: */ - /* A file stream containing the resource fork. */ - /* */ - /* base_name :: */ - /* The (base) file name of the resource fork used for some */ - /* guessing rules. */ - /* */ - /* <Output> */ - /* new_names :: */ - /* An array of guessed file names in which the resource forks may */ - /* exist. If `new_names[N]' is NULL, the guessed file name is */ - /* equal to `base_name'. */ - /* */ - /* offsets :: */ - /* An array of guessed file offsets. `offsets[N]' holds the file */ - /* offset of the possible start of the resource fork in file */ - /* `new_names[N]'. */ - /* */ - /* errors :: */ - /* An array of FreeType error codes. `errors[N]' is the error */ - /* code of Nth guessing rule function. If `errors[N]' is not */ - /* FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless. */ - /* */ - FT_BASE( void ) - FT_Raccess_Guess( FT_Library library, - FT_Stream stream, - char* base_name, - char** new_names, - FT_Long* offsets, - FT_Error* errors ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Raccess_Get_HeaderInfo */ - /* */ - /* <Description> */ - /* Get the information from the header of resource fork. The */ - /* information includes the file offset where the resource map */ - /* starts, and the file offset where the resource data starts. */ - /* `FT_Raccess_Get_DataOffsets' requires these two data. */ - /* */ - /* <Input> */ - /* library :: */ - /* A FreeType library instance. */ - /* */ - /* stream :: */ - /* A file stream containing the resource fork. */ - /* */ - /* rfork_offset :: */ - /* The file offset where the resource fork starts. */ - /* */ - /* <Output> */ - /* map_offset :: */ - /* The file offset where the resource map starts. */ - /* */ - /* rdata_pos :: */ - /* The file offset where the resource data starts. */ - /* */ - /* <Return> */ - /* FreeType error code. FT_Err_Ok means success. */ - /* */ - FT_BASE( FT_Error ) - FT_Raccess_Get_HeaderInfo( FT_Library library, - FT_Stream stream, - FT_Long rfork_offset, - FT_Long *map_offset, - FT_Long *rdata_pos ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Raccess_Get_DataOffsets */ - /* */ - /* <Description> */ - /* Get the data offsets for a tag in a resource fork. Offsets are */ - /* stored in an array because, in some cases, resources in a resource */ - /* fork have the same tag. */ - /* */ - /* <Input> */ - /* library :: */ - /* A FreeType library instance. */ - /* */ - /* stream :: */ - /* A file stream containing the resource fork. */ - /* */ - /* map_offset :: */ - /* The file offset where the resource map starts. */ - /* */ - /* rdata_pos :: */ - /* The file offset where the resource data starts. */ - /* */ - /* tag :: */ - /* The resource tag. */ - /* */ - /* sort_by_res_id :: */ - /* A Boolean to sort the fragmented resource by their ids. */ - /* The fragmented resources for `POST' resource should be sorted */ - /* to restore Type1 font properly. For `snft' resources, sorting */ - /* may induce a different order of the faces in comparison to that */ - /* by QuickDraw API. */ - /* */ - /* <Output> */ - /* offsets :: */ - /* The stream offsets for the resource data specified by `tag'. */ - /* This array is allocated by the function, so you have to call */ - /* @ft_mem_free after use. */ - /* */ - /* count :: */ - /* The length of offsets array. */ - /* */ - /* <Return> */ - /* FreeType error code. FT_Err_Ok means success. */ - /* */ - /* <Note> */ - /* Normally you should use `FT_Raccess_Get_HeaderInfo' to get the */ - /* value for `map_offset' and `rdata_pos'. */ - /* */ - FT_BASE( FT_Error ) - FT_Raccess_Get_DataOffsets( FT_Library library, - FT_Stream stream, - FT_Long map_offset, - FT_Long rdata_pos, - FT_Long tag, - FT_Bool sort_by_res_id, - FT_Long **offsets, - FT_Long *count ); - - -FT_END_HEADER - -#endif /* __FTRFORK_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/ftserv.h b/3party/freetype/include/freetype/internal/ftserv.h deleted file mode 100644 index 11a0c7f3de..0000000000 --- a/3party/freetype/include/freetype/internal/ftserv.h +++ /dev/null @@ -1,763 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftserv.h */ -/* */ -/* The FreeType services (specification only). */ -/* */ -/* Copyright 2003-2015 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. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* Each module can export one or more `services'. Each service is */ - /* identified by a constant string and modeled by a pointer; the latter */ - /* generally corresponds to a structure containing function pointers. */ - /* */ - /* Note that a service's data cannot be a mere function pointer because */ - /* in C it is possible that function pointers might be implemented */ - /* differently than data pointers (e.g. 48 bits instead of 32). */ - /* */ - /*************************************************************************/ - - -#ifndef __FTSERV_H__ -#define __FTSERV_H__ - - -FT_BEGIN_HEADER - - /* - * @macro: - * FT_FACE_FIND_SERVICE - * - * @description: - * This macro is used to look up a service from a face's driver module. - * - * @input: - * face :: - * The source face handle. - * - * id :: - * A string describing the service as defined in the service's - * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to - * `multi-masters'). It is automatically prefixed with - * `FT_SERVICE_ID_'. - * - * @output: - * ptr :: - * A variable that receives the service pointer. Will be NULL - * if not found. - */ -#ifdef __cplusplus - -#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ - FT_Pointer _tmp_ = NULL; \ - FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ - \ - \ - if ( module->clazz->get_interface ) \ - _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ - *_pptr_ = _tmp_; \ - FT_END_STMNT - -#else /* !C++ */ - -#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ - FT_Pointer _tmp_ = NULL; \ - \ - if ( module->clazz->get_interface ) \ - _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ - ptr = _tmp_; \ - FT_END_STMNT - -#endif /* !C++ */ - - - /* - * @macro: - * FT_FACE_FIND_GLOBAL_SERVICE - * - * @description: - * This macro is used to look up a service from all modules. - * - * @input: - * face :: - * The source face handle. - * - * id :: - * A string describing the service as defined in the service's - * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to - * `multi-masters'). It is automatically prefixed with - * `FT_SERVICE_ID_'. - * - * @output: - * ptr :: - * A variable that receives the service pointer. Will be NULL - * if not found. - */ -#ifdef __cplusplus - -#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ - FT_Pointer _tmp_; \ - FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ - \ - \ - _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ - *_pptr_ = _tmp_; \ - FT_END_STMNT - -#else /* !C++ */ - -#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ - FT_Pointer _tmp_; \ - \ - \ - _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ - ptr = _tmp_; \ - FT_END_STMNT - -#endif /* !C++ */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S E R V I C E D E S C R I P T O R S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * The following structure is used to _describe_ a given service - * to the library. This is useful to build simple static service lists. - */ - typedef struct FT_ServiceDescRec_ - { - const char* serv_id; /* service name */ - const void* serv_data; /* service pointer/data */ - - } FT_ServiceDescRec; - - typedef const FT_ServiceDescRec* FT_ServiceDesc; - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DEFINE_SERVICEDESCREC1 */ - /* FT_DEFINE_SERVICEDESCREC2 */ - /* FT_DEFINE_SERVICEDESCREC3 */ - /* FT_DEFINE_SERVICEDESCREC4 */ - /* FT_DEFINE_SERVICEDESCREC5 */ - /* FT_DEFINE_SERVICEDESCREC6 */ - /* FT_DEFINE_SERVICEDESCREC7 */ - /* */ - /* <Description> */ - /* Used to initialize an array of FT_ServiceDescRec structures. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is defined a `create' function needs to */ - /* be called with a pointer to return an allocated array. As soon as */ - /* it is no longer needed, a `destroy' function needs to be called to */ - /* release that allocation. */ - /* */ - /* These functions should be manually called from the `pic_init' and */ - /* `pic_free' functions of your module (see FT_DEFINE_MODULE). */ - /* */ - /* When FT_CONFIG_OPTION_PIC is not defined the array will be */ - /* allocated in the global scope (or the scope where the macro is */ - /* used). */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICEDESCREC1( class_, \ - serv_id_1, serv_data_1 ) \ - static const FT_ServiceDescRec class_[] = \ - { \ - { serv_id_1, serv_data_1 }, \ - { NULL, NULL } \ - }; - -#define FT_DEFINE_SERVICEDESCREC2( class_, \ - serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2 ) \ - static const FT_ServiceDescRec class_[] = \ - { \ - { serv_id_1, serv_data_1 }, \ - { serv_id_2, serv_data_2 }, \ - { NULL, NULL } \ - }; - -#define FT_DEFINE_SERVICEDESCREC3( class_, \ - serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, \ - serv_id_3, serv_data_3 ) \ - static const FT_ServiceDescRec class_[] = \ - { \ - { serv_id_1, serv_data_1 }, \ - { serv_id_2, serv_data_2 }, \ - { serv_id_3, serv_data_3 }, \ - { NULL, NULL } \ - }; - -#define FT_DEFINE_SERVICEDESCREC4( class_, \ - serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, \ - serv_id_3, serv_data_3, \ - serv_id_4, serv_data_4 ) \ - static const FT_ServiceDescRec class_[] = \ - { \ - { serv_id_1, serv_data_1 }, \ - { serv_id_2, serv_data_2 }, \ - { serv_id_3, serv_data_3 }, \ - { serv_id_4, serv_data_4 }, \ - { NULL, NULL } \ - }; - -#define FT_DEFINE_SERVICEDESCREC5( class_, \ - serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, \ - serv_id_3, serv_data_3, \ - serv_id_4, serv_data_4, \ - serv_id_5, serv_data_5 ) \ - static const FT_ServiceDescRec class_[] = \ - { \ - { serv_id_1, serv_data_1 }, \ - { serv_id_2, serv_data_2 }, \ - { serv_id_3, serv_data_3 }, \ - { serv_id_4, serv_data_4 }, \ - { serv_id_5, serv_data_5 }, \ - { NULL, NULL } \ - }; - -#define FT_DEFINE_SERVICEDESCREC6( class_, \ - serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, \ - serv_id_3, serv_data_3, \ - serv_id_4, serv_data_4, \ - serv_id_5, serv_data_5, \ - serv_id_6, serv_data_6 ) \ - static const FT_ServiceDescRec class_[] = \ - { \ - { serv_id_1, serv_data_1 }, \ - { serv_id_2, serv_data_2 }, \ - { serv_id_3, serv_data_3 }, \ - { serv_id_4, serv_data_4 }, \ - { serv_id_5, serv_data_5 }, \ - { serv_id_6, serv_data_6 }, \ - { NULL, NULL } \ - }; - -#define FT_DEFINE_SERVICEDESCREC7( class_, \ - serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, \ - serv_id_3, serv_data_3, \ - serv_id_4, serv_data_4, \ - serv_id_5, serv_data_5, \ - serv_id_6, serv_data_6, \ - serv_id_7, serv_data_7 ) \ - static const FT_ServiceDescRec class_[] = \ - { \ - { serv_id_1, serv_data_1 }, \ - { serv_id_2, serv_data_2 }, \ - { serv_id_3, serv_data_3 }, \ - { serv_id_4, serv_data_4 }, \ - { serv_id_5, serv_data_5 }, \ - { serv_id_6, serv_data_6 }, \ - { serv_id_7, serv_data_7 }, \ - { NULL, NULL } \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICEDESCREC1( class_, \ - serv_id_1, serv_data_1 ) \ - void \ - FT_Destroy_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - \ - \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec** output_class ) \ - { \ - FT_ServiceDescRec* clazz = NULL; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - \ - if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 2 ) ) \ - return error; \ - \ - clazz[0].serv_id = serv_id_1; \ - clazz[0].serv_data = serv_data_1; \ - clazz[1].serv_id = NULL; \ - clazz[1].serv_data = NULL; \ - \ - *output_class = clazz; \ - \ - return FT_Err_Ok; \ - } - -#define FT_DEFINE_SERVICEDESCREC2( class_, \ - serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2 ) \ - void \ - FT_Destroy_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - \ - \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec** output_class ) \ - { \ - FT_ServiceDescRec* clazz = NULL; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - \ - if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 3 ) ) \ - return error; \ - \ - clazz[0].serv_id = serv_id_1; \ - clazz[0].serv_data = serv_data_1; \ - clazz[1].serv_id = serv_id_2; \ - clazz[1].serv_data = serv_data_2; \ - clazz[2].serv_id = NULL; \ - clazz[2].serv_data = NULL; \ - \ - *output_class = clazz; \ - \ - return FT_Err_Ok; \ - } - -#define FT_DEFINE_SERVICEDESCREC3( class_, \ - serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, \ - serv_id_3, serv_data_3 ) \ - void \ - FT_Destroy_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - \ - \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec** output_class ) \ - { \ - FT_ServiceDescRec* clazz = NULL; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - \ - if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 4 ) ) \ - return error; \ - \ - clazz[0].serv_id = serv_id_1; \ - clazz[0].serv_data = serv_data_1; \ - clazz[1].serv_id = serv_id_2; \ - clazz[1].serv_data = serv_data_2; \ - clazz[2].serv_id = serv_id_3; \ - clazz[2].serv_data = serv_data_3; \ - clazz[3].serv_id = NULL; \ - clazz[3].serv_data = NULL; \ - \ - *output_class = clazz; \ - \ - return FT_Err_Ok; \ - } - -#define FT_DEFINE_SERVICEDESCREC4( class_, \ - serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, \ - serv_id_3, serv_data_3, \ - serv_id_4, serv_data_4 ) \ - void \ - FT_Destroy_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - \ - \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec** output_class ) \ - { \ - FT_ServiceDescRec* clazz = NULL; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - \ - if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 5 ) ) \ - return error; \ - \ - clazz[0].serv_id = serv_id_1; \ - clazz[0].serv_data = serv_data_1; \ - clazz[1].serv_id = serv_id_2; \ - clazz[1].serv_data = serv_data_2; \ - clazz[2].serv_id = serv_id_3; \ - clazz[2].serv_data = serv_data_3; \ - clazz[3].serv_id = serv_id_4; \ - clazz[3].serv_data = serv_data_4; \ - clazz[4].serv_id = NULL; \ - clazz[4].serv_data = NULL; \ - \ - *output_class = clazz; \ - \ - return FT_Err_Ok; \ - } - -#define FT_DEFINE_SERVICEDESCREC5( class_, \ - serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, \ - serv_id_3, serv_data_3, \ - serv_id_4, serv_data_4, \ - serv_id_5, serv_data_5 ) \ - void \ - FT_Destroy_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - \ - \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec** output_class ) \ - { \ - FT_ServiceDescRec* clazz = NULL; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - \ - if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 6 ) ) \ - return error; \ - \ - clazz[0].serv_id = serv_id_1; \ - clazz[0].serv_data = serv_data_1; \ - clazz[1].serv_id = serv_id_2; \ - clazz[1].serv_data = serv_data_2; \ - clazz[2].serv_id = serv_id_3; \ - clazz[2].serv_data = serv_data_3; \ - clazz[3].serv_id = serv_id_4; \ - clazz[3].serv_data = serv_data_4; \ - clazz[4].serv_id = serv_id_5; \ - clazz[4].serv_data = serv_data_5; \ - clazz[5].serv_id = NULL; \ - clazz[5].serv_data = NULL; \ - \ - *output_class = clazz; \ - \ - return FT_Err_Ok; \ - } - -#define FT_DEFINE_SERVICEDESCREC6( class_, \ - serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, \ - serv_id_3, serv_data_3, \ - serv_id_4, serv_data_4, \ - serv_id_5, serv_data_5, \ - serv_id_6, serv_data_6 ) \ - void \ - FT_Destroy_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - \ - \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec** output_class) \ - { \ - FT_ServiceDescRec* clazz = NULL; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - \ - if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 7 ) ) \ - return error; \ - \ - clazz[0].serv_id = serv_id_1; \ - clazz[0].serv_data = serv_data_1; \ - clazz[1].serv_id = serv_id_2; \ - clazz[1].serv_data = serv_data_2; \ - clazz[2].serv_id = serv_id_3; \ - clazz[2].serv_data = serv_data_3; \ - clazz[3].serv_id = serv_id_4; \ - clazz[3].serv_data = serv_data_4; \ - clazz[4].serv_id = serv_id_5; \ - clazz[4].serv_data = serv_data_5; \ - clazz[5].serv_id = serv_id_6; \ - clazz[5].serv_data = serv_data_6; \ - clazz[6].serv_id = NULL; \ - clazz[6].serv_data = NULL; \ - \ - *output_class = clazz; \ - \ - return FT_Err_Ok; \ - } - -#define FT_DEFINE_SERVICEDESCREC7( class_, \ - serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, \ - serv_id_3, serv_data_3, \ - serv_id_4, serv_data_4, \ - serv_id_5, serv_data_5, \ - serv_id_6, serv_data_6, \ - serv_id_7, serv_data_7 ) \ - void \ - FT_Destroy_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - \ - \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_ ## class_( FT_Library library, \ - FT_ServiceDescRec** output_class) \ - { \ - FT_ServiceDescRec* clazz = NULL; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - \ - if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 8 ) ) \ - return error; \ - \ - clazz[0].serv_id = serv_id_1; \ - clazz[0].serv_data = serv_data_1; \ - clazz[1].serv_id = serv_id_2; \ - clazz[1].serv_data = serv_data_2; \ - clazz[2].serv_id = serv_id_3; \ - clazz[2].serv_data = serv_data_3; \ - clazz[3].serv_id = serv_id_4; \ - clazz[3].serv_data = serv_data_4; \ - clazz[4].serv_id = serv_id_5; \ - clazz[4].serv_data = serv_data_5; \ - clazz[5].serv_id = serv_id_6; \ - clazz[5].serv_data = serv_data_6; \ - clazz[6].serv_id = serv_id_7; \ - clazz[6].serv_data = serv_data_7; \ - clazz[7].serv_id = NULL; \ - clazz[7].serv_data = NULL; \ - \ - *output_class = clazz; \ - \ - return FT_Err_Ok; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - - /* - * Parse a list of FT_ServiceDescRec descriptors and look for - * a specific service by ID. Note that the last element in the - * array must be { NULL, NULL }, and that the function should - * return NULL if the service isn't available. - * - * This function can be used by modules to implement their - * `get_service' method. - */ - FT_BASE( FT_Pointer ) - ft_service_list_lookup( FT_ServiceDesc service_descriptors, - const char* service_id ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S E R V I C E S C A C H E *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * This structure is used to store a cache for several frequently used - * services. It is the type of `face->internal->services'. You - * should only use FT_FACE_LOOKUP_SERVICE to access it. - * - * All fields should have the type FT_Pointer to relax compilation - * dependencies. We assume the developer isn't completely stupid. - * - * Each field must be named `service_XXXX' where `XXX' corresponds to - * the correct FT_SERVICE_ID_XXXX macro. See the definition of - * FT_FACE_LOOKUP_SERVICE below how this is implemented. - * - */ - typedef struct FT_ServiceCacheRec_ - { - FT_Pointer service_POSTSCRIPT_FONT_NAME; - FT_Pointer service_MULTI_MASTERS; - FT_Pointer service_GLYPH_DICT; - FT_Pointer service_PFR_METRICS; - FT_Pointer service_WINFNT; - - } FT_ServiceCacheRec, *FT_ServiceCache; - - - /* - * A magic number used within the services cache. - */ - - /* ensure that value `1' has the same width as a pointer */ -#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)~(FT_PtrDist)1) - - - /* - * @macro: - * FT_FACE_LOOKUP_SERVICE - * - * @description: - * This macro is used to lookup a service from a face's driver module - * using its cache. - * - * @input: - * face:: - * The source face handle containing the cache. - * - * field :: - * The field name in the cache. - * - * id :: - * The service ID. - * - * @output: - * ptr :: - * A variable receiving the service data. NULL if not available. - */ -#ifdef __cplusplus - -#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Pointer svc; \ - FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \ - \ - \ - svc = FT_FACE( face )->internal->services. service_ ## id; \ - if ( svc == FT_SERVICE_UNAVAILABLE ) \ - svc = NULL; \ - else if ( svc == NULL ) \ - { \ - FT_FACE_FIND_SERVICE( face, svc, id ); \ - \ - FT_FACE( face )->internal->services. service_ ## id = \ - (FT_Pointer)( svc != NULL ? svc \ - : FT_SERVICE_UNAVAILABLE ); \ - } \ - *Pptr = svc; \ - FT_END_STMNT - -#else /* !C++ */ - -#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Pointer svc; \ - \ - \ - svc = FT_FACE( face )->internal->services. service_ ## id; \ - if ( svc == FT_SERVICE_UNAVAILABLE ) \ - svc = NULL; \ - else if ( svc == NULL ) \ - { \ - FT_FACE_FIND_SERVICE( face, svc, id ); \ - \ - FT_FACE( face )->internal->services. service_ ## id = \ - (FT_Pointer)( svc != NULL ? svc \ - : FT_SERVICE_UNAVAILABLE ); \ - } \ - ptr = svc; \ - FT_END_STMNT - -#endif /* !C++ */ - - /* - * A macro used to define new service structure types. - */ - -#define FT_DEFINE_SERVICE( name ) \ - typedef struct FT_Service_ ## name ## Rec_ \ - FT_Service_ ## name ## Rec ; \ - typedef struct FT_Service_ ## name ## Rec_ \ - const * FT_Service_ ## name ; \ - struct FT_Service_ ## name ## Rec_ - - /* */ - - /* - * The header files containing the services. - */ - -#define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h> -#define FT_SERVICE_CID_H <freetype/internal/services/svcid.h> -#define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h> -#define FT_SERVICE_GX_VALIDATE_H <freetype/internal/services/svgxval.h> -#define FT_SERVICE_KERNING_H <freetype/internal/services/svkern.h> -#define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h> -#define FT_SERVICE_OPENTYPE_VALIDATE_H <freetype/internal/services/svotval.h> -#define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h> -#define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h> -#define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h> -#define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h> -#define FT_SERVICE_PROPERTIES_H <freetype/internal/services/svprop.h> -#define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h> -#define FT_SERVICE_TRUETYPE_ENGINE_H <freetype/internal/services/svtteng.h> -#define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h> -#define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h> -#define FT_SERVICE_FONT_FORMAT_H <freetype/internal/services/svfntfmt.h> -#define FT_SERVICE_TRUETYPE_GLYF_H <freetype/internal/services/svttglyf.h> - - /* */ - -FT_END_HEADER - -#endif /* __FTSERV_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/ftstream.h b/3party/freetype/include/freetype/internal/ftstream.h deleted file mode 100644 index 384e5df305..0000000000 --- a/3party/freetype/include/freetype/internal/ftstream.h +++ /dev/null @@ -1,536 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftstream.h */ -/* */ -/* Stream handling (specification). */ -/* */ -/* Copyright 1996-2015 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 __FTSTREAM_H__ -#define __FTSTREAM_H__ - - -#include <ft2build.h> -#include FT_SYSTEM_H -#include FT_INTERNAL_OBJECTS_H - - -FT_BEGIN_HEADER - - - /* format of an 8-bit frame_op value: */ - /* */ - /* bit 76543210 */ - /* xxxxxxes */ - /* */ - /* s is set to 1 if the value is signed. */ - /* e is set to 1 if the value is little-endian. */ - /* xxx is a command. */ - -#define FT_FRAME_OP_SHIFT 2 -#define FT_FRAME_OP_SIGNED 1 -#define FT_FRAME_OP_LITTLE 2 -#define FT_FRAME_OP_COMMAND( x ) ( x >> FT_FRAME_OP_SHIFT ) - -#define FT_MAKE_FRAME_OP( command, little, sign ) \ - ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign ) - -#define FT_FRAME_OP_END 0 -#define FT_FRAME_OP_START 1 /* start a new frame */ -#define FT_FRAME_OP_BYTE 2 /* read 1-byte value */ -#define FT_FRAME_OP_SHORT 3 /* read 2-byte value */ -#define FT_FRAME_OP_LONG 4 /* read 4-byte value */ -#define FT_FRAME_OP_OFF3 5 /* read 3-byte value */ -#define FT_FRAME_OP_BYTES 6 /* read a bytes sequence */ - - - typedef enum FT_Frame_Op_ - { - ft_frame_end = 0, - ft_frame_start = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ), - - ft_frame_byte = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 0 ), - ft_frame_schar = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 1 ), - - ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ), - ft_frame_short_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ), - ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ), - ft_frame_short_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ), - - ft_frame_ulong_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ), - ft_frame_long_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ), - ft_frame_ulong_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ), - ft_frame_long_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ), - - ft_frame_uoff3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ), - ft_frame_off3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ), - ft_frame_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ), - ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ), - - ft_frame_bytes = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ), - ft_frame_skip = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 ) - - } FT_Frame_Op; - - - typedef struct FT_Frame_Field_ - { - FT_Byte value; - FT_Byte size; - FT_UShort offset; - - } FT_Frame_Field; - - - /* Construct an FT_Frame_Field out of a structure type and a field name. */ - /* The structure type must be set in the FT_STRUCTURE macro before */ - /* calling the FT_FRAME_START() macro. */ - /* */ -#define FT_FIELD_SIZE( f ) \ - (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f ) - -#define FT_FIELD_SIZE_DELTA( f ) \ - (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] ) - -#define FT_FIELD_OFFSET( f ) \ - (FT_UShort)( offsetof( FT_STRUCTURE, f ) ) - -#define FT_FRAME_FIELD( frame_op, field ) \ - { \ - frame_op, \ - FT_FIELD_SIZE( field ), \ - FT_FIELD_OFFSET( field ) \ - } - -#define FT_MAKE_EMPTY_FIELD( frame_op ) { frame_op, 0, 0 } - -#define FT_FRAME_START( size ) { ft_frame_start, 0, size } -#define FT_FRAME_END { ft_frame_end, 0, 0 } - -#define FT_FRAME_LONG( f ) FT_FRAME_FIELD( ft_frame_long_be, f ) -#define FT_FRAME_ULONG( f ) FT_FRAME_FIELD( ft_frame_ulong_be, f ) -#define FT_FRAME_SHORT( f ) FT_FRAME_FIELD( ft_frame_short_be, f ) -#define FT_FRAME_USHORT( f ) FT_FRAME_FIELD( ft_frame_ushort_be, f ) -#define FT_FRAME_OFF3( f ) FT_FRAME_FIELD( ft_frame_off3_be, f ) -#define FT_FRAME_UOFF3( f ) FT_FRAME_FIELD( ft_frame_uoff3_be, f ) -#define FT_FRAME_BYTE( f ) FT_FRAME_FIELD( ft_frame_byte, f ) -#define FT_FRAME_CHAR( f ) FT_FRAME_FIELD( ft_frame_schar, f ) - -#define FT_FRAME_LONG_LE( f ) FT_FRAME_FIELD( ft_frame_long_le, f ) -#define FT_FRAME_ULONG_LE( f ) FT_FRAME_FIELD( ft_frame_ulong_le, f ) -#define FT_FRAME_SHORT_LE( f ) FT_FRAME_FIELD( ft_frame_short_le, f ) -#define FT_FRAME_USHORT_LE( f ) FT_FRAME_FIELD( ft_frame_ushort_le, f ) -#define FT_FRAME_OFF3_LE( f ) FT_FRAME_FIELD( ft_frame_off3_le, f ) -#define FT_FRAME_UOFF3_LE( f ) FT_FRAME_FIELD( ft_frame_uoff3_le, f ) - -#define FT_FRAME_SKIP_LONG { ft_frame_long_be, 0, 0 } -#define FT_FRAME_SKIP_SHORT { ft_frame_short_be, 0, 0 } -#define FT_FRAME_SKIP_BYTE { ft_frame_byte, 0, 0 } - -#define FT_FRAME_BYTES( field, count ) \ - { \ - ft_frame_bytes, \ - count, \ - FT_FIELD_OFFSET( field ) \ - } - -#define FT_FRAME_SKIP_BYTES( count ) { ft_frame_skip, count, 0 } - - - /*************************************************************************/ - /* */ - /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */ - /* type `char*' or equivalent (1-byte elements). */ - /* */ - -#define FT_BYTE_( p, i ) ( ((const FT_Byte*)(p))[(i)] ) - -#define FT_INT16( x ) ( (FT_Int16)(x) ) -#define FT_UINT16( x ) ( (FT_UInt16)(x) ) -#define FT_INT32( x ) ( (FT_Int32)(x) ) -#define FT_UINT32( x ) ( (FT_UInt32)(x) ) - - -#define FT_BYTE_U16( p, i, s ) ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) ) -#define FT_BYTE_U32( p, i, s ) ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) ) - - -#define FT_PEEK_SHORT( p ) FT_INT16( FT_BYTE_U16( p, 0, 8) | \ - FT_BYTE_U16( p, 1, 0) ) - -#define FT_PEEK_USHORT( p ) FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \ - FT_BYTE_U16( p, 1, 0 ) ) - -#define FT_PEEK_LONG( p ) FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \ - FT_BYTE_U32( p, 1, 16 ) | \ - FT_BYTE_U32( p, 2, 8 ) | \ - FT_BYTE_U32( p, 3, 0 ) ) - -#define FT_PEEK_ULONG( p ) FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \ - FT_BYTE_U32( p, 1, 16 ) | \ - FT_BYTE_U32( p, 2, 8 ) | \ - FT_BYTE_U32( p, 3, 0 ) ) - -#define FT_PEEK_OFF3( p ) FT_INT32( FT_BYTE_U32( p, 0, 16 ) | \ - FT_BYTE_U32( p, 1, 8 ) | \ - FT_BYTE_U32( p, 2, 0 ) ) - -#define FT_PEEK_UOFF3( p ) FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \ - FT_BYTE_U32( p, 1, 8 ) | \ - FT_BYTE_U32( p, 2, 0 ) ) - -#define FT_PEEK_SHORT_LE( p ) FT_INT16( FT_BYTE_U16( p, 1, 8 ) | \ - FT_BYTE_U16( p, 0, 0 ) ) - -#define FT_PEEK_USHORT_LE( p ) FT_UINT16( FT_BYTE_U16( p, 1, 8 ) | \ - FT_BYTE_U16( p, 0, 0 ) ) - -#define FT_PEEK_LONG_LE( p ) FT_INT32( FT_BYTE_U32( p, 3, 24 ) | \ - FT_BYTE_U32( p, 2, 16 ) | \ - FT_BYTE_U32( p, 1, 8 ) | \ - FT_BYTE_U32( p, 0, 0 ) ) - -#define FT_PEEK_ULONG_LE( p ) FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \ - FT_BYTE_U32( p, 2, 16 ) | \ - FT_BYTE_U32( p, 1, 8 ) | \ - FT_BYTE_U32( p, 0, 0 ) ) - -#define FT_PEEK_OFF3_LE( p ) FT_INT32( FT_BYTE_U32( p, 2, 16 ) | \ - FT_BYTE_U32( p, 1, 8 ) | \ - FT_BYTE_U32( p, 0, 0 ) ) - -#define FT_PEEK_UOFF3_LE( p ) FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \ - FT_BYTE_U32( p, 1, 8 ) | \ - FT_BYTE_U32( p, 0, 0 ) ) - - -#define FT_NEXT_CHAR( buffer ) \ - ( (signed char)*buffer++ ) - -#define FT_NEXT_BYTE( buffer ) \ - ( (unsigned char)*buffer++ ) - -#define FT_NEXT_SHORT( buffer ) \ - ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) ) - -#define FT_NEXT_USHORT( buffer ) \ - ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) ) - -#define FT_NEXT_OFF3( buffer ) \ - ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) ) - -#define FT_NEXT_UOFF3( buffer ) \ - ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) ) - -#define FT_NEXT_LONG( buffer ) \ - ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) ) - -#define FT_NEXT_ULONG( buffer ) \ - ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) ) - - -#define FT_NEXT_SHORT_LE( buffer ) \ - ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) ) - -#define FT_NEXT_USHORT_LE( buffer ) \ - ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) ) - -#define FT_NEXT_OFF3_LE( buffer ) \ - ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) ) - -#define FT_NEXT_UOFF3_LE( buffer ) \ - ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) ) - -#define FT_NEXT_LONG_LE( buffer ) \ - ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) ) - -#define FT_NEXT_ULONG_LE( buffer ) \ - ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) ) - - - /*************************************************************************/ - /* */ - /* Each GET_xxxx() macro uses an implicit `stream' variable. */ - /* */ -#if 0 -#define FT_GET_MACRO( type ) FT_NEXT_ ## type ( stream->cursor ) - -#define FT_GET_CHAR() FT_GET_MACRO( CHAR ) -#define FT_GET_BYTE() FT_GET_MACRO( BYTE ) -#define FT_GET_SHORT() FT_GET_MACRO( SHORT ) -#define FT_GET_USHORT() FT_GET_MACRO( USHORT ) -#define FT_GET_OFF3() FT_GET_MACRO( OFF3 ) -#define FT_GET_UOFF3() FT_GET_MACRO( UOFF3 ) -#define FT_GET_LONG() FT_GET_MACRO( LONG ) -#define FT_GET_ULONG() FT_GET_MACRO( ULONG ) -#define FT_GET_TAG4() FT_GET_MACRO( ULONG ) - -#define FT_GET_SHORT_LE() FT_GET_MACRO( SHORT_LE ) -#define FT_GET_USHORT_LE() FT_GET_MACRO( USHORT_LE ) -#define FT_GET_LONG_LE() FT_GET_MACRO( LONG_LE ) -#define FT_GET_ULONG_LE() FT_GET_MACRO( ULONG_LE ) - -#else -#define FT_GET_MACRO( func, type ) ( (type)func( stream ) ) - -#define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetChar, FT_Char ) -#define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetChar, FT_Byte ) -#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_Short ) -#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort ) -#define FT_GET_OFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_Long ) -#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong ) -#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetULong, FT_Long ) -#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetULong, FT_ULong ) -#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetULong, FT_ULong ) - -#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short ) -#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort ) -#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long ) -#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong ) -#endif - -#define FT_READ_MACRO( func, type, var ) \ - ( var = (type)func( stream, &error ), \ - error != FT_Err_Ok ) - -#define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var ) -#define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var ) -#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var ) -#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var ) -#define FT_READ_OFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_Long, var ) -#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var ) -#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var ) -#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var ) - -#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var ) -#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var ) -#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var ) -#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var ) - - -#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM - - /* initialize a stream for reading a regular system stream */ - FT_BASE( FT_Error ) - FT_Stream_Open( FT_Stream stream, - const char* filepathname ); - -#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ - - - /* create a new (input) stream from an FT_Open_Args structure */ - FT_BASE( FT_Error ) - FT_Stream_New( FT_Library library, - const FT_Open_Args* args, - FT_Stream *astream ); - - /* free a stream */ - FT_BASE( void ) - FT_Stream_Free( FT_Stream stream, - FT_Int external ); - - /* initialize a stream for reading in-memory data */ - FT_BASE( void ) - FT_Stream_OpenMemory( FT_Stream stream, - const FT_Byte* base, - FT_ULong size ); - - /* close a stream (does not destroy the stream structure) */ - FT_BASE( void ) - FT_Stream_Close( FT_Stream stream ); - - - /* seek within a stream. position is relative to start of stream */ - FT_BASE( FT_Error ) - FT_Stream_Seek( FT_Stream stream, - FT_ULong pos ); - - /* skip bytes in a stream */ - FT_BASE( FT_Error ) - FT_Stream_Skip( FT_Stream stream, - FT_Long distance ); - - /* return current stream position */ - FT_BASE( FT_ULong ) - FT_Stream_Pos( FT_Stream stream ); - - /* read bytes from a stream into a user-allocated buffer, returns an */ - /* error if not all bytes could be read. */ - FT_BASE( FT_Error ) - FT_Stream_Read( FT_Stream stream, - FT_Byte* buffer, - FT_ULong count ); - - /* read bytes from a stream at a given position */ - FT_BASE( FT_Error ) - FT_Stream_ReadAt( FT_Stream stream, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ); - - /* try to read bytes at the end of a stream; return number of bytes */ - /* really available */ - FT_BASE( FT_ULong ) - FT_Stream_TryRead( FT_Stream stream, - FT_Byte* buffer, - FT_ULong count ); - - /* Enter a frame of `count' consecutive bytes in a stream. Returns an */ - /* error if the frame could not be read/accessed. The caller can use */ - /* the FT_Stream_Get_XXX functions to retrieve frame data without */ - /* error checks. */ - /* */ - /* You must _always_ call FT_Stream_ExitFrame() once you have entered */ - /* a stream frame! */ - /* */ - FT_BASE( FT_Error ) - FT_Stream_EnterFrame( FT_Stream stream, - FT_ULong count ); - - /* exit a stream frame */ - FT_BASE( void ) - FT_Stream_ExitFrame( FT_Stream stream ); - - /* Extract a stream frame. If the stream is disk-based, a heap block */ - /* is allocated and the frame bytes are read into it. If the stream */ - /* is memory-based, this function simply set a pointer to the data. */ - /* */ - /* Useful to optimize access to memory-based streams transparently. */ - /* */ - /* All extracted frames must be `freed' with a call to the function */ - /* FT_Stream_ReleaseFrame(). */ - /* */ - FT_BASE( FT_Error ) - FT_Stream_ExtractFrame( FT_Stream stream, - FT_ULong count, - FT_Byte** pbytes ); - - /* release an extract frame (see FT_Stream_ExtractFrame) */ - FT_BASE( void ) - FT_Stream_ReleaseFrame( FT_Stream stream, - FT_Byte** pbytes ); - - /* read a byte from an entered frame */ - FT_BASE( FT_Char ) - FT_Stream_GetChar( FT_Stream stream ); - - /* read a 16-bit big-endian unsigned integer from an entered frame */ - FT_BASE( FT_UShort ) - FT_Stream_GetUShort( FT_Stream stream ); - - /* read a 24-bit big-endian unsigned integer from an entered frame */ - FT_BASE( FT_ULong ) - FT_Stream_GetUOffset( FT_Stream stream ); - - /* read a 32-bit big-endian unsigned integer from an entered frame */ - FT_BASE( FT_ULong ) - FT_Stream_GetULong( FT_Stream stream ); - - /* read a 16-bit little-endian unsigned integer from an entered frame */ - FT_BASE( FT_UShort ) - FT_Stream_GetUShortLE( FT_Stream stream ); - - /* read a 32-bit little-endian unsigned integer from an entered frame */ - FT_BASE( FT_ULong ) - FT_Stream_GetULongLE( FT_Stream stream ); - - - /* read a byte from a stream */ - FT_BASE( FT_Char ) - FT_Stream_ReadChar( FT_Stream stream, - FT_Error* error ); - - /* read a 16-bit big-endian unsigned integer from a stream */ - FT_BASE( FT_UShort ) - FT_Stream_ReadUShort( FT_Stream stream, - FT_Error* error ); - - /* read a 24-bit big-endian unsigned integer from a stream */ - FT_BASE( FT_ULong ) - FT_Stream_ReadUOffset( FT_Stream stream, - FT_Error* error ); - - /* read a 32-bit big-endian integer from a stream */ - FT_BASE( FT_ULong ) - FT_Stream_ReadULong( FT_Stream stream, - FT_Error* error ); - - /* read a 16-bit little-endian unsigned integer from a stream */ - FT_BASE( FT_UShort ) - FT_Stream_ReadUShortLE( FT_Stream stream, - FT_Error* error ); - - /* read a 32-bit little-endian unsigned integer from a stream */ - FT_BASE( FT_ULong ) - FT_Stream_ReadULongLE( FT_Stream stream, - FT_Error* error ); - - /* Read a structure from a stream. The structure must be described */ - /* by an array of FT_Frame_Field records. */ - FT_BASE( FT_Error ) - FT_Stream_ReadFields( FT_Stream stream, - const FT_Frame_Field* fields, - void* structure ); - - -#define FT_STREAM_POS() \ - FT_Stream_Pos( stream ) - -#define FT_STREAM_SEEK( position ) \ - FT_SET_ERROR( FT_Stream_Seek( stream, \ - (FT_ULong)(position) ) ) - -#define FT_STREAM_SKIP( distance ) \ - FT_SET_ERROR( FT_Stream_Skip( stream, \ - (FT_Long)(distance) ) ) - -#define FT_STREAM_READ( buffer, count ) \ - FT_SET_ERROR( FT_Stream_Read( stream, \ - (FT_Byte*)(buffer), \ - (FT_ULong)(count) ) ) - -#define FT_STREAM_READ_AT( position, buffer, count ) \ - FT_SET_ERROR( FT_Stream_ReadAt( stream, \ - (FT_ULong)(position), \ - (FT_Byte*)buffer, \ - (FT_ULong)(count) ) ) - -#define FT_STREAM_READ_FIELDS( fields, object ) \ - FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) ) - - -#define FT_FRAME_ENTER( size ) \ - FT_SET_ERROR( \ - FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, \ - (FT_ULong)(size) ) ) ) - -#define FT_FRAME_EXIT() \ - FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) ) - -#define FT_FRAME_EXTRACT( size, bytes ) \ - FT_SET_ERROR( \ - FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream, \ - (FT_ULong)(size), \ - (FT_Byte**)&(bytes) ) ) ) - -#define FT_FRAME_RELEASE( bytes ) \ - FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream, \ - (FT_Byte**)&(bytes) ) ) - - -FT_END_HEADER - -#endif /* __FTSTREAM_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/fttrace.h b/3party/freetype/include/freetype/internal/fttrace.h deleted file mode 100644 index 9d28d214d6..0000000000 --- a/3party/freetype/include/freetype/internal/fttrace.h +++ /dev/null @@ -1,154 +0,0 @@ -/***************************************************************************/ -/* */ -/* fttrace.h */ -/* */ -/* Tracing handling (specification only). */ -/* */ -/* Copyright 2002-2015 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. */ -/* */ -/***************************************************************************/ - - - /* definitions of trace levels for FreeType 2 */ - - /* the first level must always be `trace_any' */ -FT_TRACE_DEF( any ) - - /* base components */ -FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */ -FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */ -FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */ -FT_TRACE_DEF( io ) /* i/o interface (ftsystem.c) */ -FT_TRACE_DEF( list ) /* list management (ftlist.c) */ -FT_TRACE_DEF( init ) /* initialization (ftinit.c) */ -FT_TRACE_DEF( objs ) /* base objects (ftobjs.c) */ -FT_TRACE_DEF( outline ) /* outline management (ftoutln.c) */ -FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */ -FT_TRACE_DEF( gloader ) /* glyph loader (ftgloadr.c) */ - -FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */ -FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */ -FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */ -FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */ -FT_TRACE_DEF( synth ) /* bold/slant synthesizer (ftsynth.c) */ -FT_TRACE_DEF( bitmap ) /* bitmap checksum (ftobjs.c) */ - - /* Cache sub-system */ -FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */ - - /* SFNT driver components */ -FT_TRACE_DEF( sfdriver ) /* SFNT font driver (sfdriver.c) */ -FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ -FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ -FT_TRACE_DEF( ttkern ) /* kerning handler (ttkern.c) */ -FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */ -FT_TRACE_DEF( ttmtx ) /* metrics-related tables (ttmtx.c) */ -FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */ -FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */ -FT_TRACE_DEF( ttbdf ) /* TrueType embedded BDF (ttbdf.c) */ - - /* TrueType driver components */ -FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */ -FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */ -FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */ -FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */ -FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c) */ -FT_TRACE_DEF( ttgxvar ) /* TrueType GX var handler (ttgxvar.c) */ - - /* Type 1 driver components */ -FT_TRACE_DEF( t1afm ) -FT_TRACE_DEF( t1driver ) -FT_TRACE_DEF( t1gload ) -FT_TRACE_DEF( t1hint ) -FT_TRACE_DEF( t1load ) -FT_TRACE_DEF( t1objs ) -FT_TRACE_DEF( t1parse ) - - /* PostScript helper module `psaux' */ -FT_TRACE_DEF( t1decode ) -FT_TRACE_DEF( psobjs ) -FT_TRACE_DEF( psconv ) - - /* PostScript hinting module `pshinter' */ -FT_TRACE_DEF( pshrec ) -FT_TRACE_DEF( pshalgo1 ) -FT_TRACE_DEF( pshalgo2 ) - - /* Type 2 driver components */ -FT_TRACE_DEF( cffdriver ) -FT_TRACE_DEF( cffgload ) -FT_TRACE_DEF( cffload ) -FT_TRACE_DEF( cffobjs ) -FT_TRACE_DEF( cffparse ) - -FT_TRACE_DEF( cf2blues ) -FT_TRACE_DEF( cf2hints ) -FT_TRACE_DEF( cf2interp ) - - /* Type 42 driver component */ -FT_TRACE_DEF( t42 ) - - /* CID driver components */ -FT_TRACE_DEF( cidafm ) -FT_TRACE_DEF( ciddriver ) -FT_TRACE_DEF( cidgload ) -FT_TRACE_DEF( cidload ) -FT_TRACE_DEF( cidobjs ) -FT_TRACE_DEF( cidparse ) - - /* Windows font component */ -FT_TRACE_DEF( winfnt ) - - /* PCF font components */ -FT_TRACE_DEF( pcfdriver ) -FT_TRACE_DEF( pcfread ) - - /* BDF font components */ -FT_TRACE_DEF( bdfdriver ) -FT_TRACE_DEF( bdflib ) - - /* PFR font component */ -FT_TRACE_DEF( pfr ) - - /* OpenType validation components */ -FT_TRACE_DEF( otvmodule ) -FT_TRACE_DEF( otvcommon ) -FT_TRACE_DEF( otvbase ) -FT_TRACE_DEF( otvgdef ) -FT_TRACE_DEF( otvgpos ) -FT_TRACE_DEF( otvgsub ) -FT_TRACE_DEF( otvjstf ) -FT_TRACE_DEF( otvmath ) - - /* TrueTypeGX/AAT validation components */ -FT_TRACE_DEF( gxvmodule ) -FT_TRACE_DEF( gxvcommon ) -FT_TRACE_DEF( gxvfeat ) -FT_TRACE_DEF( gxvmort ) -FT_TRACE_DEF( gxvmorx ) -FT_TRACE_DEF( gxvbsln ) -FT_TRACE_DEF( gxvjust ) -FT_TRACE_DEF( gxvkern ) -FT_TRACE_DEF( gxvopbd ) -FT_TRACE_DEF( gxvtrak ) -FT_TRACE_DEF( gxvprop ) -FT_TRACE_DEF( gxvlcar ) - - /* autofit components */ -FT_TRACE_DEF( afmodule ) -FT_TRACE_DEF( afhints ) -FT_TRACE_DEF( afcjk ) -FT_TRACE_DEF( aflatin ) -FT_TRACE_DEF( aflatin2 ) -FT_TRACE_DEF( afwarp ) -FT_TRACE_DEF( afharfbuzz ) -FT_TRACE_DEF( afglobal ) - -/* END */ diff --git a/3party/freetype/include/freetype/internal/ftvalid.h b/3party/freetype/include/freetype/internal/ftvalid.h deleted file mode 100644 index 9cda6eef5f..0000000000 --- a/3party/freetype/include/freetype/internal/ftvalid.h +++ /dev/null @@ -1,159 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftvalid.h */ -/* */ -/* FreeType validation support (specification). */ -/* */ -/* Copyright 2004-2015 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 __FTVALID_H__ -#define __FTVALID_H__ - -#include <ft2build.h> -#include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_setjmp and ft_longjmp */ - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** V A L I D A T I O N ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /* handle to a validation object */ - typedef struct FT_ValidatorRec_ volatile* FT_Validator; - - - /*************************************************************************/ - /* */ - /* There are three distinct validation levels defined here: */ - /* */ - /* FT_VALIDATE_DEFAULT :: */ - /* A table that passes this validation level can be used reliably by */ - /* FreeType. It generally means that all offsets have been checked to */ - /* prevent out-of-bound reads, that array counts are correct, etc. */ - /* */ - /* FT_VALIDATE_TIGHT :: */ - /* A table that passes this validation level can be used reliably and */ - /* doesn't contain invalid data. For example, a charmap table that */ - /* returns invalid glyph indices will not pass, even though it can */ - /* be used with FreeType in default mode (the library will simply */ - /* return an error later when trying to load the glyph). */ - /* */ - /* It also checks that fields which must be a multiple of 2, 4, or 8, */ - /* don't have incorrect values, etc. */ - /* */ - /* FT_VALIDATE_PARANOID :: */ - /* Only for font debugging. Checks that a table follows the */ - /* specification by 100%. Very few fonts will be able to pass this */ - /* level anyway but it can be useful for certain tools like font */ - /* editors/converters. */ - /* */ - typedef enum FT_ValidationLevel_ - { - FT_VALIDATE_DEFAULT = 0, - FT_VALIDATE_TIGHT, - FT_VALIDATE_PARANOID - - } FT_ValidationLevel; - - -#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ - /* We disable the warning `structure was padded due to */ - /* __declspec(align())' in order to compile cleanly with */ - /* the maximum level of warnings. */ -#pragma warning( push ) -#pragma warning( disable : 4324 ) -#endif /* _MSC_VER */ - - /* validator structure */ - typedef struct FT_ValidatorRec_ - { - ft_jmp_buf jump_buffer; /* used for exception handling */ - - const FT_Byte* base; /* address of table in memory */ - const FT_Byte* limit; /* `base' + sizeof(table) in memory */ - FT_ValidationLevel level; /* validation level */ - FT_Error error; /* error returned. 0 means success */ - - } FT_ValidatorRec; - -#if defined( _MSC_VER ) -#pragma warning( pop ) -#endif - -#define FT_VALIDATOR( x ) ( (FT_Validator)( x ) ) - - - FT_BASE( void ) - ft_validator_init( FT_Validator valid, - const FT_Byte* base, - const FT_Byte* limit, - FT_ValidationLevel level ); - - /* Do not use this. It's broken and will cause your validator to crash */ - /* if you run it on an invalid font. */ - FT_BASE( FT_Int ) - ft_validator_run( FT_Validator valid ); - - /* Sets the error field in a validator, then calls `longjmp' to return */ - /* to high-level caller. Using `setjmp/longjmp' avoids many stupid */ - /* error checks within the validation routines. */ - /* */ - FT_BASE( void ) - ft_validator_error( FT_Validator valid, - FT_Error error ); - - - /* Calls ft_validate_error. Assumes that the `valid' local variable */ - /* holds a pointer to the current validator object. */ - /* */ -#define FT_INVALID( _error ) FT_INVALID_( _error ) -#define FT_INVALID_( _error ) \ - ft_validator_error( valid, FT_THROW( _error ) ) - - /* called when a broken table is detected */ -#define FT_INVALID_TOO_SHORT \ - FT_INVALID( Invalid_Table ) - - /* called when an invalid offset is detected */ -#define FT_INVALID_OFFSET \ - FT_INVALID( Invalid_Offset ) - - /* called when an invalid format/value is detected */ -#define FT_INVALID_FORMAT \ - FT_INVALID( Invalid_Table ) - - /* called when an invalid glyph index is detected */ -#define FT_INVALID_GLYPH_ID \ - FT_INVALID( Invalid_Glyph_Index ) - - /* called when an invalid field value is detected */ -#define FT_INVALID_DATA \ - FT_INVALID( Invalid_Table ) - - -FT_END_HEADER - -#endif /* __FTVALID_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/internal.h b/3party/freetype/include/freetype/internal/internal.h deleted file mode 100644 index 809ce59c92..0000000000 --- a/3party/freetype/include/freetype/internal/internal.h +++ /dev/null @@ -1,63 +0,0 @@ -/***************************************************************************/ -/* */ -/* internal.h */ -/* */ -/* Internal header files (specification only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is automatically included by `ft2build.h'. */ - /* Do not include it manually! */ - /* */ - /*************************************************************************/ - - -#define FT_INTERNAL_OBJECTS_H <freetype/internal/ftobjs.h> -#define FT_INTERNAL_PIC_H <freetype/internal/ftpic.h> -#define FT_INTERNAL_STREAM_H <freetype/internal/ftstream.h> -#define FT_INTERNAL_MEMORY_H <freetype/internal/ftmemory.h> -#define FT_INTERNAL_DEBUG_H <freetype/internal/ftdebug.h> -#define FT_INTERNAL_CALC_H <freetype/internal/ftcalc.h> -#define FT_INTERNAL_DRIVER_H <freetype/internal/ftdriver.h> -#define FT_INTERNAL_TRACE_H <freetype/internal/fttrace.h> -#define FT_INTERNAL_GLYPH_LOADER_H <freetype/internal/ftgloadr.h> -#define FT_INTERNAL_SFNT_H <freetype/internal/sfnt.h> -#define FT_INTERNAL_SERVICE_H <freetype/internal/ftserv.h> -#define FT_INTERNAL_RFORK_H <freetype/internal/ftrfork.h> -#define FT_INTERNAL_VALIDATE_H <freetype/internal/ftvalid.h> - -#define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h> -#define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h> - -#define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h> -#define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h> -#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H <freetype/internal/psglobal.h> - -#define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h> - - -#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ - - /* We disable the warning `conditional expression is constant' here */ - /* in order to compile cleanly with the maximum level of warnings. */ - /* In particular, the warning complains about stuff like `while(0)' */ - /* which is very useful in macro definitions. There is no benefit */ - /* in having it enabled. */ -#pragma warning( disable : 4127 ) - -#endif /* _MSC_VER */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/psaux.h b/3party/freetype/include/freetype/internal/psaux.h deleted file mode 100644 index 1c5f784f52..0000000000 --- a/3party/freetype/include/freetype/internal/psaux.h +++ /dev/null @@ -1,877 +0,0 @@ -/***************************************************************************/ -/* */ -/* psaux.h */ -/* */ -/* Auxiliary functions and data structures related to PostScript fonts */ -/* (specification). */ -/* */ -/* Copyright 1996-2015 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 __PSAUX_H__ -#define __PSAUX_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1_TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - typedef struct PS_TableRec_* PS_Table; - typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_Table_FuncsRec */ - /* */ - /* <Description> */ - /* A set of function pointers to manage PS_Table objects. */ - /* */ - /* <Fields> */ - /* table_init :: Used to initialize a table. */ - /* */ - /* table_done :: Finalizes resp. destroy a given table. */ - /* */ - /* table_add :: Adds a new object to a table. */ - /* */ - /* table_release :: Releases table data, then finalizes it. */ - /* */ - typedef struct PS_Table_FuncsRec_ - { - FT_Error - (*init)( PS_Table table, - FT_Int count, - FT_Memory memory ); - - void - (*done)( PS_Table table ); - - FT_Error - (*add)( PS_Table table, - FT_Int idx, - void* object, - FT_UInt length ); - - void - (*release)( PS_Table table ); - - } PS_Table_FuncsRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_TableRec */ - /* */ - /* <Description> */ - /* A PS_Table is a simple object used to store an array of objects in */ - /* a single memory block. */ - /* */ - /* <Fields> */ - /* block :: The address in memory of the growheap's block. This */ - /* can change between two object adds, due to */ - /* reallocation. */ - /* */ - /* cursor :: The current top of the grow heap within its block. */ - /* */ - /* capacity :: The current size of the heap block. Increments by */ - /* 1kByte chunks. */ - /* */ - /* init :: Set to 0xDEADBEEF if `elements' and `lengths' have */ - /* been allocated. */ - /* */ - /* max_elems :: The maximum number of elements in table. */ - /* */ - /* num_elems :: The current number of elements in table. */ - /* */ - /* elements :: A table of element addresses within the block. */ - /* */ - /* lengths :: A table of element sizes within the block. */ - /* */ - /* memory :: The object used for memory operations */ - /* (alloc/realloc). */ - /* */ - /* funcs :: A table of method pointers for this object. */ - /* */ - typedef struct PS_TableRec_ - { - FT_Byte* block; /* current memory block */ - FT_Offset cursor; /* current cursor in memory block */ - FT_Offset capacity; /* current size of memory block */ - FT_ULong init; - - FT_Int max_elems; - FT_Int num_elems; - FT_Byte** elements; /* addresses of table elements */ - FT_UInt* lengths; /* lengths of table elements */ - - FT_Memory memory; - PS_Table_FuncsRec funcs; - - } PS_TableRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 FIELDS & TOKENS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct PS_ParserRec_* PS_Parser; - - typedef struct T1_TokenRec_* T1_Token; - - typedef struct T1_FieldRec_* T1_Field; - - - /* simple enumeration type used to identify token types */ - typedef enum T1_TokenType_ - { - T1_TOKEN_TYPE_NONE = 0, - T1_TOKEN_TYPE_ANY, - T1_TOKEN_TYPE_STRING, - T1_TOKEN_TYPE_ARRAY, - T1_TOKEN_TYPE_KEY, /* aka `name' */ - - /* do not remove */ - T1_TOKEN_TYPE_MAX - - } T1_TokenType; - - - /* a simple structure used to identify tokens */ - typedef struct T1_TokenRec_ - { - FT_Byte* start; /* first character of token in input stream */ - FT_Byte* limit; /* first character after the token */ - T1_TokenType type; /* type of token */ - - } T1_TokenRec; - - - /* enumeration type used to identify object fields */ - typedef enum T1_FieldType_ - { - T1_FIELD_TYPE_NONE = 0, - T1_FIELD_TYPE_BOOL, - T1_FIELD_TYPE_INTEGER, - T1_FIELD_TYPE_FIXED, - T1_FIELD_TYPE_FIXED_1000, - T1_FIELD_TYPE_STRING, - T1_FIELD_TYPE_KEY, - T1_FIELD_TYPE_BBOX, - T1_FIELD_TYPE_MM_BBOX, - T1_FIELD_TYPE_INTEGER_ARRAY, - T1_FIELD_TYPE_FIXED_ARRAY, - T1_FIELD_TYPE_CALLBACK, - - /* do not remove */ - T1_FIELD_TYPE_MAX - - } T1_FieldType; - - - typedef enum T1_FieldLocation_ - { - T1_FIELD_LOCATION_CID_INFO, - T1_FIELD_LOCATION_FONT_DICT, - T1_FIELD_LOCATION_FONT_EXTRA, - T1_FIELD_LOCATION_FONT_INFO, - T1_FIELD_LOCATION_PRIVATE, - T1_FIELD_LOCATION_BBOX, - T1_FIELD_LOCATION_LOADER, - T1_FIELD_LOCATION_FACE, - T1_FIELD_LOCATION_BLEND, - - /* do not remove */ - T1_FIELD_LOCATION_MAX - - } T1_FieldLocation; - - - typedef void - (*T1_Field_ParseFunc)( FT_Face face, - FT_Pointer parser ); - - - /* structure type used to model object fields */ - typedef struct T1_FieldRec_ - { - const char* ident; /* field identifier */ - T1_FieldLocation location; - T1_FieldType type; /* type of field */ - T1_Field_ParseFunc reader; - FT_UInt offset; /* offset of field in object */ - FT_Byte size; /* size of field in bytes */ - FT_UInt array_max; /* maximum number of elements for */ - /* array */ - FT_UInt count_offset; /* offset of element count for */ - /* arrays; must not be zero if in */ - /* use -- in other words, a */ - /* `num_FOO' element must not */ - /* start the used structure if we */ - /* parse a `FOO' array */ - FT_UInt dict; /* where we expect it */ - } T1_FieldRec; - -#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */ -#define T1_FIELD_DICT_PRIVATE ( 1 << 1 ) - - - -#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \ - { \ - _ident, T1CODE, _type, \ - 0, \ - FT_FIELD_OFFSET( _fname ), \ - FT_FIELD_SIZE( _fname ), \ - 0, 0, \ - _dict \ - }, - -#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \ - { \ - _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \ - (T1_Field_ParseFunc)_reader, \ - 0, 0, \ - 0, 0, \ - _dict \ - }, - -#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \ - { \ - _ident, T1CODE, _type, \ - 0, \ - FT_FIELD_OFFSET( _fname ), \ - FT_FIELD_SIZE_DELTA( _fname ), \ - _max, \ - FT_FIELD_OFFSET( num_ ## _fname ), \ - _dict \ - }, - -#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \ - { \ - _ident, T1CODE, _type, \ - 0, \ - FT_FIELD_OFFSET( _fname ), \ - FT_FIELD_SIZE_DELTA( _fname ), \ - _max, 0, \ - _dict \ - }, - - -#define T1_FIELD_BOOL( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict ) - -#define T1_FIELD_NUM( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict ) - -#define T1_FIELD_FIXED( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict ) - -#define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \ - _dict ) - -#define T1_FIELD_STRING( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict ) - -#define T1_FIELD_KEY( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict ) - -#define T1_FIELD_BBOX( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict ) - - -#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \ - T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ - _fname, _fmax, _dict ) - -#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \ - T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ - _fname, _fmax, _dict ) - -#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \ - T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ - _fname, _fmax, _dict ) - -#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \ - T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ - _fname, _fmax, _dict ) - -#define T1_FIELD_CALLBACK( _ident, _name, _dict ) \ - T1_NEW_CALLBACK_FIELD( _ident, _name, _dict ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 PARSER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs; - - typedef struct PS_Parser_FuncsRec_ - { - void - (*init)( PS_Parser parser, - FT_Byte* base, - FT_Byte* limit, - FT_Memory memory ); - - void - (*done)( PS_Parser parser ); - - void - (*skip_spaces)( PS_Parser parser ); - void - (*skip_PS_token)( PS_Parser parser ); - - FT_Long - (*to_int)( PS_Parser parser ); - FT_Fixed - (*to_fixed)( PS_Parser parser, - FT_Int power_ten ); - - FT_Error - (*to_bytes)( PS_Parser parser, - FT_Byte* bytes, - FT_Offset max_bytes, - FT_ULong* pnum_bytes, - FT_Bool delimiters ); - - FT_Int - (*to_coord_array)( PS_Parser parser, - FT_Int max_coords, - FT_Short* coords ); - FT_Int - (*to_fixed_array)( PS_Parser parser, - FT_Int max_values, - FT_Fixed* values, - FT_Int power_ten ); - - void - (*to_token)( PS_Parser parser, - T1_Token token ); - void - (*to_token_array)( PS_Parser parser, - T1_Token tokens, - FT_UInt max_tokens, - FT_Int* pnum_tokens ); - - FT_Error - (*load_field)( PS_Parser parser, - const T1_Field field, - void** objects, - FT_UInt max_objects, - FT_ULong* pflags ); - - FT_Error - (*load_field_table)( PS_Parser parser, - const T1_Field field, - void** objects, - FT_UInt max_objects, - FT_ULong* pflags ); - - } PS_Parser_FuncsRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_ParserRec */ - /* */ - /* <Description> */ - /* A PS_Parser is an object used to parse a Type 1 font very quickly. */ - /* */ - /* <Fields> */ - /* cursor :: The current position in the text. */ - /* */ - /* base :: Start of the processed text. */ - /* */ - /* limit :: End of the processed text. */ - /* */ - /* error :: The last error returned. */ - /* */ - /* memory :: The object used for memory operations (alloc/realloc). */ - /* */ - /* funcs :: A table of functions for the parser. */ - /* */ - typedef struct PS_ParserRec_ - { - FT_Byte* cursor; - FT_Byte* base; - FT_Byte* limit; - FT_Error error; - FT_Memory memory; - - PS_Parser_FuncsRec funcs; - - } PS_ParserRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 BUILDER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - typedef struct T1_BuilderRec_* T1_Builder; - - - typedef FT_Error - (*T1_Builder_Check_Points_Func)( T1_Builder builder, - FT_Int count ); - - typedef void - (*T1_Builder_Add_Point_Func)( T1_Builder builder, - FT_Pos x, - FT_Pos y, - FT_Byte flag ); - - typedef FT_Error - (*T1_Builder_Add_Point1_Func)( T1_Builder builder, - FT_Pos x, - FT_Pos y ); - - typedef FT_Error - (*T1_Builder_Add_Contour_Func)( T1_Builder builder ); - - typedef FT_Error - (*T1_Builder_Start_Point_Func)( T1_Builder builder, - FT_Pos x, - FT_Pos y ); - - typedef void - (*T1_Builder_Close_Contour_Func)( T1_Builder builder ); - - - typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs; - - typedef struct T1_Builder_FuncsRec_ - { - void - (*init)( T1_Builder builder, - FT_Face face, - FT_Size size, - FT_GlyphSlot slot, - FT_Bool hinting ); - - void - (*done)( T1_Builder builder ); - - T1_Builder_Check_Points_Func check_points; - T1_Builder_Add_Point_Func add_point; - T1_Builder_Add_Point1_Func add_point1; - T1_Builder_Add_Contour_Func add_contour; - T1_Builder_Start_Point_Func start_point; - T1_Builder_Close_Contour_Func close_contour; - - } T1_Builder_FuncsRec; - - - /* an enumeration type to handle charstring parsing states */ - typedef enum T1_ParseState_ - { - T1_Parse_Start, - T1_Parse_Have_Width, - T1_Parse_Have_Moveto, - T1_Parse_Have_Path - - } T1_ParseState; - - - /*************************************************************************/ - /* */ - /* <Structure> */ - /* T1_BuilderRec */ - /* */ - /* <Description> */ - /* A structure used during glyph loading to store its outline. */ - /* */ - /* <Fields> */ - /* memory :: The current memory object. */ - /* */ - /* face :: The current face object. */ - /* */ - /* glyph :: The current glyph slot. */ - /* */ - /* loader :: XXX */ - /* */ - /* base :: The base glyph outline. */ - /* */ - /* current :: The current glyph outline. */ - /* */ - /* max_points :: maximum points in builder outline */ - /* */ - /* max_contours :: Maximum number of contours in builder outline. */ - /* */ - /* pos_x :: The horizontal translation (if composite glyph). */ - /* */ - /* pos_y :: The vertical translation (if composite glyph). */ - /* */ - /* left_bearing :: The left side bearing point. */ - /* */ - /* advance :: The horizontal advance vector. */ - /* */ - /* bbox :: Unused. */ - /* */ - /* parse_state :: An enumeration which controls the charstring */ - /* parsing state. */ - /* */ - /* load_points :: If this flag is not set, no points are loaded. */ - /* */ - /* no_recurse :: Set but not used. */ - /* */ - /* metrics_only :: A boolean indicating that we only want to compute */ - /* the metrics of a given glyph, not load all of its */ - /* points. */ - /* */ - /* funcs :: An array of function pointers for the builder. */ - /* */ - typedef struct T1_BuilderRec_ - { - FT_Memory memory; - FT_Face face; - FT_GlyphSlot glyph; - FT_GlyphLoader loader; - FT_Outline* base; - FT_Outline* current; - - FT_Pos pos_x; - FT_Pos pos_y; - - FT_Vector left_bearing; - FT_Vector advance; - - FT_BBox bbox; /* bounding box */ - T1_ParseState parse_state; - FT_Bool load_points; - FT_Bool no_recurse; - - FT_Bool metrics_only; - - void* hints_funcs; /* hinter-specific */ - void* hints_globals; /* hinter-specific */ - - T1_Builder_FuncsRec funcs; - - } T1_BuilderRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 DECODER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#if 0 - - /*************************************************************************/ - /* */ - /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ - /* calls during glyph loading. */ - /* */ -#define T1_MAX_SUBRS_CALLS 8 - - - /*************************************************************************/ - /* */ - /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ - /* minimum of 16 is required. */ - /* */ -#define T1_MAX_CHARSTRINGS_OPERANDS 32 - -#endif /* 0 */ - - - typedef struct T1_Decoder_ZoneRec_ - { - FT_Byte* cursor; - FT_Byte* base; - FT_Byte* limit; - - } T1_Decoder_ZoneRec, *T1_Decoder_Zone; - - - typedef struct T1_DecoderRec_* T1_Decoder; - typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs; - - - typedef FT_Error - (*T1_Decoder_Callback)( T1_Decoder decoder, - FT_UInt glyph_index ); - - - typedef struct T1_Decoder_FuncsRec_ - { - FT_Error - (*init)( T1_Decoder decoder, - FT_Face face, - FT_Size size, - FT_GlyphSlot slot, - FT_Byte** glyph_names, - PS_Blend blend, - FT_Bool hinting, - FT_Render_Mode hint_mode, - T1_Decoder_Callback callback ); - - void - (*done)( T1_Decoder decoder ); - - FT_Error - (*parse_charstrings)( T1_Decoder decoder, - FT_Byte* base, - FT_UInt len ); - - } T1_Decoder_FuncsRec; - - - typedef struct T1_DecoderRec_ - { - T1_BuilderRec builder; - - FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS]; - FT_Long* top; - - T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; - T1_Decoder_Zone zone; - - FT_Service_PsCMaps psnames; /* for seac */ - FT_UInt num_glyphs; - FT_Byte** glyph_names; - - FT_Int lenIV; /* internal for sub routine calls */ - FT_Int num_subrs; - FT_Byte** subrs; - FT_UInt* subrs_len; /* array of subrs length (optional) */ - - FT_Matrix font_matrix; - FT_Vector font_offset; - - FT_Int flex_state; - FT_Int num_flex_vectors; - FT_Vector flex_vectors[7]; - - PS_Blend blend; /* for multiple master support */ - - FT_Render_Mode hint_mode; - - T1_Decoder_Callback parse_callback; - T1_Decoder_FuncsRec funcs; - - FT_Long* buildchar; - FT_UInt len_buildchar; - - FT_Bool seac; - - } T1_DecoderRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** AFM PARSER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct AFM_ParserRec_* AFM_Parser; - - typedef struct AFM_Parser_FuncsRec_ - { - FT_Error - (*init)( AFM_Parser parser, - FT_Memory memory, - FT_Byte* base, - FT_Byte* limit ); - - void - (*done)( AFM_Parser parser ); - - FT_Error - (*parse)( AFM_Parser parser ); - - } AFM_Parser_FuncsRec; - - - typedef struct AFM_StreamRec_* AFM_Stream; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* AFM_ParserRec */ - /* */ - /* <Description> */ - /* An AFM_Parser is a parser for the AFM files. */ - /* */ - /* <Fields> */ - /* memory :: The object used for memory operations (alloc and */ - /* realloc). */ - /* */ - /* stream :: This is an opaque object. */ - /* */ - /* FontInfo :: The result will be stored here. */ - /* */ - /* get_index :: A user provided function to get a glyph index by its */ - /* name. */ - /* */ - typedef struct AFM_ParserRec_ - { - FT_Memory memory; - AFM_Stream stream; - - AFM_FontInfo FontInfo; - - FT_Int - (*get_index)( const char* name, - FT_Offset len, - void* user_data ); - - void* user_data; - - } AFM_ParserRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 CHARMAPS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes; - - typedef struct T1_CMap_ClassesRec_ - { - FT_CMap_Class standard; - FT_CMap_Class expert; - FT_CMap_Class custom; - FT_CMap_Class unicode; - - } T1_CMap_ClassesRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PSAux Module Interface *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct PSAux_ServiceRec_ - { - /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */ - const PS_Table_FuncsRec* ps_table_funcs; - const PS_Parser_FuncsRec* ps_parser_funcs; - const T1_Builder_FuncsRec* t1_builder_funcs; - const T1_Decoder_FuncsRec* t1_decoder_funcs; - - void - (*t1_decrypt)( FT_Byte* buffer, - FT_Offset length, - FT_UShort seed ); - - T1_CMap_Classes t1_cmap_classes; - - /* fields after this comment line were added after version 2.1.10 */ - const AFM_Parser_FuncsRec* afm_parser_funcs; - - } PSAux_ServiceRec, *PSAux_Service; - - /* backwards-compatible type definition */ - typedef PSAux_ServiceRec PSAux_Interface; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Some convenience functions *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define IS_PS_NEWLINE( ch ) \ - ( (ch) == '\r' || \ - (ch) == '\n' ) - -#define IS_PS_SPACE( ch ) \ - ( (ch) == ' ' || \ - IS_PS_NEWLINE( ch ) || \ - (ch) == '\t' || \ - (ch) == '\f' || \ - (ch) == '\0' ) - -#define IS_PS_SPECIAL( ch ) \ - ( (ch) == '/' || \ - (ch) == '(' || (ch) == ')' || \ - (ch) == '<' || (ch) == '>' || \ - (ch) == '[' || (ch) == ']' || \ - (ch) == '{' || (ch) == '}' || \ - (ch) == '%' ) - -#define IS_PS_DELIM( ch ) \ - ( IS_PS_SPACE( ch ) || \ - IS_PS_SPECIAL( ch ) ) - -#define IS_PS_DIGIT( ch ) \ - ( (ch) >= '0' && (ch) <= '9' ) - -#define IS_PS_XDIGIT( ch ) \ - ( IS_PS_DIGIT( ch ) || \ - ( (ch) >= 'A' && (ch) <= 'F' ) || \ - ( (ch) >= 'a' && (ch) <= 'f' ) ) - -#define IS_PS_BASE85( ch ) \ - ( (ch) >= '!' && (ch) <= 'u' ) - -#define IS_PS_TOKEN( cur, limit, token ) \ - ( (char)(cur)[0] == (token)[0] && \ - ( (cur) + sizeof ( (token) ) == (limit) || \ - ( (cur) + sizeof( (token) ) < (limit) && \ - IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) ) && \ - ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 ) - - -FT_END_HEADER - -#endif /* __PSAUX_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/pshints.h b/3party/freetype/include/freetype/internal/pshints.h deleted file mode 100644 index 12aaabacd4..0000000000 --- a/3party/freetype/include/freetype/internal/pshints.h +++ /dev/null @@ -1,722 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshints.h */ -/* */ -/* Interface to Postscript-specific (Type 1 and Type 2) hints */ -/* recorders (specification only). These are used to support native */ -/* T1/T2 hints in the `type1', `cid', and `cff' font drivers. */ -/* */ -/* Copyright 2001-2015 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 __PSHINTS_H__ -#define __PSHINTS_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_TYPE1_TABLES_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** INTERNAL REPRESENTATION OF GLOBALS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct PSH_GlobalsRec_* PSH_Globals; - - typedef FT_Error - (*PSH_Globals_NewFunc)( FT_Memory memory, - T1_Private* private_dict, - PSH_Globals* aglobals ); - - typedef void - (*PSH_Globals_SetScaleFunc)( PSH_Globals globals, - FT_Fixed x_scale, - FT_Fixed y_scale, - FT_Fixed x_delta, - FT_Fixed y_delta ); - - typedef void - (*PSH_Globals_DestroyFunc)( PSH_Globals globals ); - - - typedef struct PSH_Globals_FuncsRec_ - { - PSH_Globals_NewFunc create; - PSH_Globals_SetScaleFunc set_scale; - PSH_Globals_DestroyFunc destroy; - - } PSH_Globals_FuncsRec, *PSH_Globals_Funcs; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PUBLIC TYPE 1 HINTS RECORDER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /************************************************************************* - * - * @type: - * T1_Hints - * - * @description: - * This is a handle to an opaque structure used to record glyph hints - * from a Type 1 character glyph character string. - * - * The methods used to operate on this object are defined by the - * @T1_Hints_FuncsRec structure. Recording glyph hints is normally - * achieved through the following scheme: - * - * - Open a new hint recording session by calling the `open' method. - * This rewinds the recorder and prepare it for new input. - * - * - For each hint found in the glyph charstring, call the corresponding - * method (`stem', `stem3', or `reset'). Note that these functions do - * not return an error code. - * - * - Close the recording session by calling the `close' method. It - * returns an error code if the hints were invalid or something - * strange happened (e.g., memory shortage). - * - * The hints accumulated in the object can later be used by the - * PostScript hinter. - * - */ - typedef struct T1_HintsRec_* T1_Hints; - - - /************************************************************************* - * - * @type: - * T1_Hints_Funcs - * - * @description: - * A pointer to the @T1_Hints_FuncsRec structure that defines the API of - * a given @T1_Hints object. - * - */ - typedef const struct T1_Hints_FuncsRec_* T1_Hints_Funcs; - - - /************************************************************************* - * - * @functype: - * T1_Hints_OpenFunc - * - * @description: - * A method of the @T1_Hints class used to prepare it for a new Type 1 - * hints recording session. - * - * @input: - * hints :: - * A handle to the Type 1 hints recorder. - * - * @note: - * You should always call the @T1_Hints_CloseFunc method in order to - * close an opened recording session. - * - */ - typedef void - (*T1_Hints_OpenFunc)( T1_Hints hints ); - - - /************************************************************************* - * - * @functype: - * T1_Hints_SetStemFunc - * - * @description: - * A method of the @T1_Hints class used to record a new horizontal or - * vertical stem. This corresponds to the Type 1 `hstem' and `vstem' - * operators. - * - * @input: - * hints :: - * A handle to the Type 1 hints recorder. - * - * dimension :: - * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). - * - * coords :: - * Array of 2 coordinates in 16.16 format, used as (position,length) - * stem descriptor. - * - * @note: - * Use vertical coordinates (y) for horizontal stems (dim=0). Use - * horizontal coordinates (x) for vertical stems (dim=1). - * - * `coords[0]' is the absolute stem position (lowest coordinate); - * `coords[1]' is the length. - * - * The length can be negative, in which case it must be either -20 or - * -21. It is interpreted as a `ghost' stem, according to the Type 1 - * specification. - * - * If the length is -21 (corresponding to a bottom ghost stem), then - * the real stem position is `coords[0]+coords[1]'. - * - */ - typedef void - (*T1_Hints_SetStemFunc)( T1_Hints hints, - FT_UInt dimension, - FT_Fixed* coords ); - - - /************************************************************************* - * - * @functype: - * T1_Hints_SetStem3Func - * - * @description: - * A method of the @T1_Hints class used to record three - * counter-controlled horizontal or vertical stems at once. - * - * @input: - * hints :: - * A handle to the Type 1 hints recorder. - * - * dimension :: - * 0 for horizontal stems, 1 for vertical ones. - * - * coords :: - * An array of 6 values in 16.16 format, holding 3 (position,length) - * pairs for the counter-controlled stems. - * - * @note: - * Use vertical coordinates (y) for horizontal stems (dim=0). Use - * horizontal coordinates (x) for vertical stems (dim=1). - * - * The lengths cannot be negative (ghost stems are never - * counter-controlled). - * - */ - typedef void - (*T1_Hints_SetStem3Func)( T1_Hints hints, - FT_UInt dimension, - FT_Fixed* coords ); - - - /************************************************************************* - * - * @functype: - * T1_Hints_ResetFunc - * - * @description: - * A method of the @T1_Hints class used to reset the stems hints in a - * recording session. - * - * @input: - * hints :: - * A handle to the Type 1 hints recorder. - * - * end_point :: - * The index of the last point in the input glyph in which the - * previously defined hints apply. - * - */ - typedef void - (*T1_Hints_ResetFunc)( T1_Hints hints, - FT_UInt end_point ); - - - /************************************************************************* - * - * @functype: - * T1_Hints_CloseFunc - * - * @description: - * A method of the @T1_Hints class used to close a hint recording - * session. - * - * @input: - * hints :: - * A handle to the Type 1 hints recorder. - * - * end_point :: - * The index of the last point in the input glyph. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * The error code is set to indicate that an error occurred during the - * recording session. - * - */ - typedef FT_Error - (*T1_Hints_CloseFunc)( T1_Hints hints, - FT_UInt end_point ); - - - /************************************************************************* - * - * @functype: - * T1_Hints_ApplyFunc - * - * @description: - * A method of the @T1_Hints class used to apply hints to the - * corresponding glyph outline. Must be called once all hints have been - * recorded. - * - * @input: - * hints :: - * A handle to the Type 1 hints recorder. - * - * outline :: - * A pointer to the target outline descriptor. - * - * globals :: - * The hinter globals for this font. - * - * hint_mode :: - * Hinting information. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * On input, all points within the outline are in font coordinates. On - * output, they are in 1/64th of pixels. - * - * The scaling transformation is taken from the `globals' object which - * must correspond to the same font as the glyph. - * - */ - typedef FT_Error - (*T1_Hints_ApplyFunc)( T1_Hints hints, - FT_Outline* outline, - PSH_Globals globals, - FT_Render_Mode hint_mode ); - - - /************************************************************************* - * - * @struct: - * T1_Hints_FuncsRec - * - * @description: - * The structure used to provide the API to @T1_Hints objects. - * - * @fields: - * hints :: - * A handle to the T1 Hints recorder. - * - * open :: - * The function to open a recording session. - * - * close :: - * The function to close a recording session. - * - * stem :: - * The function to set a simple stem. - * - * stem3 :: - * The function to set counter-controlled stems. - * - * reset :: - * The function to reset stem hints. - * - * apply :: - * The function to apply the hints to the corresponding glyph outline. - * - */ - typedef struct T1_Hints_FuncsRec_ - { - T1_Hints hints; - T1_Hints_OpenFunc open; - T1_Hints_CloseFunc close; - T1_Hints_SetStemFunc stem; - T1_Hints_SetStem3Func stem3; - T1_Hints_ResetFunc reset; - T1_Hints_ApplyFunc apply; - - } T1_Hints_FuncsRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PUBLIC TYPE 2 HINTS RECORDER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /************************************************************************* - * - * @type: - * T2_Hints - * - * @description: - * This is a handle to an opaque structure used to record glyph hints - * from a Type 2 character glyph character string. - * - * The methods used to operate on this object are defined by the - * @T2_Hints_FuncsRec structure. Recording glyph hints is normally - * achieved through the following scheme: - * - * - Open a new hint recording session by calling the `open' method. - * This rewinds the recorder and prepare it for new input. - * - * - For each hint found in the glyph charstring, call the corresponding - * method (`stems', `hintmask', `counters'). Note that these - * functions do not return an error code. - * - * - Close the recording session by calling the `close' method. It - * returns an error code if the hints were invalid or something - * strange happened (e.g., memory shortage). - * - * The hints accumulated in the object can later be used by the - * Postscript hinter. - * - */ - typedef struct T2_HintsRec_* T2_Hints; - - - /************************************************************************* - * - * @type: - * T2_Hints_Funcs - * - * @description: - * A pointer to the @T2_Hints_FuncsRec structure that defines the API of - * a given @T2_Hints object. - * - */ - typedef const struct T2_Hints_FuncsRec_* T2_Hints_Funcs; - - - /************************************************************************* - * - * @functype: - * T2_Hints_OpenFunc - * - * @description: - * A method of the @T2_Hints class used to prepare it for a new Type 2 - * hints recording session. - * - * @input: - * hints :: - * A handle to the Type 2 hints recorder. - * - * @note: - * You should always call the @T2_Hints_CloseFunc method in order to - * close an opened recording session. - * - */ - typedef void - (*T2_Hints_OpenFunc)( T2_Hints hints ); - - - /************************************************************************* - * - * @functype: - * T2_Hints_StemsFunc - * - * @description: - * A method of the @T2_Hints class used to set the table of stems in - * either the vertical or horizontal dimension. Equivalent to the - * `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators. - * - * @input: - * hints :: - * A handle to the Type 2 hints recorder. - * - * dimension :: - * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). - * - * count :: - * The number of stems. - * - * coords :: - * An array of `count' (position,length) pairs in 16.16 format. - * - * @note: - * Use vertical coordinates (y) for horizontal stems (dim=0). Use - * horizontal coordinates (x) for vertical stems (dim=1). - * - * There are `2*count' elements in the `coords' array. Each even - * element is an absolute position in font units, each odd element is a - * length in font units. - * - * A length can be negative, in which case it must be either -20 or - * -21. It is interpreted as a `ghost' stem, according to the Type 1 - * specification. - * - */ - typedef void - (*T2_Hints_StemsFunc)( T2_Hints hints, - FT_UInt dimension, - FT_Int count, - FT_Fixed* coordinates ); - - - /************************************************************************* - * - * @functype: - * T2_Hints_MaskFunc - * - * @description: - * A method of the @T2_Hints class used to set a given hintmask (this - * corresponds to the `hintmask' Type 2 operator). - * - * @input: - * hints :: - * A handle to the Type 2 hints recorder. - * - * end_point :: - * The glyph index of the last point to which the previously defined - * or activated hints apply. - * - * bit_count :: - * The number of bits in the hint mask. - * - * bytes :: - * An array of bytes modelling the hint mask. - * - * @note: - * If the hintmask starts the charstring (before any glyph point - * definition), the value of `end_point' should be 0. - * - * `bit_count' is the number of meaningful bits in the `bytes' array; it - * must be equal to the total number of hints defined so far (i.e., - * horizontal+verticals). - * - * The `bytes' array can come directly from the Type 2 charstring and - * respects the same format. - * - */ - typedef void - (*T2_Hints_MaskFunc)( T2_Hints hints, - FT_UInt end_point, - FT_UInt bit_count, - const FT_Byte* bytes ); - - - /************************************************************************* - * - * @functype: - * T2_Hints_CounterFunc - * - * @description: - * A method of the @T2_Hints class used to set a given counter mask - * (this corresponds to the `hintmask' Type 2 operator). - * - * @input: - * hints :: - * A handle to the Type 2 hints recorder. - * - * end_point :: - * A glyph index of the last point to which the previously defined or - * active hints apply. - * - * bit_count :: - * The number of bits in the hint mask. - * - * bytes :: - * An array of bytes modelling the hint mask. - * - * @note: - * If the hintmask starts the charstring (before any glyph point - * definition), the value of `end_point' should be 0. - * - * `bit_count' is the number of meaningful bits in the `bytes' array; it - * must be equal to the total number of hints defined so far (i.e., - * horizontal+verticals). - * - * The `bytes' array can come directly from the Type 2 charstring and - * respects the same format. - * - */ - typedef void - (*T2_Hints_CounterFunc)( T2_Hints hints, - FT_UInt bit_count, - const FT_Byte* bytes ); - - - /************************************************************************* - * - * @functype: - * T2_Hints_CloseFunc - * - * @description: - * A method of the @T2_Hints class used to close a hint recording - * session. - * - * @input: - * hints :: - * A handle to the Type 2 hints recorder. - * - * end_point :: - * The index of the last point in the input glyph. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * The error code is set to indicate that an error occurred during the - * recording session. - * - */ - typedef FT_Error - (*T2_Hints_CloseFunc)( T2_Hints hints, - FT_UInt end_point ); - - - /************************************************************************* - * - * @functype: - * T2_Hints_ApplyFunc - * - * @description: - * A method of the @T2_Hints class used to apply hints to the - * corresponding glyph outline. Must be called after the `close' - * method. - * - * @input: - * hints :: - * A handle to the Type 2 hints recorder. - * - * outline :: - * A pointer to the target outline descriptor. - * - * globals :: - * The hinter globals for this font. - * - * hint_mode :: - * Hinting information. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * On input, all points within the outline are in font coordinates. On - * output, they are in 1/64th of pixels. - * - * The scaling transformation is taken from the `globals' object which - * must correspond to the same font than the glyph. - * - */ - typedef FT_Error - (*T2_Hints_ApplyFunc)( T2_Hints hints, - FT_Outline* outline, - PSH_Globals globals, - FT_Render_Mode hint_mode ); - - - /************************************************************************* - * - * @struct: - * T2_Hints_FuncsRec - * - * @description: - * The structure used to provide the API to @T2_Hints objects. - * - * @fields: - * hints :: - * A handle to the T2 hints recorder object. - * - * open :: - * The function to open a recording session. - * - * close :: - * The function to close a recording session. - * - * stems :: - * The function to set the dimension's stems table. - * - * hintmask :: - * The function to set hint masks. - * - * counter :: - * The function to set counter masks. - * - * apply :: - * The function to apply the hints on the corresponding glyph outline. - * - */ - typedef struct T2_Hints_FuncsRec_ - { - T2_Hints hints; - T2_Hints_OpenFunc open; - T2_Hints_CloseFunc close; - T2_Hints_StemsFunc stems; - T2_Hints_MaskFunc hintmask; - T2_Hints_CounterFunc counter; - T2_Hints_ApplyFunc apply; - - } T2_Hints_FuncsRec; - - - /* */ - - - typedef struct PSHinter_Interface_ - { - PSH_Globals_Funcs (*get_globals_funcs)( FT_Module module ); - T1_Hints_Funcs (*get_t1_funcs) ( FT_Module module ); - T2_Hints_Funcs (*get_t2_funcs) ( FT_Module module ); - - } PSHinter_Interface; - - typedef PSHinter_Interface* PSHinter_Service; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_PSHINTER_INTERFACE( \ - class_, \ - get_globals_funcs_, \ - get_t1_funcs_, \ - get_t2_funcs_ ) \ - static const PSHinter_Interface class_ = \ - { \ - get_globals_funcs_, \ - get_t1_funcs_, \ - get_t2_funcs_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_PSHINTER_INTERFACE( \ - class_, \ - get_globals_funcs_, \ - get_t1_funcs_, \ - get_t2_funcs_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Library library, \ - PSHinter_Interface* clazz ) \ - { \ - FT_UNUSED( library ); \ - \ - clazz->get_globals_funcs = get_globals_funcs_; \ - clazz->get_t1_funcs = get_t1_funcs_; \ - clazz->get_t2_funcs = get_t2_funcs_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - -FT_END_HEADER - -#endif /* __PSHINTS_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svbdf.h b/3party/freetype/include/freetype/internal/services/svbdf.h deleted file mode 100644 index 865b53687d..0000000000 --- a/3party/freetype/include/freetype/internal/services/svbdf.h +++ /dev/null @@ -1,82 +0,0 @@ -/***************************************************************************/ -/* */ -/* svbdf.h */ -/* */ -/* The FreeType BDF services (specification). */ -/* */ -/* Copyright 2003-2015 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 __SVBDF_H__ -#define __SVBDF_H__ - -#include FT_BDF_H -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_BDF "bdf" - - typedef FT_Error - (*FT_BDF_GetCharsetIdFunc)( FT_Face face, - const char* *acharset_encoding, - const char* *acharset_registry ); - - typedef FT_Error - (*FT_BDF_GetPropertyFunc)( FT_Face face, - const char* prop_name, - BDF_PropertyRec *aproperty ); - - - FT_DEFINE_SERVICE( BDF ) - { - FT_BDF_GetCharsetIdFunc get_charset_id; - FT_BDF_GetPropertyFunc get_property; - }; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_BDFRec( class_, \ - get_charset_id_, \ - get_property_ ) \ - static const FT_Service_BDFRec class_ = \ - { \ - get_charset_id_, get_property_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_BDFRec( class_, \ - get_charset_id_, \ - get_property_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Service_BDFRec* clazz ) \ - { \ - clazz->get_charset_id = get_charset_id_; \ - clazz->get_property = get_property_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVBDF_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svcid.h b/3party/freetype/include/freetype/internal/services/svcid.h deleted file mode 100644 index 4a535a6f42..0000000000 --- a/3party/freetype/include/freetype/internal/services/svcid.h +++ /dev/null @@ -1,90 +0,0 @@ -/***************************************************************************/ -/* */ -/* svcid.h */ -/* */ -/* The FreeType CID font services (specification). */ -/* */ -/* Copyright 2007-2015 by */ -/* Derek Clegg and Michael Toftdal. */ -/* */ -/* 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 __SVCID_H__ -#define __SVCID_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_CID "CID" - - typedef FT_Error - (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face face, - const char* *registry, - const char* *ordering, - FT_Int *supplement ); - typedef FT_Error - (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face face, - FT_Bool *is_cid ); - typedef FT_Error - (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face face, - FT_UInt glyph_index, - FT_UInt *cid ); - - FT_DEFINE_SERVICE( CID ) - { - FT_CID_GetRegistryOrderingSupplementFunc get_ros; - FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid; - FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index; - }; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_CIDREC( class_, \ - get_ros_, \ - get_is_cid_, \ - get_cid_from_glyph_index_ ) \ - static const FT_Service_CIDRec class_ = \ - { \ - get_ros_, get_is_cid_, get_cid_from_glyph_index_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_CIDREC( class_, \ - get_ros_, \ - get_is_cid_, \ - get_cid_from_glyph_index_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Library library, \ - FT_Service_CIDRec* clazz ) \ - { \ - FT_UNUSED( library ); \ - \ - clazz->get_ros = get_ros_; \ - clazz->get_is_cid = get_is_cid_; \ - clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVCID_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svfntfmt.h b/3party/freetype/include/freetype/internal/services/svfntfmt.h deleted file mode 100644 index f8b3617364..0000000000 --- a/3party/freetype/include/freetype/internal/services/svfntfmt.h +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************/ -/* */ -/* svfntfmt.h */ -/* */ -/* The FreeType font format service (specification only). */ -/* */ -/* Copyright 2003-2015 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 __SVFNTFMT_H__ -#define __SVFNTFMT_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - - /* - * A trivial service used to return the name of a face's font driver, - * according to the XFree86 nomenclature. Note that the service data - * is a simple constant string pointer. - */ - -#define FT_SERVICE_ID_FONT_FORMAT "font-format" - -#define FT_FONT_FORMAT_TRUETYPE "TrueType" -#define FT_FONT_FORMAT_TYPE_1 "Type 1" -#define FT_FONT_FORMAT_BDF "BDF" -#define FT_FONT_FORMAT_PCF "PCF" -#define FT_FONT_FORMAT_TYPE_42 "Type 42" -#define FT_FONT_FORMAT_CID "CID Type 1" -#define FT_FONT_FORMAT_CFF "CFF" -#define FT_FONT_FORMAT_PFR "PFR" -#define FT_FONT_FORMAT_WINFNT "Windows FNT" - - /* */ - - -FT_END_HEADER - - -#endif /* __SVFNTFMT_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svgldict.h b/3party/freetype/include/freetype/internal/services/svgldict.h deleted file mode 100644 index f78bca5d77..0000000000 --- a/3party/freetype/include/freetype/internal/services/svgldict.h +++ /dev/null @@ -1,88 +0,0 @@ -/***************************************************************************/ -/* */ -/* svgldict.h */ -/* */ -/* The FreeType glyph dictionary services (specification). */ -/* */ -/* Copyright 2003-2015 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 __SVGLDICT_H__ -#define __SVGLDICT_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - - /* - * A service used to retrieve glyph names, as well as to find the - * index of a given glyph name in a font. - * - */ - -#define FT_SERVICE_ID_GLYPH_DICT "glyph-dict" - - - typedef FT_Error - (*FT_GlyphDict_GetNameFunc)( FT_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ); - - typedef FT_UInt - (*FT_GlyphDict_NameIndexFunc)( FT_Face face, - FT_String* glyph_name ); - - - FT_DEFINE_SERVICE( GlyphDict ) - { - FT_GlyphDict_GetNameFunc get_name; - FT_GlyphDict_NameIndexFunc name_index; /* optional */ - }; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_, \ - get_name_, \ - name_index_) \ - static const FT_Service_GlyphDictRec class_ = \ - { \ - get_name_, name_index_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_, \ - get_name_, \ - name_index_) \ - void \ - FT_Init_Class_ ## class_( FT_Library library, \ - FT_Service_GlyphDictRec* clazz ) \ - { \ - FT_UNUSED( library ); \ - \ - clazz->get_name = get_name_; \ - clazz->name_index = name_index_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVGLDICT_H__ */ diff --git a/3party/freetype/include/freetype/internal/services/svgxval.h b/3party/freetype/include/freetype/internal/services/svgxval.h deleted file mode 100644 index 59cc3b7048..0000000000 --- a/3party/freetype/include/freetype/internal/services/svgxval.h +++ /dev/null @@ -1,72 +0,0 @@ -/***************************************************************************/ -/* */ -/* svgxval.h */ -/* */ -/* FreeType API for validating TrueTypeGX/AAT tables (specification). */ -/* */ -/* Copyright 2004-2015 by */ -/* Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVGXVAL_H__ -#define __SVGXVAL_H__ - -#include FT_GX_VALIDATE_H -#include FT_INTERNAL_VALIDATE_H - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_GX_VALIDATE "truetypegx-validate" -#define FT_SERVICE_ID_CLASSICKERN_VALIDATE "classickern-validate" - - typedef FT_Error - (*gxv_validate_func)( FT_Face face, - FT_UInt gx_flags, - FT_Bytes tables[FT_VALIDATE_GX_LENGTH], - FT_UInt table_length ); - - - typedef FT_Error - (*ckern_validate_func)( FT_Face face, - FT_UInt ckern_flags, - FT_Bytes *ckern_table ); - - - FT_DEFINE_SERVICE( GXvalidate ) - { - gxv_validate_func validate; - }; - - FT_DEFINE_SERVICE( CKERNvalidate ) - { - ckern_validate_func validate; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVGXVAL_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svkern.h b/3party/freetype/include/freetype/internal/services/svkern.h deleted file mode 100644 index bc26f15941..0000000000 --- a/3party/freetype/include/freetype/internal/services/svkern.h +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************/ -/* */ -/* svkern.h */ -/* */ -/* The FreeType Kerning service (specification). */ -/* */ -/* Copyright 2006-2015 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 __SVKERN_H__ -#define __SVKERN_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H - - -FT_BEGIN_HEADER - -#define FT_SERVICE_ID_KERNING "kerning" - - - typedef FT_Error - (*FT_Kerning_TrackGetFunc)( FT_Face face, - FT_Fixed point_size, - FT_Int degree, - FT_Fixed* akerning ); - - FT_DEFINE_SERVICE( Kerning ) - { - FT_Kerning_TrackGetFunc get_track; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVKERN_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svmm.h b/3party/freetype/include/freetype/internal/services/svmm.h deleted file mode 100644 index f2cecfbb3b..0000000000 --- a/3party/freetype/include/freetype/internal/services/svmm.h +++ /dev/null @@ -1,113 +0,0 @@ -/***************************************************************************/ -/* */ -/* svmm.h */ -/* */ -/* The FreeType Multiple Masters and GX var services (specification). */ -/* */ -/* Copyright 2003-2015 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 __SVMM_H__ -#define __SVMM_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - - /* - * A service used to manage multiple-masters data in a given face. - * - * See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H). - * - */ - -#define FT_SERVICE_ID_MULTI_MASTERS "multi-masters" - - - typedef FT_Error - (*FT_Get_MM_Func)( FT_Face face, - FT_Multi_Master* master ); - - typedef FT_Error - (*FT_Get_MM_Var_Func)( FT_Face face, - FT_MM_Var* *master ); - - typedef FT_Error - (*FT_Set_MM_Design_Func)( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ); - - typedef FT_Error - (*FT_Set_Var_Design_Func)( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - typedef FT_Error - (*FT_Set_MM_Blend_Func)( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ); - - - FT_DEFINE_SERVICE( MultiMasters ) - { - FT_Get_MM_Func get_mm; - FT_Set_MM_Design_Func set_mm_design; - FT_Set_MM_Blend_Func set_mm_blend; - FT_Get_MM_Var_Func get_mm_var; - FT_Set_Var_Design_Func set_var_design; - }; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \ - get_mm_, \ - set_mm_design_, \ - set_mm_blend_, \ - get_mm_var_, \ - set_var_design_ ) \ - static const FT_Service_MultiMastersRec class_ = \ - { \ - get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \ - get_mm_, \ - set_mm_design_, \ - set_mm_blend_, \ - get_mm_var_, \ - set_var_design_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Service_MultiMastersRec* clazz ) \ - { \ - clazz->get_mm = get_mm_; \ - clazz->set_mm_design = set_mm_design_; \ - clazz->set_mm_blend = set_mm_blend_; \ - clazz->get_mm_var = get_mm_var_; \ - clazz->set_var_design = set_var_design_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - -#endif /* __SVMM_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svotval.h b/3party/freetype/include/freetype/internal/services/svotval.h deleted file mode 100644 index a82a6420fd..0000000000 --- a/3party/freetype/include/freetype/internal/services/svotval.h +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************/ -/* */ -/* svotval.h */ -/* */ -/* The FreeType OpenType validation service (specification). */ -/* */ -/* Copyright 2004-2015 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 __SVOTVAL_H__ -#define __SVOTVAL_H__ - -#include FT_OPENTYPE_VALIDATE_H -#include FT_INTERNAL_VALIDATE_H - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_OPENTYPE_VALIDATE "opentype-validate" - - - typedef FT_Error - (*otv_validate_func)( FT_Face volatile face, - FT_UInt ot_flags, - FT_Bytes *base, - FT_Bytes *gdef, - FT_Bytes *gpos, - FT_Bytes *gsub, - FT_Bytes *jstf ); - - - FT_DEFINE_SERVICE( OTvalidate ) - { - otv_validate_func validate; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVOTVAL_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svpfr.h b/3party/freetype/include/freetype/internal/services/svpfr.h deleted file mode 100644 index d4eb1693d0..0000000000 --- a/3party/freetype/include/freetype/internal/services/svpfr.h +++ /dev/null @@ -1,66 +0,0 @@ -/***************************************************************************/ -/* */ -/* svpfr.h */ -/* */ -/* Internal PFR service functions (specification). */ -/* */ -/* Copyright 2003-2015 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 __SVPFR_H__ -#define __SVPFR_H__ - -#include FT_PFR_H -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_PFR_METRICS "pfr-metrics" - - - typedef FT_Error - (*FT_PFR_GetMetricsFunc)( FT_Face face, - FT_UInt *aoutline, - FT_UInt *ametrics, - FT_Fixed *ax_scale, - FT_Fixed *ay_scale ); - - typedef FT_Error - (*FT_PFR_GetKerningFunc)( FT_Face face, - FT_UInt left, - FT_UInt right, - FT_Vector *avector ); - - typedef FT_Error - (*FT_PFR_GetAdvanceFunc)( FT_Face face, - FT_UInt gindex, - FT_Pos *aadvance ); - - - FT_DEFINE_SERVICE( PfrMetrics ) - { - FT_PFR_GetMetricsFunc get_metrics; - FT_PFR_GetKerningFunc get_kerning; - FT_PFR_GetAdvanceFunc get_advance; - - }; - - /* */ - -FT_END_HEADER - -#endif /* __SVPFR_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svpostnm.h b/3party/freetype/include/freetype/internal/services/svpostnm.h deleted file mode 100644 index a89f79e479..0000000000 --- a/3party/freetype/include/freetype/internal/services/svpostnm.h +++ /dev/null @@ -1,81 +0,0 @@ -/***************************************************************************/ -/* */ -/* svpostnm.h */ -/* */ -/* The FreeType PostScript name services (specification). */ -/* */ -/* Copyright 2003-2015 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 __SVPOSTNM_H__ -#define __SVPOSTNM_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - /* - * A trivial service used to retrieve the PostScript name of a given - * font when available. The `get_name' field should never be NULL. - * - * The corresponding function can return NULL to indicate that the - * PostScript name is not available. - * - * The name is owned by the face and will be destroyed with it. - */ - -#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME "postscript-font-name" - - - typedef const char* - (*FT_PsName_GetFunc)( FT_Face face ); - - - FT_DEFINE_SERVICE( PsFontName ) - { - FT_PsName_GetFunc get_ps_font_name; - }; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \ - static const FT_Service_PsFontNameRec class_ = \ - { \ - get_ps_font_name_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Library library, \ - FT_Service_PsFontNameRec* clazz ) \ - { \ - FT_UNUSED( library ); \ - \ - clazz->get_ps_font_name = get_ps_font_name_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVPOSTNM_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svprop.h b/3party/freetype/include/freetype/internal/services/svprop.h deleted file mode 100644 index c9f07ce33a..0000000000 --- a/3party/freetype/include/freetype/internal/services/svprop.h +++ /dev/null @@ -1,81 +0,0 @@ -/***************************************************************************/ -/* */ -/* svprop.h */ -/* */ -/* The FreeType property service (specification). */ -/* */ -/* Copyright 2012-2015 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 __SVPROP_H__ -#define __SVPROP_H__ - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_PROPERTIES "properties" - - - typedef FT_Error - (*FT_Properties_SetFunc)( FT_Module module, - const char* property_name, - const void* value ); - - typedef FT_Error - (*FT_Properties_GetFunc)( FT_Module module, - const char* property_name, - void* value ); - - - FT_DEFINE_SERVICE( Properties ) - { - FT_Properties_SetFunc set_property; - FT_Properties_GetFunc get_property; - }; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_PROPERTIESREC( class_, \ - set_property_, \ - get_property_ ) \ - static const FT_Service_PropertiesRec class_ = \ - { \ - set_property_, \ - get_property_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_PROPERTIESREC( class_, \ - set_property_, \ - get_property_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Service_PropertiesRec* clazz ) \ - { \ - clazz->set_property = set_property_; \ - clazz->get_property = get_property_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVPROP_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svpscmap.h b/3party/freetype/include/freetype/internal/services/svpscmap.h deleted file mode 100644 index 66da6e1043..0000000000 --- a/3party/freetype/include/freetype/internal/services/svpscmap.h +++ /dev/null @@ -1,177 +0,0 @@ -/***************************************************************************/ -/* */ -/* svpscmap.h */ -/* */ -/* The FreeType PostScript charmap service (specification). */ -/* */ -/* Copyright 2003-2015 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 __SVPSCMAP_H__ -#define __SVPSCMAP_H__ - -#include FT_INTERNAL_OBJECTS_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_POSTSCRIPT_CMAPS "postscript-cmaps" - - - /* - * Adobe glyph name to unicode value. - */ - typedef FT_UInt32 - (*PS_Unicode_ValueFunc)( const char* glyph_name ); - - /* - * Macintosh name id to glyph name. NULL if invalid index. - */ - typedef const char* - (*PS_Macintosh_NameFunc)( FT_UInt name_index ); - - /* - * Adobe standard string ID to glyph name. NULL if invalid index. - */ - typedef const char* - (*PS_Adobe_Std_StringsFunc)( FT_UInt string_index ); - - - /* - * Simple unicode -> glyph index charmap built from font glyph names - * table. - */ - typedef struct PS_UniMap_ - { - FT_UInt32 unicode; /* bit 31 set: is glyph variant */ - FT_UInt glyph_index; - - } PS_UniMap; - - - typedef struct PS_UnicodesRec_* PS_Unicodes; - - typedef struct PS_UnicodesRec_ - { - FT_CMapRec cmap; - FT_UInt num_maps; - PS_UniMap* maps; - - } PS_UnicodesRec; - - - /* - * A function which returns a glyph name for a given index. Returns - * NULL if invalid index. - */ - typedef const char* - (*PS_GetGlyphNameFunc)( FT_Pointer data, - FT_UInt string_index ); - - /* - * A function used to release the glyph name returned by - * PS_GetGlyphNameFunc, when needed - */ - typedef void - (*PS_FreeGlyphNameFunc)( FT_Pointer data, - const char* name ); - - typedef FT_Error - (*PS_Unicodes_InitFunc)( FT_Memory memory, - PS_Unicodes unicodes, - FT_UInt num_glyphs, - PS_GetGlyphNameFunc get_glyph_name, - PS_FreeGlyphNameFunc free_glyph_name, - FT_Pointer glyph_data ); - - typedef FT_UInt - (*PS_Unicodes_CharIndexFunc)( PS_Unicodes unicodes, - FT_UInt32 unicode ); - - typedef FT_UInt32 - (*PS_Unicodes_CharNextFunc)( PS_Unicodes unicodes, - FT_UInt32 *unicode ); - - - FT_DEFINE_SERVICE( PsCMaps ) - { - PS_Unicode_ValueFunc unicode_value; - - PS_Unicodes_InitFunc unicodes_init; - PS_Unicodes_CharIndexFunc unicodes_char_index; - PS_Unicodes_CharNextFunc unicodes_char_next; - - PS_Macintosh_NameFunc macintosh_name; - PS_Adobe_Std_StringsFunc adobe_std_strings; - const unsigned short* adobe_std_encoding; - const unsigned short* adobe_expert_encoding; - }; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_PSCMAPSREC( class_, \ - unicode_value_, \ - unicodes_init_, \ - unicodes_char_index_, \ - unicodes_char_next_, \ - macintosh_name_, \ - adobe_std_strings_, \ - adobe_std_encoding_, \ - adobe_expert_encoding_ ) \ - static const FT_Service_PsCMapsRec class_ = \ - { \ - unicode_value_, unicodes_init_, \ - unicodes_char_index_, unicodes_char_next_, macintosh_name_, \ - adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_PSCMAPSREC( class_, \ - unicode_value_, \ - unicodes_init_, \ - unicodes_char_index_, \ - unicodes_char_next_, \ - macintosh_name_, \ - adobe_std_strings_, \ - adobe_std_encoding_, \ - adobe_expert_encoding_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Library library, \ - FT_Service_PsCMapsRec* clazz ) \ - { \ - FT_UNUSED( library ); \ - \ - clazz->unicode_value = unicode_value_; \ - clazz->unicodes_init = unicodes_init_; \ - clazz->unicodes_char_index = unicodes_char_index_; \ - clazz->unicodes_char_next = unicodes_char_next_; \ - clazz->macintosh_name = macintosh_name_; \ - clazz->adobe_std_strings = adobe_std_strings_; \ - clazz->adobe_std_encoding = adobe_std_encoding_; \ - clazz->adobe_expert_encoding = adobe_expert_encoding_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVPSCMAP_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svpsinfo.h b/3party/freetype/include/freetype/internal/services/svpsinfo.h deleted file mode 100644 index 752a266025..0000000000 --- a/3party/freetype/include/freetype/internal/services/svpsinfo.h +++ /dev/null @@ -1,111 +0,0 @@ -/***************************************************************************/ -/* */ -/* svpsinfo.h */ -/* */ -/* The FreeType PostScript info service (specification). */ -/* */ -/* Copyright 2003-2015 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 __SVPSINFO_H__ -#define __SVPSINFO_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_INTERNAL_TYPE1_TYPES_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info" - - - typedef FT_Error - (*PS_GetFontInfoFunc)( FT_Face face, - PS_FontInfoRec* afont_info ); - - typedef FT_Error - (*PS_GetFontExtraFunc)( FT_Face face, - PS_FontExtraRec* afont_extra ); - - typedef FT_Int - (*PS_HasGlyphNamesFunc)( FT_Face face ); - - typedef FT_Error - (*PS_GetFontPrivateFunc)( FT_Face face, - PS_PrivateRec* afont_private ); - - typedef FT_Long - (*PS_GetFontValueFunc)( FT_Face face, - PS_Dict_Keys key, - FT_UInt idx, - void *value, - FT_Long value_len ); - - - FT_DEFINE_SERVICE( PsInfo ) - { - PS_GetFontInfoFunc ps_get_font_info; - PS_GetFontExtraFunc ps_get_font_extra; - PS_HasGlyphNamesFunc ps_has_glyph_names; - PS_GetFontPrivateFunc ps_get_font_private; - PS_GetFontValueFunc ps_get_font_value; - }; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_PSINFOREC( class_, \ - get_font_info_, \ - ps_get_font_extra_, \ - has_glyph_names_, \ - get_font_private_, \ - get_font_value_ ) \ - static const FT_Service_PsInfoRec class_ = \ - { \ - get_font_info_, ps_get_font_extra_, has_glyph_names_, \ - get_font_private_, get_font_value_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_PSINFOREC( class_, \ - get_font_info_, \ - ps_get_font_extra_, \ - has_glyph_names_, \ - get_font_private_, \ - get_font_value_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Library library, \ - FT_Service_PsInfoRec* clazz ) \ - { \ - FT_UNUSED( library ); \ - \ - clazz->ps_get_font_info = get_font_info_; \ - clazz->ps_get_font_extra = ps_get_font_extra_; \ - clazz->ps_has_glyph_names = has_glyph_names_; \ - clazz->ps_get_font_private = get_font_private_; \ - clazz->ps_get_font_value = get_font_value_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVPSINFO_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svsfnt.h b/3party/freetype/include/freetype/internal/services/svsfnt.h deleted file mode 100644 index 252ae1cf5e..0000000000 --- a/3party/freetype/include/freetype/internal/services/svsfnt.h +++ /dev/null @@ -1,103 +0,0 @@ -/***************************************************************************/ -/* */ -/* svsfnt.h */ -/* */ -/* The FreeType SFNT table loading service (specification). */ -/* */ -/* Copyright 2003-2015 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 __SVSFNT_H__ -#define __SVSFNT_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H - - -FT_BEGIN_HEADER - - - /* - * SFNT table loading service. - */ - -#define FT_SERVICE_ID_SFNT_TABLE "sfnt-table" - - - /* - * Used to implement FT_Load_Sfnt_Table(). - */ - typedef FT_Error - (*FT_SFNT_TableLoadFunc)( FT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte* buffer, - FT_ULong* length ); - - /* - * Used to implement FT_Get_Sfnt_Table(). - */ - typedef void* - (*FT_SFNT_TableGetFunc)( FT_Face face, - FT_Sfnt_Tag tag ); - - - /* - * Used to implement FT_Sfnt_Table_Info(). - */ - typedef FT_Error - (*FT_SFNT_TableInfoFunc)( FT_Face face, - FT_UInt idx, - FT_ULong *tag, - FT_ULong *offset, - FT_ULong *length ); - - - FT_DEFINE_SERVICE( SFNT_Table ) - { - FT_SFNT_TableLoadFunc load_table; - FT_SFNT_TableGetFunc get_table; - FT_SFNT_TableInfoFunc table_info; - }; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \ - static const FT_Service_SFNT_TableRec class_ = \ - { \ - load_, get_, info_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Service_SFNT_TableRec* clazz ) \ - { \ - clazz->load_table = load_; \ - clazz->get_table = get_; \ - clazz->table_info = info_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVSFNT_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svttcmap.h b/3party/freetype/include/freetype/internal/services/svttcmap.h deleted file mode 100644 index 4351a9ae05..0000000000 --- a/3party/freetype/include/freetype/internal/services/svttcmap.h +++ /dev/null @@ -1,105 +0,0 @@ -/***************************************************************************/ -/* */ -/* svttcmap.h */ -/* */ -/* The FreeType TrueType/sfnt cmap extra information service. */ -/* */ -/* Copyright 2003-2015 by */ -/* Masatake YAMATO, Redhat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/* Development of this service is support of - Information-technology Promotion Agency, Japan. */ - -#ifndef __SVTTCMAP_H__ -#define __SVTTCMAP_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_TT_CMAP "tt-cmaps" - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_CMapInfo */ - /* */ - /* <Description> */ - /* A structure used to store TrueType/sfnt specific cmap information */ - /* which is not covered by the generic @FT_CharMap structure. This */ - /* structure can be accessed with the @FT_Get_TT_CMap_Info function. */ - /* */ - /* <Fields> */ - /* language :: */ - /* The language ID used in Mac fonts. Definitions of values are in */ - /* `ttnameid.h'. */ - /* */ - /* format :: */ - /* The cmap format. OpenType 1.5 defines the formats 0 (byte */ - /* encoding table), 2~(high-byte mapping through table), 4~(segment */ - /* mapping to delta values), 6~(trimmed table mapping), 8~(mixed */ - /* 16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented */ - /* coverage), and 14 (Unicode Variation Sequences). */ - /* */ - typedef struct TT_CMapInfo_ - { - FT_ULong language; - FT_Long format; - - } TT_CMapInfo; - - - typedef FT_Error - (*TT_CMap_Info_GetFunc)( FT_CharMap charmap, - TT_CMapInfo *cmap_info ); - - - FT_DEFINE_SERVICE( TTCMaps ) - { - TT_CMap_Info_GetFunc get_cmap_info; - }; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ ) \ - static const FT_Service_TTCMapsRec class_ = \ - { \ - get_cmap_info_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Library library, \ - FT_Service_TTCMapsRec* clazz ) \ - { \ - FT_UNUSED( library ); \ - \ - clazz->get_cmap_info = get_cmap_info_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - -#endif /* __SVTTCMAP_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svtteng.h b/3party/freetype/include/freetype/internal/services/svtteng.h deleted file mode 100644 index 272ee8c055..0000000000 --- a/3party/freetype/include/freetype/internal/services/svtteng.h +++ /dev/null @@ -1,53 +0,0 @@ -/***************************************************************************/ -/* */ -/* svtteng.h */ -/* */ -/* The FreeType TrueType engine query service (specification). */ -/* */ -/* Copyright 2006-2015 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 __SVTTENG_H__ -#define __SVTTENG_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - - /* - * SFNT table loading service. - */ - -#define FT_SERVICE_ID_TRUETYPE_ENGINE "truetype-engine" - - /* - * Used to implement FT_Get_TrueType_Engine_Type - */ - - FT_DEFINE_SERVICE( TrueTypeEngine ) - { - FT_TrueTypeEngineType engine_type; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVTTENG_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svttglyf.h b/3party/freetype/include/freetype/internal/services/svttglyf.h deleted file mode 100644 index f5cb76a9f8..0000000000 --- a/3party/freetype/include/freetype/internal/services/svttglyf.h +++ /dev/null @@ -1,69 +0,0 @@ -/***************************************************************************/ -/* */ -/* svttglyf.h */ -/* */ -/* The FreeType TrueType glyph service. */ -/* */ -/* Copyright 2007-2015 by */ -/* David Turner. */ -/* */ -/* 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 __SVTTGLYF_H__ -#define __SVTTGLYF_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_TT_GLYF "tt-glyf" - - - typedef FT_ULong - (*TT_Glyf_GetLocationFunc)( FT_Face face, - FT_UInt gindex, - FT_ULong *psize ); - - FT_DEFINE_SERVICE( TTGlyf ) - { - TT_Glyf_GetLocationFunc get_location; - }; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ ) \ - static const FT_Service_TTGlyfRec class_ = \ - { \ - get_location_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Service_TTGlyfRec* clazz ) \ - { \ - clazz->get_location = get_location_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - -#endif /* __SVTTGLYF_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/services/svwinfnt.h b/3party/freetype/include/freetype/internal/services/svwinfnt.h deleted file mode 100644 index 0036929b2f..0000000000 --- a/3party/freetype/include/freetype/internal/services/svwinfnt.h +++ /dev/null @@ -1,50 +0,0 @@ -/***************************************************************************/ -/* */ -/* svwinfnt.h */ -/* */ -/* The FreeType Windows FNT/FONT service (specification). */ -/* */ -/* Copyright 2003-2015 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 __SVWINFNT_H__ -#define __SVWINFNT_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_WINFONTS_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_WINFNT "winfonts" - - typedef FT_Error - (*FT_WinFnt_GetHeaderFunc)( FT_Face face, - FT_WinFNT_HeaderRec *aheader ); - - - FT_DEFINE_SERVICE( WinFnt ) - { - FT_WinFnt_GetHeaderFunc get_header; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVWINFNT_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/sfnt.h b/3party/freetype/include/freetype/internal/sfnt.h deleted file mode 100644 index 30f53bf09c..0000000000 --- a/3party/freetype/include/freetype/internal/sfnt.h +++ /dev/null @@ -1,748 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfnt.h */ -/* */ -/* High-level `sfnt' driver interface (specification). */ -/* */ -/* Copyright 1996-2015 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 __SFNT_H__ -#define __SFNT_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_DRIVER_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Init_Face_Func */ - /* */ - /* <Description> */ - /* First part of the SFNT face object initialization. This finds */ - /* the face in a SFNT file or collection, and load its format tag in */ - /* face->format_tag. */ - /* */ - /* <Input> */ - /* stream :: The input stream. */ - /* */ - /* face :: A handle to the target face object. */ - /* */ - /* face_index :: The index of the TrueType font, if we are opening a */ - /* collection, in bits 0-15. The numbered instance */ - /* index~+~1 of a GX (sub)font, if applicable, in bits */ - /* 16-30. */ - /* */ - /* num_params :: The number of additional parameters. */ - /* */ - /* params :: Optional additional parameters. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The stream cursor must be at the font file's origin. */ - /* */ - /* This function recognizes fonts embedded in a `TrueType */ - /* collection'. */ - /* */ - /* Once the format tag has been validated by the font driver, it */ - /* should then call the TT_Load_Face_Func() callback to read the rest */ - /* of the SFNT tables in the object. */ - /* */ - typedef FT_Error - (*TT_Init_Face_Func)( FT_Stream stream, - TT_Face face, - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_Face_Func */ - /* */ - /* <Description> */ - /* Second part of the SFNT face object initialization. This loads */ - /* the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the */ - /* face object. */ - /* */ - /* <Input> */ - /* stream :: The input stream. */ - /* */ - /* face :: A handle to the target face object. */ - /* */ - /* face_index :: The index of the TrueType font, if we are opening a */ - /* collection, in bits 0-15. The numbered instance */ - /* index~+~1 of a GX (sub)font, if applicable, in bits */ - /* 16-30. */ - /* */ - /* num_params :: The number of additional parameters. */ - /* */ - /* params :: Optional additional parameters. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* This function must be called after TT_Init_Face_Func(). */ - /* */ - typedef FT_Error - (*TT_Load_Face_Func)( FT_Stream stream, - TT_Face face, - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Done_Face_Func */ - /* */ - /* <Description> */ - /* A callback used to delete the common SFNT data from a face. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* <Note> */ - /* This function does NOT destroy the face object. */ - /* */ - typedef void - (*TT_Done_Face_Func)( TT_Face face ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_Any_Func */ - /* */ - /* <Description> */ - /* Load any font table into client memory. */ - /* */ - /* <Input> */ - /* face :: The face object to look for. */ - /* */ - /* tag :: The tag of table to load. Use the value 0 if you want */ - /* to access the whole font file, else set this parameter */ - /* to a valid TrueType table tag that you can forge with */ - /* the MAKE_TT_TAG macro. */ - /* */ - /* offset :: The starting offset in the table (or the file if */ - /* tag == 0). */ - /* */ - /* length :: The address of the decision variable: */ - /* */ - /* If length == NULL: */ - /* Loads the whole table. Returns an error if */ - /* `offset' == 0! */ - /* */ - /* If *length == 0: */ - /* Exits immediately; returning the length of the given */ - /* table or of the font file, depending on the value of */ - /* `tag'. */ - /* */ - /* If *length != 0: */ - /* Loads the next `length' bytes of table or font, */ - /* starting at offset `offset' (in table or font too). */ - /* */ - /* <Output> */ - /* buffer :: The address of target buffer. */ - /* */ - /* <Return> */ - /* TrueType error code. 0 means success. */ - /* */ - typedef FT_Error - (*TT_Load_Any_Func)( TT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte *buffer, - FT_ULong* length ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Find_SBit_Image_Func */ - /* */ - /* <Description> */ - /* Check whether an embedded bitmap (an `sbit') exists for a given */ - /* glyph, at a given strike. */ - /* */ - /* <Input> */ - /* face :: The target face object. */ - /* */ - /* glyph_index :: The glyph index. */ - /* */ - /* strike_index :: The current strike index. */ - /* */ - /* <Output> */ - /* arange :: The SBit range containing the glyph index. */ - /* */ - /* astrike :: The SBit strike containing the glyph index. */ - /* */ - /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. Returns */ - /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */ - /* glyph. */ - /* */ - typedef FT_Error - (*TT_Find_SBit_Image_Func)( TT_Face face, - FT_UInt glyph_index, - FT_ULong strike_index, - TT_SBit_Range *arange, - TT_SBit_Strike *astrike, - FT_ULong *aglyph_offset ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_SBit_Metrics_Func */ - /* */ - /* <Description> */ - /* Get the big metrics for a given embedded bitmap. */ - /* */ - /* <Input> */ - /* stream :: The input stream. */ - /* */ - /* range :: The SBit range containing the glyph. */ - /* */ - /* <Output> */ - /* big_metrics :: A big SBit metrics structure for the glyph. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The stream cursor must be positioned at the glyph's offset within */ - /* the `EBDT' table before the call. */ - /* */ - /* If the image format uses variable metrics, the stream cursor is */ - /* positioned just after the metrics header in the `EBDT' table on */ - /* function exit. */ - /* */ - typedef FT_Error - (*TT_Load_SBit_Metrics_Func)( FT_Stream stream, - TT_SBit_Range range, - TT_SBit_Metrics metrics ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_SBit_Image_Func */ - /* */ - /* <Description> */ - /* Load a given glyph sbit image from the font resource. This also */ - /* returns its metrics. */ - /* */ - /* <Input> */ - /* face :: */ - /* The target face object. */ - /* */ - /* strike_index :: */ - /* The strike index. */ - /* */ - /* glyph_index :: */ - /* The current glyph index. */ - /* */ - /* load_flags :: */ - /* The current load flags. */ - /* */ - /* stream :: */ - /* The input stream. */ - /* */ - /* <Output> */ - /* amap :: */ - /* The target pixmap. */ - /* */ - /* ametrics :: */ - /* A big sbit metrics structure for the glyph image. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. Returns an error if no */ - /* glyph sbit exists for the index. */ - /* */ - /* <Note> */ - /* The `map.buffer' field is always freed before the glyph is loaded. */ - /* */ - typedef FT_Error - (*TT_Load_SBit_Image_Func)( TT_Face face, - FT_ULong strike_index, - FT_UInt glyph_index, - FT_UInt load_flags, - FT_Stream stream, - FT_Bitmap *amap, - TT_SBit_MetricsRec *ametrics ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Set_SBit_Strike_Func */ - /* */ - /* <Description> */ - /* Select an sbit strike for a given size request. */ - /* */ - /* <Input> */ - /* face :: The target face object. */ - /* */ - /* req :: The size request. */ - /* */ - /* <Output> */ - /* astrike_index :: The index of the sbit strike. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. Returns an error if no */ - /* sbit strike exists for the selected ppem values. */ - /* */ - typedef FT_Error - (*TT_Set_SBit_Strike_Func)( TT_Face face, - FT_Size_Request req, - FT_ULong* astrike_index ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_Strike_Metrics_Func */ - /* */ - /* <Description> */ - /* Load the metrics of a given strike. */ - /* */ - /* <Input> */ - /* face :: The target face object. */ - /* */ - /* strike_index :: The strike index. */ - /* */ - /* <Output> */ - /* metrics :: the metrics of the strike. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. Returns an error if no */ - /* such sbit strike exists. */ - /* */ - typedef FT_Error - (*TT_Load_Strike_Metrics_Func)( TT_Face face, - FT_ULong strike_index, - FT_Size_Metrics* metrics ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Get_PS_Name_Func */ - /* */ - /* <Description> */ - /* Get the PostScript glyph name of a glyph. */ - /* */ - /* <Input> */ - /* idx :: The glyph index. */ - /* */ - /* PSname :: The address of a string pointer. Will be NULL in case */ - /* of error, otherwise it is a pointer to the glyph name. */ - /* */ - /* You must not modify the returned string! */ - /* */ - /* <Output> */ - /* FreeType error code. 0 means success. */ - /* */ - typedef FT_Error - (*TT_Get_PS_Name_Func)( TT_Face face, - FT_UInt idx, - FT_String** PSname ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_Metrics_Func */ - /* */ - /* <Description> */ - /* Load a metrics table, which is a table with a horizontal and a */ - /* vertical version. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* vertical :: A boolean flag. If set, load the vertical one. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - typedef FT_Error - (*TT_Load_Metrics_Func)( TT_Face face, - FT_Stream stream, - FT_Bool vertical ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Get_Metrics_Func */ - /* */ - /* <Description> */ - /* Load the horizontal or vertical header in a face object. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* vertical :: A boolean flag. If set, load vertical metrics. */ - /* */ - /* gindex :: The glyph index. */ - /* */ - /* <Output> */ - /* abearing :: The horizontal (or vertical) bearing. Set to zero in */ - /* case of error. */ - /* */ - /* aadvance :: The horizontal (or vertical) advance. Set to zero in */ - /* case of error. */ - /* */ - typedef void - (*TT_Get_Metrics_Func)( TT_Face face, - FT_Bool vertical, - FT_UInt gindex, - FT_Short* abearing, - FT_UShort* aadvance ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Get_Name_Func */ - /* */ - /* <Description> */ - /* From the `name' table, return a given ENGLISH name record in */ - /* ASCII. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* nameid :: The name id of the name record to return. */ - /* */ - /* <InOut> */ - /* name :: The address of an allocated string pointer. NULL if */ - /* no name is present. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - typedef FT_Error - (*TT_Get_Name_Func)( TT_Face face, - FT_UShort nameid, - FT_String** name ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_Table_Func */ - /* */ - /* <Description> */ - /* Load a given TrueType table. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The function uses `face->goto_table' to seek the stream to the */ - /* start of the table, except while loading the font directory. */ - /* */ - typedef FT_Error - (*TT_Load_Table_Func)( TT_Face face, - FT_Stream stream ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Free_Table_Func */ - /* */ - /* <Description> */ - /* Free a given TrueType table. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - typedef void - (*TT_Free_Table_Func)( TT_Face face ); - - - /* - * @functype: - * TT_Face_GetKerningFunc - * - * @description: - * Return the horizontal kerning value between two glyphs. - * - * @input: - * face :: A handle to the source face object. - * left_glyph :: The left glyph index. - * right_glyph :: The right glyph index. - * - * @return: - * The kerning value in font units. - */ - typedef FT_Int - (*TT_Face_GetKerningFunc)( TT_Face face, - FT_UInt left_glyph, - FT_UInt right_glyph ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* SFNT_Interface */ - /* */ - /* <Description> */ - /* This structure holds pointers to the functions used to load and */ - /* free the basic tables that are required in a `sfnt' font file. */ - /* */ - /* <Fields> */ - /* Check the various xxx_Func() descriptions for details. */ - /* */ - typedef struct SFNT_Interface_ - { - TT_Loader_GotoTableFunc goto_table; - - TT_Init_Face_Func init_face; - TT_Load_Face_Func load_face; - TT_Done_Face_Func done_face; - FT_Module_Requester get_interface; - - TT_Load_Any_Func load_any; - - /* these functions are called by `load_face' but they can also */ - /* be called from external modules, if there is a need to do so */ - TT_Load_Table_Func load_head; - TT_Load_Metrics_Func load_hhea; - TT_Load_Table_Func load_cmap; - TT_Load_Table_Func load_maxp; - TT_Load_Table_Func load_os2; - TT_Load_Table_Func load_post; - - TT_Load_Table_Func load_name; - TT_Free_Table_Func free_name; - - /* this field was called `load_kerning' up to version 2.1.10 */ - TT_Load_Table_Func load_kern; - - TT_Load_Table_Func load_gasp; - TT_Load_Table_Func load_pclt; - - /* see `ttload.h'; this field was called `load_bitmap_header' up to */ - /* version 2.1.10 */ - TT_Load_Table_Func load_bhed; - - TT_Load_SBit_Image_Func load_sbit_image; - - /* see `ttpost.h' */ - TT_Get_PS_Name_Func get_psname; - TT_Free_Table_Func free_psnames; - - /* starting here, the structure differs from version 2.1.7 */ - - /* this field was introduced in version 2.1.8, named `get_psname' */ - TT_Face_GetKerningFunc get_kerning; - - /* new elements introduced after version 2.1.10 */ - - /* load the font directory, i.e., the offset table and */ - /* the table directory */ - TT_Load_Table_Func load_font_dir; - TT_Load_Metrics_Func load_hmtx; - - TT_Load_Table_Func load_eblc; - TT_Free_Table_Func free_eblc; - - TT_Set_SBit_Strike_Func set_sbit_strike; - TT_Load_Strike_Metrics_Func load_strike_metrics; - - TT_Get_Metrics_Func get_metrics; - - TT_Get_Name_Func get_name; - - } SFNT_Interface; - - - /* transitional */ - typedef SFNT_Interface* SFNT_Service; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SFNT_INTERFACE( \ - class_, \ - goto_table_, \ - init_face_, \ - load_face_, \ - done_face_, \ - get_interface_, \ - load_any_, \ - load_head_, \ - load_hhea_, \ - load_cmap_, \ - load_maxp_, \ - load_os2_, \ - load_post_, \ - load_name_, \ - free_name_, \ - load_kern_, \ - load_gasp_, \ - load_pclt_, \ - load_bhed_, \ - load_sbit_image_, \ - get_psname_, \ - free_psnames_, \ - get_kerning_, \ - load_font_dir_, \ - load_hmtx_, \ - load_eblc_, \ - free_eblc_, \ - set_sbit_strike_, \ - load_strike_metrics_, \ - get_metrics_, \ - get_name_ ) \ - static const SFNT_Interface class_ = \ - { \ - goto_table_, \ - init_face_, \ - load_face_, \ - done_face_, \ - get_interface_, \ - load_any_, \ - load_head_, \ - load_hhea_, \ - load_cmap_, \ - load_maxp_, \ - load_os2_, \ - load_post_, \ - load_name_, \ - free_name_, \ - load_kern_, \ - load_gasp_, \ - load_pclt_, \ - load_bhed_, \ - load_sbit_image_, \ - get_psname_, \ - free_psnames_, \ - get_kerning_, \ - load_font_dir_, \ - load_hmtx_, \ - load_eblc_, \ - free_eblc_, \ - set_sbit_strike_, \ - load_strike_metrics_, \ - get_metrics_, \ - get_name_, \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_INTERNAL( a, a_ ) \ - clazz->a = a_; - -#define FT_DEFINE_SFNT_INTERFACE( \ - class_, \ - goto_table_, \ - init_face_, \ - load_face_, \ - done_face_, \ - get_interface_, \ - load_any_, \ - load_head_, \ - load_hhea_, \ - load_cmap_, \ - load_maxp_, \ - load_os2_, \ - load_post_, \ - load_name_, \ - free_name_, \ - load_kern_, \ - load_gasp_, \ - load_pclt_, \ - load_bhed_, \ - load_sbit_image_, \ - get_psname_, \ - free_psnames_, \ - get_kerning_, \ - load_font_dir_, \ - load_hmtx_, \ - load_eblc_, \ - free_eblc_, \ - set_sbit_strike_, \ - load_strike_metrics_, \ - get_metrics_, \ - get_name_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Library library, \ - SFNT_Interface* clazz ) \ - { \ - FT_UNUSED( library ); \ - \ - clazz->goto_table = goto_table_; \ - clazz->init_face = init_face_; \ - clazz->load_face = load_face_; \ - clazz->done_face = done_face_; \ - clazz->get_interface = get_interface_; \ - clazz->load_any = load_any_; \ - clazz->load_head = load_head_; \ - clazz->load_hhea = load_hhea_; \ - clazz->load_cmap = load_cmap_; \ - clazz->load_maxp = load_maxp_; \ - clazz->load_os2 = load_os2_; \ - clazz->load_post = load_post_; \ - clazz->load_name = load_name_; \ - clazz->free_name = free_name_; \ - clazz->load_kern = load_kern_; \ - clazz->load_gasp = load_gasp_; \ - clazz->load_pclt = load_pclt_; \ - clazz->load_bhed = load_bhed_; \ - clazz->load_sbit_image = load_sbit_image_; \ - clazz->get_psname = get_psname_; \ - clazz->free_psnames = free_psnames_; \ - clazz->get_kerning = get_kerning_; \ - clazz->load_font_dir = load_font_dir_; \ - clazz->load_hmtx = load_hmtx_; \ - clazz->load_eblc = load_eblc_; \ - clazz->free_eblc = free_eblc_; \ - clazz->set_sbit_strike = set_sbit_strike_; \ - clazz->load_strike_metrics = load_strike_metrics_; \ - clazz->get_metrics = get_metrics_; \ - clazz->get_name = get_name_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - -FT_END_HEADER - -#endif /* __SFNT_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/t1types.h b/3party/freetype/include/freetype/internal/t1types.h deleted file mode 100644 index 029acc4009..0000000000 --- a/3party/freetype/include/freetype/internal/t1types.h +++ /dev/null @@ -1,255 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1types.h */ -/* */ -/* Basic Type1/Type2 type definitions and interface (specification */ -/* only). */ -/* */ -/* Copyright 1996-2015 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 __T1TYPES_H__ -#define __T1TYPES_H__ - - -#include <ft2build.h> -#include FT_TYPE1_TABLES_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H -#include FT_INTERNAL_SERVICE_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* T1_EncodingRec */ - /* */ - /* <Description> */ - /* A structure modeling a custom encoding. */ - /* */ - /* <Fields> */ - /* num_chars :: The number of character codes in the encoding. */ - /* Usually 256. */ - /* */ - /* code_first :: The lowest valid character code in the encoding. */ - /* */ - /* code_last :: The highest valid character code in the encoding */ - /* + 1. When equal to code_first there are no valid */ - /* character codes. */ - /* */ - /* char_index :: An array of corresponding glyph indices. */ - /* */ - /* char_name :: An array of corresponding glyph names. */ - /* */ - typedef struct T1_EncodingRecRec_ - { - FT_Int num_chars; - FT_Int code_first; - FT_Int code_last; - - FT_UShort* char_index; - FT_String** char_name; - - } T1_EncodingRec, *T1_Encoding; - - - /* used to hold extra data of PS_FontInfoRec that - * cannot be stored in the publicly defined structure. - * - * Note these can't be blended with multiple-masters. - */ - typedef struct PS_FontExtraRec_ - { - FT_UShort fs_type; - - } PS_FontExtraRec; - - - typedef struct T1_FontRec_ - { - PS_FontInfoRec font_info; /* font info dictionary */ - PS_FontExtraRec font_extra; /* font info extra fields */ - PS_PrivateRec private_dict; /* private dictionary */ - FT_String* font_name; /* top-level dictionary */ - - T1_EncodingType encoding_type; - T1_EncodingRec encoding; - - FT_Byte* subrs_block; - FT_Byte* charstrings_block; - FT_Byte* glyph_names_block; - - FT_Int num_subrs; - FT_Byte** subrs; - FT_UInt* subrs_len; - - FT_Int num_glyphs; - FT_String** glyph_names; /* array of glyph names */ - FT_Byte** charstrings; /* array of glyph charstrings */ - FT_UInt* charstrings_len; - - FT_Byte paint_type; - FT_Byte font_type; - FT_Matrix font_matrix; - FT_Vector font_offset; - FT_BBox font_bbox; - FT_Long font_id; - - FT_Fixed stroke_width; - - } T1_FontRec, *T1_Font; - - - typedef struct CID_SubrsRec_ - { - FT_Int num_subrs; - FT_Byte** code; - - } CID_SubrsRec, *CID_Subrs; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** AFM FONT INFORMATION STRUCTURES ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct AFM_TrackKernRec_ - { - FT_Int degree; - FT_Fixed min_ptsize; - FT_Fixed min_kern; - FT_Fixed max_ptsize; - FT_Fixed max_kern; - - } AFM_TrackKernRec, *AFM_TrackKern; - - typedef struct AFM_KernPairRec_ - { - FT_UInt index1; - FT_UInt index2; - FT_Int x; - FT_Int y; - - } AFM_KernPairRec, *AFM_KernPair; - - typedef struct AFM_FontInfoRec_ - { - FT_Bool IsCIDFont; - FT_BBox FontBBox; - FT_Fixed Ascender; - FT_Fixed Descender; - AFM_TrackKern TrackKerns; /* free if non-NULL */ - FT_UInt NumTrackKern; - AFM_KernPair KernPairs; /* free if non-NULL */ - FT_UInt NumKernPair; - - } AFM_FontInfoRec, *AFM_FontInfo; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** ORIGINAL T1_FACE CLASS DEFINITION ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - typedef struct T1_FaceRec_* T1_Face; - typedef struct CID_FaceRec_* CID_Face; - - - typedef struct T1_FaceRec_ - { - FT_FaceRec root; - T1_FontRec type1; - const void* psnames; - const void* psaux; - const void* afm_data; - FT_CharMapRec charmaprecs[2]; - FT_CharMap charmaps[2]; - - /* support for Multiple Masters fonts */ - PS_Blend blend; - - /* undocumented, optional: indices of subroutines that express */ - /* the NormalizeDesignVector and the ConvertDesignVector procedure, */ - /* respectively, as Type 2 charstrings; -1 if keywords not present */ - FT_Int ndv_idx; - FT_Int cdv_idx; - - /* undocumented, optional: has the same meaning as len_buildchar */ - /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25 */ - FT_UInt len_buildchar; - FT_Long* buildchar; - - /* since version 2.1 - interface to PostScript hinter */ - const void* pshinter; - - } T1_FaceRec; - - - typedef struct CID_FaceRec_ - { - FT_FaceRec root; - void* psnames; - void* psaux; - CID_FaceInfoRec cid; - PS_FontExtraRec font_extra; -#if 0 - void* afm_data; -#endif - CID_Subrs subrs; - - /* since version 2.1 - interface to PostScript hinter */ - void* pshinter; - - /* since version 2.1.8, but was originally positioned after `afm_data' */ - FT_Byte* binary_data; /* used if hex data has been converted */ - FT_Stream cid_stream; - - } CID_FaceRec; - - -FT_END_HEADER - -#endif /* __T1TYPES_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/internal/tttypes.h b/3party/freetype/include/freetype/internal/tttypes.h deleted file mode 100644 index 1507a7c57a..0000000000 --- a/3party/freetype/include/freetype/internal/tttypes.h +++ /dev/null @@ -1,1526 +0,0 @@ -/***************************************************************************/ -/* */ -/* tttypes.h */ -/* */ -/* Basic SFNT/TrueType type definitions and interface (specification */ -/* only). */ -/* */ -/* Copyright 1996-2015 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 __TTTYPES_H__ -#define __TTTYPES_H__ - - -#include <ft2build.h> -#include FT_TRUETYPE_TABLES_H -#include FT_INTERNAL_OBJECTS_H - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include FT_MULTIPLE_MASTERS_H -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TTC_HeaderRec */ - /* */ - /* <Description> */ - /* TrueType collection header. This table contains the offsets of */ - /* the font headers of each distinct TrueType face in the file. */ - /* */ - /* <Fields> */ - /* tag :: Must be `ttc ' to indicate a TrueType collection. */ - /* */ - /* version :: The version number. */ - /* */ - /* count :: The number of faces in the collection. The */ - /* specification says this should be an unsigned long, but */ - /* we use a signed long since we need the value -1 for */ - /* specific purposes. */ - /* */ - /* offsets :: The offsets of the font headers, one per face. */ - /* */ - typedef struct TTC_HeaderRec_ - { - FT_ULong tag; - FT_Fixed version; - FT_Long count; - FT_ULong* offsets; - - } TTC_HeaderRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* SFNT_HeaderRec */ - /* */ - /* <Description> */ - /* SFNT file format header. */ - /* */ - /* <Fields> */ - /* format_tag :: The font format tag. */ - /* */ - /* num_tables :: The number of tables in file. */ - /* */ - /* search_range :: Must be `16 * (max power of 2 <= num_tables)'. */ - /* */ - /* entry_selector :: Must be log2 of `search_range / 16'. */ - /* */ - /* range_shift :: Must be `num_tables * 16 - search_range'. */ - /* */ - typedef struct SFNT_HeaderRec_ - { - FT_ULong format_tag; - FT_UShort num_tables; - FT_UShort search_range; - FT_UShort entry_selector; - FT_UShort range_shift; - - FT_ULong offset; /* not in file */ - - } SFNT_HeaderRec, *SFNT_Header; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_TableRec */ - /* */ - /* <Description> */ - /* This structure describes a given table of a TrueType font. */ - /* */ - /* <Fields> */ - /* Tag :: A four-bytes tag describing the table. */ - /* */ - /* CheckSum :: The table checksum. This value can be ignored. */ - /* */ - /* Offset :: The offset of the table from the start of the TrueType */ - /* font in its resource. */ - /* */ - /* Length :: The table length (in bytes). */ - /* */ - typedef struct TT_TableRec_ - { - FT_ULong Tag; /* table type */ - FT_ULong CheckSum; /* table checksum */ - FT_ULong Offset; /* table file offset */ - FT_ULong Length; /* table length */ - - } TT_TableRec, *TT_Table; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* WOFF_HeaderRec */ - /* */ - /* <Description> */ - /* WOFF file format header. */ - /* */ - /* <Fields> */ - /* See */ - /* */ - /* http://www.w3.org/TR/WOFF/#WOFFHeader */ - /* */ - typedef struct WOFF_HeaderRec_ - { - FT_ULong signature; - FT_ULong flavor; - FT_ULong length; - FT_UShort num_tables; - FT_UShort reserved; - FT_ULong totalSfntSize; - FT_UShort majorVersion; - FT_UShort minorVersion; - FT_ULong metaOffset; - FT_ULong metaLength; - FT_ULong metaOrigLength; - FT_ULong privOffset; - FT_ULong privLength; - - } WOFF_HeaderRec, *WOFF_Header; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* WOFF_TableRec */ - /* */ - /* <Description> */ - /* This structure describes a given table of a WOFF font. */ - /* */ - /* <Fields> */ - /* Tag :: A four-bytes tag describing the table. */ - /* */ - /* Offset :: The offset of the table from the start of the WOFF */ - /* font in its resource. */ - /* */ - /* CompLength :: Compressed table length (in bytes). */ - /* */ - /* OrigLength :: Unompressed table length (in bytes). */ - /* */ - /* CheckSum :: The table checksum. This value can be ignored. */ - /* */ - /* OrigOffset :: The uncompressed table file offset. This value gets */ - /* computed while constructing the (uncompressed) SFNT */ - /* header. It is not contained in the WOFF file. */ - /* */ - typedef struct WOFF_TableRec_ - { - FT_ULong Tag; /* table ID */ - FT_ULong Offset; /* table file offset */ - FT_ULong CompLength; /* compressed table length */ - FT_ULong OrigLength; /* uncompressed table length */ - FT_ULong CheckSum; /* uncompressed checksum */ - - FT_ULong OrigOffset; /* uncompressed table file offset */ - /* (not in the WOFF file) */ - } WOFF_TableRec, *WOFF_Table; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_LongMetricsRec */ - /* */ - /* <Description> */ - /* A structure modeling the long metrics of the `hmtx' and `vmtx' */ - /* TrueType tables. The values are expressed in font units. */ - /* */ - /* <Fields> */ - /* advance :: The advance width or height for the glyph. */ - /* */ - /* bearing :: The left-side or top-side bearing for the glyph. */ - /* */ - typedef struct TT_LongMetricsRec_ - { - FT_UShort advance; - FT_Short bearing; - - } TT_LongMetricsRec, *TT_LongMetrics; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* TT_ShortMetrics */ - /* */ - /* <Description> */ - /* A simple type to model the short metrics of the `hmtx' and `vmtx' */ - /* tables. */ - /* */ - typedef FT_Short TT_ShortMetrics; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_NameEntryRec */ - /* */ - /* <Description> */ - /* A structure modeling TrueType name records. Name records are used */ - /* to store important strings like family name, style name, */ - /* copyright, etc. in _localized_ versions (i.e., language, encoding, */ - /* etc). */ - /* */ - /* <Fields> */ - /* platformID :: The ID of the name's encoding platform. */ - /* */ - /* encodingID :: The platform-specific ID for the name's encoding. */ - /* */ - /* languageID :: The platform-specific ID for the name's language. */ - /* */ - /* nameID :: The ID specifying what kind of name this is. */ - /* */ - /* stringLength :: The length of the string in bytes. */ - /* */ - /* stringOffset :: The offset to the string in the `name' table. */ - /* */ - /* string :: A pointer to the string's bytes. Note that these */ - /* are usually UTF-16 encoded characters. */ - /* */ - typedef struct TT_NameEntryRec_ - { - FT_UShort platformID; - FT_UShort encodingID; - FT_UShort languageID; - FT_UShort nameID; - FT_UShort stringLength; - FT_ULong stringOffset; - - /* this last field is not defined in the spec */ - /* but used by the FreeType engine */ - - FT_Byte* string; - - } TT_NameEntryRec, *TT_NameEntry; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_NameTableRec */ - /* */ - /* <Description> */ - /* A structure modeling the TrueType name table. */ - /* */ - /* <Fields> */ - /* format :: The format of the name table. */ - /* */ - /* numNameRecords :: The number of names in table. */ - /* */ - /* storageOffset :: The offset of the name table in the `name' */ - /* TrueType table. */ - /* */ - /* names :: An array of name records. */ - /* */ - /* stream :: the file's input stream. */ - /* */ - typedef struct TT_NameTableRec_ - { - FT_UShort format; - FT_UInt numNameRecords; - FT_UInt storageOffset; - TT_NameEntryRec* names; - FT_Stream stream; - - } TT_NameTableRec, *TT_NameTable; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_GaspRangeRec */ - /* */ - /* <Description> */ - /* A tiny structure used to model a gasp range according to the */ - /* TrueType specification. */ - /* */ - /* <Fields> */ - /* maxPPEM :: The maximum ppem value to which `gaspFlag' applies. */ - /* */ - /* gaspFlag :: A flag describing the grid-fitting and anti-aliasing */ - /* modes to be used. */ - /* */ - typedef struct TT_GaspRangeRec_ - { - FT_UShort maxPPEM; - FT_UShort gaspFlag; - - } TT_GaspRangeRec, *TT_GaspRange; - - -#define TT_GASP_GRIDFIT 0x01 -#define TT_GASP_DOGRAY 0x02 - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_GaspRec */ - /* */ - /* <Description> */ - /* A structure modeling the TrueType `gasp' table used to specify */ - /* grid-fitting and anti-aliasing behaviour. */ - /* */ - /* <Fields> */ - /* version :: The version number. */ - /* */ - /* numRanges :: The number of gasp ranges in table. */ - /* */ - /* gaspRanges :: An array of gasp ranges. */ - /* */ - typedef struct TT_Gasp_ - { - FT_UShort version; - FT_UShort numRanges; - TT_GaspRange gaspRanges; - - } TT_GaspRec; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** EMBEDDED BITMAPS SUPPORT ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_MetricsRec */ - /* */ - /* <Description> */ - /* A structure used to hold the big metrics of a given glyph bitmap */ - /* in a TrueType or OpenType font. These are usually found in the */ - /* `EBDT' (Microsoft) or `bloc' (Apple) table. */ - /* */ - /* <Fields> */ - /* height :: The glyph height in pixels. */ - /* */ - /* width :: The glyph width in pixels. */ - /* */ - /* horiBearingX :: The horizontal left bearing. */ - /* */ - /* horiBearingY :: The horizontal top bearing. */ - /* */ - /* horiAdvance :: The horizontal advance. */ - /* */ - /* vertBearingX :: The vertical left bearing. */ - /* */ - /* vertBearingY :: The vertical top bearing. */ - /* */ - /* vertAdvance :: The vertical advance. */ - /* */ - typedef struct TT_SBit_MetricsRec_ - { - FT_UShort height; - FT_UShort width; - - FT_Short horiBearingX; - FT_Short horiBearingY; - FT_UShort horiAdvance; - - FT_Short vertBearingX; - FT_Short vertBearingY; - FT_UShort vertAdvance; - - } TT_SBit_MetricsRec, *TT_SBit_Metrics; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_SmallMetricsRec */ - /* */ - /* <Description> */ - /* A structure used to hold the small metrics of a given glyph bitmap */ - /* in a TrueType or OpenType font. These are usually found in the */ - /* `EBDT' (Microsoft) or the `bdat' (Apple) table. */ - /* */ - /* <Fields> */ - /* height :: The glyph height in pixels. */ - /* */ - /* width :: The glyph width in pixels. */ - /* */ - /* bearingX :: The left-side bearing. */ - /* */ - /* bearingY :: The top-side bearing. */ - /* */ - /* advance :: The advance width or height. */ - /* */ - typedef struct TT_SBit_Small_Metrics_ - { - FT_Byte height; - FT_Byte width; - - FT_Char bearingX; - FT_Char bearingY; - FT_Byte advance; - - } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_LineMetricsRec */ - /* */ - /* <Description> */ - /* A structure used to describe the text line metrics of a given */ - /* bitmap strike, for either a horizontal or vertical layout. */ - /* */ - /* <Fields> */ - /* ascender :: The ascender in pixels. */ - /* */ - /* descender :: The descender in pixels. */ - /* */ - /* max_width :: The maximum glyph width in pixels. */ - /* */ - /* caret_slope_enumerator :: Rise of the caret slope, typically set */ - /* to 1 for non-italic fonts. */ - /* */ - /* caret_slope_denominator :: Rise of the caret slope, typically set */ - /* to 0 for non-italic fonts. */ - /* */ - /* caret_offset :: Offset in pixels to move the caret for */ - /* proper positioning. */ - /* */ - /* min_origin_SB :: Minimum of horiBearingX (resp. */ - /* vertBearingY). */ - /* min_advance_SB :: Minimum of */ - /* */ - /* horizontal advance - */ - /* ( horiBearingX + width ) */ - /* */ - /* resp. */ - /* */ - /* vertical advance - */ - /* ( vertBearingY + height ) */ - /* */ - /* max_before_BL :: Maximum of horiBearingY (resp. */ - /* vertBearingY). */ - /* */ - /* min_after_BL :: Minimum of */ - /* */ - /* horiBearingY - height */ - /* */ - /* resp. */ - /* */ - /* vertBearingX - width */ - /* */ - /* pads :: Unused (to make the size of the record */ - /* a multiple of 32 bits. */ - /* */ - typedef struct TT_SBit_LineMetricsRec_ - { - FT_Char ascender; - FT_Char descender; - FT_Byte max_width; - FT_Char caret_slope_numerator; - FT_Char caret_slope_denominator; - FT_Char caret_offset; - FT_Char min_origin_SB; - FT_Char min_advance_SB; - FT_Char max_before_BL; - FT_Char min_after_BL; - FT_Char pads[2]; - - } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_RangeRec */ - /* */ - /* <Description> */ - /* A TrueType/OpenType subIndexTable as defined in the `EBLC' */ - /* (Microsoft) or `bloc' (Apple) tables. */ - /* */ - /* <Fields> */ - /* first_glyph :: The first glyph index in the range. */ - /* */ - /* last_glyph :: The last glyph index in the range. */ - /* */ - /* index_format :: The format of index table. Valid values are 1 */ - /* to 5. */ - /* */ - /* image_format :: The format of `EBDT' image data. */ - /* */ - /* image_offset :: The offset to image data in `EBDT'. */ - /* */ - /* image_size :: For index formats 2 and 5. This is the size in */ - /* bytes of each glyph bitmap. */ - /* */ - /* big_metrics :: For index formats 2 and 5. This is the big */ - /* metrics for each glyph bitmap. */ - /* */ - /* num_glyphs :: For index formats 4 and 5. This is the number of */ - /* glyphs in the code array. */ - /* */ - /* glyph_offsets :: For index formats 1 and 3. */ - /* */ - /* glyph_codes :: For index formats 4 and 5. */ - /* */ - /* table_offset :: The offset of the index table in the `EBLC' */ - /* table. Only used during strike loading. */ - /* */ - typedef struct TT_SBit_RangeRec_ - { - FT_UShort first_glyph; - FT_UShort last_glyph; - - FT_UShort index_format; - FT_UShort image_format; - FT_ULong image_offset; - - FT_ULong image_size; - TT_SBit_MetricsRec metrics; - FT_ULong num_glyphs; - - FT_ULong* glyph_offsets; - FT_UShort* glyph_codes; - - FT_ULong table_offset; - - } TT_SBit_RangeRec, *TT_SBit_Range; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_StrikeRec */ - /* */ - /* <Description> */ - /* A structure used describe a given bitmap strike in the `EBLC' */ - /* (Microsoft) or `bloc' (Apple) tables. */ - /* */ - /* <Fields> */ - /* num_index_ranges :: The number of index ranges. */ - /* */ - /* index_ranges :: An array of glyph index ranges. */ - /* */ - /* color_ref :: Unused. `color_ref' is put in for future */ - /* enhancements, but these fields are already */ - /* in use by other platforms (e.g. Newton). */ - /* For details, please see */ - /* */ - /* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bloc.html */ - /* */ - /* hori :: The line metrics for horizontal layouts. */ - /* */ - /* vert :: The line metrics for vertical layouts. */ - /* */ - /* start_glyph :: The lowest glyph index for this strike. */ - /* */ - /* end_glyph :: The highest glyph index for this strike. */ - /* */ - /* x_ppem :: The number of horizontal pixels per EM. */ - /* */ - /* y_ppem :: The number of vertical pixels per EM. */ - /* */ - /* bit_depth :: The bit depth. Valid values are 1, 2, 4, */ - /* and 8. */ - /* */ - /* flags :: Is this a vertical or horizontal strike? For */ - /* details, please see */ - /* */ - /* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bloc.html */ - /* */ - typedef struct TT_SBit_StrikeRec_ - { - FT_Int num_ranges; - TT_SBit_Range sbit_ranges; - FT_ULong ranges_offset; - - FT_ULong color_ref; - - TT_SBit_LineMetricsRec hori; - TT_SBit_LineMetricsRec vert; - - FT_UShort start_glyph; - FT_UShort end_glyph; - - FT_Byte x_ppem; - FT_Byte y_ppem; - - FT_Byte bit_depth; - FT_Char flags; - - } TT_SBit_StrikeRec, *TT_SBit_Strike; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_ComponentRec */ - /* */ - /* <Description> */ - /* A simple structure to describe a compound sbit element. */ - /* */ - /* <Fields> */ - /* glyph_code :: The element's glyph index. */ - /* */ - /* x_offset :: The element's left bearing. */ - /* */ - /* y_offset :: The element's top bearing. */ - /* */ - typedef struct TT_SBit_ComponentRec_ - { - FT_UShort glyph_code; - FT_Char x_offset; - FT_Char y_offset; - - } TT_SBit_ComponentRec, *TT_SBit_Component; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_ScaleRec */ - /* */ - /* <Description> */ - /* A structure used describe a given bitmap scaling table, as defined */ - /* in the `EBSC' table. */ - /* */ - /* <Fields> */ - /* hori :: The horizontal line metrics. */ - /* */ - /* vert :: The vertical line metrics. */ - /* */ - /* x_ppem :: The number of horizontal pixels per EM. */ - /* */ - /* y_ppem :: The number of vertical pixels per EM. */ - /* */ - /* x_ppem_substitute :: Substitution x_ppem value. */ - /* */ - /* y_ppem_substitute :: Substitution y_ppem value. */ - /* */ - typedef struct TT_SBit_ScaleRec_ - { - TT_SBit_LineMetricsRec hori; - TT_SBit_LineMetricsRec vert; - - FT_Byte x_ppem; - FT_Byte y_ppem; - - FT_Byte x_ppem_substitute; - FT_Byte y_ppem_substitute; - - } TT_SBit_ScaleRec, *TT_SBit_Scale; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_Post_20Rec */ - /* */ - /* <Description> */ - /* Postscript names sub-table, format 2.0. Stores the PS name of */ - /* each glyph in the font face. */ - /* */ - /* <Fields> */ - /* num_glyphs :: The number of named glyphs in the table. */ - /* */ - /* num_names :: The number of PS names stored in the table. */ - /* */ - /* glyph_indices :: The indices of the glyphs in the names arrays. */ - /* */ - /* glyph_names :: The PS names not in Mac Encoding. */ - /* */ - typedef struct TT_Post_20Rec_ - { - FT_UShort num_glyphs; - FT_UShort num_names; - FT_UShort* glyph_indices; - FT_Char** glyph_names; - - } TT_Post_20Rec, *TT_Post_20; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_Post_25Rec */ - /* */ - /* <Description> */ - /* Postscript names sub-table, format 2.5. Stores the PS name of */ - /* each glyph in the font face. */ - /* */ - /* <Fields> */ - /* num_glyphs :: The number of glyphs in the table. */ - /* */ - /* offsets :: An array of signed offsets in a normal Mac */ - /* Postscript name encoding. */ - /* */ - typedef struct TT_Post_25_ - { - FT_UShort num_glyphs; - FT_Char* offsets; - - } TT_Post_25Rec, *TT_Post_25; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_Post_NamesRec */ - /* */ - /* <Description> */ - /* Postscript names table, either format 2.0 or 2.5. */ - /* */ - /* <Fields> */ - /* loaded :: A flag to indicate whether the PS names are loaded. */ - /* */ - /* format_20 :: The sub-table used for format 2.0. */ - /* */ - /* format_25 :: The sub-table used for format 2.5. */ - /* */ - typedef struct TT_Post_NamesRec_ - { - FT_Bool loaded; - - union - { - TT_Post_20Rec format_20; - TT_Post_25Rec format_25; - - } names; - - } TT_Post_NamesRec, *TT_Post_Names; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** GX VARIATION TABLE SUPPORT ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - typedef struct GX_BlendRec_ *GX_Blend; -#endif - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * These types are used to support a `BDF ' table that isn't part of the - * official TrueType specification. It is mainly used in SFNT-based - * bitmap fonts that were generated from a set of BDF fonts. - * - * The format of the table is as follows. - * - * USHORT version `BDF ' table version number, should be 0x0001. - * USHORT strikeCount Number of strikes (bitmap sizes) in this table. - * ULONG stringTable Offset (from start of BDF table) to string - * table. - * - * This is followed by an array of `strikeCount' descriptors, having the - * following format. - * - * USHORT ppem Vertical pixels per EM for this strike. - * USHORT numItems Number of items for this strike (properties and - * atoms). Maximum is 255. - * - * This array in turn is followed by `strikeCount' value sets. Each - * `value set' is an array of `numItems' items with the following format. - * - * ULONG item_name Offset in string table to item name. - * USHORT item_type The item type. Possible values are - * 0 => string (e.g., COMMENT) - * 1 => atom (e.g., FONT or even SIZE) - * 2 => int32 - * 3 => uint32 - * 0x10 => A flag to indicate a properties. This - * is ORed with the above values. - * ULONG item_value For strings => Offset into string table without - * the corresponding double quotes. - * For atoms => Offset into string table. - * For integers => Direct value. - * - * All strings in the string table consist of bytes and are - * zero-terminated. - * - */ - -#ifdef TT_CONFIG_OPTION_BDF - - typedef struct TT_BDFRec_ - { - FT_Byte* table; - FT_Byte* table_end; - FT_Byte* strings; - FT_ULong strings_size; - FT_UInt num_strikes; - FT_Bool loaded; - - } TT_BDFRec, *TT_BDF; - -#endif /* TT_CONFIG_OPTION_BDF */ - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** ORIGINAL TT_FACE CLASS DEFINITION ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This structure/class is defined here because it is common to the */ - /* following formats: TTF, OpenType-TT, and OpenType-CFF. */ - /* */ - /* Note, however, that the classes TT_Size and TT_GlyphSlot are not */ - /* shared between font drivers, and are thus defined in `ttobjs.h'. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* TT_Face */ - /* */ - /* <Description> */ - /* A handle to a TrueType face/font object. A TT_Face encapsulates */ - /* the resolution and scaling independent parts of a TrueType font */ - /* resource. */ - /* */ - /* <Note> */ - /* The TT_Face structure is also used as a `parent class' for the */ - /* OpenType-CFF class (T2_Face). */ - /* */ - typedef struct TT_FaceRec_* TT_Face; - - - /* a function type used for the truetype bytecode interpreter hooks */ - typedef FT_Error - (*TT_Interpreter)( void* exec_context ); - - /* forward declaration */ - typedef struct TT_LoaderRec_* TT_Loader; - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Loader_GotoTableFunc */ - /* */ - /* <Description> */ - /* Seeks a stream to the start of a given TrueType table. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* tag :: A 4-byte tag used to name the table. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Output> */ - /* length :: The length of the table in bytes. Set to 0 if not */ - /* needed. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The stream cursor must be at the font file's origin. */ - /* */ - typedef FT_Error - (*TT_Loader_GotoTableFunc)( TT_Face face, - FT_ULong tag, - FT_Stream stream, - FT_ULong* length ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Loader_StartGlyphFunc */ - /* */ - /* <Description> */ - /* Seeks a stream to the start of a given glyph element, and opens a */ - /* frame for it. */ - /* */ - /* <Input> */ - /* loader :: The current TrueType glyph loader object. */ - /* */ - /* glyph index :: The index of the glyph to access. */ - /* */ - /* offset :: The offset of the glyph according to the */ - /* `locations' table. */ - /* */ - /* byte_count :: The size of the frame in bytes. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* This function is normally equivalent to FT_STREAM_SEEK(offset) */ - /* followed by FT_FRAME_ENTER(byte_count) with the loader's stream, */ - /* but alternative formats (e.g. compressed ones) might use something */ - /* different. */ - /* */ - typedef FT_Error - (*TT_Loader_StartGlyphFunc)( TT_Loader loader, - FT_UInt glyph_index, - FT_ULong offset, - FT_UInt byte_count ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Loader_ReadGlyphFunc */ - /* */ - /* <Description> */ - /* Reads one glyph element (its header, a simple glyph, or a */ - /* composite) from the loader's current stream frame. */ - /* */ - /* <Input> */ - /* loader :: The current TrueType glyph loader object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - typedef FT_Error - (*TT_Loader_ReadGlyphFunc)( TT_Loader loader ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Loader_EndGlyphFunc */ - /* */ - /* <Description> */ - /* Closes the current loader stream frame for the glyph. */ - /* */ - /* <Input> */ - /* loader :: The current TrueType glyph loader object. */ - /* */ - typedef void - (*TT_Loader_EndGlyphFunc)( TT_Loader loader ); - - - typedef enum TT_SbitTableType_ - { - TT_SBIT_TABLE_TYPE_NONE = 0, - TT_SBIT_TABLE_TYPE_EBLC, /* `EBLC' (Microsoft), */ - /* `bloc' (Apple) */ - TT_SBIT_TABLE_TYPE_CBLC, /* `CBLC' (Google) */ - TT_SBIT_TABLE_TYPE_SBIX, /* `sbix' (Apple) */ - - /* do not remove */ - TT_SBIT_TABLE_TYPE_MAX - - } TT_SbitTableType; - - - /*************************************************************************/ - /* */ - /* TrueType Face Type */ - /* */ - /* <Struct> */ - /* TT_Face */ - /* */ - /* <Description> */ - /* The TrueType face class. These objects model the resolution and */ - /* point-size independent data found in a TrueType font file. */ - /* */ - /* <Fields> */ - /* root :: The base FT_Face structure, managed by the */ - /* base layer. */ - /* */ - /* ttc_header :: The TrueType collection header, used when */ - /* the file is a `ttc' rather than a `ttf'. */ - /* For ordinary font files, the field */ - /* `ttc_header.count' is set to 0. */ - /* */ - /* format_tag :: The font format tag. */ - /* */ - /* num_tables :: The number of TrueType tables in this font */ - /* file. */ - /* */ - /* dir_tables :: The directory of TrueType tables for this */ - /* font file. */ - /* */ - /* header :: The font's font header (`head' table). */ - /* Read on font opening. */ - /* */ - /* horizontal :: The font's horizontal header (`hhea' */ - /* table). This field also contains the */ - /* associated horizontal metrics table */ - /* (`hmtx'). */ - /* */ - /* max_profile :: The font's maximum profile table. Read on */ - /* font opening. Note that some maximum */ - /* values cannot be taken directly from this */ - /* table. We thus define additional fields */ - /* below to hold the computed maxima. */ - /* */ - /* vertical_info :: A boolean which is set when the font file */ - /* contains vertical metrics. If not, the */ - /* value of the `vertical' field is */ - /* undefined. */ - /* */ - /* vertical :: The font's vertical header (`vhea' table). */ - /* This field also contains the associated */ - /* vertical metrics table (`vmtx'), if found. */ - /* IMPORTANT: The contents of this field is */ - /* undefined if the `vertical_info' field is */ - /* unset. */ - /* */ - /* num_names :: The number of name records within this */ - /* TrueType font. */ - /* */ - /* name_table :: The table of name records (`name'). */ - /* */ - /* os2 :: The font's OS/2 table (`OS/2'). */ - /* */ - /* postscript :: The font's PostScript table (`post' */ - /* table). The PostScript glyph names are */ - /* not loaded by the driver on face opening. */ - /* See the `ttpost' module for more details. */ - /* */ - /* cmap_table :: Address of the face's `cmap' SFNT table */ - /* in memory (it's an extracted frame). */ - /* */ - /* cmap_size :: The size in bytes of the `cmap_table' */ - /* described above. */ - /* */ - /* goto_table :: A function called by each TrueType table */ - /* loader to position a stream's cursor to */ - /* the start of a given table according to */ - /* its tag. It defaults to TT_Goto_Face but */ - /* can be different for strange formats (e.g. */ - /* Type 42). */ - /* */ - /* access_glyph_frame :: A function used to access the frame of a */ - /* given glyph within the face's font file. */ - /* */ - /* forget_glyph_frame :: A function used to forget the frame of a */ - /* given glyph when all data has been loaded. */ - /* */ - /* read_glyph_header :: A function used to read a glyph header. */ - /* It must be called between an `access' and */ - /* `forget'. */ - /* */ - /* read_simple_glyph :: A function used to read a simple glyph. */ - /* It must be called after the header was */ - /* read, and before the `forget'. */ - /* */ - /* read_composite_glyph :: A function used to read a composite glyph. */ - /* It must be called after the header was */ - /* read, and before the `forget'. */ - /* */ - /* sfnt :: A pointer to the SFNT service. */ - /* */ - /* psnames :: A pointer to the PostScript names service. */ - /* */ - /* hdmx :: The face's horizontal device metrics */ - /* (`hdmx' table). This table is optional in */ - /* TrueType/OpenType fonts. */ - /* */ - /* gasp :: The grid-fitting and scaling properties */ - /* table (`gasp'). This table is optional in */ - /* TrueType/OpenType fonts. */ - /* */ - /* pclt :: The `pclt' SFNT table. */ - /* */ - /* num_sbit_scales :: The number of sbit scales for this font. */ - /* */ - /* sbit_scales :: Array of sbit scales embedded in this */ - /* font. This table is optional in a */ - /* TrueType/OpenType font. */ - /* */ - /* postscript_names :: A table used to store the Postscript names */ - /* of the glyphs for this font. See the */ - /* file `ttconfig.h' for comments on the */ - /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. */ - /* */ - /* num_locations :: The number of glyph locations in this */ - /* TrueType file. This should be */ - /* identical to the number of glyphs. */ - /* Ignored for Type 2 fonts. */ - /* */ - /* glyph_locations :: An array of longs. These are offsets to */ - /* glyph data within the `glyf' table. */ - /* Ignored for Type 2 font faces. */ - /* */ - /* glyf_len :: The length of the `glyf' table. Needed */ - /* for malformed `loca' tables. */ - /* */ - /* font_program_size :: Size in bytecodes of the face's font */ - /* program. 0 if none defined. Ignored for */ - /* Type 2 fonts. */ - /* */ - /* font_program :: The face's font program (bytecode stream) */ - /* executed at load time, also used during */ - /* glyph rendering. Comes from the `fpgm' */ - /* table. Ignored for Type 2 font fonts. */ - /* */ - /* cvt_program_size :: The size in bytecodes of the face's cvt */ - /* program. Ignored for Type 2 fonts. */ - /* */ - /* cvt_program :: The face's cvt program (bytecode stream) */ - /* executed each time an instance/size is */ - /* changed/reset. Comes from the `prep' */ - /* table. Ignored for Type 2 fonts. */ - /* */ - /* cvt_size :: Size of the control value table (in */ - /* entries). Ignored for Type 2 fonts. */ - /* */ - /* cvt :: The face's original control value table. */ - /* Coordinates are expressed in unscaled font */ - /* units. Comes from the `cvt ' table. */ - /* Ignored for Type 2 fonts. */ - /* */ - /* num_kern_pairs :: The number of kerning pairs present in the */ - /* font file. The engine only loads the */ - /* first horizontal format 0 kern table it */ - /* finds in the font file. Ignored for */ - /* Type 2 fonts. */ - /* */ - /* kern_table_index :: The index of the kerning table in the font */ - /* kerning directory. Ignored for Type 2 */ - /* fonts. */ - /* */ - /* interpreter :: A pointer to the TrueType bytecode */ - /* interpreters field is also used to hook */ - /* the debugger in `ttdebug'. */ - /* */ - /* unpatented_hinting :: If true, use only unpatented methods in */ - /* the bytecode interpreter. */ - /* */ - /* doblend :: A boolean which is set if the font should */ - /* be blended (this is for GX var). */ - /* */ - /* blend :: Contains the data needed to control GX */ - /* variation tables (rather like Multiple */ - /* Master data). */ - /* */ - /* extra :: Reserved for third-party font drivers. */ - /* */ - /* postscript_name :: The PS name of the font. Used by the */ - /* postscript name service. */ - /* */ - typedef struct TT_FaceRec_ - { - FT_FaceRec root; - - TTC_HeaderRec ttc_header; - - FT_ULong format_tag; - FT_UShort num_tables; - TT_Table dir_tables; - - TT_Header header; /* TrueType header table */ - TT_HoriHeader horizontal; /* TrueType horizontal header */ - - TT_MaxProfile max_profile; - - FT_Bool vertical_info; - TT_VertHeader vertical; /* TT Vertical header, if present */ - - FT_UShort num_names; /* number of name records */ - TT_NameTableRec name_table; /* name table */ - - TT_OS2 os2; /* TrueType OS/2 table */ - TT_Postscript postscript; /* TrueType Postscript table */ - - FT_Byte* cmap_table; /* extracted `cmap' table */ - FT_ULong cmap_size; - - TT_Loader_GotoTableFunc goto_table; - - TT_Loader_StartGlyphFunc access_glyph_frame; - TT_Loader_EndGlyphFunc forget_glyph_frame; - TT_Loader_ReadGlyphFunc read_glyph_header; - TT_Loader_ReadGlyphFunc read_simple_glyph; - TT_Loader_ReadGlyphFunc read_composite_glyph; - - /* a typeless pointer to the SFNT_Interface table used to load */ - /* the basic TrueType tables in the face object */ - void* sfnt; - - /* a typeless pointer to the FT_Service_PsCMapsRec table used to */ - /* handle glyph names <-> unicode & Mac values */ - void* psnames; - - - /***********************************************************************/ - /* */ - /* Optional TrueType/OpenType tables */ - /* */ - /***********************************************************************/ - - /* grid-fitting and scaling table */ - TT_GaspRec gasp; /* the `gasp' table */ - - /* PCL 5 table */ - TT_PCLT pclt; - - /* embedded bitmaps support */ - FT_ULong num_sbit_scales; - TT_SBit_Scale sbit_scales; - - /* postscript names table */ - TT_Post_NamesRec postscript_names; - - - /***********************************************************************/ - /* */ - /* TrueType-specific fields (ignored by the OTF-Type2 driver) */ - /* */ - /***********************************************************************/ - - /* the font program, if any */ - FT_ULong font_program_size; - FT_Byte* font_program; - - /* the cvt program, if any */ - FT_ULong cvt_program_size; - FT_Byte* cvt_program; - - /* the original, unscaled, control value table */ - FT_ULong cvt_size; - FT_Short* cvt; - - /* A pointer to the bytecode interpreter to use. This is also */ - /* used to hook the debugger for the `ttdebug' utility. */ - TT_Interpreter interpreter; - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - /* Use unpatented hinting only. */ - FT_Bool unpatented_hinting; -#endif - - /***********************************************************************/ - /* */ - /* Other tables or fields. This is used by derivative formats like */ - /* OpenType. */ - /* */ - /***********************************************************************/ - - FT_Generic extra; - - const char* postscript_name; - - FT_ULong glyf_len; - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_Bool doblend; - GX_Blend blend; -#endif - - /* since version 2.2 */ - - FT_Byte* horz_metrics; - FT_ULong horz_metrics_size; - - FT_Byte* vert_metrics; - FT_ULong vert_metrics_size; - - FT_ULong num_locations; /* in broken TTF, gid > 0xFFFF */ - FT_Byte* glyph_locations; - - FT_Byte* hdmx_table; - FT_ULong hdmx_table_size; - FT_UInt hdmx_record_count; - FT_ULong hdmx_record_size; - FT_Byte* hdmx_record_sizes; - - FT_Byte* sbit_table; - FT_ULong sbit_table_size; - TT_SbitTableType sbit_table_type; - FT_UInt sbit_num_strikes; - - FT_Byte* kern_table; - FT_ULong kern_table_size; - FT_UInt num_kern_tables; - FT_UInt32 kern_avail_bits; - FT_UInt32 kern_order_bits; - -#ifdef TT_CONFIG_OPTION_BDF - TT_BDFRec bdf; -#endif /* TT_CONFIG_OPTION_BDF */ - - /* since 2.3.0 */ - FT_ULong horz_metrics_offset; - FT_ULong vert_metrics_offset; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - /* since 2.4.12 */ - FT_ULong sph_found_func_flags; /* special functions found */ - /* for this face */ - FT_Bool sph_compatibility_mode; -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - } TT_FaceRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_GlyphZoneRec */ - /* */ - /* <Description> */ - /* A glyph zone is used to load, scale and hint glyph outline */ - /* coordinates. */ - /* */ - /* <Fields> */ - /* memory :: A handle to the memory manager. */ - /* */ - /* max_points :: The maximum size in points of the zone. */ - /* */ - /* max_contours :: Max size in links contours of the zone. */ - /* */ - /* n_points :: The current number of points in the zone. */ - /* */ - /* n_contours :: The current number of contours in the zone. */ - /* */ - /* org :: The original glyph coordinates (font */ - /* units/scaled). */ - /* */ - /* cur :: The current glyph coordinates (scaled/hinted). */ - /* */ - /* tags :: The point control tags. */ - /* */ - /* contours :: The contours end points. */ - /* */ - /* first_point :: Offset of the current subglyph's first point. */ - /* */ - typedef struct TT_GlyphZoneRec_ - { - FT_Memory memory; - FT_UShort max_points; - FT_Short max_contours; - FT_UShort n_points; /* number of points in zone */ - FT_Short n_contours; /* number of contours */ - - FT_Vector* org; /* original point coordinates */ - FT_Vector* cur; /* current point coordinates */ - FT_Vector* orus; /* original (unscaled) point coordinates */ - - FT_Byte* tags; /* current touch flags */ - FT_UShort* contours; /* contour end points */ - - FT_UShort first_point; /* offset of first (#0) point */ - - } TT_GlyphZoneRec, *TT_GlyphZone; - - - /* handle to execution context */ - typedef struct TT_ExecContextRec_* TT_ExecContext; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* TT_Size */ - /* */ - /* <Description> */ - /* A handle to a TrueType size object. */ - /* */ - typedef struct TT_SizeRec_* TT_Size; - - - /* glyph loader structure */ - typedef struct TT_LoaderRec_ - { - TT_Face face; - TT_Size size; - FT_GlyphSlot glyph; - FT_GlyphLoader gloader; - - FT_ULong load_flags; - FT_UInt glyph_index; - - FT_Stream stream; - FT_Int byte_len; - - FT_Short n_contours; - FT_BBox bbox; - FT_Int left_bearing; - FT_Int advance; - FT_Int linear; - FT_Bool linear_def; - FT_Vector pp1; - FT_Vector pp2; - - FT_ULong glyf_offset; - - /* the zone where we load our glyphs */ - TT_GlyphZoneRec base; - TT_GlyphZoneRec zone; - - TT_ExecContext exec; - FT_Byte* instructions; - FT_ULong ins_pos; - - /* for possible extensibility in other formats */ - void* other; - - /* since version 2.1.8 */ - FT_Int top_bearing; - FT_Int vadvance; - FT_Vector pp3; - FT_Vector pp4; - - /* since version 2.2.1 */ - FT_Byte* cursor; - FT_Byte* limit; - - } TT_LoaderRec; - - -FT_END_HEADER - -#endif /* __TTTYPES_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/t1tables.h b/3party/freetype/include/freetype/t1tables.h deleted file mode 100644 index a6ea415af5..0000000000 --- a/3party/freetype/include/freetype/t1tables.h +++ /dev/null @@ -1,761 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1tables.h */ -/* */ -/* Basic Type 1/Type 2 tables definitions and interface (specification */ -/* only). */ -/* */ -/* Copyright 1996-2015 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 __T1TABLES_H__ -#define __T1TABLES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* type1_tables */ - /* */ - /* <Title> */ - /* Type 1 Tables */ - /* */ - /* <Abstract> */ - /* Type~1 (PostScript) specific font tables. */ - /* */ - /* <Description> */ - /* This section contains the definition of Type 1-specific tables, */ - /* including structures related to other PostScript font formats. */ - /* */ - /* <Order> */ - /* PS_FontInfoRec */ - /* PS_FontInfo */ - /* PS_PrivateRec */ - /* PS_Private */ - /* */ - /* CID_FaceDictRec */ - /* CID_FaceDict */ - /* CID_FaceInfoRec */ - /* CID_FaceInfo */ - /* */ - /* FT_Has_PS_Glyph_Names */ - /* FT_Get_PS_Font_Info */ - /* FT_Get_PS_Font_Private */ - /* FT_Get_PS_Font_Value */ - /* */ - /* T1_Blend_Flags */ - /* T1_EncodingType */ - /* PS_Dict_Keys */ - /* */ - /*************************************************************************/ - - - /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */ - /* structures in order to support Multiple Master fonts. */ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_FontInfoRec */ - /* */ - /* <Description> */ - /* A structure used to model a Type~1 or Type~2 FontInfo dictionary. */ - /* Note that for Multiple Master fonts, each instance has its own */ - /* FontInfo dictionary. */ - /* */ - typedef struct PS_FontInfoRec_ - { - FT_String* version; - FT_String* notice; - FT_String* full_name; - FT_String* family_name; - FT_String* weight; - FT_Long italic_angle; - FT_Bool is_fixed_pitch; - FT_Short underline_position; - FT_UShort underline_thickness; - - } PS_FontInfoRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_FontInfo */ - /* */ - /* <Description> */ - /* A handle to a @PS_FontInfoRec structure. */ - /* */ - typedef struct PS_FontInfoRec_* PS_FontInfo; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* T1_FontInfo */ - /* */ - /* <Description> */ - /* This type is equivalent to @PS_FontInfoRec. It is deprecated but */ - /* kept to maintain source compatibility between various versions of */ - /* FreeType. */ - /* */ - typedef PS_FontInfoRec T1_FontInfo; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_PrivateRec */ - /* */ - /* <Description> */ - /* A structure used to model a Type~1 or Type~2 private dictionary. */ - /* Note that for Multiple Master fonts, each instance has its own */ - /* Private dictionary. */ - /* */ - typedef struct PS_PrivateRec_ - { - FT_Int unique_id; - FT_Int lenIV; - - FT_Byte num_blue_values; - FT_Byte num_other_blues; - FT_Byte num_family_blues; - FT_Byte num_family_other_blues; - - FT_Short blue_values[14]; - FT_Short other_blues[10]; - - FT_Short family_blues [14]; - FT_Short family_other_blues[10]; - - FT_Fixed blue_scale; - FT_Int blue_shift; - FT_Int blue_fuzz; - - FT_UShort standard_width[1]; - FT_UShort standard_height[1]; - - FT_Byte num_snap_widths; - FT_Byte num_snap_heights; - FT_Bool force_bold; - FT_Bool round_stem_up; - - FT_Short snap_widths [13]; /* including std width */ - FT_Short snap_heights[13]; /* including std height */ - - FT_Fixed expansion_factor; - - FT_Long language_group; - FT_Long password; - - FT_Short min_feature[2]; - - } PS_PrivateRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_Private */ - /* */ - /* <Description> */ - /* A handle to a @PS_PrivateRec structure. */ - /* */ - typedef struct PS_PrivateRec_* PS_Private; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* T1_Private */ - /* */ - /* <Description> */ - /* This type is equivalent to @PS_PrivateRec. It is deprecated but */ - /* kept to maintain source compatibility between various versions of */ - /* FreeType. */ - /* */ - typedef PS_PrivateRec T1_Private; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* T1_Blend_Flags */ - /* */ - /* <Description> */ - /* A set of flags used to indicate which fields are present in a */ - /* given blend dictionary (font info or private). Used to support */ - /* Multiple Masters fonts. */ - /* */ - /* <Values> */ - /* T1_BLEND_UNDERLINE_POSITION :: */ - /* T1_BLEND_UNDERLINE_THICKNESS :: */ - /* T1_BLEND_ITALIC_ANGLE :: */ - /* T1_BLEND_BLUE_VALUES :: */ - /* T1_BLEND_OTHER_BLUES :: */ - /* T1_BLEND_STANDARD_WIDTH :: */ - /* T1_BLEND_STANDARD_HEIGHT :: */ - /* T1_BLEND_STEM_SNAP_WIDTHS :: */ - /* T1_BLEND_STEM_SNAP_HEIGHTS :: */ - /* T1_BLEND_BLUE_SCALE :: */ - /* T1_BLEND_BLUE_SHIFT :: */ - /* T1_BLEND_FAMILY_BLUES :: */ - /* T1_BLEND_FAMILY_OTHER_BLUES :: */ - /* T1_BLEND_FORCE_BOLD :: */ - /* */ - typedef enum T1_Blend_Flags_ - { - /* required fields in a FontInfo blend dictionary */ - T1_BLEND_UNDERLINE_POSITION = 0, - T1_BLEND_UNDERLINE_THICKNESS, - T1_BLEND_ITALIC_ANGLE, - - /* required fields in a Private blend dictionary */ - T1_BLEND_BLUE_VALUES, - T1_BLEND_OTHER_BLUES, - T1_BLEND_STANDARD_WIDTH, - T1_BLEND_STANDARD_HEIGHT, - T1_BLEND_STEM_SNAP_WIDTHS, - T1_BLEND_STEM_SNAP_HEIGHTS, - T1_BLEND_BLUE_SCALE, - T1_BLEND_BLUE_SHIFT, - T1_BLEND_FAMILY_BLUES, - T1_BLEND_FAMILY_OTHER_BLUES, - T1_BLEND_FORCE_BOLD, - - T1_BLEND_MAX /* do not remove */ - - } T1_Blend_Flags; - - - /* these constants are deprecated; use the corresponding */ - /* `T1_Blend_Flags' values instead */ -#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION -#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS -#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE -#define t1_blend_blue_values T1_BLEND_BLUE_VALUES -#define t1_blend_other_blues T1_BLEND_OTHER_BLUES -#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH -#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT -#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS -#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS -#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE -#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT -#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES -#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES -#define t1_blend_force_bold T1_BLEND_FORCE_BOLD -#define t1_blend_max T1_BLEND_MAX - - /* */ - - - /* maximum number of Multiple Masters designs, as defined in the spec */ -#define T1_MAX_MM_DESIGNS 16 - - /* maximum number of Multiple Masters axes, as defined in the spec */ -#define T1_MAX_MM_AXIS 4 - - /* maximum number of elements in a design map */ -#define T1_MAX_MM_MAP_POINTS 20 - - - /* this structure is used to store the BlendDesignMap entry for an axis */ - typedef struct PS_DesignMap_ - { - FT_Byte num_points; - FT_Long* design_points; - FT_Fixed* blend_points; - - } PS_DesignMapRec, *PS_DesignMap; - - /* backwards-compatible definition */ - typedef PS_DesignMapRec T1_DesignMap; - - - typedef struct PS_BlendRec_ - { - FT_UInt num_designs; - FT_UInt num_axis; - - FT_String* axis_names[T1_MAX_MM_AXIS]; - FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; - PS_DesignMapRec design_map[T1_MAX_MM_AXIS]; - - FT_Fixed* weight_vector; - FT_Fixed* default_weight_vector; - - PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1]; - PS_Private privates [T1_MAX_MM_DESIGNS + 1]; - - FT_ULong blend_bitflags; - - FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1]; - - /* since 2.3.0 */ - - /* undocumented, optional: the default design instance; */ - /* corresponds to default_weight_vector -- */ - /* num_default_design_vector == 0 means it is not present */ - /* in the font and associated metrics files */ - FT_UInt default_design_vector[T1_MAX_MM_DESIGNS]; - FT_UInt num_default_design_vector; - - } PS_BlendRec, *PS_Blend; - - - /* backwards-compatible definition */ - typedef PS_BlendRec T1_Blend; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CID_FaceDictRec */ - /* */ - /* <Description> */ - /* A structure used to represent data in a CID top-level dictionary. */ - /* */ - typedef struct CID_FaceDictRec_ - { - PS_PrivateRec private_dict; - - FT_UInt len_buildchar; - FT_Fixed forcebold_threshold; - FT_Pos stroke_width; - FT_Fixed expansion_factor; - - FT_Byte paint_type; - FT_Byte font_type; - FT_Matrix font_matrix; - FT_Vector font_offset; - - FT_UInt num_subrs; - FT_ULong subrmap_offset; - FT_Int sd_bytes; - - } CID_FaceDictRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CID_FaceDict */ - /* */ - /* <Description> */ - /* A handle to a @CID_FaceDictRec structure. */ - /* */ - typedef struct CID_FaceDictRec_* CID_FaceDict; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CID_FontDict */ - /* */ - /* <Description> */ - /* This type is equivalent to @CID_FaceDictRec. It is deprecated but */ - /* kept to maintain source compatibility between various versions of */ - /* FreeType. */ - /* */ - typedef CID_FaceDictRec CID_FontDict; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CID_FaceInfoRec */ - /* */ - /* <Description> */ - /* A structure used to represent CID Face information. */ - /* */ - typedef struct CID_FaceInfoRec_ - { - FT_String* cid_font_name; - FT_Fixed cid_version; - FT_Int cid_font_type; - - FT_String* registry; - FT_String* ordering; - FT_Int supplement; - - PS_FontInfoRec font_info; - FT_BBox font_bbox; - FT_ULong uid_base; - - FT_Int num_xuid; - FT_ULong xuid[16]; - - FT_ULong cidmap_offset; - FT_Int fd_bytes; - FT_Int gd_bytes; - FT_ULong cid_count; - - FT_Int num_dicts; - CID_FaceDict font_dicts; - - FT_ULong data_offset; - - } CID_FaceInfoRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CID_FaceInfo */ - /* */ - /* <Description> */ - /* A handle to a @CID_FaceInfoRec structure. */ - /* */ - typedef struct CID_FaceInfoRec_* CID_FaceInfo; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CID_Info */ - /* */ - /* <Description> */ - /* This type is equivalent to @CID_FaceInfoRec. It is deprecated but */ - /* kept to maintain source compatibility between various versions of */ - /* FreeType. */ - /* */ - typedef CID_FaceInfoRec CID_Info; - - - /************************************************************************ - * - * @function: - * FT_Has_PS_Glyph_Names - * - * @description: - * Return true if a given face provides reliable PostScript glyph - * names. This is similar to using the @FT_HAS_GLYPH_NAMES macro, - * except that certain fonts (mostly TrueType) contain incorrect - * glyph name tables. - * - * When this function returns true, the caller is sure that the glyph - * names returned by @FT_Get_Glyph_Name are reliable. - * - * @input: - * face :: - * face handle - * - * @return: - * Boolean. True if glyph names are reliable. - * - */ - FT_EXPORT( FT_Int ) - FT_Has_PS_Glyph_Names( FT_Face face ); - - - /************************************************************************ - * - * @function: - * FT_Get_PS_Font_Info - * - * @description: - * Retrieve the @PS_FontInfoRec structure corresponding to a given - * PostScript font. - * - * @input: - * face :: - * PostScript face handle. - * - * @output: - * afont_info :: - * Output font info structure pointer. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * String pointers within the @PS_FontInfoRec structure are owned by - * the face and don't need to be freed by the caller. Missing entries - * in the font's FontInfo dictionary are represented by NULL pointers. - * - * If the font's format is not PostScript-based, this function will - * return the `FT_Err_Invalid_Argument' error code. - * - */ - FT_EXPORT( FT_Error ) - FT_Get_PS_Font_Info( FT_Face face, - PS_FontInfo afont_info ); - - - /************************************************************************ - * - * @function: - * FT_Get_PS_Font_Private - * - * @description: - * Retrieve the @PS_PrivateRec structure corresponding to a given - * PostScript font. - * - * @input: - * face :: - * PostScript face handle. - * - * @output: - * afont_private :: - * Output private dictionary structure pointer. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The string pointers within the @PS_PrivateRec structure are owned by - * the face and don't need to be freed by the caller. - * - * If the font's format is not PostScript-based, this function returns - * the `FT_Err_Invalid_Argument' error code. - * - */ - FT_EXPORT( FT_Error ) - FT_Get_PS_Font_Private( FT_Face face, - PS_Private afont_private ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* T1_EncodingType */ - /* */ - /* <Description> */ - /* An enumeration describing the `Encoding' entry in a Type 1 */ - /* dictionary. */ - /* */ - /* <Values> */ - /* T1_ENCODING_TYPE_NONE :: */ - /* T1_ENCODING_TYPE_ARRAY :: */ - /* T1_ENCODING_TYPE_STANDARD :: */ - /* T1_ENCODING_TYPE_ISOLATIN1 :: */ - /* T1_ENCODING_TYPE_EXPERT :: */ - /* */ - typedef enum T1_EncodingType_ - { - T1_ENCODING_TYPE_NONE = 0, - T1_ENCODING_TYPE_ARRAY, - T1_ENCODING_TYPE_STANDARD, - T1_ENCODING_TYPE_ISOLATIN1, - T1_ENCODING_TYPE_EXPERT - - } T1_EncodingType; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* PS_Dict_Keys */ - /* */ - /* <Description> */ - /* An enumeration used in calls to @FT_Get_PS_Font_Value to identify */ - /* the Type~1 dictionary entry to retrieve. */ - /* */ - /* <Values> */ - /* PS_DICT_FONT_TYPE :: */ - /* PS_DICT_FONT_MATRIX :: */ - /* PS_DICT_FONT_BBOX :: */ - /* PS_DICT_PAINT_TYPE :: */ - /* PS_DICT_FONT_NAME :: */ - /* PS_DICT_UNIQUE_ID :: */ - /* PS_DICT_NUM_CHAR_STRINGS :: */ - /* PS_DICT_CHAR_STRING_KEY :: */ - /* PS_DICT_CHAR_STRING :: */ - /* PS_DICT_ENCODING_TYPE :: */ - /* PS_DICT_ENCODING_ENTRY :: */ - /* PS_DICT_NUM_SUBRS :: */ - /* PS_DICT_SUBR :: */ - /* PS_DICT_STD_HW :: */ - /* PS_DICT_STD_VW :: */ - /* PS_DICT_NUM_BLUE_VALUES :: */ - /* PS_DICT_BLUE_VALUE :: */ - /* PS_DICT_BLUE_FUZZ :: */ - /* PS_DICT_NUM_OTHER_BLUES :: */ - /* PS_DICT_OTHER_BLUE :: */ - /* PS_DICT_NUM_FAMILY_BLUES :: */ - /* PS_DICT_FAMILY_BLUE :: */ - /* PS_DICT_NUM_FAMILY_OTHER_BLUES :: */ - /* PS_DICT_FAMILY_OTHER_BLUE :: */ - /* PS_DICT_BLUE_SCALE :: */ - /* PS_DICT_BLUE_SHIFT :: */ - /* PS_DICT_NUM_STEM_SNAP_H :: */ - /* PS_DICT_STEM_SNAP_H :: */ - /* PS_DICT_NUM_STEM_SNAP_V :: */ - /* PS_DICT_STEM_SNAP_V :: */ - /* PS_DICT_FORCE_BOLD :: */ - /* PS_DICT_RND_STEM_UP :: */ - /* PS_DICT_MIN_FEATURE :: */ - /* PS_DICT_LEN_IV :: */ - /* PS_DICT_PASSWORD :: */ - /* PS_DICT_LANGUAGE_GROUP :: */ - /* PS_DICT_VERSION :: */ - /* PS_DICT_NOTICE :: */ - /* PS_DICT_FULL_NAME :: */ - /* PS_DICT_FAMILY_NAME :: */ - /* PS_DICT_WEIGHT :: */ - /* PS_DICT_IS_FIXED_PITCH :: */ - /* PS_DICT_UNDERLINE_POSITION :: */ - /* PS_DICT_UNDERLINE_THICKNESS :: */ - /* PS_DICT_FS_TYPE :: */ - /* PS_DICT_ITALIC_ANGLE :: */ - /* */ - typedef enum PS_Dict_Keys_ - { - /* conventionally in the font dictionary */ - PS_DICT_FONT_TYPE, /* FT_Byte */ - PS_DICT_FONT_MATRIX, /* FT_Fixed */ - PS_DICT_FONT_BBOX, /* FT_Fixed */ - PS_DICT_PAINT_TYPE, /* FT_Byte */ - PS_DICT_FONT_NAME, /* FT_String* */ - PS_DICT_UNIQUE_ID, /* FT_Int */ - PS_DICT_NUM_CHAR_STRINGS, /* FT_Int */ - PS_DICT_CHAR_STRING_KEY, /* FT_String* */ - PS_DICT_CHAR_STRING, /* FT_String* */ - PS_DICT_ENCODING_TYPE, /* T1_EncodingType */ - PS_DICT_ENCODING_ENTRY, /* FT_String* */ - - /* conventionally in the font Private dictionary */ - PS_DICT_NUM_SUBRS, /* FT_Int */ - PS_DICT_SUBR, /* FT_String* */ - PS_DICT_STD_HW, /* FT_UShort */ - PS_DICT_STD_VW, /* FT_UShort */ - PS_DICT_NUM_BLUE_VALUES, /* FT_Byte */ - PS_DICT_BLUE_VALUE, /* FT_Short */ - PS_DICT_BLUE_FUZZ, /* FT_Int */ - PS_DICT_NUM_OTHER_BLUES, /* FT_Byte */ - PS_DICT_OTHER_BLUE, /* FT_Short */ - PS_DICT_NUM_FAMILY_BLUES, /* FT_Byte */ - PS_DICT_FAMILY_BLUE, /* FT_Short */ - PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte */ - PS_DICT_FAMILY_OTHER_BLUE, /* FT_Short */ - PS_DICT_BLUE_SCALE, /* FT_Fixed */ - PS_DICT_BLUE_SHIFT, /* FT_Int */ - PS_DICT_NUM_STEM_SNAP_H, /* FT_Byte */ - PS_DICT_STEM_SNAP_H, /* FT_Short */ - PS_DICT_NUM_STEM_SNAP_V, /* FT_Byte */ - PS_DICT_STEM_SNAP_V, /* FT_Short */ - PS_DICT_FORCE_BOLD, /* FT_Bool */ - PS_DICT_RND_STEM_UP, /* FT_Bool */ - PS_DICT_MIN_FEATURE, /* FT_Short */ - PS_DICT_LEN_IV, /* FT_Int */ - PS_DICT_PASSWORD, /* FT_Long */ - PS_DICT_LANGUAGE_GROUP, /* FT_Long */ - - /* conventionally in the font FontInfo dictionary */ - PS_DICT_VERSION, /* FT_String* */ - PS_DICT_NOTICE, /* FT_String* */ - PS_DICT_FULL_NAME, /* FT_String* */ - PS_DICT_FAMILY_NAME, /* FT_String* */ - PS_DICT_WEIGHT, /* FT_String* */ - PS_DICT_IS_FIXED_PITCH, /* FT_Bool */ - PS_DICT_UNDERLINE_POSITION, /* FT_Short */ - PS_DICT_UNDERLINE_THICKNESS, /* FT_UShort */ - PS_DICT_FS_TYPE, /* FT_UShort */ - PS_DICT_ITALIC_ANGLE, /* FT_Long */ - - PS_DICT_MAX = PS_DICT_ITALIC_ANGLE - - } PS_Dict_Keys; - - - /************************************************************************ - * - * @function: - * FT_Get_PS_Font_Value - * - * @description: - * Retrieve the value for the supplied key from a PostScript font. - * - * @input: - * face :: - * PostScript face handle. - * - * key :: - * An enumeration value representing the dictionary key to retrieve. - * - * idx :: - * For array values, this specifies the index to be returned. - * - * value :: - * A pointer to memory into which to write the value. - * - * valen_len :: - * The size, in bytes, of the memory supplied for the value. - * - * @output: - * value :: - * The value matching the above key, if it exists. - * - * @return: - * The amount of memory (in bytes) required to hold the requested - * value (if it exists, -1 otherwise). - * - * @note: - * The values returned are not pointers into the internal structures of - * the face, but are `fresh' copies, so that the memory containing them - * belongs to the calling application. This also enforces the - * `read-only' nature of these values, i.e., this function cannot be - * used to manipulate the face. - * - * `value' is a void pointer because the values returned can be of - * various types. - * - * If either `value' is NULL or `value_len' is too small, just the - * required memory size for the requested entry is returned. - * - * The `idx' parameter is used, not only to retrieve elements of, for - * example, the FontMatrix or FontBBox, but also to retrieve name keys - * from the CharStrings dictionary, and the charstrings themselves. It - * is ignored for atomic values. - * - * PS_DICT_BLUE_SCALE returns a value that is scaled up by 1000. To - * get the value as in the font stream, you need to divide by - * 65536000.0 (to remove the FT_Fixed scale, and the x1000 scale). - * - * IMPORTANT: Only key/value pairs read by the FreeType interpreter can - * be retrieved. So, for example, PostScript procedures such as NP, - * ND, and RD are not available. Arbitrary keys are, obviously, not be - * available either. - * - * If the font's format is not PostScript-based, this function returns - * the `FT_Err_Invalid_Argument' error code. - * - */ - FT_EXPORT( FT_Long ) - FT_Get_PS_Font_Value( FT_Face face, - PS_Dict_Keys key, - FT_UInt idx, - void *value, - FT_Long value_len ); - - /* */ - -FT_END_HEADER - -#endif /* __T1TABLES_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ttnameid.h b/3party/freetype/include/freetype/ttnameid.h deleted file mode 100644 index c9585f2413..0000000000 --- a/3party/freetype/include/freetype/ttnameid.h +++ /dev/null @@ -1,1237 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttnameid.h */ -/* */ -/* TrueType name ID definitions (specification only). */ -/* */ -/* Copyright 1996-2015 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 __TTNAMEID_H__ -#define __TTNAMEID_H__ - - -#include <ft2build.h> - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* truetype_tables */ - /* */ - - - /*************************************************************************/ - /* */ - /* Possible values for the `platform' identifier code in the name */ - /* records of the TTF `name' table. */ - /* */ - /*************************************************************************/ - - - /*********************************************************************** - * - * @enum: - * TT_PLATFORM_XXX - * - * @description: - * A list of valid values for the `platform_id' identifier code in - * @FT_CharMapRec and @FT_SfntName structures. - * - * @values: - * TT_PLATFORM_APPLE_UNICODE :: - * Used by Apple to indicate a Unicode character map and/or name entry. - * See @TT_APPLE_ID_XXX for corresponding `encoding_id' values. Note - * that name entries in this format are coded as big-endian UCS-2 - * character codes _only_. - * - * TT_PLATFORM_MACINTOSH :: - * Used by Apple to indicate a MacOS-specific charmap and/or name entry. - * See @TT_MAC_ID_XXX for corresponding `encoding_id' values. Note that - * most TrueType fonts contain an Apple roman charmap to be usable on - * MacOS systems (even if they contain a Microsoft charmap as well). - * - * TT_PLATFORM_ISO :: - * This value was used to specify ISO/IEC 10646 charmaps. It is however - * now deprecated. See @TT_ISO_ID_XXX for a list of corresponding - * `encoding_id' values. - * - * TT_PLATFORM_MICROSOFT :: - * Used by Microsoft to indicate Windows-specific charmaps. See - * @TT_MS_ID_XXX for a list of corresponding `encoding_id' values. - * Note that most fonts contain a Unicode charmap using - * (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS). - * - * TT_PLATFORM_CUSTOM :: - * Used to indicate application-specific charmaps. - * - * TT_PLATFORM_ADOBE :: - * This value isn't part of any font format specification, but is used - * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec - * structure. See @TT_ADOBE_ID_XXX. - */ - -#define TT_PLATFORM_APPLE_UNICODE 0 -#define TT_PLATFORM_MACINTOSH 1 -#define TT_PLATFORM_ISO 2 /* deprecated */ -#define TT_PLATFORM_MICROSOFT 3 -#define TT_PLATFORM_CUSTOM 4 -#define TT_PLATFORM_ADOBE 7 /* artificial */ - - - /*********************************************************************** - * - * @enum: - * TT_APPLE_ID_XXX - * - * @description: - * A list of valid values for the `encoding_id' for - * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries. - * - * @values: - * TT_APPLE_ID_DEFAULT :: - * Unicode version 1.0. - * - * TT_APPLE_ID_UNICODE_1_1 :: - * Unicode 1.1; specifies Hangul characters starting at U+34xx. - * - * TT_APPLE_ID_ISO_10646 :: - * Deprecated (identical to preceding). - * - * TT_APPLE_ID_UNICODE_2_0 :: - * Unicode 2.0 and beyond (UTF-16 BMP only). - * - * TT_APPLE_ID_UNICODE_32 :: - * Unicode 3.1 and beyond, using UTF-32. - * - * TT_APPLE_ID_VARIANT_SELECTOR :: - * From Adobe, not Apple. Not a normal cmap. Specifies variations - * on a real cmap. - */ - -#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ -#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ -#define TT_APPLE_ID_ISO_10646 2 /* deprecated */ -#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ -#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */ -#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */ - - - /*********************************************************************** - * - * @enum: - * TT_MAC_ID_XXX - * - * @description: - * A list of valid values for the `encoding_id' for - * @TT_PLATFORM_MACINTOSH charmaps and name entries. - * - * @values: - * TT_MAC_ID_ROMAN :: - * TT_MAC_ID_JAPANESE :: - * TT_MAC_ID_TRADITIONAL_CHINESE :: - * TT_MAC_ID_KOREAN :: - * TT_MAC_ID_ARABIC :: - * TT_MAC_ID_HEBREW :: - * TT_MAC_ID_GREEK :: - * TT_MAC_ID_RUSSIAN :: - * TT_MAC_ID_RSYMBOL :: - * TT_MAC_ID_DEVANAGARI :: - * TT_MAC_ID_GURMUKHI :: - * TT_MAC_ID_GUJARATI :: - * TT_MAC_ID_ORIYA :: - * TT_MAC_ID_BENGALI :: - * TT_MAC_ID_TAMIL :: - * TT_MAC_ID_TELUGU :: - * TT_MAC_ID_KANNADA :: - * TT_MAC_ID_MALAYALAM :: - * TT_MAC_ID_SINHALESE :: - * TT_MAC_ID_BURMESE :: - * TT_MAC_ID_KHMER :: - * TT_MAC_ID_THAI :: - * TT_MAC_ID_LAOTIAN :: - * TT_MAC_ID_GEORGIAN :: - * TT_MAC_ID_ARMENIAN :: - * TT_MAC_ID_MALDIVIAN :: - * TT_MAC_ID_SIMPLIFIED_CHINESE :: - * TT_MAC_ID_TIBETAN :: - * TT_MAC_ID_MONGOLIAN :: - * TT_MAC_ID_GEEZ :: - * TT_MAC_ID_SLAVIC :: - * TT_MAC_ID_VIETNAMESE :: - * TT_MAC_ID_SINDHI :: - * TT_MAC_ID_UNINTERP :: - */ - -#define TT_MAC_ID_ROMAN 0 -#define TT_MAC_ID_JAPANESE 1 -#define TT_MAC_ID_TRADITIONAL_CHINESE 2 -#define TT_MAC_ID_KOREAN 3 -#define TT_MAC_ID_ARABIC 4 -#define TT_MAC_ID_HEBREW 5 -#define TT_MAC_ID_GREEK 6 -#define TT_MAC_ID_RUSSIAN 7 -#define TT_MAC_ID_RSYMBOL 8 -#define TT_MAC_ID_DEVANAGARI 9 -#define TT_MAC_ID_GURMUKHI 10 -#define TT_MAC_ID_GUJARATI 11 -#define TT_MAC_ID_ORIYA 12 -#define TT_MAC_ID_BENGALI 13 -#define TT_MAC_ID_TAMIL 14 -#define TT_MAC_ID_TELUGU 15 -#define TT_MAC_ID_KANNADA 16 -#define TT_MAC_ID_MALAYALAM 17 -#define TT_MAC_ID_SINHALESE 18 -#define TT_MAC_ID_BURMESE 19 -#define TT_MAC_ID_KHMER 20 -#define TT_MAC_ID_THAI 21 -#define TT_MAC_ID_LAOTIAN 22 -#define TT_MAC_ID_GEORGIAN 23 -#define TT_MAC_ID_ARMENIAN 24 -#define TT_MAC_ID_MALDIVIAN 25 -#define TT_MAC_ID_SIMPLIFIED_CHINESE 25 -#define TT_MAC_ID_TIBETAN 26 -#define TT_MAC_ID_MONGOLIAN 27 -#define TT_MAC_ID_GEEZ 28 -#define TT_MAC_ID_SLAVIC 29 -#define TT_MAC_ID_VIETNAMESE 30 -#define TT_MAC_ID_SINDHI 31 -#define TT_MAC_ID_UNINTERP 32 - - - /*********************************************************************** - * - * @enum: - * TT_ISO_ID_XXX - * - * @description: - * A list of valid values for the `encoding_id' for - * @TT_PLATFORM_ISO charmaps and name entries. - * - * Their use is now deprecated. - * - * @values: - * TT_ISO_ID_7BIT_ASCII :: - * ASCII. - * TT_ISO_ID_10646 :: - * ISO/10646. - * TT_ISO_ID_8859_1 :: - * Also known as Latin-1. - */ - -#define TT_ISO_ID_7BIT_ASCII 0 -#define TT_ISO_ID_10646 1 -#define TT_ISO_ID_8859_1 2 - - - /*********************************************************************** - * - * @enum: - * TT_MS_ID_XXX - * - * @description: - * A list of valid values for the `encoding_id' for - * @TT_PLATFORM_MICROSOFT charmaps and name entries. - * - * @values: - * TT_MS_ID_SYMBOL_CS :: - * Corresponds to Microsoft symbol encoding. See - * @FT_ENCODING_MS_SYMBOL. - * - * TT_MS_ID_UNICODE_CS :: - * Corresponds to a Microsoft WGL4 charmap, matching Unicode. See - * @FT_ENCODING_UNICODE. - * - * TT_MS_ID_SJIS :: - * Corresponds to SJIS Japanese encoding. See @FT_ENCODING_SJIS. - * - * TT_MS_ID_GB2312 :: - * Corresponds to Simplified Chinese as used in Mainland China. See - * @FT_ENCODING_GB2312. - * - * TT_MS_ID_BIG_5 :: - * Corresponds to Traditional Chinese as used in Taiwan and Hong Kong. - * See @FT_ENCODING_BIG5. - * - * TT_MS_ID_WANSUNG :: - * Corresponds to Korean Wansung encoding. See @FT_ENCODING_WANSUNG. - * - * TT_MS_ID_JOHAB :: - * Corresponds to Johab encoding. See @FT_ENCODING_JOHAB. - * - * TT_MS_ID_UCS_4 :: - * Corresponds to UCS-4 or UTF-32 charmaps. This has been added to - * the OpenType specification version 1.4 (mid-2001.) - */ - -#define TT_MS_ID_SYMBOL_CS 0 -#define TT_MS_ID_UNICODE_CS 1 -#define TT_MS_ID_SJIS 2 -#define TT_MS_ID_GB2312 3 -#define TT_MS_ID_BIG_5 4 -#define TT_MS_ID_WANSUNG 5 -#define TT_MS_ID_JOHAB 6 -#define TT_MS_ID_UCS_4 10 - - - /*********************************************************************** - * - * @enum: - * TT_ADOBE_ID_XXX - * - * @description: - * A list of valid values for the `encoding_id' for - * @TT_PLATFORM_ADOBE charmaps. This is a FreeType-specific extension! - * - * @values: - * TT_ADOBE_ID_STANDARD :: - * Adobe standard encoding. - * TT_ADOBE_ID_EXPERT :: - * Adobe expert encoding. - * TT_ADOBE_ID_CUSTOM :: - * Adobe custom encoding. - * TT_ADOBE_ID_LATIN_1 :: - * Adobe Latin~1 encoding. - */ - -#define TT_ADOBE_ID_STANDARD 0 -#define TT_ADOBE_ID_EXPERT 1 -#define TT_ADOBE_ID_CUSTOM 2 -#define TT_ADOBE_ID_LATIN_1 3 - - - /*************************************************************************/ - /* */ - /* Possible values of the language identifier field in the name records */ - /* of the TTF `name' table if the `platform' identifier code is */ - /* TT_PLATFORM_MACINTOSH. These values are also used as return values */ - /* for function @FT_Get_CMap_Language_ID. */ - /* */ - /* The canonical source for the Apple assigned Language ID's is at */ - /* */ - /* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html */ - /* */ -#define TT_MAC_LANGID_ENGLISH 0 -#define TT_MAC_LANGID_FRENCH 1 -#define TT_MAC_LANGID_GERMAN 2 -#define TT_MAC_LANGID_ITALIAN 3 -#define TT_MAC_LANGID_DUTCH 4 -#define TT_MAC_LANGID_SWEDISH 5 -#define TT_MAC_LANGID_SPANISH 6 -#define TT_MAC_LANGID_DANISH 7 -#define TT_MAC_LANGID_PORTUGUESE 8 -#define TT_MAC_LANGID_NORWEGIAN 9 -#define TT_MAC_LANGID_HEBREW 10 -#define TT_MAC_LANGID_JAPANESE 11 -#define TT_MAC_LANGID_ARABIC 12 -#define TT_MAC_LANGID_FINNISH 13 -#define TT_MAC_LANGID_GREEK 14 -#define TT_MAC_LANGID_ICELANDIC 15 -#define TT_MAC_LANGID_MALTESE 16 -#define TT_MAC_LANGID_TURKISH 17 -#define TT_MAC_LANGID_CROATIAN 18 -#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19 -#define TT_MAC_LANGID_URDU 20 -#define TT_MAC_LANGID_HINDI 21 -#define TT_MAC_LANGID_THAI 22 -#define TT_MAC_LANGID_KOREAN 23 -#define TT_MAC_LANGID_LITHUANIAN 24 -#define TT_MAC_LANGID_POLISH 25 -#define TT_MAC_LANGID_HUNGARIAN 26 -#define TT_MAC_LANGID_ESTONIAN 27 -#define TT_MAC_LANGID_LETTISH 28 -#define TT_MAC_LANGID_SAAMISK 29 -#define TT_MAC_LANGID_FAEROESE 30 -#define TT_MAC_LANGID_FARSI 31 -#define TT_MAC_LANGID_RUSSIAN 32 -#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33 -#define TT_MAC_LANGID_FLEMISH 34 -#define TT_MAC_LANGID_IRISH 35 -#define TT_MAC_LANGID_ALBANIAN 36 -#define TT_MAC_LANGID_ROMANIAN 37 -#define TT_MAC_LANGID_CZECH 38 -#define TT_MAC_LANGID_SLOVAK 39 -#define TT_MAC_LANGID_SLOVENIAN 40 -#define TT_MAC_LANGID_YIDDISH 41 -#define TT_MAC_LANGID_SERBIAN 42 -#define TT_MAC_LANGID_MACEDONIAN 43 -#define TT_MAC_LANGID_BULGARIAN 44 -#define TT_MAC_LANGID_UKRAINIAN 45 -#define TT_MAC_LANGID_BYELORUSSIAN 46 -#define TT_MAC_LANGID_UZBEK 47 -#define TT_MAC_LANGID_KAZAKH 48 -#define TT_MAC_LANGID_AZERBAIJANI 49 -#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49 -#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50 -#define TT_MAC_LANGID_ARMENIAN 51 -#define TT_MAC_LANGID_GEORGIAN 52 -#define TT_MAC_LANGID_MOLDAVIAN 53 -#define TT_MAC_LANGID_KIRGHIZ 54 -#define TT_MAC_LANGID_TAJIKI 55 -#define TT_MAC_LANGID_TURKMEN 56 -#define TT_MAC_LANGID_MONGOLIAN 57 -#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57 -#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58 -#define TT_MAC_LANGID_PASHTO 59 -#define TT_MAC_LANGID_KURDISH 60 -#define TT_MAC_LANGID_KASHMIRI 61 -#define TT_MAC_LANGID_SINDHI 62 -#define TT_MAC_LANGID_TIBETAN 63 -#define TT_MAC_LANGID_NEPALI 64 -#define TT_MAC_LANGID_SANSKRIT 65 -#define TT_MAC_LANGID_MARATHI 66 -#define TT_MAC_LANGID_BENGALI 67 -#define TT_MAC_LANGID_ASSAMESE 68 -#define TT_MAC_LANGID_GUJARATI 69 -#define TT_MAC_LANGID_PUNJABI 70 -#define TT_MAC_LANGID_ORIYA 71 -#define TT_MAC_LANGID_MALAYALAM 72 -#define TT_MAC_LANGID_KANNADA 73 -#define TT_MAC_LANGID_TAMIL 74 -#define TT_MAC_LANGID_TELUGU 75 -#define TT_MAC_LANGID_SINHALESE 76 -#define TT_MAC_LANGID_BURMESE 77 -#define TT_MAC_LANGID_KHMER 78 -#define TT_MAC_LANGID_LAO 79 -#define TT_MAC_LANGID_VIETNAMESE 80 -#define TT_MAC_LANGID_INDONESIAN 81 -#define TT_MAC_LANGID_TAGALOG 82 -#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83 -#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84 -#define TT_MAC_LANGID_AMHARIC 85 -#define TT_MAC_LANGID_TIGRINYA 86 -#define TT_MAC_LANGID_GALLA 87 -#define TT_MAC_LANGID_SOMALI 88 -#define TT_MAC_LANGID_SWAHILI 89 -#define TT_MAC_LANGID_RUANDA 90 -#define TT_MAC_LANGID_RUNDI 91 -#define TT_MAC_LANGID_CHEWA 92 -#define TT_MAC_LANGID_MALAGASY 93 -#define TT_MAC_LANGID_ESPERANTO 94 -#define TT_MAC_LANGID_WELSH 128 -#define TT_MAC_LANGID_BASQUE 129 -#define TT_MAC_LANGID_CATALAN 130 -#define TT_MAC_LANGID_LATIN 131 -#define TT_MAC_LANGID_QUECHUA 132 -#define TT_MAC_LANGID_GUARANI 133 -#define TT_MAC_LANGID_AYMARA 134 -#define TT_MAC_LANGID_TATAR 135 -#define TT_MAC_LANGID_UIGHUR 136 -#define TT_MAC_LANGID_DZONGKHA 137 -#define TT_MAC_LANGID_JAVANESE 138 -#define TT_MAC_LANGID_SUNDANESE 139 - - -#if 0 /* these seem to be errors that have been dropped */ - -#define TT_MAC_LANGID_SCOTTISH_GAELIC 140 -#define TT_MAC_LANGID_IRISH_GAELIC 141 - -#endif - - - /* The following codes are new as of 2000-03-10 */ -#define TT_MAC_LANGID_GALICIAN 140 -#define TT_MAC_LANGID_AFRIKAANS 141 -#define TT_MAC_LANGID_BRETON 142 -#define TT_MAC_LANGID_INUKTITUT 143 -#define TT_MAC_LANGID_SCOTTISH_GAELIC 144 -#define TT_MAC_LANGID_MANX_GAELIC 145 -#define TT_MAC_LANGID_IRISH_GAELIC 146 -#define TT_MAC_LANGID_TONGAN 147 -#define TT_MAC_LANGID_GREEK_POLYTONIC 148 -#define TT_MAC_LANGID_GREELANDIC 149 -#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150 - - - /*************************************************************************/ - /* */ - /* Possible values of the language identifier field in the name records */ - /* of the TTF `name' table if the `platform' identifier code is */ - /* TT_PLATFORM_MICROSOFT. */ - /* */ - /* The canonical source for the MS assigned LCIDs is */ - /* */ - /* http://www.microsoft.com/globaldev/reference/lcid-all.mspx */ - /* */ - -#define TT_MS_LANGID_ARABIC_GENERAL 0x0001 -#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 -#define TT_MS_LANGID_ARABIC_IRAQ 0x0801 -#define TT_MS_LANGID_ARABIC_EGYPT 0x0C01 -#define TT_MS_LANGID_ARABIC_LIBYA 0x1001 -#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401 -#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801 -#define TT_MS_LANGID_ARABIC_TUNISIA 0x1C01 -#define TT_MS_LANGID_ARABIC_OMAN 0x2001 -#define TT_MS_LANGID_ARABIC_YEMEN 0x2401 -#define TT_MS_LANGID_ARABIC_SYRIA 0x2801 -#define TT_MS_LANGID_ARABIC_JORDAN 0x2C01 -#define TT_MS_LANGID_ARABIC_LEBANON 0x3001 -#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401 -#define TT_MS_LANGID_ARABIC_UAE 0x3801 -#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3C01 -#define TT_MS_LANGID_ARABIC_QATAR 0x4001 -#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 -#define TT_MS_LANGID_CATALAN_SPAIN 0x0403 -#define TT_MS_LANGID_CHINESE_GENERAL 0x0004 -#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 -#define TT_MS_LANGID_CHINESE_PRC 0x0804 -#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0C04 -#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 - -#if 1 /* this looks like the correct value */ -#define TT_MS_LANGID_CHINESE_MACAU 0x1404 -#else /* but beware, Microsoft may change its mind... - the most recent Word reference has the following: */ -#define TT_MS_LANGID_CHINESE_MACAU TT_MS_LANGID_CHINESE_HONG_KONG -#endif - -#if 0 /* used only with .NET `cultures'; commented out */ -#define TT_MS_LANGID_CHINESE_TRADITIONAL 0x7C04 -#endif - -#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 -#define TT_MS_LANGID_DANISH_DENMARK 0x0406 -#define TT_MS_LANGID_GERMAN_GERMANY 0x0407 -#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 -#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0C07 -#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 -#define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407 -#define TT_MS_LANGID_GREEK_GREECE 0x0408 - - /* don't ask what this one means... It is commented out currently. */ -#if 0 -#define TT_MS_LANGID_GREEK_GREECE2 0x2008 -#endif - -#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 -#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 -#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 -#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0C09 -#define TT_MS_LANGID_ENGLISH_CANADA 0x1009 -#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409 -#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809 -#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1C09 -#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009 -#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409 -#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809 -#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2C09 -#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 -#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 -#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809 -#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3C09 -#define TT_MS_LANGID_ENGLISH_INDIA 0x4009 -#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409 -#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809 -#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040A -#define TT_MS_LANGID_SPANISH_MEXICO 0x080A -#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0C0A -#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100A -#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140A -#define TT_MS_LANGID_SPANISH_PANAMA 0x180A -#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1C0A -#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200A -#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240A -#define TT_MS_LANGID_SPANISH_PERU 0x280A -#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2C0A -#define TT_MS_LANGID_SPANISH_ECUADOR 0x300A -#define TT_MS_LANGID_SPANISH_CHILE 0x340A -#define TT_MS_LANGID_SPANISH_URUGUAY 0x380A -#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3C0A -#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400A -#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440A -#define TT_MS_LANGID_SPANISH_HONDURAS 0x480A -#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4C0A -#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500A -#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540A - /* The following ID blatantly violate MS specs by using a */ - /* sublanguage > 0x1F. */ -#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40AU -#define TT_MS_LANGID_FINNISH_FINLAND 0x040B -#define TT_MS_LANGID_FRENCH_FRANCE 0x040C -#define TT_MS_LANGID_FRENCH_BELGIUM 0x080C -#define TT_MS_LANGID_FRENCH_CANADA 0x0C0C -#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100C -#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140C -#define TT_MS_LANGID_FRENCH_MONACO 0x180C -#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1C0C -#define TT_MS_LANGID_FRENCH_REUNION 0x200C -#define TT_MS_LANGID_FRENCH_CONGO 0x240C - /* which was formerly: */ -#define TT_MS_LANGID_FRENCH_ZAIRE TT_MS_LANGID_FRENCH_CONGO -#define TT_MS_LANGID_FRENCH_SENEGAL 0x280C -#define TT_MS_LANGID_FRENCH_CAMEROON 0x2C0C -#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300C -#define TT_MS_LANGID_FRENCH_MALI 0x340C -#define TT_MS_LANGID_FRENCH_MOROCCO 0x380C -#define TT_MS_LANGID_FRENCH_HAITI 0x3C0C - /* and another violation of the spec (see 0xE40AU) */ -#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40CU -#define TT_MS_LANGID_HEBREW_ISRAEL 0x040D -#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040E -#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040F -#define TT_MS_LANGID_ITALIAN_ITALY 0x0410 -#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 -#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 -#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412 -#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 -#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 -#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 -#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 -#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814 -#define TT_MS_LANGID_POLISH_POLAND 0x0415 -#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 -#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 -#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417 -#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 -#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 -#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 -#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 -#define TT_MS_LANGID_CROATIAN_CROATIA 0x041A -#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081A -#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0C1A - -#if 0 /* this used to be this value, but it looks like we were wrong */ -#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x101A -#else /* current sources say */ -#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101A -#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141A - /* and XPsp2 Platform SDK added (2004-07-26) */ - /* Names are shortened to be significant within 40 chars. */ -#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181A -#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x181A -#endif - -#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041B -#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041C -#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041D -#define TT_MS_LANGID_SWEDISH_FINLAND 0x081D -#define TT_MS_LANGID_THAI_THAILAND 0x041E -#define TT_MS_LANGID_TURKISH_TURKEY 0x041F -#define TT_MS_LANGID_URDU_PAKISTAN 0x0420 -#define TT_MS_LANGID_URDU_INDIA 0x0820 -#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 -#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 -#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 -#define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424 -#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 -#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 -#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 -#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 -#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428 -#define TT_MS_LANGID_FARSI_IRAN 0x0429 -#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042A -#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042B -#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042C -#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082C -#define TT_MS_LANGID_BASQUE_SPAIN 0x042D -#define TT_MS_LANGID_SORBIAN_GERMANY 0x042E -#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042F -#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 -#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 -#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432 -#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 -#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434 -#define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435 -#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 -#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 -#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 -#define TT_MS_LANGID_HINDI_INDIA 0x0439 -#define TT_MS_LANGID_MALTESE_MALTA 0x043A - /* Added by XPsp2 Platform SDK (2004-07-26) */ -#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043B -#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083B -#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3B -#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103B -#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143B -#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183B -#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3B -#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203B -#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243B - /* ... and we also keep our old identifier... */ -#define TT_MS_LANGID_SAAMI_LAPONIA 0x043B - -#if 0 /* this seems to be a previous inversion */ -#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043C -#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083C -#else -#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083C -#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043C -#endif - -#define TT_MS_LANGID_YIDDISH_GERMANY 0x043D -#define TT_MS_LANGID_MALAY_MALAYSIA 0x043E -#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083E -#define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043F -#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440 - /* alias declared in Windows 2000 */ -#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ - TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN - -#define TT_MS_LANGID_SWAHILI_KENYA 0x0441 -#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442 -#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 -#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 -#define TT_MS_LANGID_TATAR_TATARSTAN 0x0444 -#define TT_MS_LANGID_BENGALI_INDIA 0x0445 -#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845 -#define TT_MS_LANGID_PUNJABI_INDIA 0x0446 -#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 -#define TT_MS_LANGID_GUJARATI_INDIA 0x0447 -#define TT_MS_LANGID_ORIYA_INDIA 0x0448 -#define TT_MS_LANGID_TAMIL_INDIA 0x0449 -#define TT_MS_LANGID_TELUGU_INDIA 0x044A -#define TT_MS_LANGID_KANNADA_INDIA 0x044B -#define TT_MS_LANGID_MALAYALAM_INDIA 0x044C -#define TT_MS_LANGID_ASSAMESE_INDIA 0x044D -#define TT_MS_LANGID_MARATHI_INDIA 0x044E -#define TT_MS_LANGID_SANSKRIT_INDIA 0x044F -#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450 -#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN 0x0850 -#define TT_MS_LANGID_TIBETAN_CHINA 0x0451 - /* Don't use the next constant! It has */ - /* (1) the wrong spelling (Dzonghka) */ - /* (2) Microsoft doesn't officially define it -- */ - /* at least it is not in the List of Local */ - /* ID Values. */ - /* (3) Dzongkha is not the same language as */ - /* Tibetan, so merging it is wrong anyway. */ - /* */ - /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW. */ -#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 - -#if 0 - /* the following used to be defined */ -#define TT_MS_LANGID_TIBETAN_BHUTAN 0x0451 - /* ... but it was changed; */ -#else - /* So we will continue to #define it, but with the correct value */ -#define TT_MS_LANGID_TIBETAN_BHUTAN TT_MS_LANGID_DZONGHKA_BHUTAN -#endif - -#define TT_MS_LANGID_WELSH_WALES 0x0452 -#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453 -#define TT_MS_LANGID_LAO_LAOS 0x0454 -#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 -#define TT_MS_LANGID_GALICIAN_SPAIN 0x0456 -#define TT_MS_LANGID_KONKANI_INDIA 0x0457 -#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458 -#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459 -#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859 - /* Missing a LCID for Sindhi in Devanagari script */ -#define TT_MS_LANGID_SYRIAC_SYRIA 0x045A -#define TT_MS_LANGID_SINHALESE_SRI_LANKA 0x045B -#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045C -#define TT_MS_LANGID_INUKTITUT_CANADA 0x045D -#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045E -#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045F -#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN 0x085F - /* Missing a LCID for Tifinagh script */ -#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460 - /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */ - /* script is yet unclear... might be Arabic, Nagari or Sharada */ -#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860 - /* ... and aliased (by MS) for compatibility reasons. */ -#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA -#define TT_MS_LANGID_NEPALI_NEPAL 0x0461 -#define TT_MS_LANGID_NEPALI_INDIA 0x0861 -#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462 -#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463 -#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464 -#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465 - /* alias declared in Windows 2000 */ -#define TT_MS_LANGID_DIVEHI_MALDIVES TT_MS_LANGID_DHIVEHI_MALDIVES -#define TT_MS_LANGID_EDO_NIGERIA 0x0466 -#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 -#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468 -#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 -#define TT_MS_LANGID_YORUBA_NIGERIA 0x046A -#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046B -#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086B -#define TT_MS_LANGID_QUECHUA_PERU 0x0C6B -#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA 0x046C - /* Also spelled by XPsp2 Platform SDK (2004-07-26) */ -#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \ - TT_MS_LANGID_SEPEDI_SOUTH_AFRICA - /* language codes 0x046D, 0x046E and 0x046F are (still) unknown. */ -#define TT_MS_LANGID_IGBO_NIGERIA 0x0470 -#define TT_MS_LANGID_KANURI_NIGERIA 0x0471 -#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472 -#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473 -#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873 - /* also spelled in the `Passport SDK' list as: */ -#define TT_MS_LANGID_TIGRIGNA_ERYTREA TT_MS_LANGID_TIGRIGNA_ERYTHREA -#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474 -#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475 -#define TT_MS_LANGID_LATIN 0x0476 -#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477 - /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */ - /* not written (but OTOH the peculiar writing system is worth */ - /* studying). */ -#define TT_MS_LANGID_YI_CHINA 0x0478 -#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479 - /* language codes from 0x047A to 0x047F are (still) unknown. */ -#define TT_MS_LANGID_UIGHUR_CHINA 0x0480 -#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481 - -#if 0 /* not deemed useful for fonts */ -#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE 0x04FF -#endif - - - /*************************************************************************/ - /* */ - /* Possible values of the `name' identifier field in the name records of */ - /* the TTF `name' table. These values are platform independent. */ - /* */ -#define TT_NAME_ID_COPYRIGHT 0 -#define TT_NAME_ID_FONT_FAMILY 1 -#define TT_NAME_ID_FONT_SUBFAMILY 2 -#define TT_NAME_ID_UNIQUE_ID 3 -#define TT_NAME_ID_FULL_NAME 4 -#define TT_NAME_ID_VERSION_STRING 5 -#define TT_NAME_ID_PS_NAME 6 -#define TT_NAME_ID_TRADEMARK 7 - - /* the following values are from the OpenType spec */ -#define TT_NAME_ID_MANUFACTURER 8 -#define TT_NAME_ID_DESIGNER 9 -#define TT_NAME_ID_DESCRIPTION 10 -#define TT_NAME_ID_VENDOR_URL 11 -#define TT_NAME_ID_DESIGNER_URL 12 -#define TT_NAME_ID_LICENSE 13 -#define TT_NAME_ID_LICENSE_URL 14 - /* number 15 is reserved */ -#define TT_NAME_ID_PREFERRED_FAMILY 16 -#define TT_NAME_ID_PREFERRED_SUBFAMILY 17 -#define TT_NAME_ID_MAC_FULL_NAME 18 - - /* The following code is new as of 2000-01-21 */ -#define TT_NAME_ID_SAMPLE_TEXT 19 - - /* This is new in OpenType 1.3 */ -#define TT_NAME_ID_CID_FINDFONT_NAME 20 - - /* This is new in OpenType 1.5 */ -#define TT_NAME_ID_WWS_FAMILY 21 -#define TT_NAME_ID_WWS_SUBFAMILY 22 - - - /*************************************************************************/ - /* */ - /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */ - /* */ - /* Updated 08-Nov-2008. */ - /* */ - - /* Bit 0 Basic Latin */ -#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */ - /* Bit 1 C1 Controls and Latin-1 Supplement */ -#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */ - /* Bit 2 Latin Extended-A */ -#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */ - /* Bit 3 Latin Extended-B */ -#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */ - /* Bit 4 IPA Extensions */ - /* Phonetic Extensions */ - /* Phonetic Extensions Supplement */ -#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */ - /* U+1D00-U+1D7F */ - /* U+1D80-U+1DBF */ - /* Bit 5 Spacing Modifier Letters */ - /* Modifier Tone Letters */ -#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */ - /* U+A700-U+A71F */ - /* Bit 6 Combining Diacritical Marks */ - /* Combining Diacritical Marks Supplement */ -#define TT_UCR_COMBINING_DIACRITICS (1L << 6) /* U+0300-U+036F */ - /* U+1DC0-U+1DFF */ - /* Bit 7 Greek and Coptic */ -#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ - /* Bit 8 Coptic */ -#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */ - /* Bit 9 Cyrillic */ - /* Cyrillic Supplement */ - /* Cyrillic Extended-A */ - /* Cyrillic Extended-B */ -#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ - /* U+0500-U+052F */ - /* U+2DE0-U+2DFF */ - /* U+A640-U+A69F */ - /* Bit 10 Armenian */ -#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */ - /* Bit 11 Hebrew */ -#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */ - /* Bit 12 Vai */ -#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */ - /* Bit 13 Arabic */ - /* Arabic Supplement */ -#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */ - /* U+0750-U+077F */ - /* Bit 14 NKo */ -#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */ - /* Bit 15 Devanagari */ -#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */ - /* Bit 16 Bengali */ -#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */ - /* Bit 17 Gurmukhi */ -#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */ - /* Bit 18 Gujarati */ -#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */ - /* Bit 19 Oriya */ -#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */ - /* Bit 20 Tamil */ -#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */ - /* Bit 21 Telugu */ -#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */ - /* Bit 22 Kannada */ -#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */ - /* Bit 23 Malayalam */ -#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */ - /* Bit 24 Thai */ -#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */ - /* Bit 25 Lao */ -#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */ - /* Bit 26 Georgian */ - /* Georgian Supplement */ -#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */ - /* U+2D00-U+2D2F */ - /* Bit 27 Balinese */ -#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */ - /* Bit 28 Hangul Jamo */ -#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */ - /* Bit 29 Latin Extended Additional */ - /* Latin Extended-C */ - /* Latin Extended-D */ -#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */ - /* U+2C60-U+2C7F */ - /* U+A720-U+A7FF */ - /* Bit 30 Greek Extended */ -#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */ - /* Bit 31 General Punctuation */ - /* Supplemental Punctuation */ -#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ - /* U+2E00-U+2E7F */ - /* Bit 32 Superscripts And Subscripts */ -#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */ - /* Bit 33 Currency Symbols */ -#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */ - /* Bit 34 Combining Diacritical Marks For Symbols */ -#define TT_UCR_COMBINING_DIACRITICS_SYMB (1L << 2) /* U+20D0-U+20FF */ - /* Bit 35 Letterlike Symbols */ -#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */ - /* Bit 36 Number Forms */ -#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */ - /* Bit 37 Arrows */ - /* Supplemental Arrows-A */ - /* Supplemental Arrows-B */ - /* Miscellaneous Symbols and Arrows */ -#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ - /* U+27F0-U+27FF */ - /* U+2900-U+297F */ - /* U+2B00-U+2BFF */ - /* Bit 38 Mathematical Operators */ - /* Supplemental Mathematical Operators */ - /* Miscellaneous Mathematical Symbols-A */ - /* Miscellaneous Mathematical Symbols-B */ -#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */ - /* U+2A00-U+2AFF */ - /* U+27C0-U+27EF */ - /* U+2980-U+29FF */ - /* Bit 39 Miscellaneous Technical */ -#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */ - /* Bit 40 Control Pictures */ -#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */ - /* Bit 41 Optical Character Recognition */ -#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */ - /* Bit 42 Enclosed Alphanumerics */ -#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */ - /* Bit 43 Box Drawing */ -#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */ - /* Bit 44 Block Elements */ -#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */ - /* Bit 45 Geometric Shapes */ -#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */ - /* Bit 46 Miscellaneous Symbols */ -#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */ - /* Bit 47 Dingbats */ -#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */ - /* Bit 48 CJK Symbols and Punctuation */ -#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */ - /* Bit 49 Hiragana */ -#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */ - /* Bit 50 Katakana */ - /* Katakana Phonetic Extensions */ -#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */ - /* U+31F0-U+31FF */ - /* Bit 51 Bopomofo */ - /* Bopomofo Extended */ -#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */ - /* U+31A0-U+31BF */ - /* Bit 52 Hangul Compatibility Jamo */ -#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */ - /* Bit 53 Phags-Pa */ -#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */ -#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */ -#define TT_UCR_PHAGSPA - /* Bit 54 Enclosed CJK Letters and Months */ -#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */ - /* Bit 55 CJK Compatibility */ -#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */ - /* Bit 56 Hangul Syllables */ -#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */ - /* Bit 57 High Surrogates */ - /* High Private Use Surrogates */ - /* Low Surrogates */ - /* */ - /* According to OpenType specs v.1.3+, */ - /* setting bit 57 implies that there is */ - /* at least one codepoint beyond the */ - /* Basic Multilingual Plane that is */ - /* supported by this font. So it really */ - /* means >= U+10000 */ -#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ - /* U+DB80-U+DBFF */ - /* U+DC00-U+DFFF */ -#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES - /* Bit 58 Phoenician */ -#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/ - /* Bit 59 CJK Unified Ideographs */ - /* CJK Radicals Supplement */ - /* Kangxi Radicals */ - /* Ideographic Description Characters */ - /* CJK Unified Ideographs Extension A */ - /* CJK Unified Ideographs Extension B */ - /* Kanbun */ -#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */ - /* U+2E80-U+2EFF */ - /* U+2F00-U+2FDF */ - /* U+2FF0-U+2FFF */ - /* U+3400-U+4DB5 */ - /*U+20000-U+2A6DF*/ - /* U+3190-U+319F */ - /* Bit 60 Private Use */ -#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */ - /* Bit 61 CJK Strokes */ - /* CJK Compatibility Ideographs */ - /* CJK Compatibility Ideographs Supplement */ -#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */ - /* U+F900-U+FAFF */ - /*U+2F800-U+2FA1F*/ - /* Bit 62 Alphabetic Presentation Forms */ -#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */ - /* Bit 63 Arabic Presentation Forms-A */ -#define TT_UCR_ARABIC_PRESENTATIONS_A (1L << 31) /* U+FB50-U+FDFF */ - /* Bit 64 Combining Half Marks */ -#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */ - /* Bit 65 Vertical forms */ - /* CJK Compatibility Forms */ -#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */ - /* U+FE30-U+FE4F */ - /* Bit 66 Small Form Variants */ -#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */ - /* Bit 67 Arabic Presentation Forms-B */ -#define TT_UCR_ARABIC_PRESENTATIONS_B (1L << 3) /* U+FE70-U+FEFE */ - /* Bit 68 Halfwidth and Fullwidth Forms */ -#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */ - /* Bit 69 Specials */ -#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */ - /* Bit 70 Tibetan */ -#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */ - /* Bit 71 Syriac */ -#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */ - /* Bit 72 Thaana */ -#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */ - /* Bit 73 Sinhala */ -#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */ - /* Bit 74 Myanmar */ -#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */ - /* Bit 75 Ethiopic */ - /* Ethiopic Supplement */ - /* Ethiopic Extended */ -#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */ - /* U+1380-U+139F */ - /* U+2D80-U+2DDF */ - /* Bit 76 Cherokee */ -#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */ - /* Bit 77 Unified Canadian Aboriginal Syllabics */ -#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */ - /* Bit 78 Ogham */ -#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */ - /* Bit 79 Runic */ -#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */ - /* Bit 80 Khmer */ - /* Khmer Symbols */ -#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */ - /* U+19E0-U+19FF */ - /* Bit 81 Mongolian */ -#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */ - /* Bit 82 Braille Patterns */ -#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */ - /* Bit 83 Yi Syllables */ - /* Yi Radicals */ -#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */ - /* U+A490-U+A4CF */ - /* Bit 84 Tagalog */ - /* Hanunoo */ - /* Buhid */ - /* Tagbanwa */ -#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */ - /* U+1720-U+173F */ - /* U+1740-U+175F */ - /* U+1760-U+177F */ - /* Bit 85 Old Italic */ -#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/ - /* Bit 86 Gothic */ -#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/ - /* Bit 87 Deseret */ -#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/ - /* Bit 88 Byzantine Musical Symbols */ - /* Musical Symbols */ - /* Ancient Greek Musical Notation */ -#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/ - /*U+1D100-U+1D1FF*/ - /*U+1D200-U+1D24F*/ - /* Bit 89 Mathematical Alphanumeric Symbols */ -#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/ - /* Bit 90 Private Use (plane 15) */ - /* Private Use (plane 16) */ -#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/ - /*U+100000-U+10FFFD*/ - /* Bit 91 Variation Selectors */ - /* Variation Selectors Supplement */ -#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */ - /*U+E0100-U+E01EF*/ - /* Bit 92 Tags */ -#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/ - /* Bit 93 Limbu */ -#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */ - /* Bit 94 Tai Le */ -#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */ - /* Bit 95 New Tai Lue */ -#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */ - /* Bit 96 Buginese */ -#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */ - /* Bit 97 Glagolitic */ -#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */ - /* Bit 98 Tifinagh */ -#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */ - /* Bit 99 Yijing Hexagram Symbols */ -#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */ - /* Bit 100 Syloti Nagri */ -#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */ - /* Bit 101 Linear B Syllabary */ - /* Linear B Ideograms */ - /* Aegean Numbers */ -#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/ - /*U+10080-U+100FF*/ - /*U+10100-U+1013F*/ - /* Bit 102 Ancient Greek Numbers */ -#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/ - /* Bit 103 Ugaritic */ -#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/ - /* Bit 104 Old Persian */ -#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/ - /* Bit 105 Shavian */ -#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/ - /* Bit 106 Osmanya */ -#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/ - /* Bit 107 Cypriot Syllabary */ -#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/ - /* Bit 108 Kharoshthi */ -#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/ - /* Bit 109 Tai Xuan Jing Symbols */ -#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/ - /* Bit 110 Cuneiform */ - /* Cuneiform Numbers and Punctuation */ -#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/ - /*U+12400-U+1247F*/ - /* Bit 111 Counting Rod Numerals */ -#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/ - /* Bit 112 Sundanese */ -#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */ - /* Bit 113 Lepcha */ -#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */ - /* Bit 114 Ol Chiki */ -#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */ - /* Bit 115 Saurashtra */ -#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */ - /* Bit 116 Kayah Li */ -#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */ - /* Bit 117 Rejang */ -#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */ - /* Bit 118 Cham */ -#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */ - /* Bit 119 Ancient Symbols */ -#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/ - /* Bit 120 Phaistos Disc */ -#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/ - /* Bit 121 Carian */ - /* Lycian */ - /* Lydian */ -#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/ - /*U+10280-U+1029F*/ - /*U+10920-U+1093F*/ - /* Bit 122 Domino Tiles */ - /* Mahjong Tiles */ -#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/ - /*U+1F000-U+1F02F*/ - /* Bit 123-127 Reserved for process-internal usage */ - - - /*************************************************************************/ - /* */ - /* Some compilers have a very limited length of identifiers. */ - /* */ -#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ ) -#define HAVE_LIMIT_ON_IDENTS -#endif - - -#ifndef HAVE_LIMIT_ON_IDENTS - - - /*************************************************************************/ - /* */ - /* Here some alias #defines in order to be clearer. */ - /* */ - /* These are not always #defined to stay within the 31~character limit, */ - /* which some compilers have. */ - /* */ - /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern */ - /* Borland compilers (read: from BC++ 3.1 on) can increase this limit. */ - /* If you get a warning with such a compiler, use the -i40 switch. */ - /* */ -#define TT_UCR_ARABIC_PRESENTATION_FORMS_A \ - TT_UCR_ARABIC_PRESENTATIONS_A -#define TT_UCR_ARABIC_PRESENTATION_FORMS_B \ - TT_UCR_ARABIC_PRESENTATIONS_B - -#define TT_UCR_COMBINING_DIACRITICAL_MARKS \ - TT_UCR_COMBINING_DIACRITICS -#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ - TT_UCR_COMBINING_DIACRITICS_SYMB - - -#endif /* !HAVE_LIMIT_ON_IDENTS */ - - -FT_END_HEADER - -#endif /* __TTNAMEID_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/tttables.h b/3party/freetype/include/freetype/tttables.h deleted file mode 100644 index 1568f40364..0000000000 --- a/3party/freetype/include/freetype/tttables.h +++ /dev/null @@ -1,829 +0,0 @@ -/***************************************************************************/ -/* */ -/* tttables.h */ -/* */ -/* Basic SFNT/TrueType tables definitions and interface */ -/* (specification only). */ -/* */ -/* Copyright 1996-2015 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 __TTTABLES_H__ -#define __TTTABLES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - /*************************************************************************/ - /* */ - /* <Section> */ - /* truetype_tables */ - /* */ - /* <Title> */ - /* TrueType Tables */ - /* */ - /* <Abstract> */ - /* TrueType specific table types and functions. */ - /* */ - /* <Description> */ - /* This section contains the definition of TrueType-specific tables */ - /* as well as some routines used to access and process them. */ - /* */ - /* <Order> */ - /* TT_Header */ - /* TT_HoriHeader */ - /* TT_VertHeader */ - /* TT_OS2 */ - /* TT_Postscript */ - /* TT_PCLT */ - /* TT_MaxProfile */ - /* */ - /* FT_Sfnt_Tag */ - /* FT_Get_Sfnt_Table */ - /* FT_Load_Sfnt_Table */ - /* FT_Sfnt_Table_Info */ - /* */ - /* FT_Get_CMap_Language_ID */ - /* FT_Get_CMap_Format */ - /* */ - /* FT_PARAM_TAG_UNPATENTED_HINTING */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_Header */ - /* */ - /* <Description> */ - /* A structure used to model a TrueType font header table. All */ - /* fields follow the TrueType specification. */ - /* */ - typedef struct TT_Header_ - { - FT_Fixed Table_Version; - FT_Fixed Font_Revision; - - FT_Long CheckSum_Adjust; - FT_Long Magic_Number; - - FT_UShort Flags; - FT_UShort Units_Per_EM; - - FT_Long Created [2]; - FT_Long Modified[2]; - - FT_Short xMin; - FT_Short yMin; - FT_Short xMax; - FT_Short yMax; - - FT_UShort Mac_Style; - FT_UShort Lowest_Rec_PPEM; - - FT_Short Font_Direction; - FT_Short Index_To_Loc_Format; - FT_Short Glyph_Data_Format; - - } TT_Header; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_HoriHeader */ - /* */ - /* <Description> */ - /* A structure used to model a TrueType horizontal header, the `hhea' */ - /* table, as well as the corresponding horizontal metrics table, */ - /* i.e., the `hmtx' table. */ - /* */ - /* <Fields> */ - /* Version :: The table version. */ - /* */ - /* Ascender :: The font's ascender, i.e., the distance */ - /* from the baseline to the top-most of all */ - /* glyph points found in the font. */ - /* */ - /* This value is invalid in many fonts, as */ - /* it is usually set by the font designer, */ - /* and often reflects only a portion of the */ - /* glyphs found in the font (maybe ASCII). */ - /* */ - /* You should use the `sTypoAscender' field */ - /* of the OS/2 table instead if you want */ - /* the correct one. */ - /* */ - /* Descender :: The font's descender, i.e., the distance */ - /* from the baseline to the bottom-most of */ - /* all glyph points found in the font. It */ - /* is negative. */ - /* */ - /* This value is invalid in many fonts, as */ - /* it is usually set by the font designer, */ - /* and often reflects only a portion of the */ - /* glyphs found in the font (maybe ASCII). */ - /* */ - /* You should use the `sTypoDescender' */ - /* field of the OS/2 table instead if you */ - /* want the correct one. */ - /* */ - /* Line_Gap :: The font's line gap, i.e., the distance */ - /* to add to the ascender and descender to */ - /* get the BTB, i.e., the */ - /* baseline-to-baseline distance for the */ - /* font. */ - /* */ - /* advance_Width_Max :: This field is the maximum of all advance */ - /* widths found in the font. It can be */ - /* used to compute the maximum width of an */ - /* arbitrary string of text. */ - /* */ - /* min_Left_Side_Bearing :: The minimum left side bearing of all */ - /* glyphs within the font. */ - /* */ - /* min_Right_Side_Bearing :: The minimum right side bearing of all */ - /* glyphs within the font. */ - /* */ - /* xMax_Extent :: The maximum horizontal extent (i.e., the */ - /* `width' of a glyph's bounding box) for */ - /* all glyphs in the font. */ - /* */ - /* caret_Slope_Rise :: The rise coefficient of the cursor's */ - /* slope of the cursor (slope=rise/run). */ - /* */ - /* caret_Slope_Run :: The run coefficient of the cursor's */ - /* slope. */ - /* */ - /* Reserved :: 8~reserved bytes. */ - /* */ - /* metric_Data_Format :: Always~0. */ - /* */ - /* number_Of_HMetrics :: Number of HMetrics entries in the `hmtx' */ - /* table -- this value can be smaller than */ - /* the total number of glyphs in the font. */ - /* */ - /* long_metrics :: A pointer into the `hmtx' table. */ - /* */ - /* short_metrics :: A pointer into the `hmtx' table. */ - /* */ - /* <Note> */ - /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ - /* be identical except for the names of their fields, */ - /* which are different. */ - /* */ - /* This ensures that a single function in the `ttload' */ - /* module is able to read both the horizontal and vertical */ - /* headers. */ - /* */ - typedef struct TT_HoriHeader_ - { - FT_Fixed Version; - FT_Short Ascender; - FT_Short Descender; - FT_Short Line_Gap; - - FT_UShort advance_Width_Max; /* advance width maximum */ - - FT_Short min_Left_Side_Bearing; /* minimum left-sb */ - FT_Short min_Right_Side_Bearing; /* minimum right-sb */ - FT_Short xMax_Extent; /* xmax extents */ - FT_Short caret_Slope_Rise; - FT_Short caret_Slope_Run; - FT_Short caret_Offset; - - FT_Short Reserved[4]; - - FT_Short metric_Data_Format; - FT_UShort number_Of_HMetrics; - - /* The following fields are not defined by the TrueType specification */ - /* but they are used to connect the metrics header to the relevant */ - /* `HMTX' table. */ - - void* long_metrics; - void* short_metrics; - - } TT_HoriHeader; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_VertHeader */ - /* */ - /* <Description> */ - /* A structure used to model a TrueType vertical header, the `vhea' */ - /* table, as well as the corresponding vertical metrics table, i.e., */ - /* the `vmtx' table. */ - /* */ - /* <Fields> */ - /* Version :: The table version. */ - /* */ - /* Ascender :: The font's ascender, i.e., the distance */ - /* from the baseline to the top-most of */ - /* all glyph points found in the font. */ - /* */ - /* This value is invalid in many fonts, as */ - /* it is usually set by the font designer, */ - /* and often reflects only a portion of */ - /* the glyphs found in the font (maybe */ - /* ASCII). */ - /* */ - /* You should use the `sTypoAscender' */ - /* field of the OS/2 table instead if you */ - /* want the correct one. */ - /* */ - /* Descender :: The font's descender, i.e., the */ - /* distance from the baseline to the */ - /* bottom-most of all glyph points found */ - /* in the font. It is negative. */ - /* */ - /* This value is invalid in many fonts, as */ - /* it is usually set by the font designer, */ - /* and often reflects only a portion of */ - /* the glyphs found in the font (maybe */ - /* ASCII). */ - /* */ - /* You should use the `sTypoDescender' */ - /* field of the OS/2 table instead if you */ - /* want the correct one. */ - /* */ - /* Line_Gap :: The font's line gap, i.e., the distance */ - /* to add to the ascender and descender to */ - /* get the BTB, i.e., the */ - /* baseline-to-baseline distance for the */ - /* font. */ - /* */ - /* advance_Height_Max :: This field is the maximum of all */ - /* advance heights found in the font. It */ - /* can be used to compute the maximum */ - /* height of an arbitrary string of text. */ - /* */ - /* min_Top_Side_Bearing :: The minimum top side bearing of all */ - /* glyphs within the font. */ - /* */ - /* min_Bottom_Side_Bearing :: The minimum bottom side bearing of all */ - /* glyphs within the font. */ - /* */ - /* yMax_Extent :: The maximum vertical extent (i.e., the */ - /* `height' of a glyph's bounding box) for */ - /* all glyphs in the font. */ - /* */ - /* caret_Slope_Rise :: The rise coefficient of the cursor's */ - /* slope of the cursor (slope=rise/run). */ - /* */ - /* caret_Slope_Run :: The run coefficient of the cursor's */ - /* slope. */ - /* */ - /* caret_Offset :: The cursor's offset for slanted fonts. */ - /* This value is `reserved' in vmtx */ - /* version 1.0. */ - /* */ - /* Reserved :: 8~reserved bytes. */ - /* */ - /* metric_Data_Format :: Always~0. */ - /* */ - /* number_Of_HMetrics :: Number of VMetrics entries in the */ - /* `vmtx' table -- this value can be */ - /* smaller than the total number of glyphs */ - /* in the font. */ - /* */ - /* long_metrics :: A pointer into the `vmtx' table. */ - /* */ - /* short_metrics :: A pointer into the `vmtx' table. */ - /* */ - /* <Note> */ - /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ - /* be identical except for the names of their fields, */ - /* which are different. */ - /* */ - /* This ensures that a single function in the `ttload' */ - /* module is able to read both the horizontal and vertical */ - /* headers. */ - /* */ - typedef struct TT_VertHeader_ - { - FT_Fixed Version; - FT_Short Ascender; - FT_Short Descender; - FT_Short Line_Gap; - - FT_UShort advance_Height_Max; /* advance height maximum */ - - FT_Short min_Top_Side_Bearing; /* minimum left-sb or top-sb */ - FT_Short min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb */ - FT_Short yMax_Extent; /* xmax or ymax extents */ - FT_Short caret_Slope_Rise; - FT_Short caret_Slope_Run; - FT_Short caret_Offset; - - FT_Short Reserved[4]; - - FT_Short metric_Data_Format; - FT_UShort number_Of_VMetrics; - - /* The following fields are not defined by the TrueType specification */ - /* but they're used to connect the metrics header to the relevant */ - /* `HMTX' or `VMTX' table. */ - - void* long_metrics; - void* short_metrics; - - } TT_VertHeader; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_OS2 */ - /* */ - /* <Description> */ - /* A structure used to model a TrueType OS/2 table. All fields */ - /* comply to the OpenType specification. */ - /* */ - /* Note that we now support old Mac fonts that do not include an OS/2 */ - /* table. In this case, the `version' field is always set to 0xFFFF. */ - /* */ - typedef struct TT_OS2_ - { - FT_UShort version; /* 0x0001 - more or 0xFFFF */ - FT_Short xAvgCharWidth; - FT_UShort usWeightClass; - FT_UShort usWidthClass; - FT_UShort fsType; - FT_Short ySubscriptXSize; - FT_Short ySubscriptYSize; - FT_Short ySubscriptXOffset; - FT_Short ySubscriptYOffset; - FT_Short ySuperscriptXSize; - FT_Short ySuperscriptYSize; - FT_Short ySuperscriptXOffset; - FT_Short ySuperscriptYOffset; - FT_Short yStrikeoutSize; - FT_Short yStrikeoutPosition; - FT_Short sFamilyClass; - - FT_Byte panose[10]; - - FT_ULong ulUnicodeRange1; /* Bits 0-31 */ - FT_ULong ulUnicodeRange2; /* Bits 32-63 */ - FT_ULong ulUnicodeRange3; /* Bits 64-95 */ - FT_ULong ulUnicodeRange4; /* Bits 96-127 */ - - FT_Char achVendID[4]; - - FT_UShort fsSelection; - FT_UShort usFirstCharIndex; - FT_UShort usLastCharIndex; - FT_Short sTypoAscender; - FT_Short sTypoDescender; - FT_Short sTypoLineGap; - FT_UShort usWinAscent; - FT_UShort usWinDescent; - - /* only version 1 and higher: */ - - FT_ULong ulCodePageRange1; /* Bits 0-31 */ - FT_ULong ulCodePageRange2; /* Bits 32-63 */ - - /* only version 2 and higher: */ - - FT_Short sxHeight; - FT_Short sCapHeight; - FT_UShort usDefaultChar; - FT_UShort usBreakChar; - FT_UShort usMaxContext; - - /* only version 5 and higher: */ - - FT_UShort usLowerOpticalPointSize; /* in twips (1/20th points) */ - FT_UShort usUpperOpticalPointSize; /* in twips (1/20th points) */ - - } TT_OS2; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_Postscript */ - /* */ - /* <Description> */ - /* A structure used to model a TrueType PostScript table. All fields */ - /* comply to the TrueType specification. This structure does not */ - /* reference the PostScript glyph names, which can be nevertheless */ - /* accessed with the `ttpost' module. */ - /* */ - typedef struct TT_Postscript_ - { - FT_Fixed FormatType; - FT_Fixed italicAngle; - FT_Short underlinePosition; - FT_Short underlineThickness; - FT_ULong isFixedPitch; - FT_ULong minMemType42; - FT_ULong maxMemType42; - FT_ULong minMemType1; - FT_ULong maxMemType1; - - /* Glyph names follow in the file, but we don't */ - /* load them by default. See the ttpost.c file. */ - - } TT_Postscript; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_PCLT */ - /* */ - /* <Description> */ - /* A structure used to model a TrueType PCLT table. All fields */ - /* comply to the TrueType specification. */ - /* */ - typedef struct TT_PCLT_ - { - FT_Fixed Version; - FT_ULong FontNumber; - FT_UShort Pitch; - FT_UShort xHeight; - FT_UShort Style; - FT_UShort TypeFamily; - FT_UShort CapHeight; - FT_UShort SymbolSet; - FT_Char TypeFace[16]; - FT_Char CharacterComplement[8]; - FT_Char FileName[6]; - FT_Char StrokeWeight; - FT_Char WidthType; - FT_Byte SerifStyle; - FT_Byte Reserved; - - } TT_PCLT; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_MaxProfile */ - /* */ - /* <Description> */ - /* The maximum profile is a table containing many max values, which */ - /* can be used to pre-allocate arrays. This ensures that no memory */ - /* allocation occurs during a glyph load. */ - /* */ - /* <Fields> */ - /* version :: The version number. */ - /* */ - /* numGlyphs :: The number of glyphs in this TrueType */ - /* font. */ - /* */ - /* maxPoints :: The maximum number of points in a */ - /* non-composite TrueType glyph. See also */ - /* the structure element */ - /* `maxCompositePoints'. */ - /* */ - /* maxContours :: The maximum number of contours in a */ - /* non-composite TrueType glyph. See also */ - /* the structure element */ - /* `maxCompositeContours'. */ - /* */ - /* maxCompositePoints :: The maximum number of points in a */ - /* composite TrueType glyph. See also the */ - /* structure element `maxPoints'. */ - /* */ - /* maxCompositeContours :: The maximum number of contours in a */ - /* composite TrueType glyph. See also the */ - /* structure element `maxContours'. */ - /* */ - /* maxZones :: The maximum number of zones used for */ - /* glyph hinting. */ - /* */ - /* maxTwilightPoints :: The maximum number of points in the */ - /* twilight zone used for glyph hinting. */ - /* */ - /* maxStorage :: The maximum number of elements in the */ - /* storage area used for glyph hinting. */ - /* */ - /* maxFunctionDefs :: The maximum number of function */ - /* definitions in the TrueType bytecode for */ - /* this font. */ - /* */ - /* maxInstructionDefs :: The maximum number of instruction */ - /* definitions in the TrueType bytecode for */ - /* this font. */ - /* */ - /* maxStackElements :: The maximum number of stack elements used */ - /* during bytecode interpretation. */ - /* */ - /* maxSizeOfInstructions :: The maximum number of TrueType opcodes */ - /* used for glyph hinting. */ - /* */ - /* maxComponentElements :: The maximum number of simple (i.e., non- */ - /* composite) glyphs in a composite glyph. */ - /* */ - /* maxComponentDepth :: The maximum nesting depth of composite */ - /* glyphs. */ - /* */ - /* <Note> */ - /* This structure is only used during font loading. */ - /* */ - typedef struct TT_MaxProfile_ - { - FT_Fixed version; - FT_UShort numGlyphs; - FT_UShort maxPoints; - FT_UShort maxContours; - FT_UShort maxCompositePoints; - FT_UShort maxCompositeContours; - FT_UShort maxZones; - FT_UShort maxTwilightPoints; - FT_UShort maxStorage; - FT_UShort maxFunctionDefs; - FT_UShort maxInstructionDefs; - FT_UShort maxStackElements; - FT_UShort maxSizeOfInstructions; - FT_UShort maxComponentElements; - FT_UShort maxComponentDepth; - - } TT_MaxProfile; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Sfnt_Tag */ - /* */ - /* <Description> */ - /* An enumeration used to specify the index of an SFNT table. */ - /* Used in the @FT_Get_Sfnt_Table API function. */ - /* */ - /* <Values> */ - /* FT_SFNT_HEAD :: To access the font's @TT_Header structure. */ - /* */ - /* FT_SFNT_MAXP :: To access the font's @TT_MaxProfile structure. */ - /* */ - /* FT_SFNT_OS2 :: To access the font's @TT_OS2 structure. */ - /* */ - /* FT_SFNT_HHEA :: To access the font's @TT_HoriHeader structure. */ - /* */ - /* FT_SFNT_VHEA :: To access the font's @TT_VertHeader struture. */ - /* */ - /* FT_SFNT_POST :: To access the font's @TT_Postscript structure. */ - /* */ - /* FT_SFNT_PCLT :: To access the font's @TT_PCLT structure. */ - /* */ - typedef enum FT_Sfnt_Tag_ - { - FT_SFNT_HEAD, - FT_SFNT_MAXP, - FT_SFNT_OS2, - FT_SFNT_HHEA, - FT_SFNT_VHEA, - FT_SFNT_POST, - FT_SFNT_PCLT, - - FT_SFNT_MAX - - } FT_Sfnt_Tag; - - /* these constants are deprecated; use the corresponding `FT_Sfnt_Tag' */ - /* values instead */ -#define ft_sfnt_head FT_SFNT_HEAD -#define ft_sfnt_maxp FT_SFNT_MAXP -#define ft_sfnt_os2 FT_SFNT_OS2 -#define ft_sfnt_hhea FT_SFNT_HHEA -#define ft_sfnt_vhea FT_SFNT_VHEA -#define ft_sfnt_post FT_SFNT_POST -#define ft_sfnt_pclt FT_SFNT_PCLT - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Sfnt_Table */ - /* */ - /* <Description> */ - /* Return a pointer to a given SFNT table within a face. */ - /* */ - /* <Input> */ - /* face :: A handle to the source. */ - /* */ - /* tag :: The index of the SFNT table. */ - /* */ - /* <Return> */ - /* A type-less pointer to the table. This will be~0 in case of */ - /* error, or if the corresponding table was not found *OR* loaded */ - /* from the file. */ - /* */ - /* Use a typecast according to `tag' to access the structure */ - /* elements. */ - /* */ - /* <Note> */ - /* The table is owned by the face object and disappears with it. */ - /* */ - /* This function is only useful to access SFNT tables that are loaded */ - /* by the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for */ - /* a list. */ - /* */ - /* Here an example how to access the `vhea' table: */ - /* */ - /* { */ - /* TT_VertHeader* vert_header; */ - /* */ - /* */ - /* vert_header = */ - /* (TT_VertHeader*)FT_Get_Sfnt_Table( face, FT_SFNT_VHEA ); */ - /* } */ - /* */ - FT_EXPORT( void* ) - FT_Get_Sfnt_Table( FT_Face face, - FT_Sfnt_Tag tag ); - - - /************************************************************************** - * - * @function: - * FT_Load_Sfnt_Table - * - * @description: - * Load any font table into client memory. - * - * @input: - * face :: - * A handle to the source face. - * - * tag :: - * The four-byte tag of the table to load. Use the value~0 if you want - * to access the whole font file. Otherwise, you can use one of the - * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new - * one with @FT_MAKE_TAG. - * - * offset :: - * The starting offset in the table (or file if tag == 0). - * - * @output: - * buffer :: - * The target buffer address. The client must ensure that the memory - * array is big enough to hold the data. - * - * @inout: - * length :: - * If the `length' parameter is NULL, then try to load the whole table. - * Return an error code if it fails. - * - * Else, if `*length' is~0, exit immediately while returning the - * table's (or file) full size in it. - * - * Else the number of bytes to read from the table or file, from the - * starting offset. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * If you need to determine the table's length you should first call this - * function with `*length' set to~0, as in the following example: - * - * { - * FT_ULong length = 0; - * - * - * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); - * if ( error ) { ... table does not exist ... } - * - * buffer = malloc( length ); - * if ( buffer == NULL ) { ... not enough memory ... } - * - * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); - * if ( error ) { ... could not load table ... } - * } - * - * Note that structures like @TT_Header or @TT_OS2 can't be used with - * this function; they are limited to @FT_Get_Sfnt_Table. Reason is that - * those structures depend on the processor architecture, with varying - * size (e.g. 32bit vs. 64bit) or order (big endian vs. little endian). - * - */ - FT_EXPORT( FT_Error ) - FT_Load_Sfnt_Table( FT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte* buffer, - FT_ULong* length ); - - - /************************************************************************** - * - * @function: - * FT_Sfnt_Table_Info - * - * @description: - * Return information on an SFNT table. - * - * @input: - * face :: - * A handle to the source face. - * - * table_index :: - * The index of an SFNT table. The function returns - * FT_Err_Table_Missing for an invalid value. - * - * @inout: - * tag :: - * The name tag of the SFNT table. If the value is NULL, `table_index' - * is ignored, and `length' returns the number of SFNT tables in the - * font. - * - * @output: - * length :: - * The length of the SFNT table (or the number of SFNT tables, depending - * on `tag'). - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * While parsing fonts, FreeType handles SFNT tables with length zero as - * missing. - * - */ - FT_EXPORT( FT_Error ) - FT_Sfnt_Table_Info( FT_Face face, - FT_UInt table_index, - FT_ULong *tag, - FT_ULong *length ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_CMap_Language_ID */ - /* */ - /* <Description> */ - /* Return TrueType/sfnt specific cmap language ID. Definitions of */ - /* language ID values are in `ttnameid.h'. */ - /* */ - /* <Input> */ - /* charmap :: */ - /* The target charmap. */ - /* */ - /* <Return> */ - /* The language ID of `charmap'. If `charmap' doesn't belong to a */ - /* TrueType/sfnt face, just return~0 as the default value. */ - /* */ - /* For a format~14 cmap (to access Unicode IVS), the return value is */ - /* 0xFFFFFFFF. */ - /* */ - FT_EXPORT( FT_ULong ) - FT_Get_CMap_Language_ID( FT_CharMap charmap ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_CMap_Format */ - /* */ - /* <Description> */ - /* Return TrueType/sfnt specific cmap format. */ - /* */ - /* <Input> */ - /* charmap :: */ - /* The target charmap. */ - /* */ - /* <Return> */ - /* The format of `charmap'. If `charmap' doesn't belong to a */ - /* TrueType/sfnt face, return -1. */ - /* */ - FT_EXPORT( FT_Long ) - FT_Get_CMap_Format( FT_CharMap charmap ); - - /* */ - - -FT_END_HEADER - -#endif /* __TTTABLES_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/tttags.h b/3party/freetype/include/freetype/tttags.h deleted file mode 100644 index 3836c7bbfd..0000000000 --- a/3party/freetype/include/freetype/tttags.h +++ /dev/null @@ -1,111 +0,0 @@ -/***************************************************************************/ -/* */ -/* tttags.h */ -/* */ -/* Tags for TrueType and OpenType tables (specification only). */ -/* */ -/* Copyright 1996-2015 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 __TTAGS_H__ -#define __TTAGS_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - -#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' ) -#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' ) -#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' ) -#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' ) -#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' ) -#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' ) -#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' ) -#define TTAG_CBDT FT_MAKE_TAG( 'C', 'B', 'D', 'T' ) -#define TTAG_CBLC FT_MAKE_TAG( 'C', 'B', 'L', 'C' ) -#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) -#define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' ) -#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) -#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' ) -#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' ) -#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' ) -#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' ) -#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' ) -#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' ) -#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' ) -#define TTAG_FOND FT_MAKE_TAG( 'F', 'O', 'N', 'D' ) -#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' ) -#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' ) -#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' ) -#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' ) -#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' ) -#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) -#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) -#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' ) -#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' ) -#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' ) -#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' ) -#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' ) -#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' ) -#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' ) -#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' ) -#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' ) -#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' ) -#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' ) -#define TTAG_LWFN FT_MAKE_TAG( 'L', 'W', 'F', 'N' ) -#define TTAG_MATH FT_MAKE_TAG( 'M', 'A', 'T', 'H' ) -#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' ) -#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' ) -#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' ) -#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) -#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' ) -#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' ) -#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) -#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' ) -#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' ) -#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) -#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' ) -#define TTAG_POST FT_MAKE_TAG( 'P', 'O', 'S', 'T' ) -#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' ) -#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) -#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' ) -#define TTAG_sbix FT_MAKE_TAG( 's', 'b', 'i', 'x' ) -#define TTAG_sfnt FT_MAKE_TAG( 's', 'f', 'n', 't' ) -#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' ) -#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' ) -#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' ) -#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' ) -#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' ) -#define TTAG_TYP1 FT_MAKE_TAG( 'T', 'Y', 'P', '1' ) -#define TTAG_typ1 FT_MAKE_TAG( 't', 'y', 'p', '1' ) -#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' ) -#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' ) -#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) -#define TTAG_wOFF FT_MAKE_TAG( 'w', 'O', 'F', 'F' ) - - -FT_END_HEADER - -#endif /* __TTAGS_H__ */ - - -/* END */ diff --git a/3party/freetype/include/freetype/ttunpat.h b/3party/freetype/include/freetype/ttunpat.h deleted file mode 100644 index 8ea556895c..0000000000 --- a/3party/freetype/include/freetype/ttunpat.h +++ /dev/null @@ -1,60 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttunpat.h */ -/* */ -/* Definitions for the unpatented TrueType hinting system */ -/* */ -/* Copyright 2003-2015 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* Written by Graham Asher <graham.asher@btinternet.com> */ -/* */ -/* 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 __TTUNPAT_H__ -#define __TTUNPAT_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************** - * - * @constant: - * FT_PARAM_TAG_UNPATENTED_HINTING - * - * @description: - * A constant used as the tag of an @FT_Parameter structure to indicate - * that unpatented methods only should be used by the TrueType bytecode - * interpreter for a typeface opened by @FT_Open_Face. - * - */ -#define FT_PARAM_TAG_UNPATENTED_HINTING FT_MAKE_TAG( 'u', 'n', 'p', 'a' ) - - /* */ - - -FT_END_HEADER - - -#endif /* __TTUNPAT_H__ */ - - -/* END */ diff --git a/3party/freetype/include/ft2build.h b/3party/freetype/include/ft2build.h deleted file mode 100644 index 419b80ae44..0000000000 --- a/3party/freetype/include/ft2build.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************/ -/* */ -/* ft2build.h */ -/* */ -/* FreeType 2 build and setup macros. */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This is the `entry point' for FreeType header file inclusions. It is */ - /* the only header file which should be included directly; all other */ - /* FreeType header files should be accessed with macro names (after */ - /* including `ft2build.h'). */ - /* */ - /* A typical example is */ - /* */ - /* #include <ft2build.h> */ - /* #include FT_FREETYPE_H */ - /* */ - /*************************************************************************/ - - -#ifndef __FT2BUILD_H__ -#define __FT2BUILD_H__ - -#include <freetype/config/ftheader.h> - -#endif /* __FT2BUILD_H__ */ - - -/* END */ diff --git a/3party/freetype/modules.cfg b/3party/freetype/modules.cfg deleted file mode 100644 index 2984e51244..0000000000 --- a/3party/freetype/modules.cfg +++ /dev/null @@ -1,255 +0,0 @@ -# modules.cfg -# -# Copyright 2005-2015 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. -# -# -# In case you compile the FreeType library with GNU make or makepp, this -# file controls which components are built into the library. Otherwise, -# please read this file for information on the various modules and its -# dependencies, then follow the instructions in the file `docs/INSTALL.ANY'. -# -# To deactivate a module, simply comment out the corresponding line. To -# activate a module, remove the comment character. -# -# Note that many modules and components are further controlled with macros -# in the file `include/freetype/config/ftoption.h'. - - -#### -#### font modules -- at least one is required -#### -#### The order given here (from top to down) is the order used for testing -#### font formats in the compiled library. -#### - -# TrueType font driver. -# -# This driver needs the `sfnt' module. -FONT_MODULES += truetype - -# PostScript Type 1 font driver. -# -# This driver needs the `psaux', `pshinter', and `psnames' modules. -FONT_MODULES += type1 - -# CFF/OpenType font driver. -# -# This driver needs the `sfnt', `pshinter', and `psnames' modules. -FONT_MODULES += cff - -# Type 1 CID-keyed font driver. -# -# This driver needs the `psaux', `pshinter', and `psnames' modules. -FONT_MODULES += cid - -# PFR/TrueDoc font driver. See optional extension ftpfr.c below also. -FONT_MODULES += pfr - -# PostScript Type 42 font driver. -# -# This driver needs the `truetype' and `psaux' modules. -FONT_MODULES += type42 - -# Windows FONT/FNT font driver. See optional extension ftwinfnt.c below -# also. -FONT_MODULES += winfonts - -# PCF font driver. -FONT_MODULES += pcf - -# BDF font driver. See optional extension ftbdf.c below also. -FONT_MODULES += bdf - -# SFNT files support. If used without `truetype' or `cff', it supports -# bitmap-only fonts within an SFNT wrapper. -# -# This driver needs the `psnames' module. -FONT_MODULES += sfnt - - -#### -#### hinting modules -#### - -# FreeType's auto hinter. -HINTING_MODULES += autofit - -# PostScript hinter. -HINTING_MODULES += pshinter - -# The TrueType hinting engine doesn't have a module of its own but is -# controlled in file include/freetype/config/ftoption.h -# (TT_CONFIG_OPTION_BYTECODE_INTERPRETER and friends). - - -#### -#### raster modules -- at least one is required for vector font formats -#### - -# Monochrome rasterizer. -RASTER_MODULES += raster - -# Anti-aliasing rasterizer. -RASTER_MODULES += smooth - - -#### -#### auxiliary modules -#### - -# FreeType's cache sub-system (quite stable but still in beta -- this means -# that its public API is subject to change if necessary). See -# include/freetype/ftcache.h. Needs ftglyph.c. -AUX_MODULES += cache - -# TrueType GX/AAT table validation. Needs ftgxval.c below. -# AUX_MODULES += gxvalid - -# Support for streams compressed with gzip (files with suffix .gz). -# -# See include/freetype/ftgzip.h for the API. -AUX_MODULES += gzip - -# Support for streams compressed with LZW (files with suffix .Z). -# -# See include/freetype/ftlzw.h for the API. -AUX_MODULES += lzw - -# Support for streams compressed with bzip2 (files with suffix .bz2). -# -# See include/freetype/ftbzip2.h for the API. -AUX_MODULES += bzip2 - -# OpenType table validation. Needs ftotval.c below. -# -# AUX_MODULES += otvalid - -# Auxiliary PostScript driver component to share common code. -# -# This module depends on `psnames'. -AUX_MODULES += psaux - -# Support for PostScript glyph names. -# -# This module can be controlled in ftconfig.h -# (FT_CONFIG_OPTION_POSTSCRIPT_NAMES). -AUX_MODULES += psnames - - -#### -#### base module extensions -#### - -# Exact bounding box calculation. -# -# See include/freetype/ftbbox.h for the API. -BASE_EXTENSIONS += ftbbox.c - -# Access BDF-specific strings. Needs BDF font driver. -# -# See include/freetype/ftbdf.h for the API. -BASE_EXTENSIONS += ftbdf.c - -# Utility functions for converting 1bpp, 2bpp, 4bpp, and 8bpp bitmaps into -# 8bpp format, and for emboldening of bitmap glyphs. -# -# See include/freetype/ftbitmap.h for the API. -BASE_EXTENSIONS += ftbitmap.c - -# Access CID font information. -# -# See include/freetype/ftcid.h for the API. -BASE_EXTENSIONS += ftcid.c - -# Support functions for font formats. -# -# See include/freetype/ftfntfmt.h for the API. -BASE_EXTENSIONS += ftfntfmt.c - -# Access FSType information. Needs fttype1.c. -# -# See include/freetype/freetype.h for the API. -BASE_EXTENSIONS += ftfstype.c - -# Support for GASP table queries. -# -# See include/freetype/ftgasp.h for the API. -BASE_EXTENSIONS += ftgasp.c - -# Convenience functions to handle glyphs. Needs ftbitmap.c. -# -# See include/freetype/ftglyph.h for the API. -BASE_EXTENSIONS += ftglyph.c - -# Interface for gxvalid module. -# -# See include/freetype/ftgxval.h for the API. -BASE_EXTENSIONS += ftgxval.c - -# Support for LCD color filtering of subpixel bitmaps. -# -# See include/freetype/ftlcdfil.h for the API. -BASE_EXTENSIONS += ftlcdfil.c - -# Multiple Master font interface. -# -# See include/freetype/ftmm.h for the API. -BASE_EXTENSIONS += ftmm.c - -# Interface for otvalid module. -# -# See include/freetype/ftotval.h for the API. -BASE_EXTENSIONS += ftotval.c - -# Support for FT_Face_CheckTrueTypePatents. -# -# See include/freetype/freetype.h for the API. -BASE_EXTENSIONS += ftpatent.c - -# Interface for accessing PFR-specific data. Needs PFR font driver. -# -# See include/freetype/ftpfr.h for the API. -BASE_EXTENSIONS += ftpfr.c - -# Path stroker. Needs ftglyph.c. -# -# See include/freetype/ftstroke.h for the API. -BASE_EXTENSIONS += ftstroke.c - -# Support for synthetic embolding and slanting of fonts. Needs ftbitmap.c. -# -# See include/freetype/ftsynth.h for the API. -BASE_EXTENSIONS += ftsynth.c - -# Interface to access data specific to PostScript Type 1 and Type 2 (CFF) -# fonts. -# -# See include/freetype/t1tables.h for the API. -BASE_EXTENSIONS += fttype1.c - -# Interface for accessing data specific to Windows FNT files. Needs winfnt -# driver. -# -# See include/freetype/ftwinfnt.h for the API. -BASE_EXTENSIONS += ftwinfnt.c - -#### -#### The components `ftsystem.c' (for memory allocation and stream I/O -#### management) and `ftdebug.c' (for emitting debug messages to the user) -#### are controlled with the following variables. -#### -#### ftsystem.c: $(FTSYS_SRC) -#### ftdebug.c: $(FTDEBUG_SRC) -#### -#### Please refer to docs/CUSTOMIZE for details. -#### - - -# EOF diff --git a/3party/freetype/objs/README b/3party/freetype/objs/README deleted file mode 100644 index befb63e049..0000000000 --- a/3party/freetype/objs/README +++ /dev/null @@ -1,2 +0,0 @@ -This directory contains all the object files created when building the -library. diff --git a/3party/freetype/src/Jamfile b/3party/freetype/src/Jamfile deleted file mode 100644 index 65e061910d..0000000000 --- a/3party/freetype/src/Jamfile +++ /dev/null @@ -1,19 +0,0 @@ -# FreeType 2 src Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) ; - -for xx in $(FT2_COMPONENTS) -{ - SubInclude FT2_TOP $(FT2_SRC_DIR) $(xx) ; -} - -# end of src Jamfile diff --git a/3party/freetype/src/autofit/Jamfile b/3party/freetype/src/autofit/Jamfile deleted file mode 100644 index 5cd0b46108..0000000000 --- a/3party/freetype/src/autofit/Jamfile +++ /dev/null @@ -1,53 +0,0 @@ -# FreeType 2 src/autofit Jamfile -# -# Copyright 2003-2015 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. - -SubDir FT2_TOP src autofit ; - -{ - local _sources ; - - # define FT2_AUTOFIT2 to enable experimental latin hinter replacement - if $(FT2_AUTOFIT2) - { - CCFLAGS += FT_OPTION_AUTOFIT2 ; - } - if $(FT2_MULTI) - { - _sources = afangles - afblue - afcjk - afdummy - afglobal - afhints - afindic - aflatin - afloader - afmodule - afpic - afranges - afwarp - hbshim - ; - - if $(FT2_AUTOFIT2) - { - _sources += aflatin2 ; - } - } - else - { - _sources = autofit ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/autofit Jamfile diff --git a/3party/freetype/src/autofit/afangles.c b/3party/freetype/src/autofit/afangles.c deleted file mode 100644 index 1b1eb31fe7..0000000000 --- a/3party/freetype/src/autofit/afangles.c +++ /dev/null @@ -1,285 +0,0 @@ -/***************************************************************************/ -/* */ -/* afangles.c */ -/* */ -/* Routines used to compute vector angles with limited accuracy */ -/* and very high speed. It also contains sorting routines (body). */ -/* */ -/* Copyright 2003-2015 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 "aftypes.h" - - - /* - * We are not using `af_angle_atan' anymore, but we keep the source - * code below just in case... - */ - - -#if 0 - - - /* - * The trick here is to realize that we don't need a very accurate angle - * approximation. We are going to use the result of `af_angle_atan' to - * only compare the sign of angle differences, or check whether its - * magnitude is very small. - * - * The approximation - * - * dy * PI / (|dx|+|dy|) - * - * should be enough, and much faster to compute. - */ - FT_LOCAL_DEF( AF_Angle ) - af_angle_atan( FT_Fixed dx, - FT_Fixed dy ) - { - AF_Angle angle; - FT_Fixed ax = dx; - FT_Fixed ay = dy; - - - if ( ax < 0 ) - ax = -ax; - if ( ay < 0 ) - ay = -ay; - - ax += ay; - - if ( ax == 0 ) - angle = 0; - else - { - angle = ( AF_ANGLE_PI2 * dy ) / ( ax + ay ); - if ( dx < 0 ) - { - if ( angle >= 0 ) - angle = AF_ANGLE_PI - angle; - else - angle = -AF_ANGLE_PI - angle; - } - } - - return angle; - } - - -#elif 0 - - - /* the following table has been automatically generated with */ - /* the `mather.py' Python script */ - -#define AF_ATAN_BITS 8 - - static const FT_Byte af_arctan[1L << AF_ATAN_BITS] = - { - 0, 0, 1, 1, 1, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 5, - 5, 5, 6, 6, 6, 7, 7, 7, - 8, 8, 8, 9, 9, 9, 10, 10, - 10, 10, 11, 11, 11, 12, 12, 12, - 13, 13, 13, 14, 14, 14, 14, 15, - 15, 15, 16, 16, 16, 17, 17, 17, - 18, 18, 18, 18, 19, 19, 19, 20, - 20, 20, 21, 21, 21, 21, 22, 22, - 22, 23, 23, 23, 24, 24, 24, 24, - 25, 25, 25, 26, 26, 26, 26, 27, - 27, 27, 28, 28, 28, 28, 29, 29, - 29, 30, 30, 30, 30, 31, 31, 31, - 31, 32, 32, 32, 33, 33, 33, 33, - 34, 34, 34, 34, 35, 35, 35, 35, - 36, 36, 36, 36, 37, 37, 37, 38, - 38, 38, 38, 39, 39, 39, 39, 40, - 40, 40, 40, 41, 41, 41, 41, 42, - 42, 42, 42, 42, 43, 43, 43, 43, - 44, 44, 44, 44, 45, 45, 45, 45, - 46, 46, 46, 46, 46, 47, 47, 47, - 47, 48, 48, 48, 48, 48, 49, 49, - 49, 49, 50, 50, 50, 50, 50, 51, - 51, 51, 51, 51, 52, 52, 52, 52, - 52, 53, 53, 53, 53, 53, 54, 54, - 54, 54, 54, 55, 55, 55, 55, 55, - 56, 56, 56, 56, 56, 57, 57, 57, - 57, 57, 57, 58, 58, 58, 58, 58, - 59, 59, 59, 59, 59, 59, 60, 60, - 60, 60, 60, 61, 61, 61, 61, 61, - 61, 62, 62, 62, 62, 62, 62, 63, - 63, 63, 63, 63, 63, 64, 64, 64 - }; - - - FT_LOCAL_DEF( AF_Angle ) - af_angle_atan( FT_Fixed dx, - FT_Fixed dy ) - { - AF_Angle angle; - - - /* check trivial cases */ - if ( dy == 0 ) - { - angle = 0; - if ( dx < 0 ) - angle = AF_ANGLE_PI; - return angle; - } - else if ( dx == 0 ) - { - angle = AF_ANGLE_PI2; - if ( dy < 0 ) - angle = -AF_ANGLE_PI2; - return angle; - } - - angle = 0; - if ( dx < 0 ) - { - dx = -dx; - dy = -dy; - angle = AF_ANGLE_PI; - } - - if ( dy < 0 ) - { - FT_Pos tmp; - - - tmp = dx; - dx = -dy; - dy = tmp; - angle -= AF_ANGLE_PI2; - } - - if ( dx == 0 && dy == 0 ) - return 0; - - if ( dx == dy ) - angle += AF_ANGLE_PI4; - else if ( dx > dy ) - angle += af_arctan[FT_DivFix( dy, dx ) >> ( 16 - AF_ATAN_BITS )]; - else - angle += AF_ANGLE_PI2 - - af_arctan[FT_DivFix( dx, dy ) >> ( 16 - AF_ATAN_BITS )]; - - if ( angle > AF_ANGLE_PI ) - angle -= AF_ANGLE_2PI; - - return angle; - } - - -#endif /* 0 */ - - - FT_LOCAL_DEF( void ) - af_sort_pos( FT_UInt count, - FT_Pos* table ) - { - FT_UInt i, j; - FT_Pos swap; - - - for ( i = 1; i < count; i++ ) - { - for ( j = i; j > 0; j-- ) - { - if ( table[j] >= table[j - 1] ) - break; - - swap = table[j]; - table[j] = table[j - 1]; - table[j - 1] = swap; - } - } - } - - - FT_LOCAL_DEF( void ) - af_sort_and_quantize_widths( FT_UInt* count, - AF_Width table, - FT_Pos threshold ) - { - FT_UInt i, j; - FT_UInt cur_idx; - FT_Pos cur_val; - FT_Pos sum; - AF_WidthRec swap; - - - if ( *count == 1 ) - return; - - /* sort */ - for ( i = 1; i < *count; i++ ) - { - for ( j = i; j > 0; j-- ) - { - if ( table[j].org >= table[j - 1].org ) - break; - - swap = table[j]; - table[j] = table[j - 1]; - table[j - 1] = swap; - } - } - - cur_idx = 0; - cur_val = table[cur_idx].org; - - /* compute and use mean values for clusters not larger than */ - /* `threshold'; this is very primitive and might not yield */ - /* the best result, but normally, using reference character */ - /* `o', `*count' is 2, so the code below is fully sufficient */ - for ( i = 1; i < *count; i++ ) - { - if ( table[i].org - cur_val > threshold || - i == *count - 1 ) - { - sum = 0; - - /* fix loop for end of array */ - if ( table[i].org - cur_val <= threshold && - i == *count - 1 ) - i++; - - for ( j = cur_idx; j < i; j++ ) - { - sum += table[j].org; - table[j].org = 0; - } - table[cur_idx].org = sum / (FT_Pos)j; - - if ( i < *count - 1 ) - { - cur_idx = i + 1; - cur_val = table[cur_idx].org; - } - } - } - - cur_idx = 1; - - /* compress array to remove zero values */ - for ( i = 1; i < *count; i++ ) - { - if ( table[i].org ) - table[cur_idx++] = table[i]; - } - - *count = cur_idx; - } - - -/* END */ diff --git a/3party/freetype/src/autofit/afangles.h b/3party/freetype/src/autofit/afangles.h deleted file mode 100644 index f33f9e108e..0000000000 --- a/3party/freetype/src/autofit/afangles.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * afangles.h - * - * This is a dummy file, used to please the build system. It is never - * included by the auto-fitter sources. - * - */ diff --git a/3party/freetype/src/autofit/afblue.c b/3party/freetype/src/autofit/afblue.c deleted file mode 100644 index 62da0f2cb8..0000000000 --- a/3party/freetype/src/autofit/afblue.c +++ /dev/null @@ -1,210 +0,0 @@ -/* This file has been generated by the Perl script `afblue.pl', */ -/* using data from file `afblue.dat'. */ - -/***************************************************************************/ -/* */ -/* afblue.c */ -/* */ -/* Auto-fitter data for blue strings (body). */ -/* */ -/* Copyright 2013-2015 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 "aftypes.h" - - - FT_LOCAL_ARRAY_DEF( char ) - af_blue_strings[] = - { - /* */ - '\xD8', '\xA7', '\xD8', '\xA5', '\xD9', '\x84', '\xD9', '\x83', '\xD8', '\xB7', '\xD8', '\xB8', /* ا إ ل ك ط ظ */ - '\0', - '\xD8', '\xAA', '\xD8', '\xAB', '\xD8', '\xB7', '\xD8', '\xB8', '\xD9', '\x83', /* ت ث ط ظ ك */ - '\0', - '\xD9', '\x80', /* ـ */ - '\0', - '\xD0', '\x91', '\xD0', '\x92', '\xD0', '\x95', '\xD0', '\x9F', '\xD0', '\x97', '\xD0', '\x9E', '\xD0', '\xA1', '\xD0', '\xAD', /* БВЕПЗОСЭ */ - '\0', - '\xD0', '\x91', '\xD0', '\x92', '\xD0', '\x95', '\xD0', '\xA8', '\xD0', '\x97', '\xD0', '\x9E', '\xD0', '\xA1', '\xD0', '\xAD', /* БВЕШЗОСЭ */ - '\0', - '\xD1', '\x85', '\xD0', '\xBF', '\xD0', '\xBD', '\xD1', '\x88', '\xD0', '\xB5', '\xD0', '\xB7', '\xD0', '\xBE', '\xD1', '\x81', /* хпншезос */ - '\0', - '\xD1', '\x80', '\xD1', '\x83', '\xD1', '\x84', /* руф */ - '\0', - '\xE0', '\xA4', '\x95', '\xE0', '\xA4', '\xAE', '\xE0', '\xA4', '\x85', '\xE0', '\xA4', '\x86', '\xE0', '\xA4', '\xA5', '\xE0', '\xA4', '\xA7', '\xE0', '\xA4', '\xAD', '\xE0', '\xA4', '\xB6', /* क म अ आ थ ध भ श */ - '\0', - '\xE0', '\xA4', '\x88', '\xE0', '\xA4', '\x90', '\xE0', '\xA4', '\x93', '\xE0', '\xA4', '\x94', '\xE0', '\xA4', '\xBF', '\xE0', '\xA5', '\x80', '\xE0', '\xA5', '\x8B', '\xE0', '\xA5', '\x8C', /* ई ऐ ओ औ ि ी ो ौ */ - '\0', - '\xE0', '\xA4', '\x95', '\xE0', '\xA4', '\xAE', '\xE0', '\xA4', '\x85', '\xE0', '\xA4', '\x86', '\xE0', '\xA4', '\xA5', '\xE0', '\xA4', '\xA7', '\xE0', '\xA4', '\xAD', '\xE0', '\xA4', '\xB6', /* क म अ आ थ ध भ श */ - '\0', - '\xE0', '\xA5', '\x81', '\xE0', '\xA5', '\x83', /* ु ृ */ - '\0', - '\xCE', '\x93', '\xCE', '\x92', '\xCE', '\x95', '\xCE', '\x96', '\xCE', '\x98', '\xCE', '\x9F', '\xCE', '\xA9', /* ΓΒΕΖΘΟΩ */ - '\0', - '\xCE', '\x92', '\xCE', '\x94', '\xCE', '\x96', '\xCE', '\x9E', '\xCE', '\x98', '\xCE', '\x9F', /* ΒΔΖΞΘΟ */ - '\0', - '\xCE', '\xB2', '\xCE', '\xB8', '\xCE', '\xB4', '\xCE', '\xB6', '\xCE', '\xBB', '\xCE', '\xBE', /* βθδζλξ */ - '\0', - '\xCE', '\xB1', '\xCE', '\xB5', '\xCE', '\xB9', '\xCE', '\xBF', '\xCF', '\x80', '\xCF', '\x83', '\xCF', '\x84', '\xCF', '\x89', /* αειοπστω */ - '\0', - '\xCE', '\xB2', '\xCE', '\xB3', '\xCE', '\xB7', '\xCE', '\xBC', '\xCF', '\x81', '\xCF', '\x86', '\xCF', '\x87', '\xCF', '\x88', /* βγημρφχψ */ - '\0', - '\xD7', '\x91', '\xD7', '\x93', '\xD7', '\x94', '\xD7', '\x97', '\xD7', '\x9A', '\xD7', '\x9B', '\xD7', '\x9D', '\xD7', '\xA1', /* בדהחךכםס */ - '\0', - '\xD7', '\x91', '\xD7', '\x98', '\xD7', '\x9B', '\xD7', '\x9D', '\xD7', '\xA1', '\xD7', '\xA6', /* בטכםסצ */ - '\0', - '\xD7', '\xA7', '\xD7', '\x9A', '\xD7', '\x9F', '\xD7', '\xA3', '\xD7', '\xA5', /* קךןףץ */ - '\0', - 'T', 'H', 'E', 'Z', 'O', 'C', 'Q', 'S', /* THEZOCQS */ - '\0', - 'H', 'E', 'Z', 'L', 'O', 'C', 'U', 'S', /* HEZLOCUS */ - '\0', - 'f', 'i', 'j', 'k', 'd', 'b', 'h', /* fijkdbh */ - '\0', - 'x', 'z', 'r', 'o', 'e', 's', 'c', /* xzroesc */ - '\0', - 'p', 'q', 'g', 'j', 'y', /* pqgjy */ - '\0', - '\xE0', '\xB0', '\x87', '\xE0', '\xB0', '\x8C', '\xE0', '\xB0', '\x99', '\xE0', '\xB0', '\x9E', '\xE0', '\xB0', '\xA3', '\xE0', '\xB0', '\xB1', '\xE0', '\xB1', '\xAF', /* ఇ ఌ ఙ ఞ ణ ఱ ౯ */ - '\0', - '\xE0', '\xB0', '\x85', '\xE0', '\xB0', '\x95', '\xE0', '\xB0', '\x9A', '\xE0', '\xB0', '\xB0', '\xE0', '\xB0', '\xBD', '\xE0', '\xB1', '\xA8', '\xE0', '\xB1', '\xAC', /* అ క చ ర ఽ ౨ ౬ */ - '\0', - '\xE0', '\xB8', '\x9A', '\xE0', '\xB9', '\x80', '\xE0', '\xB9', '\x81', '\xE0', '\xB8', '\xAD', '\xE0', '\xB8', '\x81', '\xE0', '\xB8', '\xB2', /* บ เ แ อ ก า */ - '\0', - '\xE0', '\xB8', '\x9A', '\xE0', '\xB8', '\x9B', '\xE0', '\xB8', '\xA9', '\xE0', '\xB8', '\xAF', '\xE0', '\xB8', '\xAD', '\xE0', '\xB8', '\xA2', '\xE0', '\xB8', '\xAE', /* บ ป ษ ฯ อ ย ฮ */ - '\0', - '\xE0', '\xB8', '\x9B', '\xE0', '\xB8', '\x9D', '\xE0', '\xB8', '\x9F', /* ป ฝ ฟ */ - '\0', - '\xE0', '\xB9', '\x82', '\xE0', '\xB9', '\x83', '\xE0', '\xB9', '\x84', /* โ ใ ไ */ - '\0', - '\xE0', '\xB8', '\x8E', '\xE0', '\xB8', '\x8F', '\xE0', '\xB8', '\xA4', '\xE0', '\xB8', '\xA6', /* ฎ ฏ ฤ ฦ */ - '\0', - '\xE0', '\xB8', '\x8D', '\xE0', '\xB8', '\x90', /* ญ ฐ */ - '\0', - '\xE0', '\xB9', '\x90', '\xE0', '\xB9', '\x91', '\xE0', '\xB9', '\x93', /* ๐ ๑ ๓ */ -#ifdef AF_CONFIG_OPTION_CJK - '\0', - '\xE4', '\xBB', '\x96', '\xE4', '\xBB', '\xAC', '\xE4', '\xBD', '\xA0', '\xE4', '\xBE', '\x86', '\xE5', '\x80', '\x91', '\xE5', '\x88', '\xB0', '\xE5', '\x92', '\x8C', '\xE5', '\x9C', '\xB0', /* 他们你來們到和地 */ - '\xE5', '\xAF', '\xB9', '\xE5', '\xB0', '\x8D', '\xE5', '\xB0', '\xB1', '\xE5', '\xB8', '\xAD', '\xE6', '\x88', '\x91', '\xE6', '\x97', '\xB6', '\xE6', '\x99', '\x82', '\xE6', '\x9C', '\x83', /* 对對就席我时時會 */ - '\xE6', '\x9D', '\xA5', '\xE7', '\x82', '\xBA', '\xE8', '\x83', '\xBD', '\xE8', '\x88', '\xB0', '\xE8', '\xAA', '\xAA', '\xE8', '\xAF', '\xB4', '\xE8', '\xBF', '\x99', '\xE9', '\x80', '\x99', /* 来為能舰說说这這 */ - '\xE9', '\xBD', '\x8A', '|', /* 齊 | */ - '\xE5', '\x86', '\x9B', '\xE5', '\x90', '\x8C', '\xE5', '\xB7', '\xB2', '\xE6', '\x84', '\xBF', '\xE6', '\x97', '\xA2', '\xE6', '\x98', '\x9F', '\xE6', '\x98', '\xAF', '\xE6', '\x99', '\xAF', /* 军同已愿既星是景 */ - '\xE6', '\xB0', '\x91', '\xE7', '\x85', '\xA7', '\xE7', '\x8E', '\xB0', '\xE7', '\x8F', '\xBE', '\xE7', '\x90', '\x86', '\xE7', '\x94', '\xA8', '\xE7', '\xBD', '\xAE', '\xE8', '\xA6', '\x81', /* 民照现現理用置要 */ - '\xE8', '\xBB', '\x8D', '\xE9', '\x82', '\xA3', '\xE9', '\x85', '\x8D', '\xE9', '\x87', '\x8C', '\xE9', '\x96', '\x8B', '\xE9', '\x9B', '\xB7', '\xE9', '\x9C', '\xB2', '\xE9', '\x9D', '\xA2', /* 軍那配里開雷露面 */ - '\xE9', '\xA1', '\xBE', /* 顾 */ - '\0', - '\xE4', '\xB8', '\xAA', '\xE4', '\xB8', '\xBA', '\xE4', '\xBA', '\xBA', '\xE4', '\xBB', '\x96', '\xE4', '\xBB', '\xA5', '\xE4', '\xBB', '\xAC', '\xE4', '\xBD', '\xA0', '\xE4', '\xBE', '\x86', /* 个为人他以们你來 */ - '\xE5', '\x80', '\x8B', '\xE5', '\x80', '\x91', '\xE5', '\x88', '\xB0', '\xE5', '\x92', '\x8C', '\xE5', '\xA4', '\xA7', '\xE5', '\xAF', '\xB9', '\xE5', '\xB0', '\x8D', '\xE5', '\xB0', '\xB1', /* 個們到和大对對就 */ - '\xE6', '\x88', '\x91', '\xE6', '\x97', '\xB6', '\xE6', '\x99', '\x82', '\xE6', '\x9C', '\x89', '\xE6', '\x9D', '\xA5', '\xE7', '\x82', '\xBA', '\xE8', '\xA6', '\x81', '\xE8', '\xAA', '\xAA', /* 我时時有来為要說 */ - '\xE8', '\xAF', '\xB4', '|', /* 说 | */ - '\xE4', '\xB8', '\xBB', '\xE4', '\xBA', '\x9B', '\xE5', '\x9B', '\xA0', '\xE5', '\xAE', '\x83', '\xE6', '\x83', '\xB3', '\xE6', '\x84', '\x8F', '\xE7', '\x90', '\x86', '\xE7', '\x94', '\x9F', /* 主些因它想意理生 */ - '\xE7', '\x95', '\xB6', '\xE7', '\x9C', '\x8B', '\xE7', '\x9D', '\x80', '\xE7', '\xBD', '\xAE', '\xE8', '\x80', '\x85', '\xE8', '\x87', '\xAA', '\xE8', '\x91', '\x97', '\xE8', '\xA3', '\xA1', /* 當看着置者自著裡 */ - '\xE8', '\xBF', '\x87', '\xE8', '\xBF', '\x98', '\xE8', '\xBF', '\x9B', '\xE9', '\x80', '\xB2', '\xE9', '\x81', '\x8E', '\xE9', '\x81', '\x93', '\xE9', '\x82', '\x84', '\xE9', '\x87', '\x8C', /* 过还进進過道還里 */ - '\xE9', '\x9D', '\xA2', /* 面 */ -#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - '\0', - '\xE4', '\xBA', '\x9B', '\xE4', '\xBB', '\xAC', '\xE4', '\xBD', '\xA0', '\xE4', '\xBE', '\x86', '\xE5', '\x80', '\x91', '\xE5', '\x88', '\xB0', '\xE5', '\x92', '\x8C', '\xE5', '\x9C', '\xB0', /* 些们你來們到和地 */ - '\xE5', '\xA5', '\xB9', '\xE5', '\xB0', '\x86', '\xE5', '\xB0', '\x87', '\xE5', '\xB0', '\xB1', '\xE5', '\xB9', '\xB4', '\xE5', '\xBE', '\x97', '\xE6', '\x83', '\x85', '\xE6', '\x9C', '\x80', /* 她将將就年得情最 */ - '\xE6', '\xA0', '\xB7', '\xE6', '\xA8', '\xA3', '\xE7', '\x90', '\x86', '\xE8', '\x83', '\xBD', '\xE8', '\xAA', '\xAA', '\xE8', '\xAF', '\xB4', '\xE8', '\xBF', '\x99', '\xE9', '\x80', '\x99', /* 样樣理能說说这這 */ - '\xE9', '\x80', '\x9A', '|', /* 通 | */ - '\xE5', '\x8D', '\xB3', '\xE5', '\x90', '\x97', '\xE5', '\x90', '\xA7', '\xE5', '\x90', '\xAC', '\xE5', '\x91', '\xA2', '\xE5', '\x93', '\x81', '\xE5', '\x93', '\x8D', '\xE5', '\x97', '\x8E', /* 即吗吧听呢品响嗎 */ - '\xE5', '\xB8', '\x88', '\xE5', '\xB8', '\xAB', '\xE6', '\x94', '\xB6', '\xE6', '\x96', '\xAD', '\xE6', '\x96', '\xB7', '\xE6', '\x98', '\x8E', '\xE7', '\x9C', '\xBC', '\xE9', '\x96', '\x93', /* 师師收断斷明眼間 */ - '\xE9', '\x97', '\xB4', '\xE9', '\x99', '\x85', '\xE9', '\x99', '\x88', '\xE9', '\x99', '\x90', '\xE9', '\x99', '\xA4', '\xE9', '\x99', '\xB3', '\xE9', '\x9A', '\x8F', '\xE9', '\x9A', '\x9B', /* 间际陈限除陳随際 */ - '\xE9', '\x9A', '\xA8', /* 隨 */ - '\0', - '\xE4', '\xBA', '\x8B', '\xE5', '\x89', '\x8D', '\xE5', '\xAD', '\xB8', '\xE5', '\xB0', '\x86', '\xE5', '\xB0', '\x87', '\xE6', '\x83', '\x85', '\xE6', '\x83', '\xB3', '\xE6', '\x88', '\x96', /* 事前學将將情想或 */ - '\xE6', '\x94', '\xBF', '\xE6', '\x96', '\xAF', '\xE6', '\x96', '\xB0', '\xE6', '\xA0', '\xB7', '\xE6', '\xA8', '\xA3', '\xE6', '\xB0', '\x91', '\xE6', '\xB2', '\x92', '\xE6', '\xB2', '\xA1', /* 政斯新样樣民沒没 */ - '\xE7', '\x84', '\xB6', '\xE7', '\x89', '\xB9', '\xE7', '\x8E', '\xB0', '\xE7', '\x8F', '\xBE', '\xE7', '\x90', '\x83', '\xE7', '\xAC', '\xAC', '\xE7', '\xB6', '\x93', '\xE8', '\xB0', '\x81', /* 然特现現球第經谁 */ - '\xE8', '\xB5', '\xB7', '|', /* 起 | */ - '\xE4', '\xBE', '\x8B', '\xE5', '\x88', '\xA5', '\xE5', '\x88', '\xAB', '\xE5', '\x88', '\xB6', '\xE5', '\x8A', '\xA8', '\xE5', '\x8B', '\x95', '\xE5', '\x90', '\x97', '\xE5', '\x97', '\x8E', /* 例別别制动動吗嗎 */ - '\xE5', '\xA2', '\x9E', '\xE6', '\x8C', '\x87', '\xE6', '\x98', '\x8E', '\xE6', '\x9C', '\x9D', '\xE6', '\x9C', '\x9F', '\xE6', '\x9E', '\x84', '\xE7', '\x89', '\xA9', '\xE7', '\xA1', '\xAE', /* 增指明朝期构物确 */ - '\xE7', '\xA7', '\x8D', '\xE8', '\xAA', '\xBF', '\xE8', '\xB0', '\x83', '\xE8', '\xB2', '\xBB', '\xE8', '\xB4', '\xB9', '\xE9', '\x82', '\xA3', '\xE9', '\x83', '\xBD', '\xE9', '\x96', '\x93', /* 种調调費费那都間 */ - '\xE9', '\x97', '\xB4', /* 间 */ -#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ -#endif /* AF_CONFIG_OPTION_CJK */ - '\0', - - }; - - - /* stringsets are specific to styles */ - FT_LOCAL_ARRAY_DEF( AF_Blue_StringRec ) - af_blue_stringsets[] = - { - /* */ - { AF_BLUE_STRING_ARABIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_ARABIC_BOTTOM, 0 }, - { AF_BLUE_STRING_ARABIC_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_CYRILLIC_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_CYRILLIC_SMALL, 0 }, - { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_DEVANAGARI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_DEVANAGARI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_DEVANAGARI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_NEUTRAL | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_DEVANAGARI_BASE, 0 }, - { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_GREEK_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_GREEK_SMALL, 0 }, - { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_HEBREW_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_LONG }, - { AF_BLUE_STRING_HEBREW_BOTTOM, 0 }, - { AF_BLUE_STRING_HEBREW_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_LATIN_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_LATIN_SMALL, 0 }, - { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_TELUGU_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_TELUGU_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_THAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_THAI_BOTTOM, 0 }, - { AF_BLUE_STRING_THAI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_THAI_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_THAI_DESCENDER, 0 }, - { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0 }, - { AF_BLUE_STRING_THAI_DIGIT_TOP, 0 }, - { AF_BLUE_STRING_MAX, 0 }, -#ifdef AF_CONFIG_OPTION_CJK - { AF_BLUE_STRING_CJK_TOP, AF_BLUE_PROPERTY_CJK_TOP }, - { AF_BLUE_STRING_CJK_BOTTOM, 0 }, -#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - { AF_BLUE_STRING_CJK_LEFT, AF_BLUE_PROPERTY_CJK_HORIZ }, - { AF_BLUE_STRING_CJK_RIGHT, AF_BLUE_PROPERTY_CJK_HORIZ | - AF_BLUE_PROPERTY_CJK_RIGHT }, -#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ - { AF_BLUE_STRING_MAX, 0 }, -#endif /* AF_CONFIG_OPTION_CJK */ - - }; - - -/* END */ diff --git a/3party/freetype/src/autofit/afblue.cin b/3party/freetype/src/autofit/afblue.cin deleted file mode 100644 index b303a4b2b0..0000000000 --- a/3party/freetype/src/autofit/afblue.cin +++ /dev/null @@ -1,39 +0,0 @@ -/***************************************************************************/ -/* */ -/* afblue.c */ -/* */ -/* Auto-fitter data for blue strings (body). */ -/* */ -/* Copyright 2013-2015 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 "aftypes.h" - - - FT_LOCAL_ARRAY_DEF( char ) - af_blue_strings[] = - { - /* */ -@AF_BLUE_STRINGS_ARRAY@ - }; - - - /* stringsets are specific to styles */ - FT_LOCAL_ARRAY_DEF( AF_Blue_StringRec ) - af_blue_stringsets[] = - { - /* */ -@AF_BLUE_STRINGSETS_ARRAY@ - }; - - -/* END */ diff --git a/3party/freetype/src/autofit/afblue.dat b/3party/freetype/src/autofit/afblue.dat deleted file mode 100644 index 8facfec011..0000000000 --- a/3party/freetype/src/autofit/afblue.dat +++ /dev/null @@ -1,382 +0,0 @@ -// afblue.dat -// -// Auto-fitter data for blue strings. -// -// Copyright 2013-2015 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. - - -// This file contains data specific to blue zones. It gets processed by -// a script to simulate `jagged arrays', with enumeration values holding -// offsets into the arrays. -// -// The format of the file is rather simple: A section starts with three -// labels separated by whitespace and followed by a colon (everything in a -// single line); the first label gives the name of the enumeration template, -// the second the name of the array template, and the third the name of the -// `maximum' template, holding the size of the largest array element. The -// script then fills the corresponding templates (indicated by `@' -// characters around the name). -// -// A section contains one or more data records. Each data record consists -// of two or more lines. The first line holds the enumeration name, and the -// remaining lines the corresponding array data. -// -// There are two possible representations for array data. -// -// - A string of characters in UTF-8 encoding enclosed in double quotes, -// using C syntax. There can be only one string per line, thus the -// starting and ending double quote must be the first and last character -// in the line, respectively, ignoring whitespace before and after the -// string. Space characters within the string are ignored too. If there -// are multiple strings (in multiple lines), they are concatenated to a -// single string. In the output, a string gets represented as a series of -// singles bytes, followed by a zero byte. The enumeration values simply -// hold byte offsets to the start of the corresponding strings. -// -// - Data blocks enclosed in balanced braces, which get copied verbatim and -// which can span multiple lines. The opening brace of a block must be -// the first character of a line (ignoring whitespace), and the closing -// brace the last (ignoring whitespace also). The script appends a comma -// character after each block and counts the number of blocks to set the -// enumeration values. -// -// A section can contain either strings only or data blocks only. -// -// A comment line starts with `//'; it gets removed. A preprocessor -// directive line (using the standard syntax of `cpp') starts with `#' and -// gets copied verbatim to both the enumeration and the array. Whitespace -// outside of a string is insignificant. -// -// Preprocessor directives are ignored while the script computes maximum -// values; this essentially means that the maximum values can easily be too -// large. Given that the purpose of those values is to create local -// fixed-size arrays at compile time for further processing of the blue zone -// data, this isn't a problem. Note the the final zero byte of a string is -// not counted. Note also that the count holds the number of UTF-8 encoded -// characters, not bytes. - - -// The blue zone string data, to be used in the blue stringsets below. - -AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: - - AF_BLUE_STRING_ARABIC_TOP - "ا إ ل ك ط ظ" - AF_BLUE_STRING_ARABIC_BOTTOM - "ت ث ط ظ ك" - // We don't necessarily have access to medial forms via Unicode in case - // Arabic presentational forms are missing. The only character that is - // guaranteed to have the same vertical position with joining (this is, - // non-isolated) forms is U+0640, ARABIC TATWEEL, which must join both - // round and flat curves. - AF_BLUE_STRING_ARABIC_JOIN - "ـ" - - AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP - "БВЕПЗОСЭ" - AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM - "БВЕШЗОСЭ" - AF_BLUE_STRING_CYRILLIC_SMALL - "хпншезос" - AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER - "руф" - - // we separate the letters with spaces to avoid ligatures; - // this is just for convenience to simplify reading - AF_BLUE_STRING_DEVANAGARI_BASE - "क म अ आ थ ध भ श" - AF_BLUE_STRING_DEVANAGARI_TOP - "ई ऐ ओ औ ि ी ो ौ" - // note that some fonts have extreme variation in the height of the - // round head elements; for this reason we also define the `base' - // blue zone, which must be always present - AF_BLUE_STRING_DEVANAGARI_HEAD - "क म अ आ थ ध भ श" - AF_BLUE_STRING_DEVANAGARI_BOTTOM - "ु ृ" - - AF_BLUE_STRING_GREEK_CAPITAL_TOP - "ΓΒΕΖΘΟΩ" - AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM - "ΒΔΖΞΘΟ" - AF_BLUE_STRING_GREEK_SMALL_BETA_TOP - "βθδζλξ" - AF_BLUE_STRING_GREEK_SMALL - "αειοπστω" - AF_BLUE_STRING_GREEK_SMALL_DESCENDER - "βγημρφχψ" - - AF_BLUE_STRING_HEBREW_TOP - "בדהחךכםס" - AF_BLUE_STRING_HEBREW_BOTTOM - "בטכםסצ" - AF_BLUE_STRING_HEBREW_DESCENDER - "קךןףץ" - - AF_BLUE_STRING_LATIN_CAPITAL_TOP - "THEZOCQS" - AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM - "HEZLOCUS" - AF_BLUE_STRING_LATIN_SMALL_F_TOP - "fijkdbh" - AF_BLUE_STRING_LATIN_SMALL - "xzroesc" - AF_BLUE_STRING_LATIN_SMALL_DESCENDER - "pqgjy" - - // we separate the letters with spaces to avoid ligatures; - // this is just for convenience to simplify reading - AF_BLUE_STRING_TELUGU_TOP - "ఇ ఌ ఙ ఞ ణ ఱ ౯" - AF_BLUE_STRING_TELUGU_BOTTOM - "అ క చ ర ఽ ౨ ౬" - - AF_BLUE_STRING_THAI_TOP - "บ เ แ อ ก า" - AF_BLUE_STRING_THAI_BOTTOM - "บ ป ษ ฯ อ ย ฮ" - AF_BLUE_STRING_THAI_ASCENDER - "ป ฝ ฟ" - AF_BLUE_STRING_THAI_LARGE_ASCENDER - "โ ใ ไ" - AF_BLUE_STRING_THAI_DESCENDER - "ฎ ฏ ฤ ฦ" - AF_BLUE_STRING_THAI_LARGE_DESCENDER - "ญ ฐ" - AF_BLUE_STRING_THAI_DIGIT_TOP - "๐ ๑ ๓" - - -#ifdef AF_CONFIG_OPTION_CJK - - AF_BLUE_STRING_CJK_TOP - "他们你來們到和地" - "对對就席我时時會" - "来為能舰說说这這" - "齊 |" - "军同已愿既星是景" - "民照现現理用置要" - "軍那配里開雷露面" - "顾" - AF_BLUE_STRING_CJK_BOTTOM - "个为人他以们你來" - "個們到和大对對就" - "我时時有来為要說" - "说 |" - "主些因它想意理生" - "當看着置者自著裡" - "过还进進過道還里" - "面" - -#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - - AF_BLUE_STRING_CJK_LEFT - "些们你來們到和地" - "她将將就年得情最" - "样樣理能說说这這" - "通 |" - "即吗吧听呢品响嗎" - "师師收断斷明眼間" - "间际陈限除陳随際" - "隨" - AF_BLUE_STRING_CJK_RIGHT - "事前學将將情想或" - "政斯新样樣民沒没" - "然特现現球第經谁" - "起 |" - "例別别制动動吗嗎" - "增指明朝期构物确" - "种調调費费那都間" - "间" - -#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ - -#endif /* AF_CONFIG_OPTION_CJK */ - - -// The blue zone stringsets, as used in the script styles, cf. `afstyles.h'. -// -// The AF_BLUE_PROPERTY_XXX flags are defined in `afblue.h'; here some -// explanations. -// -// A blue zone in general is defined by a reference and an overshoot line. -// During the hinting process, all coordinate values between those two lines -// are set equal to the reference value, provided that the blue zone is not -// wider than 0.75 pixels (otherwise the blue zone gets ignored). All -// entries must have `AF_BLUE_STRING_MAX' as the final line. -// -// During the glyph analysis, edges are sorted from bottom to top, and then -// sequentially checked, edge by edge, against the blue zones in the order -// given below. -// -// -// latin auto-hinter -// ----------------- -// -// Characters in a blue string are automatically classified as having a flat -// (reference) or a round (overshoot) extremum. The blue zone is then set -// up by the mean values of all flat extrema and all round extrema, -// respectively. Only horizontal blue zones (i.e., adjusting vertical -// coordinate values) are supported. -// -// For the latin auto-hinter, the overshoot should be larger than the -// reference for top zones, and vice versa for bottom zones. -// -// LATIN_TOP -// Take the maximum flat and round coordinate values of the blue string -// characters for computing the blue zone's reference and overshoot -// values. -// -// If not set, take the minimum values. -// -// LATIN_NEUTRAL -// Ignore round extrema and define the blue zone with flat values only. -// Both top and bottom of contours can match. This is useful for -// scripts like Devanagari where vowel signs attach to the base -// character and are implemented as components of composite glyphs. -// -// If not set, both round and flat extrema are taken into account. -// Additionally, only the top or the bottom of a contour can match, -// depending on the LATIN_TOP flag. -// -// Neutral blue zones should always follow non-neutral blue zones. -// -// LATIN_X_HEIGHT -// Scale all glyphs vertically from the corresponding script to make the -// reference line of this blue zone align on the grid. The scaling -// takes place before all other blue zones get aligned to the grid. -// Only one blue character string of a script style can have this flag. -// -// LATIN_LONG -// Apply an additional constraint for blue zone values: Don't -// necessarily use the extremum as-is but a segment of the topmost (or -// bottommost) contour that is longer than a heuristic threshold, and -// which is not too far away vertically from the real extremum. This -// ensures that small bumps in the outline are ignored (for example, the -// `vertical serifs' found in many Hebrew glyph designs). -// -// The segment must be at least EM/25 font units long, and the distance -// to the extremum must be smaller than EM/4. -// -// -// cjk auto-hinter -// --------------- -// -// Characters in a blue string are *not* automatically classified. Instead, -// first come the characters used for the overshoot value, then the -// character `|', then the characters used for the reference value. The -// blue zone is then set up by the mean values of all reference values and -// all overshoot values, respectively. Both horizontal and vertical blue -// zones (i.e., adjusting vertical and horizontal coordinate values, -// respectively) are supported. -// -// For the cjk auto-hinter, the overshoot should be smaller than the -// reference for top zones, and vice versa for bottom zones. -// -// CJK_TOP -// Take the maximum flat and round coordinate values of the blue string -// characters. If not set, take the minimum values. -// -// CJK_RIGHT -// A synonym for CJK_TOP. If CJK_HORIZ is set, this flag indicates the -// right blue zone, taking horizontal maximum values. -// -// CJK_HORIZ -// Define a blue zone for horizontal hinting (i.e., vertical blue -// zones). If not set, this is a blue zone for vertical hinting. - - -AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: - - AF_BLUE_STRINGSET_ARAB - { AF_BLUE_STRING_ARABIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_ARABIC_BOTTOM, 0 } - { AF_BLUE_STRING_ARABIC_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_CYRL - { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_CYRILLIC_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_CYRILLIC_SMALL, 0 } - { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_DEVA - { AF_BLUE_STRING_DEVANAGARI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_DEVANAGARI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_DEVANAGARI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_NEUTRAL | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_DEVANAGARI_BASE, 0 } - { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_GREK - { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_GREEK_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_GREEK_SMALL, 0 } - { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_HEBR - { AF_BLUE_STRING_HEBREW_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_LONG } - { AF_BLUE_STRING_HEBREW_BOTTOM, 0 } - { AF_BLUE_STRING_HEBREW_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_LATN - { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_LATIN_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_LATIN_SMALL, 0 } - { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_TELU - { AF_BLUE_STRING_TELUGU_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_TELUGU_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_THAI - { AF_BLUE_STRING_THAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_THAI_BOTTOM, 0 } - { AF_BLUE_STRING_THAI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_THAI_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_THAI_DESCENDER, 0 } - { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0 } - { AF_BLUE_STRING_THAI_DIGIT_TOP, 0 } - { AF_BLUE_STRING_MAX, 0 } - - -#ifdef AF_CONFIG_OPTION_CJK - - AF_BLUE_STRINGSET_HANI - { AF_BLUE_STRING_CJK_TOP, AF_BLUE_PROPERTY_CJK_TOP } - { AF_BLUE_STRING_CJK_BOTTOM, 0 } -#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - { AF_BLUE_STRING_CJK_LEFT, AF_BLUE_PROPERTY_CJK_HORIZ } - { AF_BLUE_STRING_CJK_RIGHT, AF_BLUE_PROPERTY_CJK_HORIZ | - AF_BLUE_PROPERTY_CJK_RIGHT } -#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ - { AF_BLUE_STRING_MAX, 0 } - -#endif /* AF_CONFIG_OPTION_CJK */ - - -// END diff --git a/3party/freetype/src/autofit/afblue.h b/3party/freetype/src/autofit/afblue.h deleted file mode 100644 index 2080e31fc4..0000000000 --- a/3party/freetype/src/autofit/afblue.h +++ /dev/null @@ -1,215 +0,0 @@ -/* This file has been generated by the Perl script `afblue.pl', */ -/* using data from file `afblue.dat'. */ - -/***************************************************************************/ -/* */ -/* afblue.h */ -/* */ -/* Auto-fitter data for blue strings (specification). */ -/* */ -/* Copyright 2013-2015 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 __AFBLUE_H__ -#define __AFBLUE_H__ - - -FT_BEGIN_HEADER - - - /* an auxiliary macro to decode a UTF-8 character -- since we only use */ - /* hard-coded, self-converted data, no error checking is performed */ -#define GET_UTF8_CHAR( ch, p ) \ - ch = (unsigned char)*p++; \ - if ( ch >= 0x80 ) \ - { \ - FT_UInt len; \ - \ - \ - if ( ch < 0xE0 ) \ - { \ - len = 1; \ - ch &= 0x1F; \ - } \ - else if ( ch < 0xF0 ) \ - { \ - len = 2; \ - ch &= 0x0F; \ - } \ - else \ - { \ - len = 3; \ - ch &= 0x07; \ - } \ - \ - for ( ; len > 0; len-- ) \ - ch = ( ch << 6 ) | ( *p++ & 0x3F ); \ - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** B L U E S T R I N G S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* At the bottommost level, we define strings for finding blue zones. */ - - -#define AF_BLUE_STRING_MAX_LEN 51 - - /* The AF_Blue_String enumeration values are offsets into the */ - /* `af_blue_strings' array. */ - - typedef enum AF_Blue_String_ - { - AF_BLUE_STRING_ARABIC_TOP = 0, - AF_BLUE_STRING_ARABIC_BOTTOM = 13, - AF_BLUE_STRING_ARABIC_JOIN = 24, - AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP = 27, - AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM = 44, - AF_BLUE_STRING_CYRILLIC_SMALL = 61, - AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER = 78, - AF_BLUE_STRING_DEVANAGARI_BASE = 85, - AF_BLUE_STRING_DEVANAGARI_TOP = 110, - AF_BLUE_STRING_DEVANAGARI_HEAD = 135, - AF_BLUE_STRING_DEVANAGARI_BOTTOM = 160, - AF_BLUE_STRING_GREEK_CAPITAL_TOP = 167, - AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM = 182, - AF_BLUE_STRING_GREEK_SMALL_BETA_TOP = 195, - AF_BLUE_STRING_GREEK_SMALL = 208, - AF_BLUE_STRING_GREEK_SMALL_DESCENDER = 225, - AF_BLUE_STRING_HEBREW_TOP = 242, - AF_BLUE_STRING_HEBREW_BOTTOM = 259, - AF_BLUE_STRING_HEBREW_DESCENDER = 272, - AF_BLUE_STRING_LATIN_CAPITAL_TOP = 283, - AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM = 292, - AF_BLUE_STRING_LATIN_SMALL_F_TOP = 301, - AF_BLUE_STRING_LATIN_SMALL = 309, - AF_BLUE_STRING_LATIN_SMALL_DESCENDER = 317, - AF_BLUE_STRING_TELUGU_TOP = 323, - AF_BLUE_STRING_TELUGU_BOTTOM = 345, - AF_BLUE_STRING_THAI_TOP = 367, - AF_BLUE_STRING_THAI_BOTTOM = 386, - AF_BLUE_STRING_THAI_ASCENDER = 408, - AF_BLUE_STRING_THAI_LARGE_ASCENDER = 418, - AF_BLUE_STRING_THAI_DESCENDER = 428, - AF_BLUE_STRING_THAI_LARGE_DESCENDER = 441, - AF_BLUE_STRING_THAI_DIGIT_TOP = 448, - af_blue_1_1 = 457, -#ifdef AF_CONFIG_OPTION_CJK - AF_BLUE_STRING_CJK_TOP = af_blue_1_1 + 1, - AF_BLUE_STRING_CJK_BOTTOM = af_blue_1_1 + 153, - af_blue_1_1_1 = af_blue_1_1 + 304, -#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - AF_BLUE_STRING_CJK_LEFT = af_blue_1_1_1 + 1, - AF_BLUE_STRING_CJK_RIGHT = af_blue_1_1_1 + 153, - af_blue_1_1_2 = af_blue_1_1_1 + 304, -#else - af_blue_1_1_2 = af_blue_1_1_1 + 0, -#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ - af_blue_1_2 = af_blue_1_1_2 + 0, -#else - af_blue_1_2 = af_blue_1_1 + 0, -#endif /* AF_CONFIG_OPTION_CJK */ - - - AF_BLUE_STRING_MAX /* do not remove */ - - } AF_Blue_String; - - - FT_LOCAL_ARRAY( char ) - af_blue_strings[]; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** B L U E S T R I N G S E T S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* The next level is to group blue strings into style-specific sets. */ - - - /* Properties are specific to a writing system. We assume that a given */ - /* blue string can't be used in more than a single writing system, which */ - /* is a safe bet. */ -#define AF_BLUE_PROPERTY_LATIN_TOP ( 1U << 0 ) /* must have value 1 */ -#define AF_BLUE_PROPERTY_LATIN_NEUTRAL ( 1U << 1 ) -#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT ( 1U << 2 ) -#define AF_BLUE_PROPERTY_LATIN_LONG ( 1U << 3 ) - -#define AF_BLUE_PROPERTY_CJK_TOP ( 1U << 0 ) /* must have value 1 */ -#define AF_BLUE_PROPERTY_CJK_HORIZ ( 1U << 1 ) /* must have value 2 */ -#define AF_BLUE_PROPERTY_CJK_RIGHT AF_BLUE_PROPERTY_CJK_TOP - - -#define AF_BLUE_STRINGSET_MAX_LEN 8 - - /* The AF_Blue_Stringset enumeration values are offsets into the */ - /* `af_blue_stringsets' array. */ - - typedef enum AF_Blue_Stringset_ - { - AF_BLUE_STRINGSET_ARAB = 0, - AF_BLUE_STRINGSET_CYRL = 4, - AF_BLUE_STRINGSET_DEVA = 10, - AF_BLUE_STRINGSET_GREK = 16, - AF_BLUE_STRINGSET_HEBR = 23, - AF_BLUE_STRINGSET_LATN = 27, - AF_BLUE_STRINGSET_TELU = 34, - AF_BLUE_STRINGSET_THAI = 37, - af_blue_2_1 = 45, -#ifdef AF_CONFIG_OPTION_CJK - AF_BLUE_STRINGSET_HANI = af_blue_2_1 + 0, - af_blue_2_1_1 = af_blue_2_1 + 2, -#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - af_blue_2_1_2 = af_blue_2_1_1 + 2, -#else - af_blue_2_1_2 = af_blue_2_1_1 + 0, -#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ - af_blue_2_2 = af_blue_2_1_2 + 1, -#else - af_blue_2_2 = af_blue_2_1 + 0, -#endif /* AF_CONFIG_OPTION_CJK */ - - - AF_BLUE_STRINGSET_MAX /* do not remove */ - - } AF_Blue_Stringset; - - - typedef struct AF_Blue_StringRec_ - { - AF_Blue_String string; - FT_UShort properties; - - } AF_Blue_StringRec; - - - FT_LOCAL_ARRAY( AF_Blue_StringRec ) - af_blue_stringsets[]; - -/* */ - -FT_END_HEADER - - -#endif /* __AFBLUE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afblue.hin b/3party/freetype/src/autofit/afblue.hin deleted file mode 100644 index ad43fe6cef..0000000000 --- a/3party/freetype/src/autofit/afblue.hin +++ /dev/null @@ -1,142 +0,0 @@ -/***************************************************************************/ -/* */ -/* afblue.h */ -/* */ -/* Auto-fitter data for blue strings (specification). */ -/* */ -/* Copyright 2013-2015 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 __AFBLUE_H__ -#define __AFBLUE_H__ - - -FT_BEGIN_HEADER - - - /* an auxiliary macro to decode a UTF-8 character -- since we only use */ - /* hard-coded, self-converted data, no error checking is performed */ -#define GET_UTF8_CHAR( ch, p ) \ - ch = (unsigned char)*p++; \ - if ( ch >= 0x80 ) \ - { \ - FT_UInt len; \ - \ - \ - if ( ch < 0xE0 ) \ - { \ - len = 1; \ - ch &= 0x1F; \ - } \ - else if ( ch < 0xF0 ) \ - { \ - len = 2; \ - ch &= 0x0F; \ - } \ - else \ - { \ - len = 3; \ - ch &= 0x07; \ - } \ - \ - for ( ; len > 0; len-- ) \ - ch = ( ch << 6 ) | ( *p++ & 0x3F ); \ - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** B L U E S T R I N G S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* At the bottommost level, we define strings for finding blue zones. */ - - -#define AF_BLUE_STRING_MAX_LEN @AF_BLUE_STRING_MAX_LEN@ - - /* The AF_Blue_String enumeration values are offsets into the */ - /* `af_blue_strings' array. */ - - typedef enum AF_Blue_String_ - { -@AF_BLUE_STRING_ENUM@ - - AF_BLUE_STRING_MAX /* do not remove */ - - } AF_Blue_String; - - - FT_LOCAL_ARRAY( char ) - af_blue_strings[]; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** B L U E S T R I N G S E T S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* The next level is to group blue strings into style-specific sets. */ - - - /* Properties are specific to a writing system. We assume that a given */ - /* blue string can't be used in more than a single writing system, which */ - /* is a safe bet. */ -#define AF_BLUE_PROPERTY_LATIN_TOP ( 1U << 0 ) /* must have value 1 */ -#define AF_BLUE_PROPERTY_LATIN_NEUTRAL ( 1U << 1 ) -#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT ( 1U << 2 ) -#define AF_BLUE_PROPERTY_LATIN_LONG ( 1U << 3 ) - -#define AF_BLUE_PROPERTY_CJK_TOP ( 1U << 0 ) /* must have value 1 */ -#define AF_BLUE_PROPERTY_CJK_HORIZ ( 1U << 1 ) /* must have value 2 */ -#define AF_BLUE_PROPERTY_CJK_RIGHT AF_BLUE_PROPERTY_CJK_TOP - - -#define AF_BLUE_STRINGSET_MAX_LEN @AF_BLUE_STRINGSET_MAX_LEN@ - - /* The AF_Blue_Stringset enumeration values are offsets into the */ - /* `af_blue_stringsets' array. */ - - typedef enum AF_Blue_Stringset_ - { -@AF_BLUE_STRINGSET_ENUM@ - - AF_BLUE_STRINGSET_MAX /* do not remove */ - - } AF_Blue_Stringset; - - - typedef struct AF_Blue_StringRec_ - { - AF_Blue_String string; - FT_UShort properties; - - } AF_Blue_StringRec; - - - FT_LOCAL_ARRAY( AF_Blue_StringRec ) - af_blue_stringsets[]; - -/* */ - -FT_END_HEADER - - -#endif /* __AFBLUE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afcjk.c b/3party/freetype/src/autofit/afcjk.c deleted file mode 100644 index 905408bb26..0000000000 --- a/3party/freetype/src/autofit/afcjk.c +++ /dev/null @@ -1,2309 +0,0 @@ -/***************************************************************************/ -/* */ -/* afcjk.c */ -/* */ -/* Auto-fitter hinting routines for CJK writing system (body). */ -/* */ -/* Copyright 2006-2015 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. */ -/* */ -/***************************************************************************/ - - /* - * The algorithm is based on akito's autohint patch, available here: - * - * http://www.kde.gr.jp/~akito/patch/freetype2/ - * - */ - -#include <ft2build.h> -#include FT_ADVANCES_H -#include FT_INTERNAL_DEBUG_H - -#include "afglobal.h" -#include "afpic.h" -#include "aflatin.h" - - -#ifdef AF_CONFIG_OPTION_CJK - -#undef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - -#include "afcjk.h" -#include "aferrors.h" - - -#ifdef AF_CONFIG_OPTION_USE_WARPER -#include "afwarp.h" -#endif - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_afcjk - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* Basically the Latin version with AF_CJKMetrics */ - /* to replace AF_LatinMetrics. */ - - FT_LOCAL_DEF( void ) - af_cjk_metrics_init_widths( AF_CJKMetrics metrics, - FT_Face face ) - { - /* scan the array of segments in each direction */ - AF_GlyphHintsRec hints[1]; - - - FT_TRACE5(( "\n" - "cjk standard widths computation (style `%s')\n" - "===================================================\n" - "\n", - af_style_names[metrics->root.style_class->style] )); - - af_glyph_hints_init( hints, face->memory ); - - metrics->axis[AF_DIMENSION_HORZ].width_count = 0; - metrics->axis[AF_DIMENSION_VERT].width_count = 0; - - { - FT_Error error; - FT_ULong glyph_index; - FT_Long y_offset; - int dim; - AF_CJKMetricsRec dummy[1]; - AF_Scaler scaler = &dummy->root.scaler; - -#ifdef FT_CONFIG_OPTION_PIC - AF_FaceGlobals globals = metrics->root.globals; -#endif - - AF_StyleClass style_class = metrics->root.style_class; - AF_ScriptClass script_class = AF_SCRIPT_CLASSES_GET - [style_class->script]; - - FT_UInt32 standard_char; - - - standard_char = script_class->standard_char1; - af_get_char_index( &metrics->root, - standard_char, - &glyph_index, - &y_offset ); - if ( !glyph_index ) - { - if ( script_class->standard_char2 ) - { - standard_char = script_class->standard_char2; - af_get_char_index( &metrics->root, - standard_char, - &glyph_index, - &y_offset ); - if ( !glyph_index ) - { - if ( script_class->standard_char3 ) - { - standard_char = script_class->standard_char3; - af_get_char_index( &metrics->root, - standard_char, - &glyph_index, - &y_offset ); - if ( !glyph_index ) - goto Exit; - } - else - goto Exit; - } - } - else - goto Exit; - } - - FT_TRACE5(( "standard character: U+%04lX (glyph index %d)\n", - standard_char, glyph_index )); - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || face->glyph->outline.n_points <= 0 ) - goto Exit; - - FT_ZERO( dummy ); - - dummy->units_per_em = metrics->units_per_em; - - scaler->x_scale = 0x10000L; - scaler->y_scale = 0x10000L; - scaler->x_delta = 0; - scaler->y_delta = 0; - - scaler->face = face; - scaler->render_mode = FT_RENDER_MODE_NORMAL; - scaler->flags = 0; - - af_glyph_hints_rescale( hints, (AF_StyleMetrics)dummy ); - - error = af_glyph_hints_reload( hints, &face->glyph->outline ); - if ( error ) - goto Exit; - - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_CJKAxis axis = &metrics->axis[dim]; - AF_AxisHints axhints = &hints->axis[dim]; - AF_Segment seg, limit, link; - FT_UInt num_widths = 0; - - - error = af_latin_hints_compute_segments( hints, - (AF_Dimension)dim ); - if ( error ) - goto Exit; - - af_latin_hints_link_segments( hints, - 0, - NULL, - (AF_Dimension)dim ); - - seg = axhints->segments; - limit = seg + axhints->num_segments; - - for ( ; seg < limit; seg++ ) - { - link = seg->link; - - /* we only consider stem segments there! */ - if ( link && link->link == seg && link > seg ) - { - FT_Pos dist; - - - dist = seg->pos - link->pos; - if ( dist < 0 ) - dist = -dist; - - if ( num_widths < AF_CJK_MAX_WIDTHS ) - axis->widths[num_widths++].org = dist; - } - } - - /* this also replaces multiple almost identical stem widths */ - /* with a single one (the value 100 is heuristic) */ - af_sort_and_quantize_widths( &num_widths, axis->widths, - dummy->units_per_em / 100 ); - axis->width_count = num_widths; - } - - Exit: - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_CJKAxis axis = &metrics->axis[dim]; - FT_Pos stdw; - - - stdw = ( axis->width_count > 0 ) ? axis->widths[0].org - : AF_LATIN_CONSTANT( metrics, 50 ); - - /* let's try 20% of the smallest width */ - axis->edge_distance_threshold = stdw / 5; - axis->standard_width = stdw; - axis->extra_light = 0; - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_UInt i; - - - FT_TRACE5(( "%s widths:\n", - dim == AF_DIMENSION_VERT ? "horizontal" - : "vertical" )); - - FT_TRACE5(( " %d (standard)", axis->standard_width )); - for ( i = 1; i < axis->width_count; i++ ) - FT_TRACE5(( " %d", axis->widths[i].org )); - - FT_TRACE5(( "\n" )); - } -#endif - } - } - - FT_TRACE5(( "\n" )); - - af_glyph_hints_done( hints ); - } - - - /* Find all blue zones. */ - - static void - af_cjk_metrics_init_blues( AF_CJKMetrics metrics, - FT_Face face ) - { - FT_Pos fills[AF_BLUE_STRING_MAX_LEN]; - FT_Pos flats[AF_BLUE_STRING_MAX_LEN]; - - FT_UInt num_fills; - FT_UInt num_flats; - - FT_Bool fill; - - AF_CJKBlue blue; - FT_Error error; - AF_CJKAxis axis; - FT_Outline outline; - - AF_StyleClass sc = metrics->root.style_class; - - AF_Blue_Stringset bss = sc->blue_stringset; - const AF_Blue_StringRec* bs = &af_blue_stringsets[bss]; - - - /* we walk over the blue character strings as specified in the */ - /* style's entry in the `af_blue_stringset' array, computing its */ - /* extremum points (depending on the string properties) */ - - FT_TRACE5(( "cjk blue zones computation\n" - "==========================\n" - "\n" )); - - for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ ) - { - const char* p = &af_blue_strings[bs->string]; - FT_Pos* blue_ref; - FT_Pos* blue_shoot; - - - if ( AF_CJK_IS_HORIZ_BLUE( bs ) ) - axis = &metrics->axis[AF_DIMENSION_HORZ]; - else - axis = &metrics->axis[AF_DIMENSION_VERT]; - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_String* cjk_blue_name[4] = - { - (FT_String*)"bottom", /* -- , -- */ - (FT_String*)"top", /* -- , TOP */ - (FT_String*)"left", /* HORIZ, -- */ - (FT_String*)"right" /* HORIZ, TOP */ - }; - - - FT_TRACE5(( "blue zone %d (%s):\n", - axis->blue_count, - cjk_blue_name[AF_CJK_IS_HORIZ_BLUE( bs ) | - AF_CJK_IS_TOP_BLUE( bs ) ] )); - } -#endif /* FT_DEBUG_LEVEL_TRACE */ - - num_fills = 0; - num_flats = 0; - - fill = 1; /* start with characters that define fill values */ - FT_TRACE5(( " [overshoot values]\n" )); - - while ( *p ) - { - FT_ULong ch; - FT_ULong glyph_index; - FT_Long y_offset; - FT_Pos best_pos; /* same as points.y or points.x, resp. */ - FT_Int best_point; - FT_Vector* points; - - - GET_UTF8_CHAR( ch, p ); - - /* switch to characters that define flat values */ - if ( ch == '|' ) - { - fill = 0; - FT_TRACE5(( " [reference values]\n" )); - continue; - } - - /* load the character in the face -- skip unknown or empty ones */ - af_get_char_index( &metrics->root, ch, &glyph_index, &y_offset ); - if ( glyph_index == 0 ) - { - FT_TRACE5(( " U+%04lX unavailable\n", ch )); - continue; - } - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - outline = face->glyph->outline; - if ( error || outline.n_points <= 0 ) - { - FT_TRACE5(( " U+%04lX contains no outlines\n", ch )); - continue; - } - - /* now compute min or max point indices and coordinates */ - points = outline.points; - best_point = -1; - best_pos = 0; /* make compiler happy */ - - { - FT_Int nn; - FT_Int first = 0; - FT_Int last = -1; - - - for ( nn = 0; nn < outline.n_contours; first = last + 1, nn++ ) - { - FT_Int pp; - - - last = outline.contours[nn]; - - /* Avoid single-point contours since they are never rasterized. */ - /* In some fonts, they correspond to mark attachment points */ - /* which are way outside of the glyph's real outline. */ - if ( last <= first ) - continue; - - if ( AF_CJK_IS_HORIZ_BLUE( bs ) ) - { - if ( AF_CJK_IS_RIGHT_BLUE( bs ) ) - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].x > best_pos ) - { - best_point = pp; - best_pos = points[pp].x; - } - } - else - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].x < best_pos ) - { - best_point = pp; - best_pos = points[pp].x; - } - } - } - else - { - if ( AF_CJK_IS_TOP_BLUE( bs ) ) - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y > best_pos ) - { - best_point = pp; - best_pos = points[pp].y; - } - } - else - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y < best_pos ) - { - best_point = pp; - best_pos = points[pp].y; - } - } - } - } - - FT_TRACE5(( " U+%04lX: best_pos = %5ld\n", ch, best_pos )); - } - - if ( fill ) - fills[num_fills++] = best_pos; - else - flats[num_flats++] = best_pos; - } - - if ( num_flats == 0 && num_fills == 0 ) - { - /* - * we couldn't find a single glyph to compute this blue zone, - * we will simply ignore it then - */ - FT_TRACE5(( " empty\n" )); - continue; - } - - /* we have computed the contents of the `fill' and `flats' tables, */ - /* now determine the reference and overshoot position of the blue -- */ - /* we simply take the median value after a simple sort */ - af_sort_pos( num_fills, fills ); - af_sort_pos( num_flats, flats ); - - blue = &axis->blues[axis->blue_count]; - blue_ref = &blue->ref.org; - blue_shoot = &blue->shoot.org; - - axis->blue_count++; - - if ( num_flats == 0 ) - { - *blue_ref = - *blue_shoot = fills[num_fills / 2]; - } - else if ( num_fills == 0 ) - { - *blue_ref = - *blue_shoot = flats[num_flats / 2]; - } - else - { - *blue_ref = fills[num_fills / 2]; - *blue_shoot = flats[num_flats / 2]; - } - - /* make sure blue_ref >= blue_shoot for top/right or */ - /* vice versa for bottom/left */ - if ( *blue_shoot != *blue_ref ) - { - FT_Pos ref = *blue_ref; - FT_Pos shoot = *blue_shoot; - FT_Bool under_ref = FT_BOOL( shoot < ref ); - - - /* AF_CJK_IS_TOP_BLUE covers `right' and `top' */ - if ( AF_CJK_IS_TOP_BLUE( bs ) ^ under_ref ) - { - *blue_ref = - *blue_shoot = ( shoot + ref ) / 2; - - FT_TRACE5(( " [reference smaller than overshoot," - " taking mean value]\n" )); - } - } - - blue->flags = 0; - if ( AF_CJK_IS_TOP_BLUE( bs ) ) - blue->flags |= AF_CJK_BLUE_TOP; - - FT_TRACE5(( " -> reference = %ld\n" - " overshoot = %ld\n", - *blue_ref, *blue_shoot )); - } - - FT_TRACE5(( "\n" )); - - return; - } - - - /* Basically the Latin version with type AF_CJKMetrics for metrics. */ - - FT_LOCAL_DEF( void ) - af_cjk_metrics_check_digits( AF_CJKMetrics metrics, - FT_Face face ) - { - FT_UInt i; - FT_Bool started = 0, same_width = 1; - FT_Fixed advance, old_advance = 0; - - - /* digit `0' is 0x30 in all supported charmaps */ - for ( i = 0x30; i <= 0x39; i++ ) - { - FT_ULong glyph_index; - FT_Long y_offset; - - - af_get_char_index( &metrics->root, i, &glyph_index, &y_offset ); - if ( glyph_index == 0 ) - continue; - - if ( FT_Get_Advance( face, glyph_index, - FT_LOAD_NO_SCALE | - FT_LOAD_NO_HINTING | - FT_LOAD_IGNORE_TRANSFORM, - &advance ) ) - continue; - - if ( started ) - { - if ( advance != old_advance ) - { - same_width = 0; - break; - } - } - else - { - old_advance = advance; - started = 1; - } - } - - metrics->root.digits_have_same_width = same_width; - } - - - /* Initialize global metrics. */ - - FT_LOCAL_DEF( FT_Error ) - af_cjk_metrics_init( AF_CJKMetrics metrics, - FT_Face face ) - { - FT_CharMap oldmap = face->charmap; - - - metrics->units_per_em = face->units_per_EM; - - if ( !FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) - { - af_cjk_metrics_init_widths( metrics, face ); - af_cjk_metrics_init_blues( metrics, face ); - af_cjk_metrics_check_digits( metrics, face ); - } - - FT_Set_Charmap( face, oldmap ); - return FT_Err_Ok; - } - - - /* Adjust scaling value, then scale and shift widths */ - /* and blue zones (if applicable) for given dimension. */ - - static void - af_cjk_metrics_scale_dim( AF_CJKMetrics metrics, - AF_Scaler scaler, - AF_Dimension dim ) - { - FT_Fixed scale; - FT_Pos delta; - AF_CJKAxis axis; - FT_UInt nn; - - - if ( dim == AF_DIMENSION_HORZ ) - { - scale = scaler->x_scale; - delta = scaler->x_delta; - } - else - { - scale = scaler->y_scale; - delta = scaler->y_delta; - } - - axis = &metrics->axis[dim]; - - if ( axis->org_scale == scale && axis->org_delta == delta ) - return; - - axis->org_scale = scale; - axis->org_delta = delta; - - axis->scale = scale; - axis->delta = delta; - - /* scale the blue zones */ - for ( nn = 0; nn < axis->blue_count; nn++ ) - { - AF_CJKBlue blue = &axis->blues[nn]; - FT_Pos dist; - - - blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; - blue->ref.fit = blue->ref.cur; - blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; - blue->shoot.fit = blue->shoot.cur; - blue->flags &= ~AF_CJK_BLUE_ACTIVE; - - /* a blue zone is only active if it is less than 3/4 pixels tall */ - dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); - if ( dist <= 48 && dist >= -48 ) - { - FT_Pos delta1, delta2; - - - blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); - - /* shoot is under shoot for cjk */ - delta1 = FT_DivFix( blue->ref.fit, scale ) - blue->shoot.org; - delta2 = delta1; - if ( delta1 < 0 ) - delta2 = -delta2; - - delta2 = FT_MulFix( delta2, scale ); - - FT_TRACE5(( "delta: %d", delta1 )); - if ( delta2 < 32 ) - delta2 = 0; -#if 0 - else if ( delta2 < 64 ) - delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); -#endif - else - delta2 = FT_PIX_ROUND( delta2 ); - FT_TRACE5(( "/%d\n", delta2 )); - - if ( delta1 < 0 ) - delta2 = -delta2; - - blue->shoot.fit = blue->ref.fit - delta2; - - FT_TRACE5(( ">> active cjk blue zone %c%d[%ld/%ld]:\n" - " ref: cur=%.2f fit=%.2f\n" - " shoot: cur=%.2f fit=%.2f\n", - ( dim == AF_DIMENSION_HORZ ) ? 'H' : 'V', - nn, blue->ref.org, blue->shoot.org, - blue->ref.cur / 64.0, blue->ref.fit / 64.0, - blue->shoot.cur / 64.0, blue->shoot.fit / 64.0 )); - - blue->flags |= AF_CJK_BLUE_ACTIVE; - } - } - } - - - /* Scale global values in both directions. */ - - FT_LOCAL_DEF( void ) - af_cjk_metrics_scale( AF_CJKMetrics metrics, - AF_Scaler scaler ) - { - /* we copy the whole structure since the x and y scaling values */ - /* are not modified, contrary to e.g. the `latin' auto-hinter */ - metrics->root.scaler = *scaler; - - af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); - af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K G L Y P H A N A L Y S I S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* Walk over all contours and compute its segments. */ - - static FT_Error - af_cjk_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - FT_Error error; - AF_Segment seg; - - - error = af_latin_hints_compute_segments( hints, dim ); - if ( error ) - return error; - - /* a segment is round if it doesn't have successive */ - /* on-curve points. */ - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Point pt = seg->first; - AF_Point last = seg->last; - FT_UInt f0 = pt->flags & AF_FLAG_CONTROL; - FT_UInt f1; - - - seg->flags &= ~AF_EDGE_ROUND; - - for ( ; pt != last; f0 = f1 ) - { - pt = pt->next; - f1 = pt->flags & AF_FLAG_CONTROL; - - if ( !f0 && !f1 ) - break; - - if ( pt == last ) - seg->flags |= AF_EDGE_ROUND; - } - } - - return FT_Err_Ok; - } - - - static void - af_cjk_hints_link_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Direction major_dir = axis->major_dir; - AF_Segment seg1, seg2; - FT_Pos len_threshold; - FT_Pos dist_threshold; - - - len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); - - dist_threshold = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale - : hints->y_scale; - dist_threshold = FT_DivFix( 64 * 3, dist_threshold ); - - /* now compare each segment to the others */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - if ( seg1->dir != major_dir ) - continue; - - for ( seg2 = segments; seg2 < segment_limit; seg2++ ) - if ( seg2 != seg1 && seg1->dir + seg2->dir == 0 ) - { - FT_Pos dist = seg2->pos - seg1->pos; - - - if ( dist < 0 ) - continue; - - { - FT_Pos min = seg1->min_coord; - FT_Pos max = seg1->max_coord; - FT_Pos len; - - - if ( min < seg2->min_coord ) - min = seg2->min_coord; - - if ( max > seg2->max_coord ) - max = seg2->max_coord; - - len = max - min; - if ( len >= len_threshold ) - { - if ( dist * 8 < seg1->score * 9 && - ( dist * 8 < seg1->score * 7 || seg1->len < len ) ) - { - seg1->score = dist; - seg1->len = len; - seg1->link = seg2; - } - - if ( dist * 8 < seg2->score * 9 && - ( dist * 8 < seg2->score * 7 || seg2->len < len ) ) - { - seg2->score = dist; - seg2->len = len; - seg2->link = seg1; - } - } - } - } - } - - /* - * now compute the `serif' segments - * - * In Hanzi, some strokes are wider on one or both of the ends. - * We either identify the stems on the ends as serifs or remove - * the linkage, depending on the length of the stems. - * - */ - - { - AF_Segment link1, link2; - - - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - link1 = seg1->link; - if ( !link1 || link1->link != seg1 || link1->pos <= seg1->pos ) - continue; - - if ( seg1->score >= dist_threshold ) - continue; - - for ( seg2 = segments; seg2 < segment_limit; seg2++ ) - { - if ( seg2->pos > seg1->pos || seg1 == seg2 ) - continue; - - link2 = seg2->link; - if ( !link2 || link2->link != seg2 || link2->pos < link1->pos ) - continue; - - if ( seg1->pos == seg2->pos && link1->pos == link2->pos ) - continue; - - if ( seg2->score <= seg1->score || seg1->score * 4 <= seg2->score ) - continue; - - /* seg2 < seg1 < link1 < link2 */ - - if ( seg1->len >= seg2->len * 3 ) - { - AF_Segment seg; - - - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Segment link = seg->link; - - - if ( link == seg2 ) - { - seg->link = NULL; - seg->serif = link1; - } - else if ( link == link2 ) - { - seg->link = NULL; - seg->serif = seg1; - } - } - } - else - { - seg1->link = link1->link = NULL; - - break; - } - } - } - } - - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - seg2 = seg1->link; - - if ( seg2 ) - { - seg2->num_linked++; - if ( seg2->link != seg1 ) - { - seg1->link = NULL; - - if ( seg2->score < dist_threshold || seg1->score < seg2->score * 4 ) - seg1->serif = seg2->link; - else - seg2->num_linked--; - } - } - } - } - - - static FT_Error - af_cjk_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - FT_Error error = FT_Err_Ok; - FT_Memory memory = hints->memory; - AF_CJKAxis laxis = &((AF_CJKMetrics)hints->metrics)->axis[dim]; - - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Segment seg; - - FT_Fixed scale; - FT_Pos edge_distance_threshold; - - - axis->num_edges = 0; - - scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale - : hints->y_scale; - - /*********************************************************************/ - /* */ - /* We begin by generating a sorted table of edges for the current */ - /* direction. To do so, we simply scan each segment and try to find */ - /* an edge in our table that corresponds to its position. */ - /* */ - /* If no edge is found, we create and insert a new edge in the */ - /* sorted table. Otherwise, we simply add the segment to the edge's */ - /* list which is then processed in the second step to compute the */ - /* edge's properties. */ - /* */ - /* Note that the edges table is sorted along the segment/edge */ - /* position. */ - /* */ - /*********************************************************************/ - - edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, - scale ); - if ( edge_distance_threshold > 64 / 4 ) - edge_distance_threshold = FT_DivFix( 64 / 4, scale ); - else - edge_distance_threshold = laxis->edge_distance_threshold; - - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge found = NULL; - FT_Pos best = 0xFFFFU; - FT_Int ee; - - - /* look for an edge corresponding to the segment */ - for ( ee = 0; ee < axis->num_edges; ee++ ) - { - AF_Edge edge = axis->edges + ee; - FT_Pos dist; - - - if ( edge->dir != seg->dir ) - continue; - - dist = seg->pos - edge->fpos; - if ( dist < 0 ) - dist = -dist; - - if ( dist < edge_distance_threshold && dist < best ) - { - AF_Segment link = seg->link; - - - /* check whether all linked segments of the candidate edge */ - /* can make a single edge. */ - if ( link ) - { - AF_Segment seg1 = edge->first; - FT_Pos dist2 = 0; - - - do - { - AF_Segment link1 = seg1->link; - - - if ( link1 ) - { - dist2 = AF_SEGMENT_DIST( link, link1 ); - if ( dist2 >= edge_distance_threshold ) - break; - } - - } while ( ( seg1 = seg1->edge_next ) != edge->first ); - - if ( dist2 >= edge_distance_threshold ) - continue; - } - - best = dist; - found = edge; - } - } - - if ( !found ) - { - AF_Edge edge; - - - /* insert a new edge in the list and */ - /* sort according to the position */ - error = af_axis_hints_new_edge( axis, seg->pos, - (AF_Direction)seg->dir, - memory, &edge ); - if ( error ) - goto Exit; - - /* add the segment to the new edge's list */ - FT_ZERO( edge ); - - edge->first = seg; - edge->last = seg; - edge->dir = seg->dir; - edge->fpos = seg->pos; - edge->opos = FT_MulFix( seg->pos, scale ); - edge->pos = edge->opos; - seg->edge_next = seg; - } - else - { - /* if an edge was found, simply add the segment to the edge's */ - /* list */ - seg->edge_next = found->first; - found->last->edge_next = seg; - found->last = seg; - } - } - - /******************************************************************/ - /* */ - /* Good, we now compute each edge's properties according to the */ - /* segments found on its position. Basically, these are */ - /* */ - /* - the edge's main direction */ - /* - stem edge, serif edge or both (which defaults to stem then) */ - /* - rounded edge, straight or both (which defaults to straight) */ - /* - link for edge */ - /* */ - /******************************************************************/ - - /* first of all, set the `edge' field in each segment -- this is */ - /* required in order to compute edge links */ - - /* - * Note that removing this loop and setting the `edge' field of each - * segment directly in the code above slows down execution speed for - * some reasons on platforms like the Sun. - */ - { - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - - - for ( edge = edges; edge < edge_limit; edge++ ) - { - seg = edge->first; - if ( seg ) - do - { - seg->edge = edge; - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - - /* now compute each edge properties */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Int is_round = 0; /* does it contain round segments? */ - FT_Int is_straight = 0; /* does it contain straight segments? */ - - - seg = edge->first; - - do - { - FT_Bool is_serif; - - - /* check for roundness of segment */ - if ( seg->flags & AF_EDGE_ROUND ) - is_round++; - else - is_straight++; - - /* check for links -- if seg->serif is set, then seg->link must */ - /* be ignored */ - is_serif = (FT_Bool)( seg->serif && seg->serif->edge != edge ); - - if ( seg->link || is_serif ) - { - AF_Edge edge2; - AF_Segment seg2; - - - edge2 = edge->link; - seg2 = seg->link; - - if ( is_serif ) - { - seg2 = seg->serif; - edge2 = edge->serif; - } - - if ( edge2 ) - { - FT_Pos edge_delta; - FT_Pos seg_delta; - - - edge_delta = edge->fpos - edge2->fpos; - if ( edge_delta < 0 ) - edge_delta = -edge_delta; - - seg_delta = AF_SEGMENT_DIST( seg, seg2 ); - - if ( seg_delta < edge_delta ) - edge2 = seg2->edge; - } - else - edge2 = seg2->edge; - - if ( is_serif ) - { - edge->serif = edge2; - edge2->flags |= AF_EDGE_SERIF; - } - else - edge->link = edge2; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - - /* set the round/straight flags */ - edge->flags = AF_EDGE_NORMAL; - - if ( is_round > 0 && is_round >= is_straight ) - edge->flags |= AF_EDGE_ROUND; - - /* get rid of serifs if link is set */ - /* XXX: This gets rid of many unpleasant artefacts! */ - /* Example: the `c' in cour.pfa at size 13 */ - - if ( edge->serif && edge->link ) - edge->serif = NULL; - } - } - - Exit: - return error; - } - - - /* Detect segments and edges for given dimension. */ - - static FT_Error - af_cjk_hints_detect_features( AF_GlyphHints hints, - AF_Dimension dim ) - { - FT_Error error; - - - error = af_cjk_hints_compute_segments( hints, dim ); - if ( !error ) - { - af_cjk_hints_link_segments( hints, dim ); - - error = af_cjk_hints_compute_edges( hints, dim ); - } - return error; - } - - - /* Compute all edges which lie within blue zones. */ - - static void - af_cjk_hints_compute_blue_edges( AF_GlyphHints hints, - AF_CJKMetrics metrics, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edge = axis->edges; - AF_Edge edge_limit = edge + axis->num_edges; - AF_CJKAxis cjk = &metrics->axis[dim]; - FT_Fixed scale = cjk->scale; - FT_Pos best_dist0; /* initial threshold */ - - - /* compute the initial threshold as a fraction of the EM size */ - best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale ); - - if ( best_dist0 > 64 / 2 ) /* maximum 1/2 pixel */ - best_dist0 = 64 / 2; - - /* compute which blue zones are active, i.e. have their scaled */ - /* size < 3/4 pixels */ - - /* If the distant between an edge and a blue zone is shorter than */ - /* best_dist0, set the blue zone for the edge. Then search for */ - /* the blue zone with the smallest best_dist to the edge. */ - - for ( ; edge < edge_limit; edge++ ) - { - FT_UInt bb; - AF_Width best_blue = NULL; - FT_Pos best_dist = best_dist0; - - - for ( bb = 0; bb < cjk->blue_count; bb++ ) - { - AF_CJKBlue blue = cjk->blues + bb; - FT_Bool is_top_right_blue, is_major_dir; - - - /* skip inactive blue zones (i.e., those that are too small) */ - if ( !( blue->flags & AF_CJK_BLUE_ACTIVE ) ) - continue; - - /* if it is a top zone, check for right edges -- if it is a bottom */ - /* zone, check for left edges */ - /* */ - /* of course, that's for TrueType */ - is_top_right_blue = - (FT_Byte)( ( blue->flags & AF_CJK_BLUE_TOP ) != 0 ); - is_major_dir = - FT_BOOL( edge->dir == axis->major_dir ); - - /* if it is a top zone, the edge must be against the major */ - /* direction; if it is a bottom zone, it must be in the major */ - /* direction */ - if ( is_top_right_blue ^ is_major_dir ) - { - FT_Pos dist; - AF_Width compare; - - - /* Compare the edge to the closest blue zone type */ - if ( FT_ABS( edge->fpos - blue->ref.org ) > - FT_ABS( edge->fpos - blue->shoot.org ) ) - compare = &blue->shoot; - else - compare = &blue->ref; - - dist = edge->fpos - compare->org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = compare; - } - } - } - - if ( best_blue ) - edge->blue_edge = best_blue; - } - } - - - /* Initalize hinting engine. */ - - FT_LOCAL_DEF( FT_Error ) - af_cjk_hints_init( AF_GlyphHints hints, - AF_CJKMetrics metrics ) - { - FT_Render_Mode mode; - FT_UInt32 scaler_flags, other_flags; - - - af_glyph_hints_rescale( hints, (AF_StyleMetrics)metrics ); - - /* - * correct x_scale and y_scale when needed, since they may have - * been modified af_cjk_scale_dim above - */ - hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; - hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; - hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; - hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; - - /* compute flags depending on render mode, etc. */ - mode = metrics->root.scaler.render_mode; - -#if 0 /* AF_CONFIG_OPTION_USE_WARPER */ - if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) - metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; -#endif - - scaler_flags = hints->scaler_flags; - other_flags = 0; - - /* - * We snap the width of vertical stems for the monochrome and - * horizontal LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) - other_flags |= AF_LATIN_HINTS_HORZ_SNAP; - - /* - * We snap the width of horizontal stems for the monochrome and - * vertical LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) - other_flags |= AF_LATIN_HINTS_VERT_SNAP; - - /* - * We adjust stems to full pixels only if we don't use the `light' mode. - */ - if ( mode != FT_RENDER_MODE_LIGHT ) - other_flags |= AF_LATIN_HINTS_STEM_ADJUST; - - if ( mode == FT_RENDER_MODE_MONO ) - other_flags |= AF_LATIN_HINTS_MONO; - - scaler_flags |= AF_SCALER_FLAG_NO_ADVANCE; - -#ifdef AF_CONFIG_OPTION_USE_WARPER - /* get (global) warper flag */ - if ( !metrics->root.globals->module->warping ) - scaler_flags |= AF_SCALER_FLAG_NO_WARPER; -#endif - - hints->scaler_flags = scaler_flags; - hints->other_flags = other_flags; - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K G L Y P H G R I D - F I T T I N G *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* Snap a given width in scaled coordinates to one of the */ - /* current standard widths. */ - - static FT_Pos - af_cjk_snap_width( AF_Width widths, - FT_UInt count, - FT_Pos width ) - { - FT_UInt n; - FT_Pos best = 64 + 32 + 2; - FT_Pos reference = width; - FT_Pos scaled; - - - for ( n = 0; n < count; n++ ) - { - FT_Pos w; - FT_Pos dist; - - - w = widths[n].cur; - dist = width - w; - if ( dist < 0 ) - dist = -dist; - if ( dist < best ) - { - best = dist; - reference = w; - } - } - - scaled = FT_PIX_ROUND( reference ); - - if ( width >= reference ) - { - if ( width < scaled + 48 ) - width = reference; - } - else - { - if ( width > scaled - 48 ) - width = reference; - } - - return width; - } - - - /* Compute the snapped width of a given stem. */ - /* There is a lot of voodoo in this function; changing the hard-coded */ - /* parameters influence the whole hinting process. */ - - static FT_Pos - af_cjk_compute_stem_width( AF_GlyphHints hints, - AF_Dimension dim, - FT_Pos width, - FT_UInt base_flags, - FT_UInt stem_flags ) - { - AF_CJKMetrics metrics = (AF_CJKMetrics)hints->metrics; - AF_CJKAxis axis = &metrics->axis[dim]; - FT_Pos dist = width; - FT_Int sign = 0; - FT_Bool vertical = FT_BOOL( dim == AF_DIMENSION_VERT ); - - FT_UNUSED( base_flags ); - FT_UNUSED( stem_flags ); - - - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) - return width; - - if ( dist < 0 ) - { - dist = -width; - sign = 1; - } - - if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || - ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) - { - /* smooth hinting process: very lightly quantize the stem width */ - - if ( axis->width_count > 0 ) - { - if ( FT_ABS( dist - axis->widths[0].cur ) < 40 ) - { - dist = axis->widths[0].cur; - if ( dist < 48 ) - dist = 48; - - goto Done_Width; - } - } - - if ( dist < 54 ) - dist += ( 54 - dist ) / 2 ; - else if ( dist < 3 * 64 ) - { - FT_Pos delta; - - - delta = dist & 63; - dist &= -64; - - if ( delta < 10 ) - dist += delta; - else if ( delta < 22 ) - dist += 10; - else if ( delta < 42 ) - dist += delta; - else if ( delta < 54 ) - dist += 54; - else - dist += delta; - } - } - else - { - /* strong hinting process: snap the stem width to integer pixels */ - - dist = af_cjk_snap_width( axis->widths, axis->width_count, dist ); - - if ( vertical ) - { - /* in the case of vertical hinting, always round */ - /* the stem heights to integer pixels */ - - if ( dist >= 64 ) - dist = ( dist + 16 ) & ~63; - else - dist = 64; - } - else - { - if ( AF_LATIN_HINTS_DO_MONO( hints ) ) - { - /* monochrome horizontal hinting: snap widths to integer pixels */ - /* with a different threshold */ - - if ( dist < 64 ) - dist = 64; - else - dist = ( dist + 32 ) & ~63; - } - else - { - /* for horizontal anti-aliased hinting, we adopt a more subtle */ - /* approach: we strengthen small stems, round stems whose size */ - /* is between 1 and 2 pixels to an integer, otherwise nothing */ - - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - - else if ( dist < 128 ) - dist = ( dist + 22 ) & ~63; - else - /* round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & ~63; - } - } - } - - Done_Width: - if ( sign ) - dist = -dist; - - return dist; - } - - - /* Align one stem edge relative to the previous stem edge. */ - - static void - af_cjk_align_linked_edge( AF_GlyphHints hints, - AF_Dimension dim, - AF_Edge base_edge, - AF_Edge stem_edge ) - { - FT_Pos dist = stem_edge->opos - base_edge->opos; - - FT_Pos fitted_width = af_cjk_compute_stem_width( hints, dim, dist, - base_edge->flags, - stem_edge->flags ); - - - stem_edge->pos = base_edge->pos + fitted_width; - - FT_TRACE5(( " CJKLINK: edge %d @%d (opos=%.2f) linked to %.2f," - " dist was %.2f, now %.2f\n", - stem_edge - hints->axis[dim].edges, stem_edge->fpos, - stem_edge->opos / 64.0, stem_edge->pos / 64.0, - dist / 64.0, fitted_width / 64.0 )); - } - - - /* Shift the coordinates of the `serif' edge by the same amount */ - /* as the corresponding `base' edge has been moved already. */ - - static void - af_cjk_align_serif_edge( AF_GlyphHints hints, - AF_Edge base, - AF_Edge serif ) - { - FT_UNUSED( hints ); - - serif->pos = base->pos + ( serif->opos - base->opos ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** E D G E H I N T I N G ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#define AF_LIGHT_MODE_MAX_HORZ_GAP 9 -#define AF_LIGHT_MODE_MAX_VERT_GAP 15 -#define AF_LIGHT_MODE_MAX_DELTA_ABS 14 - - - static FT_Pos - af_hint_normal_stem( AF_GlyphHints hints, - AF_Edge edge, - AF_Edge edge2, - FT_Pos anchor, - AF_Dimension dim ) - { - FT_Pos org_len, cur_len, org_center; - FT_Pos cur_pos1, cur_pos2; - FT_Pos d_off1, u_off1, d_off2, u_off2, delta; - FT_Pos offset; - FT_Pos threshold = 64; - - - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) - { - if ( ( edge->flags & AF_EDGE_ROUND ) && - ( edge2->flags & AF_EDGE_ROUND ) ) - { - if ( dim == AF_DIMENSION_VERT ) - threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP; - else - threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP; - } - else - { - if ( dim == AF_DIMENSION_VERT ) - threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP / 3; - else - threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP / 3; - } - } - - org_len = edge2->opos - edge->opos; - cur_len = af_cjk_compute_stem_width( hints, dim, org_len, - edge->flags, - edge2->flags ); - - org_center = ( edge->opos + edge2->opos ) / 2 + anchor; - cur_pos1 = org_center - cur_len / 2; - cur_pos2 = cur_pos1 + cur_len; - d_off1 = cur_pos1 - FT_PIX_FLOOR( cur_pos1 ); - d_off2 = cur_pos2 - FT_PIX_FLOOR( cur_pos2 ); - u_off1 = 64 - d_off1; - u_off2 = 64 - d_off2; - delta = 0; - - - if ( d_off1 == 0 || d_off2 == 0 ) - goto Exit; - - if ( cur_len <= threshold ) - { - if ( d_off2 < cur_len ) - { - if ( u_off1 <= d_off2 ) - delta = u_off1; - else - delta = -d_off2; - } - - goto Exit; - } - - if ( threshold < 64 ) - { - if ( d_off1 >= threshold || u_off1 >= threshold || - d_off2 >= threshold || u_off2 >= threshold ) - goto Exit; - } - - offset = cur_len & 63; - - if ( offset < 32 ) - { - if ( u_off1 <= offset || d_off2 <= offset ) - goto Exit; - } - else - offset = 64 - threshold; - - d_off1 = threshold - u_off1; - u_off1 = u_off1 - offset; - u_off2 = threshold - d_off2; - d_off2 = d_off2 - offset; - - if ( d_off1 <= u_off1 ) - u_off1 = -d_off1; - - if ( d_off2 <= u_off2 ) - u_off2 = -d_off2; - - if ( FT_ABS( u_off1 ) <= FT_ABS( u_off2 ) ) - delta = u_off1; - else - delta = u_off2; - - Exit: - -#if 1 - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) - { - if ( delta > AF_LIGHT_MODE_MAX_DELTA_ABS ) - delta = AF_LIGHT_MODE_MAX_DELTA_ABS; - else if ( delta < -AF_LIGHT_MODE_MAX_DELTA_ABS ) - delta = -AF_LIGHT_MODE_MAX_DELTA_ABS; - } -#endif - - cur_pos1 += delta; - - if ( edge->opos < edge2->opos ) - { - edge->pos = cur_pos1; - edge2->pos = cur_pos1 + cur_len; - } - else - { - edge->pos = cur_pos1 + cur_len; - edge2->pos = cur_pos1; - } - - return delta; - } - - - /* The main grid-fitting routine. */ - - static void - af_cjk_hint_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - FT_PtrDist n_edges; - AF_Edge edge; - AF_Edge anchor = NULL; - FT_Pos delta = 0; - FT_Int skipped = 0; - FT_Bool has_last_stem = FALSE; - FT_Pos last_stem_pos = 0; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_UInt num_actions = 0; -#endif - - - FT_TRACE5(( "cjk %s edge hinting (style `%s')\n", - dim == AF_DIMENSION_VERT ? "horizontal" : "vertical", - af_style_names[hints->metrics->style_class->style] )); - - /* we begin by aligning all stems relative to the blue zone */ - - if ( AF_HINTS_DO_BLUES( hints ) ) - { - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Width blue; - AF_Edge edge1, edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - blue = edge->blue_edge; - edge1 = NULL; - edge2 = edge->link; - - if ( blue ) - { - edge1 = edge; - } - else if ( edge2 && edge2->blue_edge ) - { - blue = edge2->blue_edge; - edge1 = edge2; - edge2 = edge; - } - - if ( !edge1 ) - continue; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " CJKBLUE: edge %d @%d (opos=%.2f) snapped to %.2f," - " was %.2f\n", - edge1 - edges, edge1->fpos, edge1->opos / 64.0, - blue->fit / 64.0, edge1->pos / 64.0 )); - - num_actions++; -#endif - - edge1->pos = blue->fit; - edge1->flags |= AF_EDGE_DONE; - - if ( edge2 && !edge2->blue_edge ) - { - af_cjk_align_linked_edge( hints, dim, edge1, edge2 ); - edge2->flags |= AF_EDGE_DONE; - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - } - - if ( !anchor ) - anchor = edge; - } - } - - /* now we align all stem edges. */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Edge edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - /* skip all non-stem edges */ - edge2 = edge->link; - if ( !edge2 ) - { - skipped++; - continue; - } - - /* Some CJK characters have so many stems that - * the hinter is likely to merge two adjacent ones. - * To solve this problem, if either edge of a stem - * is too close to the previous one, we avoid - * aligning the two edges, but rather interpolate - * their locations at the end of this function in - * order to preserve the space between the stems. - */ - if ( has_last_stem && - ( edge->pos < last_stem_pos + 64 || - edge2->pos < last_stem_pos + 64 ) ) - { - skipped++; - continue; - } - - /* now align the stem */ - - /* this should not happen, but it's better to be safe */ - if ( edge2->blue_edge ) - { - FT_TRACE5(( "ASSERTION FAILED for edge %d\n", edge2-edges )); - - af_cjk_align_linked_edge( hints, dim, edge2, edge ); - edge->flags |= AF_EDGE_DONE; - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - - continue; - } - - if ( edge2 < edge ) - { - af_cjk_align_linked_edge( hints, dim, edge2, edge ); - edge->flags |= AF_EDGE_DONE; - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - - /* We rarely reaches here it seems; - * usually the two edges belonging - * to one stem are marked as DONE together - */ - has_last_stem = TRUE; - last_stem_pos = edge->pos; - continue; - } - - if ( dim != AF_DIMENSION_VERT && !anchor ) - { - -#if 0 - if ( fixedpitch ) - { - AF_Edge left = edge; - AF_Edge right = edge_limit - 1; - AF_EdgeRec left1, left2, right1, right2; - FT_Pos target, center1, center2; - FT_Pos delta1, delta2, d1, d2; - - - while ( right > left && !right->link ) - right--; - - left1 = *left; - left2 = *left->link; - right1 = *right->link; - right2 = *right; - - delta = ( ( ( hinter->pp2.x + 32 ) & -64 ) - hinter->pp2.x ) / 2; - target = left->opos + ( right->opos - left->opos ) / 2 + delta - 16; - - delta1 = delta; - delta1 += af_hint_normal_stem( hints, left, left->link, - delta1, 0 ); - - if ( left->link != right ) - af_hint_normal_stem( hints, right->link, right, delta1, 0 ); - - center1 = left->pos + ( right->pos - left->pos ) / 2; - - if ( center1 >= target ) - delta2 = delta - 32; - else - delta2 = delta + 32; - - delta2 += af_hint_normal_stem( hints, &left1, &left2, delta2, 0 ); - - if ( delta1 != delta2 ) - { - if ( left->link != right ) - af_hint_normal_stem( hints, &right1, &right2, delta2, 0 ); - - center2 = left1.pos + ( right2.pos - left1.pos ) / 2; - - d1 = center1 - target; - d2 = center2 - target; - - if ( FT_ABS( d2 ) < FT_ABS( d1 ) ) - { - left->pos = left1.pos; - left->link->pos = left2.pos; - - if ( left->link != right ) - { - right->link->pos = right1.pos; - right->pos = right2.pos; - } - - delta1 = delta2; - } - } - - delta = delta1; - right->link->flags |= AF_EDGE_DONE; - right->flags |= AF_EDGE_DONE; - } - else - -#endif /* 0 */ - - delta = af_hint_normal_stem( hints, edge, edge2, 0, - AF_DIMENSION_HORZ ); - } - else - af_hint_normal_stem( hints, edge, edge2, delta, dim ); - -#if 0 - printf( "stem (%d,%d) adjusted (%.1f,%.1f)\n", - edge - edges, edge2 - edges, - ( edge->pos - edge->opos ) / 64.0, - ( edge2->pos - edge2->opos ) / 64.0 ); -#endif - - anchor = edge; - edge->flags |= AF_EDGE_DONE; - edge2->flags |= AF_EDGE_DONE; - has_last_stem = TRUE; - last_stem_pos = edge2->pos; - } - - /* make sure that lowercase m's maintain their symmetry */ - - /* In general, lowercase m's have six vertical edges if they are sans */ - /* serif, or twelve if they are with serifs. This implementation is */ - /* based on that assumption, and seems to work very well with most */ - /* faces. However, if for a certain face this assumption is not */ - /* true, the m is just rendered like before. In addition, any stem */ - /* correction will only be applied to symmetrical glyphs (even if the */ - /* glyph is not an m), so the potential for unwanted distortion is */ - /* relatively low. */ - - /* We don't handle horizontal edges since we can't easily assure that */ - /* the third (lowest) stem aligns with the base line; it might end up */ - /* one pixel higher or lower. */ - - n_edges = edge_limit - edges; - if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) - { - AF_Edge edge1, edge2, edge3; - FT_Pos dist1, dist2, span; - - - if ( n_edges == 6 ) - { - edge1 = edges; - edge2 = edges + 2; - edge3 = edges + 4; - } - else - { - edge1 = edges + 1; - edge2 = edges + 5; - edge3 = edges + 9; - } - - dist1 = edge2->opos - edge1->opos; - dist2 = edge3->opos - edge2->opos; - - span = dist1 - dist2; - if ( span < 0 ) - span = -span; - - if ( edge1->link == edge1 + 1 && - edge2->link == edge2 + 1 && - edge3->link == edge3 + 1 && span < 8 ) - { - delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); - edge3->pos -= delta; - if ( edge3->link ) - edge3->link->pos -= delta; - - /* move the serifs along with the stem */ - if ( n_edges == 12 ) - { - ( edges + 8 )->pos -= delta; - ( edges + 11 )->pos -= delta; - } - - edge3->flags |= AF_EDGE_DONE; - if ( edge3->link ) - edge3->link->flags |= AF_EDGE_DONE; - } - } - - if ( !skipped ) - goto Exit; - - /* - * now hint the remaining edges (serifs and single) in order - * to complete our processing - */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - if ( edge->flags & AF_EDGE_DONE ) - continue; - - if ( edge->serif ) - { - af_cjk_align_serif_edge( hints, edge->serif, edge ); - edge->flags |= AF_EDGE_DONE; - skipped--; - } - } - - if ( !skipped ) - goto Exit; - - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Edge before, after; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - before = after = edge; - - while ( --before >= edges ) - if ( before->flags & AF_EDGE_DONE ) - break; - - while ( ++after < edge_limit ) - if ( after->flags & AF_EDGE_DONE ) - break; - - if ( before >= edges || after < edge_limit ) - { - if ( before < edges ) - af_cjk_align_serif_edge( hints, after, edge ); - else if ( after >= edge_limit ) - af_cjk_align_serif_edge( hints, before, edge ); - else - { - if ( after->fpos == before->fpos ) - edge->pos = before->pos; - else - edge->pos = before->pos + - FT_MulDiv( edge->fpos - before->fpos, - after->pos - before->pos, - after->fpos - before->fpos ); - } - } - } - - Exit: - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !num_actions ) - FT_TRACE5(( " (none)\n" )); - FT_TRACE5(( "\n" )); -#endif - - return; - } - - - static void - af_cjk_align_edge_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = & hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - FT_Bool snapping; - - - snapping = FT_BOOL( ( dim == AF_DIMENSION_HORZ && - AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) || - ( dim == AF_DIMENSION_VERT && - AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ); - - for ( edge = edges; edge < edge_limit; edge++ ) - { - /* move the points of each segment */ - /* in each edge to the edge's position */ - AF_Segment seg = edge->first; - - - if ( snapping ) - { - do - { - AF_Point point = seg->first; - - - for (;;) - { - if ( dim == AF_DIMENSION_HORZ ) - { - point->x = edge->pos; - point->flags |= AF_FLAG_TOUCH_X; - } - else - { - point->y = edge->pos; - point->flags |= AF_FLAG_TOUCH_Y; - } - - if ( point == seg->last ) - break; - - point = point->next; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - else - { - FT_Pos delta = edge->pos - edge->opos; - - - do - { - AF_Point point = seg->first; - - - for (;;) - { - if ( dim == AF_DIMENSION_HORZ ) - { - point->x += delta; - point->flags |= AF_FLAG_TOUCH_X; - } - else - { - point->y += delta; - point->flags |= AF_FLAG_TOUCH_Y; - } - - if ( point == seg->last ) - break; - - point = point->next; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - } - } - - - /* Apply the complete hinting algorithm to a CJK glyph. */ - - FT_LOCAL_DEF( FT_Error ) - af_cjk_hints_apply( AF_GlyphHints hints, - FT_Outline* outline, - AF_CJKMetrics metrics ) - { - FT_Error error; - int dim; - - FT_UNUSED( metrics ); - - - error = af_glyph_hints_reload( hints, outline ); - if ( error ) - goto Exit; - - /* analyze glyph outline */ -#ifdef AF_CONFIG_OPTION_USE_WARPER - if ( ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT && - AF_HINTS_DO_WARP( hints ) ) || - AF_HINTS_DO_HORIZONTAL( hints ) ) -#else - if ( AF_HINTS_DO_HORIZONTAL( hints ) ) -#endif - { - error = af_cjk_hints_detect_features( hints, AF_DIMENSION_HORZ ); - if ( error ) - goto Exit; - - af_cjk_hints_compute_blue_edges( hints, metrics, AF_DIMENSION_HORZ ); - } - - if ( AF_HINTS_DO_VERTICAL( hints ) ) - { - error = af_cjk_hints_detect_features( hints, AF_DIMENSION_VERT ); - if ( error ) - goto Exit; - - af_cjk_hints_compute_blue_edges( hints, metrics, AF_DIMENSION_VERT ); - } - - /* grid-fit the outline */ - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || - ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) - { - -#ifdef AF_CONFIG_OPTION_USE_WARPER - if ( dim == AF_DIMENSION_HORZ && - metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT && - AF_HINTS_DO_WARP( hints ) ) - { - AF_WarperRec warper; - FT_Fixed scale; - FT_Pos delta; - - - af_warper_compute( &warper, hints, (AF_Dimension)dim, - &scale, &delta ); - af_glyph_hints_scale_dim( hints, (AF_Dimension)dim, - scale, delta ); - continue; - } -#endif /* AF_CONFIG_OPTION_USE_WARPER */ - - af_cjk_hint_edges( hints, (AF_Dimension)dim ); - af_cjk_align_edge_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); - } - } - - af_glyph_hints_save( hints, outline ); - - Exit: - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K S C R I P T C L A S S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_cjk_writing_system_class, - - AF_WRITING_SYSTEM_CJK, - - sizeof ( AF_CJKMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) af_cjk_metrics_init, - (AF_WritingSystem_ScaleMetricsFunc)af_cjk_metrics_scale, - (AF_WritingSystem_DoneMetricsFunc) NULL, - - (AF_WritingSystem_InitHintsFunc) af_cjk_hints_init, - (AF_WritingSystem_ApplyHintsFunc) af_cjk_hints_apply - ) - - -#else /* !AF_CONFIG_OPTION_CJK */ - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_cjk_writing_system_class, - - AF_WRITING_SYSTEM_CJK, - - sizeof ( AF_CJKMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) NULL, - (AF_WritingSystem_ScaleMetricsFunc)NULL, - (AF_WritingSystem_DoneMetricsFunc) NULL, - - (AF_WritingSystem_InitHintsFunc) NULL, - (AF_WritingSystem_ApplyHintsFunc) NULL - ) - - -#endif /* !AF_CONFIG_OPTION_CJK */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afcjk.h b/3party/freetype/src/autofit/afcjk.h deleted file mode 100644 index bfd11f2d3d..0000000000 --- a/3party/freetype/src/autofit/afcjk.h +++ /dev/null @@ -1,140 +0,0 @@ -/***************************************************************************/ -/* */ -/* afcjk.h */ -/* */ -/* Auto-fitter hinting routines for CJK writing system (specification). */ -/* */ -/* Copyright 2006-2015 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 __AFCJK_H__ -#define __AFCJK_H__ - -#include "afhints.h" -#include "aflatin.h" - - -FT_BEGIN_HEADER - - - /* the CJK-specific writing system */ - - AF_DECLARE_WRITING_SYSTEM_CLASS( af_cjk_writing_system_class ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* - * CJK glyphs tend to fill the square. So we have both vertical and - * horizontal blue zones. But some glyphs have flat bounding strokes that - * leave some space between neighbour glyphs. - */ - -#define AF_CJK_IS_TOP_BLUE( b ) \ - ( (b)->properties & AF_BLUE_PROPERTY_CJK_TOP ) -#define AF_CJK_IS_HORIZ_BLUE( b ) \ - ( (b)->properties & AF_BLUE_PROPERTY_CJK_HORIZ ) -#define AF_CJK_IS_RIGHT_BLUE AF_CJK_IS_TOP_BLUE - -#define AF_CJK_MAX_WIDTHS 16 - - -#define AF_CJK_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */ -#define AF_CJK_BLUE_TOP ( 1U << 1 ) /* result of AF_CJK_IS_TOP_BLUE */ -#define AF_CJK_BLUE_ADJUSTMENT ( 1U << 2 ) /* used for scale adjustment */ - /* optimization */ - - - typedef struct AF_CJKBlueRec_ - { - AF_WidthRec ref; - AF_WidthRec shoot; /* undershoot */ - FT_UInt flags; - - } AF_CJKBlueRec, *AF_CJKBlue; - - - typedef struct AF_CJKAxisRec_ - { - FT_Fixed scale; - FT_Pos delta; - - FT_UInt width_count; /* number of used widths */ - AF_WidthRec widths[AF_CJK_MAX_WIDTHS]; /* widths array */ - FT_Pos edge_distance_threshold; /* used for creating edges */ - FT_Pos standard_width; /* the default stem thickness */ - FT_Bool extra_light; /* is standard width very light? */ - - /* used for horizontal metrics too for CJK */ - FT_Bool control_overshoot; - FT_UInt blue_count; - AF_CJKBlueRec blues[AF_BLUE_STRINGSET_MAX]; - - FT_Fixed org_scale; - FT_Pos org_delta; - - } AF_CJKAxisRec, *AF_CJKAxis; - - - typedef struct AF_CJKMetricsRec_ - { - AF_StyleMetricsRec root; - FT_UInt units_per_em; - AF_CJKAxisRec axis[AF_DIMENSION_MAX]; - - } AF_CJKMetricsRec, *AF_CJKMetrics; - - -#ifdef AF_CONFIG_OPTION_CJK - FT_LOCAL( FT_Error ) - af_cjk_metrics_init( AF_CJKMetrics metrics, - FT_Face face ); - - FT_LOCAL( void ) - af_cjk_metrics_scale( AF_CJKMetrics metrics, - AF_Scaler scaler ); - - FT_LOCAL( FT_Error ) - af_cjk_hints_init( AF_GlyphHints hints, - AF_CJKMetrics metrics ); - - FT_LOCAL( FT_Error ) - af_cjk_hints_apply( AF_GlyphHints hints, - FT_Outline* outline, - AF_CJKMetrics metrics ); - - /* shared; called from afindic.c */ - FT_LOCAL( void ) - af_cjk_metrics_check_digits( AF_CJKMetrics metrics, - FT_Face face ); - - FT_LOCAL( void ) - af_cjk_metrics_init_widths( AF_CJKMetrics metrics, - FT_Face face ); -#endif /* AF_CONFIG_OPTION_CJK */ - - -/* */ - -FT_END_HEADER - -#endif /* __AFCJK_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afcover.h b/3party/freetype/src/autofit/afcover.h deleted file mode 100644 index 520e8a4ae0..0000000000 --- a/3party/freetype/src/autofit/afcover.h +++ /dev/null @@ -1,105 +0,0 @@ -/***************************************************************************/ -/* */ -/* afcover.h */ -/* */ -/* Auto-fitter coverages (specification only). */ -/* */ -/* Copyright 2013-2015 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. */ -/* */ -/***************************************************************************/ - - - /* This header file can be included multiple times. */ - /* Define `COVERAGE' as needed. */ - - - /* Add new coverages here. The first and second arguments are the */ - /* coverage name in lowercase and uppercase, respectively, followed */ - /* by a description string. The last four arguments are the four */ - /* characters defining the corresponding OpenType feature. */ - -#if 0 - /* XXX: It's not possible to define blue zone characters in advance. */ - COVERAGE( alternative_fractions, ALTERNATIVE_FRACTIONS, - "alternative fractions", - 'a', 'f', 'r', 'c' ) -#endif - - COVERAGE( petite_capitals_from_capitals, PETITE_CAPITALS_FROM_CAPITALS, - "petite capitals from capitals", - 'c', '2', 'c', 'p' ) - - COVERAGE( small_capitals_from_capitals, SMALL_CAPITALS_FROM_CAPITALS, - "small capitals from capitals", - 'c', '2', 's', 'c' ) - -#if 0 - /* XXX: Only digits are in this coverage, however, both normal style */ - /* and oldstyle representation forms are possible. */ - COVERAGE( denominators, DENOMINATORS, - "denominators", - 'd', 'n', 'o', 'm' ) -#endif - -#if 0 - /* XXX: It's not possible to define blue zone characters in advance. */ - COVERAGE( fractions, FRACTIONS, - "fractions", - 'f', 'r', 'a', 'c' ) -#endif - -#if 0 - /* XXX: Only digits are in this coverage, however, both normal style */ - /* and oldstyle representation forms are possible. */ - COVERAGE( numerators, NUMERATORS, - "numerators", - 'n', 'u', 'm', 'r' ) -#endif - - COVERAGE( ordinals, ORDINALS, - "ordinals", - 'o', 'r', 'd', 'n' ) - - COVERAGE( petite_capitals, PETITE_CAPITALS, - "petite capitals", - 'p', 'c', 'a', 'p' ) - - COVERAGE( ruby, RUBY, - "ruby", - 'r', 'u', 'b', 'y' ) - - COVERAGE( scientific_inferiors, SCIENTIFIC_INFERIORS, - "scientific inferiors", - 's', 'i', 'n', 'f' ) - - COVERAGE( small_capitals, SMALL_CAPITALS, - "small capitals", - 's', 'm', 'c', 'p' ) - - COVERAGE( subscript, SUBSCRIPT, - "subscript", - 's', 'u', 'b', 's' ) - - COVERAGE( superscript, SUPERSCRIPT, - "superscript", - 's', 'u', 'p', 's' ) - - COVERAGE( titling, TITLING, - "titling", - 't', 'i', 't', 'l' ) - -#if 0 - /* to be always excluded */ - COVERAGE(nalt, 'n', 'a', 'l', 't'); /* Alternate Annotation Forms (?) */ - COVERAGE(ornm, 'o', 'r', 'n', 'm'); /* Ornaments (?) */ -#endif - - -/* END */ diff --git a/3party/freetype/src/autofit/afdummy.c b/3party/freetype/src/autofit/afdummy.c deleted file mode 100644 index 03ca25f33f..0000000000 --- a/3party/freetype/src/autofit/afdummy.c +++ /dev/null @@ -1,71 +0,0 @@ -/***************************************************************************/ -/* */ -/* afdummy.c */ -/* */ -/* Auto-fitter dummy routines to be used if no hinting should be */ -/* performed (body). */ -/* */ -/* Copyright 2003-2015 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 "afdummy.h" -#include "afhints.h" -#include "aferrors.h" - - - static FT_Error - af_dummy_hints_init( AF_GlyphHints hints, - AF_StyleMetrics metrics ) - { - af_glyph_hints_rescale( hints, metrics ); - - hints->x_scale = metrics->scaler.x_scale; - hints->y_scale = metrics->scaler.y_scale; - hints->x_delta = metrics->scaler.x_delta; - hints->y_delta = metrics->scaler.y_delta; - - return FT_Err_Ok; - } - - - static FT_Error - af_dummy_hints_apply( AF_GlyphHints hints, - FT_Outline* outline ) - { - FT_Error error; - - - error = af_glyph_hints_reload( hints, outline ); - if ( !error ) - af_glyph_hints_save( hints, outline ); - - return error; - } - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_dummy_writing_system_class, - - AF_WRITING_SYSTEM_DUMMY, - - sizeof ( AF_StyleMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) NULL, - (AF_WritingSystem_ScaleMetricsFunc)NULL, - (AF_WritingSystem_DoneMetricsFunc) NULL, - - (AF_WritingSystem_InitHintsFunc) af_dummy_hints_init, - (AF_WritingSystem_ApplyHintsFunc) af_dummy_hints_apply - ) - - -/* END */ diff --git a/3party/freetype/src/autofit/afdummy.h b/3party/freetype/src/autofit/afdummy.h deleted file mode 100644 index b4fdc78e39..0000000000 --- a/3party/freetype/src/autofit/afdummy.h +++ /dev/null @@ -1,40 +0,0 @@ -/***************************************************************************/ -/* */ -/* afdummy.h */ -/* */ -/* Auto-fitter dummy routines to be used if no hinting should be */ -/* performed (specification). */ -/* */ -/* Copyright 2003-2015 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 __AFDUMMY_H__ -#define __AFDUMMY_H__ - -#include "aftypes.h" - - -FT_BEGIN_HEADER - - /* A dummy writing system used when no hinting should be performed. */ - - AF_DECLARE_WRITING_SYSTEM_CLASS( af_dummy_writing_system_class ) - -/* */ - -FT_END_HEADER - - -#endif /* __AFDUMMY_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/aferrors.h b/3party/freetype/src/autofit/aferrors.h deleted file mode 100644 index 7b416e470d..0000000000 --- a/3party/freetype/src/autofit/aferrors.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* aferrors.h */ -/* */ -/* Autofitter error codes (specification only). */ -/* */ -/* Copyright 2005-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the Autofitter error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __AFERRORS_H__ -#define __AFERRORS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX AF_Err_ -#define FT_ERR_BASE FT_Mod_Err_Autofit - -#include FT_ERRORS_H - -#endif /* __AFERRORS_H__ */ - -/* END */ diff --git a/3party/freetype/src/autofit/afglobal.c b/3party/freetype/src/autofit/afglobal.c deleted file mode 100644 index 64b9293134..0000000000 --- a/3party/freetype/src/autofit/afglobal.c +++ /dev/null @@ -1,465 +0,0 @@ -/***************************************************************************/ -/* */ -/* afglobal.c */ -/* */ -/* Auto-fitter routines to compute global hinting values (body). */ -/* */ -/* Copyright 2003-2015 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 "afglobal.h" -#include "afranges.h" -#include "hbshim.h" -#include FT_INTERNAL_DEBUG_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_afglobal - - - /* get writing system specific header files */ -#undef WRITING_SYSTEM -#define WRITING_SYSTEM( ws, WS ) /* empty */ -#include "afwrtsys.h" - -#include "aferrors.h" -#include "afpic.h" - - -#undef SCRIPT -#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \ - AF_DEFINE_SCRIPT_CLASS( \ - af_ ## s ## _script_class, \ - AF_SCRIPT_ ## S, \ - af_ ## s ## _uniranges, \ - sc1, sc2, sc3 ) - -#include "afscript.h" - - -#undef STYLE -#define STYLE( s, S, d, ws, sc, ss, c ) \ - AF_DEFINE_STYLE_CLASS( \ - af_ ## s ## _style_class, \ - AF_STYLE_ ## S, \ - ws, \ - sc, \ - ss, \ - c ) - -#include "afstyles.h" - - -#ifndef FT_CONFIG_OPTION_PIC - -#undef WRITING_SYSTEM -#define WRITING_SYSTEM( ws, WS ) \ - &af_ ## ws ## _writing_system_class, - - FT_LOCAL_ARRAY_DEF( AF_WritingSystemClass ) - af_writing_system_classes[] = - { - -#include "afwrtsys.h" - - NULL /* do not remove */ - }; - - -#undef SCRIPT -#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \ - &af_ ## s ## _script_class, - - FT_LOCAL_ARRAY_DEF( AF_ScriptClass ) - af_script_classes[] = - { - -#include "afscript.h" - - NULL /* do not remove */ - }; - - -#undef STYLE -#define STYLE( s, S, d, ws, sc, ss, c ) \ - &af_ ## s ## _style_class, - - FT_LOCAL_ARRAY_DEF( AF_StyleClass ) - af_style_classes[] = - { - -#include "afstyles.h" - - NULL /* do not remove */ - }; - -#endif /* !FT_CONFIG_OPTION_PIC */ - - -#ifdef FT_DEBUG_LEVEL_TRACE - -#undef STYLE -#define STYLE( s, S, d, ws, sc, ss, c ) #s, - - FT_LOCAL_ARRAY_DEF( char* ) - af_style_names[] = - { - -#include "afstyles.h" - - }; - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - - /* Compute the style index of each glyph within a given face. */ - - static FT_Error - af_face_globals_compute_style_coverage( AF_FaceGlobals globals ) - { - FT_Error error; - FT_Face face = globals->face; - FT_CharMap old_charmap = face->charmap; - FT_Byte* gstyles = globals->glyph_styles; - FT_UInt ss; - FT_UInt i; - FT_UInt dflt = ~0U; /* a non-valid value */ - - - /* the value AF_STYLE_UNASSIGNED means `uncovered glyph' */ - FT_MEM_SET( globals->glyph_styles, - AF_STYLE_UNASSIGNED, - globals->glyph_count ); - - error = FT_Select_Charmap( face, FT_ENCODING_UNICODE ); - if ( error ) - { - /* - * Ignore this error; we simply use the fallback style. - * XXX: Shouldn't we rather disable hinting? - */ - error = FT_Err_Ok; - goto Exit; - } - - /* scan each style in a Unicode charmap */ - for ( ss = 0; AF_STYLE_CLASSES_GET[ss]; ss++ ) - { - AF_StyleClass style_class = - AF_STYLE_CLASSES_GET[ss]; - AF_ScriptClass script_class = - AF_SCRIPT_CLASSES_GET[style_class->script]; - AF_Script_UniRange range; - - - if ( script_class->script_uni_ranges == NULL ) - continue; - - /* - * Scan all Unicode points in the range and set the corresponding - * glyph style index. - */ - if ( style_class->coverage == AF_COVERAGE_DEFAULT ) - { - if ( (FT_UInt)style_class->script == - globals->module->default_script ) - dflt = ss; - - for ( range = script_class->script_uni_ranges; - range->first != 0; - range++ ) - { - FT_ULong charcode = range->first; - FT_UInt gindex; - - - gindex = FT_Get_Char_Index( face, charcode ); - - if ( gindex != 0 && - gindex < (FT_ULong)globals->glyph_count && - gstyles[gindex] == AF_STYLE_UNASSIGNED ) - gstyles[gindex] = (FT_Byte)ss; - - for (;;) - { - charcode = FT_Get_Next_Char( face, charcode, &gindex ); - - if ( gindex == 0 || charcode > range->last ) - break; - - if ( gindex < (FT_ULong)globals->glyph_count && - gstyles[gindex] == AF_STYLE_UNASSIGNED ) - gstyles[gindex] = (FT_Byte)ss; - } - } - } - else - { - /* get glyphs not directly addressable by cmap */ - af_get_coverage( globals, style_class, gstyles ); - } - } - - /* handle the default OpenType features of the default script ... */ - af_get_coverage( globals, AF_STYLE_CLASSES_GET[dflt], gstyles ); - - /* ... and the remaining default OpenType features */ - for ( ss = 0; AF_STYLE_CLASSES_GET[ss]; ss++ ) - { - AF_StyleClass style_class = AF_STYLE_CLASSES_GET[ss]; - - - if ( ss != dflt && style_class->coverage == AF_COVERAGE_DEFAULT ) - af_get_coverage( globals, style_class, gstyles ); - } - - /* mark ASCII digits */ - for ( i = 0x30; i <= 0x39; i++ ) - { - FT_UInt gindex = FT_Get_Char_Index( face, i ); - - - if ( gindex != 0 && gindex < (FT_ULong)globals->glyph_count ) - gstyles[gindex] |= AF_DIGIT; - } - - Exit: - /* - * By default, all uncovered glyphs are set to the fallback style. - * XXX: Shouldn't we disable hinting or do something similar? - */ - if ( globals->module->fallback_style != AF_STYLE_UNASSIGNED ) - { - FT_Long nn; - - - for ( nn = 0; nn < globals->glyph_count; nn++ ) - { - if ( ( gstyles[nn] & ~AF_DIGIT ) == AF_STYLE_UNASSIGNED ) - { - gstyles[nn] &= ~AF_STYLE_UNASSIGNED; - gstyles[nn] |= globals->module->fallback_style; - } - } - } - -#ifdef FT_DEBUG_LEVEL_TRACE - - FT_TRACE4(( "\n" - "style coverage\n" - "==============\n" - "\n" )); - - for ( ss = 0; AF_STYLE_CLASSES_GET[ss]; ss++ ) - { - AF_StyleClass style_class = AF_STYLE_CLASSES_GET[ss]; - FT_UInt count = 0; - FT_Long idx; - - - FT_TRACE4(( "%s:\n", af_style_names[style_class->style] )); - - for ( idx = 0; idx < globals->glyph_count; idx++ ) - { - if ( ( gstyles[idx] & ~AF_DIGIT ) == style_class->style ) - { - if ( !( count % 10 ) ) - FT_TRACE4(( " " )); - - FT_TRACE4(( " %d", idx )); - count++; - - if ( !( count % 10 ) ) - FT_TRACE4(( "\n" )); - } - } - - if ( !count ) - FT_TRACE4(( " (none)\n" )); - if ( count % 10 ) - FT_TRACE4(( "\n" )); - } - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - FT_Set_Charmap( face, old_charmap ); - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - af_face_globals_new( FT_Face face, - AF_FaceGlobals *aglobals, - AF_Module module ) - { - FT_Error error; - FT_Memory memory; - AF_FaceGlobals globals = NULL; - - - memory = face->memory; - - if ( FT_ALLOC( globals, - sizeof ( *globals ) + - (FT_ULong)face->num_glyphs * sizeof ( FT_Byte ) ) ) - goto Exit; - - globals->face = face; - globals->glyph_count = face->num_glyphs; - globals->glyph_styles = (FT_Byte*)( globals + 1 ); - globals->module = module; - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - globals->hb_font = hb_ft_font_create( face, NULL ); -#endif - - error = af_face_globals_compute_style_coverage( globals ); - if ( error ) - { - af_face_globals_free( globals ); - globals = NULL; - } - else - globals->increase_x_height = AF_PROP_INCREASE_X_HEIGHT_MAX; - - Exit: - *aglobals = globals; - return error; - } - - - FT_LOCAL_DEF( void ) - af_face_globals_free( AF_FaceGlobals globals ) - { - if ( globals ) - { - FT_Memory memory = globals->face->memory; - FT_UInt nn; - - - for ( nn = 0; nn < AF_STYLE_MAX; nn++ ) - { - if ( globals->metrics[nn] ) - { - AF_StyleClass style_class = - AF_STYLE_CLASSES_GET[nn]; - AF_WritingSystemClass writing_system_class = - AF_WRITING_SYSTEM_CLASSES_GET[style_class->writing_system]; - - - if ( writing_system_class->style_metrics_done ) - writing_system_class->style_metrics_done( globals->metrics[nn] ); - - FT_FREE( globals->metrics[nn] ); - } - } - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - hb_font_destroy( globals->hb_font ); - globals->hb_font = NULL; -#endif - - globals->glyph_count = 0; - globals->glyph_styles = NULL; /* no need to free this one! */ - globals->face = NULL; - - FT_FREE( globals ); - } - } - - - FT_LOCAL_DEF( FT_Error ) - af_face_globals_get_metrics( AF_FaceGlobals globals, - FT_UInt gindex, - FT_UInt options, - AF_StyleMetrics *ametrics ) - { - AF_StyleMetrics metrics = NULL; - - AF_Style style = (AF_Style)options; - AF_WritingSystemClass writing_system_class; - AF_StyleClass style_class; - - FT_Error error = FT_Err_Ok; - - - if ( gindex >= (FT_ULong)globals->glyph_count ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* if we have a forced style (via `options'), use it, */ - /* otherwise look into `glyph_styles' array */ - if ( style == AF_STYLE_NONE_DFLT || style + 1 >= AF_STYLE_MAX ) - style = (AF_Style)( globals->glyph_styles[gindex] & - AF_STYLE_UNASSIGNED ); - - style_class = AF_STYLE_CLASSES_GET[style]; - writing_system_class = AF_WRITING_SYSTEM_CLASSES_GET - [style_class->writing_system]; - - metrics = globals->metrics[style]; - if ( metrics == NULL ) - { - /* create the global metrics object if necessary */ - FT_Memory memory = globals->face->memory; - - - if ( FT_ALLOC( metrics, writing_system_class->style_metrics_size ) ) - goto Exit; - - metrics->style_class = style_class; - metrics->globals = globals; - - if ( writing_system_class->style_metrics_init ) - { - error = writing_system_class->style_metrics_init( metrics, - globals->face ); - if ( error ) - { - if ( writing_system_class->style_metrics_done ) - writing_system_class->style_metrics_done( metrics ); - - FT_FREE( metrics ); - goto Exit; - } - } - - globals->metrics[style] = metrics; - } - - Exit: - *ametrics = metrics; - - return error; - } - - - FT_LOCAL_DEF( FT_Bool ) - af_face_globals_is_digit( AF_FaceGlobals globals, - FT_UInt gindex ) - { - if ( gindex < (FT_ULong)globals->glyph_count ) - return (FT_Bool)( globals->glyph_styles[gindex] & AF_DIGIT ); - - return (FT_Bool)0; - } - - -/* END */ diff --git a/3party/freetype/src/autofit/afglobal.h b/3party/freetype/src/autofit/afglobal.h deleted file mode 100644 index 9bbb687e2d..0000000000 --- a/3party/freetype/src/autofit/afglobal.h +++ /dev/null @@ -1,150 +0,0 @@ -/***************************************************************************/ -/* */ -/* afglobal.h */ -/* */ -/* Auto-fitter routines to compute global hinting values */ -/* (specification). */ -/* */ -/* Copyright 2003-2015 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 __AFGLOBAL_H__ -#define __AFGLOBAL_H__ - - -#include "aftypes.h" -#include "afmodule.h" -#include "hbshim.h" - - -FT_BEGIN_HEADER - - - FT_LOCAL_ARRAY( AF_WritingSystemClass ) - af_writing_system_classes[]; - - -#undef SCRIPT -#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \ - AF_DECLARE_SCRIPT_CLASS( af_ ## s ## _script_class ) - -#include "afscript.h" - - FT_LOCAL_ARRAY( AF_ScriptClass ) - af_script_classes[]; - - -#undef STYLE -#define STYLE( s, S, d, ws, sc, ss, c ) \ - AF_DECLARE_STYLE_CLASS( af_ ## s ## _style_class ) - -#include "afstyles.h" - - FT_LOCAL_ARRAY( AF_StyleClass ) - af_style_classes[]; - - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_LOCAL_ARRAY( char* ) - af_style_names[]; -#endif - - - /* - * Default values and flags for both autofitter globals (found in - * AF_ModuleRec) and face globals (in AF_FaceGlobalsRec). - */ - - /* index of fallback style in `af_style_classes' */ -#ifdef AF_CONFIG_OPTION_CJK -#define AF_STYLE_FALLBACK AF_STYLE_HANI_DFLT -#else -#define AF_STYLE_FALLBACK AF_STYLE_NONE_DFLT -#endif - /* default script for OpenType; ignored if HarfBuzz isn't used */ -#define AF_SCRIPT_DEFAULT AF_SCRIPT_LATN - /* a bit mask indicating an uncovered glyph */ -#define AF_STYLE_UNASSIGNED 0x7F - /* if this flag is set, we have an ASCII digit */ -#define AF_DIGIT 0x80 - - /* `increase-x-height' property */ -#define AF_PROP_INCREASE_X_HEIGHT_MIN 6 -#define AF_PROP_INCREASE_X_HEIGHT_MAX 0 - - - /************************************************************************/ - /************************************************************************/ - /***** *****/ - /***** F A C E G L O B A L S *****/ - /***** *****/ - /************************************************************************/ - /************************************************************************/ - - - /* - * Note that glyph_styles[] maps each glyph to an index into the - * `af_style_classes' array. - * - */ - typedef struct AF_FaceGlobalsRec_ - { - FT_Face face; - FT_Long glyph_count; /* same as face->num_glyphs */ - FT_Byte* glyph_styles; - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - hb_font_t* hb_font; -#endif - - /* per-face auto-hinter properties */ - FT_UInt increase_x_height; - - AF_StyleMetrics metrics[AF_STYLE_MAX]; - - AF_Module module; /* to access global properties */ - - } AF_FaceGlobalsRec; - - - /* - * model the global hints data for a given face, decomposed into - * style-specific items - */ - - FT_LOCAL( FT_Error ) - af_face_globals_new( FT_Face face, - AF_FaceGlobals *aglobals, - AF_Module module ); - - FT_LOCAL( FT_Error ) - af_face_globals_get_metrics( AF_FaceGlobals globals, - FT_UInt gindex, - FT_UInt options, - AF_StyleMetrics *ametrics ); - - FT_LOCAL( void ) - af_face_globals_free( AF_FaceGlobals globals ); - - FT_LOCAL_DEF( FT_Bool ) - af_face_globals_is_digit( AF_FaceGlobals globals, - FT_UInt gindex ); - - /* */ - - -FT_END_HEADER - -#endif /* __AFGLOBAL_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afhints.c b/3party/freetype/src/autofit/afhints.c deleted file mode 100644 index 37482ebd1f..0000000000 --- a/3party/freetype/src/autofit/afhints.c +++ /dev/null @@ -1,1509 +0,0 @@ -/***************************************************************************/ -/* */ -/* afhints.c */ -/* */ -/* Auto-fitter hinting routines (body). */ -/* */ -/* Copyright 2003-2015 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 "afhints.h" -#include "aferrors.h" -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_afhints - - - /* Get new segment for given axis. */ - - FT_LOCAL_DEF( FT_Error ) - af_axis_hints_new_segment( AF_AxisHints axis, - FT_Memory memory, - AF_Segment *asegment ) - { - FT_Error error = FT_Err_Ok; - AF_Segment segment = NULL; - - - if ( axis->num_segments < AF_SEGMENTS_EMBEDDED ) - { - if ( axis->segments == NULL ) - { - axis->segments = axis->embedded.segments; - axis->max_segments = AF_SEGMENTS_EMBEDDED; - } - } - else if ( axis->num_segments >= axis->max_segments ) - { - FT_Int old_max = axis->max_segments; - FT_Int new_max = old_max; - FT_Int big_max = (FT_Int)( FT_INT_MAX / sizeof ( *segment ) ); - - - if ( old_max >= big_max ) - { - error = FT_THROW( Out_Of_Memory ); - goto Exit; - } - - new_max += ( new_max >> 2 ) + 4; - if ( new_max < old_max || new_max > big_max ) - new_max = big_max; - - if ( axis->segments == axis->embedded.segments ) - { - if ( FT_NEW_ARRAY( axis->segments, new_max ) ) - goto Exit; - ft_memcpy( axis->segments, axis->embedded.segments, - sizeof ( axis->embedded.segments ) ); - } - else - { - if ( FT_RENEW_ARRAY( axis->segments, old_max, new_max ) ) - goto Exit; - } - - axis->max_segments = new_max; - } - - segment = axis->segments + axis->num_segments++; - - Exit: - *asegment = segment; - return error; - } - - - /* Get new edge for given axis, direction, and position, */ - /* without initializing the edge itself. */ - - FT_LOCAL( FT_Error ) - af_axis_hints_new_edge( AF_AxisHints axis, - FT_Int fpos, - AF_Direction dir, - FT_Memory memory, - AF_Edge *anedge ) - { - FT_Error error = FT_Err_Ok; - AF_Edge edge = NULL; - AF_Edge edges; - - - if ( axis->num_edges < AF_EDGES_EMBEDDED ) - { - if ( axis->edges == NULL ) - { - axis->edges = axis->embedded.edges; - axis->max_edges = AF_EDGES_EMBEDDED; - } - } - else if ( axis->num_edges >= axis->max_edges ) - { - FT_Int old_max = axis->max_edges; - FT_Int new_max = old_max; - FT_Int big_max = (FT_Int)( FT_INT_MAX / sizeof ( *edge ) ); - - - if ( old_max >= big_max ) - { - error = FT_THROW( Out_Of_Memory ); - goto Exit; - } - - new_max += ( new_max >> 2 ) + 4; - if ( new_max < old_max || new_max > big_max ) - new_max = big_max; - - if ( axis->edges == axis->embedded.edges ) - { - if ( FT_NEW_ARRAY( axis->edges, new_max ) ) - goto Exit; - ft_memcpy( axis->edges, axis->embedded.edges, - sizeof ( axis->embedded.edges ) ); - } - else - { - if ( FT_RENEW_ARRAY( axis->edges, old_max, new_max ) ) - goto Exit; - } - - axis->max_edges = new_max; - } - - edges = axis->edges; - edge = edges + axis->num_edges; - - while ( edge > edges ) - { - if ( edge[-1].fpos < fpos ) - break; - - /* we want the edge with same position and minor direction */ - /* to appear before those in the major one in the list */ - if ( edge[-1].fpos == fpos && dir == axis->major_dir ) - break; - - edge[0] = edge[-1]; - edge--; - } - - axis->num_edges++; - - Exit: - *anedge = edge; - return error; - } - - -#ifdef FT_DEBUG_AUTOFIT - -#include FT_CONFIG_STANDARD_LIBRARY_H - - /* The dump functions are used in the `ftgrid' demo program, too. */ -#define AF_DUMP( varformat ) \ - do \ - { \ - if ( to_stdout ) \ - printf varformat; \ - else \ - FT_TRACE7( varformat ); \ - } while ( 0 ) - - - static const char* - af_dir_str( AF_Direction dir ) - { - const char* result; - - - switch ( dir ) - { - case AF_DIR_UP: - result = "up"; - break; - case AF_DIR_DOWN: - result = "down"; - break; - case AF_DIR_LEFT: - result = "left"; - break; - case AF_DIR_RIGHT: - result = "right"; - break; - default: - result = "none"; - } - - return result; - } - - -#define AF_INDEX_NUM( ptr, base ) (int)( (ptr) ? ( (ptr) - (base) ) : -1 ) - - -#ifdef __cplusplus - extern "C" { -#endif - void - af_glyph_hints_dump_points( AF_GlyphHints hints, - FT_Bool to_stdout ) - { - AF_Point points = hints->points; - AF_Point limit = points + hints->num_points; - AF_Point point; - - - AF_DUMP(( "Table of points:\n" )); - - if ( hints->num_points ) - AF_DUMP(( " [ index | xorg | yorg | xscale | yscale" - " | xfit | yfit | flags ]\n" )); - else - AF_DUMP(( " (none)\n" )); - - for ( point = points; point < limit; point++ ) - AF_DUMP(( " [ %5d | %5d | %5d | %6.2f | %6.2f" - " | %5.2f | %5.2f | %c ]\n", - AF_INDEX_NUM( point, points ), - point->fx, - point->fy, - point->ox / 64.0, - point->oy / 64.0, - point->x / 64.0, - point->y / 64.0, - ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ? 'w' : ' ')); - AF_DUMP(( "\n" )); - } -#ifdef __cplusplus - } -#endif - - - static const char* - af_edge_flags_to_string( FT_UInt flags ) - { - static char temp[32]; - int pos = 0; - - - if ( flags & AF_EDGE_ROUND ) - { - ft_memcpy( temp + pos, "round", 5 ); - pos += 5; - } - if ( flags & AF_EDGE_SERIF ) - { - if ( pos > 0 ) - temp[pos++] = ' '; - ft_memcpy( temp + pos, "serif", 5 ); - pos += 5; - } - if ( pos == 0 ) - return "normal"; - - temp[pos] = '\0'; - - return temp; - } - - - /* Dump the array of linked segments. */ - -#ifdef __cplusplus - extern "C" { -#endif - void - af_glyph_hints_dump_segments( AF_GlyphHints hints, - FT_Bool to_stdout ) - { - FT_Int dimension; - - - for ( dimension = 1; dimension >= 0; dimension-- ) - { - AF_AxisHints axis = &hints->axis[dimension]; - AF_Point points = hints->points; - AF_Edge edges = axis->edges; - AF_Segment segments = axis->segments; - AF_Segment limit = segments + axis->num_segments; - AF_Segment seg; - - - AF_DUMP(( "Table of %s segments:\n", - dimension == AF_DIMENSION_HORZ ? "vertical" - : "horizontal" )); - if ( axis->num_segments ) - AF_DUMP(( " [ index | pos | dir | from" - " | to | link | serif | edge" - " | height | extra | flags ]\n" )); - else - AF_DUMP(( " (none)\n" )); - - for ( seg = segments; seg < limit; seg++ ) - AF_DUMP(( " [ %5d | %5.2g | %5s | %4d" - " | %4d | %4d | %5d | %4d" - " | %6d | %5d | %11s ]\n", - AF_INDEX_NUM( seg, segments ), - dimension == AF_DIMENSION_HORZ - ? (int)seg->first->ox / 64.0 - : (int)seg->first->oy / 64.0, - af_dir_str( (AF_Direction)seg->dir ), - AF_INDEX_NUM( seg->first, points ), - AF_INDEX_NUM( seg->last, points ), - AF_INDEX_NUM( seg->link, segments ), - AF_INDEX_NUM( seg->serif, segments ), - AF_INDEX_NUM( seg->edge, edges ), - seg->height, - seg->height - ( seg->max_coord - seg->min_coord ), - af_edge_flags_to_string( seg->flags ) )); - AF_DUMP(( "\n" )); - } - } -#ifdef __cplusplus - } -#endif - - - /* Fetch number of segments. */ - -#ifdef __cplusplus - extern "C" { -#endif - FT_Error - af_glyph_hints_get_num_segments( AF_GlyphHints hints, - FT_Int dimension, - FT_Int* num_segments ) - { - AF_Dimension dim; - AF_AxisHints axis; - - - dim = ( dimension == 0 ) ? AF_DIMENSION_HORZ : AF_DIMENSION_VERT; - - axis = &hints->axis[dim]; - *num_segments = axis->num_segments; - - return FT_Err_Ok; - } -#ifdef __cplusplus - } -#endif - - - /* Fetch offset of segments into user supplied offset array. */ - -#ifdef __cplusplus - extern "C" { -#endif - FT_Error - af_glyph_hints_get_segment_offset( AF_GlyphHints hints, - FT_Int dimension, - FT_Int idx, - FT_Pos *offset, - FT_Bool *is_blue, - FT_Pos *blue_offset ) - { - AF_Dimension dim; - AF_AxisHints axis; - AF_Segment seg; - - - if ( !offset ) - return FT_THROW( Invalid_Argument ); - - dim = ( dimension == 0 ) ? AF_DIMENSION_HORZ : AF_DIMENSION_VERT; - - axis = &hints->axis[dim]; - - if ( idx < 0 || idx >= axis->num_segments ) - return FT_THROW( Invalid_Argument ); - - seg = &axis->segments[idx]; - *offset = ( dim == AF_DIMENSION_HORZ ) ? seg->first->ox - : seg->first->oy; - if ( seg->edge ) - *is_blue = (FT_Bool)( seg->edge->blue_edge != 0 ); - else - *is_blue = FALSE; - - if ( *is_blue ) - *blue_offset = seg->edge->blue_edge->cur; - else - *blue_offset = 0; - - return FT_Err_Ok; - } -#ifdef __cplusplus - } -#endif - - - /* Dump the array of linked edges. */ - -#ifdef __cplusplus - extern "C" { -#endif - void - af_glyph_hints_dump_edges( AF_GlyphHints hints, - FT_Bool to_stdout ) - { - FT_Int dimension; - - - for ( dimension = 1; dimension >= 0; dimension-- ) - { - AF_AxisHints axis = &hints->axis[dimension]; - AF_Edge edges = axis->edges; - AF_Edge limit = edges + axis->num_edges; - AF_Edge edge; - - - /* - * note: AF_DIMENSION_HORZ corresponds to _vertical_ edges - * since they have a constant X coordinate. - */ - AF_DUMP(( "Table of %s edges:\n", - dimension == AF_DIMENSION_HORZ ? "vertical" - : "horizontal" )); - if ( axis->num_edges ) - AF_DUMP(( " [ index | pos | dir | link" - " | serif | blue | opos | pos | flags ]\n" )); - else - AF_DUMP(( " (none)\n" )); - - for ( edge = edges; edge < limit; edge++ ) - AF_DUMP(( " [ %5d | %5.2g | %5s | %4d" - " | %5d | %c | %5.2f | %5.2f | %11s ]\n", - AF_INDEX_NUM( edge, edges ), - (int)edge->opos / 64.0, - af_dir_str( (AF_Direction)edge->dir ), - AF_INDEX_NUM( edge->link, edges ), - AF_INDEX_NUM( edge->serif, edges ), - edge->blue_edge ? 'y' : 'n', - edge->opos / 64.0, - edge->pos / 64.0, - af_edge_flags_to_string( edge->flags ) )); - AF_DUMP(( "\n" )); - } - } -#ifdef __cplusplus - } -#endif - -#undef AF_DUMP - -#endif /* !FT_DEBUG_AUTOFIT */ - - - /* Compute the direction value of a given vector. */ - - FT_LOCAL_DEF( AF_Direction ) - af_direction_compute( FT_Pos dx, - FT_Pos dy ) - { - FT_Pos ll, ss; /* long and short arm lengths */ - AF_Direction dir; /* candidate direction */ - - - if ( dy >= dx ) - { - if ( dy >= -dx ) - { - dir = AF_DIR_UP; - ll = dy; - ss = dx; - } - else - { - dir = AF_DIR_LEFT; - ll = -dx; - ss = dy; - } - } - else /* dy < dx */ - { - if ( dy >= -dx ) - { - dir = AF_DIR_RIGHT; - ll = dx; - ss = dy; - } - else - { - dir = AF_DIR_DOWN; - ll = -dy; - ss = dx; - } - } - - /* return no direction if arm lengths do not differ enough */ - /* (value 14 is heuristic, corresponding to approx. 4.1 degrees) */ - /* the long arm is never negative */ - if ( ll <= 14 * FT_ABS( ss ) ) - dir = AF_DIR_NONE; - - return dir; - } - - - FT_LOCAL_DEF( void ) - af_glyph_hints_init( AF_GlyphHints hints, - FT_Memory memory ) - { - /* no need to initialize the embedded items */ - FT_MEM_ZERO( hints, sizeof ( *hints ) - sizeof ( hints->embedded ) ); - hints->memory = memory; - } - - - FT_LOCAL_DEF( void ) - af_glyph_hints_done( AF_GlyphHints hints ) - { - FT_Memory memory; - int dim; - - - if ( !( hints && hints->memory ) ) - return; - - memory = hints->memory; - - /* - * note that we don't need to free the segment and edge - * buffers since they are really within the hints->points array - */ - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_AxisHints axis = &hints->axis[dim]; - - - axis->num_segments = 0; - axis->max_segments = 0; - if ( axis->segments != axis->embedded.segments ) - FT_FREE( axis->segments ); - - axis->num_edges = 0; - axis->max_edges = 0; - if ( axis->edges != axis->embedded.edges ) - FT_FREE( axis->edges ); - } - - if ( hints->contours != hints->embedded.contours ) - FT_FREE( hints->contours ); - hints->max_contours = 0; - hints->num_contours = 0; - - if ( hints->points != hints->embedded.points ) - FT_FREE( hints->points ); - hints->max_points = 0; - hints->num_points = 0; - - hints->memory = NULL; - } - - - /* Reset metrics. */ - - FT_LOCAL_DEF( void ) - af_glyph_hints_rescale( AF_GlyphHints hints, - AF_StyleMetrics metrics ) - { - hints->metrics = metrics; - hints->scaler_flags = metrics->scaler.flags; - } - - - /* Recompute all AF_Point in AF_GlyphHints from the definitions */ - /* in a source outline. */ - - FT_LOCAL_DEF( FT_Error ) - af_glyph_hints_reload( AF_GlyphHints hints, - FT_Outline* outline ) - { - FT_Error error = FT_Err_Ok; - AF_Point points; - FT_UInt old_max, new_max; - FT_Fixed x_scale = hints->x_scale; - FT_Fixed y_scale = hints->y_scale; - FT_Pos x_delta = hints->x_delta; - FT_Pos y_delta = hints->y_delta; - FT_Memory memory = hints->memory; - - - hints->num_points = 0; - hints->num_contours = 0; - - hints->axis[0].num_segments = 0; - hints->axis[0].num_edges = 0; - hints->axis[1].num_segments = 0; - hints->axis[1].num_edges = 0; - - /* first of all, reallocate the contours array if necessary */ - new_max = (FT_UInt)outline->n_contours; - old_max = (FT_UInt)hints->max_contours; - - if ( new_max <= AF_CONTOURS_EMBEDDED ) - { - if ( hints->contours == NULL ) - { - hints->contours = hints->embedded.contours; - hints->max_contours = AF_CONTOURS_EMBEDDED; - } - } - else if ( new_max > old_max ) - { - if ( hints->contours == hints->embedded.contours ) - hints->contours = NULL; - - new_max = ( new_max + 3 ) & ~3U; /* round up to a multiple of 4 */ - - if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) ) - goto Exit; - - hints->max_contours = (FT_Int)new_max; - } - - /* - * then reallocate the points arrays if necessary -- - * note that we reserve two additional point positions, used to - * hint metrics appropriately - */ - new_max = (FT_UInt)( outline->n_points + 2 ); - old_max = (FT_UInt)hints->max_points; - - if ( new_max <= AF_POINTS_EMBEDDED ) - { - if ( hints->points == NULL ) - { - hints->points = hints->embedded.points; - hints->max_points = AF_POINTS_EMBEDDED; - } - } - else if ( new_max > old_max ) - { - if ( hints->points == hints->embedded.points ) - hints->points = NULL; - - new_max = ( new_max + 2 + 7 ) & ~7U; /* round up to a multiple of 8 */ - - if ( FT_RENEW_ARRAY( hints->points, old_max, new_max ) ) - goto Exit; - - hints->max_points = (FT_Int)new_max; - } - - hints->num_points = outline->n_points; - hints->num_contours = outline->n_contours; - - /* We can't rely on the value of `FT_Outline.flags' to know the fill */ - /* direction used for a glyph, given that some fonts are broken (e.g., */ - /* the Arphic ones). We thus recompute it each time we need to. */ - /* */ - hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_UP; - hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_LEFT; - - if ( FT_Outline_Get_Orientation( outline ) == FT_ORIENTATION_POSTSCRIPT ) - { - hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_DOWN; - hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_RIGHT; - } - - hints->x_scale = x_scale; - hints->y_scale = y_scale; - hints->x_delta = x_delta; - hints->y_delta = y_delta; - - hints->xmin_delta = 0; - hints->xmax_delta = 0; - - points = hints->points; - if ( hints->num_points == 0 ) - goto Exit; - - { - AF_Point point; - AF_Point point_limit = points + hints->num_points; - - - /* compute coordinates & Bezier flags, next and prev */ - { - FT_Vector* vec = outline->points; - char* tag = outline->tags; - AF_Point end = points + outline->contours[0]; - AF_Point prev = end; - FT_Int contour_index = 0; - - - for ( point = points; point < point_limit; point++, vec++, tag++ ) - { - point->in_dir = (FT_Char)AF_DIR_NONE; - point->out_dir = (FT_Char)AF_DIR_NONE; - - point->fx = (FT_Short)vec->x; - point->fy = (FT_Short)vec->y; - point->ox = point->x = FT_MulFix( vec->x, x_scale ) + x_delta; - point->oy = point->y = FT_MulFix( vec->y, y_scale ) + y_delta; - - switch ( FT_CURVE_TAG( *tag ) ) - { - case FT_CURVE_TAG_CONIC: - point->flags = AF_FLAG_CONIC; - break; - case FT_CURVE_TAG_CUBIC: - point->flags = AF_FLAG_CUBIC; - break; - default: - point->flags = AF_FLAG_NONE; - } - - point->prev = prev; - prev->next = point; - prev = point; - - if ( point == end ) - { - if ( ++contour_index < outline->n_contours ) - { - end = points + outline->contours[contour_index]; - prev = end; - } - } - } - } - - /* set up the contours array */ - { - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - short* end = outline->contours; - short idx = 0; - - - for ( ; contour < contour_limit; contour++, end++ ) - { - contour[0] = points + idx; - idx = (short)( end[0] + 1 ); - } - } - - { - /* - * Compute directions of `in' and `out' vectors. - * - * Note that distances between points that are very near to each - * other are accumulated. In other words, the auto-hinter - * prepends the small vectors between near points to the first - * non-near vector. All intermediate points are tagged as - * weak; the directions are adjusted also to be equal to the - * accumulated one. - */ - - /* value 20 in `near_limit' is heuristic */ - FT_UInt units_per_em = hints->metrics->scaler.face->units_per_EM; - FT_Int near_limit = 20 * units_per_em / 2048; - FT_Int near_limit2 = 2 * near_limit - 1; - - AF_Point* contour; - AF_Point* contour_limit = hints->contours + hints->num_contours; - - - for ( contour = hints->contours; contour < contour_limit; contour++ ) - { - AF_Point first = *contour; - AF_Point next, prev, curr; - - FT_Pos out_x, out_y; - - - /* since the first point of a contour could be part of a */ - /* series of near points, go backwards to find the first */ - /* non-near point and adjust `first' */ - - point = first; - prev = first->prev; - - while ( prev != first ) - { - out_x = point->fx - prev->fx; - out_y = point->fy - prev->fy; - - /* - * We use Taxicab metrics to measure the vector length. - * - * Note that the accumulated distances so far could have the - * opposite direction of the distance measured here. For this - * reason we use `near_limit2' for the comparison to get a - * non-near point even in the worst case. - */ - if ( FT_ABS( out_x ) + FT_ABS( out_y ) >= near_limit2 ) - break; - - point = prev; - prev = prev->prev; - } - - /* adjust first point */ - first = point; - - /* now loop over all points of the contour to get */ - /* `in' and `out' vector directions */ - - curr = first; - - /* - * We abuse the `u' and `v' fields to store index deltas to the - * next and previous non-near point, respectively. - * - * To avoid problems with not having non-near points, we point to - * `first' by default as the next non-near point. - * - */ - curr->u = (FT_Pos)( first - curr ); - first->v = -curr->u; - - out_x = 0; - out_y = 0; - - next = first; - do - { - AF_Direction out_dir; - - - point = next; - next = point->next; - - out_x += next->fx - point->fx; - out_y += next->fy - point->fy; - - if ( FT_ABS( out_x ) + FT_ABS( out_y ) < near_limit ) - { - next->flags |= AF_FLAG_WEAK_INTERPOLATION; - continue; - } - - curr->u = (FT_Pos)( next - curr ); - next->v = -curr->u; - - out_dir = af_direction_compute( out_x, out_y ); - - /* adjust directions for all points inbetween; */ - /* the loop also updates position of `curr' */ - curr->out_dir = (FT_Char)out_dir; - for ( curr = curr->next; curr != next; curr = curr->next ) - { - curr->in_dir = (FT_Char)out_dir; - curr->out_dir = (FT_Char)out_dir; - } - next->in_dir = (FT_Char)out_dir; - - curr->u = (FT_Pos)( first - curr ); - first->v = -curr->u; - - out_x = 0; - out_y = 0; - - } while ( next != first ); - } - - /* - * The next step is to `simplify' an outline's topology so that we - * can identify local extrema more reliably: A series of - * non-horizontal or non-vertical vectors pointing into the same - * quadrant are handled as a single, long vector. From a - * topological point of the view, the intermediate points are of no - * interest and thus tagged as weak. - */ - - for ( point = points; point < point_limit; point++ ) - { - if ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) - continue; - - if ( point->in_dir == AF_DIR_NONE && - point->out_dir == AF_DIR_NONE ) - { - /* check whether both vectors point into the same quadrant */ - - FT_Pos in_x, in_y; - FT_Pos out_x, out_y; - - AF_Point next_u = point + point->u; - AF_Point prev_v = point + point->v; - - - in_x = point->fx - prev_v->fx; - in_y = point->fy - prev_v->fy; - - out_x = next_u->fx - point->fx; - out_y = next_u->fy - point->fy; - - if ( ( in_x ^ out_x ) >= 0 && ( in_y ^ out_y ) >= 0 ) - { - /* yes, so tag current point as weak */ - /* and update index deltas */ - - point->flags |= AF_FLAG_WEAK_INTERPOLATION; - - prev_v->u = (FT_Pos)( next_u - prev_v ); - next_u->v = -prev_v->u; - } - } - } - - /* - * Finally, check for remaining weak points. Everything else not - * collected in edges so far is then implicitly classified as strong - * points. - */ - - for ( point = points; point < point_limit; point++ ) - { - if ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) - continue; - - if ( point->flags & AF_FLAG_CONTROL ) - { - /* control points are always weak */ - Is_Weak_Point: - point->flags |= AF_FLAG_WEAK_INTERPOLATION; - } - else if ( point->out_dir == point->in_dir ) - { - if ( point->out_dir != AF_DIR_NONE ) - { - /* current point lies on a horizontal or */ - /* vertical segment (but doesn't start or end it) */ - goto Is_Weak_Point; - } - - { - AF_Point next_u = point + point->u; - AF_Point prev_v = point + point->v; - - - if ( ft_corner_is_flat( point->fx - prev_v->fx, - point->fy - prev_v->fy, - next_u->fx - point->fx, - next_u->fy - point->fy ) ) - { - /* either the `in' or the `out' vector is much more */ - /* dominant than the other one, so tag current point */ - /* as weak and update index deltas */ - - prev_v->u = (FT_Pos)( next_u - prev_v ); - next_u->v = -prev_v->u; - - goto Is_Weak_Point; - } - } - } - else if ( point->in_dir == -point->out_dir ) - { - /* current point forms a spike */ - goto Is_Weak_Point; - } - } - } - } - - Exit: - return error; - } - - - /* Store the hinted outline in an FT_Outline structure. */ - - FT_LOCAL_DEF( void ) - af_glyph_hints_save( AF_GlyphHints hints, - FT_Outline* outline ) - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - FT_Vector* vec = outline->points; - char* tag = outline->tags; - - - for ( ; point < limit; point++, vec++, tag++ ) - { - vec->x = point->x; - vec->y = point->y; - - if ( point->flags & AF_FLAG_CONIC ) - tag[0] = FT_CURVE_TAG_CONIC; - else if ( point->flags & AF_FLAG_CUBIC ) - tag[0] = FT_CURVE_TAG_CUBIC; - else - tag[0] = FT_CURVE_TAG_ON; - } - } - - - /**************************************************************** - * - * EDGE POINT GRID-FITTING - * - ****************************************************************/ - - - /* Align all points of an edge to the same coordinate value, */ - /* either horizontally or vertically. */ - - FT_LOCAL_DEF( void ) - af_glyph_hints_align_edge_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = & hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Segment seg; - - - if ( dim == AF_DIMENSION_HORZ ) - { - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge edge = seg->edge; - AF_Point point, first, last; - - - if ( edge == NULL ) - continue; - - first = seg->first; - last = seg->last; - point = first; - for (;;) - { - point->x = edge->pos; - point->flags |= AF_FLAG_TOUCH_X; - - if ( point == last ) - break; - - point = point->next; - } - } - } - else - { - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge edge = seg->edge; - AF_Point point, first, last; - - - if ( edge == NULL ) - continue; - - first = seg->first; - last = seg->last; - point = first; - for (;;) - { - point->y = edge->pos; - point->flags |= AF_FLAG_TOUCH_Y; - - if ( point == last ) - break; - - point = point->next; - } - } - } - } - - - /**************************************************************** - * - * STRONG POINT INTERPOLATION - * - ****************************************************************/ - - - /* Hint the strong points -- this is equivalent to the TrueType `IP' */ - /* hinting instruction. */ - - FT_LOCAL_DEF( void ) - af_glyph_hints_align_strong_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_Point points = hints->points; - AF_Point point_limit = points + hints->num_points; - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - FT_UInt touch_flag; - - - if ( dim == AF_DIMENSION_HORZ ) - touch_flag = AF_FLAG_TOUCH_X; - else - touch_flag = AF_FLAG_TOUCH_Y; - - if ( edges < edge_limit ) - { - AF_Point point; - AF_Edge edge; - - - for ( point = points; point < point_limit; point++ ) - { - FT_Pos u, ou, fu; /* point position */ - FT_Pos delta; - - - if ( point->flags & touch_flag ) - continue; - - /* if this point is candidate to weak interpolation, we */ - /* interpolate it after all strong points have been processed */ - - if ( ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ) - continue; - - if ( dim == AF_DIMENSION_VERT ) - { - u = point->fy; - ou = point->oy; - } - else - { - u = point->fx; - ou = point->ox; - } - - fu = u; - - /* is the point before the first edge? */ - edge = edges; - delta = edge->fpos - u; - if ( delta >= 0 ) - { - u = edge->pos - ( edge->opos - ou ); - goto Store_Point; - } - - /* is the point after the last edge? */ - edge = edge_limit - 1; - delta = u - edge->fpos; - if ( delta >= 0 ) - { - u = edge->pos + ( ou - edge->opos ); - goto Store_Point; - } - - { - FT_PtrDist min, max, mid; - FT_Pos fpos; - - - /* find enclosing edges */ - min = 0; - max = edge_limit - edges; - -#if 1 - /* for a small number of edges, a linear search is better */ - if ( max <= 8 ) - { - FT_PtrDist nn; - - - for ( nn = 0; nn < max; nn++ ) - if ( edges[nn].fpos >= u ) - break; - - if ( edges[nn].fpos == u ) - { - u = edges[nn].pos; - goto Store_Point; - } - min = nn; - } - else -#endif - while ( min < max ) - { - mid = ( max + min ) >> 1; - edge = edges + mid; - fpos = edge->fpos; - - if ( u < fpos ) - max = mid; - else if ( u > fpos ) - min = mid + 1; - else - { - /* we are on the edge */ - u = edge->pos; - goto Store_Point; - } - } - - /* point is not on an edge */ - { - AF_Edge before = edges + min - 1; - AF_Edge after = edges + min + 0; - - - /* assert( before && after && before != after ) */ - if ( before->scale == 0 ) - before->scale = FT_DivFix( after->pos - before->pos, - after->fpos - before->fpos ); - - u = before->pos + FT_MulFix( fu - before->fpos, - before->scale ); - } - } - - Store_Point: - /* save the point position */ - if ( dim == AF_DIMENSION_HORZ ) - point->x = u; - else - point->y = u; - - point->flags |= touch_flag; - } - } - } - - - /**************************************************************** - * - * WEAK POINT INTERPOLATION - * - ****************************************************************/ - - - /* Shift the original coordinates of all points between `p1' and */ - /* `p2' to get hinted coordinates, using the same difference as */ - /* given by `ref'. */ - - static void - af_iup_shift( AF_Point p1, - AF_Point p2, - AF_Point ref ) - { - AF_Point p; - FT_Pos delta = ref->u - ref->v; - - - if ( delta == 0 ) - return; - - for ( p = p1; p < ref; p++ ) - p->u = p->v + delta; - - for ( p = ref + 1; p <= p2; p++ ) - p->u = p->v + delta; - } - - - /* Interpolate the original coordinates of all points between `p1' and */ - /* `p2' to get hinted coordinates, using `ref1' and `ref2' as the */ - /* reference points. The `u' and `v' members are the current and */ - /* original coordinate values, respectively. */ - /* */ - /* Details can be found in the TrueType bytecode specification. */ - - static void - af_iup_interp( AF_Point p1, - AF_Point p2, - AF_Point ref1, - AF_Point ref2 ) - { - AF_Point p; - FT_Pos u, v1, v2, u1, u2, d1, d2; - - - if ( p1 > p2 ) - return; - - if ( ref1->v > ref2->v ) - { - p = ref1; - ref1 = ref2; - ref2 = p; - } - - v1 = ref1->v; - v2 = ref2->v; - u1 = ref1->u; - u2 = ref2->u; - d1 = u1 - v1; - d2 = u2 - v2; - - if ( u1 == u2 || v1 == v2 ) - { - for ( p = p1; p <= p2; p++ ) - { - u = p->v; - - if ( u <= v1 ) - u += d1; - else if ( u >= v2 ) - u += d2; - else - u = u1; - - p->u = u; - } - } - else - { - FT_Fixed scale = FT_DivFix( u2 - u1, v2 - v1 ); - - - for ( p = p1; p <= p2; p++ ) - { - u = p->v; - - if ( u <= v1 ) - u += d1; - else if ( u >= v2 ) - u += d2; - else - u = u1 + FT_MulFix( u - v1, scale ); - - p->u = u; - } - } - } - - - /* Hint the weak points -- this is equivalent to the TrueType `IUP' */ - /* hinting instruction. */ - - FT_LOCAL_DEF( void ) - af_glyph_hints_align_weak_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_Point points = hints->points; - AF_Point point_limit = points + hints->num_points; - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - FT_UInt touch_flag; - AF_Point point; - AF_Point end_point; - AF_Point first_point; - - - /* PASS 1: Move segment points to edge positions */ - - if ( dim == AF_DIMENSION_HORZ ) - { - touch_flag = AF_FLAG_TOUCH_X; - - for ( point = points; point < point_limit; point++ ) - { - point->u = point->x; - point->v = point->ox; - } - } - else - { - touch_flag = AF_FLAG_TOUCH_Y; - - for ( point = points; point < point_limit; point++ ) - { - point->u = point->y; - point->v = point->oy; - } - } - - for ( ; contour < contour_limit; contour++ ) - { - AF_Point first_touched, last_touched; - - - point = *contour; - end_point = point->prev; - first_point = point; - - /* find first touched point */ - for (;;) - { - if ( point > end_point ) /* no touched point in contour */ - goto NextContour; - - if ( point->flags & touch_flag ) - break; - - point++; - } - - first_touched = point; - - for (;;) - { - FT_ASSERT( point <= end_point && - ( point->flags & touch_flag ) != 0 ); - - /* skip any touched neighbours */ - while ( point < end_point && - ( point[1].flags & touch_flag ) != 0 ) - point++; - - last_touched = point; - - /* find the next touched point, if any */ - point++; - for (;;) - { - if ( point > end_point ) - goto EndContour; - - if ( ( point->flags & touch_flag ) != 0 ) - break; - - point++; - } - - /* interpolate between last_touched and point */ - af_iup_interp( last_touched + 1, point - 1, - last_touched, point ); - } - - EndContour: - /* special case: only one point was touched */ - if ( last_touched == first_touched ) - af_iup_shift( first_point, end_point, first_touched ); - - else /* interpolate the last part */ - { - if ( last_touched < end_point ) - af_iup_interp( last_touched + 1, end_point, - last_touched, first_touched ); - - if ( first_touched > points ) - af_iup_interp( first_point, first_touched - 1, - last_touched, first_touched ); - } - - NextContour: - ; - } - - /* now save the interpolated values back to x/y */ - if ( dim == AF_DIMENSION_HORZ ) - { - for ( point = points; point < point_limit; point++ ) - point->x = point->u; - } - else - { - for ( point = points; point < point_limit; point++ ) - point->y = point->u; - } - } - - -#ifdef AF_CONFIG_OPTION_USE_WARPER - - /* Apply (small) warp scale and warp delta for given dimension. */ - - FT_LOCAL_DEF( void ) - af_glyph_hints_scale_dim( AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed scale, - FT_Pos delta ) - { - AF_Point points = hints->points; - AF_Point points_limit = points + hints->num_points; - AF_Point point; - - - if ( dim == AF_DIMENSION_HORZ ) - { - for ( point = points; point < points_limit; point++ ) - point->x = FT_MulFix( point->fx, scale ) + delta; - } - else - { - for ( point = points; point < points_limit; point++ ) - point->y = FT_MulFix( point->fy, scale ) + delta; - } - } - -#endif /* AF_CONFIG_OPTION_USE_WARPER */ - -/* END */ diff --git a/3party/freetype/src/autofit/afhints.h b/3party/freetype/src/autofit/afhints.h deleted file mode 100644 index a64c7a4b11..0000000000 --- a/3party/freetype/src/autofit/afhints.h +++ /dev/null @@ -1,478 +0,0 @@ -/***************************************************************************/ -/* */ -/* afhints.h */ -/* */ -/* Auto-fitter hinting routines (specification). */ -/* */ -/* Copyright 2003-2015 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 __AFHINTS_H__ -#define __AFHINTS_H__ - -#include "aftypes.h" - -#define xxAF_SORT_SEGMENTS - -FT_BEGIN_HEADER - - /* - * The definition of outline glyph hints. These are shared by all - * writing system analysis routines (until now). - */ - - typedef enum AF_Dimension_ - { - AF_DIMENSION_HORZ = 0, /* x coordinates, */ - /* i.e., vertical segments & edges */ - AF_DIMENSION_VERT = 1, /* y coordinates, */ - /* i.e., horizontal segments & edges */ - - AF_DIMENSION_MAX /* do not remove */ - - } AF_Dimension; - - - /* hint directions -- the values are computed so that two vectors are */ - /* in opposite directions iff `dir1 + dir2 == 0' */ - typedef enum AF_Direction_ - { - AF_DIR_NONE = 4, - AF_DIR_RIGHT = 1, - AF_DIR_LEFT = -1, - AF_DIR_UP = 2, - AF_DIR_DOWN = -2 - - } AF_Direction; - - - /* - * The following explanations are mostly taken from the article - * - * Real-Time Grid Fitting of Typographic Outlines - * - * by David Turner and Werner Lemberg - * - * http://www.tug.org/TUGboat/Articles/tb24-3/lemberg.pdf - * - * with appropriate updates. - * - * - * Segments - * - * `af_{cjk,latin,...}_hints_compute_segments' are the functions to - * find segments in an outline. - * - * A segment is a series of at least two consecutive points that are - * approximately aligned along a coordinate axis. The analysis to do - * so is specific to a writing system. - * - * - * Edges - * - * `af_{cjk,latin,...}_hints_compute_edges' are the functions to find - * edges. - * - * As soon as segments are defined, the auto-hinter groups them into - * edges. An edge corresponds to a single position on the main - * dimension that collects one or more segments (allowing for a small - * threshold). - * - * As an example, the `latin' writing system first tries to grid-fit - * edges, then to align segments on the edges unless it detects that - * they form a serif. - * - * - * A H - * | | - * | | - * | | - * | | - * C | | F - * +------<-----+ +-----<------+ - * | B G | - * | | - * | | - * +--------------->------------------+ - * D E - * - * - * Stems - * - * Stems are detected by `af_{cjk,latin,...}_hint_edges'. - * - * Segments need to be `linked' to other ones in order to detect stems. - * A stem is made of two segments that face each other in opposite - * directions and that are sufficiently close to each other. Using - * vocabulary from the TrueType specification, stem segments form a - * `black distance'. - * - * In the above ASCII drawing, the horizontal segments are BC, DE, and - * FG; the vertical segments are AB, CD, EF, and GH. - * - * Each segment has at most one `best' candidate to form a black - * distance, or no candidate at all. Notice that two distinct segments - * can have the same candidate, which frequently means a serif. - * - * A stem is recognized by the following condition: - * - * best segment_1 = segment_2 && best segment_2 = segment_1 - * - * The best candidate is stored in field `link' in structure - * `AF_Segment'. - * - * In the above ASCII drawing, the best candidate for both AB and CD is - * GH, while the best candidate for GH is AB. Similarly, the best - * candidate for EF and GH is AB, while the best candidate for AB is - * GH. - * - * The detection and handling of stems is dependent on the writing - * system. - * - * - * Serifs - * - * Serifs are detected by `af_{cjk,latin,...}_hint_edges'. - * - * In comparison to a stem, a serif (as handled by the auto-hinter - * module that takes care of the `latin' writing system) has - * - * best segment_1 = segment_2 && best segment_2 != segment_1 - * - * where segment_1 corresponds to the serif segment (CD and EF in the - * above ASCII drawing). - * - * The best candidate is stored in field `serif' in structure - * `AF_Segment' (and `link' is set to NULL). - * - * - * Touched points - * - * A point is called `touched' if it has been processed somehow by the - * auto-hinter. It basically means that it shouldn't be moved again - * (or moved only under certain constraints to preserve the already - * applied processing). - * - * - * Flat and round segments - * - * Segments are `round' or `flat', depending on the series of points - * that define them. A segment is round if the next and previous point - * of an extremum (which can be either a single point or sequence of - * points) are both conic or cubic control points. Otherwise, a - * segment with an extremum is flat. - * - * - * Strong Points - * - * Experience has shown that points not part of an edge need to be - * interpolated linearly between their two closest edges, even if these - * are not part of the contour of those particular points. Typical - * candidates for this are - * - * - angle points (i.e., points where the `in' and `out' direction - * differ greatly) - * - * - inflection points (i.e., where the `in' and `out' angles are the - * same, but the curvature changes sign) [currently, such points - * aren't handled specially in the auto-hinter] - * - * `af_glyph_hints_align_strong_points' is the function that takes - * care of such situations; it is equivalent to the TrueType `IP' - * hinting instruction. - * - * - * Weak Points - * - * Other points in the outline must be interpolated using the - * coordinates of their previous and next unfitted contour neighbours. - * These are called `weak points' and are touched by the function - * `af_glyph_hints_align_weak_points', equivalent to the TrueType `IUP' - * hinting instruction. Typical candidates are control points and - * points on the contour without a major direction. - * - * The major effect is to reduce possible distortion caused by - * alignment of edges and strong points, thus weak points are processed - * after strong points. - */ - - - /* point hint flags */ -#define AF_FLAG_NONE 0 - - /* point type flags */ -#define AF_FLAG_CONIC ( 1U << 0 ) -#define AF_FLAG_CUBIC ( 1U << 1 ) -#define AF_FLAG_CONTROL ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) - - /* point touch flags */ -#define AF_FLAG_TOUCH_X ( 1U << 2 ) -#define AF_FLAG_TOUCH_Y ( 1U << 3 ) - - /* candidates for weak interpolation have this flag set */ -#define AF_FLAG_WEAK_INTERPOLATION ( 1U << 4 ) - - - /* edge hint flags */ -#define AF_EDGE_NORMAL 0 -#define AF_EDGE_ROUND ( 1U << 0 ) -#define AF_EDGE_SERIF ( 1U << 1 ) -#define AF_EDGE_DONE ( 1U << 2 ) -#define AF_EDGE_NEUTRAL ( 1U << 3 ) /* edge aligns to a neutral blue zone */ - - - typedef struct AF_PointRec_* AF_Point; - typedef struct AF_SegmentRec_* AF_Segment; - typedef struct AF_EdgeRec_* AF_Edge; - - - typedef struct AF_PointRec_ - { - FT_UShort flags; /* point flags used by hinter */ - FT_Char in_dir; /* direction of inwards vector */ - FT_Char out_dir; /* direction of outwards vector */ - - FT_Pos ox, oy; /* original, scaled position */ - FT_Short fx, fy; /* original, unscaled position (in font units) */ - FT_Pos x, y; /* current position */ - FT_Pos u, v; /* current (x,y) or (y,x) depending on context */ - - AF_Point next; /* next point in contour */ - AF_Point prev; /* previous point in contour */ - - } AF_PointRec; - - - typedef struct AF_SegmentRec_ - { - FT_Byte flags; /* edge/segment flags for this segment */ - FT_Char dir; /* segment direction */ - FT_Short pos; /* position of segment */ - FT_Short min_coord; /* minimum coordinate of segment */ - FT_Short max_coord; /* maximum coordinate of segment */ - FT_Short height; /* the hinted segment height */ - - AF_Edge edge; /* the segment's parent edge */ - AF_Segment edge_next; /* link to next segment in parent edge */ - - AF_Segment link; /* (stem) link segment */ - AF_Segment serif; /* primary segment for serifs */ - FT_Pos num_linked; /* number of linked segments */ - FT_Pos score; /* used during stem matching */ - FT_Pos len; /* used during stem matching */ - - AF_Point first; /* first point in edge segment */ - AF_Point last; /* last point in edge segment */ - - } AF_SegmentRec; - - - typedef struct AF_EdgeRec_ - { - FT_Short fpos; /* original, unscaled position (in font units) */ - FT_Pos opos; /* original, scaled position */ - FT_Pos pos; /* current position */ - - FT_Byte flags; /* edge flags */ - FT_Char dir; /* edge direction */ - FT_Fixed scale; /* used to speed up interpolation between edges */ - - AF_Width blue_edge; /* non-NULL if this is a blue edge */ - AF_Edge link; /* link edge */ - AF_Edge serif; /* primary edge for serifs */ - FT_Short num_linked; /* number of linked edges */ - FT_Int score; /* used during stem matching */ - - AF_Segment first; /* first segment in edge */ - AF_Segment last; /* last segment in edge */ - - } AF_EdgeRec; - -#define AF_SEGMENTS_EMBEDDED 18 /* number of embedded segments */ -#define AF_EDGES_EMBEDDED 12 /* number of embedded edges */ - - typedef struct AF_AxisHintsRec_ - { - FT_Int num_segments; /* number of used segments */ - FT_Int max_segments; /* number of allocated segments */ - AF_Segment segments; /* segments array */ -#ifdef AF_SORT_SEGMENTS - FT_Int mid_segments; -#endif - - FT_Int num_edges; /* number of used edges */ - FT_Int max_edges; /* number of allocated edges */ - AF_Edge edges; /* edges array */ - - AF_Direction major_dir; /* either vertical or horizontal */ - - /* two arrays to avoid allocation penalty */ - struct - { - AF_SegmentRec segments[AF_SEGMENTS_EMBEDDED]; - AF_EdgeRec edges[AF_EDGES_EMBEDDED]; - } embedded; - - - } AF_AxisHintsRec, *AF_AxisHints; - - -#define AF_POINTS_EMBEDDED 96 /* number of embedded points */ -#define AF_CONTOURS_EMBEDDED 8 /* number of embedded contours */ - - typedef struct AF_GlyphHintsRec_ - { - FT_Memory memory; - - FT_Fixed x_scale; - FT_Pos x_delta; - - FT_Fixed y_scale; - FT_Pos y_delta; - - FT_Int max_points; /* number of allocated points */ - FT_Int num_points; /* number of used points */ - AF_Point points; /* points array */ - - FT_Int max_contours; /* number of allocated contours */ - FT_Int num_contours; /* number of used contours */ - AF_Point* contours; /* contours array */ - - AF_AxisHintsRec axis[AF_DIMENSION_MAX]; - - FT_UInt32 scaler_flags; /* copy of scaler flags */ - FT_UInt32 other_flags; /* free for style-specific */ - /* implementations */ - AF_StyleMetrics metrics; - - FT_Pos xmin_delta; /* used for warping */ - FT_Pos xmax_delta; - - /* Two arrays to avoid allocation penalty. */ - /* The `embedded' structure must be the last element! */ - struct - { - AF_Point contours[AF_CONTOURS_EMBEDDED]; - AF_PointRec points[AF_POINTS_EMBEDDED]; - } embedded; - - } AF_GlyphHintsRec; - - -#define AF_HINTS_TEST_SCALER( h, f ) ( (h)->scaler_flags & (f) ) -#define AF_HINTS_TEST_OTHER( h, f ) ( (h)->other_flags & (f) ) - - -#ifdef FT_DEBUG_AUTOFIT - -#define AF_HINTS_DO_HORIZONTAL( h ) \ - ( !_af_debug_disable_horz_hints && \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) ) - -#define AF_HINTS_DO_VERTICAL( h ) \ - ( !_af_debug_disable_vert_hints && \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) ) - -#define AF_HINTS_DO_BLUES( h ) ( !_af_debug_disable_blue_hints ) - -#else /* !FT_DEBUG_AUTOFIT */ - -#define AF_HINTS_DO_HORIZONTAL( h ) \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) - -#define AF_HINTS_DO_VERTICAL( h ) \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) - -#define AF_HINTS_DO_BLUES( h ) 1 - -#endif /* !FT_DEBUG_AUTOFIT */ - - -#define AF_HINTS_DO_ADVANCE( h ) \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) - -#define AF_HINTS_DO_WARP( h ) \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_WARPER ) - - - - FT_LOCAL( AF_Direction ) - af_direction_compute( FT_Pos dx, - FT_Pos dy ); - - - FT_LOCAL( FT_Error ) - af_axis_hints_new_segment( AF_AxisHints axis, - FT_Memory memory, - AF_Segment *asegment ); - - FT_LOCAL( FT_Error) - af_axis_hints_new_edge( AF_AxisHints axis, - FT_Int fpos, - AF_Direction dir, - FT_Memory memory, - AF_Edge *edge ); - - FT_LOCAL( void ) - af_glyph_hints_init( AF_GlyphHints hints, - FT_Memory memory ); - - FT_LOCAL( void ) - af_glyph_hints_rescale( AF_GlyphHints hints, - AF_StyleMetrics metrics ); - - FT_LOCAL( FT_Error ) - af_glyph_hints_reload( AF_GlyphHints hints, - FT_Outline* outline ); - - FT_LOCAL( void ) - af_glyph_hints_save( AF_GlyphHints hints, - FT_Outline* outline ); - - FT_LOCAL( void ) - af_glyph_hints_align_edge_points( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( void ) - af_glyph_hints_align_strong_points( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( void ) - af_glyph_hints_align_weak_points( AF_GlyphHints hints, - AF_Dimension dim ); - -#ifdef AF_CONFIG_OPTION_USE_WARPER - FT_LOCAL( void ) - af_glyph_hints_scale_dim( AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed scale, - FT_Pos delta ); -#endif - - FT_LOCAL( void ) - af_glyph_hints_done( AF_GlyphHints hints ); - -/* */ - -#define AF_SEGMENT_LEN( seg ) ( (seg)->max_coord - (seg)->min_coord ) - -#define AF_SEGMENT_DIST( seg1, seg2 ) ( ( (seg1)->pos > (seg2)->pos ) \ - ? (seg1)->pos - (seg2)->pos \ - : (seg2)->pos - (seg1)->pos ) - - -FT_END_HEADER - -#endif /* __AFHINTS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afindic.c b/3party/freetype/src/autofit/afindic.c deleted file mode 100644 index 7412cd1e3d..0000000000 --- a/3party/freetype/src/autofit/afindic.c +++ /dev/null @@ -1,138 +0,0 @@ -/***************************************************************************/ -/* */ -/* afindic.c */ -/* */ -/* Auto-fitter hinting routines for Indic writing system (body). */ -/* */ -/* Copyright 2007-2015 by */ -/* Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. */ -/* */ -/* 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 "aftypes.h" -#include "aflatin.h" - - -#ifdef AF_CONFIG_OPTION_INDIC - -#include "afindic.h" -#include "aferrors.h" -#include "afcjk.h" - - -#ifdef AF_CONFIG_OPTION_USE_WARPER -#include "afwarp.h" -#endif - - - static FT_Error - af_indic_metrics_init( AF_CJKMetrics metrics, - FT_Face face ) - { - /* skip blue zone init in CJK routines */ - FT_CharMap oldmap = face->charmap; - - - metrics->units_per_em = face->units_per_EM; - - if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) - face->charmap = NULL; - else - { - af_cjk_metrics_init_widths( metrics, face ); -#if 0 - /* either need indic specific blue_chars[] or just skip blue zones */ - af_cjk_metrics_init_blues( metrics, face, af_cjk_blue_chars ); -#endif - af_cjk_metrics_check_digits( metrics, face ); - } - - FT_Set_Charmap( face, oldmap ); - - return FT_Err_Ok; - } - - - static void - af_indic_metrics_scale( AF_CJKMetrics metrics, - AF_Scaler scaler ) - { - /* use CJK routines */ - af_cjk_metrics_scale( metrics, scaler ); - } - - - static FT_Error - af_indic_hints_init( AF_GlyphHints hints, - AF_CJKMetrics metrics ) - { - /* use CJK routines */ - return af_cjk_hints_init( hints, metrics ); - } - - - static FT_Error - af_indic_hints_apply( AF_GlyphHints hints, - FT_Outline* outline, - AF_CJKMetrics metrics ) - { - /* use CJK routines */ - return af_cjk_hints_apply( hints, outline, metrics ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** I N D I C S C R I P T C L A S S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_indic_writing_system_class, - - AF_WRITING_SYSTEM_INDIC, - - sizeof ( AF_CJKMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) af_indic_metrics_init, - (AF_WritingSystem_ScaleMetricsFunc)af_indic_metrics_scale, - (AF_WritingSystem_DoneMetricsFunc) NULL, - - (AF_WritingSystem_InitHintsFunc) af_indic_hints_init, - (AF_WritingSystem_ApplyHintsFunc) af_indic_hints_apply - ) - - -#else /* !AF_CONFIG_OPTION_INDIC */ - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_indic_writing_system_class, - - AF_WRITING_SYSTEM_INDIC, - - sizeof ( AF_CJKMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) NULL, - (AF_WritingSystem_ScaleMetricsFunc)NULL, - (AF_WritingSystem_DoneMetricsFunc) NULL, - - (AF_WritingSystem_InitHintsFunc) NULL, - (AF_WritingSystem_ApplyHintsFunc) NULL - ) - - -#endif /* !AF_CONFIG_OPTION_INDIC */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afindic.h b/3party/freetype/src/autofit/afindic.h deleted file mode 100644 index 4c36908ada..0000000000 --- a/3party/freetype/src/autofit/afindic.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* afindic.h */ -/* */ -/* Auto-fitter hinting routines for Indic writing system */ -/* (specification). */ -/* */ -/* Copyright 2007-2015 by */ -/* Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. */ -/* */ -/* 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 __AFINDIC_H__ -#define __AFINDIC_H__ - -#include "afhints.h" - - -FT_BEGIN_HEADER - - - /* the `indic' writing system */ - - AF_DECLARE_WRITING_SYSTEM_CLASS( af_indic_writing_system_class ) - - -/* */ - -FT_END_HEADER - -#endif /* __AFINDIC_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/aflatin.c b/3party/freetype/src/autofit/aflatin.c deleted file mode 100644 index 3065895d8e..0000000000 --- a/3party/freetype/src/autofit/aflatin.c +++ /dev/null @@ -1,2947 +0,0 @@ -/***************************************************************************/ -/* */ -/* aflatin.c */ -/* */ -/* Auto-fitter hinting routines for latin writing system (body). */ -/* */ -/* Copyright 2003-2015 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 <ft2build.h> -#include FT_ADVANCES_H -#include FT_INTERNAL_DEBUG_H - -#include "afglobal.h" -#include "afpic.h" -#include "aflatin.h" -#include "aferrors.h" - - -#ifdef AF_CONFIG_OPTION_USE_WARPER -#include "afwarp.h" -#endif - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_aflatin - - - /* needed for computation of round vs. flat segments */ -#define FLAT_THRESHOLD( x ) ( x / 14 ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* Find segments and links, compute all stem widths, and initialize */ - /* standard width and height for the glyph with given charcode. */ - - FT_LOCAL_DEF( void ) - af_latin_metrics_init_widths( AF_LatinMetrics metrics, - FT_Face face ) - { - /* scan the array of segments in each direction */ - AF_GlyphHintsRec hints[1]; - - - FT_TRACE5(( "\n" - "latin standard widths computation (style `%s')\n" - "=====================================================\n" - "\n", - af_style_names[metrics->root.style_class->style] )); - - af_glyph_hints_init( hints, face->memory ); - - metrics->axis[AF_DIMENSION_HORZ].width_count = 0; - metrics->axis[AF_DIMENSION_VERT].width_count = 0; - - { - FT_Error error; - FT_ULong glyph_index; - FT_Long y_offset; - int dim; - AF_LatinMetricsRec dummy[1]; - AF_Scaler scaler = &dummy->root.scaler; - -#ifdef FT_CONFIG_OPTION_PIC - AF_FaceGlobals globals = metrics->root.globals; -#endif - - AF_StyleClass style_class = metrics->root.style_class; - AF_ScriptClass script_class = AF_SCRIPT_CLASSES_GET - [style_class->script]; - - FT_UInt32 standard_char; - - - /* - * We check more than a single standard character to catch features - * like `c2sc' (small caps from caps) that don't contain lowercase - * letters by definition, or other features that mainly operate on - * numerals. - */ - - standard_char = script_class->standard_char1; - af_get_char_index( &metrics->root, - standard_char, - &glyph_index, - &y_offset ); - if ( !glyph_index ) - { - if ( script_class->standard_char2 ) - { - standard_char = script_class->standard_char2; - af_get_char_index( &metrics->root, - standard_char, - &glyph_index, - &y_offset ); - if ( !glyph_index ) - { - if ( script_class->standard_char3 ) - { - standard_char = script_class->standard_char3; - af_get_char_index( &metrics->root, - standard_char, - &glyph_index, - &y_offset ); - if ( !glyph_index ) - goto Exit; - } - else - goto Exit; - } - } - else - goto Exit; - } - - FT_TRACE5(( "standard character: U+%04lX (glyph index %d)\n", - standard_char, glyph_index )); - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || face->glyph->outline.n_points <= 0 ) - goto Exit; - - FT_ZERO( dummy ); - - dummy->units_per_em = metrics->units_per_em; - - scaler->x_scale = 0x10000L; - scaler->y_scale = 0x10000L; - scaler->x_delta = 0; - scaler->y_delta = 0; - - scaler->face = face; - scaler->render_mode = FT_RENDER_MODE_NORMAL; - scaler->flags = 0; - - af_glyph_hints_rescale( hints, (AF_StyleMetrics)dummy ); - - error = af_glyph_hints_reload( hints, &face->glyph->outline ); - if ( error ) - goto Exit; - - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_LatinAxis axis = &metrics->axis[dim]; - AF_AxisHints axhints = &hints->axis[dim]; - AF_Segment seg, limit, link; - FT_UInt num_widths = 0; - - - error = af_latin_hints_compute_segments( hints, - (AF_Dimension)dim ); - if ( error ) - goto Exit; - - /* - * We assume that the glyphs selected for the stem width - * computation are `featureless' enough so that the linking - * algorithm works fine without adjustments of its scoring - * function. - */ - af_latin_hints_link_segments( hints, - 0, - NULL, - (AF_Dimension)dim ); - - seg = axhints->segments; - limit = seg + axhints->num_segments; - - for ( ; seg < limit; seg++ ) - { - link = seg->link; - - /* we only consider stem segments there! */ - if ( link && link->link == seg && link > seg ) - { - FT_Pos dist; - - - dist = seg->pos - link->pos; - if ( dist < 0 ) - dist = -dist; - - if ( num_widths < AF_LATIN_MAX_WIDTHS ) - axis->widths[num_widths++].org = dist; - } - } - - /* this also replaces multiple almost identical stem widths */ - /* with a single one (the value 100 is heuristic) */ - af_sort_and_quantize_widths( &num_widths, axis->widths, - dummy->units_per_em / 100 ); - axis->width_count = num_widths; - } - - Exit: - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_LatinAxis axis = &metrics->axis[dim]; - FT_Pos stdw; - - - stdw = ( axis->width_count > 0 ) ? axis->widths[0].org - : AF_LATIN_CONSTANT( metrics, 50 ); - - /* let's try 20% of the smallest width */ - axis->edge_distance_threshold = stdw / 5; - axis->standard_width = stdw; - axis->extra_light = 0; - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_UInt i; - - - FT_TRACE5(( "%s widths:\n", - dim == AF_DIMENSION_VERT ? "horizontal" - : "vertical" )); - - FT_TRACE5(( " %d (standard)", axis->standard_width )); - for ( i = 1; i < axis->width_count; i++ ) - FT_TRACE5(( " %d", axis->widths[i].org )); - - FT_TRACE5(( "\n" )); - } -#endif - } - } - - FT_TRACE5(( "\n" )); - - af_glyph_hints_done( hints ); - } - - - /* Find all blue zones. Flat segments give the reference points, */ - /* round segments the overshoot positions. */ - - static void - af_latin_metrics_init_blues( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_Pos flats [AF_BLUE_STRING_MAX_LEN]; - FT_Pos rounds[AF_BLUE_STRING_MAX_LEN]; - - FT_UInt num_flats; - FT_UInt num_rounds; - - AF_LatinBlue blue; - FT_Error error; - AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; - FT_Outline outline; - - AF_StyleClass sc = metrics->root.style_class; - - AF_Blue_Stringset bss = sc->blue_stringset; - const AF_Blue_StringRec* bs = &af_blue_stringsets[bss]; - - FT_Pos flat_threshold = FLAT_THRESHOLD( metrics->units_per_em ); - - - /* we walk over the blue character strings as specified in the */ - /* style's entry in the `af_blue_stringset' array */ - - FT_TRACE5(( "latin blue zones computation\n" - "============================\n" - "\n" )); - - for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ ) - { - const char* p = &af_blue_strings[bs->string]; - FT_Pos* blue_ref; - FT_Pos* blue_shoot; - - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_Bool have_flag = 0; - - - FT_TRACE5(( "blue zone %d", axis->blue_count )); - - if ( bs->properties ) - { - FT_TRACE5(( " (" )); - - if ( AF_LATIN_IS_TOP_BLUE( bs ) ) - { - FT_TRACE5(( "top" )); - have_flag = 1; - } - - if ( AF_LATIN_IS_NEUTRAL_BLUE( bs ) ) - { - if ( have_flag ) - FT_TRACE5(( ", " )); - FT_TRACE5(( "neutral" )); - have_flag = 1; - } - - if ( AF_LATIN_IS_X_HEIGHT_BLUE( bs ) ) - { - if ( have_flag ) - FT_TRACE5(( ", " )); - FT_TRACE5(( "small top" )); - have_flag = 1; - } - - if ( AF_LATIN_IS_LONG_BLUE( bs ) ) - { - if ( have_flag ) - FT_TRACE5(( ", " )); - FT_TRACE5(( "long" )); - } - - FT_TRACE5(( ")" )); - } - - FT_TRACE5(( ":\n" )); - } -#endif /* FT_DEBUG_LEVEL_TRACE */ - - num_flats = 0; - num_rounds = 0; - - while ( *p ) - { - FT_ULong ch; - FT_ULong glyph_index; - FT_Long y_offset; - FT_Pos best_y; /* same as points.y */ - FT_Int best_point, best_contour_first, best_contour_last; - FT_Vector* points; - FT_Bool round = 0; - - - GET_UTF8_CHAR( ch, p ); - - /* load the character in the face -- skip unknown or empty ones */ - af_get_char_index( &metrics->root, ch, &glyph_index, &y_offset ); - if ( glyph_index == 0 ) - { - FT_TRACE5(( " U+%04lX unavailable\n", ch )); - continue; - } - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - outline = face->glyph->outline; - /* reject glyphs that don't produce any rendering */ - if ( error || outline.n_points <= 2 ) - { - FT_TRACE5(( " U+%04lX contains no (usable) outlines\n", ch )); - continue; - } - - /* now compute min or max point indices and coordinates */ - points = outline.points; - best_point = -1; - best_y = 0; /* make compiler happy */ - best_contour_first = 0; /* ditto */ - best_contour_last = 0; /* ditto */ - - { - FT_Int nn; - FT_Int first = 0; - FT_Int last = -1; - - - for ( nn = 0; nn < outline.n_contours; first = last + 1, nn++ ) - { - FT_Int old_best_point = best_point; - FT_Int pp; - - - last = outline.contours[nn]; - - /* Avoid single-point contours since they are never rasterized. */ - /* In some fonts, they correspond to mark attachment points */ - /* that are way outside of the glyph's real outline. */ - if ( last <= first ) - continue; - - if ( AF_LATIN_IS_TOP_BLUE( bs ) ) - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y > best_y ) - { - best_point = pp; - best_y = points[pp].y; - } - } - else - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y < best_y ) - { - best_point = pp; - best_y = points[pp].y; - } - } - - if ( best_point != old_best_point ) - { - best_contour_first = first; - best_contour_last = last; - } - } - } - - /* now check whether the point belongs to a straight or round */ - /* segment; we first need to find in which contour the extremum */ - /* lies, then inspect its previous and next points */ - if ( best_point >= 0 ) - { - FT_Pos best_x = points[best_point].x; - FT_Int prev, next; - FT_Int best_segment_first, best_segment_last; - FT_Int best_on_point_first, best_on_point_last; - FT_Pos dist; - - - best_segment_first = best_point; - best_segment_last = best_point; - - if ( FT_CURVE_TAG( outline.tags[best_point] ) == FT_CURVE_TAG_ON ) - { - best_on_point_first = best_point; - best_on_point_last = best_point; - } - else - { - best_on_point_first = -1; - best_on_point_last = -1; - } - - /* look for the previous and next points on the contour */ - /* that are not on the same Y coordinate, then threshold */ - /* the `closeness'... */ - prev = best_point; - next = prev; - - do - { - if ( prev > best_contour_first ) - prev--; - else - prev = best_contour_last; - - dist = FT_ABS( points[prev].y - best_y ); - /* accept a small distance or a small angle (both values are */ - /* heuristic; value 20 corresponds to approx. 2.9 degrees) */ - if ( dist > 5 ) - if ( FT_ABS( points[prev].x - best_x ) <= 20 * dist ) - break; - - best_segment_first = prev; - - if ( FT_CURVE_TAG( outline.tags[prev] ) == FT_CURVE_TAG_ON ) - { - best_on_point_first = prev; - if ( best_on_point_last < 0 ) - best_on_point_last = prev; - } - - } while ( prev != best_point ); - - do - { - if ( next < best_contour_last ) - next++; - else - next = best_contour_first; - - dist = FT_ABS( points[next].y - best_y ); - if ( dist > 5 ) - if ( FT_ABS( points[next].x - best_x ) <= 20 * dist ) - break; - - best_segment_last = next; - - if ( FT_CURVE_TAG( outline.tags[next] ) == FT_CURVE_TAG_ON ) - { - best_on_point_last = next; - if ( best_on_point_first < 0 ) - best_on_point_first = next; - } - - } while ( next != best_point ); - - if ( AF_LATIN_IS_LONG_BLUE( bs ) ) - { - /* If this flag is set, we have an additional constraint to */ - /* get the blue zone distance: Find a segment of the topmost */ - /* (or bottommost) contour that is longer than a heuristic */ - /* threshold. This ensures that small bumps in the outline */ - /* are ignored (for example, the `vertical serifs' found in */ - /* many Hebrew glyph designs). */ - - /* If this segment is long enough, we are done. Otherwise, */ - /* search the segment next to the extremum that is long */ - /* enough, has the same direction, and a not too large */ - /* vertical distance from the extremum. Note that the */ - /* algorithm doesn't check whether the found segment is */ - /* actually the one (vertically) nearest to the extremum. */ - - /* heuristic threshold value */ - FT_Pos length_threshold = metrics->units_per_em / 25; - - - dist = FT_ABS( points[best_segment_last].x - - points[best_segment_first].x ); - - if ( dist < length_threshold && - best_segment_last - best_segment_first + 2 <= - best_contour_last - best_contour_first ) - { - /* heuristic threshold value */ - FT_Pos height_threshold = metrics->units_per_em / 4; - - FT_Int first; - FT_Int last; - FT_Bool hit; - - /* we intentionally declare these two variables */ - /* outside of the loop since various compilers emit */ - /* incorrect warning messages otherwise, talking about */ - /* `possibly uninitialized variables' */ - FT_Int p_first = 0; /* make compiler happy */ - FT_Int p_last = 0; - - FT_Bool left2right; - - - /* compute direction */ - prev = best_point; - - do - { - if ( prev > best_contour_first ) - prev--; - else - prev = best_contour_last; - - if ( points[prev].x != best_x ) - break; - - } while ( prev != best_point ); - - /* skip glyph for the degenerate case */ - if ( prev == best_point ) - continue; - - left2right = FT_BOOL( points[prev].x < points[best_point].x ); - - first = best_segment_last; - last = first; - hit = 0; - - do - { - FT_Bool l2r; - FT_Pos d; - - - if ( !hit ) - { - /* no hit; adjust first point */ - first = last; - - /* also adjust first and last on point */ - if ( FT_CURVE_TAG( outline.tags[first] ) == - FT_CURVE_TAG_ON ) - { - p_first = first; - p_last = first; - } - else - { - p_first = -1; - p_last = -1; - } - - hit = 1; - } - - if ( last < best_contour_last ) - last++; - else - last = best_contour_first; - - if ( FT_ABS( best_y - points[first].y ) > height_threshold ) - { - /* vertical distance too large */ - hit = 0; - continue; - } - - /* same test as above */ - dist = FT_ABS( points[last].y - points[first].y ); - if ( dist > 5 ) - if ( FT_ABS( points[last].x - points[first].x ) <= - 20 * dist ) - { - hit = 0; - continue; - } - - if ( FT_CURVE_TAG( outline.tags[last] ) == FT_CURVE_TAG_ON ) - { - p_last = last; - if ( p_first < 0 ) - p_first = last; - } - - l2r = FT_BOOL( points[first].x < points[last].x ); - d = FT_ABS( points[last].x - points[first].x ); - - if ( l2r == left2right && - d >= length_threshold ) - { - /* all constraints are met; update segment after finding */ - /* its end */ - do - { - if ( last < best_contour_last ) - last++; - else - last = best_contour_first; - - d = FT_ABS( points[last].y - points[first].y ); - if ( d > 5 ) - if ( FT_ABS( points[next].x - points[first].x ) <= - 20 * dist ) - { - if ( last > best_contour_first ) - last--; - else - last = best_contour_last; - break; - } - - p_last = last; - - if ( FT_CURVE_TAG( outline.tags[last] ) == - FT_CURVE_TAG_ON ) - { - p_last = last; - if ( p_first < 0 ) - p_first = last; - } - - } while ( last != best_segment_first ); - - best_y = points[first].y; - - best_segment_first = first; - best_segment_last = last; - - best_on_point_first = p_first; - best_on_point_last = p_last; - - break; - } - - } while ( last != best_segment_first ); - } - } - - /* for computing blue zones, we add the y offset as returned */ - /* by the currently used OpenType feature -- for example, */ - /* superscript glyphs might be identical to subscript glyphs */ - /* with a vertical shift */ - best_y += y_offset; - - FT_TRACE5(( " U+%04lX: best_y = %5ld", ch, best_y )); - - /* now set the `round' flag depending on the segment's kind: */ - /* */ - /* - if the horizontal distance between the first and last */ - /* `on' point is larger than a heuristic threshold */ - /* we have a flat segment */ - /* - if either the first or the last point of the segment is */ - /* an `off' point, the segment is round, otherwise it is */ - /* flat */ - if ( best_on_point_first >= 0 && - best_on_point_last >= 0 && - ( FT_ABS( points[best_on_point_last].x - - points[best_on_point_first].x ) ) > - flat_threshold ) - round = 0; - else - round = FT_BOOL( - FT_CURVE_TAG( outline.tags[best_segment_first] ) != - FT_CURVE_TAG_ON || - FT_CURVE_TAG( outline.tags[best_segment_last] ) != - FT_CURVE_TAG_ON ); - - if ( round && AF_LATIN_IS_NEUTRAL_BLUE( bs ) ) - { - /* only use flat segments for a neutral blue zone */ - FT_TRACE5(( " (round, skipped)\n" )); - continue; - } - - FT_TRACE5(( " (%s)\n", round ? "round" : "flat" )); - } - - if ( round ) - rounds[num_rounds++] = best_y; - else - flats[num_flats++] = best_y; - } - - if ( num_flats == 0 && num_rounds == 0 ) - { - /* - * we couldn't find a single glyph to compute this blue zone, - * we will simply ignore it then - */ - FT_TRACE5(( " empty\n" )); - continue; - } - - /* we have computed the contents of the `rounds' and `flats' tables, */ - /* now determine the reference and overshoot position of the blue -- */ - /* we simply take the median value after a simple sort */ - af_sort_pos( num_rounds, rounds ); - af_sort_pos( num_flats, flats ); - - blue = &axis->blues[axis->blue_count]; - blue_ref = &blue->ref.org; - blue_shoot = &blue->shoot.org; - - axis->blue_count++; - - if ( num_flats == 0 ) - { - *blue_ref = - *blue_shoot = rounds[num_rounds / 2]; - } - else if ( num_rounds == 0 ) - { - *blue_ref = - *blue_shoot = flats[num_flats / 2]; - } - else - { - *blue_ref = flats [num_flats / 2]; - *blue_shoot = rounds[num_rounds / 2]; - } - - /* there are sometimes problems: if the overshoot position of top */ - /* zones is under its reference position, or the opposite for bottom */ - /* zones. We must thus check everything there and correct the errors */ - if ( *blue_shoot != *blue_ref ) - { - FT_Pos ref = *blue_ref; - FT_Pos shoot = *blue_shoot; - FT_Bool over_ref = FT_BOOL( shoot > ref ); - - - if ( AF_LATIN_IS_TOP_BLUE( bs ) ^ over_ref ) - { - *blue_ref = - *blue_shoot = ( shoot + ref ) / 2; - - FT_TRACE5(( " [overshoot smaller than reference," - " taking mean value]\n" )); - } - } - - blue->flags = 0; - if ( AF_LATIN_IS_TOP_BLUE( bs ) ) - blue->flags |= AF_LATIN_BLUE_TOP; - if ( AF_LATIN_IS_NEUTRAL_BLUE( bs ) ) - blue->flags |= AF_LATIN_BLUE_NEUTRAL; - - /* - * The following flag is used later to adjust the y and x scales - * in order to optimize the pixel grid alignment of the top of small - * letters. - */ - if ( AF_LATIN_IS_X_HEIGHT_BLUE( bs ) ) - blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; - - FT_TRACE5(( " -> reference = %ld\n" - " overshoot = %ld\n", - *blue_ref, *blue_shoot )); - } - - FT_TRACE5(( "\n" )); - - return; - } - - - /* Check whether all ASCII digits have the same advance width. */ - - FT_LOCAL_DEF( void ) - af_latin_metrics_check_digits( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_UInt i; - FT_Bool started = 0, same_width = 1; - FT_Fixed advance, old_advance = 0; - - - /* digit `0' is 0x30 in all supported charmaps */ - for ( i = 0x30; i <= 0x39; i++ ) - { - FT_ULong glyph_index; - FT_Long y_offset; - - - af_get_char_index( &metrics->root, i, &glyph_index, &y_offset ); - if ( glyph_index == 0 ) - continue; - - if ( FT_Get_Advance( face, glyph_index, - FT_LOAD_NO_SCALE | - FT_LOAD_NO_HINTING | - FT_LOAD_IGNORE_TRANSFORM, - &advance ) ) - continue; - - if ( started ) - { - if ( advance != old_advance ) - { - same_width = 0; - break; - } - } - else - { - old_advance = advance; - started = 1; - } - } - - metrics->root.digits_have_same_width = same_width; - } - - - /* Initialize global metrics. */ - - FT_LOCAL_DEF( FT_Error ) - af_latin_metrics_init( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_CharMap oldmap = face->charmap; - - - metrics->units_per_em = face->units_per_EM; - - if ( !FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) - { - af_latin_metrics_init_widths( metrics, face ); - af_latin_metrics_init_blues( metrics, face ); - af_latin_metrics_check_digits( metrics, face ); - } - - FT_Set_Charmap( face, oldmap ); - return FT_Err_Ok; - } - - - /* Adjust scaling value, then scale and shift widths */ - /* and blue zones (if applicable) for given dimension. */ - - static void - af_latin_metrics_scale_dim( AF_LatinMetrics metrics, - AF_Scaler scaler, - AF_Dimension dim ) - { - FT_Fixed scale; - FT_Pos delta; - AF_LatinAxis axis; - FT_UInt nn; - - - if ( dim == AF_DIMENSION_HORZ ) - { - scale = scaler->x_scale; - delta = scaler->x_delta; - } - else - { - scale = scaler->y_scale; - delta = scaler->y_delta; - } - - axis = &metrics->axis[dim]; - - if ( axis->org_scale == scale && axis->org_delta == delta ) - return; - - axis->org_scale = scale; - axis->org_delta = delta; - - /* - * correct X and Y scale to optimize the alignment of the top of small - * letters to the pixel grid - */ - { - AF_LatinAxis Axis = &metrics->axis[AF_DIMENSION_VERT]; - AF_LatinBlue blue = NULL; - - - for ( nn = 0; nn < Axis->blue_count; nn++ ) - { - if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) - { - blue = &Axis->blues[nn]; - break; - } - } - - if ( blue ) - { - FT_Pos scaled; - FT_Pos threshold; - FT_Pos fitted; - FT_UInt limit; - FT_UInt ppem; - - - scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); - ppem = metrics->root.scaler.face->size->metrics.x_ppem; - limit = metrics->root.globals->increase_x_height; - threshold = 40; - - /* if the `increase-x-height' property is active, */ - /* we round up much more often */ - if ( limit && - ppem <= limit && - ppem >= AF_PROP_INCREASE_X_HEIGHT_MIN ) - threshold = 52; - - fitted = ( scaled + threshold ) & ~63; - - if ( scaled != fitted ) - { -#if 0 - if ( dim == AF_DIMENSION_HORZ ) - { - if ( fitted < scaled ) - scale -= scale / 50; /* scale *= 0.98 */ - } - else -#endif - if ( dim == AF_DIMENSION_VERT ) - { - scale = FT_MulDiv( scale, fitted, scaled ); - - FT_TRACE5(( - "af_latin_metrics_scale_dim:" - " x height alignment (style `%s'):\n" - " " - " vertical scaling changed from %.4f to %.4f (by %d%%)\n" - "\n", - af_style_names[metrics->root.style_class->style], - axis->org_scale / 65536.0, - scale / 65536.0, - ( fitted - scaled ) * 100 / scaled )); - } - } - } - } - - axis->scale = scale; - axis->delta = delta; - - if ( dim == AF_DIMENSION_HORZ ) - { - metrics->root.scaler.x_scale = scale; - metrics->root.scaler.x_delta = delta; - } - else - { - metrics->root.scaler.y_scale = scale; - metrics->root.scaler.y_delta = delta; - } - - FT_TRACE5(( "%s widths (style `%s')\n", - dim == AF_DIMENSION_HORZ ? "horizontal" : "vertical", - af_style_names[metrics->root.style_class->style] )); - - /* scale the widths */ - for ( nn = 0; nn < axis->width_count; nn++ ) - { - AF_Width width = axis->widths + nn; - - - width->cur = FT_MulFix( width->org, scale ); - width->fit = width->cur; - - FT_TRACE5(( " %d scaled to %.2f\n", - width->org, - width->cur / 64.0 )); - } - - FT_TRACE5(( "\n" )); - - /* an extra-light axis corresponds to a standard width that is */ - /* smaller than 5/8 pixels */ - axis->extra_light = - (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( axis->extra_light ) - FT_TRACE5(( "`%s' style is extra light (at current resolution)\n" - "\n", - af_style_names[metrics->root.style_class->style] )); -#endif - - if ( dim == AF_DIMENSION_VERT ) - { - FT_TRACE5(( "blue zones (style `%s')\n", - af_style_names[metrics->root.style_class->style] )); - - /* scale the blue zones */ - for ( nn = 0; nn < axis->blue_count; nn++ ) - { - AF_LatinBlue blue = &axis->blues[nn]; - FT_Pos dist; - - - blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; - blue->ref.fit = blue->ref.cur; - blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; - blue->shoot.fit = blue->shoot.cur; - blue->flags &= ~AF_LATIN_BLUE_ACTIVE; - - /* a blue zone is only active if it is less than 3/4 pixels tall */ - dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); - if ( dist <= 48 && dist >= -48 ) - { -#if 0 - FT_Pos delta1; -#endif - FT_Pos delta2; - - - /* use discrete values for blue zone widths */ - -#if 0 - - /* generic, original code */ - delta1 = blue->shoot.org - blue->ref.org; - delta2 = delta1; - if ( delta1 < 0 ) - delta2 = -delta2; - - delta2 = FT_MulFix( delta2, scale ); - - if ( delta2 < 32 ) - delta2 = 0; - else if ( delta2 < 64 ) - delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); - else - delta2 = FT_PIX_ROUND( delta2 ); - - if ( delta1 < 0 ) - delta2 = -delta2; - - blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); - blue->shoot.fit = blue->ref.fit + delta2; - -#else - - /* simplified version due to abs(dist) <= 48 */ - delta2 = dist; - if ( dist < 0 ) - delta2 = -delta2; - - if ( delta2 < 32 ) - delta2 = 0; - else if ( delta2 < 48 ) - delta2 = 32; - else - delta2 = 64; - - if ( dist < 0 ) - delta2 = -delta2; - - blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); - blue->shoot.fit = blue->ref.fit - delta2; - -#endif - - blue->flags |= AF_LATIN_BLUE_ACTIVE; - - FT_TRACE5(( " reference %d: %d scaled to %.2f%s\n" - " overshoot %d: %d scaled to %.2f%s\n", - nn, - blue->ref.org, - blue->ref.fit / 64.0, - blue->flags & AF_LATIN_BLUE_ACTIVE ? "" - : " (inactive)", - nn, - blue->shoot.org, - blue->shoot.fit / 64.0, - blue->flags & AF_LATIN_BLUE_ACTIVE ? "" - : " (inactive)" )); - } - } - } - } - - - /* Scale global values in both directions. */ - - FT_LOCAL_DEF( void ) - af_latin_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ) - { - metrics->root.scaler.render_mode = scaler->render_mode; - metrics->root.scaler.face = scaler->face; - metrics->root.scaler.flags = scaler->flags; - - af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); - af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H A N A L Y S I S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* Walk over all contours and compute its segments. */ - - FT_LOCAL_DEF( FT_Error ) - af_latin_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_LatinMetrics metrics = (AF_LatinMetrics)hints->metrics; - AF_AxisHints axis = &hints->axis[dim]; - FT_Memory memory = hints->memory; - FT_Error error = FT_Err_Ok; - AF_Segment segment = NULL; - AF_SegmentRec seg0; - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - AF_Direction major_dir, segment_dir; - - FT_Pos flat_threshold = FLAT_THRESHOLD( metrics->units_per_em ); - - - FT_ZERO( &seg0 ); - seg0.score = 32000; - seg0.flags = AF_EDGE_NORMAL; - - major_dir = (AF_Direction)FT_ABS( axis->major_dir ); - segment_dir = major_dir; - - axis->num_segments = 0; - - /* set up (u,v) in each point */ - if ( dim == AF_DIMENSION_HORZ ) - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - - for ( ; point < limit; point++ ) - { - point->u = point->fx; - point->v = point->fy; - } - } - else - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - - for ( ; point < limit; point++ ) - { - point->u = point->fy; - point->v = point->fx; - } - } - - /* do each contour separately */ - for ( ; contour < contour_limit; contour++ ) - { - AF_Point point = contour[0]; - AF_Point last = point->prev; - int on_edge = 0; - FT_Pos min_pos = 32000; /* minimum segment pos != min_coord */ - FT_Pos max_pos = -32000; /* maximum segment pos != max_coord */ - FT_Pos min_on_pos = 32000; - FT_Pos max_on_pos = -32000; - FT_Bool passed; - - - if ( point == last ) /* skip singletons -- just in case */ - continue; - - if ( FT_ABS( last->out_dir ) == major_dir && - FT_ABS( point->out_dir ) == major_dir ) - { - /* we are already on an edge, try to locate its start */ - last = point; - - for (;;) - { - point = point->prev; - if ( FT_ABS( point->out_dir ) != major_dir ) - { - point = point->next; - break; - } - if ( point == last ) - break; - } - } - - last = point; - passed = 0; - - for (;;) - { - FT_Pos u, v; - - - if ( on_edge ) - { - u = point->u; - if ( u < min_pos ) - min_pos = u; - if ( u > max_pos ) - max_pos = u; - - /* get minimum and maximum coordinate of on points */ - if ( !( point->flags & AF_FLAG_CONTROL ) ) - { - v = point->v; - if ( v < min_on_pos ) - min_on_pos = v; - if ( v > max_on_pos ) - max_on_pos = v; - } - - if ( point->out_dir != segment_dir || point == last ) - { - /* we are just leaving an edge; record a new segment! */ - segment->last = point; - segment->pos = (FT_Short)( ( min_pos + max_pos ) >> 1 ); - - /* a segment is round if either its first or last point */ - /* is a control point, and the length of the on points */ - /* inbetween doesn't exceed a heuristic limit */ - if ( ( segment->first->flags | point->flags ) & AF_FLAG_CONTROL && - ( max_on_pos - min_on_pos ) < flat_threshold ) - segment->flags |= AF_EDGE_ROUND; - - /* compute segment size */ - min_pos = max_pos = point->v; - - v = segment->first->v; - if ( v < min_pos ) - min_pos = v; - if ( v > max_pos ) - max_pos = v; - - segment->min_coord = (FT_Short)min_pos; - segment->max_coord = (FT_Short)max_pos; - segment->height = (FT_Short)( segment->max_coord - - segment->min_coord ); - - on_edge = 0; - segment = NULL; - /* fall through */ - } - } - - /* now exit if we are at the start/end point */ - if ( point == last ) - { - if ( passed ) - break; - passed = 1; - } - - if ( !on_edge && FT_ABS( point->out_dir ) == major_dir ) - { - /* this is the start of a new segment! */ - segment_dir = (AF_Direction)point->out_dir; - - error = af_axis_hints_new_segment( axis, memory, &segment ); - if ( error ) - goto Exit; - - /* clear all segment fields */ - segment[0] = seg0; - - segment->dir = (FT_Char)segment_dir; - segment->first = point; - segment->last = point; - - min_pos = max_pos = point->u; - - if ( point->flags & AF_FLAG_CONTROL ) - { - min_on_pos = 32000; - max_on_pos = -32000; - } - else - min_on_pos = max_on_pos = point->v; - - on_edge = 1; - } - - point = point->next; - } - - } /* contours */ - - - /* now slightly increase the height of segments if this makes */ - /* sense -- this is used to better detect and ignore serifs */ - { - AF_Segment segments = axis->segments; - AF_Segment segments_end = segments + axis->num_segments; - - - for ( segment = segments; segment < segments_end; segment++ ) - { - AF_Point first = segment->first; - AF_Point last = segment->last; - FT_Pos first_v = first->v; - FT_Pos last_v = last->v; - - - if ( first_v < last_v ) - { - AF_Point p; - - - p = first->prev; - if ( p->v < first_v ) - segment->height = (FT_Short)( segment->height + - ( ( first_v - p->v ) >> 1 ) ); - - p = last->next; - if ( p->v > last_v ) - segment->height = (FT_Short)( segment->height + - ( ( p->v - last_v ) >> 1 ) ); - } - else - { - AF_Point p; - - - p = first->prev; - if ( p->v > first_v ) - segment->height = (FT_Short)( segment->height + - ( ( p->v - first_v ) >> 1 ) ); - - p = last->next; - if ( p->v < last_v ) - segment->height = (FT_Short)( segment->height + - ( ( last_v - p->v ) >> 1 ) ); - } - } - } - - Exit: - return error; - } - - - /* Link segments to form stems and serifs. If `width_count' and */ - /* `widths' are non-zero, use them to fine-tune the scoring function. */ - - FT_LOCAL_DEF( void ) - af_latin_hints_link_segments( AF_GlyphHints hints, - FT_UInt width_count, - AF_WidthRec* widths, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - FT_Pos len_threshold, len_score, dist_score, max_width; - AF_Segment seg1, seg2; - - - if ( width_count ) - max_width = widths[width_count - 1].org; - else - max_width = 0; - - /* a heuristic value to set up a minimum value for overlapping */ - len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); - if ( len_threshold == 0 ) - len_threshold = 1; - - /* a heuristic value to weight lengths */ - len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); - - /* a heuristic value to weight distances (no call to */ - /* AF_LATIN_CONSTANT needed, since we work on multiples */ - /* of the stem width) */ - dist_score = 3000; - - /* now compare each segment to the others */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - if ( seg1->dir != axis->major_dir ) - continue; - - /* search for stems having opposite directions, */ - /* with seg1 to the `left' of seg2 */ - for ( seg2 = segments; seg2 < segment_limit; seg2++ ) - { - FT_Pos pos1 = seg1->pos; - FT_Pos pos2 = seg2->pos; - - - if ( seg1->dir + seg2->dir == 0 && pos2 > pos1 ) - { - /* compute distance between the two segments */ - FT_Pos min = seg1->min_coord; - FT_Pos max = seg1->max_coord; - FT_Pos len; - - - if ( min < seg2->min_coord ) - min = seg2->min_coord; - - if ( max > seg2->max_coord ) - max = seg2->max_coord; - - /* compute maximum coordinate difference of the two segments */ - /* (this is, how much they overlap) */ - len = max - min; - if ( len >= len_threshold ) - { - /* - * The score is the sum of two demerits indicating the - * `badness' of a fit, measured along the segments' main axis - * and orthogonal to it, respectively. - * - * o The less overlapping along the main axis, the worse it - * is, causing a larger demerit. - * - * o The nearer the orthogonal distance to a stem width, the - * better it is, causing a smaller demerit. For simplicity, - * however, we only increase the demerit for values that - * exceed the largest stem width. - */ - - FT_Pos dist = pos2 - pos1; - - FT_Pos dist_demerit, score; - - - if ( max_width ) - { - /* distance demerits are based on multiples of `max_width'; */ - /* we scale by 1024 for getting more precision */ - FT_Pos delta = ( dist << 10 ) / max_width - ( 1 << 10 ); - - - if ( delta > 10000 ) - dist_demerit = 32000; - else if ( delta > 0 ) - dist_demerit = delta * delta / dist_score; - else - dist_demerit = 0; - } - else - dist_demerit = dist; /* default if no widths available */ - - score = dist_demerit + len_score / len; - - /* and we search for the smallest score */ - if ( score < seg1->score ) - { - seg1->score = score; - seg1->link = seg2; - } - - if ( score < seg2->score ) - { - seg2->score = score; - seg2->link = seg1; - } - } - } - } - } - - /* now compute the `serif' segments, cf. explanations in `afhints.h' */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - seg2 = seg1->link; - - if ( seg2 ) - { - if ( seg2->link != seg1 ) - { - seg1->link = 0; - seg1->serif = seg2->link; - } - } - } - } - - - /* Link segments to edges, using feature analysis for selection. */ - - FT_LOCAL_DEF( FT_Error ) - af_latin_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - FT_Error error = FT_Err_Ok; - FT_Memory memory = hints->memory; - AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; - - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Segment seg; - -#if 0 - AF_Direction up_dir; -#endif - FT_Fixed scale; - FT_Pos edge_distance_threshold; - FT_Pos segment_length_threshold; - - - axis->num_edges = 0; - - scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale - : hints->y_scale; - -#if 0 - up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP - : AF_DIR_RIGHT; -#endif - - /* - * We ignore all segments that are less than 1 pixel in length - * to avoid many problems with serif fonts. We compute the - * corresponding threshold in font units. - */ - if ( dim == AF_DIMENSION_HORZ ) - segment_length_threshold = FT_DivFix( 64, hints->y_scale ); - else - segment_length_threshold = 0; - - /*********************************************************************/ - /* */ - /* We begin by generating a sorted table of edges for the current */ - /* direction. To do so, we simply scan each segment and try to find */ - /* an edge in our table that corresponds to its position. */ - /* */ - /* If no edge is found, we create and insert a new edge in the */ - /* sorted table. Otherwise, we simply add the segment to the edge's */ - /* list which gets processed in the second step to compute the */ - /* edge's properties. */ - /* */ - /* Note that the table of edges is sorted along the segment/edge */ - /* position. */ - /* */ - /*********************************************************************/ - - /* assure that edge distance threshold is at most 0.25px */ - edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, - scale ); - if ( edge_distance_threshold > 64 / 4 ) - edge_distance_threshold = 64 / 4; - - edge_distance_threshold = FT_DivFix( edge_distance_threshold, - scale ); - - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge found = NULL; - FT_Int ee; - - - if ( seg->height < segment_length_threshold ) - continue; - - /* A special case for serif edges: If they are smaller than */ - /* 1.5 pixels we ignore them. */ - if ( seg->serif && - 2 * seg->height < 3 * segment_length_threshold ) - continue; - - /* look for an edge corresponding to the segment */ - for ( ee = 0; ee < axis->num_edges; ee++ ) - { - AF_Edge edge = axis->edges + ee; - FT_Pos dist; - - - dist = seg->pos - edge->fpos; - if ( dist < 0 ) - dist = -dist; - - if ( dist < edge_distance_threshold && edge->dir == seg->dir ) - { - found = edge; - break; - } - } - - if ( !found ) - { - AF_Edge edge; - - - /* insert a new edge in the list and */ - /* sort according to the position */ - error = af_axis_hints_new_edge( axis, seg->pos, - (AF_Direction)seg->dir, - memory, &edge ); - if ( error ) - goto Exit; - - /* add the segment to the new edge's list */ - FT_ZERO( edge ); - - edge->first = seg; - edge->last = seg; - edge->dir = seg->dir; - edge->fpos = seg->pos; - edge->opos = FT_MulFix( seg->pos, scale ); - edge->pos = edge->opos; - seg->edge_next = seg; - } - else - { - /* if an edge was found, simply add the segment to the edge's */ - /* list */ - seg->edge_next = found->first; - found->last->edge_next = seg; - found->last = seg; - } - } - - - /******************************************************************/ - /* */ - /* Good, we now compute each edge's properties according to the */ - /* segments found on its position. Basically, these are */ - /* */ - /* - the edge's main direction */ - /* - stem edge, serif edge or both (which defaults to stem then) */ - /* - rounded edge, straight or both (which defaults to straight) */ - /* - link for edge */ - /* */ - /******************************************************************/ - - /* first of all, set the `edge' field in each segment -- this is */ - /* required in order to compute edge links */ - - /* - * Note that removing this loop and setting the `edge' field of each - * segment directly in the code above slows down execution speed for - * some reasons on platforms like the Sun. - */ - { - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - - - for ( edge = edges; edge < edge_limit; edge++ ) - { - seg = edge->first; - if ( seg ) - do - { - seg->edge = edge; - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - - /* now compute each edge properties */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Int is_round = 0; /* does it contain round segments? */ - FT_Int is_straight = 0; /* does it contain straight segments? */ -#if 0 - FT_Pos ups = 0; /* number of upwards segments */ - FT_Pos downs = 0; /* number of downwards segments */ -#endif - - - seg = edge->first; - - do - { - FT_Bool is_serif; - - - /* check for roundness of segment */ - if ( seg->flags & AF_EDGE_ROUND ) - is_round++; - else - is_straight++; - -#if 0 - /* check for segment direction */ - if ( seg->dir == up_dir ) - ups += seg->max_coord - seg->min_coord; - else - downs += seg->max_coord - seg->min_coord; -#endif - - /* check for links -- if seg->serif is set, then seg->link must */ - /* be ignored */ - is_serif = (FT_Bool)( seg->serif && - seg->serif->edge && - seg->serif->edge != edge ); - - if ( ( seg->link && seg->link->edge != NULL ) || is_serif ) - { - AF_Edge edge2; - AF_Segment seg2; - - - edge2 = edge->link; - seg2 = seg->link; - - if ( is_serif ) - { - seg2 = seg->serif; - edge2 = edge->serif; - } - - if ( edge2 ) - { - FT_Pos edge_delta; - FT_Pos seg_delta; - - - edge_delta = edge->fpos - edge2->fpos; - if ( edge_delta < 0 ) - edge_delta = -edge_delta; - - seg_delta = seg->pos - seg2->pos; - if ( seg_delta < 0 ) - seg_delta = -seg_delta; - - if ( seg_delta < edge_delta ) - edge2 = seg2->edge; - } - else - edge2 = seg2->edge; - - if ( is_serif ) - { - edge->serif = edge2; - edge2->flags |= AF_EDGE_SERIF; - } - else - edge->link = edge2; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - - /* set the round/straight flags */ - edge->flags = AF_EDGE_NORMAL; - - if ( is_round > 0 && is_round >= is_straight ) - edge->flags |= AF_EDGE_ROUND; - -#if 0 - /* set the edge's main direction */ - edge->dir = AF_DIR_NONE; - - if ( ups > downs ) - edge->dir = (FT_Char)up_dir; - - else if ( ups < downs ) - edge->dir = (FT_Char)-up_dir; - - else if ( ups == downs ) - edge->dir = 0; /* both up and down! */ -#endif - - /* get rid of serifs if link is set */ - /* XXX: This gets rid of many unpleasant artefacts! */ - /* Example: the `c' in cour.pfa at size 13 */ - - if ( edge->serif && edge->link ) - edge->serif = NULL; - } - } - - Exit: - return error; - } - - - /* Detect segments and edges for given dimension. */ - - FT_LOCAL_DEF( FT_Error ) - af_latin_hints_detect_features( AF_GlyphHints hints, - FT_UInt width_count, - AF_WidthRec* widths, - AF_Dimension dim ) - { - FT_Error error; - - - error = af_latin_hints_compute_segments( hints, dim ); - if ( !error ) - { - af_latin_hints_link_segments( hints, width_count, widths, dim ); - - error = af_latin_hints_compute_edges( hints, dim ); - } - - return error; - } - - - /* Compute all edges which lie within blue zones. */ - - static void - af_latin_hints_compute_blue_edges( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - AF_AxisHints axis = &hints->axis[AF_DIMENSION_VERT]; - AF_Edge edge = axis->edges; - AF_Edge edge_limit = edge + axis->num_edges; - AF_LatinAxis latin = &metrics->axis[AF_DIMENSION_VERT]; - FT_Fixed scale = latin->scale; - - - /* compute which blue zones are active, i.e. have their scaled */ - /* size < 3/4 pixels */ - - /* for each horizontal edge search the blue zone which is closest */ - for ( ; edge < edge_limit; edge++ ) - { - FT_UInt bb; - AF_Width best_blue = NULL; - FT_Bool best_blue_is_neutral = 0; - FT_Pos best_dist; /* initial threshold */ - - - /* compute the initial threshold as a fraction of the EM size */ - /* (the value 40 is heuristic) */ - best_dist = FT_MulFix( metrics->units_per_em / 40, scale ); - - /* assure a minimum distance of 0.5px */ - if ( best_dist > 64 / 2 ) - best_dist = 64 / 2; - - for ( bb = 0; bb < latin->blue_count; bb++ ) - { - AF_LatinBlue blue = latin->blues + bb; - FT_Bool is_top_blue, is_neutral_blue, is_major_dir; - - - /* skip inactive blue zones (i.e., those that are too large) */ - if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) - continue; - - /* if it is a top zone, check for right edges (against the major */ - /* direction); if it is a bottom zone, check for left edges (in */ - /* the major direction) -- this assumes the TrueType convention */ - /* for the orientation of contours */ - is_top_blue = - (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 ); - is_neutral_blue = - (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_NEUTRAL ) != 0); - is_major_dir = - FT_BOOL( edge->dir == axis->major_dir ); - - /* neutral blue zones are handled for both directions */ - if ( is_top_blue ^ is_major_dir || is_neutral_blue ) - { - FT_Pos dist; - - - /* first of all, compare it to the reference position */ - dist = edge->fpos - blue->ref.org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = &blue->ref; - best_blue_is_neutral = is_neutral_blue; - } - - /* now compare it to the overshoot position and check whether */ - /* the edge is rounded, and whether the edge is over the */ - /* reference position of a top zone, or under the reference */ - /* position of a bottom zone (provided we don't have a */ - /* neutral blue zone) */ - if ( edge->flags & AF_EDGE_ROUND && - dist != 0 && - !is_neutral_blue ) - { - FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); - - - if ( is_top_blue ^ is_under_ref ) - { - dist = edge->fpos - blue->shoot.org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = &blue->shoot; - best_blue_is_neutral = is_neutral_blue; - } - } - } - } - } - - if ( best_blue ) - { - edge->blue_edge = best_blue; - if ( best_blue_is_neutral ) - edge->flags |= AF_EDGE_NEUTRAL; - } - } - } - - - /* Initalize hinting engine. */ - - static FT_Error - af_latin_hints_init( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - FT_Render_Mode mode; - FT_UInt32 scaler_flags, other_flags; - FT_Face face = metrics->root.scaler.face; - - - af_glyph_hints_rescale( hints, (AF_StyleMetrics)metrics ); - - /* - * correct x_scale and y_scale if needed, since they may have - * been modified by `af_latin_metrics_scale_dim' above - */ - hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; - hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; - hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; - hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; - - /* compute flags depending on render mode, etc. */ - mode = metrics->root.scaler.render_mode; - -#if 0 /* #ifdef AF_CONFIG_OPTION_USE_WARPER */ - if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) - metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; -#endif - - scaler_flags = hints->scaler_flags; - other_flags = 0; - - /* - * We snap the width of vertical stems for the monochrome and - * horizontal LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) - other_flags |= AF_LATIN_HINTS_HORZ_SNAP; - - /* - * We snap the width of horizontal stems for the monochrome and - * vertical LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) - other_flags |= AF_LATIN_HINTS_VERT_SNAP; - - /* - * We adjust stems to full pixels only if we don't use the `light' mode. - */ - if ( mode != FT_RENDER_MODE_LIGHT ) - other_flags |= AF_LATIN_HINTS_STEM_ADJUST; - - if ( mode == FT_RENDER_MODE_MONO ) - other_flags |= AF_LATIN_HINTS_MONO; - - /* - * In `light' hinting mode we disable horizontal hinting completely. - * We also do it if the face is italic. - * - * However, if warping is enabled (which only works in `light' hinting - * mode), advance widths get adjusted, too. - */ - if ( mode == FT_RENDER_MODE_LIGHT || - ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 ) - scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; - -#ifdef AF_CONFIG_OPTION_USE_WARPER - /* get (global) warper flag */ - if ( !metrics->root.globals->module->warping ) - scaler_flags |= AF_SCALER_FLAG_NO_WARPER; -#endif - - hints->scaler_flags = scaler_flags; - hints->other_flags = other_flags; - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* Snap a given width in scaled coordinates to one of the */ - /* current standard widths. */ - - static FT_Pos - af_latin_snap_width( AF_Width widths, - FT_UInt count, - FT_Pos width ) - { - FT_UInt n; - FT_Pos best = 64 + 32 + 2; - FT_Pos reference = width; - FT_Pos scaled; - - - for ( n = 0; n < count; n++ ) - { - FT_Pos w; - FT_Pos dist; - - - w = widths[n].cur; - dist = width - w; - if ( dist < 0 ) - dist = -dist; - if ( dist < best ) - { - best = dist; - reference = w; - } - } - - scaled = FT_PIX_ROUND( reference ); - - if ( width >= reference ) - { - if ( width < scaled + 48 ) - width = reference; - } - else - { - if ( width > scaled - 48 ) - width = reference; - } - - return width; - } - - - /* Compute the snapped width of a given stem, ignoring very thin ones. */ - /* There is a lot of voodoo in this function; changing the hard-coded */ - /* parameters influence the whole hinting process. */ - - static FT_Pos - af_latin_compute_stem_width( AF_GlyphHints hints, - AF_Dimension dim, - FT_Pos width, - FT_UInt base_flags, - FT_UInt stem_flags ) - { - AF_LatinMetrics metrics = (AF_LatinMetrics)hints->metrics; - AF_LatinAxis axis = &metrics->axis[dim]; - FT_Pos dist = width; - FT_Int sign = 0; - FT_Int vertical = ( dim == AF_DIMENSION_VERT ); - - - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || - axis->extra_light ) - return width; - - if ( dist < 0 ) - { - dist = -width; - sign = 1; - } - - if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || - ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) - { - /* smooth hinting process: very lightly quantize the stem width */ - - /* leave the widths of serifs alone */ - if ( ( stem_flags & AF_EDGE_SERIF ) && - vertical && - ( dist < 3 * 64 ) ) - goto Done_Width; - - else if ( base_flags & AF_EDGE_ROUND ) - { - if ( dist < 80 ) - dist = 64; - } - else if ( dist < 56 ) - dist = 56; - - if ( axis->width_count > 0 ) - { - FT_Pos delta; - - - /* compare to standard width */ - delta = dist - axis->widths[0].cur; - - if ( delta < 0 ) - delta = -delta; - - if ( delta < 40 ) - { - dist = axis->widths[0].cur; - if ( dist < 48 ) - dist = 48; - - goto Done_Width; - } - - if ( dist < 3 * 64 ) - { - delta = dist & 63; - dist &= -64; - - if ( delta < 10 ) - dist += delta; - - else if ( delta < 32 ) - dist += 10; - - else if ( delta < 54 ) - dist += 54; - - else - dist += delta; - } - else - dist = ( dist + 32 ) & ~63; - } - } - else - { - /* strong hinting process: snap the stem width to integer pixels */ - - FT_Pos org_dist = dist; - - - dist = af_latin_snap_width( axis->widths, axis->width_count, dist ); - - if ( vertical ) - { - /* in the case of vertical hinting, always round */ - /* the stem heights to integer pixels */ - - if ( dist >= 64 ) - dist = ( dist + 16 ) & ~63; - else - dist = 64; - } - else - { - if ( AF_LATIN_HINTS_DO_MONO( hints ) ) - { - /* monochrome horizontal hinting: snap widths to integer pixels */ - /* with a different threshold */ - - if ( dist < 64 ) - dist = 64; - else - dist = ( dist + 32 ) & ~63; - } - else - { - /* for horizontal anti-aliased hinting, we adopt a more subtle */ - /* approach: we strengthen small stems, round stems whose size */ - /* is between 1 and 2 pixels to an integer, otherwise nothing */ - - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - - else if ( dist < 128 ) - { - /* We only round to an integer width if the corresponding */ - /* distortion is less than 1/4 pixel. Otherwise this */ - /* makes everything worse since the diagonals, which are */ - /* not hinted, appear a lot bolder or thinner than the */ - /* vertical stems. */ - - FT_Pos delta; - - - dist = ( dist + 22 ) & ~63; - delta = dist - org_dist; - if ( delta < 0 ) - delta = -delta; - - if ( delta >= 16 ) - { - dist = org_dist; - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - } - } - else - /* round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & ~63; - } - } - } - - Done_Width: - if ( sign ) - dist = -dist; - - return dist; - } - - - /* Align one stem edge relative to the previous stem edge. */ - - static void - af_latin_align_linked_edge( AF_GlyphHints hints, - AF_Dimension dim, - AF_Edge base_edge, - AF_Edge stem_edge ) - { - FT_Pos dist = stem_edge->opos - base_edge->opos; - - FT_Pos fitted_width = af_latin_compute_stem_width( hints, dim, dist, - base_edge->flags, - stem_edge->flags ); - - - stem_edge->pos = base_edge->pos + fitted_width; - - FT_TRACE5(( " LINK: edge %d (opos=%.2f) linked to %.2f," - " dist was %.2f, now %.2f\n", - stem_edge - hints->axis[dim].edges, stem_edge->opos / 64.0, - stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); - } - - - /* Shift the coordinates of the `serif' edge by the same amount */ - /* as the corresponding `base' edge has been moved already. */ - - static void - af_latin_align_serif_edge( AF_GlyphHints hints, - AF_Edge base, - AF_Edge serif ) - { - FT_UNUSED( hints ); - - serif->pos = base->pos + ( serif->opos - base->opos ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** E D G E H I N T I N G ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* The main grid-fitting routine. */ - - static void - af_latin_hint_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - FT_PtrDist n_edges; - AF_Edge edge; - AF_Edge anchor = NULL; - FT_Int has_serifs = 0; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_UInt num_actions = 0; -#endif - - - FT_TRACE5(( "latin %s edge hinting (style `%s')\n", - dim == AF_DIMENSION_VERT ? "horizontal" : "vertical", - af_style_names[hints->metrics->style_class->style] )); - - /* we begin by aligning all stems relative to the blue zone */ - /* if needed -- that's only for horizontal edges */ - - if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) - { - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Width blue; - AF_Edge edge1, edge2; /* these edges form the stem to check */ - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - edge1 = NULL; - edge2 = edge->link; - - /* - * If a stem contains both a neutral and a non-neutral blue zone, - * skip the neutral one. Otherwise, outlines with different - * directions might be incorrectly aligned at the same vertical - * position. - * - * If we have two neutral blue zones, skip one of them. - * - */ - if ( edge->blue_edge && edge2 && edge2->blue_edge ) - { - FT_Byte neutral = edge->flags & AF_EDGE_NEUTRAL; - FT_Byte neutral2 = edge2->flags & AF_EDGE_NEUTRAL; - - - if ( neutral2 ) - { - edge2->blue_edge = NULL; - edge2->flags &= ~AF_EDGE_NEUTRAL; - } - else if ( neutral ) - { - edge->blue_edge = NULL; - edge->flags &= ~AF_EDGE_NEUTRAL; - } - } - - blue = edge->blue_edge; - if ( blue ) - edge1 = edge; - - /* flip edges if the other edge is aligned to a blue zone */ - else if ( edge2 && edge2->blue_edge ) - { - blue = edge2->blue_edge; - edge1 = edge2; - edge2 = edge; - } - - if ( !edge1 ) - continue; - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !anchor ) - FT_TRACE5(( " BLUE_ANCHOR: edge %d (opos=%.2f) snapped to %.2f," - " was %.2f (anchor=edge %d)\n", - edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0, - edge1->pos / 64.0, edge - edges )); - else - FT_TRACE5(( " BLUE: edge %d (opos=%.2f) snapped to %.2f," - " was %.2f\n", - edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0, - edge1->pos / 64.0 )); - - num_actions++; -#endif - - edge1->pos = blue->fit; - edge1->flags |= AF_EDGE_DONE; - - if ( edge2 && !edge2->blue_edge ) - { - af_latin_align_linked_edge( hints, dim, edge1, edge2 ); - edge2->flags |= AF_EDGE_DONE; - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - } - - if ( !anchor ) - anchor = edge; - } - } - - /* now we align all other stem edges, trying to maintain the */ - /* relative order of stems in the glyph */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Edge edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - /* skip all non-stem edges */ - edge2 = edge->link; - if ( !edge2 ) - { - has_serifs++; - continue; - } - - /* now align the stem */ - - /* this should not happen, but it's better to be safe */ - if ( edge2->blue_edge ) - { - FT_TRACE5(( " ASSERTION FAILED for edge %d\n", edge2 - edges )); - - af_latin_align_linked_edge( hints, dim, edge2, edge ); - edge->flags |= AF_EDGE_DONE; - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - continue; - } - - if ( !anchor ) - { - /* if we reach this if clause, no stem has been aligned yet */ - - FT_Pos org_len, org_center, cur_len; - FT_Pos cur_pos1, error1, error2, u_off, d_off; - - - org_len = edge2->opos - edge->opos; - cur_len = af_latin_compute_stem_width( hints, dim, org_len, - edge->flags, - edge2->flags ); - - /* some voodoo to specially round edges for small stem widths; */ - /* the idea is to align the center of a stem, then shifting */ - /* the stem edges to suitable positions */ - if ( cur_len <= 64 ) - { - /* width <= 1px */ - u_off = 32; - d_off = 32; - } - else - { - /* 1px < width < 1.5px */ - u_off = 38; - d_off = 26; - } - - if ( cur_len < 96 ) - { - org_center = edge->opos + ( org_len >> 1 ); - cur_pos1 = FT_PIX_ROUND( org_center ); - - error1 = org_center - ( cur_pos1 - u_off ); - if ( error1 < 0 ) - error1 = -error1; - - error2 = org_center - ( cur_pos1 + d_off ); - if ( error2 < 0 ) - error2 = -error2; - - if ( error1 < error2 ) - cur_pos1 -= u_off; - else - cur_pos1 += d_off; - - edge->pos = cur_pos1 - cur_len / 2; - edge2->pos = edge->pos + cur_len; - } - else - edge->pos = FT_PIX_ROUND( edge->opos ); - - anchor = edge; - edge->flags |= AF_EDGE_DONE; - - FT_TRACE5(( " ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)" - " snapped to %.2f and %.2f\n", - edge - edges, edge->opos / 64.0, - edge2 - edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0 )); - - af_latin_align_linked_edge( hints, dim, edge, edge2 ); - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions += 2; -#endif - } - else - { - FT_Pos org_pos, org_len, org_center, cur_len; - FT_Pos cur_pos1, cur_pos2, delta1, delta2; - - - org_pos = anchor->pos + ( edge->opos - anchor->opos ); - org_len = edge2->opos - edge->opos; - org_center = org_pos + ( org_len >> 1 ); - - cur_len = af_latin_compute_stem_width( hints, dim, org_len, - edge->flags, - edge2->flags ); - - if ( edge2->flags & AF_EDGE_DONE ) - { - FT_TRACE5(( " ADJUST: edge %d (pos=%.2f) moved to %.2f\n", - edge - edges, edge->pos / 64.0, - ( edge2->pos - cur_len ) / 64.0 )); - - edge->pos = edge2->pos - cur_len; - } - - else if ( cur_len < 96 ) - { - FT_Pos u_off, d_off; - - - cur_pos1 = FT_PIX_ROUND( org_center ); - - if ( cur_len <= 64 ) - { - u_off = 32; - d_off = 32; - } - else - { - u_off = 38; - d_off = 26; - } - - delta1 = org_center - ( cur_pos1 - u_off ); - if ( delta1 < 0 ) - delta1 = -delta1; - - delta2 = org_center - ( cur_pos1 + d_off ); - if ( delta2 < 0 ) - delta2 = -delta2; - - if ( delta1 < delta2 ) - cur_pos1 -= u_off; - else - cur_pos1 += d_off; - - edge->pos = cur_pos1 - cur_len / 2; - edge2->pos = cur_pos1 + cur_len / 2; - - FT_TRACE5(( " STEM: edge %d (opos=%.2f) linked to %d (opos=%.2f)" - " snapped to %.2f and %.2f\n", - edge - edges, edge->opos / 64.0, - edge2 - edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0 )); - } - - else - { - org_pos = anchor->pos + ( edge->opos - anchor->opos ); - org_len = edge2->opos - edge->opos; - org_center = org_pos + ( org_len >> 1 ); - - cur_len = af_latin_compute_stem_width( hints, dim, org_len, - edge->flags, - edge2->flags ); - - cur_pos1 = FT_PIX_ROUND( org_pos ); - delta1 = cur_pos1 + ( cur_len >> 1 ) - org_center; - if ( delta1 < 0 ) - delta1 = -delta1; - - cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; - delta2 = cur_pos2 + ( cur_len >> 1 ) - org_center; - if ( delta2 < 0 ) - delta2 = -delta2; - - edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2; - edge2->pos = edge->pos + cur_len; - - FT_TRACE5(( " STEM: edge %d (opos=%.2f) linked to %d (opos=%.2f)" - " snapped to %.2f and %.2f\n", - edge - edges, edge->opos / 64.0, - edge2 - edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0 )); - } - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - - edge->flags |= AF_EDGE_DONE; - edge2->flags |= AF_EDGE_DONE; - - if ( edge > edges && edge->pos < edge[-1].pos ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %d (pos=%.2f) moved to %.2f\n", - edge - edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); - - num_actions++; -#endif - - edge->pos = edge[-1].pos; - } - } - } - - /* make sure that lowercase m's maintain their symmetry */ - - /* In general, lowercase m's have six vertical edges if they are sans */ - /* serif, or twelve if they are with serifs. This implementation is */ - /* based on that assumption, and seems to work very well with most */ - /* faces. However, if for a certain face this assumption is not */ - /* true, the m is just rendered like before. In addition, any stem */ - /* correction will only be applied to symmetrical glyphs (even if the */ - /* glyph is not an m), so the potential for unwanted distortion is */ - /* relatively low. */ - - /* We don't handle horizontal edges since we can't easily assure that */ - /* the third (lowest) stem aligns with the base line; it might end up */ - /* one pixel higher or lower. */ - - n_edges = edge_limit - edges; - if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) - { - AF_Edge edge1, edge2, edge3; - FT_Pos dist1, dist2, span, delta; - - - if ( n_edges == 6 ) - { - edge1 = edges; - edge2 = edges + 2; - edge3 = edges + 4; - } - else - { - edge1 = edges + 1; - edge2 = edges + 5; - edge3 = edges + 9; - } - - dist1 = edge2->opos - edge1->opos; - dist2 = edge3->opos - edge2->opos; - - span = dist1 - dist2; - if ( span < 0 ) - span = -span; - - if ( span < 8 ) - { - delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); - edge3->pos -= delta; - if ( edge3->link ) - edge3->link->pos -= delta; - - /* move the serifs along with the stem */ - if ( n_edges == 12 ) - { - ( edges + 8 )->pos -= delta; - ( edges + 11 )->pos -= delta; - } - - edge3->flags |= AF_EDGE_DONE; - if ( edge3->link ) - edge3->link->flags |= AF_EDGE_DONE; - } - } - - if ( has_serifs || !anchor ) - { - /* - * now hint the remaining edges (serifs and single) in order - * to complete our processing - */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Pos delta; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - delta = 1000; - - if ( edge->serif ) - { - delta = edge->serif->opos - edge->opos; - if ( delta < 0 ) - delta = -delta; - } - - if ( delta < 64 + 16 ) - { - af_latin_align_serif_edge( hints, edge->serif, edge ); - FT_TRACE5(( " SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)" - " aligned to %.2f\n", - edge - edges, edge->opos / 64.0, - edge->serif - edges, edge->serif->opos / 64.0, - edge->pos / 64.0 )); - } - else if ( !anchor ) - { - edge->pos = FT_PIX_ROUND( edge->opos ); - anchor = edge; - FT_TRACE5(( " SERIF_ANCHOR: edge %d (opos=%.2f)" - " snapped to %.2f\n", - edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); - } - else - { - AF_Edge before, after; - - - for ( before = edge - 1; before >= edges; before-- ) - if ( before->flags & AF_EDGE_DONE ) - break; - - for ( after = edge + 1; after < edge_limit; after++ ) - if ( after->flags & AF_EDGE_DONE ) - break; - - if ( before >= edges && before < edge && - after < edge_limit && after > edge ) - { - if ( after->opos == before->opos ) - edge->pos = before->pos; - else - edge->pos = before->pos + - FT_MulDiv( edge->opos - before->opos, - after->pos - before->pos, - after->opos - before->opos ); - - FT_TRACE5(( " SERIF_LINK1: edge %d (opos=%.2f) snapped to %.2f" - " from %d (opos=%.2f)\n", - edge - edges, edge->opos / 64.0, - edge->pos / 64.0, - before - edges, before->opos / 64.0 )); - } - else - { - edge->pos = anchor->pos + - ( ( edge->opos - anchor->opos + 16 ) & ~31 ); - FT_TRACE5(( " SERIF_LINK2: edge %d (opos=%.2f)" - " snapped to %.2f\n", - edge - edges, edge->opos / 64.0, edge->pos / 64.0 )); - } - } - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - edge->flags |= AF_EDGE_DONE; - - if ( edge > edges && edge->pos < edge[-1].pos ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %d (pos=%.2f) moved to %.2f\n", - edge - edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); - - num_actions++; -#endif - edge->pos = edge[-1].pos; - } - - if ( edge + 1 < edge_limit && - edge[1].flags & AF_EDGE_DONE && - edge->pos > edge[1].pos ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %d (pos=%.2f) moved to %.2f\n", - edge - edges, edge->pos / 64.0, edge[1].pos / 64.0 )); - - num_actions++; -#endif - - edge->pos = edge[1].pos; - } - } - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !num_actions ) - FT_TRACE5(( " (none)\n" )); - FT_TRACE5(( "\n" )); -#endif - } - - - /* Apply the complete hinting algorithm to a latin glyph. */ - - static FT_Error - af_latin_hints_apply( AF_GlyphHints hints, - FT_Outline* outline, - AF_LatinMetrics metrics ) - { - FT_Error error; - int dim; - - AF_LatinAxis axis; - - - error = af_glyph_hints_reload( hints, outline ); - if ( error ) - goto Exit; - - /* analyze glyph outline */ -#ifdef AF_CONFIG_OPTION_USE_WARPER - if ( ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT && - AF_HINTS_DO_WARP( hints ) ) || - AF_HINTS_DO_HORIZONTAL( hints ) ) -#else - if ( AF_HINTS_DO_HORIZONTAL( hints ) ) -#endif - { - axis = &metrics->axis[AF_DIMENSION_HORZ]; - error = af_latin_hints_detect_features( hints, - axis->width_count, - axis->widths, - AF_DIMENSION_HORZ ); - if ( error ) - goto Exit; - } - - if ( AF_HINTS_DO_VERTICAL( hints ) ) - { - axis = &metrics->axis[AF_DIMENSION_VERT]; - error = af_latin_hints_detect_features( hints, - axis->width_count, - axis->widths, - AF_DIMENSION_VERT ); - if ( error ) - goto Exit; - - af_latin_hints_compute_blue_edges( hints, metrics ); - } - - /* grid-fit the outline */ - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { -#ifdef AF_CONFIG_OPTION_USE_WARPER - if ( dim == AF_DIMENSION_HORZ && - metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT && - AF_HINTS_DO_WARP( hints ) ) - { - AF_WarperRec warper; - FT_Fixed scale; - FT_Pos delta; - - - af_warper_compute( &warper, hints, (AF_Dimension)dim, - &scale, &delta ); - af_glyph_hints_scale_dim( hints, (AF_Dimension)dim, - scale, delta ); - continue; - } -#endif /* AF_CONFIG_OPTION_USE_WARPER */ - - if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || - ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) - { - af_latin_hint_edges( hints, (AF_Dimension)dim ); - af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); - } - } - - af_glyph_hints_save( hints, outline ); - - Exit: - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N S C R I P T C L A S S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_latin_writing_system_class, - - AF_WRITING_SYSTEM_LATIN, - - sizeof ( AF_LatinMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) af_latin_metrics_init, - (AF_WritingSystem_ScaleMetricsFunc)af_latin_metrics_scale, - (AF_WritingSystem_DoneMetricsFunc) NULL, - - (AF_WritingSystem_InitHintsFunc) af_latin_hints_init, - (AF_WritingSystem_ApplyHintsFunc) af_latin_hints_apply - ) - - -/* END */ diff --git a/3party/freetype/src/autofit/aflatin.h b/3party/freetype/src/autofit/aflatin.h deleted file mode 100644 index 6855492ca3..0000000000 --- a/3party/freetype/src/autofit/aflatin.h +++ /dev/null @@ -1,188 +0,0 @@ -/***************************************************************************/ -/* */ -/* aflatin.h */ -/* */ -/* Auto-fitter hinting routines for latin writing system */ -/* (specification). */ -/* */ -/* Copyright 2003-2015 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 __AFLATIN_H__ -#define __AFLATIN_H__ - -#include "afhints.h" - - -FT_BEGIN_HEADER - - /* the `latin' writing system */ - - AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin_writing_system_class ) - - - /* constants are given with units_per_em == 2048 in mind */ -#define AF_LATIN_CONSTANT( metrics, c ) \ - ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* - * The following declarations could be embedded in the file `aflatin.c'; - * they have been made semi-public to allow alternate writing system - * hinters to re-use some of them. - */ - - -#define AF_LATIN_IS_TOP_BLUE( b ) \ - ( (b)->properties & AF_BLUE_PROPERTY_LATIN_TOP ) -#define AF_LATIN_IS_NEUTRAL_BLUE( b ) \ - ( (b)->properties & AF_BLUE_PROPERTY_LATIN_NEUTRAL ) -#define AF_LATIN_IS_X_HEIGHT_BLUE( b ) \ - ( (b)->properties & AF_BLUE_PROPERTY_LATIN_X_HEIGHT ) -#define AF_LATIN_IS_LONG_BLUE( b ) \ - ( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG ) - -#define AF_LATIN_MAX_WIDTHS 16 - - -#define AF_LATIN_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */ -#define AF_LATIN_BLUE_TOP ( 1U << 1 ) /* we have a top blue zone */ -#define AF_LATIN_BLUE_NEUTRAL ( 1U << 2 ) /* we have neutral blue zone */ -#define AF_LATIN_BLUE_ADJUSTMENT ( 1U << 3 ) /* used for scale adjustment */ - /* optimization */ - - - typedef struct AF_LatinBlueRec_ - { - AF_WidthRec ref; - AF_WidthRec shoot; - FT_UInt flags; - - } AF_LatinBlueRec, *AF_LatinBlue; - - - typedef struct AF_LatinAxisRec_ - { - FT_Fixed scale; - FT_Pos delta; - - FT_UInt width_count; /* number of used widths */ - AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]; /* widths array */ - FT_Pos edge_distance_threshold; /* used for creating edges */ - FT_Pos standard_width; /* the default stem thickness */ - FT_Bool extra_light; /* is standard width very light? */ - - /* ignored for horizontal metrics */ - FT_UInt blue_count; - AF_LatinBlueRec blues[AF_BLUE_STRINGSET_MAX]; - - FT_Fixed org_scale; - FT_Pos org_delta; - - } AF_LatinAxisRec, *AF_LatinAxis; - - - typedef struct AF_LatinMetricsRec_ - { - AF_StyleMetricsRec root; - FT_UInt units_per_em; - AF_LatinAxisRec axis[AF_DIMENSION_MAX]; - - } AF_LatinMetricsRec, *AF_LatinMetrics; - - - FT_LOCAL( FT_Error ) - af_latin_metrics_init( AF_LatinMetrics metrics, - FT_Face face ); - - FT_LOCAL( void ) - af_latin_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ); - - FT_LOCAL( void ) - af_latin_metrics_init_widths( AF_LatinMetrics metrics, - FT_Face face ); - - FT_LOCAL( void ) - af_latin_metrics_check_digits( AF_LatinMetrics metrics, - FT_Face face ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H A N A L Y S I S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define AF_LATIN_HINTS_HORZ_SNAP ( 1U << 0 ) /* stem width snapping */ -#define AF_LATIN_HINTS_VERT_SNAP ( 1U << 1 ) /* stem height snapping */ -#define AF_LATIN_HINTS_STEM_ADJUST ( 1U << 2 ) /* stem width/height */ - /* adjustment */ -#define AF_LATIN_HINTS_MONO ( 1U << 3 ) /* monochrome rendering */ - - -#define AF_LATIN_HINTS_DO_HORZ_SNAP( h ) \ - AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP ) - -#define AF_LATIN_HINTS_DO_VERT_SNAP( h ) \ - AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP ) - -#define AF_LATIN_HINTS_DO_STEM_ADJUST( h ) \ - AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST ) - -#define AF_LATIN_HINTS_DO_MONO( h ) \ - AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO ) - - - /* - * The next functions shouldn't normally be exported. However, other - * writing systems might like to use these functions as-is. - */ - FT_LOCAL( FT_Error ) - af_latin_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( void ) - af_latin_hints_link_segments( AF_GlyphHints hints, - FT_UInt width_count, - AF_WidthRec* widths, - AF_Dimension dim ); - - FT_LOCAL( FT_Error ) - af_latin_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( FT_Error ) - af_latin_hints_detect_features( AF_GlyphHints hints, - FT_UInt width_count, - AF_WidthRec* widths, - AF_Dimension dim ); - -/* */ - -FT_END_HEADER - -#endif /* __AFLATIN_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/aflatin2.c b/3party/freetype/src/autofit/aflatin2.c deleted file mode 100644 index ac9f933258..0000000000 --- a/3party/freetype/src/autofit/aflatin2.c +++ /dev/null @@ -1,2398 +0,0 @@ -/***************************************************************************/ -/* */ -/* aflatin2.c */ -/* */ -/* Auto-fitter hinting routines for latin writing system (body). */ -/* */ -/* Copyright 2003-2015 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 FT_ADVANCES_H - -#include "afglobal.h" -#include "aflatin.h" -#include "aflatin2.h" -#include "aferrors.h" - - -#ifdef AF_CONFIG_OPTION_USE_WARPER -#include "afwarp.h" -#endif - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_aflatin2 - - - FT_LOCAL_DEF( FT_Error ) - af_latin2_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL_DEF( void ) - af_latin2_hints_link_segments( AF_GlyphHints hints, - AF_Dimension dim ); - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - af_latin2_metrics_init_widths( AF_LatinMetrics metrics, - FT_Face face ) - { - /* scan the array of segments in each direction */ - AF_GlyphHintsRec hints[1]; - - - af_glyph_hints_init( hints, face->memory ); - - metrics->axis[AF_DIMENSION_HORZ].width_count = 0; - metrics->axis[AF_DIMENSION_VERT].width_count = 0; - - { - FT_Error error; - FT_UInt glyph_index; - int dim; - AF_LatinMetricsRec dummy[1]; - AF_Scaler scaler = &dummy->root.scaler; - - - glyph_index = FT_Get_Char_Index( - face, - metrics->root.style_class->standard_char ); - if ( glyph_index == 0 ) - goto Exit; - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || face->glyph->outline.n_points <= 0 ) - goto Exit; - - FT_ZERO( dummy ); - - dummy->units_per_em = metrics->units_per_em; - scaler->x_scale = scaler->y_scale = 0x10000L; - scaler->x_delta = scaler->y_delta = 0; - scaler->face = face; - scaler->render_mode = FT_RENDER_MODE_NORMAL; - scaler->flags = 0; - - af_glyph_hints_rescale( hints, (AF_StyleMetrics)dummy ); - - error = af_glyph_hints_reload( hints, &face->glyph->outline ); - if ( error ) - goto Exit; - - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_LatinAxis axis = &metrics->axis[dim]; - AF_AxisHints axhints = &hints->axis[dim]; - AF_Segment seg, limit, link; - FT_UInt num_widths = 0; - - - error = af_latin2_hints_compute_segments( hints, - (AF_Dimension)dim ); - if ( error ) - goto Exit; - - af_latin2_hints_link_segments( hints, - (AF_Dimension)dim ); - - seg = axhints->segments; - limit = seg + axhints->num_segments; - - for ( ; seg < limit; seg++ ) - { - link = seg->link; - - /* we only consider stem segments there! */ - if ( link && link->link == seg && link > seg ) - { - FT_Pos dist; - - - dist = seg->pos - link->pos; - if ( dist < 0 ) - dist = -dist; - - if ( num_widths < AF_LATIN_MAX_WIDTHS ) - axis->widths[num_widths++].org = dist; - } - } - - af_sort_widths( num_widths, axis->widths ); - axis->width_count = num_widths; - } - - Exit: - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_LatinAxis axis = &metrics->axis[dim]; - FT_Pos stdw; - - - stdw = ( axis->width_count > 0 ) - ? axis->widths[0].org - : AF_LATIN_CONSTANT( metrics, 50 ); - - /* let's try 20% of the smallest width */ - axis->edge_distance_threshold = stdw / 5; - axis->standard_width = stdw; - axis->extra_light = 0; - } - } - - af_glyph_hints_done( hints ); - } - - - -#define AF_LATIN_MAX_TEST_CHARACTERS 12 - - - static const char af_latin2_blue_chars[AF_LATIN_MAX_BLUES] - [AF_LATIN_MAX_TEST_CHARACTERS+1] = - { - "THEZOCQS", - "HEZLOCUS", - "fijkdbh", - "xzroesc", - "xzroesc", - "pqgjy" - }; - - - static void - af_latin2_metrics_init_blues( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_Pos flats [AF_LATIN_MAX_TEST_CHARACTERS]; - FT_Pos rounds[AF_LATIN_MAX_TEST_CHARACTERS]; - FT_Int num_flats; - FT_Int num_rounds; - FT_Int bb; - AF_LatinBlue blue; - FT_Error error; - AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; - FT_GlyphSlot glyph = face->glyph; - - - /* we compute the blues simply by loading each character from the */ - /* 'af_latin2_blue_chars[blues]' string, then compute its top-most or */ - /* bottom-most points (depending on `AF_IS_TOP_BLUE') */ - - FT_TRACE5(( "blue zones computation\n" - "======================\n\n" )); - - for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) - { - const char* p = af_latin2_blue_chars[bb]; - const char* limit = p + AF_LATIN_MAX_TEST_CHARACTERS; - FT_Pos* blue_ref; - FT_Pos* blue_shoot; - - - FT_TRACE5(( "blue zone %d:\n", bb )); - - num_flats = 0; - num_rounds = 0; - - for ( ; p < limit && *p; p++ ) - { - FT_UInt glyph_index; - FT_Int best_point, best_y, best_first, best_last; - FT_Vector* points; - FT_Bool round; - - - /* load the character in the face -- skip unknown or empty ones */ - glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p ); - if ( glyph_index == 0 ) - continue; - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || glyph->outline.n_points <= 0 ) - continue; - - /* now compute min or max point indices and coordinates */ - points = glyph->outline.points; - best_point = -1; - best_y = 0; /* make compiler happy */ - best_first = 0; /* ditto */ - best_last = 0; /* ditto */ - - { - FT_Int nn; - FT_Int first = 0; - FT_Int last = -1; - - - for ( nn = 0; nn < glyph->outline.n_contours; first = last+1, nn++ ) - { - FT_Int old_best_point = best_point; - FT_Int pp; - - - last = glyph->outline.contours[nn]; - - /* Avoid single-point contours since they are never rasterized. */ - /* In some fonts, they correspond to mark attachment points */ - /* which are way outside of the glyph's real outline. */ - if ( last == first ) - continue; - - if ( AF_LATIN_IS_TOP_BLUE( bb ) ) - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y > best_y ) - { - best_point = pp; - best_y = points[pp].y; - } - } - else - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y < best_y ) - { - best_point = pp; - best_y = points[pp].y; - } - } - - if ( best_point != old_best_point ) - { - best_first = first; - best_last = last; - } - } - FT_TRACE5(( " %c %d", *p, best_y )); - } - - /* now check whether the point belongs to a straight or round */ - /* segment; we first need to find in which contour the extremum */ - /* lies, then inspect its previous and next points */ - { - FT_Pos best_x = points[best_point].x; - FT_Int start, end, prev, next; - FT_Pos dist; - - - /* now look for the previous and next points that are not on the */ - /* same Y coordinate. Threshold the `closeness'... */ - start = end = best_point; - - do - { - prev = start - 1; - if ( prev < best_first ) - prev = best_last; - - dist = FT_ABS( points[prev].y - best_y ); - /* accept a small distance or a small angle (both values are */ - /* heuristic; value 20 corresponds to approx. 2.9 degrees) */ - if ( dist > 5 ) - if ( FT_ABS( points[prev].x - best_x ) <= 20 * dist ) - break; - - start = prev; - - } while ( start != best_point ); - - do - { - next = end + 1; - if ( next > best_last ) - next = best_first; - - dist = FT_ABS( points[next].y - best_y ); - if ( dist > 5 ) - if ( FT_ABS( points[next].x - best_x ) <= 20 * dist ) - break; - - end = next; - - } while ( end != best_point ); - - /* now, set the `round' flag depending on the segment's kind */ - round = FT_BOOL( - FT_CURVE_TAG( glyph->outline.tags[start] ) != FT_CURVE_TAG_ON || - FT_CURVE_TAG( glyph->outline.tags[ end ] ) != FT_CURVE_TAG_ON ); - - FT_TRACE5(( " (%s)\n", round ? "round" : "flat" )); - } - - if ( round ) - rounds[num_rounds++] = best_y; - else - flats[num_flats++] = best_y; - } - - if ( num_flats == 0 && num_rounds == 0 ) - { - /* - * we couldn't find a single glyph to compute this blue zone, - * we will simply ignore it then - */ - FT_TRACE5(( " empty\n" )); - continue; - } - - /* we have computed the contents of the `rounds' and `flats' tables, */ - /* now determine the reference and overshoot position of the blue -- */ - /* we simply take the median value after a simple sort */ - af_sort_pos( num_rounds, rounds ); - af_sort_pos( num_flats, flats ); - - blue = & axis->blues[axis->blue_count]; - blue_ref = & blue->ref.org; - blue_shoot = & blue->shoot.org; - - axis->blue_count++; - - if ( num_flats == 0 ) - { - *blue_ref = - *blue_shoot = rounds[num_rounds / 2]; - } - else if ( num_rounds == 0 ) - { - *blue_ref = - *blue_shoot = flats[num_flats / 2]; - } - else - { - *blue_ref = flats[num_flats / 2]; - *blue_shoot = rounds[num_rounds / 2]; - } - - /* there are sometimes problems: if the overshoot position of top */ - /* zones is under its reference position, or the opposite for bottom */ - /* zones. We must thus check everything there and correct the errors */ - if ( *blue_shoot != *blue_ref ) - { - FT_Pos ref = *blue_ref; - FT_Pos shoot = *blue_shoot; - FT_Bool over_ref = FT_BOOL( shoot > ref ); - - - if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref ) - { - *blue_ref = - *blue_shoot = ( shoot + ref ) / 2; - - FT_TRACE5(( " [overshoot smaller than reference," - " taking mean value]\n" )); - } - } - - blue->flags = 0; - if ( AF_LATIN_IS_TOP_BLUE( bb ) ) - blue->flags |= AF_LATIN_BLUE_TOP; - - /* - * The following flag is used later to adjust the y and x scales - * in order to optimize the pixel grid alignment of the top of small - * letters. - */ - if ( AF_LATIN_IS_X_HEIGHT_BLUE( bb ) ) - blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; - - FT_TRACE5(( " -> reference = %ld\n" - " overshoot = %ld\n", - *blue_ref, *blue_shoot )); - } - - return; - } - - - FT_LOCAL_DEF( void ) - af_latin2_metrics_check_digits( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_UInt i; - FT_Bool started = 0, same_width = 1; - FT_Fixed advance, old_advance = 0; - - - /* check whether all ASCII digits have the same advance width; */ - /* digit `0' is 0x30 in all supported charmaps */ - for ( i = 0x30; i <= 0x39; i++ ) - { - FT_UInt glyph_index; - - - glyph_index = FT_Get_Char_Index( face, i ); - if ( glyph_index == 0 ) - continue; - - if ( FT_Get_Advance( face, glyph_index, - FT_LOAD_NO_SCALE | - FT_LOAD_NO_HINTING | - FT_LOAD_IGNORE_TRANSFORM, - &advance ) ) - continue; - - if ( started ) - { - if ( advance != old_advance ) - { - same_width = 0; - break; - } - } - else - { - old_advance = advance; - started = 1; - } - } - - metrics->root.digits_have_same_width = same_width; - } - - - FT_LOCAL_DEF( FT_Error ) - af_latin2_metrics_init( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_Error error = FT_Err_Ok; - FT_CharMap oldmap = face->charmap; - FT_UInt ee; - - static const FT_Encoding latin_encodings[] = - { - FT_ENCODING_UNICODE, - FT_ENCODING_APPLE_ROMAN, - FT_ENCODING_ADOBE_STANDARD, - FT_ENCODING_ADOBE_LATIN_1, - FT_ENCODING_NONE /* end of list */ - }; - - - metrics->units_per_em = face->units_per_EM; - - /* do we have a latin charmap in there? */ - for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ ) - { - error = FT_Select_Charmap( face, latin_encodings[ee] ); - if ( !error ) - break; - } - - if ( !error ) - { - af_latin2_metrics_init_widths( metrics, face ); - af_latin2_metrics_init_blues( metrics, face ); - af_latin2_metrics_check_digits( metrics, face ); - } - - FT_Set_Charmap( face, oldmap ); - return FT_Err_Ok; - } - - - static void - af_latin2_metrics_scale_dim( AF_LatinMetrics metrics, - AF_Scaler scaler, - AF_Dimension dim ) - { - FT_Fixed scale; - FT_Pos delta; - AF_LatinAxis axis; - FT_UInt nn; - - - if ( dim == AF_DIMENSION_HORZ ) - { - scale = scaler->x_scale; - delta = scaler->x_delta; - } - else - { - scale = scaler->y_scale; - delta = scaler->y_delta; - } - - axis = &metrics->axis[dim]; - - if ( axis->org_scale == scale && axis->org_delta == delta ) - return; - - axis->org_scale = scale; - axis->org_delta = delta; - - /* - * correct Y scale to optimize the alignment of the top of small - * letters to the pixel grid - */ - if ( dim == AF_DIMENSION_VERT ) - { - AF_LatinAxis vaxis = &metrics->axis[AF_DIMENSION_VERT]; - AF_LatinBlue blue = NULL; - - - for ( nn = 0; nn < vaxis->blue_count; nn++ ) - { - if ( vaxis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) - { - blue = &vaxis->blues[nn]; - break; - } - } - - if ( blue ) - { - FT_Pos scaled; - FT_Pos threshold; - FT_Pos fitted; - FT_UInt limit; - FT_UInt ppem; - - - scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); - ppem = metrics->root.scaler.face->size->metrics.x_ppem; - limit = metrics->root.globals->increase_x_height; - threshold = 40; - - /* if the `increase-x-height' property is active, */ - /* we round up much more often */ - if ( limit && - ppem <= limit && - ppem >= AF_PROP_INCREASE_X_HEIGHT_MIN ) - threshold = 52; - - fitted = ( scaled + threshold ) & ~63; - -#if 1 - if ( scaled != fitted ) - { - scale = FT_MulDiv( scale, fitted, scaled ); - FT_TRACE5(( "== scaled x-top = %.2g" - " fitted = %.2g, scaling = %.4g\n", - scaled / 64.0, fitted / 64.0, - ( fitted * 1.0 ) / scaled )); - } -#endif - } - } - - axis->scale = scale; - axis->delta = delta; - - if ( dim == AF_DIMENSION_HORZ ) - { - metrics->root.scaler.x_scale = scale; - metrics->root.scaler.x_delta = delta; - } - else - { - metrics->root.scaler.y_scale = scale; - metrics->root.scaler.y_delta = delta; - } - - /* scale the standard widths */ - for ( nn = 0; nn < axis->width_count; nn++ ) - { - AF_Width width = axis->widths + nn; - - - width->cur = FT_MulFix( width->org, scale ); - width->fit = width->cur; - } - - /* an extra-light axis corresponds to a standard width that is */ - /* smaller than 5/8 pixels */ - axis->extra_light = - (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); - - if ( dim == AF_DIMENSION_VERT ) - { - /* scale the blue zones */ - for ( nn = 0; nn < axis->blue_count; nn++ ) - { - AF_LatinBlue blue = &axis->blues[nn]; - FT_Pos dist; - - - blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; - blue->ref.fit = blue->ref.cur; - blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; - blue->shoot.fit = blue->shoot.cur; - blue->flags &= ~AF_LATIN_BLUE_ACTIVE; - - /* a blue zone is only active if it is less than 3/4 pixels tall */ - dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); - if ( dist <= 48 && dist >= -48 ) - { - FT_Pos delta1, delta2; - - delta1 = blue->shoot.org - blue->ref.org; - delta2 = delta1; - if ( delta1 < 0 ) - delta2 = -delta2; - - delta2 = FT_MulFix( delta2, scale ); - - if ( delta2 < 32 ) - delta2 = 0; - else if ( delta2 < 64 ) - delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); - else - delta2 = FT_PIX_ROUND( delta2 ); - - if ( delta1 < 0 ) - delta2 = -delta2; - - blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); - blue->shoot.fit = blue->ref.fit + delta2; - - FT_TRACE5(( ">> activating blue zone %d:" - " ref.cur=%.2g ref.fit=%.2g" - " shoot.cur=%.2g shoot.fit=%.2g\n", - nn, blue->ref.cur / 64.0, blue->ref.fit / 64.0, - blue->shoot.cur / 64.0, blue->shoot.fit / 64.0 )); - - blue->flags |= AF_LATIN_BLUE_ACTIVE; - } - } - } - } - - - FT_LOCAL_DEF( void ) - af_latin2_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ) - { - metrics->root.scaler.render_mode = scaler->render_mode; - metrics->root.scaler.face = scaler->face; - metrics->root.scaler.flags = scaler->flags; - - af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); - af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H A N A L Y S I S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define SORT_SEGMENTS - - FT_LOCAL_DEF( FT_Error ) - af_latin2_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - FT_Memory memory = hints->memory; - FT_Error error = FT_Err_Ok; - AF_Segment segment = NULL; - AF_SegmentRec seg0; - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - AF_Direction major_dir, segment_dir; - - - FT_ZERO( &seg0 ); - seg0.score = 32000; - seg0.flags = AF_EDGE_NORMAL; - - major_dir = (AF_Direction)FT_ABS( axis->major_dir ); - segment_dir = major_dir; - - axis->num_segments = 0; - - /* set up (u,v) in each point */ - if ( dim == AF_DIMENSION_HORZ ) - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - - for ( ; point < limit; point++ ) - { - point->u = point->fx; - point->v = point->fy; - } - } - else - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - - for ( ; point < limit; point++ ) - { - point->u = point->fy; - point->v = point->fx; - } - } - - /* do each contour separately */ - for ( ; contour < contour_limit; contour++ ) - { - AF_Point point = contour[0]; - AF_Point start = point; - AF_Point last = point->prev; - - - if ( point == last ) /* skip singletons -- just in case */ - continue; - - /* already on an edge ?, backtrack to find its start */ - if ( FT_ABS( point->in_dir ) == major_dir ) - { - point = point->prev; - - while ( point->in_dir == start->in_dir ) - point = point->prev; - } - else /* otherwise, find first segment start, if any */ - { - while ( FT_ABS( point->out_dir ) != major_dir ) - { - point = point->next; - - if ( point == start ) - goto NextContour; - } - } - - start = point; - - for (;;) - { - AF_Point first; - FT_Pos min_u, min_v, max_u, max_v; - - /* we're at the start of a new segment */ - FT_ASSERT( FT_ABS( point->out_dir ) == major_dir && - point->in_dir != point->out_dir ); - first = point; - - min_u = max_u = point->u; - min_v = max_v = point->v; - - point = point->next; - - while ( point->out_dir == first->out_dir ) - { - point = point->next; - - if ( point->u < min_u ) - min_u = point->u; - - if ( point->u > max_u ) - max_u = point->u; - } - - if ( point->v < min_v ) - min_v = point->v; - - if ( point->v > max_v ) - max_v = point->v; - - /* record new segment */ - error = af_axis_hints_new_segment( axis, memory, &segment ); - if ( error ) - goto Exit; - - segment[0] = seg0; - segment->dir = first->out_dir; - segment->first = first; - segment->last = point; - segment->pos = (FT_Short)( ( min_u + max_u ) >> 1 ); - segment->min_coord = (FT_Short) min_v; - segment->max_coord = (FT_Short) max_v; - segment->height = (FT_Short)( max_v - min_v ); - - /* a segment is round if it doesn't have successive */ - /* on-curve points. */ - { - AF_Point pt = first; - AF_Point last = point; - FT_UInt f0 = pt->flags & AF_FLAG_CONTROL; - FT_UInt f1; - - - segment->flags &= ~AF_EDGE_ROUND; - - for ( ; pt != last; f0 = f1 ) - { - pt = pt->next; - f1 = pt->flags & AF_FLAG_CONTROL; - - if ( !f0 && !f1 ) - break; - - if ( pt == last ) - segment->flags |= AF_EDGE_ROUND; - } - } - - /* this can happen in the case of a degenerate contour - * e.g. a 2-point vertical contour - */ - if ( point == start ) - break; - - /* jump to the start of the next segment, if any */ - while ( FT_ABS( point->out_dir ) != major_dir ) - { - point = point->next; - - if ( point == start ) - goto NextContour; - } - } - - NextContour: - ; - } /* contours */ - - /* now slightly increase the height of segments when this makes */ - /* sense -- this is used to better detect and ignore serifs */ - { - AF_Segment segments = axis->segments; - AF_Segment segments_end = segments + axis->num_segments; - - - for ( segment = segments; segment < segments_end; segment++ ) - { - AF_Point first = segment->first; - AF_Point last = segment->last; - AF_Point p; - FT_Pos first_v = first->v; - FT_Pos last_v = last->v; - - - if ( first_v < last_v ) - { - p = first->prev; - if ( p->v < first_v ) - segment->height = (FT_Short)( segment->height + - ( ( first_v - p->v ) >> 1 ) ); - - p = last->next; - if ( p->v > last_v ) - segment->height = (FT_Short)( segment->height + - ( ( p->v - last_v ) >> 1 ) ); - } - else - { - p = first->prev; - if ( p->v > first_v ) - segment->height = (FT_Short)( segment->height + - ( ( p->v - first_v ) >> 1 ) ); - - p = last->next; - if ( p->v < last_v ) - segment->height = (FT_Short)( segment->height + - ( ( last_v - p->v ) >> 1 ) ); - } - } - } - -#ifdef AF_SORT_SEGMENTS - /* place all segments with a negative direction to the start - * of the array, used to speed up segment linking later... - */ - { - AF_Segment segments = axis->segments; - FT_UInt count = axis->num_segments; - FT_UInt ii, jj; - - for ( ii = 0; ii < count; ii++ ) - { - if ( segments[ii].dir > 0 ) - { - for ( jj = ii + 1; jj < count; jj++ ) - { - if ( segments[jj].dir < 0 ) - { - AF_SegmentRec tmp; - - - tmp = segments[ii]; - segments[ii] = segments[jj]; - segments[jj] = tmp; - - break; - } - } - - if ( jj == count ) - break; - } - } - axis->mid_segments = ii; - } -#endif - - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - af_latin2_hints_link_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; -#ifdef AF_SORT_SEGMENTS - AF_Segment segment_mid = segments + axis->mid_segments; -#endif - FT_Pos len_threshold, len_score; - AF_Segment seg1, seg2; - - - len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); - if ( len_threshold == 0 ) - len_threshold = 1; - - len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); - -#ifdef AF_SORT_SEGMENTS - for ( seg1 = segments; seg1 < segment_mid; seg1++ ) - { - if ( seg1->dir != axis->major_dir ) - continue; - - for ( seg2 = segment_mid; seg2 < segment_limit; seg2++ ) -#else - /* now compare each segment to the others */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - if ( seg1->dir != axis->major_dir ) - continue; - - for ( seg2 = segments; seg2 < segment_limit; seg2++ ) - if ( seg1->dir + seg2->dir == 0 && seg2->pos > seg1->pos ) -#endif - { - FT_Pos pos1 = seg1->pos; - FT_Pos pos2 = seg2->pos; - FT_Pos dist = pos2 - pos1; - - - if ( dist < 0 ) - continue; - - { - FT_Pos min = seg1->min_coord; - FT_Pos max = seg1->max_coord; - FT_Pos len, score; - - - if ( min < seg2->min_coord ) - min = seg2->min_coord; - - if ( max > seg2->max_coord ) - max = seg2->max_coord; - - len = max - min; - if ( len >= len_threshold ) - { - score = dist + len_score / len; - if ( score < seg1->score ) - { - seg1->score = score; - seg1->link = seg2; - } - - if ( score < seg2->score ) - { - seg2->score = score; - seg2->link = seg1; - } - } - } - } - } -#if 0 - } -#endif - - /* now, compute the `serif' segments */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - seg2 = seg1->link; - - if ( seg2 ) - { - if ( seg2->link != seg1 ) - { - seg1->link = NULL; - seg1->serif = seg2->link; - } - } - } - } - - - FT_LOCAL_DEF( FT_Error ) - af_latin2_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - FT_Error error = FT_Err_Ok; - FT_Memory memory = hints->memory; - AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; - - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Segment seg; - - AF_Direction up_dir; - FT_Fixed scale; - FT_Pos edge_distance_threshold; - FT_Pos segment_length_threshold; - - - axis->num_edges = 0; - - scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale - : hints->y_scale; - - up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP - : AF_DIR_RIGHT; - - /* - * We want to ignore very small (mostly serif) segments, we do that - * by ignoring those that whose length is less than a given fraction - * of the standard width. If there is no standard width, we ignore - * those that are less than a given size in pixels - * - * also, unlink serif segments that are linked to segments farther - * than 50% of the standard width - */ - if ( dim == AF_DIMENSION_HORZ ) - { - if ( laxis->width_count > 0 ) - segment_length_threshold = ( laxis->standard_width * 10 ) >> 4; - else - segment_length_threshold = FT_DivFix( 64, hints->y_scale ); - } - else - segment_length_threshold = 0; - - /*********************************************************************/ - /* */ - /* We will begin by generating a sorted table of edges for the */ - /* current direction. To do so, we simply scan each segment and try */ - /* to find an edge in our table that corresponds to its position. */ - /* */ - /* If no edge is found, we create and insert a new edge in the */ - /* sorted table. Otherwise, we simply add the segment to the edge's */ - /* list which will be processed in the second step to compute the */ - /* edge's properties. */ - /* */ - /* Note that the edges table is sorted along the segment/edge */ - /* position. */ - /* */ - /*********************************************************************/ - - edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, - scale ); - if ( edge_distance_threshold > 64 / 4 ) - edge_distance_threshold = 64 / 4; - - edge_distance_threshold = FT_DivFix( edge_distance_threshold, - scale ); - - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge found = NULL; - FT_Int ee; - - - if ( seg->height < segment_length_threshold ) - continue; - - /* A special case for serif edges: If they are smaller than */ - /* 1.5 pixels we ignore them. */ - if ( seg->serif ) - { - FT_Pos dist = seg->serif->pos - seg->pos; - - - if ( dist < 0 ) - dist = -dist; - - if ( dist >= laxis->standard_width >> 1 ) - { - /* unlink this serif, it is too distant from its reference stem */ - seg->serif = NULL; - } - else if ( 2*seg->height < 3 * segment_length_threshold ) - continue; - } - - /* look for an edge corresponding to the segment */ - for ( ee = 0; ee < axis->num_edges; ee++ ) - { - AF_Edge edge = axis->edges + ee; - FT_Pos dist; - - - dist = seg->pos - edge->fpos; - if ( dist < 0 ) - dist = -dist; - - if ( dist < edge_distance_threshold && edge->dir == seg->dir ) - { - found = edge; - break; - } - } - - if ( !found ) - { - AF_Edge edge; - - - /* insert a new edge in the list and */ - /* sort according to the position */ - error = af_axis_hints_new_edge( axis, seg->pos, seg->dir, - memory, &edge ); - if ( error ) - goto Exit; - - /* add the segment to the new edge's list */ - FT_ZERO( edge ); - - edge->first = seg; - edge->last = seg; - edge->dir = seg->dir; - edge->fpos = seg->pos; - edge->opos = FT_MulFix( seg->pos, scale ); - edge->pos = edge->opos; - seg->edge_next = seg; - } - else - { - /* if an edge was found, simply add the segment to the edge's */ - /* list */ - seg->edge_next = found->first; - found->last->edge_next = seg; - found->last = seg; - } - } - - - /*********************************************************************/ - /* */ - /* Good, we will now compute each edge's properties according to */ - /* segments found on its position. Basically, these are: */ - /* */ - /* - edge's main direction */ - /* - stem edge, serif edge or both (which defaults to stem then) */ - /* - rounded edge, straight or both (which defaults to straight) */ - /* - link for edge */ - /* */ - /*********************************************************************/ - - /* first of all, set the `edge' field in each segment -- this is */ - /* required in order to compute edge links */ - - /* - * Note that removing this loop and setting the `edge' field of each - * segment directly in the code above slows down execution speed for - * some reasons on platforms like the Sun. - */ - { - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - - - for ( edge = edges; edge < edge_limit; edge++ ) - { - seg = edge->first; - if ( seg ) - do - { - seg->edge = edge; - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - - /* now, compute each edge properties */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Int is_round = 0; /* does it contain round segments? */ - FT_Int is_straight = 0; /* does it contain straight segments? */ -#if 0 - FT_Pos ups = 0; /* number of upwards segments */ - FT_Pos downs = 0; /* number of downwards segments */ -#endif - - - seg = edge->first; - - do - { - FT_Bool is_serif; - - - /* check for roundness of segment */ - if ( seg->flags & AF_EDGE_ROUND ) - is_round++; - else - is_straight++; - -#if 0 - /* check for segment direction */ - if ( seg->dir == up_dir ) - ups += seg->max_coord-seg->min_coord; - else - downs += seg->max_coord-seg->min_coord; -#endif - - /* check for links -- if seg->serif is set, then seg->link must */ - /* be ignored */ - is_serif = (FT_Bool)( seg->serif && - seg->serif->edge && - seg->serif->edge != edge ); - - if ( ( seg->link && seg->link->edge != NULL ) || is_serif ) - { - AF_Edge edge2; - AF_Segment seg2; - - - edge2 = edge->link; - seg2 = seg->link; - - if ( is_serif ) - { - seg2 = seg->serif; - edge2 = edge->serif; - } - - if ( edge2 ) - { - FT_Pos edge_delta; - FT_Pos seg_delta; - - - edge_delta = edge->fpos - edge2->fpos; - if ( edge_delta < 0 ) - edge_delta = -edge_delta; - - seg_delta = seg->pos - seg2->pos; - if ( seg_delta < 0 ) - seg_delta = -seg_delta; - - if ( seg_delta < edge_delta ) - edge2 = seg2->edge; - } - else - edge2 = seg2->edge; - - if ( is_serif ) - { - edge->serif = edge2; - edge2->flags |= AF_EDGE_SERIF; - } - else - edge->link = edge2; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - - /* set the round/straight flags */ - edge->flags = AF_EDGE_NORMAL; - - if ( is_round > 0 && is_round >= is_straight ) - edge->flags |= AF_EDGE_ROUND; - -#if 0 - /* set the edge's main direction */ - edge->dir = AF_DIR_NONE; - - if ( ups > downs ) - edge->dir = (FT_Char)up_dir; - - else if ( ups < downs ) - edge->dir = (FT_Char)-up_dir; - - else if ( ups == downs ) - edge->dir = 0; /* both up and down! */ -#endif - - /* gets rid of serifs if link is set */ - /* XXX: This gets rid of many unpleasant artefacts! */ - /* Example: the `c' in cour.pfa at size 13 */ - - if ( edge->serif && edge->link ) - edge->serif = NULL; - } - } - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - af_latin2_hints_detect_features( AF_GlyphHints hints, - AF_Dimension dim ) - { - FT_Error error; - - - error = af_latin2_hints_compute_segments( hints, dim ); - if ( !error ) - { - af_latin2_hints_link_segments( hints, dim ); - - error = af_latin2_hints_compute_edges( hints, dim ); - } - return error; - } - - - static void - af_latin2_hints_compute_blue_edges( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - AF_AxisHints axis = &hints->axis[AF_DIMENSION_VERT]; - AF_Edge edge = axis->edges; - AF_Edge edge_limit = edge + axis->num_edges; - AF_LatinAxis latin = &metrics->axis[AF_DIMENSION_VERT]; - FT_Fixed scale = latin->scale; - FT_Pos best_dist0; /* initial threshold */ - - - /* compute the initial threshold as a fraction of the EM size */ - best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale ); - - if ( best_dist0 > 64 / 2 ) - best_dist0 = 64 / 2; - - /* compute which blue zones are active, i.e. have their scaled */ - /* size < 3/4 pixels */ - - /* for each horizontal edge search the blue zone which is closest */ - for ( ; edge < edge_limit; edge++ ) - { - FT_Int bb; - AF_Width best_blue = NULL; - FT_Pos best_dist = best_dist0; - - for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) - { - AF_LatinBlue blue = latin->blues + bb; - FT_Bool is_top_blue, is_major_dir; - - - /* skip inactive blue zones (i.e., those that are too small) */ - if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) - continue; - - /* if it is a top zone, check for right edges -- if it is a bottom */ - /* zone, check for left edges */ - /* */ - /* of course, that's for TrueType */ - is_top_blue = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 ); - is_major_dir = FT_BOOL( edge->dir == axis->major_dir ); - - /* if it is a top zone, the edge must be against the major */ - /* direction; if it is a bottom zone, it must be in the major */ - /* direction */ - if ( is_top_blue ^ is_major_dir ) - { - FT_Pos dist; - AF_Width compare; - - - /* if it's a rounded edge, compare it to the overshoot position */ - /* if it's a flat edge, compare it to the reference position */ - if ( edge->flags & AF_EDGE_ROUND ) - compare = &blue->shoot; - else - compare = &blue->ref; - - dist = edge->fpos - compare->org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = compare; - } - -#if 0 - /* now, compare it to the overshoot position if the edge is */ - /* rounded, and if the edge is over the reference position of a */ - /* top zone, or under the reference position of a bottom zone */ - if ( edge->flags & AF_EDGE_ROUND && dist != 0 ) - { - FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); - - - if ( is_top_blue ^ is_under_ref ) - { - blue = latin->blues + bb; - dist = edge->fpos - blue->shoot.org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = & blue->shoot; - } - } - } -#endif - } - } - - if ( best_blue ) - edge->blue_edge = best_blue; - } - } - - - static FT_Error - af_latin2_hints_init( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - FT_Render_Mode mode; - FT_UInt32 scaler_flags, other_flags; - FT_Face face = metrics->root.scaler.face; - - - af_glyph_hints_rescale( hints, (AF_StyleMetrics)metrics ); - - /* - * correct x_scale and y_scale if needed, since they may have - * been modified `af_latin2_metrics_scale_dim' above - */ - hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; - hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; - hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; - hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; - - /* compute flags depending on render mode, etc. */ - mode = metrics->root.scaler.render_mode; - -#if 0 /* #ifdef AF_CONFIG_OPTION_USE_WARPER */ - if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) - metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; -#endif - - scaler_flags = hints->scaler_flags; - other_flags = 0; - - /* - * We snap the width of vertical stems for the monochrome and - * horizontal LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) - other_flags |= AF_LATIN_HINTS_HORZ_SNAP; - - /* - * We snap the width of horizontal stems for the monochrome and - * vertical LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) - other_flags |= AF_LATIN_HINTS_VERT_SNAP; - - /* - * We adjust stems to full pixels only if we don't use the `light' mode. - */ - if ( mode != FT_RENDER_MODE_LIGHT ) - other_flags |= AF_LATIN_HINTS_STEM_ADJUST; - - if ( mode == FT_RENDER_MODE_MONO ) - other_flags |= AF_LATIN_HINTS_MONO; - - /* - * In `light' hinting mode we disable horizontal hinting completely. - * We also do it if the face is italic. - */ - if ( mode == FT_RENDER_MODE_LIGHT || - ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 ) - scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; - -#ifdef AF_CONFIG_OPTION_USE_WARPER - /* get (global) warper flag */ - if ( !metrics->root.globals->module->warping ) - scaler_flags |= AF_SCALER_FLAG_NO_WARPER; -#endif - - hints->scaler_flags = scaler_flags; - hints->other_flags = other_flags; - - return 0; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* snap a given width in scaled coordinates to one of the */ - /* current standard widths */ - - static FT_Pos - af_latin2_snap_width( AF_Width widths, - FT_UInt count, - FT_Pos width ) - { - FT_UInt n; - FT_Pos best = 64 + 32 + 2; - FT_Pos reference = width; - FT_Pos scaled; - - - for ( n = 0; n < count; n++ ) - { - FT_Pos w; - FT_Pos dist; - - - w = widths[n].cur; - dist = width - w; - if ( dist < 0 ) - dist = -dist; - if ( dist < best ) - { - best = dist; - reference = w; - } - } - - scaled = FT_PIX_ROUND( reference ); - - if ( width >= reference ) - { - if ( width < scaled + 48 ) - width = reference; - } - else - { - if ( width > scaled - 48 ) - width = reference; - } - - return width; - } - - - /* compute the snapped width of a given stem */ - - static FT_Pos - af_latin2_compute_stem_width( AF_GlyphHints hints, - AF_Dimension dim, - FT_Pos width, - FT_UInt base_flags, - FT_UInt stem_flags ) - { - AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; - AF_LatinAxis axis = & metrics->axis[dim]; - FT_Pos dist = width; - FT_Int sign = 0; - FT_Int vertical = ( dim == AF_DIMENSION_VERT ); - - FT_UNUSED( base_flags ); - - - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || - axis->extra_light ) - return width; - - if ( dist < 0 ) - { - dist = -width; - sign = 1; - } - - if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || - ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) - { - /* smooth hinting process: very lightly quantize the stem width */ - - /* leave the widths of serifs alone */ - - if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) ) - goto Done_Width; - -#if 0 - else if ( ( base_flags & AF_EDGE_ROUND ) ) - { - if ( dist < 80 ) - dist = 64; - } - else if ( dist < 56 ) - dist = 56; -#endif - if ( axis->width_count > 0 ) - { - FT_Pos delta; - - - /* compare to standard width */ - if ( axis->width_count > 0 ) - { - delta = dist - axis->widths[0].cur; - - if ( delta < 0 ) - delta = -delta; - - if ( delta < 40 ) - { - dist = axis->widths[0].cur; - if ( dist < 48 ) - dist = 48; - - goto Done_Width; - } - } - - if ( dist < 3 * 64 ) - { - delta = dist & 63; - dist &= -64; - - if ( delta < 10 ) - dist += delta; - - else if ( delta < 32 ) - dist += 10; - - else if ( delta < 54 ) - dist += 54; - - else - dist += delta; - } - else - dist = ( dist + 32 ) & ~63; - } - } - else - { - /* strong hinting process: snap the stem width to integer pixels */ - FT_Pos org_dist = dist; - - - dist = af_latin2_snap_width( axis->widths, axis->width_count, dist ); - - if ( vertical ) - { - /* in the case of vertical hinting, always round */ - /* the stem heights to integer pixels */ - - if ( dist >= 64 ) - dist = ( dist + 16 ) & ~63; - else - dist = 64; - } - else - { - if ( AF_LATIN_HINTS_DO_MONO( hints ) ) - { - /* monochrome horizontal hinting: snap widths to integer pixels */ - /* with a different threshold */ - - if ( dist < 64 ) - dist = 64; - else - dist = ( dist + 32 ) & ~63; - } - else - { - /* for horizontal anti-aliased hinting, we adopt a more subtle */ - /* approach: we strengthen small stems, round stems whose size */ - /* is between 1 and 2 pixels to an integer, otherwise nothing */ - - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - - else if ( dist < 128 ) - { - /* We only round to an integer width if the corresponding */ - /* distortion is less than 1/4 pixel. Otherwise this */ - /* makes everything worse since the diagonals, which are */ - /* not hinted, appear a lot bolder or thinner than the */ - /* vertical stems. */ - - FT_Int delta; - - - dist = ( dist + 22 ) & ~63; - delta = dist - org_dist; - if ( delta < 0 ) - delta = -delta; - - if ( delta >= 16 ) - { - dist = org_dist; - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - } - } - else - /* round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & ~63; - } - } - } - - Done_Width: - if ( sign ) - dist = -dist; - - return dist; - } - - - /* align one stem edge relative to the previous stem edge */ - - static void - af_latin2_align_linked_edge( AF_GlyphHints hints, - AF_Dimension dim, - AF_Edge base_edge, - AF_Edge stem_edge ) - { - FT_Pos dist = stem_edge->opos - base_edge->opos; - - FT_Pos fitted_width = af_latin2_compute_stem_width( hints, dim, dist, - base_edge->flags, - stem_edge->flags ); - - - stem_edge->pos = base_edge->pos + fitted_width; - - FT_TRACE5(( "LINK: edge %d (opos=%.2f) linked to (%.2f), " - "dist was %.2f, now %.2f\n", - stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0, - stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); - } - - - static void - af_latin2_align_serif_edge( AF_GlyphHints hints, - AF_Edge base, - AF_Edge serif ) - { - FT_UNUSED( hints ); - - serif->pos = base->pos + ( serif->opos - base->opos ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** E D G E H I N T I N G ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - static void - af_latin2_hint_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - AF_Edge anchor = NULL; - FT_Int has_serifs = 0; - FT_Pos anchor_drift = 0; - - - - FT_TRACE5(( "==== hinting %s edges =====\n", - dim == AF_DIMENSION_HORZ ? "vertical" : "horizontal" )); - - /* we begin by aligning all stems relative to the blue zone */ - /* if needed -- that's only for horizontal edges */ - - if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) - { - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Width blue; - AF_Edge edge1, edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - blue = edge->blue_edge; - edge1 = NULL; - edge2 = edge->link; - - if ( blue ) - { - edge1 = edge; - } - else if ( edge2 && edge2->blue_edge ) - { - blue = edge2->blue_edge; - edge1 = edge2; - edge2 = edge; - } - - if ( !edge1 ) - continue; - - FT_TRACE5(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f), " - "was (%.2f)\n", - edge1-edges, edge1->opos / 64.0, blue->fit / 64.0, - edge1->pos / 64.0 )); - - edge1->pos = blue->fit; - edge1->flags |= AF_EDGE_DONE; - - if ( edge2 && !edge2->blue_edge ) - { - af_latin2_align_linked_edge( hints, dim, edge1, edge2 ); - edge2->flags |= AF_EDGE_DONE; - } - - if ( !anchor ) - { - anchor = edge; - - anchor_drift = ( anchor->pos - anchor->opos ); - if ( edge2 ) - anchor_drift = ( anchor_drift + - ( edge2->pos - edge2->opos ) ) >> 1; - } - } - } - - /* now we will align all stem edges, trying to maintain the */ - /* relative order of stems in the glyph */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Edge edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - /* skip all non-stem edges */ - edge2 = edge->link; - if ( !edge2 ) - { - has_serifs++; - continue; - } - - /* now align the stem */ - - /* this should not happen, but it's better to be safe */ - if ( edge2->blue_edge ) - { - FT_TRACE5(( "ASSERTION FAILED for edge %d\n", edge2-edges )); - - af_latin2_align_linked_edge( hints, dim, edge2, edge ); - edge->flags |= AF_EDGE_DONE; - continue; - } - - if ( !anchor ) - { - FT_Pos org_len, org_center, cur_len; - FT_Pos cur_pos1, error1, error2, u_off, d_off; - - - org_len = edge2->opos - edge->opos; - cur_len = af_latin2_compute_stem_width( hints, dim, org_len, - edge->flags, - edge2->flags ); - if ( cur_len <= 64 ) - u_off = d_off = 32; - else - { - u_off = 38; - d_off = 26; - } - - if ( cur_len < 96 ) - { - org_center = edge->opos + ( org_len >> 1 ); - - cur_pos1 = FT_PIX_ROUND( org_center ); - - error1 = org_center - ( cur_pos1 - u_off ); - if ( error1 < 0 ) - error1 = -error1; - - error2 = org_center - ( cur_pos1 + d_off ); - if ( error2 < 0 ) - error2 = -error2; - - if ( error1 < error2 ) - cur_pos1 -= u_off; - else - cur_pos1 += d_off; - - edge->pos = cur_pos1 - cur_len / 2; - edge2->pos = edge->pos + cur_len; - } - else - edge->pos = FT_PIX_ROUND( edge->opos ); - - FT_TRACE5(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)" - " snapped to (%.2f) (%.2f)\n", - edge-edges, edge->opos / 64.0, - edge2-edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0 )); - anchor = edge; - - edge->flags |= AF_EDGE_DONE; - - af_latin2_align_linked_edge( hints, dim, edge, edge2 ); - - edge2->flags |= AF_EDGE_DONE; - - anchor_drift = ( ( anchor->pos - anchor->opos ) + - ( edge2->pos - edge2->opos ) ) >> 1; - - FT_TRACE5(( "DRIFT: %.2f\n", anchor_drift/64.0 )); - } - else - { - FT_Pos org_pos, org_len, org_center, cur_center, cur_len; - FT_Pos org_left, org_right; - - - org_pos = edge->opos + anchor_drift; - org_len = edge2->opos - edge->opos; - org_center = org_pos + ( org_len >> 1 ); - - cur_len = af_latin2_compute_stem_width( hints, dim, org_len, - edge->flags, - edge2->flags ); - - org_left = org_pos + ( ( org_len - cur_len ) >> 1 ); - org_right = org_pos + ( ( org_len + cur_len ) >> 1 ); - - FT_TRACE5(( "ALIGN: left=%.2f right=%.2f ", - org_left / 64.0, org_right / 64.0 )); - cur_center = org_center; - - if ( edge2->flags & AF_EDGE_DONE ) - { - FT_TRACE5(( "\n" )); - edge->pos = edge2->pos - cur_len; - } - else - { - /* we want to compare several displacement, and choose - * the one that increases fitness while minimizing - * distortion as well - */ - FT_Pos displacements[6], scores[6], org, fit, delta; - FT_UInt count = 0; - - /* note: don't even try to fit tiny stems */ - if ( cur_len < 32 ) - { - FT_TRACE5(( "tiny stem\n" )); - goto AlignStem; - } - - /* if the span is within a single pixel, don't touch it */ - if ( FT_PIX_FLOOR( org_left ) == FT_PIX_CEIL( org_right ) ) - { - FT_TRACE5(( "single pixel stem\n" )); - goto AlignStem; - } - - if ( cur_len <= 96 ) - { - /* we want to avoid the absolute worst case which is - * when the left and right edges of the span each represent - * about 50% of the gray. we'd better want to change this - * to 25/75%, since this is much more pleasant to the eye with - * very acceptable distortion - */ - FT_Pos frac_left = org_left & 63; - FT_Pos frac_right = org_right & 63; - - if ( frac_left >= 22 && frac_left <= 42 && - frac_right >= 22 && frac_right <= 42 ) - { - org = frac_left; - fit = ( org <= 32 ) ? 16 : 48; - delta = FT_ABS( fit - org ); - displacements[count] = fit - org; - scores[count++] = delta; - FT_TRACE5(( "dispA=%.2f (%d) ", ( fit - org ) / 64.0, delta )); - - org = frac_right; - fit = ( org <= 32 ) ? 16 : 48; - delta = FT_ABS( fit - org ); - displacements[count] = fit - org; - scores[count++] = delta; - FT_TRACE5(( "dispB=%.2f (%d) ", ( fit - org ) / 64.0, delta )); - } - } - - /* snapping the left edge to the grid */ - org = org_left; - fit = FT_PIX_ROUND( org ); - delta = FT_ABS( fit - org ); - displacements[count] = fit - org; - scores[count++] = delta; - FT_TRACE5(( "dispC=%.2f (%d) ", ( fit - org ) / 64.0, delta )); - - /* snapping the right edge to the grid */ - org = org_right; - fit = FT_PIX_ROUND( org ); - delta = FT_ABS( fit - org ); - displacements[count] = fit - org; - scores[count++] = delta; - FT_TRACE5(( "dispD=%.2f (%d) ", ( fit - org ) / 64.0, delta )); - - /* now find the best displacement */ - { - FT_Pos best_score = scores[0]; - FT_Pos best_disp = displacements[0]; - FT_UInt nn; - - for ( nn = 1; nn < count; nn++ ) - { - if ( scores[nn] < best_score ) - { - best_score = scores[nn]; - best_disp = displacements[nn]; - } - } - - cur_center = org_center + best_disp; - } - FT_TRACE5(( "\n" )); - } - - AlignStem: - edge->pos = cur_center - ( cur_len >> 1 ); - edge2->pos = edge->pos + cur_len; - - FT_TRACE5(( "STEM1: %d (opos=%.2f) to %d (opos=%.2f)" - " snapped to (%.2f) and (%.2f)," - " org_len=%.2f cur_len=%.2f\n", - edge-edges, edge->opos / 64.0, - edge2-edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0, - org_len / 64.0, cur_len / 64.0 )); - - edge->flags |= AF_EDGE_DONE; - edge2->flags |= AF_EDGE_DONE; - - if ( edge > edges && edge->pos < edge[-1].pos ) - { - FT_TRACE5(( "BOUND: %d (pos=%.2f) to (%.2f)\n", - edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); - edge->pos = edge[-1].pos; - } - } - } - - /* make sure that lowercase m's maintain their symmetry */ - - /* In general, lowercase m's have six vertical edges if they are sans */ - /* serif, or twelve if they are with serifs. This implementation is */ - /* based on that assumption, and seems to work very well with most */ - /* faces. However, if for a certain face this assumption is not */ - /* true, the m is just rendered like before. In addition, any stem */ - /* correction will only be applied to symmetrical glyphs (even if the */ - /* glyph is not an m), so the potential for unwanted distortion is */ - /* relatively low. */ - - /* We don't handle horizontal edges since we can't easily assure that */ - /* the third (lowest) stem aligns with the base line; it might end up */ - /* one pixel higher or lower. */ - -#if 0 - { - FT_Int n_edges = edge_limit - edges; - - - if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) - { - AF_Edge edge1, edge2, edge3; - FT_Pos dist1, dist2, span, delta; - - - if ( n_edges == 6 ) - { - edge1 = edges; - edge2 = edges + 2; - edge3 = edges + 4; - } - else - { - edge1 = edges + 1; - edge2 = edges + 5; - edge3 = edges + 9; - } - - dist1 = edge2->opos - edge1->opos; - dist2 = edge3->opos - edge2->opos; - - span = dist1 - dist2; - if ( span < 0 ) - span = -span; - - if ( span < 8 ) - { - delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); - edge3->pos -= delta; - if ( edge3->link ) - edge3->link->pos -= delta; - - /* move the serifs along with the stem */ - if ( n_edges == 12 ) - { - ( edges + 8 )->pos -= delta; - ( edges + 11 )->pos -= delta; - } - - edge3->flags |= AF_EDGE_DONE; - if ( edge3->link ) - edge3->link->flags |= AF_EDGE_DONE; - } - } - } -#endif - - if ( has_serifs || !anchor ) - { - /* - * now hint the remaining edges (serifs and single) in order - * to complete our processing - */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Pos delta; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - delta = 1000; - - if ( edge->serif ) - { - delta = edge->serif->opos - edge->opos; - if ( delta < 0 ) - delta = -delta; - } - - if ( delta < 64 + 16 ) - { - af_latin2_align_serif_edge( hints, edge->serif, edge ); - FT_TRACE5(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)" - " aligned to (%.2f)\n", - edge-edges, edge->opos / 64.0, - edge->serif - edges, edge->serif->opos / 64.0, - edge->pos / 64.0 )); - } - else if ( !anchor ) - { - FT_TRACE5(( "SERIF_ANCHOR: edge %d (opos=%.2f)" - " snapped to (%.2f)\n", - edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); - edge->pos = FT_PIX_ROUND( edge->opos ); - anchor = edge; - } - else - { - AF_Edge before, after; - - - for ( before = edge - 1; before >= edges; before-- ) - if ( before->flags & AF_EDGE_DONE ) - break; - - for ( after = edge + 1; after < edge_limit; after++ ) - if ( after->flags & AF_EDGE_DONE ) - break; - - if ( before >= edges && before < edge && - after < edge_limit && after > edge ) - { - if ( after->opos == before->opos ) - edge->pos = before->pos; - else - edge->pos = before->pos + - FT_MulDiv( edge->opos - before->opos, - after->pos - before->pos, - after->opos - before->opos ); - FT_TRACE5(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f)" - " from %d (opos=%.2f)\n", - edge-edges, edge->opos / 64.0, edge->pos / 64.0, - before - edges, before->opos / 64.0 )); - } - else - { - edge->pos = anchor->pos + - ( ( edge->opos - anchor->opos + 16 ) & ~31 ); - - FT_TRACE5(( "SERIF_LINK2: edge %d (opos=%.2f)" - " snapped to (%.2f)\n", - edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); - } - } - - edge->flags |= AF_EDGE_DONE; - - if ( edge > edges && edge->pos < edge[-1].pos ) - edge->pos = edge[-1].pos; - - if ( edge + 1 < edge_limit && - edge[1].flags & AF_EDGE_DONE && - edge->pos > edge[1].pos ) - edge->pos = edge[1].pos; - } - } - } - - - static FT_Error - af_latin2_hints_apply( AF_GlyphHints hints, - FT_Outline* outline, - AF_LatinMetrics metrics ) - { - FT_Error error; - int dim; - - - error = af_glyph_hints_reload( hints, outline ); - if ( error ) - goto Exit; - - /* analyze glyph outline */ -#ifdef AF_CONFIG_OPTION_USE_WARPER - if ( ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT && - AF_HINTS_DO_WARP( hints ) ) || - AF_HINTS_DO_HORIZONTAL( hints ) ) -#else - if ( AF_HINTS_DO_HORIZONTAL( hints ) ) -#endif - { - error = af_latin2_hints_detect_features( hints, AF_DIMENSION_HORZ ); - if ( error ) - goto Exit; - } - - if ( AF_HINTS_DO_VERTICAL( hints ) ) - { - error = af_latin2_hints_detect_features( hints, AF_DIMENSION_VERT ); - if ( error ) - goto Exit; - - af_latin2_hints_compute_blue_edges( hints, metrics ); - } - - /* grid-fit the outline */ - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { -#ifdef AF_CONFIG_OPTION_USE_WARPER - if ( dim == AF_DIMENSION_HORZ && - metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT && - AF_HINTS_DO_WARP( hints ) ) - { - AF_WarperRec warper; - FT_Fixed scale; - FT_Pos delta; - - - af_warper_compute( &warper, hints, dim, &scale, &delta ); - af_glyph_hints_scale_dim( hints, dim, scale, delta ); - continue; - } -#endif /* AF_CONFIG_OPTION_USE_WARPER */ - - if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || - ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) - { - af_latin2_hint_edges( hints, (AF_Dimension)dim ); - af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); - } - } - af_glyph_hints_save( hints, outline ); - - Exit: - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N S C R I P T C L A S S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_latin2_writing_system_class, - - AF_WRITING_SYSTEM_LATIN2, - - sizeof ( AF_LatinMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) af_latin2_metrics_init, - (AF_WritingSystem_ScaleMetricsFunc)af_latin2_metrics_scale, - (AF_WritingSystem_DoneMetricsFunc) NULL, - - (AF_WritingSystem_InitHintsFunc) af_latin2_hints_init, - (AF_WritingSystem_ApplyHintsFunc) af_latin2_hints_apply - ) - - -/* END */ diff --git a/3party/freetype/src/autofit/aflatin2.h b/3party/freetype/src/autofit/aflatin2.h deleted file mode 100644 index 9326753130..0000000000 --- a/3party/freetype/src/autofit/aflatin2.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* aflatin2.h */ -/* */ -/* Auto-fitter hinting routines for latin writing system */ -/* (specification). */ -/* */ -/* Copyright 2003-2015 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 __AFLATIN2_H__ -#define __AFLATIN2_H__ - -#include "afhints.h" - - -FT_BEGIN_HEADER - - - /* the `latin' writing system */ - - AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin2_writing_system_class ) - - -/* */ - -FT_END_HEADER - -#endif /* __AFLATIN_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afloader.c b/3party/freetype/src/autofit/afloader.c deleted file mode 100644 index 7c2fa7cffd..0000000000 --- a/3party/freetype/src/autofit/afloader.c +++ /dev/null @@ -1,407 +0,0 @@ -/***************************************************************************/ -/* */ -/* afloader.c */ -/* */ -/* Auto-fitter glyph loading routines (body). */ -/* */ -/* Copyright 2003-2015 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 "afglobal.h" -#include "afloader.h" -#include "afhints.h" -#include "aferrors.h" -#include "afmodule.h" -#include "afpic.h" - - - /* Initialize glyph loader. */ - - FT_LOCAL_DEF( void ) - af_loader_init( AF_Loader loader, - AF_GlyphHints hints ) - { - FT_ZERO( loader ); - - loader->hints = hints; - } - - - /* Reset glyph loader and compute globals if necessary. */ - - FT_LOCAL_DEF( FT_Error ) - af_loader_reset( AF_Loader loader, - AF_Module module, - FT_Face face ) - { - FT_Error error = FT_Err_Ok; - - - loader->face = face; - loader->globals = (AF_FaceGlobals)face->autohint.data; - - if ( loader->globals == NULL ) - { - error = af_face_globals_new( face, &loader->globals, module ); - if ( !error ) - { - face->autohint.data = - (FT_Pointer)loader->globals; - face->autohint.finalizer = - (FT_Generic_Finalizer)af_face_globals_free; - } - } - - return error; - } - - - /* Finalize glyph loader. */ - - FT_LOCAL_DEF( void ) - af_loader_done( AF_Loader loader ) - { - loader->face = NULL; - loader->globals = NULL; - loader->hints = NULL; - } - - - /* Do the main work of `af_loader_load_glyph'. Note that we never */ - /* have to deal with composite glyphs as those get loaded into */ - /* FT_GLYPH_FORMAT_OUTLINE by the recursed `FT_Load_Glyph' function. */ - /* In the rare cases where FT_LOAD_NO_RECURSE is set, it implies */ - /* FT_LOAD_NO_SCALE and as such the auto-hinter is never called. */ - - static FT_Error - af_loader_load_g( AF_Loader loader, - AF_Scaler scaler, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FT_Error error; - FT_Face face = loader->face; - AF_StyleMetrics metrics = loader->metrics; - AF_GlyphHints hints = loader->hints; - FT_GlyphSlot slot = face->glyph; - FT_Slot_Internal internal = slot->internal; - FT_GlyphLoader gloader = internal->loader; - FT_Int32 flags; - - - flags = load_flags | FT_LOAD_LINEAR_DESIGN; - error = FT_Load_Glyph( face, glyph_index, flags ); - if ( error ) - goto Exit; - - loader->transformed = internal->glyph_transformed; - if ( loader->transformed ) - { - FT_Matrix inverse; - - - loader->trans_matrix = internal->glyph_matrix; - loader->trans_delta = internal->glyph_delta; - - inverse = loader->trans_matrix; - if ( !FT_Matrix_Invert( &inverse ) ) - FT_Vector_Transform( &loader->trans_delta, &inverse ); - } - - switch ( slot->format ) - { - case FT_GLYPH_FORMAT_OUTLINE: - /* translate the loaded glyph when an internal transform is needed */ - if ( loader->transformed ) - FT_Outline_Translate( &slot->outline, - loader->trans_delta.x, - loader->trans_delta.y ); - - /* compute original horizontal phantom points (and ignore */ - /* vertical ones) */ - loader->pp1.x = hints->x_delta; - loader->pp1.y = hints->y_delta; - loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance, - hints->x_scale ) + hints->x_delta; - loader->pp2.y = hints->y_delta; - - /* be sure to check for spacing glyphs */ - if ( slot->outline.n_points == 0 ) - goto Hint_Metrics; - - /* now load the slot image into the auto-outline and run the */ - /* automatic hinting process */ - { -#ifdef FT_CONFIG_OPTION_PIC - AF_FaceGlobals globals = loader->globals; -#endif - AF_StyleClass style_class = metrics->style_class; - AF_WritingSystemClass writing_system_class = - AF_WRITING_SYSTEM_CLASSES_GET[style_class->writing_system]; - - - if ( writing_system_class->style_hints_apply ) - writing_system_class->style_hints_apply( hints, - &gloader->base.outline, - metrics ); - } - - /* we now need to adjust the metrics according to the change in */ - /* width/positioning that occurred during the hinting process */ - if ( scaler->render_mode != FT_RENDER_MODE_LIGHT ) - { - FT_Pos old_rsb, old_lsb, new_lsb; - FT_Pos pp1x_uh, pp2x_uh; - AF_AxisHints axis = &hints->axis[AF_DIMENSION_HORZ]; - AF_Edge edge1 = axis->edges; /* leftmost edge */ - AF_Edge edge2 = edge1 + - axis->num_edges - 1; /* rightmost edge */ - - - if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) ) - { - old_rsb = loader->pp2.x - edge2->opos; - old_lsb = edge1->opos; - new_lsb = edge1->pos; - - /* remember unhinted values to later account */ - /* for rounding errors */ - - pp1x_uh = new_lsb - old_lsb; - pp2x_uh = edge2->pos + old_rsb; - - /* prefer too much space over too little space */ - /* for very small sizes */ - - if ( old_lsb < 24 ) - pp1x_uh -= 8; - - if ( old_rsb < 24 ) - pp2x_uh += 8; - - loader->pp1.x = FT_PIX_ROUND( pp1x_uh ); - loader->pp2.x = FT_PIX_ROUND( pp2x_uh ); - - if ( loader->pp1.x >= new_lsb && old_lsb > 0 ) - loader->pp1.x -= 64; - - if ( loader->pp2.x <= edge2->pos && old_rsb > 0 ) - loader->pp2.x += 64; - - slot->lsb_delta = loader->pp1.x - pp1x_uh; - slot->rsb_delta = loader->pp2.x - pp2x_uh; - } - else - { - FT_Pos pp1x = loader->pp1.x; - FT_Pos pp2x = loader->pp2.x; - - - loader->pp1.x = FT_PIX_ROUND( pp1x ); - loader->pp2.x = FT_PIX_ROUND( pp2x ); - - slot->lsb_delta = loader->pp1.x - pp1x; - slot->rsb_delta = loader->pp2.x - pp2x; - } - } - else - { - FT_Pos pp1x = loader->pp1.x; - FT_Pos pp2x = loader->pp2.x; - - - loader->pp1.x = FT_PIX_ROUND( pp1x + hints->xmin_delta ); - loader->pp2.x = FT_PIX_ROUND( pp2x + hints->xmax_delta ); - - slot->lsb_delta = loader->pp1.x - pp1x; - slot->rsb_delta = loader->pp2.x - pp2x; - } - - break; - - default: - /* we don't support other formats (yet?) */ - error = FT_THROW( Unimplemented_Feature ); - } - - Hint_Metrics: - { - FT_BBox bbox; - FT_Vector vvector; - - - vvector.x = slot->metrics.vertBearingX - slot->metrics.horiBearingX; - vvector.y = slot->metrics.vertBearingY - slot->metrics.horiBearingY; - vvector.x = FT_MulFix( vvector.x, metrics->scaler.x_scale ); - vvector.y = FT_MulFix( vvector.y, metrics->scaler.y_scale ); - - /* transform the hinted outline if needed */ - if ( loader->transformed ) - { - FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix ); - FT_Vector_Transform( &vvector, &loader->trans_matrix ); - } -#if 1 - /* we must translate our final outline by -pp1.x and compute */ - /* the new metrics */ - if ( loader->pp1.x ) - FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 ); -#endif - FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); - - bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); - bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); - bbox.xMax = FT_PIX_CEIL( bbox.xMax ); - bbox.yMax = FT_PIX_CEIL( bbox.yMax ); - - slot->metrics.width = bbox.xMax - bbox.xMin; - slot->metrics.height = bbox.yMax - bbox.yMin; - slot->metrics.horiBearingX = bbox.xMin; - slot->metrics.horiBearingY = bbox.yMax; - - slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x ); - slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y ); - - /* for mono-width fonts (like Andale, Courier, etc.) we need */ - /* to keep the original rounded advance width; ditto for */ - /* digits if all have the same advance width */ -#if 0 - if ( !FT_IS_FIXED_WIDTH( slot->face ) ) - slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; - else - slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, - x_scale ); -#else - if ( scaler->render_mode != FT_RENDER_MODE_LIGHT && - ( FT_IS_FIXED_WIDTH( slot->face ) || - ( af_face_globals_is_digit( loader->globals, glyph_index ) && - metrics->digits_have_same_width ) ) ) - { - slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, - metrics->scaler.x_scale ); - - /* Set delta values to 0. Otherwise code that uses them is */ - /* going to ruin the fixed advance width. */ - slot->lsb_delta = 0; - slot->rsb_delta = 0; - } - else - { - /* non-spacing glyphs must stay as-is */ - if ( slot->metrics.horiAdvance ) - slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; - } -#endif - - slot->metrics.vertAdvance = FT_MulFix( slot->metrics.vertAdvance, - metrics->scaler.y_scale ); - - slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance ); - slot->metrics.vertAdvance = FT_PIX_ROUND( slot->metrics.vertAdvance ); - -#if 0 - /* reassign all outline fields except flags to protect them */ - slot->outline.n_contours = internal->loader->base.outline.n_contours; - slot->outline.n_points = internal->loader->base.outline.n_points; - slot->outline.points = internal->loader->base.outline.points; - slot->outline.tags = internal->loader->base.outline.tags; - slot->outline.contours = internal->loader->base.outline.contours; -#endif - - slot->format = FT_GLYPH_FORMAT_OUTLINE; - } - - Exit: - return error; - } - - - /* Load a glyph. */ - - FT_LOCAL_DEF( FT_Error ) - af_loader_load_glyph( AF_Loader loader, - AF_Module module, - FT_Face face, - FT_UInt gindex, - FT_Int32 load_flags ) - { - FT_Error error; - FT_Size size = face->size; - AF_ScalerRec scaler; - - - if ( !size ) - return FT_THROW( Invalid_Size_Handle ); - - FT_ZERO( &scaler ); - - scaler.face = face; - scaler.x_scale = size->metrics.x_scale; - scaler.x_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ - scaler.y_scale = size->metrics.y_scale; - scaler.y_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ - - scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags ); - scaler.flags = 0; /* XXX: fix this */ - - error = af_loader_reset( loader, module, face ); - if ( !error ) - { - AF_StyleMetrics metrics; - FT_UInt options = AF_STYLE_NONE_DFLT; - - -#ifdef FT_OPTION_AUTOFIT2 - /* XXX: undocumented hook to activate the latin2 writing system */ - if ( load_flags & ( 1UL << 20 ) ) - options = AF_STYLE_LTN2_DFLT; -#endif - - error = af_face_globals_get_metrics( loader->globals, gindex, - options, &metrics ); - if ( !error ) - { -#ifdef FT_CONFIG_OPTION_PIC - AF_FaceGlobals globals = loader->globals; -#endif - AF_StyleClass style_class = metrics->style_class; - AF_WritingSystemClass writing_system_class = - AF_WRITING_SYSTEM_CLASSES_GET[style_class->writing_system]; - - - loader->metrics = metrics; - - if ( writing_system_class->style_metrics_scale ) - writing_system_class->style_metrics_scale( metrics, &scaler ); - else - metrics->scaler = scaler; - - load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM; - load_flags &= ~FT_LOAD_RENDER; - - if ( writing_system_class->style_hints_init ) - { - error = writing_system_class->style_hints_init( loader->hints, - metrics ); - if ( error ) - goto Exit; - } - - error = af_loader_load_g( loader, &scaler, gindex, load_flags ); - } - } - Exit: - return error; - } - - -/* END */ diff --git a/3party/freetype/src/autofit/afloader.h b/3party/freetype/src/autofit/afloader.h deleted file mode 100644 index 37cfd14239..0000000000 --- a/3party/freetype/src/autofit/afloader.h +++ /dev/null @@ -1,86 +0,0 @@ -/***************************************************************************/ -/* */ -/* afloader.h */ -/* */ -/* Auto-fitter glyph loading routines (specification). */ -/* */ -/* Copyright 2003-2015 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 __AFLOADER_H__ -#define __AFLOADER_H__ - -#include "afhints.h" -#include "afmodule.h" -#include "afglobal.h" - - -FT_BEGIN_HEADER - - /* - * The autofitter module's (global) data structure to communicate with - * actual fonts. If necessary, `local' data like the current face, the - * current face's auto-hint data, or the current glyph's parameters - * relevant to auto-hinting are `swapped in'. Cf. functions like - * `af_loader_reset' and `af_loader_load_g'. - */ - - typedef struct AF_LoaderRec_ - { - /* current face data */ - FT_Face face; - AF_FaceGlobals globals; - - /* current glyph data */ - AF_GlyphHints hints; - AF_StyleMetrics metrics; - FT_Bool transformed; - FT_Matrix trans_matrix; - FT_Vector trans_delta; - FT_Vector pp1; - FT_Vector pp2; - /* we don't handle vertical phantom points */ - - } AF_LoaderRec, *AF_Loader; - - - FT_LOCAL( void ) - af_loader_init( AF_Loader loader, - AF_GlyphHints hints ); - - - FT_LOCAL( FT_Error ) - af_loader_reset( AF_Loader loader, - AF_Module module, - FT_Face face ); - - - FT_LOCAL( void ) - af_loader_done( AF_Loader loader ); - - - FT_LOCAL( FT_Error ) - af_loader_load_glyph( AF_Loader loader, - AF_Module module, - FT_Face face, - FT_UInt gindex, - FT_Int32 load_flags ); - -/* */ - - -FT_END_HEADER - -#endif /* __AFLOADER_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afmodule.c b/3party/freetype/src/autofit/afmodule.c deleted file mode 100644 index 8ae425c006..0000000000 --- a/3party/freetype/src/autofit/afmodule.c +++ /dev/null @@ -1,401 +0,0 @@ -/***************************************************************************/ -/* */ -/* afmodule.c */ -/* */ -/* Auto-fitter module implementation (body). */ -/* */ -/* Copyright 2003-2015 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 "afglobal.h" -#include "afmodule.h" -#include "afloader.h" -#include "aferrors.h" -#include "afpic.h" - -#ifdef FT_DEBUG_AUTOFIT - -#ifndef FT_MAKE_OPTION_SINGLE_OBJECT - extern void - af_glyph_hints_dump_segments( AF_GlyphHints hints, - FT_Bool to_stdout ); - extern void - af_glyph_hints_dump_points( AF_GlyphHints hints, - FT_Bool to_stdout ); - extern void - af_glyph_hints_dump_edges( AF_GlyphHints hints, - FT_Bool to_stdout ); -#endif - - int _af_debug_disable_horz_hints; - int _af_debug_disable_vert_hints; - int _af_debug_disable_blue_hints; - - /* we use a global object instead of a local one for debugging */ - AF_GlyphHintsRec _af_debug_hints_rec[1]; - - void* _af_debug_hints = _af_debug_hints_rec; -#endif - -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_AUTOHINTER_H -#include FT_SERVICE_PROPERTIES_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_afmodule - - - static FT_Error - af_property_get_face_globals( FT_Face face, - AF_FaceGlobals* aglobals, - AF_Module module ) - { - FT_Error error = FT_Err_Ok; - AF_FaceGlobals globals; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - globals = (AF_FaceGlobals)face->autohint.data; - if ( !globals ) - { - /* trigger computation of the global style data */ - /* in case it hasn't been done yet */ - error = af_face_globals_new( face, &globals, module ); - if ( !error ) - { - face->autohint.data = - (FT_Pointer)globals; - face->autohint.finalizer = - (FT_Generic_Finalizer)af_face_globals_free; - } - } - - if ( !error ) - *aglobals = globals; - - return error; - } - - - static FT_Error - af_property_set( FT_Module ft_module, - const char* property_name, - const void* value ) - { - FT_Error error = FT_Err_Ok; - AF_Module module = (AF_Module)ft_module; - - - if ( !ft_strcmp( property_name, "fallback-script" ) ) - { - FT_UInt* fallback_script = (FT_UInt*)value; - - FT_UInt ss; - - - /* We translate the fallback script to a fallback style that uses */ - /* `fallback-script' as its script and `AF_COVERAGE_NONE' as its */ - /* coverage value. */ - for ( ss = 0; AF_STYLE_CLASSES_GET[ss]; ss++ ) - { - AF_StyleClass style_class = AF_STYLE_CLASSES_GET[ss]; - - - if ( (FT_UInt)style_class->script == *fallback_script && - style_class->coverage == AF_COVERAGE_DEFAULT ) - { - module->fallback_style = ss; - break; - } - } - - if ( !AF_STYLE_CLASSES_GET[ss] ) - { - FT_TRACE0(( "af_property_set: Invalid value %d for property `%s'\n", - fallback_script, property_name )); - return FT_THROW( Invalid_Argument ); - } - - return error; - } - else if ( !ft_strcmp( property_name, "default-script" ) ) - { - FT_UInt* default_script = (FT_UInt*)value; - - - module->default_script = *default_script; - - return error; - } - else if ( !ft_strcmp( property_name, "increase-x-height" ) ) - { - FT_Prop_IncreaseXHeight* prop = (FT_Prop_IncreaseXHeight*)value; - AF_FaceGlobals globals; - - - error = af_property_get_face_globals( prop->face, &globals, module ); - if ( !error ) - globals->increase_x_height = prop->limit; - - return error; - } -#ifdef AF_CONFIG_OPTION_USE_WARPER - else if ( !ft_strcmp( property_name, "warping" ) ) - { - FT_Bool* warping = (FT_Bool*)value; - - - module->warping = *warping; - - return error; - } -#endif /* AF_CONFIG_OPTION_USE_WARPER */ - - FT_TRACE0(( "af_property_set: missing property `%s'\n", - property_name )); - return FT_THROW( Missing_Property ); - } - - - static FT_Error - af_property_get( FT_Module ft_module, - const char* property_name, - void* value ) - { - FT_Error error = FT_Err_Ok; - AF_Module module = (AF_Module)ft_module; - FT_UInt fallback_style = module->fallback_style; - FT_UInt default_script = module->default_script; -#ifdef AF_CONFIG_OPTION_USE_WARPER - FT_Bool warping = module->warping; -#endif - - - if ( !ft_strcmp( property_name, "glyph-to-script-map" ) ) - { - FT_Prop_GlyphToScriptMap* prop = (FT_Prop_GlyphToScriptMap*)value; - AF_FaceGlobals globals; - - - error = af_property_get_face_globals( prop->face, &globals, module ); - if ( !error ) - prop->map = globals->glyph_styles; - - return error; - } - else if ( !ft_strcmp( property_name, "fallback-script" ) ) - { - FT_UInt* val = (FT_UInt*)value; - - AF_StyleClass style_class = AF_STYLE_CLASSES_GET[fallback_style]; - - - *val = style_class->script; - - return error; - } - else if ( !ft_strcmp( property_name, "default-script" ) ) - { - FT_UInt* val = (FT_UInt*)value; - - - *val = default_script; - - return error; - } - else if ( !ft_strcmp( property_name, "increase-x-height" ) ) - { - FT_Prop_IncreaseXHeight* prop = (FT_Prop_IncreaseXHeight*)value; - AF_FaceGlobals globals; - - - error = af_property_get_face_globals( prop->face, &globals, module ); - if ( !error ) - prop->limit = globals->increase_x_height; - - return error; - } -#ifdef AF_CONFIG_OPTION_USE_WARPER - else if ( !ft_strcmp( property_name, "warping" ) ) - { - FT_Bool* val = (FT_Bool*)value; - - - *val = warping; - - return error; - } -#endif /* AF_CONFIG_OPTION_USE_WARPER */ - - FT_TRACE0(( "af_property_get: missing property `%s'\n", - property_name )); - return FT_THROW( Missing_Property ); - } - - - FT_DEFINE_SERVICE_PROPERTIESREC( - af_service_properties, - (FT_Properties_SetFunc)af_property_set, - (FT_Properties_GetFunc)af_property_get ) - - - FT_DEFINE_SERVICEDESCREC1( - af_services, - FT_SERVICE_ID_PROPERTIES, &AF_SERVICE_PROPERTIES_GET ) - - - FT_CALLBACK_DEF( FT_Module_Interface ) - af_get_interface( FT_Module module, - const char* module_interface ) - { - /* AF_SERVICES_GET dereferences `library' in PIC mode */ -#ifdef FT_CONFIG_OPTION_PIC - FT_Library library; - - - if ( !module ) - return NULL; - library = module->library; - if ( !library ) - return NULL; -#else - FT_UNUSED( module ); -#endif - - return ft_service_list_lookup( AF_SERVICES_GET, module_interface ); - } - - - FT_CALLBACK_DEF( FT_Error ) - af_autofitter_init( FT_Module ft_module ) /* AF_Module */ - { - AF_Module module = (AF_Module)ft_module; - - - module->fallback_style = AF_STYLE_FALLBACK; - module->default_script = AF_SCRIPT_DEFAULT; -#ifdef AF_CONFIG_OPTION_USE_WARPER - module->warping = 0; -#endif - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( void ) - af_autofitter_done( FT_Module ft_module ) /* AF_Module */ - { - FT_UNUSED( ft_module ); - -#ifdef FT_DEBUG_AUTOFIT - if ( _af_debug_hints_rec->memory ) - af_glyph_hints_done( _af_debug_hints_rec ); -#endif - } - - - FT_CALLBACK_DEF( FT_Error ) - af_autofitter_load_glyph( AF_Module module, - FT_GlyphSlot slot, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FT_Error error = FT_Err_Ok; - FT_Memory memory = module->root.library->memory; - -#ifdef FT_DEBUG_AUTOFIT - - /* in debug mode, we use a global object that survives this routine */ - - AF_GlyphHints hints = _af_debug_hints_rec; - AF_LoaderRec loader[1]; - - FT_UNUSED( size ); - - - if ( hints->memory ) - af_glyph_hints_done( hints ); - - af_glyph_hints_init( hints, memory ); - af_loader_init( loader, hints ); - - error = af_loader_load_glyph( loader, module, slot->face, - glyph_index, load_flags ); - - af_glyph_hints_dump_points( hints, 0 ); - af_glyph_hints_dump_segments( hints, 0 ); - af_glyph_hints_dump_edges( hints, 0 ); - - af_loader_done( loader ); - - return error; - -#else /* !FT_DEBUG_AUTOFIT */ - - AF_GlyphHintsRec hints[1]; - AF_LoaderRec loader[1]; - - FT_UNUSED( size ); - - - af_glyph_hints_init( hints, memory ); - af_loader_init( loader, hints ); - - error = af_loader_load_glyph( loader, module, slot->face, - glyph_index, load_flags ); - - af_loader_done( loader ); - af_glyph_hints_done( hints ); - - return error; - -#endif /* !FT_DEBUG_AUTOFIT */ - } - - - FT_DEFINE_AUTOHINTER_INTERFACE( - af_autofitter_interface, - NULL, /* reset_face */ - NULL, /* get_global_hints */ - NULL, /* done_global_hints */ - (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph ) /* load_glyph */ - - - FT_DEFINE_MODULE( - autofit_module_class, - - FT_MODULE_HINTER, - sizeof ( AF_ModuleRec ), - - "autofitter", - 0x10000L, /* version 1.0 of the autofitter */ - 0x20000L, /* requires FreeType 2.0 or above */ - - (const void*)&AF_INTERFACE_GET, - - (FT_Module_Constructor)af_autofitter_init, - (FT_Module_Destructor) af_autofitter_done, - (FT_Module_Requester) af_get_interface ) - - -/* END */ diff --git a/3party/freetype/src/autofit/afmodule.h b/3party/freetype/src/autofit/afmodule.h deleted file mode 100644 index b9c2fd8a2d..0000000000 --- a/3party/freetype/src/autofit/afmodule.h +++ /dev/null @@ -1,56 +0,0 @@ -/***************************************************************************/ -/* */ -/* afmodule.h */ -/* */ -/* Auto-fitter module implementation (specification). */ -/* */ -/* Copyright 2003-2015 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 __AFMODULE_H__ -#define __AFMODULE_H__ - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - - /* - * This is the `extended' FT_Module structure that holds the - * autofitter's global data. - */ - - typedef struct AF_ModuleRec_ - { - FT_ModuleRec root; - - FT_UInt fallback_style; - FT_UInt default_script; -#ifdef AF_CONFIG_OPTION_USE_WARPER - FT_Bool warping; -#endif - - } AF_ModuleRec, *AF_Module; - - -FT_DECLARE_MODULE( autofit_module_class ) - - -FT_END_HEADER - -#endif /* __AFMODULE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afpic.c b/3party/freetype/src/autofit/afpic.c deleted file mode 100644 index 5589e612cf..0000000000 --- a/3party/freetype/src/autofit/afpic.c +++ /dev/null @@ -1,152 +0,0 @@ -/***************************************************************************/ -/* */ -/* afpic.c */ -/* */ -/* The FreeType position independent code services for autofit module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "afpic.h" -#include "afglobal.h" -#include "aferrors.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from afmodule.c */ - FT_Error - FT_Create_Class_af_services( FT_Library library, - FT_ServiceDescRec** output_class ); - - void - FT_Destroy_Class_af_services( FT_Library library, - FT_ServiceDescRec* clazz ); - - void - FT_Init_Class_af_service_properties( FT_Service_PropertiesRec* clazz ); - - void FT_Init_Class_af_autofitter_interface( - FT_Library library, - FT_AutoHinter_InterfaceRec* clazz ); - - - /* forward declaration of PIC init functions from writing system classes */ -#undef WRITING_SYSTEM -#define WRITING_SYSTEM( ws, WS ) /* empty */ - -#include "afwrtsys.h" - - - void - autofit_module_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->autofit ) - { - AFModulePIC* container = (AFModulePIC*)pic_container->autofit; - - - if ( container->af_services ) - FT_Destroy_Class_af_services( library, - container->af_services ); - container->af_services = NULL; - - FT_FREE( container ); - pic_container->autofit = NULL; - } - } - - - FT_Error - autofit_module_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_UInt ss; - FT_Error error = FT_Err_Ok; - AFModulePIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC ( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->autofit = container; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - error = FT_Create_Class_af_services( library, - &container->af_services ); - if ( error ) - goto Exit; - - FT_Init_Class_af_service_properties( &container->af_service_properties ); - - for ( ss = 0; ss < AF_WRITING_SYSTEM_MAX; ss++ ) - container->af_writing_system_classes[ss] = - &container->af_writing_system_classes_rec[ss]; - container->af_writing_system_classes[AF_WRITING_SYSTEM_MAX] = NULL; - - for ( ss = 0; ss < AF_SCRIPT_MAX; ss++ ) - container->af_script_classes[ss] = - &container->af_script_classes_rec[ss]; - container->af_script_classes[AF_SCRIPT_MAX] = NULL; - - for ( ss = 0; ss < AF_STYLE_MAX; ss++ ) - container->af_style_classes[ss] = - &container->af_style_classes_rec[ss]; - container->af_style_classes[AF_STYLE_MAX] = NULL; - -#undef WRITING_SYSTEM -#define WRITING_SYSTEM( ws, WS ) \ - FT_Init_Class_af_ ## ws ## _writing_system_class( \ - &container->af_writing_system_classes_rec[ss++] ); - - ss = 0; -#include "afwrtsys.h" - -#undef SCRIPT -#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \ - FT_Init_Class_af_ ## s ## _script_class( \ - &container->af_script_classes_rec[ss++] ); - - ss = 0; -#include "afscript.h" - -#undef STYLE -#define STYLE( s, S, d, ws, sc, bss, c ) \ - FT_Init_Class_af_ ## s ## _style_class( \ - &container->af_style_classes_rec[ss++] ); - - ss = 0; -#include "afstyles.h" - - FT_Init_Class_af_autofitter_interface( - library, &container->af_autofitter_interface ); - - Exit: - if ( error ) - autofit_module_class_pic_free( library ); - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afpic.h b/3party/freetype/src/autofit/afpic.h deleted file mode 100644 index 9b45069f5d..0000000000 --- a/3party/freetype/src/autofit/afpic.h +++ /dev/null @@ -1,105 +0,0 @@ -/***************************************************************************/ -/* */ -/* afpic.h */ -/* */ -/* The FreeType position independent code services for autofit module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 __AFPIC_H__ -#define __AFPIC_H__ - - -#include FT_INTERNAL_PIC_H - - -#ifndef FT_CONFIG_OPTION_PIC - -#define AF_SERVICES_GET af_services -#define AF_SERVICE_PROPERTIES_GET af_service_properties - -#define AF_WRITING_SYSTEM_CLASSES_GET af_writing_system_classes -#define AF_SCRIPT_CLASSES_GET af_script_classes -#define AF_STYLE_CLASSES_GET af_style_classes -#define AF_INTERFACE_GET af_autofitter_interface - -#else /* FT_CONFIG_OPTION_PIC */ - - /* some include files required for members of AFModulePIC */ -#include FT_SERVICE_PROPERTIES_H - -#include "aftypes.h" - - -FT_BEGIN_HEADER - - typedef struct AFModulePIC_ - { - FT_ServiceDescRec* af_services; - FT_Service_PropertiesRec af_service_properties; - - AF_WritingSystemClass af_writing_system_classes - [AF_WRITING_SYSTEM_MAX + 1]; - AF_WritingSystemClassRec af_writing_system_classes_rec - [AF_WRITING_SYSTEM_MAX]; - - AF_ScriptClass af_script_classes - [AF_SCRIPT_MAX + 1]; - AF_ScriptClassRec af_script_classes_rec - [AF_SCRIPT_MAX]; - - AF_StyleClass af_style_classes - [AF_STYLE_MAX + 1]; - AF_StyleClassRec af_style_classes_rec - [AF_STYLE_MAX]; - - FT_AutoHinter_InterfaceRec af_autofitter_interface; - - } AFModulePIC; - - -#define GET_PIC( lib ) \ - ( (AFModulePIC*)((lib)->pic_container.autofit) ) - -#define AF_SERVICES_GET \ - ( GET_PIC( library )->af_services ) -#define AF_SERVICE_PROPERTIES_GET \ - ( GET_PIC( library )->af_service_properties ) - -#define AF_WRITING_SYSTEM_CLASSES_GET \ - ( GET_PIC( FT_FACE_LIBRARY( globals->face ) )->af_writing_system_classes ) -#define AF_SCRIPT_CLASSES_GET \ - ( GET_PIC( FT_FACE_LIBRARY( globals->face ) )->af_script_classes ) -#define AF_STYLE_CLASSES_GET \ - ( GET_PIC( FT_FACE_LIBRARY( globals->face ) )->af_style_classes ) -#define AF_INTERFACE_GET \ - ( GET_PIC( library )->af_autofitter_interface ) - - - /* see afpic.c for the implementation */ - void - autofit_module_class_pic_free( FT_Library library ); - - FT_Error - autofit_module_class_pic_init( FT_Library library ); - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* __AFPIC_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afranges.c b/3party/freetype/src/autofit/afranges.c deleted file mode 100644 index c1e0afb7ea..0000000000 --- a/3party/freetype/src/autofit/afranges.c +++ /dev/null @@ -1,237 +0,0 @@ -/***************************************************************************/ -/* */ -/* afranges.c */ -/* */ -/* Auto-fitter Unicode script ranges (body). */ -/* */ -/* Copyright 2013-2015 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 "afranges.h" - - - const AF_Script_UniRangeRec af_arab_uniranges[] = - { - AF_UNIRANGE_REC( 0x0600UL, 0x06FFUL ), /* Arabic */ - AF_UNIRANGE_REC( 0x0750UL, 0x07FFUL ), /* Arabic Supplement */ - AF_UNIRANGE_REC( 0x08A0UL, 0x08FFUL ), /* Arabic Extended-A */ - AF_UNIRANGE_REC( 0xFB50UL, 0xFDFFUL ), /* Arabic Presentation Forms-A */ - AF_UNIRANGE_REC( 0xFE70UL, 0xFEFFUL ), /* Arabic Presentation Forms-B */ - AF_UNIRANGE_REC( 0x1EE00UL, 0x1EEFFUL ), /* Arabic Mathematical Alphabetic Symbols */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_cyrl_uniranges[] = - { - AF_UNIRANGE_REC( 0x0400UL, 0x04FFUL ), /* Cyrillic */ - AF_UNIRANGE_REC( 0x0500UL, 0x052FUL ), /* Cyrillic Supplement */ - AF_UNIRANGE_REC( 0x2DE0UL, 0x2DFFUL ), /* Cyrillic Extended-A */ - AF_UNIRANGE_REC( 0xA640UL, 0xA69FUL ), /* Cyrillic Extended-B */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - /* there are some characters in the Devanagari Unicode block that are */ - /* generic to Indic scripts; we omit them so that their presence doesn't */ - /* trigger Devanagari */ - - const AF_Script_UniRangeRec af_deva_uniranges[] = - { - AF_UNIRANGE_REC( 0x0900UL, 0x093BUL ), /* Devanagari */ - /* omitting U+093C nukta */ - AF_UNIRANGE_REC( 0x093DUL, 0x0950UL ), - /* omitting U+0951 udatta, U+0952 anudatta */ - AF_UNIRANGE_REC( 0x0953UL, 0x0963UL ), - /* omitting U+0964 danda, U+0965 double danda */ - AF_UNIRANGE_REC( 0x0966UL, 0x097FUL ), - AF_UNIRANGE_REC( 0x20B9UL, 0x20B9UL ), /* (new) Rupee sign */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_grek_uniranges[] = - { - AF_UNIRANGE_REC( 0x0370UL, 0x03FFUL ), /* Greek and Coptic */ - AF_UNIRANGE_REC( 0x1F00UL, 0x1FFFUL ), /* Greek Extended */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_hebr_uniranges[] = - { - AF_UNIRANGE_REC( 0x0590UL, 0x05FFUL ), /* Hebrew */ - AF_UNIRANGE_REC( 0xFB1DUL, 0xFB4FUL ), /* Alphab. Present. Forms (Hebrew) */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_latn_uniranges[] = - { - AF_UNIRANGE_REC( 0x0020UL, 0x007FUL ), /* Basic Latin (no control chars) */ - AF_UNIRANGE_REC( 0x00A0UL, 0x00FFUL ), /* Latin-1 Supplement (no control chars) */ - AF_UNIRANGE_REC( 0x0100UL, 0x017FUL ), /* Latin Extended-A */ - AF_UNIRANGE_REC( 0x0180UL, 0x024FUL ), /* Latin Extended-B */ - AF_UNIRANGE_REC( 0x0250UL, 0x02AFUL ), /* IPA Extensions */ - AF_UNIRANGE_REC( 0x02B0UL, 0x02FFUL ), /* Spacing Modifier Letters */ - AF_UNIRANGE_REC( 0x0300UL, 0x036FUL ), /* Combining Diacritical Marks */ - AF_UNIRANGE_REC( 0x1D00UL, 0x1D7FUL ), /* Phonetic Extensions */ - AF_UNIRANGE_REC( 0x1D80UL, 0x1DBFUL ), /* Phonetic Extensions Supplement */ - AF_UNIRANGE_REC( 0x1DC0UL, 0x1DFFUL ), /* Combining Diacritical Marks Supplement */ - AF_UNIRANGE_REC( 0x1E00UL, 0x1EFFUL ), /* Latin Extended Additional */ - AF_UNIRANGE_REC( 0x2000UL, 0x206FUL ), /* General Punctuation */ - AF_UNIRANGE_REC( 0x2070UL, 0x209FUL ), /* Superscripts and Subscripts */ - AF_UNIRANGE_REC( 0x20A0UL, 0x20B8UL ), /* Currency Symbols ... */ - AF_UNIRANGE_REC( 0x20BAUL, 0x20CFUL ), /* ... except new Rupee sign */ - AF_UNIRANGE_REC( 0x2150UL, 0x218FUL ), /* Number Forms */ - AF_UNIRANGE_REC( 0x2460UL, 0x24FFUL ), /* Enclosed Alphanumerics */ - AF_UNIRANGE_REC( 0x2C60UL, 0x2C7FUL ), /* Latin Extended-C */ - AF_UNIRANGE_REC( 0x2E00UL, 0x2E7FUL ), /* Supplemental Punctuation */ - AF_UNIRANGE_REC( 0xA720UL, 0xA7FFUL ), /* Latin Extended-D */ - AF_UNIRANGE_REC( 0xFB00UL, 0xFB06UL ), /* Alphab. Present. Forms (Latin Ligs) */ - AF_UNIRANGE_REC( 0x1D400UL, 0x1D7FFUL ), /* Mathematical Alphanumeric Symbols */ - AF_UNIRANGE_REC( 0x1F100UL, 0x1F1FFUL ), /* Enclosed Alphanumeric Supplement */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_none_uniranges[] = - { - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_telu_uniranges[] = - { - AF_UNIRANGE_REC( 0x0C00UL, 0x0C7FUL ), /* Telugu */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_thai_uniranges[] = - { - AF_UNIRANGE_REC( 0x0E00UL, 0x0E7FUL ), /* Thai */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - -#ifdef AF_CONFIG_OPTION_INDIC - - const AF_Script_UniRangeRec af_beng_uniranges[] = - { - AF_UNIRANGE_REC( 0x0980UL, 0x09FFUL ), /* Bengali */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_gujr_uniranges[] = - { - AF_UNIRANGE_REC( 0x0A80UL, 0x0AFFUL ), /* Gujarati */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_guru_uniranges[] = - { - AF_UNIRANGE_REC( 0x0A00UL, 0x0A7FUL ), /* Gurmukhi */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_knda_uniranges[] = - { - AF_UNIRANGE_REC( 0x0C80UL, 0x0CFFUL ), /* Kannada */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_limb_uniranges[] = - { - AF_UNIRANGE_REC( 0x1900UL, 0x194FUL ), /* Limbu */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_mlym_uniranges[] = - { - AF_UNIRANGE_REC( 0x0D00UL, 0x0D7FUL ), /* Malayalam */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_orya_uniranges[] = - { - AF_UNIRANGE_REC( 0x0B00UL, 0x0B7FUL ), /* Oriya */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_sinh_uniranges[] = - { - AF_UNIRANGE_REC( 0x0D80UL, 0x0DFFUL ), /* Sinhala */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_sund_uniranges[] = - { - AF_UNIRANGE_REC( 0x1B80UL, 0x1BBFUL ), /* Sundanese */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_sylo_uniranges[] = - { - AF_UNIRANGE_REC( 0xA800UL, 0xA82FUL ), /* Syloti Nagri */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_taml_uniranges[] = - { - AF_UNIRANGE_REC( 0x0B80UL, 0x0BFFUL ), /* Tamil */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - const AF_Script_UniRangeRec af_tibt_uniranges[] = - { - AF_UNIRANGE_REC( 0x0F00UL, 0x0FFFUL ), /* Tibetan */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - -#endif /* !AF_CONFIG_OPTION_INDIC */ - -#ifdef AF_CONFIG_OPTION_CJK - - /* this corresponds to Unicode 6.0 */ - - const AF_Script_UniRangeRec af_hani_uniranges[] = - { - AF_UNIRANGE_REC( 0x1100UL, 0x11FFUL ), /* Hangul Jamo */ - AF_UNIRANGE_REC( 0x2E80UL, 0x2EFFUL ), /* CJK Radicals Supplement */ - AF_UNIRANGE_REC( 0x2F00UL, 0x2FDFUL ), /* Kangxi Radicals */ - AF_UNIRANGE_REC( 0x2FF0UL, 0x2FFFUL ), /* Ideographic Description Characters */ - AF_UNIRANGE_REC( 0x3000UL, 0x303FUL ), /* CJK Symbols and Punctuation */ - AF_UNIRANGE_REC( 0x3040UL, 0x309FUL ), /* Hiragana */ - AF_UNIRANGE_REC( 0x30A0UL, 0x30FFUL ), /* Katakana */ - AF_UNIRANGE_REC( 0x3100UL, 0x312FUL ), /* Bopomofo */ - AF_UNIRANGE_REC( 0x3130UL, 0x318FUL ), /* Hangul Compatibility Jamo */ - AF_UNIRANGE_REC( 0x3190UL, 0x319FUL ), /* Kanbun */ - AF_UNIRANGE_REC( 0x31A0UL, 0x31BFUL ), /* Bopomofo Extended */ - AF_UNIRANGE_REC( 0x31C0UL, 0x31EFUL ), /* CJK Strokes */ - AF_UNIRANGE_REC( 0x31F0UL, 0x31FFUL ), /* Katakana Phonetic Extensions */ - AF_UNIRANGE_REC( 0x3200UL, 0x32FFUL ), /* Enclosed CJK Letters and Months */ - AF_UNIRANGE_REC( 0x3300UL, 0x33FFUL ), /* CJK Compatibility */ - AF_UNIRANGE_REC( 0x3400UL, 0x4DBFUL ), /* CJK Unified Ideographs Extension A */ - AF_UNIRANGE_REC( 0x4DC0UL, 0x4DFFUL ), /* Yijing Hexagram Symbols */ - AF_UNIRANGE_REC( 0x4E00UL, 0x9FFFUL ), /* CJK Unified Ideographs */ - AF_UNIRANGE_REC( 0xA960UL, 0xA97FUL ), /* Hangul Jamo Extended-A */ - AF_UNIRANGE_REC( 0xAC00UL, 0xD7AFUL ), /* Hangul Syllables */ - AF_UNIRANGE_REC( 0xD7B0UL, 0xD7FFUL ), /* Hangul Jamo Extended-B */ - AF_UNIRANGE_REC( 0xF900UL, 0xFAFFUL ), /* CJK Compatibility Ideographs */ - AF_UNIRANGE_REC( 0xFE10UL, 0xFE1FUL ), /* Vertical forms */ - AF_UNIRANGE_REC( 0xFE30UL, 0xFE4FUL ), /* CJK Compatibility Forms */ - AF_UNIRANGE_REC( 0xFF00UL, 0xFFEFUL ), /* Halfwidth and Fullwidth Forms */ - AF_UNIRANGE_REC( 0x1B000UL, 0x1B0FFUL ), /* Kana Supplement */ - AF_UNIRANGE_REC( 0x1D300UL, 0x1D35FUL ), /* Tai Xuan Hing Symbols */ - AF_UNIRANGE_REC( 0x1F200UL, 0x1F2FFUL ), /* Enclosed Ideographic Supplement */ - AF_UNIRANGE_REC( 0x20000UL, 0x2A6DFUL ), /* CJK Unified Ideographs Extension B */ - AF_UNIRANGE_REC( 0x2A700UL, 0x2B73FUL ), /* CJK Unified Ideographs Extension C */ - AF_UNIRANGE_REC( 0x2B740UL, 0x2B81FUL ), /* CJK Unified Ideographs Extension D */ - AF_UNIRANGE_REC( 0x2F800UL, 0x2FA1FUL ), /* CJK Compatibility Ideographs Supplement */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - -#endif /* !AF_CONFIG_OPTION_CJK */ - -/* END */ diff --git a/3party/freetype/src/autofit/afranges.h b/3party/freetype/src/autofit/afranges.h deleted file mode 100644 index 7c78ab089e..0000000000 --- a/3party/freetype/src/autofit/afranges.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* afranges.h */ -/* */ -/* Auto-fitter Unicode script ranges (specification). */ -/* */ -/* Copyright 2013-2015 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 __AFRANGES_H__ -#define __AFRANGES_H__ - - -#include "aftypes.h" - - -FT_BEGIN_HEADER - -#undef SCRIPT -#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \ - extern const AF_Script_UniRangeRec af_ ## s ## _uniranges[]; - -#include "afscript.h" - - /* */ - -FT_END_HEADER - -#endif /* __AFRANGES_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afscript.h b/3party/freetype/src/autofit/afscript.h deleted file mode 100644 index dfcc8302aa..0000000000 --- a/3party/freetype/src/autofit/afscript.h +++ /dev/null @@ -1,149 +0,0 @@ -/***************************************************************************/ -/* */ -/* afscript.h */ -/* */ -/* Auto-fitter scripts (specification only). */ -/* */ -/* Copyright 2013-2015 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. */ -/* */ -/***************************************************************************/ - - - /* The following part can be included multiple times. */ - /* Define `SCRIPT' as needed. */ - - - /* Add new scripts here. The first and second arguments are the */ - /* script name in lowercase and uppercase, respectively, followed */ - /* by a description string. Then comes the corresponding HarfBuzz */ - /* script name tag, followed by a string of standard characters (to */ - /* derive the standard width and height of stems). */ - - SCRIPT( arab, ARAB, - "Arabic", - HB_SCRIPT_ARABIC, - 0x644, 0x62D, 0x640 ) /* ل ح ـ */ - - SCRIPT( cyrl, CYRL, - "Cyrillic", - HB_SCRIPT_CYRILLIC, - 0x43E, 0x41E, 0x0 ) /* оО */ - - SCRIPT( deva, DEVA, - "Devanagari", - HB_SCRIPT_DEVANAGARI, - 0x920, 0x935, 0x91F ) /* ठ व ट */ - - SCRIPT( grek, GREK, - "Greek", - HB_SCRIPT_GREEK, - 0x3BF, 0x39F, 0x0 ) /* οΟ */ - - SCRIPT( hebr, HEBR, - "Hebrew", - HB_SCRIPT_HEBREW, - 0x5DD, 0x0, 0x0 ) /* ם */ - - SCRIPT( latn, LATN, - "Latin", - HB_SCRIPT_LATIN, - 'o', 'O', '0' ) - - SCRIPT( none, NONE, - "no script", - HB_SCRIPT_INVALID, - 0x0, 0x0, 0x0 ) - - /* there are no simple forms for letters; we thus use two digit shapes */ - SCRIPT( telu, TELU, - "Telugu", - HB_SCRIPT_TELUGU, - 0xC66, 0xC67, 0x0 ) /* ౦ ౧ */ - - SCRIPT( thai, THAI, - "Thai", - HB_SCRIPT_THAI, - 0xE32, 0xE45, 0xE50 ) /* า ๅ ๐ */ - -#ifdef AF_CONFIG_OPTION_INDIC - - SCRIPT( beng, BENG, - "Bengali", - HB_SCRIPT_BENGALI, - 'o', 0x0, 0x0 ) /* XXX */ - - SCRIPT( gujr, GUJR, - "Gujarati", - HB_SCRIPT_GUJARATI, - 'o', 0x0, 0x0 ) /* XXX */ - - SCRIPT( guru, GURU, - "Gurmukhi", - HB_SCRIPT_GURMUKHI, - 'o', 0x0, 0x0 ) /* XXX */ - - SCRIPT( knda, KNDA, - "Kannada", - HB_SCRIPT_KANNADA, - 'o', 0x0, 0x0 ) /* XXX */ - - SCRIPT( limb, LIMB, - "Limbu", - HB_SCRIPT_LIMBU, - 'o', 0x0, 0x0 ) /* XXX */ - - SCRIPT( mlym, MLYM, - "Malayalam", - HB_SCRIPT_MALAYALAM, - 'o', 0x0, 0x0 ) /* XXX */ - - SCRIPT( orya, ORYA, - "Oriya", - HB_SCRIPT_ORIYA, - 'o', 0x0, 0x0 ) /* XXX */ - - SCRIPT( sinh, SINH, - "Sinhala", - HB_SCRIPT_SINHALA, - 'o', 0x0, 0x0 ) /* XXX */ - - SCRIPT( sund, SUND, - "Sundanese", - HB_SCRIPT_SUNDANESE, - 'o', 0x0, 0x0 ) /* XXX */ - - SCRIPT( sylo, SYLO, - "Syloti Nagri", - HB_SCRIPT_SYLOTI_NAGRI, - 'o', 0x0, 0x0 ) /* XXX */ - - SCRIPT( taml, TAML, - "Tamil", - HB_SCRIPT_TAMIL, - 'o', 0x0, 0x0 ) /* XXX */ - - SCRIPT( tibt, TIBT, - "Tibetan", - HB_SCRIPT_TIBETAN, - 'o', 0x0, 0x0 ) /* XXX */ - -#endif /* AF_CONFIG_OPTION_INDIC */ - -#ifdef AF_CONFIG_OPTION_CJK - - SCRIPT( hani, HANI, - "CJKV ideographs", - HB_SCRIPT_HAN, - 0x7530, 0x56D7, 0x0 ) /* 田囗 */ - -#endif /* AF_CONFIG_OPTION_CJK */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afstyles.h b/3party/freetype/src/autofit/afstyles.h deleted file mode 100644 index bfd5bb910f..0000000000 --- a/3party/freetype/src/autofit/afstyles.h +++ /dev/null @@ -1,179 +0,0 @@ -/***************************************************************************/ -/* */ -/* afstyles.h */ -/* */ -/* Auto-fitter styles (specification only). */ -/* */ -/* Copyright 2013-2015 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. */ -/* */ -/***************************************************************************/ - - - /* The following part can be included multiple times. */ - /* Define `STYLE' as needed. */ - - - /* Add new styles here. The first and second arguments are the */ - /* style name in lowercase and uppercase, respectively, followed */ - /* by a description string. The next arguments are the */ - /* corresponding writing system, script, blue stringset, and */ - /* coverage. */ - /* */ - /* Note that styles using `AF_COVERAGE_DEFAULT' should always */ - /* come after styles with other coverages. */ - /* */ - /* Example: */ - /* */ - /* STYLE( cyrl_dflt, CYRL_DFLT, */ - /* "Cyrillic default style", */ - /* AF_WRITING_SYSTEM_LATIN, */ - /* AF_SCRIPT_CYRL, */ - /* AF_BLUE_STRINGSET_CYRL, */ - /* AF_COVERAGE_DEFAULT ) */ - -#undef STYLE_LATIN -#define STYLE_LATIN( s, S, f, F, ds, df, C ) \ - STYLE( s ## _ ## f, S ## _ ## F, \ - ds " " df " style", \ - AF_WRITING_SYSTEM_LATIN, \ - AF_SCRIPT_ ## S, \ - AF_BLUE_STRINGSET_ ## S, \ - AF_COVERAGE_ ## C ) - -#undef META_STYLE_LATIN -#define META_STYLE_LATIN( s, S, ds ) \ - STYLE_LATIN( s, S, c2cp, C2CP, ds, \ - "petite capticals from capitals", \ - PETITE_CAPITALS_FROM_CAPITALS ) \ - STYLE_LATIN( s, S, c2sc, C2SC, ds, \ - "small capticals from capitals", \ - SMALL_CAPITALS_FROM_CAPITALS ) \ - STYLE_LATIN( s, S, ordn, ORDN, ds, \ - "ordinals", \ - ORDINALS ) \ - STYLE_LATIN( s, S, pcap, PCAP, ds, \ - "petite capitals", \ - PETITE_CAPITALS ) \ - STYLE_LATIN( s, S, sinf, SINF, ds, \ - "scientific inferiors", \ - SCIENTIFIC_INFERIORS ) \ - STYLE_LATIN( s, S, smcp, SMCP, ds, \ - "small capitals", \ - SMALL_CAPITALS ) \ - STYLE_LATIN( s, S, subs, SUBS, ds, \ - "subscript", \ - SUBSCRIPT ) \ - STYLE_LATIN( s, S, sups, SUPS, ds, \ - "superscript", \ - SUPERSCRIPT ) \ - STYLE_LATIN( s, S, titl, TITL, ds, \ - "titling", \ - TITLING ) \ - STYLE_LATIN( s, S, dflt, DFLT, ds, \ - "default", \ - DEFAULT ) - - - STYLE( arab_dflt, ARAB_DFLT, - "Arabic default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_ARAB, - AF_BLUE_STRINGSET_ARAB, - AF_COVERAGE_DEFAULT ) - - META_STYLE_LATIN( cyrl, CYRL, "Cyrillic" ) - - META_STYLE_LATIN( grek, GREK, "Greek" ) - - STYLE( hebr_dflt, HEBR_DFLT, - "Hebrew default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_HEBR, - AF_BLUE_STRINGSET_HEBR, - AF_COVERAGE_DEFAULT ) - META_STYLE_LATIN( latn, LATN, "Latin" ) - - STYLE( deva_dflt, DEVA_DFLT, - "Devanagari default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_DEVA, - AF_BLUE_STRINGSET_DEVA, - AF_COVERAGE_DEFAULT ) - -#ifdef FT_OPTION_AUTOFIT2 - STYLE( ltn2_dflt, LTN2_DFLT, - "Latin 2 default style", - AF_WRITING_SYSTEM_LATIN2, - AF_SCRIPT_LATN, - AF_BLUE_STRINGSET_LATN, - AF_COVERAGE_DEFAULT ) -#endif - - STYLE( none_dflt, NONE_DFLT, - "no style", - AF_WRITING_SYSTEM_DUMMY, - AF_SCRIPT_NONE, - (AF_Blue_Stringset)0, - AF_COVERAGE_DEFAULT ) - - STYLE( telu_dflt, TELU_DFLT, - "Telugu default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_TELU, - AF_BLUE_STRINGSET_TELU, - AF_COVERAGE_DEFAULT ) - - STYLE( thai_dflt, THAI_DFLT, - "Thai default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_THAI, - AF_BLUE_STRINGSET_THAI, - AF_COVERAGE_DEFAULT ) - -#ifdef AF_CONFIG_OPTION_INDIC - - /* no blue stringset support for the Indic writing system yet */ -#undef STYLE_DEFAULT_INDIC -#define STYLE_DEFAULT_INDIC( s, S, d ) \ - STYLE( s ## _dflt, S ## _DFLT, \ - d " default style", \ - AF_WRITING_SYSTEM_INDIC, \ - AF_SCRIPT_ ## S, \ - (AF_Blue_Stringset)0, \ - AF_COVERAGE_DEFAULT ) - - STYLE_DEFAULT_INDIC( beng, BENG, "Bengali" ) - STYLE_DEFAULT_INDIC( gujr, GUJR, "Gujarati" ) - STYLE_DEFAULT_INDIC( guru, GURU, "Gurmukhi" ) - STYLE_DEFAULT_INDIC( knda, KNDA, "Kannada" ) - STYLE_DEFAULT_INDIC( limb, LIMB, "Limbu" ) - STYLE_DEFAULT_INDIC( mlym, MLYM, "Malayalam" ) - STYLE_DEFAULT_INDIC( orya, ORYA, "Oriya" ) - STYLE_DEFAULT_INDIC( sinh, SINH, "Sinhala" ) - STYLE_DEFAULT_INDIC( sund, SUND, "Sundanese" ) - STYLE_DEFAULT_INDIC( sylo, SYLO, "Syloti Nagri" ) - STYLE_DEFAULT_INDIC( taml, TAML, "Tamil" ) - STYLE_DEFAULT_INDIC( tibt, TIBT, "Tibetan" ) - -#endif /* AF_CONFIG_OPTION_INDIC */ - -#ifdef AF_CONFIG_OPTION_CJK - - STYLE( hani_dflt, HANI_DFLT, - "CJKV ideographs default style", - AF_WRITING_SYSTEM_CJK, - AF_SCRIPT_HANI, - AF_BLUE_STRINGSET_HANI, - AF_COVERAGE_DEFAULT ) - -#endif /* AF_CONFIG_OPTION_CJK */ - - -/* END */ diff --git a/3party/freetype/src/autofit/aftypes.h b/3party/freetype/src/autofit/aftypes.h deleted file mode 100644 index fdf79783a6..0000000000 --- a/3party/freetype/src/autofit/aftypes.h +++ /dev/null @@ -1,633 +0,0 @@ -/***************************************************************************/ -/* */ -/* aftypes.h */ -/* */ -/* Auto-fitter types (specification only). */ -/* */ -/* Copyright 2003-2015 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. */ -/* */ -/***************************************************************************/ - - - /************************************************************************* - * - * The auto-fitter is a complete rewrite of the old auto-hinter. - * Its main feature is the ability to differentiate between different - * writing systems and scripts in order to apply specific rules. - * - * The code has also been compartmentized into several entities that - * should make algorithmic experimentation easier than with the old - * code. - * - *************************************************************************/ - - -#ifndef __AFTYPES_H__ -#define __AFTYPES_H__ - -#include <ft2build.h> - -#include FT_FREETYPE_H -#include FT_OUTLINE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H - -#include "afblue.h" - -#ifdef FT_DEBUG_AUTOFIT -#include FT_CONFIG_STANDARD_LIBRARY_H -#endif - - -FT_BEGIN_HEADER - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** D E B U G G I N G *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#ifdef FT_DEBUG_AUTOFIT - -extern int _af_debug_disable_horz_hints; -extern int _af_debug_disable_vert_hints; -extern int _af_debug_disable_blue_hints; -extern void* _af_debug_hints; - -#endif /* FT_DEBUG_AUTOFIT */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** U T I L I T Y S T U F F *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct AF_WidthRec_ - { - FT_Pos org; /* original position/width in font units */ - FT_Pos cur; /* current/scaled position/width in device sub-pixels */ - FT_Pos fit; /* current/fitted position/width in device sub-pixels */ - - } AF_WidthRec, *AF_Width; - - - FT_LOCAL( void ) - af_sort_pos( FT_UInt count, - FT_Pos* table ); - - FT_LOCAL( void ) - af_sort_and_quantize_widths( FT_UInt* count, - AF_Width widths, - FT_Pos threshold ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** A N G L E T Y P E S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * The auto-fitter doesn't need a very high angular accuracy; - * this allows us to speed up some computations considerably with a - * light Cordic algorithm (see afangles.c). - */ - - typedef FT_Int AF_Angle; - - -#define AF_ANGLE_PI 256 -#define AF_ANGLE_2PI ( AF_ANGLE_PI * 2 ) -#define AF_ANGLE_PI2 ( AF_ANGLE_PI / 2 ) -#define AF_ANGLE_PI4 ( AF_ANGLE_PI / 4 ) - - -#if 0 - /* - * compute the angle of a given 2-D vector - */ - FT_LOCAL( AF_Angle ) - af_angle_atan( FT_Pos dx, - FT_Pos dy ); - - - /* - * compute `angle2 - angle1'; the result is always within - * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1] - */ - FT_LOCAL( AF_Angle ) - af_angle_diff( AF_Angle angle1, - AF_Angle angle2 ); -#endif /* 0 */ - - -#define AF_ANGLE_DIFF( result, angle1, angle2 ) \ - FT_BEGIN_STMNT \ - AF_Angle _delta = (angle2) - (angle1); \ - \ - \ - while ( _delta <= -AF_ANGLE_PI ) \ - _delta += AF_ANGLE_2PI; \ - \ - while ( _delta > AF_ANGLE_PI ) \ - _delta -= AF_ANGLE_2PI; \ - \ - result = _delta; \ - FT_END_STMNT - - - /* opaque handle to glyph-specific hints -- see `afhints.h' for more - * details - */ - typedef struct AF_GlyphHintsRec_* AF_GlyphHints; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S C A L E R S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * A scaler models the target pixel device that will receive the - * auto-hinted glyph image. - */ - -#define AF_SCALER_FLAG_NO_HORIZONTAL 1U /* disable horizontal hinting */ -#define AF_SCALER_FLAG_NO_VERTICAL 2U /* disable vertical hinting */ -#define AF_SCALER_FLAG_NO_ADVANCE 4U /* disable advance hinting */ -#define AF_SCALER_FLAG_NO_WARPER 8U /* disable warper */ - - - typedef struct AF_ScalerRec_ - { - FT_Face face; /* source font face */ - FT_Fixed x_scale; /* from font units to 1/64th device pixels */ - FT_Fixed y_scale; /* from font units to 1/64th device pixels */ - FT_Pos x_delta; /* in 1/64th device pixels */ - FT_Pos y_delta; /* in 1/64th device pixels */ - FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */ - FT_UInt32 flags; /* additional control flags, see above */ - - } AF_ScalerRec, *AF_Scaler; - - -#define AF_SCALER_EQUAL_SCALES( a, b ) \ - ( (a)->x_scale == (b)->x_scale && \ - (a)->y_scale == (b)->y_scale && \ - (a)->x_delta == (b)->x_delta && \ - (a)->y_delta == (b)->y_delta ) - - - typedef struct AF_StyleMetricsRec_* AF_StyleMetrics; - - /* This function parses an FT_Face to compute global metrics for - * a specific style. - */ - typedef FT_Error - (*AF_WritingSystem_InitMetricsFunc)( AF_StyleMetrics metrics, - FT_Face face ); - - typedef void - (*AF_WritingSystem_ScaleMetricsFunc)( AF_StyleMetrics metrics, - AF_Scaler scaler ); - - typedef void - (*AF_WritingSystem_DoneMetricsFunc)( AF_StyleMetrics metrics ); - - - typedef FT_Error - (*AF_WritingSystem_InitHintsFunc)( AF_GlyphHints hints, - AF_StyleMetrics metrics ); - - typedef void - (*AF_WritingSystem_ApplyHintsFunc)( AF_GlyphHints hints, - FT_Outline* outline, - AF_StyleMetrics metrics ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** W R I T I N G S Y S T E M S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * For the auto-hinter, a writing system consists of multiple scripts that - * can be handled similarly *in a typographical way*; the relationship is - * not based on history. For example, both the Greek and the unrelated - * Armenian scripts share the same features like ascender, descender, - * x-height, etc. Essentially, a writing system is covered by a - * submodule of the auto-fitter; it contains - * - * - a specific global analyzer that computes global metrics specific to - * the script (based on script-specific characters to identify ascender - * height, x-height, etc.), - * - * - a specific glyph analyzer that computes segments and edges for each - * glyph covered by the script, - * - * - a specific grid-fitting algorithm that distorts the scaled glyph - * outline according to the results of the glyph analyzer. - */ - -#define __AFWRTSYS_H__ /* don't load header files */ -#undef WRITING_SYSTEM -#define WRITING_SYSTEM( ws, WS ) \ - AF_WRITING_SYSTEM_ ## WS, - - /* The list of known writing systems. */ - typedef enum AF_WritingSystem_ - { - -#include "afwrtsys.h" - - AF_WRITING_SYSTEM_MAX /* do not remove */ - - } AF_WritingSystem; - -#undef __AFWRTSYS_H__ - - - typedef struct AF_WritingSystemClassRec_ - { - AF_WritingSystem writing_system; - - FT_Offset style_metrics_size; - AF_WritingSystem_InitMetricsFunc style_metrics_init; - AF_WritingSystem_ScaleMetricsFunc style_metrics_scale; - AF_WritingSystem_DoneMetricsFunc style_metrics_done; - - AF_WritingSystem_InitHintsFunc style_hints_init; - AF_WritingSystem_ApplyHintsFunc style_hints_apply; - - } AF_WritingSystemClassRec; - - typedef const AF_WritingSystemClassRec* AF_WritingSystemClass; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S C R I P T S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * Each script is associated with a set of Unicode ranges that gets used - * to test whether the font face supports the script. - * - * We use four-letter script tags from the OpenType specification, - * extended by `NONE', which indicates `no script'. - */ - -#undef SCRIPT -#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \ - AF_SCRIPT_ ## S, - - /* The list of known scripts. */ - typedef enum AF_Script_ - { - -#include "afscript.h" - - AF_SCRIPT_MAX /* do not remove */ - - } AF_Script; - - - typedef struct AF_Script_UniRangeRec_ - { - FT_UInt32 first; - FT_UInt32 last; - - } AF_Script_UniRangeRec; - -#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) } - - typedef const AF_Script_UniRangeRec* AF_Script_UniRange; - - - typedef struct AF_ScriptClassRec_ - { - AF_Script script; - - AF_Script_UniRange script_uni_ranges; /* last must be { 0, 0 } */ - - FT_UInt32 standard_char1; /* for default width and height */ - FT_UInt32 standard_char2; /* ditto */ - FT_UInt32 standard_char3; /* ditto */ - - } AF_ScriptClassRec; - - typedef const AF_ScriptClassRec* AF_ScriptClass; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C O V E R A G E S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * Usually, a font contains more glyphs than can be addressed by its - * character map. - * - * In the PostScript font world, encoding vectors specific to a given - * task are used to select such glyphs, and these glyphs can be often - * recognized by having a suffix in its glyph names. For example, a - * superscript glyph `A' might be called `A.sup'. Unfortunately, this - * naming scheme is not standardized and thus unusable for us. - * - * In the OpenType world, a better solution was invented, namely - * `features', which cleanly separate a character's input encoding from - * the corresponding glyph's appearance, and which don't use glyph names - * at all. For our purposes, and slightly generalized, an OpenType - * feature is a name of a mapping that maps character codes to - * non-standard glyph indices (features get used for other things also). - * For example, the `sups' feature provides superscript glyphs, thus - * mapping character codes like `A' or `B' to superscript glyph - * representation forms. How this mapping happens is completely - * uninteresting to us. - * - * For the auto-hinter, a `coverage' represents all glyphs of an OpenType - * feature collected in a set (as listed below) that can be hinted - * together. To continue the above example, superscript glyphs must not - * be hinted together with normal glyphs because the blue zones - * completely differ. - * - * Note that FreeType itself doesn't compute coverages; it only provides - * the glyphs addressable by the default Unicode character map. Instead, - * we use the HarfBuzz library (if available), which has many functions - * exactly for this purpose. - * - * AF_COVERAGE_DEFAULT is special: It should cover everything that isn't - * listed separately (including the glyphs addressable by the character - * map). In case HarfBuzz isn't available, it exactly covers the glyphs - * addressable by the character map. - * - */ - -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - AF_COVERAGE_ ## NAME, - - - typedef enum AF_Coverage_ - { -#include "afcover.h" - - AF_COVERAGE_DEFAULT - - } AF_Coverage; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S T Y L E S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * The topmost structure for modelling the auto-hinter glyph input data - * is a `style class', grouping everything together. - */ - -#undef STYLE -#define STYLE( s, S, d, ws, sc, ss, c ) \ - AF_STYLE_ ## S, - - /* The list of known styles. */ - typedef enum AF_Style_ - { - -#include "afstyles.h" - - AF_STYLE_MAX /* do not remove */ - - } AF_Style; - - - typedef struct AF_StyleClassRec_ - { - AF_Style style; - - AF_WritingSystem writing_system; - AF_Script script; - AF_Blue_Stringset blue_stringset; - AF_Coverage coverage; - - } AF_StyleClassRec; - - typedef const AF_StyleClassRec* AF_StyleClass; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S T Y L E M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals; - - /* This is the main structure that combines everything. Autofit modules */ - /* specific to writing systems derive their structures from it, for */ - /* example `AF_LatinMetrics'. */ - - typedef struct AF_StyleMetricsRec_ - { - AF_StyleClass style_class; - AF_ScalerRec scaler; - FT_Bool digits_have_same_width; - - AF_FaceGlobals globals; /* to access properties */ - - } AF_StyleMetricsRec; - - - /* Declare and define vtables for classes */ -#ifndef FT_CONFIG_OPTION_PIC - -#define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class ) \ - FT_CALLBACK_TABLE const AF_WritingSystemClassRec \ - writing_system_class; - -#define AF_DEFINE_WRITING_SYSTEM_CLASS( \ - writing_system_class, \ - system, \ - m_size, \ - m_init, \ - m_scale, \ - m_done, \ - h_init, \ - h_apply ) \ - FT_CALLBACK_TABLE_DEF \ - const AF_WritingSystemClassRec writing_system_class = \ - { \ - system, \ - \ - m_size, \ - \ - m_init, \ - m_scale, \ - m_done, \ - \ - h_init, \ - h_apply \ - }; - - -#define AF_DECLARE_SCRIPT_CLASS( script_class ) \ - FT_CALLBACK_TABLE const AF_ScriptClassRec \ - script_class; - -#define AF_DEFINE_SCRIPT_CLASS( \ - script_class, \ - script, \ - ranges, \ - std_char1, \ - std_char2, \ - std_char3 ) \ - FT_CALLBACK_TABLE_DEF \ - const AF_ScriptClassRec script_class = \ - { \ - script, \ - ranges, \ - std_char1, \ - std_char2, \ - std_char3 \ - }; - - -#define AF_DECLARE_STYLE_CLASS( style_class ) \ - FT_CALLBACK_TABLE const AF_StyleClassRec \ - style_class; - -#define AF_DEFINE_STYLE_CLASS( \ - style_class, \ - style, \ - writing_system, \ - script, \ - blue_stringset, \ - coverage ) \ - FT_CALLBACK_TABLE_DEF \ - const AF_StyleClassRec style_class = \ - { \ - style, \ - writing_system, \ - script, \ - blue_stringset, \ - coverage \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class ) \ - FT_LOCAL( void ) \ - FT_Init_Class_ ## writing_system_class( AF_WritingSystemClassRec* ac ); - -#define AF_DEFINE_WRITING_SYSTEM_CLASS( \ - writing_system_class, \ - system, \ - m_size, \ - m_init, \ - m_scale, \ - m_done, \ - h_init, \ - h_apply ) \ - FT_LOCAL_DEF( void ) \ - FT_Init_Class_ ## writing_system_class( AF_WritingSystemClassRec* ac ) \ - { \ - ac->writing_system = system; \ - \ - ac->style_metrics_size = m_size; \ - \ - ac->style_metrics_init = m_init; \ - ac->style_metrics_scale = m_scale; \ - ac->style_metrics_done = m_done; \ - \ - ac->style_hints_init = h_init; \ - ac->style_hints_apply = h_apply; \ - } - - -#define AF_DECLARE_SCRIPT_CLASS( script_class ) \ - FT_LOCAL( void ) \ - FT_Init_Class_ ## script_class( AF_ScriptClassRec* ac ); - -#define AF_DEFINE_SCRIPT_CLASS( \ - script_class, \ - script_, \ - ranges, \ - std_char1, \ - std_char2, \ - std_char3 ) \ - FT_LOCAL_DEF( void ) \ - FT_Init_Class_ ## script_class( AF_ScriptClassRec* ac ) \ - { \ - ac->script = script_; \ - ac->script_uni_ranges = ranges; \ - ac->standard_char1 = std_char1; \ - ac->standard_char2 = std_char2; \ - ac->standard_char3 = std_char3; \ - } - - -#define AF_DECLARE_STYLE_CLASS( style_class ) \ - FT_LOCAL( void ) \ - FT_Init_Class_ ## style_class( AF_StyleClassRec* ac ); - -#define AF_DEFINE_STYLE_CLASS( \ - style_class, \ - style_, \ - writing_system_, \ - script_, \ - blue_stringset_, \ - coverage_ ) \ - FT_LOCAL_DEF( void ) \ - FT_Init_Class_ ## style_class( AF_StyleClassRec* ac ) \ - { \ - ac->style = style_; \ - ac->writing_system = writing_system_; \ - ac->script = script_; \ - ac->blue_stringset = blue_stringset_; \ - ac->coverage = coverage_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* */ - -FT_END_HEADER - -#endif /* __AFTYPES_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afwarp.c b/3party/freetype/src/autofit/afwarp.c deleted file mode 100644 index 59af4f02bd..0000000000 --- a/3party/freetype/src/autofit/afwarp.c +++ /dev/null @@ -1,374 +0,0 @@ -/***************************************************************************/ -/* */ -/* afwarp.c */ -/* */ -/* Auto-fitter warping algorithm (body). */ -/* */ -/* Copyright 2006-2015 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. */ -/* */ -/***************************************************************************/ - - - /* - * The idea of the warping code is to slightly scale and shift a glyph - * within a single dimension so that as much of its segments are aligned - * (more or less) on the grid. To find out the optimal scaling and - * shifting value, various parameter combinations are tried and scored. - */ - -#include "afwarp.h" - -#ifdef AF_CONFIG_OPTION_USE_WARPER - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_afwarp - - - /* The weights cover the range 0/64 - 63/64 of a pixel. Obviously, */ - /* values around a half pixel (which means exactly between two grid */ - /* lines) gets the worst weight. */ -#if 1 - static const AF_WarpScore - af_warper_weights[64] = - { - 35, 32, 30, 25, 20, 15, 12, 10, 5, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -1, -2, -5, -8,-10,-10,-20,-20,-30,-30, - - -30,-30,-20,-20,-10,-10, -8, -5, -2, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 5, 10, 12, 15, 20, 25, 30, 32, - }; -#else - static const AF_WarpScore - af_warper_weights[64] = - { - 30, 20, 10, 5, 4, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -1, -2, -2, -5, -5,-10,-10,-15,-20, - - -20,-15,-15,-10,-10, -5, -5, -2, -2, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 4, 5, 10, 20, - }; -#endif - - - /* Score segments for a given `scale' and `delta' in the range */ - /* `xx1' to `xx2', and store the best result in `warper'. If */ - /* the new best score is equal to the old one, prefer the */ - /* value with a smaller distortion (around `base_distort'). */ - - static void - af_warper_compute_line_best( AF_Warper warper, - FT_Fixed scale, - FT_Pos delta, - FT_Pos xx1, - FT_Pos xx2, - AF_WarpScore base_distort, - AF_Segment segments, - FT_Int num_segments ) - { - FT_Int idx_min, idx_max, idx0; - FT_Int nn; - AF_WarpScore scores[65]; - - - for ( nn = 0; nn < 65; nn++ ) - scores[nn] = 0; - - idx0 = xx1 - warper->t1; - - /* compute minimum and maximum indices */ - { - FT_Pos xx1min = warper->x1min; - FT_Pos xx1max = warper->x1max; - FT_Pos w = xx2 - xx1; - - - if ( xx1min + w < warper->x2min ) - xx1min = warper->x2min - w; - - xx1max = warper->x1max; - if ( xx1max + w > warper->x2max ) - xx1max = warper->x2max - w; - - idx_min = xx1min - warper->t1; - idx_max = xx1max - warper->t1; - - if ( idx_min < 0 || idx_min > idx_max || idx_max > 64 ) - { - FT_TRACE5(( "invalid indices:\n" - " min=%d max=%d, xx1=%ld xx2=%ld,\n" - " x1min=%ld x1max=%ld, x2min=%ld x2max=%ld\n", - idx_min, idx_max, xx1, xx2, - warper->x1min, warper->x1max, - warper->x2min, warper->x2max )); - return; - } - } - - for ( nn = 0; nn < num_segments; nn++ ) - { - FT_Pos len = segments[nn].max_coord - segments[nn].min_coord; - FT_Pos y0 = FT_MulFix( segments[nn].pos, scale ) + delta; - FT_Pos y = y0 + ( idx_min - idx0 ); - FT_Int idx; - - - /* score the length of the segments for the given range */ - for ( idx = idx_min; idx <= idx_max; idx++, y++ ) - scores[idx] += af_warper_weights[y & 63] * len; - } - - /* find best score */ - { - FT_Int idx; - - - for ( idx = idx_min; idx <= idx_max; idx++ ) - { - AF_WarpScore score = scores[idx]; - AF_WarpScore distort = base_distort + ( idx - idx0 ); - - - if ( score > warper->best_score || - ( score == warper->best_score && - distort < warper->best_distort ) ) - { - warper->best_score = score; - warper->best_distort = distort; - warper->best_scale = scale; - warper->best_delta = delta + ( idx - idx0 ); - } - } - } - } - - - /* Compute optimal scaling and delta values for a given glyph and */ - /* dimension. */ - - FT_LOCAL_DEF( void ) - af_warper_compute( AF_Warper warper, - AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed *a_scale, - FT_Pos *a_delta ) - { - AF_AxisHints axis; - AF_Point points; - - FT_Fixed org_scale; - FT_Pos org_delta; - - FT_Int nn, num_points, num_segments; - FT_Int X1, X2; - FT_Int w; - - AF_WarpScore base_distort; - AF_Segment segments; - - - /* get original scaling transformation */ - if ( dim == AF_DIMENSION_VERT ) - { - org_scale = hints->y_scale; - org_delta = hints->y_delta; - } - else - { - org_scale = hints->x_scale; - org_delta = hints->x_delta; - } - - warper->best_scale = org_scale; - warper->best_delta = org_delta; - warper->best_score = INT_MIN; - warper->best_distort = 0; - - axis = &hints->axis[dim]; - segments = axis->segments; - num_segments = axis->num_segments; - points = hints->points; - num_points = hints->num_points; - - *a_scale = org_scale; - *a_delta = org_delta; - - /* get X1 and X2, minimum and maximum in original coordinates */ - if ( num_segments < 1 ) - return; - -#if 1 - X1 = X2 = points[0].fx; - for ( nn = 1; nn < num_points; nn++ ) - { - FT_Int X = points[nn].fx; - - - if ( X < X1 ) - X1 = X; - if ( X > X2 ) - X2 = X; - } -#else - X1 = X2 = segments[0].pos; - for ( nn = 1; nn < num_segments; nn++ ) - { - FT_Int X = segments[nn].pos; - - - if ( X < X1 ) - X1 = X; - if ( X > X2 ) - X2 = X; - } -#endif - - if ( X1 >= X2 ) - return; - - warper->x1 = FT_MulFix( X1, org_scale ) + org_delta; - warper->x2 = FT_MulFix( X2, org_scale ) + org_delta; - - warper->t1 = AF_WARPER_FLOOR( warper->x1 ); - warper->t2 = AF_WARPER_CEIL( warper->x2 ); - - /* examine a half pixel wide range around the maximum coordinates */ - warper->x1min = warper->x1 & ~31; - warper->x1max = warper->x1min + 32; - warper->x2min = warper->x2 & ~31; - warper->x2max = warper->x2min + 32; - - if ( warper->x1max > warper->x2 ) - warper->x1max = warper->x2; - - if ( warper->x2min < warper->x1 ) - warper->x2min = warper->x1; - - warper->w0 = warper->x2 - warper->x1; - - if ( warper->w0 <= 64 ) - { - warper->x1max = warper->x1; - warper->x2min = warper->x2; - } - - /* examine (at most) a pixel wide range around the natural width */ - warper->wmin = warper->x2min - warper->x1max; - warper->wmax = warper->x2max - warper->x1min; - -#if 1 - /* some heuristics to reduce the number of widths to be examined */ - { - int margin = 16; - - - if ( warper->w0 <= 128 ) - { - margin = 8; - if ( warper->w0 <= 96 ) - margin = 4; - } - - if ( warper->wmin < warper->w0 - margin ) - warper->wmin = warper->w0 - margin; - - if ( warper->wmax > warper->w0 + margin ) - warper->wmax = warper->w0 + margin; - } - - if ( warper->wmin < warper->w0 * 3 / 4 ) - warper->wmin = warper->w0 * 3 / 4; - - if ( warper->wmax > warper->w0 * 5 / 4 ) - warper->wmax = warper->w0 * 5 / 4; -#else - /* no scaling, just translation */ - warper->wmin = warper->wmax = warper->w0; -#endif - - for ( w = warper->wmin; w <= warper->wmax; w++ ) - { - FT_Fixed new_scale; - FT_Pos new_delta; - FT_Pos xx1, xx2; - - - /* compute min and max positions for given width, */ - /* assuring that they stay within the coordinate ranges */ - xx1 = warper->x1; - xx2 = warper->x2; - if ( w >= warper->w0 ) - { - xx1 -= w - warper->w0; - if ( xx1 < warper->x1min ) - { - xx2 += warper->x1min - xx1; - xx1 = warper->x1min; - } - } - else - { - xx1 -= w - warper->w0; - if ( xx1 > warper->x1max ) - { - xx2 -= xx1 - warper->x1max; - xx1 = warper->x1max; - } - } - - if ( xx1 < warper->x1 ) - base_distort = warper->x1 - xx1; - else - base_distort = xx1 - warper->x1; - - if ( xx2 < warper->x2 ) - base_distort += warper->x2 - xx2; - else - base_distort += xx2 - warper->x2; - - /* give base distortion a greater weight while scoring */ - base_distort *= 10; - - new_scale = org_scale + FT_DivFix( w - warper->w0, X2 - X1 ); - new_delta = xx1 - FT_MulFix( X1, new_scale ); - - af_warper_compute_line_best( warper, new_scale, new_delta, xx1, xx2, - base_distort, - segments, num_segments ); - } - - { - FT_Fixed best_scale = warper->best_scale; - FT_Pos best_delta = warper->best_delta; - - - hints->xmin_delta = FT_MulFix( X1, best_scale - org_scale ) - + best_delta; - hints->xmax_delta = FT_MulFix( X2, best_scale - org_scale ) - + best_delta; - - *a_scale = best_scale; - *a_delta = best_delta; - } - } - -#else /* !AF_CONFIG_OPTION_USE_WARPER */ - - /* ANSI C doesn't like empty source files */ - typedef int _af_warp_dummy; - -#endif /* !AF_CONFIG_OPTION_USE_WARPER */ - -/* END */ diff --git a/3party/freetype/src/autofit/afwarp.h b/3party/freetype/src/autofit/afwarp.h deleted file mode 100644 index 6069b6b277..0000000000 --- a/3party/freetype/src/autofit/afwarp.h +++ /dev/null @@ -1,64 +0,0 @@ -/***************************************************************************/ -/* */ -/* afwarp.h */ -/* */ -/* Auto-fitter warping algorithm (specification). */ -/* */ -/* Copyright 2006-2015 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 __AFWARP_H__ -#define __AFWARP_H__ - -#include "afhints.h" - -FT_BEGIN_HEADER - -#define AF_WARPER_SCALE - -#define AF_WARPER_FLOOR( x ) ( (x) & ~FT_TYPEOF( x )63 ) -#define AF_WARPER_CEIL( x ) AF_WARPER_FLOOR( (x) + 63 ) - - - typedef FT_Int32 AF_WarpScore; - - typedef struct AF_WarperRec_ - { - FT_Pos x1, x2; - FT_Pos t1, t2; - FT_Pos x1min, x1max; - FT_Pos x2min, x2max; - FT_Pos w0, wmin, wmax; - - FT_Fixed best_scale; - FT_Pos best_delta; - AF_WarpScore best_score; - AF_WarpScore best_distort; - - } AF_WarperRec, *AF_Warper; - - - FT_LOCAL( void ) - af_warper_compute( AF_Warper warper, - AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed *a_scale, - FT_Fixed *a_delta ); - - -FT_END_HEADER - - -#endif /* __AFWARP_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/afwrtsys.h b/3party/freetype/src/autofit/afwrtsys.h deleted file mode 100644 index 4aa89d2356..0000000000 --- a/3party/freetype/src/autofit/afwrtsys.h +++ /dev/null @@ -1,52 +0,0 @@ -/***************************************************************************/ -/* */ -/* afwrtsys.h */ -/* */ -/* Auto-fitter writing systems (specification only). */ -/* */ -/* Copyright 2013-2015 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 __AFWRTSYS_H__ -#define __AFWRTSYS_H__ - - /* Since preprocessor directives can't create other preprocessor */ - /* directives, we have to include the header files manually. */ - -#include "afdummy.h" -#include "aflatin.h" -#include "afcjk.h" -#include "afindic.h" -#ifdef FT_OPTION_AUTOFIT2 -#include "aflatin2.h" -#endif - -#endif /* __AFWRTSYS_H__ */ - - - /* The following part can be included multiple times. */ - /* Define `WRITING_SYSTEM' as needed. */ - - - /* Add new writing systems here. The arguments are the writing system */ - /* name in lowercase and uppercase, respectively. */ - - WRITING_SYSTEM( dummy, DUMMY ) - WRITING_SYSTEM( latin, LATIN ) - WRITING_SYSTEM( cjk, CJK ) - WRITING_SYSTEM( indic, INDIC ) -#ifdef FT_OPTION_AUTOFIT2 - WRITING_SYSTEM( latin2, LATIN2 ) -#endif - - -/* END */ diff --git a/3party/freetype/src/autofit/autofit.c b/3party/freetype/src/autofit/autofit.c deleted file mode 100644 index b6ed4a0ff1..0000000000 --- a/3party/freetype/src/autofit/autofit.c +++ /dev/null @@ -1,46 +0,0 @@ -/***************************************************************************/ -/* */ -/* autofit.c */ -/* */ -/* Auto-fitter module (body). */ -/* */ -/* Copyright 2003-2015 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. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT -#include <ft2build.h> -#include "afpic.c" -#include "afangles.c" -#include "afblue.c" -#include "afglobal.c" -#include "afhints.c" - -#include "afranges.c" - -#include "afdummy.c" -#include "aflatin.c" -#ifdef FT_OPTION_AUTOFIT2 -#include "aflatin2.c" -#endif -#include "afcjk.c" -#include "afindic.c" - -#include "hbshim.c" - -#include "afloader.c" -#include "afmodule.c" - -#ifdef AF_CONFIG_OPTION_USE_WARPER -#include "afwarp.c" -#endif - -/* END */ diff --git a/3party/freetype/src/autofit/hbshim.c b/3party/freetype/src/autofit/hbshim.c deleted file mode 100644 index c9c1db0be1..0000000000 --- a/3party/freetype/src/autofit/hbshim.c +++ /dev/null @@ -1,546 +0,0 @@ -/***************************************************************************/ -/* */ -/* hbshim.c */ -/* */ -/* HarfBuzz interface for accessing OpenType features (body). */ -/* */ -/* Copyright 2013-2015 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 <ft2build.h> -#include FT_FREETYPE_H -#include "afglobal.h" -#include "aftypes.h" -#include "hbshim.h" - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_afharfbuzz - - - /* - * We use `sets' (in the HarfBuzz sense, which comes quite near to the - * usual mathematical meaning) to manage both lookups and glyph indices. - * - * 1. For each coverage, collect lookup IDs in a set. Note that an - * auto-hinter `coverage' is represented by one `feature', and a - * feature consists of an arbitrary number of (font specific) `lookup's - * that actually do the mapping job. Please check the OpenType - * specification for more details on features and lookups. - * - * 2. Create glyph ID sets from the corresponding lookup sets. - * - * 3. The glyph set corresponding to AF_COVERAGE_DEFAULT is computed - * with all lookups specific to the OpenType script activated. It - * relies on the order of AF_DEFINE_STYLE_CLASS entries so that - * special coverages (like `oldstyle figures') don't get overwritten. - * - */ - - - /* load coverage tags */ -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - static const hb_tag_t name ## _coverage[] = \ - { \ - HB_TAG( tag1, tag2, tag3, tag4 ), \ - HB_TAG_NONE \ - }; - - -#include "afcover.h" - - - /* define mapping between coverage tags and AF_Coverage */ -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - name ## _coverage, - - - static const hb_tag_t* coverages[] = - { -#include "afcover.h" - - NULL /* AF_COVERAGE_DEFAULT */ - }; - - - /* load HarfBuzz script tags */ -#undef SCRIPT -#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) h, - - - static const hb_script_t scripts[] = - { -#include "afscript.h" - }; - - - FT_Error - af_get_coverage( AF_FaceGlobals globals, - AF_StyleClass style_class, - FT_Byte* gstyles ) - { - hb_face_t* face; - - hb_set_t* gsub_lookups; /* GSUB lookups for a given script */ - hb_set_t* gsub_glyphs; /* glyphs covered by GSUB lookups */ - hb_set_t* gpos_lookups; /* GPOS lookups for a given script */ - hb_set_t* gpos_glyphs; /* glyphs covered by GPOS lookups */ - - hb_script_t script; - const hb_tag_t* coverage_tags; - hb_tag_t script_tags[] = { HB_TAG_NONE, - HB_TAG_NONE, - HB_TAG_NONE, - HB_TAG_NONE }; - - hb_codepoint_t idx; -#ifdef FT_DEBUG_LEVEL_TRACE - int count; -#endif - - - if ( !globals || !style_class || !gstyles ) - return FT_THROW( Invalid_Argument ); - - face = hb_font_get_face( globals->hb_font ); - - gsub_lookups = hb_set_create(); - gsub_glyphs = hb_set_create(); - gpos_lookups = hb_set_create(); - gpos_glyphs = hb_set_create(); - - coverage_tags = coverages[style_class->coverage]; - script = scripts[style_class->script]; - - /* Convert a HarfBuzz script tag into the corresponding OpenType */ - /* tag or tags -- some Indic scripts like Devanagari have an old */ - /* and a new set of features. */ - hb_ot_tags_from_script( script, - &script_tags[0], - &script_tags[1] ); - - /* `hb_ot_tags_from_script' usually returns HB_OT_TAG_DEFAULT_SCRIPT */ - /* as the second tag. We change that to HB_TAG_NONE except for the */ - /* default script. */ - if ( style_class->script == globals->module->default_script && - style_class->coverage == AF_COVERAGE_DEFAULT ) - { - if ( script_tags[0] == HB_TAG_NONE ) - script_tags[0] = HB_OT_TAG_DEFAULT_SCRIPT; - else - { - if ( script_tags[1] == HB_TAG_NONE ) - script_tags[1] = HB_OT_TAG_DEFAULT_SCRIPT; - else if ( script_tags[1] != HB_OT_TAG_DEFAULT_SCRIPT ) - script_tags[2] = HB_OT_TAG_DEFAULT_SCRIPT; - } - } - else - { - if ( script_tags[1] == HB_OT_TAG_DEFAULT_SCRIPT ) - script_tags[1] = HB_TAG_NONE; - } - - hb_ot_layout_collect_lookups( face, - HB_OT_TAG_GSUB, - script_tags, - NULL, - coverage_tags, - gsub_lookups ); - - if ( hb_set_is_empty( gsub_lookups ) ) - goto Exit; /* nothing to do */ - - hb_ot_layout_collect_lookups( face, - HB_OT_TAG_GPOS, - script_tags, - NULL, - coverage_tags, - gpos_lookups ); - - FT_TRACE4(( "GSUB lookups (style `%s'):\n" - " ", - af_style_names[style_class->style] )); - -#ifdef FT_DEBUG_LEVEL_TRACE - count = 0; -#endif - - for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, &idx ); ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( " %d", idx )); - count++; -#endif - - /* get output coverage of GSUB feature */ - hb_ot_layout_lookup_collect_glyphs( face, - HB_OT_TAG_GSUB, - idx, - NULL, - NULL, - NULL, - gsub_glyphs ); - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !count ) - FT_TRACE4(( " (none)" )); - FT_TRACE4(( "\n\n" )); -#endif - - FT_TRACE4(( "GPOS lookups (style `%s'):\n" - " ", - af_style_names[style_class->style] )); - -#ifdef FT_DEBUG_LEVEL_TRACE - count = 0; -#endif - - for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gpos_lookups, &idx ); ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( " %d", idx )); - count++; -#endif - - /* get input coverage of GPOS feature */ - hb_ot_layout_lookup_collect_glyphs( face, - HB_OT_TAG_GPOS, - idx, - NULL, - gpos_glyphs, - NULL, - NULL ); - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !count ) - FT_TRACE4(( " (none)" )); - FT_TRACE4(( "\n\n" )); -#endif - - /* - * We now check whether we can construct blue zones, using glyphs - * covered by the feature only. In case there is not a single zone - * (this is, not a single character is covered), we skip this coverage. - * - */ - if ( style_class->coverage != AF_COVERAGE_DEFAULT ) - { - AF_Blue_Stringset bss = style_class->blue_stringset; - const AF_Blue_StringRec* bs = &af_blue_stringsets[bss]; - - FT_Bool found = 0; - - - for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ ) - { - const char* p = &af_blue_strings[bs->string]; - - - while ( *p ) - { - hb_codepoint_t ch; - - - GET_UTF8_CHAR( ch, p ); - - for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, - &idx ); ) - { - hb_codepoint_t gidx = FT_Get_Char_Index( globals->face, ch ); - - - if ( hb_ot_layout_lookup_would_substitute( face, idx, - &gidx, 1, 1 ) ) - { - found = 1; - break; - } - } - } - } - - if ( !found ) - { - FT_TRACE4(( " no blue characters found; style skipped\n" )); - goto Exit; - } - } - - /* - * Various OpenType features might use the same glyphs at different - * vertical positions; for example, superscript and subscript glyphs - * could be the same. However, the auto-hinter is completely - * agnostic of OpenType features after the feature analysis has been - * completed: The engine then simply receives a glyph index and returns a - * hinted and usually rendered glyph. - * - * Consider the superscript feature of font `pala.ttf': Some of the - * glyphs are `real', this is, they have a zero vertical offset, but - * most of them are small caps glyphs shifted up to the superscript - * position (this is, the `sups' feature is present in both the GSUB and - * GPOS tables). The code for blue zones computation actually uses a - * feature's y offset so that the `real' glyphs get correct hints. But - * later on it is impossible to decide whether a glyph index belongs to, - * say, the small caps or superscript feature. - * - * For this reason, we don't assign a style to a glyph if the current - * feature covers the glyph in both the GSUB and the GPOS tables. This - * is quite a broad condition, assuming that - * - * (a) glyphs that get used in multiple features are present in a - * feature without vertical shift, - * - * and - * - * (b) a feature's GPOS data really moves the glyph vertically. - * - * Not fulfilling condition (a) makes a font larger; it would also - * reduce the number of glyphs that could be addressed directly without - * using OpenType features, so this assumption is rather strong. - * - * Condition (b) is much weaker, and there might be glyphs which get - * missed. However, the OpenType features we are going to handle are - * primarily located in GSUB, and HarfBuzz doesn't provide an API to - * directly get the necessary information from the GPOS table. A - * possible solution might be to directly parse the GPOS table to find - * out whether a glyph gets shifted vertically, but this is something I - * would like to avoid if not really necessary. - * - * Note that we don't follow this logic for the default coverage. - * Complex scripts like Devanagari have mandatory GPOS features to - * position many glyph elements, using mark-to-base or mark-to-ligature - * tables; the number of glyphs missed due to condition (b) would be far - * too large. - * - */ - if ( style_class->coverage != AF_COVERAGE_DEFAULT ) - hb_set_subtract( gsub_glyphs, gpos_glyphs ); - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( " glyphs without GPOS data (`*' means already assigned)" )); - count = 0; -#endif - - for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_glyphs, &idx ); ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !( count % 10 ) ) - FT_TRACE4(( "\n" - " " )); - - FT_TRACE4(( " %d", idx )); - count++; -#endif - - /* glyph indices returned by `hb_ot_layout_lookup_collect_glyphs' */ - /* can be arbitrary: some fonts use fake indices for processing */ - /* internal to GSUB or GPOS, which is fully valid */ - if ( idx >= (hb_codepoint_t)globals->glyph_count ) - continue; - - if ( gstyles[idx] == AF_STYLE_UNASSIGNED ) - gstyles[idx] = (FT_Byte)style_class->style; -#ifdef FT_DEBUG_LEVEL_TRACE - else - FT_TRACE4(( "*" )); -#endif - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !count ) - FT_TRACE4(( "\n" - " (none)" )); - FT_TRACE4(( "\n\n" )); -#endif - - Exit: - hb_set_destroy( gsub_lookups ); - hb_set_destroy( gsub_glyphs ); - hb_set_destroy( gpos_lookups ); - hb_set_destroy( gpos_glyphs ); - - return FT_Err_Ok; - } - - - /* construct HarfBuzz features */ -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - static const hb_feature_t name ## _feature[] = \ - { \ - { \ - HB_TAG( tag1, tag2, tag3, tag4 ), \ - 1, 0, (unsigned int)-1 \ - } \ - }; - - -#include "afcover.h" - - - /* define mapping between HarfBuzz features and AF_Coverage */ -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - name ## _feature, - - - static const hb_feature_t* features[] = - { -#include "afcover.h" - - NULL /* AF_COVERAGE_DEFAULT */ - }; - - - FT_Error - af_get_char_index( AF_StyleMetrics metrics, - FT_ULong charcode, - FT_ULong *codepoint, - FT_Long *y_offset ) - { - AF_StyleClass style_class; - - const hb_feature_t* feature; - - FT_ULong in_idx, out_idx; - - - if ( !metrics ) - return FT_THROW( Invalid_Argument ); - - in_idx = FT_Get_Char_Index( metrics->globals->face, charcode ); - - style_class = metrics->style_class; - - feature = features[style_class->coverage]; - - if ( feature ) - { - FT_Int upem = (FT_Int)metrics->globals->face->units_per_EM; - - hb_font_t* font = metrics->globals->hb_font; - hb_buffer_t* buf = hb_buffer_create(); - - uint32_t c = (uint32_t)charcode; - - hb_glyph_info_t* ginfo; - hb_glyph_position_t* gpos; - unsigned int gcount; - - - /* we shape at a size of units per EM; this means font units */ - hb_font_set_scale( font, upem, upem ); - - /* XXX: is this sufficient for a single character of any script? */ - hb_buffer_set_direction( buf, HB_DIRECTION_LTR ); - hb_buffer_set_script( buf, scripts[style_class->script] ); - - /* we add one character to `buf' ... */ - hb_buffer_add_utf32( buf, &c, 1, 0, 1 ); - - /* ... and apply one feature */ - hb_shape( font, buf, feature, 1 ); - - ginfo = hb_buffer_get_glyph_infos( buf, &gcount ); - gpos = hb_buffer_get_glyph_positions( buf, &gcount ); - - out_idx = ginfo[0].codepoint; - - /* getting the same index indicates no substitution, */ - /* which means that the glyph isn't available in the feature */ - if ( in_idx == out_idx ) - { - *codepoint = 0; - *y_offset = 0; - } - else - { - *codepoint = out_idx; - *y_offset = gpos[0].y_offset; - } - - hb_buffer_destroy( buf ); - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( gcount > 1 ) - FT_TRACE1(( "af_get_char_index:" - " input character mapped to multiple glyphs\n" )); -#endif - } - else - { - *codepoint = in_idx; - *y_offset = 0; - } - - return FT_Err_Ok; - } - - -#else /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ - - - FT_Error - af_get_coverage( AF_FaceGlobals globals, - AF_StyleClass style_class, - FT_Byte* gstyles ) - { - FT_UNUSED( globals ); - FT_UNUSED( style_class ); - FT_UNUSED( gstyles ); - - return FT_Err_Ok; - } - - - FT_Error - af_get_char_index( AF_StyleMetrics metrics, - FT_ULong charcode, - FT_ULong *codepoint, - FT_Long *y_offset ) - { - FT_Face face; - - - if ( !metrics ) - return FT_THROW( Invalid_Argument ); - - face = metrics->globals->face; - - *codepoint = FT_Get_Char_Index( face, charcode ); - *y_offset = 0; - - return FT_Err_Ok; - } - - -#endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/hbshim.h b/3party/freetype/src/autofit/hbshim.h deleted file mode 100644 index 5636ca6494..0000000000 --- a/3party/freetype/src/autofit/hbshim.h +++ /dev/null @@ -1,56 +0,0 @@ -/***************************************************************************/ -/* */ -/* hbshim.h */ -/* */ -/* HarfBuzz interface for accessing OpenType features (specification). */ -/* */ -/* Copyright 2013-2015 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 __HBSHIM_H__ -#define __HBSHIM_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - -#include <hb.h> -#include <hb-ot.h> -#include <hb-ft.h> - -#endif - - -FT_BEGIN_HEADER - - FT_Error - af_get_coverage( AF_FaceGlobals globals, - AF_StyleClass style_class, - FT_Byte* gstyles ); - - FT_Error - af_get_char_index( AF_StyleMetrics metrics, - FT_ULong charcode, - FT_ULong *codepoint, - FT_Long *y_offset ); - - /* */ - -FT_END_HEADER - -#endif /* __HBSHIM_H__ */ - - -/* END */ diff --git a/3party/freetype/src/autofit/module.mk b/3party/freetype/src/autofit/module.mk deleted file mode 100644 index 33214387f5..0000000000 --- a/3party/freetype/src/autofit/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 auto-fitter module definition -# - - -# Copyright 2003-2015 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. - - -FTMODULE_H_COMMANDS += AUTOFIT_MODULE - -define AUTOFIT_MODULE -$(OPEN_DRIVER) FT_Module_Class, autofit_module_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)autofit $(ECHO_DRIVER_DESC)automatic hinting module$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/autofit/rules.mk b/3party/freetype/src/autofit/rules.mk deleted file mode 100644 index 6ef959f1ba..0000000000 --- a/3party/freetype/src/autofit/rules.mk +++ /dev/null @@ -1,89 +0,0 @@ -# -# FreeType 2 auto-fitter module configuration rules -# - - -# Copyright 2003-2015 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. - - -# AUTOF driver directory -# -AUTOF_DIR := $(SRC_DIR)/autofit - - -# compilation flags for the driver -# -AUTOF_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(AUTOF_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# AUTOF driver sources (i.e., C files) -# -AUTOF_DRV_SRC := $(AUTOF_DIR)/afangles.c \ - $(AUTOF_DIR)/afblue.c \ - $(AUTOF_DIR)/afcjk.c \ - $(AUTOF_DIR)/afdummy.c \ - $(AUTOF_DIR)/afglobal.c \ - $(AUTOF_DIR)/afhints.c \ - $(AUTOF_DIR)/afindic.c \ - $(AUTOF_DIR)/aflatin.c \ - $(AUTOF_DIR)/afloader.c \ - $(AUTOF_DIR)/afmodule.c \ - $(AUTOF_DIR)/afpic.c \ - $(AUTOF_DIR)/afranges.c \ - $(AUTOF_DIR)/afwarp.c \ - $(AUTOF_DIR)/hbshim.c - -# AUTOF driver headers -# -AUTOF_DRV_H := $(AUTOF_DRV_SRC:%c=%h) \ - $(AUTOF_DIR)/afcover.h \ - $(AUTOF_DIR)/aferrors.h \ - $(AUTOF_DIR)/afscript.h \ - $(AUTOF_DIR)/afstyles.h \ - $(AUTOF_DIR)/aftypes.h \ - $(AUTOF_DIR)/afwrtsys.h - - -# AUTOF driver object(s) -# -# AUTOF_DRV_OBJ_M is used during `multi' builds. -# AUTOF_DRV_OBJ_S is used during `single' builds. -# -AUTOF_DRV_OBJ_M := $(AUTOF_DRV_SRC:$(AUTOF_DIR)/%.c=$(OBJ_DIR)/%.$O) -AUTOF_DRV_OBJ_S := $(OBJ_DIR)/autofit.$O - -# AUTOF driver source file for single build -# -AUTOF_DRV_SRC_S := $(AUTOF_DIR)/autofit.c - - -# AUTOF driver - single object -# -$(AUTOF_DRV_OBJ_S): $(AUTOF_DRV_SRC_S) $(AUTOF_DRV_SRC) \ - $(FREETYPE_H) $(AUTOF_DRV_H) - $(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(AUTOF_DRV_SRC_S)) - - -# AUTOF driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(AUTOF_DIR)/%.c $(FREETYPE_H) $(AUTOF_DRV_H) - $(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(AUTOF_DRV_OBJ_S) -DRV_OBJS_M += $(AUTOF_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/base/Jamfile b/3party/freetype/src/base/Jamfile deleted file mode 100644 index e39fb096b2..0000000000 --- a/3party/freetype/src/base/Jamfile +++ /dev/null @@ -1,87 +0,0 @@ -# FreeType 2 src/base Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) base ; - - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = basepic - ftadvanc - ftcalc - ftdbgmem - ftgloadr - ftobjs - ftoutln - ftpic - ftrfork - ftsnames - ftstream - fttrigon - ftutil - ; - } - else - { - _sources = ftbase ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# Add the optional/replaceable files. -# -{ - local _sources = ftapi - ftbbox - ftbdf - ftbitmap - ftcid - ftdebug - ftfntfmt - ftfstype - ftgasp - ftglyph - ftgxval - ftinit - ftlcdfil - ftmm - ftotval - ftpatent - ftpfr - ftstroke - ftsynth - ftsystem - fttype1 - ftwinfnt - ; - - Library $(FT2_LIB) : $(_sources).c ; -} - -# Add Macintosh-specific file to the library when necessary. -# -if $(MAC) -{ - Library $(FT2_LIB) : ftmac.c ; -} -else if $(OS) = MACOSX -{ - if $(FT2_MULTI) - { - Library $(FT2_LIB) : ftmac.c ; - } -} - -# end of src/base Jamfile diff --git a/3party/freetype/src/base/basepic.c b/3party/freetype/src/base/basepic.c deleted file mode 100644 index 9850ed96a4..0000000000 --- a/3party/freetype/src/base/basepic.c +++ /dev/null @@ -1,108 +0,0 @@ -/***************************************************************************/ -/* */ -/* basepic.c */ -/* */ -/* The FreeType position independent code services for base. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "basepic.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from ftglyph.c */ - void - FT_Init_Class_ft_outline_glyph_class( FT_Glyph_Class* clazz ); - - void - FT_Init_Class_ft_bitmap_glyph_class( FT_Glyph_Class* clazz ); - -#ifdef FT_CONFIG_OPTION_MAC_FONTS - /* forward declaration of PIC init function from ftrfork.c */ - /* (not modularized) */ - void - FT_Init_Table_ft_raccess_guess_table( ft_raccess_guess_rec* record ); -#endif - - /* forward declaration of PIC init functions from ftinit.c */ - FT_Error - ft_create_default_module_classes( FT_Library library ); - - void - ft_destroy_default_module_classes( FT_Library library ); - - - void - ft_base_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->base ) - { - /* destroy default module classes */ - /* (in case FT_Add_Default_Modules was used) */ - ft_destroy_default_module_classes( library ); - - FT_FREE( pic_container->base ); - pic_container->base = NULL; - } - } - - - FT_Error - ft_base_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - BasePIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->base = container; - - /* initialize default modules list and pointers */ - error = ft_create_default_module_classes( library ); - if ( error ) - goto Exit; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - FT_Init_Class_ft_outline_glyph_class( - &container->ft_outline_glyph_class ); - FT_Init_Class_ft_bitmap_glyph_class( - &container->ft_bitmap_glyph_class ); -#ifdef FT_CONFIG_OPTION_MAC_FONTS - FT_Init_Table_ft_raccess_guess_table( - (ft_raccess_guess_rec*)&container->ft_raccess_guess_table ); -#endif - - Exit: - if ( error ) - ft_base_pic_free( library ); - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/3party/freetype/src/base/basepic.h b/3party/freetype/src/base/basepic.h deleted file mode 100644 index c5d7cbf5ab..0000000000 --- a/3party/freetype/src/base/basepic.h +++ /dev/null @@ -1,91 +0,0 @@ -/***************************************************************************/ -/* */ -/* basepic.h */ -/* */ -/* The FreeType position independent code services for base. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 __BASEPIC_H__ -#define __BASEPIC_H__ - - -#include FT_INTERNAL_PIC_H - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_OUTLINE_GLYPH_CLASS_GET &ft_outline_glyph_class -#define FT_BITMAP_GLYPH_CLASS_GET &ft_bitmap_glyph_class -#define FT_DEFAULT_MODULES_GET ft_default_modules - -#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK -#define FT_RACCESS_GUESS_TABLE_GET ft_raccess_guess_table -#endif - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_GLYPH_H - -#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK -#include FT_INTERNAL_RFORK_H -#endif - - -FT_BEGIN_HEADER - - typedef struct BasePIC_ - { - FT_Module_Class** default_module_classes; - FT_Glyph_Class ft_outline_glyph_class; - FT_Glyph_Class ft_bitmap_glyph_class; - -#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK - ft_raccess_guess_rec ft_raccess_guess_table[FT_RACCESS_N_RULES]; -#endif - - } BasePIC; - - -#define GET_PIC( lib ) ( (BasePIC*)( (lib)->pic_container.base ) ) - -#define FT_OUTLINE_GLYPH_CLASS_GET \ - ( &GET_PIC( library )->ft_outline_glyph_class ) -#define FT_BITMAP_GLYPH_CLASS_GET \ - ( &GET_PIC( library )->ft_bitmap_glyph_class ) -#define FT_DEFAULT_MODULES_GET \ - ( GET_PIC( library )->default_module_classes ) - -#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK -#define FT_RACCESS_GUESS_TABLE_GET \ - ( GET_PIC( library )->ft_raccess_guess_table ) -#endif - - - /* see basepic.c for the implementation */ - void - ft_base_pic_free( FT_Library library ); - - FT_Error - ft_base_pic_init( FT_Library library ); - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* __BASEPIC_H__ */ - - -/* END */ diff --git a/3party/freetype/src/base/ftadvanc.c b/3party/freetype/src/base/ftadvanc.c deleted file mode 100644 index f12908f518..0000000000 --- a/3party/freetype/src/base/ftadvanc.c +++ /dev/null @@ -1,168 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftadvanc.c */ -/* */ -/* Quick computation of advance widths (body). */ -/* */ -/* Copyright 2008-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H - -#include FT_ADVANCES_H -#include FT_INTERNAL_OBJECTS_H - - - static FT_Error - _ft_face_scale_advances( FT_Face face, - FT_Fixed* advances, - FT_UInt count, - FT_Int32 flags ) - { - FT_Fixed scale; - FT_UInt nn; - - - if ( flags & FT_LOAD_NO_SCALE ) - return FT_Err_Ok; - - if ( face->size == NULL ) - return FT_THROW( Invalid_Size_Handle ); - - if ( flags & FT_LOAD_VERTICAL_LAYOUT ) - scale = face->size->metrics.y_scale; - else - scale = face->size->metrics.x_scale; - - /* this must be the same scaling as to get linear{Hori,Vert}Advance */ - /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c) */ - - for ( nn = 0; nn < count; nn++ ) - advances[nn] = FT_MulDiv( advances[nn], scale, 64 ); - - return FT_Err_Ok; - } - - - /* at the moment, we can perform fast advance retrieval only in */ - /* the following cases: */ - /* */ - /* - unscaled load */ - /* - unhinted load */ - /* - light-hinted load */ - -#define LOAD_ADVANCE_FAST_CHECK( flags ) \ - ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) || \ - FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT ) - - - /* documentation is in ftadvanc.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Advance( FT_Face face, - FT_UInt gindex, - FT_Int32 flags, - FT_Fixed *padvance ) - { - FT_Face_GetAdvancesFunc func; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !padvance ) - return FT_THROW( Invalid_Argument ); - - if ( gindex >= (FT_UInt)face->num_glyphs ) - return FT_THROW( Invalid_Glyph_Index ); - - func = face->driver->clazz->get_advances; - if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) ) - { - FT_Error error; - - - error = func( face, gindex, 1, flags, padvance ); - if ( !error ) - return _ft_face_scale_advances( face, padvance, 1, flags ); - - if ( FT_ERR_NEQ( error, Unimplemented_Feature ) ) - return error; - } - - return FT_Get_Advances( face, gindex, 1, flags, padvance ); - } - - - /* documentation is in ftadvanc.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Advances( FT_Face face, - FT_UInt start, - FT_UInt count, - FT_Int32 flags, - FT_Fixed *padvances ) - { - FT_Face_GetAdvancesFunc func; - FT_UInt num, end, nn; - FT_Error error = FT_Err_Ok; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !padvances ) - return FT_THROW( Invalid_Argument ); - - num = (FT_UInt)face->num_glyphs; - end = start + count; - if ( start >= num || end < start || end > num ) - return FT_THROW( Invalid_Glyph_Index ); - - if ( count == 0 ) - return FT_Err_Ok; - - func = face->driver->clazz->get_advances; - if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) ) - { - error = func( face, start, count, flags, padvances ); - if ( !error ) - return _ft_face_scale_advances( face, padvances, count, flags ); - - if ( FT_ERR_NEQ( error, Unimplemented_Feature ) ) - return error; - } - - error = FT_Err_Ok; - - if ( flags & FT_ADVANCE_FLAG_FAST_ONLY ) - return FT_THROW( Unimplemented_Feature ); - - flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; - for ( nn = 0; nn < count; nn++ ) - { - error = FT_Load_Glyph( face, start + nn, flags ); - if ( error ) - break; - - /* scale from 26.6 to 16.16 */ - padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) - ? face->glyph->advance.y << 10 - : face->glyph->advance.x << 10; - } - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftapi.c b/3party/freetype/src/base/ftapi.c deleted file mode 100644 index f22a181b59..0000000000 --- a/3party/freetype/src/base/ftapi.c +++ /dev/null @@ -1,121 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftapi.c */ -/* */ -/* The FreeType compatibility functions (body). */ -/* */ -/* Copyright 2002-2015 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 <ft2build.h> -#include FT_LIST_H -#include FT_OUTLINE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TABLES_H -#include FT_OUTLINE_H - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** C O M P A T I B I L I T Y ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /* backwards compatibility API */ - - FT_BASE_DEF( void ) - FT_New_Memory_Stream( FT_Library library, - FT_Byte* base, - FT_ULong size, - FT_Stream stream ) - { - FT_UNUSED( library ); - - FT_Stream_OpenMemory( stream, base, size ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Seek_Stream( FT_Stream stream, - FT_ULong pos ) - { - return FT_Stream_Seek( stream, pos ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Skip_Stream( FT_Stream stream, - FT_Long distance ) - { - return FT_Stream_Skip( stream, distance ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Read_Stream( FT_Stream stream, - FT_Byte* buffer, - FT_ULong count ) - { - return FT_Stream_Read( stream, buffer, count ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Read_Stream_At( FT_Stream stream, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ) - { - return FT_Stream_ReadAt( stream, pos, buffer, count ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Extract_Frame( FT_Stream stream, - FT_ULong count, - FT_Byte** pbytes ) - { - return FT_Stream_ExtractFrame( stream, count, pbytes ); - } - - - FT_BASE_DEF( void ) - FT_Release_Frame( FT_Stream stream, - FT_Byte** pbytes ) - { - FT_Stream_ReleaseFrame( stream, pbytes ); - } - - FT_BASE_DEF( FT_Error ) - FT_Access_Frame( FT_Stream stream, - FT_ULong count ) - { - return FT_Stream_EnterFrame( stream, count ); - } - - - FT_BASE_DEF( void ) - FT_Forget_Frame( FT_Stream stream ) - { - FT_Stream_ExitFrame( stream ); - } - - -/* END */ diff --git a/3party/freetype/src/base/ftbase.c b/3party/freetype/src/base/ftbase.c deleted file mode 100644 index 253dfb7236..0000000000 --- a/3party/freetype/src/base/ftbase.c +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbase.c */ -/* */ -/* Single object library component (body only). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include "ftpic.c" -#include "basepic.c" -#include "ftadvanc.c" -#include "ftcalc.c" -#include "ftdbgmem.c" -#include "ftgloadr.c" -#include "ftobjs.c" -#include "ftoutln.c" -#include "ftrfork.c" -#include "ftsnames.c" -#include "ftstream.c" -#include "fttrigon.c" -#include "ftutil.c" - -#ifdef FT_MACINTOSH -#include "ftmac.c" -#endif - -/* END */ diff --git a/3party/freetype/src/base/ftbase.h b/3party/freetype/src/base/ftbase.h deleted file mode 100644 index cb57f96864..0000000000 --- a/3party/freetype/src/base/ftbase.h +++ /dev/null @@ -1,69 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbase.h */ -/* */ -/* The FreeType private functions used in base module (specification). */ -/* */ -/* Copyright 2008-2015 by */ -/* David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya. */ -/* */ -/* 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 __FTBASE_H__ -#define __FTBASE_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H - - -FT_BEGIN_HEADER - - - /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */ - /* font, and try to load a face specified by the face_index. */ - FT_LOCAL( FT_Error ) - open_face_PS_from_sfnt_stream( FT_Library library, - FT_Stream stream, - FT_Long face_index, - FT_Int num_params, - FT_Parameter *params, - FT_Face *aface ); - - - /* Create a new FT_Face given a buffer and a driver name. */ - /* From ftmac.c. */ - FT_LOCAL( FT_Error ) - open_face_from_buffer( FT_Library library, - FT_Byte* base, - FT_ULong size, - FT_Long face_index, - const char* driver_name, - FT_Face *aface ); - - -#if defined( FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK ) && \ - !defined( FT_MACINTOSH ) - /* Mac OS X/Darwin kernel often changes recommended method to access */ - /* the resource fork and older methods makes the kernel issue the */ - /* warning of deprecated method. To calm it down, the methods based */ - /* on Darwin VFS should be grouped and skip the rest methods after */ - /* the case the resource is opened but found to lack a font in it. */ - FT_LOCAL( FT_Bool ) - ft_raccess_rule_by_darwin_vfs( FT_Library library, FT_UInt rule_index ); -#endif - - -FT_END_HEADER - -#endif /* __FTBASE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/base/ftbbox.c b/3party/freetype/src/base/ftbbox.c deleted file mode 100644 index 10df98de6a..0000000000 --- a/3party/freetype/src/base/ftbbox.c +++ /dev/null @@ -1,509 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbbox.c */ -/* */ -/* FreeType bbox computation (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This component has a _single_ role: to compute exact outline bounding */ - /* boxes. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H - -#include FT_BBOX_H -#include FT_IMAGE_H -#include FT_OUTLINE_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_OBJECTS_H - - - typedef struct TBBox_Rec_ - { - FT_Vector last; - FT_BBox bbox; - - } TBBox_Rec; - - -#define FT_UPDATE_BBOX( p, bbox ) \ - FT_BEGIN_STMNT \ - if ( p->x < bbox.xMin ) \ - bbox.xMin = p->x; \ - if ( p->x > bbox.xMax ) \ - bbox.xMax = p->x; \ - if ( p->y < bbox.yMin ) \ - bbox.yMin = p->y; \ - if ( p->y > bbox.yMax ) \ - bbox.yMax = p->y; \ - FT_END_STMNT - -#define CHECK_X( p, bbox ) \ - ( p->x < bbox.xMin || p->x > bbox.xMax ) - -#define CHECK_Y( p, bbox ) \ - ( p->y < bbox.yMin || p->y > bbox.yMax ) - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* BBox_Move_To */ - /* */ - /* <Description> */ - /* This function is used as a `move_to' emitter during */ - /* FT_Outline_Decompose(). It simply records the destination point */ - /* in `user->last'. We also update bbox in case contour starts with */ - /* an implicit `on' point. */ - /* */ - /* <Input> */ - /* to :: A pointer to the destination vector. */ - /* */ - /* <InOut> */ - /* user :: A pointer to the current walk context. */ - /* */ - /* <Return> */ - /* Always 0. Needed for the interface only. */ - /* */ - static int - BBox_Move_To( FT_Vector* to, - TBBox_Rec* user ) - { - FT_UPDATE_BBOX( to, user->bbox ); - - user->last = *to; - - return 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* BBox_Line_To */ - /* */ - /* <Description> */ - /* This function is used as a `line_to' emitter during */ - /* FT_Outline_Decompose(). It simply records the destination point */ - /* in `user->last'; no further computations are necessary because */ - /* bbox already contains both explicit ends of the line segment. */ - /* */ - /* <Input> */ - /* to :: A pointer to the destination vector. */ - /* */ - /* <InOut> */ - /* user :: A pointer to the current walk context. */ - /* */ - /* <Return> */ - /* Always 0. Needed for the interface only. */ - /* */ - static int - BBox_Line_To( FT_Vector* to, - TBBox_Rec* user ) - { - user->last = *to; - - return 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* BBox_Conic_Check */ - /* */ - /* <Description> */ - /* Find the extrema of a 1-dimensional conic Bezier curve and update */ - /* a bounding range. This version uses direct computation, as it */ - /* doesn't need square roots. */ - /* */ - /* <Input> */ - /* y1 :: The start coordinate. */ - /* */ - /* y2 :: The coordinate of the control point. */ - /* */ - /* y3 :: The end coordinate. */ - /* */ - /* <InOut> */ - /* min :: The address of the current minimum. */ - /* */ - /* max :: The address of the current maximum. */ - /* */ - static void - BBox_Conic_Check( FT_Pos y1, - FT_Pos y2, - FT_Pos y3, - FT_Pos* min, - FT_Pos* max ) - { - /* This function is only called when a control off-point is outside */ - /* the bbox that contains all on-points. It finds a local extremum */ - /* within the segment, equal to (y1*y3 - y2*y2)/(y1 - 2*y2 + y3). */ - /* Or, offsetting from y2, we get */ - - y1 -= y2; - y3 -= y2; - y2 += FT_MulDiv( y1, y3, y1 + y3 ); - - if ( y2 < *min ) - *min = y2; - if ( y2 > *max ) - *max = y2; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* BBox_Conic_To */ - /* */ - /* <Description> */ - /* This function is used as a `conic_to' emitter during */ - /* FT_Outline_Decompose(). It checks a conic Bezier curve with the */ - /* current bounding box, and computes its extrema if necessary to */ - /* update it. */ - /* */ - /* <Input> */ - /* control :: A pointer to a control point. */ - /* */ - /* to :: A pointer to the destination vector. */ - /* */ - /* <InOut> */ - /* user :: The address of the current walk context. */ - /* */ - /* <Return> */ - /* Always 0. Needed for the interface only. */ - /* */ - /* <Note> */ - /* In the case of a non-monotonous arc, we compute directly the */ - /* extremum coordinates, as it is sufficiently fast. */ - /* */ - static int - BBox_Conic_To( FT_Vector* control, - FT_Vector* to, - TBBox_Rec* user ) - { - /* in case `to' is implicit and not included in bbox yet */ - FT_UPDATE_BBOX( to, user->bbox ); - - if ( CHECK_X( control, user->bbox ) ) - BBox_Conic_Check( user->last.x, - control->x, - to->x, - &user->bbox.xMin, - &user->bbox.xMax ); - - if ( CHECK_Y( control, user->bbox ) ) - BBox_Conic_Check( user->last.y, - control->y, - to->y, - &user->bbox.yMin, - &user->bbox.yMax ); - - user->last = *to; - - return 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* BBox_Cubic_Check */ - /* */ - /* <Description> */ - /* Find the extrema of a 1-dimensional cubic Bezier curve and */ - /* update a bounding range. This version uses iterative splitting */ - /* because it is faster than the exact solution with square roots. */ - /* */ - /* <Input> */ - /* p1 :: The start coordinate. */ - /* */ - /* p2 :: The coordinate of the first control point. */ - /* */ - /* p3 :: The coordinate of the second control point. */ - /* */ - /* p4 :: The end coordinate. */ - /* */ - /* <InOut> */ - /* min :: The address of the current minimum. */ - /* */ - /* max :: The address of the current maximum. */ - /* */ - static FT_Pos - cubic_peak( FT_Pos q1, - FT_Pos q2, - FT_Pos q3, - FT_Pos q4 ) - { - FT_Pos peak = 0; - FT_Int shift; - - - /* This function finds a peak of a cubic segment if it is above 0 */ - /* using iterative bisection of the segment, or returns 0. */ - /* The fixed-point arithmetic of bisection is inherently stable */ - /* but may loose accuracy in the two lowest bits. To compensate, */ - /* we upscale the segment if there is room. Large values may need */ - /* to be downscaled to avoid overflows during bisection. */ - /* It is called with either q2 or q3 positive, which is necessary */ - /* for the peak to exist and avoids undefined FT_MSB. */ - - shift = 27 - FT_MSB( (FT_UInt32)( FT_ABS( q1 ) | - FT_ABS( q2 ) | - FT_ABS( q3 ) | - FT_ABS( q4 ) ) ); - - if ( shift > 0 ) - { - /* upscaling too much just wastes time */ - if ( shift > 2 ) - shift = 2; - - q1 <<= shift; - q2 <<= shift; - q3 <<= shift; - q4 <<= shift; - } - else - { - q1 >>= -shift; - q2 >>= -shift; - q3 >>= -shift; - q4 >>= -shift; - } - - /* for a peak to exist above 0, the cubic segment must have */ - /* at least one of its control off-points above 0. */ - while ( q2 > 0 || q3 > 0 ) - { - /* determine which half contains the maximum and split */ - if ( q1 + q2 > q3 + q4 ) /* first half */ - { - q4 = q4 + q3; - q3 = q3 + q2; - q2 = q2 + q1; - q4 = q4 + q3; - q3 = q3 + q2; - q4 = ( q4 + q3 ) / 8; - q3 = q3 / 4; - q2 = q2 / 2; - } - else /* second half */ - { - q1 = q1 + q2; - q2 = q2 + q3; - q3 = q3 + q4; - q1 = q1 + q2; - q2 = q2 + q3; - q1 = ( q1 + q2 ) / 8; - q2 = q2 / 4; - q3 = q3 / 2; - } - - /* check whether either end reached the maximum */ - if ( q1 == q2 && q1 >= q3 ) - { - peak = q1; - break; - } - if ( q3 == q4 && q2 <= q4 ) - { - peak = q4; - break; - } - } - - if ( shift > 0 ) - peak >>= shift; - else - peak <<= -shift; - - return peak; - } - - - static void - BBox_Cubic_Check( FT_Pos p1, - FT_Pos p2, - FT_Pos p3, - FT_Pos p4, - FT_Pos* min, - FT_Pos* max ) - { - /* This function is only called when a control off-point is outside */ - /* the bbox that contains all on-points. So at least one of the */ - /* conditions below holds and cubic_peak is called with at least one */ - /* non-zero argument. */ - - if ( p2 > *max || p3 > *max ) - *max += cubic_peak( p1 - *max, p2 - *max, p3 - *max, p4 - *max ); - - /* now flip the signs to update the minimum */ - if ( p2 < *min || p3 < *min ) - *min -= cubic_peak( *min - p1, *min - p2, *min - p3, *min - p4 ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* BBox_Cubic_To */ - /* */ - /* <Description> */ - /* This function is used as a `cubic_to' emitter during */ - /* FT_Outline_Decompose(). It checks a cubic Bezier curve with the */ - /* current bounding box, and computes its extrema if necessary to */ - /* update it. */ - /* */ - /* <Input> */ - /* control1 :: A pointer to the first control point. */ - /* */ - /* control2 :: A pointer to the second control point. */ - /* */ - /* to :: A pointer to the destination vector. */ - /* */ - /* <InOut> */ - /* user :: The address of the current walk context. */ - /* */ - /* <Return> */ - /* Always 0. Needed for the interface only. */ - /* */ - /* <Note> */ - /* In the case of a non-monotonous arc, we don't compute directly */ - /* extremum coordinates, we subdivide instead. */ - /* */ - static int - BBox_Cubic_To( FT_Vector* control1, - FT_Vector* control2, - FT_Vector* to, - TBBox_Rec* user ) - { - /* We don't need to check `to' since it is always an on-point, */ - /* thus within the bbox. Only segments with an off-point outside */ - /* the bbox can possibly reach new extreme values. */ - - if ( CHECK_X( control1, user->bbox ) || - CHECK_X( control2, user->bbox ) ) - BBox_Cubic_Check( user->last.x, - control1->x, - control2->x, - to->x, - &user->bbox.xMin, - &user->bbox.xMax ); - - if ( CHECK_Y( control1, user->bbox ) || - CHECK_Y( control2, user->bbox ) ) - BBox_Cubic_Check( user->last.y, - control1->y, - control2->y, - to->y, - &user->bbox.yMin, - &user->bbox.yMax ); - - user->last = *to; - - return 0; - } - - - FT_DEFINE_OUTLINE_FUNCS(bbox_interface, - (FT_Outline_MoveTo_Func) BBox_Move_To, - (FT_Outline_LineTo_Func) BBox_Line_To, - (FT_Outline_ConicTo_Func)BBox_Conic_To, - (FT_Outline_CubicTo_Func)BBox_Cubic_To, - 0, 0 - ) - - - /* documentation is in ftbbox.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Get_BBox( FT_Outline* outline, - FT_BBox *abbox ) - { - FT_BBox cbox = { 0x7FFFFFFFL, 0x7FFFFFFFL, - -0x7FFFFFFFL, -0x7FFFFFFFL }; - FT_BBox bbox = { 0x7FFFFFFFL, 0x7FFFFFFFL, - -0x7FFFFFFFL, -0x7FFFFFFFL }; - FT_Vector* vec; - FT_UShort n; - - - if ( !abbox ) - return FT_THROW( Invalid_Argument ); - - if ( !outline ) - return FT_THROW( Invalid_Outline ); - - /* if outline is empty, return (0,0,0,0) */ - if ( outline->n_points == 0 || outline->n_contours <= 0 ) - { - abbox->xMin = abbox->xMax = 0; - abbox->yMin = abbox->yMax = 0; - return 0; - } - - /* We compute the control box as well as the bounding box of */ - /* all `on' points in the outline. Then, if the two boxes */ - /* coincide, we exit immediately. */ - - vec = outline->points; - - for ( n = 0; n < outline->n_points; n++ ) - { - FT_UPDATE_BBOX( vec, cbox); - - if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON ) - FT_UPDATE_BBOX( vec, bbox); - - vec++; - } - - /* test two boxes for equality */ - if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax || - cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax ) - { - /* the two boxes are different, now walk over the outline to */ - /* get the Bezier arc extrema. */ - - FT_Error error; - TBBox_Rec user; - -#ifdef FT_CONFIG_OPTION_PIC - FT_Outline_Funcs bbox_interface; - Init_Class_bbox_interface(&bbox_interface); -#endif - - user.bbox = bbox; - - error = FT_Outline_Decompose( outline, &bbox_interface, &user ); - if ( error ) - return error; - - *abbox = user.bbox; - } - else - *abbox = bbox; - - return FT_Err_Ok; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftbdf.c b/3party/freetype/src/base/ftbdf.c deleted file mode 100644 index aa72ddcdf9..0000000000 --- a/3party/freetype/src/base/ftbdf.c +++ /dev/null @@ -1,91 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbdf.c */ -/* */ -/* FreeType API for accessing BDF-specific strings (body). */ -/* */ -/* Copyright 2002-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H - -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_BDF_H - - - /* documentation is in ftbdf.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_BDF_Charset_ID( FT_Face face, - const char* *acharset_encoding, - const char* *acharset_registry ) - { - FT_Error error; - const char* encoding = NULL; - const char* registry = NULL; - - FT_Service_BDF service; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - FT_FACE_FIND_SERVICE( face, service, BDF ); - - if ( service && service->get_charset_id ) - error = service->get_charset_id( face, &encoding, ®istry ); - else - error = FT_THROW( Invalid_Argument ); - - if ( acharset_encoding ) - *acharset_encoding = encoding; - - if ( acharset_registry ) - *acharset_registry = registry; - - return error; - } - - - /* documentation is in ftbdf.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_BDF_Property( FT_Face face, - const char* prop_name, - BDF_PropertyRec *aproperty ) - { - FT_Error error; - - FT_Service_BDF service; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !aproperty ) - return FT_THROW( Invalid_Argument ); - - aproperty->type = BDF_PROPERTY_TYPE_NONE; - - FT_FACE_FIND_SERVICE( face, service, BDF ); - - if ( service && service->get_property ) - error = service->get_property( face, prop_name, aproperty ); - else - error = FT_THROW( Invalid_Argument ); - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftbitmap.c b/3party/freetype/src/base/ftbitmap.c deleted file mode 100644 index a54572aaa2..0000000000 --- a/3party/freetype/src/base/ftbitmap.c +++ /dev/null @@ -1,809 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbitmap.c */ -/* */ -/* FreeType utility functions for bitmaps (body). */ -/* */ -/* Copyright 2004-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H - -#include FT_BITMAP_H -#include FT_IMAGE_H -#include FT_INTERNAL_OBJECTS_H - - - static - const FT_Bitmap null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 }; - - - /* documentation is in ftbitmap.h */ - - FT_EXPORT_DEF( void ) - FT_Bitmap_Init( FT_Bitmap *abitmap ) - { - if ( abitmap ) - *abitmap = null_bitmap; - } - - - /* deprecated function name; retained for ABI compatibility */ - - FT_EXPORT_DEF( void ) - FT_Bitmap_New( FT_Bitmap *abitmap ) - { - if ( abitmap ) - *abitmap = null_bitmap; - } - - - /* documentation is in ftbitmap.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Bitmap_Copy( FT_Library library, - const FT_Bitmap *source, - FT_Bitmap *target) - { - FT_Memory memory; - FT_Error error = FT_Err_Ok; - - FT_Int pitch; - FT_ULong size; - - FT_Int source_pitch_sign, target_pitch_sign; - - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - if ( !source || !target ) - return FT_THROW( Invalid_Argument ); - - if ( source == target ) - return FT_Err_Ok; - - source_pitch_sign = source->pitch < 0 ? -1 : 1; - target_pitch_sign = target->pitch < 0 ? -1 : 1; - - if ( source->buffer == NULL ) - { - *target = *source; - if ( source_pitch_sign != target_pitch_sign ) - target->pitch = -target->pitch; - - return FT_Err_Ok; - } - - memory = library->memory; - pitch = source->pitch; - - if ( pitch < 0 ) - pitch = -pitch; - size = (FT_ULong)pitch * source->rows; - - if ( target->buffer ) - { - FT_Int target_pitch = target->pitch; - FT_ULong target_size; - - - if ( target_pitch < 0 ) - target_pitch = -target_pitch; - target_size = (FT_ULong)target_pitch * target->rows; - - if ( target_size != size ) - (void)FT_QREALLOC( target->buffer, target_size, size ); - } - else - (void)FT_QALLOC( target->buffer, size ); - - if ( !error ) - { - unsigned char *p; - - - p = target->buffer; - *target = *source; - target->buffer = p; - - if ( source_pitch_sign == target_pitch_sign ) - FT_MEM_COPY( target->buffer, source->buffer, size ); - else - { - /* take care of bitmap flow */ - FT_UInt i; - FT_Byte* s = source->buffer; - FT_Byte* t = target->buffer; - - - t += (FT_ULong)pitch * ( target->rows - 1 ); - - for ( i = target->rows; i > 0; i-- ) - { - FT_ARRAY_COPY( t, s, pitch ); - - s += pitch; - t -= pitch; - } - } - } - - return error; - } - - - /* Enlarge `bitmap' horizontally and vertically by `xpixels' */ - /* and `ypixels', respectively. */ - - static FT_Error - ft_bitmap_assure_buffer( FT_Memory memory, - FT_Bitmap* bitmap, - FT_UInt xpixels, - FT_UInt ypixels ) - { - FT_Error error; - int pitch; - int new_pitch; - FT_UInt bpp; - FT_UInt i, width, height; - unsigned char* buffer = NULL; - - - width = bitmap->width; - height = bitmap->rows; - pitch = bitmap->pitch; - if ( pitch < 0 ) - pitch = -pitch; - - switch ( bitmap->pixel_mode ) - { - case FT_PIXEL_MODE_MONO: - bpp = 1; - new_pitch = (int)( ( width + xpixels + 7 ) >> 3 ); - break; - case FT_PIXEL_MODE_GRAY2: - bpp = 2; - new_pitch = (int)( ( width + xpixels + 3 ) >> 2 ); - break; - case FT_PIXEL_MODE_GRAY4: - bpp = 4; - new_pitch = (int)( ( width + xpixels + 1 ) >> 1 ); - break; - case FT_PIXEL_MODE_GRAY: - case FT_PIXEL_MODE_LCD: - case FT_PIXEL_MODE_LCD_V: - bpp = 8; - new_pitch = (int)( width + xpixels ); - break; - default: - return FT_THROW( Invalid_Glyph_Format ); - } - - /* if no need to allocate memory */ - if ( ypixels == 0 && new_pitch <= pitch ) - { - /* zero the padding */ - FT_UInt bit_width = (FT_UInt)pitch * 8; - FT_UInt bit_last = ( width + xpixels ) * bpp; - - - if ( bit_last < bit_width ) - { - FT_Byte* line = bitmap->buffer + ( bit_last >> 3 ); - FT_Byte* end = bitmap->buffer + pitch; - FT_UInt shift = bit_last & 7; - FT_UInt mask = 0xFF00U >> shift; - FT_UInt count = height; - - - for ( ; count > 0; count--, line += pitch, end += pitch ) - { - FT_Byte* write = line; - - - if ( shift > 0 ) - { - write[0] = (FT_Byte)( write[0] & mask ); - write++; - } - if ( write < end ) - FT_MEM_ZERO( write, end - write ); - } - } - - return FT_Err_Ok; - } - - /* otherwise allocate new buffer */ - if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) ) - return error; - - /* new rows get added at the top of the bitmap, */ - /* thus take care of the flow direction */ - if ( bitmap->pitch > 0 ) - { - FT_UInt len = ( width * bpp + 7 ) >> 3; - - - for ( i = 0; i < bitmap->rows; i++ ) - FT_MEM_COPY( buffer + (FT_UInt)new_pitch * ( ypixels + i ), - bitmap->buffer + (FT_UInt)pitch * i, - len ); - } - else - { - FT_UInt len = ( width * bpp + 7 ) >> 3; - - - for ( i = 0; i < bitmap->rows; i++ ) - FT_MEM_COPY( buffer + (FT_UInt)new_pitch * i, - bitmap->buffer + (FT_UInt)pitch * i, - len ); - } - - FT_FREE( bitmap->buffer ); - bitmap->buffer = buffer; - - if ( bitmap->pitch < 0 ) - new_pitch = -new_pitch; - - /* set pitch only, width and height are left untouched */ - bitmap->pitch = new_pitch; - - return FT_Err_Ok; - } - - - /* documentation is in ftbitmap.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Bitmap_Embolden( FT_Library library, - FT_Bitmap* bitmap, - FT_Pos xStrength, - FT_Pos yStrength ) - { - FT_Error error; - unsigned char* p; - FT_Int i, x, pitch; - FT_UInt y; - FT_Int xstr, ystr; - - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - if ( !bitmap || !bitmap->buffer ) - return FT_THROW( Invalid_Argument ); - - if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) || - ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) ) - return FT_THROW( Invalid_Argument ); - - xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6; - ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6; - - if ( xstr == 0 && ystr == 0 ) - return FT_Err_Ok; - else if ( xstr < 0 || ystr < 0 ) - return FT_THROW( Invalid_Argument ); - - switch ( bitmap->pixel_mode ) - { - case FT_PIXEL_MODE_GRAY2: - case FT_PIXEL_MODE_GRAY4: - { - FT_Bitmap tmp; - - - /* convert to 8bpp */ - FT_Bitmap_Init( &tmp ); - error = FT_Bitmap_Convert( library, bitmap, &tmp, 1 ); - if ( error ) - return error; - - FT_Bitmap_Done( library, bitmap ); - *bitmap = tmp; - } - break; - - case FT_PIXEL_MODE_MONO: - if ( xstr > 8 ) - xstr = 8; - break; - - case FT_PIXEL_MODE_LCD: - xstr *= 3; - break; - - case FT_PIXEL_MODE_LCD_V: - ystr *= 3; - break; - - case FT_PIXEL_MODE_BGRA: - /* We don't embolden color glyphs. */ - return FT_Err_Ok; - } - - error = ft_bitmap_assure_buffer( library->memory, bitmap, - (FT_UInt)xstr, (FT_UInt)ystr ); - if ( error ) - return error; - - /* take care of bitmap flow */ - pitch = bitmap->pitch; - if ( pitch > 0 ) - p = bitmap->buffer + pitch * ystr; - else - { - pitch = -pitch; - p = bitmap->buffer + (FT_UInt)pitch * ( bitmap->rows - 1 ); - } - - /* for each row */ - for ( y = 0; y < bitmap->rows ; y++ ) - { - /* - * Horizontally: - * - * From the last pixel on, make each pixel or'ed with the - * `xstr' pixels before it. - */ - for ( x = pitch - 1; x >= 0; x-- ) - { - unsigned char tmp; - - - tmp = p[x]; - for ( i = 1; i <= xstr; i++ ) - { - if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO ) - { - p[x] |= tmp >> i; - - /* the maximum value of 8 for `xstr' comes from here */ - if ( x > 0 ) - p[x] |= p[x - 1] << ( 8 - i ); - -#if 0 - if ( p[x] == 0xFF ) - break; -#endif - } - else - { - if ( x - i >= 0 ) - { - if ( p[x] + p[x - i] > bitmap->num_grays - 1 ) - { - p[x] = (unsigned char)( bitmap->num_grays - 1 ); - break; - } - else - { - p[x] = (unsigned char)( p[x] + p[x - i] ); - if ( p[x] == bitmap->num_grays - 1 ) - break; - } - } - else - break; - } - } - } - - /* - * Vertically: - * - * Make the above `ystr' rows or'ed with it. - */ - for ( x = 1; x <= ystr; x++ ) - { - unsigned char* q; - - - q = p - bitmap->pitch * x; - for ( i = 0; i < pitch; i++ ) - q[i] |= p[i]; - } - - p += bitmap->pitch; - } - - bitmap->width += (FT_UInt)xstr; - bitmap->rows += (FT_UInt)ystr; - - return FT_Err_Ok; - } - - - static FT_Byte - ft_gray_for_premultiplied_srgb_bgra( const FT_Byte* bgra ) - { - FT_UInt a = bgra[3]; - FT_UInt l; - - - /* Short-circuit transparent color to avoid division by zero. */ - if ( !a ) - return 0; - - /* - * Luminosity for sRGB is defined using ~0.2126,0.7152,0.0722 - * coefficients for RGB channels *on the linear colors*. - * A gamma of 2.2 is fair to assume. And then, we need to - * undo the premultiplication too. - * - * http://accessibility.kde.org/hsl-adjusted.php - * - * We do the computation with integers only, applying a gamma of 2.0. - * We guarantee 32-bit arithmetic to avoid overflow but the resulting - * luminosity fits into 16 bits. - * - */ - - l = ( 4732UL /* 0.0722 * 65536 */ * bgra[0] * bgra[0] + - 46871UL /* 0.7152 * 65536 */ * bgra[1] * bgra[1] + - 13933UL /* 0.2126 * 65536 */ * bgra[2] * bgra[2] ) >> 16; - - /* - * Final transparency can be determined as follows. - * - * - If alpha is zero, we want 0. - * - If alpha is zero and luminosity is zero, we want 255. - * - If alpha is zero and luminosity is one, we want 0. - * - * So the formula is a * (1 - l) = a - l * a. - * - * We still need to undo premultiplication by dividing l by a*a. - * - */ - - return (FT_Byte)( a - l / a ); - } - - - /* documentation is in ftbitmap.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Bitmap_Convert( FT_Library library, - const FT_Bitmap *source, - FT_Bitmap *target, - FT_Int alignment ) - { - FT_Error error = FT_Err_Ok; - FT_Memory memory; - - FT_Byte* s; - FT_Byte* t; - - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - if ( !source || !target ) - return FT_THROW( Invalid_Argument ); - - memory = library->memory; - - switch ( source->pixel_mode ) - { - case FT_PIXEL_MODE_MONO: - case FT_PIXEL_MODE_GRAY: - case FT_PIXEL_MODE_GRAY2: - case FT_PIXEL_MODE_GRAY4: - case FT_PIXEL_MODE_LCD: - case FT_PIXEL_MODE_LCD_V: - case FT_PIXEL_MODE_BGRA: - { - FT_Int pad, old_target_pitch, target_pitch; - FT_ULong old_size; - - - old_target_pitch = target->pitch; - if ( old_target_pitch < 0 ) - old_target_pitch = -old_target_pitch; - - old_size = target->rows * (FT_UInt)old_target_pitch; - - target->pixel_mode = FT_PIXEL_MODE_GRAY; - target->rows = source->rows; - target->width = source->width; - - pad = 0; - if ( alignment > 0 ) - { - pad = (FT_Int)source->width % alignment; - if ( pad != 0 ) - pad = alignment - pad; - } - - target_pitch = (FT_Int)source->width + pad; - - if ( target_pitch > 0 && - (FT_ULong)target->rows > FT_ULONG_MAX / (FT_ULong)target_pitch ) - return FT_THROW( Invalid_Argument ); - - if ( target->rows * (FT_ULong)target_pitch > old_size && - FT_QREALLOC( target->buffer, - old_size, target->rows * (FT_UInt)target_pitch ) ) - return error; - - target->pitch = target->pitch < 0 ? -target_pitch : target_pitch; - } - break; - - default: - error = FT_THROW( Invalid_Argument ); - } - - s = source->buffer; - t = target->buffer; - - /* take care of bitmap flow */ - if ( source->pitch < 0 ) - s -= source->pitch * (FT_Int)( source->rows - 1 ); - if ( target->pitch < 0 ) - t -= target->pitch * (FT_Int)( target->rows - 1 ); - - switch ( source->pixel_mode ) - { - case FT_PIXEL_MODE_MONO: - { - FT_UInt i; - - - target->num_grays = 2; - - for ( i = source->rows; i > 0; i-- ) - { - FT_Byte* ss = s; - FT_Byte* tt = t; - FT_UInt j; - - - /* get the full bytes */ - for ( j = source->width >> 3; j > 0; j-- ) - { - FT_Int val = ss[0]; /* avoid a byte->int cast on each line */ - - - tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 ); - tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 ); - tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 ); - tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 ); - tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 ); - tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 ); - tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 ); - tt[7] = (FT_Byte)( val & 0x01 ); - - tt += 8; - ss += 1; - } - - /* get remaining pixels (if any) */ - j = source->width & 7; - if ( j > 0 ) - { - FT_Int val = *ss; - - - for ( ; j > 0; j-- ) - { - tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7); - val <<= 1; - tt += 1; - } - } - - s += source->pitch; - t += target->pitch; - } - } - break; - - - case FT_PIXEL_MODE_GRAY: - case FT_PIXEL_MODE_LCD: - case FT_PIXEL_MODE_LCD_V: - { - FT_UInt width = source->width; - FT_UInt i; - - - target->num_grays = 256; - - for ( i = source->rows; i > 0; i-- ) - { - FT_ARRAY_COPY( t, s, width ); - - s += source->pitch; - t += target->pitch; - } - } - break; - - - case FT_PIXEL_MODE_GRAY2: - { - FT_UInt i; - - - target->num_grays = 4; - - for ( i = source->rows; i > 0; i-- ) - { - FT_Byte* ss = s; - FT_Byte* tt = t; - FT_UInt j; - - - /* get the full bytes */ - for ( j = source->width >> 2; j > 0; j-- ) - { - FT_Int val = ss[0]; - - - tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); - tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 ); - tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 ); - tt[3] = (FT_Byte)( ( val & 0x03 ) ); - - ss += 1; - tt += 4; - } - - j = source->width & 3; - if ( j > 0 ) - { - FT_Int val = ss[0]; - - - for ( ; j > 0; j-- ) - { - tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); - val <<= 2; - tt += 1; - } - } - - s += source->pitch; - t += target->pitch; - } - } - break; - - - case FT_PIXEL_MODE_GRAY4: - { - FT_UInt i; - - - target->num_grays = 16; - - for ( i = source->rows; i > 0; i-- ) - { - FT_Byte* ss = s; - FT_Byte* tt = t; - FT_UInt j; - - - /* get the full bytes */ - for ( j = source->width >> 1; j > 0; j-- ) - { - FT_Int val = ss[0]; - - - tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 ); - tt[1] = (FT_Byte)( ( val & 0x0F ) ); - - ss += 1; - tt += 2; - } - - if ( source->width & 1 ) - tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 ); - - s += source->pitch; - t += target->pitch; - } - } - break; - - - case FT_PIXEL_MODE_BGRA: - { - FT_UInt i; - - - target->num_grays = 256; - - for ( i = source->rows; i > 0; i-- ) - { - FT_Byte* ss = s; - FT_Byte* tt = t; - FT_UInt j; - - - for ( j = source->width; j > 0; j-- ) - { - tt[0] = ft_gray_for_premultiplied_srgb_bgra( ss ); - - ss += 4; - tt += 1; - } - - s += source->pitch; - t += target->pitch; - } - } - break; - - default: - ; - } - - return error; - } - - - /* documentation is in ftbitmap.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ) - { - if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP && - !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) - { - FT_Bitmap bitmap; - FT_Error error; - - - FT_Bitmap_Init( &bitmap ); - error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap ); - if ( error ) - return error; - - slot->bitmap = bitmap; - slot->internal->flags |= FT_GLYPH_OWN_BITMAP; - } - - return FT_Err_Ok; - } - - - /* documentation is in ftbitmap.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Bitmap_Done( FT_Library library, - FT_Bitmap *bitmap ) - { - FT_Memory memory; - - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - if ( !bitmap ) - return FT_THROW( Invalid_Argument ); - - memory = library->memory; - - FT_FREE( bitmap->buffer ); - *bitmap = null_bitmap; - - return FT_Err_Ok; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftcalc.c b/3party/freetype/src/base/ftcalc.c deleted file mode 100644 index 01aead52e8..0000000000 --- a/3party/freetype/src/base/ftcalc.c +++ /dev/null @@ -1,1018 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcalc.c */ -/* */ -/* Arithmetic computations (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* Support for 1-complement arithmetic has been totally dropped in this */ - /* release. You can still write your own code if you need it. */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* Implementing basic computation routines. */ - /* */ - /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(), */ - /* and FT_FloorFix() are declared in freetype.h. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_GLYPH_H -#include FT_TRIGONOMETRY_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H - - -#ifdef FT_MULFIX_ASSEMBLER -#undef FT_MulFix -#endif - -/* we need to emulate a 64-bit data type if a real one isn't available */ - -#ifndef FT_LONG64 - - typedef struct FT_Int64_ - { - FT_UInt32 lo; - FT_UInt32 hi; - - } FT_Int64; - -#endif /* !FT_LONG64 */ - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_calc - - - /* transfer sign leaving a positive number */ -#define FT_MOVE_SIGN( x, s ) \ - FT_BEGIN_STMNT \ - if ( x < 0 ) \ - { \ - x = -x; \ - s = -s; \ - } \ - FT_END_STMNT - - /* The following three functions are available regardless of whether */ - /* FT_LONG64 is defined. */ - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_RoundFix( FT_Fixed a ) - { - return a >= 0 ? ( a + 0x8000L ) & ~0xFFFFL - : -((-a + 0x8000L ) & ~0xFFFFL ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_CeilFix( FT_Fixed a ) - { - return a >= 0 ? ( a + 0xFFFFL ) & ~0xFFFFL - : -((-a + 0xFFFFL ) & ~0xFFFFL ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_FloorFix( FT_Fixed a ) - { - return a >= 0 ? a & ~0xFFFFL - : -((-a) & ~0xFFFFL ); - } - -#ifndef FT_MSB - - FT_BASE_DEF ( FT_Int ) - FT_MSB( FT_UInt32 z ) - { - FT_Int shift = 0; - - - /* determine msb bit index in `shift' */ - if ( z & 0xFFFF0000UL ) - { - z >>= 16; - shift += 16; - } - if ( z & 0x0000FF00UL ) - { - z >>= 8; - shift += 8; - } - if ( z & 0x000000F0UL ) - { - z >>= 4; - shift += 4; - } - if ( z & 0x0000000CUL ) - { - z >>= 2; - shift += 2; - } - if ( z & 0x00000002UL ) - { - /* z >>= 1; */ - shift += 1; - } - - return shift; - } - -#endif /* !FT_MSB */ - - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( FT_Fixed ) - FT_Hypot( FT_Fixed x, - FT_Fixed y ) - { - FT_Vector v; - - - v.x = x; - v.y = y; - - return FT_Vector_Length( &v ); - } - - -#ifdef FT_LONG64 - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_MulDiv( FT_Long a_, - FT_Long b_, - FT_Long c_ ) - { - FT_Int s = 1; - FT_UInt64 a, b, c, d; - FT_Long d_; - - - FT_MOVE_SIGN( a_, s ); - FT_MOVE_SIGN( b_, s ); - FT_MOVE_SIGN( c_, s ); - - a = (FT_UInt64)a_; - b = (FT_UInt64)b_; - c = (FT_UInt64)c_; - - d = c > 0 ? ( a * b + ( c >> 1 ) ) / c - : 0x7FFFFFFFUL; - - d_ = (FT_Long)d; - - return s < 0 ? -d_ : d_; - } - - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( FT_Long ) - FT_MulDiv_No_Round( FT_Long a_, - FT_Long b_, - FT_Long c_ ) - { - FT_Int s = 1; - FT_UInt64 a, b, c, d; - FT_Long d_; - - - FT_MOVE_SIGN( a_, s ); - FT_MOVE_SIGN( b_, s ); - FT_MOVE_SIGN( c_, s ); - - a = (FT_UInt64)a_; - b = (FT_UInt64)b_; - c = (FT_UInt64)c_; - - d = c > 0 ? a * b / c - : 0x7FFFFFFFUL; - - d_ = (FT_Long)d; - - return s < 0 ? -d_ : d_; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_MulFix( FT_Long a_, - FT_Long b_ ) - { -#ifdef FT_MULFIX_ASSEMBLER - - return FT_MULFIX_ASSEMBLER( a_, b_ ); - -#else - - FT_Int s = 1; - FT_UInt64 a, b, c; - FT_Long c_; - - - FT_MOVE_SIGN( a_, s ); - FT_MOVE_SIGN( b_, s ); - - a = (FT_UInt64)a_; - b = (FT_UInt64)b_; - - c = ( a * b + 0x8000UL ) >> 16; - - c_ = (FT_Long)c; - - return s < 0 ? -c_ : c_; - -#endif /* FT_MULFIX_ASSEMBLER */ - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_DivFix( FT_Long a_, - FT_Long b_ ) - { - FT_Int s = 1; - FT_UInt64 a, b, q; - FT_Long q_; - - - FT_MOVE_SIGN( a_, s ); - FT_MOVE_SIGN( b_, s ); - - a = (FT_UInt64)a_; - b = (FT_UInt64)b_; - - q = b > 0 ? ( ( a << 16 ) + ( b >> 1 ) ) / b - : 0x7FFFFFFFUL; - - q_ = (FT_Long)q; - - return s < 0 ? -q_ : q_; - } - - -#else /* !FT_LONG64 */ - - - static void - ft_multo64( FT_UInt32 x, - FT_UInt32 y, - FT_Int64 *z ) - { - FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2; - - - lo1 = x & 0x0000FFFFU; hi1 = x >> 16; - lo2 = y & 0x0000FFFFU; hi2 = y >> 16; - - lo = lo1 * lo2; - i1 = lo1 * hi2; - i2 = lo2 * hi1; - hi = hi1 * hi2; - - /* Check carry overflow of i1 + i2 */ - i1 += i2; - hi += (FT_UInt32)( i1 < i2 ) << 16; - - hi += i1 >> 16; - i1 = i1 << 16; - - /* Check carry overflow of i1 + lo */ - lo += i1; - hi += ( lo < i1 ); - - z->lo = lo; - z->hi = hi; - } - - - static FT_UInt32 - ft_div64by32( FT_UInt32 hi, - FT_UInt32 lo, - FT_UInt32 y ) - { - FT_UInt32 r, q; - FT_Int i; - - - if ( hi >= y ) - return (FT_UInt32)0x7FFFFFFFL; - - /* We shift as many bits as we can into the high register, perform */ - /* 32-bit division with modulo there, then work through the remaining */ - /* bits with long division. This optimization is especially noticeable */ - /* for smaller dividends that barely use the high register. */ - - i = 31 - FT_MSB( hi ); - r = ( hi << i ) | ( lo >> ( 32 - i ) ); lo <<= i; /* left 64-bit shift */ - q = r / y; - r -= q * y; /* remainder */ - - i = 32 - i; /* bits remaining in low register */ - do - { - q <<= 1; - r = ( r << 1 ) | ( lo >> 31 ); lo <<= 1; - - if ( r >= y ) - { - r -= y; - q |= 1; - } - } while ( --i ); - - return q; - } - - - static void - FT_Add64( FT_Int64* x, - FT_Int64* y, - FT_Int64 *z ) - { - FT_UInt32 lo, hi; - - - lo = x->lo + y->lo; - hi = x->hi + y->hi + ( lo < x->lo ); - - z->lo = lo; - z->hi = hi; - } - - - /* The FT_MulDiv function has been optimized thanks to ideas from */ - /* Graham Asher and Alexei Podtelezhnikov. The trick is to optimize */ - /* a rather common case when everything fits within 32-bits. */ - /* */ - /* We compute 'a*b+c/2', then divide it by 'c' (all positive values). */ - /* */ - /* The product of two positive numbers never exceeds the square of */ - /* its mean values. Therefore, we always avoid the overflow by */ - /* imposing */ - /* */ - /* (a + b) / 2 <= sqrt(X - c/2) , */ - /* */ - /* where X = 2^32 - 1, the maximum unsigned 32-bit value, and using */ - /* unsigned arithmetic. Now we replace `sqrt' with a linear function */ - /* that is smaller or equal for all values of c in the interval */ - /* [0;X/2]; it should be equal to sqrt(X) and sqrt(3X/4) at the */ - /* endpoints. Substituting the linear solution and explicit numbers */ - /* we get */ - /* */ - /* a + b <= 131071.99 - c / 122291.84 . */ - /* */ - /* In practice, we should use a faster and even stronger inequality */ - /* */ - /* a + b <= 131071 - (c >> 16) */ - /* */ - /* or, alternatively, */ - /* */ - /* a + b <= 129894 - (c >> 17) . */ - /* */ - /* FT_MulFix, on the other hand, is optimized for a small value of */ - /* the first argument, when the second argument can be much larger. */ - /* This can be achieved by scaling the second argument and the limit */ - /* in the above inequalities. For example, */ - /* */ - /* a + (b >> 8) <= (131071 >> 4) */ - /* */ - /* covers the practical range of use. The actual test below is a bit */ - /* tighter to avoid the border case overflows. */ - /* */ - /* In the case of FT_DivFix, the exact overflow check */ - /* */ - /* a << 16 <= X - c/2 */ - /* */ - /* is scaled down by 2^16 and we use */ - /* */ - /* a <= 65535 - (c >> 17) . */ - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_MulDiv( FT_Long a_, - FT_Long b_, - FT_Long c_ ) - { - FT_Int s = 1; - FT_UInt32 a, b, c; - - - /* XXX: this function does not allow 64-bit arguments */ - - FT_MOVE_SIGN( a_, s ); - FT_MOVE_SIGN( b_, s ); - FT_MOVE_SIGN( c_, s ); - - a = (FT_UInt32)a_; - b = (FT_UInt32)b_; - c = (FT_UInt32)c_; - - if ( c == 0 ) - a = 0x7FFFFFFFUL; - - else if ( a + b <= 129894UL - ( c >> 17 ) ) - a = ( a * b + ( c >> 1 ) ) / c; - - else - { - FT_Int64 temp, temp2; - - - ft_multo64( a, b, &temp ); - - temp2.hi = 0; - temp2.lo = c >> 1; - - FT_Add64( &temp, &temp2, &temp ); - - /* last attempt to ditch long division */ - a = temp.hi == 0 ? temp.lo / c - : ft_div64by32( temp.hi, temp.lo, c ); - } - - a_ = (FT_Long)a; - - return s < 0 ? -a_ : a_; - } - - - FT_BASE_DEF( FT_Long ) - FT_MulDiv_No_Round( FT_Long a_, - FT_Long b_, - FT_Long c_ ) - { - FT_Int s = 1; - FT_UInt32 a, b, c; - - - /* XXX: this function does not allow 64-bit arguments */ - - FT_MOVE_SIGN( a_, s ); - FT_MOVE_SIGN( b_, s ); - FT_MOVE_SIGN( c_, s ); - - a = (FT_UInt32)a_; - b = (FT_UInt32)b_; - c = (FT_UInt32)c_; - - if ( c == 0 ) - a = 0x7FFFFFFFUL; - - else if ( a + b <= 131071UL ) - a = a * b / c; - - else - { - FT_Int64 temp; - - - ft_multo64( a, b, &temp ); - - /* last attempt to ditch long division */ - a = temp.hi == 0 ? temp.lo / c - : ft_div64by32( temp.hi, temp.lo, c ); - } - - a_ = (FT_Long)a; - - return s < 0 ? -a_ : a_; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_MulFix( FT_Long a_, - FT_Long b_ ) - { -#ifdef FT_MULFIX_ASSEMBLER - - return FT_MULFIX_ASSEMBLER( a_, b_ ); - -#elif 0 - - /* - * This code is nonportable. See comment below. - * - * However, on a platform where right-shift of a signed quantity fills - * the leftmost bits by copying the sign bit, it might be faster. - */ - - FT_Long sa, sb; - FT_UInt32 a, b; - - - /* - * This is a clever way of converting a signed number `a' into its - * absolute value (stored back into `a') and its sign. The sign is - * stored in `sa'; 0 means `a' was positive or zero, and -1 means `a' - * was negative. (Similarly for `b' and `sb'). - * - * Unfortunately, it doesn't work (at least not portably). - * - * It makes the assumption that right-shift on a negative signed value - * fills the leftmost bits by copying the sign bit. This is wrong. - * According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206, - * the result of right-shift of a negative signed value is - * implementation-defined. At least one implementation fills the - * leftmost bits with 0s (i.e., it is exactly the same as an unsigned - * right shift). This means that when `a' is negative, `sa' ends up - * with the value 1 rather than -1. After that, everything else goes - * wrong. - */ - sa = ( a_ >> ( sizeof ( a_ ) * 8 - 1 ) ); - a = ( a_ ^ sa ) - sa; - sb = ( b_ >> ( sizeof ( b_ ) * 8 - 1 ) ); - b = ( b_ ^ sb ) - sb; - - a = (FT_UInt32)a_; - b = (FT_UInt32)b_; - - if ( a + ( b >> 8 ) <= 8190UL ) - a = ( a * b + 0x8000U ) >> 16; - else - { - FT_UInt32 al = a & 0xFFFFUL; - - - a = ( a >> 16 ) * b + al * ( b >> 16 ) + - ( ( al * ( b & 0xFFFFUL ) + 0x8000UL ) >> 16 ); - } - - sa ^= sb; - a = ( a ^ sa ) - sa; - - return (FT_Long)a; - -#else /* 0 */ - - FT_Int s = 1; - FT_UInt32 a, b; - - - /* XXX: this function does not allow 64-bit arguments */ - - FT_MOVE_SIGN( a_, s ); - FT_MOVE_SIGN( b_, s ); - - a = (FT_UInt32)a_; - b = (FT_UInt32)b_; - - if ( a + ( b >> 8 ) <= 8190UL ) - a = ( a * b + 0x8000UL ) >> 16; - else - { - FT_UInt32 al = a & 0xFFFFUL; - - - a = ( a >> 16 ) * b + al * ( b >> 16 ) + - ( ( al * ( b & 0xFFFFUL ) + 0x8000UL ) >> 16 ); - } - - a_ = (FT_Long)a; - - return s < 0 ? -a_ : a_; - -#endif /* 0 */ - - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_DivFix( FT_Long a_, - FT_Long b_ ) - { - FT_Int s = 1; - FT_UInt32 a, b, q; - FT_Long q_; - - - /* XXX: this function does not allow 64-bit arguments */ - - FT_MOVE_SIGN( a_, s ); - FT_MOVE_SIGN( b_, s ); - - a = (FT_UInt32)a_; - b = (FT_UInt32)b_; - - if ( b == 0 ) - { - /* check for division by 0 */ - q = 0x7FFFFFFFUL; - } - else if ( a <= 65535UL - ( b >> 17 ) ) - { - /* compute result directly */ - q = ( ( a << 16 ) + ( b >> 1 ) ) / b; - } - else - { - /* we need more bits; we have to do it by hand */ - FT_Int64 temp, temp2; - - - temp.hi = a >> 16; - temp.lo = a << 16; - temp2.hi = 0; - temp2.lo = b >> 1; - - FT_Add64( &temp, &temp2, &temp ); - q = ft_div64by32( temp.hi, temp.lo, b ); - } - - q_ = (FT_Long)q; - - return s < 0 ? -q_ : q_; - } - - -#endif /* !FT_LONG64 */ - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( void ) - FT_Matrix_Multiply( const FT_Matrix* a, - FT_Matrix *b ) - { - FT_Fixed xx, xy, yx, yy; - - - if ( !a || !b ) - return; - - xx = FT_MulFix( a->xx, b->xx ) + FT_MulFix( a->xy, b->yx ); - xy = FT_MulFix( a->xx, b->xy ) + FT_MulFix( a->xy, b->yy ); - yx = FT_MulFix( a->yx, b->xx ) + FT_MulFix( a->yy, b->yx ); - yy = FT_MulFix( a->yx, b->xy ) + FT_MulFix( a->yy, b->yy ); - - b->xx = xx; b->xy = xy; - b->yx = yx; b->yy = yy; - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Matrix_Invert( FT_Matrix* matrix ) - { - FT_Pos delta, xx, yy; - - - if ( !matrix ) - return FT_THROW( Invalid_Argument ); - - /* compute discriminant */ - delta = FT_MulFix( matrix->xx, matrix->yy ) - - FT_MulFix( matrix->xy, matrix->yx ); - - if ( !delta ) - return FT_THROW( Invalid_Argument ); /* matrix can't be inverted */ - - matrix->xy = - FT_DivFix( matrix->xy, delta ); - matrix->yx = - FT_DivFix( matrix->yx, delta ); - - xx = matrix->xx; - yy = matrix->yy; - - matrix->xx = FT_DivFix( yy, delta ); - matrix->yy = FT_DivFix( xx, delta ); - - return FT_Err_Ok; - } - - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( void ) - FT_Matrix_Multiply_Scaled( const FT_Matrix* a, - FT_Matrix *b, - FT_Long scaling ) - { - FT_Fixed xx, xy, yx, yy; - - FT_Long val = 0x10000L * scaling; - - - if ( !a || !b ) - return; - - xx = FT_MulDiv( a->xx, b->xx, val ) + FT_MulDiv( a->xy, b->yx, val ); - xy = FT_MulDiv( a->xx, b->xy, val ) + FT_MulDiv( a->xy, b->yy, val ); - yx = FT_MulDiv( a->yx, b->xx, val ) + FT_MulDiv( a->yy, b->yx, val ); - yy = FT_MulDiv( a->yx, b->xy, val ) + FT_MulDiv( a->yy, b->yy, val ); - - b->xx = xx; b->xy = xy; - b->yx = yx; b->yy = yy; - } - - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( void ) - FT_Vector_Transform_Scaled( FT_Vector* vector, - const FT_Matrix* matrix, - FT_Long scaling ) - { - FT_Pos xz, yz; - - FT_Long val = 0x10000L * scaling; - - - if ( !vector || !matrix ) - return; - - xz = FT_MulDiv( vector->x, matrix->xx, val ) + - FT_MulDiv( vector->y, matrix->xy, val ); - - yz = FT_MulDiv( vector->x, matrix->yx, val ) + - FT_MulDiv( vector->y, matrix->yy, val ); - - vector->x = xz; - vector->y = yz; - } - - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( FT_UInt32 ) - FT_Vector_NormLen( FT_Vector* vector ) - { - FT_Int32 x_ = vector->x; - FT_Int32 y_ = vector->y; - FT_Int32 b, z; - FT_UInt32 x, y, u, v, l; - FT_Int sx = 1, sy = 1, shift; - - - FT_MOVE_SIGN( x_, sx ); - FT_MOVE_SIGN( y_, sy ); - - x = (FT_UInt32)x_; - y = (FT_UInt32)y_; - - /* trivial cases */ - if ( x == 0 ) - { - if ( y > 0 ) - vector->y = sy * 0x10000; - return y; - } - else if ( y == 0 ) - { - if ( x > 0 ) - vector->x = sx * 0x10000; - return x; - } - - /* Estimate length and prenormalize by shifting so that */ - /* the new approximate length is between 2/3 and 4/3. */ - /* The magic constant 0xAAAAAAAAUL (2/3 of 2^32) helps */ - /* achieve this in 16.16 fixed-point representation. */ - l = x > y ? x + ( y >> 1 ) - : y + ( x >> 1 ); - - shift = 31 - FT_MSB( l ); - shift -= 15 + ( l >= ( 0xAAAAAAAAUL >> shift ) ); - - if ( shift > 0 ) - { - x <<= shift; - y <<= shift; - - /* re-estimate length for tiny vectors */ - l = x > y ? x + ( y >> 1 ) - : y + ( x >> 1 ); - } - else - { - x >>= -shift; - y >>= -shift; - l >>= -shift; - } - - /* lower linear approximation for reciprocal length minus one */ - b = 0x10000 - (FT_Int32)l; - - x_ = (FT_Int32)x; - y_ = (FT_Int32)y; - - /* Newton's iterations */ - do - { - u = (FT_UInt32)( x_ + ( x_ * b >> 16 ) ); - v = (FT_UInt32)( y_ + ( y_ * b >> 16 ) ); - - /* Normalized squared length in the parentheses approaches 2^32. */ - /* On two's complement systems, converting to signed gives the */ - /* difference with 2^32 even if the expression wraps around. */ - z = -(FT_Int32)( u * u + v * v ) / 0x200; - z = z * ( ( 0x10000 + b ) >> 8 ) / 0x10000; - - b += z; - - } while ( z > 0 ); - - vector->x = sx < 0 ? -(FT_Pos)u : (FT_Pos)u; - vector->y = sy < 0 ? -(FT_Pos)v : (FT_Pos)v; - - /* Conversion to signed helps to recover from likely wrap around */ - /* in calculating the prenormalized length, because it gives the */ - /* correct difference with 2^32 on two's complement systems. */ - l = (FT_UInt32)( 0x10000 + (FT_Int32)( u * x + v * y ) / 0x10000 ); - if ( shift > 0 ) - l = ( l + ( 1 << ( shift - 1 ) ) ) >> shift; - else - l <<= -shift; - - return l; - } - - -#if 0 - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( FT_Int32 ) - FT_SqrtFixed( FT_Int32 x ) - { - FT_UInt32 root, rem_hi, rem_lo, test_div; - FT_Int count; - - - root = 0; - - if ( x > 0 ) - { - rem_hi = 0; - rem_lo = (FT_UInt32)x; - count = 24; - do - { - rem_hi = ( rem_hi << 2 ) | ( rem_lo >> 30 ); - rem_lo <<= 2; - root <<= 1; - test_div = ( root << 1 ) + 1; - - if ( rem_hi >= test_div ) - { - rem_hi -= test_div; - root += 1; - } - } while ( --count ); - } - - return (FT_Int32)root; - } - -#endif /* 0 */ - - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( FT_Int ) - ft_corner_orientation( FT_Pos in_x, - FT_Pos in_y, - FT_Pos out_x, - FT_Pos out_y ) - { -#ifdef FT_LONG64 - - FT_Int64 delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x; - - - return ( delta > 0 ) - ( delta < 0 ); - -#else - - FT_Int result; - - - if ( (FT_ULong)FT_ABS( in_x ) + (FT_ULong)FT_ABS( out_y ) <= 131071UL && - (FT_ULong)FT_ABS( in_y ) + (FT_ULong)FT_ABS( out_x ) <= 131071UL ) - { - FT_Long z1 = in_x * out_y; - FT_Long z2 = in_y * out_x; - - - if ( z1 > z2 ) - result = +1; - else if ( z1 < z2 ) - result = -1; - else - result = 0; - } - else /* products might overflow 32 bits */ - { - FT_Int64 z1, z2; - - - /* XXX: this function does not allow 64-bit arguments */ - ft_multo64( (FT_UInt32)in_x, (FT_UInt32)out_y, &z1 ); - ft_multo64( (FT_UInt32)in_y, (FT_UInt32)out_x, &z2 ); - - if ( z1.hi > z2.hi ) - result = +1; - else if ( z1.hi < z2.hi ) - result = -1; - else if ( z1.lo > z2.lo ) - result = +1; - else if ( z1.lo < z2.lo ) - result = -1; - else - result = 0; - } - - /* XXX: only the sign of return value, +1/0/-1 must be used */ - return result; - -#endif - } - - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( FT_Int ) - ft_corner_is_flat( FT_Pos in_x, - FT_Pos in_y, - FT_Pos out_x, - FT_Pos out_y ) - { - FT_Pos ax = in_x + out_x; - FT_Pos ay = in_y + out_y; - - FT_Pos d_in, d_out, d_hypot; - - - /* The idea of this function is to compare the length of the */ - /* hypotenuse with the `in' and `out' length. The `corner' */ - /* represented by `in' and `out' is flat if the hypotenuse's */ - /* length isn't too large. */ - /* */ - /* This approach has the advantage that the angle between */ - /* `in' and `out' is not checked. In case one of the two */ - /* vectors is `dominant', this is, much larger than the */ - /* other vector, we thus always have a flat corner. */ - /* */ - /* hypotenuse */ - /* x---------------------------x */ - /* \ / */ - /* \ / */ - /* in \ / out */ - /* \ / */ - /* o */ - /* Point */ - - d_in = FT_HYPOT( in_x, in_y ); - d_out = FT_HYPOT( out_x, out_y ); - d_hypot = FT_HYPOT( ax, ay ); - - /* now do a simple length comparison: */ - /* */ - /* d_in + d_out < 17/16 d_hypot */ - - return ( d_in + d_out - d_hypot ) < ( d_hypot >> 4 ); - } - - -/* END */ diff --git a/3party/freetype/src/base/ftcid.c b/3party/freetype/src/base/ftcid.c deleted file mode 100644 index 0734881b71..0000000000 --- a/3party/freetype/src/base/ftcid.c +++ /dev/null @@ -1,118 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcid.c */ -/* */ -/* FreeType API for accessing CID font information. */ -/* */ -/* Copyright 2007-2015 by */ -/* Derek Clegg and Michael Toftdal. */ -/* */ -/* 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 <ft2build.h> -#include FT_CID_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_CID_H - - - /* documentation is in ftcid.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, - const char* *registry, - const char* *ordering, - FT_Int *supplement) - { - FT_Error error; - const char* r = NULL; - const char* o = NULL; - FT_Int s = 0; - - - error = FT_ERR( Invalid_Argument ); - - if ( face ) - { - FT_Service_CID service; - - - FT_FACE_FIND_SERVICE( face, service, CID ); - - if ( service && service->get_ros ) - error = service->get_ros( face, &r, &o, &s ); - } - - if ( registry ) - *registry = r; - - if ( ordering ) - *ordering = o; - - if ( supplement ) - *supplement = s; - - return error; - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, - FT_Bool *is_cid ) - { - FT_Error error = FT_ERR( Invalid_Argument ); - FT_Bool ic = 0; - - - if ( face ) - { - FT_Service_CID service; - - - FT_FACE_FIND_SERVICE( face, service, CID ); - - if ( service && service->get_is_cid ) - error = service->get_is_cid( face, &ic); - } - - if ( is_cid ) - *is_cid = ic; - - return error; - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Get_CID_From_Glyph_Index( FT_Face face, - FT_UInt glyph_index, - FT_UInt *cid ) - { - FT_Error error = FT_ERR( Invalid_Argument ); - FT_UInt c = 0; - - - if ( face ) - { - FT_Service_CID service; - - - FT_FACE_FIND_SERVICE( face, service, CID ); - - if ( service && service->get_cid_from_glyph_index ) - error = service->get_cid_from_glyph_index( face, glyph_index, &c); - } - - if ( cid ) - *cid = c; - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftdbgmem.c b/3party/freetype/src/base/ftdbgmem.c deleted file mode 100644 index 6f20313b34..0000000000 --- a/3party/freetype/src/base/ftdbgmem.c +++ /dev/null @@ -1,998 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftdbgmem.c */ -/* */ -/* Memory debugger (body). */ -/* */ -/* Copyright 2001-2015 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 <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_MEMORY_H -#include FT_SYSTEM_H -#include FT_ERRORS_H -#include FT_TYPES_H - - -#ifdef FT_DEBUG_MEMORY - -#define KEEPALIVE /* `Keep alive' means that freed blocks aren't released - * to the heap. This is useful to detect double-frees - * or weird heap corruption, but it uses large amounts of - * memory, however. - */ - -#include FT_CONFIG_STANDARD_LIBRARY_H - - FT_BASE_DEF( const char* ) _ft_debug_file = NULL; - FT_BASE_DEF( long ) _ft_debug_lineno = 0; - - extern void - FT_DumpMemory( FT_Memory memory ); - - - typedef struct FT_MemSourceRec_* FT_MemSource; - typedef struct FT_MemNodeRec_* FT_MemNode; - typedef struct FT_MemTableRec_* FT_MemTable; - - -#define FT_MEM_VAL( addr ) ( (FT_PtrDist)(FT_Pointer)( addr ) ) - - /* - * This structure holds statistics for a single allocation/release - * site. This is useful to know where memory operations happen the - * most. - */ - typedef struct FT_MemSourceRec_ - { - const char* file_name; - long line_no; - - FT_Long cur_blocks; /* current number of allocated blocks */ - FT_Long max_blocks; /* max. number of allocated blocks */ - FT_Long all_blocks; /* total number of blocks allocated */ - - FT_Long cur_size; /* current cumulative allocated size */ - FT_Long max_size; /* maximum cumulative allocated size */ - FT_Long all_size; /* total cumulative allocated size */ - - FT_Long cur_max; /* current maximum allocated size */ - - FT_UInt32 hash; - FT_MemSource link; - - } FT_MemSourceRec; - - - /* - * We don't need a resizable array for the memory sources because - * their number is pretty limited within FreeType. - */ -#define FT_MEM_SOURCE_BUCKETS 128 - - /* - * This structure holds information related to a single allocated - * memory block. If KEEPALIVE is defined, blocks that are freed by - * FreeType are never released to the system. Instead, their `size' - * field is set to `-size'. This is mainly useful to detect double - * frees, at the price of a large memory footprint during execution. - */ - typedef struct FT_MemNodeRec_ - { - FT_Byte* address; - FT_Long size; /* < 0 if the block was freed */ - - FT_MemSource source; - -#ifdef KEEPALIVE - const char* free_file_name; - FT_Long free_line_no; -#endif - - FT_MemNode link; - - } FT_MemNodeRec; - - - /* - * The global structure, containing compound statistics and all hash - * tables. - */ - typedef struct FT_MemTableRec_ - { - FT_Long size; - FT_Long nodes; - FT_MemNode* buckets; - - FT_Long alloc_total; - FT_Long alloc_current; - FT_Long alloc_max; - FT_Long alloc_count; - - FT_Bool bound_total; - FT_Long alloc_total_max; - - FT_Bool bound_count; - FT_Long alloc_count_max; - - FT_MemSource sources[FT_MEM_SOURCE_BUCKETS]; - - FT_Bool keep_alive; - - FT_Memory memory; - FT_Pointer memory_user; - FT_Alloc_Func alloc; - FT_Free_Func free; - FT_Realloc_Func realloc; - - } FT_MemTableRec; - - -#define FT_MEM_SIZE_MIN 7 -#define FT_MEM_SIZE_MAX 13845163 - -#define FT_FILENAME( x ) ( (x) ? (x) : "unknown file" ) - - - /* - * Prime numbers are ugly to handle. It would be better to implement - * L-Hashing, which is 10% faster and doesn't require divisions. - */ - static const FT_Int ft_mem_primes[] = - { - 7, - 11, - 19, - 37, - 73, - 109, - 163, - 251, - 367, - 557, - 823, - 1237, - 1861, - 2777, - 4177, - 6247, - 9371, - 14057, - 21089, - 31627, - 47431, - 71143, - 106721, - 160073, - 240101, - 360163, - 540217, - 810343, - 1215497, - 1823231, - 2734867, - 4102283, - 6153409, - 9230113, - 13845163, - }; - - - static FT_Long - ft_mem_closest_prime( FT_Long num ) - { - size_t i; - - - for ( i = 0; - i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ ) - if ( ft_mem_primes[i] > num ) - return ft_mem_primes[i]; - - return FT_MEM_SIZE_MAX; - } - - - static void - ft_mem_debug_panic( const char* fmt, - ... ) - { - va_list ap; - - - printf( "FreeType.Debug: " ); - - va_start( ap, fmt ); - vprintf( fmt, ap ); - va_end( ap ); - - printf( "\n" ); - exit( EXIT_FAILURE ); - } - - - static FT_Pointer - ft_mem_table_alloc( FT_MemTable table, - FT_Long size ) - { - FT_Memory memory = table->memory; - FT_Pointer block; - - - memory->user = table->memory_user; - block = table->alloc( memory, size ); - memory->user = table; - - return block; - } - - - static void - ft_mem_table_free( FT_MemTable table, - FT_Pointer block ) - { - FT_Memory memory = table->memory; - - - memory->user = table->memory_user; - table->free( memory, block ); - memory->user = table; - } - - - static void - ft_mem_table_resize( FT_MemTable table ) - { - FT_Long new_size; - - - new_size = ft_mem_closest_prime( table->nodes ); - if ( new_size != table->size ) - { - FT_MemNode* new_buckets; - FT_Long i; - - - new_buckets = (FT_MemNode *) - ft_mem_table_alloc( - table, - new_size * (FT_Long)sizeof ( FT_MemNode ) ); - if ( new_buckets == NULL ) - return; - - FT_ARRAY_ZERO( new_buckets, new_size ); - - for ( i = 0; i < table->size; i++ ) - { - FT_MemNode node, next, *pnode; - FT_PtrDist hash; - - - node = table->buckets[i]; - while ( node ) - { - next = node->link; - hash = FT_MEM_VAL( node->address ) % (FT_PtrDist)new_size; - pnode = new_buckets + hash; - - node->link = pnode[0]; - pnode[0] = node; - - node = next; - } - } - - if ( table->buckets ) - ft_mem_table_free( table, table->buckets ); - - table->buckets = new_buckets; - table->size = new_size; - } - } - - - static FT_MemTable - ft_mem_table_new( FT_Memory memory ) - { - FT_MemTable table; - - - table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) ); - if ( table == NULL ) - goto Exit; - - FT_ZERO( table ); - - table->size = FT_MEM_SIZE_MIN; - table->nodes = 0; - - table->memory = memory; - - table->memory_user = memory->user; - - table->alloc = memory->alloc; - table->realloc = memory->realloc; - table->free = memory->free; - - table->buckets = (FT_MemNode *) - memory->alloc( - memory, - table->size * (FT_Long)sizeof ( FT_MemNode ) ); - if ( table->buckets ) - FT_ARRAY_ZERO( table->buckets, table->size ); - else - { - memory->free( memory, table ); - table = NULL; - } - - Exit: - return table; - } - - - static void - ft_mem_table_destroy( FT_MemTable table ) - { - FT_Long i; - FT_Long leak_count = 0; - FT_Long leaks = 0; - - - FT_DumpMemory( table->memory ); - - /* remove all blocks from the table, revealing leaked ones */ - for ( i = 0; i < table->size; i++ ) - { - FT_MemNode *pnode = table->buckets + i, next, node = *pnode; - - - while ( node ) - { - next = node->link; - node->link = NULL; - - if ( node->size > 0 ) - { - printf( - "leaked memory block at address %p, size %8ld in (%s:%ld)\n", - node->address, node->size, - FT_FILENAME( node->source->file_name ), - node->source->line_no ); - - leak_count++; - leaks += node->size; - - ft_mem_table_free( table, node->address ); - } - - node->address = NULL; - node->size = 0; - - ft_mem_table_free( table, node ); - node = next; - } - table->buckets[i] = NULL; - } - - ft_mem_table_free( table, table->buckets ); - table->buckets = NULL; - - table->size = 0; - table->nodes = 0; - - /* remove all sources */ - for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ ) - { - FT_MemSource source, next; - - - for ( source = table->sources[i]; source != NULL; source = next ) - { - next = source->link; - ft_mem_table_free( table, source ); - } - - table->sources[i] = NULL; - } - - printf( "FreeType: total memory allocations = %ld\n", - table->alloc_total ); - printf( "FreeType: maximum memory footprint = %ld\n", - table->alloc_max ); - - ft_mem_table_free( table, table ); - - if ( leak_count > 0 ) - ft_mem_debug_panic( - "FreeType: %ld bytes of memory leaked in %ld blocks\n", - leaks, leak_count ); - - printf( "FreeType: no memory leaks detected\n" ); - } - - - static FT_MemNode* - ft_mem_table_get_nodep( FT_MemTable table, - FT_Byte* address ) - { - FT_PtrDist hash; - FT_MemNode *pnode, node; - - - hash = FT_MEM_VAL( address ); - pnode = table->buckets + ( hash % (FT_PtrDist)table->size ); - - for (;;) - { - node = pnode[0]; - if ( !node ) - break; - - if ( node->address == address ) - break; - - pnode = &node->link; - } - return pnode; - } - - - static FT_MemSource - ft_mem_table_get_source( FT_MemTable table ) - { - FT_UInt32 hash; - FT_MemSource node, *pnode; - - - /* cast to FT_PtrDist first since void* can be larger */ - /* than FT_UInt32 and GCC 4.1.1 emits a warning */ - hash = (FT_UInt32)(FT_PtrDist)(void*)_ft_debug_file + - (FT_UInt32)( 5 * _ft_debug_lineno ); - pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS]; - - for ( ;; ) - { - node = *pnode; - if ( node == NULL ) - break; - - if ( node->file_name == _ft_debug_file && - node->line_no == _ft_debug_lineno ) - goto Exit; - - pnode = &node->link; - } - - node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) ); - if ( node == NULL ) - ft_mem_debug_panic( - "not enough memory to perform memory debugging\n" ); - - node->file_name = _ft_debug_file; - node->line_no = _ft_debug_lineno; - - node->cur_blocks = 0; - node->max_blocks = 0; - node->all_blocks = 0; - - node->cur_size = 0; - node->max_size = 0; - node->all_size = 0; - - node->cur_max = 0; - - node->link = NULL; - node->hash = hash; - *pnode = node; - - Exit: - return node; - } - - - static void - ft_mem_table_set( FT_MemTable table, - FT_Byte* address, - FT_Long size, - FT_Long delta ) - { - FT_MemNode *pnode, node; - - - if ( table ) - { - FT_MemSource source; - - - pnode = ft_mem_table_get_nodep( table, address ); - node = *pnode; - if ( node ) - { - if ( node->size < 0 ) - { - /* This block was already freed. Our memory is now completely */ - /* corrupted! */ - /* This can only happen in keep-alive mode. */ - ft_mem_debug_panic( - "memory heap corrupted (allocating freed block)" ); - } - else - { - /* This block was already allocated. This means that our memory */ - /* is also corrupted! */ - ft_mem_debug_panic( - "memory heap corrupted (re-allocating allocated block at" - " %p, of size %ld)\n" - "org=%s:%d new=%s:%d\n", - node->address, node->size, - FT_FILENAME( node->source->file_name ), node->source->line_no, - FT_FILENAME( _ft_debug_file ), _ft_debug_lineno ); - } - } - - /* we need to create a new node in this table */ - node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) ); - if ( node == NULL ) - ft_mem_debug_panic( "not enough memory to run memory tests" ); - - node->address = address; - node->size = size; - node->source = source = ft_mem_table_get_source( table ); - - if ( delta == 0 ) - { - /* this is an allocation */ - source->all_blocks++; - source->cur_blocks++; - if ( source->cur_blocks > source->max_blocks ) - source->max_blocks = source->cur_blocks; - } - - if ( size > source->cur_max ) - source->cur_max = size; - - if ( delta != 0 ) - { - /* we are growing or shrinking a reallocated block */ - source->cur_size += delta; - table->alloc_current += delta; - } - else - { - /* we are allocating a new block */ - source->cur_size += size; - table->alloc_current += size; - } - - source->all_size += size; - - if ( source->cur_size > source->max_size ) - source->max_size = source->cur_size; - - node->free_file_name = NULL; - node->free_line_no = 0; - - node->link = pnode[0]; - - pnode[0] = node; - table->nodes++; - - table->alloc_total += size; - - if ( table->alloc_current > table->alloc_max ) - table->alloc_max = table->alloc_current; - - if ( table->nodes * 3 < table->size || - table->size * 3 < table->nodes ) - ft_mem_table_resize( table ); - } - } - - - static void - ft_mem_table_remove( FT_MemTable table, - FT_Byte* address, - FT_Long delta ) - { - if ( table ) - { - FT_MemNode *pnode, node; - - - pnode = ft_mem_table_get_nodep( table, address ); - node = *pnode; - if ( node ) - { - FT_MemSource source; - - - if ( node->size < 0 ) - ft_mem_debug_panic( - "freeing memory block at %p more than once at (%s:%ld)\n" - "block allocated at (%s:%ld) and released at (%s:%ld)", - address, - FT_FILENAME( _ft_debug_file ), _ft_debug_lineno, - FT_FILENAME( node->source->file_name ), node->source->line_no, - FT_FILENAME( node->free_file_name ), node->free_line_no ); - - /* scramble the node's content for additional safety */ - FT_MEM_SET( address, 0xF3, node->size ); - - if ( delta == 0 ) - { - source = node->source; - - source->cur_blocks--; - source->cur_size -= node->size; - - table->alloc_current -= node->size; - } - - if ( table->keep_alive ) - { - /* we simply invert the node's size to indicate that the node */ - /* was freed. */ - node->size = -node->size; - node->free_file_name = _ft_debug_file; - node->free_line_no = _ft_debug_lineno; - } - else - { - table->nodes--; - - *pnode = node->link; - - node->size = 0; - node->source = NULL; - - ft_mem_table_free( table, node ); - - if ( table->nodes * 3 < table->size || - table->size * 3 < table->nodes ) - ft_mem_table_resize( table ); - } - } - else - ft_mem_debug_panic( - "trying to free unknown block at %p in (%s:%ld)\n", - address, - FT_FILENAME( _ft_debug_file ), _ft_debug_lineno ); - } - } - - - static FT_Pointer - ft_mem_debug_alloc( FT_Memory memory, - FT_Long size ) - { - FT_MemTable table = (FT_MemTable)memory->user; - FT_Byte* block; - - - if ( size <= 0 ) - ft_mem_debug_panic( "negative block size allocation (%ld)", size ); - - /* return NULL if the maximum number of allocations was reached */ - if ( table->bound_count && - table->alloc_count >= table->alloc_count_max ) - return NULL; - - /* return NULL if this allocation would overflow the maximum heap size */ - if ( table->bound_total && - table->alloc_total_max - table->alloc_current > size ) - return NULL; - - block = (FT_Byte *)ft_mem_table_alloc( table, size ); - if ( block ) - { - ft_mem_table_set( table, block, size, 0 ); - - table->alloc_count++; - } - - _ft_debug_file = "<unknown>"; - _ft_debug_lineno = 0; - - return (FT_Pointer)block; - } - - - static void - ft_mem_debug_free( FT_Memory memory, - FT_Pointer block ) - { - FT_MemTable table = (FT_MemTable)memory->user; - - - if ( block == NULL ) - ft_mem_debug_panic( "trying to free NULL in (%s:%ld)", - FT_FILENAME( _ft_debug_file ), - _ft_debug_lineno ); - - ft_mem_table_remove( table, (FT_Byte*)block, 0 ); - - if ( !table->keep_alive ) - ft_mem_table_free( table, block ); - - table->alloc_count--; - - _ft_debug_file = "<unknown>"; - _ft_debug_lineno = 0; - } - - - static FT_Pointer - ft_mem_debug_realloc( FT_Memory memory, - FT_Long cur_size, - FT_Long new_size, - FT_Pointer block ) - { - FT_MemTable table = (FT_MemTable)memory->user; - FT_MemNode node, *pnode; - FT_Pointer new_block; - FT_Long delta; - - const char* file_name = FT_FILENAME( _ft_debug_file ); - FT_Long line_no = _ft_debug_lineno; - - - /* unlikely, but possible */ - if ( new_size == cur_size ) - return block; - - /* the following is valid according to ANSI C */ -#if 0 - if ( block == NULL || cur_size == 0 ) - ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)", - file_name, line_no ); -#endif - - /* while the following is allowed in ANSI C also, we abort since */ - /* such case should be handled by FreeType. */ - if ( new_size <= 0 ) - ft_mem_debug_panic( - "trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)", - block, cur_size, file_name, line_no ); - - /* check `cur_size' value */ - pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block ); - node = *pnode; - if ( !node ) - ft_mem_debug_panic( - "trying to reallocate unknown block at %p in (%s:%ld)", - block, file_name, line_no ); - - if ( node->size <= 0 ) - ft_mem_debug_panic( - "trying to reallocate freed block at %p in (%s:%ld)", - block, file_name, line_no ); - - if ( node->size != cur_size ) - ft_mem_debug_panic( "invalid ft_realloc request for %p. cur_size is " - "%ld instead of %ld in (%s:%ld)", - block, cur_size, node->size, file_name, line_no ); - - /* return NULL if the maximum number of allocations was reached */ - if ( table->bound_count && - table->alloc_count >= table->alloc_count_max ) - return NULL; - - delta = new_size - cur_size; - - /* return NULL if this allocation would overflow the maximum heap size */ - if ( delta > 0 && - table->bound_total && - table->alloc_current + delta > table->alloc_total_max ) - return NULL; - - new_block = (FT_Pointer)ft_mem_table_alloc( table, new_size ); - if ( new_block == NULL ) - return NULL; - - ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta ); - - ft_memcpy( new_block, block, cur_size < new_size ? (size_t)cur_size - : (size_t)new_size ); - - ft_mem_table_remove( table, (FT_Byte*)block, delta ); - - _ft_debug_file = "<unknown>"; - _ft_debug_lineno = 0; - - if ( !table->keep_alive ) - ft_mem_table_free( table, block ); - - return new_block; - } - - - extern FT_Int - ft_mem_debug_init( FT_Memory memory ) - { - FT_MemTable table; - FT_Int result = 0; - - - if ( getenv( "FT2_DEBUG_MEMORY" ) ) - { - table = ft_mem_table_new( memory ); - if ( table ) - { - const char* p; - - - memory->user = table; - memory->alloc = ft_mem_debug_alloc; - memory->realloc = ft_mem_debug_realloc; - memory->free = ft_mem_debug_free; - - p = getenv( "FT2_ALLOC_TOTAL_MAX" ); - if ( p != NULL ) - { - FT_Long total_max = ft_atol( p ); - - - if ( total_max > 0 ) - { - table->bound_total = 1; - table->alloc_total_max = total_max; - } - } - - p = getenv( "FT2_ALLOC_COUNT_MAX" ); - if ( p != NULL ) - { - FT_Long total_count = ft_atol( p ); - - - if ( total_count > 0 ) - { - table->bound_count = 1; - table->alloc_count_max = total_count; - } - } - - p = getenv( "FT2_KEEP_ALIVE" ); - if ( p != NULL ) - { - FT_Long keep_alive = ft_atol( p ); - - - if ( keep_alive > 0 ) - table->keep_alive = 1; - } - - result = 1; - } - } - return result; - } - - - extern void - ft_mem_debug_done( FT_Memory memory ) - { - FT_MemTable table = (FT_MemTable)memory->user; - - - if ( table ) - { - memory->free = table->free; - memory->realloc = table->realloc; - memory->alloc = table->alloc; - - ft_mem_table_destroy( table ); - memory->user = NULL; - } - } - - - static int - ft_mem_source_compare( const void* p1, - const void* p2 ) - { - FT_MemSource s1 = *(FT_MemSource*)p1; - FT_MemSource s2 = *(FT_MemSource*)p2; - - - if ( s2->max_size > s1->max_size ) - return 1; - else if ( s2->max_size < s1->max_size ) - return -1; - else - return 0; - } - - - extern void - FT_DumpMemory( FT_Memory memory ) - { - FT_MemTable table = (FT_MemTable)memory->user; - - - if ( table ) - { - FT_MemSource* bucket = table->sources; - FT_MemSource* limit = bucket + FT_MEM_SOURCE_BUCKETS; - FT_MemSource* sources; - FT_Int nn, count; - const char* fmt; - - - count = 0; - for ( ; bucket < limit; bucket++ ) - { - FT_MemSource source = *bucket; - - - for ( ; source; source = source->link ) - count++; - } - - sources = (FT_MemSource*) - ft_mem_table_alloc( - table, count * (FT_Long)sizeof ( *sources ) ); - - count = 0; - for ( bucket = table->sources; bucket < limit; bucket++ ) - { - FT_MemSource source = *bucket; - - - for ( ; source; source = source->link ) - sources[count++] = source; - } - - ft_qsort( sources, - (size_t)count, - sizeof ( *sources ), - ft_mem_source_compare ); - - printf( "FreeType Memory Dump: " - "current=%ld max=%ld total=%ld count=%ld\n", - table->alloc_current, table->alloc_max, - table->alloc_total, table->alloc_count ); - printf( " block block sizes sizes sizes source\n" ); - printf( " count high sum highsum max location\n" ); - printf( "-------------------------------------------------\n" ); - - fmt = "%6ld %6ld %8ld %8ld %8ld %s:%d\n"; - - for ( nn = 0; nn < count; nn++ ) - { - FT_MemSource source = sources[nn]; - - - printf( fmt, - source->cur_blocks, source->max_blocks, - source->cur_size, source->max_size, source->cur_max, - FT_FILENAME( source->file_name ), - source->line_no ); - } - printf( "------------------------------------------------\n" ); - - ft_mem_table_free( table, sources ); - } - } - -#else /* !FT_DEBUG_MEMORY */ - - /* ANSI C doesn't like empty source files */ - typedef int _debug_mem_dummy; - -#endif /* !FT_DEBUG_MEMORY */ - - -/* END */ diff --git a/3party/freetype/src/base/ftdebug.c b/3party/freetype/src/base/ftdebug.c deleted file mode 100644 index 03e18a8699..0000000000 --- a/3party/freetype/src/base/ftdebug.c +++ /dev/null @@ -1,266 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftdebug.c */ -/* */ -/* Debugging and logging component (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This component contains various macros and functions used to ease the */ - /* debugging of the FreeType engine. Its main purpose is in assertion */ - /* checking, tracing, and error detection. */ - /* */ - /* There are now three debugging modes: */ - /* */ - /* - trace mode */ - /* */ - /* Error and trace messages are sent to the log file (which can be the */ - /* standard error output). */ - /* */ - /* - error mode */ - /* */ - /* Only error messages are generated. */ - /* */ - /* - release mode: */ - /* */ - /* No error message is sent or generated. The code is free from any */ - /* debugging parts. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_DEBUG_H - - -#ifdef FT_DEBUG_LEVEL_ERROR - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( void ) - FT_Message( const char* fmt, - ... ) - { - va_list ap; - - - va_start( ap, fmt ); - vfprintf( stderr, fmt, ap ); - va_end( ap ); - } - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( void ) - FT_Panic( const char* fmt, - ... ) - { - va_list ap; - - - va_start( ap, fmt ); - vfprintf( stderr, fmt, ap ); - va_end( ap ); - - exit( EXIT_FAILURE ); - } - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( int ) - FT_Throw( FT_Error error, - int line, - const char* file ) - { - FT_UNUSED( error ); - FT_UNUSED( line ); - FT_UNUSED( file ); - - return 0; - } - -#endif /* FT_DEBUG_LEVEL_ERROR */ - - - -#ifdef FT_DEBUG_LEVEL_TRACE - - /* array of trace levels, initialized to 0 */ - int ft_trace_levels[trace_count]; - - - /* define array of trace toggle names */ -#define FT_TRACE_DEF( x ) #x , - - static const char* ft_trace_toggles[trace_count + 1] = - { -#include FT_INTERNAL_TRACE_H - NULL - }; - -#undef FT_TRACE_DEF - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( FT_Int ) - FT_Trace_Get_Count( void ) - { - return trace_count; - } - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( const char * ) - FT_Trace_Get_Name( FT_Int idx ) - { - int max = FT_Trace_Get_Count(); - - - if ( idx < max ) - return ft_trace_toggles[idx]; - else - return NULL; - } - - - /*************************************************************************/ - /* */ - /* Initialize the tracing sub-system. This is done by retrieving the */ - /* value of the `FT2_DEBUG' environment variable. It must be a list of */ - /* toggles, separated by spaces, `;', or `,'. Example: */ - /* */ - /* export FT2_DEBUG="any:3 memory:7 stream:5" */ - /* */ - /* This requests that all levels be set to 3, except the trace level for */ - /* the memory and stream components which are set to 7 and 5, */ - /* respectively. */ - /* */ - /* See the file `include/freetype/internal/fttrace.h' for details of */ - /* the available toggle names. */ - /* */ - /* The level must be between 0 and 7; 0 means quiet (except for serious */ - /* runtime errors), and 7 means _very_ verbose. */ - /* */ - FT_BASE_DEF( void ) - ft_debug_init( void ) - { - const char* ft2_debug = getenv( "FT2_DEBUG" ); - - - if ( ft2_debug ) - { - const char* p = ft2_debug; - const char* q; - - - for ( ; *p; p++ ) - { - /* skip leading whitespace and separators */ - if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) - continue; - - /* read toggle name, followed by ':' */ - q = p; - while ( *p && *p != ':' ) - p++; - - if ( !*p ) - break; - - if ( *p == ':' && p > q ) - { - FT_Int n, i, len = (FT_Int)( p - q ); - FT_Int level = -1, found = -1; - - - for ( n = 0; n < trace_count; n++ ) - { - const char* toggle = ft_trace_toggles[n]; - - - for ( i = 0; i < len; i++ ) - { - if ( toggle[i] != q[i] ) - break; - } - - if ( i == len && toggle[i] == 0 ) - { - found = n; - break; - } - } - - /* read level */ - p++; - if ( *p ) - { - level = *p - '0'; - if ( level < 0 || level > 7 ) - level = -1; - } - - if ( found >= 0 && level >= 0 ) - { - if ( found == trace_any ) - { - /* special case for `any' */ - for ( n = 0; n < trace_count; n++ ) - ft_trace_levels[n] = level; - } - else - ft_trace_levels[found] = level; - } - } - } - } - } - - -#else /* !FT_DEBUG_LEVEL_TRACE */ - - - FT_BASE_DEF( void ) - ft_debug_init( void ) - { - /* nothing */ - } - - - FT_BASE_DEF( FT_Int ) - FT_Trace_Get_Count( void ) - { - return 0; - } - - - FT_BASE_DEF( const char * ) - FT_Trace_Get_Name( FT_Int idx ) - { - FT_UNUSED( idx ); - - return NULL; - } - - -#endif /* !FT_DEBUG_LEVEL_TRACE */ - - -/* END */ diff --git a/3party/freetype/src/base/ftfntfmt.c b/3party/freetype/src/base/ftfntfmt.c deleted file mode 100644 index 98e7431a2b..0000000000 --- a/3party/freetype/src/base/ftfntfmt.c +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftfntfmt.c */ -/* */ -/* FreeType utility file for font formats (body). */ -/* */ -/* Copyright 2002-2015 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 <ft2build.h> -#include FT_FONT_FORMATS_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_FONT_FORMAT_H - - - /* documentation is in ftfntfmt.h */ - - FT_EXPORT_DEF( const char* ) - FT_Get_Font_Format( FT_Face face ) - { - const char* result = NULL; - - - if ( face ) - FT_FACE_FIND_SERVICE( face, result, FONT_FORMAT ); - - return result; - } - - - /* deprecated function name; retained for ABI compatibility */ - - FT_EXPORT_DEF( const char* ) - FT_Get_X11_Font_Format( FT_Face face ) - { - const char* result = NULL; - - - if ( face ) - FT_FACE_FIND_SERVICE( face, result, FONT_FORMAT ); - - return result; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftfstype.c b/3party/freetype/src/base/ftfstype.c deleted file mode 100644 index cd3458f73e..0000000000 --- a/3party/freetype/src/base/ftfstype.c +++ /dev/null @@ -1,62 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftfstype.c */ -/* */ -/* FreeType utility file to access FSType data (body). */ -/* */ -/* Copyright 2008-2015 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 <ft2build.h> -#include FT_TYPE1_TABLES_H -#include FT_TRUETYPE_TABLES_H -#include FT_INTERNAL_SERVICE_H -#include FT_SERVICE_POSTSCRIPT_INFO_H - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_UShort ) - FT_Get_FSType_Flags( FT_Face face ) - { - TT_OS2* os2; - - - /* first, try to get the fs_type directly from the font */ - if ( face ) - { - FT_Service_PsInfo service = NULL; - - - FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); - - if ( service && service->ps_get_font_extra ) - { - PS_FontExtraRec extra; - - - if ( !service->ps_get_font_extra( face, &extra ) && - extra.fs_type != 0 ) - return extra.fs_type; - } - } - - /* look at FSType before fsType for Type42 */ - - if ( ( os2 = (TT_OS2*)FT_Get_Sfnt_Table( face, FT_SFNT_OS2 ) ) != NULL && - os2->version != 0xFFFFU ) - return os2->fsType; - - return 0; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftgasp.c b/3party/freetype/src/base/ftgasp.c deleted file mode 100644 index bbd257c479..0000000000 --- a/3party/freetype/src/base/ftgasp.c +++ /dev/null @@ -1,61 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgasp.c */ -/* */ -/* Access of TrueType's `gasp' table (body). */ -/* */ -/* Copyright 2007-2015 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 <ft2build.h> -#include FT_GASP_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - - FT_EXPORT_DEF( FT_Int ) - FT_Get_Gasp( FT_Face face, - FT_UInt ppem ) - { - FT_Int result = FT_GASP_NO_TABLE; - - - if ( face && FT_IS_SFNT( face ) ) - { - TT_Face ttface = (TT_Face)face; - - - if ( ttface->gasp.numRanges > 0 ) - { - TT_GaspRange range = ttface->gasp.gaspRanges; - TT_GaspRange range_end = range + ttface->gasp.numRanges; - - - while ( ppem > range->maxPPEM ) - { - range++; - if ( range >= range_end ) - goto Exit; - } - - result = range->gaspFlag; - - /* ensure that we don't have spurious bits */ - if ( ttface->gasp.version == 0 ) - result &= 3; - } - } - Exit: - return result; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftgloadr.c b/3party/freetype/src/base/ftgloadr.c deleted file mode 100644 index 7e28638b27..0000000000 --- a/3party/freetype/src/base/ftgloadr.c +++ /dev/null @@ -1,406 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgloadr.c */ -/* */ -/* The FreeType glyph loader (body). */ -/* */ -/* Copyright 2002-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_GLYPH_LOADER_H -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_OBJECTS_H - -#undef FT_COMPONENT -#define FT_COMPONENT trace_gloader - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** *****/ - /***** G L Y P H L O A D E R *****/ - /***** *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* The glyph loader is a simple object which is used to load a set of */ - /* glyphs easily. It is critical for the correct loading of composites. */ - /* */ - /* Ideally, one can see it as a stack of abstract `glyph' objects. */ - /* */ - /* loader.base Is really the bottom of the stack. It describes a */ - /* single glyph image made of the juxtaposition of */ - /* several glyphs (those `in the stack'). */ - /* */ - /* loader.current Describes the top of the stack, on which a new */ - /* glyph can be loaded. */ - /* */ - /* Rewind Clears the stack. */ - /* Prepare Set up `loader.current' for addition of a new glyph */ - /* image. */ - /* Add Add the `current' glyph image to the `base' one, */ - /* and prepare for another one. */ - /* */ - /* The glyph loader is now a base object. Each driver used to */ - /* re-implement it in one way or the other, which wasted code and */ - /* energy. */ - /* */ - /*************************************************************************/ - - - /* create a new glyph loader */ - FT_BASE_DEF( FT_Error ) - FT_GlyphLoader_New( FT_Memory memory, - FT_GlyphLoader *aloader ) - { - FT_GlyphLoader loader = NULL; - FT_Error error; - - - if ( !FT_NEW( loader ) ) - { - loader->memory = memory; - *aloader = loader; - } - return error; - } - - - /* rewind the glyph loader - reset counters to 0 */ - FT_BASE_DEF( void ) - FT_GlyphLoader_Rewind( FT_GlyphLoader loader ) - { - FT_GlyphLoad base = &loader->base; - FT_GlyphLoad current = &loader->current; - - - base->outline.n_points = 0; - base->outline.n_contours = 0; - base->num_subglyphs = 0; - - *current = *base; - } - - - /* reset the glyph loader, frees all allocated tables */ - /* and starts from zero */ - FT_BASE_DEF( void ) - FT_GlyphLoader_Reset( FT_GlyphLoader loader ) - { - FT_Memory memory = loader->memory; - - - FT_FREE( loader->base.outline.points ); - FT_FREE( loader->base.outline.tags ); - FT_FREE( loader->base.outline.contours ); - FT_FREE( loader->base.extra_points ); - FT_FREE( loader->base.subglyphs ); - - loader->base.extra_points2 = NULL; - - loader->max_points = 0; - loader->max_contours = 0; - loader->max_subglyphs = 0; - - FT_GlyphLoader_Rewind( loader ); - } - - - /* delete a glyph loader */ - FT_BASE_DEF( void ) - FT_GlyphLoader_Done( FT_GlyphLoader loader ) - { - if ( loader ) - { - FT_Memory memory = loader->memory; - - - FT_GlyphLoader_Reset( loader ); - FT_FREE( loader ); - } - } - - - /* re-adjust the `current' outline fields */ - static void - FT_GlyphLoader_Adjust_Points( FT_GlyphLoader loader ) - { - FT_Outline* base = &loader->base.outline; - FT_Outline* current = &loader->current.outline; - - - current->points = base->points + base->n_points; - current->tags = base->tags + base->n_points; - current->contours = base->contours + base->n_contours; - - /* handle extra points table - if any */ - if ( loader->use_extra ) - { - loader->current.extra_points = loader->base.extra_points + - base->n_points; - - loader->current.extra_points2 = loader->base.extra_points2 + - base->n_points; - } - } - - - FT_BASE_DEF( FT_Error ) - FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ) - { - FT_Error error; - FT_Memory memory = loader->memory; - - - if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) ) - { - loader->use_extra = 1; - loader->base.extra_points2 = loader->base.extra_points + - loader->max_points; - - FT_GlyphLoader_Adjust_Points( loader ); - } - return error; - } - - - /* re-adjust the `current' subglyphs field */ - static void - FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader loader ) - { - FT_GlyphLoad base = &loader->base; - FT_GlyphLoad current = &loader->current; - - - current->subglyphs = base->subglyphs + base->num_subglyphs; - } - - - /* Ensure that we can add `n_points' and `n_contours' to our glyph. */ - /* This function reallocates its outline tables if necessary. Note that */ - /* it DOESN'T change the number of points within the loader! */ - /* */ - FT_BASE_DEF( FT_Error ) - FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, - FT_UInt n_points, - FT_UInt n_contours ) - { - FT_Memory memory = loader->memory; - FT_Error error = FT_Err_Ok; - FT_Outline* base = &loader->base.outline; - FT_Outline* current = &loader->current.outline; - FT_Bool adjust = 0; - - FT_UInt new_max, old_max; - - - /* check points & tags */ - new_max = (FT_UInt)base->n_points + (FT_UInt)current->n_points + - n_points; - old_max = loader->max_points; - - if ( new_max > old_max ) - { - new_max = FT_PAD_CEIL( new_max, 8 ); - - if ( new_max > FT_OUTLINE_POINTS_MAX ) - return FT_THROW( Array_Too_Large ); - - if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) || - FT_RENEW_ARRAY( base->tags, old_max, new_max ) ) - goto Exit; - - if ( loader->use_extra ) - { - if ( FT_RENEW_ARRAY( loader->base.extra_points, - old_max * 2, new_max * 2 ) ) - goto Exit; - - FT_ARRAY_MOVE( loader->base.extra_points + new_max, - loader->base.extra_points + old_max, - old_max ); - - loader->base.extra_points2 = loader->base.extra_points + new_max; - } - - adjust = 1; - loader->max_points = new_max; - } - - /* check contours */ - old_max = loader->max_contours; - new_max = (FT_UInt)base->n_contours + (FT_UInt)current->n_contours + - n_contours; - if ( new_max > old_max ) - { - new_max = FT_PAD_CEIL( new_max, 4 ); - - if ( new_max > FT_OUTLINE_CONTOURS_MAX ) - return FT_THROW( Array_Too_Large ); - - if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) ) - goto Exit; - - adjust = 1; - loader->max_contours = new_max; - } - - if ( adjust ) - FT_GlyphLoader_Adjust_Points( loader ); - - Exit: - if ( error ) - FT_GlyphLoader_Reset( loader ); - - return error; - } - - - /* Ensure that we can add `n_subglyphs' to our glyph. this function */ - /* reallocates its subglyphs table if necessary. Note that it DOES */ - /* NOT change the number of subglyphs within the loader! */ - /* */ - FT_BASE_DEF( FT_Error ) - FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, - FT_UInt n_subs ) - { - FT_Memory memory = loader->memory; - FT_Error error = FT_Err_Ok; - FT_UInt new_max, old_max; - - FT_GlyphLoad base = &loader->base; - FT_GlyphLoad current = &loader->current; - - - new_max = base->num_subglyphs + current->num_subglyphs + n_subs; - old_max = loader->max_subglyphs; - if ( new_max > old_max ) - { - new_max = FT_PAD_CEIL( new_max, 2 ); - if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) ) - goto Exit; - - loader->max_subglyphs = new_max; - - FT_GlyphLoader_Adjust_Subglyphs( loader ); - } - - Exit: - return error; - } - - - /* prepare loader for the addition of a new glyph on top of the base one */ - FT_BASE_DEF( void ) - FT_GlyphLoader_Prepare( FT_GlyphLoader loader ) - { - FT_GlyphLoad current = &loader->current; - - - current->outline.n_points = 0; - current->outline.n_contours = 0; - current->num_subglyphs = 0; - - FT_GlyphLoader_Adjust_Points ( loader ); - FT_GlyphLoader_Adjust_Subglyphs( loader ); - } - - - /* add current glyph to the base image -- and prepare for another */ - FT_BASE_DEF( void ) - FT_GlyphLoader_Add( FT_GlyphLoader loader ) - { - FT_GlyphLoad base; - FT_GlyphLoad current; - - FT_Int n_curr_contours; - FT_Int n_base_points; - FT_Int n; - - - if ( !loader ) - return; - - base = &loader->base; - current = &loader->current; - - n_curr_contours = current->outline.n_contours; - n_base_points = base->outline.n_points; - - base->outline.n_points = - (short)( base->outline.n_points + current->outline.n_points ); - base->outline.n_contours = - (short)( base->outline.n_contours + current->outline.n_contours ); - - base->num_subglyphs += current->num_subglyphs; - - /* adjust contours count in newest outline */ - for ( n = 0; n < n_curr_contours; n++ ) - current->outline.contours[n] = - (short)( current->outline.contours[n] + n_base_points ); - - /* prepare for another new glyph image */ - FT_GlyphLoader_Prepare( loader ); - } - - - FT_BASE_DEF( FT_Error ) - FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, - FT_GlyphLoader source ) - { - FT_Error error; - FT_UInt num_points = (FT_UInt)source->base.outline.n_points; - FT_UInt num_contours = (FT_UInt)source->base.outline.n_contours; - - - error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours ); - if ( !error ) - { - FT_Outline* out = &target->base.outline; - FT_Outline* in = &source->base.outline; - - - FT_ARRAY_COPY( out->points, in->points, - num_points ); - FT_ARRAY_COPY( out->tags, in->tags, - num_points ); - FT_ARRAY_COPY( out->contours, in->contours, - num_contours ); - - /* do we need to copy the extra points? */ - if ( target->use_extra && source->use_extra ) - { - FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points, - num_points ); - FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2, - num_points ); - } - - out->n_points = (short)num_points; - out->n_contours = (short)num_contours; - - FT_GlyphLoader_Adjust_Points( target ); - } - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftglyph.c b/3party/freetype/src/base/ftglyph.c deleted file mode 100644 index cb7fc37787..0000000000 --- a/3party/freetype/src/base/ftglyph.c +++ /dev/null @@ -1,629 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftglyph.c */ -/* */ -/* FreeType convenience functions to handle glyphs (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* This file contains the definition of several convenience functions */ - /* that can be used by client applications to easily retrieve glyph */ - /* bitmaps and outlines from a given face. */ - /* */ - /* These functions should be optional if you are writing a font server */ - /* or text layout engine on top of FreeType. However, they are pretty */ - /* handy for many other simple uses of the library. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H - -#include FT_GLYPH_H -#include FT_OUTLINE_H -#include FT_BITMAP_H -#include FT_INTERNAL_OBJECTS_H - -#include "basepic.h" - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_glyph - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** FT_BitmapGlyph support ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_CALLBACK_DEF( FT_Error ) - ft_bitmap_glyph_init( FT_Glyph bitmap_glyph, - FT_GlyphSlot slot ) - { - FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; - FT_Error error = FT_Err_Ok; - FT_Library library = FT_GLYPH( glyph )->library; - - - if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) - { - error = FT_THROW( Invalid_Glyph_Format ); - goto Exit; - } - - glyph->left = slot->bitmap_left; - glyph->top = slot->bitmap_top; - - /* do lazy copying whenever possible */ - if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) - { - glyph->bitmap = slot->bitmap; - slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; - } - else - { - FT_Bitmap_Init( &glyph->bitmap ); - error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap ); - } - - Exit: - return error; - } - - - FT_CALLBACK_DEF( FT_Error ) - ft_bitmap_glyph_copy( FT_Glyph bitmap_source, - FT_Glyph bitmap_target ) - { - FT_Library library = bitmap_source->library; - FT_BitmapGlyph source = (FT_BitmapGlyph)bitmap_source; - FT_BitmapGlyph target = (FT_BitmapGlyph)bitmap_target; - - - target->left = source->left; - target->top = source->top; - - return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap ); - } - - - FT_CALLBACK_DEF( void ) - ft_bitmap_glyph_done( FT_Glyph bitmap_glyph ) - { - FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; - FT_Library library = FT_GLYPH( glyph )->library; - - - FT_Bitmap_Done( library, &glyph->bitmap ); - } - - - FT_CALLBACK_DEF( void ) - ft_bitmap_glyph_bbox( FT_Glyph bitmap_glyph, - FT_BBox* cbox ) - { - FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; - - - cbox->xMin = glyph->left << 6; - cbox->xMax = cbox->xMin + (FT_Pos)( glyph->bitmap.width << 6 ); - cbox->yMax = glyph->top << 6; - cbox->yMin = cbox->yMax - (FT_Pos)( glyph->bitmap.rows << 6 ); - } - - - FT_DEFINE_GLYPH(ft_bitmap_glyph_class, - sizeof ( FT_BitmapGlyphRec ), - FT_GLYPH_FORMAT_BITMAP, - - ft_bitmap_glyph_init, - ft_bitmap_glyph_done, - ft_bitmap_glyph_copy, - 0, /* FT_Glyph_TransformFunc */ - ft_bitmap_glyph_bbox, - 0 /* FT_Glyph_PrepareFunc */ - ) - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** FT_OutlineGlyph support ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_CALLBACK_DEF( FT_Error ) - ft_outline_glyph_init( FT_Glyph outline_glyph, - FT_GlyphSlot slot ) - { - FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; - FT_Error error = FT_Err_Ok; - FT_Library library = FT_GLYPH( glyph )->library; - FT_Outline* source = &slot->outline; - FT_Outline* target = &glyph->outline; - - - /* check format in glyph slot */ - if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) - { - error = FT_THROW( Invalid_Glyph_Format ); - goto Exit; - } - - /* allocate new outline */ - error = FT_Outline_New( library, - (FT_UInt)source->n_points, - source->n_contours, - &glyph->outline ); - if ( error ) - goto Exit; - - FT_Outline_Copy( source, target ); - - Exit: - return error; - } - - - FT_CALLBACK_DEF( void ) - ft_outline_glyph_done( FT_Glyph outline_glyph ) - { - FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; - - - FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline ); - } - - - FT_CALLBACK_DEF( FT_Error ) - ft_outline_glyph_copy( FT_Glyph outline_source, - FT_Glyph outline_target ) - { - FT_OutlineGlyph source = (FT_OutlineGlyph)outline_source; - FT_OutlineGlyph target = (FT_OutlineGlyph)outline_target; - FT_Error error; - FT_Library library = FT_GLYPH( source )->library; - - - error = FT_Outline_New( library, - (FT_UInt)source->outline.n_points, - source->outline.n_contours, - &target->outline ); - if ( !error ) - FT_Outline_Copy( &source->outline, &target->outline ); - - return error; - } - - - FT_CALLBACK_DEF( void ) - ft_outline_glyph_transform( FT_Glyph outline_glyph, - const FT_Matrix* matrix, - const FT_Vector* delta ) - { - FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; - - - if ( matrix ) - FT_Outline_Transform( &glyph->outline, matrix ); - - if ( delta ) - FT_Outline_Translate( &glyph->outline, delta->x, delta->y ); - } - - - FT_CALLBACK_DEF( void ) - ft_outline_glyph_bbox( FT_Glyph outline_glyph, - FT_BBox* bbox ) - { - FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; - - - FT_Outline_Get_CBox( &glyph->outline, bbox ); - } - - - FT_CALLBACK_DEF( FT_Error ) - ft_outline_glyph_prepare( FT_Glyph outline_glyph, - FT_GlyphSlot slot ) - { - FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; - - - slot->format = FT_GLYPH_FORMAT_OUTLINE; - slot->outline = glyph->outline; - slot->outline.flags &= ~FT_OUTLINE_OWNER; - - return FT_Err_Ok; - } - - - FT_DEFINE_GLYPH( ft_outline_glyph_class, - sizeof ( FT_OutlineGlyphRec ), - FT_GLYPH_FORMAT_OUTLINE, - - ft_outline_glyph_init, - ft_outline_glyph_done, - ft_outline_glyph_copy, - ft_outline_glyph_transform, - ft_outline_glyph_bbox, - ft_outline_glyph_prepare - ) - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** FT_Glyph class and API ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - static FT_Error - ft_new_glyph( FT_Library library, - const FT_Glyph_Class* clazz, - FT_Glyph* aglyph ) - { - FT_Memory memory = library->memory; - FT_Error error; - FT_Glyph glyph = NULL; - - - *aglyph = NULL; - - if ( !FT_ALLOC( glyph, clazz->glyph_size ) ) - { - glyph->library = library; - glyph->clazz = clazz; - glyph->format = clazz->glyph_format; - - *aglyph = glyph; - } - - return error; - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Glyph_Copy( FT_Glyph source, - FT_Glyph *target ) - { - FT_Glyph copy; - FT_Error error; - const FT_Glyph_Class* clazz; - - - /* check arguments */ - if ( !target || !source || !source->clazz ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - *target = NULL; - - if ( !source || !source->clazz ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - clazz = source->clazz; - error = ft_new_glyph( source->library, clazz, © ); - if ( error ) - goto Exit; - - copy->advance = source->advance; - copy->format = source->format; - - if ( clazz->glyph_copy ) - error = clazz->glyph_copy( source, copy ); - - if ( error ) - FT_Done_Glyph( copy ); - else - *target = copy; - - Exit: - return error; - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Glyph( FT_GlyphSlot slot, - FT_Glyph *aglyph ) - { - FT_Library library; - FT_Error error; - FT_Glyph glyph; - - const FT_Glyph_Class* clazz = NULL; - - - if ( !slot ) - return FT_THROW( Invalid_Slot_Handle ); - - library = slot->library; - - if ( !aglyph ) - return FT_THROW( Invalid_Argument ); - - /* if it is a bitmap, that's easy :-) */ - if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) - clazz = FT_BITMAP_GLYPH_CLASS_GET; - - /* if it is an outline */ - else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) - clazz = FT_OUTLINE_GLYPH_CLASS_GET; - - else - { - /* try to find a renderer that supports the glyph image format */ - FT_Renderer render = FT_Lookup_Renderer( library, slot->format, 0 ); - - - if ( render ) - clazz = &render->glyph_class; - } - - if ( !clazz ) - { - error = FT_THROW( Invalid_Glyph_Format ); - goto Exit; - } - - /* create FT_Glyph object */ - error = ft_new_glyph( library, clazz, &glyph ); - if ( error ) - goto Exit; - - /* copy advance while converting it to 16.16 format */ - glyph->advance.x = slot->advance.x << 10; - glyph->advance.y = slot->advance.y << 10; - - /* now import the image from the glyph slot */ - error = clazz->glyph_init( glyph, slot ); - - /* if an error occurred, destroy the glyph */ - if ( error ) - FT_Done_Glyph( glyph ); - else - *aglyph = glyph; - - Exit: - return error; - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Glyph_Transform( FT_Glyph glyph, - FT_Matrix* matrix, - FT_Vector* delta ) - { - FT_Error error = FT_Err_Ok; - - - if ( !glyph || !glyph->clazz ) - error = FT_THROW( Invalid_Argument ); - else - { - const FT_Glyph_Class* clazz = glyph->clazz; - - - if ( clazz->glyph_transform ) - { - /* transform glyph image */ - clazz->glyph_transform( glyph, matrix, delta ); - - /* transform advance vector */ - if ( matrix ) - FT_Vector_Transform( &glyph->advance, matrix ); - } - else - error = FT_THROW( Invalid_Glyph_Format ); - } - return error; - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( void ) - FT_Glyph_Get_CBox( FT_Glyph glyph, - FT_UInt bbox_mode, - FT_BBox *acbox ) - { - const FT_Glyph_Class* clazz; - - - if ( !acbox ) - return; - - acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0; - - if ( !glyph || !glyph->clazz ) - return; - - clazz = glyph->clazz; - if ( !clazz->glyph_bbox ) - return; - - /* retrieve bbox in 26.6 coordinates */ - clazz->glyph_bbox( glyph, acbox ); - - /* perform grid fitting if needed */ - if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT || - bbox_mode == FT_GLYPH_BBOX_PIXELS ) - { - acbox->xMin = FT_PIX_FLOOR( acbox->xMin ); - acbox->yMin = FT_PIX_FLOOR( acbox->yMin ); - acbox->xMax = FT_PIX_CEIL( acbox->xMax ); - acbox->yMax = FT_PIX_CEIL( acbox->yMax ); - } - - /* convert to integer pixels if needed */ - if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE || - bbox_mode == FT_GLYPH_BBOX_PIXELS ) - { - acbox->xMin >>= 6; - acbox->yMin >>= 6; - acbox->xMax >>= 6; - acbox->yMax >>= 6; - } - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, - FT_Render_Mode render_mode, - FT_Vector* origin, - FT_Bool destroy ) - { - FT_GlyphSlotRec dummy; - FT_GlyphSlot_InternalRec dummy_internal; - FT_Error error = FT_Err_Ok; - FT_Glyph b, glyph; - FT_BitmapGlyph bitmap = NULL; - const FT_Glyph_Class* clazz; - - /* FT_BITMAP_GLYPH_CLASS_GET dereferences `library' in PIC mode */ - FT_Library library; - - - /* check argument */ - if ( !the_glyph ) - goto Bad; - glyph = *the_glyph; - if ( !glyph ) - goto Bad; - - clazz = glyph->clazz; - library = glyph->library; - if ( !library || !clazz ) - goto Bad; - - /* when called with a bitmap glyph, do nothing and return successfully */ - if ( clazz == FT_BITMAP_GLYPH_CLASS_GET ) - goto Exit; - - if ( !clazz->glyph_prepare ) - goto Bad; - - /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */ - /* then calling FT_Render_Glyph_Internal() */ - - FT_MEM_ZERO( &dummy, sizeof ( dummy ) ); - FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) ); - dummy.internal = &dummy_internal; - dummy.library = library; - dummy.format = clazz->glyph_format; - - /* create result bitmap glyph */ - error = ft_new_glyph( library, FT_BITMAP_GLYPH_CLASS_GET, &b ); - if ( error ) - goto Exit; - bitmap = (FT_BitmapGlyph)b; - -#if 1 - /* if `origin' is set, translate the glyph image */ - if ( origin ) - FT_Glyph_Transform( glyph, 0, origin ); -#else - FT_UNUSED( origin ); -#endif - - /* prepare dummy slot for rendering */ - error = clazz->glyph_prepare( glyph, &dummy ); - if ( !error ) - error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode ); - -#if 1 - if ( !destroy && origin ) - { - FT_Vector v; - - - v.x = -origin->x; - v.y = -origin->y; - FT_Glyph_Transform( glyph, 0, &v ); - } -#endif - - if ( error ) - goto Exit; - - /* in case of success, copy the bitmap to the glyph bitmap */ - error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy ); - if ( error ) - goto Exit; - - /* copy advance */ - bitmap->root.advance = glyph->advance; - - if ( destroy ) - FT_Done_Glyph( glyph ); - - *the_glyph = FT_GLYPH( bitmap ); - - Exit: - if ( error && bitmap ) - FT_Done_Glyph( FT_GLYPH( bitmap ) ); - - return error; - - Bad: - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( void ) - FT_Done_Glyph( FT_Glyph glyph ) - { - if ( glyph ) - { - FT_Memory memory = glyph->library->memory; - const FT_Glyph_Class* clazz = glyph->clazz; - - - if ( clazz->glyph_done ) - clazz->glyph_done( glyph ); - - FT_FREE( glyph ); - } - } - - -/* END */ diff --git a/3party/freetype/src/base/ftgxval.c b/3party/freetype/src/base/ftgxval.c deleted file mode 100644 index 58868f2e86..0000000000 --- a/3party/freetype/src/base/ftgxval.c +++ /dev/null @@ -1,142 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgxval.c */ -/* */ -/* FreeType API for validating TrueTyepGX/AAT tables (body). */ -/* */ -/* Copyright 2004-2015 by */ -/* Masatake YAMATO, Redhat K.K, */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H - -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_GX_VALIDATE_H - - - /* documentation is in ftgxval.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_TrueTypeGX_Validate( FT_Face face, - FT_UInt validation_flags, - FT_Bytes tables[FT_VALIDATE_GX_LENGTH], - FT_UInt table_length ) - { - FT_Service_GXvalidate service; - FT_Error error; - - - if ( !face ) - { - error = FT_THROW( Invalid_Face_Handle ); - goto Exit; - } - - if ( !tables ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - FT_FACE_FIND_GLOBAL_SERVICE( face, service, GX_VALIDATE ); - - if ( service ) - error = service->validate( face, - validation_flags, - tables, - table_length ); - else - error = FT_THROW( Unimplemented_Feature ); - - Exit: - return error; - } - - - FT_EXPORT_DEF( void ) - FT_TrueTypeGX_Free( FT_Face face, - FT_Bytes table ) - { - FT_Memory memory; - - - if ( !face ) - return; - - memory = FT_FACE_MEMORY( face ); - - FT_FREE( table ); - } - - - FT_EXPORT_DEF( FT_Error ) - FT_ClassicKern_Validate( FT_Face face, - FT_UInt validation_flags, - FT_Bytes *ckern_table ) - { - FT_Service_CKERNvalidate service; - FT_Error error; - - - if ( !face ) - { - error = FT_THROW( Invalid_Face_Handle ); - goto Exit; - } - - if ( !ckern_table ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - FT_FACE_FIND_GLOBAL_SERVICE( face, service, CLASSICKERN_VALIDATE ); - - if ( service ) - error = service->validate( face, - validation_flags, - ckern_table ); - else - error = FT_THROW( Unimplemented_Feature ); - - Exit: - return error; - } - - - FT_EXPORT_DEF( void ) - FT_ClassicKern_Free( FT_Face face, - FT_Bytes table ) - { - FT_Memory memory; - - - if ( !face ) - return; - - memory = FT_FACE_MEMORY( face ); - - - FT_FREE( table ); - } - - -/* END */ diff --git a/3party/freetype/src/base/ftinit.c b/3party/freetype/src/base/ftinit.c deleted file mode 100644 index b65a91d06c..0000000000 --- a/3party/freetype/src/base/ftinit.c +++ /dev/null @@ -1,286 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftinit.c */ -/* */ -/* FreeType initialization layer (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* The purpose of this file is to implement the following two */ - /* functions: */ - /* */ - /* FT_Add_Default_Modules(): */ - /* This function is used to add the set of default modules to a */ - /* fresh new library object. The set is taken from the header file */ - /* `freetype/config/ftmodule.h'. See the document `FreeType 2.0 */ - /* Build System' for more information. */ - /* */ - /* FT_Init_FreeType(): */ - /* This function creates a system object for the current platform, */ - /* builds a library out of it, then calls FT_Default_Drivers(). */ - /* */ - /* Note that even if FT_Init_FreeType() uses the implementation of the */ - /* system object defined at build time, client applications are still */ - /* able to provide their own `ftsystem.c'. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_MODULE_H -#include "basepic.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_init - - -#ifndef FT_CONFIG_OPTION_PIC - - -#undef FT_USE_MODULE -#ifdef __cplusplus -#define FT_USE_MODULE( type, x ) extern "C" const type x; -#else -#define FT_USE_MODULE( type, x ) extern const type x; -#endif - -#include FT_CONFIG_MODULES_H - -#undef FT_USE_MODULE -#define FT_USE_MODULE( type, x ) (const FT_Module_Class*)&(x), - - static - const FT_Module_Class* const ft_default_modules[] = - { -#include FT_CONFIG_MODULES_H - 0 - }; - - -#else /* FT_CONFIG_OPTION_PIC */ - - -#ifdef __cplusplus -#define FT_EXTERNC extern "C" -#else -#define FT_EXTERNC extern -#endif - - /* declare the module's class creation/destruction functions */ -#undef FT_USE_MODULE -#define FT_USE_MODULE( type, x ) \ - FT_EXTERNC FT_Error \ - FT_Create_Class_ ## x( FT_Library library, \ - FT_Module_Class* *output_class ); \ - FT_EXTERNC void \ - FT_Destroy_Class_ ## x( FT_Library library, \ - FT_Module_Class* clazz ); - -#include FT_CONFIG_MODULES_H - - /* count all module classes */ -#undef FT_USE_MODULE -#define FT_USE_MODULE( type, x ) MODULE_CLASS_ ## x, - - enum - { -#include FT_CONFIG_MODULES_H - FT_NUM_MODULE_CLASSES - }; - - /* destroy all module classes */ -#undef FT_USE_MODULE -#define FT_USE_MODULE( type, x ) \ - if ( classes[i] ) \ - { \ - FT_Destroy_Class_ ## x( library, classes[i] ); \ - } \ - i++; - - - FT_BASE_DEF( void ) - ft_destroy_default_module_classes( FT_Library library ) - { - FT_Module_Class* *classes; - FT_Memory memory; - FT_UInt i; - BasePIC* pic_container = (BasePIC*)library->pic_container.base; - - - if ( !pic_container->default_module_classes ) - return; - - memory = library->memory; - classes = pic_container->default_module_classes; - i = 0; - -#include FT_CONFIG_MODULES_H - - FT_FREE( classes ); - pic_container->default_module_classes = NULL; - } - - - /* initialize all module classes and the pointer table */ -#undef FT_USE_MODULE -#define FT_USE_MODULE( type, x ) \ - error = FT_Create_Class_ ## x( library, &clazz ); \ - if ( error ) \ - goto Exit; \ - classes[i++] = clazz; - - - FT_BASE_DEF( FT_Error ) - ft_create_default_module_classes( FT_Library library ) - { - FT_Error error; - FT_Memory memory; - FT_Module_Class* *classes = NULL; - FT_Module_Class* clazz; - FT_UInt i; - BasePIC* pic_container = (BasePIC*)library->pic_container.base; - - - memory = library->memory; - - pic_container->default_module_classes = NULL; - - if ( FT_ALLOC( classes, sizeof ( FT_Module_Class* ) * - ( FT_NUM_MODULE_CLASSES + 1 ) ) ) - return error; - - /* initialize all pointers to 0, especially the last one */ - for ( i = 0; i < FT_NUM_MODULE_CLASSES; i++ ) - classes[i] = NULL; - classes[FT_NUM_MODULE_CLASSES] = NULL; - - i = 0; - -#include FT_CONFIG_MODULES_H - - Exit: - if ( error ) - ft_destroy_default_module_classes( library ); - else - pic_container->default_module_classes = classes; - - return error; - } - - -#endif /* FT_CONFIG_OPTION_PIC */ - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( void ) - FT_Add_Default_Modules( FT_Library library ) - { - FT_Error error; - const FT_Module_Class* const* cur; - - - /* FT_DEFAULT_MODULES_GET dereferences `library' in PIC mode */ -#ifdef FT_CONFIG_OPTION_PIC - if ( !library ) - return; -#endif - - /* GCC 4.6 warns the type difference: - * FT_Module_Class** != const FT_Module_Class* const* - */ - cur = (const FT_Module_Class* const*)FT_DEFAULT_MODULES_GET; - - /* test for valid `library' delayed to FT_Add_Module() */ - while ( *cur ) - { - error = FT_Add_Module( library, *cur ); - /* notify errors, but don't stop */ - if ( error ) - FT_TRACE0(( "FT_Add_Default_Module:" - " Cannot install `%s', error = 0x%x\n", - (*cur)->module_name, error )); - cur++; - } - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Init_FreeType( FT_Library *alibrary ) - { - FT_Error error; - FT_Memory memory; - - - /* check of `alibrary' delayed to `FT_New_Library' */ - - /* First of all, allocate a new system object -- this function is part */ - /* of the system-specific component, i.e. `ftsystem.c'. */ - - memory = FT_New_Memory(); - if ( !memory ) - { - FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" )); - return FT_THROW( Unimplemented_Feature ); - } - - /* build a library out of it, then fill it with the set of */ - /* default drivers. */ - - error = FT_New_Library( memory, alibrary ); - if ( error ) - FT_Done_Memory( memory ); - else - FT_Add_Default_Modules( *alibrary ); - - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Done_FreeType( FT_Library library ) - { - FT_Memory memory; - - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - memory = library->memory; - - /* Discard the library object */ - FT_Done_Library( library ); - - /* discard memory manager */ - FT_Done_Memory( memory ); - - return FT_Err_Ok; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftlcdfil.c b/3party/freetype/src/base/ftlcdfil.c deleted file mode 100644 index ff6f7e98ce..0000000000 --- a/3party/freetype/src/base/ftlcdfil.c +++ /dev/null @@ -1,398 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftlcdfil.c */ -/* */ -/* FreeType API for color filtering of subpixel bitmap glyphs (body). */ -/* */ -/* Copyright 2006-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H - -#include FT_LCD_FILTER_H -#include FT_IMAGE_H -#include FT_INTERNAL_OBJECTS_H - - -#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - -/* define USE_LEGACY to implement the legacy filter */ -#define USE_LEGACY - - /* FIR filter used by the default and light filters */ - static void - _ft_lcd_filter_fir( FT_Bitmap* bitmap, - FT_Render_Mode mode, - FT_Library library ) - { - FT_Byte* weights = library->lcd_weights; - FT_UInt width = (FT_UInt)bitmap->width; - FT_UInt height = (FT_UInt)bitmap->rows; - - - /* horizontal in-place FIR filter */ - if ( mode == FT_RENDER_MODE_LCD && width >= 4 ) - { - FT_Byte* line = bitmap->buffer; - - - /* take care of bitmap flow */ - if ( bitmap->pitch < 0 ) - line -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 ); - - /* `fir' and `pix' must be at least 32 bit wide, since the sum of */ - /* the values in `weights' can exceed 0xFF */ - - for ( ; height > 0; height--, line += bitmap->pitch ) - { - FT_UInt fir[4]; /* below, `pix' is used as the 5th element */ - FT_UInt val1, xx; - - - val1 = line[0]; - fir[0] = weights[2] * val1; - fir[1] = weights[3] * val1; - fir[2] = weights[4] * val1; - fir[3] = 0; - - val1 = line[1]; - fir[0] += weights[1] * val1; - fir[1] += weights[2] * val1; - fir[2] += weights[3] * val1; - fir[3] += weights[4] * val1; - - for ( xx = 2; xx < width; xx++ ) - { - FT_UInt val, pix; - - - val = line[xx]; - pix = fir[0] + weights[0] * val; - fir[0] = fir[1] + weights[1] * val; - fir[1] = fir[2] + weights[2] * val; - fir[2] = fir[3] + weights[3] * val; - fir[3] = weights[4] * val; - - pix >>= 8; - pix |= (FT_UInt)-(FT_Int)( pix >> 8 ); - line[xx - 2] = (FT_Byte)pix; - } - - { - FT_UInt pix; - - - pix = fir[0] >> 8; - pix |= (FT_UInt)-(FT_Int)( pix >> 8 ); - line[xx - 2] = (FT_Byte)pix; - - pix = fir[1] >> 8; - pix |= (FT_UInt)-(FT_Int)( pix >> 8 ); - line[xx - 1] = (FT_Byte)pix; - } - } - } - - /* vertical in-place FIR filter */ - else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 ) - { - FT_Byte* column = bitmap->buffer; - FT_Int pitch = bitmap->pitch; - - - /* take care of bitmap flow */ - if ( bitmap->pitch < 0 ) - column -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 ); - - for ( ; width > 0; width--, column++ ) - { - FT_Byte* col = column; - FT_UInt fir[4]; /* below, `pix' is used as the 5th element */ - FT_UInt val1, yy; - - - val1 = col[0]; - fir[0] = weights[2] * val1; - fir[1] = weights[3] * val1; - fir[2] = weights[4] * val1; - fir[3] = 0; - col += pitch; - - val1 = col[0]; - fir[0] += weights[1] * val1; - fir[1] += weights[2] * val1; - fir[2] += weights[3] * val1; - fir[3] += weights[4] * val1; - col += pitch; - - for ( yy = 2; yy < height; yy++ ) - { - FT_UInt val, pix; - - - val = col[0]; - pix = fir[0] + weights[0] * val; - fir[0] = fir[1] + weights[1] * val; - fir[1] = fir[2] + weights[2] * val; - fir[2] = fir[3] + weights[3] * val; - fir[3] = weights[4] * val; - - pix >>= 8; - pix |= (FT_UInt)-(FT_Int)( pix >> 8 ); - col[-2 * pitch] = (FT_Byte)pix; - col += pitch; - } - - { - FT_UInt pix; - - - pix = fir[0] >> 8; - pix |= (FT_UInt)-(FT_Int)( pix >> 8 ); - col[-2 * pitch] = (FT_Byte)pix; - - pix = fir[1] >> 8; - pix |= (FT_UInt)-(FT_Int)( pix >> 8 ); - col[-pitch] = (FT_Byte)pix; - } - } - } - } - - -#ifdef USE_LEGACY - - /* intra-pixel filter used by the legacy filter */ - static void - _ft_lcd_filter_legacy( FT_Bitmap* bitmap, - FT_Render_Mode mode, - FT_Library library ) - { - FT_UInt width = (FT_UInt)bitmap->width; - FT_UInt height = (FT_UInt)bitmap->rows; - FT_Int pitch = bitmap->pitch; - - static const unsigned int filters[3][3] = - { - { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 }, - { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 }, - { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 } - }; - - FT_UNUSED( library ); - - - /* horizontal in-place intra-pixel filter */ - if ( mode == FT_RENDER_MODE_LCD && width >= 3 ) - { - FT_Byte* line = bitmap->buffer; - - - /* take care of bitmap flow */ - if ( bitmap->pitch < 0 ) - line -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 ); - - for ( ; height > 0; height--, line += pitch ) - { - FT_UInt xx; - - - for ( xx = 0; xx < width; xx += 3 ) - { - FT_UInt r = 0; - FT_UInt g = 0; - FT_UInt b = 0; - FT_UInt p; - - - p = line[xx]; - r += filters[0][0] * p; - g += filters[0][1] * p; - b += filters[0][2] * p; - - p = line[xx + 1]; - r += filters[1][0] * p; - g += filters[1][1] * p; - b += filters[1][2] * p; - - p = line[xx + 2]; - r += filters[2][0] * p; - g += filters[2][1] * p; - b += filters[2][2] * p; - - line[xx] = (FT_Byte)( r / 65536 ); - line[xx + 1] = (FT_Byte)( g / 65536 ); - line[xx + 2] = (FT_Byte)( b / 65536 ); - } - } - } - else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 ) - { - FT_Byte* column = bitmap->buffer; - - - /* take care of bitmap flow */ - if ( bitmap->pitch < 0 ) - column -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 ); - - for ( ; width > 0; width--, column++ ) - { - FT_Byte* col = column; - FT_Byte* col_end = col + (FT_Int)height * pitch; - - - for ( ; col < col_end; col += 3 * pitch ) - { - FT_UInt r = 0; - FT_UInt g = 0; - FT_UInt b = 0; - FT_UInt p; - - - p = col[0]; - r += filters[0][0] * p; - g += filters[0][1] * p; - b += filters[0][2] * p; - - p = col[pitch]; - r += filters[1][0] * p; - g += filters[1][1] * p; - b += filters[1][2] * p; - - p = col[pitch * 2]; - r += filters[2][0] * p; - g += filters[2][1] * p; - b += filters[2][2] * p; - - col[0] = (FT_Byte)( r / 65536 ); - col[pitch] = (FT_Byte)( g / 65536 ); - col[2 * pitch] = (FT_Byte)( b / 65536 ); - } - } - } - } - -#endif /* USE_LEGACY */ - - - FT_EXPORT_DEF( FT_Error ) - FT_Library_SetLcdFilterWeights( FT_Library library, - unsigned char *weights ) - { - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - if ( !weights ) - return FT_THROW( Invalid_Argument ); - - ft_memcpy( library->lcd_weights, weights, 5 ); - - return FT_Err_Ok; - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Library_SetLcdFilter( FT_Library library, - FT_LcdFilter filter ) - { - static const FT_Byte light_filter[5] = - { 0x00, 0x55, 0x56, 0x55, 0x00 }; - /* the values here sum up to a value larger than 256, */ - /* providing a cheap gamma correction */ - static const FT_Byte default_filter[5] = - { 0x10, 0x40, 0x70, 0x40, 0x10 }; - - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - switch ( filter ) - { - case FT_LCD_FILTER_NONE: - library->lcd_filter_func = NULL; - library->lcd_extra = 0; - break; - - case FT_LCD_FILTER_DEFAULT: -#if defined( FT_FORCE_LEGACY_LCD_FILTER ) - - library->lcd_filter_func = _ft_lcd_filter_legacy; - library->lcd_extra = 0; - -#elif defined( FT_FORCE_LIGHT_LCD_FILTER ) - - ft_memcpy( library->lcd_weights, light_filter, 5 ); - library->lcd_filter_func = _ft_lcd_filter_fir; - library->lcd_extra = 2; - -#else - - ft_memcpy( library->lcd_weights, default_filter, 5 ); - library->lcd_filter_func = _ft_lcd_filter_fir; - library->lcd_extra = 2; - -#endif - - break; - - case FT_LCD_FILTER_LIGHT: - ft_memcpy( library->lcd_weights, light_filter, 5 ); - library->lcd_filter_func = _ft_lcd_filter_fir; - library->lcd_extra = 2; - break; - -#ifdef USE_LEGACY - - case FT_LCD_FILTER_LEGACY: - library->lcd_filter_func = _ft_lcd_filter_legacy; - library->lcd_extra = 0; - break; - -#endif - - default: - return FT_THROW( Invalid_Argument ); - } - - library->lcd_filter = filter; - - return FT_Err_Ok; - } - -#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ - - FT_EXPORT_DEF( FT_Error ) - FT_Library_SetLcdFilterWeights( FT_Library library, - unsigned char *weights ) - { - FT_UNUSED( library ); - FT_UNUSED( weights ); - - return FT_THROW( Unimplemented_Feature ); - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Library_SetLcdFilter( FT_Library library, - FT_LcdFilter filter ) - { - FT_UNUSED( library ); - FT_UNUSED( filter ); - - return FT_THROW( Unimplemented_Feature ); - } - -#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ - - -/* END */ diff --git a/3party/freetype/src/base/ftmac.c b/3party/freetype/src/base/ftmac.c deleted file mode 100644 index 446a23a75c..0000000000 --- a/3party/freetype/src/base/ftmac.c +++ /dev/null @@ -1,1075 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmac.c */ -/* */ -/* Mac FOND support. Written by just@letterror.com. */ -/* Heavily modified by mpsuzuki, George Williams, and Sean McBride. */ -/* */ -/* This file is for Mac OS X only; see builds/mac/ftoldmac.c for */ -/* classic platforms built by MPW. */ -/* */ -/* Copyright 1996-2015 by */ -/* Just van Rossum, 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. */ -/* */ -/***************************************************************************/ - - - /* - Notes - - Mac suitcase files can (and often do!) contain multiple fonts. To - support this I use the face_index argument of FT_(Open|New)_Face() - functions, and pretend the suitcase file is a collection. - - Warning: fbit and NFNT bitmap resources are not supported yet. In old - sfnt fonts, bitmap glyph data for each size is stored in each `NFNT' - resources instead of the `bdat' table in the sfnt resource. Therefore, - face->num_fixed_sizes is set to 0, because bitmap data in `NFNT' - resource is unavailable at present. - - The Mac FOND support works roughly like this: - - - Check whether the offered stream points to a Mac suitcase file. This - is done by checking the file type: it has to be 'FFIL' or 'tfil'. The - stream that gets passed to our init_face() routine is a stdio stream, - which isn't usable for us, since the FOND resources live in the - resource fork. So we just grab the stream->pathname field. - - - Read the FOND resource into memory, then check whether there is a - TrueType font and/or(!) a Type 1 font available. - - - If there is a Type 1 font available (as a separate `LWFN' file), read - its data into memory, massage it slightly so it becomes PFB data, wrap - it into a memory stream, load the Type 1 driver and delegate the rest - of the work to it by calling FT_Open_Face(). (XXX TODO: after this - has been done, the kerning data from the FOND resource should be - appended to the face: On the Mac there are usually no AFM files - available. However, this is tricky since we need to map Mac char - codes to ps glyph names to glyph ID's...) - - - If there is a TrueType font (an `sfnt' resource), read it into memory, - wrap it into a memory stream, load the TrueType driver and delegate - the rest of the work to it, by calling FT_Open_Face(). - - - Some suitcase fonts (notably Onyx) might point the `LWFN' file to - itself, even though it doesn't contains `POST' resources. To handle - this special case without opening the file an extra time, we just - ignore errors from the `LWFN' and fallback to the `sfnt' if both are - available. - */ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_TRUETYPE_TAGS_H -#include FT_INTERNAL_STREAM_H -#include "ftbase.h" - - /* This is for Mac OS X. Without redefinition, OS_INLINE */ - /* expands to `static inline' which doesn't survive the */ - /* -ansi compilation flag of GCC. */ -#if !HAVE_ANSI_OS_INLINE -#undef OS_INLINE -#define OS_INLINE static __inline__ -#endif - - /* `configure' checks the availability of `ResourceIndex' strictly */ - /* and sets HAVE_TYPE_RESOURCE_INDEX 1 or 0 always. If it is */ - /* not set (e.g., a build without `configure'), the availability */ - /* is guessed from the SDK version. */ -#ifndef HAVE_TYPE_RESOURCE_INDEX -#if !defined( MAC_OS_X_VERSION_10_5 ) || \ - ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 ) -#define HAVE_TYPE_RESOURCE_INDEX 0 -#else -#define HAVE_TYPE_RESOURCE_INDEX 1 -#endif -#endif /* !HAVE_TYPE_RESOURCE_INDEX */ - -#if ( HAVE_TYPE_RESOURCE_INDEX == 0 ) - typedef short ResourceIndex; -#endif - -#include <CoreServices/CoreServices.h> -#include <ApplicationServices/ApplicationServices.h> -#include <sys/syslimits.h> /* PATH_MAX */ - - /* Don't want warnings about our own use of deprecated functions. */ -#define FT_DEPRECATED_ATTRIBUTE - -#include FT_MAC_H - -#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */ -#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault -#endif - - - /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over - TrueType in case *both* are available (this is not common, - but it *is* possible). */ -#ifndef PREFER_LWFN -#define PREFER_LWFN 1 -#endif - - -#ifdef FT_MACINTOSH - - /* This function is deprecated because FSSpec is deprecated in Mac OS X */ - FT_EXPORT_DEF( FT_Error ) - FT_GetFile_From_Mac_Name( const char* fontName, - FSSpec* pathSpec, - FT_Long* face_index ) - { - FT_UNUSED( fontName ); - FT_UNUSED( pathSpec ); - FT_UNUSED( face_index ); - - return FT_THROW( Unimplemented_Feature ); - } - - - /* Private function. */ - /* The FSSpec type has been discouraged for a long time, */ - /* unfortunately an FSRef replacement API for */ - /* ATSFontGetFileSpecification() is only available in */ - /* Mac OS X 10.5 and later. */ - static OSStatus - FT_ATSFontGetFileReference( ATSFontRef ats_font_id, - FSRef* ats_font_ref ) - { -#if defined( MAC_OS_X_VERSION_10_5 ) && \ - ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) - - OSStatus err; - - err = ATSFontGetFileReference( ats_font_id, ats_font_ref ); - - return err; -#elif __LP64__ /* No 64bit Carbon API on legacy platforms */ - FT_UNUSED( ats_font_id ); - FT_UNUSED( ats_font_ref ); - - - return fnfErr; -#else /* 32bit Carbon API on legacy platforms */ - OSStatus err; - FSSpec spec; - - - err = ATSFontGetFileSpecification( ats_font_id, &spec ); - if ( noErr == err ) - err = FSpMakeFSRef( &spec, ats_font_ref ); - - return err; -#endif - } - - - static FT_Error - FT_GetFileRef_From_Mac_ATS_Name( const char* fontName, - FSRef* ats_font_ref, - FT_Long* face_index ) - { - CFStringRef cf_fontName; - ATSFontRef ats_font_id; - - - *face_index = 0; - - cf_fontName = CFStringCreateWithCString( NULL, fontName, - kCFStringEncodingMacRoman ); - ats_font_id = ATSFontFindFromName( cf_fontName, - kATSOptionFlagsUnRestrictedScope ); - CFRelease( cf_fontName ); - - if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL ) - return FT_THROW( Unknown_File_Format ); - - if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) ) - return FT_THROW( Unknown_File_Format ); - - /* face_index calculation by searching preceding fontIDs */ - /* with same FSRef */ - { - ATSFontRef id2 = ats_font_id - 1; - FSRef ref2; - - - while ( id2 > 0 ) - { - if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) ) - break; - if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) ) - break; - - id2 --; - } - *face_index = ats_font_id - ( id2 + 1 ); - } - - return FT_Err_Ok; - } - - - FT_EXPORT_DEF( FT_Error ) - FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, - UInt8* path, - UInt32 maxPathSize, - FT_Long* face_index ) - { - FSRef ref; - FT_Error err; - - - if ( !fontName || !face_index ) - return FT_THROW( Invalid_Argument) ; - - err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); - if ( err ) - return err; - - if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) ) - return FT_THROW( Unknown_File_Format ); - - return FT_Err_Ok; - } - - - /* This function is deprecated because FSSpec is deprecated in Mac OS X */ - FT_EXPORT_DEF( FT_Error ) - FT_GetFile_From_Mac_ATS_Name( const char* fontName, - FSSpec* pathSpec, - FT_Long* face_index ) - { -#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \ - ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) ) - FT_UNUSED( fontName ); - FT_UNUSED( pathSpec ); - FT_UNUSED( face_index ); - - return FT_THROW( Unimplemented_Feature ); -#else - FSRef ref; - FT_Error err; - - - if ( !fontName || !face_index ) - return FT_THROW( Invalid_Argument ); - - err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); - if ( err ) - return err; - - if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL, - pathSpec, NULL ) ) - return FT_THROW( Unknown_File_Format ); - - return FT_Err_Ok; -#endif - } - - - static OSErr - FT_FSPathMakeRes( const UInt8* pathname, - ResFileRefNum* res ) - { - OSErr err; - FSRef ref; - - - if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) - return FT_THROW( Cannot_Open_Resource ); - - /* at present, no support for dfont format */ - err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res ); - if ( noErr == err ) - return err; - - /* fallback to original resource-fork font */ - *res = FSOpenResFile( &ref, fsRdPerm ); - err = ResError(); - - return err; - } - - - /* Return the file type for given pathname */ - static OSType - get_file_type_from_path( const UInt8* pathname ) - { - FSRef ref; - FSCatalogInfo info; - - - if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) - return ( OSType ) 0; - - if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info, - NULL, NULL, NULL ) ) - return ( OSType ) 0; - - return ((FInfo *)(info.finderInfo))->fdType; - } - - - /* Given a PostScript font name, create the Macintosh LWFN file name. */ - static void - create_lwfn_name( char* ps_name, - Str255 lwfn_file_name ) - { - int max = 5, count = 0; - FT_Byte* p = lwfn_file_name; - FT_Byte* q = (FT_Byte*)ps_name; - - - lwfn_file_name[0] = 0; - - while ( *q ) - { - if ( ft_isupper( *q ) ) - { - if ( count ) - max = 3; - count = 0; - } - if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) ) - { - *++p = *q; - lwfn_file_name[0]++; - count++; - } - q++; - } - } - - - static short - count_faces_sfnt( char* fond_data ) - { - /* The count is 1 greater than the value in the FOND. */ - /* Isn't that cute? :-) */ - - return EndianS16_BtoN( *( (short*)( fond_data + - sizeof ( FamRec ) ) ) ) + 1; - } - - - static short - count_faces_scalable( char* fond_data ) - { - AsscEntry* assoc; - short i, face, face_all; - - - face_all = EndianS16_BtoN( *( (short *)( fond_data + - sizeof ( FamRec ) ) ) ) + 1; - assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); - face = 0; - - for ( i = 0; i < face_all; i++ ) - { - if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) ) - face++; - } - return face; - } - - - /* Look inside the FOND data, answer whether there should be an SFNT - resource, and answer the name of a possible LWFN Type 1 file. - - Thanks to Paul Miller (paulm@profoundeffects.com) for the fix - to load a face OTHER than the first one in the FOND! - */ - - - static void - parse_fond( char* fond_data, - short* have_sfnt, - ResID* sfnt_id, - Str255 lwfn_file_name, - short face_index ) - { - AsscEntry* assoc; - AsscEntry* base_assoc; - FamRec* fond; - - - *sfnt_id = 0; - *have_sfnt = 0; - lwfn_file_name[0] = 0; - - fond = (FamRec*)fond_data; - assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); - base_assoc = assoc; - - /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */ - if ( 47 < face_index ) - return; - - /* Let's do a little range checking before we get too excited here */ - if ( face_index < count_faces_sfnt( fond_data ) ) - { - assoc += face_index; /* add on the face_index! */ - - /* if the face at this index is not scalable, - fall back to the first one (old behavior) */ - if ( EndianS16_BtoN( assoc->fontSize ) == 0 ) - { - *have_sfnt = 1; - *sfnt_id = EndianS16_BtoN( assoc->fontID ); - } - else if ( base_assoc->fontSize == 0 ) - { - *have_sfnt = 1; - *sfnt_id = EndianS16_BtoN( base_assoc->fontID ); - } - } - - if ( EndianS32_BtoN( fond->ffStylOff ) ) - { - unsigned char* p = (unsigned char*)fond_data; - StyleTable* style; - unsigned short string_count; - char ps_name[256]; - unsigned char* names[64]; - int i; - - - p += EndianS32_BtoN( fond->ffStylOff ); - style = (StyleTable*)p; - p += sizeof ( StyleTable ); - string_count = EndianS16_BtoN( *(short*)(p) ); - string_count = FT_MIN( 64, string_count ); - p += sizeof ( short ); - - for ( i = 0; i < string_count; i++ ) - { - names[i] = p; - p += names[i][0]; - p++; - } - - { - size_t ps_name_len = (size_t)names[0][0]; - - - if ( ps_name_len != 0 ) - { - ft_memcpy(ps_name, names[0] + 1, ps_name_len); - ps_name[ps_name_len] = 0; - } - if ( style->indexes[face_index] > 1 && - style->indexes[face_index] <= string_count ) - { - unsigned char* suffixes = names[style->indexes[face_index] - 1]; - - - for ( i = 1; i <= suffixes[0]; i++ ) - { - unsigned char* s; - size_t j = suffixes[i] - 1; - - - if ( j < string_count && ( s = names[j] ) != NULL ) - { - size_t s_len = (size_t)s[0]; - - - if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) ) - { - ft_memcpy( ps_name + ps_name_len, s + 1, s_len ); - ps_name_len += s_len; - ps_name[ps_name_len] = 0; - } - } - } - } - } - - create_lwfn_name( ps_name, lwfn_file_name ); - } - } - - - static FT_Error - lookup_lwfn_by_fond( const UInt8* path_fond, - ConstStr255Param base_lwfn, - UInt8* path_lwfn, - size_t path_size ) - { - FSRef ref, par_ref; - size_t dirname_len; - - - /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */ - /* We should not extract parent directory by string manipulation. */ - - if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) ) - return FT_THROW( Invalid_Argument ); - - if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, - NULL, NULL, NULL, &par_ref ) ) - return FT_THROW( Invalid_Argument ); - - if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) ) - return FT_THROW( Invalid_Argument ); - - if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size ) - return FT_THROW( Invalid_Argument ); - - /* now we have absolute dirname in path_lwfn */ - ft_strcat( (char *)path_lwfn, "/" ); - dirname_len = ft_strlen( (char *)path_lwfn ); - ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 ); - path_lwfn[dirname_len + base_lwfn[0]] = '\0'; - - if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) ) - return FT_THROW( Cannot_Open_Resource ); - - if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, - NULL, NULL, NULL, NULL ) ) - return FT_THROW( Cannot_Open_Resource ); - - return FT_Err_Ok; - } - - - static short - count_faces( Handle fond, - const UInt8* pathname ) - { - ResID sfnt_id; - short have_sfnt, have_lwfn; - Str255 lwfn_file_name; - UInt8 buff[PATH_MAX]; - FT_Error err; - short num_faces; - - - have_sfnt = have_lwfn = 0; - - parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 ); - - if ( lwfn_file_name[0] ) - { - err = lookup_lwfn_by_fond( pathname, lwfn_file_name, - buff, sizeof ( buff ) ); - if ( !err ) - have_lwfn = 1; - } - - if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) - num_faces = 1; - else - num_faces = count_faces_scalable( *fond ); - - return num_faces; - } - - - /* Read Type 1 data from the POST resources inside the LWFN file, - return a PFB buffer. This is somewhat convoluted because the FT2 - PFB parser wants the ASCII header as one chunk, and the LWFN - chunks are often not organized that way, so we glue chunks - of the same type together. */ - static FT_Error - read_lwfn( FT_Memory memory, - ResFileRefNum res, - FT_Byte** pfb_data, - FT_ULong* size ) - { - FT_Error error = FT_Err_Ok; - ResID res_id; - unsigned char *buffer, *p, *size_p = NULL; - FT_ULong total_size = 0; - FT_ULong old_total_size = 0; - FT_ULong post_size, pfb_chunk_size; - Handle post_data; - char code, last_code; - - - UseResFile( res ); - - /* First pass: load all POST resources, and determine the size of */ - /* the output buffer. */ - res_id = 501; - last_code = -1; - - for (;;) - { - post_data = Get1Resource( TTAG_POST, res_id++ ); - if ( post_data == NULL ) - break; /* we are done */ - - code = (*post_data)[0]; - - if ( code != last_code ) - { - if ( code == 5 ) - total_size += 2; /* just the end code */ - else - total_size += 6; /* code + 4 bytes chunk length */ - } - - total_size += GetHandleSize( post_data ) - 2; - last_code = code; - - /* detect integer overflows */ - if ( total_size < old_total_size ) - { - error = FT_THROW( Array_Too_Large ); - goto Error; - } - - old_total_size = total_size; - } - - if ( FT_ALLOC( buffer, (FT_Long)total_size ) ) - goto Error; - - /* Second pass: append all POST data to the buffer, add PFB fields. */ - /* Glue all consecutive chunks of the same type together. */ - p = buffer; - res_id = 501; - last_code = -1; - pfb_chunk_size = 0; - - for (;;) - { - post_data = Get1Resource( TTAG_POST, res_id++ ); - if ( post_data == NULL ) - break; /* we are done */ - - post_size = (FT_ULong)GetHandleSize( post_data ) - 2; - code = (*post_data)[0]; - - if ( code != last_code ) - { - if ( last_code != -1 ) - { - /* we are done adding a chunk, fill in the size field */ - if ( size_p != NULL ) - { - *size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF ); - *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8 ) & 0xFF ); - *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF ); - *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF ); - } - pfb_chunk_size = 0; - } - - *p++ = 0x80; - if ( code == 5 ) - *p++ = 0x03; /* the end */ - else if ( code == 2 ) - *p++ = 0x02; /* binary segment */ - else - *p++ = 0x01; /* ASCII segment */ - - if ( code != 5 ) - { - size_p = p; /* save for later */ - p += 4; /* make space for size field */ - } - } - - ft_memcpy( p, *post_data + 2, post_size ); - pfb_chunk_size += post_size; - p += post_size; - last_code = code; - } - - *pfb_data = buffer; - *size = total_size; - - Error: - CloseResFile( res ); - return error; - } - - - /* Create a new FT_Face from a file path to an LWFN file. */ - static FT_Error - FT_New_Face_From_LWFN( FT_Library library, - const UInt8* pathname, - FT_Long face_index, - FT_Face* aface ) - { - FT_Byte* pfb_data; - FT_ULong pfb_size; - FT_Error error; - ResFileRefNum res; - - - if ( noErr != FT_FSPathMakeRes( pathname, &res ) ) - return FT_THROW( Cannot_Open_Resource ); - - pfb_data = NULL; - pfb_size = 0; - error = read_lwfn( library->memory, res, &pfb_data, &pfb_size ); - CloseResFile( res ); /* PFB is already loaded, useless anymore */ - if ( error ) - return error; - - return open_face_from_buffer( library, - pfb_data, - pfb_size, - face_index, - "type1", - aface ); - } - - - /* Create a new FT_Face from an SFNT resource, specified by res ID. */ - static FT_Error - FT_New_Face_From_SFNT( FT_Library library, - ResID sfnt_id, - FT_Long face_index, - FT_Face* aface ) - { - Handle sfnt = NULL; - FT_Byte* sfnt_data; - size_t sfnt_size; - FT_Error error = FT_Err_Ok; - FT_Memory memory = library->memory; - int is_cff, is_sfnt_ps; - - - sfnt = GetResource( TTAG_sfnt, sfnt_id ); - if ( sfnt == NULL ) - return FT_THROW( Invalid_Handle ); - - sfnt_size = (FT_ULong)GetHandleSize( sfnt ); - if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) ) - { - ReleaseResource( sfnt ); - return error; - } - - ft_memcpy( sfnt_data, *sfnt, sfnt_size ); - ReleaseResource( sfnt ); - - is_cff = sfnt_size > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); - is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, "typ1", 4 ); - - if ( is_sfnt_ps ) - { - FT_Stream stream; - - - if ( FT_NEW( stream ) ) - goto Try_OpenType; - - FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size ); - if ( !open_face_PS_from_sfnt_stream( library, - stream, - face_index, - 0, NULL, - aface ) ) - { - FT_Stream_Close( stream ); - FT_FREE( stream ); - FT_FREE( sfnt_data ); - goto Exit; - } - - FT_FREE( stream ); - } - Try_OpenType: - error = open_face_from_buffer( library, - sfnt_data, - sfnt_size, - face_index, - is_cff ? "cff" : "truetype", - aface ); - Exit: - return error; - } - - - /* Create a new FT_Face from a file path to a suitcase file. */ - static FT_Error - FT_New_Face_From_Suitcase( FT_Library library, - const UInt8* pathname, - FT_Long face_index, - FT_Face* aface ) - { - FT_Error error = FT_ERR( Cannot_Open_Resource ); - ResFileRefNum res_ref; - ResourceIndex res_index; - Handle fond; - short num_faces_in_res; - - - if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) ) - return FT_THROW( Cannot_Open_Resource ); - - UseResFile( res_ref ); - if ( ResError() ) - return FT_THROW( Cannot_Open_Resource ); - - num_faces_in_res = 0; - for ( res_index = 1; ; ++res_index ) - { - short num_faces_in_fond; - - - fond = Get1IndResource( TTAG_FOND, res_index ); - if ( ResError() ) - break; - - num_faces_in_fond = count_faces( fond, pathname ); - num_faces_in_res += num_faces_in_fond; - - if ( 0 <= face_index && face_index < num_faces_in_fond && error ) - error = FT_New_Face_From_FOND( library, fond, face_index, aface ); - - face_index -= num_faces_in_fond; - } - - CloseResFile( res_ref ); - if ( !error && aface && *aface ) - (*aface)->num_faces = num_faces_in_res; - return error; - } - - - /* documentation is in ftmac.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_New_Face_From_FOND( FT_Library library, - Handle fond, - FT_Long face_index, - FT_Face* aface ) - { - short have_sfnt, have_lwfn = 0; - ResID sfnt_id, fond_id; - OSType fond_type; - Str255 fond_name; - Str255 lwfn_file_name; - UInt8 path_lwfn[PATH_MAX]; - OSErr err; - FT_Error error = FT_Err_Ok; - - - /* check of `library' and `aface' delayed to `FT_New_Face_From_XXX' */ - - GetResInfo( fond, &fond_id, &fond_type, fond_name ); - if ( ResError() != noErr || fond_type != TTAG_FOND ) - return FT_THROW( Invalid_File_Format ); - - parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index ); - - if ( lwfn_file_name[0] ) - { - ResFileRefNum res; - - - res = HomeResFile( fond ); - if ( noErr != ResError() ) - goto found_no_lwfn_file; - - { - UInt8 path_fond[PATH_MAX]; - FSRef ref; - - - err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum, - NULL, NULL, NULL, &ref, NULL ); - if ( noErr != err ) - goto found_no_lwfn_file; - - err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) ); - if ( noErr != err ) - goto found_no_lwfn_file; - - error = lookup_lwfn_by_fond( path_fond, lwfn_file_name, - path_lwfn, sizeof ( path_lwfn ) ); - if ( !error ) - have_lwfn = 1; - } - } - - if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) - error = FT_New_Face_From_LWFN( library, - path_lwfn, - face_index, - aface ); - else - error = FT_THROW( Unknown_File_Format ); - - found_no_lwfn_file: - if ( have_sfnt && error ) - error = FT_New_Face_From_SFNT( library, - sfnt_id, - face_index, - aface ); - - return error; - } - - - /* Common function to load a new FT_Face from a resource file. */ - static FT_Error - FT_New_Face_From_Resource( FT_Library library, - const UInt8* pathname, - FT_Long face_index, - FT_Face* aface ) - { - OSType file_type; - FT_Error error; - - - /* LWFN is a (very) specific file format, check for it explicitly */ - file_type = get_file_type_from_path( pathname ); - if ( file_type == TTAG_LWFN ) - return FT_New_Face_From_LWFN( library, pathname, face_index, aface ); - - /* Otherwise the file type doesn't matter (there are more than */ - /* `FFIL' and `tfil'). Just try opening it as a font suitcase; */ - /* if it works, fine. */ - - error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface ); - if ( error == 0 ) - return error; - - /* let it fall through to normal loader (.ttf, .otf, etc.); */ - /* we signal this by returning no error and no FT_Face */ - *aface = NULL; - return 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Face */ - /* */ - /* <Description> */ - /* This is the Mac-specific implementation of FT_New_Face. In */ - /* addition to the standard FT_New_Face() functionality, it also */ - /* accepts pathnames to Mac suitcase files. For further */ - /* documentation see the original FT_New_Face() in freetype.h. */ - /* */ - FT_EXPORT_DEF( FT_Error ) - FT_New_Face( FT_Library library, - const char* pathname, - FT_Long face_index, - FT_Face* aface ) - { - FT_Open_Args args; - FT_Error error; - - - /* test for valid `library' and `aface' delayed to FT_Open_Face() */ - if ( !pathname ) - return FT_THROW( Invalid_Argument ); - - *aface = NULL; - - /* try resourcefork based font: LWFN, FFIL */ - error = FT_New_Face_From_Resource( library, (UInt8 *)pathname, - face_index, aface ); - if ( error != 0 || *aface != NULL ) - return error; - - /* let it fall through to normal loader (.ttf, .otf, etc.) */ - args.flags = FT_OPEN_PATHNAME; - args.pathname = (char*)pathname; - return FT_Open_Face( library, &args, face_index, aface ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Face_From_FSRef */ - /* */ - /* <Description> */ - /* FT_New_Face_From_FSRef is identical to FT_New_Face except it */ - /* accepts an FSRef instead of a path. */ - /* */ - /* This function is deprecated because Carbon data types (FSRef) */ - /* are not cross-platform, and thus not suitable for the freetype API. */ - FT_EXPORT_DEF( FT_Error ) - FT_New_Face_From_FSRef( FT_Library library, - const FSRef* ref, - FT_Long face_index, - FT_Face* aface ) - { - FT_Error error; - FT_Open_Args args; - - OSErr err; - UInt8 pathname[PATH_MAX]; - - - /* check of `library' and `aface' delayed to */ - /* `FT_New_Face_From_Resource' */ - - if ( !ref ) - return FT_THROW( Invalid_Argument ); - - err = FSRefMakePath( ref, pathname, sizeof ( pathname ) ); - if ( err ) - error = FT_THROW( Cannot_Open_Resource ); - - error = FT_New_Face_From_Resource( library, pathname, face_index, aface ); - if ( error != 0 || *aface != NULL ) - return error; - - /* fallback to datafork font */ - args.flags = FT_OPEN_PATHNAME; - args.pathname = (char*)pathname; - return FT_Open_Face( library, &args, face_index, aface ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Face_From_FSSpec */ - /* */ - /* <Description> */ - /* FT_New_Face_From_FSSpec is identical to FT_New_Face except it */ - /* accepts an FSSpec instead of a path. */ - /* */ - /* This function is deprecated because FSSpec is deprecated in Mac OS X */ - FT_EXPORT_DEF( FT_Error ) - FT_New_Face_From_FSSpec( FT_Library library, - const FSSpec* spec, - FT_Long face_index, - FT_Face* aface ) - { -#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \ - ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) ) - FT_UNUSED( library ); - FT_UNUSED( spec ); - FT_UNUSED( face_index ); - FT_UNUSED( aface ); - - return FT_THROW( Unimplemented_Feature ); -#else - FSRef ref; - - - /* check of `library' and `aface' delayed to `FT_New_Face_From_FSRef' */ - - if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr ) - return FT_THROW( Invalid_Argument ); - else - return FT_New_Face_From_FSRef( library, &ref, face_index, aface ); -#endif - } - -#endif /* FT_MACINTOSH */ - - -/* END */ diff --git a/3party/freetype/src/base/ftmm.c b/3party/freetype/src/base/ftmm.c deleted file mode 100644 index 7c012aa438..0000000000 --- a/3party/freetype/src/base/ftmm.c +++ /dev/null @@ -1,234 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmm.c */ -/* */ -/* Multiple Master font support (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H - -#include FT_MULTIPLE_MASTERS_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_mm - - - static FT_Error - ft_face_get_mm_service( FT_Face face, - FT_Service_MultiMasters *aservice ) - { - FT_Error error; - - - *aservice = NULL; - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - error = FT_ERR( Invalid_Argument ); - - if ( FT_HAS_MULTIPLE_MASTERS( face ) ) - { - FT_FACE_LOOKUP_SERVICE( face, - *aservice, - MULTI_MASTERS ); - - if ( *aservice ) - error = FT_Err_Ok; - } - - return error; - } - - - /* documentation is in ftmm.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Multi_Master( FT_Face face, - FT_Multi_Master *amaster ) - { - FT_Error error; - FT_Service_MultiMasters service; - - - /* check of `face' delayed to `ft_face_get_mm_service' */ - - if ( !amaster ) - return FT_THROW( Invalid_Argument ); - - error = ft_face_get_mm_service( face, &service ); - if ( !error ) - { - error = FT_ERR( Invalid_Argument ); - if ( service->get_mm ) - error = service->get_mm( face, amaster ); - } - - return error; - } - - - /* documentation is in ftmm.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_MM_Var( FT_Face face, - FT_MM_Var* *amaster ) - { - FT_Error error; - FT_Service_MultiMasters service; - - - /* check of `face' delayed to `ft_face_get_mm_service' */ - - if ( !amaster ) - return FT_THROW( Invalid_Argument ); - - error = ft_face_get_mm_service( face, &service ); - if ( !error ) - { - error = FT_ERR( Invalid_Argument ); - if ( service->get_mm_var ) - error = service->get_mm_var( face, amaster ); - } - - return error; - } - - - /* documentation is in ftmm.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_MM_Design_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ) - { - FT_Error error; - FT_Service_MultiMasters service; - - - /* check of `face' delayed to `ft_face_get_mm_service' */ - - if ( !coords ) - return FT_THROW( Invalid_Argument ); - - error = ft_face_get_mm_service( face, &service ); - if ( !error ) - { - error = FT_ERR( Invalid_Argument ); - if ( service->set_mm_design ) - error = service->set_mm_design( face, num_coords, coords ); - } - - return error; - } - - - /* documentation is in ftmm.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_Var_Design_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ) - { - FT_Error error; - FT_Service_MultiMasters service; - - - /* check of `face' delayed to `ft_face_get_mm_service' */ - - if ( !coords ) - return FT_THROW( Invalid_Argument ); - - error = ft_face_get_mm_service( face, &service ); - if ( !error ) - { - error = FT_ERR( Invalid_Argument ); - if ( service->set_var_design ) - error = service->set_var_design( face, num_coords, coords ); - } - - return error; - } - - - /* documentation is in ftmm.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_MM_Blend_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ) - { - FT_Error error; - FT_Service_MultiMasters service; - - - /* check of `face' delayed to `ft_face_get_mm_service' */ - - if ( !coords ) - return FT_THROW( Invalid_Argument ); - - error = ft_face_get_mm_service( face, &service ); - if ( !error ) - { - error = FT_ERR( Invalid_Argument ); - if ( service->set_mm_blend ) - error = service->set_mm_blend( face, num_coords, coords ); - } - - return error; - } - - - /* documentation is in ftmm.h */ - - /* This is exactly the same as the previous function. It exists for */ - /* orthogonality. */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_Var_Blend_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ) - { - FT_Error error; - FT_Service_MultiMasters service; - - - /* check of `face' delayed to `ft_face_get_mm_service' */ - - if ( !coords ) - return FT_THROW( Invalid_Argument ); - - error = ft_face_get_mm_service( face, &service ); - if ( !error ) - { - error = FT_ERR( Invalid_Argument ); - if ( service->set_mm_blend ) - error = service->set_mm_blend( face, num_coords, coords ); - } - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftobjs.c b/3party/freetype/src/base/ftobjs.c deleted file mode 100644 index 926ac0adbb..0000000000 --- a/3party/freetype/src/base/ftobjs.c +++ /dev/null @@ -1,4898 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftobjs.c */ -/* */ -/* The FreeType private base classes (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_LIST_H -#include FT_OUTLINE_H -#include FT_INTERNAL_VALIDATE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_RFORK_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H /* for SFNT_Load_Table_Func */ -#include FT_TRUETYPE_TABLES_H -#include FT_TRUETYPE_TAGS_H -#include FT_TRUETYPE_IDS_H - -#include FT_SERVICE_PROPERTIES_H -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_TT_CMAP_H -#include FT_SERVICE_KERNING_H -#include FT_SERVICE_TRUETYPE_ENGINE_H - -#ifdef FT_CONFIG_OPTION_MAC_FONTS -#include "ftbase.h" -#endif - - -#ifdef FT_DEBUG_LEVEL_TRACE - -#include FT_BITMAP_H - -#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ - /* We disable the warning `conversion from XXX to YYY, */ - /* possible loss of data' in order to compile cleanly with */ - /* the maximum level of warnings: `md5.c' is non-FreeType */ - /* code, and it gets used during development builds only. */ -#pragma warning( push ) -#pragma warning( disable : 4244 ) -#endif /* _MSC_VER */ - - /* it's easiest to include `md5.c' directly */ -#include "md5.c" - -#if defined( _MSC_VER ) -#pragma warning( pop ) -#endif - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - -#define GRID_FIT_METRICS - - - FT_BASE_DEF( FT_Pointer ) - ft_service_list_lookup( FT_ServiceDesc service_descriptors, - const char* service_id ) - { - FT_Pointer result = NULL; - FT_ServiceDesc desc = service_descriptors; - - - if ( desc && service_id ) - { - for ( ; desc->serv_id != NULL; desc++ ) - { - if ( ft_strcmp( desc->serv_id, service_id ) == 0 ) - { - result = (FT_Pointer)desc->serv_data; - break; - } - } - } - - return result; - } - - - FT_BASE_DEF( void ) - ft_validator_init( FT_Validator valid, - const FT_Byte* base, - const FT_Byte* limit, - FT_ValidationLevel level ) - { - valid->base = base; - valid->limit = limit; - valid->level = level; - valid->error = FT_Err_Ok; - } - - - FT_BASE_DEF( FT_Int ) - ft_validator_run( FT_Validator valid ) - { - /* This function doesn't work! None should call it. */ - FT_UNUSED( valid ); - - return -1; - } - - - FT_BASE_DEF( void ) - ft_validator_error( FT_Validator valid, - FT_Error error ) - { - /* since the cast below also disables the compiler's */ - /* type check, we introduce a dummy variable, which */ - /* will be optimized away */ - volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer; - - - valid->error = error; - - /* throw away volatileness; use `jump_buffer' or the */ - /* compiler may warn about an unused local variable */ - ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** S T R E A M ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* create a new input stream from an FT_Open_Args structure */ - /* */ - FT_BASE_DEF( FT_Error ) - FT_Stream_New( FT_Library library, - const FT_Open_Args* args, - FT_Stream *astream ) - { - FT_Error error; - FT_Memory memory; - FT_Stream stream = NULL; - - - *astream = NULL; - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - if ( !args ) - return FT_THROW( Invalid_Argument ); - - memory = library->memory; - - if ( FT_NEW( stream ) ) - goto Exit; - - stream->memory = memory; - - if ( args->flags & FT_OPEN_MEMORY ) - { - /* create a memory-based stream */ - FT_Stream_OpenMemory( stream, - (const FT_Byte*)args->memory_base, - (FT_ULong)args->memory_size ); - } - -#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT - - else if ( args->flags & FT_OPEN_PATHNAME ) - { - /* create a normal system stream */ - error = FT_Stream_Open( stream, args->pathname ); - stream->pathname.pointer = args->pathname; - } - else if ( ( args->flags & FT_OPEN_STREAM ) && args->stream ) - { - /* use an existing, user-provided stream */ - - /* in this case, we do not need to allocate a new stream object */ - /* since the caller is responsible for closing it himself */ - FT_FREE( stream ); - stream = args->stream; - } - -#endif - - else - error = FT_THROW( Invalid_Argument ); - - if ( error ) - FT_FREE( stream ); - else - stream->memory = memory; /* just to be certain */ - - *astream = stream; - - Exit: - return error; - } - - - FT_BASE_DEF( void ) - FT_Stream_Free( FT_Stream stream, - FT_Int external ) - { - if ( stream ) - { - FT_Memory memory = stream->memory; - - - FT_Stream_Close( stream ); - - if ( !external ) - FT_FREE( stream ); - } - } - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_objs - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - static FT_Error - ft_glyphslot_init( FT_GlyphSlot slot ) - { - FT_Driver driver = slot->face->driver; - FT_Driver_Class clazz = driver->clazz; - FT_Memory memory = driver->root.memory; - FT_Error error = FT_Err_Ok; - FT_Slot_Internal internal = NULL; - - - slot->library = driver->root.library; - - if ( FT_NEW( internal ) ) - goto Exit; - - slot->internal = internal; - - if ( FT_DRIVER_USES_OUTLINES( driver ) ) - error = FT_GlyphLoader_New( memory, &internal->loader ); - - if ( !error && clazz->init_slot ) - error = clazz->init_slot( slot ); - - Exit: - return error; - } - - - FT_BASE_DEF( void ) - ft_glyphslot_free_bitmap( FT_GlyphSlot slot ) - { - if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) - { - FT_Memory memory = FT_FACE_MEMORY( slot->face ); - - - FT_FREE( slot->bitmap.buffer ); - slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; - } - else - { - /* assume that the bitmap buffer was stolen or not */ - /* allocated from the heap */ - slot->bitmap.buffer = NULL; - } - } - - - FT_BASE_DEF( void ) - ft_glyphslot_set_bitmap( FT_GlyphSlot slot, - FT_Byte* buffer ) - { - ft_glyphslot_free_bitmap( slot ); - - slot->bitmap.buffer = buffer; - - FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 ); - } - - - FT_BASE_DEF( FT_Error ) - ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, - FT_ULong size ) - { - FT_Memory memory = FT_FACE_MEMORY( slot->face ); - FT_Error error; - - - if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) - FT_FREE( slot->bitmap.buffer ); - else - slot->internal->flags |= FT_GLYPH_OWN_BITMAP; - - (void)FT_ALLOC( slot->bitmap.buffer, size ); - return error; - } - - - static void - ft_glyphslot_clear( FT_GlyphSlot slot ) - { - /* free bitmap if needed */ - ft_glyphslot_free_bitmap( slot ); - - /* clear all public fields in the glyph slot */ - FT_ZERO( &slot->metrics ); - FT_ZERO( &slot->outline ); - - slot->bitmap.width = 0; - slot->bitmap.rows = 0; - slot->bitmap.pitch = 0; - slot->bitmap.pixel_mode = 0; - /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */ - - slot->bitmap_left = 0; - slot->bitmap_top = 0; - slot->num_subglyphs = 0; - slot->subglyphs = NULL; - slot->control_data = NULL; - slot->control_len = 0; - slot->other = NULL; - slot->format = FT_GLYPH_FORMAT_NONE; - - slot->linearHoriAdvance = 0; - slot->linearVertAdvance = 0; - slot->lsb_delta = 0; - slot->rsb_delta = 0; - } - - - static void - ft_glyphslot_done( FT_GlyphSlot slot ) - { - FT_Driver driver = slot->face->driver; - FT_Driver_Class clazz = driver->clazz; - FT_Memory memory = driver->root.memory; - - - if ( clazz->done_slot ) - clazz->done_slot( slot ); - - /* free bitmap buffer if needed */ - ft_glyphslot_free_bitmap( slot ); - - /* slot->internal might be NULL in out-of-memory situations */ - if ( slot->internal ) - { - /* free glyph loader */ - if ( FT_DRIVER_USES_OUTLINES( driver ) ) - { - FT_GlyphLoader_Done( slot->internal->loader ); - slot->internal->loader = NULL; - } - - FT_FREE( slot->internal ); - } - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( FT_Error ) - FT_New_GlyphSlot( FT_Face face, - FT_GlyphSlot *aslot ) - { - FT_Error error; - FT_Driver driver; - FT_Driver_Class clazz; - FT_Memory memory; - FT_GlyphSlot slot = NULL; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !face->driver ) - return FT_THROW( Invalid_Argument ); - - driver = face->driver; - clazz = driver->clazz; - memory = driver->root.memory; - - FT_TRACE4(( "FT_New_GlyphSlot: Creating new slot object\n" )); - if ( !FT_ALLOC( slot, clazz->slot_object_size ) ) - { - slot->face = face; - - error = ft_glyphslot_init( slot ); - if ( error ) - { - ft_glyphslot_done( slot ); - FT_FREE( slot ); - goto Exit; - } - - slot->next = face->glyph; - face->glyph = slot; - - if ( aslot ) - *aslot = slot; - } - else if ( aslot ) - *aslot = NULL; - - - Exit: - FT_TRACE4(( "FT_New_GlyphSlot: Return %d\n", error )); - return error; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( void ) - FT_Done_GlyphSlot( FT_GlyphSlot slot ) - { - if ( slot ) - { - FT_Driver driver = slot->face->driver; - FT_Memory memory = driver->root.memory; - FT_GlyphSlot prev; - FT_GlyphSlot cur; - - - /* Remove slot from its parent face's list */ - prev = NULL; - cur = slot->face->glyph; - - while ( cur ) - { - if ( cur == slot ) - { - if ( !prev ) - slot->face->glyph = cur->next; - else - prev->next = cur->next; - - /* finalize client-specific data */ - if ( slot->generic.finalizer ) - slot->generic.finalizer( slot ); - - ft_glyphslot_done( slot ); - FT_FREE( slot ); - break; - } - prev = cur; - cur = cur->next; - } - } - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( void ) - FT_Set_Transform( FT_Face face, - FT_Matrix* matrix, - FT_Vector* delta ) - { - FT_Face_Internal internal; - - - if ( !face ) - return; - - internal = face->internal; - - internal->transform_flags = 0; - - if ( !matrix ) - { - internal->transform_matrix.xx = 0x10000L; - internal->transform_matrix.xy = 0; - internal->transform_matrix.yx = 0; - internal->transform_matrix.yy = 0x10000L; - - matrix = &internal->transform_matrix; - } - else - internal->transform_matrix = *matrix; - - /* set transform_flags bit flag 0 if `matrix' isn't the identity */ - if ( ( matrix->xy | matrix->yx ) || - matrix->xx != 0x10000L || - matrix->yy != 0x10000L ) - internal->transform_flags |= 1; - - if ( !delta ) - { - internal->transform_delta.x = 0; - internal->transform_delta.y = 0; - - delta = &internal->transform_delta; - } - else - internal->transform_delta = *delta; - - /* set transform_flags bit flag 1 if `delta' isn't the null vector */ - if ( delta->x | delta->y ) - internal->transform_flags |= 2; - } - - - static FT_Renderer - ft_lookup_glyph_renderer( FT_GlyphSlot slot ); - - -#ifdef GRID_FIT_METRICS - static void - ft_glyphslot_grid_fit_metrics( FT_GlyphSlot slot, - FT_Bool vertical ) - { - FT_Glyph_Metrics* metrics = &slot->metrics; - FT_Pos right, bottom; - - - if ( vertical ) - { - metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); - metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY ); - - right = FT_PIX_CEIL( metrics->vertBearingX + metrics->width ); - bottom = FT_PIX_CEIL( metrics->vertBearingY + metrics->height ); - - metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); - metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); - - metrics->width = right - metrics->vertBearingX; - metrics->height = bottom - metrics->vertBearingY; - } - else - { - metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); - metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); - - right = FT_PIX_CEIL ( metrics->horiBearingX + metrics->width ); - bottom = FT_PIX_FLOOR( metrics->horiBearingY - metrics->height ); - - metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); - metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY ); - - metrics->width = right - metrics->horiBearingX; - metrics->height = metrics->horiBearingY - bottom; - } - - metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance ); - metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance ); - } -#endif /* GRID_FIT_METRICS */ - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Load_Glyph( FT_Face face, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FT_Error error; - FT_Driver driver; - FT_GlyphSlot slot; - FT_Library library; - FT_Bool autohint = FALSE; - FT_Module hinter; - TT_Face ttface = (TT_Face)face; - - - if ( !face || !face->size || !face->glyph ) - return FT_THROW( Invalid_Face_Handle ); - - /* The validity test for `glyph_index' is performed by the */ - /* font drivers. */ - - slot = face->glyph; - ft_glyphslot_clear( slot ); - - driver = face->driver; - library = driver->root.library; - hinter = library->auto_hinter; - - /* resolve load flags dependencies */ - - if ( load_flags & FT_LOAD_NO_RECURSE ) - load_flags |= FT_LOAD_NO_SCALE | - FT_LOAD_IGNORE_TRANSFORM; - - if ( load_flags & FT_LOAD_NO_SCALE ) - { - load_flags |= FT_LOAD_NO_HINTING | - FT_LOAD_NO_BITMAP; - - load_flags &= ~FT_LOAD_RENDER; - } - - /* - * Determine whether we need to auto-hint or not. - * The general rules are: - * - * - Do only auto-hinting if we have a hinter module, a scalable font - * format dealing with outlines, and no transforms except simple - * slants and/or rotations by integer multiples of 90 degrees. - * - * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't - * have a native font hinter. - * - * - Otherwise, auto-hint for LIGHT hinting mode or if there isn't - * any hinting bytecode in the TrueType/OpenType font. - * - * - Exception: The font is `tricky' and requires the native hinter to - * load properly. - */ - - if ( hinter && - !( load_flags & FT_LOAD_NO_HINTING ) && - !( load_flags & FT_LOAD_NO_AUTOHINT ) && - FT_DRIVER_IS_SCALABLE( driver ) && - FT_DRIVER_USES_OUTLINES( driver ) && - !FT_IS_TRICKY( face ) && - ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) || - ( face->internal->transform_matrix.yx == 0 && - face->internal->transform_matrix.xx != 0 ) || - ( face->internal->transform_matrix.xx == 0 && - face->internal->transform_matrix.yx != 0 ) ) ) - { - if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) || - !FT_DRIVER_HAS_HINTER( driver ) ) - autohint = TRUE; - else - { - FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); - - - /* the check for `num_locations' assures that we actually */ - /* test for instructions in a TTF and not in a CFF-based OTF */ - /* */ - /* since `maxSizeOfInstructions' might be unreliable, we */ - /* check the size of the `fpgm' and `prep' tables, too -- */ - /* the assumption is that there don't exist real TTFs where */ - /* both `fpgm' and `prep' tables are missing */ - if ( mode == FT_RENDER_MODE_LIGHT || - face->internal->ignore_unpatented_hinter || - ( FT_IS_SFNT( face ) && - ttface->num_locations && - ttface->max_profile.maxSizeOfInstructions == 0 && - ttface->font_program_size == 0 && - ttface->cvt_program_size == 0 ) ) - autohint = TRUE; - } - } - - if ( autohint ) - { - FT_AutoHinter_Interface hinting; - - - /* try to load embedded bitmaps first if available */ - /* */ - /* XXX: This is really a temporary hack that should disappear */ - /* promptly with FreeType 2.1! */ - /* */ - if ( FT_HAS_FIXED_SIZES( face ) && - ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) - { - error = driver->clazz->load_glyph( slot, face->size, - glyph_index, - load_flags | FT_LOAD_SBITS_ONLY ); - - if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP ) - goto Load_Ok; - } - - { - FT_Face_Internal internal = face->internal; - FT_Int transform_flags = internal->transform_flags; - - - /* since the auto-hinter calls FT_Load_Glyph by itself, */ - /* make sure that glyphs aren't transformed */ - internal->transform_flags = 0; - - /* load auto-hinted outline */ - hinting = (FT_AutoHinter_Interface)hinter->clazz->module_interface; - - error = hinting->load_glyph( (FT_AutoHinter)hinter, - slot, face->size, - glyph_index, load_flags ); - - internal->transform_flags = transform_flags; - } - } - else - { - error = driver->clazz->load_glyph( slot, - face->size, - glyph_index, - load_flags ); - if ( error ) - goto Exit; - - if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) - { - /* check that the loaded outline is correct */ - error = FT_Outline_Check( &slot->outline ); - if ( error ) - goto Exit; - -#ifdef GRID_FIT_METRICS - if ( !( load_flags & FT_LOAD_NO_HINTING ) ) - ft_glyphslot_grid_fit_metrics( slot, - FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) ); -#endif - } - } - - Load_Ok: - /* compute the advance */ - if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) - { - slot->advance.x = 0; - slot->advance.y = slot->metrics.vertAdvance; - } - else - { - slot->advance.x = slot->metrics.horiAdvance; - slot->advance.y = 0; - } - - /* compute the linear advance in 16.16 pixels */ - if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 && - ( FT_IS_SCALABLE( face ) ) ) - { - FT_Size_Metrics* metrics = &face->size->metrics; - - - /* it's tricky! */ - slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance, - metrics->x_scale, 64 ); - - slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance, - metrics->y_scale, 64 ); - } - - if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 ) - { - FT_Face_Internal internal = face->internal; - - - /* now, transform the glyph image if needed */ - if ( internal->transform_flags ) - { - /* get renderer */ - FT_Renderer renderer = ft_lookup_glyph_renderer( slot ); - - - if ( renderer ) - error = renderer->clazz->transform_glyph( - renderer, slot, - &internal->transform_matrix, - &internal->transform_delta ); - else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) - { - /* apply `standard' transformation if no renderer is available */ - if ( internal->transform_flags & 1 ) - FT_Outline_Transform( &slot->outline, - &internal->transform_matrix ); - - if ( internal->transform_flags & 2 ) - FT_Outline_Translate( &slot->outline, - internal->transform_delta.x, - internal->transform_delta.y ); - } - - /* transform advance */ - FT_Vector_Transform( &slot->advance, &internal->transform_matrix ); - } - } - - FT_TRACE5(( " x advance: %d\n" , slot->advance.x )); - FT_TRACE5(( " y advance: %d\n" , slot->advance.y )); - - FT_TRACE5(( " linear x advance: %d\n" , slot->linearHoriAdvance )); - FT_TRACE5(( " linear y advance: %d\n" , slot->linearVertAdvance )); - - /* do we need to render the image now? */ - if ( !error && - slot->format != FT_GLYPH_FORMAT_BITMAP && - slot->format != FT_GLYPH_FORMAT_COMPOSITE && - load_flags & FT_LOAD_RENDER ) - { - FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); - - - if ( mode == FT_RENDER_MODE_NORMAL && - (load_flags & FT_LOAD_MONOCHROME ) ) - mode = FT_RENDER_MODE_MONO; - - error = FT_Render_Glyph( slot, mode ); - } - - Exit: - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Load_Char( FT_Face face, - FT_ULong char_code, - FT_Int32 load_flags ) - { - FT_UInt glyph_index; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - glyph_index = (FT_UInt)char_code; - if ( face->charmap ) - glyph_index = FT_Get_Char_Index( face, char_code ); - - return FT_Load_Glyph( face, glyph_index, load_flags ); - } - - - /* destructor for sizes list */ - static void - destroy_size( FT_Memory memory, - FT_Size size, - FT_Driver driver ) - { - /* finalize client-specific data */ - if ( size->generic.finalizer ) - size->generic.finalizer( size ); - - /* finalize format-specific stuff */ - if ( driver->clazz->done_size ) - driver->clazz->done_size( size ); - - FT_FREE( size->internal ); - FT_FREE( size ); - } - - - static void - ft_cmap_done_internal( FT_CMap cmap ); - - - static void - destroy_charmaps( FT_Face face, - FT_Memory memory ) - { - FT_Int n; - - - if ( !face ) - return; - - for ( n = 0; n < face->num_charmaps; n++ ) - { - FT_CMap cmap = FT_CMAP( face->charmaps[n] ); - - - ft_cmap_done_internal( cmap ); - - face->charmaps[n] = NULL; - } - - FT_FREE( face->charmaps ); - face->num_charmaps = 0; - } - - - /* destructor for faces list */ - static void - destroy_face( FT_Memory memory, - FT_Face face, - FT_Driver driver ) - { - FT_Driver_Class clazz = driver->clazz; - - - /* discard auto-hinting data */ - if ( face->autohint.finalizer ) - face->autohint.finalizer( face->autohint.data ); - - /* Discard glyph slots for this face. */ - /* Beware! FT_Done_GlyphSlot() changes the field `face->glyph' */ - while ( face->glyph ) - FT_Done_GlyphSlot( face->glyph ); - - /* discard all sizes for this face */ - FT_List_Finalize( &face->sizes_list, - (FT_List_Destructor)destroy_size, - memory, - driver ); - face->size = NULL; - - /* now discard client data */ - if ( face->generic.finalizer ) - face->generic.finalizer( face ); - - /* discard charmaps */ - destroy_charmaps( face, memory ); - - /* finalize format-specific stuff */ - if ( clazz->done_face ) - clazz->done_face( face ); - - /* close the stream for this face if needed */ - FT_Stream_Free( - face->stream, - ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); - - face->stream = NULL; - - /* get rid of it */ - if ( face->internal ) - { - FT_FREE( face->internal ); - } - FT_FREE( face ); - } - - - static void - Destroy_Driver( FT_Driver driver ) - { - FT_List_Finalize( &driver->faces_list, - (FT_List_Destructor)destroy_face, - driver->root.memory, - driver ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* find_unicode_charmap */ - /* */ - /* <Description> */ - /* This function finds a Unicode charmap, if there is one. */ - /* And if there is more than one, it tries to favour the more */ - /* extensive one, i.e., one that supports UCS-4 against those which */ - /* are limited to the BMP (said UCS-2 encoding.) */ - /* */ - /* This function is called from open_face() (just below), and also */ - /* from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ). */ - /* */ - static FT_Error - find_unicode_charmap( FT_Face face ) - { - FT_CharMap* first; - FT_CharMap* cur; - - - /* caller should have already checked that `face' is valid */ - FT_ASSERT( face ); - - first = face->charmaps; - - if ( !first ) - return FT_THROW( Invalid_CharMap_Handle ); - - /* - * The original TrueType specification(s) only specified charmap - * formats that are capable of mapping 8 or 16 bit character codes to - * glyph indices. - * - * However, recent updates to the Apple and OpenType specifications - * introduced new formats that are capable of mapping 32-bit character - * codes as well. And these are already used on some fonts, mainly to - * map non-BMP Asian ideographs as defined in Unicode. - * - * For compatibility purposes, these fonts generally come with - * *several* Unicode charmaps: - * - * - One of them in the "old" 16-bit format, that cannot access - * all glyphs in the font. - * - * - Another one in the "new" 32-bit format, that can access all - * the glyphs. - * - * This function has been written to always favor a 32-bit charmap - * when found. Otherwise, a 16-bit one is returned when found. - */ - - /* Since the `interesting' table, with IDs (3,10), is normally the */ - /* last one, we loop backwards. This loses with type1 fonts with */ - /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP */ - /* chars (.01% ?), and this is the same about 99.99% of the time! */ - - cur = first + face->num_charmaps; /* points after the last one */ - - for ( ; --cur >= first; ) - { - if ( cur[0]->encoding == FT_ENCODING_UNICODE ) - { - /* XXX If some new encodings to represent UCS-4 are added, */ - /* they should be added here. */ - if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT && - cur[0]->encoding_id == TT_MS_ID_UCS_4 ) || - ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && - cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) ) - { - face->charmap = cur[0]; - return FT_Err_Ok; - } - } - } - - /* We do not have any UCS-4 charmap. */ - /* Do the loop again and search for UCS-2 charmaps. */ - cur = first + face->num_charmaps; - - for ( ; --cur >= first; ) - { - if ( cur[0]->encoding == FT_ENCODING_UNICODE ) - { - face->charmap = cur[0]; - return FT_Err_Ok; - } - } - - return FT_THROW( Invalid_CharMap_Handle ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* find_variant_selector_charmap */ - /* */ - /* <Description> */ - /* This function finds the variant selector charmap, if there is one. */ - /* There can only be one (platform=0, specific=5, format=14). */ - /* */ - static FT_CharMap - find_variant_selector_charmap( FT_Face face ) - { - FT_CharMap* first; - FT_CharMap* end; - FT_CharMap* cur; - - - /* caller should have already checked that `face' is valid */ - FT_ASSERT( face ); - - first = face->charmaps; - - if ( !first ) - return NULL; - - end = first + face->num_charmaps; /* points after the last one */ - - for ( cur = first; cur < end; ++cur ) - { - if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && - cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR && - FT_Get_CMap_Format( cur[0] ) == 14 ) - return cur[0]; - } - - return NULL; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* open_face */ - /* */ - /* <Description> */ - /* This function does some work for FT_Open_Face(). */ - /* */ - static FT_Error - open_face( FT_Driver driver, - FT_Stream *astream, - FT_Bool external_stream, - FT_Long face_index, - FT_Int num_params, - FT_Parameter* params, - FT_Face *aface ) - { - FT_Memory memory; - FT_Driver_Class clazz; - FT_Face face = NULL; - FT_Face_Internal internal = NULL; - - FT_Error error, error2; - - - clazz = driver->clazz; - memory = driver->root.memory; - - /* allocate the face object and perform basic initialization */ - if ( FT_ALLOC( face, clazz->face_object_size ) ) - goto Fail; - - face->driver = driver; - face->memory = memory; - face->stream = *astream; - - /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */ - if ( external_stream ) - face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM; - - if ( FT_NEW( internal ) ) - goto Fail; - - face->internal = internal; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - { - int i; - - - face->internal->incremental_interface = NULL; - for ( i = 0; i < num_params && !face->internal->incremental_interface; - i++ ) - if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL ) - face->internal->incremental_interface = - (FT_Incremental_Interface)params[i].data; - } -#endif - - if ( clazz->init_face ) - error = clazz->init_face( *astream, - face, - (FT_Int)face_index, - num_params, - params ); - *astream = face->stream; /* Stream may have been changed. */ - if ( error ) - goto Fail; - - /* select Unicode charmap by default */ - error2 = find_unicode_charmap( face ); - - /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */ - /* is returned. */ - - /* no error should happen, but we want to play safe */ - if ( error2 && FT_ERR_NEQ( error2, Invalid_CharMap_Handle ) ) - { - error = error2; - goto Fail; - } - - *aface = face; - - Fail: - if ( error ) - { - destroy_charmaps( face, memory ); - if ( clazz->done_face ) - clazz->done_face( face ); - FT_FREE( internal ); - FT_FREE( face ); - *aface = NULL; - } - - return error; - } - - - /* there's a Mac-specific extended implementation of FT_New_Face() */ - /* in src/base/ftmac.c */ - -#ifndef FT_MACINTOSH - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_New_Face( FT_Library library, - const char* pathname, - FT_Long face_index, - FT_Face *aface ) - { - FT_Open_Args args; - - - /* test for valid `library' and `aface' delayed to `FT_Open_Face' */ - if ( !pathname ) - return FT_THROW( Invalid_Argument ); - - args.flags = FT_OPEN_PATHNAME; - args.pathname = (char*)pathname; - args.stream = NULL; - - return FT_Open_Face( library, &args, face_index, aface ); - } - -#endif - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_New_Memory_Face( FT_Library library, - const FT_Byte* file_base, - FT_Long file_size, - FT_Long face_index, - FT_Face *aface ) - { - FT_Open_Args args; - - - /* test for valid `library' and `face' delayed to `FT_Open_Face' */ - if ( !file_base ) - return FT_THROW( Invalid_Argument ); - - args.flags = FT_OPEN_MEMORY; - args.memory_base = file_base; - args.memory_size = file_size; - args.stream = NULL; - - return FT_Open_Face( library, &args, face_index, aface ); - } - - -#ifdef FT_CONFIG_OPTION_MAC_FONTS - - /* The behavior here is very similar to that in base/ftmac.c, but it */ - /* is designed to work on non-mac systems, so no mac specific calls. */ - /* */ - /* We look at the file and determine if it is a mac dfont file or a mac */ - /* resource file, or a macbinary file containing a mac resource file. */ - /* */ - /* Unlike ftmac I'm not going to look at a `FOND'. I don't really see */ - /* the point, especially since there may be multiple `FOND' resources. */ - /* Instead I'll just look for `sfnt' and `POST' resources, ordered as */ - /* they occur in the file. */ - /* */ - /* Note that multiple `POST' resources do not mean multiple postscript */ - /* fonts; they all get jammed together to make what is essentially a */ - /* pfb file. */ - /* */ - /* We aren't interested in `NFNT' or `FONT' bitmap resources. */ - /* */ - /* As soon as we get an `sfnt' load it into memory and pass it off to */ - /* FT_Open_Face. */ - /* */ - /* If we have a (set of) `POST' resources, massage them into a (memory) */ - /* pfb file and pass that to FT_Open_Face. (As with ftmac.c I'm not */ - /* going to try to save the kerning info. After all that lives in the */ - /* `FOND' which isn't in the file containing the `POST' resources so */ - /* we don't really have access to it. */ - - - /* Finalizer for a memory stream; gets called by FT_Done_Face(). */ - /* It frees the memory it uses. */ - /* From ftmac.c. */ - static void - memory_stream_close( FT_Stream stream ) - { - FT_Memory memory = stream->memory; - - - FT_FREE( stream->base ); - - stream->size = 0; - stream->base = NULL; - stream->close = NULL; - } - - - /* Create a new memory stream from a buffer and a size. */ - /* From ftmac.c. */ - static FT_Error - new_memory_stream( FT_Library library, - FT_Byte* base, - FT_ULong size, - FT_Stream_CloseFunc close, - FT_Stream *astream ) - { - FT_Error error; - FT_Memory memory; - FT_Stream stream = NULL; - - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - if ( !base ) - return FT_THROW( Invalid_Argument ); - - *astream = NULL; - memory = library->memory; - if ( FT_NEW( stream ) ) - goto Exit; - - FT_Stream_OpenMemory( stream, base, size ); - - stream->close = close; - - *astream = stream; - - Exit: - return error; - } - - - /* Create a new FT_Face given a buffer and a driver name. */ - /* from ftmac.c */ - FT_LOCAL_DEF( FT_Error ) - open_face_from_buffer( FT_Library library, - FT_Byte* base, - FT_ULong size, - FT_Long face_index, - const char* driver_name, - FT_Face *aface ) - { - FT_Open_Args args; - FT_Error error; - FT_Stream stream = NULL; - FT_Memory memory = library->memory; - - - error = new_memory_stream( library, - base, - size, - memory_stream_close, - &stream ); - if ( error ) - { - FT_FREE( base ); - return error; - } - - args.flags = FT_OPEN_STREAM; - args.stream = stream; - if ( driver_name ) - { - args.flags = args.flags | FT_OPEN_DRIVER; - args.driver = FT_Get_Module( library, driver_name ); - } - -#ifdef FT_MACINTOSH - /* At this point, the face index has served its purpose; */ - /* whoever calls this function has already used it to */ - /* locate the correct font data. We should not propagate */ - /* this index to FT_Open_Face() (unless it is negative). */ - - if ( face_index > 0 ) - face_index &= 0x7FFF0000L; /* retain GX data */ -#endif - - error = FT_Open_Face( library, &args, face_index, aface ); - - if ( error == FT_Err_Ok ) - (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; - else -#ifdef FT_MACINTOSH - FT_Stream_Free( stream, 0 ); -#else - { - FT_Stream_Close( stream ); - FT_FREE( stream ); - } -#endif - - return error; - } - - - /* Look up `TYP1' or `CID ' table from sfnt table directory. */ - /* `offset' and `length' must exclude the binary header in tables. */ - - /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */ - /* format too. Here, since we can't expect that the TrueType font */ - /* driver is loaded unconditially, we must parse the font by */ - /* ourselves. We are only interested in the name of the table and */ - /* the offset. */ - - static FT_Error - ft_lookup_PS_in_sfnt_stream( FT_Stream stream, - FT_Long face_index, - FT_ULong* offset, - FT_ULong* length, - FT_Bool* is_sfnt_cid ) - { - FT_Error error; - FT_UShort numTables; - FT_Long pstable_index; - FT_ULong tag; - int i; - - - *offset = 0; - *length = 0; - *is_sfnt_cid = FALSE; - - /* TODO: support for sfnt-wrapped PS/CID in TTC format */ - - /* version check for 'typ1' (should be ignored?) */ - if ( FT_READ_ULONG( tag ) ) - return error; - if ( tag != TTAG_typ1 ) - return FT_THROW( Unknown_File_Format ); - - if ( FT_READ_USHORT( numTables ) ) - return error; - if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */ - return error; - - pstable_index = -1; - *is_sfnt_cid = FALSE; - - for ( i = 0; i < numTables; i++ ) - { - if ( FT_READ_ULONG( tag ) || FT_STREAM_SKIP( 4 ) || - FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) ) - return error; - - if ( tag == TTAG_CID ) - { - pstable_index++; - *offset += 22; - *length -= 22; - *is_sfnt_cid = TRUE; - if ( face_index < 0 ) - return FT_Err_Ok; - } - else if ( tag == TTAG_TYP1 ) - { - pstable_index++; - *offset += 24; - *length -= 24; - *is_sfnt_cid = FALSE; - if ( face_index < 0 ) - return FT_Err_Ok; - } - if ( face_index >= 0 && pstable_index == face_index ) - return FT_Err_Ok; - } - return FT_THROW( Table_Missing ); - } - - - FT_LOCAL_DEF( FT_Error ) - open_face_PS_from_sfnt_stream( FT_Library library, - FT_Stream stream, - FT_Long face_index, - FT_Int num_params, - FT_Parameter *params, - FT_Face *aface ) - { - FT_Error error; - FT_Memory memory = library->memory; - FT_ULong offset, length; - FT_ULong pos; - FT_Bool is_sfnt_cid; - FT_Byte* sfnt_ps = NULL; - - FT_UNUSED( num_params ); - FT_UNUSED( params ); - - - /* ignore GX stuff */ - if ( face_index > 0 ) - face_index &= 0xFFFFL; - - pos = FT_STREAM_POS(); - - error = ft_lookup_PS_in_sfnt_stream( stream, - face_index, - &offset, - &length, - &is_sfnt_cid ); - if ( error ) - goto Exit; - - if ( FT_Stream_Seek( stream, pos + offset ) ) - goto Exit; - - if ( FT_ALLOC( sfnt_ps, (FT_Long)length ) ) - goto Exit; - - error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length ); - if ( error ) - goto Exit; - - error = open_face_from_buffer( library, - sfnt_ps, - length, - FT_MIN( face_index, 0 ), - is_sfnt_cid ? "cid" : "type1", - aface ); - Exit: - { - FT_Error error1; - - - if ( FT_ERR_EQ( error, Unknown_File_Format ) ) - { - error1 = FT_Stream_Seek( stream, pos ); - if ( error1 ) - return error1; - } - - return error; - } - } - - -#ifndef FT_MACINTOSH - - /* The resource header says we've got resource_cnt `POST' (type1) */ - /* resources in this file. They all need to be coalesced into */ - /* one lump which gets passed on to the type1 driver. */ - /* Here can be only one PostScript font in a file so face_index */ - /* must be 0 (or -1). */ - /* */ - static FT_Error - Mac_Read_POST_Resource( FT_Library library, - FT_Stream stream, - FT_Long *offsets, - FT_Long resource_cnt, - FT_Long face_index, - FT_Face *aface ) - { - FT_Error error = FT_ERR( Cannot_Open_Resource ); - FT_Memory memory = library->memory; - FT_Byte* pfb_data = NULL; - int i, type, flags; - FT_ULong len; - FT_ULong pfb_len, pfb_pos, pfb_lenpos; - FT_ULong rlen, temp; - - - if ( face_index == -1 ) - face_index = 0; - if ( face_index != 0 ) - return error; - - /* Find the length of all the POST resources, concatenated. Assume */ - /* worst case (each resource in its own section). */ - pfb_len = 0; - for ( i = 0; i < resource_cnt; ++i ) - { - error = FT_Stream_Seek( stream, (FT_ULong)offsets[i] ); - if ( error ) - goto Exit; - if ( FT_READ_ULONG( temp ) ) - goto Exit; - - /* FT2 allocator takes signed long buffer length, - * too large value causing overflow should be checked - */ - FT_TRACE4(( " POST fragment #%d: length=0x%08x\n", - i, temp)); - if ( 0x7FFFFFFFUL < temp || pfb_len + temp + 6 < pfb_len ) - { - FT_TRACE2(( " too long fragment length makes" - " pfb_len confused: temp=0x%08x\n", temp )); - error = FT_THROW( Invalid_Offset ); - goto Exit; - } - - pfb_len += temp + 6; - } - - FT_TRACE2(( " total buffer size to concatenate %d" - " POST fragments: 0x%08x\n", - resource_cnt, pfb_len + 2)); - if ( pfb_len + 2 < 6 ) { - FT_TRACE2(( " too long fragment length makes" - " pfb_len confused: pfb_len=0x%08x\n", pfb_len )); - error = FT_THROW( Array_Too_Large ); - goto Exit; - } - if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) ) - goto Exit; - - pfb_data[0] = 0x80; - pfb_data[1] = 1; /* Ascii section */ - pfb_data[2] = 0; /* 4-byte length, fill in later */ - pfb_data[3] = 0; - pfb_data[4] = 0; - pfb_data[5] = 0; - pfb_pos = 6; - pfb_lenpos = 2; - - len = 0; - type = 1; - for ( i = 0; i < resource_cnt; ++i ) - { - error = FT_Stream_Seek( stream, (FT_ULong)offsets[i] ); - if ( error ) - goto Exit2; - if ( FT_READ_ULONG( rlen ) ) - goto Exit2; - - /* FT2 allocator takes signed long buffer length, - * too large fragment length causing overflow should be checked - */ - if ( 0x7FFFFFFFUL < rlen ) - { - error = FT_THROW( Invalid_Offset ); - goto Exit2; - } - - if ( FT_READ_USHORT( flags ) ) - goto Exit2; - FT_TRACE3(( "POST fragment[%d]: offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n", - i, offsets[i], rlen, flags )); - - error = FT_ERR( Array_Too_Large ); - /* postpone the check of rlen longer than buffer until FT_Stream_Read() */ - if ( ( flags >> 8 ) == 0 ) /* Comment, should not be loaded */ - { - FT_TRACE3(( " Skip POST fragment #%d because it is a comment\n", i )); - continue; - } - - /* the flags are part of the resource, so rlen >= 2. */ - /* but some fonts declare rlen = 0 for empty fragment */ - if ( rlen > 2 ) - rlen -= 2; - else - rlen = 0; - - if ( ( flags >> 8 ) == type ) - len += rlen; - else - { - FT_TRACE3(( " Write POST fragment #%d header (4-byte) to buffer" - " 0x%p + 0x%08x\n", i, pfb_data, pfb_lenpos )); - if ( pfb_lenpos + 3 > pfb_len + 2 ) - goto Exit2; - pfb_data[pfb_lenpos ] = (FT_Byte)( len ); - pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); - pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); - pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); - - if ( ( flags >> 8 ) == 5 ) /* End of font mark */ - break; - - FT_TRACE3(( " Write POST fragment #%d header (6-byte) to buffer" - " 0x%p + 0x%08x\n", i, pfb_data, pfb_pos )); - if ( pfb_pos + 6 > pfb_len + 2 ) - goto Exit2; - pfb_data[pfb_pos++] = 0x80; - - type = flags >> 8; - len = rlen; - - pfb_data[pfb_pos++] = (FT_Byte)type; - pfb_lenpos = pfb_pos; - pfb_data[pfb_pos++] = 0; /* 4-byte length, fill in later */ - pfb_data[pfb_pos++] = 0; - pfb_data[pfb_pos++] = 0; - pfb_data[pfb_pos++] = 0; - } - - if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len ) - goto Exit2; - - FT_TRACE3(( " Load POST fragment #%d (%d byte) to buffer" - " 0x%p + 0x%08x\n", i, rlen, pfb_data, pfb_pos )); - error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen ); - if ( error ) - goto Exit2; - pfb_pos += rlen; - } - - error = FT_ERR( Array_Too_Large ); - if ( pfb_pos + 2 > pfb_len + 2 ) - goto Exit2; - pfb_data[pfb_pos++] = 0x80; - pfb_data[pfb_pos++] = 3; - - if ( pfb_lenpos + 3 > pfb_len + 2 ) - goto Exit2; - pfb_data[pfb_lenpos ] = (FT_Byte)( len ); - pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); - pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); - pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); - - return open_face_from_buffer( library, - pfb_data, - pfb_pos, - face_index, - "type1", - aface ); - - Exit2: - if ( error == FT_ERR( Array_Too_Large ) ) - FT_TRACE2(( " Abort due to too-short buffer to store" - " all POST fragments\n" )); - else if ( error == FT_ERR( Invalid_Offset ) ) - FT_TRACE2(( " Abort due to invalid offset in a POST fragment\n" )); - if ( error ) - error = FT_ERR( Cannot_Open_Resource ); - FT_FREE( pfb_data ); - - Exit: - return error; - } - - - /* The resource header says we've got resource_cnt `sfnt' */ - /* (TrueType/OpenType) resources in this file. Look through */ - /* them for the one indicated by face_index, load it into mem, */ - /* pass it on to the truetype driver, and return it. */ - /* */ - static FT_Error - Mac_Read_sfnt_Resource( FT_Library library, - FT_Stream stream, - FT_Long *offsets, - FT_Long resource_cnt, - FT_Long face_index, - FT_Face *aface ) - { - FT_Memory memory = library->memory; - FT_Byte* sfnt_data = NULL; - FT_Error error; - FT_ULong flag_offset; - FT_Long rlen; - int is_cff; - FT_Long face_index_in_resource = 0; - - - if ( face_index == -1 ) - face_index = 0; - if ( face_index >= resource_cnt ) - return FT_THROW( Cannot_Open_Resource ); - - flag_offset = (FT_ULong)offsets[face_index]; - error = FT_Stream_Seek( stream, flag_offset ); - if ( error ) - goto Exit; - - if ( FT_READ_LONG( rlen ) ) - goto Exit; - if ( rlen == -1 ) - return FT_THROW( Cannot_Open_Resource ); - - error = open_face_PS_from_sfnt_stream( library, - stream, - face_index, - 0, NULL, - aface ); - if ( !error ) - goto Exit; - - /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */ - if ( FT_Stream_Seek( stream, flag_offset + 4 ) ) - goto Exit; - - if ( FT_ALLOC( sfnt_data, rlen ) ) - return error; - error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, (FT_ULong)rlen ); - if ( error ) - goto Exit; - - is_cff = rlen > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); - error = open_face_from_buffer( library, - sfnt_data, - (FT_ULong)rlen, - face_index_in_resource, - is_cff ? "cff" : "truetype", - aface ); - - Exit: - return error; - } - - - /* Check for a valid resource fork header, or a valid dfont */ - /* header. In a resource fork the first 16 bytes are repeated */ - /* at the location specified by bytes 4-7. In a dfont bytes */ - /* 4-7 point to 16 bytes of zeroes instead. */ - /* */ - static FT_Error - IsMacResource( FT_Library library, - FT_Stream stream, - FT_Long resource_offset, - FT_Long face_index, - FT_Face *aface ) - { - FT_Memory memory = library->memory; - FT_Error error; - FT_Long map_offset, rdara_pos; - FT_Long *data_offsets; - FT_Long count; - - - error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset, - &map_offset, &rdara_pos ); - if ( error ) - return error; - - /* POST resources must be sorted to concatenate properly */ - error = FT_Raccess_Get_DataOffsets( library, stream, - map_offset, rdara_pos, - TTAG_POST, TRUE, - &data_offsets, &count ); - if ( !error ) - { - error = Mac_Read_POST_Resource( library, stream, data_offsets, count, - face_index, aface ); - FT_FREE( data_offsets ); - /* POST exists in an LWFN providing a single face */ - if ( !error ) - (*aface)->num_faces = 1; - return error; - } - - /* sfnt resources should not be sorted to preserve the face order by - QuickDraw API */ - error = FT_Raccess_Get_DataOffsets( library, stream, - map_offset, rdara_pos, - TTAG_sfnt, FALSE, - &data_offsets, &count ); - if ( !error ) - { - FT_Long face_index_internal = face_index % count; - - - error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count, - face_index_internal, aface ); - FT_FREE( data_offsets ); - if ( !error ) - (*aface)->num_faces = count; - } - - return error; - } - - - /* Check for a valid macbinary header, and if we find one */ - /* check that the (flattened) resource fork in it is valid. */ - /* */ - static FT_Error - IsMacBinary( FT_Library library, - FT_Stream stream, - FT_Long face_index, - FT_Face *aface ) - { - unsigned char header[128]; - FT_Error error; - FT_Long dlen, offset; - - - if ( NULL == stream ) - return FT_THROW( Invalid_Stream_Operation ); - - error = FT_Stream_Seek( stream, 0 ); - if ( error ) - goto Exit; - - error = FT_Stream_Read( stream, (FT_Byte*)header, 128 ); - if ( error ) - goto Exit; - - if ( header[ 0] != 0 || - header[74] != 0 || - header[82] != 0 || - header[ 1] == 0 || - header[ 1] > 33 || - header[63] != 0 || - header[2 + header[1]] != 0 || - header[0x53] > 0x7F ) - return FT_THROW( Unknown_File_Format ); - - dlen = ( header[0x53] << 24 ) | - ( header[0x54] << 16 ) | - ( header[0x55] << 8 ) | - header[0x56]; -#if 0 - rlen = ( header[0x57] << 24 ) | - ( header[0x58] << 16 ) | - ( header[0x59] << 8 ) | - header[0x5A]; -#endif /* 0 */ - offset = 128 + ( ( dlen + 127 ) & ~127 ); - - return IsMacResource( library, stream, offset, face_index, aface ); - - Exit: - return error; - } - - - static FT_Error - load_face_in_embedded_rfork( FT_Library library, - FT_Stream stream, - FT_Long face_index, - FT_Face *aface, - const FT_Open_Args *args ) - { - -#undef FT_COMPONENT -#define FT_COMPONENT trace_raccess - - FT_Memory memory = library->memory; - FT_Error error = FT_ERR( Unknown_File_Format ); - FT_UInt i; - - char * file_names[FT_RACCESS_N_RULES]; - FT_Long offsets[FT_RACCESS_N_RULES]; - FT_Error errors[FT_RACCESS_N_RULES]; - FT_Bool is_darwin_vfs, vfs_rfork_has_no_font = FALSE; /* not tested */ - - FT_Open_Args args2; - FT_Stream stream2 = NULL; - - - FT_Raccess_Guess( library, stream, - args->pathname, file_names, offsets, errors ); - - for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) - { - is_darwin_vfs = ft_raccess_rule_by_darwin_vfs( library, i ); - if ( is_darwin_vfs && vfs_rfork_has_no_font ) - { - FT_TRACE3(( "Skip rule %d: darwin vfs resource fork" - " is already checked and" - " no font is found\n", i )); - continue; - } - - if ( errors[i] ) - { - FT_TRACE3(( "Error[%d] has occurred in rule %d\n", errors[i], i )); - continue; - } - - args2.flags = FT_OPEN_PATHNAME; - args2.pathname = file_names[i] ? file_names[i] : args->pathname; - - FT_TRACE3(( "Try rule %d: %s (offset=%d) ...", - i, args2.pathname, offsets[i] )); - - error = FT_Stream_New( library, &args2, &stream2 ); - if ( is_darwin_vfs && FT_ERR_EQ( error, Cannot_Open_Stream ) ) - vfs_rfork_has_no_font = TRUE; - - if ( error ) - { - FT_TRACE3(( "failed\n" )); - continue; - } - - error = IsMacResource( library, stream2, offsets[i], - face_index, aface ); - FT_Stream_Free( stream2, 0 ); - - FT_TRACE3(( "%s\n", error ? "failed": "successful" )); - - if ( !error ) - break; - else if ( is_darwin_vfs ) - vfs_rfork_has_no_font = TRUE; - } - - for (i = 0; i < FT_RACCESS_N_RULES; i++) - { - if ( file_names[i] ) - FT_FREE( file_names[i] ); - } - - /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */ - if ( error ) - error = FT_ERR( Unknown_File_Format ); - - return error; - -#undef FT_COMPONENT -#define FT_COMPONENT trace_objs - - } - - - /* Check for some macintosh formats without Carbon framework. */ - /* Is this a macbinary file? If so look at the resource fork. */ - /* Is this a mac dfont file? */ - /* Is this an old style resource fork? (in data) */ - /* Else call load_face_in_embedded_rfork to try extra rules */ - /* (defined in `ftrfork.c'). */ - /* */ - static FT_Error - load_mac_face( FT_Library library, - FT_Stream stream, - FT_Long face_index, - FT_Face *aface, - const FT_Open_Args *args ) - { - FT_Error error; - FT_UNUSED( args ); - - - error = IsMacBinary( library, stream, face_index, aface ); - if ( FT_ERR_EQ( error, Unknown_File_Format ) ) - { - -#undef FT_COMPONENT -#define FT_COMPONENT trace_raccess - - FT_TRACE3(( "Try as dfont: %s ...", args->pathname )); - - error = IsMacResource( library, stream, 0, face_index, aface ); - - FT_TRACE3(( "%s\n", error ? "failed" : "successful" )); - -#undef FT_COMPONENT -#define FT_COMPONENT trace_objs - - } - - if ( ( FT_ERR_EQ( error, Unknown_File_Format ) || - FT_ERR_EQ( error, Invalid_Stream_Operation ) ) && - ( args->flags & FT_OPEN_PATHNAME ) ) - error = load_face_in_embedded_rfork( library, stream, - face_index, aface, args ); - return error; - } -#endif - -#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Open_Face( FT_Library library, - const FT_Open_Args* args, - FT_Long face_index, - FT_Face *aface ) - { - FT_Error error; - FT_Driver driver = NULL; - FT_Memory memory = NULL; - FT_Stream stream = NULL; - FT_Face face = NULL; - FT_ListNode node = NULL; - FT_Bool external_stream; - FT_Module* cur; - FT_Module* limit; - - - /* test for valid `library' delayed to `FT_Stream_New' */ - - if ( ( !aface && face_index >= 0 ) || !args ) - return FT_THROW( Invalid_Argument ); - - external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) && - args->stream ); - - /* create input stream */ - error = FT_Stream_New( library, args, &stream ); - if ( error ) - goto Fail3; - - memory = library->memory; - - /* If the font driver is specified in the `args' structure, use */ - /* it. Otherwise, we scan the list of registered drivers. */ - if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver ) - { - driver = FT_DRIVER( args->driver ); - - /* not all modules are drivers, so check... */ - if ( FT_MODULE_IS_DRIVER( driver ) ) - { - FT_Int num_params = 0; - FT_Parameter* params = NULL; - - - if ( args->flags & FT_OPEN_PARAMS ) - { - num_params = args->num_params; - params = args->params; - } - - error = open_face( driver, &stream, external_stream, face_index, - num_params, params, &face ); - if ( !error ) - goto Success; - } - else - error = FT_THROW( Invalid_Handle ); - - FT_Stream_Free( stream, external_stream ); - goto Fail; - } - else - { - error = FT_ERR( Missing_Module ); - - /* check each font driver for an appropriate format */ - cur = library->modules; - limit = cur + library->num_modules; - - for ( ; cur < limit; cur++ ) - { - /* not all modules are font drivers, so check... */ - if ( FT_MODULE_IS_DRIVER( cur[0] ) ) - { - FT_Int num_params = 0; - FT_Parameter* params = NULL; - - - driver = FT_DRIVER( cur[0] ); - - if ( args->flags & FT_OPEN_PARAMS ) - { - num_params = args->num_params; - params = args->params; - } - - error = open_face( driver, &stream, external_stream, face_index, - num_params, params, &face ); - if ( !error ) - goto Success; - -#ifdef FT_CONFIG_OPTION_MAC_FONTS - if ( ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 && - FT_ERR_EQ( error, Table_Missing ) ) - { - /* TrueType but essential tables are missing */ - if ( FT_Stream_Seek( stream, 0 ) ) - break; - - error = open_face_PS_from_sfnt_stream( library, - stream, - face_index, - num_params, - params, - aface ); - if ( !error ) - { - FT_Stream_Free( stream, external_stream ); - return error; - } - } -#endif - - if ( FT_ERR_NEQ( error, Unknown_File_Format ) ) - goto Fail3; - } - } - - Fail3: - /* If we are on the mac, and we get an */ - /* FT_Err_Invalid_Stream_Operation it may be because we have an */ - /* empty data fork, so we need to check the resource fork. */ - if ( FT_ERR_NEQ( error, Cannot_Open_Stream ) && - FT_ERR_NEQ( error, Unknown_File_Format ) && - FT_ERR_NEQ( error, Invalid_Stream_Operation ) ) - goto Fail2; - -#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS ) - error = load_mac_face( library, stream, face_index, aface, args ); - if ( !error ) - { - /* We don't want to go to Success here. We've already done that. */ - /* On the other hand, if we succeeded we still need to close this */ - /* stream (we opened a different stream which extracted the */ - /* interesting information out of this stream here. That stream */ - /* will still be open and the face will point to it). */ - FT_Stream_Free( stream, external_stream ); - return error; - } - - if ( FT_ERR_NEQ( error, Unknown_File_Format ) ) - goto Fail2; -#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ - - /* no driver is able to handle this format */ - error = FT_THROW( Unknown_File_Format ); - - Fail2: - FT_Stream_Free( stream, external_stream ); - goto Fail; - } - - Success: - FT_TRACE4(( "FT_Open_Face: New face object, adding to list\n" )); - - /* add the face object to its driver's list */ - if ( FT_NEW( node ) ) - goto Fail; - - node->data = face; - /* don't assume driver is the same as face->driver, so use */ - /* face->driver instead. */ - FT_List_Add( &face->driver->faces_list, node ); - - /* now allocate a glyph slot object for the face */ - FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" )); - - if ( face_index >= 0 ) - { - error = FT_New_GlyphSlot( face, NULL ); - if ( error ) - goto Fail; - - /* finally, allocate a size object for the face */ - { - FT_Size size; - - - FT_TRACE4(( "FT_Open_Face: Creating size object\n" )); - - error = FT_New_Size( face, &size ); - if ( error ) - goto Fail; - - face->size = size; - } - } - - /* some checks */ - - if ( FT_IS_SCALABLE( face ) ) - { - if ( face->height < 0 ) - face->height = (FT_Short)-face->height; - - if ( !FT_HAS_VERTICAL( face ) ) - face->max_advance_height = (FT_Short)face->height; - } - - if ( FT_HAS_FIXED_SIZES( face ) ) - { - FT_Int i; - - - for ( i = 0; i < face->num_fixed_sizes; i++ ) - { - FT_Bitmap_Size* bsize = face->available_sizes + i; - - - if ( bsize->height < 0 ) - bsize->height = (FT_Short)-bsize->height; - if ( bsize->x_ppem < 0 ) - bsize->x_ppem = (FT_Short)-bsize->x_ppem; - if ( bsize->y_ppem < 0 ) - bsize->y_ppem = -bsize->y_ppem; - } - } - - /* initialize internal face data */ - { - FT_Face_Internal internal = face->internal; - - - internal->transform_matrix.xx = 0x10000L; - internal->transform_matrix.xy = 0; - internal->transform_matrix.yx = 0; - internal->transform_matrix.yy = 0x10000L; - - internal->transform_delta.x = 0; - internal->transform_delta.y = 0; - - internal->refcount = 1; - } - - if ( aface ) - *aface = face; - else - FT_Done_Face( face ); - - goto Exit; - - Fail: - if ( node ) - FT_Done_Face( face ); /* face must be in the driver's list */ - else if ( face ) - destroy_face( memory, face, driver ); - - Exit: - FT_TRACE4(( "FT_Open_Face: Return %d\n", error )); - - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Attach_File( FT_Face face, - const char* filepathname ) - { - FT_Open_Args open; - - - /* test for valid `face' delayed to `FT_Attach_Stream' */ - - if ( !filepathname ) - return FT_THROW( Invalid_Argument ); - - open.stream = NULL; - open.flags = FT_OPEN_PATHNAME; - open.pathname = (char*)filepathname; - - return FT_Attach_Stream( face, &open ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Attach_Stream( FT_Face face, - FT_Open_Args* parameters ) - { - FT_Stream stream; - FT_Error error; - FT_Driver driver; - - FT_Driver_Class clazz; - - - /* test for valid `parameters' delayed to `FT_Stream_New' */ - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - driver = face->driver; - if ( !driver ) - return FT_THROW( Invalid_Driver_Handle ); - - error = FT_Stream_New( driver->root.library, parameters, &stream ); - if ( error ) - goto Exit; - - /* we implement FT_Attach_Stream in each driver through the */ - /* `attach_file' interface */ - - error = FT_ERR( Unimplemented_Feature ); - clazz = driver->clazz; - if ( clazz->attach_file ) - error = clazz->attach_file( face, stream ); - - /* close the attached stream */ - FT_Stream_Free( stream, - (FT_Bool)( parameters->stream && - ( parameters->flags & FT_OPEN_STREAM ) ) ); - - Exit: - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Reference_Face( FT_Face face ) - { - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - face->internal->refcount++; - - return FT_Err_Ok; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Done_Face( FT_Face face ) - { - FT_Error error; - FT_Driver driver; - FT_Memory memory; - FT_ListNode node; - - - error = FT_ERR( Invalid_Face_Handle ); - if ( face && face->driver ) - { - face->internal->refcount--; - if ( face->internal->refcount > 0 ) - error = FT_Err_Ok; - else - { - driver = face->driver; - memory = driver->root.memory; - - /* find face in driver's list */ - node = FT_List_Find( &driver->faces_list, face ); - if ( node ) - { - /* remove face object from the driver's list */ - FT_List_Remove( &driver->faces_list, node ); - FT_FREE( node ); - - /* now destroy the object proper */ - destroy_face( memory, face, driver ); - error = FT_Err_Ok; - } - } - } - - return error; - } - - - /* documentation is in ftobjs.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_New_Size( FT_Face face, - FT_Size *asize ) - { - FT_Error error; - FT_Memory memory; - FT_Driver driver; - FT_Driver_Class clazz; - - FT_Size size = NULL; - FT_ListNode node = NULL; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !asize ) - return FT_THROW( Invalid_Argument ); - - if ( !face->driver ) - return FT_THROW( Invalid_Driver_Handle ); - - *asize = NULL; - - driver = face->driver; - clazz = driver->clazz; - memory = face->memory; - - /* Allocate new size object and perform basic initialisation */ - if ( FT_ALLOC( size, clazz->size_object_size ) || FT_NEW( node ) ) - goto Exit; - - size->face = face; - - /* for now, do not use any internal fields in size objects */ - size->internal = NULL; - - if ( clazz->init_size ) - error = clazz->init_size( size ); - - /* in case of success, add to the face's list */ - if ( !error ) - { - *asize = size; - node->data = size; - FT_List_Add( &face->sizes_list, node ); - } - - Exit: - if ( error ) - { - FT_FREE( node ); - FT_FREE( size ); - } - - return error; - } - - - /* documentation is in ftobjs.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Done_Size( FT_Size size ) - { - FT_Error error; - FT_Driver driver; - FT_Memory memory; - FT_Face face; - FT_ListNode node; - - - if ( !size ) - return FT_THROW( Invalid_Size_Handle ); - - face = size->face; - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - driver = face->driver; - if ( !driver ) - return FT_THROW( Invalid_Driver_Handle ); - - memory = driver->root.memory; - - error = FT_Err_Ok; - node = FT_List_Find( &face->sizes_list, size ); - if ( node ) - { - FT_List_Remove( &face->sizes_list, node ); - FT_FREE( node ); - - if ( face->size == size ) - { - face->size = NULL; - if ( face->sizes_list.head ) - face->size = (FT_Size)(face->sizes_list.head->data); - } - - destroy_size( memory, size, driver ); - } - else - error = FT_THROW( Invalid_Size_Handle ); - - return error; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( FT_Error ) - FT_Match_Size( FT_Face face, - FT_Size_Request req, - FT_Bool ignore_width, - FT_ULong* size_index ) - { - FT_Int i; - FT_Long w, h; - - - if ( !FT_HAS_FIXED_SIZES( face ) ) - return FT_THROW( Invalid_Face_Handle ); - - /* FT_Bitmap_Size doesn't provide enough info... */ - if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) - return FT_THROW( Unimplemented_Feature ); - - w = FT_REQUEST_WIDTH ( req ); - h = FT_REQUEST_HEIGHT( req ); - - if ( req->width && !req->height ) - h = w; - else if ( !req->width && req->height ) - w = h; - - w = FT_PIX_ROUND( w ); - h = FT_PIX_ROUND( h ); - - for ( i = 0; i < face->num_fixed_sizes; i++ ) - { - FT_Bitmap_Size* bsize = face->available_sizes + i; - - - if ( h != FT_PIX_ROUND( bsize->y_ppem ) ) - continue; - - if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width ) - { - FT_TRACE3(( "FT_Match_Size: bitmap strike %d matches\n", i )); - - if ( size_index ) - *size_index = (FT_ULong)i; - - return FT_Err_Ok; - } - } - - return FT_THROW( Invalid_Pixel_Size ); - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( void ) - ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, - FT_Pos advance ) - { - FT_Pos height = metrics->height; - - - /* compensate for glyph with bbox above/below the baseline */ - if ( metrics->horiBearingY < 0 ) - { - if ( height < metrics->horiBearingY ) - height = metrics->horiBearingY; - } - else if ( metrics->horiBearingY > 0 ) - height -= metrics->horiBearingY; - - /* the factor 1.2 is a heuristical value */ - if ( !advance ) - advance = height * 12 / 10; - - metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2; - metrics->vertBearingY = ( advance - height ) / 2; - metrics->vertAdvance = advance; - } - - - static void - ft_recompute_scaled_metrics( FT_Face face, - FT_Size_Metrics* metrics ) - { - /* Compute root ascender, descender, test height, and max_advance */ - -#ifdef GRID_FIT_METRICS - metrics->ascender = FT_PIX_CEIL( FT_MulFix( face->ascender, - metrics->y_scale ) ); - - metrics->descender = FT_PIX_FLOOR( FT_MulFix( face->descender, - metrics->y_scale ) ); - - metrics->height = FT_PIX_ROUND( FT_MulFix( face->height, - metrics->y_scale ) ); - - metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width, - metrics->x_scale ) ); -#else /* !GRID_FIT_METRICS */ - metrics->ascender = FT_MulFix( face->ascender, - metrics->y_scale ); - - metrics->descender = FT_MulFix( face->descender, - metrics->y_scale ); - - metrics->height = FT_MulFix( face->height, - metrics->y_scale ); - - metrics->max_advance = FT_MulFix( face->max_advance_width, - metrics->x_scale ); -#endif /* !GRID_FIT_METRICS */ - } - - - FT_BASE_DEF( void ) - FT_Select_Metrics( FT_Face face, - FT_ULong strike_index ) - { - FT_Size_Metrics* metrics; - FT_Bitmap_Size* bsize; - - - metrics = &face->size->metrics; - bsize = face->available_sizes + strike_index; - - metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 ); - metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 ); - - if ( FT_IS_SCALABLE( face ) ) - { - metrics->x_scale = FT_DivFix( bsize->x_ppem, - face->units_per_EM ); - metrics->y_scale = FT_DivFix( bsize->y_ppem, - face->units_per_EM ); - - ft_recompute_scaled_metrics( face, metrics ); - } - else - { - metrics->x_scale = 1L << 16; - metrics->y_scale = 1L << 16; - metrics->ascender = bsize->y_ppem; - metrics->descender = 0; - metrics->height = bsize->height << 6; - metrics->max_advance = bsize->x_ppem; - } - - FT_TRACE5(( "FT_Select_Metrics:\n" )); - FT_TRACE5(( " x scale: %d (%f)\n", - metrics->x_scale, metrics->x_scale / 65536.0 )); - FT_TRACE5(( " y scale: %d (%f)\n", - metrics->y_scale, metrics->y_scale / 65536.0 )); - FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 )); - FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 )); - FT_TRACE5(( " height: %f\n", metrics->height / 64.0 )); - FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 )); - FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem )); - FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem )); - } - - - FT_BASE_DEF( void ) - FT_Request_Metrics( FT_Face face, - FT_Size_Request req ) - { - FT_Size_Metrics* metrics; - - - metrics = &face->size->metrics; - - if ( FT_IS_SCALABLE( face ) ) - { - FT_Long w = 0, h = 0, scaled_w = 0, scaled_h = 0; - - - switch ( req->type ) - { - case FT_SIZE_REQUEST_TYPE_NOMINAL: - w = h = face->units_per_EM; - break; - - case FT_SIZE_REQUEST_TYPE_REAL_DIM: - w = h = face->ascender - face->descender; - break; - - case FT_SIZE_REQUEST_TYPE_BBOX: - w = face->bbox.xMax - face->bbox.xMin; - h = face->bbox.yMax - face->bbox.yMin; - break; - - case FT_SIZE_REQUEST_TYPE_CELL: - w = face->max_advance_width; - h = face->ascender - face->descender; - break; - - case FT_SIZE_REQUEST_TYPE_SCALES: - metrics->x_scale = (FT_Fixed)req->width; - metrics->y_scale = (FT_Fixed)req->height; - if ( !metrics->x_scale ) - metrics->x_scale = metrics->y_scale; - else if ( !metrics->y_scale ) - metrics->y_scale = metrics->x_scale; - goto Calculate_Ppem; - - case FT_SIZE_REQUEST_TYPE_MAX: - break; - } - - /* to be on the safe side */ - if ( w < 0 ) - w = -w; - - if ( h < 0 ) - h = -h; - - scaled_w = FT_REQUEST_WIDTH ( req ); - scaled_h = FT_REQUEST_HEIGHT( req ); - - /* determine scales */ - if ( req->width ) - { - metrics->x_scale = FT_DivFix( scaled_w, w ); - - if ( req->height ) - { - metrics->y_scale = FT_DivFix( scaled_h, h ); - - if ( req->type == FT_SIZE_REQUEST_TYPE_CELL ) - { - if ( metrics->y_scale > metrics->x_scale ) - metrics->y_scale = metrics->x_scale; - else - metrics->x_scale = metrics->y_scale; - } - } - else - { - metrics->y_scale = metrics->x_scale; - scaled_h = FT_MulDiv( scaled_w, h, w ); - } - } - else - { - metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h ); - scaled_w = FT_MulDiv( scaled_h, w, h ); - } - - Calculate_Ppem: - /* calculate the ppems */ - if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) - { - scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale ); - scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale ); - } - - metrics->x_ppem = (FT_UShort)( ( scaled_w + 32 ) >> 6 ); - metrics->y_ppem = (FT_UShort)( ( scaled_h + 32 ) >> 6 ); - - ft_recompute_scaled_metrics( face, metrics ); - } - else - { - FT_ZERO( metrics ); - metrics->x_scale = 1L << 16; - metrics->y_scale = 1L << 16; - } - - FT_TRACE5(( "FT_Request_Metrics:\n" )); - FT_TRACE5(( " x scale: %d (%f)\n", - metrics->x_scale, metrics->x_scale / 65536.0 )); - FT_TRACE5(( " y scale: %d (%f)\n", - metrics->y_scale, metrics->y_scale / 65536.0 )); - FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 )); - FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 )); - FT_TRACE5(( " height: %f\n", metrics->height / 64.0 )); - FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 )); - FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem )); - FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem )); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Select_Size( FT_Face face, - FT_Int strike_index ) - { - FT_Driver_Class clazz; - - - if ( !face || !FT_HAS_FIXED_SIZES( face ) ) - return FT_THROW( Invalid_Face_Handle ); - - if ( strike_index < 0 || strike_index >= face->num_fixed_sizes ) - return FT_THROW( Invalid_Argument ); - - clazz = face->driver->clazz; - - if ( clazz->select_size ) - { - FT_Error error; - - - error = clazz->select_size( face->size, (FT_ULong)strike_index ); - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_Size_Metrics* metrics = &face->size->metrics; - - - FT_TRACE5(( "FT_Select_Size (font driver's `select_size'):\n" )); - FT_TRACE5(( " x scale: %d (%f)\n", - metrics->x_scale, metrics->x_scale / 65536.0 )); - FT_TRACE5(( " y scale: %d (%f)\n", - metrics->y_scale, metrics->y_scale / 65536.0 )); - FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 )); - FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 )); - FT_TRACE5(( " height: %f\n", metrics->height / 64.0 )); - FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 )); - FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem )); - FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem )); - } -#endif - - return error; - } - - FT_Select_Metrics( face, (FT_ULong)strike_index ); - - return FT_Err_Ok; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Request_Size( FT_Face face, - FT_Size_Request req ) - { - FT_Driver_Class clazz; - FT_ULong strike_index; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !req || req->width < 0 || req->height < 0 || - req->type >= FT_SIZE_REQUEST_TYPE_MAX ) - return FT_THROW( Invalid_Argument ); - - clazz = face->driver->clazz; - - if ( clazz->request_size ) - { - FT_Error error; - - - error = clazz->request_size( face->size, req ); - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_Size_Metrics* metrics = &face->size->metrics; - - - FT_TRACE5(( "FT_Request_Size (font driver's `request_size'):\n" )); - FT_TRACE5(( " x scale: %d (%f)\n", - metrics->x_scale, metrics->x_scale / 65536.0 )); - FT_TRACE5(( " y scale: %d (%f)\n", - metrics->y_scale, metrics->y_scale / 65536.0 )); - FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 )); - FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 )); - FT_TRACE5(( " height: %f\n", metrics->height / 64.0 )); - FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 )); - FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem )); - FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem )); - } -#endif - - return error; - } - - /* - * The reason that a driver doesn't have `request_size' defined is - * either that the scaling here suffices or that the supported formats - * are bitmap-only and size matching is not implemented. - * - * In the latter case, a simple size matching is done. - */ - if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) ) - { - FT_Error error; - - - error = FT_Match_Size( face, req, 0, &strike_index ); - if ( error ) - return error; - - return FT_Select_Size( face, (FT_Int)strike_index ); - } - - FT_Request_Metrics( face, req ); - - return FT_Err_Ok; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_Char_Size( FT_Face face, - FT_F26Dot6 char_width, - FT_F26Dot6 char_height, - FT_UInt horz_resolution, - FT_UInt vert_resolution ) - { - FT_Size_RequestRec req; - - - /* check of `face' delayed to `FT_Request_Size' */ - - if ( !char_width ) - char_width = char_height; - else if ( !char_height ) - char_height = char_width; - - if ( !horz_resolution ) - horz_resolution = vert_resolution; - else if ( !vert_resolution ) - vert_resolution = horz_resolution; - - if ( char_width < 1 * 64 ) - char_width = 1 * 64; - if ( char_height < 1 * 64 ) - char_height = 1 * 64; - - if ( !horz_resolution ) - horz_resolution = vert_resolution = 72; - - req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; - req.width = char_width; - req.height = char_height; - req.horiResolution = horz_resolution; - req.vertResolution = vert_resolution; - - return FT_Request_Size( face, &req ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_Pixel_Sizes( FT_Face face, - FT_UInt pixel_width, - FT_UInt pixel_height ) - { - FT_Size_RequestRec req; - - - /* check of `face' delayed to `FT_Request_Size' */ - - if ( pixel_width == 0 ) - pixel_width = pixel_height; - else if ( pixel_height == 0 ) - pixel_height = pixel_width; - - if ( pixel_width < 1 ) - pixel_width = 1; - if ( pixel_height < 1 ) - pixel_height = 1; - - /* use `>=' to avoid potential compiler warning on 16bit platforms */ - if ( pixel_width >= 0xFFFFU ) - pixel_width = 0xFFFFU; - if ( pixel_height >= 0xFFFFU ) - pixel_height = 0xFFFFU; - - req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; - req.width = (FT_Long)( pixel_width << 6 ); - req.height = (FT_Long)( pixel_height << 6 ); - req.horiResolution = 0; - req.vertResolution = 0; - - return FT_Request_Size( face, &req ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Kerning( FT_Face face, - FT_UInt left_glyph, - FT_UInt right_glyph, - FT_UInt kern_mode, - FT_Vector *akerning ) - { - FT_Error error = FT_Err_Ok; - FT_Driver driver; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !akerning ) - return FT_THROW( Invalid_Argument ); - - driver = face->driver; - - akerning->x = 0; - akerning->y = 0; - - if ( driver->clazz->get_kerning ) - { - error = driver->clazz->get_kerning( face, - left_glyph, - right_glyph, - akerning ); - if ( !error ) - { - if ( kern_mode != FT_KERNING_UNSCALED ) - { - akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale ); - akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale ); - - if ( kern_mode != FT_KERNING_UNFITTED ) - { - /* we scale down kerning values for small ppem values */ - /* to avoid that rounding makes them too big. */ - /* `25' has been determined heuristically. */ - if ( face->size->metrics.x_ppem < 25 ) - akerning->x = FT_MulDiv( akerning->x, - face->size->metrics.x_ppem, 25 ); - if ( face->size->metrics.y_ppem < 25 ) - akerning->y = FT_MulDiv( akerning->y, - face->size->metrics.y_ppem, 25 ); - - akerning->x = FT_PIX_ROUND( akerning->x ); - akerning->y = FT_PIX_ROUND( akerning->y ); - } - } - } - } - - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Track_Kerning( FT_Face face, - FT_Fixed point_size, - FT_Int degree, - FT_Fixed* akerning ) - { - FT_Service_Kerning service; - FT_Error error = FT_Err_Ok; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !akerning ) - return FT_THROW( Invalid_Argument ); - - FT_FACE_FIND_SERVICE( face, service, KERNING ); - if ( !service ) - return FT_THROW( Unimplemented_Feature ); - - error = service->get_track( face, - point_size, - degree, - akerning ); - - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Select_Charmap( FT_Face face, - FT_Encoding encoding ) - { - FT_CharMap* cur; - FT_CharMap* limit; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( encoding == FT_ENCODING_NONE ) - return FT_THROW( Invalid_Argument ); - - /* FT_ENCODING_UNICODE is special. We try to find the `best' Unicode */ - /* charmap available, i.e., one with UCS-4 characters, if possible. */ - /* */ - /* This is done by find_unicode_charmap() above, to share code. */ - if ( encoding == FT_ENCODING_UNICODE ) - return find_unicode_charmap( face ); - - cur = face->charmaps; - if ( !cur ) - return FT_THROW( Invalid_CharMap_Handle ); - - limit = cur + face->num_charmaps; - - for ( ; cur < limit; cur++ ) - { - if ( cur[0]->encoding == encoding ) - { - face->charmap = cur[0]; - return 0; - } - } - - return FT_THROW( Invalid_Argument ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_Charmap( FT_Face face, - FT_CharMap charmap ) - { - FT_CharMap* cur; - FT_CharMap* limit; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - cur = face->charmaps; - if ( !cur || !charmap ) - return FT_THROW( Invalid_CharMap_Handle ); - - if ( FT_Get_CMap_Format( charmap ) == 14 ) - return FT_THROW( Invalid_Argument ); - - limit = cur + face->num_charmaps; - - for ( ; cur < limit; cur++ ) - { - if ( cur[0] == charmap ) - { - face->charmap = cur[0]; - return FT_Err_Ok; - } - } - - return FT_THROW( Invalid_Argument ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Int ) - FT_Get_Charmap_Index( FT_CharMap charmap ) - { - FT_Int i; - - - if ( !charmap || !charmap->face ) - return -1; - - for ( i = 0; i < charmap->face->num_charmaps; i++ ) - if ( charmap->face->charmaps[i] == charmap ) - break; - - FT_ASSERT( i < charmap->face->num_charmaps ); - - return i; - } - - - static void - ft_cmap_done_internal( FT_CMap cmap ) - { - FT_CMap_Class clazz = cmap->clazz; - FT_Face face = cmap->charmap.face; - FT_Memory memory = FT_FACE_MEMORY( face ); - - - if ( clazz->done ) - clazz->done( cmap ); - - FT_FREE( cmap ); - } - - - FT_BASE_DEF( void ) - FT_CMap_Done( FT_CMap cmap ) - { - if ( cmap ) - { - FT_Face face = cmap->charmap.face; - FT_Memory memory = FT_FACE_MEMORY( face ); - FT_Error error; - FT_Int i, j; - - - for ( i = 0; i < face->num_charmaps; i++ ) - { - if ( (FT_CMap)face->charmaps[i] == cmap ) - { - FT_CharMap last_charmap = face->charmaps[face->num_charmaps - 1]; - - - if ( FT_RENEW_ARRAY( face->charmaps, - face->num_charmaps, - face->num_charmaps - 1 ) ) - return; - - /* remove it from our list of charmaps */ - for ( j = i + 1; j < face->num_charmaps; j++ ) - { - if ( j == face->num_charmaps - 1 ) - face->charmaps[j - 1] = last_charmap; - else - face->charmaps[j - 1] = face->charmaps[j]; - } - - face->num_charmaps--; - - if ( (FT_CMap)face->charmap == cmap ) - face->charmap = NULL; - - ft_cmap_done_internal( cmap ); - - break; - } - } - } - } - - - FT_BASE_DEF( FT_Error ) - FT_CMap_New( FT_CMap_Class clazz, - FT_Pointer init_data, - FT_CharMap charmap, - FT_CMap *acmap ) - { - FT_Error error = FT_Err_Ok; - FT_Face face; - FT_Memory memory; - FT_CMap cmap = NULL; - - - if ( clazz == NULL || charmap == NULL || charmap->face == NULL ) - return FT_THROW( Invalid_Argument ); - - face = charmap->face; - memory = FT_FACE_MEMORY( face ); - - if ( !FT_ALLOC( cmap, clazz->size ) ) - { - cmap->charmap = *charmap; - cmap->clazz = clazz; - - if ( clazz->init ) - { - error = clazz->init( cmap, init_data ); - if ( error ) - goto Fail; - } - - /* add it to our list of charmaps */ - if ( FT_RENEW_ARRAY( face->charmaps, - face->num_charmaps, - face->num_charmaps + 1 ) ) - goto Fail; - - face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap; - } - - Exit: - if ( acmap ) - *acmap = cmap; - - return error; - - Fail: - ft_cmap_done_internal( cmap ); - cmap = NULL; - goto Exit; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_UInt ) - FT_Get_Char_Index( FT_Face face, - FT_ULong charcode ) - { - FT_UInt result = 0; - - - if ( face && face->charmap ) - { - FT_CMap cmap = FT_CMAP( face->charmap ); - - - if ( charcode > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); - FT_TRACE1(( " 0x%x is truncated\n", charcode )); - } - result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode ); - } - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_ULong ) - FT_Get_First_Char( FT_Face face, - FT_UInt *agindex ) - { - FT_ULong result = 0; - FT_UInt gindex = 0; - - - /* only do something if we have a charmap, and we have glyphs at all */ - if ( face && face->charmap && face->num_glyphs ) - { - gindex = FT_Get_Char_Index( face, 0 ); - if ( gindex == 0 || gindex >= (FT_UInt)face->num_glyphs ) - result = FT_Get_Next_Char( face, 0, &gindex ); - } - - if ( agindex ) - *agindex = gindex; - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_ULong ) - FT_Get_Next_Char( FT_Face face, - FT_ULong charcode, - FT_UInt *agindex ) - { - FT_ULong result = 0; - FT_UInt gindex = 0; - - - if ( face && face->charmap && face->num_glyphs ) - { - FT_UInt32 code = (FT_UInt32)charcode; - FT_CMap cmap = FT_CMAP( face->charmap ); - - - do - { - gindex = cmap->clazz->char_next( cmap, &code ); - - } while ( gindex >= (FT_UInt)face->num_glyphs ); - - result = ( gindex == 0 ) ? 0 : code; - } - - if ( agindex ) - *agindex = gindex; - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_UInt ) - FT_Face_GetCharVariantIndex( FT_Face face, - FT_ULong charcode, - FT_ULong variantSelector ) - { - FT_UInt result = 0; - - - if ( face && - face->charmap && - face->charmap->encoding == FT_ENCODING_UNICODE ) - { - FT_CharMap charmap = find_variant_selector_charmap( face ); - FT_CMap ucmap = FT_CMAP( face->charmap ); - - - if ( charmap != NULL ) - { - FT_CMap vcmap = FT_CMAP( charmap ); - - - if ( charcode > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); - FT_TRACE1(( " 0x%x is truncated\n", charcode )); - } - if ( variantSelector > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); - FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); - } - - result = vcmap->clazz->char_var_index( vcmap, ucmap, - (FT_UInt32)charcode, - (FT_UInt32)variantSelector ); - } - } - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Int ) - FT_Face_GetCharVariantIsDefault( FT_Face face, - FT_ULong charcode, - FT_ULong variantSelector ) - { - FT_Int result = -1; - - - if ( face ) - { - FT_CharMap charmap = find_variant_selector_charmap( face ); - - - if ( charmap != NULL ) - { - FT_CMap vcmap = FT_CMAP( charmap ); - - - if ( charcode > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); - FT_TRACE1(( " 0x%x is truncated\n", charcode )); - } - if ( variantSelector > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); - FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); - } - - result = vcmap->clazz->char_var_default( vcmap, - (FT_UInt32)charcode, - (FT_UInt32)variantSelector ); - } - } - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_UInt32* ) - FT_Face_GetVariantSelectors( FT_Face face ) - { - FT_UInt32 *result = NULL; - - - if ( face ) - { - FT_CharMap charmap = find_variant_selector_charmap( face ); - - - if ( charmap != NULL ) - { - FT_CMap vcmap = FT_CMAP( charmap ); - FT_Memory memory = FT_FACE_MEMORY( face ); - - - result = vcmap->clazz->variant_list( vcmap, memory ); - } - } - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_UInt32* ) - FT_Face_GetVariantsOfChar( FT_Face face, - FT_ULong charcode ) - { - FT_UInt32 *result = NULL; - - - if ( face ) - { - FT_CharMap charmap = find_variant_selector_charmap( face ); - - - if ( charmap != NULL ) - { - FT_CMap vcmap = FT_CMAP( charmap ); - FT_Memory memory = FT_FACE_MEMORY( face ); - - - if ( charcode > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); - FT_TRACE1(( " 0x%x is truncated\n", charcode )); - } - - result = vcmap->clazz->charvariant_list( vcmap, memory, - (FT_UInt32)charcode ); - } - } - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_UInt32* ) - FT_Face_GetCharsOfVariant( FT_Face face, - FT_ULong variantSelector ) - { - FT_UInt32 *result = NULL; - - - if ( face ) - { - FT_CharMap charmap = find_variant_selector_charmap( face ); - - - if ( charmap != NULL ) - { - FT_CMap vcmap = FT_CMAP( charmap ); - FT_Memory memory = FT_FACE_MEMORY( face ); - - - if ( variantSelector > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); - FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); - } - - result = vcmap->clazz->variantchar_list( vcmap, memory, - (FT_UInt32)variantSelector ); - } - } - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_UInt ) - FT_Get_Name_Index( FT_Face face, - FT_String* glyph_name ) - { - FT_UInt result = 0; - - - if ( face && - FT_HAS_GLYPH_NAMES( face ) && - glyph_name ) - { - FT_Service_GlyphDict service; - - - FT_FACE_LOOKUP_SERVICE( face, - service, - GLYPH_DICT ); - - if ( service && service->name_index ) - result = service->name_index( face, glyph_name ); - } - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Glyph_Name( FT_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ) - { - FT_Error error; - FT_Service_GlyphDict service; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !buffer || buffer_max == 0 ) - return FT_THROW( Invalid_Argument ); - - /* clean up buffer */ - ((FT_Byte*)buffer)[0] = '\0'; - - if ( (FT_Long)glyph_index >= face->num_glyphs ) - return FT_THROW( Invalid_Glyph_Index ); - - if ( !FT_HAS_GLYPH_NAMES( face ) ) - return FT_THROW( Invalid_Argument ); - - FT_FACE_LOOKUP_SERVICE( face, service, GLYPH_DICT ); - if ( service && service->get_name ) - error = service->get_name( face, glyph_index, buffer, buffer_max ); - else - error = FT_THROW( Invalid_Argument ); - - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( const char* ) - FT_Get_Postscript_Name( FT_Face face ) - { - const char* result = NULL; - - - if ( !face ) - goto Exit; - - if ( !result ) - { - FT_Service_PsFontName service; - - - FT_FACE_LOOKUP_SERVICE( face, - service, - POSTSCRIPT_FONT_NAME ); - - if ( service && service->get_ps_font_name ) - result = service->get_ps_font_name( face ); - } - - Exit: - return result; - } - - - /* documentation is in tttables.h */ - - FT_EXPORT_DEF( void* ) - FT_Get_Sfnt_Table( FT_Face face, - FT_Sfnt_Tag tag ) - { - void* table = NULL; - FT_Service_SFNT_Table service; - - - if ( face && FT_IS_SFNT( face ) ) - { - FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); - if ( service != NULL ) - table = service->get_table( face, tag ); - } - - return table; - } - - - /* documentation is in tttables.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Load_Sfnt_Table( FT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte* buffer, - FT_ULong* length ) - { - FT_Service_SFNT_Table service; - - - if ( !face || !FT_IS_SFNT( face ) ) - return FT_THROW( Invalid_Face_Handle ); - - FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); - if ( service == NULL ) - return FT_THROW( Unimplemented_Feature ); - - return service->load_table( face, tag, offset, buffer, length ); - } - - - /* documentation is in tttables.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Sfnt_Table_Info( FT_Face face, - FT_UInt table_index, - FT_ULong *tag, - FT_ULong *length ) - { - FT_Service_SFNT_Table service; - FT_ULong offset; - - - /* test for valid `length' delayed to `service->table_info' */ - - if ( !face || !FT_IS_SFNT( face ) ) - return FT_THROW( Invalid_Face_Handle ); - - FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); - if ( service == NULL ) - return FT_THROW( Unimplemented_Feature ); - - return service->table_info( face, table_index, tag, &offset, length ); - } - - - /* documentation is in tttables.h */ - - FT_EXPORT_DEF( FT_ULong ) - FT_Get_CMap_Language_ID( FT_CharMap charmap ) - { - FT_Service_TTCMaps service; - FT_Face face; - TT_CMapInfo cmap_info; - - - if ( !charmap || !charmap->face ) - return 0; - - face = charmap->face; - FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); - if ( service == NULL ) - return 0; - if ( service->get_cmap_info( charmap, &cmap_info )) - return 0; - - return cmap_info.language; - } - - - /* documentation is in tttables.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_Get_CMap_Format( FT_CharMap charmap ) - { - FT_Service_TTCMaps service; - FT_Face face; - TT_CMapInfo cmap_info; - - - if ( !charmap || !charmap->face ) - return -1; - - face = charmap->face; - FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); - if ( service == NULL ) - return -1; - if ( service->get_cmap_info( charmap, &cmap_info )) - return -1; - - return cmap_info.format; - } - - - /* documentation is in ftsizes.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Activate_Size( FT_Size size ) - { - FT_Face face; - - - if ( !size ) - return FT_THROW( Invalid_Size_Handle ); - - face = size->face; - if ( !face || !face->driver ) - return FT_THROW( Invalid_Face_Handle ); - - /* we don't need anything more complex than that; all size objects */ - /* are already listed by the face */ - face->size = size; - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** R E N D E R E R S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /* lookup a renderer by glyph format in the library's list */ - FT_BASE_DEF( FT_Renderer ) - FT_Lookup_Renderer( FT_Library library, - FT_Glyph_Format format, - FT_ListNode* node ) - { - FT_ListNode cur; - FT_Renderer result = NULL; - - - if ( !library ) - goto Exit; - - cur = library->renderers.head; - - if ( node ) - { - if ( *node ) - cur = (*node)->next; - *node = NULL; - } - - while ( cur ) - { - FT_Renderer renderer = FT_RENDERER( cur->data ); - - - if ( renderer->glyph_format == format ) - { - if ( node ) - *node = cur; - - result = renderer; - break; - } - cur = cur->next; - } - - Exit: - return result; - } - - - static FT_Renderer - ft_lookup_glyph_renderer( FT_GlyphSlot slot ) - { - FT_Face face = slot->face; - FT_Library library = FT_FACE_LIBRARY( face ); - FT_Renderer result = library->cur_renderer; - - - if ( !result || result->glyph_format != slot->format ) - result = FT_Lookup_Renderer( library, slot->format, 0 ); - - return result; - } - - - static void - ft_set_current_renderer( FT_Library library ) - { - FT_Renderer renderer; - - - renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 ); - library->cur_renderer = renderer; - } - - - static FT_Error - ft_add_renderer( FT_Module module ) - { - FT_Library library = module->library; - FT_Memory memory = library->memory; - FT_Error error; - FT_ListNode node = NULL; - - - if ( FT_NEW( node ) ) - goto Exit; - - { - FT_Renderer render = FT_RENDERER( module ); - FT_Renderer_Class* clazz = (FT_Renderer_Class*)module->clazz; - - - render->clazz = clazz; - render->glyph_format = clazz->glyph_format; - - /* allocate raster object if needed */ - if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && - clazz->raster_class->raster_new ) - { - error = clazz->raster_class->raster_new( memory, &render->raster ); - if ( error ) - goto Fail; - - render->raster_render = clazz->raster_class->raster_render; - render->render = clazz->render_glyph; - } - - /* add to list */ - node->data = module; - FT_List_Add( &library->renderers, node ); - - ft_set_current_renderer( library ); - } - - Fail: - if ( error ) - FT_FREE( node ); - - Exit: - return error; - } - - - static void - ft_remove_renderer( FT_Module module ) - { - FT_Library library; - FT_Memory memory; - FT_ListNode node; - - - library = module->library; - if ( !library ) - return; - - memory = library->memory; - - node = FT_List_Find( &library->renderers, module ); - if ( node ) - { - FT_Renderer render = FT_RENDERER( module ); - - - /* release raster object, if any */ - if ( render->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && - render->raster ) - render->clazz->raster_class->raster_done( render->raster ); - - /* remove from list */ - FT_List_Remove( &library->renderers, node ); - FT_FREE( node ); - - ft_set_current_renderer( library ); - } - } - - - /* documentation is in ftrender.h */ - - FT_EXPORT_DEF( FT_Renderer ) - FT_Get_Renderer( FT_Library library, - FT_Glyph_Format format ) - { - /* test for valid `library' delayed to `FT_Lookup_Renderer' */ - - return FT_Lookup_Renderer( library, format, 0 ); - } - - - /* documentation is in ftrender.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_Renderer( FT_Library library, - FT_Renderer renderer, - FT_UInt num_params, - FT_Parameter* parameters ) - { - FT_ListNode node; - FT_Error error = FT_Err_Ok; - - FT_Renderer_SetModeFunc set_mode; - - - if ( !library ) - { - error = FT_THROW( Invalid_Library_Handle ); - goto Exit; - } - - if ( !renderer ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - if ( num_params > 0 && !parameters ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - node = FT_List_Find( &library->renderers, renderer ); - if ( !node ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - FT_List_Up( &library->renderers, node ); - - if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE ) - library->cur_renderer = renderer; - - set_mode = renderer->clazz->set_mode; - - for ( ; num_params > 0; num_params-- ) - { - error = set_mode( renderer, parameters->tag, parameters->data ); - if ( error ) - break; - parameters++; - } - - Exit: - return error; - } - - - FT_BASE_DEF( FT_Error ) - FT_Render_Glyph_Internal( FT_Library library, - FT_GlyphSlot slot, - FT_Render_Mode render_mode ) - { - FT_Error error = FT_Err_Ok; - FT_Renderer renderer; - - - /* if it is already a bitmap, no need to do anything */ - switch ( slot->format ) - { - case FT_GLYPH_FORMAT_BITMAP: /* already a bitmap, don't do anything */ - break; - - default: - { - FT_ListNode node = NULL; - - - /* small shortcut for the very common case */ - if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) - { - renderer = library->cur_renderer; - node = library->renderers.head; - } - else - renderer = FT_Lookup_Renderer( library, slot->format, &node ); - - error = FT_ERR( Unimplemented_Feature ); - while ( renderer ) - { - error = renderer->render( renderer, slot, render_mode, NULL ); - if ( !error || - FT_ERR_NEQ( error, Cannot_Render_Glyph ) ) - break; - - /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ - /* is unsupported by the current renderer for this glyph image */ - /* format. */ - - /* now, look for another renderer that supports the same */ - /* format. */ - renderer = FT_Lookup_Renderer( library, slot->format, &node ); - } - } - } - -#ifdef FT_DEBUG_LEVEL_TRACE - -#undef FT_COMPONENT -#define FT_COMPONENT trace_bitmap - - /* we convert to a single bitmap format for computing the checksum */ - if ( !error ) - { - FT_Bitmap bitmap; - FT_Error err; - - - FT_Bitmap_Init( &bitmap ); - - /* this also converts the bitmap flow to `down' (i.e., pitch > 0) */ - err = FT_Bitmap_Convert( library, &slot->bitmap, &bitmap, 1 ); - if ( !err ) - { - MD5_CTX ctx; - unsigned char md5[16]; - int i; - unsigned int rows = bitmap.rows; - unsigned int pitch = (unsigned int)bitmap.pitch; - - - MD5_Init( &ctx ); - MD5_Update( &ctx, bitmap.buffer, rows * pitch ); - MD5_Final( md5, &ctx ); - - FT_TRACE3(( "MD5 checksum for %dx%d bitmap:\n" - " ", - rows, pitch )); - for ( i = 0; i < 16; i++ ) - FT_TRACE3(( "%02X", md5[i] )); - FT_TRACE3(( "\n" )); - } - - FT_Bitmap_Done( library, &bitmap ); - } - -#undef FT_COMPONENT -#define FT_COMPONENT trace_objs - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Render_Glyph( FT_GlyphSlot slot, - FT_Render_Mode render_mode ) - { - FT_Library library; - - - if ( !slot || !slot->face ) - return FT_THROW( Invalid_Argument ); - - library = FT_FACE_LIBRARY( slot->face ); - - return FT_Render_Glyph_Internal( library, slot, render_mode ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** M O D U L E S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Destroy_Module */ - /* */ - /* <Description> */ - /* Destroys a given module object. For drivers, this also destroys */ - /* all child faces. */ - /* */ - /* <InOut> */ - /* module :: A handle to the target driver object. */ - /* */ - /* <Note> */ - /* The driver _must_ be LOCKED! */ - /* */ - static void - Destroy_Module( FT_Module module ) - { - FT_Memory memory = module->memory; - FT_Module_Class* clazz = module->clazz; - FT_Library library = module->library; - - - if ( library && library->auto_hinter == module ) - library->auto_hinter = NULL; - - /* if the module is a renderer */ - if ( FT_MODULE_IS_RENDERER( module ) ) - ft_remove_renderer( module ); - - /* if the module is a font driver, add some steps */ - if ( FT_MODULE_IS_DRIVER( module ) ) - Destroy_Driver( FT_DRIVER( module ) ); - - /* finalize the module object */ - if ( clazz->module_done ) - clazz->module_done( module ); - - /* discard it */ - FT_FREE( module ); - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Add_Module( FT_Library library, - const FT_Module_Class* clazz ) - { - FT_Error error; - FT_Memory memory; - FT_Module module; - FT_UInt nn; - - -#define FREETYPE_VER_FIXED ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \ - FREETYPE_MINOR ) - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - if ( !clazz ) - return FT_THROW( Invalid_Argument ); - - /* check freetype version */ - if ( clazz->module_requires > FREETYPE_VER_FIXED ) - return FT_THROW( Invalid_Version ); - - /* look for a module with the same name in the library's table */ - for ( nn = 0; nn < library->num_modules; nn++ ) - { - module = library->modules[nn]; - if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 ) - { - /* this installed module has the same name, compare their versions */ - if ( clazz->module_version <= module->clazz->module_version ) - return FT_THROW( Lower_Module_Version ); - - /* remove the module from our list, then exit the loop to replace */ - /* it by our new version.. */ - FT_Remove_Module( library, module ); - break; - } - } - - memory = library->memory; - error = FT_Err_Ok; - - if ( library->num_modules >= FT_MAX_MODULES ) - { - error = FT_THROW( Too_Many_Drivers ); - goto Exit; - } - - /* allocate module object */ - if ( FT_ALLOC( module, clazz->module_size ) ) - goto Exit; - - /* base initialization */ - module->library = library; - module->memory = memory; - module->clazz = (FT_Module_Class*)clazz; - - /* check whether the module is a renderer - this must be performed */ - /* before the normal module initialization */ - if ( FT_MODULE_IS_RENDERER( module ) ) - { - /* add to the renderers list */ - error = ft_add_renderer( module ); - if ( error ) - goto Fail; - } - - /* is the module a auto-hinter? */ - if ( FT_MODULE_IS_HINTER( module ) ) - library->auto_hinter = module; - - /* if the module is a font driver */ - if ( FT_MODULE_IS_DRIVER( module ) ) - { - FT_Driver driver = FT_DRIVER( module ); - - - driver->clazz = (FT_Driver_Class)module->clazz; - } - - if ( clazz->module_init ) - { - error = clazz->module_init( module ); - if ( error ) - goto Fail; - } - - /* add module to the library's table */ - library->modules[library->num_modules++] = module; - - Exit: - return error; - - Fail: - if ( FT_MODULE_IS_RENDERER( module ) ) - { - FT_Renderer renderer = FT_RENDERER( module ); - - - if ( renderer->clazz && - renderer->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && - renderer->raster ) - renderer->clazz->raster_class->raster_done( renderer->raster ); - } - - FT_FREE( module ); - goto Exit; - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Module ) - FT_Get_Module( FT_Library library, - const char* module_name ) - { - FT_Module result = NULL; - FT_Module* cur; - FT_Module* limit; - - - if ( !library || !module_name ) - return result; - - cur = library->modules; - limit = cur + library->num_modules; - - for ( ; cur < limit; cur++ ) - if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 ) - { - result = cur[0]; - break; - } - - return result; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( const void* ) - FT_Get_Module_Interface( FT_Library library, - const char* mod_name ) - { - FT_Module module; - - - /* test for valid `library' delayed to FT_Get_Module() */ - - module = FT_Get_Module( library, mod_name ); - - return module ? module->clazz->module_interface : 0; - } - - - FT_BASE_DEF( FT_Pointer ) - ft_module_get_service( FT_Module module, - const char* service_id ) - { - FT_Pointer result = NULL; - - - if ( module ) - { - FT_ASSERT( module->clazz && module->clazz->get_interface ); - - /* first, look for the service in the module */ - if ( module->clazz->get_interface ) - result = module->clazz->get_interface( module, service_id ); - - if ( result == NULL ) - { - /* we didn't find it, look in all other modules then */ - FT_Library library = module->library; - FT_Module* cur = library->modules; - FT_Module* limit = cur + library->num_modules; - - - for ( ; cur < limit; cur++ ) - { - if ( cur[0] != module ) - { - FT_ASSERT( cur[0]->clazz ); - - if ( cur[0]->clazz->get_interface ) - { - result = cur[0]->clazz->get_interface( cur[0], service_id ); - if ( result != NULL ) - break; - } - } - } - } - } - - return result; - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Remove_Module( FT_Library library, - FT_Module module ) - { - /* try to find the module from the table, then remove it from there */ - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - if ( module ) - { - FT_Module* cur = library->modules; - FT_Module* limit = cur + library->num_modules; - - - for ( ; cur < limit; cur++ ) - { - if ( cur[0] == module ) - { - /* remove it from the table */ - library->num_modules--; - limit--; - while ( cur < limit ) - { - cur[0] = cur[1]; - cur++; - } - limit[0] = NULL; - - /* destroy the module */ - Destroy_Module( module ); - - return FT_Err_Ok; - } - } - } - return FT_THROW( Invalid_Driver_Handle ); - } - - - static FT_Error - ft_property_do( FT_Library library, - const FT_String* module_name, - const FT_String* property_name, - void* value, - FT_Bool set ) - { - FT_Module* cur; - FT_Module* limit; - FT_Module_Interface interface; - - FT_Service_Properties service; - -#ifdef FT_DEBUG_LEVEL_ERROR - const FT_String* set_name = "FT_Property_Set"; - const FT_String* get_name = "FT_Property_Get"; - const FT_String* func_name = set ? set_name : get_name; -#endif - - FT_Bool missing_func; - - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - if ( !module_name || !property_name || !value ) - return FT_THROW( Invalid_Argument ); - - cur = library->modules; - limit = cur + library->num_modules; - - /* search module */ - for ( ; cur < limit; cur++ ) - if ( !ft_strcmp( cur[0]->clazz->module_name, module_name ) ) - break; - - if ( cur == limit ) - { - FT_ERROR(( "%s: can't find module `%s'\n", - func_name, module_name )); - return FT_THROW( Missing_Module ); - } - - /* check whether we have a service interface */ - if ( !cur[0]->clazz->get_interface ) - { - FT_ERROR(( "%s: module `%s' doesn't support properties\n", - func_name, module_name )); - return FT_THROW( Unimplemented_Feature ); - } - - /* search property service */ - interface = cur[0]->clazz->get_interface( cur[0], - FT_SERVICE_ID_PROPERTIES ); - if ( !interface ) - { - FT_ERROR(( "%s: module `%s' doesn't support properties\n", - func_name, module_name )); - return FT_THROW( Unimplemented_Feature ); - } - - service = (FT_Service_Properties)interface; - - if ( set ) - missing_func = (FT_Bool)( !service->set_property ); - else - missing_func = (FT_Bool)( !service->get_property ); - - if ( missing_func ) - { - FT_ERROR(( "%s: property service of module `%s' is broken\n", - func_name, module_name )); - return FT_THROW( Unimplemented_Feature ); - } - - return set ? service->set_property( cur[0], property_name, value ) - : service->get_property( cur[0], property_name, value ); - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Property_Set( FT_Library library, - const FT_String* module_name, - const FT_String* property_name, - const void* value ) - { - return ft_property_do( library, - module_name, - property_name, - (void*)value, - TRUE ); - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Property_Get( FT_Library library, - const FT_String* module_name, - const FT_String* property_name, - void* value ) - { - return ft_property_do( library, - module_name, - property_name, - value, - FALSE ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** L I B R A R Y ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Reference_Library( FT_Library library ) - { - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - library->refcount++; - - return FT_Err_Ok; - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_New_Library( FT_Memory memory, - FT_Library *alibrary ) - { - FT_Library library = NULL; - FT_Error error; - - - if ( !memory || !alibrary ) - return FT_THROW( Invalid_Argument ); - -#ifdef FT_DEBUG_LEVEL_ERROR - /* init debugging support */ - ft_debug_init(); -#endif - - /* first of all, allocate the library object */ - if ( FT_NEW( library ) ) - return error; - - library->memory = memory; - -#ifdef FT_CONFIG_OPTION_PIC - /* initialize position independent code containers */ - error = ft_pic_container_init( library ); - if ( error ) - goto Fail; -#endif - - /* we don't use raster_pool anymore. */ - library->raster_pool_size = 0; - library->raster_pool = NULL; - - library->version_major = FREETYPE_MAJOR; - library->version_minor = FREETYPE_MINOR; - library->version_patch = FREETYPE_PATCH; - - library->refcount = 1; - - /* That's ok now */ - *alibrary = library; - - return FT_Err_Ok; - -#ifdef FT_CONFIG_OPTION_PIC - Fail: - ft_pic_container_destroy( library ); -#endif - FT_FREE( library ); - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( void ) - FT_Library_Version( FT_Library library, - FT_Int *amajor, - FT_Int *aminor, - FT_Int *apatch ) - { - FT_Int major = 0; - FT_Int minor = 0; - FT_Int patch = 0; - - - if ( library ) - { - major = library->version_major; - minor = library->version_minor; - patch = library->version_patch; - } - - if ( amajor ) - *amajor = major; - - if ( aminor ) - *aminor = minor; - - if ( apatch ) - *apatch = patch; - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Done_Library( FT_Library library ) - { - FT_Memory memory; - - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - library->refcount--; - if ( library->refcount > 0 ) - goto Exit; - - memory = library->memory; - - /* - * Close all faces in the library. If we don't do this, we can have - * some subtle memory leaks. - * - * Example: - * - * - the cff font driver uses the pshinter module in cff_size_done - * - if the pshinter module is destroyed before the cff font driver, - * opened FT_Face objects managed by the driver are not properly - * destroyed, resulting in a memory leak - * - * Some faces are dependent on other faces, like Type42 faces that - * depend on TrueType faces synthesized internally. - * - * The order of drivers should be specified in driver_name[]. - */ - { - FT_UInt m, n; - const char* driver_name[] = { "type42", NULL }; - - - for ( m = 0; - m < sizeof ( driver_name ) / sizeof ( driver_name[0] ); - m++ ) - { - for ( n = 0; n < library->num_modules; n++ ) - { - FT_Module module = library->modules[n]; - const char* module_name = module->clazz->module_name; - FT_List faces; - - - if ( driver_name[m] && - ft_strcmp( module_name, driver_name[m] ) != 0 ) - continue; - - if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 ) - continue; - - FT_TRACE7(( "FT_Done_Library: close faces for %s\n", module_name )); - - faces = &FT_DRIVER( module )->faces_list; - while ( faces->head ) - { - FT_Done_Face( FT_FACE( faces->head->data ) ); - if ( faces->head ) - FT_TRACE0(( "FT_Done_Library: failed to free some faces\n" )); - } - } - } - } - - /* Close all other modules in the library */ -#if 1 - /* XXX Modules are removed in the reversed order so that */ - /* type42 module is removed before truetype module. This */ - /* avoids double free in some occasions. It is a hack. */ - while ( library->num_modules > 0 ) - FT_Remove_Module( library, - library->modules[library->num_modules - 1] ); -#else - { - FT_UInt n; - - - for ( n = 0; n < library->num_modules; n++ ) - { - FT_Module module = library->modules[n]; - - - if ( module ) - { - Destroy_Module( module ); - library->modules[n] = NULL; - } - } - } -#endif - -#ifdef FT_CONFIG_OPTION_PIC - /* Destroy pic container contents */ - ft_pic_container_destroy( library ); -#endif - - FT_FREE( library ); - - Exit: - return FT_Err_Ok; - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( void ) - FT_Set_Debug_Hook( FT_Library library, - FT_UInt hook_index, - FT_DebugHook_Func debug_hook ) - { - if ( library && debug_hook && - hook_index < - ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) ) - library->debug_hooks[hook_index] = debug_hook; - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_TrueTypeEngineType ) - FT_Get_TrueType_Engine_Type( FT_Library library ) - { - FT_TrueTypeEngineType result = FT_TRUETYPE_ENGINE_TYPE_NONE; - - - if ( library ) - { - FT_Module module = FT_Get_Module( library, "truetype" ); - - - if ( module ) - { - FT_Service_TrueTypeEngine service; - - - service = (FT_Service_TrueTypeEngine) - ft_module_get_service( module, - FT_SERVICE_ID_TRUETYPE_ENGINE ); - if ( service ) - result = service->engine_type; - } - } - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, - FT_UInt sub_index, - FT_Int *p_index, - FT_UInt *p_flags, - FT_Int *p_arg1, - FT_Int *p_arg2, - FT_Matrix *p_transform ) - { - FT_Error error = FT_ERR( Invalid_Argument ); - - - if ( glyph && - glyph->subglyphs && - glyph->format == FT_GLYPH_FORMAT_COMPOSITE && - sub_index < glyph->num_subglyphs ) - { - FT_SubGlyph subg = glyph->subglyphs + sub_index; - - - *p_index = subg->index; - *p_flags = subg->flags; - *p_arg1 = subg->arg1; - *p_arg2 = subg->arg2; - *p_transform = subg->transform; - - error = FT_Err_Ok; - } - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftotval.c b/3party/freetype/src/base/ftotval.c deleted file mode 100644 index 786457ba2a..0000000000 --- a/3party/freetype/src/base/ftotval.c +++ /dev/null @@ -1,91 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftotval.c */ -/* */ -/* FreeType API for validating OpenType tables (body). */ -/* */ -/* Copyright 2004-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H - -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_OPENTYPE_VALIDATE_H -#include FT_OPENTYPE_VALIDATE_H - - - /* documentation is in ftotval.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_OpenType_Validate( FT_Face face, - FT_UInt validation_flags, - FT_Bytes *BASE_table, - FT_Bytes *GDEF_table, - FT_Bytes *GPOS_table, - FT_Bytes *GSUB_table, - FT_Bytes *JSTF_table ) - { - FT_Service_OTvalidate service; - FT_Error error; - - - if ( !face ) - { - error = FT_THROW( Invalid_Face_Handle ); - goto Exit; - } - - if ( !( BASE_table && - GDEF_table && - GPOS_table && - GSUB_table && - JSTF_table ) ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - FT_FACE_FIND_GLOBAL_SERVICE( face, service, OPENTYPE_VALIDATE ); - - if ( service ) - error = service->validate( face, - validation_flags, - BASE_table, - GDEF_table, - GPOS_table, - GSUB_table, - JSTF_table ); - else - error = FT_THROW( Unimplemented_Feature ); - - Exit: - return error; - } - - - FT_EXPORT_DEF( void ) - FT_OpenType_Free( FT_Face face, - FT_Bytes table ) - { - FT_Memory memory; - - - if ( !face ) - return; - - memory = FT_FACE_MEMORY( face ); - - FT_FREE( table ); - } - - -/* END */ diff --git a/3party/freetype/src/base/ftoutln.c b/3party/freetype/src/base/ftoutln.c deleted file mode 100644 index ef66b3c1c7..0000000000 --- a/3party/freetype/src/base/ftoutln.c +++ /dev/null @@ -1,1099 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftoutln.c */ -/* */ -/* FreeType outline management (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* All functions are declared in freetype.h. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_OUTLINE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H -#include FT_TRIGONOMETRY_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_outline - - - static - const FT_Outline null_outline = { 0, 0, 0, 0, 0, 0 }; - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Decompose( FT_Outline* outline, - const FT_Outline_Funcs* func_interface, - void* user ) - { -#undef SCALED -#define SCALED( x ) ( ( (x) < 0 ? -( -(x) << shift ) \ - : ( (x) << shift ) ) - delta ) - - FT_Vector v_last; - FT_Vector v_control; - FT_Vector v_start; - - FT_Vector* point; - FT_Vector* limit; - char* tags; - - FT_Error error; - - FT_Int n; /* index of contour in outline */ - FT_UInt first; /* index of first point in contour */ - FT_Int tag; /* current point's state */ - - FT_Int shift; - FT_Pos delta; - - - if ( !outline ) - return FT_THROW( Invalid_Outline ); - - if ( !func_interface ) - return FT_THROW( Invalid_Argument ); - - shift = func_interface->shift; - delta = func_interface->delta; - first = 0; - - for ( n = 0; n < outline->n_contours; n++ ) - { - FT_Int last; /* index of last point in contour */ - - - FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); - - last = outline->contours[n]; - if ( last < 0 ) - goto Invalid_Outline; - limit = outline->points + last; - - v_start = outline->points[first]; - v_start.x = SCALED( v_start.x ); - v_start.y = SCALED( v_start.y ); - - v_last = outline->points[last]; - v_last.x = SCALED( v_last.x ); - v_last.y = SCALED( v_last.y ); - - v_control = v_start; - - point = outline->points + first; - tags = outline->tags + first; - tag = FT_CURVE_TAG( tags[0] ); - - /* A contour cannot start with a cubic control point! */ - if ( tag == FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - /* check first point to determine origin */ - if ( tag == FT_CURVE_TAG_CONIC ) - { - /* first point is conic control. Yes, this happens. */ - if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) - { - /* start at last point if it is on the curve */ - v_start = v_last; - limit--; - } - else - { - /* if both first and last points are conic, */ - /* start at their middle and record its position */ - /* for closure */ - v_start.x = ( v_start.x + v_last.x ) / 2; - v_start.y = ( v_start.y + v_last.y ) / 2; - - /* v_last = v_start; */ - } - point--; - tags--; - } - - FT_TRACE5(( " move to (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0 )); - error = func_interface->move_to( &v_start, user ); - if ( error ) - goto Exit; - - while ( point < limit ) - { - point++; - tags++; - - tag = FT_CURVE_TAG( tags[0] ); - switch ( tag ) - { - case FT_CURVE_TAG_ON: /* emit a single line_to */ - { - FT_Vector vec; - - - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - FT_TRACE5(( " line to (%.2f, %.2f)\n", - vec.x / 64.0, vec.y / 64.0 )); - error = func_interface->line_to( &vec, user ); - if ( error ) - goto Exit; - continue; - } - - case FT_CURVE_TAG_CONIC: /* consume conic arcs */ - v_control.x = SCALED( point->x ); - v_control.y = SCALED( point->y ); - - Do_Conic: - if ( point < limit ) - { - FT_Vector vec; - FT_Vector v_middle; - - - point++; - tags++; - tag = FT_CURVE_TAG( tags[0] ); - - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - if ( tag == FT_CURVE_TAG_ON ) - { - FT_TRACE5(( " conic to (%.2f, %.2f)" - " with control (%.2f, %.2f)\n", - vec.x / 64.0, vec.y / 64.0, - v_control.x / 64.0, v_control.y / 64.0 )); - error = func_interface->conic_to( &v_control, &vec, user ); - if ( error ) - goto Exit; - continue; - } - - if ( tag != FT_CURVE_TAG_CONIC ) - goto Invalid_Outline; - - v_middle.x = ( v_control.x + vec.x ) / 2; - v_middle.y = ( v_control.y + vec.y ) / 2; - - FT_TRACE5(( " conic to (%.2f, %.2f)" - " with control (%.2f, %.2f)\n", - v_middle.x / 64.0, v_middle.y / 64.0, - v_control.x / 64.0, v_control.y / 64.0 )); - error = func_interface->conic_to( &v_control, &v_middle, user ); - if ( error ) - goto Exit; - - v_control = vec; - goto Do_Conic; - } - - FT_TRACE5(( " conic to (%.2f, %.2f)" - " with control (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0, - v_control.x / 64.0, v_control.y / 64.0 )); - error = func_interface->conic_to( &v_control, &v_start, user ); - goto Close; - - default: /* FT_CURVE_TAG_CUBIC */ - { - FT_Vector vec1, vec2; - - - if ( point + 1 > limit || - FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - point += 2; - tags += 2; - - vec1.x = SCALED( point[-2].x ); - vec1.y = SCALED( point[-2].y ); - - vec2.x = SCALED( point[-1].x ); - vec2.y = SCALED( point[-1].y ); - - if ( point <= limit ) - { - FT_Vector vec; - - - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - FT_TRACE5(( " cubic to (%.2f, %.2f)" - " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", - vec.x / 64.0, vec.y / 64.0, - vec1.x / 64.0, vec1.y / 64.0, - vec2.x / 64.0, vec2.y / 64.0 )); - error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); - if ( error ) - goto Exit; - continue; - } - - FT_TRACE5(( " cubic to (%.2f, %.2f)" - " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0, - vec1.x / 64.0, vec1.y / 64.0, - vec2.x / 64.0, vec2.y / 64.0 )); - error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); - goto Close; - } - } - } - - /* close the contour with a line segment */ - FT_TRACE5(( " line to (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0 )); - error = func_interface->line_to( &v_start, user ); - - Close: - if ( error ) - goto Exit; - - first = (FT_UInt)last + 1; - } - - FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); - return FT_Err_Ok; - - Exit: - FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error )); - return error; - - Invalid_Outline: - return FT_THROW( Invalid_Outline ); - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_New_Internal( FT_Memory memory, - FT_UInt numPoints, - FT_Int numContours, - FT_Outline *anoutline ) - { - FT_Error error; - - - if ( !anoutline || !memory ) - return FT_THROW( Invalid_Argument ); - - *anoutline = null_outline; - - if ( numContours < 0 || - (FT_UInt)numContours > numPoints ) - return FT_THROW( Invalid_Argument ); - - if ( numPoints > FT_OUTLINE_POINTS_MAX ) - return FT_THROW( Array_Too_Large ); - - if ( FT_NEW_ARRAY( anoutline->points, numPoints ) || - FT_NEW_ARRAY( anoutline->tags, numPoints ) || - FT_NEW_ARRAY( anoutline->contours, numContours ) ) - goto Fail; - - anoutline->n_points = (FT_Short)numPoints; - anoutline->n_contours = (FT_Short)numContours; - anoutline->flags |= FT_OUTLINE_OWNER; - - return FT_Err_Ok; - - Fail: - anoutline->flags |= FT_OUTLINE_OWNER; - FT_Outline_Done_Internal( memory, anoutline ); - - return error; - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_New( FT_Library library, - FT_UInt numPoints, - FT_Int numContours, - FT_Outline *anoutline ) - { - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - return FT_Outline_New_Internal( library->memory, numPoints, - numContours, anoutline ); - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Check( FT_Outline* outline ) - { - if ( outline ) - { - FT_Int n_points = outline->n_points; - FT_Int n_contours = outline->n_contours; - FT_Int end0, end; - FT_Int n; - - - /* empty glyph? */ - if ( n_points == 0 && n_contours == 0 ) - return FT_Err_Ok; - - /* check point and contour counts */ - if ( n_points <= 0 || n_contours <= 0 ) - goto Bad; - - end0 = end = -1; - for ( n = 0; n < n_contours; n++ ) - { - end = outline->contours[n]; - - /* note that we don't accept empty contours */ - if ( end <= end0 || end >= n_points ) - goto Bad; - - end0 = end; - } - - if ( end != n_points - 1 ) - goto Bad; - - /* XXX: check the tags array */ - return FT_Err_Ok; - } - - Bad: - return FT_THROW( Invalid_Argument ); - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Copy( const FT_Outline* source, - FT_Outline *target ) - { - FT_Int is_owner; - - - if ( !source || !target ) - return FT_THROW( Invalid_Outline ); - - if ( source->n_points != target->n_points || - source->n_contours != target->n_contours ) - return FT_THROW( Invalid_Argument ); - - if ( source == target ) - return FT_Err_Ok; - - FT_ARRAY_COPY( target->points, source->points, source->n_points ); - - FT_ARRAY_COPY( target->tags, source->tags, source->n_points ); - - FT_ARRAY_COPY( target->contours, source->contours, source->n_contours ); - - /* copy all flags, except the `FT_OUTLINE_OWNER' one */ - is_owner = target->flags & FT_OUTLINE_OWNER; - target->flags = source->flags; - - target->flags &= ~FT_OUTLINE_OWNER; - target->flags |= is_owner; - - return FT_Err_Ok; - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Done_Internal( FT_Memory memory, - FT_Outline* outline ) - { - if ( !outline ) - return FT_THROW( Invalid_Outline ); - - if ( !memory ) - return FT_THROW( Invalid_Argument ); - - if ( outline->flags & FT_OUTLINE_OWNER ) - { - FT_FREE( outline->points ); - FT_FREE( outline->tags ); - FT_FREE( outline->contours ); - } - *outline = null_outline; - - return FT_Err_Ok; - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Done( FT_Library library, - FT_Outline* outline ) - { - /* check for valid `outline' in FT_Outline_Done_Internal() */ - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - return FT_Outline_Done_Internal( library->memory, outline ); - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( void ) - FT_Outline_Get_CBox( const FT_Outline* outline, - FT_BBox *acbox ) - { - FT_Pos xMin, yMin, xMax, yMax; - - - if ( outline && acbox ) - { - if ( outline->n_points == 0 ) - { - xMin = 0; - yMin = 0; - xMax = 0; - yMax = 0; - } - else - { - FT_Vector* vec = outline->points; - FT_Vector* limit = vec + outline->n_points; - - - xMin = xMax = vec->x; - yMin = yMax = vec->y; - vec++; - - for ( ; vec < limit; vec++ ) - { - FT_Pos x, y; - - - x = vec->x; - if ( x < xMin ) xMin = x; - if ( x > xMax ) xMax = x; - - y = vec->y; - if ( y < yMin ) yMin = y; - if ( y > yMax ) yMax = y; - } - } - acbox->xMin = xMin; - acbox->xMax = xMax; - acbox->yMin = yMin; - acbox->yMax = yMax; - } - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( void ) - FT_Outline_Translate( const FT_Outline* outline, - FT_Pos xOffset, - FT_Pos yOffset ) - { - FT_UShort n; - FT_Vector* vec; - - - if ( !outline ) - return; - - vec = outline->points; - - for ( n = 0; n < outline->n_points; n++ ) - { - vec->x += xOffset; - vec->y += yOffset; - vec++; - } - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( void ) - FT_Outline_Reverse( FT_Outline* outline ) - { - FT_UShort n; - FT_Int first, last; - - - if ( !outline ) - return; - - first = 0; - - for ( n = 0; n < outline->n_contours; n++ ) - { - last = outline->contours[n]; - - /* reverse point table */ - { - FT_Vector* p = outline->points + first; - FT_Vector* q = outline->points + last; - FT_Vector swap; - - - while ( p < q ) - { - swap = *p; - *p = *q; - *q = swap; - p++; - q--; - } - } - - /* reverse tags table */ - { - char* p = outline->tags + first; - char* q = outline->tags + last; - - - while ( p < q ) - { - char swap; - - - swap = *p; - *p = *q; - *q = swap; - p++; - q--; - } - } - - first = last + 1; - } - - outline->flags ^= FT_OUTLINE_REVERSE_FILL; - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Render( FT_Library library, - FT_Outline* outline, - FT_Raster_Params* params ) - { - FT_Error error; - FT_Renderer renderer; - FT_ListNode node; - - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - if ( !outline ) - return FT_THROW( Invalid_Outline ); - - if ( !params ) - return FT_THROW( Invalid_Argument ); - - renderer = library->cur_renderer; - node = library->renderers.head; - - params->source = (void*)outline; - - error = FT_ERR( Cannot_Render_Glyph ); - while ( renderer ) - { - error = renderer->raster_render( renderer->raster, params ); - if ( !error || FT_ERR_NEQ( error, Cannot_Render_Glyph ) ) - break; - - /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ - /* is unsupported by the current renderer for this glyph image */ - /* format */ - - /* now, look for another renderer that supports the same */ - /* format */ - renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, - &node ); - } - - return error; - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Get_Bitmap( FT_Library library, - FT_Outline* outline, - const FT_Bitmap *abitmap ) - { - FT_Raster_Params params; - - - if ( !abitmap ) - return FT_THROW( Invalid_Argument ); - - /* other checks are delayed to `FT_Outline_Render' */ - - params.target = abitmap; - params.flags = 0; - - if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY || - abitmap->pixel_mode == FT_PIXEL_MODE_LCD || - abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V ) - params.flags |= FT_RASTER_FLAG_AA; - - return FT_Outline_Render( library, outline, ¶ms ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( void ) - FT_Vector_Transform( FT_Vector* vector, - const FT_Matrix* matrix ) - { - FT_Pos xz, yz; - - - if ( !vector || !matrix ) - return; - - xz = FT_MulFix( vector->x, matrix->xx ) + - FT_MulFix( vector->y, matrix->xy ); - - yz = FT_MulFix( vector->x, matrix->yx ) + - FT_MulFix( vector->y, matrix->yy ); - - vector->x = xz; - vector->y = yz; - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( void ) - FT_Outline_Transform( const FT_Outline* outline, - const FT_Matrix* matrix ) - { - FT_Vector* vec; - FT_Vector* limit; - - - if ( !outline || !matrix ) - return; - - vec = outline->points; - limit = vec + outline->n_points; - - for ( ; vec < limit; vec++ ) - FT_Vector_Transform( vec, matrix ); - } - - -#if 0 - -#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last ) \ - do \ - { \ - (first) = ( c > 0 ) ? (outline)->points + \ - (outline)->contours[c - 1] + 1 \ - : (outline)->points; \ - (last) = (outline)->points + (outline)->contours[c]; \ - } while ( 0 ) - - - /* Is a point in some contour? */ - /* */ - /* We treat every point of the contour as if it */ - /* it were ON. That is, we allow false positives, */ - /* but disallow false negatives. (XXX really?) */ - static FT_Bool - ft_contour_has( FT_Outline* outline, - FT_Short c, - FT_Vector* point ) - { - FT_Vector* first; - FT_Vector* last; - FT_Vector* a; - FT_Vector* b; - FT_UInt n = 0; - - - FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); - - for ( a = first; a <= last; a++ ) - { - FT_Pos x; - FT_Int intersect; - - - b = ( a == last ) ? first : a + 1; - - intersect = ( a->y - point->y ) ^ ( b->y - point->y ); - - /* a and b are on the same side */ - if ( intersect >= 0 ) - { - if ( intersect == 0 && a->y == point->y ) - { - if ( ( a->x <= point->x && b->x >= point->x ) || - ( a->x >= point->x && b->x <= point->x ) ) - return 1; - } - - continue; - } - - x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y ); - - if ( x < point->x ) - n++; - else if ( x == point->x ) - return 1; - } - - return n & 1; - } - - - static FT_Bool - ft_contour_enclosed( FT_Outline* outline, - FT_UShort c ) - { - FT_Vector* first; - FT_Vector* last; - FT_Short i; - - - FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); - - for ( i = 0; i < outline->n_contours; i++ ) - { - if ( i != c && ft_contour_has( outline, i, first ) ) - { - FT_Vector* pt; - - - for ( pt = first + 1; pt <= last; pt++ ) - if ( !ft_contour_has( outline, i, pt ) ) - return 0; - - return 1; - } - } - - return 0; - } - - - /* This version differs from the public one in that each */ - /* part (contour not enclosed in another contour) of the */ - /* outline is checked for orientation. This is */ - /* necessary for some buggy CJK fonts. */ - static FT_Orientation - ft_outline_get_orientation( FT_Outline* outline ) - { - FT_Short i; - FT_Vector* first; - FT_Vector* last; - FT_Orientation orient = FT_ORIENTATION_NONE; - - - first = outline->points; - for ( i = 0; i < outline->n_contours; i++, first = last + 1 ) - { - FT_Vector* point; - FT_Vector* xmin_point; - FT_Pos xmin; - - - last = outline->points + outline->contours[i]; - - /* skip degenerate contours */ - if ( last < first + 2 ) - continue; - - if ( ft_contour_enclosed( outline, i ) ) - continue; - - xmin = first->x; - xmin_point = first; - - for ( point = first + 1; point <= last; point++ ) - { - if ( point->x < xmin ) - { - xmin = point->x; - xmin_point = point; - } - } - - /* check the orientation of the contour */ - { - FT_Vector* prev; - FT_Vector* next; - FT_Orientation o; - - - prev = ( xmin_point == first ) ? last : xmin_point - 1; - next = ( xmin_point == last ) ? first : xmin_point + 1; - - if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) > - FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) ) - o = FT_ORIENTATION_POSTSCRIPT; - else - o = FT_ORIENTATION_TRUETYPE; - - if ( orient == FT_ORIENTATION_NONE ) - orient = o; - else if ( orient != o ) - return FT_ORIENTATION_NONE; - } - } - - return orient; - } - -#endif /* 0 */ - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Embolden( FT_Outline* outline, - FT_Pos strength ) - { - return FT_Outline_EmboldenXY( outline, strength, strength ); - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_EmboldenXY( FT_Outline* outline, - FT_Pos xstrength, - FT_Pos ystrength ) - { - FT_Vector* points; - FT_Int c, first, last; - FT_Int orientation; - - - if ( !outline ) - return FT_THROW( Invalid_Outline ); - - xstrength /= 2; - ystrength /= 2; - if ( xstrength == 0 && ystrength == 0 ) - return FT_Err_Ok; - - orientation = FT_Outline_Get_Orientation( outline ); - if ( orientation == FT_ORIENTATION_NONE ) - { - if ( outline->n_contours ) - return FT_THROW( Invalid_Argument ); - else - return FT_Err_Ok; - } - - points = outline->points; - - first = 0; - for ( c = 0; c < outline->n_contours; c++ ) - { - FT_Vector in, out, anchor, shift; - FT_Fixed l_in, l_out, l_anchor, l, q, d; - FT_Int i, j, k; - - - l_in = 0; - last = outline->contours[c]; - - /* Counter i cycles though the points; counter j advances only */ - /* if points are moved; anchor k marks the first moved point. */ - for ( i = last, j = first, k = -1; - j != i && i != k; - j = j < last ? j + 1 : first ) - { - if ( j != k ) - { - out.x = points[j].x - points[i].x; - out.y = points[j].y - points[i].y; - l_out = FT_Vector_NormLen( &out ); - } - else - { - out = anchor; - l_out = l_anchor; - } - - if ( l_out == 0 ) - continue; - - if ( l_in != 0 ) - { - if ( k < 0 ) - { - k = i; - anchor = in; - l_anchor = l_in; - } - - d = FT_MulFix( in.x, out.x ) + FT_MulFix( in.y, out.y ); - - /* shift only if turn is less than ~160 degrees */ - if ( d > -0xF000L ) - { - d = d + 0x10000L; - - /* shift components along lateral bisector in proper orientation */ - shift.x = in.y + out.y; - shift.y = in.x + out.x; - - if ( orientation == FT_ORIENTATION_TRUETYPE ) - shift.x = -shift.x; - else - shift.y = -shift.y; - - /* restrict shift magnitude to better handle collapsing segments */ - q = FT_MulFix( out.x, in.y ) - FT_MulFix( out.y, in.x ); - if ( orientation == FT_ORIENTATION_TRUETYPE ) - q = -q; - - l = FT_MIN( l_in, l_out ); - - /* non-strict inequalities avoid divide-by-zero when q == l == 0 */ - if ( FT_MulFix( xstrength, q ) <= FT_MulFix( l, d ) ) - shift.x = FT_MulDiv( shift.x, xstrength, d ); - else - shift.x = FT_MulDiv( shift.x, l, q ); - - - if ( FT_MulFix( ystrength, q ) <= FT_MulFix( l, d ) ) - shift.y = FT_MulDiv( shift.y, ystrength, d ); - else - shift.y = FT_MulDiv( shift.y, l, q ); - } - else - shift.x = shift.y = 0; - - for ( ; - i != j; - i = i < last ? i + 1 : first ) - { - points[i].x += xstrength + shift.x; - points[i].y += ystrength + shift.y; - } - } - else - i = j; - - in = out; - l_in = l_out; - } - - first = last + 1; - } - - return FT_Err_Ok; - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Orientation ) - FT_Outline_Get_Orientation( FT_Outline* outline ) - { - FT_BBox cbox; - FT_Int xshift, yshift; - FT_Vector* points; - FT_Vector v_prev, v_cur; - FT_Int c, n, first; - FT_Pos area = 0; - - - if ( !outline || outline->n_points <= 0 ) - return FT_ORIENTATION_TRUETYPE; - - /* We use the nonzero winding rule to find the orientation. */ - /* Since glyph outlines behave much more `regular' than arbitrary */ - /* cubic or quadratic curves, this test deals with the polygon */ - /* only that is spanned up by the control points. */ - - FT_Outline_Get_CBox( outline, &cbox ); - - /* Handle collapsed outlines to avoid undefined FT_MSB. */ - if ( cbox.xMin == cbox.xMax || cbox.yMin == cbox.yMax ) - return FT_ORIENTATION_NONE; - - xshift = FT_MSB( (FT_UInt32)( FT_ABS( cbox.xMax ) | - FT_ABS( cbox.xMin ) ) ) - 14; - xshift = FT_MAX( xshift, 0 ); - - yshift = FT_MSB( (FT_UInt32)( cbox.yMax - cbox.yMin ) ) - 14; - yshift = FT_MAX( yshift, 0 ); - - points = outline->points; - - first = 0; - for ( c = 0; c < outline->n_contours; c++ ) - { - FT_Int last = outline->contours[c]; - - - v_prev = points[last]; - - for ( n = first; n <= last; n++ ) - { - v_cur = points[n]; - area += ( ( v_cur.y - v_prev.y ) >> yshift ) * - ( ( v_cur.x + v_prev.x ) >> xshift ); - v_prev = v_cur; - } - - first = last + 1; - } - - if ( area > 0 ) - return FT_ORIENTATION_POSTSCRIPT; - else if ( area < 0 ) - return FT_ORIENTATION_TRUETYPE; - else - return FT_ORIENTATION_NONE; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftpatent.c b/3party/freetype/src/base/ftpatent.c deleted file mode 100644 index bf2b0855c9..0000000000 --- a/3party/freetype/src/base/ftpatent.c +++ /dev/null @@ -1,287 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftpatent.c */ -/* */ -/* FreeType API for checking patented TrueType bytecode instructions */ -/* (body). */ -/* */ -/* Copyright 2007-2015 by */ -/* David Turner. */ -/* */ -/* 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_TRUETYPE_TAGS_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_STREAM_H -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_TRUETYPE_GLYF_H - - - static FT_Bool - _tt_check_patents_in_range( FT_Stream stream, - FT_ULong size ) - { - FT_Bool result = FALSE; - FT_Error error; - FT_Bytes p, end; - - - if ( FT_FRAME_ENTER( size ) ) - return 0; - - p = stream->cursor; - end = p + size; - - while ( p < end ) - { - switch (p[0]) - { - case 0x06: /* SPvTL // */ - case 0x07: /* SPvTL + */ - case 0x08: /* SFvTL // */ - case 0x09: /* SFvTL + */ - case 0x0A: /* SPvFS */ - case 0x0B: /* SFvFS */ - result = TRUE; - goto Exit; - - case 0x40: - if ( p + 1 >= end ) - goto Exit; - - p += p[1] + 2; - break; - - case 0x41: - if ( p + 1 >= end ) - goto Exit; - - p += p[1] * 2 + 2; - break; - - case 0x71: /* DELTAP2 */ - case 0x72: /* DELTAP3 */ - case 0x73: /* DELTAC0 */ - case 0x74: /* DELTAC1 */ - case 0x75: /* DELTAC2 */ - result = TRUE; - goto Exit; - - case 0xB0: - case 0xB1: - case 0xB2: - case 0xB3: - case 0xB4: - case 0xB5: - case 0xB6: - case 0xB7: - p += ( p[0] - 0xB0 ) + 2; - break; - - case 0xB8: - case 0xB9: - case 0xBA: - case 0xBB: - case 0xBC: - case 0xBD: - case 0xBE: - case 0xBF: - p += ( p[0] - 0xB8 ) * 2 + 3; - break; - - default: - p += 1; - break; - } - } - - Exit: - FT_UNUSED( error ); - FT_FRAME_EXIT(); - return result; - } - - - static FT_Bool - _tt_check_patents_in_table( FT_Face face, - FT_ULong tag ) - { - FT_Stream stream = face->stream; - FT_Error error = FT_Err_Ok; - FT_Service_SFNT_Table service; - FT_Bool result = FALSE; - - - FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); - - if ( service ) - { - FT_UInt i = 0; - FT_ULong tag_i = 0, offset_i = 0, length_i = 0; - - - for ( i = 0; !error && tag_i != tag ; i++ ) - error = service->table_info( face, i, - &tag_i, &offset_i, &length_i ); - - if ( error || - FT_STREAM_SEEK( offset_i ) ) - goto Exit; - - result = _tt_check_patents_in_range( stream, length_i ); - } - - Exit: - return result; - } - - - static FT_Bool - _tt_face_check_patents( FT_Face face ) - { - FT_Stream stream = face->stream; - FT_UInt gindex; - FT_Error error; - FT_Bool result; - - FT_Service_TTGlyf service; - - - result = _tt_check_patents_in_table( face, TTAG_fpgm ); - if ( result ) - goto Exit; - - result = _tt_check_patents_in_table( face, TTAG_prep ); - if ( result ) - goto Exit; - - FT_FACE_FIND_SERVICE( face, service, TT_GLYF ); - if ( service == NULL ) - goto Exit; - - for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ ) - { - FT_ULong offset, num_ins, size; - FT_Int num_contours; - - - offset = service->get_location( face, gindex, &size ); - if ( size == 0 ) - continue; - - if ( FT_STREAM_SEEK( offset ) || - FT_READ_SHORT( num_contours ) ) - continue; - - if ( num_contours >= 0 ) /* simple glyph */ - { - if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) ) - continue; - } - else /* compound glyph */ - { - FT_Bool has_instr = 0; - - - if ( FT_STREAM_SKIP( 8 ) ) - continue; - - /* now read each component */ - for (;;) - { - FT_UInt flags, toskip; - - - if( FT_READ_USHORT( flags ) ) - break; - - toskip = 2 + 1 + 1; - - if ( ( flags & ( 1 << 0 ) ) != 0 ) /* ARGS_ARE_WORDS */ - toskip += 2; - - if ( ( flags & ( 1 << 3 ) ) != 0 ) /* WE_HAVE_A_SCALE */ - toskip += 2; - else if ( ( flags & ( 1 << 6 ) ) != 0 ) /* WE_HAVE_X_Y_SCALE */ - toskip += 4; - else if ( ( flags & ( 1 << 7 ) ) != 0 ) /* WE_HAVE_A_2x2 */ - toskip += 8; - - if ( ( flags & ( 1 << 8 ) ) != 0 ) /* WE_HAVE_INSTRUCTIONS */ - has_instr = 1; - - if ( FT_STREAM_SKIP( toskip ) ) - goto NextGlyph; - - if ( ( flags & ( 1 << 5 ) ) == 0 ) /* MORE_COMPONENTS */ - break; - } - - if ( !has_instr ) - goto NextGlyph; - } - - if ( FT_READ_USHORT( num_ins ) ) - continue; - - result = _tt_check_patents_in_range( stream, num_ins ); - if ( result ) - goto Exit; - - NextGlyph: - ; - } - - Exit: - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Bool ) - FT_Face_CheckTrueTypePatents( FT_Face face ) - { - FT_Bool result = FALSE; - - - if ( face && FT_IS_SFNT( face ) ) - result = _tt_face_check_patents( face ); - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Bool ) - FT_Face_SetUnpatentedHinting( FT_Face face, - FT_Bool value ) - { - FT_Bool result = FALSE; - - -#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \ - !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER ) - if ( face && FT_IS_SFNT( face ) ) - { - result = !face->internal->ignore_unpatented_hinter; - face->internal->ignore_unpatented_hinter = !value; - } -#else - FT_UNUSED( face ); - FT_UNUSED( value ); -#endif - - return result; - } - -/* END */ diff --git a/3party/freetype/src/base/ftpfr.c b/3party/freetype/src/base/ftpfr.c deleted file mode 100644 index 39f089e3e9..0000000000 --- a/3party/freetype/src/base/ftpfr.c +++ /dev/null @@ -1,153 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftpfr.c */ -/* */ -/* FreeType API for accessing PFR-specific data (body). */ -/* */ -/* Copyright 2002-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H - -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_PFR_H - - - /* check the format */ - static FT_Service_PfrMetrics - ft_pfr_check( FT_Face face ) - { - FT_Service_PfrMetrics service = NULL; - - - if ( face ) - FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS ); - - return service; - } - - - /* documentation is in ftpfr.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_PFR_Metrics( FT_Face face, - FT_UInt *aoutline_resolution, - FT_UInt *ametrics_resolution, - FT_Fixed *ametrics_x_scale, - FT_Fixed *ametrics_y_scale ) - { - FT_Error error = FT_Err_Ok; - FT_Service_PfrMetrics service; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - service = ft_pfr_check( face ); - if ( service ) - { - error = service->get_metrics( face, - aoutline_resolution, - ametrics_resolution, - ametrics_x_scale, - ametrics_y_scale ); - } - else - { - FT_Fixed x_scale, y_scale; - - - /* this is not a PFR font */ - if ( aoutline_resolution ) - *aoutline_resolution = face->units_per_EM; - - if ( ametrics_resolution ) - *ametrics_resolution = face->units_per_EM; - - x_scale = y_scale = 0x10000L; - if ( face->size ) - { - x_scale = face->size->metrics.x_scale; - y_scale = face->size->metrics.y_scale; - } - - if ( ametrics_x_scale ) - *ametrics_x_scale = x_scale; - - if ( ametrics_y_scale ) - *ametrics_y_scale = y_scale; - - error = FT_THROW( Unknown_File_Format ); - } - - return error; - } - - - /* documentation is in ftpfr.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_PFR_Kerning( FT_Face face, - FT_UInt left, - FT_UInt right, - FT_Vector *avector ) - { - FT_Error error; - FT_Service_PfrMetrics service; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !avector ) - return FT_THROW( Invalid_Argument ); - - service = ft_pfr_check( face ); - if ( service ) - error = service->get_kerning( face, left, right, avector ); - else - error = FT_Get_Kerning( face, left, right, - FT_KERNING_UNSCALED, avector ); - - return error; - } - - - /* documentation is in ftpfr.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_PFR_Advance( FT_Face face, - FT_UInt gindex, - FT_Pos *aadvance ) - { - FT_Error error; - FT_Service_PfrMetrics service; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !aadvance ) - return FT_THROW( Invalid_Argument ); - - service = ft_pfr_check( face ); - if ( service ) - error = service->get_advance( face, gindex, aadvance ); - else - /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */ - error = FT_THROW( Invalid_Argument ); - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftpic.c b/3party/freetype/src/base/ftpic.c deleted file mode 100644 index 6c4b1cd4e6..0000000000 --- a/3party/freetype/src/base/ftpic.c +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftpic.c */ -/* */ -/* The FreeType position independent code services (body). */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "basepic.h" - -#ifdef FT_CONFIG_OPTION_PIC - - /* documentation is in ftpic.h */ - - FT_BASE_DEF( FT_Error ) - ft_pic_container_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error; - - - FT_MEM_SET( pic_container, 0, sizeof ( *pic_container ) ); - - error = ft_base_pic_init( library ); - if ( error ) - return error; - - return FT_Err_Ok; - } - - - /* Destroy the contents of the container. */ - FT_BASE_DEF( void ) - ft_pic_container_destroy( FT_Library library ) - { - ft_base_pic_free( library ); - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/3party/freetype/src/base/ftrfork.c b/3party/freetype/src/base/ftrfork.c deleted file mode 100644 index c30c76678e..0000000000 --- a/3party/freetype/src/base/ftrfork.c +++ /dev/null @@ -1,880 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftrfork.c */ -/* */ -/* Embedded resource forks accessor (body). */ -/* */ -/* Copyright 2004-2015 by */ -/* Masatake YAMATO and Redhat K.K. */ -/* */ -/* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */ -/* derived from ftobjs.c. */ -/* */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* Development of the code in this file is support of */ -/* Information-technology Promotion Agency, Japan. */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_RFORK_H -#include "basepic.h" -#include "ftbase.h" - -#undef FT_COMPONENT -#define FT_COMPONENT trace_raccess - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** Resource fork directory access ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - FT_BASE_DEF( FT_Error ) - FT_Raccess_Get_HeaderInfo( FT_Library library, - FT_Stream stream, - FT_Long rfork_offset, - FT_Long *map_offset, - FT_Long *rdata_pos ) - { - FT_Error error; - unsigned char head[16], head2[16]; - FT_Long map_pos, rdata_len; - int allzeros, allmatch, i; - FT_Long type_list; - - FT_UNUSED( library ); - - - error = FT_Stream_Seek( stream, (FT_ULong)rfork_offset ); - if ( error ) - return error; - - error = FT_Stream_Read( stream, (FT_Byte *)head, 16 ); - if ( error ) - return error; - - /* ensure positive values */ - if ( head[0] >= 0x80 || head[4] >= 0x80 || head[8] >= 0x80 ) - return FT_THROW( Unknown_File_Format ); - - *rdata_pos = ( head[ 0] << 24 ) | - ( head[ 1] << 16 ) | - ( head[ 2] << 8 ) | - head[ 3]; - map_pos = ( head[ 4] << 24 ) | - ( head[ 5] << 16 ) | - ( head[ 6] << 8 ) | - head[ 7]; - rdata_len = ( head[ 8] << 24 ) | - ( head[ 9] << 16 ) | - ( head[10] << 8 ) | - head[11]; - - /* map_len = head[12] .. head[15] */ - - if ( *rdata_pos != map_pos - rdata_len || map_pos == 0 ) - return FT_THROW( Unknown_File_Format ); - - if ( FT_LONG_MAX - rfork_offset < *rdata_pos || - FT_LONG_MAX - rfork_offset < map_pos ) - return FT_THROW( Unknown_File_Format ); - - *rdata_pos += rfork_offset; - map_pos += rfork_offset; - - error = FT_Stream_Seek( stream, (FT_ULong)map_pos ); - if ( error ) - return error; - - head2[15] = (FT_Byte)( head[15] + 1 ); /* make it be different */ - - error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 ); - if ( error ) - return error; - - allzeros = 1; - allmatch = 1; - for ( i = 0; i < 16; ++i ) - { - if ( head2[i] != 0 ) - allzeros = 0; - if ( head2[i] != head[i] ) - allmatch = 0; - } - if ( !allzeros && !allmatch ) - return FT_THROW( Unknown_File_Format ); - - /* If we have reached this point then it is probably a mac resource */ - /* file. Now, does it contain any interesting resources? */ - /* Skip handle to next resource map, the file resource number, and */ - /* attributes. */ - (void)FT_STREAM_SKIP( 4 /* skip handle to next resource map */ - + 2 /* skip file resource number */ - + 2 ); /* skip attributes */ - - if ( FT_READ_USHORT( type_list ) ) - return error; - if ( type_list == -1 ) - return FT_THROW( Unknown_File_Format ); - - error = FT_Stream_Seek( stream, (FT_ULong)( map_pos + type_list ) ); - if ( error ) - return error; - - *map_offset = map_pos + type_list; - return FT_Err_Ok; - } - - - static int - ft_raccess_sort_ref_by_id( FT_RFork_Ref* a, - FT_RFork_Ref* b ) - { - if ( a->res_id < b->res_id ) - return -1; - else if ( a->res_id > b->res_id ) - return 1; - else - return 0; - } - - - FT_BASE_DEF( FT_Error ) - FT_Raccess_Get_DataOffsets( FT_Library library, - FT_Stream stream, - FT_Long map_offset, - FT_Long rdata_pos, - FT_Long tag, - FT_Bool sort_by_res_id, - FT_Long **offsets, - FT_Long *count ) - { - FT_Error error; - int i, j, cnt, subcnt; - FT_Long tag_internal, rpos; - FT_Memory memory = library->memory; - FT_Long temp; - FT_Long *offsets_internal = NULL; - FT_RFork_Ref *ref = NULL; - - - FT_TRACE3(( "\n" )); - error = FT_Stream_Seek( stream, (FT_ULong)map_offset ); - if ( error ) - return error; - - if ( FT_READ_USHORT( cnt ) ) - return error; - cnt++; - - for ( i = 0; i < cnt; ++i ) - { - if ( FT_READ_LONG( tag_internal ) || - FT_READ_USHORT( subcnt ) || - FT_READ_USHORT( rpos ) ) - return error; - - FT_TRACE2(( "Resource tags: %c%c%c%c\n", - (char)( 0xFF & ( tag_internal >> 24 ) ), - (char)( 0xFF & ( tag_internal >> 16 ) ), - (char)( 0xFF & ( tag_internal >> 8 ) ), - (char)( 0xFF & ( tag_internal >> 0 ) ) )); - FT_TRACE3(( " : subcount=%d, suboffset=0x%04x\n", - subcnt, rpos )); - - if ( tag_internal == tag ) - { - *count = subcnt + 1; - rpos += map_offset; - - error = FT_Stream_Seek( stream, (FT_ULong)rpos ); - if ( error ) - return error; - - if ( FT_NEW_ARRAY( ref, *count ) ) - return error; - - for ( j = 0; j < *count; ++j ) - { - if ( FT_READ_USHORT( ref[j].res_id ) ) - goto Exit; - if ( FT_STREAM_SKIP( 2 ) ) /* resource name */ - goto Exit; - if ( FT_READ_LONG( temp ) ) - goto Exit; - if ( FT_STREAM_SKIP( 4 ) ) /* mbz */ - goto Exit; - - ref[j].offset = temp & 0xFFFFFFL; - FT_TRACE3(( " [%d]:" - " resource_id=0x%04x, offset=0x%08x\n", - j, ref[j].res_id, ref[j].offset )); - } - - if (sort_by_res_id) - { - ft_qsort( ref, (size_t)*count, sizeof ( FT_RFork_Ref ), - ( int(*)(const void*, const void*) ) - ft_raccess_sort_ref_by_id ); - - FT_TRACE3(( " -- sort resources by their ids --\n" )); - for ( j = 0; j < *count; ++ j ) { - FT_TRACE3(( " [%d]:" - " resource_id=0x%04x, offset=0x%08x\n", - j, ref[j].res_id, ref[j].offset )); - } - } - - if ( FT_NEW_ARRAY( offsets_internal, *count ) ) - goto Exit; - - /* XXX: duplicated reference ID, - * gap between reference IDs are acceptable? - * further investigation on Apple implementation is needed. - */ - for ( j = 0; j < *count; ++j ) - offsets_internal[j] = rdata_pos + ref[j].offset; - - *offsets = offsets_internal; - error = FT_Err_Ok; - - Exit: - FT_FREE( ref ); - return error; - } - } - - return FT_THROW( Cannot_Open_Resource ); - } - - -#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** Guessing functions ****/ - /**** ****/ - /**** When you add a new guessing function, ****/ - /**** update FT_RACCESS_N_RULES in ftrfork.h. ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - static FT_Error - raccess_guess_apple_double( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_apple_single( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_darwin_ufs_export( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_darwin_newvfs( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_darwin_hfsplus( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_vfat( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_linux_cap( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_linux_double( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_linux_netatalk( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - - CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table, - ft_raccess_guess_rec) - CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_double, apple_double) - CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_single, apple_single) - CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_ufs_export, darwin_ufs_export) - CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_newvfs, darwin_newvfs) - CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_hfsplus, darwin_hfsplus) - CONST_FT_RFORK_RULE_ARRAY_ENTRY(vfat, vfat) - CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_cap, linux_cap) - CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_double, linux_double) - CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_netatalk, linux_netatalk) - CONST_FT_RFORK_RULE_ARRAY_END - - - /*************************************************************************/ - /**** ****/ - /**** Helper functions ****/ - /**** ****/ - /*************************************************************************/ - - static FT_Error - raccess_guess_apple_generic( FT_Library library, - FT_Stream stream, - char *base_file_name, - FT_Int32 magic, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_linux_double_from_file_name( FT_Library library, - char * file_name, - FT_Long *result_offset ); - - static char * - raccess_make_file_name( FT_Memory memory, - const char *original_name, - const char *insertion ); - - FT_BASE_DEF( void ) - FT_Raccess_Guess( FT_Library library, - FT_Stream stream, - char* base_name, - char **new_names, - FT_Long *offsets, - FT_Error *errors ) - { - FT_Int i; - - - for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) - { - new_names[i] = NULL; - if ( NULL != stream ) - errors[i] = FT_Stream_Seek( stream, 0 ); - else - errors[i] = FT_Err_Ok; - - if ( errors[i] ) - continue ; - - errors[i] = (FT_RACCESS_GUESS_TABLE_GET[i].func)( library, - stream, base_name, - &(new_names[i]), - &(offsets[i]) ); - } - - return; - } - - -#ifndef FT_MACINTOSH - static FT_RFork_Rule - raccess_get_rule_type_from_rule_index( FT_Library library, - FT_UInt rule_index ) - { - FT_UNUSED( library ); - - if ( rule_index >= FT_RACCESS_N_RULES ) - return FT_RFork_Rule_invalid; - - return FT_RACCESS_GUESS_TABLE_GET[rule_index].type; - } - - - /* - * For this function, refer ftbase.h. - */ - FT_LOCAL_DEF( FT_Bool ) - ft_raccess_rule_by_darwin_vfs( FT_Library library, - FT_UInt rule_index ) - { - switch( raccess_get_rule_type_from_rule_index( library, rule_index ) ) - { - case FT_RFork_Rule_darwin_newvfs: - case FT_RFork_Rule_darwin_hfsplus: - return TRUE; - - default: - return FALSE; - } - } -#endif - - - static FT_Error - raccess_guess_apple_double( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - FT_Int32 magic = ( 0x00 << 24 ) | - ( 0x05 << 16 ) | - ( 0x16 << 8 ) | - 0x07; - - - *result_file_name = NULL; - if ( NULL == stream ) - return FT_THROW( Cannot_Open_Stream ); - - return raccess_guess_apple_generic( library, stream, base_file_name, - magic, result_offset ); - } - - - static FT_Error - raccess_guess_apple_single( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - FT_Int32 magic = ( 0x00 << 24 ) | - ( 0x05 << 16 ) | - ( 0x16 << 8 ) | - 0x00; - - - *result_file_name = NULL; - if ( NULL == stream ) - return FT_THROW( Cannot_Open_Stream ); - - return raccess_guess_apple_generic( library, stream, base_file_name, - magic, result_offset ); - } - - - static FT_Error - raccess_guess_darwin_ufs_export( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - char* newpath; - FT_Error error; - FT_Memory memory; - - FT_UNUSED( stream ); - - - memory = library->memory; - newpath = raccess_make_file_name( memory, base_file_name, "._" ); - if ( !newpath ) - return FT_THROW( Out_Of_Memory ); - - error = raccess_guess_linux_double_from_file_name( library, newpath, - result_offset ); - if ( !error ) - *result_file_name = newpath; - else - FT_FREE( newpath ); - - return error; - } - - - static FT_Error - raccess_guess_darwin_hfsplus( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - /* - Only meaningful on systems with hfs+ drivers (or Macs). - */ - FT_Error error; - char* newpath = NULL; - FT_Memory memory; - FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name ); - - FT_UNUSED( stream ); - - - memory = library->memory; - - if ( base_file_len + 6 > FT_INT_MAX ) - return FT_THROW( Array_Too_Large ); - - if ( FT_ALLOC( newpath, base_file_len + 6 ) ) - return error; - - FT_MEM_COPY( newpath, base_file_name, base_file_len ); - FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 ); - - *result_file_name = newpath; - *result_offset = 0; - - return FT_Err_Ok; - } - - - static FT_Error - raccess_guess_darwin_newvfs( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - /* - Only meaningful on systems with Mac OS X (> 10.1). - */ - FT_Error error; - char* newpath = NULL; - FT_Memory memory; - FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name ); - - FT_UNUSED( stream ); - - - memory = library->memory; - - if ( base_file_len + 18 > FT_INT_MAX ) - return FT_THROW( Array_Too_Large ); - - if ( FT_ALLOC( newpath, base_file_len + 18 ) ) - return error; - - FT_MEM_COPY( newpath, base_file_name, base_file_len ); - FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 ); - - *result_file_name = newpath; - *result_offset = 0; - - return FT_Err_Ok; - } - - - static FT_Error - raccess_guess_vfat( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - char* newpath; - FT_Memory memory; - - FT_UNUSED( stream ); - - - memory = library->memory; - - newpath = raccess_make_file_name( memory, base_file_name, - "resource.frk/" ); - if ( !newpath ) - return FT_THROW( Out_Of_Memory ); - - *result_file_name = newpath; - *result_offset = 0; - - return FT_Err_Ok; - } - - - static FT_Error - raccess_guess_linux_cap( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - char* newpath; - FT_Memory memory; - - FT_UNUSED( stream ); - - - memory = library->memory; - - newpath = raccess_make_file_name( memory, base_file_name, ".resource/" ); - if ( !newpath ) - return FT_THROW( Out_Of_Memory ); - - *result_file_name = newpath; - *result_offset = 0; - - return FT_Err_Ok; - } - - - static FT_Error - raccess_guess_linux_double( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - char* newpath; - FT_Error error; - FT_Memory memory; - - FT_UNUSED( stream ); - - - memory = library->memory; - - newpath = raccess_make_file_name( memory, base_file_name, "%" ); - if ( !newpath ) - return FT_THROW( Out_Of_Memory ); - - error = raccess_guess_linux_double_from_file_name( library, newpath, - result_offset ); - if ( !error ) - *result_file_name = newpath; - else - FT_FREE( newpath ); - - return error; - } - - - static FT_Error - raccess_guess_linux_netatalk( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - char* newpath; - FT_Error error; - FT_Memory memory; - - FT_UNUSED( stream ); - - - memory = library->memory; - - newpath = raccess_make_file_name( memory, base_file_name, - ".AppleDouble/" ); - if ( !newpath ) - return FT_THROW( Out_Of_Memory ); - - error = raccess_guess_linux_double_from_file_name( library, newpath, - result_offset ); - if ( !error ) - *result_file_name = newpath; - else - FT_FREE( newpath ); - - return error; - } - - - static FT_Error - raccess_guess_apple_generic( FT_Library library, - FT_Stream stream, - char *base_file_name, - FT_Int32 magic, - FT_Long *result_offset ) - { - FT_Int32 magic_from_stream; - FT_Error error; - FT_Int32 version_number = 0; - FT_UShort n_of_entries; - - int i; - FT_Int32 entry_id, entry_offset, entry_length = 0; - - const FT_Int32 resource_fork_entry_id = 0x2; - - FT_UNUSED( library ); - FT_UNUSED( base_file_name ); - FT_UNUSED( version_number ); - FT_UNUSED( entry_length ); - - - if ( FT_READ_LONG( magic_from_stream ) ) - return error; - if ( magic_from_stream != magic ) - return FT_THROW( Unknown_File_Format ); - - if ( FT_READ_LONG( version_number ) ) - return error; - - /* filler */ - error = FT_Stream_Skip( stream, 16 ); - if ( error ) - return error; - - if ( FT_READ_USHORT( n_of_entries ) ) - return error; - if ( n_of_entries == 0 ) - return FT_THROW( Unknown_File_Format ); - - for ( i = 0; i < n_of_entries; i++ ) - { - if ( FT_READ_LONG( entry_id ) ) - return error; - if ( entry_id == resource_fork_entry_id ) - { - if ( FT_READ_LONG( entry_offset ) || - FT_READ_LONG( entry_length ) ) - continue; - *result_offset = entry_offset; - - return FT_Err_Ok; - } - else - { - error = FT_Stream_Skip( stream, 4 + 4 ); /* offset + length */ - if ( error ) - return error; - } - } - - return FT_THROW( Unknown_File_Format ); - } - - - static FT_Error - raccess_guess_linux_double_from_file_name( FT_Library library, - char *file_name, - FT_Long *result_offset ) - { - FT_Open_Args args2; - FT_Stream stream2; - char * nouse = NULL; - FT_Error error; - - - args2.flags = FT_OPEN_PATHNAME; - args2.pathname = file_name; - error = FT_Stream_New( library, &args2, &stream2 ); - if ( error ) - return error; - - error = raccess_guess_apple_double( library, stream2, file_name, - &nouse, result_offset ); - - FT_Stream_Free( stream2, 0 ); - - return error; - } - - - static char* - raccess_make_file_name( FT_Memory memory, - const char *original_name, - const char *insertion ) - { - char* new_name = NULL; - const char* tmp; - const char* slash; - size_t new_length; - FT_Error error = FT_Err_Ok; - - FT_UNUSED( error ); - - - new_length = ft_strlen( original_name ) + ft_strlen( insertion ); - if ( FT_ALLOC( new_name, new_length + 1 ) ) - return NULL; - - tmp = ft_strrchr( original_name, '/' ); - if ( tmp ) - { - ft_strncpy( new_name, - original_name, - (size_t)( tmp - original_name + 1 ) ); - new_name[tmp - original_name + 1] = '\0'; - slash = tmp + 1; - } - else - { - slash = original_name; - new_name[0] = '\0'; - } - - ft_strcat( new_name, insertion ); - ft_strcat( new_name, slash ); - - return new_name; - } - - -#else /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ - - - /*************************************************************************/ - /* Dummy function; just sets errors */ - /*************************************************************************/ - - FT_BASE_DEF( void ) - FT_Raccess_Guess( FT_Library library, - FT_Stream stream, - char *base_name, - char **new_names, - FT_Long *offsets, - FT_Error *errors ) - { - FT_Int i; - - FT_UNUSED( library ); - FT_UNUSED( stream ); - FT_UNUSED( base_name ); - - - for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) - { - new_names[i] = NULL; - offsets[i] = 0; - errors[i] = FT_ERR( Unimplemented_Feature ); - } - } - - -#endif /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ - - -/* END */ diff --git a/3party/freetype/src/base/ftsnames.c b/3party/freetype/src/base/ftsnames.c deleted file mode 100644 index 80304e5c85..0000000000 --- a/3party/freetype/src/base/ftsnames.c +++ /dev/null @@ -1,94 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsnames.c */ -/* */ -/* Simple interface to access SFNT name tables (which are used */ -/* to hold font names, copyright info, notices, etc.) (body). */ -/* */ -/* This is _not_ used to retrieve glyph names! */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_SFNT_NAMES_H -#include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_INTERNAL_STREAM_H - - -#ifdef TT_CONFIG_OPTION_SFNT_NAMES - - - /* documentation is in ftsnames.h */ - - FT_EXPORT_DEF( FT_UInt ) - FT_Get_Sfnt_Name_Count( FT_Face face ) - { - return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0; - } - - - /* documentation is in ftsnames.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Sfnt_Name( FT_Face face, - FT_UInt idx, - FT_SfntName *aname ) - { - FT_Error error = FT_ERR( Invalid_Argument ); - - - if ( aname && face && FT_IS_SFNT( face ) ) - { - TT_Face ttface = (TT_Face)face; - - - if ( idx < (FT_UInt)ttface->num_names ) - { - TT_NameEntryRec* entry = ttface->name_table.names + idx; - - - /* load name on demand */ - if ( entry->stringLength > 0 && entry->string == NULL ) - { - FT_Memory memory = face->memory; - FT_Stream stream = face->stream; - - - if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || - FT_STREAM_SEEK( entry->stringOffset ) || - FT_STREAM_READ( entry->string, entry->stringLength ) ) - { - FT_FREE( entry->string ); - entry->stringLength = 0; - } - } - - aname->platform_id = entry->platformID; - aname->encoding_id = entry->encodingID; - aname->language_id = entry->languageID; - aname->name_id = entry->nameID; - aname->string = (FT_Byte*)entry->string; - aname->string_len = entry->stringLength; - - error = FT_Err_Ok; - } - } - - return error; - } - - -#endif /* TT_CONFIG_OPTION_SFNT_NAMES */ - - -/* END */ diff --git a/3party/freetype/src/base/ftstream.c b/3party/freetype/src/base/ftstream.c deleted file mode 100644 index b68f3f82d2..0000000000 --- a/3party/freetype/src/base/ftstream.c +++ /dev/null @@ -1,860 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftstream.c */ -/* */ -/* I/O stream support (body). */ -/* */ -/* Copyright 2000-2015 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 <ft2build.h> -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_stream - - - FT_BASE_DEF( void ) - FT_Stream_OpenMemory( FT_Stream stream, - const FT_Byte* base, - FT_ULong size ) - { - stream->base = (FT_Byte*) base; - stream->size = size; - stream->pos = 0; - stream->cursor = NULL; - stream->read = NULL; - stream->close = NULL; - } - - - FT_BASE_DEF( void ) - FT_Stream_Close( FT_Stream stream ) - { - if ( stream && stream->close ) - stream->close( stream ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_Seek( FT_Stream stream, - FT_ULong pos ) - { - FT_Error error = FT_Err_Ok; - - - if ( stream->read ) - { - if ( stream->read( stream, pos, 0, 0 ) ) - { - FT_ERROR(( "FT_Stream_Seek:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - pos, stream->size )); - - error = FT_THROW( Invalid_Stream_Operation ); - } - } - /* note that seeking to the first position after the file is valid */ - else if ( pos > stream->size ) - { - FT_ERROR(( "FT_Stream_Seek:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - pos, stream->size )); - - error = FT_THROW( Invalid_Stream_Operation ); - } - - if ( !error ) - stream->pos = pos; - - return error; - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_Skip( FT_Stream stream, - FT_Long distance ) - { - if ( distance < 0 ) - return FT_THROW( Invalid_Stream_Operation ); - - return FT_Stream_Seek( stream, stream->pos + (FT_ULong)distance ); - } - - - FT_BASE_DEF( FT_ULong ) - FT_Stream_Pos( FT_Stream stream ) - { - return stream->pos; - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_Read( FT_Stream stream, - FT_Byte* buffer, - FT_ULong count ) - { - return FT_Stream_ReadAt( stream, stream->pos, buffer, count ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_ReadAt( FT_Stream stream, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ) - { - FT_Error error = FT_Err_Ok; - FT_ULong read_bytes; - - - if ( pos >= stream->size ) - { - FT_ERROR(( "FT_Stream_ReadAt:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - pos, stream->size )); - - return FT_THROW( Invalid_Stream_Operation ); - } - - if ( stream->read ) - read_bytes = stream->read( stream, pos, buffer, count ); - else - { - read_bytes = stream->size - pos; - if ( read_bytes > count ) - read_bytes = count; - - FT_MEM_COPY( buffer, stream->base + pos, read_bytes ); - } - - stream->pos = pos + read_bytes; - - if ( read_bytes < count ) - { - FT_ERROR(( "FT_Stream_ReadAt:" - " invalid read; expected %lu bytes, got %lu\n", - count, read_bytes )); - - error = FT_THROW( Invalid_Stream_Operation ); - } - - return error; - } - - - FT_BASE_DEF( FT_ULong ) - FT_Stream_TryRead( FT_Stream stream, - FT_Byte* buffer, - FT_ULong count ) - { - FT_ULong read_bytes = 0; - - - if ( stream->pos >= stream->size ) - goto Exit; - - if ( stream->read ) - read_bytes = stream->read( stream, stream->pos, buffer, count ); - else - { - read_bytes = stream->size - stream->pos; - if ( read_bytes > count ) - read_bytes = count; - - FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes ); - } - - stream->pos += read_bytes; - - Exit: - return read_bytes; - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_ExtractFrame( FT_Stream stream, - FT_ULong count, - FT_Byte** pbytes ) - { - FT_Error error; - - - error = FT_Stream_EnterFrame( stream, count ); - if ( !error ) - { - *pbytes = (FT_Byte*)stream->cursor; - - /* equivalent to FT_Stream_ExitFrame(), with no memory block release */ - stream->cursor = NULL; - stream->limit = NULL; - } - - return error; - } - - - FT_BASE_DEF( void ) - FT_Stream_ReleaseFrame( FT_Stream stream, - FT_Byte** pbytes ) - { - if ( stream && stream->read ) - { - FT_Memory memory = stream->memory; - -#ifdef FT_DEBUG_MEMORY - ft_mem_free( memory, *pbytes ); - *pbytes = NULL; -#else - FT_FREE( *pbytes ); -#endif - } - *pbytes = NULL; - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_EnterFrame( FT_Stream stream, - FT_ULong count ) - { - FT_Error error = FT_Err_Ok; - FT_ULong read_bytes; - - - /* check for nested frame access */ - FT_ASSERT( stream && stream->cursor == 0 ); - - if ( stream->read ) - { - /* allocate the frame in memory */ - FT_Memory memory = stream->memory; - - - /* simple sanity check */ - if ( count > stream->size ) - { - FT_ERROR(( "FT_Stream_EnterFrame:" - " frame size (%lu) larger than stream size (%lu)\n", - count, stream->size )); - - error = FT_THROW( Invalid_Stream_Operation ); - goto Exit; - } - -#ifdef FT_DEBUG_MEMORY - /* assume _ft_debug_file and _ft_debug_lineno are already set */ - stream->base = (unsigned char*)ft_mem_qalloc( memory, - (FT_Long)count, - &error ); - if ( error ) - goto Exit; -#else - if ( FT_QALLOC( stream->base, count ) ) - goto Exit; -#endif - /* read it */ - read_bytes = stream->read( stream, stream->pos, - stream->base, count ); - if ( read_bytes < count ) - { - FT_ERROR(( "FT_Stream_EnterFrame:" - " invalid read; expected %lu bytes, got %lu\n", - count, read_bytes )); - - FT_FREE( stream->base ); - error = FT_THROW( Invalid_Stream_Operation ); - } - stream->cursor = stream->base; - stream->limit = stream->cursor + count; - stream->pos += read_bytes; - } - else - { - /* check current and new position */ - if ( stream->pos >= stream->size || - stream->size - stream->pos < count ) - { - FT_ERROR(( "FT_Stream_EnterFrame:" - " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n", - stream->pos, count, stream->size )); - - error = FT_THROW( Invalid_Stream_Operation ); - goto Exit; - } - - /* set cursor */ - stream->cursor = stream->base + stream->pos; - stream->limit = stream->cursor + count; - stream->pos += count; - } - - Exit: - return error; - } - - - FT_BASE_DEF( void ) - FT_Stream_ExitFrame( FT_Stream stream ) - { - /* IMPORTANT: The assertion stream->cursor != 0 was removed, given */ - /* that it is possible to access a frame of length 0 in */ - /* some weird fonts (usually, when accessing an array of */ - /* 0 records, like in some strange kern tables). */ - /* */ - /* In this case, the loader code handles the 0-length table */ - /* gracefully; however, stream.cursor is really set to 0 by the */ - /* FT_Stream_EnterFrame() call, and this is not an error. */ - /* */ - FT_ASSERT( stream ); - - if ( stream->read ) - { - FT_Memory memory = stream->memory; - -#ifdef FT_DEBUG_MEMORY - ft_mem_free( memory, stream->base ); - stream->base = NULL; -#else - FT_FREE( stream->base ); -#endif - } - stream->cursor = NULL; - stream->limit = NULL; - } - - - FT_BASE_DEF( FT_Char ) - FT_Stream_GetChar( FT_Stream stream ) - { - FT_Char result; - - - FT_ASSERT( stream && stream->cursor ); - - result = 0; - if ( stream->cursor < stream->limit ) - result = (FT_Char)*stream->cursor++; - - return result; - } - - - FT_BASE_DEF( FT_UShort ) - FT_Stream_GetUShort( FT_Stream stream ) - { - FT_Byte* p; - FT_UShort result; - - - FT_ASSERT( stream && stream->cursor ); - - result = 0; - p = stream->cursor; - if ( p + 1 < stream->limit ) - result = FT_NEXT_USHORT( p ); - stream->cursor = p; - - return result; - } - - - FT_BASE_DEF( FT_UShort ) - FT_Stream_GetUShortLE( FT_Stream stream ) - { - FT_Byte* p; - FT_UShort result; - - - FT_ASSERT( stream && stream->cursor ); - - result = 0; - p = stream->cursor; - if ( p + 1 < stream->limit ) - result = FT_NEXT_USHORT_LE( p ); - stream->cursor = p; - - return result; - } - - - FT_BASE_DEF( FT_ULong ) - FT_Stream_GetUOffset( FT_Stream stream ) - { - FT_Byte* p; - FT_ULong result; - - - FT_ASSERT( stream && stream->cursor ); - - result = 0; - p = stream->cursor; - if ( p + 2 < stream->limit ) - result = FT_NEXT_UOFF3( p ); - stream->cursor = p; - return result; - } - - - FT_BASE_DEF( FT_ULong ) - FT_Stream_GetULong( FT_Stream stream ) - { - FT_Byte* p; - FT_ULong result; - - - FT_ASSERT( stream && stream->cursor ); - - result = 0; - p = stream->cursor; - if ( p + 3 < stream->limit ) - result = FT_NEXT_ULONG( p ); - stream->cursor = p; - return result; - } - - - FT_BASE_DEF( FT_ULong ) - FT_Stream_GetULongLE( FT_Stream stream ) - { - FT_Byte* p; - FT_ULong result; - - - FT_ASSERT( stream && stream->cursor ); - - result = 0; - p = stream->cursor; - if ( p + 3 < stream->limit ) - result = FT_NEXT_ULONG_LE( p ); - stream->cursor = p; - return result; - } - - - FT_BASE_DEF( FT_Char ) - FT_Stream_ReadChar( FT_Stream stream, - FT_Error* error ) - { - FT_Byte result = 0; - - - FT_ASSERT( stream ); - - *error = FT_Err_Ok; - - if ( stream->read ) - { - if ( stream->read( stream, stream->pos, &result, 1L ) != 1L ) - goto Fail; - } - else - { - if ( stream->pos < stream->size ) - result = stream->base[stream->pos]; - else - goto Fail; - } - stream->pos++; - - return (FT_Char)result; - - Fail: - *error = FT_THROW( Invalid_Stream_Operation ); - FT_ERROR(( "FT_Stream_ReadChar:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - stream->pos, stream->size )); - - return 0; - } - - - FT_BASE_DEF( FT_UShort ) - FT_Stream_ReadUShort( FT_Stream stream, - FT_Error* error ) - { - FT_Byte reads[2]; - FT_Byte* p = 0; - FT_UShort result = 0; - - - FT_ASSERT( stream ); - - *error = FT_Err_Ok; - - if ( stream->pos + 1 < stream->size ) - { - if ( stream->read ) - { - if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) - goto Fail; - - p = reads; - } - else - p = stream->base + stream->pos; - - if ( p ) - result = FT_NEXT_USHORT( p ); - } - else - goto Fail; - - stream->pos += 2; - - return result; - - Fail: - *error = FT_THROW( Invalid_Stream_Operation ); - FT_ERROR(( "FT_Stream_ReadUShort:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - stream->pos, stream->size )); - - return 0; - } - - - FT_BASE_DEF( FT_UShort ) - FT_Stream_ReadUShortLE( FT_Stream stream, - FT_Error* error ) - { - FT_Byte reads[2]; - FT_Byte* p = 0; - FT_UShort result = 0; - - - FT_ASSERT( stream ); - - *error = FT_Err_Ok; - - if ( stream->pos + 1 < stream->size ) - { - if ( stream->read ) - { - if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) - goto Fail; - - p = reads; - } - else - p = stream->base + stream->pos; - - if ( p ) - result = FT_NEXT_USHORT_LE( p ); - } - else - goto Fail; - - stream->pos += 2; - - return result; - - Fail: - *error = FT_THROW( Invalid_Stream_Operation ); - FT_ERROR(( "FT_Stream_ReadUShortLE:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - stream->pos, stream->size )); - - return 0; - } - - - FT_BASE_DEF( FT_ULong ) - FT_Stream_ReadUOffset( FT_Stream stream, - FT_Error* error ) - { - FT_Byte reads[3]; - FT_Byte* p = 0; - FT_ULong result = 0; - - - FT_ASSERT( stream ); - - *error = FT_Err_Ok; - - if ( stream->pos + 2 < stream->size ) - { - if ( stream->read ) - { - if (stream->read( stream, stream->pos, reads, 3L ) != 3L ) - goto Fail; - - p = reads; - } - else - p = stream->base + stream->pos; - - if ( p ) - result = FT_NEXT_UOFF3( p ); - } - else - goto Fail; - - stream->pos += 3; - - return result; - - Fail: - *error = FT_THROW( Invalid_Stream_Operation ); - FT_ERROR(( "FT_Stream_ReadUOffset:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - stream->pos, stream->size )); - - return 0; - } - - - FT_BASE_DEF( FT_ULong ) - FT_Stream_ReadULong( FT_Stream stream, - FT_Error* error ) - { - FT_Byte reads[4]; - FT_Byte* p = 0; - FT_ULong result = 0; - - - FT_ASSERT( stream ); - - *error = FT_Err_Ok; - - if ( stream->pos + 3 < stream->size ) - { - if ( stream->read ) - { - if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) - goto Fail; - - p = reads; - } - else - p = stream->base + stream->pos; - - if ( p ) - result = FT_NEXT_ULONG( p ); - } - else - goto Fail; - - stream->pos += 4; - - return result; - - Fail: - *error = FT_THROW( Invalid_Stream_Operation ); - FT_ERROR(( "FT_Stream_ReadULong:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - stream->pos, stream->size )); - - return 0; - } - - - FT_BASE_DEF( FT_ULong ) - FT_Stream_ReadULongLE( FT_Stream stream, - FT_Error* error ) - { - FT_Byte reads[4]; - FT_Byte* p = 0; - FT_ULong result = 0; - - - FT_ASSERT( stream ); - - *error = FT_Err_Ok; - - if ( stream->pos + 3 < stream->size ) - { - if ( stream->read ) - { - if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) - goto Fail; - - p = reads; - } - else - p = stream->base + stream->pos; - - if ( p ) - result = FT_NEXT_ULONG_LE( p ); - } - else - goto Fail; - - stream->pos += 4; - - return result; - - Fail: - *error = FT_THROW( Invalid_Stream_Operation ); - FT_ERROR(( "FT_Stream_ReadULongLE:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - stream->pos, stream->size )); - - return 0; - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_ReadFields( FT_Stream stream, - const FT_Frame_Field* fields, - void* structure ) - { - FT_Error error; - FT_Bool frame_accessed = 0; - FT_Byte* cursor; - - - if ( !fields ) - return FT_THROW( Invalid_Argument ); - - if ( !stream ) - return FT_THROW( Invalid_Stream_Handle ); - - cursor = stream->cursor; - - error = FT_Err_Ok; - do - { - FT_ULong value; - FT_Int sign_shift; - FT_Byte* p; - - - switch ( fields->value ) - { - case ft_frame_start: /* access a new frame */ - error = FT_Stream_EnterFrame( stream, fields->offset ); - if ( error ) - goto Exit; - - frame_accessed = 1; - cursor = stream->cursor; - fields++; - continue; /* loop! */ - - case ft_frame_bytes: /* read a byte sequence */ - case ft_frame_skip: /* skip some bytes */ - { - FT_UInt len = fields->size; - - - if ( cursor + len > stream->limit ) - { - error = FT_THROW( Invalid_Stream_Operation ); - goto Exit; - } - - if ( fields->value == ft_frame_bytes ) - { - p = (FT_Byte*)structure + fields->offset; - FT_MEM_COPY( p, cursor, len ); - } - cursor += len; - fields++; - continue; - } - - case ft_frame_byte: - case ft_frame_schar: /* read a single byte */ - value = FT_NEXT_BYTE( cursor ); - sign_shift = 24; - break; - - case ft_frame_short_be: - case ft_frame_ushort_be: /* read a 2-byte big-endian short */ - value = FT_NEXT_USHORT( cursor) ; - sign_shift = 16; - break; - - case ft_frame_short_le: - case ft_frame_ushort_le: /* read a 2-byte little-endian short */ - value = FT_NEXT_USHORT_LE( cursor ); - sign_shift = 16; - break; - - case ft_frame_long_be: - case ft_frame_ulong_be: /* read a 4-byte big-endian long */ - value = FT_NEXT_ULONG( cursor ); - sign_shift = 0; - break; - - case ft_frame_long_le: - case ft_frame_ulong_le: /* read a 4-byte little-endian long */ - value = FT_NEXT_ULONG_LE( cursor ); - sign_shift = 0; - break; - - case ft_frame_off3_be: - case ft_frame_uoff3_be: /* read a 3-byte big-endian long */ - value = FT_NEXT_UOFF3( cursor ); - sign_shift = 8; - break; - - case ft_frame_off3_le: - case ft_frame_uoff3_le: /* read a 3-byte little-endian long */ - value = FT_NEXT_UOFF3_LE( cursor ); - sign_shift = 8; - break; - - default: - /* otherwise, exit the loop */ - stream->cursor = cursor; - goto Exit; - } - - /* now, compute the signed value is necessary */ - if ( fields->value & FT_FRAME_OP_SIGNED ) - value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift ); - - /* finally, store the value in the object */ - - p = (FT_Byte*)structure + fields->offset; - switch ( fields->size ) - { - case ( 8 / FT_CHAR_BIT ): - *(FT_Byte*)p = (FT_Byte)value; - break; - - case ( 16 / FT_CHAR_BIT ): - *(FT_UShort*)p = (FT_UShort)value; - break; - - case ( 32 / FT_CHAR_BIT ): - *(FT_UInt32*)p = (FT_UInt32)value; - break; - - default: /* for 64-bit systems */ - *(FT_ULong*)p = (FT_ULong)value; - } - - /* go to next field */ - fields++; - } - while ( 1 ); - - Exit: - /* close the frame if it was opened by this read */ - if ( frame_accessed ) - FT_Stream_ExitFrame( stream ); - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftstroke.c b/3party/freetype/src/base/ftstroke.c deleted file mode 100644 index fecb3cc25c..0000000000 --- a/3party/freetype/src/base/ftstroke.c +++ /dev/null @@ -1,2468 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftstroke.c */ -/* */ -/* FreeType path stroker (body). */ -/* */ -/* Copyright 2002-2015 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 <ft2build.h> -#include FT_STROKER_H -#include FT_TRIGONOMETRY_H -#include FT_OUTLINE_H -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H - -#include "basepic.h" - - - /* declare an extern to access `ft_outline_glyph_class' globally */ - /* allocated in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */ - /* macro to access it when FT_CONFIG_OPTION_PIC is defined */ -#ifndef FT_CONFIG_OPTION_PIC - FT_CALLBACK_TABLE const FT_Glyph_Class ft_outline_glyph_class; -#endif - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_StrokerBorder ) - FT_Outline_GetInsideBorder( FT_Outline* outline ) - { - FT_Orientation o = FT_Outline_Get_Orientation( outline ); - - - return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT - : FT_STROKER_BORDER_LEFT; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_StrokerBorder ) - FT_Outline_GetOutsideBorder( FT_Outline* outline ) - { - FT_Orientation o = FT_Outline_Get_Orientation( outline ); - - - return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT - : FT_STROKER_BORDER_RIGHT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** BEZIER COMPUTATIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define FT_SMALL_CONIC_THRESHOLD ( FT_ANGLE_PI / 6 ) -#define FT_SMALL_CUBIC_THRESHOLD ( FT_ANGLE_PI / 8 ) - -#define FT_EPSILON 2 - -#define FT_IS_SMALL( x ) ( (x) > -FT_EPSILON && (x) < FT_EPSILON ) - - - static FT_Pos - ft_pos_abs( FT_Pos x ) - { - return x >= 0 ? x : -x; - } - - - static void - ft_conic_split( FT_Vector* base ) - { - FT_Pos a, b; - - - base[4].x = base[2].x; - b = base[1].x; - a = base[3].x = ( base[2].x + b ) / 2; - b = base[1].x = ( base[0].x + b ) / 2; - base[2].x = ( a + b ) / 2; - - base[4].y = base[2].y; - b = base[1].y; - a = base[3].y = ( base[2].y + b ) / 2; - b = base[1].y = ( base[0].y + b ) / 2; - base[2].y = ( a + b ) / 2; - } - - - static FT_Bool - ft_conic_is_small_enough( FT_Vector* base, - FT_Angle *angle_in, - FT_Angle *angle_out ) - { - FT_Vector d1, d2; - FT_Angle theta; - FT_Int close1, close2; - - - d1.x = base[1].x - base[2].x; - d1.y = base[1].y - base[2].y; - d2.x = base[0].x - base[1].x; - d2.y = base[0].y - base[1].y; - - close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); - close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); - - if ( close1 ) - { - if ( close2 ) - { - /* basically a point; */ - /* do nothing to retain original direction */ - } - else - { - *angle_in = - *angle_out = FT_Atan2( d2.x, d2.y ); - } - } - else /* !close1 */ - { - if ( close2 ) - { - *angle_in = - *angle_out = FT_Atan2( d1.x, d1.y ); - } - else - { - *angle_in = FT_Atan2( d1.x, d1.y ); - *angle_out = FT_Atan2( d2.x, d2.y ); - } - } - - theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) ); - - return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD ); - } - - - static void - ft_cubic_split( FT_Vector* base ) - { - FT_Pos a, b, c, d; - - - base[6].x = base[3].x; - c = base[1].x; - d = base[2].x; - base[1].x = a = ( base[0].x + c ) / 2; - base[5].x = b = ( base[3].x + d ) / 2; - c = ( c + d ) / 2; - base[2].x = a = ( a + c ) / 2; - base[4].x = b = ( b + c ) / 2; - base[3].x = ( a + b ) / 2; - - base[6].y = base[3].y; - c = base[1].y; - d = base[2].y; - base[1].y = a = ( base[0].y + c ) / 2; - base[5].y = b = ( base[3].y + d ) / 2; - c = ( c + d ) / 2; - base[2].y = a = ( a + c ) / 2; - base[4].y = b = ( b + c ) / 2; - base[3].y = ( a + b ) / 2; - } - - - /* Return the average of `angle1' and `angle2'. */ - /* This gives correct result even if `angle1' and `angle2' */ - /* have opposite signs. */ - static FT_Angle - ft_angle_mean( FT_Angle angle1, - FT_Angle angle2 ) - { - return angle1 + FT_Angle_Diff( angle1, angle2 ) / 2; - } - - - static FT_Bool - ft_cubic_is_small_enough( FT_Vector* base, - FT_Angle *angle_in, - FT_Angle *angle_mid, - FT_Angle *angle_out ) - { - FT_Vector d1, d2, d3; - FT_Angle theta1, theta2; - FT_Int close1, close2, close3; - - - d1.x = base[2].x - base[3].x; - d1.y = base[2].y - base[3].y; - d2.x = base[1].x - base[2].x; - d2.y = base[1].y - base[2].y; - d3.x = base[0].x - base[1].x; - d3.y = base[0].y - base[1].y; - - close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); - close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); - close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y ); - - if ( close1 ) - { - if ( close2 ) - { - if ( close3 ) - { - /* basically a point; */ - /* do nothing to retain original direction */ - } - else /* !close3 */ - { - *angle_in = - *angle_mid = - *angle_out = FT_Atan2( d3.x, d3.y ); - } - } - else /* !close2 */ - { - if ( close3 ) - { - *angle_in = - *angle_mid = - *angle_out = FT_Atan2( d2.x, d2.y ); - } - else /* !close3 */ - { - *angle_in = - *angle_mid = FT_Atan2( d2.x, d2.y ); - *angle_out = FT_Atan2( d3.x, d3.y ); - } - } - } - else /* !close1 */ - { - if ( close2 ) - { - if ( close3 ) - { - *angle_in = - *angle_mid = - *angle_out = FT_Atan2( d1.x, d1.y ); - } - else /* !close3 */ - { - *angle_in = FT_Atan2( d1.x, d1.y ); - *angle_out = FT_Atan2( d3.x, d3.y ); - *angle_mid = ft_angle_mean( *angle_in, *angle_out ); - } - } - else /* !close2 */ - { - if ( close3 ) - { - *angle_in = FT_Atan2( d1.x, d1.y ); - *angle_mid = - *angle_out = FT_Atan2( d2.x, d2.y ); - } - else /* !close3 */ - { - *angle_in = FT_Atan2( d1.x, d1.y ); - *angle_mid = FT_Atan2( d2.x, d2.y ); - *angle_out = FT_Atan2( d3.x, d3.y ); - } - } - } - - theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_mid ) ); - theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) ); - - return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD && - theta2 < FT_SMALL_CUBIC_THRESHOLD ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** STROKE BORDERS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef enum FT_StrokeTags_ - { - FT_STROKE_TAG_ON = 1, /* on-curve point */ - FT_STROKE_TAG_CUBIC = 2, /* cubic off-point */ - FT_STROKE_TAG_BEGIN = 4, /* sub-path start */ - FT_STROKE_TAG_END = 8 /* sub-path end */ - - } FT_StrokeTags; - -#define FT_STROKE_TAG_BEGIN_END ( FT_STROKE_TAG_BEGIN | FT_STROKE_TAG_END ) - - typedef struct FT_StrokeBorderRec_ - { - FT_UInt num_points; - FT_UInt max_points; - FT_Vector* points; - FT_Byte* tags; - FT_Bool movable; /* TRUE for ends of lineto borders */ - FT_Int start; /* index of current sub-path start point */ - FT_Memory memory; - FT_Bool valid; - - } FT_StrokeBorderRec, *FT_StrokeBorder; - - - static FT_Error - ft_stroke_border_grow( FT_StrokeBorder border, - FT_UInt new_points ) - { - FT_UInt old_max = border->max_points; - FT_UInt new_max = border->num_points + new_points; - FT_Error error = FT_Err_Ok; - - - if ( new_max > old_max ) - { - FT_UInt cur_max = old_max; - FT_Memory memory = border->memory; - - - while ( cur_max < new_max ) - cur_max += ( cur_max >> 1 ) + 16; - - if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) || - FT_RENEW_ARRAY( border->tags, old_max, cur_max ) ) - goto Exit; - - border->max_points = cur_max; - } - - Exit: - return error; - } - - - static void - ft_stroke_border_close( FT_StrokeBorder border, - FT_Bool reverse ) - { - FT_UInt start = (FT_UInt)border->start; - FT_UInt count = border->num_points; - - - FT_ASSERT( border->start >= 0 ); - - /* don't record empty paths! */ - if ( count <= start + 1U ) - border->num_points = start; - else - { - /* copy the last point to the start of this sub-path, since */ - /* it contains the `adjusted' starting coordinates */ - border->num_points = --count; - border->points[start] = border->points[count]; - - if ( reverse ) - { - /* reverse the points */ - { - FT_Vector* vec1 = border->points + start + 1; - FT_Vector* vec2 = border->points + count - 1; - - - for ( ; vec1 < vec2; vec1++, vec2-- ) - { - FT_Vector tmp; - - - tmp = *vec1; - *vec1 = *vec2; - *vec2 = tmp; - } - } - - /* then the tags */ - { - FT_Byte* tag1 = border->tags + start + 1; - FT_Byte* tag2 = border->tags + count - 1; - - - for ( ; tag1 < tag2; tag1++, tag2-- ) - { - FT_Byte tmp; - - - tmp = *tag1; - *tag1 = *tag2; - *tag2 = tmp; - } - } - } - - border->tags[start ] |= FT_STROKE_TAG_BEGIN; - border->tags[count - 1] |= FT_STROKE_TAG_END; - } - - border->start = -1; - border->movable = FALSE; - } - - - static FT_Error - ft_stroke_border_lineto( FT_StrokeBorder border, - FT_Vector* to, - FT_Bool movable ) - { - FT_Error error = FT_Err_Ok; - - - FT_ASSERT( border->start >= 0 ); - - if ( border->movable ) - { - /* move last point */ - border->points[border->num_points - 1] = *to; - } - else - { - /* don't add zero-length lineto */ - if ( border->num_points > 0 && - FT_IS_SMALL( border->points[border->num_points - 1].x - to->x ) && - FT_IS_SMALL( border->points[border->num_points - 1].y - to->y ) ) - return error; - - /* add one point */ - error = ft_stroke_border_grow( border, 1 ); - if ( !error ) - { - FT_Vector* vec = border->points + border->num_points; - FT_Byte* tag = border->tags + border->num_points; - - - vec[0] = *to; - tag[0] = FT_STROKE_TAG_ON; - - border->num_points += 1; - } - } - border->movable = movable; - return error; - } - - - static FT_Error - ft_stroke_border_conicto( FT_StrokeBorder border, - FT_Vector* control, - FT_Vector* to ) - { - FT_Error error; - - - FT_ASSERT( border->start >= 0 ); - - error = ft_stroke_border_grow( border, 2 ); - if ( !error ) - { - FT_Vector* vec = border->points + border->num_points; - FT_Byte* tag = border->tags + border->num_points; - - - vec[0] = *control; - vec[1] = *to; - - tag[0] = 0; - tag[1] = FT_STROKE_TAG_ON; - - border->num_points += 2; - } - - border->movable = FALSE; - - return error; - } - - - static FT_Error - ft_stroke_border_cubicto( FT_StrokeBorder border, - FT_Vector* control1, - FT_Vector* control2, - FT_Vector* to ) - { - FT_Error error; - - - FT_ASSERT( border->start >= 0 ); - - error = ft_stroke_border_grow( border, 3 ); - if ( !error ) - { - FT_Vector* vec = border->points + border->num_points; - FT_Byte* tag = border->tags + border->num_points; - - - vec[0] = *control1; - vec[1] = *control2; - vec[2] = *to; - - tag[0] = FT_STROKE_TAG_CUBIC; - tag[1] = FT_STROKE_TAG_CUBIC; - tag[2] = FT_STROKE_TAG_ON; - - border->num_points += 3; - } - - border->movable = FALSE; - - return error; - } - - -#define FT_ARC_CUBIC_ANGLE ( FT_ANGLE_PI / 2 ) - - - static FT_Error - ft_stroke_border_arcto( FT_StrokeBorder border, - FT_Vector* center, - FT_Fixed radius, - FT_Angle angle_start, - FT_Angle angle_diff ) - { - FT_Angle total, angle, step, rotate, next, theta; - FT_Vector a, b, a2, b2; - FT_Fixed length; - FT_Error error = FT_Err_Ok; - - - /* compute start point */ - FT_Vector_From_Polar( &a, radius, angle_start ); - a.x += center->x; - a.y += center->y; - - total = angle_diff; - angle = angle_start; - rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2; - - while ( total != 0 ) - { - step = total; - if ( step > FT_ARC_CUBIC_ANGLE ) - step = FT_ARC_CUBIC_ANGLE; - - else if ( step < -FT_ARC_CUBIC_ANGLE ) - step = -FT_ARC_CUBIC_ANGLE; - - next = angle + step; - theta = step; - if ( theta < 0 ) - theta = -theta; - - theta >>= 1; - - /* compute end point */ - FT_Vector_From_Polar( &b, radius, next ); - b.x += center->x; - b.y += center->y; - - /* compute first and second control points */ - length = FT_MulDiv( radius, FT_Sin( theta ) * 4, - ( 0x10000L + FT_Cos( theta ) ) * 3 ); - - FT_Vector_From_Polar( &a2, length, angle + rotate ); - a2.x += a.x; - a2.y += a.y; - - FT_Vector_From_Polar( &b2, length, next - rotate ); - b2.x += b.x; - b2.y += b.y; - - /* add cubic arc */ - error = ft_stroke_border_cubicto( border, &a2, &b2, &b ); - if ( error ) - break; - - /* process the rest of the arc ?? */ - a = b; - total -= step; - angle = next; - } - - return error; - } - - - static FT_Error - ft_stroke_border_moveto( FT_StrokeBorder border, - FT_Vector* to ) - { - /* close current open path if any ? */ - if ( border->start >= 0 ) - ft_stroke_border_close( border, FALSE ); - - border->start = (FT_Int)border->num_points; - border->movable = FALSE; - - return ft_stroke_border_lineto( border, to, FALSE ); - } - - - static void - ft_stroke_border_init( FT_StrokeBorder border, - FT_Memory memory ) - { - border->memory = memory; - border->points = NULL; - border->tags = NULL; - - border->num_points = 0; - border->max_points = 0; - border->start = -1; - border->valid = FALSE; - } - - - static void - ft_stroke_border_reset( FT_StrokeBorder border ) - { - border->num_points = 0; - border->start = -1; - border->valid = FALSE; - } - - - static void - ft_stroke_border_done( FT_StrokeBorder border ) - { - FT_Memory memory = border->memory; - - - FT_FREE( border->points ); - FT_FREE( border->tags ); - - border->num_points = 0; - border->max_points = 0; - border->start = -1; - border->valid = FALSE; - } - - - static FT_Error - ft_stroke_border_get_counts( FT_StrokeBorder border, - FT_UInt *anum_points, - FT_UInt *anum_contours ) - { - FT_Error error = FT_Err_Ok; - FT_UInt num_points = 0; - FT_UInt num_contours = 0; - - FT_UInt count = border->num_points; - FT_Vector* point = border->points; - FT_Byte* tags = border->tags; - FT_Int in_contour = 0; - - - for ( ; count > 0; count--, num_points++, point++, tags++ ) - { - if ( tags[0] & FT_STROKE_TAG_BEGIN ) - { - if ( in_contour != 0 ) - goto Fail; - - in_contour = 1; - } - else if ( in_contour == 0 ) - goto Fail; - - if ( tags[0] & FT_STROKE_TAG_END ) - { - in_contour = 0; - num_contours++; - } - } - - if ( in_contour != 0 ) - goto Fail; - - border->valid = TRUE; - - Exit: - *anum_points = num_points; - *anum_contours = num_contours; - return error; - - Fail: - num_points = 0; - num_contours = 0; - goto Exit; - } - - - static void - ft_stroke_border_export( FT_StrokeBorder border, - FT_Outline* outline ) - { - /* copy point locations */ - FT_ARRAY_COPY( outline->points + outline->n_points, - border->points, - border->num_points ); - - /* copy tags */ - { - FT_UInt count = border->num_points; - FT_Byte* read = border->tags; - FT_Byte* write = (FT_Byte*)outline->tags + outline->n_points; - - - for ( ; count > 0; count--, read++, write++ ) - { - if ( *read & FT_STROKE_TAG_ON ) - *write = FT_CURVE_TAG_ON; - else if ( *read & FT_STROKE_TAG_CUBIC ) - *write = FT_CURVE_TAG_CUBIC; - else - *write = FT_CURVE_TAG_CONIC; - } - } - - /* copy contours */ - { - FT_UInt count = border->num_points; - FT_Byte* tags = border->tags; - FT_Short* write = outline->contours + outline->n_contours; - FT_Short idx = (FT_Short)outline->n_points; - - - for ( ; count > 0; count--, tags++, idx++ ) - { - if ( *tags & FT_STROKE_TAG_END ) - { - *write++ = idx; - outline->n_contours++; - } - } - } - - outline->n_points += (short)border->num_points; - - FT_ASSERT( FT_Outline_Check( outline ) == 0 ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** STROKER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define FT_SIDE_TO_ROTATE( s ) ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI ) - - typedef struct FT_StrokerRec_ - { - FT_Angle angle_in; /* direction into curr join */ - FT_Angle angle_out; /* direction out of join */ - FT_Vector center; /* current position */ - FT_Fixed line_length; /* length of last lineto */ - FT_Bool first_point; /* is this the start? */ - FT_Bool subpath_open; /* is the subpath open? */ - FT_Angle subpath_angle; /* subpath start direction */ - FT_Vector subpath_start; /* subpath start position */ - FT_Fixed subpath_line_length; /* subpath start lineto len */ - FT_Bool handle_wide_strokes; /* use wide strokes logic? */ - - FT_Stroker_LineCap line_cap; - FT_Stroker_LineJoin line_join; - FT_Stroker_LineJoin line_join_saved; - FT_Fixed miter_limit; - FT_Fixed radius; - - FT_StrokeBorderRec borders[2]; - FT_Library library; - - } FT_StrokerRec; - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_New( FT_Library library, - FT_Stroker *astroker ) - { - FT_Error error; /* assigned in FT_NEW */ - FT_Memory memory; - FT_Stroker stroker = NULL; - - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - if ( !astroker ) - return FT_THROW( Invalid_Argument ); - - memory = library->memory; - - if ( !FT_NEW( stroker ) ) - { - stroker->library = library; - - ft_stroke_border_init( &stroker->borders[0], memory ); - ft_stroke_border_init( &stroker->borders[1], memory ); - } - - *astroker = stroker; - - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( void ) - FT_Stroker_Set( FT_Stroker stroker, - FT_Fixed radius, - FT_Stroker_LineCap line_cap, - FT_Stroker_LineJoin line_join, - FT_Fixed miter_limit ) - { - if ( !stroker ) - return; - - stroker->radius = radius; - stroker->line_cap = line_cap; - stroker->line_join = line_join; - stroker->miter_limit = miter_limit; - - /* ensure miter limit has sensible value */ - if ( stroker->miter_limit < 0x10000L ) - stroker->miter_limit = 0x10000L; - - /* save line join style: */ - /* line join style can be temporarily changed when stroking curves */ - stroker->line_join_saved = line_join; - - FT_Stroker_Rewind( stroker ); - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( void ) - FT_Stroker_Rewind( FT_Stroker stroker ) - { - if ( stroker ) - { - ft_stroke_border_reset( &stroker->borders[0] ); - ft_stroke_border_reset( &stroker->borders[1] ); - } - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( void ) - FT_Stroker_Done( FT_Stroker stroker ) - { - if ( stroker ) - { - FT_Memory memory = stroker->library->memory; - - - ft_stroke_border_done( &stroker->borders[0] ); - ft_stroke_border_done( &stroker->borders[1] ); - - stroker->library = NULL; - FT_FREE( stroker ); - } - } - - - /* create a circular arc at a corner or cap */ - static FT_Error - ft_stroker_arcto( FT_Stroker stroker, - FT_Int side ) - { - FT_Angle total, rotate; - FT_Fixed radius = stroker->radius; - FT_Error error = FT_Err_Ok; - FT_StrokeBorder border = stroker->borders + side; - - - rotate = FT_SIDE_TO_ROTATE( side ); - - total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); - if ( total == FT_ANGLE_PI ) - total = -rotate * 2; - - error = ft_stroke_border_arcto( border, - &stroker->center, - radius, - stroker->angle_in + rotate, - total ); - border->movable = FALSE; - return error; - } - - - /* add a cap at the end of an opened path */ - static FT_Error - ft_stroker_cap( FT_Stroker stroker, - FT_Angle angle, - FT_Int side ) - { - FT_Error error = FT_Err_Ok; - - - if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND ) - { - /* add a round cap */ - stroker->angle_in = angle; - stroker->angle_out = angle + FT_ANGLE_PI; - - error = ft_stroker_arcto( stroker, side ); - } - else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE ) - { - /* add a square cap */ - FT_Vector delta, delta2; - FT_Angle rotate = FT_SIDE_TO_ROTATE( side ); - FT_Fixed radius = stroker->radius; - FT_StrokeBorder border = stroker->borders + side; - - - FT_Vector_From_Polar( &delta2, radius, angle + rotate ); - FT_Vector_From_Polar( &delta, radius, angle ); - - delta.x += stroker->center.x + delta2.x; - delta.y += stroker->center.y + delta2.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - FT_Vector_From_Polar( &delta2, radius, angle - rotate ); - FT_Vector_From_Polar( &delta, radius, angle ); - - delta.x += delta2.x + stroker->center.x; - delta.y += delta2.y + stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - } - else if ( stroker->line_cap == FT_STROKER_LINECAP_BUTT ) - { - /* add a butt ending */ - FT_Vector delta; - FT_Angle rotate = FT_SIDE_TO_ROTATE( side ); - FT_Fixed radius = stroker->radius; - FT_StrokeBorder border = stroker->borders + side; - - - FT_Vector_From_Polar( &delta, radius, angle + rotate ); - - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - FT_Vector_From_Polar( &delta, radius, angle - rotate ); - - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - } - - Exit: - return error; - } - - - /* process an inside corner, i.e. compute intersection */ - static FT_Error - ft_stroker_inside( FT_Stroker stroker, - FT_Int side, - FT_Fixed line_length ) - { - FT_StrokeBorder border = stroker->borders + side; - FT_Angle phi, theta, rotate; - FT_Fixed length, thcos; - FT_Vector delta; - FT_Error error = FT_Err_Ok; - FT_Bool intersect; /* use intersection of lines? */ - - - rotate = FT_SIDE_TO_ROTATE( side ); - - theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2; - - /* Only intersect borders if between two lineto's and both */ - /* lines are long enough (line_length is zero for curves). */ - /* Also avoid U-turns of nearly 180 degree. */ - if ( !border->movable || line_length == 0 || - theta > 0x59C000 || theta < -0x59C000 ) - intersect = FALSE; - else - { - /* compute minimum required length of lines */ - FT_Fixed min_length = ft_pos_abs( FT_MulFix( stroker->radius, - FT_Tan( theta ) ) ); - - - intersect = FT_BOOL( min_length && - stroker->line_length >= min_length && - line_length >= min_length ); - } - - if ( !intersect ) - { - FT_Vector_From_Polar( &delta, stroker->radius, - stroker->angle_out + rotate ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - border->movable = FALSE; - } - else - { - /* compute median angle */ - phi = stroker->angle_in + theta; - - thcos = FT_Cos( theta ); - - length = FT_DivFix( stroker->radius, thcos ); - - FT_Vector_From_Polar( &delta, length, phi + rotate ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; - } - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - - return error; - } - - - /* process an outside corner, i.e. compute bevel/miter/round */ - static FT_Error - ft_stroker_outside( FT_Stroker stroker, - FT_Int side, - FT_Fixed line_length ) - { - FT_StrokeBorder border = stroker->borders + side; - FT_Error error; - FT_Angle rotate; - - - if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND ) - error = ft_stroker_arcto( stroker, side ); - else - { - /* this is a mitered (pointed) or beveled (truncated) corner */ - FT_Fixed sigma = 0, radius = stroker->radius; - FT_Angle theta = 0, phi = 0; - FT_Fixed thcos = 0; - FT_Bool bevel, fixed_bevel; - - - rotate = FT_SIDE_TO_ROTATE( side ); - - bevel = - FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_BEVEL ); - - fixed_bevel = - FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_MITER_VARIABLE ); - - if ( !bevel ) - { - theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); - - if ( theta == FT_ANGLE_PI ) - { - theta = rotate; - phi = stroker->angle_in; - } - else - { - theta /= 2; - phi = stroker->angle_in + theta + rotate; - } - - thcos = FT_Cos( theta ); - sigma = FT_MulFix( stroker->miter_limit, thcos ); - - /* is miter limit exceeded? */ - if ( sigma < 0x10000L ) - { - /* don't create variable bevels for very small deviations; */ - /* FT_Sin(x) = 0 for x <= 57 */ - if ( fixed_bevel || ft_pos_abs( theta ) > 57 ) - bevel = TRUE; - } - } - - if ( bevel ) /* this is a bevel (broken angle) */ - { - if ( fixed_bevel ) - { - /* the outer corners are simply joined together */ - FT_Vector delta; - - - /* add bevel */ - FT_Vector_From_Polar( &delta, - radius, - stroker->angle_out + rotate ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - border->movable = FALSE; - error = ft_stroke_border_lineto( border, &delta, FALSE ); - } - else /* variable bevel */ - { - /* the miter is truncated */ - FT_Vector middle, delta; - FT_Fixed length; - - - /* compute middle point */ - FT_Vector_From_Polar( &middle, - FT_MulFix( radius, stroker->miter_limit ), - phi ); - middle.x += stroker->center.x; - middle.y += stroker->center.y; - - /* compute first angle point */ - length = FT_MulDiv( radius, 0x10000L - sigma, - ft_pos_abs( FT_Sin( theta ) ) ); - - FT_Vector_From_Polar( &delta, length, phi + rotate ); - delta.x += middle.x; - delta.y += middle.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - /* compute second angle point */ - FT_Vector_From_Polar( &delta, length, phi - rotate ); - delta.x += middle.x; - delta.y += middle.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - /* finally, add an end point; only needed if not lineto */ - /* (line_length is zero for curves) */ - if ( line_length == 0 ) - { - FT_Vector_From_Polar( &delta, - radius, - stroker->angle_out + rotate ); - - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - } - } - } - else /* this is a miter (intersection) */ - { - FT_Fixed length; - FT_Vector delta; - - - length = FT_DivFix( stroker->radius, thcos ); - - FT_Vector_From_Polar( &delta, length, phi ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - /* now add an end point; only needed if not lineto */ - /* (line_length is zero for curves) */ - if ( line_length == 0 ) - { - FT_Vector_From_Polar( &delta, - stroker->radius, - stroker->angle_out + rotate ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - } - } - } - - Exit: - return error; - } - - - static FT_Error - ft_stroker_process_corner( FT_Stroker stroker, - FT_Fixed line_length ) - { - FT_Error error = FT_Err_Ok; - FT_Angle turn; - FT_Int inside_side; - - - turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); - - /* no specific corner processing is required if the turn is 0 */ - if ( turn == 0 ) - goto Exit; - - /* when we turn to the right, the inside side is 0 */ - /* otherwise, the inside side is 1 */ - inside_side = ( turn < 0 ); - - /* process the inside side */ - error = ft_stroker_inside( stroker, inside_side, line_length ); - if ( error ) - goto Exit; - - /* process the outside side */ - error = ft_stroker_outside( stroker, !inside_side, line_length ); - - Exit: - return error; - } - - - /* add two points to the left and right borders corresponding to the */ - /* start of the subpath */ - static FT_Error - ft_stroker_subpath_start( FT_Stroker stroker, - FT_Angle start_angle, - FT_Fixed line_length ) - { - FT_Vector delta; - FT_Vector point; - FT_Error error; - FT_StrokeBorder border; - - - FT_Vector_From_Polar( &delta, stroker->radius, - start_angle + FT_ANGLE_PI2 ); - - point.x = stroker->center.x + delta.x; - point.y = stroker->center.y + delta.y; - - border = stroker->borders; - error = ft_stroke_border_moveto( border, &point ); - if ( error ) - goto Exit; - - point.x = stroker->center.x - delta.x; - point.y = stroker->center.y - delta.y; - - border++; - error = ft_stroke_border_moveto( border, &point ); - - /* save angle, position, and line length for last join */ - /* (line_length is zero for curves) */ - stroker->subpath_angle = start_angle; - stroker->first_point = FALSE; - stroker->subpath_line_length = line_length; - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_LineTo( FT_Stroker stroker, - FT_Vector* to ) - { - FT_Error error = FT_Err_Ok; - FT_StrokeBorder border; - FT_Vector delta; - FT_Angle angle; - FT_Int side; - FT_Fixed line_length; - - - if ( !stroker || !to ) - return FT_THROW( Invalid_Argument ); - - delta.x = to->x - stroker->center.x; - delta.y = to->y - stroker->center.y; - - /* a zero-length lineto is a no-op; avoid creating a spurious corner */ - if ( delta.x == 0 && delta.y == 0 ) - goto Exit; - - /* compute length of line */ - line_length = FT_Vector_Length( &delta ); - - angle = FT_Atan2( delta.x, delta.y ); - FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 ); - - /* process corner if necessary */ - if ( stroker->first_point ) - { - /* This is the first segment of a subpath. We need to */ - /* add a point to each border at their respective starting */ - /* point locations. */ - error = ft_stroker_subpath_start( stroker, angle, line_length ); - if ( error ) - goto Exit; - } - else - { - /* process the current corner */ - stroker->angle_out = angle; - error = ft_stroker_process_corner( stroker, line_length ); - if ( error ) - goto Exit; - } - - /* now add a line segment to both the `inside' and `outside' paths */ - for ( border = stroker->borders, side = 1; side >= 0; side--, border++ ) - { - FT_Vector point; - - - point.x = to->x + delta.x; - point.y = to->y + delta.y; - - /* the ends of lineto borders are movable */ - error = ft_stroke_border_lineto( border, &point, TRUE ); - if ( error ) - goto Exit; - - delta.x = -delta.x; - delta.y = -delta.y; - } - - stroker->angle_in = angle; - stroker->center = *to; - stroker->line_length = line_length; - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_ConicTo( FT_Stroker stroker, - FT_Vector* control, - FT_Vector* to ) - { - FT_Error error = FT_Err_Ok; - FT_Vector bez_stack[34]; - FT_Vector* arc; - FT_Vector* limit = bez_stack + 30; - FT_Bool first_arc = TRUE; - - - if ( !stroker || !control || !to ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* if all control points are coincident, this is a no-op; */ - /* avoid creating a spurious corner */ - if ( FT_IS_SMALL( stroker->center.x - control->x ) && - FT_IS_SMALL( stroker->center.y - control->y ) && - FT_IS_SMALL( control->x - to->x ) && - FT_IS_SMALL( control->y - to->y ) ) - { - stroker->center = *to; - goto Exit; - } - - arc = bez_stack; - arc[0] = *to; - arc[1] = *control; - arc[2] = stroker->center; - - while ( arc >= bez_stack ) - { - FT_Angle angle_in, angle_out; - - - /* initialize with current direction */ - angle_in = angle_out = stroker->angle_in; - - if ( arc < limit && - !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) ) - { - if ( stroker->first_point ) - stroker->angle_in = angle_in; - - ft_conic_split( arc ); - arc += 2; - continue; - } - - if ( first_arc ) - { - first_arc = FALSE; - - /* process corner if necessary */ - if ( stroker->first_point ) - error = ft_stroker_subpath_start( stroker, angle_in, 0 ); - else - { - stroker->angle_out = angle_in; - error = ft_stroker_process_corner( stroker, 0 ); - } - } - else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) > - FT_SMALL_CONIC_THRESHOLD / 4 ) - { - /* if the deviation from one arc to the next is too great, */ - /* add a round corner */ - stroker->center = arc[2]; - stroker->angle_out = angle_in; - stroker->line_join = FT_STROKER_LINEJOIN_ROUND; - - error = ft_stroker_process_corner( stroker, 0 ); - - /* reinstate line join style */ - stroker->line_join = stroker->line_join_saved; - } - - if ( error ) - goto Exit; - - /* the arc's angle is small enough; we can add it directly to each */ - /* border */ - { - FT_Vector ctrl, end; - FT_Angle theta, phi, rotate, alpha0 = 0; - FT_Fixed length; - FT_StrokeBorder border; - FT_Int side; - - - theta = FT_Angle_Diff( angle_in, angle_out ) / 2; - phi = angle_in + theta; - length = FT_DivFix( stroker->radius, FT_Cos( theta ) ); - - /* compute direction of original arc */ - if ( stroker->handle_wide_strokes ) - alpha0 = FT_Atan2( arc[0].x - arc[2].x, arc[0].y - arc[2].y ); - - for ( border = stroker->borders, side = 0; - side <= 1; - side++, border++ ) - { - rotate = FT_SIDE_TO_ROTATE( side ); - - /* compute control point */ - FT_Vector_From_Polar( &ctrl, length, phi + rotate ); - ctrl.x += arc[1].x; - ctrl.y += arc[1].y; - - /* compute end point */ - FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); - end.x += arc[0].x; - end.y += arc[0].y; - - if ( stroker->handle_wide_strokes ) - { - FT_Vector start; - FT_Angle alpha1; - - - /* determine whether the border radius is greater than the */ - /* radius of curvature of the original arc */ - start = border->points[border->num_points - 1]; - - alpha1 = FT_Atan2( end.x - start.x, end.y - start.y ); - - /* is the direction of the border arc opposite to */ - /* that of the original arc? */ - if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) > - FT_ANGLE_PI / 2 ) - { - FT_Angle beta, gamma; - FT_Vector bvec, delta; - FT_Fixed blen, sinA, sinB, alen; - - - /* use the sine rule to find the intersection point */ - beta = FT_Atan2( arc[2].x - start.x, arc[2].y - start.y ); - gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); - - bvec.x = end.x - start.x; - bvec.y = end.y - start.y; - - blen = FT_Vector_Length( &bvec ); - - sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) ); - sinB = ft_pos_abs( FT_Sin( beta - gamma ) ); - - alen = FT_MulDiv( blen, sinA, sinB ); - - FT_Vector_From_Polar( &delta, alen, beta ); - delta.x += start.x; - delta.y += start.y; - - /* circumnavigate the negative sector backwards */ - border->movable = FALSE; - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - error = ft_stroke_border_lineto( border, &end, FALSE ); - if ( error ) - goto Exit; - error = ft_stroke_border_conicto( border, &ctrl, &start ); - if ( error ) - goto Exit; - /* and then move to the endpoint */ - error = ft_stroke_border_lineto( border, &end, FALSE ); - if ( error ) - goto Exit; - - continue; - } - - /* else fall through */ - } - - /* simply add an arc */ - error = ft_stroke_border_conicto( border, &ctrl, &end ); - if ( error ) - goto Exit; - } - } - - arc -= 2; - - stroker->angle_in = angle_out; - } - - stroker->center = *to; - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_CubicTo( FT_Stroker stroker, - FT_Vector* control1, - FT_Vector* control2, - FT_Vector* to ) - { - FT_Error error = FT_Err_Ok; - FT_Vector bez_stack[37]; - FT_Vector* arc; - FT_Vector* limit = bez_stack + 32; - FT_Bool first_arc = TRUE; - - - if ( !stroker || !control1 || !control2 || !to ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* if all control points are coincident, this is a no-op; */ - /* avoid creating a spurious corner */ - if ( FT_IS_SMALL( stroker->center.x - control1->x ) && - FT_IS_SMALL( stroker->center.y - control1->y ) && - FT_IS_SMALL( control1->x - control2->x ) && - FT_IS_SMALL( control1->y - control2->y ) && - FT_IS_SMALL( control2->x - to->x ) && - FT_IS_SMALL( control2->y - to->y ) ) - { - stroker->center = *to; - goto Exit; - } - - arc = bez_stack; - arc[0] = *to; - arc[1] = *control2; - arc[2] = *control1; - arc[3] = stroker->center; - - while ( arc >= bez_stack ) - { - FT_Angle angle_in, angle_mid, angle_out; - - - /* initialize with current direction */ - angle_in = angle_out = angle_mid = stroker->angle_in; - - if ( arc < limit && - !ft_cubic_is_small_enough( arc, &angle_in, - &angle_mid, &angle_out ) ) - { - if ( stroker->first_point ) - stroker->angle_in = angle_in; - - ft_cubic_split( arc ); - arc += 3; - continue; - } - - if ( first_arc ) - { - first_arc = FALSE; - - /* process corner if necessary */ - if ( stroker->first_point ) - error = ft_stroker_subpath_start( stroker, angle_in, 0 ); - else - { - stroker->angle_out = angle_in; - error = ft_stroker_process_corner( stroker, 0 ); - } - } - else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) > - FT_SMALL_CUBIC_THRESHOLD / 4 ) - { - /* if the deviation from one arc to the next is too great, */ - /* add a round corner */ - stroker->center = arc[3]; - stroker->angle_out = angle_in; - stroker->line_join = FT_STROKER_LINEJOIN_ROUND; - - error = ft_stroker_process_corner( stroker, 0 ); - - /* reinstate line join style */ - stroker->line_join = stroker->line_join_saved; - } - - if ( error ) - goto Exit; - - /* the arc's angle is small enough; we can add it directly to each */ - /* border */ - { - FT_Vector ctrl1, ctrl2, end; - FT_Angle theta1, phi1, theta2, phi2, rotate, alpha0 = 0; - FT_Fixed length1, length2; - FT_StrokeBorder border; - FT_Int side; - - - theta1 = FT_Angle_Diff( angle_in, angle_mid ) / 2; - theta2 = FT_Angle_Diff( angle_mid, angle_out ) / 2; - phi1 = ft_angle_mean( angle_in, angle_mid ); - phi2 = ft_angle_mean( angle_mid, angle_out ); - length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) ); - length2 = FT_DivFix( stroker->radius, FT_Cos( theta2 ) ); - - /* compute direction of original arc */ - if ( stroker->handle_wide_strokes ) - alpha0 = FT_Atan2( arc[0].x - arc[3].x, arc[0].y - arc[3].y ); - - for ( border = stroker->borders, side = 0; - side <= 1; - side++, border++ ) - { - rotate = FT_SIDE_TO_ROTATE( side ); - - /* compute control points */ - FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate ); - ctrl1.x += arc[2].x; - ctrl1.y += arc[2].y; - - FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate ); - ctrl2.x += arc[1].x; - ctrl2.y += arc[1].y; - - /* compute end point */ - FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); - end.x += arc[0].x; - end.y += arc[0].y; - - if ( stroker->handle_wide_strokes ) - { - FT_Vector start; - FT_Angle alpha1; - - - /* determine whether the border radius is greater than the */ - /* radius of curvature of the original arc */ - start = border->points[border->num_points - 1]; - - alpha1 = FT_Atan2( end.x - start.x, end.y - start.y ); - - /* is the direction of the border arc opposite to */ - /* that of the original arc? */ - if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) > - FT_ANGLE_PI / 2 ) - { - FT_Angle beta, gamma; - FT_Vector bvec, delta; - FT_Fixed blen, sinA, sinB, alen; - - - /* use the sine rule to find the intersection point */ - beta = FT_Atan2( arc[3].x - start.x, arc[3].y - start.y ); - gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); - - bvec.x = end.x - start.x; - bvec.y = end.y - start.y; - - blen = FT_Vector_Length( &bvec ); - - sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) ); - sinB = ft_pos_abs( FT_Sin( beta - gamma ) ); - - alen = FT_MulDiv( blen, sinA, sinB ); - - FT_Vector_From_Polar( &delta, alen, beta ); - delta.x += start.x; - delta.y += start.y; - - /* circumnavigate the negative sector backwards */ - border->movable = FALSE; - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - error = ft_stroke_border_lineto( border, &end, FALSE ); - if ( error ) - goto Exit; - error = ft_stroke_border_cubicto( border, - &ctrl2, - &ctrl1, - &start ); - if ( error ) - goto Exit; - /* and then move to the endpoint */ - error = ft_stroke_border_lineto( border, &end, FALSE ); - if ( error ) - goto Exit; - - continue; - } - - /* else fall through */ - } - - /* simply add an arc */ - error = ft_stroke_border_cubicto( border, &ctrl1, &ctrl2, &end ); - if ( error ) - goto Exit; - } - } - - arc -= 3; - - stroker->angle_in = angle_out; - } - - stroker->center = *to; - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_BeginSubPath( FT_Stroker stroker, - FT_Vector* to, - FT_Bool open ) - { - if ( !stroker || !to ) - return FT_THROW( Invalid_Argument ); - - /* We cannot process the first point, because there is not enough */ - /* information regarding its corner/cap. The latter will be processed */ - /* in the `FT_Stroker_EndSubPath' routine. */ - /* */ - stroker->first_point = TRUE; - stroker->center = *to; - stroker->subpath_open = open; - - /* Determine if we need to check whether the border radius is greater */ - /* than the radius of curvature of a curve, to handle this case */ - /* specially. This is only required if bevel joins or butt caps may */ - /* be created, because round & miter joins and round & square caps */ - /* cover the negative sector created with wide strokes. */ - stroker->handle_wide_strokes = - FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_ROUND || - ( stroker->subpath_open && - stroker->line_cap == FT_STROKER_LINECAP_BUTT ) ); - - /* record the subpath start point for each border */ - stroker->subpath_start = *to; - - stroker->angle_in = 0; - - return FT_Err_Ok; - } - - - static FT_Error - ft_stroker_add_reverse_left( FT_Stroker stroker, - FT_Bool open ) - { - FT_StrokeBorder right = stroker->borders + 0; - FT_StrokeBorder left = stroker->borders + 1; - FT_Int new_points; - FT_Error error = FT_Err_Ok; - - - FT_ASSERT( left->start >= 0 ); - - new_points = (FT_Int)left->num_points - left->start; - if ( new_points > 0 ) - { - error = ft_stroke_border_grow( right, (FT_UInt)new_points ); - if ( error ) - goto Exit; - - { - FT_Vector* dst_point = right->points + right->num_points; - FT_Byte* dst_tag = right->tags + right->num_points; - FT_Vector* src_point = left->points + left->num_points - 1; - FT_Byte* src_tag = left->tags + left->num_points - 1; - - - while ( src_point >= left->points + left->start ) - { - *dst_point = *src_point; - *dst_tag = *src_tag; - - if ( open ) - dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END; - else - { - FT_Byte ttag = - (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END ); - - - /* switch begin/end tags if necessary */ - if ( ttag == FT_STROKE_TAG_BEGIN || - ttag == FT_STROKE_TAG_END ) - dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END; - } - - src_point--; - src_tag--; - dst_point++; - dst_tag++; - } - } - - left->num_points = (FT_UInt)left->start; - right->num_points += (FT_UInt)new_points; - - right->movable = FALSE; - left->movable = FALSE; - } - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - /* there's a lot of magic in this function! */ - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_EndSubPath( FT_Stroker stroker ) - { - FT_Error error = FT_Err_Ok; - - - if ( !stroker ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - if ( stroker->subpath_open ) - { - FT_StrokeBorder right = stroker->borders; - - - /* All right, this is an opened path, we need to add a cap between */ - /* right & left, add the reverse of left, then add a final cap */ - /* between left & right. */ - error = ft_stroker_cap( stroker, stroker->angle_in, 0 ); - if ( error ) - goto Exit; - - /* add reversed points from `left' to `right' */ - error = ft_stroker_add_reverse_left( stroker, TRUE ); - if ( error ) - goto Exit; - - /* now add the final cap */ - stroker->center = stroker->subpath_start; - error = ft_stroker_cap( stroker, - stroker->subpath_angle + FT_ANGLE_PI, 0 ); - if ( error ) - goto Exit; - - /* Now end the right subpath accordingly. The left one is */ - /* rewind and doesn't need further processing. */ - ft_stroke_border_close( right, FALSE ); - } - else - { - FT_Angle turn; - FT_Int inside_side; - - - /* close the path if needed */ - if ( stroker->center.x != stroker->subpath_start.x || - stroker->center.y != stroker->subpath_start.y ) - { - error = FT_Stroker_LineTo( stroker, &stroker->subpath_start ); - if ( error ) - goto Exit; - } - - /* process the corner */ - stroker->angle_out = stroker->subpath_angle; - turn = FT_Angle_Diff( stroker->angle_in, - stroker->angle_out ); - - /* no specific corner processing is required if the turn is 0 */ - if ( turn != 0 ) - { - /* when we turn to the right, the inside side is 0 */ - /* otherwise, the inside side is 1 */ - inside_side = ( turn < 0 ); - - error = ft_stroker_inside( stroker, - inside_side, - stroker->subpath_line_length ); - if ( error ) - goto Exit; - - /* process the outside side */ - error = ft_stroker_outside( stroker, - !inside_side, - stroker->subpath_line_length ); - if ( error ) - goto Exit; - } - - /* then end our two subpaths */ - ft_stroke_border_close( stroker->borders + 0, FALSE ); - ft_stroke_border_close( stroker->borders + 1, TRUE ); - } - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_GetBorderCounts( FT_Stroker stroker, - FT_StrokerBorder border, - FT_UInt *anum_points, - FT_UInt *anum_contours ) - { - FT_UInt num_points = 0, num_contours = 0; - FT_Error error; - - - if ( !stroker || border > 1 ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - error = ft_stroke_border_get_counts( stroker->borders + border, - &num_points, &num_contours ); - Exit: - if ( anum_points ) - *anum_points = num_points; - - if ( anum_contours ) - *anum_contours = num_contours; - - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_GetCounts( FT_Stroker stroker, - FT_UInt *anum_points, - FT_UInt *anum_contours ) - { - FT_UInt count1, count2, num_points = 0; - FT_UInt count3, count4, num_contours = 0; - FT_Error error; - - - if ( !stroker ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - error = ft_stroke_border_get_counts( stroker->borders + 0, - &count1, &count2 ); - if ( error ) - goto Exit; - - error = ft_stroke_border_get_counts( stroker->borders + 1, - &count3, &count4 ); - if ( error ) - goto Exit; - - num_points = count1 + count3; - num_contours = count2 + count4; - - Exit: - if ( anum_points ) - *anum_points = num_points; - - if ( anum_contours ) - *anum_contours = num_contours; - - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( void ) - FT_Stroker_ExportBorder( FT_Stroker stroker, - FT_StrokerBorder border, - FT_Outline* outline ) - { - if ( !stroker || !outline ) - return; - - if ( border == FT_STROKER_BORDER_LEFT || - border == FT_STROKER_BORDER_RIGHT ) - { - FT_StrokeBorder sborder = & stroker->borders[border]; - - - if ( sborder->valid ) - ft_stroke_border_export( sborder, outline ); - } - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( void ) - FT_Stroker_Export( FT_Stroker stroker, - FT_Outline* outline ) - { - FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline ); - FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline ); - } - - - /* documentation is in ftstroke.h */ - - /* - * The following is very similar to FT_Outline_Decompose, except - * that we do support opened paths, and do not scale the outline. - */ - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_ParseOutline( FT_Stroker stroker, - FT_Outline* outline, - FT_Bool opened ) - { - FT_Vector v_last; - FT_Vector v_control; - FT_Vector v_start; - - FT_Vector* point; - FT_Vector* limit; - char* tags; - - FT_Error error; - - FT_Int n; /* index of contour in outline */ - FT_UInt first; /* index of first point in contour */ - FT_Int tag; /* current point's state */ - - - if ( !outline ) - return FT_THROW( Invalid_Outline ); - - if ( !stroker ) - return FT_THROW( Invalid_Argument ); - - FT_Stroker_Rewind( stroker ); - - first = 0; - - for ( n = 0; n < outline->n_contours; n++ ) - { - FT_UInt last; /* index of last point in contour */ - - - last = (FT_UInt)outline->contours[n]; - limit = outline->points + last; - - /* skip empty points; we don't stroke these */ - if ( last <= first ) - { - first = last + 1; - continue; - } - - v_start = outline->points[first]; - v_last = outline->points[last]; - - v_control = v_start; - - point = outline->points + first; - tags = outline->tags + first; - tag = FT_CURVE_TAG( tags[0] ); - - /* A contour cannot start with a cubic control point! */ - if ( tag == FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - /* check first point to determine origin */ - if ( tag == FT_CURVE_TAG_CONIC ) - { - /* First point is conic control. Yes, this happens. */ - if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) - { - /* start at last point if it is on the curve */ - v_start = v_last; - limit--; - } - else - { - /* if both first and last points are conic, */ - /* start at their middle */ - v_start.x = ( v_start.x + v_last.x ) / 2; - v_start.y = ( v_start.y + v_last.y ) / 2; - } - point--; - tags--; - } - - error = FT_Stroker_BeginSubPath( stroker, &v_start, opened ); - if ( error ) - goto Exit; - - while ( point < limit ) - { - point++; - tags++; - - tag = FT_CURVE_TAG( tags[0] ); - switch ( tag ) - { - case FT_CURVE_TAG_ON: /* emit a single line_to */ - { - FT_Vector vec; - - - vec.x = point->x; - vec.y = point->y; - - error = FT_Stroker_LineTo( stroker, &vec ); - if ( error ) - goto Exit; - continue; - } - - case FT_CURVE_TAG_CONIC: /* consume conic arcs */ - v_control.x = point->x; - v_control.y = point->y; - - Do_Conic: - if ( point < limit ) - { - FT_Vector vec; - FT_Vector v_middle; - - - point++; - tags++; - tag = FT_CURVE_TAG( tags[0] ); - - vec = point[0]; - - if ( tag == FT_CURVE_TAG_ON ) - { - error = FT_Stroker_ConicTo( stroker, &v_control, &vec ); - if ( error ) - goto Exit; - continue; - } - - if ( tag != FT_CURVE_TAG_CONIC ) - goto Invalid_Outline; - - v_middle.x = ( v_control.x + vec.x ) / 2; - v_middle.y = ( v_control.y + vec.y ) / 2; - - error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle ); - if ( error ) - goto Exit; - - v_control = vec; - goto Do_Conic; - } - - error = FT_Stroker_ConicTo( stroker, &v_control, &v_start ); - goto Close; - - default: /* FT_CURVE_TAG_CUBIC */ - { - FT_Vector vec1, vec2; - - - if ( point + 1 > limit || - FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - point += 2; - tags += 2; - - vec1 = point[-2]; - vec2 = point[-1]; - - if ( point <= limit ) - { - FT_Vector vec; - - - vec = point[0]; - - error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec ); - if ( error ) - goto Exit; - continue; - } - - error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start ); - goto Close; - } - } - } - - Close: - if ( error ) - goto Exit; - - /* don't try to end the path if no segments have been generated */ - if ( !stroker->first_point ) - { - error = FT_Stroker_EndSubPath( stroker ); - if ( error ) - goto Exit; - } - - first = last + 1; - } - - return FT_Err_Ok; - - Exit: - return error; - - Invalid_Outline: - return FT_THROW( Invalid_Outline ); - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Glyph_Stroke( FT_Glyph *pglyph, - FT_Stroker stroker, - FT_Bool destroy ) - { - FT_Error error = FT_ERR( Invalid_Argument ); - FT_Glyph glyph = NULL; - - /* for FT_OUTLINE_GLYPH_CLASS_GET (in PIC mode) */ - FT_Library library = stroker->library; - - FT_UNUSED( library ); - - - if ( !pglyph ) - goto Exit; - - glyph = *pglyph; - if ( !glyph || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) - goto Exit; - - { - FT_Glyph copy; - - - error = FT_Glyph_Copy( glyph, © ); - if ( error ) - goto Exit; - - glyph = copy; - } - - { - FT_OutlineGlyph oglyph = (FT_OutlineGlyph)glyph; - FT_Outline* outline = &oglyph->outline; - FT_UInt num_points, num_contours; - - - error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); - if ( error ) - goto Fail; - - FT_Stroker_GetCounts( stroker, &num_points, &num_contours ); - - FT_Outline_Done( glyph->library, outline ); - - error = FT_Outline_New( glyph->library, - num_points, - (FT_Int)num_contours, - outline ); - if ( error ) - goto Fail; - - outline->n_points = 0; - outline->n_contours = 0; - - FT_Stroker_Export( stroker, outline ); - } - - if ( destroy ) - FT_Done_Glyph( *pglyph ); - - *pglyph = glyph; - goto Exit; - - Fail: - FT_Done_Glyph( glyph ); - glyph = NULL; - - if ( !destroy ) - *pglyph = NULL; - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Glyph_StrokeBorder( FT_Glyph *pglyph, - FT_Stroker stroker, - FT_Bool inside, - FT_Bool destroy ) - { - FT_Error error = FT_ERR( Invalid_Argument ); - FT_Glyph glyph = NULL; - - /* for FT_OUTLINE_GLYPH_CLASS_GET (in PIC mode) */ - FT_Library library = stroker->library; - - FT_UNUSED( library ); - - - if ( !pglyph ) - goto Exit; - - glyph = *pglyph; - if ( !glyph || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) - goto Exit; - - { - FT_Glyph copy; - - - error = FT_Glyph_Copy( glyph, © ); - if ( error ) - goto Exit; - - glyph = copy; - } - - { - FT_OutlineGlyph oglyph = (FT_OutlineGlyph)glyph; - FT_StrokerBorder border; - FT_Outline* outline = &oglyph->outline; - FT_UInt num_points, num_contours; - - - border = FT_Outline_GetOutsideBorder( outline ); - if ( inside ) - { - if ( border == FT_STROKER_BORDER_LEFT ) - border = FT_STROKER_BORDER_RIGHT; - else - border = FT_STROKER_BORDER_LEFT; - } - - error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); - if ( error ) - goto Fail; - - FT_Stroker_GetBorderCounts( stroker, border, - &num_points, &num_contours ); - - FT_Outline_Done( glyph->library, outline ); - - error = FT_Outline_New( glyph->library, - num_points, - (FT_Int)num_contours, - outline ); - if ( error ) - goto Fail; - - outline->n_points = 0; - outline->n_contours = 0; - - FT_Stroker_ExportBorder( stroker, border, outline ); - } - - if ( destroy ) - FT_Done_Glyph( *pglyph ); - - *pglyph = glyph; - goto Exit; - - Fail: - FT_Done_Glyph( glyph ); - glyph = NULL; - - if ( !destroy ) - *pglyph = NULL; - - Exit: - return error; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftsynth.c b/3party/freetype/src/base/ftsynth.c deleted file mode 100644 index cd68533957..0000000000 --- a/3party/freetype/src/base/ftsynth.c +++ /dev/null @@ -1,163 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsynth.c */ -/* */ -/* FreeType synthesizing code for emboldening and slanting (body). */ -/* */ -/* Copyright 2000-2015 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 <ft2build.h> -#include FT_SYNTHESIS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_OUTLINE_H -#include FT_BITMAP_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_synth - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** EXPERIMENTAL OBLIQUING SUPPORT ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - /* documentation is in ftsynth.h */ - - FT_EXPORT_DEF( void ) - FT_GlyphSlot_Oblique( FT_GlyphSlot slot ) - { - FT_Matrix transform; - FT_Outline* outline; - - - if ( !slot ) - return; - - outline = &slot->outline; - - /* only oblique outline glyphs */ - if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) - return; - - /* we don't touch the advance width */ - - /* For italic, simply apply a shear transform, with an angle */ - /* of about 12 degrees. */ - - transform.xx = 0x10000L; - transform.yx = 0x00000L; - - transform.xy = 0x0366AL; - transform.yy = 0x10000L; - - FT_Outline_Transform( outline, &transform ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** EXPERIMENTAL EMBOLDENING SUPPORT ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* documentation is in ftsynth.h */ - - FT_EXPORT_DEF( void ) - FT_GlyphSlot_Embolden( FT_GlyphSlot slot ) - { - FT_Library library; - FT_Face face; - FT_Error error; - FT_Pos xstr, ystr; - - - if ( !slot ) - return; - - library = slot->library; - face = slot->face; - - if ( slot->format != FT_GLYPH_FORMAT_OUTLINE && - slot->format != FT_GLYPH_FORMAT_BITMAP ) - return; - - /* some reasonable strength */ - xstr = FT_MulFix( face->units_per_EM, - face->size->metrics.y_scale ) / 24; - ystr = xstr; - - if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) - FT_Outline_EmboldenXY( &slot->outline, xstr, ystr ); - - else /* slot->format == FT_GLYPH_FORMAT_BITMAP */ - { - /* round to full pixels */ - xstr &= ~63; - if ( xstr == 0 ) - xstr = 1 << 6; - ystr &= ~63; - - /* - * XXX: overflow check for 16-bit system, for compatibility - * with FT_GlyphSlot_Embolden() since freetype-2.1.10. - * unfortunately, this function return no informations - * about the cause of error. - */ - if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN ) - { - FT_TRACE1(( "FT_GlyphSlot_Embolden:" )); - FT_TRACE1(( "too strong embolding parameter ystr=%d\n", ystr )); - return; - } - error = FT_GlyphSlot_Own_Bitmap( slot ); - if ( error ) - return; - - error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr ); - if ( error ) - return; - } - - if ( slot->advance.x ) - slot->advance.x += xstr; - - if ( slot->advance.y ) - slot->advance.y += ystr; - - slot->metrics.width += xstr; - slot->metrics.height += ystr; - slot->metrics.horiAdvance += xstr; - slot->metrics.vertAdvance += ystr; - slot->metrics.horiBearingY += ystr; - - /* XXX: 16-bit overflow case must be excluded before here */ - if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) - slot->bitmap_top += (FT_Int)( ystr >> 6 ); - } - - -/* END */ diff --git a/3party/freetype/src/base/ftsystem.c b/3party/freetype/src/base/ftsystem.c deleted file mode 100644 index 1938fd8917..0000000000 --- a/3party/freetype/src/base/ftsystem.c +++ /dev/null @@ -1,320 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsystem.c */ -/* */ -/* ANSI-specific FreeType low-level system interface (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* This file contains the default interface used by FreeType to access */ - /* low-level, i.e. memory management, i/o access as well as thread */ - /* synchronisation. It can be replaced by user-specific routines if */ - /* necessary. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_SYSTEM_H -#include FT_ERRORS_H -#include FT_TYPES_H - - - /*************************************************************************/ - /* */ - /* MEMORY MANAGEMENT INTERFACE */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* It is not necessary to do any error checking for the */ - /* allocation-related functions. This will be done by the higher level */ - /* routines like ft_mem_alloc() or ft_mem_realloc(). */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_alloc */ - /* */ - /* <Description> */ - /* The memory allocation function. */ - /* */ - /* <Input> */ - /* memory :: A pointer to the memory object. */ - /* */ - /* size :: The requested size in bytes. */ - /* */ - /* <Return> */ - /* The address of newly allocated block. */ - /* */ - FT_CALLBACK_DEF( void* ) - ft_alloc( FT_Memory memory, - long size ) - { - FT_UNUSED( memory ); - - return ft_smalloc( (size_t)size ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_realloc */ - /* */ - /* <Description> */ - /* The memory reallocation function. */ - /* */ - /* <Input> */ - /* memory :: A pointer to the memory object. */ - /* */ - /* cur_size :: The current size of the allocated memory block. */ - /* */ - /* new_size :: The newly requested size in bytes. */ - /* */ - /* block :: The current address of the block in memory. */ - /* */ - /* <Return> */ - /* The address of the reallocated memory block. */ - /* */ - FT_CALLBACK_DEF( void* ) - ft_realloc( FT_Memory memory, - long cur_size, - long new_size, - void* block ) - { - FT_UNUSED( memory ); - FT_UNUSED( cur_size ); - - return ft_srealloc( block, (size_t)new_size ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_free */ - /* */ - /* <Description> */ - /* The memory release function. */ - /* */ - /* <Input> */ - /* memory :: A pointer to the memory object. */ - /* */ - /* block :: The address of block in memory to be freed. */ - /* */ - FT_CALLBACK_DEF( void ) - ft_free( FT_Memory memory, - void* block ) - { - FT_UNUSED( memory ); - - ft_sfree( block ); - } - - - /*************************************************************************/ - /* */ - /* RESOURCE MANAGEMENT INTERFACE */ - /* */ - /*************************************************************************/ - -#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_io - - /* We use the macro STREAM_FILE for convenience to extract the */ - /* system-specific stream handle from a given FreeType stream object */ -#define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer ) - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_ansi_stream_close */ - /* */ - /* <Description> */ - /* The function to close a stream. */ - /* */ - /* <Input> */ - /* stream :: A pointer to the stream object. */ - /* */ - FT_CALLBACK_DEF( void ) - ft_ansi_stream_close( FT_Stream stream ) - { - ft_fclose( STREAM_FILE( stream ) ); - - stream->descriptor.pointer = NULL; - stream->size = 0; - stream->base = NULL; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_ansi_stream_io */ - /* */ - /* <Description> */ - /* The function to open a stream. */ - /* */ - /* <Input> */ - /* stream :: A pointer to the stream object. */ - /* */ - /* offset :: The position in the data stream to start reading. */ - /* */ - /* buffer :: The address of buffer to store the read data. */ - /* */ - /* count :: The number of bytes to read from the stream. */ - /* */ - /* <Return> */ - /* The number of bytes actually read. If `count' is zero (this is, */ - /* the function is used for seeking), a non-zero return value */ - /* indicates an error. */ - /* */ - FT_CALLBACK_DEF( unsigned long ) - ft_ansi_stream_io( FT_Stream stream, - unsigned long offset, - unsigned char* buffer, - unsigned long count ) - { - FT_FILE* file; - - - if ( !count && offset > stream->size ) - return 1; - - file = STREAM_FILE( stream ); - - if ( stream->pos != offset ) - ft_fseek( file, (long)offset, SEEK_SET ); - - return (unsigned long)ft_fread( buffer, 1, count, file ); - } - - - /* documentation is in ftstream.h */ - - FT_BASE_DEF( FT_Error ) - FT_Stream_Open( FT_Stream stream, - const char* filepathname ) - { - FT_FILE* file; - - - if ( !stream ) - return FT_THROW( Invalid_Stream_Handle ); - - stream->descriptor.pointer = NULL; - stream->pathname.pointer = (char*)filepathname; - stream->base = NULL; - stream->pos = 0; - stream->read = NULL; - stream->close = NULL; - - file = ft_fopen( filepathname, "rb" ); - if ( !file ) - { - FT_ERROR(( "FT_Stream_Open:" - " could not open `%s'\n", filepathname )); - - return FT_THROW( Cannot_Open_Resource ); - } - - ft_fseek( file, 0, SEEK_END ); - stream->size = (unsigned long)ft_ftell( file ); - if ( !stream->size ) - { - FT_ERROR(( "FT_Stream_Open:" )); - FT_ERROR(( " opened `%s' but zero-sized\n", filepathname )); - ft_fclose( file ); - return FT_THROW( Cannot_Open_Stream ); - } - ft_fseek( file, 0, SEEK_SET ); - - stream->descriptor.pointer = file; - stream->read = ft_ansi_stream_io; - stream->close = ft_ansi_stream_close; - - FT_TRACE1(( "FT_Stream_Open:" )); - FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", - filepathname, stream->size )); - - return FT_Err_Ok; - } - -#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ - -#ifdef FT_DEBUG_MEMORY - - extern FT_Int - ft_mem_debug_init( FT_Memory memory ); - - extern void - ft_mem_debug_done( FT_Memory memory ); - -#endif - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( FT_Memory ) - FT_New_Memory( void ) - { - FT_Memory memory; - - - memory = (FT_Memory)ft_smalloc( sizeof ( *memory ) ); - if ( memory ) - { - memory->user = NULL; - memory->alloc = ft_alloc; - memory->realloc = ft_realloc; - memory->free = ft_free; -#ifdef FT_DEBUG_MEMORY - ft_mem_debug_init( memory ); -#endif - } - - return memory; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( void ) - FT_Done_Memory( FT_Memory memory ) - { -#ifdef FT_DEBUG_MEMORY - ft_mem_debug_done( memory ); -#endif - ft_sfree( memory ); - } - - -/* END */ diff --git a/3party/freetype/src/base/fttrigon.c b/3party/freetype/src/base/fttrigon.c deleted file mode 100644 index 5b24304c2f..0000000000 --- a/3party/freetype/src/base/fttrigon.c +++ /dev/null @@ -1,525 +0,0 @@ -/***************************************************************************/ -/* */ -/* fttrigon.c */ -/* */ -/* FreeType trigonometric functions (body). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* This is a fixed-point CORDIC implementation of trigonometric */ - /* functions as well as transformations between Cartesian and polar */ - /* coordinates. The angles are represented as 16.16 fixed-point values */ - /* in degrees, i.e., the angular resolution is 2^-16 degrees. Note that */ - /* only vectors longer than 2^16*180/pi (or at least 22 bits) on a */ - /* discrete Cartesian grid can have the same or better angular */ - /* resolution. Therefore, to maintain this precision, some functions */ - /* require an interim upscaling of the vectors, whereas others operate */ - /* with 24-bit long vectors directly. */ - /* */ - /*************************************************************************/ - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_CALC_H -#include FT_TRIGONOMETRY_H - - - /* the Cordic shrink factor 0.858785336480436 * 2^32 */ -#define FT_TRIG_SCALE 0xDBD95B16UL - - /* the highest bit in overflow-safe vector components, */ - /* MSB of 0.858785336480436 * sqrt(0.5) * 2^30 */ -#define FT_TRIG_SAFE_MSB 29 - - /* this table was generated for FT_PI = 180L << 16, i.e. degrees */ -#define FT_TRIG_MAX_ITERS 23 - - static const FT_Angle - ft_trig_arctan_table[] = - { - 1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L, - 14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L, - 57L, 29L, 14L, 7L, 4L, 2L, 1L - }; - - -#ifdef FT_LONG64 - - /* multiply a given value by the CORDIC shrink factor */ - static FT_Fixed - ft_trig_downscale( FT_Fixed val ) - { - FT_Int s = 1; - - - if ( val < 0 ) - { - val = -val; - s = -1; - } - - /* 0x40000000 comes from regression analysis between true */ - /* and CORDIC hypotenuse, so it minimizes the error */ - val = (FT_Fixed)( ( (FT_Int64)val * FT_TRIG_SCALE + 0x40000000UL ) >> 32 ); - - return s < 0 ? -val : val; - } - -#else /* !FT_LONG64 */ - - /* multiply a given value by the CORDIC shrink factor */ - static FT_Fixed - ft_trig_downscale( FT_Fixed val ) - { - FT_Int s = 1; - FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2; - - - if ( val < 0 ) - { - val = -val; - s = -1; - } - - lo1 = (FT_UInt32)val & 0x0000FFFFU; - hi1 = (FT_UInt32)val >> 16; - lo2 = FT_TRIG_SCALE & 0x0000FFFFU; - hi2 = FT_TRIG_SCALE >> 16; - - lo = lo1 * lo2; - i1 = lo1 * hi2; - i2 = lo2 * hi1; - hi = hi1 * hi2; - - /* Check carry overflow of i1 + i2 */ - i1 += i2; - hi += (FT_UInt32)( i1 < i2 ) << 16; - - hi += i1 >> 16; - i1 = i1 << 16; - - /* Check carry overflow of i1 + lo */ - lo += i1; - hi += ( lo < i1 ); - - /* 0x40000000 comes from regression analysis between true */ - /* and CORDIC hypotenuse, so it minimizes the error */ - - /* Check carry overflow of lo + 0x40000000 */ - lo += 0x40000000UL; - hi += ( lo < 0x40000000UL ); - - val = (FT_Fixed)hi; - - return s < 0 ? -val : val; - } - -#endif /* !FT_LONG64 */ - - - /* undefined and never called for zero vector */ - static FT_Int - ft_trig_prenorm( FT_Vector* vec ) - { - FT_Pos x, y; - FT_Int shift; - - - x = vec->x; - y = vec->y; - - shift = FT_MSB( (FT_UInt32)( FT_ABS( x ) | FT_ABS( y ) ) ); - - if ( shift <= FT_TRIG_SAFE_MSB ) - { - shift = FT_TRIG_SAFE_MSB - shift; - vec->x = (FT_Pos)( (FT_ULong)x << shift ); - vec->y = (FT_Pos)( (FT_ULong)y << shift ); - } - else - { - shift -= FT_TRIG_SAFE_MSB; - vec->x = x >> shift; - vec->y = y >> shift; - shift = -shift; - } - - return shift; - } - - - static void - ft_trig_pseudo_rotate( FT_Vector* vec, - FT_Angle theta ) - { - FT_Int i; - FT_Fixed x, y, xtemp, b; - const FT_Angle *arctanptr; - - - x = vec->x; - y = vec->y; - - /* Rotate inside [-PI/4,PI/4] sector */ - while ( theta < -FT_ANGLE_PI4 ) - { - xtemp = y; - y = -x; - x = xtemp; - theta += FT_ANGLE_PI2; - } - - while ( theta > FT_ANGLE_PI4 ) - { - xtemp = -y; - y = x; - x = xtemp; - theta -= FT_ANGLE_PI2; - } - - arctanptr = ft_trig_arctan_table; - - /* Pseudorotations, with right shifts */ - for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ ) - { - if ( theta < 0 ) - { - xtemp = x + ( ( y + b ) >> i ); - y = y - ( ( x + b ) >> i ); - x = xtemp; - theta += *arctanptr++; - } - else - { - xtemp = x - ( ( y + b ) >> i ); - y = y + ( ( x + b ) >> i ); - x = xtemp; - theta -= *arctanptr++; - } - } - - vec->x = x; - vec->y = y; - } - - - static void - ft_trig_pseudo_polarize( FT_Vector* vec ) - { - FT_Angle theta; - FT_Int i; - FT_Fixed x, y, xtemp, b; - const FT_Angle *arctanptr; - - - x = vec->x; - y = vec->y; - - /* Get the vector into [-PI/4,PI/4] sector */ - if ( y > x ) - { - if ( y > -x ) - { - theta = FT_ANGLE_PI2; - xtemp = y; - y = -x; - x = xtemp; - } - else - { - theta = y > 0 ? FT_ANGLE_PI : -FT_ANGLE_PI; - x = -x; - y = -y; - } - } - else - { - if ( y < -x ) - { - theta = -FT_ANGLE_PI2; - xtemp = -y; - y = x; - x = xtemp; - } - else - { - theta = 0; - } - } - - arctanptr = ft_trig_arctan_table; - - /* Pseudorotations, with right shifts */ - for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ ) - { - if ( y > 0 ) - { - xtemp = x + ( ( y + b ) >> i ); - y = y - ( ( x + b ) >> i ); - x = xtemp; - theta += *arctanptr++; - } - else - { - xtemp = x - ( ( y + b ) >> i ); - y = y + ( ( x + b ) >> i ); - x = xtemp; - theta -= *arctanptr++; - } - } - - /* round theta to acknowledge its error that mostly comes */ - /* from accumulated rounding errors in the arctan table */ - if ( theta >= 0 ) - theta = FT_PAD_ROUND( theta, 16 ); - else - theta = -FT_PAD_ROUND( -theta, 16 ); - - vec->x = x; - vec->y = theta; - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_Cos( FT_Angle angle ) - { - FT_Vector v; - - - FT_Vector_Unit( &v, angle ); - - return v.x; - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_Sin( FT_Angle angle ) - { - FT_Vector v; - - - FT_Vector_Unit( &v, angle ); - - return v.y; - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_Tan( FT_Angle angle ) - { - FT_Vector v; - - - FT_Vector_Unit( &v, angle ); - - return FT_DivFix( v.y, v.x ); - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( FT_Angle ) - FT_Atan2( FT_Fixed dx, - FT_Fixed dy ) - { - FT_Vector v; - - - if ( dx == 0 && dy == 0 ) - return 0; - - v.x = dx; - v.y = dy; - ft_trig_prenorm( &v ); - ft_trig_pseudo_polarize( &v ); - - return v.y; - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( void ) - FT_Vector_Unit( FT_Vector* vec, - FT_Angle angle ) - { - if ( !vec ) - return; - - vec->x = FT_TRIG_SCALE >> 8; - vec->y = 0; - ft_trig_pseudo_rotate( vec, angle ); - vec->x = ( vec->x + 0x80L ) >> 8; - vec->y = ( vec->y + 0x80L ) >> 8; - } - - - /* these macros return 0 for positive numbers, - and -1 for negative ones */ -#define FT_SIGN_LONG( x ) ( (x) >> ( FT_SIZEOF_LONG * 8 - 1 ) ) -#define FT_SIGN_INT( x ) ( (x) >> ( FT_SIZEOF_INT * 8 - 1 ) ) -#define FT_SIGN_INT32( x ) ( (x) >> 31 ) -#define FT_SIGN_INT16( x ) ( (x) >> 15 ) - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( void ) - FT_Vector_Rotate( FT_Vector* vec, - FT_Angle angle ) - { - FT_Int shift; - FT_Vector v; - - - if ( !vec || !angle ) - return; - - v = *vec; - - if ( v.x == 0 && v.y == 0 ) - return; - - shift = ft_trig_prenorm( &v ); - ft_trig_pseudo_rotate( &v, angle ); - v.x = ft_trig_downscale( v.x ); - v.y = ft_trig_downscale( v.y ); - - if ( shift > 0 ) - { - FT_Int32 half = (FT_Int32)1L << ( shift - 1 ); - - - vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift; - vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift; - } - else - { - shift = -shift; - vec->x = (FT_Pos)( (FT_ULong)v.x << shift ); - vec->y = (FT_Pos)( (FT_ULong)v.y << shift ); - } - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_Vector_Length( FT_Vector* vec ) - { - FT_Int shift; - FT_Vector v; - - - if ( !vec ) - return 0; - - v = *vec; - - /* handle trivial cases */ - if ( v.x == 0 ) - { - return FT_ABS( v.y ); - } - else if ( v.y == 0 ) - { - return FT_ABS( v.x ); - } - - /* general case */ - shift = ft_trig_prenorm( &v ); - ft_trig_pseudo_polarize( &v ); - - v.x = ft_trig_downscale( v.x ); - - if ( shift > 0 ) - return ( v.x + ( 1L << ( shift - 1 ) ) ) >> shift; - - return (FT_Fixed)( (FT_UInt32)v.x << -shift ); - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( void ) - FT_Vector_Polarize( FT_Vector* vec, - FT_Fixed *length, - FT_Angle *angle ) - { - FT_Int shift; - FT_Vector v; - - - if ( !vec || !length || !angle ) - return; - - v = *vec; - - if ( v.x == 0 && v.y == 0 ) - return; - - shift = ft_trig_prenorm( &v ); - ft_trig_pseudo_polarize( &v ); - - v.x = ft_trig_downscale( v.x ); - - *length = shift >= 0 ? ( v.x >> shift ) - : (FT_Fixed)( (FT_UInt32)v.x << -shift ); - *angle = v.y; - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( void ) - FT_Vector_From_Polar( FT_Vector* vec, - FT_Fixed length, - FT_Angle angle ) - { - if ( !vec ) - return; - - vec->x = length; - vec->y = 0; - - FT_Vector_Rotate( vec, angle ); - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( FT_Angle ) - FT_Angle_Diff( FT_Angle angle1, - FT_Angle angle2 ) - { - FT_Angle delta = angle2 - angle1; - - - while ( delta <= -FT_ANGLE_PI ) - delta += FT_ANGLE_2PI; - - while ( delta > FT_ANGLE_PI ) - delta -= FT_ANGLE_2PI; - - return delta; - } - - -/* END */ diff --git a/3party/freetype/src/base/fttype1.c b/3party/freetype/src/base/fttype1.c deleted file mode 100644 index c549382afd..0000000000 --- a/3party/freetype/src/base/fttype1.c +++ /dev/null @@ -1,127 +0,0 @@ -/***************************************************************************/ -/* */ -/* fttype1.c */ -/* */ -/* FreeType utility file for PS names support (body). */ -/* */ -/* Copyright 2002-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_SERVICE_H -#include FT_SERVICE_POSTSCRIPT_INFO_H - - - /* documentation is in t1tables.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_PS_Font_Info( FT_Face face, - PS_FontInfoRec* afont_info ) - { - FT_Error error; - FT_Service_PsInfo service; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !afont_info ) - return FT_THROW( Invalid_Argument ); - - FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); - - if ( service && service->ps_get_font_info ) - error = service->ps_get_font_info( face, afont_info ); - else - error = FT_THROW( Invalid_Argument ); - - return error; - } - - - /* documentation is in t1tables.h */ - - FT_EXPORT_DEF( FT_Int ) - FT_Has_PS_Glyph_Names( FT_Face face ) - { - FT_Int result = 0; - FT_Service_PsInfo service; - - - if ( face ) - { - FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); - - if ( service && service->ps_has_glyph_names ) - result = service->ps_has_glyph_names( face ); - } - - return result; - } - - - /* documentation is in t1tables.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_PS_Font_Private( FT_Face face, - PS_PrivateRec* afont_private ) - { - FT_Error error; - FT_Service_PsInfo service; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !afont_private ) - return FT_THROW( Invalid_Argument ); - - FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); - - if ( service && service->ps_get_font_private ) - error = service->ps_get_font_private( face, afont_private ); - else - error = FT_THROW( Invalid_Argument ); - - return error; - } - - - /* documentation is in t1tables.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_Get_PS_Font_Value( FT_Face face, - PS_Dict_Keys key, - FT_UInt idx, - void *value, - FT_Long value_len ) - { - FT_Int result = 0; - FT_Service_PsInfo service = NULL; - - - if ( face ) - { - FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); - - if ( service && service->ps_get_font_value ) - result = service->ps_get_font_value( face, key, idx, - value, value_len ); - } - - return result; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftutil.c b/3party/freetype/src/base/ftutil.c deleted file mode 100644 index f5b72db708..0000000000 --- a/3party/freetype/src/base/ftutil.c +++ /dev/null @@ -1,441 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftutil.c */ -/* */ -/* FreeType utility file for memory and list management (body). */ -/* */ -/* Copyright 2002-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_OBJECTS_H -#include FT_LIST_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_memory - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** *****/ - /***** M E M O R Y M A N A G E M E N T *****/ - /***** *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_BASE_DEF( FT_Pointer ) - ft_mem_alloc( FT_Memory memory, - FT_Long size, - FT_Error *p_error ) - { - FT_Error error; - FT_Pointer block = ft_mem_qalloc( memory, size, &error ); - - if ( !error && size > 0 ) - FT_MEM_ZERO( block, size ); - - *p_error = error; - return block; - } - - - FT_BASE_DEF( FT_Pointer ) - ft_mem_qalloc( FT_Memory memory, - FT_Long size, - FT_Error *p_error ) - { - FT_Error error = FT_Err_Ok; - FT_Pointer block = NULL; - - - if ( size > 0 ) - { - block = memory->alloc( memory, size ); - if ( block == NULL ) - error = FT_THROW( Out_Of_Memory ); - } - else if ( size < 0 ) - { - /* may help catch/prevent security issues */ - error = FT_THROW( Invalid_Argument ); - } - - *p_error = error; - return block; - } - - - FT_BASE_DEF( FT_Pointer ) - ft_mem_realloc( FT_Memory memory, - FT_Long item_size, - FT_Long cur_count, - FT_Long new_count, - void* block, - FT_Error *p_error ) - { - FT_Error error = FT_Err_Ok; - - - block = ft_mem_qrealloc( memory, item_size, - cur_count, new_count, block, &error ); - if ( !error && new_count > cur_count ) - FT_MEM_ZERO( (char*)block + cur_count * item_size, - ( new_count - cur_count ) * item_size ); - - *p_error = error; - return block; - } - - - FT_BASE_DEF( FT_Pointer ) - ft_mem_qrealloc( FT_Memory memory, - FT_Long item_size, - FT_Long cur_count, - FT_Long new_count, - void* block, - FT_Error *p_error ) - { - FT_Error error = FT_Err_Ok; - - - /* Note that we now accept `item_size == 0' as a valid parameter, in - * order to cover very weird cases where an ALLOC_MULT macro would be - * called. - */ - if ( cur_count < 0 || new_count < 0 || item_size < 0 ) - { - /* may help catch/prevent nasty security issues */ - error = FT_THROW( Invalid_Argument ); - } - else if ( new_count == 0 || item_size == 0 ) - { - ft_mem_free( memory, block ); - block = NULL; - } - else if ( new_count > FT_INT_MAX/item_size ) - { - error = FT_THROW( Array_Too_Large ); - } - else if ( cur_count == 0 ) - { - FT_ASSERT( block == NULL ); - - block = ft_mem_alloc( memory, new_count*item_size, &error ); - } - else - { - FT_Pointer block2; - FT_Long cur_size = cur_count*item_size; - FT_Long new_size = new_count*item_size; - - - block2 = memory->realloc( memory, cur_size, new_size, block ); - if ( block2 == NULL ) - error = FT_THROW( Out_Of_Memory ); - else - block = block2; - } - - *p_error = error; - return block; - } - - - FT_BASE_DEF( void ) - ft_mem_free( FT_Memory memory, - const void *P ) - { - if ( P ) - memory->free( memory, (void*)P ); - } - - - FT_BASE_DEF( FT_Pointer ) - ft_mem_dup( FT_Memory memory, - const void* address, - FT_ULong size, - FT_Error *p_error ) - { - FT_Error error; - FT_Pointer p = ft_mem_qalloc( memory, (FT_Long)size, &error ); - - - if ( !error && address ) - ft_memcpy( p, address, size ); - - *p_error = error; - return p; - } - - - FT_BASE_DEF( FT_Pointer ) - ft_mem_strdup( FT_Memory memory, - const char* str, - FT_Error *p_error ) - { - FT_ULong len = str ? (FT_ULong)ft_strlen( str ) + 1 - : 0; - - - return ft_mem_dup( memory, str, len, p_error ); - } - - - FT_BASE_DEF( FT_Int ) - ft_mem_strcpyn( char* dst, - const char* src, - FT_ULong size ) - { - while ( size > 1 && *src != 0 ) - { - *dst++ = *src++; - size--; - } - - *dst = 0; /* always zero-terminate */ - - return *src != 0; - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** *****/ - /***** D O U B L Y L I N K E D L I S T S *****/ - /***** *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - -#undef FT_COMPONENT -#define FT_COMPONENT trace_list - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( FT_ListNode ) - FT_List_Find( FT_List list, - void* data ) - { - FT_ListNode cur; - - - if ( !list ) - return NULL; - - cur = list->head; - while ( cur ) - { - if ( cur->data == data ) - return cur; - - cur = cur->next; - } - - return NULL; - } - - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( void ) - FT_List_Add( FT_List list, - FT_ListNode node ) - { - FT_ListNode before; - - - if ( !list || !node ) - return; - - before = list->tail; - - node->next = NULL; - node->prev = before; - - if ( before ) - before->next = node; - else - list->head = node; - - list->tail = node; - } - - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( void ) - FT_List_Insert( FT_List list, - FT_ListNode node ) - { - FT_ListNode after; - - - if ( !list || !node ) - return; - - after = list->head; - - node->next = after; - node->prev = NULL; - - if ( !after ) - list->tail = node; - else - after->prev = node; - - list->head = node; - } - - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( void ) - FT_List_Remove( FT_List list, - FT_ListNode node ) - { - FT_ListNode before, after; - - - if ( !list || !node ) - return; - - before = node->prev; - after = node->next; - - if ( before ) - before->next = after; - else - list->head = after; - - if ( after ) - after->prev = before; - else - list->tail = before; - } - - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( void ) - FT_List_Up( FT_List list, - FT_ListNode node ) - { - FT_ListNode before, after; - - - if ( !list || !node ) - return; - - before = node->prev; - after = node->next; - - /* check whether we are already on top of the list */ - if ( !before ) - return; - - before->next = after; - - if ( after ) - after->prev = before; - else - list->tail = before; - - node->prev = NULL; - node->next = list->head; - list->head->prev = node; - list->head = node; - } - - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_List_Iterate( FT_List list, - FT_List_Iterator iterator, - void* user ) - { - FT_ListNode cur; - FT_Error error = FT_Err_Ok; - - - if ( !list || !iterator ) - return FT_THROW( Invalid_Argument ); - - cur = list->head; - - while ( cur ) - { - FT_ListNode next = cur->next; - - - error = iterator( cur, user ); - if ( error ) - break; - - cur = next; - } - - return error; - } - - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( void ) - FT_List_Finalize( FT_List list, - FT_List_Destructor destroy, - FT_Memory memory, - void* user ) - { - FT_ListNode cur; - - - if ( !list || !memory ) - return; - - cur = list->head; - while ( cur ) - { - FT_ListNode next = cur->next; - void* data = cur->data; - - - if ( destroy ) - destroy( memory, data, user ); - - FT_FREE( cur ); - cur = next; - } - - list->head = NULL; - list->tail = NULL; - } - - -/* END */ diff --git a/3party/freetype/src/base/ftwinfnt.c b/3party/freetype/src/base/ftwinfnt.c deleted file mode 100644 index 76a19af983..0000000000 --- a/3party/freetype/src/base/ftwinfnt.c +++ /dev/null @@ -1,53 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftwinfnt.c */ -/* */ -/* FreeType API for accessing Windows FNT specific info (body). */ -/* */ -/* Copyright 2003-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_WINFONTS_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_WINFNT_H - - - /* documentation is in ftwinfnt.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_WinFNT_Header( FT_Face face, - FT_WinFNT_HeaderRec *header ) - { - FT_Service_WinFnt service; - FT_Error error; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( !header ) - return FT_THROW( Invalid_Argument ); - - FT_FACE_LOOKUP_SERVICE( face, service, WINFNT ); - - if ( service ) - error = service->get_header( face, header ); - else - error = FT_THROW( Invalid_Argument ); - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/base/md5.c b/3party/freetype/src/base/md5.c deleted file mode 100644 index 52d96accd3..0000000000 --- a/3party/freetype/src/base/md5.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. - * MD5 Message-Digest Algorithm (RFC 1321). - * - * Homepage: - * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 - * - * Author: - * Alexander Peslyak, better known as Solar Designer <solar at openwall.com> - * - * This software was written by Alexander Peslyak in 2001. No copyright is - * claimed, and the software is hereby placed in the public domain. - * In case this attempt to disclaim copyright and place the software in the - * public domain is deemed null and void, then the software is - * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the - * general public under the following terms: - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted. - * - * There's ABSOLUTELY NO WARRANTY, express or implied. - * - * (This is a heavily cut-down "BSD license".) - * - * This differs from Colin Plumb's older public domain implementation in that - * no exactly 32-bit integer data type is required (any 32-bit or wider - * unsigned integer data type will do), there's no compile-time endianness - * configuration, and the function prototypes match OpenSSL's. No code from - * Colin Plumb's implementation has been reused; this comment merely compares - * the properties of the two independent implementations. - * - * The primary goals of this implementation are portability and ease of use. - * It is meant to be fast, but not as fast as possible. Some known - * optimizations are not included to reduce source code size and avoid - * compile-time configuration. - */ - -#ifndef HAVE_OPENSSL - -#include <string.h> - -#include "md5.h" - -/* - * The basic MD5 functions. - * - * F and G are optimized compared to their RFC 1321 definitions for - * architectures that lack an AND-NOT instruction, just like in Colin Plumb's - * implementation. - */ -#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) -#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y)))) -#define H(x, y, z) (((x) ^ (y)) ^ (z)) -#define H2(x, y, z) ((x) ^ ((y) ^ (z))) -#define I(x, y, z) ((y) ^ ((x) | ~(z))) - -/* - * The MD5 transformation for all four rounds. - */ -#define STEP(f, a, b, c, d, x, t, s) \ - (a) += f((b), (c), (d)) + (x) + (t); \ - (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \ - (a) += (b); - -/* - * SET reads 4 input bytes in little-endian byte order and stores them - * in a properly aligned word in host byte order. - * - * The check for little-endian architectures that tolerate unaligned - * memory accesses is just an optimization. Nothing will break if it - * doesn't work. - */ -#if defined(__i386__) || defined(__x86_64__) || defined(__vax__) -#define SET(n) \ - (*(MD5_u32plus *)&ptr[(n) * 4]) -#define GET(n) \ - SET(n) -#else -#define SET(n) \ - (ctx->block[(n)] = \ - (MD5_u32plus)ptr[(n) * 4] | \ - ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \ - ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \ - ((MD5_u32plus)ptr[(n) * 4 + 3] << 24)) -#define GET(n) \ - (ctx->block[(n)]) -#endif - -/* - * This processes one or more 64-byte data blocks, but does NOT update - * the bit counters. There are no alignment requirements. - */ -static const void *body(MD5_CTX *ctx, const void *data, unsigned long size) -{ - const unsigned char *ptr; - MD5_u32plus a, b, c, d; - MD5_u32plus saved_a, saved_b, saved_c, saved_d; - - ptr = (const unsigned char *)data; - - a = ctx->a; - b = ctx->b; - c = ctx->c; - d = ctx->d; - - do { - saved_a = a; - saved_b = b; - saved_c = c; - saved_d = d; - -/* Round 1 */ - STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7) - STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12) - STEP(F, c, d, a, b, SET(2), 0x242070db, 17) - STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22) - STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7) - STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12) - STEP(F, c, d, a, b, SET(6), 0xa8304613, 17) - STEP(F, b, c, d, a, SET(7), 0xfd469501, 22) - STEP(F, a, b, c, d, SET(8), 0x698098d8, 7) - STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12) - STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17) - STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22) - STEP(F, a, b, c, d, SET(12), 0x6b901122, 7) - STEP(F, d, a, b, c, SET(13), 0xfd987193, 12) - STEP(F, c, d, a, b, SET(14), 0xa679438e, 17) - STEP(F, b, c, d, a, SET(15), 0x49b40821, 22) - -/* Round 2 */ - STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5) - STEP(G, d, a, b, c, GET(6), 0xc040b340, 9) - STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14) - STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20) - STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5) - STEP(G, d, a, b, c, GET(10), 0x02441453, 9) - STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14) - STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20) - STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5) - STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9) - STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14) - STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20) - STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5) - STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9) - STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14) - STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20) - -/* Round 3 */ - STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4) - STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11) - STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16) - STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23) - STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4) - STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11) - STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16) - STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23) - STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4) - STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11) - STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16) - STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23) - STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4) - STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11) - STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16) - STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23) - -/* Round 4 */ - STEP(I, a, b, c, d, GET(0), 0xf4292244, 6) - STEP(I, d, a, b, c, GET(7), 0x432aff97, 10) - STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15) - STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21) - STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6) - STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10) - STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15) - STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21) - STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6) - STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10) - STEP(I, c, d, a, b, GET(6), 0xa3014314, 15) - STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21) - STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6) - STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10) - STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15) - STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21) - - a += saved_a; - b += saved_b; - c += saved_c; - d += saved_d; - - ptr += 64; - } while (size -= 64); - - ctx->a = a; - ctx->b = b; - ctx->c = c; - ctx->d = d; - - return ptr; -} - -void MD5_Init(MD5_CTX *ctx) -{ - ctx->a = 0x67452301; - ctx->b = 0xefcdab89; - ctx->c = 0x98badcfe; - ctx->d = 0x10325476; - - ctx->lo = 0; - ctx->hi = 0; -} - -void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size) -{ - MD5_u32plus saved_lo; - unsigned long used, available; - - saved_lo = ctx->lo; - if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo) - ctx->hi++; - ctx->hi += size >> 29; - - used = saved_lo & 0x3f; - - if (used) { - available = 64 - used; - - if (size < available) { - memcpy(&ctx->buffer[used], data, size); - return; - } - - memcpy(&ctx->buffer[used], data, available); - data = (const unsigned char *)data + available; - size -= available; - body(ctx, ctx->buffer, 64); - } - - if (size >= 64) { - data = body(ctx, data, size & ~(unsigned long)0x3f); - size &= 0x3f; - } - - memcpy(ctx->buffer, data, size); -} - -void MD5_Final(unsigned char *result, MD5_CTX *ctx) -{ - unsigned long used, available; - - used = ctx->lo & 0x3f; - - ctx->buffer[used++] = 0x80; - - available = 64 - used; - - if (available < 8) { - memset(&ctx->buffer[used], 0, available); - body(ctx, ctx->buffer, 64); - used = 0; - available = 64; - } - - memset(&ctx->buffer[used], 0, available - 8); - - ctx->lo <<= 3; - ctx->buffer[56] = ctx->lo; - ctx->buffer[57] = ctx->lo >> 8; - ctx->buffer[58] = ctx->lo >> 16; - ctx->buffer[59] = ctx->lo >> 24; - ctx->buffer[60] = ctx->hi; - ctx->buffer[61] = ctx->hi >> 8; - ctx->buffer[62] = ctx->hi >> 16; - ctx->buffer[63] = ctx->hi >> 24; - - body(ctx, ctx->buffer, 64); - - result[0] = ctx->a; - result[1] = ctx->a >> 8; - result[2] = ctx->a >> 16; - result[3] = ctx->a >> 24; - result[4] = ctx->b; - result[5] = ctx->b >> 8; - result[6] = ctx->b >> 16; - result[7] = ctx->b >> 24; - result[8] = ctx->c; - result[9] = ctx->c >> 8; - result[10] = ctx->c >> 16; - result[11] = ctx->c >> 24; - result[12] = ctx->d; - result[13] = ctx->d >> 8; - result[14] = ctx->d >> 16; - result[15] = ctx->d >> 24; - - memset(ctx, 0, sizeof(*ctx)); -} - -#endif diff --git a/3party/freetype/src/base/md5.h b/3party/freetype/src/base/md5.h deleted file mode 100644 index 2da44bf355..0000000000 --- a/3party/freetype/src/base/md5.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. - * MD5 Message-Digest Algorithm (RFC 1321). - * - * Homepage: - * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 - * - * Author: - * Alexander Peslyak, better known as Solar Designer <solar at openwall.com> - * - * This software was written by Alexander Peslyak in 2001. No copyright is - * claimed, and the software is hereby placed in the public domain. - * In case this attempt to disclaim copyright and place the software in the - * public domain is deemed null and void, then the software is - * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the - * general public under the following terms: - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted. - * - * There's ABSOLUTELY NO WARRANTY, express or implied. - * - * See md5.c for more information. - */ - -#ifdef HAVE_OPENSSL -#include <openssl/md5.h> -#elif !defined(_MD5_H) -#define _MD5_H - -/* Any 32-bit or wider unsigned integer data type will do */ -typedef unsigned int MD5_u32plus; - -typedef struct { - MD5_u32plus lo, hi; - MD5_u32plus a, b, c, d; - unsigned char buffer[64]; - MD5_u32plus block[16]; -} MD5_CTX; - -extern void MD5_Init(MD5_CTX *ctx); -extern void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size); -extern void MD5_Final(unsigned char *result, MD5_CTX *ctx); - -#endif diff --git a/3party/freetype/src/base/rules.mk b/3party/freetype/src/base/rules.mk deleted file mode 100644 index 1852e08613..0000000000 --- a/3party/freetype/src/base/rules.mk +++ /dev/null @@ -1,105 +0,0 @@ -# -# FreeType 2 base layer configuration rules -# - - -# Copyright 1996-2015 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. - - -# It sets the following variables which are used by the master Makefile -# after the call: -# -# BASE_OBJ_S: The single-object base layer. -# BASE_OBJ_M: A list of all objects for a multiple-objects build. -# BASE_EXT_OBJ: A list of base layer extensions, i.e., components found -# in `src/base' which are not compiled within the base -# layer proper. - - -BASE_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(BASE_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# Base layer sources -# -# ftsystem, ftinit, and ftdebug are handled by freetype.mk -# -# All files listed here should be included in `ftbase.c' (for a `single' -# build). -# -BASE_SRC := $(BASE_DIR)/basepic.c \ - $(BASE_DIR)/ftadvanc.c \ - $(BASE_DIR)/ftcalc.c \ - $(BASE_DIR)/ftdbgmem.c \ - $(BASE_DIR)/ftgloadr.c \ - $(BASE_DIR)/ftobjs.c \ - $(BASE_DIR)/ftoutln.c \ - $(BASE_DIR)/ftpic.c \ - $(BASE_DIR)/ftrfork.c \ - $(BASE_DIR)/ftsnames.c \ - $(BASE_DIR)/ftstream.c \ - $(BASE_DIR)/fttrigon.c \ - $(BASE_DIR)/ftutil.c - - -ifneq ($(ftmac_c),) - BASE_SRC += $(BASE_DIR)/$(ftmac_c) -endif - -# for simplicity, we also handle `md5.c' (which gets included by `ftobjs.h') -BASE_H := $(BASE_DIR)/basepic.h \ - $(BASE_DIR)/ftbase.h \ - $(BASE_DIR)/md5.c \ - $(BASE_DIR)/md5.h - -# Base layer `extensions' sources -# -# An extension is added to the library file as a separate object. It is -# then linked to the final executable only if one of its symbols is used by -# the application. -# -BASE_EXT_SRC := $(patsubst %,$(BASE_DIR)/%,$(BASE_EXTENSIONS)) - -# Default extensions objects -# -BASE_EXT_OBJ := $(BASE_EXT_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O) - - -# Base layer object(s) -# -# BASE_OBJ_M is used during `multi' builds (each base source file compiles -# to a single object file). -# -# BASE_OBJ_S is used during `single' builds (the whole base layer is -# compiled as a single object file using ftbase.c). -# -BASE_OBJ_M := $(BASE_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O) -BASE_OBJ_S := $(OBJ_DIR)/ftbase.$O - -# Base layer root source file for single build -# -BASE_SRC_S := $(BASE_DIR)/ftbase.c - - -# Base layer - single object build -# -$(BASE_OBJ_S): $(BASE_SRC_S) $(BASE_SRC) $(FREETYPE_H) $(BASE_H) - $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BASE_SRC_S)) - - -# Multiple objects build + extensions -# -$(OBJ_DIR)/%.$O: $(BASE_DIR)/%.c $(FREETYPE_H) $(BASE_H) - $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# EOF diff --git a/3party/freetype/src/bdf/Jamfile b/3party/freetype/src/bdf/Jamfile deleted file mode 100644 index 86b85fa3e4..0000000000 --- a/3party/freetype/src/bdf/Jamfile +++ /dev/null @@ -1,31 +0,0 @@ -# FreeType 2 src/bdf Jamfile -# -# Copyright 2002-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) bdf ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = bdfdrivr - bdflib - ; - } - else - { - _sources = bdf ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/bdf Jamfile diff --git a/3party/freetype/src/bdf/README b/3party/freetype/src/bdf/README deleted file mode 100644 index b761aba2b2..0000000000 --- a/3party/freetype/src/bdf/README +++ /dev/null @@ -1,148 +0,0 @@ - FreeType font driver for BDF fonts - - Francesco Zappa Nardelli - <francesco.zappa.nardelli@ens.fr> - - -Introduction -************ - -BDF (Bitmap Distribution Format) is a bitmap font format defined by Adobe, -which is intended to be easily understood by both humans and computers. -This code implements a BDF driver for the FreeType library, following the -Adobe Specification V 2.2. The specification of the BDF font format is -available from Adobe's web site: - - http://partners.adobe.com/public/developer/en/font/5005.BDF_Spec.pdf - -Many good bitmap fonts in bdf format come with XFree86 (www.XFree86.org). -They do not define vertical metrics, because the X Consortium BDF -specification has removed them. - - -Encodings -********* - -The variety of encodings that accompanies bdf fonts appears to encompass the -small set defined in freetype.h. On the other hand, two properties that -specify encoding and registry are usually defined in bdf fonts. - -I decided to make these two properties directly accessible, leaving to the -client application the work of interpreting them. For instance: - - - #include FT_INTERNAL_BDF_TYPES_H - - FT_Face face; - BDF_Public_Face bdfface; - - - FT_New_Face( library, ..., &face ); - - bdfface = (BDF_Public_Face)face; - - if ( ( bdfface->charset_registry == "ISO10646" ) && - ( bdfface->charset_encoding == "1" ) ) - [..] - - -Thus the driver always exports `ft_encoding_none' as face->charmap.encoding. -FT_Get_Char_Index's behavior is unmodified, that is, it converts the ULong -value given as argument into the corresponding glyph number. - -If the two properties are not available, Adobe Standard Encoding should be -assumed. - - -Anti-Aliased Bitmaps -******************** - -The driver supports an extension to the BDF format as used in Mark Leisher's -xmbdfed bitmap font editor. Microsoft's SBIT tool expects bitmap fonts in -that format for adding anti-aliased them to TrueType fonts. It introduces a -fourth field to the `SIZE' keyword which gives the bpp value (bits per -pixel) of the glyph data in the font. Possible values are 1 (the default), -2 (four gray levels), 4 (16 gray levels), and 8 (256 gray levels). The -driver returns either a bitmap with 1 bit per pixel or a pixmap with 8bits -per pixel (using 4, 16, and 256 gray levels, respectively). - - -Known problems -************** - -- A font is entirely loaded into memory. Obviously, this is not the Right - Thing(TM). If you have big fonts I suggest you convert them into PCF - format (using the bdftopcf utility): the PCF font drive of FreeType can - perform incremental glyph loading. - -When I have some time, I will implement on-demand glyph parsing. - -- Except for encodings properties, client applications have no visibility of - the PCF_Face object. This means that applications cannot directly access - font tables and must trust FreeType. - -- Currently, glyph names are ignored. - - I plan to give full visibility of the BDF_Face object in an upcoming - revision of the driver, thus implementing also glyph names. - -- As I have never seen a BDF font that defines vertical metrics, vertical - metrics are (parsed and) discarded. If you own a BDF font that defines - vertical metrics, please let me know (I will implement them in 5-10 - minutes). - - -License -******* - -Copyright (C) 2001-2002 by Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -*** Portions of the driver (that is, bdflib.c and bdf.h): - -Copyright 2000 Computing Research Labs, New Mexico State University -Copyright 2001-2002, 2011 Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT -OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -Credits -******* - -This driver is based on excellent Mark Leisher's bdf library. If you -find something good in this driver you should probably thank him, not -me. diff --git a/3party/freetype/src/bdf/bdf.c b/3party/freetype/src/bdf/bdf.c deleted file mode 100644 index f95fb76225..0000000000 --- a/3party/freetype/src/bdf/bdf.c +++ /dev/null @@ -1,34 +0,0 @@ -/* bdf.c - - FreeType font driver for bdf files - - Copyright (C) 2001, 2002 by - Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "bdflib.c" -#include "bdfdrivr.c" - - -/* END */ diff --git a/3party/freetype/src/bdf/bdf.h b/3party/freetype/src/bdf/bdf.h deleted file mode 100644 index f24d925d8f..0000000000 --- a/3party/freetype/src/bdf/bdf.h +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright 2000 Computing Research Labs, New Mexico State University - * Copyright 2001-2004, 2011 Francesco Zappa Nardelli - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT - * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR - * THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - -#ifndef __BDF_H__ -#define __BDF_H__ - - -/* - * Based on bdf.h,v 1.16 2000/03/16 20:08:51 mleisher - */ - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_STREAM_H - - -FT_BEGIN_HEADER - - -/* Imported from bdfP.h */ - -#define _bdf_glyph_modified( map, e ) \ - ( (map)[(e) >> 5] & ( 1UL << ( (e) & 31 ) ) ) -#define _bdf_set_glyph_modified( map, e ) \ - ( (map)[(e) >> 5] |= ( 1UL << ( (e) & 31 ) ) ) -#define _bdf_clear_glyph_modified( map, e ) \ - ( (map)[(e) >> 5] &= ~( 1UL << ( (e) & 31 ) ) ) - -/* end of bdfP.h */ - - - /*************************************************************************/ - /* */ - /* BDF font options macros and types. */ - /* */ - /*************************************************************************/ - - -#define BDF_CORRECT_METRICS 0x01 /* Correct invalid metrics when loading. */ -#define BDF_KEEP_COMMENTS 0x02 /* Preserve the font comments. */ -#define BDF_KEEP_UNENCODED 0x04 /* Keep the unencoded glyphs. */ -#define BDF_PROPORTIONAL 0x08 /* Font has proportional spacing. */ -#define BDF_MONOWIDTH 0x10 /* Font has mono width. */ -#define BDF_CHARCELL 0x20 /* Font has charcell spacing. */ - -#define BDF_ALL_SPACING ( BDF_PROPORTIONAL | \ - BDF_MONOWIDTH | \ - BDF_CHARCELL ) - -#define BDF_DEFAULT_LOAD_OPTIONS ( BDF_CORRECT_METRICS | \ - BDF_KEEP_COMMENTS | \ - BDF_KEEP_UNENCODED | \ - BDF_PROPORTIONAL ) - - - typedef struct bdf_options_t_ - { - int correct_metrics; - int keep_unencoded; - int keep_comments; - int font_spacing; - - } bdf_options_t; - - - /* Callback function type for unknown configuration options. */ - typedef int - (*bdf_options_callback_t)( bdf_options_t* opts, - char** params, - unsigned long nparams, - void* client_data ); - - - /*************************************************************************/ - /* */ - /* BDF font property macros and types. */ - /* */ - /*************************************************************************/ - - -#define BDF_ATOM 1 -#define BDF_INTEGER 2 -#define BDF_CARDINAL 3 - - - /* This structure represents a particular property of a font. */ - /* There are a set of defaults and each font has their own. */ - typedef struct bdf_property_t_ - { - char* name; /* Name of the property. */ - int format; /* Format of the property. */ - int builtin; /* A builtin property. */ - union - { - char* atom; - long l; - unsigned long ul; - - } value; /* Value of the property. */ - - } bdf_property_t; - - - /*************************************************************************/ - /* */ - /* BDF font metric and glyph types. */ - /* */ - /*************************************************************************/ - - - typedef struct bdf_bbx_t_ - { - unsigned short width; - unsigned short height; - - short x_offset; - short y_offset; - - short ascent; - short descent; - - } bdf_bbx_t; - - - typedef struct bdf_glyph_t_ - { - char* name; /* Glyph name. */ - long encoding; /* Glyph encoding. */ - unsigned short swidth; /* Scalable width. */ - unsigned short dwidth; /* Device width. */ - bdf_bbx_t bbx; /* Glyph bounding box. */ - unsigned char* bitmap; /* Glyph bitmap. */ - unsigned long bpr; /* Number of bytes used per row. */ - unsigned short bytes; /* Number of bytes used for the bitmap. */ - - } bdf_glyph_t; - - - typedef struct _hashnode_ - { - const char* key; - size_t data; - - } _hashnode, *hashnode; - - - typedef struct hashtable_ - { - unsigned int limit; - unsigned int size; - unsigned int used; - hashnode* table; - - } hashtable; - - - typedef struct bdf_glyphlist_t_ - { - unsigned short pad; /* Pad to 4-byte boundary. */ - unsigned short bpp; /* Bits per pixel. */ - long start; /* Beginning encoding value of glyphs. */ - long end; /* Ending encoding value of glyphs. */ - bdf_glyph_t* glyphs; /* Glyphs themselves. */ - unsigned long glyphs_size; /* Glyph structures allocated. */ - unsigned long glyphs_used; /* Glyph structures used. */ - bdf_bbx_t bbx; /* Overall bounding box of glyphs. */ - - } bdf_glyphlist_t; - - - typedef struct bdf_font_t_ - { - char* name; /* Name of the font. */ - bdf_bbx_t bbx; /* Font bounding box. */ - - unsigned long point_size; /* Point size of the font. */ - unsigned long resolution_x; /* Font horizontal resolution. */ - unsigned long resolution_y; /* Font vertical resolution. */ - - int spacing; /* Font spacing value. */ - - unsigned short monowidth; /* Logical width for monowidth font. */ - - long default_char; /* Encoding of the default glyph. */ - - long font_ascent; /* Font ascent. */ - long font_descent; /* Font descent. */ - - unsigned long glyphs_size; /* Glyph structures allocated. */ - unsigned long glyphs_used; /* Glyph structures used. */ - bdf_glyph_t* glyphs; /* Glyphs themselves. */ - - unsigned long unencoded_size; /* Unencoded glyph struct. allocated. */ - unsigned long unencoded_used; /* Unencoded glyph struct. used. */ - bdf_glyph_t* unencoded; /* Unencoded glyphs themselves. */ - - unsigned long props_size; /* Font properties allocated. */ - unsigned long props_used; /* Font properties used. */ - bdf_property_t* props; /* Font properties themselves. */ - - char* comments; /* Font comments. */ - unsigned long comments_len; /* Length of comment string. */ - - bdf_glyphlist_t overflow; /* Storage used for glyph insertion. */ - - void* internal; /* Internal data for the font. */ - - /* The size of the next two arrays must be in sync with the */ - /* size of the `have' array in the `bdf_parse_t' structure. */ - unsigned long nmod[34816]; /* Bitmap indicating modified glyphs. */ - unsigned long umod[34816]; /* Bitmap indicating modified */ - /* unencoded glyphs. */ - unsigned short modified; /* Boolean indicating font modified. */ - unsigned short bpp; /* Bits per pixel. */ - - FT_Memory memory; - - bdf_property_t* user_props; - unsigned long nuser_props; - hashtable proptbl; - - } bdf_font_t; - - - /*************************************************************************/ - /* */ - /* Types for load/save callbacks. */ - /* */ - /*************************************************************************/ - - - /* Error codes. */ -#define BDF_MISSING_START -1 -#define BDF_MISSING_FONTNAME -2 -#define BDF_MISSING_SIZE -3 -#define BDF_MISSING_CHARS -4 -#define BDF_MISSING_STARTCHAR -5 -#define BDF_MISSING_ENCODING -6 -#define BDF_MISSING_BBX -7 - -#define BDF_OUT_OF_MEMORY -20 - -#define BDF_INVALID_LINE -100 - - - /*************************************************************************/ - /* */ - /* BDF font API. */ - /* */ - /*************************************************************************/ - - FT_LOCAL( FT_Error ) - bdf_load_font( FT_Stream stream, - FT_Memory memory, - bdf_options_t* opts, - bdf_font_t* *font ); - - FT_LOCAL( void ) - bdf_free_font( bdf_font_t* font ); - - FT_LOCAL( bdf_property_t * ) - bdf_get_property( char* name, - bdf_font_t* font ); - - FT_LOCAL( bdf_property_t * ) - bdf_get_font_property( bdf_font_t* font, - const char* name ); - - -FT_END_HEADER - - -#endif /* __BDF_H__ */ - - -/* END */ diff --git a/3party/freetype/src/bdf/bdfdrivr.c b/3party/freetype/src/bdf/bdfdrivr.c deleted file mode 100644 index 404af517e5..0000000000 --- a/3party/freetype/src/bdf/bdfdrivr.c +++ /dev/null @@ -1,898 +0,0 @@ -/* bdfdrivr.c - - FreeType font driver for bdf files - - Copyright (C) 2001-2008, 2011, 2013, 2014 by - Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#include <ft2build.h> - -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_OBJECTS_H -#include FT_BDF_H -#include FT_TRUETYPE_IDS_H - -#include FT_SERVICE_BDF_H -#include FT_SERVICE_FONT_FORMAT_H - -#include "bdf.h" -#include "bdfdrivr.h" - -#include "bdferror.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_bdfdriver - - - typedef struct BDF_CMapRec_ - { - FT_CMapRec cmap; - FT_ULong num_encodings; /* ftobjs.h: FT_CMap->clazz->size */ - BDF_encoding_el* encodings; - - } BDF_CMapRec, *BDF_CMap; - - - FT_CALLBACK_DEF( FT_Error ) - bdf_cmap_init( FT_CMap bdfcmap, - FT_Pointer init_data ) - { - BDF_CMap cmap = (BDF_CMap)bdfcmap; - BDF_Face face = (BDF_Face)FT_CMAP_FACE( cmap ); - FT_UNUSED( init_data ); - - - cmap->num_encodings = face->bdffont->glyphs_used; - cmap->encodings = face->en_table; - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( void ) - bdf_cmap_done( FT_CMap bdfcmap ) - { - BDF_CMap cmap = (BDF_CMap)bdfcmap; - - - cmap->encodings = NULL; - cmap->num_encodings = 0; - } - - - FT_CALLBACK_DEF( FT_UInt ) - bdf_cmap_char_index( FT_CMap bdfcmap, - FT_UInt32 charcode ) - { - BDF_CMap cmap = (BDF_CMap)bdfcmap; - BDF_encoding_el* encodings = cmap->encodings; - FT_ULong min, max, mid; /* num_encodings */ - FT_UShort result = 0; /* encodings->glyph */ - - - min = 0; - max = cmap->num_encodings; - - while ( min < max ) - { - FT_ULong code; - - - mid = ( min + max ) >> 1; - code = (FT_ULong)encodings[mid].enc; - - if ( charcode == code ) - { - /* increase glyph index by 1 -- */ - /* we reserve slot 0 for the undefined glyph */ - result = encodings[mid].glyph + 1; - break; - } - - if ( charcode < code ) - max = mid; - else - min = mid + 1; - } - - return result; - } - - - FT_CALLBACK_DEF( FT_UInt ) - bdf_cmap_char_next( FT_CMap bdfcmap, - FT_UInt32 *acharcode ) - { - BDF_CMap cmap = (BDF_CMap)bdfcmap; - BDF_encoding_el* encodings = cmap->encodings; - FT_ULong min, max, mid; /* num_encodings */ - FT_UShort result = 0; /* encodings->glyph */ - FT_ULong charcode = *acharcode + 1; - - - min = 0; - max = cmap->num_encodings; - - while ( min < max ) - { - FT_ULong code; /* same as BDF_encoding_el.enc */ - - - mid = ( min + max ) >> 1; - code = (FT_ULong)encodings[mid].enc; - - if ( charcode == code ) - { - /* increase glyph index by 1 -- */ - /* we reserve slot 0 for the undefined glyph */ - result = encodings[mid].glyph + 1; - goto Exit; - } - - if ( charcode < code ) - max = mid; - else - min = mid + 1; - } - - charcode = 0; - if ( min < cmap->num_encodings ) - { - charcode = (FT_ULong)encodings[min].enc; - result = encodings[min].glyph + 1; - } - - Exit: - if ( charcode > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "bdf_cmap_char_next: charcode 0x%x > 32bit API" )); - *acharcode = 0; - /* XXX: result should be changed to indicate an overflow error */ - } - else - *acharcode = (FT_UInt32)charcode; - return result; - } - - - static - const FT_CMap_ClassRec bdf_cmap_class = - { - sizeof ( BDF_CMapRec ), - bdf_cmap_init, - bdf_cmap_done, - bdf_cmap_char_index, - bdf_cmap_char_next, - - NULL, NULL, NULL, NULL, NULL - }; - - - static FT_Error - bdf_interpret_style( BDF_Face bdf ) - { - FT_Error error = FT_Err_Ok; - FT_Face face = FT_FACE( bdf ); - FT_Memory memory = face->memory; - bdf_font_t* font = bdf->bdffont; - bdf_property_t* prop; - - char* strings[4] = { NULL, NULL, NULL, NULL }; - size_t nn, len, lengths[4]; - - - face->style_flags = 0; - - prop = bdf_get_font_property( font, (char *)"SLANT" ); - if ( prop && prop->format == BDF_ATOM && - prop->value.atom && - ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' || - *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) ) - { - face->style_flags |= FT_STYLE_FLAG_ITALIC; - strings[2] = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ) - ? (char *)"Oblique" - : (char *)"Italic"; - } - - prop = bdf_get_font_property( font, (char *)"WEIGHT_NAME" ); - if ( prop && prop->format == BDF_ATOM && - prop->value.atom && - ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) - { - face->style_flags |= FT_STYLE_FLAG_BOLD; - strings[1] = (char *)"Bold"; - } - - prop = bdf_get_font_property( font, (char *)"SETWIDTH_NAME" ); - if ( prop && prop->format == BDF_ATOM && - prop->value.atom && *(prop->value.atom) && - !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) - strings[3] = (char *)(prop->value.atom); - - prop = bdf_get_font_property( font, (char *)"ADD_STYLE_NAME" ); - if ( prop && prop->format == BDF_ATOM && - prop->value.atom && *(prop->value.atom) && - !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) - strings[0] = (char *)(prop->value.atom); - - for ( len = 0, nn = 0; nn < 4; nn++ ) - { - lengths[nn] = 0; - if ( strings[nn] ) - { - lengths[nn] = ft_strlen( strings[nn] ); - len += lengths[nn] + 1; - } - } - - if ( len == 0 ) - { - strings[0] = (char *)"Regular"; - lengths[0] = ft_strlen( strings[0] ); - len = lengths[0] + 1; - } - - { - char* s; - - - if ( FT_ALLOC( face->style_name, len ) ) - return error; - - s = face->style_name; - - for ( nn = 0; nn < 4; nn++ ) - { - char* src = strings[nn]; - - - len = lengths[nn]; - - if ( src == NULL ) - continue; - - /* separate elements with a space */ - if ( s != face->style_name ) - *s++ = ' '; - - ft_memcpy( s, src, len ); - - /* need to convert spaces to dashes for */ - /* add_style_name and setwidth_name */ - if ( nn == 0 || nn == 3 ) - { - size_t mm; - - - for ( mm = 0; mm < len; mm++ ) - if ( s[mm] == ' ' ) - s[mm] = '-'; - } - - s += len; - } - *s = 0; - } - - return error; - } - - - FT_CALLBACK_DEF( void ) - BDF_Face_Done( FT_Face bdfface ) /* BDF_Face */ - { - BDF_Face face = (BDF_Face)bdfface; - FT_Memory memory; - - - if ( !face ) - return; - - memory = FT_FACE_MEMORY( face ); - - bdf_free_font( face->bdffont ); - - FT_FREE( face->en_table ); - - FT_FREE( face->charset_encoding ); - FT_FREE( face->charset_registry ); - FT_FREE( bdfface->family_name ); - FT_FREE( bdfface->style_name ); - - FT_FREE( bdfface->available_sizes ); - - FT_FREE( face->bdffont ); - } - - - FT_CALLBACK_DEF( FT_Error ) - BDF_Face_Init( FT_Stream stream, - FT_Face bdfface, /* BDF_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ) - { - FT_Error error = FT_Err_Ok; - BDF_Face face = (BDF_Face)bdfface; - FT_Memory memory = FT_FACE_MEMORY( face ); - - bdf_font_t* font = NULL; - bdf_options_t options; - - FT_UNUSED( num_params ); - FT_UNUSED( params ); - - - FT_TRACE2(( "BDF driver\n" )); - - if ( FT_STREAM_SEEK( 0 ) ) - goto Exit; - - options.correct_metrics = 1; /* FZ XXX: options semantics */ - options.keep_unencoded = 1; - options.keep_comments = 0; - options.font_spacing = BDF_PROPORTIONAL; - - error = bdf_load_font( stream, memory, &options, &font ); - if ( FT_ERR_EQ( error, Missing_Startfont_Field ) ) - { - FT_TRACE2(( " not a BDF file\n" )); - goto Fail; - } - else if ( error ) - goto Exit; - - /* we have a bdf font: let's construct the face object */ - face->bdffont = font; - - /* BDF could not have multiple face in single font file. - * XXX: non-zero face_index is already invalid argument, but - * Type1, Type42 driver has a convention to return - * an invalid argument error when the font could be - * opened by the specified driver. - */ - if ( face_index > 0 && ( face_index & 0xFFFF ) > 0 ) - { - FT_ERROR(( "BDF_Face_Init: invalid face index\n" )); - BDF_Face_Done( bdfface ); - return FT_THROW( Invalid_Argument ); - } - - { - bdf_property_t* prop = NULL; - - - FT_TRACE4(( " number of glyphs: allocated %d (used %d)\n", - font->glyphs_size, - font->glyphs_used )); - FT_TRACE4(( " number of unencoded glyphs: allocated %d (used %d)\n", - font->unencoded_size, - font->unencoded_used )); - - bdfface->num_faces = 1; - bdfface->face_index = 0; - - bdfface->face_flags |= FT_FACE_FLAG_FIXED_SIZES | - FT_FACE_FLAG_HORIZONTAL | - FT_FACE_FLAG_FAST_GLYPHS; - - prop = bdf_get_font_property( font, "SPACING" ); - if ( prop && prop->format == BDF_ATOM && - prop->value.atom && - ( *(prop->value.atom) == 'M' || *(prop->value.atom) == 'm' || - *(prop->value.atom) == 'C' || *(prop->value.atom) == 'c' ) ) - bdfface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; - - /* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL */ - /* FZ XXX: I need a font to implement this */ - - prop = bdf_get_font_property( font, "FAMILY_NAME" ); - if ( prop && prop->value.atom ) - { - if ( FT_STRDUP( bdfface->family_name, prop->value.atom ) ) - goto Exit; - } - else - bdfface->family_name = NULL; - - if ( ( error = bdf_interpret_style( face ) ) != 0 ) - goto Exit; - - /* the number of glyphs (with one slot for the undefined glyph */ - /* at position 0 and all unencoded glyphs) */ - bdfface->num_glyphs = (FT_Long)( font->glyphs_size + 1 ); - - bdfface->num_fixed_sizes = 1; - if ( FT_NEW_ARRAY( bdfface->available_sizes, 1 ) ) - goto Exit; - - { - FT_Bitmap_Size* bsize = bdfface->available_sizes; - FT_Short resolution_x = 0, resolution_y = 0; - - - FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) ); - - bsize->height = (FT_Short)( font->font_ascent + font->font_descent ); - - prop = bdf_get_font_property( font, "AVERAGE_WIDTH" ); - if ( prop ) - bsize->width = (FT_Short)( ( prop->value.l + 5 ) / 10 ); - else - bsize->width = (FT_Short)( bsize->height * 2/3 ); - - prop = bdf_get_font_property( font, "POINT_SIZE" ); - if ( prop ) - /* convert from 722.7 decipoints to 72 points per inch */ - bsize->size = - (FT_Pos)( ( prop->value.l * 64 * 7200 + 36135L ) / 72270L ); - else - bsize->size = bsize->width << 6; - - prop = bdf_get_font_property( font, "PIXEL_SIZE" ); - if ( prop ) - bsize->y_ppem = (FT_Short)prop->value.l << 6; - - prop = bdf_get_font_property( font, "RESOLUTION_X" ); - if ( prop ) - resolution_x = (FT_Short)prop->value.l; - - prop = bdf_get_font_property( font, "RESOLUTION_Y" ); - if ( prop ) - resolution_y = (FT_Short)prop->value.l; - - if ( bsize->y_ppem == 0 ) - { - bsize->y_ppem = bsize->size; - if ( resolution_y ) - bsize->y_ppem = bsize->y_ppem * resolution_y / 72; - } - if ( resolution_x && resolution_y ) - bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y; - else - bsize->x_ppem = bsize->y_ppem; - } - - /* encoding table */ - { - bdf_glyph_t* cur = font->glyphs; - unsigned long n; - - - if ( FT_NEW_ARRAY( face->en_table, font->glyphs_size ) ) - goto Exit; - - face->default_glyph = 0; - for ( n = 0; n < font->glyphs_size; n++ ) - { - (face->en_table[n]).enc = cur[n].encoding; - FT_TRACE4(( " idx %d, val 0x%lX\n", n, cur[n].encoding )); - (face->en_table[n]).glyph = (FT_UShort)n; - - if ( cur[n].encoding == font->default_char ) - { - if ( n < FT_UINT_MAX ) - face->default_glyph = (FT_UInt)n; - else - FT_TRACE1(( "BDF_Face_Init:" - " idx %d is too large for this system\n", n )); - } - } - } - - /* charmaps */ - { - bdf_property_t *charset_registry, *charset_encoding; - FT_Bool unicode_charmap = 0; - - - charset_registry = - bdf_get_font_property( font, "CHARSET_REGISTRY" ); - charset_encoding = - bdf_get_font_property( font, "CHARSET_ENCODING" ); - if ( charset_registry && charset_encoding ) - { - if ( charset_registry->format == BDF_ATOM && - charset_encoding->format == BDF_ATOM && - charset_registry->value.atom && - charset_encoding->value.atom ) - { - const char* s; - - - if ( FT_STRDUP( face->charset_encoding, - charset_encoding->value.atom ) || - FT_STRDUP( face->charset_registry, - charset_registry->value.atom ) ) - goto Exit; - - /* Uh, oh, compare first letters manually to avoid dependency */ - /* on locales. */ - s = face->charset_registry; - if ( ( s[0] == 'i' || s[0] == 'I' ) && - ( s[1] == 's' || s[1] == 'S' ) && - ( s[2] == 'o' || s[2] == 'O' ) ) - { - s += 3; - if ( !ft_strcmp( s, "10646" ) || - ( !ft_strcmp( s, "8859" ) && - !ft_strcmp( face->charset_encoding, "1" ) ) ) - unicode_charmap = 1; - } - - { - FT_CharMapRec charmap; - - - charmap.face = FT_FACE( face ); - charmap.encoding = FT_ENCODING_NONE; - /* initial platform/encoding should indicate unset status? */ - charmap.platform_id = TT_PLATFORM_APPLE_UNICODE; - charmap.encoding_id = TT_APPLE_ID_DEFAULT; - - if ( unicode_charmap ) - { - charmap.encoding = FT_ENCODING_UNICODE; - charmap.platform_id = TT_PLATFORM_MICROSOFT; - charmap.encoding_id = TT_MS_ID_UNICODE_CS; - } - - error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL ); - -#if 0 - /* Select default charmap */ - if ( bdfface->num_charmaps ) - bdfface->charmap = bdfface->charmaps[0]; -#endif - } - - goto Exit; - } - } - - /* otherwise assume Adobe standard encoding */ - - { - FT_CharMapRec charmap; - - - charmap.face = FT_FACE( face ); - charmap.encoding = FT_ENCODING_ADOBE_STANDARD; - charmap.platform_id = TT_PLATFORM_ADOBE; - charmap.encoding_id = TT_ADOBE_ID_STANDARD; - - error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL ); - - /* Select default charmap */ - if ( bdfface->num_charmaps ) - bdfface->charmap = bdfface->charmaps[0]; - } - } - } - - Exit: - return error; - - Fail: - BDF_Face_Done( bdfface ); - return FT_THROW( Unknown_File_Format ); - } - - - FT_CALLBACK_DEF( FT_Error ) - BDF_Size_Select( FT_Size size, - FT_ULong strike_index ) - { - bdf_font_t* bdffont = ( (BDF_Face)size->face )->bdffont; - - - FT_Select_Metrics( size->face, strike_index ); - - size->metrics.ascender = bdffont->font_ascent * 64; - size->metrics.descender = -bdffont->font_descent * 64; - size->metrics.max_advance = bdffont->bbx.width * 64; - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_Error ) - BDF_Size_Request( FT_Size size, - FT_Size_Request req ) - { - FT_Face face = size->face; - FT_Bitmap_Size* bsize = face->available_sizes; - bdf_font_t* bdffont = ( (BDF_Face)face )->bdffont; - FT_Error error = FT_ERR( Invalid_Pixel_Size ); - FT_Long height; - - - height = FT_REQUEST_HEIGHT( req ); - height = ( height + 32 ) >> 6; - - switch ( req->type ) - { - case FT_SIZE_REQUEST_TYPE_NOMINAL: - if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) ) - error = FT_Err_Ok; - break; - - case FT_SIZE_REQUEST_TYPE_REAL_DIM: - if ( height == ( bdffont->font_ascent + - bdffont->font_descent ) ) - error = FT_Err_Ok; - break; - - default: - error = FT_THROW( Unimplemented_Feature ); - break; - } - - if ( error ) - return error; - else - return BDF_Size_Select( size, 0 ); - } - - - - FT_CALLBACK_DEF( FT_Error ) - BDF_Glyph_Load( FT_GlyphSlot slot, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - BDF_Face bdf = (BDF_Face)FT_SIZE_FACE( size ); - FT_Face face = FT_FACE( bdf ); - FT_Error error = FT_Err_Ok; - FT_Bitmap* bitmap = &slot->bitmap; - bdf_glyph_t glyph; - int bpp = bdf->bdffont->bpp; - - FT_UNUSED( load_flags ); - - - if ( !face ) - { - error = FT_THROW( Invalid_Face_Handle ); - goto Exit; - } - - if ( glyph_index >= (FT_UInt)face->num_glyphs ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - FT_TRACE1(( "BDF_Glyph_Load: glyph index %d\n", glyph_index )); - - /* index 0 is the undefined glyph */ - if ( glyph_index == 0 ) - glyph_index = bdf->default_glyph; - else - glyph_index--; - - /* slot, bitmap => freetype, glyph => bdflib */ - glyph = bdf->bdffont->glyphs[glyph_index]; - - bitmap->rows = glyph.bbx.height; - bitmap->width = glyph.bbx.width; - if ( glyph.bpr > INT_MAX ) - FT_TRACE1(( "BDF_Glyph_Load: too large pitch %d is truncated\n", - glyph.bpr )); - bitmap->pitch = (int)glyph.bpr; /* same as FT_Bitmap.pitch */ - - /* note: we don't allocate a new array to hold the bitmap; */ - /* we can simply point to it */ - ft_glyphslot_set_bitmap( slot, glyph.bitmap ); - - switch ( bpp ) - { - case 1: - bitmap->pixel_mode = FT_PIXEL_MODE_MONO; - break; - case 2: - bitmap->pixel_mode = FT_PIXEL_MODE_GRAY2; - break; - case 4: - bitmap->pixel_mode = FT_PIXEL_MODE_GRAY4; - break; - case 8: - bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; - bitmap->num_grays = 256; - break; - } - - slot->format = FT_GLYPH_FORMAT_BITMAP; - slot->bitmap_left = glyph.bbx.x_offset; - slot->bitmap_top = glyph.bbx.ascent; - - slot->metrics.horiAdvance = (FT_Pos)( glyph.dwidth * 64 ); - slot->metrics.horiBearingX = (FT_Pos)( glyph.bbx.x_offset * 64 ); - slot->metrics.horiBearingY = (FT_Pos)( glyph.bbx.ascent * 64 ); - slot->metrics.width = (FT_Pos)( bitmap->width * 64 ); - slot->metrics.height = (FT_Pos)( bitmap->rows * 64 ); - - /* - * XXX DWIDTH1 and VVECTOR should be parsed and - * used here, provided such fonts do exist. - */ - ft_synthesize_vertical_metrics( &slot->metrics, - bdf->bdffont->bbx.height * 64 ); - - Exit: - return error; - } - - - /* - * - * BDF SERVICE - * - */ - - static FT_Error - bdf_get_bdf_property( BDF_Face face, - const char* prop_name, - BDF_PropertyRec *aproperty ) - { - bdf_property_t* prop; - - - FT_ASSERT( face && face->bdffont ); - - prop = bdf_get_font_property( face->bdffont, prop_name ); - if ( prop ) - { - switch ( prop->format ) - { - case BDF_ATOM: - aproperty->type = BDF_PROPERTY_TYPE_ATOM; - aproperty->u.atom = prop->value.atom; - break; - - case BDF_INTEGER: - if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) ) - { - FT_TRACE1(( "bdf_get_bdf_property:" - " too large integer 0x%x is truncated\n" )); - } - aproperty->type = BDF_PROPERTY_TYPE_INTEGER; - aproperty->u.integer = (FT_Int32)prop->value.l; - break; - - case BDF_CARDINAL: - if ( prop->value.ul > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "bdf_get_bdf_property:" - " too large cardinal 0x%x is truncated\n" )); - } - aproperty->type = BDF_PROPERTY_TYPE_CARDINAL; - aproperty->u.cardinal = (FT_UInt32)prop->value.ul; - break; - - default: - goto Fail; - } - return 0; - } - - Fail: - return FT_THROW( Invalid_Argument ); - } - - - static FT_Error - bdf_get_charset_id( BDF_Face face, - const char* *acharset_encoding, - const char* *acharset_registry ) - { - *acharset_encoding = face->charset_encoding; - *acharset_registry = face->charset_registry; - - return 0; - } - - - static const FT_Service_BDFRec bdf_service_bdf = - { - (FT_BDF_GetCharsetIdFunc)bdf_get_charset_id, - (FT_BDF_GetPropertyFunc) bdf_get_bdf_property - }; - - - /* - * - * SERVICES LIST - * - */ - - static const FT_ServiceDescRec bdf_services[] = - { - { FT_SERVICE_ID_BDF, &bdf_service_bdf }, - { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_BDF }, - { NULL, NULL } - }; - - - FT_CALLBACK_DEF( FT_Module_Interface ) - bdf_driver_requester( FT_Module module, - const char* name ) - { - FT_UNUSED( module ); - - return ft_service_list_lookup( bdf_services, name ); - } - - - - FT_CALLBACK_TABLE_DEF - const FT_Driver_ClassRec bdf_driver_class = - { - { - FT_MODULE_FONT_DRIVER | - FT_MODULE_DRIVER_NO_OUTLINES, - sizeof ( FT_DriverRec ), - - "bdf", - 0x10000L, - 0x20000L, - - 0, - - 0, /* FT_Module_Constructor */ - 0, /* FT_Module_Destructor */ - bdf_driver_requester - }, - - sizeof ( BDF_FaceRec ), - sizeof ( FT_SizeRec ), - sizeof ( FT_GlyphSlotRec ), - - BDF_Face_Init, - BDF_Face_Done, - 0, /* FT_Size_InitFunc */ - 0, /* FT_Size_DoneFunc */ - 0, /* FT_Slot_InitFunc */ - 0, /* FT_Slot_DoneFunc */ - - BDF_Glyph_Load, - - 0, /* FT_Face_GetKerningFunc */ - 0, /* FT_Face_AttachFunc */ - 0, /* FT_Face_GetAdvancesFunc */ - - BDF_Size_Request, - BDF_Size_Select - }; - - -/* END */ diff --git a/3party/freetype/src/bdf/bdfdrivr.h b/3party/freetype/src/bdf/bdfdrivr.h deleted file mode 100644 index 3c61d644f4..0000000000 --- a/3party/freetype/src/bdf/bdfdrivr.h +++ /dev/null @@ -1,80 +0,0 @@ -/* bdfdrivr.h - - FreeType font driver for bdf fonts - - Copyright (C) 2001, 2002, 2003, 2004 by - Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - - -#ifndef __BDFDRIVR_H__ -#define __BDFDRIVR_H__ - -#include <ft2build.h> -#include FT_INTERNAL_DRIVER_H - -#include "bdf.h" - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC -#error "this module does not support PIC yet" -#endif - - - typedef struct BDF_encoding_el_ - { - FT_Long enc; - FT_UShort glyph; - - } BDF_encoding_el; - - - typedef struct BDF_FaceRec_ - { - FT_FaceRec root; - - char* charset_encoding; - char* charset_registry; - - bdf_font_t* bdffont; - - BDF_encoding_el* en_table; - - FT_CharMap charmap_handle; - FT_CharMapRec charmap; /* a single charmap per face */ - - FT_UInt default_glyph; - - } BDF_FaceRec, *BDF_Face; - - - FT_EXPORT_VAR( const FT_Driver_ClassRec ) bdf_driver_class; - - -FT_END_HEADER - - -#endif /* __BDFDRIVR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/bdf/bdferror.h b/3party/freetype/src/bdf/bdferror.h deleted file mode 100644 index ea545aca06..0000000000 --- a/3party/freetype/src/bdf/bdferror.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2001, 2002, 2012 Francesco Zappa Nardelli - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT - * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR - * THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - /*************************************************************************/ - /* */ - /* This file is used to define the BDF error enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __BDFERROR_H__ -#define __BDFERROR_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX BDF_Err_ -#define FT_ERR_BASE FT_Mod_Err_BDF - -#include FT_ERRORS_H - -#endif /* __BDFERROR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/bdf/bdflib.c b/3party/freetype/src/bdf/bdflib.c deleted file mode 100644 index 414deb58ad..0000000000 --- a/3party/freetype/src/bdf/bdflib.c +++ /dev/null @@ -1,2685 +0,0 @@ -/* - * Copyright 2000 Computing Research Labs, New Mexico State University - * Copyright 2001-2014 - * Francesco Zappa Nardelli - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT - * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR - * THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - /*************************************************************************/ - /* */ - /* This file is based on bdf.c,v 1.22 2000/03/16 20:08:50 */ - /* */ - /* taken from Mark Leisher's xmbdfed package */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> - -#include FT_FREETYPE_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_OBJECTS_H - -#include "bdf.h" -#include "bdferror.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_bdflib - - - /*************************************************************************/ - /* */ - /* Default BDF font options. */ - /* */ - /*************************************************************************/ - - - static const bdf_options_t _bdf_opts = - { - 1, /* Correct metrics. */ - 1, /* Preserve unencoded glyphs. */ - 0, /* Preserve comments. */ - BDF_PROPORTIONAL /* Default spacing. */ - }; - - - /*************************************************************************/ - /* */ - /* Builtin BDF font properties. */ - /* */ - /*************************************************************************/ - - /* List of most properties that might appear in a font. Doesn't include */ - /* the RAW_* and AXIS_* properties in X11R6 polymorphic fonts. */ - - static const bdf_property_t _bdf_properties[] = - { - { (char *)"ADD_STYLE_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"CAP_HEIGHT", BDF_INTEGER, 1, { 0 } }, - { (char *)"CHARSET_COLLECTIONS", BDF_ATOM, 1, { 0 } }, - { (char *)"CHARSET_ENCODING", BDF_ATOM, 1, { 0 } }, - { (char *)"CHARSET_REGISTRY", BDF_ATOM, 1, { 0 } }, - { (char *)"COMMENT", BDF_ATOM, 1, { 0 } }, - { (char *)"COPYRIGHT", BDF_ATOM, 1, { 0 } }, - { (char *)"DEFAULT_CHAR", BDF_CARDINAL, 1, { 0 } }, - { (char *)"DESTINATION", BDF_CARDINAL, 1, { 0 } }, - { (char *)"DEVICE_FONT_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"END_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"FACE_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"FAMILY_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"FONT", BDF_ATOM, 1, { 0 } }, - { (char *)"FONTNAME_REGISTRY", BDF_ATOM, 1, { 0 } }, - { (char *)"FONT_ASCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"FONT_DESCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"FOUNDRY", BDF_ATOM, 1, { 0 } }, - { (char *)"FULL_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"ITALIC_ANGLE", BDF_INTEGER, 1, { 0 } }, - { (char *)"MAX_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"MIN_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"NORM_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"NOTICE", BDF_ATOM, 1, { 0 } }, - { (char *)"PIXEL_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"POINT_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"QUAD_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_ASCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_CAP_HEIGHT", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_DESCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_END_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_MAX_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_MIN_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_NORM_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_PIXEL_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_POINT_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_PIXELSIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_POINTSIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_QUAD_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_X_HEIGHT", BDF_INTEGER, 1, { 0 } }, - { (char *)"RELATIVE_SETWIDTH", BDF_CARDINAL, 1, { 0 } }, - { (char *)"RELATIVE_WEIGHT", BDF_CARDINAL, 1, { 0 } }, - { (char *)"RESOLUTION", BDF_INTEGER, 1, { 0 } }, - { (char *)"RESOLUTION_X", BDF_CARDINAL, 1, { 0 } }, - { (char *)"RESOLUTION_Y", BDF_CARDINAL, 1, { 0 } }, - { (char *)"SETWIDTH_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"SLANT", BDF_ATOM, 1, { 0 } }, - { (char *)"SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"SPACING", BDF_ATOM, 1, { 0 } }, - { (char *)"STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } }, - { (char *)"SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, - { (char *)"SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } }, - { (char *)"SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, - { (char *)"UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } }, - { (char *)"UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } }, - { (char *)"WEIGHT", BDF_CARDINAL, 1, { 0 } }, - { (char *)"WEIGHT_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"X_HEIGHT", BDF_INTEGER, 1, { 0 } }, - { (char *)"_MULE_BASELINE_OFFSET", BDF_INTEGER, 1, { 0 } }, - { (char *)"_MULE_RELATIVE_COMPOSE", BDF_INTEGER, 1, { 0 } }, - }; - - static const unsigned long - _num_bdf_properties = sizeof ( _bdf_properties ) / - sizeof ( _bdf_properties[0] ); - - - /* An auxiliary macro to parse properties, to be used in conditionals. */ - /* It behaves like `strncmp' but also tests the following character */ - /* whether it is a whitespace or NULL. */ - /* `property' is a constant string of length `n' to compare with. */ -#define _bdf_strncmp( name, property, n ) \ - ( ft_strncmp( name, property, n ) || \ - !( name[n] == ' ' || \ - name[n] == '\0' || \ - name[n] == '\n' || \ - name[n] == '\r' || \ - name[n] == '\t' ) ) - - /* Auto correction messages. */ -#define ACMSG1 "FONT_ASCENT property missing. " \ - "Added `FONT_ASCENT %hd'.\n" -#define ACMSG2 "FONT_DESCENT property missing. " \ - "Added `FONT_DESCENT %hd'.\n" -#define ACMSG3 "Font width != actual width. Old: %hd New: %hd.\n" -#define ACMSG4 "Font left bearing != actual left bearing. " \ - "Old: %hd New: %hd.\n" -#define ACMSG5 "Font ascent != actual ascent. Old: %hd New: %hd.\n" -#define ACMSG6 "Font descent != actual descent. Old: %hd New: %hd.\n" -#define ACMSG7 "Font height != actual height. Old: %hd New: %hd.\n" -#define ACMSG8 "Glyph scalable width (SWIDTH) adjustments made.\n" -#define ACMSG9 "SWIDTH field missing at line %ld. Set automatically.\n" -#define ACMSG10 "DWIDTH field missing at line %ld. Set to glyph width.\n" -#define ACMSG11 "SIZE bits per pixel field adjusted to %hd.\n" -#define ACMSG12 "Duplicate encoding %ld (%s) changed to unencoded.\n" -#define ACMSG13 "Glyph %ld extra rows removed.\n" -#define ACMSG14 "Glyph %ld extra columns removed.\n" -#define ACMSG15 "Incorrect glyph count: %ld indicated but %ld found.\n" -#define ACMSG16 "Glyph %ld missing columns padded with zero bits.\n" - - /* Error messages. */ -#define ERRMSG1 "[line %ld] Missing `%s' line.\n" -#define ERRMSG2 "[line %ld] Font header corrupted or missing fields.\n" -#define ERRMSG3 "[line %ld] Font glyphs corrupted or missing fields.\n" -#define ERRMSG4 "[line %ld] BBX too big.\n" -#define ERRMSG5 "[line %ld] `%s' value too big.\n" -#define ERRMSG6 "[line %ld] Input line too long.\n" -#define ERRMSG7 "[line %ld] Font name too long.\n" -#define ERRMSG8 "[line %ld] Invalid `%s' value.\n" -#define ERRMSG9 "[line %ld] Invalid keyword.\n" - - /* Debug messages. */ -#define DBGMSG1 " [%6ld] %s" /* no \n */ -#define DBGMSG2 " (0x%lX)\n" - - - /*************************************************************************/ - /* */ - /* Hash table utilities for the properties. */ - /* */ - /*************************************************************************/ - - /* XXX: Replace this with FreeType's hash functions */ - - -#define INITIAL_HT_SIZE 241 - - typedef void - (*hash_free_func)( hashnode node ); - - static hashnode* - hash_bucket( const char* key, - hashtable* ht ) - { - const char* kp = key; - unsigned long res = 0; - hashnode* bp = ht->table, *ndp; - - - /* Mocklisp hash function. */ - while ( *kp ) - res = ( res << 5 ) - res + (unsigned long)*kp++; - - ndp = bp + ( res % ht->size ); - while ( *ndp ) - { - kp = (*ndp)->key; - if ( kp[0] == key[0] && ft_strcmp( kp, key ) == 0 ) - break; - ndp--; - if ( ndp < bp ) - ndp = bp + ( ht->size - 1 ); - } - - return ndp; - } - - - static FT_Error - hash_rehash( hashtable* ht, - FT_Memory memory ) - { - hashnode* obp = ht->table, *bp, *nbp; - unsigned int i, sz = ht->size; - FT_Error error = FT_Err_Ok; - - - ht->size <<= 1; - ht->limit = ht->size / 3; - - if ( FT_NEW_ARRAY( ht->table, ht->size ) ) - goto Exit; - - for ( i = 0, bp = obp; i < sz; i++, bp++ ) - { - if ( *bp ) - { - nbp = hash_bucket( (*bp)->key, ht ); - *nbp = *bp; - } - } - FT_FREE( obp ); - - Exit: - return error; - } - - - static FT_Error - hash_init( hashtable* ht, - FT_Memory memory ) - { - unsigned int sz = INITIAL_HT_SIZE; - FT_Error error = FT_Err_Ok; - - - ht->size = sz; - ht->limit = sz / 3; - ht->used = 0; - - if ( FT_NEW_ARRAY( ht->table, sz ) ) - goto Exit; - - Exit: - return error; - } - - - static void - hash_free( hashtable* ht, - FT_Memory memory ) - { - if ( ht != 0 ) - { - unsigned int i, sz = ht->size; - hashnode* bp = ht->table; - - - for ( i = 0; i < sz; i++, bp++ ) - FT_FREE( *bp ); - - FT_FREE( ht->table ); - } - } - - - static FT_Error - hash_insert( char* key, - size_t data, - hashtable* ht, - FT_Memory memory ) - { - hashnode nn; - hashnode* bp = hash_bucket( key, ht ); - FT_Error error = FT_Err_Ok; - - - nn = *bp; - if ( !nn ) - { - if ( FT_NEW( nn ) ) - goto Exit; - *bp = nn; - - nn->key = key; - nn->data = data; - - if ( ht->used >= ht->limit ) - { - error = hash_rehash( ht, memory ); - if ( error ) - goto Exit; - } - ht->used++; - } - else - nn->data = data; - - Exit: - return error; - } - - - static hashnode - hash_lookup( const char* key, - hashtable* ht ) - { - hashnode *np = hash_bucket( key, ht ); - - - return *np; - } - - - /*************************************************************************/ - /* */ - /* Utility types and functions. */ - /* */ - /*************************************************************************/ - - - /* Function type for parsing lines of a BDF font. */ - - typedef FT_Error - (*_bdf_line_func_t)( char* line, - unsigned long linelen, - unsigned long lineno, - void* call_data, - void* client_data ); - - - /* List structure for splitting lines into fields. */ - - typedef struct _bdf_list_t_ - { - char** field; - unsigned long size; - unsigned long used; - FT_Memory memory; - - } _bdf_list_t; - - - /* Structure used while loading BDF fonts. */ - - typedef struct _bdf_parse_t_ - { - unsigned long flags; - unsigned long cnt; - unsigned long row; - - short minlb; - short maxlb; - short maxrb; - short maxas; - short maxds; - - short rbearing; - - char* glyph_name; - long glyph_enc; - - bdf_font_t* font; - bdf_options_t* opts; - - unsigned long have[34816]; /* must be in sync with `nmod' and `umod' */ - /* arrays from `bdf_font_t' structure */ - _bdf_list_t list; - - FT_Memory memory; - - } _bdf_parse_t; - - -#define setsbit( m, cc ) \ - ( m[(FT_Byte)(cc) >> 3] |= (FT_Byte)( 1 << ( (cc) & 7 ) ) ) -#define sbitset( m, cc ) \ - ( m[(FT_Byte)(cc) >> 3] & ( 1 << ( (cc) & 7 ) ) ) - - - static void - _bdf_list_init( _bdf_list_t* list, - FT_Memory memory ) - { - FT_ZERO( list ); - list->memory = memory; - } - - - static void - _bdf_list_done( _bdf_list_t* list ) - { - FT_Memory memory = list->memory; - - - if ( memory ) - { - FT_FREE( list->field ); - FT_ZERO( list ); - } - } - - - static FT_Error - _bdf_list_ensure( _bdf_list_t* list, - unsigned long num_items ) /* same as _bdf_list_t.used */ - { - FT_Error error = FT_Err_Ok; - - - if ( num_items > list->size ) - { - unsigned long oldsize = list->size; /* same as _bdf_list_t.size */ - unsigned long newsize = oldsize + ( oldsize >> 1 ) + 5; - unsigned long bigsize = (unsigned long)( FT_INT_MAX / sizeof ( char* ) ); - FT_Memory memory = list->memory; - - - if ( oldsize == bigsize ) - { - error = FT_THROW( Out_Of_Memory ); - goto Exit; - } - else if ( newsize < oldsize || newsize > bigsize ) - newsize = bigsize; - - if ( FT_RENEW_ARRAY( list->field, oldsize, newsize ) ) - goto Exit; - - list->size = newsize; - } - - Exit: - return error; - } - - - static void - _bdf_list_shift( _bdf_list_t* list, - unsigned long n ) - { - unsigned long i, u; - - - if ( list == 0 || list->used == 0 || n == 0 ) - return; - - if ( n >= list->used ) - { - list->used = 0; - return; - } - - for ( u = n, i = 0; u < list->used; i++, u++ ) - list->field[i] = list->field[u]; - list->used -= n; - } - - - /* An empty string for empty fields. */ - - static const char empty[1] = { 0 }; /* XXX eliminate this */ - - - static char * - _bdf_list_join( _bdf_list_t* list, - int c, - unsigned long *alen ) - { - unsigned long i, j; - char* dp; - - - *alen = 0; - - if ( list == 0 || list->used == 0 ) - return 0; - - dp = list->field[0]; - for ( i = j = 0; i < list->used; i++ ) - { - char* fp = list->field[i]; - - - while ( *fp ) - dp[j++] = *fp++; - - if ( i + 1 < list->used ) - dp[j++] = (char)c; - } - if ( dp != empty ) - dp[j] = 0; - - *alen = j; - return dp; - } - - - /* The code below ensures that we have at least 4 + 1 `field' */ - /* elements in `list' (which are possibly NULL) so that we */ - /* don't have to check the number of fields in most cases. */ - - static FT_Error - _bdf_list_split( _bdf_list_t* list, - char* separators, - char* line, - unsigned long linelen ) - { - unsigned long final_empty; - int mult; - char *sp, *ep, *end; - char seps[32]; - FT_Error error = FT_Err_Ok; - - - /* Initialize the list. */ - list->used = 0; - if ( list->size ) - { - list->field[0] = (char*)empty; - list->field[1] = (char*)empty; - list->field[2] = (char*)empty; - list->field[3] = (char*)empty; - list->field[4] = (char*)empty; - } - - /* If the line is empty, then simply return. */ - if ( linelen == 0 || line[0] == 0 ) - goto Exit; - - /* In the original code, if the `separators' parameter is NULL or */ - /* empty, the list is split into individual bytes. We don't need */ - /* this, so an error is signaled. */ - if ( separators == 0 || *separators == 0 ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* Prepare the separator bitmap. */ - FT_MEM_ZERO( seps, 32 ); - - /* If the very last character of the separator string is a plus, then */ - /* set the `mult' flag to indicate that multiple separators should be */ - /* collapsed into one. */ - for ( mult = 0, sp = separators; sp && *sp; sp++ ) - { - if ( *sp == '+' && *( sp + 1 ) == 0 ) - mult = 1; - else - setsbit( seps, *sp ); - } - - /* Break the line up into fields. */ - for ( final_empty = 0, sp = ep = line, end = sp + linelen; - sp < end && *sp; ) - { - /* Collect everything that is not a separator. */ - for ( ; *ep && !sbitset( seps, *ep ); ep++ ) - ; - - /* Resize the list if necessary. */ - if ( list->used == list->size ) - { - error = _bdf_list_ensure( list, list->used + 1 ); - if ( error ) - goto Exit; - } - - /* Assign the field appropriately. */ - list->field[list->used++] = ( ep > sp ) ? sp : (char*)empty; - - sp = ep; - - if ( mult ) - { - /* If multiple separators should be collapsed, do it now by */ - /* setting all the separator characters to 0. */ - for ( ; *ep && sbitset( seps, *ep ); ep++ ) - *ep = 0; - } - else if ( *ep != 0 ) - /* Don't collapse multiple separators by making them 0, so just */ - /* make the one encountered 0. */ - *ep++ = 0; - - final_empty = ( ep > sp && *ep == 0 ); - sp = ep; - } - - /* Finally, NULL-terminate the list. */ - if ( list->used + final_empty >= list->size ) - { - error = _bdf_list_ensure( list, list->used + final_empty + 1 ); - if ( error ) - goto Exit; - } - - if ( final_empty ) - list->field[list->used++] = (char*)empty; - - list->field[list->used] = 0; - - Exit: - return error; - } - - -#define NO_SKIP 256 /* this value cannot be stored in a 'char' */ - - - static FT_Error - _bdf_readstream( FT_Stream stream, - _bdf_line_func_t callback, - void* client_data, - unsigned long *lno ) - { - _bdf_line_func_t cb; - unsigned long lineno, buf_size; - int refill, hold, to_skip; - ptrdiff_t bytes, start, end, cursor, avail; - char* buf = NULL; - FT_Memory memory = stream->memory; - FT_Error error = FT_Err_Ok; - - - if ( callback == 0 ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* initial size and allocation of the input buffer */ - buf_size = 1024; - - if ( FT_NEW_ARRAY( buf, buf_size ) ) - goto Exit; - - cb = callback; - lineno = 1; - buf[0] = 0; - start = 0; - avail = 0; - cursor = 0; - refill = 1; - to_skip = NO_SKIP; - bytes = 0; /* make compiler happy */ - - for (;;) - { - if ( refill ) - { - bytes = (ptrdiff_t)FT_Stream_TryRead( - stream, (FT_Byte*)buf + cursor, - buf_size - (unsigned long)cursor ); - avail = cursor + bytes; - cursor = 0; - refill = 0; - } - - end = start; - - /* should we skip an optional character like \n or \r? */ - if ( start < avail && buf[start] == to_skip ) - { - start += 1; - to_skip = NO_SKIP; - continue; - } - - /* try to find the end of the line */ - while ( end < avail && buf[end] != '\n' && buf[end] != '\r' ) - end++; - - /* if we hit the end of the buffer, try shifting its content */ - /* or even resizing it */ - if ( end >= avail ) - { - if ( bytes == 0 ) /* last line in file doesn't end in \r or \n */ - break; /* ignore it then exit */ - - if ( start == 0 ) - { - /* this line is definitely too long; try resizing the input */ - /* buffer a bit to handle it. */ - FT_ULong new_size; - - - if ( buf_size >= 65536UL ) /* limit ourselves to 64KByte */ - { - FT_ERROR(( "_bdf_readstream: " ERRMSG6, lineno )); - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - new_size = buf_size * 2; - if ( FT_RENEW_ARRAY( buf, buf_size, new_size ) ) - goto Exit; - - cursor = (ptrdiff_t)buf_size; - buf_size = new_size; - } - else - { - bytes = avail - start; - - FT_MEM_MOVE( buf, buf + start, bytes ); - - cursor = bytes; - avail -= bytes; - start = 0; - } - refill = 1; - continue; - } - - /* Temporarily NUL-terminate the line. */ - hold = buf[end]; - buf[end] = 0; - - /* XXX: Use encoding independent value for 0x1A */ - if ( buf[start] != '#' && buf[start] != 0x1A && end > start ) - { - error = (*cb)( buf + start, (unsigned long)( end - start ), lineno, - (void*)&cb, client_data ); - /* Redo if we have encountered CHARS without properties. */ - if ( error == -1 ) - error = (*cb)( buf + start, (unsigned long)( end - start ), lineno, - (void*)&cb, client_data ); - if ( error ) - break; - } - - lineno += 1; - buf[end] = (char)hold; - start = end + 1; - - if ( hold == '\n' ) - to_skip = '\r'; - else if ( hold == '\r' ) - to_skip = '\n'; - else - to_skip = NO_SKIP; - } - - *lno = lineno; - - Exit: - FT_FREE( buf ); - return error; - } - - - /* XXX: make this work with EBCDIC also */ - - static const unsigned char a2i[128] = - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - - static const unsigned char odigits[32] = - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; - - static const unsigned char ddigits[32] = - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; - - static const unsigned char hdigits[32] = - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, - 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; - - - /* Routine to convert an ASCII string into an unsigned long integer. */ - static unsigned long - _bdf_atoul( char* s, - char** end, - unsigned int base ) - { - unsigned long v; - const unsigned char* dmap; - - - if ( s == 0 || *s == 0 ) - return 0; - - /* Make sure the radix is something recognizable. Default to 10. */ - switch ( base ) - { - case 8: - dmap = odigits; - break; - case 16: - dmap = hdigits; - break; - default: - base = 10; - dmap = ddigits; - break; - } - - /* Check for the special hex prefix. */ - if ( *s == '0' && - ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) ) - { - base = 16; - dmap = hdigits; - s += 2; - } - - for ( v = 0; sbitset( dmap, *s ); s++ ) - v = v * base + a2i[(int)*s]; - - if ( end != 0 ) - *end = s; - - return v; - } - - - /* Routine to convert an ASCII string into a signed long integer. */ - static long - _bdf_atol( char* s, - char** end, - int base ) - { - long v, neg; - const unsigned char* dmap; - - - if ( s == 0 || *s == 0 ) - return 0; - - /* Make sure the radix is something recognizable. Default to 10. */ - switch ( base ) - { - case 8: - dmap = odigits; - break; - case 16: - dmap = hdigits; - break; - default: - base = 10; - dmap = ddigits; - break; - } - - /* Check for a minus sign. */ - neg = 0; - if ( *s == '-' ) - { - s++; - neg = 1; - } - - /* Check for the special hex prefix. */ - if ( *s == '0' && - ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) ) - { - base = 16; - dmap = hdigits; - s += 2; - } - - for ( v = 0; sbitset( dmap, *s ); s++ ) - v = v * base + a2i[(int)*s]; - - if ( end != 0 ) - *end = s; - - return ( !neg ) ? v : -v; - } - - - /* Routine to convert an ASCII string into an unsigned short integer. */ - static unsigned short - _bdf_atous( char* s, - char** end, - unsigned int base ) - { - unsigned short v; - const unsigned char* dmap; - - - if ( s == 0 || *s == 0 ) - return 0; - - /* Make sure the radix is something recognizable. Default to 10. */ - switch ( base ) - { - case 8: - dmap = odigits; - break; - case 16: - dmap = hdigits; - break; - default: - base = 10; - dmap = ddigits; - break; - } - - /* Check for the special hex prefix. */ - if ( *s == '0' && - ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) ) - { - base = 16; - dmap = hdigits; - s += 2; - } - - for ( v = 0; sbitset( dmap, *s ); s++ ) - v = (unsigned short)( v * base + a2i[(int)*s] ); - - if ( end != 0 ) - *end = s; - - return v; - } - - - /* Routine to convert an ASCII string into a signed short integer. */ - static short - _bdf_atos( char* s, - char** end, - int base ) - { - short v, neg; - const unsigned char* dmap; - - - if ( s == 0 || *s == 0 ) - return 0; - - /* Make sure the radix is something recognizable. Default to 10. */ - switch ( base ) - { - case 8: - dmap = odigits; - break; - case 16: - dmap = hdigits; - break; - default: - base = 10; - dmap = ddigits; - break; - } - - /* Check for a minus. */ - neg = 0; - if ( *s == '-' ) - { - s++; - neg = 1; - } - - /* Check for the special hex prefix. */ - if ( *s == '0' && - ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) ) - { - base = 16; - dmap = hdigits; - s += 2; - } - - for ( v = 0; sbitset( dmap, *s ); s++ ) - v = (short)( v * base + a2i[(int)*s] ); - - if ( end != 0 ) - *end = s; - - return (short)( ( !neg ) ? v : -v ); - } - - - /* Routine to compare two glyphs by encoding so they can be sorted. */ - static int - by_encoding( const void* a, - const void* b ) - { - bdf_glyph_t *c1, *c2; - - - c1 = (bdf_glyph_t *)a; - c2 = (bdf_glyph_t *)b; - - if ( c1->encoding < c2->encoding ) - return -1; - - if ( c1->encoding > c2->encoding ) - return 1; - - return 0; - } - - - static FT_Error - bdf_create_property( char* name, - int format, - bdf_font_t* font ) - { - size_t n; - bdf_property_t* p; - FT_Memory memory = font->memory; - FT_Error error = FT_Err_Ok; - - - /* First check whether the property has */ - /* already been added or not. If it has, then */ - /* simply ignore it. */ - if ( hash_lookup( name, &(font->proptbl) ) ) - goto Exit; - - if ( FT_RENEW_ARRAY( font->user_props, - font->nuser_props, - font->nuser_props + 1 ) ) - goto Exit; - - p = font->user_props + font->nuser_props; - FT_ZERO( p ); - - n = ft_strlen( name ) + 1; - if ( n > FT_ULONG_MAX ) - return FT_THROW( Invalid_Argument ); - - if ( FT_NEW_ARRAY( p->name, n ) ) - goto Exit; - - FT_MEM_COPY( (char *)p->name, name, n ); - - p->format = format; - p->builtin = 0; - - n = _num_bdf_properties + font->nuser_props; - - error = hash_insert( p->name, n, &(font->proptbl), memory ); - if ( error ) - goto Exit; - - font->nuser_props++; - - Exit: - return error; - } - - - FT_LOCAL_DEF( bdf_property_t * ) - bdf_get_property( char* name, - bdf_font_t* font ) - { - hashnode hn; - size_t propid; - - - if ( name == 0 || *name == 0 ) - return 0; - - if ( ( hn = hash_lookup( name, &(font->proptbl) ) ) == 0 ) - return 0; - - propid = hn->data; - if ( propid >= _num_bdf_properties ) - return font->user_props + ( propid - _num_bdf_properties ); - - return (bdf_property_t*)_bdf_properties + propid; - } - - - /*************************************************************************/ - /* */ - /* BDF font file parsing flags and functions. */ - /* */ - /*************************************************************************/ - - - /* Parse flags. */ - -#define _BDF_START 0x0001U -#define _BDF_FONT_NAME 0x0002U -#define _BDF_SIZE 0x0004U -#define _BDF_FONT_BBX 0x0008U -#define _BDF_PROPS 0x0010U -#define _BDF_GLYPHS 0x0020U -#define _BDF_GLYPH 0x0040U -#define _BDF_ENCODING 0x0080U -#define _BDF_SWIDTH 0x0100U -#define _BDF_DWIDTH 0x0200U -#define _BDF_BBX 0x0400U -#define _BDF_BITMAP 0x0800U - -#define _BDF_SWIDTH_ADJ 0x1000U - -#define _BDF_GLYPH_BITS ( _BDF_GLYPH | \ - _BDF_ENCODING | \ - _BDF_SWIDTH | \ - _BDF_DWIDTH | \ - _BDF_BBX | \ - _BDF_BITMAP ) - -#define _BDF_GLYPH_WIDTH_CHECK 0x40000000UL -#define _BDF_GLYPH_HEIGHT_CHECK 0x80000000UL - - - static FT_Error - _bdf_add_comment( bdf_font_t* font, - char* comment, - unsigned long len ) - { - char* cp; - FT_Memory memory = font->memory; - FT_Error error = FT_Err_Ok; - - - if ( FT_RENEW_ARRAY( font->comments, - font->comments_len, - font->comments_len + len + 1 ) ) - goto Exit; - - cp = font->comments + font->comments_len; - - FT_MEM_COPY( cp, comment, len ); - cp[len] = '\n'; - - font->comments_len += len + 1; - - Exit: - return error; - } - - - /* Set the spacing from the font name if it exists, or set it to the */ - /* default specified in the options. */ - static FT_Error - _bdf_set_default_spacing( bdf_font_t* font, - bdf_options_t* opts, - unsigned long lineno ) - { - size_t len; - char name[256]; - _bdf_list_t list; - FT_Memory memory; - FT_Error error = FT_Err_Ok; - - FT_UNUSED( lineno ); /* only used in debug mode */ - - - if ( font == 0 || font->name == 0 || font->name[0] == 0 ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - memory = font->memory; - - _bdf_list_init( &list, memory ); - - font->spacing = opts->font_spacing; - - len = ft_strlen( font->name ) + 1; - /* Limit ourselves to 256 characters in the font name. */ - if ( len >= 256 ) - { - FT_ERROR(( "_bdf_set_default_spacing: " ERRMSG7, lineno )); - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - FT_MEM_COPY( name, font->name, len ); - - error = _bdf_list_split( &list, (char *)"-", name, (unsigned long)len ); - if ( error ) - goto Fail; - - if ( list.used == 15 ) - { - switch ( list.field[11][0] ) - { - case 'C': - case 'c': - font->spacing = BDF_CHARCELL; - break; - case 'M': - case 'm': - font->spacing = BDF_MONOWIDTH; - break; - case 'P': - case 'p': - font->spacing = BDF_PROPORTIONAL; - break; - } - } - - Fail: - _bdf_list_done( &list ); - - Exit: - return error; - } - - - /* Determine whether the property is an atom or not. If it is, then */ - /* clean it up so the double quotes are removed if they exist. */ - static int - _bdf_is_atom( char* line, - unsigned long linelen, - char** name, - char** value, - bdf_font_t* font ) - { - int hold; - char *sp, *ep; - bdf_property_t* p; - - - *name = sp = ep = line; - - while ( *ep && *ep != ' ' && *ep != '\t' ) - ep++; - - hold = -1; - if ( *ep ) - { - hold = *ep; - *ep = 0; - } - - p = bdf_get_property( sp, font ); - - /* Restore the character that was saved before any return can happen. */ - if ( hold != -1 ) - *ep = (char)hold; - - /* If the property exists and is not an atom, just return here. */ - if ( p && p->format != BDF_ATOM ) - return 0; - - /* The property is an atom. Trim all leading and trailing whitespace */ - /* and double quotes for the atom value. */ - sp = ep; - ep = line + linelen; - - /* Trim the leading whitespace if it exists. */ - if ( *sp ) - *sp++ = 0; - while ( *sp && - ( *sp == ' ' || *sp == '\t' ) ) - sp++; - - /* Trim the leading double quote if it exists. */ - if ( *sp == '"' ) - sp++; - *value = sp; - - /* Trim the trailing whitespace if it exists. */ - while ( ep > sp && - ( *( ep - 1 ) == ' ' || *( ep - 1 ) == '\t' ) ) - *--ep = 0; - - /* Trim the trailing double quote if it exists. */ - if ( ep > sp && *( ep - 1 ) == '"' ) - *--ep = 0; - - return 1; - } - - - static FT_Error - _bdf_add_property( bdf_font_t* font, - char* name, - char* value, - unsigned long lineno ) - { - size_t propid; - hashnode hn; - bdf_property_t *prop, *fp; - FT_Memory memory = font->memory; - FT_Error error = FT_Err_Ok; - - FT_UNUSED( lineno ); /* only used in debug mode */ - - - /* First, check whether the property already exists in the font. */ - if ( ( hn = hash_lookup( name, (hashtable *)font->internal ) ) != 0 ) - { - /* The property already exists in the font, so simply replace */ - /* the value of the property with the current value. */ - fp = font->props + hn->data; - - switch ( fp->format ) - { - case BDF_ATOM: - /* Delete the current atom if it exists. */ - FT_FREE( fp->value.atom ); - - if ( value && value[0] != 0 ) - { - if ( FT_STRDUP( fp->value.atom, value ) ) - goto Exit; - } - break; - - case BDF_INTEGER: - fp->value.l = _bdf_atol( value, 0, 10 ); - break; - - case BDF_CARDINAL: - fp->value.ul = _bdf_atoul( value, 0, 10 ); - break; - - default: - ; - } - - goto Exit; - } - - /* See whether this property type exists yet or not. */ - /* If not, create it. */ - hn = hash_lookup( name, &(font->proptbl) ); - if ( hn == 0 ) - { - error = bdf_create_property( name, BDF_ATOM, font ); - if ( error ) - goto Exit; - hn = hash_lookup( name, &(font->proptbl) ); - } - - /* Allocate another property if this is overflow. */ - if ( font->props_used == font->props_size ) - { - if ( font->props_size == 0 ) - { - if ( FT_NEW_ARRAY( font->props, 1 ) ) - goto Exit; - } - else - { - if ( FT_RENEW_ARRAY( font->props, - font->props_size, - font->props_size + 1 ) ) - goto Exit; - } - - fp = font->props + font->props_size; - FT_MEM_ZERO( fp, sizeof ( bdf_property_t ) ); - font->props_size++; - } - - propid = hn->data; - if ( propid >= _num_bdf_properties ) - prop = font->user_props + ( propid - _num_bdf_properties ); - else - prop = (bdf_property_t*)_bdf_properties + propid; - - fp = font->props + font->props_used; - - fp->name = prop->name; - fp->format = prop->format; - fp->builtin = prop->builtin; - - switch ( prop->format ) - { - case BDF_ATOM: - fp->value.atom = 0; - if ( value != 0 && value[0] ) - { - if ( FT_STRDUP( fp->value.atom, value ) ) - goto Exit; - } - break; - - case BDF_INTEGER: - fp->value.l = _bdf_atol( value, 0, 10 ); - break; - - case BDF_CARDINAL: - fp->value.ul = _bdf_atoul( value, 0, 10 ); - break; - } - - /* If the property happens to be a comment, then it doesn't need */ - /* to be added to the internal hash table. */ - if ( _bdf_strncmp( name, "COMMENT", 7 ) != 0 ) - { - /* Add the property to the font property table. */ - error = hash_insert( fp->name, - font->props_used, - (hashtable *)font->internal, - memory ); - if ( error ) - goto Exit; - } - - font->props_used++; - - /* Some special cases need to be handled here. The DEFAULT_CHAR */ - /* property needs to be located if it exists in the property list, the */ - /* FONT_ASCENT and FONT_DESCENT need to be assigned if they are */ - /* present, and the SPACING property should override the default */ - /* spacing. */ - if ( _bdf_strncmp( name, "DEFAULT_CHAR", 12 ) == 0 ) - font->default_char = fp->value.l; - else if ( _bdf_strncmp( name, "FONT_ASCENT", 11 ) == 0 ) - font->font_ascent = fp->value.l; - else if ( _bdf_strncmp( name, "FONT_DESCENT", 12 ) == 0 ) - font->font_descent = fp->value.l; - else if ( _bdf_strncmp( name, "SPACING", 7 ) == 0 ) - { - if ( !fp->value.atom ) - { - FT_ERROR(( "_bdf_add_property: " ERRMSG8, lineno, "SPACING" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - if ( fp->value.atom[0] == 'p' || fp->value.atom[0] == 'P' ) - font->spacing = BDF_PROPORTIONAL; - else if ( fp->value.atom[0] == 'm' || fp->value.atom[0] == 'M' ) - font->spacing = BDF_MONOWIDTH; - else if ( fp->value.atom[0] == 'c' || fp->value.atom[0] == 'C' ) - font->spacing = BDF_CHARCELL; - } - - Exit: - return error; - } - - - static const unsigned char nibble_mask[8] = - { - 0xFF, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE - }; - - - /* Actually parse the glyph info and bitmaps. */ - static FT_Error - _bdf_parse_glyphs( char* line, - unsigned long linelen, - unsigned long lineno, - void* call_data, - void* client_data ) - { - int c, mask_index; - char* s; - unsigned char* bp; - unsigned long i, slen, nibbles; - - _bdf_parse_t* p; - bdf_glyph_t* glyph; - bdf_font_t* font; - - FT_Memory memory; - FT_Error error = FT_Err_Ok; - - FT_UNUSED( call_data ); - FT_UNUSED( lineno ); /* only used in debug mode */ - - - p = (_bdf_parse_t *)client_data; - - font = p->font; - memory = font->memory; - - /* Check for a comment. */ - if ( _bdf_strncmp( line, "COMMENT", 7 ) == 0 ) - { - linelen -= 7; - - s = line + 7; - if ( *s != 0 ) - { - s++; - linelen--; - } - error = _bdf_add_comment( p->font, s, linelen ); - goto Exit; - } - - /* The very first thing expected is the number of glyphs. */ - if ( !( p->flags & _BDF_GLYPHS ) ) - { - if ( _bdf_strncmp( line, "CHARS", 5 ) != 0 ) - { - FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "CHARS" )); - error = FT_THROW( Missing_Chars_Field ); - goto Exit; - } - - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); - if ( error ) - goto Exit; - p->cnt = font->glyphs_size = _bdf_atoul( p->list.field[1], 0, 10 ); - - /* Make sure the number of glyphs is non-zero. */ - if ( p->cnt == 0 ) - font->glyphs_size = 64; - - /* Limit ourselves to 1,114,112 glyphs in the font (this is the */ - /* number of code points available in Unicode). */ - if ( p->cnt >= 0x110000UL ) - { - FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG5, lineno, "CHARS" )); - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - if ( FT_NEW_ARRAY( font->glyphs, font->glyphs_size ) ) - goto Exit; - - p->flags |= _BDF_GLYPHS; - - goto Exit; - } - - /* Check for the ENDFONT field. */ - if ( _bdf_strncmp( line, "ENDFONT", 7 ) == 0 ) - { - if ( p->flags & _BDF_GLYPH_BITS ) - { - /* Missing ENDCHAR field. */ - FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "ENDCHAR" )); - error = FT_THROW( Corrupted_Font_Glyphs ); - goto Exit; - } - - /* Sort the glyphs by encoding. */ - ft_qsort( (char *)font->glyphs, - font->glyphs_used, - sizeof ( bdf_glyph_t ), - by_encoding ); - - p->flags &= ~_BDF_START; - - goto Exit; - } - - /* Check for the ENDCHAR field. */ - if ( _bdf_strncmp( line, "ENDCHAR", 7 ) == 0 ) - { - p->glyph_enc = 0; - p->flags &= ~_BDF_GLYPH_BITS; - - goto Exit; - } - - /* Check whether a glyph is being scanned but should be */ - /* ignored because it is an unencoded glyph. */ - if ( ( p->flags & _BDF_GLYPH ) && - p->glyph_enc == -1 && - p->opts->keep_unencoded == 0 ) - goto Exit; - - /* Check for the STARTCHAR field. */ - if ( _bdf_strncmp( line, "STARTCHAR", 9 ) == 0 ) - { - /* Set the character name in the parse info first until the */ - /* encoding can be checked for an unencoded character. */ - FT_FREE( p->glyph_name ); - - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); - if ( error ) - goto Exit; - - _bdf_list_shift( &p->list, 1 ); - - s = _bdf_list_join( &p->list, ' ', &slen ); - - if ( !s ) - { - FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG8, lineno, "STARTCHAR" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - if ( FT_NEW_ARRAY( p->glyph_name, slen + 1 ) ) - goto Exit; - - FT_MEM_COPY( p->glyph_name, s, slen + 1 ); - - p->flags |= _BDF_GLYPH; - - FT_TRACE4(( DBGMSG1, lineno, s )); - - goto Exit; - } - - /* Check for the ENCODING field. */ - if ( _bdf_strncmp( line, "ENCODING", 8 ) == 0 ) - { - if ( !( p->flags & _BDF_GLYPH ) ) - { - /* Missing STARTCHAR field. */ - FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "STARTCHAR" )); - error = FT_THROW( Missing_Startchar_Field ); - goto Exit; - } - - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); - if ( error ) - goto Exit; - - p->glyph_enc = _bdf_atol( p->list.field[1], 0, 10 ); - - /* Normalize negative encoding values. The specification only */ - /* allows -1, but we can be more generous here. */ - if ( p->glyph_enc < -1 ) - p->glyph_enc = -1; - - /* Check for alternative encoding format. */ - if ( p->glyph_enc == -1 && p->list.used > 2 ) - p->glyph_enc = _bdf_atol( p->list.field[2], 0, 10 ); - - if ( p->glyph_enc < -1 ) - p->glyph_enc = -1; - - FT_TRACE4(( DBGMSG2, p->glyph_enc )); - - /* Check that the encoding is in the Unicode range because */ - /* otherwise p->have (a bitmap with static size) overflows. */ - if ( p->glyph_enc > 0 && - (size_t)p->glyph_enc >= sizeof ( p->have ) / - sizeof ( unsigned long ) * 32 ) - { - FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG5, lineno, "ENCODING" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* Check whether this encoding has already been encountered. */ - /* If it has then change it to unencoded so it gets added if */ - /* indicated. */ - if ( p->glyph_enc >= 0 ) - { - if ( _bdf_glyph_modified( p->have, p->glyph_enc ) ) - { - /* Emit a message saying a glyph has been moved to the */ - /* unencoded area. */ - FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG12, - p->glyph_enc, p->glyph_name )); - p->glyph_enc = -1; - font->modified = 1; - } - else - _bdf_set_glyph_modified( p->have, p->glyph_enc ); - } - - if ( p->glyph_enc >= 0 ) - { - /* Make sure there are enough glyphs allocated in case the */ - /* number of characters happen to be wrong. */ - if ( font->glyphs_used == font->glyphs_size ) - { - if ( FT_RENEW_ARRAY( font->glyphs, - font->glyphs_size, - font->glyphs_size + 64 ) ) - goto Exit; - - font->glyphs_size += 64; - } - - glyph = font->glyphs + font->glyphs_used++; - glyph->name = p->glyph_name; - glyph->encoding = p->glyph_enc; - - /* Reset the initial glyph info. */ - p->glyph_name = NULL; - } - else - { - /* Unencoded glyph. Check whether it should */ - /* be added or not. */ - if ( p->opts->keep_unencoded != 0 ) - { - /* Allocate the next unencoded glyph. */ - if ( font->unencoded_used == font->unencoded_size ) - { - if ( FT_RENEW_ARRAY( font->unencoded , - font->unencoded_size, - font->unencoded_size + 4 ) ) - goto Exit; - - font->unencoded_size += 4; - } - - glyph = font->unencoded + font->unencoded_used; - glyph->name = p->glyph_name; - glyph->encoding = (long)font->unencoded_used++; - } - else - /* Free up the glyph name if the unencoded shouldn't be */ - /* kept. */ - FT_FREE( p->glyph_name ); - - p->glyph_name = NULL; - } - - /* Clear the flags that might be added when width and height are */ - /* checked for consistency. */ - p->flags &= ~( _BDF_GLYPH_WIDTH_CHECK | _BDF_GLYPH_HEIGHT_CHECK ); - - p->flags |= _BDF_ENCODING; - - goto Exit; - } - - /* Point at the glyph being constructed. */ - if ( p->glyph_enc == -1 ) - glyph = font->unencoded + ( font->unencoded_used - 1 ); - else - glyph = font->glyphs + ( font->glyphs_used - 1 ); - - /* Check whether a bitmap is being constructed. */ - if ( p->flags & _BDF_BITMAP ) - { - /* If there are more rows than are specified in the glyph metrics, */ - /* ignore the remaining lines. */ - if ( p->row >= (unsigned long)glyph->bbx.height ) - { - if ( !( p->flags & _BDF_GLYPH_HEIGHT_CHECK ) ) - { - FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG13, glyph->encoding )); - p->flags |= _BDF_GLYPH_HEIGHT_CHECK; - font->modified = 1; - } - - goto Exit; - } - - /* Only collect the number of nibbles indicated by the glyph */ - /* metrics. If there are more columns, they are simply ignored. */ - nibbles = glyph->bpr << 1; - bp = glyph->bitmap + p->row * glyph->bpr; - - for ( i = 0; i < nibbles; i++ ) - { - c = line[i]; - if ( !sbitset( hdigits, c ) ) - break; - *bp = (FT_Byte)( ( *bp << 4 ) + a2i[c] ); - if ( i + 1 < nibbles && ( i & 1 ) ) - *++bp = 0; - } - - /* If any line has not enough columns, */ - /* indicate they have been padded with zero bits. */ - if ( i < nibbles && - !( p->flags & _BDF_GLYPH_WIDTH_CHECK ) ) - { - FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG16, glyph->encoding )); - p->flags |= _BDF_GLYPH_WIDTH_CHECK; - font->modified = 1; - } - - /* Remove possible garbage at the right. */ - mask_index = ( glyph->bbx.width * p->font->bpp ) & 7; - if ( glyph->bbx.width ) - *bp &= nibble_mask[mask_index]; - - /* If any line has extra columns, indicate they have been removed. */ - if ( i == nibbles && - sbitset( hdigits, line[nibbles] ) && - !( p->flags & _BDF_GLYPH_WIDTH_CHECK ) ) - { - FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG14, glyph->encoding )); - p->flags |= _BDF_GLYPH_WIDTH_CHECK; - font->modified = 1; - } - - p->row++; - goto Exit; - } - - /* Expect the SWIDTH (scalable width) field next. */ - if ( _bdf_strncmp( line, "SWIDTH", 6 ) == 0 ) - { - if ( !( p->flags & _BDF_ENCODING ) ) - goto Missing_Encoding; - - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); - if ( error ) - goto Exit; - - glyph->swidth = (unsigned short)_bdf_atoul( p->list.field[1], 0, 10 ); - p->flags |= _BDF_SWIDTH; - - goto Exit; - } - - /* Expect the DWIDTH (scalable width) field next. */ - if ( _bdf_strncmp( line, "DWIDTH", 6 ) == 0 ) - { - if ( !( p->flags & _BDF_ENCODING ) ) - goto Missing_Encoding; - - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); - if ( error ) - goto Exit; - - glyph->dwidth = (unsigned short)_bdf_atoul( p->list.field[1], 0, 10 ); - - if ( !( p->flags & _BDF_SWIDTH ) ) - { - /* Missing SWIDTH field. Emit an auto correction message and set */ - /* the scalable width from the device width. */ - FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG9, lineno )); - - glyph->swidth = (unsigned short)FT_MulDiv( - glyph->dwidth, 72000L, - (FT_Long)( font->point_size * - font->resolution_x ) ); - } - - p->flags |= _BDF_DWIDTH; - goto Exit; - } - - /* Expect the BBX field next. */ - if ( _bdf_strncmp( line, "BBX", 3 ) == 0 ) - { - if ( !( p->flags & _BDF_ENCODING ) ) - goto Missing_Encoding; - - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); - if ( error ) - goto Exit; - - glyph->bbx.width = _bdf_atous( p->list.field[1], 0, 10 ); - glyph->bbx.height = _bdf_atous( p->list.field[2], 0, 10 ); - glyph->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 ); - glyph->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 ); - - /* Generate the ascent and descent of the character. */ - glyph->bbx.ascent = (short)( glyph->bbx.height + glyph->bbx.y_offset ); - glyph->bbx.descent = (short)( -glyph->bbx.y_offset ); - - /* Determine the overall font bounding box as the characters are */ - /* loaded so corrections can be done later if indicated. */ - p->maxas = (short)FT_MAX( glyph->bbx.ascent, p->maxas ); - p->maxds = (short)FT_MAX( glyph->bbx.descent, p->maxds ); - - p->rbearing = (short)( glyph->bbx.width + glyph->bbx.x_offset ); - - p->maxrb = (short)FT_MAX( p->rbearing, p->maxrb ); - p->minlb = (short)FT_MIN( glyph->bbx.x_offset, p->minlb ); - p->maxlb = (short)FT_MAX( glyph->bbx.x_offset, p->maxlb ); - - if ( !( p->flags & _BDF_DWIDTH ) ) - { - /* Missing DWIDTH field. Emit an auto correction message and set */ - /* the device width to the glyph width. */ - FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG10, lineno )); - glyph->dwidth = glyph->bbx.width; - } - - /* If the BDF_CORRECT_METRICS flag is set, then adjust the SWIDTH */ - /* value if necessary. */ - if ( p->opts->correct_metrics != 0 ) - { - /* Determine the point size of the glyph. */ - unsigned short sw = (unsigned short)FT_MulDiv( - glyph->dwidth, 72000L, - (FT_Long)( font->point_size * - font->resolution_x ) ); - - - if ( sw != glyph->swidth ) - { - glyph->swidth = sw; - - if ( p->glyph_enc == -1 ) - _bdf_set_glyph_modified( font->umod, - font->unencoded_used - 1 ); - else - _bdf_set_glyph_modified( font->nmod, glyph->encoding ); - - p->flags |= _BDF_SWIDTH_ADJ; - font->modified = 1; - } - } - - p->flags |= _BDF_BBX; - goto Exit; - } - - /* And finally, gather up the bitmap. */ - if ( _bdf_strncmp( line, "BITMAP", 6 ) == 0 ) - { - unsigned long bitmap_size; - - - if ( !( p->flags & _BDF_BBX ) ) - { - /* Missing BBX field. */ - FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "BBX" )); - error = FT_THROW( Missing_Bbx_Field ); - goto Exit; - } - - /* Allocate enough space for the bitmap. */ - glyph->bpr = ( glyph->bbx.width * p->font->bpp + 7 ) >> 3; - - bitmap_size = glyph->bpr * glyph->bbx.height; - if ( glyph->bpr > 0xFFFFU || bitmap_size > 0xFFFFU ) - { - FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG4, lineno )); - error = FT_THROW( Bbx_Too_Big ); - goto Exit; - } - else - glyph->bytes = (unsigned short)bitmap_size; - - if ( FT_NEW_ARRAY( glyph->bitmap, glyph->bytes ) ) - goto Exit; - - p->row = 0; - p->flags |= _BDF_BITMAP; - - goto Exit; - } - - FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG9, lineno )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - - Missing_Encoding: - /* Missing ENCODING field. */ - FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "ENCODING" )); - error = FT_THROW( Missing_Encoding_Field ); - - Exit: - if ( error && ( p->flags & _BDF_GLYPH ) ) - FT_FREE( p->glyph_name ); - - return error; - } - - - /* Load the font properties. */ - static FT_Error - _bdf_parse_properties( char* line, - unsigned long linelen, - unsigned long lineno, - void* call_data, - void* client_data ) - { - unsigned long vlen; - _bdf_line_func_t* next; - _bdf_parse_t* p; - char* name; - char* value; - char nbuf[128]; - FT_Error error = FT_Err_Ok; - - FT_UNUSED( lineno ); - - - next = (_bdf_line_func_t *)call_data; - p = (_bdf_parse_t *) client_data; - - /* Check for the end of the properties. */ - if ( _bdf_strncmp( line, "ENDPROPERTIES", 13 ) == 0 ) - { - /* If the FONT_ASCENT or FONT_DESCENT properties have not been */ - /* encountered yet, then make sure they are added as properties and */ - /* make sure they are set from the font bounding box info. */ - /* */ - /* This is *always* done regardless of the options, because X11 */ - /* requires these two fields to compile fonts. */ - if ( bdf_get_font_property( p->font, "FONT_ASCENT" ) == 0 ) - { - p->font->font_ascent = p->font->bbx.ascent; - ft_sprintf( nbuf, "%hd", p->font->bbx.ascent ); - error = _bdf_add_property( p->font, (char *)"FONT_ASCENT", - nbuf, lineno ); - if ( error ) - goto Exit; - - FT_TRACE2(( "_bdf_parse_properties: " ACMSG1, p->font->bbx.ascent )); - p->font->modified = 1; - } - - if ( bdf_get_font_property( p->font, "FONT_DESCENT" ) == 0 ) - { - p->font->font_descent = p->font->bbx.descent; - ft_sprintf( nbuf, "%hd", p->font->bbx.descent ); - error = _bdf_add_property( p->font, (char *)"FONT_DESCENT", - nbuf, lineno ); - if ( error ) - goto Exit; - - FT_TRACE2(( "_bdf_parse_properties: " ACMSG2, p->font->bbx.descent )); - p->font->modified = 1; - } - - p->flags &= ~_BDF_PROPS; - *next = _bdf_parse_glyphs; - - goto Exit; - } - - /* Ignore the _XFREE86_GLYPH_RANGES properties. */ - if ( _bdf_strncmp( line, "_XFREE86_GLYPH_RANGES", 21 ) == 0 ) - goto Exit; - - /* Handle COMMENT fields and properties in a special way to preserve */ - /* the spacing. */ - if ( _bdf_strncmp( line, "COMMENT", 7 ) == 0 ) - { - name = value = line; - value += 7; - if ( *value ) - *value++ = 0; - error = _bdf_add_property( p->font, name, value, lineno ); - if ( error ) - goto Exit; - } - else if ( _bdf_is_atom( line, linelen, &name, &value, p->font ) ) - { - error = _bdf_add_property( p->font, name, value, lineno ); - if ( error ) - goto Exit; - } - else - { - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); - if ( error ) - goto Exit; - name = p->list.field[0]; - - _bdf_list_shift( &p->list, 1 ); - value = _bdf_list_join( &p->list, ' ', &vlen ); - - error = _bdf_add_property( p->font, name, value, lineno ); - if ( error ) - goto Exit; - } - - Exit: - return error; - } - - - /* Load the font header. */ - static FT_Error - _bdf_parse_start( char* line, - unsigned long linelen, - unsigned long lineno, - void* call_data, - void* client_data ) - { - unsigned long slen; - _bdf_line_func_t* next; - _bdf_parse_t* p; - bdf_font_t* font; - char *s; - - FT_Memory memory = NULL; - FT_Error error = FT_Err_Ok; - - FT_UNUSED( lineno ); /* only used in debug mode */ - - - next = (_bdf_line_func_t *)call_data; - p = (_bdf_parse_t *) client_data; - - if ( p->font ) - memory = p->font->memory; - - /* Check for a comment. This is done to handle those fonts that have */ - /* comments before the STARTFONT line for some reason. */ - if ( _bdf_strncmp( line, "COMMENT", 7 ) == 0 ) - { - if ( p->opts->keep_comments != 0 && p->font != 0 ) - { - linelen -= 7; - - s = line + 7; - if ( *s != 0 ) - { - s++; - linelen--; - } - - error = _bdf_add_comment( p->font, s, linelen ); - if ( error ) - goto Exit; - /* here font is not defined! */ - } - - goto Exit; - } - - if ( !( p->flags & _BDF_START ) ) - { - memory = p->memory; - - if ( _bdf_strncmp( line, "STARTFONT", 9 ) != 0 ) - { - /* we don't emit an error message since this code gets */ - /* explicitly caught one level higher */ - error = FT_THROW( Missing_Startfont_Field ); - goto Exit; - } - - p->flags = _BDF_START; - font = p->font = 0; - - if ( FT_NEW( font ) ) - goto Exit; - p->font = font; - - font->memory = p->memory; - p->memory = 0; - - { /* setup */ - size_t i; - bdf_property_t* prop; - - - error = hash_init( &(font->proptbl), memory ); - if ( error ) - goto Exit; - for ( i = 0, prop = (bdf_property_t*)_bdf_properties; - i < _num_bdf_properties; i++, prop++ ) - { - error = hash_insert( prop->name, i, - &(font->proptbl), memory ); - if ( error ) - goto Exit; - } - } - - if ( FT_ALLOC( p->font->internal, sizeof ( hashtable ) ) ) - goto Exit; - error = hash_init( (hashtable *)p->font->internal,memory ); - if ( error ) - goto Exit; - p->font->spacing = p->opts->font_spacing; - p->font->default_char = -1; - - goto Exit; - } - - /* Check for the start of the properties. */ - if ( _bdf_strncmp( line, "STARTPROPERTIES", 15 ) == 0 ) - { - if ( !( p->flags & _BDF_FONT_BBX ) ) - { - /* Missing the FONTBOUNDINGBOX field. */ - FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONTBOUNDINGBOX" )); - error = FT_THROW( Missing_Fontboundingbox_Field ); - goto Exit; - } - - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); - if ( error ) - goto Exit; - /* at this point, `p->font' can't be NULL */ - p->cnt = p->font->props_size = _bdf_atoul( p->list.field[1], 0, 10 ); - - if ( FT_NEW_ARRAY( p->font->props, p->cnt ) ) - { - p->font->props_size = 0; - goto Exit; - } - - p->flags |= _BDF_PROPS; - *next = _bdf_parse_properties; - - goto Exit; - } - - /* Check for the FONTBOUNDINGBOX field. */ - if ( _bdf_strncmp( line, "FONTBOUNDINGBOX", 15 ) == 0 ) - { - if ( !( p->flags & _BDF_SIZE ) ) - { - /* Missing the SIZE field. */ - FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "SIZE" )); - error = FT_THROW( Missing_Size_Field ); - goto Exit; - } - - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); - if ( error ) - goto Exit; - - p->font->bbx.width = _bdf_atous( p->list.field[1], 0, 10 ); - p->font->bbx.height = _bdf_atous( p->list.field[2], 0, 10 ); - - p->font->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 ); - p->font->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 ); - - p->font->bbx.ascent = (short)( p->font->bbx.height + - p->font->bbx.y_offset ); - - p->font->bbx.descent = (short)( -p->font->bbx.y_offset ); - - p->flags |= _BDF_FONT_BBX; - - goto Exit; - } - - /* The next thing to check for is the FONT field. */ - if ( _bdf_strncmp( line, "FONT", 4 ) == 0 ) - { - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); - if ( error ) - goto Exit; - _bdf_list_shift( &p->list, 1 ); - - s = _bdf_list_join( &p->list, ' ', &slen ); - - if ( !s ) - { - FT_ERROR(( "_bdf_parse_start: " ERRMSG8, lineno, "FONT" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* Allowing multiple `FONT' lines (which is invalid) doesn't hurt... */ - FT_FREE( p->font->name ); - - if ( FT_NEW_ARRAY( p->font->name, slen + 1 ) ) - goto Exit; - FT_MEM_COPY( p->font->name, s, slen + 1 ); - - /* If the font name is an XLFD name, set the spacing to the one in */ - /* the font name. If there is no spacing fall back on the default. */ - error = _bdf_set_default_spacing( p->font, p->opts, lineno ); - if ( error ) - goto Exit; - - p->flags |= _BDF_FONT_NAME; - - goto Exit; - } - - /* Check for the SIZE field. */ - if ( _bdf_strncmp( line, "SIZE", 4 ) == 0 ) - { - if ( !( p->flags & _BDF_FONT_NAME ) ) - { - /* Missing the FONT field. */ - FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONT" )); - error = FT_THROW( Missing_Font_Field ); - goto Exit; - } - - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); - if ( error ) - goto Exit; - - p->font->point_size = _bdf_atoul( p->list.field[1], 0, 10 ); - p->font->resolution_x = _bdf_atoul( p->list.field[2], 0, 10 ); - p->font->resolution_y = _bdf_atoul( p->list.field[3], 0, 10 ); - - /* Check for the bits per pixel field. */ - if ( p->list.used == 5 ) - { - unsigned short bpp; - - - bpp = (unsigned short)_bdf_atos( p->list.field[4], 0, 10 ); - - /* Only values 1, 2, 4, 8 are allowed for greymap fonts. */ - if ( bpp > 4 ) - p->font->bpp = 8; - else if ( bpp > 2 ) - p->font->bpp = 4; - else if ( bpp > 1 ) - p->font->bpp = 2; - else - p->font->bpp = 1; - - if ( p->font->bpp != bpp ) - FT_TRACE2(( "_bdf_parse_start: " ACMSG11, p->font->bpp )); - } - else - p->font->bpp = 1; - - p->flags |= _BDF_SIZE; - - goto Exit; - } - - /* Check for the CHARS field -- font properties are optional */ - if ( _bdf_strncmp( line, "CHARS", 5 ) == 0 ) - { - char nbuf[128]; - - - if ( !( p->flags & _BDF_FONT_BBX ) ) - { - /* Missing the FONTBOUNDINGBOX field. */ - FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONTBOUNDINGBOX" )); - error = FT_THROW( Missing_Fontboundingbox_Field ); - goto Exit; - } - - /* Add the two standard X11 properties which are required */ - /* for compiling fonts. */ - p->font->font_ascent = p->font->bbx.ascent; - ft_sprintf( nbuf, "%hd", p->font->bbx.ascent ); - error = _bdf_add_property( p->font, (char *)"FONT_ASCENT", - nbuf, lineno ); - if ( error ) - goto Exit; - FT_TRACE2(( "_bdf_parse_properties: " ACMSG1, p->font->bbx.ascent )); - - p->font->font_descent = p->font->bbx.descent; - ft_sprintf( nbuf, "%hd", p->font->bbx.descent ); - error = _bdf_add_property( p->font, (char *)"FONT_DESCENT", - nbuf, lineno ); - if ( error ) - goto Exit; - FT_TRACE2(( "_bdf_parse_properties: " ACMSG2, p->font->bbx.descent )); - - p->font->modified = 1; - - *next = _bdf_parse_glyphs; - - /* A special return value. */ - error = -1; - goto Exit; - } - - FT_ERROR(( "_bdf_parse_start: " ERRMSG9, lineno )); - error = FT_THROW( Invalid_File_Format ); - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* API. */ - /* */ - /*************************************************************************/ - - - FT_LOCAL_DEF( FT_Error ) - bdf_load_font( FT_Stream stream, - FT_Memory extmemory, - bdf_options_t* opts, - bdf_font_t* *font ) - { - unsigned long lineno = 0; /* make compiler happy */ - _bdf_parse_t *p = NULL; - - FT_Memory memory = extmemory; /* needed for FT_NEW */ - FT_Error error = FT_Err_Ok; - - - if ( FT_NEW( p ) ) - goto Exit; - - memory = NULL; - p->opts = (bdf_options_t*)( ( opts != 0 ) ? opts : &_bdf_opts ); - p->minlb = 32767; - p->memory = extmemory; /* only during font creation */ - - _bdf_list_init( &p->list, extmemory ); - - error = _bdf_readstream( stream, _bdf_parse_start, - (void *)p, &lineno ); - if ( error ) - goto Fail; - - if ( p->font != 0 ) - { - /* If the font is not proportional, set the font's monowidth */ - /* field to the width of the font bounding box. */ - - if ( p->font->spacing != BDF_PROPORTIONAL ) - p->font->monowidth = p->font->bbx.width; - - /* If the number of glyphs loaded is not that of the original count, */ - /* indicate the difference. */ - if ( p->cnt != p->font->glyphs_used + p->font->unencoded_used ) - { - FT_TRACE2(( "bdf_load_font: " ACMSG15, p->cnt, - p->font->glyphs_used + p->font->unencoded_used )); - p->font->modified = 1; - } - - /* Once the font has been loaded, adjust the overall font metrics if */ - /* necessary. */ - if ( p->opts->correct_metrics != 0 && - ( p->font->glyphs_used > 0 || p->font->unencoded_used > 0 ) ) - { - if ( p->maxrb - p->minlb != p->font->bbx.width ) - { - FT_TRACE2(( "bdf_load_font: " ACMSG3, - p->font->bbx.width, p->maxrb - p->minlb )); - p->font->bbx.width = (unsigned short)( p->maxrb - p->minlb ); - p->font->modified = 1; - } - - if ( p->font->bbx.x_offset != p->minlb ) - { - FT_TRACE2(( "bdf_load_font: " ACMSG4, - p->font->bbx.x_offset, p->minlb )); - p->font->bbx.x_offset = p->minlb; - p->font->modified = 1; - } - - if ( p->font->bbx.ascent != p->maxas ) - { - FT_TRACE2(( "bdf_load_font: " ACMSG5, - p->font->bbx.ascent, p->maxas )); - p->font->bbx.ascent = p->maxas; - p->font->modified = 1; - } - - if ( p->font->bbx.descent != p->maxds ) - { - FT_TRACE2(( "bdf_load_font: " ACMSG6, - p->font->bbx.descent, p->maxds )); - p->font->bbx.descent = p->maxds; - p->font->bbx.y_offset = (short)( -p->maxds ); - p->font->modified = 1; - } - - if ( p->maxas + p->maxds != p->font->bbx.height ) - { - FT_TRACE2(( "bdf_load_font: " ACMSG7, - p->font->bbx.height, p->maxas + p->maxds )); - p->font->bbx.height = (unsigned short)( p->maxas + p->maxds ); - } - - if ( p->flags & _BDF_SWIDTH_ADJ ) - FT_TRACE2(( "bdf_load_font: " ACMSG8 )); - } - } - - if ( p->flags & _BDF_START ) - { - /* The ENDFONT field was never reached or did not exist. */ - if ( !( p->flags & _BDF_GLYPHS ) ) - { - /* Error happened while parsing header. */ - FT_ERROR(( "bdf_load_font: " ERRMSG2, lineno )); - error = FT_THROW( Corrupted_Font_Header ); - goto Exit; - } - else - { - /* Error happened when parsing glyphs. */ - FT_ERROR(( "bdf_load_font: " ERRMSG3, lineno )); - error = FT_THROW( Corrupted_Font_Glyphs ); - goto Exit; - } - } - - if ( p->font != 0 ) - { - /* Make sure the comments are NULL terminated if they exist. */ - memory = p->font->memory; - - if ( p->font->comments_len > 0 ) - { - if ( FT_RENEW_ARRAY( p->font->comments, - p->font->comments_len, - p->font->comments_len + 1 ) ) - goto Fail; - - p->font->comments[p->font->comments_len] = 0; - } - } - else if ( error == FT_Err_Ok ) - error = FT_THROW( Invalid_File_Format ); - - *font = p->font; - - Exit: - if ( p ) - { - _bdf_list_done( &p->list ); - - memory = extmemory; - - FT_FREE( p ); - } - - return error; - - Fail: - bdf_free_font( p->font ); - - memory = extmemory; - - FT_FREE( p->font ); - - goto Exit; - } - - - FT_LOCAL_DEF( void ) - bdf_free_font( bdf_font_t* font ) - { - bdf_property_t* prop; - unsigned long i; - bdf_glyph_t* glyphs; - FT_Memory memory; - - - if ( font == 0 ) - return; - - memory = font->memory; - - FT_FREE( font->name ); - - /* Free up the internal hash table of property names. */ - if ( font->internal ) - { - hash_free( (hashtable *)font->internal, memory ); - FT_FREE( font->internal ); - } - - /* Free up the comment info. */ - FT_FREE( font->comments ); - - /* Free up the properties. */ - for ( i = 0; i < font->props_size; i++ ) - { - if ( font->props[i].format == BDF_ATOM ) - FT_FREE( font->props[i].value.atom ); - } - - FT_FREE( font->props ); - - /* Free up the character info. */ - for ( i = 0, glyphs = font->glyphs; - i < font->glyphs_used; i++, glyphs++ ) - { - FT_FREE( glyphs->name ); - FT_FREE( glyphs->bitmap ); - } - - for ( i = 0, glyphs = font->unencoded; i < font->unencoded_used; - i++, glyphs++ ) - { - FT_FREE( glyphs->name ); - FT_FREE( glyphs->bitmap ); - } - - FT_FREE( font->glyphs ); - FT_FREE( font->unencoded ); - - /* Free up the overflow storage if it was used. */ - for ( i = 0, glyphs = font->overflow.glyphs; - i < font->overflow.glyphs_used; i++, glyphs++ ) - { - FT_FREE( glyphs->name ); - FT_FREE( glyphs->bitmap ); - } - - FT_FREE( font->overflow.glyphs ); - - /* bdf_cleanup */ - hash_free( &(font->proptbl), memory ); - - /* Free up the user defined properties. */ - for ( prop = font->user_props, i = 0; - i < font->nuser_props; i++, prop++ ) - { - FT_FREE( prop->name ); - if ( prop->format == BDF_ATOM ) - FT_FREE( prop->value.atom ); - } - - FT_FREE( font->user_props ); - - /* FREE( font ); */ /* XXX Fixme */ - } - - - FT_LOCAL_DEF( bdf_property_t * ) - bdf_get_font_property( bdf_font_t* font, - const char* name ) - { - hashnode hn; - - - if ( font == 0 || font->props_size == 0 || name == 0 || *name == 0 ) - return 0; - - hn = hash_lookup( name, (hashtable *)font->internal ); - - return hn ? ( font->props + hn->data ) : 0; - } - - -/* END */ diff --git a/3party/freetype/src/bdf/module.mk b/3party/freetype/src/bdf/module.mk deleted file mode 100644 index fe06ae8e06..0000000000 --- a/3party/freetype/src/bdf/module.mk +++ /dev/null @@ -1,34 +0,0 @@ -# -# FreeType 2 BDF module definition -# - -# Copyright 2001, 2002, 2006 by -# Francesco Zappa Nardelli -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - - -FTMODULE_H_COMMANDS += BDF_DRIVER - -define BDF_DRIVER -$(OPEN_DRIVER) FT_Driver_ClassRec, bdf_driver_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)bdf $(ECHO_DRIVER_DESC)bdf bitmap fonts$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/bdf/rules.mk b/3party/freetype/src/bdf/rules.mk deleted file mode 100644 index d1dd76b1c3..0000000000 --- a/3party/freetype/src/bdf/rules.mk +++ /dev/null @@ -1,84 +0,0 @@ -# -# FreeType 2 bdf driver configuration rules -# - - -# Copyright (C) 2001, 2002, 2003, 2008 by -# Francesco Zappa Nardelli -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - - - - -# bdf driver directory -# -BDF_DIR := $(SRC_DIR)/bdf - - -BDF_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(BDF_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# bdf driver sources (i.e., C files) -# -BDF_DRV_SRC := $(BDF_DIR)/bdflib.c \ - $(BDF_DIR)/bdfdrivr.c - - -# bdf driver headers -# -BDF_DRV_H := $(BDF_DIR)/bdf.h \ - $(BDF_DIR)/bdfdrivr.h \ - $(BDF_DIR)/bdferror.h - -# bdf driver object(s) -# -# BDF_DRV_OBJ_M is used during `multi' builds -# BDF_DRV_OBJ_S is used during `single' builds -# -BDF_DRV_OBJ_M := $(BDF_DRV_SRC:$(BDF_DIR)/%.c=$(OBJ_DIR)/%.$O) -BDF_DRV_OBJ_S := $(OBJ_DIR)/bdf.$O - -# bdf driver source file for single build -# -BDF_DRV_SRC_S := $(BDF_DIR)/bdf.c - - -# bdf driver - single object -# -$(BDF_DRV_OBJ_S): $(BDF_DRV_SRC_S) $(BDF_DRV_SRC) $(FREETYPE_H) $(BDF_DRV_H) - $(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BDF_DRV_SRC_S)) - - -# bdf driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(BDF_DIR)/%.c $(FREETYPE_H) $(BDF_DRV_H) - $(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(BDF_DRV_OBJ_S) -DRV_OBJS_M += $(BDF_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/bzip2/Jamfile b/3party/freetype/src/bzip2/Jamfile deleted file mode 100644 index 53f850e6f2..0000000000 --- a/3party/freetype/src/bzip2/Jamfile +++ /dev/null @@ -1,18 +0,0 @@ -# FreeType 2 src/bzip2 Jamfile -# -# Copyright 2010-2015 by -# Joel Klinghed -# -# based on `src/lzw/Jamfile' -# -# 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) bzip2 ; - -Library $(FT2_LIB) : ftbzip2.c ; - -# end of src/bzip2 Jamfile diff --git a/3party/freetype/src/bzip2/ftbzip2.c b/3party/freetype/src/bzip2/ftbzip2.c deleted file mode 100644 index 4dfc9c8991..0000000000 --- a/3party/freetype/src/bzip2/ftbzip2.c +++ /dev/null @@ -1,518 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbzip2.c */ -/* */ -/* FreeType support for .bz2 compressed files. */ -/* */ -/* This optional component relies on libbz2. It should mainly be used to */ -/* parse compressed PCF fonts, as found with many X11 server */ -/* distributions. */ -/* */ -/* Copyright 2010-2015 by */ -/* Joel Klinghed. */ -/* */ -/* based on `src/gzip/ftgzip.c' */ -/* */ -/* 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 <ft2build.h> -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H -#include FT_BZIP2_H -#include FT_CONFIG_STANDARD_LIBRARY_H - - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX Bzip2_Err_ -#define FT_ERR_BASE FT_Mod_Err_Bzip2 - -#include FT_ERRORS_H - - -#ifdef FT_CONFIG_OPTION_USE_BZIP2 - -#ifdef FT_CONFIG_OPTION_PIC -#error "bzip2 code does not support PIC yet" -#endif - -#define BZ_NO_STDIO /* Do not need FILE */ -#include <bzlib.h> - - -/***************************************************************************/ -/***************************************************************************/ -/***** *****/ -/***** B Z I P 2 M E M O R Y M A N A G E M E N T *****/ -/***** *****/ -/***************************************************************************/ -/***************************************************************************/ - - /* it is better to use FreeType memory routines instead of raw - 'malloc/free' */ - - typedef void *(* alloc_func)(void*, int, int); - typedef void (* free_func)(void*, void*); - - static void* - ft_bzip2_alloc( FT_Memory memory, - int items, - int size ) - { - FT_ULong sz = (FT_ULong)size * (FT_ULong)items; - FT_Error error; - FT_Pointer p = NULL; - - - (void)FT_ALLOC( p, sz ); - return p; - } - - - static void - ft_bzip2_free( FT_Memory memory, - void* address ) - { - FT_MEM_FREE( address ); - } - - -/***************************************************************************/ -/***************************************************************************/ -/***** *****/ -/***** B Z I P 2 F I L E D E S C R I P T O R *****/ -/***** *****/ -/***************************************************************************/ -/***************************************************************************/ - -#define FT_BZIP2_BUFFER_SIZE 4096 - - typedef struct FT_BZip2FileRec_ - { - FT_Stream source; /* parent/source stream */ - FT_Stream stream; /* embedding stream */ - FT_Memory memory; /* memory allocator */ - bz_stream bzstream; /* bzlib input stream */ - - FT_Byte input[FT_BZIP2_BUFFER_SIZE]; /* input read buffer */ - - FT_Byte buffer[FT_BZIP2_BUFFER_SIZE]; /* output buffer */ - FT_ULong pos; /* position in output */ - FT_Byte* cursor; - FT_Byte* limit; - - } FT_BZip2FileRec, *FT_BZip2File; - - - /* check and skip .bz2 header - we don't support `transparent' compression */ - static FT_Error - ft_bzip2_check_header( FT_Stream stream ) - { - FT_Error error = FT_Err_Ok; - FT_Byte head[4]; - - - if ( FT_STREAM_SEEK( 0 ) || - FT_STREAM_READ( head, 4 ) ) - goto Exit; - - /* head[0] && head[1] are the magic numbers; */ - /* head[2] is the version, and head[3] the blocksize */ - if ( head[0] != 0x42 || - head[1] != 0x5A || - head[2] != 0x68 ) /* only support bzip2 (huffman) */ - { - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - Exit: - return error; - } - - - static FT_Error - ft_bzip2_file_init( FT_BZip2File zip, - FT_Stream stream, - FT_Stream source ) - { - bz_stream* bzstream = &zip->bzstream; - FT_Error error = FT_Err_Ok; - - - zip->stream = stream; - zip->source = source; - zip->memory = stream->memory; - - zip->limit = zip->buffer + FT_BZIP2_BUFFER_SIZE; - zip->cursor = zip->limit; - zip->pos = 0; - - /* check .bz2 header */ - { - stream = source; - - error = ft_bzip2_check_header( stream ); - if ( error ) - goto Exit; - - if ( FT_STREAM_SEEK( 0 ) ) - goto Exit; - } - - /* initialize bzlib */ - bzstream->bzalloc = (alloc_func)ft_bzip2_alloc; - bzstream->bzfree = (free_func) ft_bzip2_free; - bzstream->opaque = zip->memory; - - bzstream->avail_in = 0; - bzstream->next_in = (char*)zip->buffer; - - if ( BZ2_bzDecompressInit( bzstream, 0, 0 ) != BZ_OK || - bzstream->next_in == NULL ) - error = FT_THROW( Invalid_File_Format ); - - Exit: - return error; - } - - - static void - ft_bzip2_file_done( FT_BZip2File zip ) - { - bz_stream* bzstream = &zip->bzstream; - - - BZ2_bzDecompressEnd( bzstream ); - - /* clear the rest */ - bzstream->bzalloc = NULL; - bzstream->bzfree = NULL; - bzstream->opaque = NULL; - bzstream->next_in = NULL; - bzstream->next_out = NULL; - bzstream->avail_in = 0; - bzstream->avail_out = 0; - - zip->memory = NULL; - zip->source = NULL; - zip->stream = NULL; - } - - - static FT_Error - ft_bzip2_file_reset( FT_BZip2File zip ) - { - FT_Stream stream = zip->source; - FT_Error error; - - - if ( !FT_STREAM_SEEK( 0 ) ) - { - bz_stream* bzstream = &zip->bzstream; - - - BZ2_bzDecompressEnd( bzstream ); - - bzstream->avail_in = 0; - bzstream->next_in = (char*)zip->input; - bzstream->avail_out = 0; - bzstream->next_out = (char*)zip->buffer; - - zip->limit = zip->buffer + FT_BZIP2_BUFFER_SIZE; - zip->cursor = zip->limit; - zip->pos = 0; - - BZ2_bzDecompressInit( bzstream, 0, 0 ); - } - - return error; - } - - - static FT_Error - ft_bzip2_file_fill_input( FT_BZip2File zip ) - { - bz_stream* bzstream = &zip->bzstream; - FT_Stream stream = zip->source; - FT_ULong size; - - - if ( stream->read ) - { - size = stream->read( stream, stream->pos, zip->input, - FT_BZIP2_BUFFER_SIZE ); - if ( size == 0 ) - return FT_THROW( Invalid_Stream_Operation ); - } - else - { - size = stream->size - stream->pos; - if ( size > FT_BZIP2_BUFFER_SIZE ) - size = FT_BZIP2_BUFFER_SIZE; - - if ( size == 0 ) - return FT_THROW( Invalid_Stream_Operation ); - - FT_MEM_COPY( zip->input, stream->base + stream->pos, size ); - } - stream->pos += size; - - bzstream->next_in = (char*)zip->input; - bzstream->avail_in = size; - - return FT_Err_Ok; - } - - - static FT_Error - ft_bzip2_file_fill_output( FT_BZip2File zip ) - { - bz_stream* bzstream = &zip->bzstream; - FT_Error error = FT_Err_Ok; - - - zip->cursor = zip->buffer; - bzstream->next_out = (char*)zip->cursor; - bzstream->avail_out = FT_BZIP2_BUFFER_SIZE; - - while ( bzstream->avail_out > 0 ) - { - int err; - - - if ( bzstream->avail_in == 0 ) - { - error = ft_bzip2_file_fill_input( zip ); - if ( error ) - break; - } - - err = BZ2_bzDecompress( bzstream ); - - if ( err == BZ_STREAM_END ) - { - zip->limit = (FT_Byte*)bzstream->next_out; - if ( zip->limit == zip->cursor ) - error = FT_THROW( Invalid_Stream_Operation ); - break; - } - else if ( err != BZ_OK ) - { - error = FT_THROW( Invalid_Stream_Operation ); - break; - } - } - - return error; - } - - - /* fill output buffer; `count' must be <= FT_BZIP2_BUFFER_SIZE */ - static FT_Error - ft_bzip2_file_skip_output( FT_BZip2File zip, - FT_ULong count ) - { - FT_Error error = FT_Err_Ok; - FT_ULong delta; - - - for (;;) - { - delta = (FT_ULong)( zip->limit - zip->cursor ); - if ( delta >= count ) - delta = count; - - zip->cursor += delta; - zip->pos += delta; - - count -= delta; - if ( count == 0 ) - break; - - error = ft_bzip2_file_fill_output( zip ); - if ( error ) - break; - } - - return error; - } - - - static FT_ULong - ft_bzip2_file_io( FT_BZip2File zip, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ) - { - FT_ULong result = 0; - FT_Error error; - - - /* Reset inflate stream if we're seeking backwards. */ - /* Yes, that is not too efficient, but it saves memory :-) */ - if ( pos < zip->pos ) - { - error = ft_bzip2_file_reset( zip ); - if ( error ) - goto Exit; - } - - /* skip unwanted bytes */ - if ( pos > zip->pos ) - { - error = ft_bzip2_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); - if ( error ) - goto Exit; - } - - if ( count == 0 ) - goto Exit; - - /* now read the data */ - for (;;) - { - FT_ULong delta; - - - delta = (FT_ULong)( zip->limit - zip->cursor ); - if ( delta >= count ) - delta = count; - - FT_MEM_COPY( buffer, zip->cursor, delta ); - buffer += delta; - result += delta; - zip->cursor += delta; - zip->pos += delta; - - count -= delta; - if ( count == 0 ) - break; - - error = ft_bzip2_file_fill_output( zip ); - if ( error ) - break; - } - - Exit: - return result; - } - - -/***************************************************************************/ -/***************************************************************************/ -/***** *****/ -/***** B Z E M B E D D I N G S T R E A M *****/ -/***** *****/ -/***************************************************************************/ -/***************************************************************************/ - - static void - ft_bzip2_stream_close( FT_Stream stream ) - { - FT_BZip2File zip = (FT_BZip2File)stream->descriptor.pointer; - FT_Memory memory = stream->memory; - - - if ( zip ) - { - /* finalize bzip file descriptor */ - ft_bzip2_file_done( zip ); - - FT_FREE( zip ); - - stream->descriptor.pointer = NULL; - } - } - - - static FT_ULong - ft_bzip2_stream_io( FT_Stream stream, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ) - { - FT_BZip2File zip = (FT_BZip2File)stream->descriptor.pointer; - - - return ft_bzip2_file_io( zip, pos, buffer, count ); - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Stream_OpenBzip2( FT_Stream stream, - FT_Stream source ) - { - FT_Error error; - FT_Memory memory; - FT_BZip2File zip = NULL; - - - if ( !stream || !source ) - { - error = FT_THROW( Invalid_Stream_Handle ); - goto Exit; - } - - memory = source->memory; - - /* - * check the header right now; this prevents allocating unnecessary - * objects when we don't need them - */ - error = ft_bzip2_check_header( source ); - if ( error ) - goto Exit; - - FT_ZERO( stream ); - stream->memory = memory; - - if ( !FT_QNEW( zip ) ) - { - error = ft_bzip2_file_init( zip, stream, source ); - if ( error ) - { - FT_FREE( zip ); - goto Exit; - } - - stream->descriptor.pointer = zip; - } - - stream->size = 0x7FFFFFFFL; /* don't know the real size! */ - stream->pos = 0; - stream->base = 0; - stream->read = ft_bzip2_stream_io; - stream->close = ft_bzip2_stream_close; - - Exit: - return error; - } - -#else /* !FT_CONFIG_OPTION_USE_BZIP2 */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stream_OpenBzip2( FT_Stream stream, - FT_Stream source ) - { - FT_UNUSED( stream ); - FT_UNUSED( source ); - - return FT_THROW( Unimplemented_Feature ); - } - -#endif /* !FT_CONFIG_OPTION_USE_BZIP2 */ - - -/* END */ diff --git a/3party/freetype/src/bzip2/rules.mk b/3party/freetype/src/bzip2/rules.mk deleted file mode 100644 index 7040588c1b..0000000000 --- a/3party/freetype/src/bzip2/rules.mk +++ /dev/null @@ -1,64 +0,0 @@ -# -# FreeType 2 BZIP2 support configuration rules -# - -# Copyright 2010-2015 by -# Joel Klinghed. -# -# based on `src/lzw/rules.mk' -# -# 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. - - -# BZIP2 driver directory -# -BZIP2_DIR := $(SRC_DIR)/bzip2 - - -# compilation flags for the driver -# -BZIP2_COMPILE := $(CC) $(ANSIFLAGS) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# BZIP2 support sources (i.e., C files) -# -BZIP2_DRV_SRC := $(BZIP2_DIR)/ftbzip2.c - -# BZIP2 driver object(s) -# -# BZIP2_DRV_OBJ_M is used during `multi' builds -# BZIP2_DRV_OBJ_S is used during `single' builds -# -BZIP2_DRV_OBJ_M := $(OBJ_DIR)/ftbzip2.$O -BZIP2_DRV_OBJ_S := $(OBJ_DIR)/ftbzip2.$O - -# BZIP2 support source file for single build -# -BZIP2_DRV_SRC_S := $(BZIP2_DIR)/ftbzip2.c - - -# BZIP2 support - single object -# -$(BZIP2_DRV_OBJ_S): $(BZIP2_DRV_SRC_S) $(BZIP2_DRV_SRC) $(FREETYPE_H) $(BZIP2_DRV_H) - $(BZIP2_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BZIP2_DRV_SRC_S)) - - -# BZIP2 support - multiple objects -# -$(OBJ_DIR)/%.$O: $(BZIP2_DIR)/%.c $(FREETYPE_H) $(BZIP2_DRV_H) - $(BZIP2_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(BZIP2_DRV_OBJ_S) -DRV_OBJS_M += $(BZIP2_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/cache/Jamfile b/3party/freetype/src/cache/Jamfile deleted file mode 100644 index 1d2bb29392..0000000000 --- a/3party/freetype/src/cache/Jamfile +++ /dev/null @@ -1,37 +0,0 @@ -# FreeType 2 src/cache Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) cache ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = ftcbasic - ftccache - ftcglyph - ftcimage - ftcmanag - ftccmap - ftcmru - ftcsbits - ; - } - else - { - _sources = ftcache ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/cache Jamfile diff --git a/3party/freetype/src/cache/ftcache.c b/3party/freetype/src/cache/ftcache.c deleted file mode 100644 index 8de527acab..0000000000 --- a/3party/freetype/src/cache/ftcache.c +++ /dev/null @@ -1,31 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcache.c */ -/* */ -/* The FreeType Caching sub-system (body only). */ -/* */ -/* Copyright 2000-2015 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. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "ftcmru.c" -#include "ftcmanag.c" -#include "ftccache.c" -#include "ftccmap.c" -#include "ftcglyph.c" -#include "ftcimage.c" -#include "ftcsbits.c" -#include "ftcbasic.c" - -/* END */ diff --git a/3party/freetype/src/cache/ftcbasic.c b/3party/freetype/src/cache/ftcbasic.c deleted file mode 100644 index ac3290cef4..0000000000 --- a/3party/freetype/src/cache/ftcbasic.c +++ /dev/null @@ -1,597 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcbasic.c */ -/* */ -/* The FreeType basic cache interface (body). */ -/* */ -/* Copyright 2003-2015 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 <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_CACHE_H -#include "ftcglyph.h" -#include "ftcimage.h" -#include "ftcsbits.h" - -#include "ftccback.h" -#include "ftcerror.h" - -#define FT_COMPONENT trace_cache - - - /* - * Basic Families - * - */ - typedef struct FTC_BasicAttrRec_ - { - FTC_ScalerRec scaler; - FT_UInt load_flags; - - } FTC_BasicAttrRec, *FTC_BasicAttrs; - -#define FTC_BASIC_ATTR_COMPARE( a, b ) \ - FT_BOOL( FTC_SCALER_COMPARE( &(a)->scaler, &(b)->scaler ) && \ - (a)->load_flags == (b)->load_flags ) - -#define FTC_BASIC_ATTR_HASH( a ) \ - ( FTC_SCALER_HASH( &(a)->scaler ) + 31 * (a)->load_flags ) - - - typedef struct FTC_BasicQueryRec_ - { - FTC_GQueryRec gquery; - FTC_BasicAttrRec attrs; - - } FTC_BasicQueryRec, *FTC_BasicQuery; - - - typedef struct FTC_BasicFamilyRec_ - { - FTC_FamilyRec family; - FTC_BasicAttrRec attrs; - - } FTC_BasicFamilyRec, *FTC_BasicFamily; - - - FT_CALLBACK_DEF( FT_Bool ) - ftc_basic_family_compare( FTC_MruNode ftcfamily, - FT_Pointer ftcquery ) - { - FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; - FTC_BasicQuery query = (FTC_BasicQuery)ftcquery; - - - return FTC_BASIC_ATTR_COMPARE( &family->attrs, &query->attrs ); - } - - - FT_CALLBACK_DEF( FT_Error ) - ftc_basic_family_init( FTC_MruNode ftcfamily, - FT_Pointer ftcquery, - FT_Pointer ftccache ) - { - FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; - FTC_BasicQuery query = (FTC_BasicQuery)ftcquery; - FTC_Cache cache = (FTC_Cache)ftccache; - - - FTC_Family_Init( FTC_FAMILY( family ), cache ); - family->attrs = query->attrs; - return 0; - } - - - FT_CALLBACK_DEF( FT_UInt ) - ftc_basic_family_get_count( FTC_Family ftcfamily, - FTC_Manager manager ) - { - FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; - FT_Error error; - FT_Face face; - FT_UInt result = 0; - - - error = FTC_Manager_LookupFace( manager, family->attrs.scaler.face_id, - &face ); - - if ( error || !face ) - return result; - - if ( (FT_ULong)face->num_glyphs > FT_UINT_MAX || 0 > face->num_glyphs ) - FT_TRACE1(( "ftc_basic_family_get_count:" - " too large number of glyphs in this face, truncated\n", - face->num_glyphs )); - - if ( !error ) - result = (FT_UInt)face->num_glyphs; - - return result; - } - - - FT_CALLBACK_DEF( FT_Error ) - ftc_basic_family_load_bitmap( FTC_Family ftcfamily, - FT_UInt gindex, - FTC_Manager manager, - FT_Face *aface ) - { - FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; - FT_Error error; - FT_Size size; - - - error = FTC_Manager_LookupSize( manager, &family->attrs.scaler, &size ); - if ( !error ) - { - FT_Face face = size->face; - - - error = FT_Load_Glyph( - face, - gindex, - (FT_Int)family->attrs.load_flags | FT_LOAD_RENDER ); - if ( !error ) - *aface = face; - } - - return error; - } - - - FT_CALLBACK_DEF( FT_Error ) - ftc_basic_family_load_glyph( FTC_Family ftcfamily, - FT_UInt gindex, - FTC_Cache cache, - FT_Glyph *aglyph ) - { - FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; - FT_Error error; - FTC_Scaler scaler = &family->attrs.scaler; - FT_Face face; - FT_Size size; - - - /* we will now load the glyph image */ - error = FTC_Manager_LookupSize( cache->manager, - scaler, - &size ); - if ( !error ) - { - face = size->face; - - error = FT_Load_Glyph( face, - gindex, - (FT_Int)family->attrs.load_flags ); - if ( !error ) - { - if ( face->glyph->format == FT_GLYPH_FORMAT_BITMAP || - face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) - { - /* ok, copy it */ - FT_Glyph glyph; - - - error = FT_Get_Glyph( face->glyph, &glyph ); - if ( !error ) - { - *aglyph = glyph; - goto Exit; - } - } - else - error = FT_THROW( Invalid_Argument ); - } - } - - Exit: - return error; - } - - - FT_CALLBACK_DEF( FT_Bool ) - ftc_basic_gnode_compare_faceid( FTC_Node ftcgnode, - FT_Pointer ftcface_id, - FTC_Cache cache, - FT_Bool* list_changed ) - { - FTC_GNode gnode = (FTC_GNode)ftcgnode; - FTC_FaceID face_id = (FTC_FaceID)ftcface_id; - FTC_BasicFamily family = (FTC_BasicFamily)gnode->family; - FT_Bool result; - - - if ( list_changed ) - *list_changed = FALSE; - result = FT_BOOL( family->attrs.scaler.face_id == face_id ); - if ( result ) - { - /* we must call this function to avoid this node from appearing - * in later lookups with the same face_id! - */ - FTC_GNode_UnselectFamily( gnode, cache ); - } - return result; - } - - - /* - * - * basic image cache - * - */ - - static - const FTC_IFamilyClassRec ftc_basic_image_family_class = - { - { - sizeof ( FTC_BasicFamilyRec ), - ftc_basic_family_compare, - ftc_basic_family_init, - 0, /* FTC_MruNode_ResetFunc */ - 0 /* FTC_MruNode_DoneFunc */ - }, - ftc_basic_family_load_glyph - }; - - - static - const FTC_GCacheClassRec ftc_basic_image_cache_class = - { - { - ftc_inode_new, - ftc_inode_weight, - ftc_gnode_compare, - ftc_basic_gnode_compare_faceid, - ftc_inode_free, - - sizeof ( FTC_GCacheRec ), - ftc_gcache_init, - ftc_gcache_done - }, - (FTC_MruListClass)&ftc_basic_image_family_class - }; - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_ImageCache_New( FTC_Manager manager, - FTC_ImageCache *acache ) - { - return FTC_GCache_New( manager, &ftc_basic_image_cache_class, - (FTC_GCache*)acache ); - } - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_ImageCache_Lookup( FTC_ImageCache cache, - FTC_ImageType type, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ) - { - FTC_BasicQueryRec query; - FTC_Node node = 0; /* make compiler happy */ - FT_Error error; - FT_Offset hash; - - - /* some argument checks are delayed to `FTC_Cache_Lookup' */ - if ( !aglyph ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - *aglyph = NULL; - if ( anode ) - *anode = NULL; - - if ( (FT_ULong)( type->flags - FT_INT_MIN ) > FT_UINT_MAX ) - FT_TRACE1(( "FTC_ImageCache_Lookup:" - " higher bits in load_flags 0x%x are dropped\n", - (FT_ULong)type->flags & ~((FT_ULong)FT_UINT_MAX) )); - - query.attrs.scaler.face_id = type->face_id; - query.attrs.scaler.width = type->width; - query.attrs.scaler.height = type->height; - query.attrs.load_flags = (FT_UInt)type->flags; - - query.attrs.scaler.pixel = 1; - query.attrs.scaler.x_res = 0; /* make compilers happy */ - query.attrs.scaler.y_res = 0; - - hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex; - -#if 1 /* inlining is about 50% faster! */ - FTC_GCACHE_LOOKUP_CMP( cache, - ftc_basic_family_compare, - FTC_GNode_Compare, - hash, gindex, - &query, - node, - error ); -#else - error = FTC_GCache_Lookup( FTC_GCACHE( cache ), - hash, gindex, - FTC_GQUERY( &query ), - &node ); -#endif - if ( !error ) - { - *aglyph = FTC_INODE( node )->glyph; - - if ( anode ) - { - *anode = node; - node->ref_count++; - } - } - - Exit: - return error; - } - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_ImageCache_LookupScaler( FTC_ImageCache cache, - FTC_Scaler scaler, - FT_ULong load_flags, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ) - { - FTC_BasicQueryRec query; - FTC_Node node = 0; /* make compiler happy */ - FT_Error error; - FT_Offset hash; - - - /* some argument checks are delayed to `FTC_Cache_Lookup' */ - if ( !aglyph || !scaler ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - *aglyph = NULL; - if ( anode ) - *anode = NULL; - - /* `FT_Load_Glyph' and `FT_Load_Char' take FT_UInt flags */ - if ( load_flags > FT_UINT_MAX ) - FT_TRACE1(( "FTC_ImageCache_LookupScaler:" - " higher bits in load_flags 0x%x are dropped\n", - load_flags & ~((FT_ULong)FT_UINT_MAX) )); - - query.attrs.scaler = scaler[0]; - query.attrs.load_flags = (FT_UInt)load_flags; - - hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex; - - FTC_GCACHE_LOOKUP_CMP( cache, - ftc_basic_family_compare, - FTC_GNode_Compare, - hash, gindex, - &query, - node, - error ); - if ( !error ) - { - *aglyph = FTC_INODE( node )->glyph; - - if ( anode ) - { - *anode = node; - node->ref_count++; - } - } - - Exit: - return error; - } - - - /* - * - * basic small bitmap cache - * - */ - - static - const FTC_SFamilyClassRec ftc_basic_sbit_family_class = - { - { - sizeof ( FTC_BasicFamilyRec ), - ftc_basic_family_compare, - ftc_basic_family_init, - 0, /* FTC_MruNode_ResetFunc */ - 0 /* FTC_MruNode_DoneFunc */ - }, - ftc_basic_family_get_count, - ftc_basic_family_load_bitmap - }; - - - static - const FTC_GCacheClassRec ftc_basic_sbit_cache_class = - { - { - ftc_snode_new, - ftc_snode_weight, - ftc_snode_compare, - ftc_basic_gnode_compare_faceid, - ftc_snode_free, - - sizeof ( FTC_GCacheRec ), - ftc_gcache_init, - ftc_gcache_done - }, - (FTC_MruListClass)&ftc_basic_sbit_family_class - }; - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_SBitCache_New( FTC_Manager manager, - FTC_SBitCache *acache ) - { - return FTC_GCache_New( manager, &ftc_basic_sbit_cache_class, - (FTC_GCache*)acache ); - } - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_SBitCache_Lookup( FTC_SBitCache cache, - FTC_ImageType type, - FT_UInt gindex, - FTC_SBit *ansbit, - FTC_Node *anode ) - { - FT_Error error; - FTC_BasicQueryRec query; - FTC_Node node = 0; /* make compiler happy */ - FT_Offset hash; - - - if ( anode ) - *anode = NULL; - - /* other argument checks delayed to `FTC_Cache_Lookup' */ - if ( !ansbit ) - return FT_THROW( Invalid_Argument ); - - *ansbit = NULL; - - if ( (FT_ULong)( type->flags - FT_INT_MIN ) > FT_UINT_MAX ) - FT_TRACE1(( "FTC_ImageCache_Lookup:" - " higher bits in load_flags 0x%x are dropped\n", - (FT_ULong)type->flags & ~((FT_ULong)FT_UINT_MAX) )); - - query.attrs.scaler.face_id = type->face_id; - query.attrs.scaler.width = type->width; - query.attrs.scaler.height = type->height; - query.attrs.load_flags = (FT_UInt)type->flags; - - query.attrs.scaler.pixel = 1; - query.attrs.scaler.x_res = 0; /* make compilers happy */ - query.attrs.scaler.y_res = 0; - - /* beware, the hash must be the same for all glyph ranges! */ - hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + - gindex / FTC_SBIT_ITEMS_PER_NODE; - -#if 1 /* inlining is about 50% faster! */ - FTC_GCACHE_LOOKUP_CMP( cache, - ftc_basic_family_compare, - FTC_SNode_Compare, - hash, gindex, - &query, - node, - error ); -#else - error = FTC_GCache_Lookup( FTC_GCACHE( cache ), - hash, - gindex, - FTC_GQUERY( &query ), - &node ); -#endif - if ( error ) - goto Exit; - - *ansbit = FTC_SNODE( node )->sbits + - ( gindex - FTC_GNODE( node )->gindex ); - - if ( anode ) - { - *anode = node; - node->ref_count++; - } - - Exit: - return error; - } - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_SBitCache_LookupScaler( FTC_SBitCache cache, - FTC_Scaler scaler, - FT_ULong load_flags, - FT_UInt gindex, - FTC_SBit *ansbit, - FTC_Node *anode ) - { - FT_Error error; - FTC_BasicQueryRec query; - FTC_Node node = 0; /* make compiler happy */ - FT_Offset hash; - - - if ( anode ) - *anode = NULL; - - /* other argument checks delayed to `FTC_Cache_Lookup' */ - if ( !ansbit || !scaler ) - return FT_THROW( Invalid_Argument ); - - *ansbit = NULL; - - /* `FT_Load_Glyph' and `FT_Load_Char' take FT_UInt flags */ - if ( load_flags > FT_UINT_MAX ) - FT_TRACE1(( "FTC_ImageCache_LookupScaler:" - " higher bits in load_flags 0x%x are dropped\n", - load_flags & ~((FT_ULong)FT_UINT_MAX) )); - - query.attrs.scaler = scaler[0]; - query.attrs.load_flags = (FT_UInt)load_flags; - - /* beware, the hash must be the same for all glyph ranges! */ - hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + - gindex / FTC_SBIT_ITEMS_PER_NODE; - - FTC_GCACHE_LOOKUP_CMP( cache, - ftc_basic_family_compare, - FTC_SNode_Compare, - hash, gindex, - &query, - node, - error ); - if ( error ) - goto Exit; - - *ansbit = FTC_SNODE( node )->sbits + - ( gindex - FTC_GNODE( node )->gindex ); - - if ( anode ) - { - *anode = node; - node->ref_count++; - } - - Exit: - return error; - } - - -/* END */ diff --git a/3party/freetype/src/cache/ftccache.c b/3party/freetype/src/cache/ftccache.c deleted file mode 100644 index d8c5b99681..0000000000 --- a/3party/freetype/src/cache/ftccache.c +++ /dev/null @@ -1,621 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftccache.c */ -/* */ -/* The FreeType internal cache interface (body). */ -/* */ -/* Copyright 2000-2015 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 <ft2build.h> -#include "ftcmanag.h" -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H - -#include "ftccback.h" -#include "ftcerror.h" - -#undef FT_COMPONENT -#define FT_COMPONENT trace_cache - - -#define FTC_HASH_MAX_LOAD 2 -#define FTC_HASH_MIN_LOAD 1 -#define FTC_HASH_SUB_LOAD ( FTC_HASH_MAX_LOAD - FTC_HASH_MIN_LOAD ) - - /* this one _must_ be a power of 2! */ -#define FTC_HASH_INITIAL_SIZE 8 - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CACHE NODE DEFINITIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* add a new node to the head of the manager's circular MRU list */ - static void - ftc_node_mru_link( FTC_Node node, - FTC_Manager manager ) - { - void *nl = &manager->nodes_list; - - - FTC_MruNode_Prepend( (FTC_MruNode*)nl, - (FTC_MruNode)node ); - manager->num_nodes++; - } - - - /* remove a node from the manager's MRU list */ - static void - ftc_node_mru_unlink( FTC_Node node, - FTC_Manager manager ) - { - void *nl = &manager->nodes_list; - - - FTC_MruNode_Remove( (FTC_MruNode*)nl, - (FTC_MruNode)node ); - manager->num_nodes--; - } - - -#ifndef FTC_INLINE - - /* move a node to the head of the manager's MRU list */ - static void - ftc_node_mru_up( FTC_Node node, - FTC_Manager manager ) - { - FTC_MruNode_Up( (FTC_MruNode*)&manager->nodes_list, - (FTC_MruNode)node ); - } - - - /* get a top bucket for specified hash from cache, - * body for FTC_NODE__TOP_FOR_HASH( cache, hash ) - */ - FT_LOCAL_DEF( FTC_Node* ) - ftc_get_top_node_for_hash( FTC_Cache cache, - FT_Offset hash ) - { - FTC_Node* pnode; - FT_Offset idx; - - - idx = hash & cache->mask; - if ( idx < cache->p ) - idx = hash & ( 2 * cache->mask + 1 ); - pnode = cache->buckets + idx; - return pnode; - } - -#endif /* !FTC_INLINE */ - - - /* Note that this function cannot fail. If we cannot re-size the - * buckets array appropriately, we simply degrade the hash table's - * performance! - */ - static void - ftc_cache_resize( FTC_Cache cache ) - { - for (;;) - { - FTC_Node node, *pnode; - FT_UFast p = cache->p; - FT_UFast mask = cache->mask; - FT_UFast count = mask + p + 1; /* number of buckets */ - - - /* do we need to shrink the buckets array? */ - if ( cache->slack < 0 ) - { - FTC_Node new_list = NULL; - - - /* try to expand the buckets array _before_ splitting - * the bucket lists - */ - if ( p >= mask ) - { - FT_Memory memory = cache->memory; - FT_Error error; - - - /* if we can't expand the array, leave immediately */ - if ( FT_RENEW_ARRAY( cache->buckets, - ( mask + 1 ) * 2, ( mask + 1 ) * 4 ) ) - break; - } - - /* split a single bucket */ - pnode = cache->buckets + p; - - for (;;) - { - node = *pnode; - if ( node == NULL ) - break; - - if ( node->hash & ( mask + 1 ) ) - { - *pnode = node->link; - node->link = new_list; - new_list = node; - } - else - pnode = &node->link; - } - - cache->buckets[p + mask + 1] = new_list; - - cache->slack += FTC_HASH_MAX_LOAD; - - if ( p >= mask ) - { - cache->mask = 2 * mask + 1; - cache->p = 0; - } - else - cache->p = p + 1; - } - - /* do we need to expand the buckets array? */ - else if ( cache->slack > (FT_Long)count * FTC_HASH_SUB_LOAD ) - { - FT_UFast old_index = p + mask; - FTC_Node* pold; - - - if ( old_index + 1 <= FTC_HASH_INITIAL_SIZE ) - break; - - if ( p == 0 ) - { - FT_Memory memory = cache->memory; - FT_Error error; - - - /* if we can't shrink the array, leave immediately */ - if ( FT_RENEW_ARRAY( cache->buckets, - ( mask + 1 ) * 2, mask + 1 ) ) - break; - - cache->mask >>= 1; - p = cache->mask; - } - else - p--; - - pnode = cache->buckets + p; - while ( *pnode ) - pnode = &(*pnode)->link; - - pold = cache->buckets + old_index; - *pnode = *pold; - *pold = NULL; - - cache->slack -= FTC_HASH_MAX_LOAD; - cache->p = p; - } - - /* otherwise, the hash table is balanced */ - else - break; - } - } - - - /* remove a node from its cache's hash table */ - static void - ftc_node_hash_unlink( FTC_Node node0, - FTC_Cache cache ) - { - FTC_Node *pnode = FTC_NODE__TOP_FOR_HASH( cache, node0->hash ); - - - for (;;) - { - FTC_Node node = *pnode; - - - if ( node == NULL ) - { - FT_TRACE0(( "ftc_node_hash_unlink: unknown node\n" )); - return; - } - - if ( node == node0 ) - break; - - pnode = &(*pnode)->link; - } - - *pnode = node0->link; - node0->link = NULL; - - cache->slack++; - ftc_cache_resize( cache ); - } - - - /* add a node to the `top' of its cache's hash table */ - static void - ftc_node_hash_link( FTC_Node node, - FTC_Cache cache ) - { - FTC_Node *pnode = FTC_NODE__TOP_FOR_HASH( cache, node->hash ); - - - node->link = *pnode; - *pnode = node; - - cache->slack--; - ftc_cache_resize( cache ); - } - - - /* remove a node from the cache manager */ - FT_LOCAL_DEF( void ) - ftc_node_destroy( FTC_Node node, - FTC_Manager manager ) - { - FTC_Cache cache; - - -#ifdef FT_DEBUG_ERROR - /* find node's cache */ - if ( node->cache_index >= manager->num_caches ) - { - FT_TRACE0(( "ftc_node_destroy: invalid node handle\n" )); - return; - } -#endif - - cache = manager->caches[node->cache_index]; - -#ifdef FT_DEBUG_ERROR - if ( cache == NULL ) - { - FT_TRACE0(( "ftc_node_destroy: invalid node handle\n" )); - return; - } -#endif - - manager->cur_weight -= cache->clazz.node_weight( node, cache ); - - /* remove node from mru list */ - ftc_node_mru_unlink( node, manager ); - - /* remove node from cache's hash table */ - ftc_node_hash_unlink( node, cache ); - - /* now finalize it */ - cache->clazz.node_free( node, cache ); - -#if 0 - /* check, just in case of general corruption :-) */ - if ( manager->num_nodes == 0 ) - FT_TRACE0(( "ftc_node_destroy: invalid cache node count (%d)\n", - manager->num_nodes )); -#endif - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** ABSTRACT CACHE CLASS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_LOCAL_DEF( FT_Error ) - FTC_Cache_Init( FTC_Cache cache ) - { - return ftc_cache_init( cache ); - } - - - FT_LOCAL_DEF( FT_Error ) - ftc_cache_init( FTC_Cache cache ) - { - FT_Memory memory = cache->memory; - FT_Error error; - - - cache->p = 0; - cache->mask = FTC_HASH_INITIAL_SIZE - 1; - cache->slack = FTC_HASH_INITIAL_SIZE * FTC_HASH_MAX_LOAD; - - (void)FT_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE * 2 ); - return error; - } - - - static void - FTC_Cache_Clear( FTC_Cache cache ) - { - if ( cache && cache->buckets ) - { - FTC_Manager manager = cache->manager; - FT_UFast i; - FT_UFast count; - - - count = cache->p + cache->mask + 1; - - for ( i = 0; i < count; i++ ) - { - FTC_Node *pnode = cache->buckets + i, next, node = *pnode; - - - while ( node ) - { - next = node->link; - node->link = NULL; - - /* remove node from mru list */ - ftc_node_mru_unlink( node, manager ); - - /* now finalize it */ - manager->cur_weight -= cache->clazz.node_weight( node, cache ); - - cache->clazz.node_free( node, cache ); - node = next; - } - cache->buckets[i] = NULL; - } - ftc_cache_resize( cache ); - } - } - - - FT_LOCAL_DEF( void ) - ftc_cache_done( FTC_Cache cache ) - { - if ( cache->memory ) - { - FT_Memory memory = cache->memory; - - - FTC_Cache_Clear( cache ); - - FT_FREE( cache->buckets ); - cache->mask = 0; - cache->p = 0; - cache->slack = 0; - - cache->memory = NULL; - } - } - - - FT_LOCAL_DEF( void ) - FTC_Cache_Done( FTC_Cache cache ) - { - ftc_cache_done( cache ); - } - - - static void - ftc_cache_add( FTC_Cache cache, - FT_Offset hash, - FTC_Node node ) - { - node->hash = hash; - node->cache_index = (FT_UInt16)cache->index; - node->ref_count = 0; - - ftc_node_hash_link( node, cache ); - ftc_node_mru_link( node, cache->manager ); - - { - FTC_Manager manager = cache->manager; - - - manager->cur_weight += cache->clazz.node_weight( node, cache ); - - if ( manager->cur_weight >= manager->max_weight ) - { - node->ref_count++; - FTC_Manager_Compress( manager ); - node->ref_count--; - } - } - } - - - FT_LOCAL_DEF( FT_Error ) - FTC_Cache_NewNode( FTC_Cache cache, - FT_Offset hash, - FT_Pointer query, - FTC_Node *anode ) - { - FT_Error error; - FTC_Node node; - - - /* - * We use the FTC_CACHE_TRYLOOP macros to support out-of-memory - * errors (OOM) correctly, i.e., by flushing the cache progressively - * in order to make more room. - */ - - FTC_CACHE_TRYLOOP( cache ) - { - error = cache->clazz.node_new( &node, query, cache ); - } - FTC_CACHE_TRYLOOP_END( NULL ); - - if ( error ) - node = NULL; - else - { - /* don't assume that the cache has the same number of buckets, since - * our allocation request might have triggered global cache flushing - */ - ftc_cache_add( cache, hash, node ); - } - - *anode = node; - return error; - } - - -#ifndef FTC_INLINE - - FT_LOCAL_DEF( FT_Error ) - FTC_Cache_Lookup( FTC_Cache cache, - FT_Offset hash, - FT_Pointer query, - FTC_Node *anode ) - { - FTC_Node* bucket; - FTC_Node* pnode; - FTC_Node node; - FT_Error error = FT_Err_Ok; - FT_Bool list_changed = FALSE; - - FTC_Node_CompareFunc compare = cache->clazz.node_compare; - - - if ( cache == NULL || anode == NULL ) - return FT_THROW( Invalid_Argument ); - - /* Go to the `top' node of the list sharing same masked hash */ - bucket = pnode = FTC_NODE__TOP_FOR_HASH( cache, hash ); - - /* Lookup a node with exactly same hash and queried properties. */ - /* NOTE: _nodcomp() may change the linked list to reduce memory. */ - for (;;) - { - node = *pnode; - if ( node == NULL ) - goto NewNode; - - if ( node->hash == hash && - compare( node, query, cache, &list_changed ) ) - break; - - pnode = &node->link; - } - - if ( list_changed ) - { - /* Update bucket by modified linked list */ - bucket = pnode = FTC_NODE__TOP_FOR_HASH( cache, hash ); - - /* Update pnode by modified linked list */ - while ( *pnode != node ) - { - if ( *pnode == NULL ) - { - FT_ERROR(( "FTC_Cache_Lookup: oops!!! node missing\n" )); - goto NewNode; - } - else - pnode = &((*pnode)->link); - } - } - - /* Reorder the list to move the found node to the `top' */ - if ( node != *bucket ) - { - *pnode = node->link; - node->link = *bucket; - *bucket = node; - } - - /* move to head of MRU list */ - { - FTC_Manager manager = cache->manager; - - - if ( node != manager->nodes_list ) - ftc_node_mru_up( node, manager ); - } - *anode = node; - - return error; - - NewNode: - return FTC_Cache_NewNode( cache, hash, query, anode ); - } - -#endif /* !FTC_INLINE */ - - - FT_LOCAL_DEF( void ) - FTC_Cache_RemoveFaceID( FTC_Cache cache, - FTC_FaceID face_id ) - { - FT_UFast i, count; - FTC_Manager manager = cache->manager; - FTC_Node frees = NULL; - - - count = cache->p + cache->mask + 1; - for ( i = 0; i < count; i++ ) - { - FTC_Node* bucket = cache->buckets + i; - FTC_Node* pnode = bucket; - - - for ( ;; ) - { - FTC_Node node = *pnode; - FT_Bool list_changed = FALSE; - - - if ( node == NULL ) - break; - - if ( cache->clazz.node_remove_faceid( node, face_id, - cache, &list_changed ) ) - { - *pnode = node->link; - node->link = frees; - frees = node; - } - else - pnode = &node->link; - } - } - - /* remove all nodes in the free list */ - while ( frees ) - { - FTC_Node node; - - - node = frees; - frees = node->link; - - manager->cur_weight -= cache->clazz.node_weight( node, cache ); - ftc_node_mru_unlink( node, manager ); - - cache->clazz.node_free( node, cache ); - - cache->slack++; - } - - ftc_cache_resize( cache ); - } - - -/* END */ diff --git a/3party/freetype/src/cache/ftccache.h b/3party/freetype/src/cache/ftccache.h deleted file mode 100644 index 4e17c7afef..0000000000 --- a/3party/freetype/src/cache/ftccache.h +++ /dev/null @@ -1,352 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftccache.h */ -/* */ -/* FreeType internal cache interface (specification). */ -/* */ -/* Copyright 2000-2015 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 __FTCCACHE_H__ -#define __FTCCACHE_H__ - - -#include "ftcmru.h" - -FT_BEGIN_HEADER - -#define _FTC_FACE_ID_HASH( i ) \ - ( ( (FT_Offset)(i) >> 3 ) ^ ( (FT_Offset)(i) << 7 ) ) - - /* handle to cache object */ - typedef struct FTC_CacheRec_* FTC_Cache; - - /* handle to cache class */ - typedef const struct FTC_CacheClassRec_* FTC_CacheClass; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CACHE NODE DEFINITIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* Each cache controls one or more cache nodes. Each node is part of */ - /* the global_lru list of the manager. Its `data' field however is used */ - /* as a reference count for now. */ - /* */ - /* A node can be anything, depending on the type of information held by */ - /* the cache. It can be an individual glyph image, a set of bitmaps */ - /* glyphs for a given size, some metrics, etc. */ - /* */ - /*************************************************************************/ - - /* structure size should be 20 bytes on 32-bits machines */ - typedef struct FTC_NodeRec_ - { - FTC_MruNodeRec mru; /* circular mru list pointer */ - FTC_Node link; /* used for hashing */ - FT_Offset hash; /* used for hashing too */ - FT_UShort cache_index; /* index of cache the node belongs to */ - FT_Short ref_count; /* reference count for this node */ - - } FTC_NodeRec; - - -#define FTC_NODE( x ) ( (FTC_Node)(x) ) -#define FTC_NODE_P( x ) ( (FTC_Node*)(x) ) - -#define FTC_NODE__NEXT( x ) FTC_NODE( (x)->mru.next ) -#define FTC_NODE__PREV( x ) FTC_NODE( (x)->mru.prev ) - -#ifdef FTC_INLINE -#define FTC_NODE__TOP_FOR_HASH( cache, hash ) \ - ( ( cache )->buckets + \ - ( ( ( ( hash ) & ( cache )->mask ) < ( cache )->p ) \ - ? ( ( hash ) & ( ( cache )->mask * 2 + 1 ) ) \ - : ( ( hash ) & ( cache )->mask ) ) ) -#else - FT_LOCAL( FTC_Node* ) - ftc_get_top_node_for_hash( FTC_Cache cache, - FT_Offset hash ); -#define FTC_NODE__TOP_FOR_HASH( cache, hash ) \ - ftc_get_top_node_for_hash( ( cache ), ( hash ) ) -#endif - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CACHE DEFINITIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* initialize a new cache node */ - typedef FT_Error - (*FTC_Node_NewFunc)( FTC_Node *pnode, - FT_Pointer query, - FTC_Cache cache ); - - typedef FT_Offset - (*FTC_Node_WeightFunc)( FTC_Node node, - FTC_Cache cache ); - - /* compare a node to a given key pair */ - typedef FT_Bool - (*FTC_Node_CompareFunc)( FTC_Node node, - FT_Pointer key, - FTC_Cache cache, - FT_Bool* list_changed ); - - - typedef void - (*FTC_Node_FreeFunc)( FTC_Node node, - FTC_Cache cache ); - - typedef FT_Error - (*FTC_Cache_InitFunc)( FTC_Cache cache ); - - typedef void - (*FTC_Cache_DoneFunc)( FTC_Cache cache ); - - - typedef struct FTC_CacheClassRec_ - { - FTC_Node_NewFunc node_new; - FTC_Node_WeightFunc node_weight; - FTC_Node_CompareFunc node_compare; - FTC_Node_CompareFunc node_remove_faceid; - FTC_Node_FreeFunc node_free; - - FT_Offset cache_size; - FTC_Cache_InitFunc cache_init; - FTC_Cache_DoneFunc cache_done; - - } FTC_CacheClassRec; - - - /* each cache really implements a dynamic hash table to manage its nodes */ - typedef struct FTC_CacheRec_ - { - FT_UFast p; - FT_UFast mask; - FT_Long slack; - FTC_Node* buckets; - - FTC_CacheClassRec clazz; /* local copy, for speed */ - - FTC_Manager manager; - FT_Memory memory; - FT_UInt index; /* in manager's table */ - - FTC_CacheClass org_class; /* original class pointer */ - - } FTC_CacheRec; - - -#define FTC_CACHE( x ) ( (FTC_Cache)(x) ) -#define FTC_CACHE_P( x ) ( (FTC_Cache*)(x) ) - - - /* default cache initialize */ - FT_LOCAL( FT_Error ) - FTC_Cache_Init( FTC_Cache cache ); - - /* default cache finalizer */ - FT_LOCAL( void ) - FTC_Cache_Done( FTC_Cache cache ); - - /* Call this function to look up the cache. If no corresponding - * node is found, a new one is automatically created. This function - * is capable of flushing the cache adequately to make room for the - * new cache object. - */ - -#ifndef FTC_INLINE - FT_LOCAL( FT_Error ) - FTC_Cache_Lookup( FTC_Cache cache, - FT_Offset hash, - FT_Pointer query, - FTC_Node *anode ); -#endif - - FT_LOCAL( FT_Error ) - FTC_Cache_NewNode( FTC_Cache cache, - FT_Offset hash, - FT_Pointer query, - FTC_Node *anode ); - - /* Remove all nodes that relate to a given face_id. This is useful - * when un-installing fonts. Note that if a cache node relates to - * the face_id but is locked (i.e., has `ref_count > 0'), the node - * will _not_ be destroyed, but its internal face_id reference will - * be modified. - * - * The final result will be that the node will never come back - * in further lookup requests, and will be flushed on demand from - * the cache normally when its reference count reaches 0. - */ - FT_LOCAL( void ) - FTC_Cache_RemoveFaceID( FTC_Cache cache, - FTC_FaceID face_id ); - - -#ifdef FTC_INLINE - -#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \ - FT_BEGIN_STMNT \ - FTC_Node *_bucket, *_pnode, _node; \ - FTC_Cache _cache = FTC_CACHE(cache); \ - FT_Offset _hash = (FT_Offset)(hash); \ - FTC_Node_CompareFunc _nodcomp = (FTC_Node_CompareFunc)(nodecmp); \ - FT_Bool _list_changed = FALSE; \ - \ - \ - error = FT_Err_Ok; \ - node = NULL; \ - \ - /* Go to the `top' node of the list sharing same masked hash */ \ - _bucket = _pnode = FTC_NODE__TOP_FOR_HASH( _cache, _hash ); \ - \ - /* Look up a node with identical hash and queried properties. */ \ - /* NOTE: _nodcomp() may change the linked list to reduce memory. */ \ - for (;;) \ - { \ - _node = *_pnode; \ - if ( _node == NULL ) \ - goto _NewNode; \ - \ - if ( _node->hash == _hash && \ - _nodcomp( _node, query, _cache, &_list_changed ) ) \ - break; \ - \ - _pnode = &_node->link; \ - } \ - \ - if ( _list_changed ) \ - { \ - /* Update _bucket by possibly modified linked list */ \ - _bucket = _pnode = FTC_NODE__TOP_FOR_HASH( _cache, _hash ); \ - \ - /* Update _pnode by possibly modified linked list */ \ - while ( *_pnode != _node ) \ - { \ - if ( *_pnode == NULL ) \ - { \ - FT_ERROR(( "FTC_CACHE_LOOKUP_CMP: oops!!! node missing\n" )); \ - goto _NewNode; \ - } \ - else \ - _pnode = &((*_pnode)->link); \ - } \ - } \ - \ - /* Reorder the list to move the found node to the `top' */ \ - if ( _node != *_bucket ) \ - { \ - *_pnode = _node->link; \ - _node->link = *_bucket; \ - *_bucket = _node; \ - } \ - \ - /* Update MRU list */ \ - { \ - FTC_Manager _manager = _cache->manager; \ - void* _nl = &_manager->nodes_list; \ - \ - \ - if ( _node != _manager->nodes_list ) \ - FTC_MruNode_Up( (FTC_MruNode*)_nl, \ - (FTC_MruNode)_node ); \ - } \ - goto _Ok; \ - \ - _NewNode: \ - error = FTC_Cache_NewNode( _cache, _hash, query, &_node ); \ - \ - _Ok: \ - node = _node; \ - FT_END_STMNT - -#else /* !FTC_INLINE */ - -#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \ - FT_BEGIN_STMNT \ - error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, \ - (FTC_Node*)&(node) ); \ - FT_END_STMNT - -#endif /* !FTC_INLINE */ - - - /* - * This macro, together with FTC_CACHE_TRYLOOP_END, defines a retry - * loop to flush the cache repeatedly in case of memory overflows. - * - * It is used when creating a new cache node, or within a lookup - * that needs to allocate data (e.g. the sbit cache lookup). - * - * Example: - * - * { - * FTC_CACHE_TRYLOOP( cache ) - * error = load_data( ... ); - * FTC_CACHE_TRYLOOP_END() - * } - * - */ -#define FTC_CACHE_TRYLOOP( cache ) \ - { \ - FTC_Manager _try_manager = FTC_CACHE( cache )->manager; \ - FT_UInt _try_count = 4; \ - \ - \ - for (;;) \ - { \ - FT_UInt _try_done; - - -#define FTC_CACHE_TRYLOOP_END( list_changed ) \ - if ( !error || FT_ERR_NEQ( error, Out_Of_Memory ) ) \ - break; \ - \ - _try_done = FTC_Manager_FlushN( _try_manager, _try_count ); \ - if ( _try_done > 0 && ( list_changed ) ) \ - *(FT_Bool*)( list_changed ) = TRUE; \ - \ - if ( _try_done == 0 ) \ - break; \ - \ - if ( _try_done == _try_count ) \ - { \ - _try_count *= 2; \ - if ( _try_count < _try_done || \ - _try_count > _try_manager->num_nodes ) \ - _try_count = _try_manager->num_nodes; \ - } \ - } \ - } - - /* */ - -FT_END_HEADER - - -#endif /* __FTCCACHE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cache/ftccback.h b/3party/freetype/src/cache/ftccback.h deleted file mode 100644 index b3237d5a3f..0000000000 --- a/3party/freetype/src/cache/ftccback.h +++ /dev/null @@ -1,91 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftccback.h */ -/* */ -/* Callback functions of the caching sub-system (specification only). */ -/* */ -/* Copyright 2004-2015 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 __FTCCBACK_H__ -#define __FTCCBACK_H__ - -#include <ft2build.h> -#include FT_CACHE_H -#include "ftcmru.h" -#include "ftcimage.h" -#include "ftcmanag.h" -#include "ftcglyph.h" -#include "ftcsbits.h" - - - FT_LOCAL( void ) - ftc_inode_free( FTC_Node inode, - FTC_Cache cache ); - - FT_LOCAL( FT_Error ) - ftc_inode_new( FTC_Node *pinode, - FT_Pointer gquery, - FTC_Cache cache ); - - FT_LOCAL( FT_Offset ) - ftc_inode_weight( FTC_Node inode, - FTC_Cache cache ); - - - FT_LOCAL( void ) - ftc_snode_free( FTC_Node snode, - FTC_Cache cache ); - - FT_LOCAL( FT_Error ) - ftc_snode_new( FTC_Node *psnode, - FT_Pointer gquery, - FTC_Cache cache ); - - FT_LOCAL( FT_Offset ) - ftc_snode_weight( FTC_Node snode, - FTC_Cache cache ); - - FT_LOCAL( FT_Bool ) - ftc_snode_compare( FTC_Node snode, - FT_Pointer gquery, - FTC_Cache cache, - FT_Bool* list_changed ); - - - FT_LOCAL( FT_Bool ) - ftc_gnode_compare( FTC_Node gnode, - FT_Pointer gquery, - FTC_Cache cache, - FT_Bool* list_changed ); - - - FT_LOCAL( FT_Error ) - ftc_gcache_init( FTC_Cache cache ); - - FT_LOCAL( void ) - ftc_gcache_done( FTC_Cache cache ); - - - FT_LOCAL( FT_Error ) - ftc_cache_init( FTC_Cache cache ); - - FT_LOCAL( void ) - ftc_cache_done( FTC_Cache cache ); - - FT_LOCAL( void ) - ftc_node_destroy( FTC_Node node, - FTC_Manager manager ); - - -#endif /* __FTCCBACK_H__ */ - -/* END */ diff --git a/3party/freetype/src/cache/ftccmap.c b/3party/freetype/src/cache/ftccmap.c deleted file mode 100644 index b8262220c4..0000000000 --- a/3party/freetype/src/cache/ftccmap.c +++ /dev/null @@ -1,330 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftccmap.c */ -/* */ -/* FreeType CharMap cache (body) */ -/* */ -/* Copyright 2000-2015 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_CACHE_H -#include "ftcmanag.h" -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H - -#include "ftccback.h" -#include "ftcerror.h" - -#undef FT_COMPONENT -#define FT_COMPONENT trace_cache - - - /*************************************************************************/ - /* */ - /* Each FTC_CMapNode contains a simple array to map a range of character */ - /* codes to equivalent glyph indices. */ - /* */ - /* For now, the implementation is very basic: Each node maps a range of */ - /* 128 consecutive character codes to their corresponding glyph indices. */ - /* */ - /* We could do more complex things, but I don't think it is really very */ - /* useful. */ - /* */ - /*************************************************************************/ - - - /* number of glyph indices / character code per node */ -#define FTC_CMAP_INDICES_MAX 128 - - /* compute a query/node hash */ -#define FTC_CMAP_HASH( faceid, index, charcode ) \ - ( _FTC_FACE_ID_HASH( faceid ) + 211 * (index) + \ - ( (charcode) / FTC_CMAP_INDICES_MAX ) ) - - /* the charmap query */ - typedef struct FTC_CMapQueryRec_ - { - FTC_FaceID face_id; - FT_UInt cmap_index; - FT_UInt32 char_code; - - } FTC_CMapQueryRec, *FTC_CMapQuery; - -#define FTC_CMAP_QUERY( x ) ((FTC_CMapQuery)(x)) - - /* the cmap cache node */ - typedef struct FTC_CMapNodeRec_ - { - FTC_NodeRec node; - FTC_FaceID face_id; - FT_UInt cmap_index; - FT_UInt32 first; /* first character in node */ - FT_UInt16 indices[FTC_CMAP_INDICES_MAX]; /* array of glyph indices */ - - } FTC_CMapNodeRec, *FTC_CMapNode; - -#define FTC_CMAP_NODE( x ) ( (FTC_CMapNode)( x ) ) - - /* if (indices[n] == FTC_CMAP_UNKNOWN), we assume that the corresponding */ - /* glyph indices haven't been queried through FT_Get_Glyph_Index() yet */ -#define FTC_CMAP_UNKNOWN (FT_UInt16)~0 - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CHARMAP NODES *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_CALLBACK_DEF( void ) - ftc_cmap_node_free( FTC_Node ftcnode, - FTC_Cache cache ) - { - FTC_CMapNode node = (FTC_CMapNode)ftcnode; - FT_Memory memory = cache->memory; - - - FT_FREE( node ); - } - - - /* initialize a new cmap node */ - FT_CALLBACK_DEF( FT_Error ) - ftc_cmap_node_new( FTC_Node *ftcanode, - FT_Pointer ftcquery, - FTC_Cache cache ) - { - FTC_CMapNode *anode = (FTC_CMapNode*)ftcanode; - FTC_CMapQuery query = (FTC_CMapQuery)ftcquery; - FT_Error error; - FT_Memory memory = cache->memory; - FTC_CMapNode node = NULL; - FT_UInt nn; - - - if ( !FT_NEW( node ) ) - { - node->face_id = query->face_id; - node->cmap_index = query->cmap_index; - node->first = (query->char_code / FTC_CMAP_INDICES_MAX) * - FTC_CMAP_INDICES_MAX; - - for ( nn = 0; nn < FTC_CMAP_INDICES_MAX; nn++ ) - node->indices[nn] = FTC_CMAP_UNKNOWN; - } - - *anode = node; - return error; - } - - - /* compute the weight of a given cmap node */ - FT_CALLBACK_DEF( FT_Offset ) - ftc_cmap_node_weight( FTC_Node cnode, - FTC_Cache cache ) - { - FT_UNUSED( cnode ); - FT_UNUSED( cache ); - - return sizeof ( *cnode ); - } - - - /* compare a cmap node to a given query */ - FT_CALLBACK_DEF( FT_Bool ) - ftc_cmap_node_compare( FTC_Node ftcnode, - FT_Pointer ftcquery, - FTC_Cache cache, - FT_Bool* list_changed ) - { - FTC_CMapNode node = (FTC_CMapNode)ftcnode; - FTC_CMapQuery query = (FTC_CMapQuery)ftcquery; - FT_UNUSED( cache ); - - - if ( list_changed ) - *list_changed = FALSE; - if ( node->face_id == query->face_id && - node->cmap_index == query->cmap_index ) - { - FT_UInt32 offset = (FT_UInt32)( query->char_code - node->first ); - - - return FT_BOOL( offset < FTC_CMAP_INDICES_MAX ); - } - - return 0; - } - - - FT_CALLBACK_DEF( FT_Bool ) - ftc_cmap_node_remove_faceid( FTC_Node ftcnode, - FT_Pointer ftcface_id, - FTC_Cache cache, - FT_Bool* list_changed ) - { - FTC_CMapNode node = (FTC_CMapNode)ftcnode; - FTC_FaceID face_id = (FTC_FaceID)ftcface_id; - FT_UNUSED( cache ); - - - if ( list_changed ) - *list_changed = FALSE; - return FT_BOOL( node->face_id == face_id ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GLYPH IMAGE CACHE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - static - const FTC_CacheClassRec ftc_cmap_cache_class = - { - ftc_cmap_node_new, - ftc_cmap_node_weight, - ftc_cmap_node_compare, - ftc_cmap_node_remove_faceid, - ftc_cmap_node_free, - - sizeof ( FTC_CacheRec ), - ftc_cache_init, - ftc_cache_done, - }; - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_CMapCache_New( FTC_Manager manager, - FTC_CMapCache *acache ) - { - return FTC_Manager_RegisterCache( manager, - &ftc_cmap_cache_class, - FTC_CACHE_P( acache ) ); - } - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_UInt ) - FTC_CMapCache_Lookup( FTC_CMapCache cmap_cache, - FTC_FaceID face_id, - FT_Int cmap_index, - FT_UInt32 char_code ) - { - FTC_Cache cache = FTC_CACHE( cmap_cache ); - FTC_CMapQueryRec query; - FTC_Node node; - FT_Error error; - FT_UInt gindex = 0; - FT_Offset hash; - FT_Int no_cmap_change = 0; - - - if ( cmap_index < 0 ) - { - /* Treat a negative cmap index as a special value, meaning that you */ - /* don't want to change the FT_Face's character map through this */ - /* call. This can be useful if the face requester callback already */ - /* sets the face's charmap to the appropriate value. */ - - no_cmap_change = 1; - cmap_index = 0; - } - - if ( !cache ) - { - FT_TRACE0(( "FTC_CMapCache_Lookup: bad arguments, returning 0\n" )); - return 0; - } - - if ( !face_id ) - return 0; - - query.face_id = face_id; - query.cmap_index = (FT_UInt)cmap_index; - query.char_code = char_code; - - hash = FTC_CMAP_HASH( face_id, (FT_UInt)cmap_index, char_code ); - -#if 1 - FTC_CACHE_LOOKUP_CMP( cache, ftc_cmap_node_compare, hash, &query, - node, error ); -#else - error = FTC_Cache_Lookup( cache, hash, &query, &node ); -#endif - if ( error ) - goto Exit; - - FT_ASSERT( (FT_UInt)( char_code - FTC_CMAP_NODE( node )->first ) < - FTC_CMAP_INDICES_MAX ); - - /* something rotten can happen with rogue clients */ - if ( (FT_UInt)( char_code - FTC_CMAP_NODE( node )->first >= - FTC_CMAP_INDICES_MAX ) ) - return 0; /* XXX: should return appropriate error */ - - gindex = FTC_CMAP_NODE( node )->indices[char_code - - FTC_CMAP_NODE( node )->first]; - if ( gindex == FTC_CMAP_UNKNOWN ) - { - FT_Face face; - - - gindex = 0; - - error = FTC_Manager_LookupFace( cache->manager, - FTC_CMAP_NODE( node )->face_id, - &face ); - if ( error ) - goto Exit; - - if ( (FT_UInt)cmap_index < (FT_UInt)face->num_charmaps ) - { - FT_CharMap old, cmap = NULL; - - - old = face->charmap; - cmap = face->charmaps[cmap_index]; - - if ( old != cmap && !no_cmap_change ) - FT_Set_Charmap( face, cmap ); - - gindex = FT_Get_Char_Index( face, char_code ); - - if ( old != cmap && !no_cmap_change ) - FT_Set_Charmap( face, old ); - } - - FTC_CMAP_NODE( node )->indices[char_code - - FTC_CMAP_NODE( node )->first] - = (FT_UShort)gindex; - } - - Exit: - return gindex; - } - - -/* END */ diff --git a/3party/freetype/src/cache/ftcerror.h b/3party/freetype/src/cache/ftcerror.h deleted file mode 100644 index 15adec58de..0000000000 --- a/3party/freetype/src/cache/ftcerror.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcerror.h */ -/* */ -/* Caching sub-system error codes (specification only). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the caching sub-system error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __FTCERROR_H__ -#define __FTCERROR_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX FTC_Err_ -#define FT_ERR_BASE FT_Mod_Err_Cache - -#include FT_ERRORS_H - -#endif /* __FTCERROR_H__ */ - -/* END */ diff --git a/3party/freetype/src/cache/ftcglyph.c b/3party/freetype/src/cache/ftcglyph.c deleted file mode 100644 index 343b8a7793..0000000000 --- a/3party/freetype/src/cache/ftcglyph.c +++ /dev/null @@ -1,219 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcglyph.c */ -/* */ -/* FreeType Glyph Image (FT_Glyph) cache (body). */ -/* */ -/* Copyright 2000-2015 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 <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_CACHE_H -#include "ftcglyph.h" -#include FT_ERRORS_H - -#include "ftccback.h" -#include "ftcerror.h" - - - /* create a new chunk node, setting its cache index and ref count */ - FT_LOCAL_DEF( void ) - FTC_GNode_Init( FTC_GNode gnode, - FT_UInt gindex, - FTC_Family family ) - { - gnode->family = family; - gnode->gindex = gindex; - family->num_nodes++; - } - - - FT_LOCAL_DEF( void ) - FTC_GNode_UnselectFamily( FTC_GNode gnode, - FTC_Cache cache ) - { - FTC_Family family = gnode->family; - - - gnode->family = NULL; - if ( family && --family->num_nodes == 0 ) - FTC_FAMILY_FREE( family, cache ); - } - - - FT_LOCAL_DEF( void ) - FTC_GNode_Done( FTC_GNode gnode, - FTC_Cache cache ) - { - /* finalize the node */ - gnode->gindex = 0; - - FTC_GNode_UnselectFamily( gnode, cache ); - } - - - FT_LOCAL_DEF( FT_Bool ) - ftc_gnode_compare( FTC_Node ftcgnode, - FT_Pointer ftcgquery, - FTC_Cache cache, - FT_Bool* list_changed ) - { - FTC_GNode gnode = (FTC_GNode)ftcgnode; - FTC_GQuery gquery = (FTC_GQuery)ftcgquery; - FT_UNUSED( cache ); - - - if ( list_changed ) - *list_changed = FALSE; - return FT_BOOL( gnode->family == gquery->family && - gnode->gindex == gquery->gindex ); - } - - -#ifdef FTC_INLINE - - FT_LOCAL_DEF( FT_Bool ) - FTC_GNode_Compare( FTC_GNode gnode, - FTC_GQuery gquery, - FTC_Cache cache, - FT_Bool* list_changed ) - { - return ftc_gnode_compare( FTC_NODE( gnode ), gquery, - cache, list_changed ); - } - -#endif - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CHUNK SETS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - FTC_Family_Init( FTC_Family family, - FTC_Cache cache ) - { - FTC_GCacheClass clazz = FTC_CACHE__GCACHE_CLASS( cache ); - - - family->clazz = clazz->family_class; - family->num_nodes = 0; - family->cache = cache; - } - - - FT_LOCAL_DEF( FT_Error ) - ftc_gcache_init( FTC_Cache ftccache ) - { - FTC_GCache cache = (FTC_GCache)ftccache; - FT_Error error; - - - error = FTC_Cache_Init( FTC_CACHE( cache ) ); - if ( !error ) - { - FTC_GCacheClass clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class; - - FTC_MruList_Init( &cache->families, - clazz->family_class, - 0, /* no maximum here! */ - cache, - FTC_CACHE( cache )->memory ); - } - - return error; - } - - -#if 0 - - FT_LOCAL_DEF( FT_Error ) - FTC_GCache_Init( FTC_GCache cache ) - { - return ftc_gcache_init( FTC_CACHE( cache ) ); - } - -#endif /* 0 */ - - - FT_LOCAL_DEF( void ) - ftc_gcache_done( FTC_Cache ftccache ) - { - FTC_GCache cache = (FTC_GCache)ftccache; - - - FTC_Cache_Done( (FTC_Cache)cache ); - FTC_MruList_Done( &cache->families ); - } - - -#if 0 - - FT_LOCAL_DEF( void ) - FTC_GCache_Done( FTC_GCache cache ) - { - ftc_gcache_done( FTC_CACHE( cache ) ); - } - -#endif /* 0 */ - - - FT_LOCAL_DEF( FT_Error ) - FTC_GCache_New( FTC_Manager manager, - FTC_GCacheClass clazz, - FTC_GCache *acache ) - { - return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz, - (FTC_Cache*)acache ); - } - - -#ifndef FTC_INLINE - - FT_LOCAL_DEF( FT_Error ) - FTC_GCache_Lookup( FTC_GCache cache, - FT_Offset hash, - FT_UInt gindex, - FTC_GQuery query, - FTC_Node *anode ) - { - FT_Error error; - - - query->gindex = gindex; - - FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error ); - if ( !error ) - { - FTC_Family family = query->family; - - - /* prevent the family from being destroyed too early when an */ - /* out-of-memory condition occurs during glyph node initialization. */ - family->num_nodes++; - - error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode ); - - if ( --family->num_nodes == 0 ) - FTC_FAMILY_FREE( family, cache ); - } - return error; - } - -#endif /* !FTC_INLINE */ - - -/* END */ diff --git a/3party/freetype/src/cache/ftcglyph.h b/3party/freetype/src/cache/ftcglyph.h deleted file mode 100644 index 6cadbe2c10..0000000000 --- a/3party/freetype/src/cache/ftcglyph.h +++ /dev/null @@ -1,329 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcglyph.h */ -/* */ -/* FreeType abstract glyph cache (specification). */ -/* */ -/* Copyright 2000-2015 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. */ -/* */ -/***************************************************************************/ - - - /* - * - * FTC_GCache is an _abstract_ cache object optimized to store glyph - * data. It works as follows: - * - * - It manages FTC_GNode objects. Each one of them can hold one or more - * glyph `items'. Item types are not specified in the FTC_GCache but - * in classes that extend it. - * - * - Glyph attributes, like face ID, character size, render mode, etc., - * can be grouped into abstract `glyph families'. This avoids storing - * the attributes within the FTC_GCache, since it is likely that many - * FTC_GNodes will belong to the same family in typical uses. - * - * - Each FTC_GNode is thus an FTC_Node with two additional fields: - * - * * gindex: A glyph index, or the first index in a glyph range. - * * family: A pointer to a glyph `family'. - * - * - Family types are not fully specific in the FTC_Family type, but - * by classes that extend it. - * - * Note that both FTC_ImageCache and FTC_SBitCache extend FTC_GCache. - * They share an FTC_Family sub-class called FTC_BasicFamily which is - * used to store the following data: face ID, pixel/point sizes, load - * flags. For more details see the file `src/cache/ftcbasic.c'. - * - * Client applications can extend FTC_GNode with their own FTC_GNode - * and FTC_Family sub-classes to implement more complex caches (e.g., - * handling automatic synthesis, like obliquing & emboldening, colored - * glyphs, etc.). - * - * See also the FTC_ICache & FTC_SCache classes in `ftcimage.h' and - * `ftcsbits.h', which both extend FTC_GCache with additional - * optimizations. - * - * A typical FTC_GCache implementation must provide at least the - * following: - * - * - FTC_GNode sub-class, e.g. MyNode, with relevant methods: - * my_node_new (must call FTC_GNode_Init) - * my_node_free (must call FTC_GNode_Done) - * my_node_compare (must call FTC_GNode_Compare) - * my_node_remove_faceid (must call ftc_gnode_unselect in case - * of match) - * - * - FTC_Family sub-class, e.g. MyFamily, with relevant methods: - * my_family_compare - * my_family_init - * my_family_reset (optional) - * my_family_done - * - * - FTC_GQuery sub-class, e.g. MyQuery, to hold cache-specific query - * data. - * - * - Constant structures for a FTC_GNodeClass. - * - * - MyCacheNew() can be implemented easily as a call to the convenience - * function FTC_GCache_New. - * - * - MyCacheLookup with a call to FTC_GCache_Lookup. This function will - * automatically: - * - * - Search for the corresponding family in the cache, or create - * a new one if necessary. Put it in FTC_GQUERY(myquery).family - * - * - Call FTC_Cache_Lookup. - * - * If it returns NULL, you should create a new node, then call - * ftc_cache_add as usual. - */ - - - /*************************************************************************/ - /* */ - /* Important: The functions defined in this file are only used to */ - /* implement an abstract glyph cache class. You need to */ - /* provide additional logic to implement a complete cache. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /********* *********/ - /********* WARNING, THIS IS BETA CODE. *********/ - /********* *********/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#ifndef __FTCGLYPH_H__ -#define __FTCGLYPH_H__ - - -#include <ft2build.h> -#include "ftcmanag.h" - - -FT_BEGIN_HEADER - - - /* - * We can group glyphs into `families'. Each family correspond to a - * given face ID, character size, transform, etc. - * - * Families are implemented as MRU list nodes. They are - * reference-counted. - */ - - typedef struct FTC_FamilyRec_ - { - FTC_MruNodeRec mrunode; - FT_UInt num_nodes; /* current number of nodes in this family */ - FTC_Cache cache; - FTC_MruListClass clazz; - - } FTC_FamilyRec, *FTC_Family; - -#define FTC_FAMILY(x) ( (FTC_Family)(x) ) -#define FTC_FAMILY_P(x) ( (FTC_Family*)(x) ) - - - typedef struct FTC_GNodeRec_ - { - FTC_NodeRec node; - FTC_Family family; - FT_UInt gindex; - - } FTC_GNodeRec, *FTC_GNode; - -#define FTC_GNODE( x ) ( (FTC_GNode)(x) ) -#define FTC_GNODE_P( x ) ( (FTC_GNode*)(x) ) - - - typedef struct FTC_GQueryRec_ - { - FT_UInt gindex; - FTC_Family family; - - } FTC_GQueryRec, *FTC_GQuery; - -#define FTC_GQUERY( x ) ( (FTC_GQuery)(x) ) - - - /*************************************************************************/ - /* */ - /* These functions are exported so that they can be called from */ - /* user-provided cache classes; otherwise, they are really part of the */ - /* cache sub-system internals. */ - /* */ - - /* must be called by derived FTC_Node_InitFunc routines */ - FT_LOCAL( void ) - FTC_GNode_Init( FTC_GNode node, - FT_UInt gindex, /* glyph index for node */ - FTC_Family family ); - -#ifdef FTC_INLINE - - /* returns TRUE iff the query's glyph index correspond to the node; */ - /* this assumes that the `family' and `hash' fields of the query are */ - /* already correctly set */ - FT_LOCAL( FT_Bool ) - FTC_GNode_Compare( FTC_GNode gnode, - FTC_GQuery gquery, - FTC_Cache cache, - FT_Bool* list_changed ); - -#endif - - /* call this function to clear a node's family -- this is necessary */ - /* to implement the `node_remove_faceid' cache method correctly */ - FT_LOCAL( void ) - FTC_GNode_UnselectFamily( FTC_GNode gnode, - FTC_Cache cache ); - - /* must be called by derived FTC_Node_DoneFunc routines */ - FT_LOCAL( void ) - FTC_GNode_Done( FTC_GNode node, - FTC_Cache cache ); - - - FT_LOCAL( void ) - FTC_Family_Init( FTC_Family family, - FTC_Cache cache ); - - typedef struct FTC_GCacheRec_ - { - FTC_CacheRec cache; - FTC_MruListRec families; - - } FTC_GCacheRec, *FTC_GCache; - -#define FTC_GCACHE( x ) ((FTC_GCache)(x)) - - -#if 0 - /* can be used as @FTC_Cache_InitFunc */ - FT_LOCAL( FT_Error ) - FTC_GCache_Init( FTC_GCache cache ); -#endif - - -#if 0 - /* can be used as @FTC_Cache_DoneFunc */ - FT_LOCAL( void ) - FTC_GCache_Done( FTC_GCache cache ); -#endif - - - /* the glyph cache class adds fields for the family implementation */ - typedef struct FTC_GCacheClassRec_ - { - FTC_CacheClassRec clazz; - FTC_MruListClass family_class; - - } FTC_GCacheClassRec; - - typedef const FTC_GCacheClassRec* FTC_GCacheClass; - -#define FTC_GCACHE_CLASS( x ) ((FTC_GCacheClass)(x)) - -#define FTC_CACHE__GCACHE_CLASS( x ) \ - FTC_GCACHE_CLASS( FTC_CACHE(x)->org_class ) -#define FTC_CACHE__FAMILY_CLASS( x ) \ - ( (FTC_MruListClass)FTC_CACHE__GCACHE_CLASS( x )->family_class ) - - - /* convenience function; use it instead of FTC_Manager_Register_Cache */ - FT_LOCAL( FT_Error ) - FTC_GCache_New( FTC_Manager manager, - FTC_GCacheClass clazz, - FTC_GCache *acache ); - -#ifndef FTC_INLINE - FT_LOCAL( FT_Error ) - FTC_GCache_Lookup( FTC_GCache cache, - FT_Offset hash, - FT_UInt gindex, - FTC_GQuery query, - FTC_Node *anode ); -#endif - - - /* */ - - -#define FTC_FAMILY_FREE( family, cache ) \ - FTC_MruList_Remove( &FTC_GCACHE((cache))->families, \ - (FTC_MruNode)(family) ) - - -#ifdef FTC_INLINE - -#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \ - gindex, query, node, error ) \ - FT_BEGIN_STMNT \ - FTC_GCache _gcache = FTC_GCACHE( cache ); \ - FTC_GQuery _gquery = (FTC_GQuery)( query ); \ - FTC_MruNode_CompareFunc _fcompare = (FTC_MruNode_CompareFunc)(famcmp); \ - FTC_MruNode _mrunode; \ - \ - \ - _gquery->gindex = (gindex); \ - \ - FTC_MRULIST_LOOKUP_CMP( &_gcache->families, _gquery, _fcompare, \ - _mrunode, error ); \ - _gquery->family = FTC_FAMILY( _mrunode ); \ - if ( !error ) \ - { \ - FTC_Family _gqfamily = _gquery->family; \ - \ - \ - _gqfamily->num_nodes++; \ - \ - FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ); \ - \ - if ( --_gqfamily->num_nodes == 0 ) \ - FTC_FAMILY_FREE( _gqfamily, _gcache ); \ - } \ - FT_END_STMNT - /* */ - -#else /* !FTC_INLINE */ - -#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \ - gindex, query, node, error ) \ - FT_BEGIN_STMNT \ - \ - error = FTC_GCache_Lookup( FTC_GCACHE( cache ), hash, gindex, \ - FTC_GQUERY( query ), &node ); \ - \ - FT_END_STMNT - -#endif /* !FTC_INLINE */ - - -FT_END_HEADER - - -#endif /* __FTCGLYPH_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cache/ftcimage.c b/3party/freetype/src/cache/ftcimage.c deleted file mode 100644 index f519a6179c..0000000000 --- a/3party/freetype/src/cache/ftcimage.c +++ /dev/null @@ -1,164 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcimage.c */ -/* */ -/* FreeType Image cache (body). */ -/* */ -/* Copyright 2000-2015 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 <ft2build.h> -#include FT_CACHE_H -#include "ftcimage.h" -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_OBJECTS_H - -#include "ftccback.h" -#include "ftcerror.h" - - - /* finalize a given glyph image node */ - FT_LOCAL_DEF( void ) - ftc_inode_free( FTC_Node ftcinode, - FTC_Cache cache ) - { - FTC_INode inode = (FTC_INode)ftcinode; - FT_Memory memory = cache->memory; - - - if ( inode->glyph ) - { - FT_Done_Glyph( inode->glyph ); - inode->glyph = NULL; - } - - FTC_GNode_Done( FTC_GNODE( inode ), cache ); - FT_FREE( inode ); - } - - - FT_LOCAL_DEF( void ) - FTC_INode_Free( FTC_INode inode, - FTC_Cache cache ) - { - ftc_inode_free( FTC_NODE( inode ), cache ); - } - - - /* initialize a new glyph image node */ - FT_LOCAL_DEF( FT_Error ) - FTC_INode_New( FTC_INode *pinode, - FTC_GQuery gquery, - FTC_Cache cache ) - { - FT_Memory memory = cache->memory; - FT_Error error; - FTC_INode inode = NULL; - - - if ( !FT_NEW( inode ) ) - { - FTC_GNode gnode = FTC_GNODE( inode ); - FTC_Family family = gquery->family; - FT_UInt gindex = gquery->gindex; - FTC_IFamilyClass clazz = FTC_CACHE__IFAMILY_CLASS( cache ); - - - /* initialize its inner fields */ - FTC_GNode_Init( gnode, gindex, family ); - - /* we will now load the glyph image */ - error = clazz->family_load_glyph( family, gindex, cache, - &inode->glyph ); - if ( error ) - { - FTC_INode_Free( inode, cache ); - inode = NULL; - } - } - - *pinode = inode; - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - ftc_inode_new( FTC_Node *ftcpinode, - FT_Pointer ftcgquery, - FTC_Cache cache ) - { - FTC_INode *pinode = (FTC_INode*)ftcpinode; - FTC_GQuery gquery = (FTC_GQuery)ftcgquery; - - - return FTC_INode_New( pinode, gquery, cache ); - } - - - FT_LOCAL_DEF( FT_Offset ) - ftc_inode_weight( FTC_Node ftcinode, - FTC_Cache ftccache ) - { - FTC_INode inode = (FTC_INode)ftcinode; - FT_Offset size = 0; - FT_Glyph glyph = inode->glyph; - - FT_UNUSED( ftccache ); - - - switch ( glyph->format ) - { - case FT_GLYPH_FORMAT_BITMAP: - { - FT_BitmapGlyph bitg; - - - bitg = (FT_BitmapGlyph)glyph; - size = bitg->bitmap.rows * (FT_Offset)FT_ABS( bitg->bitmap.pitch ) + - sizeof ( *bitg ); - } - break; - - case FT_GLYPH_FORMAT_OUTLINE: - { - FT_OutlineGlyph outg; - - - outg = (FT_OutlineGlyph)glyph; - size = (FT_Offset)outg->outline.n_points * - ( sizeof ( FT_Vector ) + sizeof ( FT_Byte ) ) + - (FT_Offset)outg->outline.n_contours * sizeof ( FT_Short ) + - sizeof ( *outg ); - } - break; - - default: - ; - } - - size += sizeof ( *inode ); - return size; - } - - -#if 0 - - FT_LOCAL_DEF( FT_Offset ) - FTC_INode_Weight( FTC_INode inode ) - { - return ftc_inode_weight( FTC_NODE( inode ), NULL ); - } - -#endif /* 0 */ - - -/* END */ diff --git a/3party/freetype/src/cache/ftcimage.h b/3party/freetype/src/cache/ftcimage.h deleted file mode 100644 index b312eaa3d9..0000000000 --- a/3party/freetype/src/cache/ftcimage.h +++ /dev/null @@ -1,107 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcimage.h */ -/* */ -/* FreeType Generic Image cache (specification) */ -/* */ -/* Copyright 2000-2015 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. */ -/* */ -/***************************************************************************/ - - - /* - * FTC_ICache is an _abstract_ cache used to store a single FT_Glyph - * image per cache node. - * - * FTC_ICache extends FTC_GCache. For an implementation example, - * see FTC_ImageCache in `src/cache/ftbasic.c'. - */ - - - /*************************************************************************/ - /* */ - /* Each image cache really manages FT_Glyph objects. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTCIMAGE_H__ -#define __FTCIMAGE_H__ - - -#include <ft2build.h> -#include FT_CACHE_H -#include "ftcglyph.h" - -FT_BEGIN_HEADER - - - /* the FT_Glyph image node type - we store only 1 glyph per node */ - typedef struct FTC_INodeRec_ - { - FTC_GNodeRec gnode; - FT_Glyph glyph; - - } FTC_INodeRec, *FTC_INode; - -#define FTC_INODE( x ) ( (FTC_INode)( x ) ) -#define FTC_INODE_GINDEX( x ) FTC_GNODE(x)->gindex -#define FTC_INODE_FAMILY( x ) FTC_GNODE(x)->family - - typedef FT_Error - (*FTC_IFamily_LoadGlyphFunc)( FTC_Family family, - FT_UInt gindex, - FTC_Cache cache, - FT_Glyph *aglyph ); - - typedef struct FTC_IFamilyClassRec_ - { - FTC_MruListClassRec clazz; - FTC_IFamily_LoadGlyphFunc family_load_glyph; - - } FTC_IFamilyClassRec; - - typedef const FTC_IFamilyClassRec* FTC_IFamilyClass; - -#define FTC_IFAMILY_CLASS( x ) ((FTC_IFamilyClass)(x)) - -#define FTC_CACHE__IFAMILY_CLASS( x ) \ - FTC_IFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS(x)->family_class ) - - - /* can be used as a @FTC_Node_FreeFunc */ - FT_LOCAL( void ) - FTC_INode_Free( FTC_INode inode, - FTC_Cache cache ); - - /* Can be used as @FTC_Node_NewFunc. `gquery.index' and `gquery.family' - * must be set correctly. This function will call the `family_load_glyph' - * method to load the FT_Glyph into the cache node. - */ - FT_LOCAL( FT_Error ) - FTC_INode_New( FTC_INode *pinode, - FTC_GQuery gquery, - FTC_Cache cache ); - -#if 0 - /* can be used as @FTC_Node_WeightFunc */ - FT_LOCAL( FT_ULong ) - FTC_INode_Weight( FTC_INode inode ); -#endif - - - /* */ - -FT_END_HEADER - -#endif /* __FTCIMAGE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cache/ftcmanag.c b/3party/freetype/src/cache/ftcmanag.c deleted file mode 100644 index 658614c8db..0000000000 --- a/3party/freetype/src/cache/ftcmanag.c +++ /dev/null @@ -1,703 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcmanag.c */ -/* */ -/* FreeType Cache Manager (body). */ -/* */ -/* Copyright 2000-2015 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 <ft2build.h> -#include FT_CACHE_H -#include "ftcmanag.h" -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_SIZES_H - -#include "ftccback.h" -#include "ftcerror.h" - -#ifdef FT_CONFIG_OPTION_PIC -#error "cache system does not support PIC yet" -#endif - - -#undef FT_COMPONENT -#define FT_COMPONENT trace_cache - - - static FT_Error - ftc_scaler_lookup_size( FTC_Manager manager, - FTC_Scaler scaler, - FT_Size *asize ) - { - FT_Face face; - FT_Size size = NULL; - FT_Error error; - - - error = FTC_Manager_LookupFace( manager, scaler->face_id, &face ); - if ( error ) - goto Exit; - - error = FT_New_Size( face, &size ); - if ( error ) - goto Exit; - - FT_Activate_Size( size ); - - if ( scaler->pixel ) - error = FT_Set_Pixel_Sizes( face, scaler->width, scaler->height ); - else - error = FT_Set_Char_Size( face, - (FT_F26Dot6)scaler->width, - (FT_F26Dot6)scaler->height, - scaler->x_res, - scaler->y_res ); - if ( error ) - { - FT_Done_Size( size ); - size = NULL; - } - - Exit: - *asize = size; - return error; - } - - - typedef struct FTC_SizeNodeRec_ - { - FTC_MruNodeRec node; - FT_Size size; - FTC_ScalerRec scaler; - - } FTC_SizeNodeRec, *FTC_SizeNode; - -#define FTC_SIZE_NODE( x ) ( (FTC_SizeNode)( x ) ) - - - FT_CALLBACK_DEF( void ) - ftc_size_node_done( FTC_MruNode ftcnode, - FT_Pointer data ) - { - FTC_SizeNode node = (FTC_SizeNode)ftcnode; - FT_Size size = node->size; - FT_UNUSED( data ); - - - if ( size ) - FT_Done_Size( size ); - } - - - FT_CALLBACK_DEF( FT_Bool ) - ftc_size_node_compare( FTC_MruNode ftcnode, - FT_Pointer ftcscaler ) - { - FTC_SizeNode node = (FTC_SizeNode)ftcnode; - FTC_Scaler scaler = (FTC_Scaler)ftcscaler; - FTC_Scaler scaler0 = &node->scaler; - - - if ( FTC_SCALER_COMPARE( scaler0, scaler ) ) - { - FT_Activate_Size( node->size ); - return 1; - } - return 0; - } - - - FT_CALLBACK_DEF( FT_Error ) - ftc_size_node_init( FTC_MruNode ftcnode, - FT_Pointer ftcscaler, - FT_Pointer ftcmanager ) - { - FTC_SizeNode node = (FTC_SizeNode)ftcnode; - FTC_Scaler scaler = (FTC_Scaler)ftcscaler; - FTC_Manager manager = (FTC_Manager)ftcmanager; - - - node->scaler = scaler[0]; - - return ftc_scaler_lookup_size( manager, scaler, &node->size ); - } - - - FT_CALLBACK_DEF( FT_Error ) - ftc_size_node_reset( FTC_MruNode ftcnode, - FT_Pointer ftcscaler, - FT_Pointer ftcmanager ) - { - FTC_SizeNode node = (FTC_SizeNode)ftcnode; - FTC_Scaler scaler = (FTC_Scaler)ftcscaler; - FTC_Manager manager = (FTC_Manager)ftcmanager; - - - FT_Done_Size( node->size ); - - node->scaler = scaler[0]; - - return ftc_scaler_lookup_size( manager, scaler, &node->size ); - } - - - static - const FTC_MruListClassRec ftc_size_list_class = - { - sizeof ( FTC_SizeNodeRec ), - ftc_size_node_compare, - ftc_size_node_init, - ftc_size_node_reset, - ftc_size_node_done - }; - - - /* helper function used by ftc_face_node_done */ - static FT_Bool - ftc_size_node_compare_faceid( FTC_MruNode ftcnode, - FT_Pointer ftcface_id ) - { - FTC_SizeNode node = (FTC_SizeNode)ftcnode; - FTC_FaceID face_id = (FTC_FaceID)ftcface_id; - - - return FT_BOOL( node->scaler.face_id == face_id ); - } - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_Manager_LookupSize( FTC_Manager manager, - FTC_Scaler scaler, - FT_Size *asize ) - { - FT_Error error; - FTC_MruNode mrunode; - - - if ( !asize || !scaler ) - return FT_THROW( Invalid_Argument ); - - *asize = NULL; - - if ( !manager ) - return FT_THROW( Invalid_Cache_Handle ); - -#ifdef FTC_INLINE - - FTC_MRULIST_LOOKUP_CMP( &manager->sizes, scaler, ftc_size_node_compare, - mrunode, error ); - -#else - error = FTC_MruList_Lookup( &manager->sizes, scaler, &mrunode ); -#endif - - if ( !error ) - *asize = FTC_SIZE_NODE( mrunode )->size; - - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FACE MRU IMPLEMENTATION *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct FTC_FaceNodeRec_ - { - FTC_MruNodeRec node; - FTC_FaceID face_id; - FT_Face face; - - } FTC_FaceNodeRec, *FTC_FaceNode; - -#define FTC_FACE_NODE( x ) ( ( FTC_FaceNode )( x ) ) - - - FT_CALLBACK_DEF( FT_Error ) - ftc_face_node_init( FTC_MruNode ftcnode, - FT_Pointer ftcface_id, - FT_Pointer ftcmanager ) - { - FTC_FaceNode node = (FTC_FaceNode)ftcnode; - FTC_FaceID face_id = (FTC_FaceID)ftcface_id; - FTC_Manager manager = (FTC_Manager)ftcmanager; - FT_Error error; - - - node->face_id = face_id; - - error = manager->request_face( face_id, - manager->library, - manager->request_data, - &node->face ); - if ( !error ) - { - /* destroy initial size object; it will be re-created later */ - if ( node->face->size ) - FT_Done_Size( node->face->size ); - } - - return error; - } - - - FT_CALLBACK_DEF( void ) - ftc_face_node_done( FTC_MruNode ftcnode, - FT_Pointer ftcmanager ) - { - FTC_FaceNode node = (FTC_FaceNode)ftcnode; - FTC_Manager manager = (FTC_Manager)ftcmanager; - - - /* we must begin by removing all scalers for the target face */ - /* from the manager's list */ - FTC_MruList_RemoveSelection( &manager->sizes, - ftc_size_node_compare_faceid, - node->face_id ); - - /* all right, we can discard the face now */ - FT_Done_Face( node->face ); - node->face = NULL; - node->face_id = NULL; - } - - - FT_CALLBACK_DEF( FT_Bool ) - ftc_face_node_compare( FTC_MruNode ftcnode, - FT_Pointer ftcface_id ) - { - FTC_FaceNode node = (FTC_FaceNode)ftcnode; - FTC_FaceID face_id = (FTC_FaceID)ftcface_id; - - - return FT_BOOL( node->face_id == face_id ); - } - - - static - const FTC_MruListClassRec ftc_face_list_class = - { - sizeof ( FTC_FaceNodeRec), - - ftc_face_node_compare, - ftc_face_node_init, - 0, /* FTC_MruNode_ResetFunc */ - ftc_face_node_done - }; - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_Manager_LookupFace( FTC_Manager manager, - FTC_FaceID face_id, - FT_Face *aface ) - { - FT_Error error; - FTC_MruNode mrunode; - - - if ( !aface || !face_id ) - return FT_THROW( Invalid_Argument ); - - *aface = NULL; - - if ( !manager ) - return FT_THROW( Invalid_Cache_Handle ); - - /* we break encapsulation for the sake of speed */ -#ifdef FTC_INLINE - - FTC_MRULIST_LOOKUP_CMP( &manager->faces, face_id, ftc_face_node_compare, - mrunode, error ); - -#else - error = FTC_MruList_Lookup( &manager->faces, face_id, &mrunode ); -#endif - - if ( !error ) - *aface = FTC_FACE_NODE( mrunode )->face; - - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CACHE MANAGER ROUTINES *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_Manager_New( FT_Library library, - FT_UInt max_faces, - FT_UInt max_sizes, - FT_ULong max_bytes, - FTC_Face_Requester requester, - FT_Pointer req_data, - FTC_Manager *amanager ) - { - FT_Error error; - FT_Memory memory; - FTC_Manager manager = 0; - - - if ( !library ) - return FT_THROW( Invalid_Library_Handle ); - - if ( !amanager || !requester ) - return FT_THROW( Invalid_Argument ); - - memory = library->memory; - - if ( FT_NEW( manager ) ) - goto Exit; - - if ( max_faces == 0 ) - max_faces = FTC_MAX_FACES_DEFAULT; - - if ( max_sizes == 0 ) - max_sizes = FTC_MAX_SIZES_DEFAULT; - - if ( max_bytes == 0 ) - max_bytes = FTC_MAX_BYTES_DEFAULT; - - manager->library = library; - manager->memory = memory; - manager->max_weight = max_bytes; - - manager->request_face = requester; - manager->request_data = req_data; - - FTC_MruList_Init( &manager->faces, - &ftc_face_list_class, - max_faces, - manager, - memory ); - - FTC_MruList_Init( &manager->sizes, - &ftc_size_list_class, - max_sizes, - manager, - memory ); - - *amanager = manager; - - Exit: - return error; - } - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( void ) - FTC_Manager_Done( FTC_Manager manager ) - { - FT_Memory memory; - FT_UInt idx; - - - if ( !manager || !manager->library ) - return; - - memory = manager->memory; - - /* now discard all caches */ - for (idx = manager->num_caches; idx-- > 0; ) - { - FTC_Cache cache = manager->caches[idx]; - - - if ( cache ) - { - cache->clazz.cache_done( cache ); - FT_FREE( cache ); - manager->caches[idx] = NULL; - } - } - manager->num_caches = 0; - - /* discard faces and sizes */ - FTC_MruList_Done( &manager->sizes ); - FTC_MruList_Done( &manager->faces ); - - manager->library = NULL; - manager->memory = NULL; - - FT_FREE( manager ); - } - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( void ) - FTC_Manager_Reset( FTC_Manager manager ) - { - if ( !manager ) - return; - - FTC_MruList_Reset( &manager->sizes ); - FTC_MruList_Reset( &manager->faces ); - - FTC_Manager_FlushN( manager, manager->num_nodes ); - } - - -#ifdef FT_DEBUG_ERROR - - static void - FTC_Manager_Check( FTC_Manager manager ) - { - FTC_Node node, first; - - - first = manager->nodes_list; - - /* check node weights */ - if ( first ) - { - FT_Offset weight = 0; - - - node = first; - - do - { - FTC_Cache cache = manager->caches[node->cache_index]; - - - if ( (FT_UInt)node->cache_index >= manager->num_caches ) - FT_TRACE0(( "FTC_Manager_Check: invalid node (cache index = %ld\n", - node->cache_index )); - else - weight += cache->clazz.node_weight( node, cache ); - - node = FTC_NODE__NEXT( node ); - - } while ( node != first ); - - if ( weight != manager->cur_weight ) - FT_TRACE0(( "FTC_Manager_Check: invalid weight %ld instead of %ld\n", - manager->cur_weight, weight )); - } - - /* check circular list */ - if ( first ) - { - FT_UFast count = 0; - - - node = first; - do - { - count++; - node = FTC_NODE__NEXT( node ); - - } while ( node != first ); - - if ( count != manager->num_nodes ) - FT_TRACE0(( "FTC_Manager_Check:" - " invalid cache node count %d instead of %d\n", - manager->num_nodes, count )); - } - } - -#endif /* FT_DEBUG_ERROR */ - - - /* `Compress' the manager's data, i.e., get rid of old cache nodes */ - /* that are not referenced anymore in order to limit the total */ - /* memory used by the cache. */ - - /* documentation is in ftcmanag.h */ - - FT_LOCAL_DEF( void ) - FTC_Manager_Compress( FTC_Manager manager ) - { - FTC_Node node, first; - - - if ( !manager ) - return; - - first = manager->nodes_list; - -#ifdef FT_DEBUG_ERROR - FTC_Manager_Check( manager ); - - FT_TRACE0(( "compressing, weight = %ld, max = %ld, nodes = %d\n", - manager->cur_weight, manager->max_weight, - manager->num_nodes )); -#endif - - if ( manager->cur_weight < manager->max_weight || first == NULL ) - return; - - /* go to last node -- it's a circular list */ - node = FTC_NODE__PREV( first ); - do - { - FTC_Node prev; - - - prev = ( node == first ) ? NULL : FTC_NODE__PREV( node ); - - if ( node->ref_count <= 0 ) - ftc_node_destroy( node, manager ); - - node = prev; - - } while ( node && manager->cur_weight > manager->max_weight ); - } - - - /* documentation is in ftcmanag.h */ - - FT_LOCAL_DEF( FT_Error ) - FTC_Manager_RegisterCache( FTC_Manager manager, - FTC_CacheClass clazz, - FTC_Cache *acache ) - { - FT_Error error = FT_ERR( Invalid_Argument ); - FTC_Cache cache = NULL; - - - if ( manager && clazz && acache ) - { - FT_Memory memory = manager->memory; - - - if ( manager->num_caches >= FTC_MAX_CACHES ) - { - error = FT_THROW( Too_Many_Caches ); - FT_ERROR(( "FTC_Manager_RegisterCache:" - " too many registered caches\n" )); - goto Exit; - } - - if ( !FT_ALLOC( cache, clazz->cache_size ) ) - { - cache->manager = manager; - cache->memory = memory; - cache->clazz = clazz[0]; - cache->org_class = clazz; - - /* THIS IS VERY IMPORTANT! IT WILL WRETCH THE MANAGER */ - /* IF IT IS NOT SET CORRECTLY */ - cache->index = manager->num_caches; - - error = clazz->cache_init( cache ); - if ( error ) - { - clazz->cache_done( cache ); - FT_FREE( cache ); - goto Exit; - } - - manager->caches[manager->num_caches++] = cache; - } - } - - Exit: - if ( acache ) - *acache = cache; - return error; - } - - - FT_LOCAL_DEF( FT_UInt ) - FTC_Manager_FlushN( FTC_Manager manager, - FT_UInt count ) - { - FTC_Node first = manager->nodes_list; - FTC_Node node; - FT_UInt result; - - - /* try to remove `count' nodes from the list */ - if ( first == NULL ) /* empty list! */ - return 0; - - /* go to last node - it's a circular list */ - node = FTC_NODE__PREV(first); - for ( result = 0; result < count; ) - { - FTC_Node prev = FTC_NODE__PREV( node ); - - - /* don't touch locked nodes */ - if ( node->ref_count <= 0 ) - { - ftc_node_destroy( node, manager ); - result++; - } - - if ( node == first ) - break; - - node = prev; - } - return result; - } - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( void ) - FTC_Manager_RemoveFaceID( FTC_Manager manager, - FTC_FaceID face_id ) - { - FT_UInt nn; - - - if ( !manager || !face_id ) - return; - - /* this will remove all FTC_SizeNode that correspond to - * the face_id as well - */ - FTC_MruList_RemoveSelection( &manager->faces, - ftc_face_node_compare, - face_id ); - - for ( nn = 0; nn < manager->num_caches; nn++ ) - FTC_Cache_RemoveFaceID( manager->caches[nn], face_id ); - } - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( void ) - FTC_Node_Unref( FTC_Node node, - FTC_Manager manager ) - { - if ( node && - manager && - (FT_UInt)node->cache_index < manager->num_caches ) - node->ref_count--; - } - - -/* END */ diff --git a/3party/freetype/src/cache/ftcmanag.h b/3party/freetype/src/cache/ftcmanag.h deleted file mode 100644 index c6787b72c5..0000000000 --- a/3party/freetype/src/cache/ftcmanag.h +++ /dev/null @@ -1,175 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcmanag.h */ -/* */ -/* FreeType Cache Manager (specification). */ -/* */ -/* Copyright 2000-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* A cache manager is in charge of the following: */ - /* */ - /* - Maintain a mapping between generic FTC_FaceIDs and live FT_Face */ - /* objects. The mapping itself is performed through a user-provided */ - /* callback. However, the manager maintains a small cache of FT_Face */ - /* and FT_Size objects in order to speed up things considerably. */ - /* */ - /* - Manage one or more cache objects. Each cache is in charge of */ - /* holding a varying number of `cache nodes'. Each cache node */ - /* represents a minimal amount of individually accessible cached */ - /* data. For example, a cache node can be an FT_Glyph image */ - /* containing a vector outline, or some glyph metrics, or anything */ - /* else. */ - /* */ - /* Each cache node has a certain size in bytes that is added to the */ - /* total amount of `cache memory' within the manager. */ - /* */ - /* All cache nodes are located in a global LRU list, where the oldest */ - /* node is at the tail of the list. */ - /* */ - /* Each node belongs to a single cache, and includes a reference */ - /* count to avoid destroying it (due to caching). */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /********* *********/ - /********* WARNING, THIS IS BETA CODE. *********/ - /********* *********/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#ifndef __FTCMANAG_H__ -#define __FTCMANAG_H__ - - -#include <ft2build.h> -#include FT_CACHE_H -#include "ftcmru.h" -#include "ftccache.h" - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* cache_subsystem */ - /* */ - /*************************************************************************/ - - -#define FTC_MAX_FACES_DEFAULT 2 -#define FTC_MAX_SIZES_DEFAULT 4 -#define FTC_MAX_BYTES_DEFAULT 200000L /* ~200kByte by default */ - - /* maximum number of caches registered in a single manager */ -#define FTC_MAX_CACHES 16 - - - typedef struct FTC_ManagerRec_ - { - FT_Library library; - FT_Memory memory; - - FTC_Node nodes_list; - FT_Offset max_weight; - FT_Offset cur_weight; - FT_UInt num_nodes; - - FTC_Cache caches[FTC_MAX_CACHES]; - FT_UInt num_caches; - - FTC_MruListRec faces; - FTC_MruListRec sizes; - - FT_Pointer request_data; - FTC_Face_Requester request_face; - - } FTC_ManagerRec; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_Manager_Compress */ - /* */ - /* <Description> */ - /* This function is used to check the state of the cache manager if */ - /* its `num_bytes' field is greater than its `max_bytes' field. It */ - /* will flush as many old cache nodes as possible (ignoring cache */ - /* nodes with a non-zero reference count). */ - /* */ - /* <InOut> */ - /* manager :: A handle to the cache manager. */ - /* */ - /* <Note> */ - /* Client applications should not call this function directly. It is */ - /* normally invoked by specific cache implementations. */ - /* */ - /* The reason this function is exported is to allow client-specific */ - /* cache classes. */ - /* */ - FT_LOCAL( void ) - FTC_Manager_Compress( FTC_Manager manager ); - - - /* try to flush `count' old nodes from the cache; return the number - * of really flushed nodes - */ - FT_LOCAL( FT_UInt ) - FTC_Manager_FlushN( FTC_Manager manager, - FT_UInt count ); - - - /* this must be used internally for the moment */ - FT_LOCAL( FT_Error ) - FTC_Manager_RegisterCache( FTC_Manager manager, - FTC_CacheClass clazz, - FTC_Cache *acache ); - - /* */ - -#define FTC_SCALER_COMPARE( a, b ) \ - ( (a)->face_id == (b)->face_id && \ - (a)->width == (b)->width && \ - (a)->height == (b)->height && \ - ((a)->pixel != 0) == ((b)->pixel != 0) && \ - ( (a)->pixel || \ - ( (a)->x_res == (b)->x_res && \ - (a)->y_res == (b)->y_res ) ) ) - -#define FTC_SCALER_HASH( q ) \ - ( _FTC_FACE_ID_HASH( (q)->face_id ) + \ - (q)->width + (q)->height*7 + \ - ( (q)->pixel ? 0 : ( (q)->x_res*33 ^ (q)->y_res*61 ) ) ) - - /* */ - -FT_END_HEADER - -#endif /* __FTCMANAG_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cache/ftcmru.c b/3party/freetype/src/cache/ftcmru.c deleted file mode 100644 index 10ce4f301e..0000000000 --- a/3party/freetype/src/cache/ftcmru.c +++ /dev/null @@ -1,357 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcmru.c */ -/* */ -/* FreeType MRU support (body). */ -/* */ -/* Copyright 2003-2015 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 <ft2build.h> -#include FT_CACHE_H -#include "ftcmru.h" -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H - -#include "ftcerror.h" - - - FT_LOCAL_DEF( void ) - FTC_MruNode_Prepend( FTC_MruNode *plist, - FTC_MruNode node ) - { - FTC_MruNode first = *plist; - - - if ( first ) - { - FTC_MruNode last = first->prev; - - -#ifdef FT_DEBUG_ERROR - { - FTC_MruNode cnode = first; - - - do - { - if ( cnode == node ) - { - fprintf( stderr, "FTC_MruNode_Prepend: invalid action\n" ); - exit( 2 ); - } - cnode = cnode->next; - - } while ( cnode != first ); - } -#endif - - first->prev = node; - last->next = node; - node->next = first; - node->prev = last; - } - else - { - node->next = node; - node->prev = node; - } - *plist = node; - } - - - FT_LOCAL_DEF( void ) - FTC_MruNode_Up( FTC_MruNode *plist, - FTC_MruNode node ) - { - FTC_MruNode first = *plist; - - - FT_ASSERT( first != NULL ); - - if ( first != node ) - { - FTC_MruNode prev, next, last; - - -#ifdef FT_DEBUG_ERROR - { - FTC_MruNode cnode = first; - do - { - if ( cnode == node ) - goto Ok; - cnode = cnode->next; - - } while ( cnode != first ); - - fprintf( stderr, "FTC_MruNode_Up: invalid action\n" ); - exit( 2 ); - Ok: - } -#endif - prev = node->prev; - next = node->next; - - prev->next = next; - next->prev = prev; - - last = first->prev; - - last->next = node; - first->prev = node; - - node->next = first; - node->prev = last; - - *plist = node; - } - } - - - FT_LOCAL_DEF( void ) - FTC_MruNode_Remove( FTC_MruNode *plist, - FTC_MruNode node ) - { - FTC_MruNode first = *plist; - FTC_MruNode prev, next; - - - FT_ASSERT( first != NULL ); - -#ifdef FT_DEBUG_ERROR - { - FTC_MruNode cnode = first; - - - do - { - if ( cnode == node ) - goto Ok; - cnode = cnode->next; - - } while ( cnode != first ); - - fprintf( stderr, "FTC_MruNode_Remove: invalid action\n" ); - exit( 2 ); - Ok: - } -#endif - - prev = node->prev; - next = node->next; - - prev->next = next; - next->prev = prev; - - if ( node == next ) - { - FT_ASSERT( first == node ); - FT_ASSERT( prev == node ); - - *plist = NULL; - } - else if ( node == first ) - *plist = next; - } - - - FT_LOCAL_DEF( void ) - FTC_MruList_Init( FTC_MruList list, - FTC_MruListClass clazz, - FT_UInt max_nodes, - FT_Pointer data, - FT_Memory memory ) - { - list->num_nodes = 0; - list->max_nodes = max_nodes; - list->nodes = NULL; - list->clazz = *clazz; - list->data = data; - list->memory = memory; - } - - - FT_LOCAL_DEF( void ) - FTC_MruList_Reset( FTC_MruList list ) - { - while ( list->nodes ) - FTC_MruList_Remove( list, list->nodes ); - - FT_ASSERT( list->num_nodes == 0 ); - } - - - FT_LOCAL_DEF( void ) - FTC_MruList_Done( FTC_MruList list ) - { - FTC_MruList_Reset( list ); - } - - -#ifndef FTC_INLINE - FT_LOCAL_DEF( FTC_MruNode ) - FTC_MruList_Find( FTC_MruList list, - FT_Pointer key ) - { - FTC_MruNode_CompareFunc compare = list->clazz.node_compare; - FTC_MruNode first, node; - - - first = list->nodes; - node = NULL; - - if ( first ) - { - node = first; - do - { - if ( compare( node, key ) ) - { - if ( node != first ) - FTC_MruNode_Up( &list->nodes, node ); - - return node; - } - - node = node->next; - - } while ( node != first); - } - - return NULL; - } -#endif - - FT_LOCAL_DEF( FT_Error ) - FTC_MruList_New( FTC_MruList list, - FT_Pointer key, - FTC_MruNode *anode ) - { - FT_Error error; - FTC_MruNode node = NULL; - FT_Memory memory = list->memory; - - - if ( list->num_nodes >= list->max_nodes && list->max_nodes > 0 ) - { - node = list->nodes->prev; - - FT_ASSERT( node ); - - if ( list->clazz.node_reset ) - { - FTC_MruNode_Up( &list->nodes, node ); - - error = list->clazz.node_reset( node, key, list->data ); - if ( !error ) - goto Exit; - } - - FTC_MruNode_Remove( &list->nodes, node ); - list->num_nodes--; - - if ( list->clazz.node_done ) - list->clazz.node_done( node, list->data ); - } - else if ( FT_ALLOC( node, list->clazz.node_size ) ) - goto Exit; - - error = list->clazz.node_init( node, key, list->data ); - if ( error ) - goto Fail; - - FTC_MruNode_Prepend( &list->nodes, node ); - list->num_nodes++; - - Exit: - *anode = node; - return error; - - Fail: - if ( list->clazz.node_done ) - list->clazz.node_done( node, list->data ); - - FT_FREE( node ); - goto Exit; - } - - -#ifndef FTC_INLINE - FT_LOCAL_DEF( FT_Error ) - FTC_MruList_Lookup( FTC_MruList list, - FT_Pointer key, - FTC_MruNode *anode ) - { - FTC_MruNode node; - - - node = FTC_MruList_Find( list, key ); - if ( node == NULL ) - return FTC_MruList_New( list, key, anode ); - - *anode = node; - return 0; - } -#endif /* FTC_INLINE */ - - FT_LOCAL_DEF( void ) - FTC_MruList_Remove( FTC_MruList list, - FTC_MruNode node ) - { - FTC_MruNode_Remove( &list->nodes, node ); - list->num_nodes--; - - { - FT_Memory memory = list->memory; - - - if ( list->clazz.node_done ) - list->clazz.node_done( node, list->data ); - - FT_FREE( node ); - } - } - - - FT_LOCAL_DEF( void ) - FTC_MruList_RemoveSelection( FTC_MruList list, - FTC_MruNode_CompareFunc selection, - FT_Pointer key ) - { - FTC_MruNode first, node, next; - - - first = list->nodes; - while ( first && ( selection == NULL || selection( first, key ) ) ) - { - FTC_MruList_Remove( list, first ); - first = list->nodes; - } - - if ( first ) - { - node = first->next; - while ( node != first ) - { - next = node->next; - - if ( selection( node, key ) ) - FTC_MruList_Remove( list, node ); - - node = next; - } - } - } - - -/* END */ diff --git a/3party/freetype/src/cache/ftcmru.h b/3party/freetype/src/cache/ftcmru.h deleted file mode 100644 index c0c35f934b..0000000000 --- a/3party/freetype/src/cache/ftcmru.h +++ /dev/null @@ -1,246 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcmru.h */ -/* */ -/* Simple MRU list-cache (specification). */ -/* */ -/* Copyright 2000-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* An MRU is a list that cannot hold more than a certain number of */ - /* elements (`max_elements'). All elements in the list are sorted in */ - /* least-recently-used order, i.e., the `oldest' element is at the tail */ - /* of the list. */ - /* */ - /* When doing a lookup (either through `Lookup()' or `Lookup_Node()'), */ - /* the list is searched for an element with the corresponding key. If */ - /* it is found, the element is moved to the head of the list and is */ - /* returned. */ - /* */ - /* If no corresponding element is found, the lookup routine will try to */ - /* obtain a new element with the relevant key. If the list is already */ - /* full, the oldest element from the list is discarded and replaced by a */ - /* new one; a new element is added to the list otherwise. */ - /* */ - /* Note that it is possible to pre-allocate the element list nodes. */ - /* This is handy if `max_elements' is sufficiently small, as it saves */ - /* allocations/releases during the lookup process. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTCMRU_H__ -#define __FTCMRU_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - -#define xxFT_DEBUG_ERROR -#define FTC_INLINE - -FT_BEGIN_HEADER - - typedef struct FTC_MruNodeRec_* FTC_MruNode; - - typedef struct FTC_MruNodeRec_ - { - FTC_MruNode next; - FTC_MruNode prev; - - } FTC_MruNodeRec; - - - FT_LOCAL( void ) - FTC_MruNode_Prepend( FTC_MruNode *plist, - FTC_MruNode node ); - - FT_LOCAL( void ) - FTC_MruNode_Up( FTC_MruNode *plist, - FTC_MruNode node ); - - FT_LOCAL( void ) - FTC_MruNode_Remove( FTC_MruNode *plist, - FTC_MruNode node ); - - - typedef struct FTC_MruListRec_* FTC_MruList; - - typedef struct FTC_MruListClassRec_ const * FTC_MruListClass; - - - typedef FT_Bool - (*FTC_MruNode_CompareFunc)( FTC_MruNode node, - FT_Pointer key ); - - typedef FT_Error - (*FTC_MruNode_InitFunc)( FTC_MruNode node, - FT_Pointer key, - FT_Pointer data ); - - typedef FT_Error - (*FTC_MruNode_ResetFunc)( FTC_MruNode node, - FT_Pointer key, - FT_Pointer data ); - - typedef void - (*FTC_MruNode_DoneFunc)( FTC_MruNode node, - FT_Pointer data ); - - - typedef struct FTC_MruListClassRec_ - { - FT_Offset node_size; - FTC_MruNode_CompareFunc node_compare; - FTC_MruNode_InitFunc node_init; - FTC_MruNode_ResetFunc node_reset; - FTC_MruNode_DoneFunc node_done; - - } FTC_MruListClassRec; - - typedef struct FTC_MruListRec_ - { - FT_UInt num_nodes; - FT_UInt max_nodes; - FTC_MruNode nodes; - FT_Pointer data; - FTC_MruListClassRec clazz; - FT_Memory memory; - - } FTC_MruListRec; - - - FT_LOCAL( void ) - FTC_MruList_Init( FTC_MruList list, - FTC_MruListClass clazz, - FT_UInt max_nodes, - FT_Pointer data, - FT_Memory memory ); - - FT_LOCAL( void ) - FTC_MruList_Reset( FTC_MruList list ); - - - FT_LOCAL( void ) - FTC_MruList_Done( FTC_MruList list ); - - - FT_LOCAL( FT_Error ) - FTC_MruList_New( FTC_MruList list, - FT_Pointer key, - FTC_MruNode *anode ); - - FT_LOCAL( void ) - FTC_MruList_Remove( FTC_MruList list, - FTC_MruNode node ); - - FT_LOCAL( void ) - FTC_MruList_RemoveSelection( FTC_MruList list, - FTC_MruNode_CompareFunc selection, - FT_Pointer key ); - - -#ifdef FTC_INLINE - -#define FTC_MRULIST_LOOKUP_CMP( list, key, compare, node, error ) \ - FT_BEGIN_STMNT \ - FTC_MruNode* _pfirst = &(list)->nodes; \ - FTC_MruNode_CompareFunc _compare = (FTC_MruNode_CompareFunc)(compare); \ - FTC_MruNode _first, _node; \ - \ - \ - error = FT_Err_Ok; \ - _first = *(_pfirst); \ - _node = NULL; \ - \ - if ( _first ) \ - { \ - _node = _first; \ - do \ - { \ - if ( _compare( _node, (key) ) ) \ - { \ - if ( _node != _first ) \ - FTC_MruNode_Up( _pfirst, _node ); \ - \ - node = _node; \ - goto _MruOk; \ - } \ - _node = _node->next; \ - \ - } while ( _node != _first) ; \ - } \ - \ - error = FTC_MruList_New( (list), (key), (FTC_MruNode*)(void*)&(node) ); \ - _MruOk: \ - ; \ - FT_END_STMNT - -#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ - FTC_MRULIST_LOOKUP_CMP( list, key, (list)->clazz.node_compare, node, error ) - -#else /* !FTC_INLINE */ - - FT_LOCAL( FTC_MruNode ) - FTC_MruList_Find( FTC_MruList list, - FT_Pointer key ); - - FT_LOCAL( FT_Error ) - FTC_MruList_Lookup( FTC_MruList list, - FT_Pointer key, - FTC_MruNode *pnode ); - -#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ - error = FTC_MruList_Lookup( (list), (key), (FTC_MruNode*)&(node) ) - -#endif /* !FTC_INLINE */ - - -#define FTC_MRULIST_LOOP( list, node ) \ - FT_BEGIN_STMNT \ - FTC_MruNode _first = (list)->nodes; \ - \ - \ - if ( _first ) \ - { \ - FTC_MruNode _node = _first; \ - \ - \ - do \ - { \ - *(FTC_MruNode*)&(node) = _node; - - -#define FTC_MRULIST_LOOP_END() \ - _node = _node->next; \ - \ - } while ( _node != _first ); \ - } \ - FT_END_STMNT - - /* */ - -FT_END_HEADER - - -#endif /* __FTCMRU_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cache/ftcsbits.c b/3party/freetype/src/cache/ftcsbits.c deleted file mode 100644 index 8141719167..0000000000 --- a/3party/freetype/src/cache/ftcsbits.c +++ /dev/null @@ -1,421 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcsbits.c */ -/* */ -/* FreeType sbits manager (body). */ -/* */ -/* Copyright 2000-2015 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 <ft2build.h> -#include FT_CACHE_H -#include "ftcsbits.h" -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_ERRORS_H - -#include "ftccback.h" -#include "ftcerror.h" - -#undef FT_COMPONENT -#define FT_COMPONENT trace_cache - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** SBIT CACHE NODES *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - static FT_Error - ftc_sbit_copy_bitmap( FTC_SBit sbit, - FT_Bitmap* bitmap, - FT_Memory memory ) - { - FT_Error error; - FT_Int pitch = bitmap->pitch; - FT_ULong size; - - - if ( pitch < 0 ) - pitch = -pitch; - - size = (FT_ULong)pitch * bitmap->rows; - - if ( !FT_ALLOC( sbit->buffer, size ) ) - FT_MEM_COPY( sbit->buffer, bitmap->buffer, size ); - - return error; - } - - - FT_LOCAL_DEF( void ) - ftc_snode_free( FTC_Node ftcsnode, - FTC_Cache cache ) - { - FTC_SNode snode = (FTC_SNode)ftcsnode; - FTC_SBit sbit = snode->sbits; - FT_UInt count = snode->count; - FT_Memory memory = cache->memory; - - - for ( ; count > 0; sbit++, count-- ) - FT_FREE( sbit->buffer ); - - FTC_GNode_Done( FTC_GNODE( snode ), cache ); - - FT_FREE( snode ); - } - - - FT_LOCAL_DEF( void ) - FTC_SNode_Free( FTC_SNode snode, - FTC_Cache cache ) - { - ftc_snode_free( FTC_NODE( snode ), cache ); - } - - - /* - * This function tries to load a small bitmap within a given FTC_SNode. - * Note that it returns a non-zero error code _only_ in the case of - * out-of-memory condition. For all other errors (e.g., corresponding - * to a bad font file), this function will mark the sbit as `unavailable' - * and return a value of 0. - * - * You should also read the comment within the @ftc_snode_compare - * function below to see how out-of-memory is handled during a lookup. - */ - static FT_Error - ftc_snode_load( FTC_SNode snode, - FTC_Manager manager, - FT_UInt gindex, - FT_ULong *asize ) - { - FT_Error error; - FTC_GNode gnode = FTC_GNODE( snode ); - FTC_Family family = gnode->family; - FT_Memory memory = manager->memory; - FT_Face face; - FTC_SBit sbit; - FTC_SFamilyClass clazz; - - - if ( (FT_UInt)(gindex - gnode->gindex) >= snode->count ) - { - FT_ERROR(( "ftc_snode_load: invalid glyph index" )); - return FT_THROW( Invalid_Argument ); - } - - sbit = snode->sbits + ( gindex - gnode->gindex ); - clazz = (FTC_SFamilyClass)family->clazz; - - sbit->buffer = 0; - - error = clazz->family_load_glyph( family, gindex, manager, &face ); - if ( error ) - goto BadGlyph; - - { - FT_Int temp; - FT_GlyphSlot slot = face->glyph; - FT_Bitmap* bitmap = &slot->bitmap; - FT_Pos xadvance, yadvance; /* FT_GlyphSlot->advance.{x|y} */ - - - if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) - { - FT_TRACE0(( "ftc_snode_load:" - " glyph loaded didn't return a bitmap\n" )); - goto BadGlyph; - } - - /* Check whether our values fit into 8-bit containers! */ - /* If this is not the case, our bitmap is too large */ - /* and we will leave it as `missing' with sbit.buffer = 0 */ - -#define CHECK_CHAR( d ) ( temp = (FT_Char)d, (FT_Int) temp == (FT_Int) d ) -#define CHECK_BYTE( d ) ( temp = (FT_Byte)d, (FT_UInt)temp == (FT_UInt)d ) - - /* horizontal advance in pixels */ - xadvance = ( slot->advance.x + 32 ) >> 6; - yadvance = ( slot->advance.y + 32 ) >> 6; - - if ( !CHECK_BYTE( bitmap->rows ) || - !CHECK_BYTE( bitmap->width ) || - !CHECK_CHAR( bitmap->pitch ) || - !CHECK_CHAR( slot->bitmap_left ) || - !CHECK_CHAR( slot->bitmap_top ) || - !CHECK_CHAR( xadvance ) || - !CHECK_CHAR( yadvance ) ) - { - FT_TRACE2(( "ftc_snode_load:" - " glyph too large for small bitmap cache\n")); - goto BadGlyph; - } - - sbit->width = (FT_Byte)bitmap->width; - sbit->height = (FT_Byte)bitmap->rows; - sbit->pitch = (FT_Char)bitmap->pitch; - sbit->left = (FT_Char)slot->bitmap_left; - sbit->top = (FT_Char)slot->bitmap_top; - sbit->xadvance = (FT_Char)xadvance; - sbit->yadvance = (FT_Char)yadvance; - sbit->format = (FT_Byte)bitmap->pixel_mode; - sbit->max_grays = (FT_Byte)(bitmap->num_grays - 1); - - /* copy the bitmap into a new buffer -- ignore error */ - error = ftc_sbit_copy_bitmap( sbit, bitmap, memory ); - - /* now, compute size */ - if ( asize ) - *asize = (FT_ULong)FT_ABS( sbit->pitch ) * sbit->height; - - } /* glyph loading successful */ - - /* ignore the errors that might have occurred -- */ - /* we mark unloaded glyphs with `sbit.buffer == 0' */ - /* and `width == 255', `height == 0' */ - /* */ - if ( error && FT_ERR_NEQ( error, Out_Of_Memory ) ) - { - BadGlyph: - sbit->width = 255; - sbit->height = 0; - sbit->buffer = NULL; - error = FT_Err_Ok; - if ( asize ) - *asize = 0; - } - - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - FTC_SNode_New( FTC_SNode *psnode, - FTC_GQuery gquery, - FTC_Cache cache ) - { - FT_Memory memory = cache->memory; - FT_Error error; - FTC_SNode snode = NULL; - FT_UInt gindex = gquery->gindex; - FTC_Family family = gquery->family; - - FTC_SFamilyClass clazz = FTC_CACHE__SFAMILY_CLASS( cache ); - FT_UInt total; - FT_UInt node_count; - - - total = clazz->family_get_count( family, cache->manager ); - if ( total == 0 || gindex >= total ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - if ( !FT_NEW( snode ) ) - { - FT_UInt count, start; - - - start = gindex - ( gindex % FTC_SBIT_ITEMS_PER_NODE ); - count = total - start; - if ( count > FTC_SBIT_ITEMS_PER_NODE ) - count = FTC_SBIT_ITEMS_PER_NODE; - - FTC_GNode_Init( FTC_GNODE( snode ), start, family ); - - snode->count = count; - for ( node_count = 0; node_count < count; node_count++ ) - { - snode->sbits[node_count].width = 255; - } - - error = ftc_snode_load( snode, - cache->manager, - gindex, - NULL ); - if ( error ) - { - FTC_SNode_Free( snode, cache ); - snode = NULL; - } - } - - Exit: - *psnode = snode; - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - ftc_snode_new( FTC_Node *ftcpsnode, - FT_Pointer ftcgquery, - FTC_Cache cache ) - { - FTC_SNode *psnode = (FTC_SNode*)ftcpsnode; - FTC_GQuery gquery = (FTC_GQuery)ftcgquery; - - - return FTC_SNode_New( psnode, gquery, cache ); - } - - - FT_LOCAL_DEF( FT_Offset ) - ftc_snode_weight( FTC_Node ftcsnode, - FTC_Cache cache ) - { - FTC_SNode snode = (FTC_SNode)ftcsnode; - FT_UInt count = snode->count; - FTC_SBit sbit = snode->sbits; - FT_Int pitch; - FT_Offset size; - - FT_UNUSED( cache ); - - - FT_ASSERT( snode->count <= FTC_SBIT_ITEMS_PER_NODE ); - - /* the node itself */ - size = sizeof ( *snode ); - - for ( ; count > 0; count--, sbit++ ) - { - if ( sbit->buffer ) - { - pitch = sbit->pitch; - if ( pitch < 0 ) - pitch = -pitch; - - /* add the size of a given glyph image */ - size += (FT_Offset)pitch * sbit->height; - } - } - - return size; - } - - -#if 0 - - FT_LOCAL_DEF( FT_Offset ) - FTC_SNode_Weight( FTC_SNode snode ) - { - return ftc_snode_weight( FTC_NODE( snode ), NULL ); - } - -#endif /* 0 */ - - - FT_LOCAL_DEF( FT_Bool ) - ftc_snode_compare( FTC_Node ftcsnode, - FT_Pointer ftcgquery, - FTC_Cache cache, - FT_Bool* list_changed ) - { - FTC_SNode snode = (FTC_SNode)ftcsnode; - FTC_GQuery gquery = (FTC_GQuery)ftcgquery; - FTC_GNode gnode = FTC_GNODE( snode ); - FT_UInt gindex = gquery->gindex; - FT_Bool result; - - - if (list_changed) - *list_changed = FALSE; - result = FT_BOOL( gnode->family == gquery->family && - (FT_UInt)( gindex - gnode->gindex ) < snode->count ); - if ( result ) - { - /* check if we need to load the glyph bitmap now */ - FTC_SBit sbit = snode->sbits + ( gindex - gnode->gindex ); - - - /* - * The following code illustrates what to do when you want to - * perform operations that may fail within a lookup function. - * - * Here, we want to load a small bitmap on-demand; we thus - * need to call the `ftc_snode_load' function which may return - * a non-zero error code only when we are out of memory (OOM). - * - * The correct thing to do is to use @FTC_CACHE_TRYLOOP and - * @FTC_CACHE_TRYLOOP_END in order to implement a retry loop - * that is capable of flushing the cache incrementally when - * an OOM errors occur. - * - * However, we need to `lock' the node before this operation to - * prevent it from being flushed within the loop. - * - * When we exit the loop, we unlock the node, then check the `error' - * variable. If it is non-zero, this means that the cache was - * completely flushed and that no usable memory was found to load - * the bitmap. - * - * We then prefer to return a value of 0 (i.e., NO MATCH). This - * ensures that the caller will try to allocate a new node. - * This operation consequently _fail_ and the lookup function - * returns the appropriate OOM error code. - * - * Note that `buffer == NULL && width == 255' is a hack used to - * tag `unavailable' bitmaps in the array. We should never try - * to load these. - * - */ - - if ( sbit->buffer == NULL && sbit->width == 255 ) - { - FT_ULong size; - FT_Error error; - - - ftcsnode->ref_count++; /* lock node to prevent flushing */ - /* in retry loop */ - - FTC_CACHE_TRYLOOP( cache ) - { - error = ftc_snode_load( snode, cache->manager, gindex, &size ); - } - FTC_CACHE_TRYLOOP_END( list_changed ); - - ftcsnode->ref_count--; /* unlock the node */ - - if ( error ) - result = 0; - else - cache->manager->cur_weight += size; - } - } - - return result; - } - - -#ifdef FTC_INLINE - - FT_LOCAL_DEF( FT_Bool ) - FTC_SNode_Compare( FTC_SNode snode, - FTC_GQuery gquery, - FTC_Cache cache, - FT_Bool* list_changed ) - { - return ftc_snode_compare( FTC_NODE( snode ), gquery, - cache, list_changed ); - } - -#endif - -/* END */ diff --git a/3party/freetype/src/cache/ftcsbits.h b/3party/freetype/src/cache/ftcsbits.h deleted file mode 100644 index 5a2fa1ac80..0000000000 --- a/3party/freetype/src/cache/ftcsbits.h +++ /dev/null @@ -1,103 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcsbits.h */ -/* */ -/* A small-bitmap cache (specification). */ -/* */ -/* Copyright 2000-2015 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 __FTCSBITS_H__ -#define __FTCSBITS_H__ - - -#include <ft2build.h> -#include FT_CACHE_H -#include "ftcglyph.h" - - -FT_BEGIN_HEADER - -#define FTC_SBIT_ITEMS_PER_NODE 16 - - typedef struct FTC_SNodeRec_ - { - FTC_GNodeRec gnode; - FT_UInt count; - FTC_SBitRec sbits[FTC_SBIT_ITEMS_PER_NODE]; - - } FTC_SNodeRec, *FTC_SNode; - - -#define FTC_SNODE( x ) ( (FTC_SNode)( x ) ) -#define FTC_SNODE_GINDEX( x ) FTC_GNODE( x )->gindex -#define FTC_SNODE_FAMILY( x ) FTC_GNODE( x )->family - - typedef FT_UInt - (*FTC_SFamily_GetCountFunc)( FTC_Family family, - FTC_Manager manager ); - - typedef FT_Error - (*FTC_SFamily_LoadGlyphFunc)( FTC_Family family, - FT_UInt gindex, - FTC_Manager manager, - FT_Face *aface ); - - typedef struct FTC_SFamilyClassRec_ - { - FTC_MruListClassRec clazz; - FTC_SFamily_GetCountFunc family_get_count; - FTC_SFamily_LoadGlyphFunc family_load_glyph; - - } FTC_SFamilyClassRec; - - typedef const FTC_SFamilyClassRec* FTC_SFamilyClass; - -#define FTC_SFAMILY_CLASS( x ) ((FTC_SFamilyClass)(x)) - -#define FTC_CACHE__SFAMILY_CLASS( x ) \ - FTC_SFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS( x )->family_class ) - - - FT_LOCAL( void ) - FTC_SNode_Free( FTC_SNode snode, - FTC_Cache cache ); - - FT_LOCAL( FT_Error ) - FTC_SNode_New( FTC_SNode *psnode, - FTC_GQuery gquery, - FTC_Cache cache ); - -#if 0 - FT_LOCAL( FT_ULong ) - FTC_SNode_Weight( FTC_SNode inode ); -#endif - - -#ifdef FTC_INLINE - - FT_LOCAL( FT_Bool ) - FTC_SNode_Compare( FTC_SNode snode, - FTC_GQuery gquery, - FTC_Cache cache, - FT_Bool* list_changed); - -#endif - - /* */ - -FT_END_HEADER - -#endif /* __FTCSBITS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cache/ftstrokedcache.c b/3party/freetype/src/cache/ftstrokedcache.c deleted file mode 100644 index 17d0ca7397..0000000000 --- a/3party/freetype/src/cache/ftstrokedcache.c +++ /dev/null @@ -1,399 +0,0 @@ -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_CACHE_H -#include FT_STROKER_H -#include "ftcglyph.h" -#include "ftcimage.h" -#include "ftcsbits.h" - -#include "ftccback.h" -#include "ftcerror.h" - -#define FT_COMPONENT trace_cache - -/* - * Basic Families - * - */ -typedef struct FTC_StrokedAttrRec_ -{ - FTC_ScalerRec scaler; - FT_UInt load_flags; - FT_Stroker stroker; - -} FTC_StrokedAttrRec, *FTC_StrokedAttrs; - -#define FTC_STROKED_ATTR_COMPARE( a, b ) \ - FT_BOOL( FTC_SCALER_COMPARE( &(a)->scaler, &(b)->scaler ) && \ - ((a)->load_flags == (b)->load_flags ) && \ - ((a)->stroker == (b)->stroker) ) - - -#define FTC_STROKED_ATTR_HASH( a ) \ - ( FTC_SCALER_HASH( &(a)->scaler ) + 31*(a)->load_flags + 61 * (int)((a)->stroker)) - - -typedef struct FTC_StrokedQueryRec_ -{ - FTC_GQueryRec gquery; - FTC_StrokedAttrRec attrs; - -} FTC_StrokedQueryRec, *FTC_StrokedQuery; - - -typedef struct FTC_StrokedFamilyRec_ -{ - FTC_FamilyRec family; - FTC_StrokedAttrRec attrs; - -} FTC_StrokedFamilyRec, *FTC_StrokedFamily; - - -FT_CALLBACK_DEF( FT_Bool ) -ftc_stroked_family_compare( FTC_MruNode ftcfamily, - FT_Pointer ftcquery ) -{ - FTC_StrokedFamily family = (FTC_StrokedFamily)ftcfamily; - FTC_StrokedQuery query = (FTC_StrokedQuery)ftcquery; - - return FTC_STROKED_ATTR_COMPARE( &family->attrs, &query->attrs ); -} - - -FT_CALLBACK_DEF( FT_Error ) -ftc_stroked_family_init( FTC_MruNode ftcfamily, - FT_Pointer ftcquery, - FT_Pointer ftccache ) -{ - FTC_StrokedFamily family = (FTC_StrokedFamily)ftcfamily; - FTC_StrokedQuery query = (FTC_StrokedQuery)ftcquery; - FTC_Cache cache = (FTC_Cache)ftccache; - - FTC_Family_Init( FTC_FAMILY( family ), cache ); - family->attrs = query->attrs; - return 0; -} - - -FT_CALLBACK_DEF( FT_UInt ) -ftc_stroked_family_get_count( FTC_Family ftcfamily, - FTC_Manager manager ) -{ - FTC_StrokedFamily family = (FTC_StrokedFamily)ftcfamily; - FT_Error error; - FT_Face face; - FT_UInt result = 0; - - - error = FTC_Manager_LookupFace( manager, family->attrs.scaler.face_id, - &face ); - - if ( error || !face ) - return result; - - if ( (FT_ULong)face->num_glyphs > FT_UINT_MAX || 0 > face->num_glyphs ) - { - FT_TRACE1(( "ftc_basic_family_get_count: too large number of glyphs " )); - FT_TRACE1(( "in this face, truncated\n", face->num_glyphs )); - } - - if ( !error ) - result = (FT_UInt)face->num_glyphs; - - return result; -} - - -FT_CALLBACK_DEF( FT_Error ) -ftc_stroked_family_load_glyph( FTC_Family ftcfamily, - FT_UInt gindex, - FTC_Cache cache, - FT_Glyph *aglyph ) -{ - FTC_StrokedFamily family = (FTC_StrokedFamily)ftcfamily; - FT_Error error; - FTC_Scaler scaler = &family->attrs.scaler; - FT_Face face; - FT_Size size; - - - /* we will now load the glyph image */ - error = FTC_Manager_LookupSize( cache->manager, - scaler, - &size ); - if ( !error ) - { - face = size->face; - - error = FT_Load_Glyph( face, gindex, FT_LOAD_DEFAULT ); - if ( !error ) - { - if ( face->glyph->format == FT_GLYPH_FORMAT_BITMAP || - face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) - { - /* ok, stroke and copy it */ - FT_Glyph glyph; - - error = FT_Get_Glyph( face->glyph, &glyph ); - - if (error) - goto Exit; - - error = FT_Glyph_Stroke(&glyph, family->attrs.stroker, 1); - - if (error) - goto Exit; - - error = FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1); - - if (!error) - { - *aglyph = glyph; - goto Exit; - } - - } - else - error = FTC_Err_Invalid_Argument; - } - } - -Exit: - return error; -} - -FT_CALLBACK_DEF( FT_Bool ) -ftc_stroked_gnode_compare_faceid( FTC_Node ftcgnode, - FT_Pointer ftcface_id, - FTC_Cache cache, - FT_Bool* list_changed ) -{ - FTC_GNode gnode = (FTC_GNode)ftcgnode; - FTC_FaceID face_id = (FTC_FaceID)ftcface_id; - FTC_StrokedFamily family = (FTC_StrokedFamily)gnode->family; - FT_Bool result; - - - if ( list_changed ) - *list_changed = FALSE; - result = FT_BOOL( family->attrs.scaler.face_id == face_id ); - if ( result ) - { - /* we must call this function to avoid this node from appearing - * in later lookups with the same face_id! - */ - FTC_GNode_UnselectFamily( gnode, cache ); - } - return result; -} - - -/* - * - * stroked image cache - * - */ - - FT_CALLBACK_TABLE_DEF - const FTC_IFamilyClassRec ftc_stroked_image_family_class = - { - { - sizeof ( FTC_StrokedFamilyRec ), - ftc_stroked_family_compare, - ftc_stroked_family_init, - 0, /* FTC_MruNode_ResetFunc */ - 0 /* FTC_MruNode_DoneFunc */ - }, - ftc_stroked_family_load_glyph - }; - - - FT_CALLBACK_TABLE_DEF - const FTC_GCacheClassRec ftc_stroked_image_cache_class = - { - { - ftc_inode_new, - ftc_inode_weight, - ftc_gnode_compare, - ftc_stroked_gnode_compare_faceid, - ftc_inode_free, - - sizeof ( FTC_GCacheRec ), - ftc_gcache_init, - ftc_gcache_done - }, - (FTC_MruListClass)&ftc_stroked_image_family_class - }; - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_StrokedImageCache_New( FTC_Manager manager, - FTC_ImageCache *acache) - { - return FTC_GCache_New( manager, &ftc_stroked_image_cache_class, - (FTC_GCache*)acache ); - } - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_StrokedImageCache_Lookup( FTC_ImageCache cache, - FTC_ImageType type, - FT_Stroker stroker, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ) - { - FTC_StrokedQueryRec query; - FTC_Node node = 0; /* make compiler happy */ - FT_Error error; - FT_PtrDist hash; - - - /* some argument checks are delayed to FTC_Cache_Lookup */ - if ( !aglyph ) - { - error = FTC_Err_Invalid_Argument; - goto Exit; - } - - *aglyph = NULL; - if ( anode ) - *anode = NULL; - -#if defined( FT_CONFIG_OPTION_OLD_INTERNALS ) && ( FT_INT_MAX > 0xFFFFU ) - - /* - * This one is a major hack used to detect whether we are passed a - * regular FTC_ImageType handle, or a legacy FTC_OldImageDesc one. - */ - if ( (FT_ULong)type->width >= 0x10000L ) - { - FTC_OldImageDesc desc = (FTC_OldImageDescRec_)type; - - - query.attrs.scaler.face_id = desc->font.face_id; - query.attrs.scaler.width = desc->font.pix_width; - query.attrs.scaler.height = desc->font.pix_height; - query.attrs.load_flags = desc->flags; - query.attrs.stroker = stroker; - } - else - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - { - if ( (FT_ULong)(type->flags - FT_INT_MIN) > FT_UINT_MAX ) - { - FT_TRACE1(( "FTC_ImageCache_Lookup: higher bits in load_flags" )); - FT_TRACE1(( "0x%x are dropped\n", (type->flags & ~((FT_ULong)FT_UINT_MAX)) )); - } - - query.attrs.scaler.face_id = type->face_id; - query.attrs.scaler.width = type->width; - query.attrs.scaler.height = type->height; - query.attrs.load_flags = (FT_UInt)type->flags; - query.attrs.stroker = stroker; - } - - query.attrs.scaler.pixel = 1; - query.attrs.scaler.x_res = 0; /* make compilers happy */ - query.attrs.scaler.y_res = 0; - - hash = FTC_STROKED_ATTR_HASH( &query.attrs ) + gindex; - -#if 1 /* inlining is about 50% faster! */ - FTC_GCACHE_LOOKUP_CMP( cache, - ftc_stroked_family_compare, - FTC_GNode_Compare, - hash, gindex, - &query, - node, - error ); -#else - error = FTC_GCache_Lookup( FTC_GCACHE( cache ), - hash, gindex, - FTC_GQUERY( &query ), - &node ); -#endif - if ( !error ) - { - *aglyph = FTC_INODE( node )->glyph; - - if ( anode ) - { - *anode = node; - node->ref_count++; - } - } - - Exit: - return error; - } - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_StrokedImageCache_LookupScaler( FTC_ImageCache cache, - FTC_Scaler scaler, - FT_Stroker stroker, - FT_ULong load_flags, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ) - { - FTC_StrokedQueryRec query; - FTC_Node node = 0; /* make compiler happy */ - FT_Error error; - FT_PtrDist hash; - - - /* some argument checks are delayed to FTC_Cache_Lookup */ - if ( !aglyph || !scaler ) - { - error = FTC_Err_Invalid_Argument; - goto Exit; - } - - *aglyph = NULL; - if ( anode ) - *anode = NULL; - - /* FT_Load_Glyph(), FT_Load_Char() take FT_UInt flags */ - if ( load_flags > FT_UINT_MAX ) - { - FT_TRACE1(( "FTC_StrokedImageCache_LookupScaler: higher bits in load_flags" )); - FT_TRACE1(( "0x%x are dropped\n", (load_flags & ~((FT_ULong)FT_UINT_MAX)) )); - } - - query.attrs.scaler = scaler[0]; - query.attrs.load_flags = (FT_UInt)load_flags; - query.attrs.stroker = stroker; - - hash = FTC_STROKED_ATTR_HASH( &query.attrs ) + gindex; - - FTC_GCACHE_LOOKUP_CMP( cache, - ftc_stroked_family_compare, - FTC_GNode_Compare, - hash, gindex, - &query, - node, - error ); - if ( !error ) - { - *aglyph = FTC_INODE( node )->glyph; - - if ( anode ) - { - *anode = node; - node->ref_count++; - } - } - - Exit: - return error; - } diff --git a/3party/freetype/src/cache/rules.mk b/3party/freetype/src/cache/rules.mk deleted file mode 100644 index 6d5cf344b3..0000000000 --- a/3party/freetype/src/cache/rules.mk +++ /dev/null @@ -1,85 +0,0 @@ -# -# FreeType 2 Cache configuration rules -# - - -# Copyright 2000-2015 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. - - -# Cache driver directory -# -CACHE_DIR := $(SRC_DIR)/cache - - -# compilation flags for the driver -# -CACHE_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(CACHE_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# Cache driver sources (i.e., C files) -# -CACHE_DRV_SRC := $(CACHE_DIR)/ftcbasic.c \ - $(CACHE_DIR)/ftccache.c \ - $(CACHE_DIR)/ftccmap.c \ - $(CACHE_DIR)/ftcglyph.c \ - $(CACHE_DIR)/ftcimage.c \ - $(CACHE_DIR)/ftcmanag.c \ - $(CACHE_DIR)/ftcmru.c \ - $(CACHE_DIR)/ftcsbits.c - - -# Cache driver headers -# -CACHE_DRV_H := $(CACHE_DIR)/ftccache.h \ - $(CACHE_DIR)/ftccback.h \ - $(CACHE_DIR)/ftcerror.h \ - $(CACHE_DIR)/ftcglyph.h \ - $(CACHE_DIR)/ftcimage.h \ - $(CACHE_DIR)/ftcmanag.h \ - $(CACHE_DIR)/ftcmru.h \ - $(CACHE_DIR)/ftcsbits.h - - -# Cache driver object(s) -# -# CACHE_DRV_OBJ_M is used during `multi' builds. -# CACHE_DRV_OBJ_S is used during `single' builds. -# -CACHE_DRV_OBJ_M := $(CACHE_DRV_SRC:$(CACHE_DIR)/%.c=$(OBJ_DIR)/%.$O) -CACHE_DRV_OBJ_S := $(OBJ_DIR)/ftcache.$O - -# Cache driver source file for single build -# -CACHE_DRV_SRC_S := $(CACHE_DIR)/ftcache.c - - -# Cache driver - single object -# -$(CACHE_DRV_OBJ_S): $(CACHE_DRV_SRC_S) $(CACHE_DRV_SRC) \ - $(FREETYPE_H) $(CACHE_DRV_H) - $(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CACHE_DRV_SRC_S)) - - -# Cache driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(CACHE_DIR)/%.c $(FREETYPE_H) $(CACHE_DRV_H) - $(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(CACHE_DRV_OBJ_S) -DRV_OBJS_M += $(CACHE_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/cff/Jamfile b/3party/freetype/src/cff/Jamfile deleted file mode 100644 index deec0792ce..0000000000 --- a/3party/freetype/src/cff/Jamfile +++ /dev/null @@ -1,45 +0,0 @@ -# FreeType 2 src/cff Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) cff ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = cffcmap - cffdrivr - cffgload - cffload - cffobjs - cffparse - cffpic - cf2arrst - cf2blues - cf2error - cf2font - cf2ft - cf2hints - cf2intrp - cf2read - cf2stack - ; - } - else - { - _sources = cff ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/cff Jamfile diff --git a/3party/freetype/src/cff/cf2arrst.c b/3party/freetype/src/cff/cf2arrst.c deleted file mode 100644 index 89f3e9f1d7..0000000000 --- a/3party/freetype/src/cff/cf2arrst.c +++ /dev/null @@ -1,241 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2arrst.c */ -/* */ -/* Adobe's code for Array Stacks (body). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2glue.h" -#include "cf2arrst.h" - -#include "cf2error.h" - - - /* - * CF2_ArrStack uses an error pointer, to enable shared errors. - * Shared errors are necessary when multiple objects allow the program - * to continue after detecting errors. Only the first error should be - * recorded. - */ - - FT_LOCAL_DEF( void ) - cf2_arrstack_init( CF2_ArrStack arrstack, - FT_Memory memory, - FT_Error* error, - size_t sizeItem ) - { - FT_ASSERT( arrstack != NULL ); - - /* initialize the structure */ - arrstack->memory = memory; - arrstack->error = error; - arrstack->sizeItem = sizeItem; - arrstack->allocated = 0; - arrstack->chunk = 10; /* chunks of 10 items */ - arrstack->count = 0; - arrstack->totalSize = 0; - arrstack->ptr = NULL; - } - - - FT_LOCAL_DEF( void ) - cf2_arrstack_finalize( CF2_ArrStack arrstack ) - { - FT_Memory memory = arrstack->memory; /* for FT_FREE */ - - - FT_ASSERT( arrstack != NULL ); - - arrstack->allocated = 0; - arrstack->count = 0; - arrstack->totalSize = 0; - - /* free the data buffer */ - FT_FREE( arrstack->ptr ); - } - - - /* allocate or reallocate the buffer size; */ - /* return false on memory error */ - static FT_Bool - cf2_arrstack_setNumElements( CF2_ArrStack arrstack, - size_t numElements ) - { - FT_ASSERT( arrstack != NULL ); - - { - FT_Error error = FT_Err_Ok; /* for FT_REALLOC */ - FT_Memory memory = arrstack->memory; /* for FT_REALLOC */ - - size_t newSize = numElements * arrstack->sizeItem; - - - if ( numElements > FT_LONG_MAX / arrstack->sizeItem ) - goto exit; - - - FT_ASSERT( newSize > 0 ); /* avoid realloc with zero size */ - - if ( !FT_REALLOC( arrstack->ptr, arrstack->totalSize, newSize ) ) - { - arrstack->allocated = numElements; - arrstack->totalSize = newSize; - - if ( arrstack->count > numElements ) - { - /* we truncated the list! */ - CF2_SET_ERROR( arrstack->error, Stack_Overflow ); - arrstack->count = numElements; - return FALSE; - } - - return TRUE; /* success */ - } - } - - exit: - /* if there's not already an error, store this one */ - CF2_SET_ERROR( arrstack->error, Out_Of_Memory ); - - return FALSE; - } - - - /* set the count, ensuring allocation is sufficient */ - FT_LOCAL_DEF( void ) - cf2_arrstack_setCount( CF2_ArrStack arrstack, - size_t numElements ) - { - FT_ASSERT( arrstack != NULL ); - - if ( numElements > arrstack->allocated ) - { - /* expand the allocation first */ - if ( !cf2_arrstack_setNumElements( arrstack, numElements ) ) - return; - } - - arrstack->count = numElements; - } - - - /* clear the count */ - FT_LOCAL_DEF( void ) - cf2_arrstack_clear( CF2_ArrStack arrstack ) - { - FT_ASSERT( arrstack != NULL ); - - arrstack->count = 0; - } - - - /* current number of items */ - FT_LOCAL_DEF( size_t ) - cf2_arrstack_size( const CF2_ArrStack arrstack ) - { - FT_ASSERT( arrstack != NULL ); - - return arrstack->count; - } - - - FT_LOCAL_DEF( void* ) - cf2_arrstack_getBuffer( const CF2_ArrStack arrstack ) - { - FT_ASSERT( arrstack != NULL ); - - return arrstack->ptr; - } - - - /* return pointer to the given element */ - FT_LOCAL_DEF( void* ) - cf2_arrstack_getPointer( const CF2_ArrStack arrstack, - size_t idx ) - { - void* newPtr; - - - FT_ASSERT( arrstack != NULL ); - - if ( idx >= arrstack->count ) - { - /* overflow */ - CF2_SET_ERROR( arrstack->error, Stack_Overflow ); - idx = 0; /* choose safe default */ - } - - newPtr = (FT_Byte*)arrstack->ptr + idx * arrstack->sizeItem; - - return newPtr; - } - - - /* push (append) an element at the end of the list; */ - /* return false on memory error */ - /* TODO: should there be a length param for extra checking? */ - FT_LOCAL_DEF( void ) - cf2_arrstack_push( CF2_ArrStack arrstack, - const void* ptr ) - { - FT_ASSERT( arrstack != NULL ); - - if ( arrstack->count == arrstack->allocated ) - { - /* grow the buffer by one chunk */ - if ( !cf2_arrstack_setNumElements( - arrstack, arrstack->allocated + arrstack->chunk ) ) - { - /* on error, ignore the push */ - return; - } - } - - FT_ASSERT( ptr != NULL ); - - { - size_t offset = arrstack->count * arrstack->sizeItem; - void* newPtr = (FT_Byte*)arrstack->ptr + offset; - - - FT_MEM_COPY( newPtr, ptr, arrstack->sizeItem ); - arrstack->count += 1; - } - } - - -/* END */ diff --git a/3party/freetype/src/cff/cf2arrst.h b/3party/freetype/src/cff/cf2arrst.h deleted file mode 100644 index ff5ad8b126..0000000000 --- a/3party/freetype/src/cff/cf2arrst.h +++ /dev/null @@ -1,100 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2arrst.h */ -/* */ -/* Adobe's code for Array Stacks (specification). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2ARRST_H__ -#define __CF2ARRST_H__ - - -#include "cf2error.h" - - -FT_BEGIN_HEADER - - - /* need to define the struct here (not opaque) so it can be allocated by */ - /* clients */ - typedef struct CF2_ArrStackRec_ - { - FT_Memory memory; - FT_Error* error; - - size_t sizeItem; /* bytes per element */ - size_t allocated; /* items allocated */ - size_t chunk; /* allocation increment in items */ - size_t count; /* number of elements allocated */ - size_t totalSize; /* total bytes allocated */ - - void* ptr; /* ptr to data */ - - } CF2_ArrStackRec, *CF2_ArrStack; - - - FT_LOCAL( void ) - cf2_arrstack_init( CF2_ArrStack arrstack, - FT_Memory memory, - FT_Error* error, - size_t sizeItem ); - FT_LOCAL( void ) - cf2_arrstack_finalize( CF2_ArrStack arrstack ); - - FT_LOCAL( void ) - cf2_arrstack_setCount( CF2_ArrStack arrstack, - size_t numElements ); - FT_LOCAL( void ) - cf2_arrstack_clear( CF2_ArrStack arrstack ); - FT_LOCAL( size_t ) - cf2_arrstack_size( const CF2_ArrStack arrstack ); - - FT_LOCAL( void* ) - cf2_arrstack_getBuffer( const CF2_ArrStack arrstack ); - FT_LOCAL( void* ) - cf2_arrstack_getPointer( const CF2_ArrStack arrstack, - size_t idx ); - - FT_LOCAL( void ) - cf2_arrstack_push( CF2_ArrStack arrstack, - const void* ptr ); - - -FT_END_HEADER - - -#endif /* __CF2ARRST_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cf2blues.c b/3party/freetype/src/cff/cf2blues.c deleted file mode 100644 index 250f89e0df..0000000000 --- a/3party/freetype/src/cff/cf2blues.c +++ /dev/null @@ -1,579 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2blues.c */ -/* */ -/* Adobe's code for handling Blue Zones (body). */ -/* */ -/* Copyright 2009-2014 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2blues.h" -#include "cf2hints.h" -#include "cf2font.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cf2blues - - - /* - * For blue values, the FreeType parser produces an array of integers, - * while the Adobe CFF engine produces an array of fixed. - * Define a macro to convert FreeType to fixed. - */ -#define cf2_blueToFixed( x ) cf2_intToFixed( x ) - - - FT_LOCAL_DEF( void ) - cf2_blues_init( CF2_Blues blues, - CF2_Font font ) - { - /* pointer to parsed font object */ - CFF_Decoder* decoder = font->decoder; - - CF2_Fixed zoneHeight; - CF2_Fixed maxZoneHeight = 0; - CF2_Fixed csUnitsPerPixel; - - size_t numBlueValues; - size_t numOtherBlues; - size_t numFamilyBlues; - size_t numFamilyOtherBlues; - - FT_Pos* blueValues; - FT_Pos* otherBlues; - FT_Pos* familyBlues; - FT_Pos* familyOtherBlues; - - size_t i; - CF2_Fixed emBoxBottom, emBoxTop; - -#if 0 - CF2_Int unitsPerEm = font->unitsPerEm; - - - if ( unitsPerEm == 0 ) - unitsPerEm = 1000; -#endif - - FT_ZERO( blues ); - blues->scale = font->innerTransform.d; - - cf2_getBlueMetrics( decoder, - &blues->blueScale, - &blues->blueShift, - &blues->blueFuzz ); - - cf2_getBlueValues( decoder, &numBlueValues, &blueValues ); - cf2_getOtherBlues( decoder, &numOtherBlues, &otherBlues ); - cf2_getFamilyBlues( decoder, &numFamilyBlues, &familyBlues ); - cf2_getFamilyOtherBlues( decoder, &numFamilyOtherBlues, &familyOtherBlues ); - - /* - * synthetic em box hint heuristic - * - * Apply this when ideographic dictionary (LanguageGroup 1) has no - * real alignment zones. Adobe tools generate dummy zones at -250 and - * 1100 for a 1000 unit em. Fonts with ICF-based alignment zones - * should not enable the heuristic. When the heuristic is enabled, - * the font's blue zones are ignored. - * - */ - - /* get em box from OS/2 typoAscender/Descender */ - /* TODO: FreeType does not parse these metrics. Skip them for now. */ -#if 0 - FCM_getHorizontalLineMetrics( &e, - font->font, - &ascender, - &descender, - &linegap ); - if ( ascender - descender == unitsPerEm ) - { - emBoxBottom = cf2_intToFixed( descender ); - emBoxTop = cf2_intToFixed( ascender ); - } - else -#endif - { - emBoxBottom = CF2_ICF_Bottom; - emBoxTop = CF2_ICF_Top; - } - - if ( cf2_getLanguageGroup( decoder ) == 1 && - ( numBlueValues == 0 || - ( numBlueValues == 4 && - cf2_blueToFixed( blueValues[0] ) < emBoxBottom && - cf2_blueToFixed( blueValues[1] ) < emBoxBottom && - cf2_blueToFixed( blueValues[2] ) > emBoxTop && - cf2_blueToFixed( blueValues[3] ) > emBoxTop ) ) ) - { - /* - * Construct hint edges suitable for synthetic ghost hints at top - * and bottom of em box. +-CF2_MIN_COUNTER allows for unhinted - * features above or below the last hinted edge. This also gives a - * net 1 pixel boost to the height of ideographic glyphs. - * - * Note: Adjust synthetic hints outward by epsilon (0x.0001) to - * avoid interference. E.g., some fonts have real hints at - * 880 and -120. - */ - - blues->emBoxBottomEdge.csCoord = emBoxBottom - CF2_FIXED_EPSILON; - blues->emBoxBottomEdge.dsCoord = cf2_fixedRound( - FT_MulFix( - blues->emBoxBottomEdge.csCoord, - blues->scale ) ) - - CF2_MIN_COUNTER; - blues->emBoxBottomEdge.scale = blues->scale; - blues->emBoxBottomEdge.flags = CF2_GhostBottom | - CF2_Locked | - CF2_Synthetic; - - blues->emBoxTopEdge.csCoord = emBoxTop + CF2_FIXED_EPSILON + - 2 * font->darkenY; - blues->emBoxTopEdge.dsCoord = cf2_fixedRound( - FT_MulFix( - blues->emBoxTopEdge.csCoord, - blues->scale ) ) + - CF2_MIN_COUNTER; - blues->emBoxTopEdge.scale = blues->scale; - blues->emBoxTopEdge.flags = CF2_GhostTop | - CF2_Locked | - CF2_Synthetic; - - blues->doEmBoxHints = TRUE; /* enable the heuristic */ - - return; - } - - /* copy `BlueValues' and `OtherBlues' to a combined array of top and */ - /* bottom zones */ - for ( i = 0; i < numBlueValues; i += 2 ) - { - blues->zone[blues->count].csBottomEdge = - cf2_blueToFixed( blueValues[i] ); - blues->zone[blues->count].csTopEdge = - cf2_blueToFixed( blueValues[i + 1] ); - - zoneHeight = blues->zone[blues->count].csTopEdge - - blues->zone[blues->count].csBottomEdge; - - if ( zoneHeight < 0 ) - { - FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" )); - continue; /* reject this zone */ - } - - if ( zoneHeight > maxZoneHeight ) - { - /* take maximum before darkening adjustment */ - /* so overshoot suppression point doesn't change */ - maxZoneHeight = zoneHeight; - } - - /* adjust both edges of top zone upward by twice darkening amount */ - if ( i != 0 ) - { - blues->zone[blues->count].csTopEdge += 2 * font->darkenY; - blues->zone[blues->count].csBottomEdge += 2 * font->darkenY; - } - - /* first `BlueValue' is bottom zone; others are top */ - if ( i == 0 ) - { - blues->zone[blues->count].bottomZone = - TRUE; - blues->zone[blues->count].csFlatEdge = - blues->zone[blues->count].csTopEdge; - } - else - { - blues->zone[blues->count].bottomZone = - FALSE; - blues->zone[blues->count].csFlatEdge = - blues->zone[blues->count].csBottomEdge; - } - - blues->count += 1; - } - - for ( i = 0; i < numOtherBlues; i += 2 ) - { - blues->zone[blues->count].csBottomEdge = - cf2_blueToFixed( otherBlues[i] ); - blues->zone[blues->count].csTopEdge = - cf2_blueToFixed( otherBlues[i + 1] ); - - zoneHeight = blues->zone[blues->count].csTopEdge - - blues->zone[blues->count].csBottomEdge; - - if ( zoneHeight < 0 ) - { - FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" )); - continue; /* reject this zone */ - } - - if ( zoneHeight > maxZoneHeight ) - { - /* take maximum before darkening adjustment */ - /* so overshoot suppression point doesn't change */ - maxZoneHeight = zoneHeight; - } - - /* Note: bottom zones are not adjusted for darkening amount */ - - /* all OtherBlues are bottom zone */ - blues->zone[blues->count].bottomZone = - TRUE; - blues->zone[blues->count].csFlatEdge = - blues->zone[blues->count].csTopEdge; - - blues->count += 1; - } - - /* Adjust for FamilyBlues */ - - /* Search for the nearest flat edge in `FamilyBlues' or */ - /* `FamilyOtherBlues'. According to the Black Book, any matching edge */ - /* must be within one device pixel */ - - csUnitsPerPixel = FT_DivFix( cf2_intToFixed( 1 ), blues->scale ); - - /* loop on all zones in this font */ - for ( i = 0; i < blues->count; i++ ) - { - size_t j; - CF2_Fixed minDiff; - CF2_Fixed flatFamilyEdge, diff; - /* value for this font */ - CF2_Fixed flatEdge = blues->zone[i].csFlatEdge; - - - if ( blues->zone[i].bottomZone ) - { - /* In a bottom zone, the top edge is the flat edge. */ - /* Search `FamilyOtherBlues' for bottom zones; look for closest */ - /* Family edge that is within the one pixel threshold. */ - - minDiff = CF2_FIXED_MAX; - - for ( j = 0; j < numFamilyOtherBlues; j += 2 ) - { - /* top edge */ - flatFamilyEdge = cf2_blueToFixed( familyOtherBlues[j + 1] ); - - diff = cf2_fixedAbs( flatEdge - flatFamilyEdge ); - - if ( diff < minDiff && diff < csUnitsPerPixel ) - { - blues->zone[i].csFlatEdge = flatFamilyEdge; - minDiff = diff; - - if ( diff == 0 ) - break; - } - } - - /* check the first member of FamilyBlues, which is a bottom zone */ - if ( numFamilyBlues >= 2 ) - { - /* top edge */ - flatFamilyEdge = cf2_blueToFixed( familyBlues[1] ); - - diff = cf2_fixedAbs( flatEdge - flatFamilyEdge ); - - if ( diff < minDiff && diff < csUnitsPerPixel ) - blues->zone[i].csFlatEdge = flatFamilyEdge; - } - } - else - { - /* In a top zone, the bottom edge is the flat edge. */ - /* Search `FamilyBlues' for top zones; skip first zone, which is a */ - /* bottom zone; look for closest Family edge that is within the */ - /* one pixel threshold */ - - minDiff = CF2_FIXED_MAX; - - for ( j = 2; j < numFamilyBlues; j += 2 ) - { - /* bottom edge */ - flatFamilyEdge = cf2_blueToFixed( familyBlues[j] ); - - /* adjust edges of top zone upward by twice darkening amount */ - flatFamilyEdge += 2 * font->darkenY; /* bottom edge */ - - diff = cf2_fixedAbs( flatEdge - flatFamilyEdge ); - - if ( diff < minDiff && diff < csUnitsPerPixel ) - { - blues->zone[i].csFlatEdge = flatFamilyEdge; - minDiff = diff; - - if ( diff == 0 ) - break; - } - } - } - } - - /* TODO: enforce separation of zones, including BlueFuzz */ - - /* Adjust BlueScale; similar to AdjustBlueScale() in coretype */ - /* `bcsetup.c'. */ - - if ( maxZoneHeight > 0 ) - { - if ( blues->blueScale > FT_DivFix( cf2_intToFixed( 1 ), - maxZoneHeight ) ) - { - /* clamp at maximum scale */ - blues->blueScale = FT_DivFix( cf2_intToFixed( 1 ), - maxZoneHeight ); - } - - /* - * TODO: Revisit the bug fix for 613448. The minimum scale - * requirement catches a number of library fonts. For - * example, with default BlueScale (.039625) and 0.4 minimum, - * the test below catches any font with maxZoneHeight < 10.1. - * There are library fonts ranging from 2 to 10 that get - * caught, including e.g., Eurostile LT Std Medium with - * maxZoneHeight of 6. - * - */ -#if 0 - if ( blueScale < .4 / maxZoneHeight ) - { - tetraphilia_assert( 0 ); - /* clamp at minimum scale, per bug 0613448 fix */ - blueScale = .4 / maxZoneHeight; - } -#endif - - } - - /* - * Suppress overshoot and boost blue zones at small sizes. Boost - * amount varies linearly from 0.5 pixel near 0 to 0 pixel at - * blueScale cutoff. - * Note: This boost amount is different from the coretype heuristic. - * - */ - - if ( blues->scale < blues->blueScale ) - { - blues->suppressOvershoot = TRUE; - - /* Change rounding threshold for `dsFlatEdge'. */ - /* Note: constant changed from 0.5 to 0.6 to avoid a problem with */ - /* 10ppem Arial */ - - blues->boost = cf2_floatToFixed( .6 ) - - FT_MulDiv( cf2_floatToFixed ( .6 ), - blues->scale, - blues->blueScale ); - if ( blues->boost > 0x7FFF ) - { - /* boost must remain less than 0.5, or baseline could go negative */ - blues->boost = 0x7FFF; - } - } - - /* boost and darkening have similar effects; don't do both */ - if ( font->stemDarkened ) - blues->boost = 0; - - /* set device space alignment for each zone; */ - /* apply boost amount before rounding flat edge */ - - for ( i = 0; i < blues->count; i++ ) - { - if ( blues->zone[i].bottomZone ) - blues->zone[i].dsFlatEdge = cf2_fixedRound( - FT_MulFix( - blues->zone[i].csFlatEdge, - blues->scale ) - - blues->boost ); - else - blues->zone[i].dsFlatEdge = cf2_fixedRound( - FT_MulFix( - blues->zone[i].csFlatEdge, - blues->scale ) + - blues->boost ); - } - } - - - /* - * Check whether `stemHint' is captured by one of the blue zones. - * - * Zero, one or both edges may be valid; only valid edges can be - * captured. For compatibility with CoolType, search top and bottom - * zones in the same pass (see `BlueLock'). If a hint is captured, - * return true and position the edge(s) in one of 3 ways: - * - * 1) If `BlueScale' suppresses overshoot, position the captured edge - * at the flat edge of the zone. - * 2) If overshoot is not suppressed and `BlueShift' requires - * overshoot, position the captured edge a minimum of 1 device pixel - * from the flat edge. - * 3) If overshoot is not suppressed or required, position the captured - * edge at the nearest device pixel. - * - */ - FT_LOCAL_DEF( FT_Bool ) - cf2_blues_capture( const CF2_Blues blues, - CF2_Hint bottomHintEdge, - CF2_Hint topHintEdge ) - { - /* TODO: validate? */ - CF2_Fixed csFuzz = blues->blueFuzz; - - /* new position of captured edge */ - CF2_Fixed dsNew; - - /* amount that hint is moved when positioned */ - CF2_Fixed dsMove = 0; - - FT_Bool captured = FALSE; - CF2_UInt i; - - - /* assert edge flags are consistent */ - FT_ASSERT( !cf2_hint_isTop( bottomHintEdge ) && - !cf2_hint_isBottom( topHintEdge ) ); - - /* TODO: search once without blue fuzz for compatibility with coretype? */ - for ( i = 0; i < blues->count; i++ ) - { - if ( blues->zone[i].bottomZone && - cf2_hint_isBottom( bottomHintEdge ) ) - { - if ( ( blues->zone[i].csBottomEdge - csFuzz ) <= - bottomHintEdge->csCoord && - bottomHintEdge->csCoord <= - ( blues->zone[i].csTopEdge + csFuzz ) ) - { - /* bottom edge captured by bottom zone */ - - if ( blues->suppressOvershoot ) - dsNew = blues->zone[i].dsFlatEdge; - - else if ( ( blues->zone[i].csTopEdge - bottomHintEdge->csCoord ) >= - blues->blueShift ) - { - /* guarantee minimum of 1 pixel overshoot */ - dsNew = FT_MIN( - cf2_fixedRound( bottomHintEdge->dsCoord ), - blues->zone[i].dsFlatEdge - cf2_intToFixed( 1 ) ); - } - - else - { - /* simply round captured edge */ - dsNew = cf2_fixedRound( bottomHintEdge->dsCoord ); - } - - dsMove = dsNew - bottomHintEdge->dsCoord; - captured = TRUE; - - break; - } - } - - if ( !blues->zone[i].bottomZone && cf2_hint_isTop( topHintEdge ) ) - { - if ( ( blues->zone[i].csBottomEdge - csFuzz ) <= - topHintEdge->csCoord && - topHintEdge->csCoord <= - ( blues->zone[i].csTopEdge + csFuzz ) ) - { - /* top edge captured by top zone */ - - if ( blues->suppressOvershoot ) - dsNew = blues->zone[i].dsFlatEdge; - - else if ( ( topHintEdge->csCoord - blues->zone[i].csBottomEdge ) >= - blues->blueShift ) - { - /* guarantee minimum of 1 pixel overshoot */ - dsNew = FT_MAX( - cf2_fixedRound( topHintEdge->dsCoord ), - blues->zone[i].dsFlatEdge + cf2_intToFixed( 1 ) ); - } - - else - { - /* simply round captured edge */ - dsNew = cf2_fixedRound( topHintEdge->dsCoord ); - } - - dsMove = dsNew - topHintEdge->dsCoord; - captured = TRUE; - - break; - } - } - } - - if ( captured ) - { - /* move both edges and flag them `locked' */ - if ( cf2_hint_isValid( bottomHintEdge ) ) - { - bottomHintEdge->dsCoord += dsMove; - cf2_hint_lock( bottomHintEdge ); - } - - if ( cf2_hint_isValid( topHintEdge ) ) - { - topHintEdge->dsCoord += dsMove; - cf2_hint_lock( topHintEdge ); - } - } - - return captured; - } - - -/* END */ diff --git a/3party/freetype/src/cff/cf2blues.h b/3party/freetype/src/cff/cf2blues.h deleted file mode 100644 index 2f38fcad8f..0000000000 --- a/3party/freetype/src/cff/cf2blues.h +++ /dev/null @@ -1,185 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2blues.h */ -/* */ -/* Adobe's code for handling Blue Zones (specification). */ -/* */ -/* Copyright 2009-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - - /* - * A `CF2_Blues' object stores the blue zones (horizontal alignment - * zones) of a font. These are specified in the CFF private dictionary - * by `BlueValues', `OtherBlues', `FamilyBlues', and `FamilyOtherBlues'. - * Each zone is defined by a top and bottom edge in character space. - * Further, each zone is either a top zone or a bottom zone, as recorded - * by `bottomZone'. - * - * The maximum number of `BlueValues' and `FamilyBlues' is 7 each. - * However, these are combined to produce a total of 7 zones. - * Similarly, the maximum number of `OtherBlues' and `FamilyOtherBlues' - * is 5 and these are combined to produce an additional 5 zones. - * - * Blue zones are used to `capture' hints and force them to a common - * alignment point. This alignment is recorded in device space in - * `dsFlatEdge'. Except for this value, a `CF2_Blues' object could be - * constructed independently of scaling. Construction may occur once - * the matrix is known. Other features implemented in the Capture - * method are overshoot suppression, overshoot enforcement, and Blue - * Boost. - * - * Capture is determined by `BlueValues' and `OtherBlues', but the - * alignment point may be adjusted to the scaled flat edge of - * `FamilyBlues' or `FamilyOtherBlues'. No alignment is done to the - * curved edge of a zone. - * - */ - - -#ifndef __CF2BLUES_H__ -#define __CF2BLUES_H__ - - -#include "cf2glue.h" - - -FT_BEGIN_HEADER - - - /* - * `CF2_Hint' is shared by `cf2hints.h' and - * `cf2blues.h', but `cf2blues.h' depends on - * `cf2hints.h', so define it here. Note: The typedef is in - * `cf2glue.h'. - * - */ - enum - { - CF2_GhostBottom = 0x1, /* a single bottom edge */ - CF2_GhostTop = 0x2, /* a single top edge */ - CF2_PairBottom = 0x4, /* the bottom edge of a stem hint */ - CF2_PairTop = 0x8, /* the top edge of a stem hint */ - CF2_Locked = 0x10, /* this edge has been aligned */ - /* by a blue zone */ - CF2_Synthetic = 0x20 /* this edge was synthesized */ - }; - - - /* - * Default value for OS/2 typoAscender/Descender when their difference - * is not equal to `unitsPerEm'. The default is based on -250 and 1100 - * in `CF2_Blues', assuming 1000 units per em here. - * - */ - enum - { - CF2_ICF_Top = cf2_intToFixed( 880 ), - CF2_ICF_Bottom = cf2_intToFixed( -120 ) - }; - - - /* - * Constant used for hint adjustment and for synthetic em box hint - * placement. - */ -#define CF2_MIN_COUNTER cf2_floatToFixed( 0.5 ) - - - /* shared typedef is in cf2glue.h */ - struct CF2_HintRec_ - { - CF2_UInt flags; /* attributes of the edge */ - size_t index; /* index in original stem hint array */ - /* (if not synthetic) */ - CF2_Fixed csCoord; - CF2_Fixed dsCoord; - CF2_Fixed scale; - }; - - - typedef struct CF2_BlueRec_ - { - CF2_Fixed csBottomEdge; - CF2_Fixed csTopEdge; - CF2_Fixed csFlatEdge; /* may be from either local or Family zones */ - CF2_Fixed dsFlatEdge; /* top edge of bottom zone or bottom edge */ - /* of top zone (rounded) */ - FT_Bool bottomZone; - - } CF2_BlueRec; - - - /* max total blue zones is 12 */ - enum - { - CF2_MAX_BLUES = 7, - CF2_MAX_OTHERBLUES = 5 - }; - - - typedef struct CF2_BluesRec_ - { - CF2_Fixed scale; - CF2_UInt count; - FT_Bool suppressOvershoot; - FT_Bool doEmBoxHints; - - CF2_Fixed blueScale; - CF2_Fixed blueShift; - CF2_Fixed blueFuzz; - - CF2_Fixed boost; - - CF2_HintRec emBoxTopEdge; - CF2_HintRec emBoxBottomEdge; - - CF2_BlueRec zone[CF2_MAX_BLUES + CF2_MAX_OTHERBLUES]; - - } CF2_BluesRec, *CF2_Blues; - - - FT_LOCAL( void ) - cf2_blues_init( CF2_Blues blues, - CF2_Font font ); - FT_LOCAL( FT_Bool ) - cf2_blues_capture( const CF2_Blues blues, - CF2_Hint bottomHintEdge, - CF2_Hint topHintEdge ); - - -FT_END_HEADER - - -#endif /* __CF2BLUES_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cf2error.c b/3party/freetype/src/cff/cf2error.c deleted file mode 100644 index b5595a3d1f..0000000000 --- a/3party/freetype/src/cff/cf2error.c +++ /dev/null @@ -1,52 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2error.c */ -/* */ -/* Adobe's code for error handling (body). */ -/* */ -/* Copyright 2006-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include "cf2error.h" - - - FT_LOCAL_DEF( void ) - cf2_setError( FT_Error* error, - FT_Error value ) - { - if ( error && *error == 0 ) - *error = value; - } - - -/* END */ diff --git a/3party/freetype/src/cff/cf2error.h b/3party/freetype/src/cff/cf2error.h deleted file mode 100644 index 6453ebcb7b..0000000000 --- a/3party/freetype/src/cff/cf2error.h +++ /dev/null @@ -1,119 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2error.h */ -/* */ -/* Adobe's code for error handling (specification). */ -/* */ -/* Copyright 2006-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2ERROR_H__ -#define __CF2ERROR_H__ - - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX CF2_Err_ -#define FT_ERR_BASE FT_Mod_Err_CF2 - - -#include FT_ERRORS_H -#include "cf2ft.h" - - -FT_BEGIN_HEADER - - - /* - * A poor-man error facility. - * - * This code being written in vanilla C, doesn't have the luxury of a - * language-supported exception mechanism such as the one available in - * Java. Instead, we are stuck with using error codes that must be - * carefully managed and preserved. However, it is convenient for us to - * model our error mechanism on a Java-like exception mechanism. - * When we assign an error code we are thus `throwing' an error. - * - * The perservation of an error code is done by coding convention. - * Upon a function call if the error code is anything other than - * `FT_Err_Ok', which is guaranteed to be zero, we - * will return without altering that error. This will allow the - * error to propogate and be handled at the appropriate location in - * the code. - * - * This allows a style of code where the error code is initialized - * up front and a block of calls are made with the error code only - * being checked after the block. If a new error occurs, the original - * error will be preserved and a functional no-op should result in any - * subsequent function that has an initial error code not equal to - * `FT_Err_Ok'. - * - * Errors are encoded by calling the `FT_THROW' macro. For example, - * - * { - * FT_Error e; - * - * - * ... - * e = FT_THROW( Out_Of_Memory ); - * } - * - */ - - - /* Set error code to a particular value. */ - FT_LOCAL( void ) - cf2_setError( FT_Error* error, - FT_Error value ); - - - /* - * A macro that conditionally sets an error code. - * - * This macro will first check whether `error' is set; - * if not, it will set it to `e'. - * - */ -#define CF2_SET_ERROR( error, e ) \ - cf2_setError( error, FT_THROW( e ) ) - - -FT_END_HEADER - - -#endif /* __CF2ERROR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cf2fixed.h b/3party/freetype/src/cff/cf2fixed.h deleted file mode 100644 index d6d9faf8e5..0000000000 --- a/3party/freetype/src/cff/cf2fixed.h +++ /dev/null @@ -1,95 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2fixed.h */ -/* */ -/* Adobe's code for Fixed Point Mathematics (specification only). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2FIXED_H__ -#define __CF2FIXED_H__ - - -FT_BEGIN_HEADER - - - /* rasterizer integer and fixed point arithmetic must be 32-bit */ - -#define CF2_Fixed CF2_F16Dot16 - typedef FT_Int32 CF2_Frac; /* 2.30 fixed point */ - - -#define CF2_FIXED_MAX ( (CF2_Fixed)0x7FFFFFFFL ) -#define CF2_FIXED_MIN ( (CF2_Fixed)0x80000000L ) -#define CF2_FIXED_ONE 0x10000L -#define CF2_FIXED_EPSILON 0x0001 - - /* in C 89, left and right shift of negative numbers is */ - /* implementation specific behaviour in the general case */ - -#define cf2_intToFixed( i ) \ - ( (CF2_Fixed)( (FT_UInt32)(i) << 16 ) ) -#define cf2_fixedToInt( x ) \ - ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) ) -#define cf2_fixedRound( x ) \ - ( (CF2_Fixed)( ( (FT_UInt32)(x) + 0x8000U ) & 0xFFFF0000UL ) ) -#define cf2_floatToFixed( f ) \ - ( (CF2_Fixed)( (f) * 65536.0 + 0.5 ) ) -#define cf2_fixedAbs( x ) \ - ( (x) < 0 ? -(x) : (x) ) -#define cf2_fixedFloor( x ) \ - ( (CF2_Fixed)( (FT_UInt32)(x) & 0xFFFF0000UL ) ) -#define cf2_fixedFraction( x ) \ - ( (x) - cf2_fixedFloor( x ) ) -#define cf2_fracToFixed( x ) \ - ( (x) < 0 ? -( ( -(x) + 0x2000 ) >> 14 ) \ - : ( ( (x) + 0x2000 ) >> 14 ) ) - - - /* signed numeric types */ - typedef enum CF2_NumberType_ - { - CF2_NumberFixed, /* 16.16 */ - CF2_NumberFrac, /* 2.30 */ - CF2_NumberInt /* 32.0 */ - - } CF2_NumberType; - - -FT_END_HEADER - - -#endif /* __CF2FIXED_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cf2font.c b/3party/freetype/src/cff/cf2font.c deleted file mode 100644 index 83fd348f2d..0000000000 --- a/3party/freetype/src/cff/cf2font.c +++ /dev/null @@ -1,512 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2font.c */ -/* */ -/* Adobe's code for font instances (body). */ -/* */ -/* Copyright 2007-2014 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_CALC_H - -#include "cf2ft.h" - -#include "cf2glue.h" -#include "cf2font.h" -#include "cf2error.h" -#include "cf2intrp.h" - - - /* Compute a stem darkening amount in character space. */ - static void - cf2_computeDarkening( CF2_Fixed emRatio, - CF2_Fixed ppem, - CF2_Fixed stemWidth, - CF2_Fixed* darkenAmount, - CF2_Fixed boldenAmount, - FT_Bool stemDarkened, - FT_Int* darkenParams ) - { - /* - * Total darkening amount is computed in 1000 unit character space - * using the modified 5 part curve as Adobe's Avalon rasterizer. - * The darkening amount is smaller for thicker stems. - * It becomes zero when the stem is thicker than 2.333 pixels. - * - * By default, we use - * - * darkenAmount = 0.4 pixels if scaledStem <= 0.5 pixels, - * darkenAmount = 0.275 pixels if 1 <= scaledStem <= 1.667 pixels, - * darkenAmount = 0 pixel if scaledStem >= 2.333 pixels, - * - * and piecewise linear in-between: - * - * - * darkening - * ^ - * | - * | (x1,y1) - * |--------+ - * | \ - * | \ - * | \ (x3,y3) - * | +----------+ - * | (x2,y2) \ - * | \ - * | \ - * | +----------------- - * | (x4,y4) - * +---------------------------------------------> stem - * thickness - * - * - * This corresponds to the following values for the - * `darkening-parameters' property: - * - * (x1, y1) = (500, 400) - * (x2, y2) = (1000, 275) - * (x3, y3) = (1667, 275) - * (x4, y4) = (2333, 0) - * - */ - - /* Internal calculations are done in units per thousand for */ - /* convenience. The x axis is scaled stem width in */ - /* thousandths of a pixel. That is, 1000 is 1 pixel. */ - /* The y axis is darkening amount in thousandths of a pixel.*/ - /* In the code, below, dividing by ppem and */ - /* adjusting for emRatio converts darkenAmount to character */ - /* space (font units). */ - CF2_Fixed stemWidthPer1000, scaledStem; - FT_Int logBase2; - - - *darkenAmount = 0; - - if ( boldenAmount == 0 && !stemDarkened ) - return; - - /* protect against range problems and divide by zero */ - if ( emRatio < cf2_floatToFixed( .01 ) ) - return; - - if ( stemDarkened ) - { - FT_Int x1 = darkenParams[0]; - FT_Int y1 = darkenParams[1]; - FT_Int x2 = darkenParams[2]; - FT_Int y2 = darkenParams[3]; - FT_Int x3 = darkenParams[4]; - FT_Int y3 = darkenParams[5]; - FT_Int x4 = darkenParams[6]; - FT_Int y4 = darkenParams[7]; - - - /* convert from true character space to 1000 unit character space; */ - /* add synthetic emboldening effect */ - - /* `stemWidthPer1000' will not overflow for a legitimate font */ - - stemWidthPer1000 = FT_MulFix( stemWidth + boldenAmount, emRatio ); - - /* `scaledStem' can easily overflow, so we must clamp its maximum */ - /* value; the test doesn't need to be precise, but must be */ - /* conservative. The clamp value (default 2333) where */ - /* `darkenAmount' is zero is well below the overflow value of */ - /* 32767. */ - /* */ - /* FT_MSB computes the integer part of the base 2 logarithm. The */ - /* number of bits for the product is 1 or 2 more than the sum of */ - /* logarithms; remembering that the 16 lowest bits of the fraction */ - /* are dropped this is correct to within a factor of almost 4. */ - /* For example, 0x80.0000 * 0x80.0000 = 0x4000.0000 is 23+23 and */ - /* is flagged as possible overflow because 0xFF.FFFF * 0xFF.FFFF = */ - /* 0xFFFF.FE00 is also 23+23. */ - - logBase2 = FT_MSB( (FT_UInt32)stemWidthPer1000 ) + - FT_MSB( (FT_UInt32)ppem ); - - if ( logBase2 >= 46 ) - /* possible overflow */ - scaledStem = cf2_intToFixed( x4 ); - else - scaledStem = FT_MulFix( stemWidthPer1000, ppem ); - - /* now apply the darkening parameters */ - - if ( scaledStem < cf2_intToFixed( x1 ) ) - *darkenAmount = FT_DivFix( cf2_intToFixed( y1 ), ppem ); - - else if ( scaledStem < cf2_intToFixed( x2 ) ) - { - FT_Int xdelta = x2 - x1; - FT_Int ydelta = y2 - y1; - FT_Int x = stemWidthPer1000 - - FT_DivFix( cf2_intToFixed( x1 ), ppem ); - - - if ( !xdelta ) - goto Try_x3; - - *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) + - FT_DivFix( cf2_intToFixed( y1 ), ppem ); - } - - else if ( scaledStem < cf2_intToFixed( x3 ) ) - { - Try_x3: - { - FT_Int xdelta = x3 - x2; - FT_Int ydelta = y3 - y2; - FT_Int x = stemWidthPer1000 - - FT_DivFix( cf2_intToFixed( x2 ), ppem ); - - - if ( !xdelta ) - goto Try_x4; - - *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) + - FT_DivFix( cf2_intToFixed( y2 ), ppem ); - } - } - - else if ( scaledStem < cf2_intToFixed( x4 ) ) - { - Try_x4: - { - FT_Int xdelta = x4 - x3; - FT_Int ydelta = y4 - y3; - FT_Int x = stemWidthPer1000 - - FT_DivFix( cf2_intToFixed( x3 ), ppem ); - - - if ( !xdelta ) - goto Use_y4; - - *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) + - FT_DivFix( cf2_intToFixed( y3 ), ppem ); - } - } - - else - { - Use_y4: - *darkenAmount = FT_DivFix( cf2_intToFixed( y4 ), ppem ); - } - - /* use half the amount on each side and convert back to true */ - /* character space */ - *darkenAmount = FT_DivFix( *darkenAmount, 2 * emRatio ); - } - - /* add synthetic emboldening effect in character space */ - *darkenAmount += boldenAmount / 2; - } - - - /* set up values for the current FontDict and matrix */ - - /* caller's transform is adjusted for subpixel positioning */ - static void - cf2_font_setup( CF2_Font font, - const CF2_Matrix* transform ) - { - /* pointer to parsed font object */ - CFF_Decoder* decoder = font->decoder; - - FT_Bool needExtraSetup = FALSE; - - /* character space units */ - CF2_Fixed boldenX = font->syntheticEmboldeningAmountX; - CF2_Fixed boldenY = font->syntheticEmboldeningAmountY; - - CFF_SubFont subFont; - CF2_Fixed ppem; - - - /* clear previous error */ - font->error = FT_Err_Ok; - - /* if a CID fontDict has changed, we need to recompute some cached */ - /* data */ - subFont = cf2_getSubfont( decoder ); - if ( font->lastSubfont != subFont ) - { - font->lastSubfont = subFont; - needExtraSetup = TRUE; - } - - /* if ppem has changed, we need to recompute some cached data */ - /* note: because of CID font matrix concatenation, ppem and transform */ - /* do not necessarily track. */ - ppem = cf2_getPpemY( decoder ); - if ( font->ppem != ppem ) - { - font->ppem = ppem; - needExtraSetup = TRUE; - } - - /* copy hinted flag on each call */ - font->hinted = (FT_Bool)( font->renderingFlags & CF2_FlagsHinted ); - - /* determine if transform has changed; */ - /* include Fontmatrix but ignore translation */ - if ( ft_memcmp( transform, - &font->currentTransform, - 4 * sizeof ( CF2_Fixed ) ) != 0 ) - { - /* save `key' information for `cache of one' matrix data; */ - /* save client transform, without the translation */ - font->currentTransform = *transform; - font->currentTransform.tx = - font->currentTransform.ty = cf2_intToFixed( 0 ); - - /* TODO: FreeType transform is simple scalar; for now, use identity */ - /* for outer */ - font->innerTransform = *transform; - font->outerTransform.a = - font->outerTransform.d = cf2_intToFixed( 1 ); - font->outerTransform.b = - font->outerTransform.c = cf2_intToFixed( 0 ); - - needExtraSetup = TRUE; - } - - /* - * font->darkened is set to true if there is a stem darkening request or - * the font is synthetic emboldened. - * font->darkened controls whether to adjust blue zones, winding order, - * and hinting. - * - */ - if ( font->stemDarkened != ( font->renderingFlags & CF2_FlagsDarkened ) ) - { - font->stemDarkened = - (FT_Bool)( font->renderingFlags & CF2_FlagsDarkened ); - - /* blue zones depend on darkened flag */ - needExtraSetup = TRUE; - } - - /* recompute variables that are dependent on transform or FontDict or */ - /* darken flag */ - if ( needExtraSetup ) - { - /* StdVW is found in the private dictionary; */ - /* recompute darkening amounts whenever private dictionary or */ - /* transform change */ - /* Note: a rendering flag turns darkening on or off, so we want to */ - /* store the `on' amounts; */ - /* darkening amount is computed in character space */ - /* TODO: testing size-dependent darkening here; */ - /* what to do for rotations? */ - - CF2_Fixed emRatio; - CF2_Fixed stdHW; - CF2_Int unitsPerEm = font->unitsPerEm; - - - if ( unitsPerEm == 0 ) - unitsPerEm = 1000; - - ppem = FT_MAX( cf2_intToFixed( 4 ), - font->ppem ); /* use minimum ppem of 4 */ - -#if 0 - /* since vstem is measured in the x-direction, we use the `a' member */ - /* of the fontMatrix */ - emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->a ); -#endif - - /* Freetype does not preserve the fontMatrix when parsing; use */ - /* unitsPerEm instead. */ - /* TODO: check precision of this */ - emRatio = cf2_intToFixed( 1000 ) / unitsPerEm; - font->stdVW = cf2_getStdVW( decoder ); - - if ( font->stdVW <= 0 ) - font->stdVW = FT_DivFix( cf2_intToFixed( 75 ), emRatio ); - - if ( boldenX > 0 ) - { - /* Ensure that boldenX is at least 1 pixel for synthetic bold font */ - /* (similar to what Avalon does) */ - boldenX = FT_MAX( boldenX, - FT_DivFix( cf2_intToFixed( unitsPerEm ), ppem ) ); - - /* Synthetic emboldening adds at least 1 pixel to darkenX, while */ - /* stem darkening adds at most half pixel. Since the purpose of */ - /* stem darkening (readability at small sizes) is met with */ - /* synthetic emboldening, no need to add stem darkening for a */ - /* synthetic bold font. */ - cf2_computeDarkening( emRatio, - ppem, - font->stdVW, - &font->darkenX, - boldenX, - FALSE, - font->darkenParams ); - } - else - cf2_computeDarkening( emRatio, - ppem, - font->stdVW, - &font->darkenX, - 0, - font->stemDarkened, - font->darkenParams ); - -#if 0 - /* since hstem is measured in the y-direction, we use the `d' member */ - /* of the fontMatrix */ - /* TODO: use the same units per em as above; check this */ - emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->d ); -#endif - - /* set the default stem width, because it must be the same for all */ - /* family members; */ - /* choose a constant for StdHW that depends on font contrast */ - stdHW = cf2_getStdHW( decoder ); - - if ( stdHW > 0 && font->stdVW > 2 * stdHW ) - font->stdHW = FT_DivFix( cf2_intToFixed( 75 ), emRatio ); - else - { - /* low contrast font gets less hstem darkening */ - font->stdHW = FT_DivFix( cf2_intToFixed( 110 ), emRatio ); - } - - cf2_computeDarkening( emRatio, - ppem, - font->stdHW, - &font->darkenY, - boldenY, - font->stemDarkened, - font->darkenParams ); - - if ( font->darkenX != 0 || font->darkenY != 0 ) - font->darkened = TRUE; - else - font->darkened = FALSE; - - font->reverseWinding = FALSE; /* initial expectation is CCW */ - - /* compute blue zones for this instance */ - cf2_blues_init( &font->blues, font ); - } - } - - - /* equivalent to AdobeGetOutline */ - FT_LOCAL_DEF( FT_Error ) - cf2_getGlyphOutline( CF2_Font font, - CF2_Buffer charstring, - const CF2_Matrix* transform, - CF2_F16Dot16* glyphWidth ) - { - FT_Error lastError = FT_Err_Ok; - - FT_Vector translation; - -#if 0 - FT_Vector advancePoint; -#endif - - CF2_Fixed advWidth = 0; - FT_Bool needWinding; - - - /* Note: use both integer and fraction for outlines. This allows bbox */ - /* to come out directly. */ - - translation.x = transform->tx; - translation.y = transform->ty; - - /* set up values based on transform */ - cf2_font_setup( font, transform ); - if ( font->error ) - goto exit; /* setup encountered an error */ - - /* reset darken direction */ - font->reverseWinding = FALSE; - - /* winding order only affects darkening */ - needWinding = font->darkened; - - while ( 1 ) - { - /* reset output buffer */ - cf2_outline_reset( &font->outline ); - - /* build the outline, passing the full translation */ - cf2_interpT2CharString( font, - charstring, - (CF2_OutlineCallbacks)&font->outline, - &translation, - FALSE, - 0, - 0, - &advWidth ); - - if ( font->error ) - goto exit; - - if ( !needWinding ) - break; - - /* check winding order */ - if ( font->outline.root.windingMomentum >= 0 ) /* CFF is CCW */ - break; - - /* invert darkening and render again */ - /* TODO: this should be a parameter to getOutline-computeOffset */ - font->reverseWinding = TRUE; - - needWinding = FALSE; /* exit after next iteration */ - } - - /* finish storing client outline */ - cf2_outline_close( &font->outline ); - - exit: - /* FreeType just wants the advance width; there is no translation */ - *glyphWidth = advWidth; - - /* free resources and collect errors from objects we've used */ - cf2_setError( &font->error, lastError ); - - return font->error; - } - - -/* END */ diff --git a/3party/freetype/src/cff/cf2font.h b/3party/freetype/src/cff/cf2font.h deleted file mode 100644 index 86cf02f49d..0000000000 --- a/3party/freetype/src/cff/cf2font.h +++ /dev/null @@ -1,121 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2font.h */ -/* */ -/* Adobe's code for font instances (specification). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2FONT_H__ -#define __CF2FONT_H__ - - -#include "cf2ft.h" -#include "cf2blues.h" - - -FT_BEGIN_HEADER - - -#define CF2_OPERAND_STACK_SIZE 48 -#define CF2_MAX_SUBR 16 /* maximum subroutine nesting; */ - /* only 10 are allowed but there exist */ - /* fonts like `HiraKakuProN-W3.ttf' */ - /* (Hiragino Kaku Gothic ProN W3; */ - /* 8.2d6e1; 2014-12-19) that exceed */ - /* this limit */ - - - /* typedef is in `cf2glue.h' */ - struct CF2_FontRec_ - { - FT_Memory memory; - FT_Error error; /* shared error for this instance */ - - CF2_RenderingFlags renderingFlags; - - /* variables that depend on Transform: */ - /* the following have zero translation; */ - /* inner * outer = font * original */ - - CF2_Matrix currentTransform; /* original client matrix */ - CF2_Matrix innerTransform; /* for hinting; erect, scaled */ - CF2_Matrix outerTransform; /* post hinting; includes rotations */ - CF2_Fixed ppem; /* transform-dependent */ - - CF2_Int unitsPerEm; - - CF2_Fixed syntheticEmboldeningAmountX; /* character space units */ - CF2_Fixed syntheticEmboldeningAmountY; /* character space units */ - - /* FreeType related members */ - CF2_OutlineRec outline; /* freetype glyph outline functions */ - CFF_Decoder* decoder; - CFF_SubFont lastSubfont; /* FreeType parsed data; */ - /* top font or subfont */ - - /* these flags can vary from one call to the next */ - FT_Bool hinted; - FT_Bool darkened; /* true if stemDarkened or synthetic bold */ - /* i.e. darkenX != 0 || darkenY != 0 */ - FT_Bool stemDarkened; - - FT_Int darkenParams[8]; /* 1000 unit character space */ - - /* variables that depend on both FontDict and Transform */ - CF2_Fixed stdVW; /* in character space; depends on dict entry */ - CF2_Fixed stdHW; /* in character space; depends on dict entry */ - CF2_Fixed darkenX; /* character space units */ - CF2_Fixed darkenY; /* depends on transform */ - /* and private dict (StdVW) */ - FT_Bool reverseWinding; /* darken assuming */ - /* counterclockwise winding */ - - CF2_BluesRec blues; /* computed zone data */ - }; - - - FT_LOCAL( FT_Error ) - cf2_getGlyphOutline( CF2_Font font, - CF2_Buffer charstring, - const CF2_Matrix* transform, - CF2_F16Dot16* glyphWidth ); - - -FT_END_HEADER - - -#endif /* __CF2FONT_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cf2ft.c b/3party/freetype/src/cff/cf2ft.c deleted file mode 100644 index d2544a2345..0000000000 --- a/3party/freetype/src/cff/cf2ft.c +++ /dev/null @@ -1,700 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2ft.c */ -/* */ -/* FreeType Glue Component to Adobe's Interpreter (body). */ -/* */ -/* Copyright 2013-2014 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2font.h" -#include "cf2error.h" - - -#define CF2_MAX_SIZE cf2_intToFixed( 2000 ) /* max ppem */ - - - /* - * This check should avoid most internal overflow cases. Clients should - * generally respond to `Glyph_Too_Big' by getting a glyph outline - * at EM size, scaling it and filling it as a graphics operation. - * - */ - static FT_Error - cf2_checkTransform( const CF2_Matrix* transform, - CF2_Int unitsPerEm ) - { - CF2_Fixed maxScale; - - - FT_ASSERT( unitsPerEm > 0 ); - - if ( transform->a <= 0 || transform->d <= 0 ) - return FT_THROW( Invalid_Size_Handle ); - - FT_ASSERT( transform->b == 0 && transform->c == 0 ); - FT_ASSERT( transform->tx == 0 && transform->ty == 0 ); - - if ( unitsPerEm > 0x7FFF ) - return FT_THROW( Glyph_Too_Big ); - - maxScale = FT_DivFix( CF2_MAX_SIZE, cf2_intToFixed( unitsPerEm ) ); - - if ( transform->a > maxScale || transform->d > maxScale ) - return FT_THROW( Glyph_Too_Big ); - - return FT_Err_Ok; - } - - - static void - cf2_setGlyphWidth( CF2_Outline outline, - CF2_Fixed width ) - { - CFF_Decoder* decoder = outline->decoder; - - - FT_ASSERT( decoder ); - - decoder->glyph_width = cf2_fixedToInt( width ); - } - - - /* Clean up font instance. */ - static void - cf2_free_instance( void* ptr ) - { - CF2_Font font = (CF2_Font)ptr; - - - if ( font ) - { - FT_Memory memory = font->memory; - - - (void)memory; - } - } - - - /********************************************/ - /* */ - /* functions for handling client outline; */ - /* FreeType uses coordinates in 26.6 format */ - /* */ - /********************************************/ - - static void - cf2_builder_moveTo( CF2_OutlineCallbacks callbacks, - const CF2_CallbackParams params ) - { - /* downcast the object pointer */ - CF2_Outline outline = (CF2_Outline)callbacks; - CFF_Builder* builder; - - (void)params; /* only used in debug mode */ - - - FT_ASSERT( outline && outline->decoder ); - FT_ASSERT( params->op == CF2_PathOpMoveTo ); - - builder = &outline->decoder->builder; - - /* note: two successive moves simply close the contour twice */ - cff_builder_close_contour( builder ); - builder->path_begun = 0; - } - - - static void - cf2_builder_lineTo( CF2_OutlineCallbacks callbacks, - const CF2_CallbackParams params ) - { - FT_Error error; - - /* downcast the object pointer */ - CF2_Outline outline = (CF2_Outline)callbacks; - CFF_Builder* builder; - - - FT_ASSERT( outline && outline->decoder ); - FT_ASSERT( params->op == CF2_PathOpLineTo ); - - builder = &outline->decoder->builder; - - if ( !builder->path_begun ) - { - /* record the move before the line; also check points and set */ - /* `path_begun' */ - error = cff_builder_start_point( builder, - params->pt0.x, - params->pt0.y ); - if ( error ) - { - if ( !*callbacks->error ) - *callbacks->error = error; - return; - } - } - - /* `cff_builder_add_point1' includes a check_points call for one point */ - error = cff_builder_add_point1( builder, - params->pt1.x, - params->pt1.y ); - if ( error ) - { - if ( !*callbacks->error ) - *callbacks->error = error; - return; - } - } - - - static void - cf2_builder_cubeTo( CF2_OutlineCallbacks callbacks, - const CF2_CallbackParams params ) - { - FT_Error error; - - /* downcast the object pointer */ - CF2_Outline outline = (CF2_Outline)callbacks; - CFF_Builder* builder; - - - FT_ASSERT( outline && outline->decoder ); - FT_ASSERT( params->op == CF2_PathOpCubeTo ); - - builder = &outline->decoder->builder; - - if ( !builder->path_begun ) - { - /* record the move before the line; also check points and set */ - /* `path_begun' */ - error = cff_builder_start_point( builder, - params->pt0.x, - params->pt0.y ); - if ( error ) - { - if ( !*callbacks->error ) - *callbacks->error = error; - return; - } - } - - /* prepare room for 3 points: 2 off-curve, 1 on-curve */ - error = cff_check_points( builder, 3 ); - if ( error ) - { - if ( !*callbacks->error ) - *callbacks->error = error; - return; - } - - cff_builder_add_point( builder, - params->pt1.x, - params->pt1.y, 0 ); - cff_builder_add_point( builder, - params->pt2.x, - params->pt2.y, 0 ); - cff_builder_add_point( builder, - params->pt3.x, - params->pt3.y, 1 ); - } - - - static void - cf2_outline_init( CF2_Outline outline, - FT_Memory memory, - FT_Error* error ) - { - FT_MEM_ZERO( outline, sizeof ( CF2_OutlineRec ) ); - - outline->root.memory = memory; - outline->root.error = error; - - outline->root.moveTo = cf2_builder_moveTo; - outline->root.lineTo = cf2_builder_lineTo; - outline->root.cubeTo = cf2_builder_cubeTo; - } - - - /* get scaling and hint flag from GlyphSlot */ - static void - cf2_getScaleAndHintFlag( CFF_Decoder* decoder, - CF2_Fixed* x_scale, - CF2_Fixed* y_scale, - FT_Bool* hinted, - FT_Bool* scaled ) - { - FT_ASSERT( decoder && decoder->builder.glyph ); - - /* note: FreeType scale includes a factor of 64 */ - *hinted = decoder->builder.glyph->hint; - *scaled = decoder->builder.glyph->scaled; - - if ( *hinted ) - { - *x_scale = ( decoder->builder.glyph->x_scale + 32 ) / 64; - *y_scale = ( decoder->builder.glyph->y_scale + 32 ) / 64; - } - else - { - /* for unhinted outlines, `cff_slot_load' does the scaling, */ - /* thus render at `unity' scale */ - - *x_scale = 0x0400; /* 1/64 as 16.16 */ - *y_scale = 0x0400; - } - } - - - /* get units per em from `FT_Face' */ - /* TODO: should handle font matrix concatenation? */ - static FT_UShort - cf2_getUnitsPerEm( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->builder.face ); - FT_ASSERT( decoder->builder.face->root.units_per_EM ); - - return decoder->builder.face->root.units_per_EM; - } - - - /* Main entry point: Render one glyph. */ - FT_LOCAL_DEF( FT_Error ) - cf2_decoder_parse_charstrings( CFF_Decoder* decoder, - FT_Byte* charstring_base, - FT_ULong charstring_len ) - { - FT_Memory memory; - FT_Error error = FT_Err_Ok; - CF2_Font font; - - - FT_ASSERT( decoder && decoder->cff ); - - memory = decoder->builder.memory; - - /* CF2 data is saved here across glyphs */ - font = (CF2_Font)decoder->cff->cf2_instance.data; - - /* on first glyph, allocate instance structure */ - if ( decoder->cff->cf2_instance.data == NULL ) - { - decoder->cff->cf2_instance.finalizer = - (FT_Generic_Finalizer)cf2_free_instance; - - if ( FT_ALLOC( decoder->cff->cf2_instance.data, - sizeof ( CF2_FontRec ) ) ) - return FT_THROW( Out_Of_Memory ); - - font = (CF2_Font)decoder->cff->cf2_instance.data; - - font->memory = memory; - - /* initialize a client outline, to be shared by each glyph rendered */ - cf2_outline_init( &font->outline, font->memory, &font->error ); - } - - /* save decoder; it is a stack variable and will be different on each */ - /* call */ - font->decoder = decoder; - font->outline.decoder = decoder; - - { - /* build parameters for Adobe engine */ - - CFF_Builder* builder = &decoder->builder; - CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( builder->face ); - - /* local error */ - FT_Error error2 = FT_Err_Ok; - CF2_BufferRec buf; - CF2_Matrix transform; - CF2_F16Dot16 glyphWidth; - - FT_Bool hinted; - FT_Bool scaled; - - - /* FreeType has already looked up the GID; convert to */ - /* `RegionBuffer', assuming that the input has been validated */ - FT_ASSERT( charstring_base + charstring_len >= charstring_base ); - - FT_ZERO( &buf ); - buf.start = - buf.ptr = charstring_base; - buf.end = charstring_base + charstring_len; - - FT_ZERO( &transform ); - - cf2_getScaleAndHintFlag( decoder, - &transform.a, - &transform.d, - &hinted, - &scaled ); - - font->renderingFlags = 0; - if ( hinted ) - font->renderingFlags |= CF2_FlagsHinted; - if ( scaled && !driver->no_stem_darkening ) - font->renderingFlags |= CF2_FlagsDarkened; - - font->darkenParams[0] = driver->darken_params[0]; - font->darkenParams[1] = driver->darken_params[1]; - font->darkenParams[2] = driver->darken_params[2]; - font->darkenParams[3] = driver->darken_params[3]; - font->darkenParams[4] = driver->darken_params[4]; - font->darkenParams[5] = driver->darken_params[5]; - font->darkenParams[6] = driver->darken_params[6]; - font->darkenParams[7] = driver->darken_params[7]; - - /* now get an outline for this glyph; */ - /* also get units per em to validate scale */ - font->unitsPerEm = (CF2_Int)cf2_getUnitsPerEm( decoder ); - - if ( scaled ) - { - error2 = cf2_checkTransform( &transform, font->unitsPerEm ); - if ( error2 ) - return error2; - } - - error2 = cf2_getGlyphOutline( font, &buf, &transform, &glyphWidth ); - if ( error2 ) - return FT_ERR( Invalid_File_Format ); - - cf2_setGlyphWidth( &font->outline, glyphWidth ); - - return FT_Err_Ok; - } - } - - - /* get pointer to current FreeType subfont (based on current glyphID) */ - FT_LOCAL_DEF( CFF_SubFont ) - cf2_getSubfont( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - return decoder->current_subfont; - } - - - /* get `y_ppem' from `CFF_Size' */ - FT_LOCAL_DEF( CF2_Fixed ) - cf2_getPpemY( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && - decoder->builder.face && - decoder->builder.face->root.size ); - - /* - * Note that `y_ppem' can be zero if there wasn't a call to - * `FT_Set_Char_Size' or something similar. However, this isn't a - * problem since we come to this place in the code only if - * FT_LOAD_NO_SCALE is set (the other case gets caught by - * `cf2_checkTransform'). The ppem value is needed to compute the stem - * darkening, which is disabled for getting the unscaled outline. - * - */ - return cf2_intToFixed( - decoder->builder.face->root.size->metrics.y_ppem ); - } - - - /* get standard stem widths for the current subfont; */ - /* FreeType stores these as integer font units */ - /* (note: variable names seem swapped) */ - FT_LOCAL_DEF( CF2_Fixed ) - cf2_getStdVW( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - return cf2_intToFixed( - decoder->current_subfont->private_dict.standard_height ); - } - - - FT_LOCAL_DEF( CF2_Fixed ) - cf2_getStdHW( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - return cf2_intToFixed( - decoder->current_subfont->private_dict.standard_width ); - } - - - /* note: FreeType stores 1000 times the actual value for `BlueScale' */ - FT_LOCAL_DEF( void ) - cf2_getBlueMetrics( CFF_Decoder* decoder, - CF2_Fixed* blueScale, - CF2_Fixed* blueShift, - CF2_Fixed* blueFuzz ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - *blueScale = FT_DivFix( - decoder->current_subfont->private_dict.blue_scale, - cf2_intToFixed( 1000 ) ); - *blueShift = cf2_intToFixed( - decoder->current_subfont->private_dict.blue_shift ); - *blueFuzz = cf2_intToFixed( - decoder->current_subfont->private_dict.blue_fuzz ); - } - - - /* get blue values counts and arrays; the FreeType parser has validated */ - /* the counts and verified that each is an even number */ - FT_LOCAL_DEF( void ) - cf2_getBlueValues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - *count = decoder->current_subfont->private_dict.num_blue_values; - *data = (FT_Pos*) - &decoder->current_subfont->private_dict.blue_values; - } - - - FT_LOCAL_DEF( void ) - cf2_getOtherBlues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - *count = decoder->current_subfont->private_dict.num_other_blues; - *data = (FT_Pos*) - &decoder->current_subfont->private_dict.other_blues; - } - - - FT_LOCAL_DEF( void ) - cf2_getFamilyBlues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - *count = decoder->current_subfont->private_dict.num_family_blues; - *data = (FT_Pos*) - &decoder->current_subfont->private_dict.family_blues; - } - - - FT_LOCAL_DEF( void ) - cf2_getFamilyOtherBlues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - *count = decoder->current_subfont->private_dict.num_family_other_blues; - *data = (FT_Pos*) - &decoder->current_subfont->private_dict.family_other_blues; - } - - - FT_LOCAL_DEF( CF2_Int ) - cf2_getLanguageGroup( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - return decoder->current_subfont->private_dict.language_group; - } - - - /* convert unbiased subroutine index to `CF2_Buffer' and */ - /* return 0 on success */ - FT_LOCAL_DEF( CF2_Int ) - cf2_initGlobalRegionBuffer( CFF_Decoder* decoder, - CF2_UInt idx, - CF2_Buffer buf ) - { - FT_ASSERT( decoder ); - - FT_ZERO( buf ); - - idx += (CF2_UInt)decoder->globals_bias; - if ( idx >= decoder->num_globals ) - return TRUE; /* error */ - - FT_ASSERT( decoder->globals ); - - buf->start = - buf->ptr = decoder->globals[idx]; - buf->end = decoder->globals[idx + 1]; - - return FALSE; /* success */ - } - - - /* convert AdobeStandardEncoding code to CF2_Buffer; */ - /* used for seac component */ - FT_LOCAL_DEF( FT_Error ) - cf2_getSeacComponent( CFF_Decoder* decoder, - CF2_Int code, - CF2_Buffer buf ) - { - CF2_Int gid; - FT_Byte* charstring; - FT_ULong len; - FT_Error error; - - - FT_ASSERT( decoder ); - - FT_ZERO( buf ); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* Incremental fonts don't necessarily have valid charsets. */ - /* They use the character code, not the glyph index, in this case. */ - if ( decoder->builder.face->root.internal->incremental_interface ) - gid = code; - else -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - { - gid = cff_lookup_glyph_by_stdcharcode( decoder->cff, code ); - if ( gid < 0 ) - return FT_THROW( Invalid_Glyph_Format ); - } - - error = cff_get_glyph_data( decoder->builder.face, - (CF2_UInt)gid, - &charstring, - &len ); - /* TODO: for now, just pass the FreeType error through */ - if ( error ) - return error; - - /* assume input has been validated */ - FT_ASSERT( charstring + len >= charstring ); - - buf->start = charstring; - buf->end = charstring + len; - buf->ptr = buf->start; - - return FT_Err_Ok; - } - - - FT_LOCAL_DEF( void ) - cf2_freeSeacComponent( CFF_Decoder* decoder, - CF2_Buffer buf ) - { - FT_ASSERT( decoder ); - - cff_free_glyph_data( decoder->builder.face, - (FT_Byte**)&buf->start, - (FT_ULong)( buf->end - buf->start ) ); - } - - - FT_LOCAL_DEF( CF2_Int ) - cf2_initLocalRegionBuffer( CFF_Decoder* decoder, - CF2_UInt idx, - CF2_Buffer buf ) - { - FT_ASSERT( decoder ); - - FT_ZERO( buf ); - - idx += (CF2_UInt)decoder->locals_bias; - if ( idx >= decoder->num_locals ) - return TRUE; /* error */ - - FT_ASSERT( decoder->locals ); - - buf->start = - buf->ptr = decoder->locals[idx]; - buf->end = decoder->locals[idx + 1]; - - return FALSE; /* success */ - } - - - FT_LOCAL_DEF( CF2_Fixed ) - cf2_getDefaultWidthX( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - return cf2_intToFixed( - decoder->current_subfont->private_dict.default_width ); - } - - - FT_LOCAL_DEF( CF2_Fixed ) - cf2_getNominalWidthX( CFF_Decoder* decoder ) - { - FT_ASSERT( decoder && decoder->current_subfont ); - - return cf2_intToFixed( - decoder->current_subfont->private_dict.nominal_width ); - } - - - FT_LOCAL_DEF( void ) - cf2_outline_reset( CF2_Outline outline ) - { - CFF_Decoder* decoder = outline->decoder; - - - FT_ASSERT( decoder ); - - outline->root.windingMomentum = 0; - - FT_GlyphLoader_Rewind( decoder->builder.loader ); - } - - - FT_LOCAL_DEF( void ) - cf2_outline_close( CF2_Outline outline ) - { - CFF_Decoder* decoder = outline->decoder; - - - FT_ASSERT( decoder ); - - cff_builder_close_contour( &decoder->builder ); - - FT_GlyphLoader_Add( decoder->builder.loader ); - } - - -/* END */ diff --git a/3party/freetype/src/cff/cf2ft.h b/3party/freetype/src/cff/cf2ft.h deleted file mode 100644 index 3073df382f..0000000000 --- a/3party/freetype/src/cff/cf2ft.h +++ /dev/null @@ -1,147 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2ft.h */ -/* */ -/* FreeType Glue Component to Adobe's Interpreter (specification). */ -/* */ -/* Copyright 2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2FT_H__ -#define __CF2FT_H__ - - -#include "cf2types.h" - - - /* TODO: disable asserts for now */ -#define CF2_NDEBUG - - -#include FT_SYSTEM_H - -#include "cf2glue.h" -#include "cffgload.h" /* for CFF_Decoder */ - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - cf2_decoder_parse_charstrings( CFF_Decoder* decoder, - FT_Byte* charstring_base, - FT_ULong charstring_len ); - - FT_LOCAL( CFF_SubFont ) - cf2_getSubfont( CFF_Decoder* decoder ); - - - FT_LOCAL( CF2_Fixed ) - cf2_getPpemY( CFF_Decoder* decoder ); - FT_LOCAL( CF2_Fixed ) - cf2_getStdVW( CFF_Decoder* decoder ); - FT_LOCAL( CF2_Fixed ) - cf2_getStdHW( CFF_Decoder* decoder ); - - FT_LOCAL( void ) - cf2_getBlueMetrics( CFF_Decoder* decoder, - CF2_Fixed* blueScale, - CF2_Fixed* blueShift, - CF2_Fixed* blueFuzz ); - FT_LOCAL( void ) - cf2_getBlueValues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ); - FT_LOCAL( void ) - cf2_getOtherBlues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ); - FT_LOCAL( void ) - cf2_getFamilyBlues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ); - FT_LOCAL( void ) - cf2_getFamilyOtherBlues( CFF_Decoder* decoder, - size_t* count, - FT_Pos* *data ); - - FT_LOCAL( CF2_Int ) - cf2_getLanguageGroup( CFF_Decoder* decoder ); - - FT_LOCAL( CF2_Int ) - cf2_initGlobalRegionBuffer( CFF_Decoder* decoder, - CF2_UInt idx, - CF2_Buffer buf ); - FT_LOCAL( FT_Error ) - cf2_getSeacComponent( CFF_Decoder* decoder, - CF2_Int code, - CF2_Buffer buf ); - FT_LOCAL( void ) - cf2_freeSeacComponent( CFF_Decoder* decoder, - CF2_Buffer buf ); - FT_LOCAL( CF2_Int ) - cf2_initLocalRegionBuffer( CFF_Decoder* decoder, - CF2_UInt idx, - CF2_Buffer buf ); - - FT_LOCAL( CF2_Fixed ) - cf2_getDefaultWidthX( CFF_Decoder* decoder ); - FT_LOCAL( CF2_Fixed ) - cf2_getNominalWidthX( CFF_Decoder* decoder ); - - - /* - * FreeType client outline - * - * process output from the charstring interpreter - */ - typedef struct CF2_OutlineRec_ - { - CF2_OutlineCallbacksRec root; /* base class must be first */ - CFF_Decoder* decoder; - - } CF2_OutlineRec, *CF2_Outline; - - - FT_LOCAL( void ) - cf2_outline_reset( CF2_Outline outline ); - FT_LOCAL( void ) - cf2_outline_close( CF2_Outline outline ); - - -FT_END_HEADER - - -#endif /* __CF2FT_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cf2glue.h b/3party/freetype/src/cff/cf2glue.h deleted file mode 100644 index a24da39e93..0000000000 --- a/3party/freetype/src/cff/cf2glue.h +++ /dev/null @@ -1,144 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2glue.h */ -/* */ -/* Adobe's code for shared stuff (specification only). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2GLUE_H__ -#define __CF2GLUE_H__ - - -/* common includes for other modules */ -#include "cf2error.h" -#include "cf2fixed.h" -#include "cf2arrst.h" -#include "cf2read.h" - - -FT_BEGIN_HEADER - - - /* rendering parameters */ - - /* apply hints to rendered glyphs */ -#define CF2_FlagsHinted 1 - /* for testing */ -#define CF2_FlagsDarkened 2 - - /* type for holding the flags */ - typedef CF2_Int CF2_RenderingFlags; - - - /* elements of a glyph outline */ - typedef enum CF2_PathOp_ - { - CF2_PathOpMoveTo = 1, /* change the current point */ - CF2_PathOpLineTo = 2, /* line */ - CF2_PathOpQuadTo = 3, /* quadratic curve */ - CF2_PathOpCubeTo = 4 /* cubic curve */ - - } CF2_PathOp; - - - /* a matrix of fixed point values */ - typedef struct CF2_Matrix_ - { - CF2_F16Dot16 a; - CF2_F16Dot16 b; - CF2_F16Dot16 c; - CF2_F16Dot16 d; - CF2_F16Dot16 tx; - CF2_F16Dot16 ty; - - } CF2_Matrix; - - - /* these typedefs are needed by more than one header file */ - /* and gcc compiler doesn't allow redefinition */ - typedef struct CF2_FontRec_ CF2_FontRec, *CF2_Font; - typedef struct CF2_HintRec_ CF2_HintRec, *CF2_Hint; - - - /* A common structure for all callback parameters. */ - /* */ - /* Some members may be unused. For example, `pt0' is not used for */ - /* `moveTo' and `pt3' is not used for `quadTo'. The initial point `pt0' */ - /* is included for each path element for generality; curve conversions */ - /* need it. The `op' parameter allows one function to handle multiple */ - /* element types. */ - - typedef struct CF2_CallbackParamsRec_ - { - FT_Vector pt0; - FT_Vector pt1; - FT_Vector pt2; - FT_Vector pt3; - - CF2_Int op; - - } CF2_CallbackParamsRec, *CF2_CallbackParams; - - - /* forward reference */ - typedef struct CF2_OutlineCallbacksRec_ CF2_OutlineCallbacksRec, - *CF2_OutlineCallbacks; - - /* callback function pointers */ - typedef void - (*CF2_Callback_Type)( CF2_OutlineCallbacks callbacks, - const CF2_CallbackParams params ); - - - struct CF2_OutlineCallbacksRec_ - { - CF2_Callback_Type moveTo; - CF2_Callback_Type lineTo; - CF2_Callback_Type quadTo; - CF2_Callback_Type cubeTo; - - CF2_Int windingMomentum; /* for winding order detection */ - - FT_Memory memory; - FT_Error* error; - }; - - -FT_END_HEADER - - -#endif /* __CF2GLUE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cf2hints.c b/3party/freetype/src/cff/cf2hints.c deleted file mode 100644 index 0e27000210..0000000000 --- a/3party/freetype/src/cff/cf2hints.c +++ /dev/null @@ -1,1847 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2hints.c */ -/* */ -/* Adobe's code for handling CFF hints (body). */ -/* */ -/* Copyright 2007-2014 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2glue.h" -#include "cf2font.h" -#include "cf2hints.h" -#include "cf2intrp.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cf2hints - - - typedef struct CF2_HintMoveRec_ - { - size_t j; /* index of upper hint map edge */ - CF2_Fixed moveUp; /* adjustment to optimum position */ - - } CF2_HintMoveRec, *CF2_HintMove; - - - /* Compute angular momentum for winding order detection. It is called */ - /* for all lines and curves, but not necessarily in element order. */ - static CF2_Int - cf2_getWindingMomentum( CF2_Fixed x1, - CF2_Fixed y1, - CF2_Fixed x2, - CF2_Fixed y2 ) - { - /* cross product of pt1 position from origin with pt2 position from */ - /* pt1; we reduce the precision so that the result fits into 32 bits */ - - return ( x1 >> 16 ) * ( ( y2 - y1 ) >> 16 ) - - ( y1 >> 16 ) * ( ( x2 - x1 ) >> 16 ); - } - - - /* - * Construct from a StemHint; this is used as a parameter to - * `cf2_blues_capture'. - * `hintOrigin' is the character space displacement of a seac accent. - * Adjust stem hint for darkening here. - * - */ - static void - cf2_hint_init( CF2_Hint hint, - const CF2_ArrStack stemHintArray, - size_t indexStemHint, - const CF2_Font font, - CF2_Fixed hintOrigin, - CF2_Fixed scale, - FT_Bool bottom ) - { - CF2_Fixed width; - const CF2_StemHintRec* stemHint; - - - FT_ZERO( hint ); - - stemHint = (const CF2_StemHintRec*)cf2_arrstack_getPointer( - stemHintArray, - indexStemHint ); - - width = stemHint->max - stemHint->min; - - if ( width == cf2_intToFixed( -21 ) ) - { - /* ghost bottom */ - - if ( bottom ) - { - hint->csCoord = stemHint->max; - hint->flags = CF2_GhostBottom; - } - else - hint->flags = 0; - } - - else if ( width == cf2_intToFixed( -20 ) ) - { - /* ghost top */ - - if ( bottom ) - hint->flags = 0; - else - { - hint->csCoord = stemHint->min; - hint->flags = CF2_GhostTop; - } - } - - else if ( width < 0 ) - { - /* inverted pair */ - - /* - * Hints with negative widths were produced by an early version of a - * non-Adobe font tool. The Type 2 spec allows edge (ghost) hints - * with negative widths, but says - * - * All other negative widths have undefined meaning. - * - * CoolType has a silent workaround that negates the hint width; for - * permissive mode, we do the same here. - * - * Note: Such fonts cannot use ghost hints, but should otherwise work. - * Note: Some poor hints in our faux fonts can produce negative - * widths at some blends. For example, see a light weight of - * `u' in ASerifMM. - * - */ - if ( bottom ) - { - hint->csCoord = stemHint->max; - hint->flags = CF2_PairBottom; - } - else - { - hint->csCoord = stemHint->min; - hint->flags = CF2_PairTop; - } - } - - else - { - /* normal pair */ - - if ( bottom ) - { - hint->csCoord = stemHint->min; - hint->flags = CF2_PairBottom; - } - else - { - hint->csCoord = stemHint->max; - hint->flags = CF2_PairTop; - } - } - - /* Now that ghost hints have been detected, adjust this edge for */ - /* darkening. Bottoms are not changed; tops are incremented by twice */ - /* `darkenY'. */ - if ( cf2_hint_isTop( hint ) ) - hint->csCoord += 2 * font->darkenY; - - hint->csCoord += hintOrigin; - hint->scale = scale; - hint->index = indexStemHint; /* index in original stem hint array */ - - /* if original stem hint has been used, use the same position */ - if ( hint->flags != 0 && stemHint->used ) - { - if ( cf2_hint_isTop( hint ) ) - hint->dsCoord = stemHint->maxDS; - else - hint->dsCoord = stemHint->minDS; - - cf2_hint_lock( hint ); - } - else - hint->dsCoord = FT_MulFix( hint->csCoord, scale ); - } - - - /* initialize an invalid hint map element */ - static void - cf2_hint_initZero( CF2_Hint hint ) - { - FT_ZERO( hint ); - } - - - FT_LOCAL_DEF( FT_Bool ) - cf2_hint_isValid( const CF2_Hint hint ) - { - return (FT_Bool)( hint->flags != 0 ); - } - - - static FT_Bool - cf2_hint_isPair( const CF2_Hint hint ) - { - return (FT_Bool)( ( hint->flags & - ( CF2_PairBottom | CF2_PairTop ) ) != 0 ); - } - - - static FT_Bool - cf2_hint_isPairTop( const CF2_Hint hint ) - { - return (FT_Bool)( ( hint->flags & CF2_PairTop ) != 0 ); - } - - - FT_LOCAL_DEF( FT_Bool ) - cf2_hint_isTop( const CF2_Hint hint ) - { - return (FT_Bool)( ( hint->flags & - ( CF2_PairTop | CF2_GhostTop ) ) != 0 ); - } - - - FT_LOCAL_DEF( FT_Bool ) - cf2_hint_isBottom( const CF2_Hint hint ) - { - return (FT_Bool)( ( hint->flags & - ( CF2_PairBottom | CF2_GhostBottom ) ) != 0 ); - } - - - static FT_Bool - cf2_hint_isLocked( const CF2_Hint hint ) - { - return (FT_Bool)( ( hint->flags & CF2_Locked ) != 0 ); - } - - - static FT_Bool - cf2_hint_isSynthetic( const CF2_Hint hint ) - { - return (FT_Bool)( ( hint->flags & CF2_Synthetic ) != 0 ); - } - - - FT_LOCAL_DEF( void ) - cf2_hint_lock( CF2_Hint hint ) - { - hint->flags |= CF2_Locked; - } - - - FT_LOCAL_DEF( void ) - cf2_hintmap_init( CF2_HintMap hintmap, - CF2_Font font, - CF2_HintMap initialMap, - CF2_ArrStack hintMoves, - CF2_Fixed scale ) - { - FT_ZERO( hintmap ); - - /* copy parameters from font instance */ - hintmap->hinted = font->hinted; - hintmap->scale = scale; - hintmap->font = font; - hintmap->initialHintMap = initialMap; - /* will clear in `cf2_hintmap_adjustHints' */ - hintmap->hintMoves = hintMoves; - } - - - static FT_Bool - cf2_hintmap_isValid( const CF2_HintMap hintmap ) - { - return hintmap->isValid; - } - - - /* transform character space coordinate to device space using hint map */ - static CF2_Fixed - cf2_hintmap_map( CF2_HintMap hintmap, - CF2_Fixed csCoord ) - { - if ( hintmap->count == 0 || ! hintmap->hinted ) - { - /* there are no hints; use uniform scale and zero offset */ - return FT_MulFix( csCoord, hintmap->scale ); - } - else - { - /* start linear search from last hit */ - CF2_UInt i = hintmap->lastIndex; - - FT_ASSERT( hintmap->lastIndex < CF2_MAX_HINT_EDGES ); - - /* search up */ - while ( i < hintmap->count - 1 && - csCoord >= hintmap->edge[i + 1].csCoord ) - i += 1; - - /* search down */ - while ( i > 0 && csCoord < hintmap->edge[i].csCoord ) - i -= 1; - - hintmap->lastIndex = i; - - if ( i == 0 && csCoord < hintmap->edge[0].csCoord ) - { - /* special case for points below first edge: use uniform scale */ - return FT_MulFix( csCoord - hintmap->edge[0].csCoord, - hintmap->scale ) + - hintmap->edge[0].dsCoord; - } - else - { - /* - * Note: entries with duplicate csCoord are allowed. - * Use edge[i], the highest entry where csCoord >= entry[i].csCoord - */ - return FT_MulFix( csCoord - hintmap->edge[i].csCoord, - hintmap->edge[i].scale ) + - hintmap->edge[i].dsCoord; - } - } - } - - - /* - * This hinting policy moves a hint pair in device space so that one of - * its two edges is on a device pixel boundary (its fractional part is - * zero). `cf2_hintmap_insertHint' guarantees no overlap in CS - * space. Ensure here that there is no overlap in DS. - * - * In the first pass, edges are adjusted relative to adjacent hints. - * Those that are below have already been adjusted. Those that are - * above have not yet been adjusted. If a hint above blocks an - * adjustment to an optimal position, we will try again in a second - * pass. The second pass is top-down. - * - */ - - static void - cf2_hintmap_adjustHints( CF2_HintMap hintmap ) - { - size_t i, j; - - - cf2_arrstack_clear( hintmap->hintMoves ); /* working storage */ - - /* - * First pass is bottom-up (font hint order) without look-ahead. - * Locked edges are already adjusted. - * Unlocked edges begin with dsCoord from `initialHintMap'. - * Save edges that are not optimally adjusted in `hintMoves' array, - * and process them in second pass. - */ - - for ( i = 0; i < hintmap->count; i++ ) - { - FT_Bool isPair = cf2_hint_isPair( &hintmap->edge[i] ); - - - /* index of upper edge (same value for ghost hint) */ - j = isPair ? i + 1 : i; - - FT_ASSERT( j < hintmap->count ); - FT_ASSERT( cf2_hint_isValid( &hintmap->edge[i] ) ); - FT_ASSERT( cf2_hint_isValid( &hintmap->edge[j] ) ); - FT_ASSERT( cf2_hint_isLocked( &hintmap->edge[i] ) == - cf2_hint_isLocked( &hintmap->edge[j] ) ); - - if ( !cf2_hint_isLocked( &hintmap->edge[i] ) ) - { - /* hint edge is not locked, we can adjust it */ - CF2_Fixed fracDown = cf2_fixedFraction( hintmap->edge[i].dsCoord ); - CF2_Fixed fracUp = cf2_fixedFraction( hintmap->edge[j].dsCoord ); - - /* calculate all four possibilities; moves down are negative */ - CF2_Fixed downMoveDown = 0 - fracDown; - CF2_Fixed upMoveDown = 0 - fracUp; - CF2_Fixed downMoveUp = fracDown == 0 - ? 0 - : cf2_intToFixed( 1 ) - fracDown; - CF2_Fixed upMoveUp = fracUp == 0 - ? 0 - : cf2_intToFixed( 1 ) - fracUp; - - /* smallest move up */ - CF2_Fixed moveUp = FT_MIN( downMoveUp, upMoveUp ); - /* smallest move down */ - CF2_Fixed moveDown = FT_MAX( downMoveDown, upMoveDown ); - - /* final amount to move edge or edge pair */ - CF2_Fixed move; - - CF2_Fixed downMinCounter = CF2_MIN_COUNTER; - CF2_Fixed upMinCounter = CF2_MIN_COUNTER; - FT_Bool saveEdge = FALSE; - - - /* minimum counter constraint doesn't apply when adjacent edges */ - /* are synthetic */ - /* TODO: doesn't seem a big effect; for now, reduce the code */ -#if 0 - if ( i == 0 || - cf2_hint_isSynthetic( &hintmap->edge[i - 1] ) ) - downMinCounter = 0; - - if ( j >= hintmap->count - 1 || - cf2_hint_isSynthetic( &hintmap->edge[j + 1] ) ) - upMinCounter = 0; -#endif - - /* is there room to move up? */ - /* there is if we are at top of array or the next edge is at or */ - /* beyond proposed move up? */ - if ( j >= hintmap->count - 1 || - hintmap->edge[j + 1].dsCoord >= - hintmap->edge[j].dsCoord + moveUp + upMinCounter ) - { - /* there is room to move up; is there also room to move down? */ - if ( i == 0 || - hintmap->edge[i - 1].dsCoord <= - hintmap->edge[i].dsCoord + moveDown - downMinCounter ) - { - /* move smaller absolute amount */ - move = ( -moveDown < moveUp ) ? moveDown : moveUp; /* optimum */ - } - else - move = moveUp; - } - else - { - /* is there room to move down? */ - if ( i == 0 || - hintmap->edge[i - 1].dsCoord <= - hintmap->edge[i].dsCoord + moveDown - downMinCounter ) - { - move = moveDown; - /* true if non-optimum move */ - saveEdge = (FT_Bool)( moveUp < -moveDown ); - } - else - { - /* no room to move either way without overlapping or reducing */ - /* the counter too much */ - move = 0; - saveEdge = TRUE; - } - } - - /* Identify non-moves and moves down that aren't optimal, and save */ - /* them for second pass. */ - /* Do this only if there is an unlocked edge above (which could */ - /* possibly move). */ - if ( saveEdge && - j < hintmap->count - 1 && - !cf2_hint_isLocked( &hintmap->edge[j + 1] ) ) - { - CF2_HintMoveRec savedMove; - - - savedMove.j = j; - /* desired adjustment in second pass */ - savedMove.moveUp = moveUp - move; - - cf2_arrstack_push( hintmap->hintMoves, &savedMove ); - } - - /* move the edge(s) */ - hintmap->edge[i].dsCoord += move; - if ( isPair ) - hintmap->edge[j].dsCoord += move; - } - - /* assert there are no overlaps in device space */ - FT_ASSERT( i == 0 || - hintmap->edge[i - 1].dsCoord <= hintmap->edge[i].dsCoord ); - FT_ASSERT( i < j || - hintmap->edge[i].dsCoord <= hintmap->edge[j].dsCoord ); - - /* adjust the scales, avoiding divide by zero */ - if ( i > 0 ) - { - if ( hintmap->edge[i].csCoord != hintmap->edge[i - 1].csCoord ) - hintmap->edge[i - 1].scale = - FT_DivFix( - hintmap->edge[i].dsCoord - hintmap->edge[i - 1].dsCoord, - hintmap->edge[i].csCoord - hintmap->edge[i - 1].csCoord ); - } - - if ( isPair ) - { - if ( hintmap->edge[j].csCoord != hintmap->edge[j - 1].csCoord ) - hintmap->edge[j - 1].scale = - FT_DivFix( - hintmap->edge[j].dsCoord - hintmap->edge[j - 1].dsCoord, - hintmap->edge[j].csCoord - hintmap->edge[j - 1].csCoord ); - - i += 1; /* skip upper edge on next loop */ - } - } - - /* second pass tries to move non-optimal hints up, in case there is */ - /* room now */ - for ( i = cf2_arrstack_size( hintmap->hintMoves ); i > 0; i-- ) - { - CF2_HintMove hintMove = (CF2_HintMove) - cf2_arrstack_getPointer( hintmap->hintMoves, i - 1 ); - - - j = hintMove->j; - - /* this was tested before the push, above */ - FT_ASSERT( j < hintmap->count - 1 ); - - /* is there room to move up? */ - if ( hintmap->edge[j + 1].dsCoord >= - hintmap->edge[j].dsCoord + hintMove->moveUp + CF2_MIN_COUNTER ) - { - /* there is more room now, move edge up */ - hintmap->edge[j].dsCoord += hintMove->moveUp; - - if ( cf2_hint_isPair( &hintmap->edge[j] ) ) - { - FT_ASSERT( j > 0 ); - hintmap->edge[j - 1].dsCoord += hintMove->moveUp; - } - } - } - } - - - /* insert hint edges into map, sorted by csCoord */ - static void - cf2_hintmap_insertHint( CF2_HintMap hintmap, - CF2_Hint bottomHintEdge, - CF2_Hint topHintEdge ) - { - CF2_UInt indexInsert; - - /* set default values, then check for edge hints */ - FT_Bool isPair = TRUE; - CF2_Hint firstHintEdge = bottomHintEdge; - CF2_Hint secondHintEdge = topHintEdge; - - - /* one or none of the input params may be invalid when dealing with */ - /* edge hints; at least one edge must be valid */ - FT_ASSERT( cf2_hint_isValid( bottomHintEdge ) || - cf2_hint_isValid( topHintEdge ) ); - - /* determine how many and which edges to insert */ - if ( !cf2_hint_isValid( bottomHintEdge ) ) - { - /* insert only the top edge */ - firstHintEdge = topHintEdge; - isPair = FALSE; - } - else if ( !cf2_hint_isValid( topHintEdge ) ) - { - /* insert only the bottom edge */ - isPair = FALSE; - } - - /* paired edges must be in proper order */ - FT_ASSERT( !isPair || - topHintEdge->csCoord >= bottomHintEdge->csCoord ); - - /* linear search to find index value of insertion point */ - indexInsert = 0; - for ( ; indexInsert < hintmap->count; indexInsert++ ) - { - if ( hintmap->edge[indexInsert].csCoord >= firstHintEdge->csCoord ) - break; - } - - /* - * Discard any hints that overlap in character space. Most often, this - * is while building the initial map, where captured hints from all - * zones are combined. Define overlap to include hints that `touch' - * (overlap zero). Hiragino Sans/Gothic fonts have numerous hints that - * touch. Some fonts have non-ideographic glyphs that overlap our - * synthetic hints. - * - * Overlap also occurs when darkening stem hints that are close. - * - */ - if ( indexInsert < hintmap->count ) - { - /* we are inserting before an existing edge: */ - /* verify that an existing edge is not the same */ - if ( hintmap->edge[indexInsert].csCoord == firstHintEdge->csCoord ) - return; /* ignore overlapping stem hint */ - - /* verify that a new pair does not straddle the next edge */ - if ( isPair && - hintmap->edge[indexInsert].csCoord <= secondHintEdge->csCoord ) - return; /* ignore overlapping stem hint */ - - /* verify that we are not inserting between paired edges */ - if ( cf2_hint_isPairTop( &hintmap->edge[indexInsert] ) ) - return; /* ignore overlapping stem hint */ - } - - /* recompute device space locations using initial hint map */ - if ( cf2_hintmap_isValid( hintmap->initialHintMap ) && - !cf2_hint_isLocked( firstHintEdge ) ) - { - if ( isPair ) - { - /* Use hint map to position the center of stem, and nominal scale */ - /* to position the two edges. This preserves the stem width. */ - CF2_Fixed midpoint = cf2_hintmap_map( - hintmap->initialHintMap, - ( secondHintEdge->csCoord + - firstHintEdge->csCoord ) / 2 ); - CF2_Fixed halfWidth = FT_MulFix( - ( secondHintEdge->csCoord - - firstHintEdge->csCoord ) / 2, - hintmap->scale ); - - - firstHintEdge->dsCoord = midpoint - halfWidth; - secondHintEdge->dsCoord = midpoint + halfWidth; - } - else - firstHintEdge->dsCoord = cf2_hintmap_map( hintmap->initialHintMap, - firstHintEdge->csCoord ); - } - - /* - * Discard any hints that overlap in device space; this can occur - * because locked hints have been moved to align with blue zones. - * - * TODO: Although we might correct this later during adjustment, we - * don't currently have a way to delete a conflicting hint once it has - * been inserted. See v2.030 MinionPro-Regular, 12 ppem darkened, - * initial hint map for second path, glyph 945 (the perispomeni (tilde) - * in U+1F6E, Greek omega with psili and perispomeni). Darkening is - * 25. Pair 667,747 initially conflicts in design space with top edge - * 660. This is because 667 maps to 7.87, and the top edge was - * captured by a zone at 8.0. The pair is later successfully inserted - * in a zone without the top edge. In this zone it is adjusted to 8.0, - * and no longer conflicts with the top edge in design space. This - * means it can be included in yet a later zone which does have the top - * edge hint. This produces a small mismatch between the first and - * last points of this path, even though the hint masks are the same. - * The density map difference is tiny (1/256). - * - */ - - if ( indexInsert > 0 ) - { - /* we are inserting after an existing edge */ - if ( firstHintEdge->dsCoord < hintmap->edge[indexInsert - 1].dsCoord ) - return; - } - - if ( indexInsert < hintmap->count ) - { - /* we are inserting before an existing edge */ - if ( isPair ) - { - if ( secondHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord ) - return; - } - else - { - if ( firstHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord ) - return; - } - } - - /* make room to insert */ - { - CF2_UInt iSrc = hintmap->count - 1; - CF2_UInt iDst = isPair ? hintmap->count + 1 : hintmap->count; - - CF2_UInt count = hintmap->count - indexInsert; - - - if ( iDst >= CF2_MAX_HINT_EDGES ) - { - FT_TRACE4(( "cf2_hintmap_insertHint: too many hintmaps\n" )); - return; - } - - while ( count-- ) - hintmap->edge[iDst--] = hintmap->edge[iSrc--]; - - /* insert first edge */ - hintmap->edge[indexInsert] = *firstHintEdge; /* copy struct */ - hintmap->count += 1; - - if ( isPair ) - { - /* insert second edge */ - hintmap->edge[indexInsert + 1] = *secondHintEdge; /* copy struct */ - hintmap->count += 1; - } - } - - return; - } - - - /* - * Build a map from hints and mask. - * - * This function may recur one level if `hintmap->initialHintMap' is not yet - * valid. - * If `initialMap' is true, simply build initial map. - * - * Synthetic hints are used in two ways. A hint at zero is inserted, if - * needed, in the initial hint map, to prevent translations from - * propagating across the origin. If synthetic em box hints are enabled - * for ideographic dictionaries, then they are inserted in all hint - * maps, including the initial one. - * - */ - FT_LOCAL_DEF( void ) - cf2_hintmap_build( CF2_HintMap hintmap, - CF2_ArrStack hStemHintArray, - CF2_ArrStack vStemHintArray, - CF2_HintMask hintMask, - CF2_Fixed hintOrigin, - FT_Bool initialMap ) - { - FT_Byte* maskPtr; - - CF2_Font font = hintmap->font; - CF2_HintMaskRec tempHintMask; - - size_t bitCount, i; - FT_Byte maskByte; - - - /* check whether initial map is constructed */ - if ( !initialMap && !cf2_hintmap_isValid( hintmap->initialHintMap ) ) - { - /* make recursive call with initialHintMap and temporary mask; */ - /* temporary mask will get all bits set, below */ - cf2_hintmask_init( &tempHintMask, hintMask->error ); - cf2_hintmap_build( hintmap->initialHintMap, - hStemHintArray, - vStemHintArray, - &tempHintMask, - hintOrigin, - TRUE ); - } - - if ( !cf2_hintmask_isValid( hintMask ) ) - { - /* without a hint mask, assume all hints are active */ - cf2_hintmask_setAll( hintMask, - cf2_arrstack_size( hStemHintArray ) + - cf2_arrstack_size( vStemHintArray ) ); - if ( !cf2_hintmask_isValid( hintMask ) ) - return; /* too many stem hints */ - } - - /* begin by clearing the map */ - hintmap->count = 0; - hintmap->lastIndex = 0; - - /* make a copy of the hint mask so we can modify it */ - tempHintMask = *hintMask; - maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask ); - - /* use the hStem hints only, which are first in the mask */ - bitCount = cf2_arrstack_size( hStemHintArray ); - - /* Defense-in-depth. Should never return here. */ - if ( bitCount > hintMask->bitCount ) - return; - - /* synthetic embox hints get highest priority */ - if ( font->blues.doEmBoxHints ) - { - CF2_HintRec dummy; - - - cf2_hint_initZero( &dummy ); /* invalid hint map element */ - - /* ghost bottom */ - cf2_hintmap_insertHint( hintmap, - &font->blues.emBoxBottomEdge, - &dummy ); - /* ghost top */ - cf2_hintmap_insertHint( hintmap, - &dummy, - &font->blues.emBoxTopEdge ); - } - - /* insert hints captured by a blue zone or already locked (higher */ - /* priority) */ - for ( i = 0, maskByte = 0x80; i < bitCount; i++ ) - { - if ( maskByte & *maskPtr ) - { - /* expand StemHint into two `CF2_Hint' elements */ - CF2_HintRec bottomHintEdge, topHintEdge; - - - cf2_hint_init( &bottomHintEdge, - hStemHintArray, - i, - font, - hintOrigin, - hintmap->scale, - TRUE /* bottom */ ); - cf2_hint_init( &topHintEdge, - hStemHintArray, - i, - font, - hintOrigin, - hintmap->scale, - FALSE /* top */ ); - - if ( cf2_hint_isLocked( &bottomHintEdge ) || - cf2_hint_isLocked( &topHintEdge ) || - cf2_blues_capture( &font->blues, - &bottomHintEdge, - &topHintEdge ) ) - { - /* insert captured hint into map */ - cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge ); - - *maskPtr &= ~maskByte; /* turn off the bit for this hint */ - } - } - - if ( ( i & 7 ) == 7 ) - { - /* move to next mask byte */ - maskPtr++; - maskByte = 0x80; - } - else - maskByte >>= 1; - } - - /* initial hint map includes only captured hints plus maybe one at 0 */ - - /* - * TODO: There is a problem here because we are trying to build a - * single hint map containing all captured hints. It is - * possible for there to be conflicts between captured hints, - * either because of darkening or because the hints are in - * separate hint zones (we are ignoring hint zones for the - * initial map). An example of the latter is MinionPro-Regular - * v2.030 glyph 883 (Greek Capital Alpha with Psili) at 15ppem. - * A stem hint for the psili conflicts with the top edge hint - * for the base character. The stem hint gets priority because - * of its sort order. In glyph 884 (Greek Capital Alpha with - * Psili and Oxia), the top of the base character gets a stem - * hint, and the psili does not. This creates different initial - * maps for the two glyphs resulting in different renderings of - * the base character. Will probably defer this either as not - * worth the cost or as a font bug. I don't think there is any - * good reason for an accent to be captured by an alignment - * zone. -darnold 2/12/10 - */ - - if ( initialMap ) - { - /* Apply a heuristic that inserts a point for (0,0), unless it's */ - /* already covered by a mapping. This locks the baseline for glyphs */ - /* that have no baseline hints. */ - - if ( hintmap->count == 0 || - hintmap->edge[0].csCoord > 0 || - hintmap->edge[hintmap->count - 1].csCoord < 0 ) - { - /* all edges are above 0 or all edges are below 0; */ - /* construct a locked edge hint at 0 */ - - CF2_HintRec edge, invalid; - - - cf2_hint_initZero( &edge ); - - edge.flags = CF2_GhostBottom | - CF2_Locked | - CF2_Synthetic; - edge.scale = hintmap->scale; - - cf2_hint_initZero( &invalid ); - cf2_hintmap_insertHint( hintmap, &edge, &invalid ); - } - } - else - { - /* insert remaining hints */ - - maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask ); - - for ( i = 0, maskByte = 0x80; i < bitCount; i++ ) - { - if ( maskByte & *maskPtr ) - { - CF2_HintRec bottomHintEdge, topHintEdge; - - - cf2_hint_init( &bottomHintEdge, - hStemHintArray, - i, - font, - hintOrigin, - hintmap->scale, - TRUE /* bottom */ ); - cf2_hint_init( &topHintEdge, - hStemHintArray, - i, - font, - hintOrigin, - hintmap->scale, - FALSE /* top */ ); - - cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge ); - } - - if ( ( i & 7 ) == 7 ) - { - /* move to next mask byte */ - maskPtr++; - maskByte = 0x80; - } - else - maskByte >>= 1; - } - } - - /* - * Note: The following line is a convenient place to break when - * debugging hinting. Examine `hintmap->edge' for the list of - * enabled hints, then step over the call to see the effect of - * adjustment. We stop here first on the recursive call that - * creates the initial map, and then on each counter group and - * hint zone. - */ - - /* adjust positions of hint edges that are not locked to blue zones */ - cf2_hintmap_adjustHints( hintmap ); - - /* save the position of all hints that were used in this hint map; */ - /* if we use them again, we'll locate them in the same position */ - if ( !initialMap ) - { - for ( i = 0; i < hintmap->count; i++ ) - { - if ( !cf2_hint_isSynthetic( &hintmap->edge[i] ) ) - { - /* Note: include both valid and invalid edges */ - /* Note: top and bottom edges are copied back separately */ - CF2_StemHint stemhint = (CF2_StemHint) - cf2_arrstack_getPointer( hStemHintArray, - hintmap->edge[i].index ); - - - if ( cf2_hint_isTop( &hintmap->edge[i] ) ) - stemhint->maxDS = hintmap->edge[i].dsCoord; - else - stemhint->minDS = hintmap->edge[i].dsCoord; - - stemhint->used = TRUE; - } - } - } - - /* hint map is ready to use */ - hintmap->isValid = TRUE; - - /* remember this mask has been used */ - cf2_hintmask_setNew( hintMask, FALSE ); - } - - - FT_LOCAL_DEF( void ) - cf2_glyphpath_init( CF2_GlyphPath glyphpath, - CF2_Font font, - CF2_OutlineCallbacks callbacks, - CF2_Fixed scaleY, - /* CF2_Fixed hShift, */ - CF2_ArrStack hStemHintArray, - CF2_ArrStack vStemHintArray, - CF2_HintMask hintMask, - CF2_Fixed hintOriginY, - const CF2_Blues blues, - const FT_Vector* fractionalTranslation ) - { - FT_ZERO( glyphpath ); - - glyphpath->font = font; - glyphpath->callbacks = callbacks; - - cf2_arrstack_init( &glyphpath->hintMoves, - font->memory, - &font->error, - sizeof ( CF2_HintMoveRec ) ); - - cf2_hintmap_init( &glyphpath->initialHintMap, - font, - &glyphpath->initialHintMap, - &glyphpath->hintMoves, - scaleY ); - cf2_hintmap_init( &glyphpath->firstHintMap, - font, - &glyphpath->initialHintMap, - &glyphpath->hintMoves, - scaleY ); - cf2_hintmap_init( &glyphpath->hintMap, - font, - &glyphpath->initialHintMap, - &glyphpath->hintMoves, - scaleY ); - - glyphpath->scaleX = font->innerTransform.a; - glyphpath->scaleC = font->innerTransform.c; - glyphpath->scaleY = font->innerTransform.d; - - glyphpath->fractionalTranslation = *fractionalTranslation; - -#if 0 - glyphpath->hShift = hShift; /* for fauxing */ -#endif - - glyphpath->hStemHintArray = hStemHintArray; - glyphpath->vStemHintArray = vStemHintArray; - glyphpath->hintMask = hintMask; /* ptr to current mask */ - glyphpath->hintOriginY = hintOriginY; - glyphpath->blues = blues; - glyphpath->darken = font->darkened; /* TODO: should we make copies? */ - glyphpath->xOffset = font->darkenX; - glyphpath->yOffset = font->darkenY; - glyphpath->miterLimit = 2 * FT_MAX( - cf2_fixedAbs( glyphpath->xOffset ), - cf2_fixedAbs( glyphpath->yOffset ) ); - - /* .1 character space unit */ - glyphpath->snapThreshold = cf2_floatToFixed( 0.1f ); - - glyphpath->moveIsPending = TRUE; - glyphpath->pathIsOpen = FALSE; - glyphpath->pathIsClosing = FALSE; - glyphpath->elemIsQueued = FALSE; - } - - - FT_LOCAL_DEF( void ) - cf2_glyphpath_finalize( CF2_GlyphPath glyphpath ) - { - cf2_arrstack_finalize( &glyphpath->hintMoves ); - } - - - /* - * Hint point in y-direction and apply outerTransform. - * Input `current' hint map (which is actually delayed by one element). - * Input x,y point in Character Space. - * Output x,y point in Device Space, including translation. - */ - static void - cf2_glyphpath_hintPoint( CF2_GlyphPath glyphpath, - CF2_HintMap hintmap, - FT_Vector* ppt, - CF2_Fixed x, - CF2_Fixed y ) - { - FT_Vector pt; /* hinted point in upright DS */ - - - pt.x = FT_MulFix( glyphpath->scaleX, x ) + - FT_MulFix( glyphpath->scaleC, y ); - pt.y = cf2_hintmap_map( hintmap, y ); - - ppt->x = FT_MulFix( glyphpath->font->outerTransform.a, pt.x ) + - FT_MulFix( glyphpath->font->outerTransform.c, pt.y ) + - glyphpath->fractionalTranslation.x; - ppt->y = FT_MulFix( glyphpath->font->outerTransform.b, pt.x ) + - FT_MulFix( glyphpath->font->outerTransform.d, pt.y ) + - glyphpath->fractionalTranslation.y; - } - - - /* - * From two line segments, (u1,u2) and (v1,v2), compute a point of - * intersection on the corresponding lines. - * Return false if no intersection is found, or if the intersection is - * too far away from the ends of the line segments, u2 and v1. - * - */ - static FT_Bool - cf2_glyphpath_computeIntersection( CF2_GlyphPath glyphpath, - const FT_Vector* u1, - const FT_Vector* u2, - const FT_Vector* v1, - const FT_Vector* v2, - FT_Vector* intersection ) - { - /* - * Let `u' be a zero-based vector from the first segment, `v' from the - * second segment. - * Let `w 'be the zero-based vector from `u1' to `v1'. - * `perp' is the `perpendicular dot product'; see - * http://mathworld.wolfram.com/PerpDotProduct.html. - * `s' is the parameter for the parametric line for the first segment - * (`u'). - * - * See notation in - * http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm. - * Calculations are done in 16.16, but must handle the squaring of - * line lengths in character space. We scale all vectors by 1/32 to - * avoid overflow. This allows values up to 4095 to be squared. The - * scale factor cancels in the divide. - * - * TODO: the scale factor could be computed from UnitsPerEm. - * - */ - -#define cf2_perp( a, b ) \ - ( FT_MulFix( a.x, b.y ) - FT_MulFix( a.y, b.x ) ) - - /* round and divide by 32 */ -#define CF2_CS_SCALE( x ) \ - ( ( (x) + 0x10 ) >> 5 ) - - FT_Vector u, v, w; /* scaled vectors */ - CF2_Fixed denominator, s; - - - u.x = CF2_CS_SCALE( u2->x - u1->x ); - u.y = CF2_CS_SCALE( u2->y - u1->y ); - v.x = CF2_CS_SCALE( v2->x - v1->x ); - v.y = CF2_CS_SCALE( v2->y - v1->y ); - w.x = CF2_CS_SCALE( v1->x - u1->x ); - w.y = CF2_CS_SCALE( v1->y - u1->y ); - - denominator = cf2_perp( u, v ); - - if ( denominator == 0 ) - return FALSE; /* parallel or coincident lines */ - - s = FT_DivFix( cf2_perp( w, v ), denominator ); - - intersection->x = u1->x + FT_MulFix( s, u2->x - u1->x ); - intersection->y = u1->y + FT_MulFix( s, u2->y - u1->y ); - - /* - * Special case snapping for horizontal and vertical lines. - * This cleans up intersections and reduces problems with winding - * order detection. - * Sample case is sbc cd KozGoPr6N-Medium.otf 20 16685. - * Note: these calculations are in character space. - * - */ - - if ( u1->x == u2->x && - cf2_fixedAbs( intersection->x - u1->x ) < glyphpath->snapThreshold ) - intersection->x = u1->x; - if ( u1->y == u2->y && - cf2_fixedAbs( intersection->y - u1->y ) < glyphpath->snapThreshold ) - intersection->y = u1->y; - - if ( v1->x == v2->x && - cf2_fixedAbs( intersection->x - v1->x ) < glyphpath->snapThreshold ) - intersection->x = v1->x; - if ( v1->y == v2->y && - cf2_fixedAbs( intersection->y - v1->y ) < glyphpath->snapThreshold ) - intersection->y = v1->y; - - /* limit the intersection distance from midpoint of u2 and v1 */ - if ( cf2_fixedAbs( intersection->x - ( u2->x + v1->x ) / 2 ) > - glyphpath->miterLimit || - cf2_fixedAbs( intersection->y - ( u2->y + v1->y ) / 2 ) > - glyphpath->miterLimit ) - return FALSE; - - return TRUE; - } - - - /* - * Push the cached element (glyphpath->prevElem*) to the outline - * consumer. When a darkening offset is used, the end point of the - * cached element may be adjusted to an intersection point or we may - * synthesize a connecting line to the current element. If we are - * closing a subpath, we may also generate a connecting line to the start - * point. - * - * This is where Character Space (CS) is converted to Device Space (DS) - * using a hint map. This calculation must use a HintMap that was valid - * at the time the element was saved. For the first point in a subpath, - * that is a saved HintMap. For most elements, it just means the caller - * has delayed building a HintMap from the current HintMask. - * - * Transform each point with outerTransform and call the outline - * callbacks. This is a general 3x3 transform: - * - * x' = a*x + c*y + tx, y' = b*x + d*y + ty - * - * but it uses 4 elements from CF2_Font and the translation part - * from CF2_GlyphPath. - * - */ - static void - cf2_glyphpath_pushPrevElem( CF2_GlyphPath glyphpath, - CF2_HintMap hintmap, - FT_Vector* nextP0, - FT_Vector nextP1, - FT_Bool close ) - { - CF2_CallbackParamsRec params; - - FT_Vector* prevP0; - FT_Vector* prevP1; - - FT_Vector intersection = { 0, 0 }; - FT_Bool useIntersection = FALSE; - - - FT_ASSERT( glyphpath->prevElemOp == CF2_PathOpLineTo || - glyphpath->prevElemOp == CF2_PathOpCubeTo ); - - if ( glyphpath->prevElemOp == CF2_PathOpLineTo ) - { - prevP0 = &glyphpath->prevElemP0; - prevP1 = &glyphpath->prevElemP1; - } - else - { - prevP0 = &glyphpath->prevElemP2; - prevP1 = &glyphpath->prevElemP3; - } - - /* optimization: if previous and next elements are offset by the same */ - /* amount, then there will be no gap, and no need to compute an */ - /* intersection. */ - if ( prevP1->x != nextP0->x || prevP1->y != nextP0->y ) - { - /* previous element does not join next element: */ - /* adjust end point of previous element to the intersection */ - useIntersection = cf2_glyphpath_computeIntersection( glyphpath, - prevP0, - prevP1, - nextP0, - &nextP1, - &intersection ); - if ( useIntersection ) - { - /* modify the last point of the cached element (either line or */ - /* curve) */ - *prevP1 = intersection; - } - } - - params.pt0 = glyphpath->currentDS; - - switch( glyphpath->prevElemOp ) - { - case CF2_PathOpLineTo: - params.op = CF2_PathOpLineTo; - - /* note: pt2 and pt3 are unused */ - - if ( close ) - { - /* use first hint map if closing */ - cf2_glyphpath_hintPoint( glyphpath, - &glyphpath->firstHintMap, - ¶ms.pt1, - glyphpath->prevElemP1.x, - glyphpath->prevElemP1.y ); - } - else - { - cf2_glyphpath_hintPoint( glyphpath, - hintmap, - ¶ms.pt1, - glyphpath->prevElemP1.x, - glyphpath->prevElemP1.y ); - } - - /* output only non-zero length lines */ - if ( params.pt0.x != params.pt1.x || params.pt0.y != params.pt1.y ) - { - glyphpath->callbacks->lineTo( glyphpath->callbacks, ¶ms ); - - glyphpath->currentDS = params.pt1; - } - break; - - case CF2_PathOpCubeTo: - params.op = CF2_PathOpCubeTo; - - /* TODO: should we intersect the interior joins (p1-p2 and p2-p3)? */ - cf2_glyphpath_hintPoint( glyphpath, - hintmap, - ¶ms.pt1, - glyphpath->prevElemP1.x, - glyphpath->prevElemP1.y ); - cf2_glyphpath_hintPoint( glyphpath, - hintmap, - ¶ms.pt2, - glyphpath->prevElemP2.x, - glyphpath->prevElemP2.y ); - cf2_glyphpath_hintPoint( glyphpath, - hintmap, - ¶ms.pt3, - glyphpath->prevElemP3.x, - glyphpath->prevElemP3.y ); - - glyphpath->callbacks->cubeTo( glyphpath->callbacks, ¶ms ); - - glyphpath->currentDS = params.pt3; - - break; - } - - if ( !useIntersection || close ) - { - /* insert connecting line between end of previous element and start */ - /* of current one */ - /* note: at the end of a subpath, we might do both, so use `nextP0' */ - /* before we change it, below */ - - if ( close ) - { - /* if we are closing the subpath, then nextP0 is in the first */ - /* hint zone */ - cf2_glyphpath_hintPoint( glyphpath, - &glyphpath->firstHintMap, - ¶ms.pt1, - nextP0->x, - nextP0->y ); - } - else - { - cf2_glyphpath_hintPoint( glyphpath, - hintmap, - ¶ms.pt1, - nextP0->x, - nextP0->y ); - } - - if ( params.pt1.x != glyphpath->currentDS.x || - params.pt1.y != glyphpath->currentDS.y ) - { - /* length is nonzero */ - params.op = CF2_PathOpLineTo; - params.pt0 = glyphpath->currentDS; - - /* note: pt2 and pt3 are unused */ - glyphpath->callbacks->lineTo( glyphpath->callbacks, ¶ms ); - - glyphpath->currentDS = params.pt1; - } - } - - if ( useIntersection ) - { - /* return intersection point to caller */ - *nextP0 = intersection; - } - } - - - /* push a MoveTo element based on current point and offset of current */ - /* element */ - static void - cf2_glyphpath_pushMove( CF2_GlyphPath glyphpath, - FT_Vector start ) - { - CF2_CallbackParamsRec params; - - - params.op = CF2_PathOpMoveTo; - params.pt0 = glyphpath->currentDS; - - /* Test if move has really happened yet; it would have called */ - /* `cf2_hintmap_build' to set `isValid'. */ - if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) ) - { - /* we are here iff first subpath is missing a moveto operator: */ - /* synthesize first moveTo to finish initialization of hintMap */ - cf2_glyphpath_moveTo( glyphpath, - glyphpath->start.x, - glyphpath->start.y ); - } - - cf2_glyphpath_hintPoint( glyphpath, - &glyphpath->hintMap, - ¶ms.pt1, - start.x, - start.y ); - - /* note: pt2 and pt3 are unused */ - glyphpath->callbacks->moveTo( glyphpath->callbacks, ¶ms ); - - glyphpath->currentDS = params.pt1; - glyphpath->offsetStart0 = start; - } - - - /* - * All coordinates are in character space. - * On input, (x1, y1) and (x2, y2) give line segment. - * On output, (x, y) give offset vector. - * We use a piecewise approximation to trig functions. - * - * TODO: Offset true perpendicular and proper length - * supply the y-translation for hinting here, too, - * that adds yOffset unconditionally to *y. - */ - static void - cf2_glyphpath_computeOffset( CF2_GlyphPath glyphpath, - CF2_Fixed x1, - CF2_Fixed y1, - CF2_Fixed x2, - CF2_Fixed y2, - CF2_Fixed* x, - CF2_Fixed* y ) - { - CF2_Fixed dx = x2 - x1; - CF2_Fixed dy = y2 - y1; - - - /* note: negative offsets don't work here; negate deltas to change */ - /* quadrants, below */ - if ( glyphpath->font->reverseWinding ) - { - dx = -dx; - dy = -dy; - } - - *x = *y = 0; - - if ( !glyphpath->darken ) - return; - - /* add momentum for this path element */ - glyphpath->callbacks->windingMomentum += - cf2_getWindingMomentum( x1, y1, x2, y2 ); - - /* note: allow mixed integer and fixed multiplication here */ - if ( dx >= 0 ) - { - if ( dy >= 0 ) - { - /* first quadrant, +x +y */ - - if ( dx > 2 * dy ) - { - /* +x */ - *x = 0; - *y = 0; - } - else if ( dy > 2 * dx ) - { - /* +y */ - *x = glyphpath->xOffset; - *y = glyphpath->yOffset; - } - else - { - /* +x +y */ - *x = FT_MulFix( cf2_floatToFixed( 0.7 ), - glyphpath->xOffset ); - *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ), - glyphpath->yOffset ); - } - } - else - { - /* fourth quadrant, +x -y */ - - if ( dx > -2 * dy ) - { - /* +x */ - *x = 0; - *y = 0; - } - else if ( -dy > 2 * dx ) - { - /* -y */ - *x = -glyphpath->xOffset; - *y = glyphpath->yOffset; - } - else - { - /* +x -y */ - *x = FT_MulFix( cf2_floatToFixed( -0.7 ), - glyphpath->xOffset ); - *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ), - glyphpath->yOffset ); - } - } - } - else - { - if ( dy >= 0 ) - { - /* second quadrant, -x +y */ - - if ( -dx > 2 * dy ) - { - /* -x */ - *x = 0; - *y = 2 * glyphpath->yOffset; - } - else if ( dy > -2 * dx ) - { - /* +y */ - *x = glyphpath->xOffset; - *y = glyphpath->yOffset; - } - else - { - /* -x +y */ - *x = FT_MulFix( cf2_floatToFixed( 0.7 ), - glyphpath->xOffset ); - *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ), - glyphpath->yOffset ); - } - } - else - { - /* third quadrant, -x -y */ - - if ( -dx > -2 * dy ) - { - /* -x */ - *x = 0; - *y = 2 * glyphpath->yOffset; - } - else if ( -dy > -2 * dx ) - { - /* -y */ - *x = -glyphpath->xOffset; - *y = glyphpath->yOffset; - } - else - { - /* -x -y */ - *x = FT_MulFix( cf2_floatToFixed( -0.7 ), - glyphpath->xOffset ); - *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ), - glyphpath->yOffset ); - } - } - } - } - - - /* - * The functions cf2_glyphpath_{moveTo,lineTo,curveTo,closeOpenPath} are - * called by the interpreter with Character Space (CS) coordinates. Each - * path element is placed into a queue of length one to await the - * calculation of the following element. At that time, the darkening - * offset of the following element is known and joins can be computed, - * including possible modification of this element, before mapping to - * Device Space (DS) and passing it on to the outline consumer. - * - */ - FT_LOCAL_DEF( void ) - cf2_glyphpath_moveTo( CF2_GlyphPath glyphpath, - CF2_Fixed x, - CF2_Fixed y ) - { - cf2_glyphpath_closeOpenPath( glyphpath ); - - /* save the parameters of the move for later, when we'll know how to */ - /* offset it; */ - /* also save last move point */ - glyphpath->currentCS.x = glyphpath->start.x = x; - glyphpath->currentCS.y = glyphpath->start.y = y; - - glyphpath->moveIsPending = TRUE; - - /* ensure we have a valid map with current mask */ - if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) || - cf2_hintmask_isNew( glyphpath->hintMask ) ) - cf2_hintmap_build( &glyphpath->hintMap, - glyphpath->hStemHintArray, - glyphpath->vStemHintArray, - glyphpath->hintMask, - glyphpath->hintOriginY, - FALSE ); - - /* save a copy of current HintMap to use when drawing initial point */ - glyphpath->firstHintMap = glyphpath->hintMap; /* structure copy */ - } - - - FT_LOCAL_DEF( void ) - cf2_glyphpath_lineTo( CF2_GlyphPath glyphpath, - CF2_Fixed x, - CF2_Fixed y ) - { - CF2_Fixed xOffset, yOffset; - FT_Vector P0, P1; - FT_Bool newHintMap; - - /* - * New hints will be applied after cf2_glyphpath_pushPrevElem has run. - * In case this is a synthesized closing line, any new hints should be - * delayed until this path is closed (`cf2_hintmask_isNew' will be - * called again before the next line or curve). - */ - - /* true if new hint map not on close */ - newHintMap = cf2_hintmask_isNew( glyphpath->hintMask ) && - !glyphpath->pathIsClosing; - - /* - * Zero-length lines may occur in the charstring. Because we cannot - * compute darkening offsets or intersections from zero-length lines, - * it is best to remove them and avoid artifacts. However, zero-length - * lines in CS at the start of a new hint map can generate non-zero - * lines in DS due to hint substitution. We detect a change in hint - * map here and pass those zero-length lines along. - */ - - /* - * Note: Find explicitly closed paths here with a conditional - * breakpoint using - * - * !gp->pathIsClosing && gp->start.x == x && gp->start.y == y - * - */ - - if ( glyphpath->currentCS.x == x && - glyphpath->currentCS.y == y && - !newHintMap ) - /* - * Ignore zero-length lines in CS where the hint map is the same - * because the line in DS will also be zero length. - * - * Ignore zero-length lines when we synthesize a closing line because - * the close will be handled in cf2_glyphPath_pushPrevElem. - */ - return; - - cf2_glyphpath_computeOffset( glyphpath, - glyphpath->currentCS.x, - glyphpath->currentCS.y, - x, - y, - &xOffset, - &yOffset ); - - /* construct offset points */ - P0.x = glyphpath->currentCS.x + xOffset; - P0.y = glyphpath->currentCS.y + yOffset; - P1.x = x + xOffset; - P1.y = y + yOffset; - - if ( glyphpath->moveIsPending ) - { - /* emit offset 1st point as MoveTo */ - cf2_glyphpath_pushMove( glyphpath, P0 ); - - glyphpath->moveIsPending = FALSE; /* adjust state machine */ - glyphpath->pathIsOpen = TRUE; - - glyphpath->offsetStart1 = P1; /* record second point */ - } - - if ( glyphpath->elemIsQueued ) - { - FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) || - glyphpath->hintMap.count == 0 ); - - cf2_glyphpath_pushPrevElem( glyphpath, - &glyphpath->hintMap, - &P0, - P1, - FALSE ); - } - - /* queue the current element with offset points */ - glyphpath->elemIsQueued = TRUE; - glyphpath->prevElemOp = CF2_PathOpLineTo; - glyphpath->prevElemP0 = P0; - glyphpath->prevElemP1 = P1; - - /* update current map */ - if ( newHintMap ) - cf2_hintmap_build( &glyphpath->hintMap, - glyphpath->hStemHintArray, - glyphpath->vStemHintArray, - glyphpath->hintMask, - glyphpath->hintOriginY, - FALSE ); - - glyphpath->currentCS.x = x; /* pre-offset current point */ - glyphpath->currentCS.y = y; - } - - - FT_LOCAL_DEF( void ) - cf2_glyphpath_curveTo( CF2_GlyphPath glyphpath, - CF2_Fixed x1, - CF2_Fixed y1, - CF2_Fixed x2, - CF2_Fixed y2, - CF2_Fixed x3, - CF2_Fixed y3 ) - { - CF2_Fixed xOffset1, yOffset1, xOffset3, yOffset3; - FT_Vector P0, P1, P2, P3; - - - /* TODO: ignore zero length portions of curve?? */ - cf2_glyphpath_computeOffset( glyphpath, - glyphpath->currentCS.x, - glyphpath->currentCS.y, - x1, - y1, - &xOffset1, - &yOffset1 ); - cf2_glyphpath_computeOffset( glyphpath, - x2, - y2, - x3, - y3, - &xOffset3, - &yOffset3 ); - - /* add momentum from the middle segment */ - glyphpath->callbacks->windingMomentum += - cf2_getWindingMomentum( x1, y1, x2, y2 ); - - /* construct offset points */ - P0.x = glyphpath->currentCS.x + xOffset1; - P0.y = glyphpath->currentCS.y + yOffset1; - P1.x = x1 + xOffset1; - P1.y = y1 + yOffset1; - /* note: preserve angle of final segment by using offset3 at both ends */ - P2.x = x2 + xOffset3; - P2.y = y2 + yOffset3; - P3.x = x3 + xOffset3; - P3.y = y3 + yOffset3; - - if ( glyphpath->moveIsPending ) - { - /* emit offset 1st point as MoveTo */ - cf2_glyphpath_pushMove( glyphpath, P0 ); - - glyphpath->moveIsPending = FALSE; - glyphpath->pathIsOpen = TRUE; - - glyphpath->offsetStart1 = P1; /* record second point */ - } - - if ( glyphpath->elemIsQueued ) - { - FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) || - glyphpath->hintMap.count == 0 ); - - cf2_glyphpath_pushPrevElem( glyphpath, - &glyphpath->hintMap, - &P0, - P1, - FALSE ); - } - - /* queue the current element with offset points */ - glyphpath->elemIsQueued = TRUE; - glyphpath->prevElemOp = CF2_PathOpCubeTo; - glyphpath->prevElemP0 = P0; - glyphpath->prevElemP1 = P1; - glyphpath->prevElemP2 = P2; - glyphpath->prevElemP3 = P3; - - /* update current map */ - if ( cf2_hintmask_isNew( glyphpath->hintMask ) ) - cf2_hintmap_build( &glyphpath->hintMap, - glyphpath->hStemHintArray, - glyphpath->vStemHintArray, - glyphpath->hintMask, - glyphpath->hintOriginY, - FALSE ); - - glyphpath->currentCS.x = x3; /* pre-offset current point */ - glyphpath->currentCS.y = y3; - } - - - FT_LOCAL_DEF( void ) - cf2_glyphpath_closeOpenPath( CF2_GlyphPath glyphpath ) - { - if ( glyphpath->pathIsOpen ) - { - /* - * A closing line in Character Space line is always generated below - * with `cf2_glyphPath_lineTo'. It may be ignored later if it turns - * out to be zero length in Device Space. - */ - glyphpath->pathIsClosing = TRUE; - - cf2_glyphpath_lineTo( glyphpath, - glyphpath->start.x, - glyphpath->start.y ); - - /* empty the final element from the queue and close the path */ - if ( glyphpath->elemIsQueued ) - cf2_glyphpath_pushPrevElem( glyphpath, - &glyphpath->hintMap, - &glyphpath->offsetStart0, - glyphpath->offsetStart1, - TRUE ); - - /* reset state machine */ - glyphpath->moveIsPending = TRUE; - glyphpath->pathIsOpen = FALSE; - glyphpath->pathIsClosing = FALSE; - glyphpath->elemIsQueued = FALSE; - } - } - - -/* END */ diff --git a/3party/freetype/src/cff/cf2hints.h b/3party/freetype/src/cff/cf2hints.h deleted file mode 100644 index f25d91bf89..0000000000 --- a/3party/freetype/src/cff/cf2hints.h +++ /dev/null @@ -1,289 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2hints.h */ -/* */ -/* Adobe's code for handling CFF hints (body). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2HINTS_H__ -#define __CF2HINTS_H__ - - -FT_BEGIN_HEADER - - - enum - { - CF2_MAX_HINTS = 96 /* maximum # of hints */ - }; - - - /* - * A HintMask object stores a bit mask that specifies which hints in the - * charstring are active at a given time. Hints in CFF must be declared - * at the start, before any drawing operators, with horizontal hints - * preceding vertical hints. The HintMask is ordered the same way, with - * horizontal hints immediately followed by vertical hints. Clients are - * responsible for knowing how many of each type are present. - * - * The maximum total number of hints is 96, as specified by the CFF - * specification. - * - * A HintMask is built 0 or more times while interpreting a charstring, by - * the HintMask operator. There is only one HintMask, but it is built or - * rebuilt each time there is a hint substitution (HintMask operator) in - * the charstring. A default HintMask with all bits set is built if there - * has been no HintMask operator prior to the first drawing operator. - * - */ - - typedef struct CF2_HintMaskRec_ - { - FT_Error* error; - - FT_Bool isValid; - FT_Bool isNew; - - size_t bitCount; - size_t byteCount; - - FT_Byte mask[( CF2_MAX_HINTS + 7 ) / 8]; - - } CF2_HintMaskRec, *CF2_HintMask; - - - typedef struct CF2_StemHintRec_ - { - FT_Bool used; /* DS positions are valid */ - - CF2_Fixed min; /* original character space value */ - CF2_Fixed max; - - CF2_Fixed minDS; /* DS position after first use */ - CF2_Fixed maxDS; - - } CF2_StemHintRec, *CF2_StemHint; - - - /* - * A HintMap object stores a piecewise linear function for mapping - * y-coordinates from character space to device space, providing - * appropriate pixel alignment to stem edges. - * - * The map is implemented as an array of `CF2_Hint' elements, each - * representing an edge. When edges are paired, as from stem hints, the - * bottom edge must immediately precede the top edge in the array. - * Element character space AND device space positions must both increase - * monotonically in the array. `CF2_Hint' elements are also used as - * parameters to `cf2_blues_capture'. - * - * The `cf2_hintmap_build' method must be called before any drawing - * operation (beginning with a Move operator) and at each hint - * substitution (HintMask operator). - * - * The `cf2_hintmap_map' method is called to transform y-coordinates at - * each drawing operation (move, line, curve). - * - */ - - /* TODO: make this a CF2_ArrStack and add a deep copy method */ - enum - { - CF2_MAX_HINT_EDGES = CF2_MAX_HINTS * 2 - }; - - - typedef struct CF2_HintMapRec_ - { - CF2_Font font; - - /* initial map based on blue zones */ - struct CF2_HintMapRec_* initialHintMap; - - /* working storage for 2nd pass adjustHints */ - CF2_ArrStack hintMoves; - - FT_Bool isValid; - FT_Bool hinted; - - CF2_Fixed scale; - CF2_UInt count; - - /* start search from this index */ - CF2_UInt lastIndex; - - CF2_HintRec edge[CF2_MAX_HINT_EDGES]; /* 192 */ - - } CF2_HintMapRec, *CF2_HintMap; - - - FT_LOCAL( FT_Bool ) - cf2_hint_isValid( const CF2_Hint hint ); - FT_LOCAL( FT_Bool ) - cf2_hint_isTop( const CF2_Hint hint ); - FT_LOCAL( FT_Bool ) - cf2_hint_isBottom( const CF2_Hint hint ); - FT_LOCAL( void ) - cf2_hint_lock( CF2_Hint hint ); - - - FT_LOCAL( void ) - cf2_hintmap_init( CF2_HintMap hintmap, - CF2_Font font, - CF2_HintMap initialMap, - CF2_ArrStack hintMoves, - CF2_Fixed scale ); - FT_LOCAL( void ) - cf2_hintmap_build( CF2_HintMap hintmap, - CF2_ArrStack hStemHintArray, - CF2_ArrStack vStemHintArray, - CF2_HintMask hintMask, - CF2_Fixed hintOrigin, - FT_Bool initialMap ); - - - /* - * GlyphPath is a wrapper for drawing operations that scales the - * coordinates according to the render matrix and HintMap. It also tracks - * open paths to control ClosePath and to insert MoveTo for broken fonts. - * - */ - typedef struct CF2_GlyphPathRec_ - { - /* TODO: gather some of these into a hinting context */ - - CF2_Font font; /* font instance */ - CF2_OutlineCallbacks callbacks; /* outline consumer */ - - - CF2_HintMapRec hintMap; /* current hint map */ - CF2_HintMapRec firstHintMap; /* saved copy */ - CF2_HintMapRec initialHintMap; /* based on all captured hints */ - - CF2_ArrStackRec hintMoves; /* list of hint moves for 2nd pass */ - - CF2_Fixed scaleX; /* matrix a */ - CF2_Fixed scaleC; /* matrix c */ - CF2_Fixed scaleY; /* matrix d */ - - FT_Vector fractionalTranslation; /* including deviceXScale */ -#if 0 - CF2_Fixed hShift; /* character space horizontal shift */ - /* (for fauxing) */ -#endif - - FT_Bool pathIsOpen; /* true after MoveTo */ - FT_Bool pathIsClosing; /* true when synthesizing closepath line */ - FT_Bool darken; /* true if stem darkening */ - FT_Bool moveIsPending; /* true between MoveTo and offset MoveTo */ - - /* references used to call `cf2_hintmap_build', if necessary */ - CF2_ArrStack hStemHintArray; - CF2_ArrStack vStemHintArray; - CF2_HintMask hintMask; /* ptr to the current mask */ - CF2_Fixed hintOriginY; /* copy of current origin */ - const CF2_BluesRec* blues; - - CF2_Fixed xOffset; /* character space offsets */ - CF2_Fixed yOffset; - - /* character space miter limit threshold */ - CF2_Fixed miterLimit; - /* vertical/horzizontal snap distance in character space */ - CF2_Fixed snapThreshold; - - FT_Vector offsetStart0; /* first and second points of first */ - FT_Vector offsetStart1; /* element with offset applied */ - - /* current point, character space, before offset */ - FT_Vector currentCS; - /* current point, device space */ - FT_Vector currentDS; - /* start point of subpath, character space */ - FT_Vector start; - - /* the following members constitute the `queue' of one element */ - FT_Bool elemIsQueued; - CF2_Int prevElemOp; - - FT_Vector prevElemP0; - FT_Vector prevElemP1; - FT_Vector prevElemP2; - FT_Vector prevElemP3; - - } CF2_GlyphPathRec, *CF2_GlyphPath; - - - FT_LOCAL( void ) - cf2_glyphpath_init( CF2_GlyphPath glyphpath, - CF2_Font font, - CF2_OutlineCallbacks callbacks, - CF2_Fixed scaleY, - /* CF2_Fixed hShift, */ - CF2_ArrStack hStemHintArray, - CF2_ArrStack vStemHintArray, - CF2_HintMask hintMask, - CF2_Fixed hintOrigin, - const CF2_Blues blues, - const FT_Vector* fractionalTranslation ); - FT_LOCAL( void ) - cf2_glyphpath_finalize( CF2_GlyphPath glyphpath ); - - FT_LOCAL( void ) - cf2_glyphpath_moveTo( CF2_GlyphPath glyphpath, - CF2_Fixed x, - CF2_Fixed y ); - FT_LOCAL( void ) - cf2_glyphpath_lineTo( CF2_GlyphPath glyphpath, - CF2_Fixed x, - CF2_Fixed y ); - FT_LOCAL( void ) - cf2_glyphpath_curveTo( CF2_GlyphPath glyphpath, - CF2_Fixed x1, - CF2_Fixed y1, - CF2_Fixed x2, - CF2_Fixed y2, - CF2_Fixed x3, - CF2_Fixed y3 ); - FT_LOCAL( void ) - cf2_glyphpath_closeOpenPath( CF2_GlyphPath glyphpath ); - - -FT_END_HEADER - - -#endif /* __CF2HINTS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cf2intrp.c b/3party/freetype/src/cff/cf2intrp.c deleted file mode 100644 index ff3fa9aaaa..0000000000 --- a/3party/freetype/src/cff/cf2intrp.c +++ /dev/null @@ -1,1571 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2intrp.c */ -/* */ -/* Adobe's CFF Interpreter (body). */ -/* */ -/* Copyright 2007-2014 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2glue.h" -#include "cf2font.h" -#include "cf2stack.h" -#include "cf2hints.h" -#include "cf2intrp.h" - -#include "cf2error.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cf2interp - - - /* some operators are not implemented yet */ -#define CF2_FIXME FT_TRACE4(( "cf2_interpT2CharString:" \ - " operator not implemented yet\n" )) - - - - FT_LOCAL_DEF( void ) - cf2_hintmask_init( CF2_HintMask hintmask, - FT_Error* error ) - { - FT_ZERO( hintmask ); - - hintmask->error = error; - } - - - FT_LOCAL_DEF( FT_Bool ) - cf2_hintmask_isValid( const CF2_HintMask hintmask ) - { - return hintmask->isValid; - } - - - FT_LOCAL_DEF( FT_Bool ) - cf2_hintmask_isNew( const CF2_HintMask hintmask ) - { - return hintmask->isNew; - } - - - FT_LOCAL_DEF( void ) - cf2_hintmask_setNew( CF2_HintMask hintmask, - FT_Bool val ) - { - hintmask->isNew = val; - } - - - /* clients call `getMaskPtr' in order to iterate */ - /* through hint mask */ - - FT_LOCAL_DEF( FT_Byte* ) - cf2_hintmask_getMaskPtr( CF2_HintMask hintmask ) - { - return hintmask->mask; - } - - - static size_t - cf2_hintmask_setCounts( CF2_HintMask hintmask, - size_t bitCount ) - { - if ( bitCount > CF2_MAX_HINTS ) - { - /* total of h and v stems must be <= 96 */ - CF2_SET_ERROR( hintmask->error, Invalid_Glyph_Format ); - return 0; - } - - hintmask->bitCount = bitCount; - hintmask->byteCount = ( hintmask->bitCount + 7 ) / 8; - - hintmask->isValid = TRUE; - hintmask->isNew = TRUE; - - return bitCount; - } - - - /* consume the hintmask bytes from the charstring, advancing the src */ - /* pointer */ - static void - cf2_hintmask_read( CF2_HintMask hintmask, - CF2_Buffer charstring, - size_t bitCount ) - { - size_t i; - -#ifndef CF2_NDEBUG - /* these are the bits in the final mask byte that should be zero */ - /* Note: this variable is only used in an assert expression below */ - /* and then only if CF2_NDEBUG is not defined */ - CF2_UInt mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1; -#endif - - - /* initialize counts and isValid */ - if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 ) - return; - - FT_ASSERT( hintmask->byteCount > 0 ); - - FT_TRACE4(( " (maskbytes:" )); - - /* set mask and advance interpreter's charstring pointer */ - for ( i = 0; i < hintmask->byteCount; i++ ) - { - hintmask->mask[i] = (FT_Byte)cf2_buf_readByte( charstring ); - FT_TRACE4(( " 0x%02X", hintmask->mask[i] )); - } - - FT_TRACE4(( ")\n" )); - - /* assert any unused bits in last byte are zero unless there's a prior */ - /* error */ - /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */ -#ifndef CF2_NDEBUG - FT_ASSERT( ( hintmask->mask[hintmask->byteCount - 1] & mask ) == 0 || - *hintmask->error ); -#endif - } - - - FT_LOCAL_DEF( void ) - cf2_hintmask_setAll( CF2_HintMask hintmask, - size_t bitCount ) - { - size_t i; - CF2_UInt mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1; - - - /* initialize counts and isValid */ - if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 ) - return; - - FT_ASSERT( hintmask->byteCount > 0 ); - FT_ASSERT( hintmask->byteCount < - sizeof ( hintmask->mask ) / sizeof ( hintmask->mask[0] ) ); - - /* set mask to all ones */ - for ( i = 0; i < hintmask->byteCount; i++ ) - hintmask->mask[i] = 0xFF; - - /* clear unused bits */ - /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */ - hintmask->mask[hintmask->byteCount - 1] &= ~mask; - } - - - /* Type2 charstring opcodes */ - enum - { - cf2_cmdRESERVED_0, /* 0 */ - cf2_cmdHSTEM, /* 1 */ - cf2_cmdRESERVED_2, /* 2 */ - cf2_cmdVSTEM, /* 3 */ - cf2_cmdVMOVETO, /* 4 */ - cf2_cmdRLINETO, /* 5 */ - cf2_cmdHLINETO, /* 6 */ - cf2_cmdVLINETO, /* 7 */ - cf2_cmdRRCURVETO, /* 8 */ - cf2_cmdRESERVED_9, /* 9 */ - cf2_cmdCALLSUBR, /* 10 */ - cf2_cmdRETURN, /* 11 */ - cf2_cmdESC, /* 12 */ - cf2_cmdRESERVED_13, /* 13 */ - cf2_cmdENDCHAR, /* 14 */ - cf2_cmdRESERVED_15, /* 15 */ - cf2_cmdRESERVED_16, /* 16 */ - cf2_cmdRESERVED_17, /* 17 */ - cf2_cmdHSTEMHM, /* 18 */ - cf2_cmdHINTMASK, /* 19 */ - cf2_cmdCNTRMASK, /* 20 */ - cf2_cmdRMOVETO, /* 21 */ - cf2_cmdHMOVETO, /* 22 */ - cf2_cmdVSTEMHM, /* 23 */ - cf2_cmdRCURVELINE, /* 24 */ - cf2_cmdRLINECURVE, /* 25 */ - cf2_cmdVVCURVETO, /* 26 */ - cf2_cmdHHCURVETO, /* 27 */ - cf2_cmdEXTENDEDNMBR, /* 28 */ - cf2_cmdCALLGSUBR, /* 29 */ - cf2_cmdVHCURVETO, /* 30 */ - cf2_cmdHVCURVETO /* 31 */ - }; - - enum - { - cf2_escDOTSECTION, /* 0 */ - cf2_escRESERVED_1, /* 1 */ - cf2_escRESERVED_2, /* 2 */ - cf2_escAND, /* 3 */ - cf2_escOR, /* 4 */ - cf2_escNOT, /* 5 */ - cf2_escRESERVED_6, /* 6 */ - cf2_escRESERVED_7, /* 7 */ - cf2_escRESERVED_8, /* 8 */ - cf2_escABS, /* 9 */ - cf2_escADD, /* 10 like otherADD */ - cf2_escSUB, /* 11 like otherSUB */ - cf2_escDIV, /* 12 */ - cf2_escRESERVED_13, /* 13 */ - cf2_escNEG, /* 14 */ - cf2_escEQ, /* 15 */ - cf2_escRESERVED_16, /* 16 */ - cf2_escRESERVED_17, /* 17 */ - cf2_escDROP, /* 18 */ - cf2_escRESERVED_19, /* 19 */ - cf2_escPUT, /* 20 like otherPUT */ - cf2_escGET, /* 21 like otherGET */ - cf2_escIFELSE, /* 22 like otherIFELSE */ - cf2_escRANDOM, /* 23 like otherRANDOM */ - cf2_escMUL, /* 24 like otherMUL */ - cf2_escRESERVED_25, /* 25 */ - cf2_escSQRT, /* 26 */ - cf2_escDUP, /* 27 like otherDUP */ - cf2_escEXCH, /* 28 like otherEXCH */ - cf2_escINDEX, /* 29 */ - cf2_escROLL, /* 30 */ - cf2_escRESERVED_31, /* 31 */ - cf2_escRESERVED_32, /* 32 */ - cf2_escRESERVED_33, /* 33 */ - cf2_escHFLEX, /* 34 */ - cf2_escFLEX, /* 35 */ - cf2_escHFLEX1, /* 36 */ - cf2_escFLEX1 /* 37 */ - }; - - - /* `stemHintArray' does not change once we start drawing the outline. */ - static void - cf2_doStems( const CF2_Font font, - CF2_Stack opStack, - CF2_ArrStack stemHintArray, - CF2_Fixed* width, - FT_Bool* haveWidth, - CF2_Fixed hintOffset ) - { - CF2_UInt i; - CF2_UInt count = cf2_stack_count( opStack ); - FT_Bool hasWidthArg = (FT_Bool)( count & 1 ); - - /* variable accumulates delta values from operand stack */ - CF2_Fixed position = hintOffset; - - if ( hasWidthArg && ! *haveWidth ) - *width = cf2_stack_getReal( opStack, 0 ) + - cf2_getNominalWidthX( font->decoder ); - - if ( font->decoder->width_only ) - goto exit; - - for ( i = hasWidthArg ? 1 : 0; i < count; i += 2 ) - { - /* construct a CF2_StemHint and push it onto the list */ - CF2_StemHintRec stemhint; - - - stemhint.min = - position += cf2_stack_getReal( opStack, i ); - stemhint.max = - position += cf2_stack_getReal( opStack, i + 1 ); - - stemhint.used = FALSE; - stemhint.maxDS = - stemhint.minDS = 0; - - cf2_arrstack_push( stemHintArray, &stemhint ); /* defer error check */ - } - - cf2_stack_clear( opStack ); - - exit: - /* cf2_doStems must define a width (may be default) */ - *haveWidth = TRUE; - } - - - static void - cf2_doFlex( CF2_Stack opStack, - CF2_Fixed* curX, - CF2_Fixed* curY, - CF2_GlyphPath glyphPath, - const FT_Bool* readFromStack, - FT_Bool doConditionalLastRead ) - { - CF2_Fixed vals[14]; - CF2_UInt index; - FT_Bool isHFlex; - CF2_Int top, i, j; - - - vals[0] = *curX; - vals[1] = *curY; - index = 0; - isHFlex = readFromStack[9] == FALSE; - top = isHFlex ? 9 : 10; - - for ( i = 0; i < top; i++ ) - { - vals[i + 2] = vals[i]; - if ( readFromStack[i] ) - vals[i + 2] += cf2_stack_getReal( opStack, index++ ); - } - - if ( isHFlex ) - vals[9 + 2] = *curY; - - if ( doConditionalLastRead ) - { - FT_Bool lastIsX = (FT_Bool)( cf2_fixedAbs( vals[10] - *curX ) > - cf2_fixedAbs( vals[11] - *curY ) ); - CF2_Fixed lastVal = cf2_stack_getReal( opStack, index ); - - - if ( lastIsX ) - { - vals[12] = vals[10] + lastVal; - vals[13] = *curY; - } - else - { - vals[12] = *curX; - vals[13] = vals[11] + lastVal; - } - } - else - { - if ( readFromStack[10] ) - vals[12] = vals[10] + cf2_stack_getReal( opStack, index++ ); - else - vals[12] = *curX; - - if ( readFromStack[11] ) - vals[13] = vals[11] + cf2_stack_getReal( opStack, index ); - else - vals[13] = *curY; - } - - for ( j = 0; j < 2; j++ ) - cf2_glyphpath_curveTo( glyphPath, vals[j * 6 + 2], - vals[j * 6 + 3], - vals[j * 6 + 4], - vals[j * 6 + 5], - vals[j * 6 + 6], - vals[j * 6 + 7] ); - - cf2_stack_clear( opStack ); - - *curX = vals[12]; - *curY = vals[13]; - } - - - /* - * `error' is a shared error code used by many objects in this - * routine. Before the code continues from an error, it must check and - * record the error in `*error'. The idea is that this shared - * error code will record the first error encountered. If testing - * for an error anyway, the cost of `goto exit' is small, so we do it, - * even if continuing would be safe. In this case, `lastError' is - * set, so the testing and storing can be done in one place, at `exit'. - * - * Continuing after an error is intended for objects which do their own - * testing of `*error', e.g., array stack functions. This allows us to - * avoid an extra test after the call. - * - * Unimplemented opcodes are ignored. - * - */ - FT_LOCAL_DEF( void ) - cf2_interpT2CharString( CF2_Font font, - CF2_Buffer buf, - CF2_OutlineCallbacks callbacks, - const FT_Vector* translation, - FT_Bool doingSeac, - CF2_Fixed curX, - CF2_Fixed curY, - CF2_Fixed* width ) - { - /* lastError is used for errors that are immediately tested */ - FT_Error lastError = FT_Err_Ok; - - /* pointer to parsed font object */ - CFF_Decoder* decoder = font->decoder; - - FT_Error* error = &font->error; - FT_Memory memory = font->memory; - - CF2_Fixed scaleY = font->innerTransform.d; - CF2_Fixed nominalWidthX = cf2_getNominalWidthX( decoder ); - - /* save this for hinting seac accents */ - CF2_Fixed hintOriginY = curY; - - CF2_Stack opStack = NULL; - FT_Byte op1; /* first opcode byte */ - - /* instruction limit; 20,000,000 matches Avalon */ - FT_UInt32 instructionLimit = 20000000UL; - - CF2_ArrStackRec subrStack; - - FT_Bool haveWidth; - CF2_Buffer charstring = NULL; - - CF2_Int charstringIndex = -1; /* initialize to empty */ - - /* TODO: placeholders for hint structures */ - - /* objects used for hinting */ - CF2_ArrStackRec hStemHintArray; - CF2_ArrStackRec vStemHintArray; - - CF2_HintMaskRec hintMask; - CF2_GlyphPathRec glyphPath; - - - /* initialize the remaining objects */ - cf2_arrstack_init( &subrStack, - memory, - error, - sizeof ( CF2_BufferRec ) ); - cf2_arrstack_init( &hStemHintArray, - memory, - error, - sizeof ( CF2_StemHintRec ) ); - cf2_arrstack_init( &vStemHintArray, - memory, - error, - sizeof ( CF2_StemHintRec ) ); - - /* initialize CF2_StemHint arrays */ - cf2_hintmask_init( &hintMask, error ); - - /* initialize path map to manage drawing operations */ - - /* Note: last 4 params are used to handle `MoveToPermissive', which */ - /* may need to call `hintMap.Build' */ - /* TODO: MoveToPermissive is gone; are these still needed? */ - cf2_glyphpath_init( &glyphPath, - font, - callbacks, - scaleY, - /* hShift, */ - &hStemHintArray, - &vStemHintArray, - &hintMask, - hintOriginY, - &font->blues, - translation ); - - /* - * Initialize state for width parsing. From the CFF Spec: - * - * The first stack-clearing operator, which must be one of hstem, - * hstemhm, vstem, vstemhm, cntrmask, hintmask, hmoveto, vmoveto, - * rmoveto, or endchar, takes an additional argument - the width (as - * described earlier), which may be expressed as zero or one numeric - * argument. - * - * What we implement here uses the first validly specified width, but - * does not detect errors for specifying more than one width. - * - * If one of the above operators occurs without explicitly specifying - * a width, we assume the default width. - * - */ - haveWidth = FALSE; - *width = cf2_getDefaultWidthX( decoder ); - - /* - * Note: at this point, all pointers to resources must be NULL - * and all local objects must be initialized. - * There must be no branches to exit: above this point. - * - */ - - /* allocate an operand stack */ - opStack = cf2_stack_init( memory, error ); - if ( !opStack ) - { - lastError = FT_THROW( Out_Of_Memory ); - goto exit; - } - - /* initialize subroutine stack by placing top level charstring as */ - /* first element (max depth plus one for the charstring) */ - /* Note: Caller owns and must finalize the first charstring. */ - /* Our copy of it does not change that requirement. */ - cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 ); - - charstring = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack ); - *charstring = *buf; /* structure copy */ - - charstringIndex = 0; /* entry is valid now */ - - /* catch errors so far */ - if ( *error ) - goto exit; - - /* main interpreter loop */ - while ( 1 ) - { - if ( cf2_buf_isEnd( charstring ) ) - { - /* If we've reached the end of the charstring, simulate a */ - /* cf2_cmdRETURN or cf2_cmdENDCHAR. */ - if ( charstringIndex ) - op1 = cf2_cmdRETURN; /* end of buffer for subroutine */ - else - op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */ - } - else - op1 = (FT_Byte)cf2_buf_readByte( charstring ); - - /* check for errors once per loop */ - if ( *error ) - goto exit; - - instructionLimit--; - if ( instructionLimit == 0 ) - { - lastError = FT_THROW( Invalid_Glyph_Format ); - goto exit; - } - - switch( op1 ) - { - case cf2_cmdRESERVED_0: - case cf2_cmdRESERVED_2: - case cf2_cmdRESERVED_9: - case cf2_cmdRESERVED_13: - case cf2_cmdRESERVED_15: - case cf2_cmdRESERVED_16: - case cf2_cmdRESERVED_17: - /* we may get here if we have a prior error */ - FT_TRACE4(( " unknown op (%d)\n", op1 )); - break; - - case cf2_cmdHSTEMHM: - case cf2_cmdHSTEM: - FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? " hstemhm\n" : " hstem\n" )); - - /* never add hints after the mask is computed */ - if ( cf2_hintmask_isValid( &hintMask ) ) - { - FT_TRACE4(( "cf2_interpT2CharString:" - " invalid horizontal hint mask\n" )); - break; - } - - cf2_doStems( font, - opStack, - &hStemHintArray, - width, - &haveWidth, - 0 ); - - if ( font->decoder->width_only ) - goto exit; - - break; - - case cf2_cmdVSTEMHM: - case cf2_cmdVSTEM: - FT_TRACE4(( op1 == cf2_cmdVSTEMHM ? " vstemhm\n" : " vstem\n" )); - - /* never add hints after the mask is computed */ - if ( cf2_hintmask_isValid( &hintMask ) ) - { - FT_TRACE4(( "cf2_interpT2CharString:" - " invalid vertical hint mask\n" )); - break; - } - - cf2_doStems( font, - opStack, - &vStemHintArray, - width, - &haveWidth, - 0 ); - - if ( font->decoder->width_only ) - goto exit; - - break; - - case cf2_cmdVMOVETO: - FT_TRACE4(( " vmoveto\n" )); - - if ( cf2_stack_count( opStack ) > 1 && !haveWidth ) - *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX; - - /* width is defined or default after this */ - haveWidth = TRUE; - - if ( font->decoder->width_only ) - goto exit; - - curY += cf2_stack_popFixed( opStack ); - - cf2_glyphpath_moveTo( &glyphPath, curX, curY ); - - break; - - case cf2_cmdRLINETO: - { - CF2_UInt index; - CF2_UInt count = cf2_stack_count( opStack ); - - - FT_TRACE4(( " rlineto\n" )); - - for ( index = 0; index < count; index += 2 ) - { - curX += cf2_stack_getReal( opStack, index + 0 ); - curY += cf2_stack_getReal( opStack, index + 1 ); - - cf2_glyphpath_lineTo( &glyphPath, curX, curY ); - } - - cf2_stack_clear( opStack ); - } - continue; /* no need to clear stack again */ - - case cf2_cmdHLINETO: - case cf2_cmdVLINETO: - { - CF2_UInt index; - CF2_UInt count = cf2_stack_count( opStack ); - - FT_Bool isX = op1 == cf2_cmdHLINETO; - - - FT_TRACE4(( isX ? " hlineto\n" : " vlineto\n" )); - - for ( index = 0; index < count; index++ ) - { - CF2_Fixed v = cf2_stack_getReal( opStack, index ); - - - if ( isX ) - curX += v; - else - curY += v; - - isX = !isX; - - cf2_glyphpath_lineTo( &glyphPath, curX, curY ); - } - - cf2_stack_clear( opStack ); - } - continue; - - case cf2_cmdRCURVELINE: - case cf2_cmdRRCURVETO: - { - CF2_UInt count = cf2_stack_count( opStack ); - CF2_UInt index = 0; - - - FT_TRACE4(( op1 == cf2_cmdRCURVELINE ? " rcurveline\n" - : " rrcurveto\n" )); - - while ( index + 6 <= count ) - { - CF2_Fixed x1 = cf2_stack_getReal( opStack, index + 0 ) + curX; - CF2_Fixed y1 = cf2_stack_getReal( opStack, index + 1 ) + curY; - CF2_Fixed x2 = cf2_stack_getReal( opStack, index + 2 ) + x1; - CF2_Fixed y2 = cf2_stack_getReal( opStack, index + 3 ) + y1; - CF2_Fixed x3 = cf2_stack_getReal( opStack, index + 4 ) + x2; - CF2_Fixed y3 = cf2_stack_getReal( opStack, index + 5 ) + y2; - - - cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - - curX = x3; - curY = y3; - index += 6; - } - - if ( op1 == cf2_cmdRCURVELINE ) - { - curX += cf2_stack_getReal( opStack, index + 0 ); - curY += cf2_stack_getReal( opStack, index + 1 ); - - cf2_glyphpath_lineTo( &glyphPath, curX, curY ); - } - - cf2_stack_clear( opStack ); - } - continue; /* no need to clear stack again */ - - case cf2_cmdCALLGSUBR: - case cf2_cmdCALLSUBR: - { - CF2_UInt subrIndex; - - - FT_TRACE4(( op1 == cf2_cmdCALLGSUBR ? " callgsubr" - : " callsubr" )); - - if ( charstringIndex > CF2_MAX_SUBR ) - { - /* max subr plus one for charstring */ - lastError = FT_THROW( Invalid_Glyph_Format ); - goto exit; /* overflow of stack */ - } - - /* push our current CFF charstring region on subrStack */ - charstring = (CF2_Buffer) - cf2_arrstack_getPointer( - &subrStack, - (size_t)charstringIndex + 1 ); - - /* set up the new CFF region and pointer */ - subrIndex = (CF2_UInt)cf2_stack_popInt( opStack ); - - switch ( op1 ) - { - case cf2_cmdCALLGSUBR: - FT_TRACE4(( " (idx %d, entering level %d)\n", - subrIndex + (CF2_UInt)decoder->globals_bias, - charstringIndex + 1 )); - - if ( cf2_initGlobalRegionBuffer( decoder, - subrIndex, - charstring ) ) - { - lastError = FT_THROW( Invalid_Glyph_Format ); - goto exit; /* subroutine lookup or stream error */ - } - break; - - default: - /* cf2_cmdCALLSUBR */ - FT_TRACE4(( " (idx %d, entering level %d)\n", - subrIndex + (CF2_UInt)decoder->locals_bias, - charstringIndex + 1 )); - - if ( cf2_initLocalRegionBuffer( decoder, - subrIndex, - charstring ) ) - { - lastError = FT_THROW( Invalid_Glyph_Format ); - goto exit; /* subroutine lookup or stream error */ - } - } - - charstringIndex += 1; /* entry is valid now */ - } - continue; /* do not clear the stack */ - - case cf2_cmdRETURN: - FT_TRACE4(( " return (leaving level %d)\n", charstringIndex )); - - if ( charstringIndex < 1 ) - { - /* Note: cannot return from top charstring */ - lastError = FT_THROW( Invalid_Glyph_Format ); - goto exit; /* underflow of stack */ - } - - /* restore position in previous charstring */ - charstring = (CF2_Buffer) - cf2_arrstack_getPointer( - &subrStack, - (CF2_UInt)--charstringIndex ); - continue; /* do not clear the stack */ - - case cf2_cmdESC: - { - FT_Byte op2 = (FT_Byte)cf2_buf_readByte( charstring ); - - - switch ( op2 ) - { - case cf2_escDOTSECTION: - /* something about `flip type of locking' -- ignore it */ - FT_TRACE4(( " dotsection\n" )); - - break; - - /* TODO: should these operators be supported? */ - case cf2_escAND: /* in spec */ - FT_TRACE4(( " and\n" )); - - CF2_FIXME; - break; - - case cf2_escOR: /* in spec */ - FT_TRACE4(( " or\n" )); - - CF2_FIXME; - break; - - case cf2_escNOT: /* in spec */ - FT_TRACE4(( " not\n" )); - - CF2_FIXME; - break; - - case cf2_escABS: /* in spec */ - FT_TRACE4(( " abs\n" )); - - CF2_FIXME; - break; - - case cf2_escADD: /* in spec */ - FT_TRACE4(( " add\n" )); - - CF2_FIXME; - break; - - case cf2_escSUB: /* in spec */ - FT_TRACE4(( " sub\n" )); - - CF2_FIXME; - break; - - case cf2_escDIV: /* in spec */ - FT_TRACE4(( " div\n" )); - - CF2_FIXME; - break; - - case cf2_escNEG: /* in spec */ - FT_TRACE4(( " neg\n" )); - - CF2_FIXME; - break; - - case cf2_escEQ: /* in spec */ - FT_TRACE4(( " eq\n" )); - - CF2_FIXME; - break; - - case cf2_escDROP: /* in spec */ - FT_TRACE4(( " drop\n" )); - - CF2_FIXME; - break; - - case cf2_escPUT: /* in spec */ - FT_TRACE4(( " put\n" )); - - CF2_FIXME; - break; - - case cf2_escGET: /* in spec */ - FT_TRACE4(( " get\n" )); - - CF2_FIXME; - break; - - case cf2_escIFELSE: /* in spec */ - FT_TRACE4(( " ifelse\n" )); - - CF2_FIXME; - break; - - case cf2_escRANDOM: /* in spec */ - FT_TRACE4(( " random\n" )); - - CF2_FIXME; - break; - - case cf2_escMUL: /* in spec */ - FT_TRACE4(( " mul\n" )); - - CF2_FIXME; - break; - - case cf2_escSQRT: /* in spec */ - FT_TRACE4(( " sqrt\n" )); - - CF2_FIXME; - break; - - case cf2_escDUP: /* in spec */ - FT_TRACE4(( " dup\n" )); - - CF2_FIXME; - break; - - case cf2_escEXCH: /* in spec */ - FT_TRACE4(( " exch\n" )); - - CF2_FIXME; - break; - - case cf2_escINDEX: /* in spec */ - FT_TRACE4(( " index\n" )); - - CF2_FIXME; - break; - - case cf2_escROLL: /* in spec */ - FT_TRACE4(( " roll\n" )); - - CF2_FIXME; - break; - - case cf2_escHFLEX: - { - static const FT_Bool readFromStack[12] = - { - TRUE /* dx1 */, FALSE /* dy1 */, - TRUE /* dx2 */, TRUE /* dy2 */, - TRUE /* dx3 */, FALSE /* dy3 */, - TRUE /* dx4 */, FALSE /* dy4 */, - TRUE /* dx5 */, FALSE /* dy5 */, - TRUE /* dx6 */, FALSE /* dy6 */ - }; - - - FT_TRACE4(( " hflex\n" )); - - cf2_doFlex( opStack, - &curX, - &curY, - &glyphPath, - readFromStack, - FALSE /* doConditionalLastRead */ ); - } - continue; - - case cf2_escFLEX: - { - static const FT_Bool readFromStack[12] = - { - TRUE /* dx1 */, TRUE /* dy1 */, - TRUE /* dx2 */, TRUE /* dy2 */, - TRUE /* dx3 */, TRUE /* dy3 */, - TRUE /* dx4 */, TRUE /* dy4 */, - TRUE /* dx5 */, TRUE /* dy5 */, - TRUE /* dx6 */, TRUE /* dy6 */ - }; - - - FT_TRACE4(( " flex\n" )); - - cf2_doFlex( opStack, - &curX, - &curY, - &glyphPath, - readFromStack, - FALSE /* doConditionalLastRead */ ); - } - break; /* TODO: why is this not a continue? */ - - case cf2_escHFLEX1: - { - static const FT_Bool readFromStack[12] = - { - TRUE /* dx1 */, TRUE /* dy1 */, - TRUE /* dx2 */, TRUE /* dy2 */, - TRUE /* dx3 */, FALSE /* dy3 */, - TRUE /* dx4 */, FALSE /* dy4 */, - TRUE /* dx5 */, TRUE /* dy5 */, - TRUE /* dx6 */, FALSE /* dy6 */ - }; - - - FT_TRACE4(( " hflex1\n" )); - - cf2_doFlex( opStack, - &curX, - &curY, - &glyphPath, - readFromStack, - FALSE /* doConditionalLastRead */ ); - } - continue; - - case cf2_escFLEX1: - { - static const FT_Bool readFromStack[12] = - { - TRUE /* dx1 */, TRUE /* dy1 */, - TRUE /* dx2 */, TRUE /* dy2 */, - TRUE /* dx3 */, TRUE /* dy3 */, - TRUE /* dx4 */, TRUE /* dy4 */, - TRUE /* dx5 */, TRUE /* dy5 */, - FALSE /* dx6 */, FALSE /* dy6 */ - }; - - - FT_TRACE4(( " flex1\n" )); - - cf2_doFlex( opStack, - &curX, - &curY, - &glyphPath, - readFromStack, - TRUE /* doConditionalLastRead */ ); - } - continue; - - case cf2_escRESERVED_1: - case cf2_escRESERVED_2: - case cf2_escRESERVED_6: - case cf2_escRESERVED_7: - case cf2_escRESERVED_8: - case cf2_escRESERVED_13: - case cf2_escRESERVED_16: - case cf2_escRESERVED_17: - case cf2_escRESERVED_19: - case cf2_escRESERVED_25: - case cf2_escRESERVED_31: - case cf2_escRESERVED_32: - case cf2_escRESERVED_33: - default: - FT_TRACE4(( " unknown op (12, %d)\n", op2 )); - - }; /* end of switch statement checking `op2' */ - - } /* case cf2_cmdESC */ - break; - - case cf2_cmdENDCHAR: - FT_TRACE4(( " endchar\n" )); - - if ( cf2_stack_count( opStack ) == 1 || - cf2_stack_count( opStack ) == 5 ) - { - if ( !haveWidth ) - *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX; - } - - /* width is defined or default after this */ - haveWidth = TRUE; - - if ( font->decoder->width_only ) - goto exit; - - /* close path if still open */ - cf2_glyphpath_closeOpenPath( &glyphPath ); - - if ( cf2_stack_count( opStack ) > 1 ) - { - /* must be either 4 or 5 -- */ - /* this is a (deprecated) implied `seac' operator */ - - CF2_Int achar; - CF2_Int bchar; - CF2_BufferRec component; - CF2_Fixed dummyWidth; /* ignore component width */ - FT_Error error2; - - - if ( doingSeac ) - { - lastError = FT_THROW( Invalid_Glyph_Format ); - goto exit; /* nested seac */ - } - - achar = cf2_stack_popInt( opStack ); - bchar = cf2_stack_popInt( opStack ); - - curY = cf2_stack_popFixed( opStack ); - curX = cf2_stack_popFixed( opStack ); - - error2 = cf2_getSeacComponent( decoder, achar, &component ); - if ( error2 ) - { - lastError = error2; /* pass FreeType error through */ - goto exit; - } - cf2_interpT2CharString( font, - &component, - callbacks, - translation, - TRUE, - curX, - curY, - &dummyWidth ); - cf2_freeSeacComponent( decoder, &component ); - - error2 = cf2_getSeacComponent( decoder, bchar, &component ); - if ( error2 ) - { - lastError = error2; /* pass FreeType error through */ - goto exit; - } - cf2_interpT2CharString( font, - &component, - callbacks, - translation, - TRUE, - 0, - 0, - &dummyWidth ); - cf2_freeSeacComponent( decoder, &component ); - } - goto exit; - - case cf2_cmdCNTRMASK: - case cf2_cmdHINTMASK: - /* the final \n in the tracing message gets added in */ - /* `cf2_hintmask_read' (which also traces the mask bytes) */ - FT_TRACE4(( op1 == cf2_cmdCNTRMASK ? " cntrmask" : " hintmask" )); - - /* never add hints after the mask is computed */ - if ( cf2_stack_count( opStack ) > 1 && - cf2_hintmask_isValid( &hintMask ) ) - { - FT_TRACE4(( "cf2_interpT2CharString: invalid hint mask\n" )); - break; - } - - /* if there are arguments on the stack, there this is an */ - /* implied cf2_cmdVSTEMHM */ - cf2_doStems( font, - opStack, - &vStemHintArray, - width, - &haveWidth, - 0 ); - - if ( font->decoder->width_only ) - goto exit; - - if ( op1 == cf2_cmdHINTMASK ) - { - /* consume the hint mask bytes which follow the operator */ - cf2_hintmask_read( &hintMask, - charstring, - cf2_arrstack_size( &hStemHintArray ) + - cf2_arrstack_size( &vStemHintArray ) ); - } - else - { - /* - * Consume the counter mask bytes which follow the operator: - * Build a temporary hint map, just to place and lock those - * stems participating in the counter mask. These are most - * likely the dominant hstems, and are grouped together in a - * few counter groups, not necessarily in correspondence - * with the hint groups. This reduces the chances of - * conflicts between hstems that are initially placed in - * separate hint groups and then brought together. The - * positions are copied back to `hStemHintArray', so we can - * discard `counterMask' and `counterHintMap'. - * - */ - CF2_HintMapRec counterHintMap; - CF2_HintMaskRec counterMask; - - - cf2_hintmap_init( &counterHintMap, - font, - &glyphPath.initialHintMap, - &glyphPath.hintMoves, - scaleY ); - cf2_hintmask_init( &counterMask, error ); - - cf2_hintmask_read( &counterMask, - charstring, - cf2_arrstack_size( &hStemHintArray ) + - cf2_arrstack_size( &vStemHintArray ) ); - cf2_hintmap_build( &counterHintMap, - &hStemHintArray, - &vStemHintArray, - &counterMask, - 0, - FALSE ); - } - break; - - case cf2_cmdRMOVETO: - FT_TRACE4(( " rmoveto\n" )); - - if ( cf2_stack_count( opStack ) > 2 && !haveWidth ) - *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX; - - /* width is defined or default after this */ - haveWidth = TRUE; - - if ( font->decoder->width_only ) - goto exit; - - curY += cf2_stack_popFixed( opStack ); - curX += cf2_stack_popFixed( opStack ); - - cf2_glyphpath_moveTo( &glyphPath, curX, curY ); - - break; - - case cf2_cmdHMOVETO: - FT_TRACE4(( " hmoveto\n" )); - - if ( cf2_stack_count( opStack ) > 1 && !haveWidth ) - *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX; - - /* width is defined or default after this */ - haveWidth = TRUE; - - if ( font->decoder->width_only ) - goto exit; - - curX += cf2_stack_popFixed( opStack ); - - cf2_glyphpath_moveTo( &glyphPath, curX, curY ); - - break; - - case cf2_cmdRLINECURVE: - { - CF2_UInt count = cf2_stack_count( opStack ); - CF2_UInt index = 0; - - - FT_TRACE4(( " rlinecurve\n" )); - - while ( index + 6 < count ) - { - curX += cf2_stack_getReal( opStack, index + 0 ); - curY += cf2_stack_getReal( opStack, index + 1 ); - - cf2_glyphpath_lineTo( &glyphPath, curX, curY ); - index += 2; - } - - while ( index < count ) - { - CF2_Fixed x1 = cf2_stack_getReal( opStack, index + 0 ) + curX; - CF2_Fixed y1 = cf2_stack_getReal( opStack, index + 1 ) + curY; - CF2_Fixed x2 = cf2_stack_getReal( opStack, index + 2 ) + x1; - CF2_Fixed y2 = cf2_stack_getReal( opStack, index + 3 ) + y1; - CF2_Fixed x3 = cf2_stack_getReal( opStack, index + 4 ) + x2; - CF2_Fixed y3 = cf2_stack_getReal( opStack, index + 5 ) + y2; - - - cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - - curX = x3; - curY = y3; - index += 6; - } - - cf2_stack_clear( opStack ); - } - continue; /* no need to clear stack again */ - - case cf2_cmdVVCURVETO: - { - CF2_UInt count, count1 = cf2_stack_count( opStack ); - CF2_UInt index = 0; - - - /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */ - /* we enforce it by clearing the second bit */ - /* (and sorting the stack indexing to suit) */ - count = count1 & ~2U; - index += count1 - count; - - FT_TRACE4(( " vvcurveto\n" )); - - while ( index < count ) - { - CF2_Fixed x1, y1, x2, y2, x3, y3; - - - if ( ( count - index ) & 1 ) - { - x1 = cf2_stack_getReal( opStack, index ) + curX; - - ++index; - } - else - x1 = curX; - - y1 = cf2_stack_getReal( opStack, index + 0 ) + curY; - x2 = cf2_stack_getReal( opStack, index + 1 ) + x1; - y2 = cf2_stack_getReal( opStack, index + 2 ) + y1; - x3 = x2; - y3 = cf2_stack_getReal( opStack, index + 3 ) + y2; - - cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - - curX = x3; - curY = y3; - index += 4; - } - - cf2_stack_clear( opStack ); - } - continue; /* no need to clear stack again */ - - case cf2_cmdHHCURVETO: - { - CF2_UInt count, count1 = cf2_stack_count( opStack ); - CF2_UInt index = 0; - - - /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */ - /* we enforce it by clearing the second bit */ - /* (and sorting the stack indexing to suit) */ - count = count1 & ~2U; - index += count1 - count; - - FT_TRACE4(( " hhcurveto\n" )); - - while ( index < count ) - { - CF2_Fixed x1, y1, x2, y2, x3, y3; - - - if ( ( count - index ) & 1 ) - { - y1 = cf2_stack_getReal( opStack, index ) + curY; - - ++index; - } - else - y1 = curY; - - x1 = cf2_stack_getReal( opStack, index + 0 ) + curX; - x2 = cf2_stack_getReal( opStack, index + 1 ) + x1; - y2 = cf2_stack_getReal( opStack, index + 2 ) + y1; - x3 = cf2_stack_getReal( opStack, index + 3 ) + x2; - y3 = y2; - - cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - - curX = x3; - curY = y3; - index += 4; - } - - cf2_stack_clear( opStack ); - } - continue; /* no need to clear stack again */ - - case cf2_cmdVHCURVETO: - case cf2_cmdHVCURVETO: - { - CF2_UInt count, count1 = cf2_stack_count( opStack ); - CF2_UInt index = 0; - - FT_Bool alternate = op1 == cf2_cmdHVCURVETO; - - - /* if `cf2_stack_count' isn't of the form 8n, 8n+1, */ - /* 8n+4, or 8n+5, we enforce it by clearing the */ - /* second bit */ - /* (and sorting the stack indexing to suit) */ - count = count1 & ~2U; - index += count1 - count; - - FT_TRACE4(( alternate ? " hvcurveto\n" : " vhcurveto\n" )); - - while ( index < count ) - { - CF2_Fixed x1, x2, x3, y1, y2, y3; - - - if ( alternate ) - { - x1 = cf2_stack_getReal( opStack, index + 0 ) + curX; - y1 = curY; - x2 = cf2_stack_getReal( opStack, index + 1 ) + x1; - y2 = cf2_stack_getReal( opStack, index + 2 ) + y1; - y3 = cf2_stack_getReal( opStack, index + 3 ) + y2; - - if ( count - index == 5 ) - { - x3 = cf2_stack_getReal( opStack, index + 4 ) + x2; - - ++index; - } - else - x3 = x2; - - alternate = FALSE; - } - else - { - x1 = curX; - y1 = cf2_stack_getReal( opStack, index + 0 ) + curY; - x2 = cf2_stack_getReal( opStack, index + 1 ) + x1; - y2 = cf2_stack_getReal( opStack, index + 2 ) + y1; - x3 = cf2_stack_getReal( opStack, index + 3 ) + x2; - - if ( count - index == 5 ) - { - y3 = cf2_stack_getReal( opStack, index + 4 ) + y2; - - ++index; - } - else - y3 = y2; - - alternate = TRUE; - } - - cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - - curX = x3; - curY = y3; - index += 4; - } - - cf2_stack_clear( opStack ); - } - continue; /* no need to clear stack again */ - - case cf2_cmdEXTENDEDNMBR: - { - CF2_Int v; - - - v = (FT_Short)( ( cf2_buf_readByte( charstring ) << 8 ) | - cf2_buf_readByte( charstring ) ); - - FT_TRACE4(( " %d", v )); - - cf2_stack_pushInt( opStack, v ); - } - continue; - - default: - /* numbers */ - { - if ( /* op1 >= 32 && */ op1 <= 246 ) - { - CF2_Int v; - - - v = op1 - 139; - - FT_TRACE4(( " %d", v )); - - /* -107 .. 107 */ - cf2_stack_pushInt( opStack, v ); - } - - else if ( /* op1 >= 247 && */ op1 <= 250 ) - { - CF2_Int v; - - - v = op1; - v -= 247; - v *= 256; - v += cf2_buf_readByte( charstring ); - v += 108; - - FT_TRACE4(( " %d", v )); - - /* 108 .. 1131 */ - cf2_stack_pushInt( opStack, v ); - } - - else if ( /* op1 >= 251 && */ op1 <= 254 ) - { - CF2_Int v; - - - v = op1; - v -= 251; - v *= 256; - v += cf2_buf_readByte( charstring ); - v = -v - 108; - - FT_TRACE4(( " %d", v )); - - /* -1131 .. -108 */ - cf2_stack_pushInt( opStack, v ); - } - - else /* op1 == 255 */ - { - CF2_Fixed v; - - - v = (CF2_Fixed) - ( ( (FT_UInt32)cf2_buf_readByte( charstring ) << 24 ) | - ( (FT_UInt32)cf2_buf_readByte( charstring ) << 16 ) | - ( (FT_UInt32)cf2_buf_readByte( charstring ) << 8 ) | - (FT_UInt32)cf2_buf_readByte( charstring ) ); - - FT_TRACE4(( " %.2f", v / 65536.0 )); - - cf2_stack_pushFixed( opStack, v ); - } - } - continue; /* don't clear stack */ - - } /* end of switch statement checking `op1' */ - - cf2_stack_clear( opStack ); - - } /* end of main interpreter loop */ - - /* we get here if the charstring ends without cf2_cmdENDCHAR */ - FT_TRACE4(( "cf2_interpT2CharString:" - " charstring ends without ENDCHAR\n" )); - - exit: - /* check whether last error seen is also the first one */ - cf2_setError( error, lastError ); - - /* free resources from objects we've used */ - cf2_glyphpath_finalize( &glyphPath ); - cf2_arrstack_finalize( &vStemHintArray ); - cf2_arrstack_finalize( &hStemHintArray ); - cf2_arrstack_finalize( &subrStack ); - cf2_stack_free( opStack ); - - FT_TRACE4(( "\n" )); - - return; - } - - -/* END */ diff --git a/3party/freetype/src/cff/cf2intrp.h b/3party/freetype/src/cff/cf2intrp.h deleted file mode 100644 index b5d8947838..0000000000 --- a/3party/freetype/src/cff/cf2intrp.h +++ /dev/null @@ -1,83 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2font.h */ -/* */ -/* Adobe's CFF Interpreter (specification). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2INTRP_H__ -#define __CF2INTRP_H__ - - -#include "cf2ft.h" -#include "cf2hints.h" - - -FT_BEGIN_HEADER - - - FT_LOCAL( void ) - cf2_hintmask_init( CF2_HintMask hintmask, - FT_Error* error ); - FT_LOCAL( FT_Bool ) - cf2_hintmask_isValid( const CF2_HintMask hintmask ); - FT_LOCAL( FT_Bool ) - cf2_hintmask_isNew( const CF2_HintMask hintmask ); - FT_LOCAL( void ) - cf2_hintmask_setNew( CF2_HintMask hintmask, - FT_Bool val ); - FT_LOCAL( FT_Byte* ) - cf2_hintmask_getMaskPtr( CF2_HintMask hintmask ); - FT_LOCAL( void ) - cf2_hintmask_setAll( CF2_HintMask hintmask, - size_t bitCount ); - - FT_LOCAL( void ) - cf2_interpT2CharString( CF2_Font font, - CF2_Buffer charstring, - CF2_OutlineCallbacks callbacks, - const FT_Vector* translation, - FT_Bool doingSeac, - CF2_Fixed curX, - CF2_Fixed curY, - CF2_Fixed* width ); - - -FT_END_HEADER - - -#endif /* __CF2INTRP_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cf2read.c b/3party/freetype/src/cff/cf2read.c deleted file mode 100644 index 2b429e3eeb..0000000000 --- a/3party/freetype/src/cff/cf2read.c +++ /dev/null @@ -1,112 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2read.c */ -/* */ -/* Adobe's code for stream handling (body). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2glue.h" - -#include "cf2error.h" - - - /* Define CF2_IO_FAIL as 1 to enable random errors and random */ - /* value errors in I/O. */ -#define CF2_IO_FAIL 0 - - -#if CF2_IO_FAIL - - /* set the .00 value to a nonzero probability */ - static int - randomError2( void ) - { - /* for region buffer ReadByte (interp) function */ - return (double)rand() / RAND_MAX < .00; - } - - /* set the .00 value to a nonzero probability */ - static CF2_Int - randomValue() - { - return (double)rand() / RAND_MAX < .00 ? rand() : 0; - } - -#endif /* CF2_IO_FAIL */ - - - /* Region Buffer */ - /* */ - /* Can be constructed from a copied buffer managed by */ - /* `FCM_getDatablock'. */ - /* Reads bytes with check for end of buffer. */ - - /* reading past the end of the buffer sets error and returns zero */ - FT_LOCAL_DEF( CF2_Int ) - cf2_buf_readByte( CF2_Buffer buf ) - { - if ( buf->ptr < buf->end ) - { -#if CF2_IO_FAIL - if ( randomError2() ) - { - CF2_SET_ERROR( buf->error, Invalid_Stream_Operation ); - return 0; - } - - return *(buf->ptr)++ + randomValue(); -#else - return *(buf->ptr)++; -#endif - } - else - { - CF2_SET_ERROR( buf->error, Invalid_Stream_Operation ); - return 0; - } - } - - - /* note: end condition can occur without error */ - FT_LOCAL_DEF( FT_Bool ) - cf2_buf_isEnd( CF2_Buffer buf ) - { - return (FT_Bool)( buf->ptr >= buf->end ); - } - - -/* END */ diff --git a/3party/freetype/src/cff/cf2read.h b/3party/freetype/src/cff/cf2read.h deleted file mode 100644 index 7ef7c8c149..0000000000 --- a/3party/freetype/src/cff/cf2read.h +++ /dev/null @@ -1,68 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2read.h */ -/* */ -/* Adobe's code for stream handling (specification). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2READ_H__ -#define __CF2READ_H__ - - -FT_BEGIN_HEADER - - - typedef struct CF2_BufferRec_ - { - FT_Error* error; - const FT_Byte* start; - const FT_Byte* end; - const FT_Byte* ptr; - - } CF2_BufferRec, *CF2_Buffer; - - - FT_LOCAL( CF2_Int ) - cf2_buf_readByte( CF2_Buffer buf ); - FT_LOCAL( FT_Bool ) - cf2_buf_isEnd( CF2_Buffer buf ); - - -FT_END_HEADER - - -#endif /* __CF2READ_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cf2stack.c b/3party/freetype/src/cff/cf2stack.c deleted file mode 100644 index 8332b5d91a..0000000000 --- a/3party/freetype/src/cff/cf2stack.c +++ /dev/null @@ -1,205 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2stack.c */ -/* */ -/* Adobe's code for emulating a CFF stack (body). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#include "cf2ft.h" -#include FT_INTERNAL_DEBUG_H - -#include "cf2glue.h" -#include "cf2font.h" -#include "cf2stack.h" - -#include "cf2error.h" - - - /* Allocate and initialize an instance of CF2_Stack. */ - /* Note: This function returns NULL on error (does not set */ - /* `error'). */ - FT_LOCAL_DEF( CF2_Stack ) - cf2_stack_init( FT_Memory memory, - FT_Error* e ) - { - FT_Error error = FT_Err_Ok; /* for FT_QNEW */ - - CF2_Stack stack = NULL; - - - if ( !FT_QNEW( stack ) ) - { - /* initialize the structure; FT_QNEW zeroes it */ - stack->memory = memory; - stack->error = e; - stack->top = &stack->buffer[0]; /* empty stack */ - } - - return stack; - } - - - FT_LOCAL_DEF( void ) - cf2_stack_free( CF2_Stack stack ) - { - if ( stack ) - { - FT_Memory memory = stack->memory; - - - /* free the main structure */ - FT_FREE( stack ); - } - } - - - FT_LOCAL_DEF( CF2_UInt ) - cf2_stack_count( CF2_Stack stack ) - { - return (CF2_UInt)( stack->top - &stack->buffer[0] ); - } - - - FT_LOCAL_DEF( void ) - cf2_stack_pushInt( CF2_Stack stack, - CF2_Int val ) - { - if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] ) - { - CF2_SET_ERROR( stack->error, Stack_Overflow ); - return; /* stack overflow */ - } - - stack->top->u.i = val; - stack->top->type = CF2_NumberInt; - ++stack->top; - } - - - FT_LOCAL_DEF( void ) - cf2_stack_pushFixed( CF2_Stack stack, - CF2_Fixed val ) - { - if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] ) - { - CF2_SET_ERROR( stack->error, Stack_Overflow ); - return; /* stack overflow */ - } - - stack->top->u.r = val; - stack->top->type = CF2_NumberFixed; - ++stack->top; - } - - - /* this function is only allowed to pop an integer type */ - FT_LOCAL_DEF( CF2_Int ) - cf2_stack_popInt( CF2_Stack stack ) - { - if ( stack->top == &stack->buffer[0] ) - { - CF2_SET_ERROR( stack->error, Stack_Underflow ); - return 0; /* underflow */ - } - if ( stack->top[-1].type != CF2_NumberInt ) - { - CF2_SET_ERROR( stack->error, Syntax_Error ); - return 0; /* type mismatch */ - } - - --stack->top; - - return stack->top->u.i; - } - - - /* Note: type mismatch is silently cast */ - /* TODO: check this */ - FT_LOCAL_DEF( CF2_Fixed ) - cf2_stack_popFixed( CF2_Stack stack ) - { - if ( stack->top == &stack->buffer[0] ) - { - CF2_SET_ERROR( stack->error, Stack_Underflow ); - return cf2_intToFixed( 0 ); /* underflow */ - } - - --stack->top; - - switch ( stack->top->type ) - { - case CF2_NumberInt: - return cf2_intToFixed( stack->top->u.i ); - case CF2_NumberFrac: - return cf2_fracToFixed( stack->top->u.f ); - default: - return stack->top->u.r; - } - } - - - /* Note: type mismatch is silently cast */ - /* TODO: check this */ - FT_LOCAL_DEF( CF2_Fixed ) - cf2_stack_getReal( CF2_Stack stack, - CF2_UInt idx ) - { - FT_ASSERT( cf2_stack_count( stack ) <= CF2_OPERAND_STACK_SIZE ); - - if ( idx >= cf2_stack_count( stack ) ) - { - CF2_SET_ERROR( stack->error, Stack_Overflow ); - return cf2_intToFixed( 0 ); /* bounds error */ - } - - switch ( stack->buffer[idx].type ) - { - case CF2_NumberInt: - return cf2_intToFixed( stack->buffer[idx].u.i ); - case CF2_NumberFrac: - return cf2_fracToFixed( stack->buffer[idx].u.f ); - default: - return stack->buffer[idx].u.r; - } - } - - - FT_LOCAL_DEF( void ) - cf2_stack_clear( CF2_Stack stack ) - { - stack->top = &stack->buffer[0]; - } - - -/* END */ diff --git a/3party/freetype/src/cff/cf2stack.h b/3party/freetype/src/cff/cf2stack.h deleted file mode 100644 index 7d6d1961fe..0000000000 --- a/3party/freetype/src/cff/cf2stack.h +++ /dev/null @@ -1,106 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2stack.h */ -/* */ -/* Adobe's code for emulating a CFF stack (specification). */ -/* */ -/* Copyright 2007-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2STACK_H__ -#define __CF2STACK_H__ - - -FT_BEGIN_HEADER - - - /* CFF operand stack; specified maximum of 48 or 192 values */ - typedef struct CF2_StackNumber_ - { - union - { - CF2_Fixed r; /* 16.16 fixed point */ - CF2_Frac f; /* 2.30 fixed point (for font matrix) */ - CF2_Int i; - } u; - - CF2_NumberType type; - - } CF2_StackNumber; - - - typedef struct CF2_StackRec_ - { - FT_Memory memory; - FT_Error* error; - CF2_StackNumber buffer[CF2_OPERAND_STACK_SIZE]; - CF2_StackNumber* top; - - } CF2_StackRec, *CF2_Stack; - - - FT_LOCAL( CF2_Stack ) - cf2_stack_init( FT_Memory memory, - FT_Error* error ); - FT_LOCAL( void ) - cf2_stack_free( CF2_Stack stack ); - - FT_LOCAL( CF2_UInt ) - cf2_stack_count( CF2_Stack stack ); - - FT_LOCAL( void ) - cf2_stack_pushInt( CF2_Stack stack, - CF2_Int val ); - FT_LOCAL( void ) - cf2_stack_pushFixed( CF2_Stack stack, - CF2_Fixed val ); - - FT_LOCAL( CF2_Int ) - cf2_stack_popInt( CF2_Stack stack ); - FT_LOCAL( CF2_Fixed ) - cf2_stack_popFixed( CF2_Stack stack ); - - FT_LOCAL( CF2_Fixed ) - cf2_stack_getReal( CF2_Stack stack, - CF2_UInt idx ); - - FT_LOCAL( void ) - cf2_stack_clear( CF2_Stack stack ); - - -FT_END_HEADER - - -#endif /* __CF2STACK_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cf2types.h b/3party/freetype/src/cff/cf2types.h deleted file mode 100644 index ac6a02266e..0000000000 --- a/3party/freetype/src/cff/cf2types.h +++ /dev/null @@ -1,78 +0,0 @@ -/***************************************************************************/ -/* */ -/* cf2types.h */ -/* */ -/* Adobe's code for defining data types (specification only). */ -/* */ -/* Copyright 2011-2013 Adobe Systems Incorporated. */ -/* */ -/* This software, and all works of authorship, whether in source or */ -/* object code form as indicated by the copyright notice(s) included */ -/* herein (collectively, the "Work") is made available, and may only be */ -/* used, modified, and distributed under the FreeType Project License, */ -/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ -/* FreeType Project License, each contributor to the Work hereby grants */ -/* to any individual or legal entity exercising permissions granted by */ -/* the FreeType Project License and this section (hereafter, "You" or */ -/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ -/* royalty-free, irrevocable (except as stated in this section) patent */ -/* license to make, have made, use, offer to sell, sell, import, and */ -/* otherwise transfer the Work, where such license applies only to those */ -/* patent claims licensable by such contributor that are necessarily */ -/* infringed by their contribution(s) alone or by combination of their */ -/* contribution(s) with the Work to which such contribution(s) was */ -/* submitted. If You institute patent litigation against any entity */ -/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ -/* the Work or a contribution incorporated within the Work constitutes */ -/* direct or contributory patent infringement, then any patent licenses */ -/* granted to You under this License for that Work shall terminate as of */ -/* the date such litigation is filed. */ -/* */ -/* By using, modifying, or distributing the Work you indicate that you */ -/* have read and understood the terms and conditions of the */ -/* FreeType Project License as well as those provided in this section, */ -/* and you accept them fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CF2TYPES_H__ -#define __CF2TYPES_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - /* - * The data models that we expect to support are as follows: - * - * name char short int long long-long pointer example - * ----------------------------------------------------- - * ILP32 8 16 32 32 64* 32 32-bit MacOS, x86 - * LLP64 8 16 32 32 64 64 x64 - * LP64 8 16 32 64 64 64 64-bit MacOS - * - * *) type may be supported by emulation on a 32-bit architecture - * - */ - - - /* integers at least 32 bits wide */ -#define CF2_UInt FT_UFast -#define CF2_Int FT_Fast - - - /* fixed-float numbers */ - typedef FT_Int32 CF2_F16Dot16; - - -FT_END_HEADER - - -#endif /* __CF2TYPES_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cff.c b/3party/freetype/src/cff/cff.c deleted file mode 100644 index bb2cfb5253..0000000000 --- a/3party/freetype/src/cff/cff.c +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* cff.c */ -/* */ -/* FreeType OpenType driver component (body only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> - -#include "cffpic.c" -#include "cffdrivr.c" -#include "cffparse.c" -#include "cffload.c" -#include "cffobjs.c" -#include "cffgload.c" -#include "cffcmap.c" - -#include "cf2arrst.c" -#include "cf2blues.c" -#include "cf2error.c" -#include "cf2font.c" -#include "cf2ft.c" -#include "cf2hints.c" -#include "cf2intrp.c" -#include "cf2read.c" -#include "cf2stack.c" - -/* END */ diff --git a/3party/freetype/src/cff/cffcmap.c b/3party/freetype/src/cff/cffcmap.c deleted file mode 100644 index e7538e9840..0000000000 --- a/3party/freetype/src/cff/cffcmap.c +++ /dev/null @@ -1,216 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffcmap.c */ -/* */ -/* CFF character mapping table (cmap) support (body). */ -/* */ -/* Copyright 2002-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include "cffcmap.h" -#include "cffload.h" - -#include "cfferrs.h" - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_CALLBACK_DEF( FT_Error ) - cff_cmap_encoding_init( CFF_CMapStd cmap, - FT_Pointer pointer ) - { - TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); - CFF_Font cff = (CFF_Font)face->extra.data; - CFF_Encoding encoding = &cff->encoding; - - FT_UNUSED( pointer ); - - - cmap->gids = encoding->codes; - - return 0; - } - - - FT_CALLBACK_DEF( void ) - cff_cmap_encoding_done( CFF_CMapStd cmap ) - { - cmap->gids = NULL; - } - - - FT_CALLBACK_DEF( FT_UInt ) - cff_cmap_encoding_char_index( CFF_CMapStd cmap, - FT_UInt32 char_code ) - { - FT_UInt result = 0; - - - if ( char_code < 256 ) - result = cmap->gids[char_code]; - - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - cff_cmap_encoding_char_next( CFF_CMapStd cmap, - FT_UInt32 *pchar_code ) - { - FT_UInt result = 0; - FT_UInt32 char_code = *pchar_code; - - - *pchar_code = 0; - - if ( char_code < 255 ) - { - FT_UInt code = (FT_UInt)(char_code + 1); - - - for (;;) - { - if ( code >= 256 ) - break; - - result = cmap->gids[code]; - if ( result != 0 ) - { - *pchar_code = code; - break; - } - - code++; - } - } - return result; - } - - - FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec, - sizeof ( CFF_CMapStdRec ), - - (FT_CMap_InitFunc) cff_cmap_encoding_init, - (FT_CMap_DoneFunc) cff_cmap_encoding_done, - (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index, - (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next, - - NULL, NULL, NULL, NULL, NULL - ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_CALLBACK_DEF( const char* ) - cff_sid_to_glyph_name( TT_Face face, - FT_UInt idx ) - { - CFF_Font cff = (CFF_Font)face->extra.data; - CFF_Charset charset = &cff->charset; - FT_UInt sid = charset->sids[idx]; - - - return cff_index_get_sid_string( cff, sid ); - } - - - FT_CALLBACK_DEF( FT_Error ) - cff_cmap_unicode_init( PS_Unicodes unicodes, - FT_Pointer pointer ) - { - TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); - CFF_Font cff = (CFF_Font)face->extra.data; - CFF_Charset charset = &cff->charset; - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; - - FT_UNUSED( pointer ); - - - /* can't build Unicode map for CID-keyed font */ - /* because we don't know glyph names. */ - if ( !charset->sids ) - return FT_THROW( No_Unicode_Glyph_Name ); - - return psnames->unicodes_init( memory, - unicodes, - cff->num_glyphs, - (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name, - (PS_FreeGlyphNameFunc)NULL, - (FT_Pointer)face ); - } - - - FT_CALLBACK_DEF( void ) - cff_cmap_unicode_done( PS_Unicodes unicodes ) - { - FT_Face face = FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); - - - FT_FREE( unicodes->maps ); - unicodes->num_maps = 0; - } - - - FT_CALLBACK_DEF( FT_UInt ) - cff_cmap_unicode_char_index( PS_Unicodes unicodes, - FT_UInt32 char_code ) - { - TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); - CFF_Font cff = (CFF_Font)face->extra.data; - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; - - - return psnames->unicodes_char_index( unicodes, char_code ); - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - cff_cmap_unicode_char_next( PS_Unicodes unicodes, - FT_UInt32 *pchar_code ) - { - TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); - CFF_Font cff = (CFF_Font)face->extra.data; - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; - - - return psnames->unicodes_char_next( unicodes, pchar_code ); - } - - - FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec, - sizeof ( PS_UnicodesRec ), - - (FT_CMap_InitFunc) cff_cmap_unicode_init, - (FT_CMap_DoneFunc) cff_cmap_unicode_done, - (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index, - (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next, - - NULL, NULL, NULL, NULL, NULL - ) - -/* END */ diff --git a/3party/freetype/src/cff/cffcmap.h b/3party/freetype/src/cff/cffcmap.h deleted file mode 100644 index 6eaed636ec..0000000000 --- a/3party/freetype/src/cff/cffcmap.h +++ /dev/null @@ -1,67 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffcmap.h */ -/* */ -/* CFF character mapping table (cmap) support (specification). */ -/* */ -/* Copyright 2002-2015 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 __CFFCMAP_H__ -#define __CFFCMAP_H__ - -#include "cffobjs.h" - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* standard (and expert) encoding cmaps */ - typedef struct CFF_CMapStdRec_* CFF_CMapStd; - - typedef struct CFF_CMapStdRec_ - { - FT_CMapRec cmap; - FT_UShort* gids; /* up to 256 elements */ - - } CFF_CMapStdRec; - - - FT_DECLARE_CMAP_CLASS(cff_cmap_encoding_class_rec) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* unicode (synthetic) cmaps */ - - FT_DECLARE_CMAP_CLASS(cff_cmap_unicode_class_rec) - - -FT_END_HEADER - -#endif /* __CFFCMAP_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cffdrivr.c b/3party/freetype/src/cff/cffdrivr.c deleted file mode 100644 index a718b7a002..0000000000 --- a/3party/freetype/src/cff/cffdrivr.c +++ /dev/null @@ -1,907 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffdrivr.c */ -/* */ -/* OpenType font driver implementation (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_SERVICE_CID_H -#include FT_SERVICE_POSTSCRIPT_INFO_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_TT_CMAP_H - -#include "cffdrivr.h" -#include "cffgload.h" -#include "cffload.h" -#include "cffcmap.h" -#include "cffparse.h" - -#include "cfferrs.h" -#include "cffpic.h" - -#include FT_SERVICE_FONT_FORMAT_H -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_PROPERTIES_H -#include FT_CFF_DRIVER_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cffdriver - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** F A C E S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_get_kerning */ - /* */ - /* <Description> */ - /* A driver method used to return the kerning vector between two */ - /* glyphs of the same face. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* left_glyph :: The index of the left glyph in the kern pair. */ - /* */ - /* right_glyph :: The index of the right glyph in the kern pair. */ - /* */ - /* <Output> */ - /* kerning :: The kerning vector. This is in font units for */ - /* scalable formats, and in pixels for fixed-sizes */ - /* formats. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* Only horizontal layouts (left-to-right & right-to-left) are */ - /* supported by this function. Other layouts, or more sophisticated */ - /* kernings, are out of scope of this method (the basic driver */ - /* interface is meant to be simple). */ - /* */ - /* They can be implemented by format-specific interfaces. */ - /* */ - FT_CALLBACK_DEF( FT_Error ) - cff_get_kerning( FT_Face ttface, /* TT_Face */ - FT_UInt left_glyph, - FT_UInt right_glyph, - FT_Vector* kerning ) - { - TT_Face face = (TT_Face)ttface; - SFNT_Service sfnt = (SFNT_Service)face->sfnt; - - - kerning->x = 0; - kerning->y = 0; - - if ( sfnt ) - kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_glyph_load */ - /* */ - /* <Description> */ - /* A driver method used to load a glyph within a given glyph slot. */ - /* */ - /* <Input> */ - /* slot :: A handle to the target slot object where the glyph */ - /* will be loaded. */ - /* */ - /* size :: A handle to the source face size at which the glyph */ - /* must be scaled, loaded, etc. */ - /* */ - /* glyph_index :: The index of the glyph in the font file. */ - /* */ - /* load_flags :: A flag indicating what to load for this glyph. The */ - /* FT_LOAD_??? constants can be used to control the */ - /* glyph loading process (e.g., whether the outline */ - /* should be scaled, whether to load bitmaps or not, */ - /* whether to hint the outline, etc). */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_CALLBACK_DEF( FT_Error ) - cff_glyph_load( FT_GlyphSlot cffslot, /* CFF_GlyphSlot */ - FT_Size cffsize, /* CFF_Size */ - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FT_Error error; - CFF_GlyphSlot slot = (CFF_GlyphSlot)cffslot; - CFF_Size size = (CFF_Size)cffsize; - - - if ( !slot ) - return FT_THROW( Invalid_Slot_Handle ); - - FT_TRACE1(( "cff_glyph_load: glyph index %d\n", glyph_index )); - - /* check whether we want a scaled outline or bitmap */ - if ( !size ) - load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; - - /* reset the size object if necessary */ - if ( load_flags & FT_LOAD_NO_SCALE ) - size = NULL; - - if ( size ) - { - /* these two objects must have the same parent */ - if ( cffsize->face != cffslot->face ) - return FT_THROW( Invalid_Face_Handle ); - } - - /* now load the glyph outline if necessary */ - error = cff_slot_load( slot, size, glyph_index, load_flags ); - - /* force drop-out mode to 2 - irrelevant now */ - /* slot->outline.dropout_mode = 2; */ - - return error; - } - - - FT_CALLBACK_DEF( FT_Error ) - cff_get_advances( FT_Face face, - FT_UInt start, - FT_UInt count, - FT_Int32 flags, - FT_Fixed* advances ) - { - FT_UInt nn; - FT_Error error = FT_Err_Ok; - FT_GlyphSlot slot = face->glyph; - - - if ( FT_IS_SFNT( face ) ) - { - /* OpenType 1.7 mandates that the data from `hmtx' table be used; */ - /* it is no longer necessary that those values are identical to */ - /* the values in the `CFF' table */ - - TT_Face ttface = (TT_Face)face; - FT_Short dummy; - - - if ( flags & FT_LOAD_VERTICAL_LAYOUT ) - { - /* check whether we have data from the `vmtx' table at all; */ - /* otherwise we extract the info from the CFF glyphstrings */ - /* (instead of synthesizing a global value using the `OS/2' */ - /* table) */ - if ( !ttface->vertical_info ) - goto Missing_Table; - - for ( nn = 0; nn < count; nn++ ) - { - FT_UShort ah; - - - ( (SFNT_Service)ttface->sfnt )->get_metrics( ttface, - 1, - start + nn, - &dummy, - &ah ); - - FT_TRACE5(( " idx %d: advance height %d font units\n", - start + nn, ah )); - advances[nn] = ah; - } - } - else - { - /* check whether we have data from the `hmtx' table at all */ - if ( !ttface->horizontal.number_Of_HMetrics ) - goto Missing_Table; - - for ( nn = 0; nn < count; nn++ ) - { - FT_UShort aw; - - - ( (SFNT_Service)ttface->sfnt )->get_metrics( ttface, - 0, - start + nn, - &dummy, - &aw ); - - FT_TRACE5(( " idx %d: advance width %d font units\n", - start + nn, aw )); - advances[nn] = aw; - } - } - - return error; - } - - Missing_Table: - flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; - - for ( nn = 0; nn < count; nn++ ) - { - error = cff_glyph_load( slot, face->size, start + nn, flags ); - if ( error ) - break; - - advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) - ? slot->linearVertAdvance - : slot->linearHoriAdvance; - } - - return error; - } - - - /* - * GLYPH DICT SERVICE - * - */ - - static FT_Error - cff_get_glyph_name( CFF_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ) - { - CFF_Font font = (CFF_Font)face->extra.data; - FT_String* gname; - FT_UShort sid; - FT_Error error; - - - if ( !font->psnames ) - { - FT_ERROR(( "cff_get_glyph_name:" - " cannot get glyph name from CFF & CEF fonts\n" - " " - " without the `PSNames' module\n" )); - error = FT_THROW( Missing_Module ); - goto Exit; - } - - /* first, locate the sid in the charset table */ - sid = font->charset.sids[glyph_index]; - - /* now, lookup the name itself */ - gname = cff_index_get_sid_string( font, sid ); - - if ( gname ) - FT_STRCPYN( buffer, gname, buffer_max ); - - error = FT_Err_Ok; - - Exit: - return error; - } - - - static FT_UInt - cff_get_name_index( CFF_Face face, - FT_String* glyph_name ) - { - CFF_Font cff; - CFF_Charset charset; - FT_Service_PsCMaps psnames; - FT_String* name; - FT_UShort sid; - FT_UInt i; - - - cff = (CFF_FontRec *)face->extra.data; - charset = &cff->charset; - - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); - if ( !psnames ) - return 0; - - for ( i = 0; i < cff->num_glyphs; i++ ) - { - sid = charset->sids[i]; - - if ( sid > 390 ) - name = cff_index_get_string( cff, sid - 391 ); - else - name = (FT_String *)psnames->adobe_std_strings( sid ); - - if ( !name ) - continue; - - if ( !ft_strcmp( glyph_name, name ) ) - return i; - } - - return 0; - } - - - FT_DEFINE_SERVICE_GLYPHDICTREC( - cff_service_glyph_dict, - (FT_GlyphDict_GetNameFunc) cff_get_glyph_name, - (FT_GlyphDict_NameIndexFunc)cff_get_name_index - ) - - - /* - * POSTSCRIPT INFO SERVICE - * - */ - - static FT_Int - cff_ps_has_glyph_names( FT_Face face ) - { - return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0; - } - - - static FT_Error - cff_ps_get_font_info( CFF_Face face, - PS_FontInfoRec* afont_info ) - { - CFF_Font cff = (CFF_Font)face->extra.data; - FT_Error error = FT_Err_Ok; - - - if ( cff && cff->font_info == NULL ) - { - CFF_FontRecDict dict = &cff->top_font.font_dict; - PS_FontInfoRec *font_info = NULL; - FT_Memory memory = face->root.memory; - - - if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) ) - goto Fail; - - font_info->version = cff_index_get_sid_string( cff, - dict->version ); - font_info->notice = cff_index_get_sid_string( cff, - dict->notice ); - font_info->full_name = cff_index_get_sid_string( cff, - dict->full_name ); - font_info->family_name = cff_index_get_sid_string( cff, - dict->family_name ); - font_info->weight = cff_index_get_sid_string( cff, - dict->weight ); - font_info->italic_angle = dict->italic_angle; - font_info->is_fixed_pitch = dict->is_fixed_pitch; - font_info->underline_position = (FT_Short)dict->underline_position; - font_info->underline_thickness = (FT_UShort)dict->underline_thickness; - - cff->font_info = font_info; - } - - if ( cff ) - *afont_info = *cff->font_info; - - Fail: - return error; - } - - - FT_DEFINE_SERVICE_PSINFOREC( - cff_service_ps_info, - (PS_GetFontInfoFunc) cff_ps_get_font_info, - (PS_GetFontExtraFunc) NULL, - (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, - (PS_GetFontPrivateFunc)NULL, /* unsupported with CFF fonts */ - (PS_GetFontValueFunc) NULL /* not implemented */ - ) - - - /* - * POSTSCRIPT NAME SERVICE - * - */ - - static const char* - cff_get_ps_name( CFF_Face face ) - { - CFF_Font cff = (CFF_Font)face->extra.data; - SFNT_Service sfnt = (SFNT_Service)face->sfnt; - - - /* following the OpenType specification 1.7, we return the name stored */ - /* in the `name' table for a CFF wrapped into an SFNT container */ - - if ( sfnt ) - { - FT_Library library = FT_FACE_LIBRARY( face ); - FT_Module sfnt_module = FT_Get_Module( library, "sfnt" ); - FT_Service_PsFontName service = - (FT_Service_PsFontName)ft_module_get_service( - sfnt_module, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME ); - - - if ( service && service->get_ps_font_name ) - return service->get_ps_font_name( FT_FACE( face ) ); - } - - return (const char*)cff->font_name; - } - - - FT_DEFINE_SERVICE_PSFONTNAMEREC( - cff_service_ps_name, - (FT_PsName_GetFunc)cff_get_ps_name - ) - - - /* - * TT CMAP INFO - * - * If the charmap is a synthetic Unicode encoding cmap or - * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO - * service defined in SFNT module. - * - * Otherwise call the service function in the sfnt module. - * - */ - static FT_Error - cff_get_cmap_info( FT_CharMap charmap, - TT_CMapInfo *cmap_info ) - { - FT_CMap cmap = FT_CMAP( charmap ); - FT_Error error = FT_Err_Ok; - - FT_Face face = FT_CMAP_FACE( cmap ); - FT_Library library = FT_FACE_LIBRARY( face ); - - - cmap_info->language = 0; - cmap_info->format = 0; - - if ( cmap->clazz != &CFF_CMAP_ENCODING_CLASS_REC_GET && - cmap->clazz != &CFF_CMAP_UNICODE_CLASS_REC_GET ) - { - FT_Module sfnt = FT_Get_Module( library, "sfnt" ); - FT_Service_TTCMaps service = - (FT_Service_TTCMaps)ft_module_get_service( sfnt, - FT_SERVICE_ID_TT_CMAP ); - - - if ( service && service->get_cmap_info ) - error = service->get_cmap_info( charmap, cmap_info ); - } - - return error; - } - - - FT_DEFINE_SERVICE_TTCMAPSREC( - cff_service_get_cmap_info, - (TT_CMap_Info_GetFunc)cff_get_cmap_info - ) - - - /* - * CID INFO SERVICE - * - */ - static FT_Error - cff_get_ros( CFF_Face face, - const char* *registry, - const char* *ordering, - FT_Int *supplement ) - { - FT_Error error = FT_Err_Ok; - CFF_Font cff = (CFF_Font)face->extra.data; - - - if ( cff ) - { - CFF_FontRecDict dict = &cff->top_font.font_dict; - - - if ( dict->cid_registry == 0xFFFFU ) - { - error = FT_THROW( Invalid_Argument ); - goto Fail; - } - - if ( registry ) - { - if ( cff->registry == NULL ) - cff->registry = cff_index_get_sid_string( cff, - dict->cid_registry ); - *registry = cff->registry; - } - - if ( ordering ) - { - if ( cff->ordering == NULL ) - cff->ordering = cff_index_get_sid_string( cff, - dict->cid_ordering ); - *ordering = cff->ordering; - } - - /* - * XXX: According to Adobe TechNote #5176, the supplement in CFF - * can be a real number. We truncate it to fit public API - * since freetype-2.3.6. - */ - if ( supplement ) - { - if ( dict->cid_supplement < FT_INT_MIN || - dict->cid_supplement > FT_INT_MAX ) - FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n", - dict->cid_supplement )); - *supplement = (FT_Int)dict->cid_supplement; - } - } - - Fail: - return error; - } - - - static FT_Error - cff_get_is_cid( CFF_Face face, - FT_Bool *is_cid ) - { - FT_Error error = FT_Err_Ok; - CFF_Font cff = (CFF_Font)face->extra.data; - - - *is_cid = 0; - - if ( cff ) - { - CFF_FontRecDict dict = &cff->top_font.font_dict; - - - if ( dict->cid_registry != 0xFFFFU ) - *is_cid = 1; - } - - return error; - } - - - static FT_Error - cff_get_cid_from_glyph_index( CFF_Face face, - FT_UInt glyph_index, - FT_UInt *cid ) - { - FT_Error error = FT_Err_Ok; - CFF_Font cff; - - - cff = (CFF_Font)face->extra.data; - - if ( cff ) - { - FT_UInt c; - CFF_FontRecDict dict = &cff->top_font.font_dict; - - - if ( dict->cid_registry == 0xFFFFU ) - { - error = FT_THROW( Invalid_Argument ); - goto Fail; - } - - if ( glyph_index > cff->num_glyphs ) - { - error = FT_THROW( Invalid_Argument ); - goto Fail; - } - - c = cff->charset.sids[glyph_index]; - - if ( cid ) - *cid = c; - } - - Fail: - return error; - } - - - FT_DEFINE_SERVICE_CIDREC( - cff_service_cid_info, - (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros, - (FT_CID_GetIsInternallyCIDKeyedFunc) cff_get_is_cid, - (FT_CID_GetCIDFromGlyphIndexFunc) cff_get_cid_from_glyph_index - ) - - - /* - * PROPERTY SERVICE - * - */ - static FT_Error - cff_property_set( FT_Module module, /* CFF_Driver */ - const char* property_name, - const void* value ) - { - FT_Error error = FT_Err_Ok; - CFF_Driver driver = (CFF_Driver)module; - - - if ( !ft_strcmp( property_name, "darkening-parameters" ) ) - { - FT_Int* darken_params = (FT_Int*)value; - - FT_Int x1 = darken_params[0]; - FT_Int y1 = darken_params[1]; - FT_Int x2 = darken_params[2]; - FT_Int y2 = darken_params[3]; - FT_Int x3 = darken_params[4]; - FT_Int y3 = darken_params[5]; - FT_Int x4 = darken_params[6]; - FT_Int y4 = darken_params[7]; - - - if ( x1 < 0 || x2 < 0 || x3 < 0 || x4 < 0 || - y1 < 0 || y2 < 0 || y3 < 0 || y4 < 0 || - x1 > x2 || x2 > x3 || x3 > x4 || - y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 ) - return FT_THROW( Invalid_Argument ); - - driver->darken_params[0] = x1; - driver->darken_params[1] = y1; - driver->darken_params[2] = x2; - driver->darken_params[3] = y2; - driver->darken_params[4] = x3; - driver->darken_params[5] = y3; - driver->darken_params[6] = x4; - driver->darken_params[7] = y4; - - return error; - } - else if ( !ft_strcmp( property_name, "hinting-engine" ) ) - { - FT_UInt* hinting_engine = (FT_UInt*)value; - - -#ifndef CFF_CONFIG_OPTION_OLD_ENGINE - if ( *hinting_engine != FT_CFF_HINTING_ADOBE ) - error = FT_ERR( Unimplemented_Feature ); - else -#endif - driver->hinting_engine = *hinting_engine; - - return error; - } - else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) - { - FT_Bool* no_stem_darkening = (FT_Bool*)value; - - - driver->no_stem_darkening = *no_stem_darkening; - - return error; - } - - FT_TRACE0(( "cff_property_set: missing property `%s'\n", - property_name )); - return FT_THROW( Missing_Property ); - } - - - static FT_Error - cff_property_get( FT_Module module, /* CFF_Driver */ - const char* property_name, - const void* value ) - { - FT_Error error = FT_Err_Ok; - CFF_Driver driver = (CFF_Driver)module; - - - if ( !ft_strcmp( property_name, "darkening-parameters" ) ) - { - FT_Int* darken_params = driver->darken_params; - FT_Int* val = (FT_Int*)value; - - - val[0] = darken_params[0]; - val[1] = darken_params[1]; - val[2] = darken_params[2]; - val[3] = darken_params[3]; - val[4] = darken_params[4]; - val[5] = darken_params[5]; - val[6] = darken_params[6]; - val[7] = darken_params[7]; - - return error; - } - else if ( !ft_strcmp( property_name, "hinting-engine" ) ) - { - FT_UInt hinting_engine = driver->hinting_engine; - FT_UInt* val = (FT_UInt*)value; - - - *val = hinting_engine; - - return error; - } - else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) - { - FT_Bool no_stem_darkening = driver->no_stem_darkening; - FT_Bool* val = (FT_Bool*)value; - - - *val = no_stem_darkening; - - return error; - } - - FT_TRACE0(( "cff_property_get: missing property `%s'\n", - property_name )); - return FT_THROW( Missing_Property ); - } - - - FT_DEFINE_SERVICE_PROPERTIESREC( - cff_service_properties, - (FT_Properties_SetFunc)cff_property_set, - (FT_Properties_GetFunc)cff_property_get ) - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** D R I V E R I N T E R F A C E ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - -#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES - FT_DEFINE_SERVICEDESCREC7( - cff_services, - FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, - FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET, - FT_SERVICE_ID_GLYPH_DICT, &CFF_SERVICE_GLYPH_DICT_GET, - FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET, - FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET, - FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET - ) -#else - FT_DEFINE_SERVICEDESCREC6( - cff_services, - FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, - FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET, - FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET, - FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET, - FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET - ) -#endif - - - FT_CALLBACK_DEF( FT_Module_Interface ) - cff_get_interface( FT_Module driver, /* CFF_Driver */ - const char* module_interface ) - { - FT_Library library; - FT_Module sfnt; - FT_Module_Interface result; - - - /* CFF_SERVICES_GET dereferences `library' in PIC mode */ -#ifdef FT_CONFIG_OPTION_PIC - if ( !driver ) - return NULL; - library = driver->library; - if ( !library ) - return NULL; -#endif - - result = ft_service_list_lookup( CFF_SERVICES_GET, module_interface ); - if ( result != NULL ) - return result; - - /* `driver' is not yet evaluated in non-PIC mode */ -#ifndef FT_CONFIG_OPTION_PIC - if ( !driver ) - return NULL; - library = driver->library; - if ( !library ) - return NULL; -#endif - - /* we pass our request to the `sfnt' module */ - sfnt = FT_Get_Module( library, "sfnt" ); - - return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; - } - - - /* The FT_DriverInterface structure is defined in ftdriver.h. */ - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS -#define CFF_SIZE_SELECT cff_size_select -#else -#define CFF_SIZE_SELECT 0 -#endif - - FT_DEFINE_DRIVER( - cff_driver_class, - - FT_MODULE_FONT_DRIVER | - FT_MODULE_DRIVER_SCALABLE | - FT_MODULE_DRIVER_HAS_HINTER, - - sizeof ( CFF_DriverRec ), - "cff", - 0x10000L, - 0x20000L, - - 0, /* module-specific interface */ - - cff_driver_init, - cff_driver_done, - cff_get_interface, - - /* now the specific driver fields */ - sizeof ( TT_FaceRec ), - sizeof ( CFF_SizeRec ), - sizeof ( CFF_GlyphSlotRec ), - - cff_face_init, - cff_face_done, - cff_size_init, - cff_size_done, - cff_slot_init, - cff_slot_done, - - cff_glyph_load, - - cff_get_kerning, - 0, /* FT_Face_AttachFunc */ - cff_get_advances, - - cff_size_request, - - CFF_SIZE_SELECT - ) - - -/* END */ diff --git a/3party/freetype/src/cff/cffdrivr.h b/3party/freetype/src/cff/cffdrivr.h deleted file mode 100644 index 9527f5e149..0000000000 --- a/3party/freetype/src/cff/cffdrivr.h +++ /dev/null @@ -1,38 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffdrivr.h */ -/* */ -/* High-level OpenType driver interface (specification). */ -/* */ -/* Copyright 1996-2015 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 __CFFDRIVER_H__ -#define __CFFDRIVER_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_DRIVER_H - - -FT_BEGIN_HEADER - - - FT_DECLARE_DRIVER( cff_driver_class ) - - -FT_END_HEADER - -#endif /* __CFFDRIVER_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cfferrs.h b/3party/freetype/src/cff/cfferrs.h deleted file mode 100644 index 543bdb07c2..0000000000 --- a/3party/freetype/src/cff/cfferrs.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************/ -/* */ -/* cfferrs.h */ -/* */ -/* CFF error codes (specification only). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the CFF error enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __CFFERRS_H__ -#define __CFFERRS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX CFF_Err_ -#define FT_ERR_BASE FT_Mod_Err_CFF - - -#include FT_ERRORS_H - -#endif /* __CFFERRS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cffgload.c b/3party/freetype/src/cff/cffgload.c deleted file mode 100644 index 5f57403e22..0000000000 --- a/3party/freetype/src/cff/cffgload.c +++ /dev/null @@ -1,3086 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffgload.c */ -/* */ -/* OpenType Glyph Loader (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_OUTLINE_H -#include FT_CFF_DRIVER_H - -#include "cffobjs.h" -#include "cffload.h" -#include "cffgload.h" -#include "cf2ft.h" /* for cf2_decoder_parse_charstrings */ - -#include "cfferrs.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cffgload - - -#ifdef CFF_CONFIG_OPTION_OLD_ENGINE - - typedef enum CFF_Operator_ - { - cff_op_unknown = 0, - - cff_op_rmoveto, - cff_op_hmoveto, - cff_op_vmoveto, - - cff_op_rlineto, - cff_op_hlineto, - cff_op_vlineto, - - cff_op_rrcurveto, - cff_op_hhcurveto, - cff_op_hvcurveto, - cff_op_rcurveline, - cff_op_rlinecurve, - cff_op_vhcurveto, - cff_op_vvcurveto, - - cff_op_flex, - cff_op_hflex, - cff_op_hflex1, - cff_op_flex1, - - cff_op_endchar, - - cff_op_hstem, - cff_op_vstem, - cff_op_hstemhm, - cff_op_vstemhm, - - cff_op_hintmask, - cff_op_cntrmask, - cff_op_dotsection, /* deprecated, acts as no-op */ - - cff_op_abs, - cff_op_add, - cff_op_sub, - cff_op_div, - cff_op_neg, - cff_op_random, - cff_op_mul, - cff_op_sqrt, - - cff_op_blend, - - cff_op_drop, - cff_op_exch, - cff_op_index, - cff_op_roll, - cff_op_dup, - - cff_op_put, - cff_op_get, - cff_op_store, - cff_op_load, - - cff_op_and, - cff_op_or, - cff_op_not, - cff_op_eq, - cff_op_ifelse, - - cff_op_callsubr, - cff_op_callgsubr, - cff_op_return, - - /* Type 1 opcodes: invalid but seen in real life */ - cff_op_hsbw, - cff_op_closepath, - cff_op_callothersubr, - cff_op_pop, - cff_op_seac, - cff_op_sbw, - cff_op_setcurrentpoint, - - /* do not remove */ - cff_op_max - - } CFF_Operator; - - -#define CFF_COUNT_CHECK_WIDTH 0x80 -#define CFF_COUNT_EXACT 0x40 -#define CFF_COUNT_CLEAR_STACK 0x20 - - /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are */ - /* used for checking the width and requested numbers of arguments */ - /* only; they are set to zero afterwards */ - - /* the other two flags are informative only and unused currently */ - - static const FT_Byte cff_argument_counts[] = - { - 0, /* unknown */ - - 2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */ - 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, - 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, - - 0 | CFF_COUNT_CLEAR_STACK, /* rlineto */ - 0 | CFF_COUNT_CLEAR_STACK, - 0 | CFF_COUNT_CLEAR_STACK, - - 0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */ - 0 | CFF_COUNT_CLEAR_STACK, - 0 | CFF_COUNT_CLEAR_STACK, - 0 | CFF_COUNT_CLEAR_STACK, - 0 | CFF_COUNT_CLEAR_STACK, - 0 | CFF_COUNT_CLEAR_STACK, - 0 | CFF_COUNT_CLEAR_STACK, - - 13, /* flex */ - 7, - 9, - 11, - - 0 | CFF_COUNT_CHECK_WIDTH, /* endchar */ - - 2 | CFF_COUNT_CHECK_WIDTH, /* hstem */ - 2 | CFF_COUNT_CHECK_WIDTH, - 2 | CFF_COUNT_CHECK_WIDTH, - 2 | CFF_COUNT_CHECK_WIDTH, - - 0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */ - 0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */ - 0, /* dotsection */ - - 1, /* abs */ - 2, - 2, - 2, - 1, - 0, - 2, - 1, - - 1, /* blend */ - - 1, /* drop */ - 2, - 1, - 2, - 1, - - 2, /* put */ - 1, - 4, - 3, - - 2, /* and */ - 2, - 1, - 2, - 4, - - 1, /* callsubr */ - 1, - 0, - - 2, /* hsbw */ - 0, - 0, - 0, - 5, /* seac */ - 4, /* sbw */ - 2 /* setcurrentpoint */ - }; - -#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /********** *********/ - /********** *********/ - /********** GENERIC CHARSTRING PARSING *********/ - /********** *********/ - /********** *********/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_builder_init */ - /* */ - /* <Description> */ - /* Initializes a given glyph builder. */ - /* */ - /* <InOut> */ - /* builder :: A pointer to the glyph builder to initialize. */ - /* */ - /* <Input> */ - /* face :: The current face object. */ - /* */ - /* size :: The current size object. */ - /* */ - /* glyph :: The current glyph object. */ - /* */ - /* hinting :: Whether hinting is active. */ - /* */ - static void - cff_builder_init( CFF_Builder* builder, - TT_Face face, - CFF_Size size, - CFF_GlyphSlot glyph, - FT_Bool hinting ) - { - builder->path_begun = 0; - builder->load_points = 1; - - builder->face = face; - builder->glyph = glyph; - builder->memory = face->root.memory; - - if ( glyph ) - { - FT_GlyphLoader loader = glyph->root.internal->loader; - - - builder->loader = loader; - builder->base = &loader->base.outline; - builder->current = &loader->current.outline; - FT_GlyphLoader_Rewind( loader ); - - builder->hints_globals = NULL; - builder->hints_funcs = NULL; - - if ( hinting && size ) - { - CFF_Internal internal = (CFF_Internal)size->root.internal; - - - builder->hints_globals = (void *)internal->topfont; - builder->hints_funcs = glyph->root.internal->glyph_hints; - } - } - - builder->pos_x = 0; - builder->pos_y = 0; - - builder->left_bearing.x = 0; - builder->left_bearing.y = 0; - builder->advance.x = 0; - builder->advance.y = 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_builder_done */ - /* */ - /* <Description> */ - /* Finalizes a given glyph builder. Its contents can still be used */ - /* after the call, but the function saves important information */ - /* within the corresponding glyph slot. */ - /* */ - /* <Input> */ - /* builder :: A pointer to the glyph builder to finalize. */ - /* */ - static void - cff_builder_done( CFF_Builder* builder ) - { - CFF_GlyphSlot glyph = builder->glyph; - - - if ( glyph ) - glyph->root.outline = *builder->base; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_compute_bias */ - /* */ - /* <Description> */ - /* Computes the bias value in dependence of the number of glyph */ - /* subroutines. */ - /* */ - /* <Input> */ - /* in_charstring_type :: The `CharstringType' value of the top DICT */ - /* dictionary. */ - /* */ - /* num_subrs :: The number of glyph subroutines. */ - /* */ - /* <Return> */ - /* The bias value. */ - static FT_Int - cff_compute_bias( FT_Int in_charstring_type, - FT_UInt num_subrs ) - { - FT_Int result; - - - if ( in_charstring_type == 1 ) - result = 0; - else if ( num_subrs < 1240 ) - result = 107; - else if ( num_subrs < 33900U ) - result = 1131; - else - result = 32768U; - - return result; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_decoder_init */ - /* */ - /* <Description> */ - /* Initializes a given glyph decoder. */ - /* */ - /* <InOut> */ - /* decoder :: A pointer to the glyph builder to initialize. */ - /* */ - /* <Input> */ - /* face :: The current face object. */ - /* */ - /* size :: The current size object. */ - /* */ - /* slot :: The current glyph object. */ - /* */ - /* hinting :: Whether hinting is active. */ - /* */ - /* hint_mode :: The hinting mode. */ - /* */ - FT_LOCAL_DEF( void ) - cff_decoder_init( CFF_Decoder* decoder, - TT_Face face, - CFF_Size size, - CFF_GlyphSlot slot, - FT_Bool hinting, - FT_Render_Mode hint_mode ) - { - CFF_Font cff = (CFF_Font)face->extra.data; - - - /* clear everything */ - FT_MEM_ZERO( decoder, sizeof ( *decoder ) ); - - /* initialize builder */ - cff_builder_init( &decoder->builder, face, size, slot, hinting ); - - /* initialize Type2 decoder */ - decoder->cff = cff; - decoder->num_globals = cff->global_subrs_index.count; - decoder->globals = cff->global_subrs; - decoder->globals_bias = cff_compute_bias( - cff->top_font.font_dict.charstring_type, - decoder->num_globals ); - - decoder->hint_mode = hint_mode; - } - - - /* this function is used to select the subfont */ - /* and the locals subrs array */ - FT_LOCAL_DEF( FT_Error ) - cff_decoder_prepare( CFF_Decoder* decoder, - CFF_Size size, - FT_UInt glyph_index ) - { - CFF_Builder *builder = &decoder->builder; - CFF_Font cff = (CFF_Font)builder->face->extra.data; - CFF_SubFont sub = &cff->top_font; - FT_Error error = FT_Err_Ok; - - - /* manage CID fonts */ - if ( cff->num_subfonts ) - { - FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, glyph_index ); - - - if ( fd_index >= cff->num_subfonts ) - { - FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - FT_TRACE3(( " in subfont %d:\n", fd_index )); - - sub = cff->subfonts[fd_index]; - - if ( builder->hints_funcs && size ) - { - CFF_Internal internal = (CFF_Internal)size->root.internal; - - - /* for CFFs without subfonts, this value has already been set */ - builder->hints_globals = (void *)internal->subfonts[fd_index]; - } - } - - decoder->num_locals = sub->local_subrs_index.count; - decoder->locals = sub->local_subrs; - decoder->locals_bias = cff_compute_bias( - decoder->cff->top_font.font_dict.charstring_type, - decoder->num_locals ); - - decoder->glyph_width = sub->private_dict.default_width; - decoder->nominal_width = sub->private_dict.nominal_width; - - decoder->current_subfont = sub; /* for Adobe's CFF handler */ - - Exit: - return error; - } - - - /* check that there is enough space for `count' more points */ - FT_LOCAL_DEF( FT_Error ) - cff_check_points( CFF_Builder* builder, - FT_Int count ) - { - return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); - } - - - /* add a new point, do not check space */ - FT_LOCAL_DEF( void ) - cff_builder_add_point( CFF_Builder* builder, - FT_Pos x, - FT_Pos y, - FT_Byte flag ) - { - FT_Outline* outline = builder->current; - - - if ( builder->load_points ) - { - FT_Vector* point = outline->points + outline->n_points; - FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; - -#ifdef CFF_CONFIG_OPTION_OLD_ENGINE - CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( builder->face ); - - - if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE ) - { - point->x = x >> 16; - point->y = y >> 16; - } - else -#endif - { - /* cf2_decoder_parse_charstrings uses 16.16 coordinates */ - point->x = x >> 10; - point->y = y >> 10; - } - *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); - } - - outline->n_points++; - } - - - /* check space for a new on-curve point, then add it */ - FT_LOCAL_DEF( FT_Error ) - cff_builder_add_point1( CFF_Builder* builder, - FT_Pos x, - FT_Pos y ) - { - FT_Error error; - - - error = cff_check_points( builder, 1 ); - if ( !error ) - cff_builder_add_point( builder, x, y, 1 ); - - return error; - } - - - /* check space for a new contour, then add it */ - static FT_Error - cff_builder_add_contour( CFF_Builder* builder ) - { - FT_Outline* outline = builder->current; - FT_Error error; - - - if ( !builder->load_points ) - { - outline->n_contours++; - return FT_Err_Ok; - } - - error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); - if ( !error ) - { - if ( outline->n_contours > 0 ) - outline->contours[outline->n_contours - 1] = - (short)( outline->n_points - 1 ); - - outline->n_contours++; - } - - return error; - } - - - /* if a path was begun, add its first on-curve point */ - FT_LOCAL_DEF( FT_Error ) - cff_builder_start_point( CFF_Builder* builder, - FT_Pos x, - FT_Pos y ) - { - FT_Error error = FT_Err_Ok; - - - /* test whether we are building a new contour */ - if ( !builder->path_begun ) - { - builder->path_begun = 1; - error = cff_builder_add_contour( builder ); - if ( !error ) - error = cff_builder_add_point1( builder, x, y ); - } - - return error; - } - - - /* close the current contour */ - FT_LOCAL_DEF( void ) - cff_builder_close_contour( CFF_Builder* builder ) - { - FT_Outline* outline = builder->current; - FT_Int first; - - - if ( !outline ) - return; - - first = outline->n_contours <= 1 - ? 0 : outline->contours[outline->n_contours - 2] + 1; - - /* We must not include the last point in the path if it */ - /* is located on the first point. */ - if ( outline->n_points > 1 ) - { - FT_Vector* p1 = outline->points + first; - FT_Vector* p2 = outline->points + outline->n_points - 1; - FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; - - - /* `delete' last point only if it coincides with the first */ - /* point and if it is not a control point (which can happen). */ - if ( p1->x == p2->x && p1->y == p2->y ) - if ( *control == FT_CURVE_TAG_ON ) - outline->n_points--; - } - - if ( outline->n_contours > 0 ) - { - /* Don't add contours only consisting of one point, i.e., */ - /* check whether begin point and last point are the same. */ - if ( first == outline->n_points - 1 ) - { - outline->n_contours--; - outline->n_points--; - } - else - outline->contours[outline->n_contours - 1] = - (short)( outline->n_points - 1 ); - } - } - - - FT_LOCAL_DEF( FT_Int ) - cff_lookup_glyph_by_stdcharcode( CFF_Font cff, - FT_Int charcode ) - { - FT_UInt n; - FT_UShort glyph_sid; - - - /* CID-keyed fonts don't have glyph names */ - if ( !cff->charset.sids ) - return -1; - - /* check range of standard char code */ - if ( charcode < 0 || charcode > 255 ) - return -1; - - /* Get code to SID mapping from `cff_standard_encoding'. */ - glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode ); - - for ( n = 0; n < cff->num_glyphs; n++ ) - { - if ( cff->charset.sids[n] == glyph_sid ) - return (FT_Int)n; - } - - return -1; - } - - - FT_LOCAL_DEF( FT_Error ) - cff_get_glyph_data( TT_Face face, - FT_UInt glyph_index, - FT_Byte** pointer, - FT_ULong* length ) - { -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* For incremental fonts get the character data using the */ - /* callback function. */ - if ( face->root.internal->incremental_interface ) - { - FT_Data data; - FT_Error error = - face->root.internal->incremental_interface->funcs->get_glyph_data( - face->root.internal->incremental_interface->object, - glyph_index, &data ); - - - *pointer = (FT_Byte*)data.pointer; - *length = (FT_ULong)data.length; - - return error; - } - else -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - { - CFF_Font cff = (CFF_Font)(face->extra.data); - - - return cff_index_access_element( &cff->charstrings_index, glyph_index, - pointer, length ); - } - } - - - FT_LOCAL_DEF( void ) - cff_free_glyph_data( TT_Face face, - FT_Byte** pointer, - FT_ULong length ) - { -#ifndef FT_CONFIG_OPTION_INCREMENTAL - FT_UNUSED( length ); -#endif - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* For incremental fonts get the character data using the */ - /* callback function. */ - if ( face->root.internal->incremental_interface ) - { - FT_Data data; - - - data.pointer = *pointer; - data.length = (FT_Int)length; - - face->root.internal->incremental_interface->funcs->free_glyph_data( - face->root.internal->incremental_interface->object, &data ); - } - else -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - { - CFF_Font cff = (CFF_Font)(face->extra.data); - - - cff_index_forget_element( &cff->charstrings_index, pointer ); - } - } - - -#ifdef CFF_CONFIG_OPTION_OLD_ENGINE - - static FT_Error - cff_operator_seac( CFF_Decoder* decoder, - FT_Pos asb, - FT_Pos adx, - FT_Pos ady, - FT_Int bchar, - FT_Int achar ) - { - FT_Error error; - CFF_Builder* builder = &decoder->builder; - FT_Int bchar_index, achar_index; - TT_Face face = decoder->builder.face; - FT_Vector left_bearing, advance; - FT_Byte* charstring; - FT_ULong charstring_len; - FT_Pos glyph_width; - - - if ( decoder->seac ) - { - FT_ERROR(( "cff_operator_seac: invalid nested seac\n" )); - return FT_THROW( Syntax_Error ); - } - - adx += decoder->builder.left_bearing.x; - ady += decoder->builder.left_bearing.y; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* Incremental fonts don't necessarily have valid charsets. */ - /* They use the character code, not the glyph index, in this case. */ - if ( face->root.internal->incremental_interface ) - { - bchar_index = bchar; - achar_index = achar; - } - else -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - { - CFF_Font cff = (CFF_Font)(face->extra.data); - - - bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar ); - achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar ); - } - - if ( bchar_index < 0 || achar_index < 0 ) - { - FT_ERROR(( "cff_operator_seac:" - " invalid seac character code arguments\n" )); - return FT_THROW( Syntax_Error ); - } - - /* If we are trying to load a composite glyph, do not load the */ - /* accent character and return the array of subglyphs. */ - if ( builder->no_recurse ) - { - FT_GlyphSlot glyph = (FT_GlyphSlot)builder->glyph; - FT_GlyphLoader loader = glyph->internal->loader; - FT_SubGlyph subg; - - - /* reallocate subglyph array if necessary */ - error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); - if ( error ) - goto Exit; - - subg = loader->current.subglyphs; - - /* subglyph 0 = base character */ - subg->index = bchar_index; - subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | - FT_SUBGLYPH_FLAG_USE_MY_METRICS; - subg->arg1 = 0; - subg->arg2 = 0; - subg++; - - /* subglyph 1 = accent character */ - subg->index = achar_index; - subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; - subg->arg1 = (FT_Int)( adx >> 16 ); - subg->arg2 = (FT_Int)( ady >> 16 ); - - /* set up remaining glyph fields */ - glyph->num_subglyphs = 2; - glyph->subglyphs = loader->base.subglyphs; - glyph->format = FT_GLYPH_FORMAT_COMPOSITE; - - loader->current.num_subglyphs = 2; - } - - FT_GlyphLoader_Prepare( builder->loader ); - - /* First load `bchar' in builder */ - error = cff_get_glyph_data( face, (FT_UInt)bchar_index, - &charstring, &charstring_len ); - if ( !error ) - { - /* the seac operator must not be nested */ - decoder->seac = TRUE; - error = cff_decoder_parse_charstrings( decoder, charstring, - charstring_len ); - decoder->seac = FALSE; - - cff_free_glyph_data( face, &charstring, charstring_len ); - - if ( error ) - goto Exit; - } - - /* Save the left bearing, advance and glyph width of the base */ - /* character as they will be erased by the next load. */ - - left_bearing = builder->left_bearing; - advance = builder->advance; - glyph_width = decoder->glyph_width; - - builder->left_bearing.x = 0; - builder->left_bearing.y = 0; - - builder->pos_x = adx - asb; - builder->pos_y = ady; - - /* Now load `achar' on top of the base outline. */ - error = cff_get_glyph_data( face, (FT_UInt)achar_index, - &charstring, &charstring_len ); - if ( !error ) - { - /* the seac operator must not be nested */ - decoder->seac = TRUE; - error = cff_decoder_parse_charstrings( decoder, charstring, - charstring_len ); - decoder->seac = FALSE; - - cff_free_glyph_data( face, &charstring, charstring_len ); - - if ( error ) - goto Exit; - } - - /* Restore the left side bearing, advance and glyph width */ - /* of the base character. */ - builder->left_bearing = left_bearing; - builder->advance = advance; - decoder->glyph_width = glyph_width; - - builder->pos_x = 0; - builder->pos_y = 0; - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_decoder_parse_charstrings */ - /* */ - /* <Description> */ - /* Parses a given Type 2 charstrings program. */ - /* */ - /* <InOut> */ - /* decoder :: The current Type 1 decoder. */ - /* */ - /* <Input> */ - /* charstring_base :: The base of the charstring stream. */ - /* */ - /* charstring_len :: The length in bytes of the charstring stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - cff_decoder_parse_charstrings( CFF_Decoder* decoder, - FT_Byte* charstring_base, - FT_ULong charstring_len ) - { - FT_Error error; - CFF_Decoder_Zone* zone; - FT_Byte* ip; - FT_Byte* limit; - CFF_Builder* builder = &decoder->builder; - FT_Pos x, y; - FT_Fixed seed; - FT_Fixed* stack; - FT_Int charstring_type = - decoder->cff->top_font.font_dict.charstring_type; - - T2_Hints_Funcs hinter; - - - /* set default width */ - decoder->num_hints = 0; - decoder->read_width = 1; - - /* compute random seed from stack address of parameter */ - seed = (FT_Fixed)( ( (FT_Offset)(char*)&seed ^ - (FT_Offset)(char*)&decoder ^ - (FT_Offset)(char*)&charstring_base ) & - FT_ULONG_MAX ); - seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL; - if ( seed == 0 ) - seed = 0x7384; - - /* initialize the decoder */ - decoder->top = decoder->stack; - decoder->zone = decoder->zones; - zone = decoder->zones; - stack = decoder->top; - - hinter = (T2_Hints_Funcs)builder->hints_funcs; - - builder->path_begun = 0; - - zone->base = charstring_base; - limit = zone->limit = charstring_base + charstring_len; - ip = zone->cursor = zone->base; - - error = FT_Err_Ok; - - x = builder->pos_x; - y = builder->pos_y; - - /* begin hints recording session, if any */ - if ( hinter ) - hinter->open( hinter->hints ); - - /* now execute loop */ - while ( ip < limit ) - { - CFF_Operator op; - FT_Byte v; - - - /********************************************************************/ - /* */ - /* Decode operator or operand */ - /* */ - v = *ip++; - if ( v >= 32 || v == 28 ) - { - FT_Int shift = 16; - FT_Int32 val; - - - /* this is an operand, push it on the stack */ - - /* if we use shifts, all computations are done with unsigned */ - /* values; the conversion to a signed value is the last step */ - if ( v == 28 ) - { - if ( ip + 1 >= limit ) - goto Syntax_Error; - val = (FT_Short)( ( (FT_UShort)ip[0] << 8 ) | ip[1] ); - ip += 2; - } - else if ( v < 247 ) - val = (FT_Int32)v - 139; - else if ( v < 251 ) - { - if ( ip >= limit ) - goto Syntax_Error; - val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108; - } - else if ( v < 255 ) - { - if ( ip >= limit ) - goto Syntax_Error; - val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108; - } - else - { - if ( ip + 3 >= limit ) - goto Syntax_Error; - val = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) | - ( (FT_UInt32)ip[1] << 16 ) | - ( (FT_UInt32)ip[2] << 8 ) | - (FT_UInt32)ip[3] ); - ip += 4; - if ( charstring_type == 2 ) - shift = 0; - } - if ( decoder->top - stack >= CFF_MAX_OPERANDS ) - goto Stack_Overflow; - - val = (FT_Int32)( (FT_UInt32)val << shift ); - *decoder->top++ = val; - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !( val & 0xFFFFL ) ) - FT_TRACE4(( " %hd", (FT_Short)( (FT_UInt32)val >> 16 ) )); - else - FT_TRACE4(( " %.2f", val / 65536.0 )); -#endif - - } - else - { - /* The specification says that normally arguments are to be taken */ - /* from the bottom of the stack. However, this seems not to be */ - /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */ - /* arguments similar to a PS interpreter. */ - - FT_Fixed* args = decoder->top; - FT_Int num_args = (FT_Int)( args - decoder->stack ); - FT_Int req_args; - - - /* find operator */ - op = cff_op_unknown; - - switch ( v ) - { - case 1: - op = cff_op_hstem; - break; - case 3: - op = cff_op_vstem; - break; - case 4: - op = cff_op_vmoveto; - break; - case 5: - op = cff_op_rlineto; - break; - case 6: - op = cff_op_hlineto; - break; - case 7: - op = cff_op_vlineto; - break; - case 8: - op = cff_op_rrcurveto; - break; - case 9: - op = cff_op_closepath; - break; - case 10: - op = cff_op_callsubr; - break; - case 11: - op = cff_op_return; - break; - case 12: - { - if ( ip >= limit ) - goto Syntax_Error; - v = *ip++; - - switch ( v ) - { - case 0: - op = cff_op_dotsection; - break; - case 1: /* this is actually the Type1 vstem3 operator */ - op = cff_op_vstem; - break; - case 2: /* this is actually the Type1 hstem3 operator */ - op = cff_op_hstem; - break; - case 3: - op = cff_op_and; - break; - case 4: - op = cff_op_or; - break; - case 5: - op = cff_op_not; - break; - case 6: - op = cff_op_seac; - break; - case 7: - op = cff_op_sbw; - break; - case 8: - op = cff_op_store; - break; - case 9: - op = cff_op_abs; - break; - case 10: - op = cff_op_add; - break; - case 11: - op = cff_op_sub; - break; - case 12: - op = cff_op_div; - break; - case 13: - op = cff_op_load; - break; - case 14: - op = cff_op_neg; - break; - case 15: - op = cff_op_eq; - break; - case 16: - op = cff_op_callothersubr; - break; - case 17: - op = cff_op_pop; - break; - case 18: - op = cff_op_drop; - break; - case 20: - op = cff_op_put; - break; - case 21: - op = cff_op_get; - break; - case 22: - op = cff_op_ifelse; - break; - case 23: - op = cff_op_random; - break; - case 24: - op = cff_op_mul; - break; - case 26: - op = cff_op_sqrt; - break; - case 27: - op = cff_op_dup; - break; - case 28: - op = cff_op_exch; - break; - case 29: - op = cff_op_index; - break; - case 30: - op = cff_op_roll; - break; - case 33: - op = cff_op_setcurrentpoint; - break; - case 34: - op = cff_op_hflex; - break; - case 35: - op = cff_op_flex; - break; - case 36: - op = cff_op_hflex1; - break; - case 37: - op = cff_op_flex1; - break; - default: - FT_TRACE4(( " unknown op (12, %d)\n", v )); - break; - } - } - break; - case 13: - op = cff_op_hsbw; - break; - case 14: - op = cff_op_endchar; - break; - case 16: - op = cff_op_blend; - break; - case 18: - op = cff_op_hstemhm; - break; - case 19: - op = cff_op_hintmask; - break; - case 20: - op = cff_op_cntrmask; - break; - case 21: - op = cff_op_rmoveto; - break; - case 22: - op = cff_op_hmoveto; - break; - case 23: - op = cff_op_vstemhm; - break; - case 24: - op = cff_op_rcurveline; - break; - case 25: - op = cff_op_rlinecurve; - break; - case 26: - op = cff_op_vvcurveto; - break; - case 27: - op = cff_op_hhcurveto; - break; - case 29: - op = cff_op_callgsubr; - break; - case 30: - op = cff_op_vhcurveto; - break; - case 31: - op = cff_op_hvcurveto; - break; - default: - FT_TRACE4(( " unknown op (%d)\n", v )); - break; - } - - if ( op == cff_op_unknown ) - continue; - - /* check arguments */ - req_args = cff_argument_counts[op]; - if ( req_args & CFF_COUNT_CHECK_WIDTH ) - { - if ( num_args > 0 && decoder->read_width ) - { - /* If `nominal_width' is non-zero, the number is really a */ - /* difference against `nominal_width'. Else, the number here */ - /* is truly a width, not a difference against `nominal_width'. */ - /* If the font does not set `nominal_width', then */ - /* `nominal_width' defaults to zero, and so we can set */ - /* `glyph_width' to `nominal_width' plus number on the stack */ - /* -- for either case. */ - - FT_Int set_width_ok; - - - switch ( op ) - { - case cff_op_hmoveto: - case cff_op_vmoveto: - set_width_ok = num_args & 2; - break; - - case cff_op_hstem: - case cff_op_vstem: - case cff_op_hstemhm: - case cff_op_vstemhm: - case cff_op_rmoveto: - case cff_op_hintmask: - case cff_op_cntrmask: - set_width_ok = num_args & 1; - break; - - case cff_op_endchar: - /* If there is a width specified for endchar, we either have */ - /* 1 argument or 5 arguments. We like to argue. */ - set_width_ok = ( num_args == 5 ) || ( num_args == 1 ); - break; - - default: - set_width_ok = 0; - break; - } - - if ( set_width_ok ) - { - decoder->glyph_width = decoder->nominal_width + - ( stack[0] >> 16 ); - - if ( decoder->width_only ) - { - /* we only want the advance width; stop here */ - break; - } - - /* Consumed an argument. */ - num_args--; - } - } - - decoder->read_width = 0; - req_args = 0; - } - - req_args &= 0x000F; - if ( num_args < req_args ) - goto Stack_Underflow; - args -= req_args; - num_args -= req_args; - - /* At this point, `args' points to the first argument of the */ - /* operand in case `req_args' isn't zero. Otherwise, we have */ - /* to adjust `args' manually. */ - - /* Note that we only pop arguments from the stack which we */ - /* really need and can digest so that we can continue in case */ - /* of superfluous stack elements. */ - - switch ( op ) - { - case cff_op_hstem: - case cff_op_vstem: - case cff_op_hstemhm: - case cff_op_vstemhm: - /* the number of arguments is always even here */ - FT_TRACE4(( - op == cff_op_hstem ? " hstem\n" : - ( op == cff_op_vstem ? " vstem\n" : - ( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) )); - - if ( hinter ) - hinter->stems( hinter->hints, - ( op == cff_op_hstem || op == cff_op_hstemhm ), - num_args / 2, - args - ( num_args & ~1 ) ); - - decoder->num_hints += num_args / 2; - args = stack; - break; - - case cff_op_hintmask: - case cff_op_cntrmask: - FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" )); - - /* implement vstem when needed -- */ - /* the specification doesn't say it, but this also works */ - /* with the 'cntrmask' operator */ - /* */ - if ( num_args > 0 ) - { - if ( hinter ) - hinter->stems( hinter->hints, - 0, - num_args / 2, - args - ( num_args & ~1 ) ); - - decoder->num_hints += num_args / 2; - } - - /* In a valid charstring there must be at least one byte */ - /* after `hintmask' or `cntrmask' (e.g., for a `return' */ - /* instruction). Additionally, there must be space for */ - /* `num_hints' bits. */ - - if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit ) - goto Syntax_Error; - - if ( hinter ) - { - if ( op == cff_op_hintmask ) - hinter->hintmask( hinter->hints, - (FT_UInt)builder->current->n_points, - (FT_UInt)decoder->num_hints, - ip ); - else - hinter->counter( hinter->hints, - (FT_UInt)decoder->num_hints, - ip ); - } - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_UInt maskbyte; - - - FT_TRACE4(( " (maskbytes:" )); - - for ( maskbyte = 0; - maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 ); - maskbyte++, ip++ ) - FT_TRACE4(( " 0x%02X", *ip )); - - FT_TRACE4(( ")\n" )); - } -#else - ip += ( decoder->num_hints + 7 ) >> 3; -#endif - args = stack; - break; - - case cff_op_rmoveto: - FT_TRACE4(( " rmoveto\n" )); - - cff_builder_close_contour( builder ); - builder->path_begun = 0; - x += args[-2]; - y += args[-1]; - args = stack; - break; - - case cff_op_vmoveto: - FT_TRACE4(( " vmoveto\n" )); - - cff_builder_close_contour( builder ); - builder->path_begun = 0; - y += args[-1]; - args = stack; - break; - - case cff_op_hmoveto: - FT_TRACE4(( " hmoveto\n" )); - - cff_builder_close_contour( builder ); - builder->path_begun = 0; - x += args[-1]; - args = stack; - break; - - case cff_op_rlineto: - FT_TRACE4(( " rlineto\n" )); - - if ( cff_builder_start_point( builder, x, y ) || - cff_check_points( builder, num_args / 2 ) ) - goto Fail; - - if ( num_args < 2 ) - goto Stack_Underflow; - - args -= num_args & ~1; - while ( args < decoder->top ) - { - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 1 ); - args += 2; - } - args = stack; - break; - - case cff_op_hlineto: - case cff_op_vlineto: - { - FT_Int phase = ( op == cff_op_hlineto ); - - - FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n" - : " vlineto\n" )); - - if ( num_args < 0 ) - goto Stack_Underflow; - - /* there exist subsetted fonts (found in PDFs) */ - /* which call `hlineto' without arguments */ - if ( num_args == 0 ) - break; - - if ( cff_builder_start_point( builder, x, y ) || - cff_check_points( builder, num_args ) ) - goto Fail; - - args = stack; - while ( args < decoder->top ) - { - if ( phase ) - x += args[0]; - else - y += args[0]; - - if ( cff_builder_add_point1( builder, x, y ) ) - goto Fail; - - args++; - phase ^= 1; - } - args = stack; - } - break; - - case cff_op_rrcurveto: - { - FT_Int nargs; - - - FT_TRACE4(( " rrcurveto\n" )); - - if ( num_args < 6 ) - goto Stack_Underflow; - - nargs = num_args - num_args % 6; - - if ( cff_builder_start_point( builder, x, y ) || - cff_check_points( builder, nargs / 2 ) ) - goto Fail; - - args -= nargs; - while ( args < decoder->top ) - { - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[2]; - y += args[3]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[4]; - y += args[5]; - cff_builder_add_point( builder, x, y, 1 ); - args += 6; - } - args = stack; - } - break; - - case cff_op_vvcurveto: - { - FT_Int nargs; - - - FT_TRACE4(( " vvcurveto\n" )); - - if ( num_args < 4 ) - goto Stack_Underflow; - - /* if num_args isn't of the form 4n or 4n+1, */ - /* we enforce it by clearing the second bit */ - - nargs = num_args & ~2; - - if ( cff_builder_start_point( builder, x, y ) ) - goto Fail; - - args -= nargs; - - if ( nargs & 1 ) - { - x += args[0]; - args++; - nargs--; - } - - if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) ) - goto Fail; - - while ( args < decoder->top ) - { - y += args[0]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[1]; - y += args[2]; - cff_builder_add_point( builder, x, y, 0 ); - y += args[3]; - cff_builder_add_point( builder, x, y, 1 ); - args += 4; - } - args = stack; - } - break; - - case cff_op_hhcurveto: - { - FT_Int nargs; - - - FT_TRACE4(( " hhcurveto\n" )); - - if ( num_args < 4 ) - goto Stack_Underflow; - - /* if num_args isn't of the form 4n or 4n+1, */ - /* we enforce it by clearing the second bit */ - - nargs = num_args & ~2; - - if ( cff_builder_start_point( builder, x, y ) ) - goto Fail; - - args -= nargs; - if ( nargs & 1 ) - { - y += args[0]; - args++; - nargs--; - } - - if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) ) - goto Fail; - - while ( args < decoder->top ) - { - x += args[0]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[1]; - y += args[2]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[3]; - cff_builder_add_point( builder, x, y, 1 ); - args += 4; - } - args = stack; - } - break; - - case cff_op_vhcurveto: - case cff_op_hvcurveto: - { - FT_Int phase; - FT_Int nargs; - - - FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n" - : " hvcurveto\n" )); - - if ( cff_builder_start_point( builder, x, y ) ) - goto Fail; - - if ( num_args < 4 ) - goto Stack_Underflow; - - /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */ - /* we enforce it by clearing the second bit */ - - nargs = num_args & ~2; - - args -= nargs; - if ( cff_check_points( builder, ( nargs / 4 ) * 3 ) ) - goto Stack_Underflow; - - phase = ( op == cff_op_hvcurveto ); - - while ( nargs >= 4 ) - { - nargs -= 4; - if ( phase ) - { - x += args[0]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[1]; - y += args[2]; - cff_builder_add_point( builder, x, y, 0 ); - y += args[3]; - if ( nargs == 1 ) - x += args[4]; - cff_builder_add_point( builder, x, y, 1 ); - } - else - { - y += args[0]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[1]; - y += args[2]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[3]; - if ( nargs == 1 ) - y += args[4]; - cff_builder_add_point( builder, x, y, 1 ); - } - args += 4; - phase ^= 1; - } - args = stack; - } - break; - - case cff_op_rlinecurve: - { - FT_Int num_lines; - FT_Int nargs; - - - FT_TRACE4(( " rlinecurve\n" )); - - if ( num_args < 8 ) - goto Stack_Underflow; - - nargs = num_args & ~1; - num_lines = ( nargs - 6 ) / 2; - - if ( cff_builder_start_point( builder, x, y ) || - cff_check_points( builder, num_lines + 3 ) ) - goto Fail; - - args -= nargs; - - /* first, add the line segments */ - while ( num_lines > 0 ) - { - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 1 ); - args += 2; - num_lines--; - } - - /* then the curve */ - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[2]; - y += args[3]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[4]; - y += args[5]; - cff_builder_add_point( builder, x, y, 1 ); - args = stack; - } - break; - - case cff_op_rcurveline: - { - FT_Int num_curves; - FT_Int nargs; - - - FT_TRACE4(( " rcurveline\n" )); - - if ( num_args < 8 ) - goto Stack_Underflow; - - nargs = num_args - 2; - nargs = nargs - nargs % 6 + 2; - num_curves = ( nargs - 2 ) / 6; - - if ( cff_builder_start_point( builder, x, y ) || - cff_check_points( builder, num_curves * 3 + 2 ) ) - goto Fail; - - args -= nargs; - - /* first, add the curves */ - while ( num_curves > 0 ) - { - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[2]; - y += args[3]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[4]; - y += args[5]; - cff_builder_add_point( builder, x, y, 1 ); - args += 6; - num_curves--; - } - - /* then the final line */ - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 1 ); - args = stack; - } - break; - - case cff_op_hflex1: - { - FT_Pos start_y; - - - FT_TRACE4(( " hflex1\n" )); - - /* adding five more points: 4 control points, 1 on-curve point */ - /* -- make sure we have enough space for the start point if it */ - /* needs to be added */ - if ( cff_builder_start_point( builder, x, y ) || - cff_check_points( builder, 6 ) ) - goto Fail; - - /* record the starting point's y position for later use */ - start_y = y; - - /* first control point */ - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 0 ); - - /* second control point */ - x += args[2]; - y += args[3]; - cff_builder_add_point( builder, x, y, 0 ); - - /* join point; on curve, with y-value the same as the last */ - /* control point's y-value */ - x += args[4]; - cff_builder_add_point( builder, x, y, 1 ); - - /* third control point, with y-value the same as the join */ - /* point's y-value */ - x += args[5]; - cff_builder_add_point( builder, x, y, 0 ); - - /* fourth control point */ - x += args[6]; - y += args[7]; - cff_builder_add_point( builder, x, y, 0 ); - - /* ending point, with y-value the same as the start */ - x += args[8]; - y = start_y; - cff_builder_add_point( builder, x, y, 1 ); - - args = stack; - break; - } - - case cff_op_hflex: - { - FT_Pos start_y; - - - FT_TRACE4(( " hflex\n" )); - - /* adding six more points; 4 control points, 2 on-curve points */ - if ( cff_builder_start_point( builder, x, y ) || - cff_check_points( builder, 6 ) ) - goto Fail; - - /* record the starting point's y-position for later use */ - start_y = y; - - /* first control point */ - x += args[0]; - cff_builder_add_point( builder, x, y, 0 ); - - /* second control point */ - x += args[1]; - y += args[2]; - cff_builder_add_point( builder, x, y, 0 ); - - /* join point; on curve, with y-value the same as the last */ - /* control point's y-value */ - x += args[3]; - cff_builder_add_point( builder, x, y, 1 ); - - /* third control point, with y-value the same as the join */ - /* point's y-value */ - x += args[4]; - cff_builder_add_point( builder, x, y, 0 ); - - /* fourth control point */ - x += args[5]; - y = start_y; - cff_builder_add_point( builder, x, y, 0 ); - - /* ending point, with y-value the same as the start point's */ - /* y-value -- we don't add this point, though */ - x += args[6]; - cff_builder_add_point( builder, x, y, 1 ); - - args = stack; - break; - } - - case cff_op_flex1: - { - FT_Pos start_x, start_y; /* record start x, y values for */ - /* alter use */ - FT_Fixed dx = 0, dy = 0; /* used in horizontal/vertical */ - /* algorithm below */ - FT_Int horizontal, count; - FT_Fixed* temp; - - - FT_TRACE4(( " flex1\n" )); - - /* adding six more points; 4 control points, 2 on-curve points */ - if ( cff_builder_start_point( builder, x, y ) || - cff_check_points( builder, 6 ) ) - goto Fail; - - /* record the starting point's x, y position for later use */ - start_x = x; - start_y = y; - - /* XXX: figure out whether this is supposed to be a horizontal */ - /* or vertical flex; the Type 2 specification is vague... */ - - temp = args; - - /* grab up to the last argument */ - for ( count = 5; count > 0; count-- ) - { - dx += temp[0]; - dy += temp[1]; - temp += 2; - } - - if ( dx < 0 ) - dx = -dx; - if ( dy < 0 ) - dy = -dy; - - /* strange test, but here it is... */ - horizontal = ( dx > dy ); - - for ( count = 5; count > 0; count-- ) - { - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, - (FT_Bool)( count == 3 ) ); - args += 2; - } - - /* is last operand an x- or y-delta? */ - if ( horizontal ) - { - x += args[0]; - y = start_y; - } - else - { - x = start_x; - y += args[0]; - } - - cff_builder_add_point( builder, x, y, 1 ); - - args = stack; - break; - } - - case cff_op_flex: - { - FT_UInt count; - - - FT_TRACE4(( " flex\n" )); - - if ( cff_builder_start_point( builder, x, y ) || - cff_check_points( builder, 6 ) ) - goto Fail; - - for ( count = 6; count > 0; count-- ) - { - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, - (FT_Bool)( count == 4 || count == 1 ) ); - args += 2; - } - - args = stack; - } - break; - - case cff_op_seac: - FT_TRACE4(( " seac\n" )); - - error = cff_operator_seac( decoder, - args[0], args[1], args[2], - (FT_Int)( args[3] >> 16 ), - (FT_Int)( args[4] >> 16 ) ); - - /* add current outline to the glyph slot */ - FT_GlyphLoader_Add( builder->loader ); - - /* return now! */ - FT_TRACE4(( "\n" )); - return error; - - case cff_op_endchar: - FT_TRACE4(( " endchar\n" )); - - /* We are going to emulate the seac operator. */ - if ( num_args >= 4 ) - { - /* Save glyph width so that the subglyphs don't overwrite it. */ - FT_Pos glyph_width = decoder->glyph_width; - - - error = cff_operator_seac( decoder, - 0L, args[-4], args[-3], - (FT_Int)( args[-2] >> 16 ), - (FT_Int)( args[-1] >> 16 ) ); - - decoder->glyph_width = glyph_width; - } - else - { - cff_builder_close_contour( builder ); - - /* close hints recording session */ - if ( hinter ) - { - if ( hinter->close( hinter->hints, - (FT_UInt)builder->current->n_points ) ) - goto Syntax_Error; - - /* apply hints to the loaded glyph outline now */ - error = hinter->apply( hinter->hints, - builder->current, - (PSH_Globals)builder->hints_globals, - decoder->hint_mode ); - if ( error ) - goto Fail; - } - - /* add current outline to the glyph slot */ - FT_GlyphLoader_Add( builder->loader ); - } - - /* return now! */ - FT_TRACE4(( "\n" )); - return error; - - case cff_op_abs: - FT_TRACE4(( " abs\n" )); - - if ( args[0] < 0 ) - args[0] = -args[0]; - args++; - break; - - case cff_op_add: - FT_TRACE4(( " add\n" )); - - args[0] += args[1]; - args++; - break; - - case cff_op_sub: - FT_TRACE4(( " sub\n" )); - - args[0] -= args[1]; - args++; - break; - - case cff_op_div: - FT_TRACE4(( " div\n" )); - - args[0] = FT_DivFix( args[0], args[1] ); - args++; - break; - - case cff_op_neg: - FT_TRACE4(( " neg\n" )); - - args[0] = -args[0]; - args++; - break; - - case cff_op_random: - { - FT_Fixed Rand; - - - FT_TRACE4(( " rand\n" )); - - Rand = seed; - if ( Rand >= 0x8000L ) - Rand++; - - args[0] = Rand; - seed = FT_MulFix( seed, 0x10000L - seed ); - if ( seed == 0 ) - seed += 0x2873; - args++; - } - break; - - case cff_op_mul: - FT_TRACE4(( " mul\n" )); - - args[0] = FT_MulFix( args[0], args[1] ); - args++; - break; - - case cff_op_sqrt: - FT_TRACE4(( " sqrt\n" )); - - if ( args[0] > 0 ) - { - FT_Int count = 9; - FT_Fixed root = args[0]; - FT_Fixed new_root; - - - for (;;) - { - new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1; - if ( new_root == root || count <= 0 ) - break; - root = new_root; - } - args[0] = new_root; - } - else - args[0] = 0; - args++; - break; - - case cff_op_drop: - /* nothing */ - FT_TRACE4(( " drop\n" )); - - break; - - case cff_op_exch: - { - FT_Fixed tmp; - - - FT_TRACE4(( " exch\n" )); - - tmp = args[0]; - args[0] = args[1]; - args[1] = tmp; - args += 2; - } - break; - - case cff_op_index: - { - FT_Int idx = (FT_Int)( args[0] >> 16 ); - - - FT_TRACE4(( " index\n" )); - - if ( idx < 0 ) - idx = 0; - else if ( idx > num_args - 2 ) - idx = num_args - 2; - args[0] = args[-( idx + 1 )]; - args++; - } - break; - - case cff_op_roll: - { - FT_Int count = (FT_Int)( args[0] >> 16 ); - FT_Int idx = (FT_Int)( args[1] >> 16 ); - - - FT_TRACE4(( " roll\n" )); - - if ( count <= 0 ) - count = 1; - - args -= count; - if ( args < stack ) - goto Stack_Underflow; - - if ( idx >= 0 ) - { - while ( idx > 0 ) - { - FT_Fixed tmp = args[count - 1]; - FT_Int i; - - - for ( i = count - 2; i >= 0; i-- ) - args[i + 1] = args[i]; - args[0] = tmp; - idx--; - } - } - else - { - while ( idx < 0 ) - { - FT_Fixed tmp = args[0]; - FT_Int i; - - - for ( i = 0; i < count - 1; i++ ) - args[i] = args[i + 1]; - args[count - 1] = tmp; - idx++; - } - } - args += count; - } - break; - - case cff_op_dup: - FT_TRACE4(( " dup\n" )); - - args[1] = args[0]; - args += 2; - break; - - case cff_op_put: - { - FT_Fixed val = args[0]; - FT_Int idx = (FT_Int)( args[1] >> 16 ); - - - FT_TRACE4(( " put\n" )); - - if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS ) - decoder->buildchar[idx] = val; - } - break; - - case cff_op_get: - { - FT_Int idx = (FT_Int)( args[0] >> 16 ); - FT_Fixed val = 0; - - - FT_TRACE4(( " get\n" )); - - if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS ) - val = decoder->buildchar[idx]; - - args[0] = val; - args++; - } - break; - - case cff_op_store: - FT_TRACE4(( " store\n")); - - goto Unimplemented; - - case cff_op_load: - FT_TRACE4(( " load\n" )); - - goto Unimplemented; - - case cff_op_dotsection: - /* this operator is deprecated and ignored by the parser */ - FT_TRACE4(( " dotsection\n" )); - break; - - case cff_op_closepath: - /* this is an invalid Type 2 operator; however, there */ - /* exist fonts which are incorrectly converted from probably */ - /* Type 1 to CFF, and some parsers seem to accept it */ - - FT_TRACE4(( " closepath (invalid op)\n" )); - - args = stack; - break; - - case cff_op_hsbw: - /* this is an invalid Type 2 operator; however, there */ - /* exist fonts which are incorrectly converted from probably */ - /* Type 1 to CFF, and some parsers seem to accept it */ - - FT_TRACE4(( " hsbw (invalid op)\n" )); - - decoder->glyph_width = decoder->nominal_width + ( args[1] >> 16 ); - - decoder->builder.left_bearing.x = args[0]; - decoder->builder.left_bearing.y = 0; - - x = decoder->builder.pos_x + args[0]; - y = decoder->builder.pos_y; - args = stack; - break; - - case cff_op_sbw: - /* this is an invalid Type 2 operator; however, there */ - /* exist fonts which are incorrectly converted from probably */ - /* Type 1 to CFF, and some parsers seem to accept it */ - - FT_TRACE4(( " sbw (invalid op)\n" )); - - decoder->glyph_width = decoder->nominal_width + ( args[2] >> 16 ); - - decoder->builder.left_bearing.x = args[0]; - decoder->builder.left_bearing.y = args[1]; - - x = decoder->builder.pos_x + args[0]; - y = decoder->builder.pos_y + args[1]; - args = stack; - break; - - case cff_op_setcurrentpoint: - /* this is an invalid Type 2 operator; however, there */ - /* exist fonts which are incorrectly converted from probably */ - /* Type 1 to CFF, and some parsers seem to accept it */ - - FT_TRACE4(( " setcurrentpoint (invalid op)\n" )); - - x = decoder->builder.pos_x + args[0]; - y = decoder->builder.pos_y + args[1]; - args = stack; - break; - - case cff_op_callothersubr: - /* this is an invalid Type 2 operator; however, there */ - /* exist fonts which are incorrectly converted from probably */ - /* Type 1 to CFF, and some parsers seem to accept it */ - - FT_TRACE4(( " callothersubr (invalid op)\n" )); - - /* subsequent `pop' operands should add the arguments, */ - /* this is the implementation described for `unknown' other */ - /* subroutines in the Type1 spec. */ - /* */ - /* XXX Fix return arguments (see discussion below). */ - args -= 2 + ( args[-2] >> 16 ); - if ( args < stack ) - goto Stack_Underflow; - break; - - case cff_op_pop: - /* this is an invalid Type 2 operator; however, there */ - /* exist fonts which are incorrectly converted from probably */ - /* Type 1 to CFF, and some parsers seem to accept it */ - - FT_TRACE4(( " pop (invalid op)\n" )); - - /* XXX Increasing `args' is wrong: After a certain number of */ - /* `pop's we get a stack overflow. Reason for doing it is */ - /* code like this (actually found in a CFF font): */ - /* */ - /* 17 1 3 callothersubr */ - /* pop */ - /* callsubr */ - /* */ - /* Since we handle `callothersubr' as a no-op, and */ - /* `callsubr' needs at least one argument, `pop' can't be a */ - /* no-op too as it basically should be. */ - /* */ - /* The right solution would be to provide real support for */ - /* `callothersubr' as done in `t1decode.c', however, given */ - /* the fact that CFF fonts with `pop' are invalid, it is */ - /* questionable whether it is worth the time. */ - args++; - break; - - case cff_op_and: - { - FT_Fixed cond = args[0] && args[1]; - - - FT_TRACE4(( " and\n" )); - - args[0] = cond ? 0x10000L : 0; - args++; - } - break; - - case cff_op_or: - { - FT_Fixed cond = args[0] || args[1]; - - - FT_TRACE4(( " or\n" )); - - args[0] = cond ? 0x10000L : 0; - args++; - } - break; - - case cff_op_eq: - { - FT_Fixed cond = !args[0]; - - - FT_TRACE4(( " eq\n" )); - - args[0] = cond ? 0x10000L : 0; - args++; - } - break; - - case cff_op_ifelse: - { - FT_Fixed cond = ( args[2] <= args[3] ); - - - FT_TRACE4(( " ifelse\n" )); - - if ( !cond ) - args[0] = args[1]; - args++; - } - break; - - case cff_op_callsubr: - { - FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + - decoder->locals_bias ); - - - FT_TRACE4(( " callsubr (idx %d, entering level %d)\n", - idx, - zone - decoder->zones + 1 )); - - if ( idx >= decoder->num_locals ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " invalid local subr index\n" )); - goto Syntax_Error; - } - - if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " too many nested subrs\n" )); - goto Syntax_Error; - } - - zone->cursor = ip; /* save current instruction pointer */ - - zone++; - zone->base = decoder->locals[idx]; - zone->limit = decoder->locals[idx + 1]; - zone->cursor = zone->base; - - if ( !zone->base || zone->limit == zone->base ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " invoking empty subrs\n" )); - goto Syntax_Error; - } - - decoder->zone = zone; - ip = zone->base; - limit = zone->limit; - } - break; - - case cff_op_callgsubr: - { - FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + - decoder->globals_bias ); - - - FT_TRACE4(( " callgsubr (idx %d, entering level %d)\n", - idx, - zone - decoder->zones + 1 )); - - if ( idx >= decoder->num_globals ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " invalid global subr index\n" )); - goto Syntax_Error; - } - - if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " too many nested subrs\n" )); - goto Syntax_Error; - } - - zone->cursor = ip; /* save current instruction pointer */ - - zone++; - zone->base = decoder->globals[idx]; - zone->limit = decoder->globals[idx + 1]; - zone->cursor = zone->base; - - if ( !zone->base || zone->limit == zone->base ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " invoking empty subrs\n" )); - goto Syntax_Error; - } - - decoder->zone = zone; - ip = zone->base; - limit = zone->limit; - } - break; - - case cff_op_return: - FT_TRACE4(( " return (leaving level %d)\n", - decoder->zone - decoder->zones )); - - if ( decoder->zone <= decoder->zones ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " unexpected return\n" )); - goto Syntax_Error; - } - - decoder->zone--; - zone = decoder->zone; - ip = zone->cursor; - limit = zone->limit; - break; - - default: - Unimplemented: - FT_ERROR(( "Unimplemented opcode: %d", ip[-1] )); - - if ( ip[-1] == 12 ) - FT_ERROR(( " %d", ip[0] )); - FT_ERROR(( "\n" )); - - return FT_THROW( Unimplemented_Feature ); - } - - decoder->top = args; - - if ( decoder->top - stack >= CFF_MAX_OPERANDS ) - goto Stack_Overflow; - - } /* general operator processing */ - - } /* while ip < limit */ - - FT_TRACE4(( "..end..\n\n" )); - - Fail: - return error; - - Syntax_Error: - FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" )); - return FT_THROW( Invalid_File_Format ); - - Stack_Underflow: - FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" )); - return FT_THROW( Too_Few_Arguments ); - - Stack_Overflow: - FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" )); - return FT_THROW( Stack_Overflow ); - } - -#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /********** *********/ - /********** *********/ - /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ - /********** *********/ - /********** The following code is in charge of computing *********/ - /********** the maximum advance width of the font. It *********/ - /********** quickly processes each glyph charstring to *********/ - /********** extract the value from either a `sbw' or `seac' *********/ - /********** operator. *********/ - /********** *********/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#if 0 /* unused until we support pure CFF fonts */ - - - FT_LOCAL_DEF( FT_Error ) - cff_compute_max_advance( TT_Face face, - FT_Int* max_advance ) - { - FT_Error error = FT_Err_Ok; - CFF_Decoder decoder; - FT_Int glyph_index; - CFF_Font cff = (CFF_Font)face->other; - - - *max_advance = 0; - - /* Initialize load decoder */ - cff_decoder_init( &decoder, face, 0, 0, 0, 0 ); - - decoder.builder.metrics_only = 1; - decoder.builder.load_points = 0; - - /* For each glyph, parse the glyph charstring and extract */ - /* the advance width. */ - for ( glyph_index = 0; glyph_index < face->root.num_glyphs; - glyph_index++ ) - { - FT_Byte* charstring; - FT_ULong charstring_len; - - - /* now get load the unscaled outline */ - error = cff_get_glyph_data( face, glyph_index, - &charstring, &charstring_len ); - if ( !error ) - { - error = cff_decoder_prepare( &decoder, size, glyph_index ); - if ( !error ) - error = cff_decoder_parse_charstrings( &decoder, - charstring, - charstring_len ); - - cff_free_glyph_data( face, &charstring, &charstring_len ); - } - - /* ignore the error if one has occurred -- skip to next glyph */ - error = FT_Err_Ok; - } - - *max_advance = decoder.builder.advance.x; - - return FT_Err_Ok; - } - - -#endif /* 0 */ - - - FT_LOCAL_DEF( FT_Error ) - cff_slot_load( CFF_GlyphSlot glyph, - CFF_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FT_Error error; - CFF_Decoder decoder; - TT_Face face = (TT_Face)glyph->root.face; - FT_Bool hinting, scaled, force_scaling; - CFF_Font cff = (CFF_Font)face->extra.data; - - FT_Matrix font_matrix; - FT_Vector font_offset; - - - force_scaling = FALSE; - - /* in a CID-keyed font, consider `glyph_index' as a CID and map */ - /* it immediately to the real glyph_index -- if it isn't a */ - /* subsetted font, glyph_indices and CIDs are identical, though */ - if ( cff->top_font.font_dict.cid_registry != 0xFFFFU && - cff->charset.cids ) - { - /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */ - if ( glyph_index != 0 ) - { - glyph_index = cff_charset_cid_to_gindex( &cff->charset, - glyph_index ); - if ( glyph_index == 0 ) - return FT_THROW( Invalid_Argument ); - } - } - else if ( glyph_index >= cff->num_glyphs ) - return FT_THROW( Invalid_Argument ); - - if ( load_flags & FT_LOAD_NO_RECURSE ) - load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; - - glyph->x_scale = 0x10000L; - glyph->y_scale = 0x10000L; - if ( size ) - { - glyph->x_scale = size->root.metrics.x_scale; - glyph->y_scale = size->root.metrics.y_scale; - } - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - /* try to load embedded bitmap if any */ - /* */ - /* XXX: The convention should be emphasized in */ - /* the documents because it can be confusing. */ - if ( size ) - { - CFF_Face cff_face = (CFF_Face)size->root.face; - SFNT_Service sfnt = (SFNT_Service)cff_face->sfnt; - FT_Stream stream = cff_face->root.stream; - - - if ( size->strike_index != 0xFFFFFFFFUL && - sfnt->load_eblc && - ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) - { - TT_SBit_MetricsRec metrics; - - - error = sfnt->load_sbit_image( face, - size->strike_index, - glyph_index, - (FT_UInt)load_flags, - stream, - &glyph->root.bitmap, - &metrics ); - - if ( !error ) - { - FT_Bool has_vertical_info; - FT_UShort advance; - FT_Short dummy; - - - glyph->root.outline.n_points = 0; - glyph->root.outline.n_contours = 0; - - glyph->root.metrics.width = (FT_Pos)metrics.width << 6; - glyph->root.metrics.height = (FT_Pos)metrics.height << 6; - - glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6; - glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6; - glyph->root.metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6; - - glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6; - glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6; - glyph->root.metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6; - - glyph->root.format = FT_GLYPH_FORMAT_BITMAP; - - if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) - { - glyph->root.bitmap_left = metrics.vertBearingX; - glyph->root.bitmap_top = metrics.vertBearingY; - } - else - { - glyph->root.bitmap_left = metrics.horiBearingX; - glyph->root.bitmap_top = metrics.horiBearingY; - } - - /* compute linear advance widths */ - - (void)( (SFNT_Service)face->sfnt )->get_metrics( face, 0, - glyph_index, - &dummy, - &advance ); - glyph->root.linearHoriAdvance = advance; - - has_vertical_info = FT_BOOL( - face->vertical_info && - face->vertical.number_Of_VMetrics > 0 ); - - /* get the vertical metrics from the vmtx table if we have one */ - if ( has_vertical_info ) - { - (void)( (SFNT_Service)face->sfnt )->get_metrics( face, 1, - glyph_index, - &dummy, - &advance ); - glyph->root.linearVertAdvance = advance; - } - else - { - /* make up vertical ones */ - if ( face->os2.version != 0xFFFFU ) - glyph->root.linearVertAdvance = (FT_Pos) - ( face->os2.sTypoAscender - face->os2.sTypoDescender ); - else - glyph->root.linearVertAdvance = (FT_Pos) - ( face->horizontal.Ascender - face->horizontal.Descender ); - } - - return error; - } - } - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - /* return immediately if we only want the embedded bitmaps */ - if ( load_flags & FT_LOAD_SBITS_ONLY ) - return FT_THROW( Invalid_Argument ); - - /* if we have a CID subfont, use its matrix (which has already */ - /* been multiplied with the root matrix) */ - - /* this scaling is only relevant if the PS hinter isn't active */ - if ( cff->num_subfonts ) - { - FT_Long top_upm, sub_upm; - FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, - glyph_index ); - - - if ( fd_index >= cff->num_subfonts ) - fd_index = (FT_Byte)( cff->num_subfonts - 1 ); - - top_upm = (FT_Long)cff->top_font.font_dict.units_per_em; - sub_upm = (FT_Long)cff->subfonts[fd_index]->font_dict.units_per_em; - - - font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix; - font_offset = cff->subfonts[fd_index]->font_dict.font_offset; - - if ( top_upm != sub_upm ) - { - glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm ); - glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm ); - - force_scaling = TRUE; - } - } - else - { - font_matrix = cff->top_font.font_dict.font_matrix; - font_offset = cff->top_font.font_dict.font_offset; - } - - glyph->root.outline.n_points = 0; - glyph->root.outline.n_contours = 0; - - /* top-level code ensures that FT_LOAD_NO_HINTING is set */ - /* if FT_LOAD_NO_SCALE is active */ - hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); - scaled = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ); - - glyph->hint = hinting; - glyph->scaled = scaled; - glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; /* by default */ - - { -#ifdef CFF_CONFIG_OPTION_OLD_ENGINE - CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( face ); -#endif - - - FT_Byte* charstring; - FT_ULong charstring_len; - - - cff_decoder_init( &decoder, face, size, glyph, hinting, - FT_LOAD_TARGET_MODE( load_flags ) ); - - if ( load_flags & FT_LOAD_ADVANCE_ONLY ) - decoder.width_only = TRUE; - - decoder.builder.no_recurse = - (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE ); - - /* now load the unscaled outline */ - error = cff_get_glyph_data( face, glyph_index, - &charstring, &charstring_len ); - if ( error ) - goto Glyph_Build_Finished; - - error = cff_decoder_prepare( &decoder, size, glyph_index ); - if ( error ) - goto Glyph_Build_Finished; - -#ifdef CFF_CONFIG_OPTION_OLD_ENGINE - /* choose which CFF renderer to use */ - if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE ) - error = cff_decoder_parse_charstrings( &decoder, - charstring, - charstring_len ); - else -#endif - { - error = cf2_decoder_parse_charstrings( &decoder, - charstring, - charstring_len ); - - /* Adobe's engine uses 16.16 numbers everywhere; */ - /* as a consequence, glyphs larger than 2000ppem get rejected */ - if ( FT_ERR_EQ( error, Glyph_Too_Big ) ) - { - /* this time, we retry unhinted and scale up the glyph later on */ - /* (the engine uses and sets the hardcoded value 0x10000 / 64 = */ - /* 0x400 for both `x_scale' and `y_scale' in this case) */ - hinting = FALSE; - force_scaling = TRUE; - glyph->hint = hinting; - - error = cf2_decoder_parse_charstrings( &decoder, - charstring, - charstring_len ); - } - } - - cff_free_glyph_data( face, &charstring, charstring_len ); - - if ( error ) - goto Glyph_Build_Finished; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* Control data and length may not be available for incremental */ - /* fonts. */ - if ( face->root.internal->incremental_interface ) - { - glyph->root.control_data = NULL; - glyph->root.control_len = 0; - } - else -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - /* We set control_data and control_len if charstrings is loaded. */ - /* See how charstring loads at cff_index_access_element() in */ - /* cffload.c. */ - { - CFF_Index csindex = &cff->charstrings_index; - - - if ( csindex->offsets ) - { - glyph->root.control_data = csindex->bytes + - csindex->offsets[glyph_index] - 1; - glyph->root.control_len = (FT_Long)charstring_len; - } - } - - Glyph_Build_Finished: - /* save new glyph tables, if no error */ - if ( !error ) - cff_builder_done( &decoder.builder ); - /* XXX: anything to do for broken glyph entry? */ - } - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - /* Incremental fonts can optionally override the metrics. */ - if ( !error && - face->root.internal->incremental_interface && - face->root.internal->incremental_interface->funcs->get_glyph_metrics ) - { - FT_Incremental_MetricsRec metrics; - - - metrics.bearing_x = decoder.builder.left_bearing.x; - metrics.bearing_y = 0; - metrics.advance = decoder.builder.advance.x; - metrics.advance_v = decoder.builder.advance.y; - - error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( - face->root.internal->incremental_interface->object, - glyph_index, FALSE, &metrics ); - - decoder.builder.left_bearing.x = metrics.bearing_x; - decoder.builder.advance.x = metrics.advance; - decoder.builder.advance.y = metrics.advance_v; - } - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - if ( !error ) - { - /* Now, set the metrics -- this is rather simple, as */ - /* the left side bearing is the xMin, and the top side */ - /* bearing the yMax. */ - - /* For composite glyphs, return only left side bearing and */ - /* advance width. */ - if ( load_flags & FT_LOAD_NO_RECURSE ) - { - FT_Slot_Internal internal = glyph->root.internal; - - - glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x; - glyph->root.metrics.horiAdvance = decoder.glyph_width; - internal->glyph_matrix = font_matrix; - internal->glyph_delta = font_offset; - internal->glyph_transformed = 1; - } - else - { - FT_BBox cbox; - FT_Glyph_Metrics* metrics = &glyph->root.metrics; - FT_Bool has_vertical_info; - - - if ( face->horizontal.number_Of_HMetrics ) - { - FT_Short horiBearingX = 0; - FT_UShort horiAdvance = 0; - - - ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, - glyph_index, - &horiBearingX, - &horiAdvance ); - metrics->horiAdvance = horiAdvance; - metrics->horiBearingX = horiBearingX; - glyph->root.linearHoriAdvance = horiAdvance; - } - else - { - /* copy the _unscaled_ advance width */ - metrics->horiAdvance = decoder.glyph_width; - glyph->root.linearHoriAdvance = decoder.glyph_width; - } - - glyph->root.internal->glyph_transformed = 0; - - has_vertical_info = FT_BOOL( face->vertical_info && - face->vertical.number_Of_VMetrics > 0 ); - - /* get the vertical metrics from the vmtx table if we have one */ - if ( has_vertical_info ) - { - FT_Short vertBearingY = 0; - FT_UShort vertAdvance = 0; - - - ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, - glyph_index, - &vertBearingY, - &vertAdvance ); - metrics->vertBearingY = vertBearingY; - metrics->vertAdvance = vertAdvance; - } - else - { - /* make up vertical ones */ - if ( face->os2.version != 0xFFFFU ) - metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender - - face->os2.sTypoDescender ); - else - metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender - - face->horizontal.Descender ); - } - - glyph->root.linearVertAdvance = metrics->vertAdvance; - - glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; - - glyph->root.outline.flags = 0; - if ( size && size->root.metrics.y_ppem < 24 ) - glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION; - - glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL; - - /* apply the font matrix, if any */ - if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L || - font_matrix.xy != 0 || font_matrix.yx != 0 ) - { - FT_Outline_Transform( &glyph->root.outline, &font_matrix ); - - metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, - font_matrix.xx ); - metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, - font_matrix.yy ); - } - - if ( font_offset.x || font_offset.y ) - { - FT_Outline_Translate( &glyph->root.outline, - font_offset.x, - font_offset.y ); - - metrics->horiAdvance += font_offset.x; - metrics->vertAdvance += font_offset.y; - } - - if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling ) - { - /* scale the outline and the metrics */ - FT_Int n; - FT_Outline* cur = &glyph->root.outline; - FT_Vector* vec = cur->points; - FT_Fixed x_scale = glyph->x_scale; - FT_Fixed y_scale = glyph->y_scale; - - - /* First of all, scale the points */ - if ( !hinting || !decoder.builder.hints_funcs ) - for ( n = cur->n_points; n > 0; n--, vec++ ) - { - vec->x = FT_MulFix( vec->x, x_scale ); - vec->y = FT_MulFix( vec->y, y_scale ); - } - - /* Then scale the metrics */ - metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); - metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); - } - - /* compute the other metrics */ - FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); - - metrics->width = cbox.xMax - cbox.xMin; - metrics->height = cbox.yMax - cbox.yMin; - - metrics->horiBearingX = cbox.xMin; - metrics->horiBearingY = cbox.yMax; - - if ( has_vertical_info ) - metrics->vertBearingX = metrics->horiBearingX - - metrics->horiAdvance / 2; - else - { - if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) - ft_synthesize_vertical_metrics( metrics, - metrics->vertAdvance ); - } - } - } - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/cff/cffgload.h b/3party/freetype/src/cff/cffgload.h deleted file mode 100644 index 5f2655f3d9..0000000000 --- a/3party/freetype/src/cff/cffgload.h +++ /dev/null @@ -1,245 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffgload.h */ -/* */ -/* OpenType Glyph Loader (specification). */ -/* */ -/* Copyright 1996-2015 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 __CFFGLOAD_H__ -#define __CFFGLOAD_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include "cffobjs.h" - - -FT_BEGIN_HEADER - - -#define CFF_MAX_OPERANDS 48 -#define CFF_MAX_SUBRS_CALLS 16 /* maximum subroutine nesting; */ - /* only 10 are allowed but there exist */ - /* fonts like `HiraKakuProN-W3.ttf' */ - /* (Hiragino Kaku Gothic ProN W3; */ - /* 8.2d6e1; 2014-12-19) that exceed */ - /* this limit */ -#define CFF_MAX_TRANS_ELEMENTS 32 - - - /*************************************************************************/ - /* */ - /* <Structure> */ - /* CFF_Builder */ - /* */ - /* <Description> */ - /* A structure used during glyph loading to store its outline. */ - /* */ - /* <Fields> */ - /* memory :: The current memory object. */ - /* */ - /* face :: The current face object. */ - /* */ - /* glyph :: The current glyph slot. */ - /* */ - /* loader :: The current glyph loader. */ - /* */ - /* base :: The base glyph outline. */ - /* */ - /* current :: The current glyph outline. */ - /* */ - /* pos_x :: The horizontal translation (if composite glyph). */ - /* */ - /* pos_y :: The vertical translation (if composite glyph). */ - /* */ - /* left_bearing :: The left side bearing point. */ - /* */ - /* advance :: The horizontal advance vector. */ - /* */ - /* bbox :: Unused. */ - /* */ - /* path_begun :: A flag which indicates that a new path has begun. */ - /* */ - /* load_points :: If this flag is not set, no points are loaded. */ - /* */ - /* no_recurse :: Set but not used. */ - /* */ - /* metrics_only :: A boolean indicating that we only want to compute */ - /* the metrics of a given glyph, not load all of its */ - /* points. */ - /* */ - /* hints_funcs :: Auxiliary pointer for hinting. */ - /* */ - /* hints_globals :: Auxiliary pointer for hinting. */ - /* */ - typedef struct CFF_Builder_ - { - FT_Memory memory; - TT_Face face; - CFF_GlyphSlot glyph; - FT_GlyphLoader loader; - FT_Outline* base; - FT_Outline* current; - - FT_Pos pos_x; - FT_Pos pos_y; - - FT_Vector left_bearing; - FT_Vector advance; - - FT_BBox bbox; /* bounding box */ - FT_Bool path_begun; - FT_Bool load_points; - FT_Bool no_recurse; - - FT_Bool metrics_only; - - void* hints_funcs; /* hinter-specific */ - void* hints_globals; /* hinter-specific */ - - } CFF_Builder; - - - FT_LOCAL( FT_Error ) - cff_check_points( CFF_Builder* builder, - FT_Int count ); - - FT_LOCAL( void ) - cff_builder_add_point( CFF_Builder* builder, - FT_Pos x, - FT_Pos y, - FT_Byte flag ); - FT_LOCAL( FT_Error ) - cff_builder_add_point1( CFF_Builder* builder, - FT_Pos x, - FT_Pos y ); - FT_LOCAL( FT_Error ) - cff_builder_start_point( CFF_Builder* builder, - FT_Pos x, - FT_Pos y ); - FT_LOCAL( void ) - cff_builder_close_contour( CFF_Builder* builder ); - - - FT_LOCAL( FT_Int ) - cff_lookup_glyph_by_stdcharcode( CFF_Font cff, - FT_Int charcode ); - FT_LOCAL( FT_Error ) - cff_get_glyph_data( TT_Face face, - FT_UInt glyph_index, - FT_Byte** pointer, - FT_ULong* length ); - FT_LOCAL( void ) - cff_free_glyph_data( TT_Face face, - FT_Byte** pointer, - FT_ULong length ); - - - /* execution context charstring zone */ - - typedef struct CFF_Decoder_Zone_ - { - FT_Byte* base; - FT_Byte* limit; - FT_Byte* cursor; - - } CFF_Decoder_Zone; - - - typedef struct CFF_Decoder_ - { - CFF_Builder builder; - CFF_Font cff; - - FT_Fixed stack[CFF_MAX_OPERANDS + 1]; - FT_Fixed* top; - - CFF_Decoder_Zone zones[CFF_MAX_SUBRS_CALLS + 1]; - CFF_Decoder_Zone* zone; - - FT_Int flex_state; - FT_Int num_flex_vectors; - FT_Vector flex_vectors[7]; - - FT_Pos glyph_width; - FT_Pos nominal_width; - - FT_Bool read_width; - FT_Bool width_only; - FT_Int num_hints; - FT_Fixed buildchar[CFF_MAX_TRANS_ELEMENTS]; - - FT_UInt num_locals; - FT_UInt num_globals; - - FT_Int locals_bias; - FT_Int globals_bias; - - FT_Byte** locals; - FT_Byte** globals; - - FT_Byte** glyph_names; /* for pure CFF fonts only */ - FT_UInt num_glyphs; /* number of glyphs in font */ - - FT_Render_Mode hint_mode; - - FT_Bool seac; - - CFF_SubFont current_subfont; /* for current glyph_index */ - - } CFF_Decoder; - - - FT_LOCAL( void ) - cff_decoder_init( CFF_Decoder* decoder, - TT_Face face, - CFF_Size size, - CFF_GlyphSlot slot, - FT_Bool hinting, - FT_Render_Mode hint_mode ); - - FT_LOCAL( FT_Error ) - cff_decoder_prepare( CFF_Decoder* decoder, - CFF_Size size, - FT_UInt glyph_index ); - -#if 0 /* unused until we support pure CFF fonts */ - - /* Compute the maximum advance width of a font through quick parsing */ - FT_LOCAL( FT_Error ) - cff_compute_max_advance( TT_Face face, - FT_Int* max_advance ); - -#endif /* 0 */ - -#ifdef CFF_CONFIG_OPTION_OLD_ENGINE - FT_LOCAL( FT_Error ) - cff_decoder_parse_charstrings( CFF_Decoder* decoder, - FT_Byte* charstring_base, - FT_ULong charstring_len ); -#endif - - FT_LOCAL( FT_Error ) - cff_slot_load( CFF_GlyphSlot glyph, - CFF_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ); - - -FT_END_HEADER - -#endif /* __CFFGLOAD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cffload.c b/3party/freetype/src/cff/cffload.c deleted file mode 100644 index c61222d651..0000000000 --- a/3party/freetype/src/cff/cffload.c +++ /dev/null @@ -1,1703 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffload.c */ -/* */ -/* OpenType and CFF data/program tables loader (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include FT_TYPE1_TABLES_H - -#include "cffload.h" -#include "cffparse.h" - -#include "cfferrs.h" - - -#if 1 - - static const FT_UShort cff_isoadobe_charset[229] = - { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228 - }; - - static const FT_UShort cff_expert_charset[166] = - { - 0, 1, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 13, 14, 15, 99, - 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 27, 28, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 109, 110, - 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 158, 155, 163, 319, - 320, 321, 322, 323, 324, 325, 326, 150, - 164, 169, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, - 341, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378 - }; - - static const FT_UShort cff_expertsubset_charset[87] = - { - 0, 1, 231, 232, 235, 236, 237, 238, - 13, 14, 15, 99, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 27, 28, - 249, 250, 251, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, - 266, 109, 110, 267, 268, 269, 270, 272, - 300, 301, 302, 305, 314, 315, 158, 155, - 163, 320, 321, 322, 323, 324, 325, 326, - 150, 164, 169, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 337, 338, 339, - 340, 341, 342, 343, 344, 345, 346 - }; - - static const FT_UShort cff_standard_encoding[256] = - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, - 0, 111, 112, 113, 114, 0, 115, 116, - 117, 118, 119, 120, 121, 122, 0, 123, - 0, 124, 125, 126, 127, 128, 129, 130, - 131, 0, 132, 133, 0, 134, 135, 136, - 137, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 138, 0, 139, 0, 0, 0, 0, - 140, 141, 142, 143, 0, 0, 0, 0, - 0, 144, 0, 0, 0, 145, 0, 0, - 146, 147, 148, 149, 0, 0, 0, 0 - }; - - static const FT_UShort cff_expert_encoding[256] = - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 229, 230, 0, 231, 232, 233, 234, - 235, 236, 237, 238, 13, 14, 15, 99, - 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 27, 28, 249, 250, 251, 252, - 0, 253, 254, 255, 256, 257, 0, 0, - 0, 258, 0, 0, 259, 260, 261, 262, - 0, 0, 263, 264, 265, 0, 266, 109, - 110, 267, 268, 269, 0, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 304, 305, 306, 0, 0, 307, 308, - 309, 310, 311, 0, 312, 0, 0, 312, - 0, 0, 314, 315, 0, 0, 316, 317, - 318, 0, 0, 0, 158, 155, 163, 319, - 320, 321, 322, 323, 324, 325, 0, 0, - 326, 150, 164, 169, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, - 339, 340, 341, 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 377, 378 - }; - -#endif /* 1 */ - - - FT_LOCAL_DEF( FT_UShort ) - cff_get_standard_encoding( FT_UInt charcode ) - { - return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode] - : 0 ); - } - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cffload - - - /* read an offset from the index's stream current position */ - static FT_ULong - cff_index_read_offset( CFF_Index idx, - FT_Error *errorp ) - { - FT_Error error; - FT_Stream stream = idx->stream; - FT_Byte tmp[4]; - FT_ULong result = 0; - - - if ( !FT_STREAM_READ( tmp, idx->off_size ) ) - { - FT_Int nn; - - - for ( nn = 0; nn < idx->off_size; nn++ ) - result = ( result << 8 ) | tmp[nn]; - } - - *errorp = error; - return result; - } - - - static FT_Error - cff_index_init( CFF_Index idx, - FT_Stream stream, - FT_Bool load ) - { - FT_Error error; - FT_Memory memory = stream->memory; - FT_UShort count; - - - FT_MEM_ZERO( idx, sizeof ( *idx ) ); - - idx->stream = stream; - idx->start = FT_STREAM_POS(); - if ( !FT_READ_USHORT( count ) && - count > 0 ) - { - FT_Byte offsize; - FT_ULong size; - - - /* there is at least one element; read the offset size, */ - /* then access the offset table to compute the index's total size */ - if ( FT_READ_BYTE( offsize ) ) - goto Exit; - - if ( offsize < 1 || offsize > 4 ) - { - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - idx->count = count; - idx->off_size = offsize; - size = (FT_ULong)( count + 1 ) * offsize; - - idx->data_offset = idx->start + 3 + size; - - if ( FT_STREAM_SKIP( size - offsize ) ) - goto Exit; - - size = cff_index_read_offset( idx, &error ); - if ( error ) - goto Exit; - - if ( size == 0 ) - { - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - idx->data_size = --size; - - if ( load ) - { - /* load the data */ - if ( FT_FRAME_EXTRACT( size, idx->bytes ) ) - goto Exit; - } - else - { - /* skip the data */ - if ( FT_STREAM_SKIP( size ) ) - goto Exit; - } - } - - Exit: - if ( error ) - FT_FREE( idx->offsets ); - - return error; - } - - - static void - cff_index_done( CFF_Index idx ) - { - if ( idx->stream ) - { - FT_Stream stream = idx->stream; - FT_Memory memory = stream->memory; - - - if ( idx->bytes ) - FT_FRAME_RELEASE( idx->bytes ); - - FT_FREE( idx->offsets ); - FT_MEM_ZERO( idx, sizeof ( *idx ) ); - } - } - - - static FT_Error - cff_index_load_offsets( CFF_Index idx ) - { - FT_Error error = FT_Err_Ok; - FT_Stream stream = idx->stream; - FT_Memory memory = stream->memory; - - - if ( idx->count > 0 && idx->offsets == NULL ) - { - FT_Byte offsize = idx->off_size; - FT_ULong data_size; - FT_Byte* p; - FT_Byte* p_end; - FT_ULong* poff; - - - data_size = (FT_ULong)( idx->count + 1 ) * offsize; - - if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) || - FT_STREAM_SEEK( idx->start + 3 ) || - FT_FRAME_ENTER( data_size ) ) - goto Exit; - - poff = idx->offsets; - p = (FT_Byte*)stream->cursor; - p_end = p + data_size; - - switch ( offsize ) - { - case 1: - for ( ; p < p_end; p++, poff++ ) - poff[0] = p[0]; - break; - - case 2: - for ( ; p < p_end; p += 2, poff++ ) - poff[0] = FT_PEEK_USHORT( p ); - break; - - case 3: - for ( ; p < p_end; p += 3, poff++ ) - poff[0] = FT_PEEK_UOFF3( p ); - break; - - default: - for ( ; p < p_end; p += 4, poff++ ) - poff[0] = FT_PEEK_ULONG( p ); - } - - FT_FRAME_EXIT(); - } - - Exit: - if ( error ) - FT_FREE( idx->offsets ); - - return error; - } - - - /* Allocate a table containing pointers to an index's elements. */ - /* The `pool' argument makes this function convert the index */ - /* entries to C-style strings (this is, NULL-terminated). */ - static FT_Error - cff_index_get_pointers( CFF_Index idx, - FT_Byte*** table, - FT_Byte** pool ) - { - FT_Error error = FT_Err_Ok; - FT_Memory memory = idx->stream->memory; - - FT_Byte** t = NULL; - FT_Byte* new_bytes = NULL; - - - *table = NULL; - - if ( idx->offsets == NULL ) - { - error = cff_index_load_offsets( idx ); - if ( error ) - goto Exit; - } - - if ( idx->count > 0 && - !FT_NEW_ARRAY( t, idx->count + 1 ) && - ( !pool || !FT_ALLOC( new_bytes, - idx->data_size + idx->count ) ) ) - { - FT_ULong n, cur_offset; - FT_ULong extra = 0; - FT_Byte* org_bytes = idx->bytes; - - - /* at this point, `idx->offsets' can't be NULL */ - cur_offset = idx->offsets[0] - 1; - - /* sanity check */ - if ( cur_offset != 0 ) - { - FT_TRACE0(( "cff_index_get_pointers:" - " invalid first offset value %d set to zero\n", - cur_offset )); - cur_offset = 0; - } - - if ( !pool ) - t[0] = org_bytes + cur_offset; - else - t[0] = new_bytes + cur_offset; - - for ( n = 1; n <= idx->count; n++ ) - { - FT_ULong next_offset = idx->offsets[n] - 1; - - - /* two sanity checks for invalid offset tables */ - if ( next_offset < cur_offset ) - next_offset = cur_offset; - else if ( next_offset > idx->data_size ) - next_offset = idx->data_size; - - if ( !pool ) - t[n] = org_bytes + next_offset; - else - { - t[n] = new_bytes + next_offset + extra; - - if ( next_offset != cur_offset ) - { - FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] ); - t[n][0] = '\0'; - t[n] += 1; - extra++; - } - } - - cur_offset = next_offset; - } - *table = t; - - if ( pool ) - *pool = new_bytes; - } - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - cff_index_access_element( CFF_Index idx, - FT_UInt element, - FT_Byte** pbytes, - FT_ULong* pbyte_len ) - { - FT_Error error = FT_Err_Ok; - - - if ( idx && idx->count > element ) - { - /* compute start and end offsets */ - FT_Stream stream = idx->stream; - FT_ULong off1, off2 = 0; - - - /* load offsets from file or the offset table */ - if ( !idx->offsets ) - { - FT_ULong pos = element * idx->off_size; - - - if ( FT_STREAM_SEEK( idx->start + 3 + pos ) ) - goto Exit; - - off1 = cff_index_read_offset( idx, &error ); - if ( error ) - goto Exit; - - if ( off1 != 0 ) - { - do - { - element++; - off2 = cff_index_read_offset( idx, &error ); - } - while ( off2 == 0 && element < idx->count ); - } - } - else /* use offsets table */ - { - off1 = idx->offsets[element]; - if ( off1 ) - { - do - { - element++; - off2 = idx->offsets[element]; - - } while ( off2 == 0 && element < idx->count ); - } - } - - /* XXX: should check off2 does not exceed the end of this entry; */ - /* at present, only truncate off2 at the end of this stream */ - if ( off2 > stream->size + 1 || - idx->data_offset > stream->size - off2 + 1 ) - { - FT_ERROR(( "cff_index_access_element:" - " offset to next entry (%d)" - " exceeds the end of stream (%d)\n", - off2, stream->size - idx->data_offset + 1 )); - off2 = stream->size - idx->data_offset + 1; - } - - /* access element */ - if ( off1 && off2 > off1 ) - { - *pbyte_len = off2 - off1; - - if ( idx->bytes ) - { - /* this index was completely loaded in memory, that's easy */ - *pbytes = idx->bytes + off1 - 1; - } - else - { - /* this index is still on disk/file, access it through a frame */ - if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) || - FT_FRAME_EXTRACT( off2 - off1, *pbytes ) ) - goto Exit; - } - } - else - { - /* empty index element */ - *pbytes = 0; - *pbyte_len = 0; - } - } - else - error = FT_THROW( Invalid_Argument ); - - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - cff_index_forget_element( CFF_Index idx, - FT_Byte** pbytes ) - { - if ( idx->bytes == 0 ) - { - FT_Stream stream = idx->stream; - - - FT_FRAME_RELEASE( *pbytes ); - } - } - - - /* get an entry from Name INDEX */ - FT_LOCAL_DEF( FT_String* ) - cff_index_get_name( CFF_Font font, - FT_UInt element ) - { - CFF_Index idx = &font->name_index; - FT_Memory memory = idx->stream->memory; - FT_Byte* bytes; - FT_ULong byte_len; - FT_Error error; - FT_String* name = 0; - - - error = cff_index_access_element( idx, element, &bytes, &byte_len ); - if ( error ) - goto Exit; - - if ( !FT_ALLOC( name, byte_len + 1 ) ) - { - FT_MEM_COPY( name, bytes, byte_len ); - name[byte_len] = 0; - } - cff_index_forget_element( idx, &bytes ); - - Exit: - return name; - } - - - /* get an entry from String INDEX */ - FT_LOCAL_DEF( FT_String* ) - cff_index_get_string( CFF_Font font, - FT_UInt element ) - { - return ( element < font->num_strings ) - ? (FT_String*)font->strings[element] - : NULL; - } - - - FT_LOCAL_DEF( FT_String* ) - cff_index_get_sid_string( CFF_Font font, - FT_UInt sid ) - { - /* value 0xFFFFU indicates a missing dictionary entry */ - if ( sid == 0xFFFFU ) - return NULL; - - /* if it is not a standard string, return it */ - if ( sid > 390 ) - return cff_index_get_string( font, sid - 391 ); - - /* CID-keyed CFF fonts don't have glyph names */ - if ( !font->psnames ) - return NULL; - - /* this is a standard string */ - return (FT_String *)font->psnames->adobe_std_strings( sid ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** FD Select table support ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - - - static void - CFF_Done_FD_Select( CFF_FDSelect fdselect, - FT_Stream stream ) - { - if ( fdselect->data ) - FT_FRAME_RELEASE( fdselect->data ); - - fdselect->data_size = 0; - fdselect->format = 0; - fdselect->range_count = 0; - } - - - static FT_Error - CFF_Load_FD_Select( CFF_FDSelect fdselect, - FT_UInt num_glyphs, - FT_Stream stream, - FT_ULong offset ) - { - FT_Error error; - FT_Byte format; - FT_UInt num_ranges; - - - /* read format */ - if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) ) - goto Exit; - - fdselect->format = format; - fdselect->cache_count = 0; /* clear cache */ - - switch ( format ) - { - case 0: /* format 0, that's simple */ - fdselect->data_size = num_glyphs; - goto Load_Data; - - case 3: /* format 3, a tad more complex */ - if ( FT_READ_USHORT( num_ranges ) ) - goto Exit; - - if ( !num_ranges ) - { - FT_TRACE0(( "CFF_Load_FD_Select: empty FDSelect array\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - fdselect->data_size = num_ranges * 3 + 2; - - Load_Data: - if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) ) - goto Exit; - break; - - default: /* hmm... that's wrong */ - error = FT_THROW( Invalid_File_Format ); - } - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Byte ) - cff_fd_select_get( CFF_FDSelect fdselect, - FT_UInt glyph_index ) - { - FT_Byte fd = 0; - - - switch ( fdselect->format ) - { - case 0: - fd = fdselect->data[glyph_index]; - break; - - case 3: - /* first, compare to the cache */ - if ( (FT_UInt)( glyph_index - fdselect->cache_first ) < - fdselect->cache_count ) - { - fd = fdselect->cache_fd; - break; - } - - /* then, look up the ranges array */ - { - FT_Byte* p = fdselect->data; - FT_Byte* p_limit = p + fdselect->data_size; - FT_Byte fd2; - FT_UInt first, limit; - - - first = FT_NEXT_USHORT( p ); - do - { - if ( glyph_index < first ) - break; - - fd2 = *p++; - limit = FT_NEXT_USHORT( p ); - - if ( glyph_index < limit ) - { - fd = fd2; - - /* update cache */ - fdselect->cache_first = first; - fdselect->cache_count = limit - first; - fdselect->cache_fd = fd2; - break; - } - first = limit; - - } while ( p < p_limit ); - } - break; - - default: - ; - } - - return fd; - } - - - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** CFF font support ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - - static FT_Error - cff_charset_compute_cids( CFF_Charset charset, - FT_UInt num_glyphs, - FT_Memory memory ) - { - FT_Error error = FT_Err_Ok; - FT_UInt i; - FT_Long j; - FT_UShort max_cid = 0; - - - if ( charset->max_cid > 0 ) - goto Exit; - - for ( i = 0; i < num_glyphs; i++ ) - { - if ( charset->sids[i] > max_cid ) - max_cid = charset->sids[i]; - } - - if ( FT_NEW_ARRAY( charset->cids, (FT_ULong)max_cid + 1 ) ) - goto Exit; - - /* When multiple GIDs map to the same CID, we choose the lowest */ - /* GID. This is not described in any spec, but it matches the */ - /* behaviour of recent Acroread versions. */ - for ( j = (FT_Long)num_glyphs - 1; j >= 0 ; j-- ) - charset->cids[charset->sids[j]] = (FT_UShort)j; - - charset->max_cid = max_cid; - charset->num_glyphs = num_glyphs; - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_UInt ) - cff_charset_cid_to_gindex( CFF_Charset charset, - FT_UInt cid ) - { - FT_UInt result = 0; - - - if ( cid <= charset->max_cid ) - result = charset->cids[cid]; - - return result; - } - - - static void - cff_charset_free_cids( CFF_Charset charset, - FT_Memory memory ) - { - FT_FREE( charset->cids ); - charset->max_cid = 0; - } - - - static void - cff_charset_done( CFF_Charset charset, - FT_Stream stream ) - { - FT_Memory memory = stream->memory; - - - cff_charset_free_cids( charset, memory ); - - FT_FREE( charset->sids ); - charset->format = 0; - charset->offset = 0; - } - - - static FT_Error - cff_charset_load( CFF_Charset charset, - FT_UInt num_glyphs, - FT_Stream stream, - FT_ULong base_offset, - FT_ULong offset, - FT_Bool invert ) - { - FT_Memory memory = stream->memory; - FT_Error error = FT_Err_Ok; - FT_UShort glyph_sid; - - - /* If the the offset is greater than 2, we have to parse the */ - /* charset table. */ - if ( offset > 2 ) - { - FT_UInt j; - - - charset->offset = base_offset + offset; - - /* Get the format of the table. */ - if ( FT_STREAM_SEEK( charset->offset ) || - FT_READ_BYTE( charset->format ) ) - goto Exit; - - /* Allocate memory for sids. */ - if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) - goto Exit; - - /* assign the .notdef glyph */ - charset->sids[0] = 0; - - switch ( charset->format ) - { - case 0: - if ( num_glyphs > 0 ) - { - if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) ) - goto Exit; - - for ( j = 1; j < num_glyphs; j++ ) - charset->sids[j] = FT_GET_USHORT(); - - FT_FRAME_EXIT(); - } - break; - - case 1: - case 2: - { - FT_UInt nleft; - FT_UInt i; - - - j = 1; - - while ( j < num_glyphs ) - { - /* Read the first glyph sid of the range. */ - if ( FT_READ_USHORT( glyph_sid ) ) - goto Exit; - - /* Read the number of glyphs in the range. */ - if ( charset->format == 2 ) - { - if ( FT_READ_USHORT( nleft ) ) - goto Exit; - } - else - { - if ( FT_READ_BYTE( nleft ) ) - goto Exit; - } - - /* try to rescue some of the SIDs if `nleft' is too large */ - if ( glyph_sid > 0xFFFFL - nleft ) - { - FT_ERROR(( "cff_charset_load: invalid SID range trimmed" - " nleft=%d -> %d\n", nleft, 0xFFFFL - glyph_sid )); - nleft = ( FT_UInt )( 0xFFFFL - glyph_sid ); - } - - /* Fill in the range of sids -- `nleft + 1' glyphs. */ - for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ ) - charset->sids[j] = glyph_sid; - } - } - break; - - default: - FT_ERROR(( "cff_charset_load: invalid table format\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - } - else - { - /* Parse default tables corresponding to offset == 0, 1, or 2. */ - /* CFF specification intimates the following: */ - /* */ - /* In order to use a predefined charset, the following must be */ - /* true: The charset constructed for the glyphs in the font's */ - /* charstrings dictionary must match the predefined charset in */ - /* the first num_glyphs. */ - - charset->offset = offset; /* record charset type */ - - switch ( (FT_UInt)offset ) - { - case 0: - if ( num_glyphs > 229 ) - { - FT_ERROR(( "cff_charset_load: implicit charset larger than\n" - "predefined charset (Adobe ISO-Latin)\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* Allocate memory for sids. */ - if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) - goto Exit; - - /* Copy the predefined charset into the allocated memory. */ - FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs ); - - break; - - case 1: - if ( num_glyphs > 166 ) - { - FT_ERROR(( "cff_charset_load: implicit charset larger than\n" - "predefined charset (Adobe Expert)\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* Allocate memory for sids. */ - if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) - goto Exit; - - /* Copy the predefined charset into the allocated memory. */ - FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs ); - - break; - - case 2: - if ( num_glyphs > 87 ) - { - FT_ERROR(( "cff_charset_load: implicit charset larger than\n" - "predefined charset (Adobe Expert Subset)\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* Allocate memory for sids. */ - if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) - goto Exit; - - /* Copy the predefined charset into the allocated memory. */ - FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs ); - - break; - - default: - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - } - - /* we have to invert the `sids' array for subsetted CID-keyed fonts */ - if ( invert ) - error = cff_charset_compute_cids( charset, num_glyphs, memory ); - - Exit: - /* Clean up if there was an error. */ - if ( error ) - { - FT_FREE( charset->sids ); - FT_FREE( charset->cids ); - charset->format = 0; - charset->offset = 0; - charset->sids = 0; - } - - return error; - } - - - static void - cff_encoding_done( CFF_Encoding encoding ) - { - encoding->format = 0; - encoding->offset = 0; - encoding->count = 0; - } - - - static FT_Error - cff_encoding_load( CFF_Encoding encoding, - CFF_Charset charset, - FT_UInt num_glyphs, - FT_Stream stream, - FT_ULong base_offset, - FT_ULong offset ) - { - FT_Error error = FT_Err_Ok; - FT_UInt count; - FT_UInt j; - FT_UShort glyph_sid; - FT_UInt glyph_code; - - - /* Check for charset->sids. If we do not have this, we fail. */ - if ( !charset->sids ) - { - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* Zero out the code to gid/sid mappings. */ - for ( j = 0; j < 256; j++ ) - { - encoding->sids [j] = 0; - encoding->codes[j] = 0; - } - - /* Note: The encoding table in a CFF font is indexed by glyph index; */ - /* the first encoded glyph index is 1. Hence, we read the character */ - /* code (`glyph_code') at index j and make the assignment: */ - /* */ - /* encoding->codes[glyph_code] = j + 1 */ - /* */ - /* We also make the assignment: */ - /* */ - /* encoding->sids[glyph_code] = charset->sids[j + 1] */ - /* */ - /* This gives us both a code to GID and a code to SID mapping. */ - - if ( offset > 1 ) - { - encoding->offset = base_offset + offset; - - /* we need to parse the table to determine its size */ - if ( FT_STREAM_SEEK( encoding->offset ) || - FT_READ_BYTE( encoding->format ) || - FT_READ_BYTE( count ) ) - goto Exit; - - switch ( encoding->format & 0x7F ) - { - case 0: - { - FT_Byte* p; - - - /* By convention, GID 0 is always ".notdef" and is never */ - /* coded in the font. Hence, the number of codes found */ - /* in the table is `count+1'. */ - /* */ - encoding->count = count + 1; - - if ( FT_FRAME_ENTER( count ) ) - goto Exit; - - p = (FT_Byte*)stream->cursor; - - for ( j = 1; j <= count; j++ ) - { - glyph_code = *p++; - - /* Make sure j is not too big. */ - if ( j < num_glyphs ) - { - /* Assign code to GID mapping. */ - encoding->codes[glyph_code] = (FT_UShort)j; - - /* Assign code to SID mapping. */ - encoding->sids[glyph_code] = charset->sids[j]; - } - } - - FT_FRAME_EXIT(); - } - break; - - case 1: - { - FT_UInt nleft; - FT_UInt i = 1; - FT_UInt k; - - - encoding->count = 0; - - /* Parse the Format1 ranges. */ - for ( j = 0; j < count; j++, i += nleft ) - { - /* Read the first glyph code of the range. */ - if ( FT_READ_BYTE( glyph_code ) ) - goto Exit; - - /* Read the number of codes in the range. */ - if ( FT_READ_BYTE( nleft ) ) - goto Exit; - - /* Increment nleft, so we read `nleft + 1' codes/sids. */ - nleft++; - - /* compute max number of character codes */ - if ( (FT_UInt)nleft > encoding->count ) - encoding->count = nleft; - - /* Fill in the range of codes/sids. */ - for ( k = i; k < nleft + i; k++, glyph_code++ ) - { - /* Make sure k is not too big. */ - if ( k < num_glyphs && glyph_code < 256 ) - { - /* Assign code to GID mapping. */ - encoding->codes[glyph_code] = (FT_UShort)k; - - /* Assign code to SID mapping. */ - encoding->sids[glyph_code] = charset->sids[k]; - } - } - } - - /* simple check; one never knows what can be found in a font */ - if ( encoding->count > 256 ) - encoding->count = 256; - } - break; - - default: - FT_ERROR(( "cff_encoding_load: invalid table format\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* Parse supplemental encodings, if any. */ - if ( encoding->format & 0x80 ) - { - FT_UInt gindex; - - - /* count supplements */ - if ( FT_READ_BYTE( count ) ) - goto Exit; - - for ( j = 0; j < count; j++ ) - { - /* Read supplemental glyph code. */ - if ( FT_READ_BYTE( glyph_code ) ) - goto Exit; - - /* Read the SID associated with this glyph code. */ - if ( FT_READ_USHORT( glyph_sid ) ) - goto Exit; - - /* Assign code to SID mapping. */ - encoding->sids[glyph_code] = glyph_sid; - - /* First, look up GID which has been assigned to */ - /* SID glyph_sid. */ - for ( gindex = 0; gindex < num_glyphs; gindex++ ) - { - if ( charset->sids[gindex] == glyph_sid ) - { - encoding->codes[glyph_code] = (FT_UShort)gindex; - break; - } - } - } - } - } - else - { - /* We take into account the fact a CFF font can use a predefined */ - /* encoding without containing all of the glyphs encoded by this */ - /* encoding (see the note at the end of section 12 in the CFF */ - /* specification). */ - - switch ( (FT_UInt)offset ) - { - case 0: - /* First, copy the code to SID mapping. */ - FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 ); - goto Populate; - - case 1: - /* First, copy the code to SID mapping. */ - FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 ); - - Populate: - /* Construct code to GID mapping from code to SID mapping */ - /* and charset. */ - - encoding->count = 0; - - error = cff_charset_compute_cids( charset, num_glyphs, - stream->memory ); - if ( error ) - goto Exit; - - for ( j = 0; j < 256; j++ ) - { - FT_UInt sid = encoding->sids[j]; - FT_UInt gid = 0; - - - if ( sid ) - gid = cff_charset_cid_to_gindex( charset, sid ); - - if ( gid != 0 ) - { - encoding->codes[j] = (FT_UShort)gid; - encoding->count = j + 1; - } - else - { - encoding->codes[j] = 0; - encoding->sids [j] = 0; - } - } - break; - - default: - FT_ERROR(( "cff_encoding_load: invalid table format\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - } - - Exit: - - /* Clean up if there was an error. */ - return error; - } - - - static FT_Error - cff_subfont_load( CFF_SubFont font, - CFF_Index idx, - FT_UInt font_index, - FT_Stream stream, - FT_ULong base_offset, - FT_Library library ) - { - FT_Error error; - CFF_ParserRec parser; - FT_Byte* dict = NULL; - FT_ULong dict_len; - CFF_FontRecDict top = &font->font_dict; - CFF_Private priv = &font->private_dict; - - - cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict, library ); - - /* set defaults */ - FT_MEM_ZERO( top, sizeof ( *top ) ); - - top->underline_position = -( 100L << 16 ); - top->underline_thickness = 50L << 16; - top->charstring_type = 2; - top->font_matrix.xx = 0x10000L; - top->font_matrix.yy = 0x10000L; - top->cid_count = 8720; - - /* we use the implementation specific SID value 0xFFFF to indicate */ - /* missing entries */ - top->version = 0xFFFFU; - top->notice = 0xFFFFU; - top->copyright = 0xFFFFU; - top->full_name = 0xFFFFU; - top->family_name = 0xFFFFU; - top->weight = 0xFFFFU; - top->embedded_postscript = 0xFFFFU; - - top->cid_registry = 0xFFFFU; - top->cid_ordering = 0xFFFFU; - top->cid_font_name = 0xFFFFU; - - error = cff_index_access_element( idx, font_index, &dict, &dict_len ); - if ( !error ) - { - FT_TRACE4(( " top dictionary:\n" )); - error = cff_parser_run( &parser, dict, dict + dict_len ); - } - - cff_index_forget_element( idx, &dict ); - - if ( error ) - goto Exit; - - /* if it is a CID font, we stop there */ - if ( top->cid_registry != 0xFFFFU ) - goto Exit; - - /* parse the private dictionary, if any */ - if ( top->private_offset && top->private_size ) - { - /* set defaults */ - FT_MEM_ZERO( priv, sizeof ( *priv ) ); - - priv->blue_shift = 7; - priv->blue_fuzz = 1; - priv->lenIV = -1; - priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); - priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); - - cff_parser_init( &parser, CFF_CODE_PRIVATE, priv, library ); - - if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) || - FT_FRAME_ENTER( font->font_dict.private_size ) ) - goto Exit; - - FT_TRACE4(( " private dictionary:\n" )); - error = cff_parser_run( &parser, - (FT_Byte*)stream->cursor, - (FT_Byte*)stream->limit ); - FT_FRAME_EXIT(); - if ( error ) - goto Exit; - - /* ensure that `num_blue_values' is even */ - priv->num_blue_values &= ~1; - } - - /* read the local subrs, if any */ - if ( priv->local_subrs_offset ) - { - if ( FT_STREAM_SEEK( base_offset + top->private_offset + - priv->local_subrs_offset ) ) - goto Exit; - - error = cff_index_init( &font->local_subrs_index, stream, 1 ); - if ( error ) - goto Exit; - - error = cff_index_get_pointers( &font->local_subrs_index, - &font->local_subrs, NULL ); - if ( error ) - goto Exit; - } - - Exit: - return error; - } - - - static void - cff_subfont_done( FT_Memory memory, - CFF_SubFont subfont ) - { - if ( subfont ) - { - cff_index_done( &subfont->local_subrs_index ); - FT_FREE( subfont->local_subrs ); - } - } - - - FT_LOCAL_DEF( FT_Error ) - cff_font_load( FT_Library library, - FT_Stream stream, - FT_Int face_index, - CFF_Font font, - FT_Bool pure_cff ) - { - static const FT_Frame_Field cff_header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE CFF_FontRec - - FT_FRAME_START( 4 ), - FT_FRAME_BYTE( version_major ), - FT_FRAME_BYTE( version_minor ), - FT_FRAME_BYTE( header_size ), - FT_FRAME_BYTE( absolute_offsize ), - FT_FRAME_END - }; - - FT_Error error; - FT_Memory memory = stream->memory; - FT_ULong base_offset; - CFF_FontRecDict dict; - CFF_IndexRec string_index; - FT_UInt subfont_index; - - - FT_ZERO( font ); - FT_ZERO( &string_index ); - - font->stream = stream; - font->memory = memory; - dict = &font->top_font.font_dict; - base_offset = FT_STREAM_POS(); - - /* read CFF font header */ - if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) ) - goto Exit; - - /* check format */ - if ( font->version_major != 1 || - font->header_size < 4 || - font->absolute_offsize > 4 ) - { - FT_TRACE2(( " not a CFF font header\n" )); - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - /* skip the rest of the header */ - if ( FT_STREAM_SKIP( font->header_size - 4 ) ) - goto Exit; - - /* read the name, top dict, string and global subrs index */ - if ( FT_SET_ERROR( cff_index_init( &font->name_index, - stream, 0 ) ) || - FT_SET_ERROR( cff_index_init( &font->font_dict_index, - stream, 0 ) ) || - FT_SET_ERROR( cff_index_init( &string_index, - stream, 1 ) ) || - FT_SET_ERROR( cff_index_init( &font->global_subrs_index, - stream, 1 ) ) || - FT_SET_ERROR( cff_index_get_pointers( &string_index, - &font->strings, - &font->string_pool ) ) ) - goto Exit; - - font->num_strings = string_index.count; - - if ( pure_cff ) - { - /* well, we don't really forget the `disabled' fonts... */ - subfont_index = (FT_UInt)( face_index & 0xFFFF ); - - if ( face_index > 0 && subfont_index >= font->name_index.count ) - { - FT_ERROR(( "cff_font_load:" - " invalid subfont index for pure CFF font (%d)\n", - subfont_index )); - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - font->num_faces = font->name_index.count; - } - else - { - subfont_index = 0; - - if ( font->name_index.count > 1 ) - { - FT_ERROR(( "cff_font_load:" - " invalid CFF font with multiple subfonts\n" - " " - " in SFNT wrapper\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - } - - /* in case of a font format check, simply exit now */ - if ( face_index < 0 ) - goto Exit; - - /* now, parse the top-level font dictionary */ - FT_TRACE4(( "parsing top-level\n" )); - error = cff_subfont_load( &font->top_font, - &font->font_dict_index, - subfont_index, - stream, - base_offset, - library ); - if ( error ) - goto Exit; - - if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) - goto Exit; - - error = cff_index_init( &font->charstrings_index, stream, 0 ); - if ( error ) - goto Exit; - - /* now, check for a CID font */ - if ( dict->cid_registry != 0xFFFFU ) - { - CFF_IndexRec fd_index; - CFF_SubFont sub = NULL; - FT_UInt idx; - - - /* this is a CID-keyed font, we must now allocate a table of */ - /* sub-fonts, then load each of them separately */ - if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) ) - goto Exit; - - error = cff_index_init( &fd_index, stream, 0 ); - if ( error ) - goto Exit; - - if ( fd_index.count > CFF_MAX_CID_FONTS ) - { - FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" )); - goto Fail_CID; - } - - /* allocate & read each font dict independently */ - font->num_subfonts = fd_index.count; - if ( FT_NEW_ARRAY( sub, fd_index.count ) ) - goto Fail_CID; - - /* set up pointer table */ - for ( idx = 0; idx < fd_index.count; idx++ ) - font->subfonts[idx] = sub + idx; - - /* now load each subfont independently */ - for ( idx = 0; idx < fd_index.count; idx++ ) - { - sub = font->subfonts[idx]; - FT_TRACE4(( "parsing subfont %u\n", idx )); - error = cff_subfont_load( sub, &fd_index, idx, - stream, base_offset, library ); - if ( error ) - goto Fail_CID; - } - - /* now load the FD Select array */ - error = CFF_Load_FD_Select( &font->fd_select, - font->charstrings_index.count, - stream, - base_offset + dict->cid_fd_select_offset ); - - Fail_CID: - cff_index_done( &fd_index ); - - if ( error ) - goto Exit; - } - else - font->num_subfonts = 0; - - /* read the charstrings index now */ - if ( dict->charstrings_offset == 0 ) - { - FT_ERROR(( "cff_font_load: no charstrings offset\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - font->num_glyphs = font->charstrings_index.count; - - error = cff_index_get_pointers( &font->global_subrs_index, - &font->global_subrs, NULL ); - - if ( error ) - goto Exit; - - /* read the Charset and Encoding tables if available */ - if ( font->num_glyphs > 0 ) - { - FT_Bool invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff ); - - - error = cff_charset_load( &font->charset, font->num_glyphs, stream, - base_offset, dict->charset_offset, invert ); - if ( error ) - goto Exit; - - /* CID-keyed CFFs don't have an encoding */ - if ( dict->cid_registry == 0xFFFFU ) - { - error = cff_encoding_load( &font->encoding, - &font->charset, - font->num_glyphs, - stream, - base_offset, - dict->encoding_offset ); - if ( error ) - goto Exit; - } - } - - /* get the font name (/CIDFontName for CID-keyed fonts, */ - /* /FontName otherwise) */ - font->font_name = cff_index_get_name( font, subfont_index ); - - Exit: - cff_index_done( &string_index ); - - return error; - } - - - FT_LOCAL_DEF( void ) - cff_font_done( CFF_Font font ) - { - FT_Memory memory = font->memory; - FT_UInt idx; - - - cff_index_done( &font->global_subrs_index ); - cff_index_done( &font->font_dict_index ); - cff_index_done( &font->name_index ); - cff_index_done( &font->charstrings_index ); - - /* release font dictionaries, but only if working with */ - /* a CID keyed CFF font */ - if ( font->num_subfonts > 0 ) - { - for ( idx = 0; idx < font->num_subfonts; idx++ ) - cff_subfont_done( memory, font->subfonts[idx] ); - - /* the subfonts array has been allocated as a single block */ - FT_FREE( font->subfonts[0] ); - } - - cff_encoding_done( &font->encoding ); - cff_charset_done( &font->charset, font->stream ); - - cff_subfont_done( memory, &font->top_font ); - - CFF_Done_FD_Select( &font->fd_select, font->stream ); - - FT_FREE( font->font_info ); - - FT_FREE( font->font_name ); - FT_FREE( font->global_subrs ); - FT_FREE( font->strings ); - FT_FREE( font->string_pool ); - - if ( font->cf2_instance.finalizer ) - { - font->cf2_instance.finalizer( font->cf2_instance.data ); - FT_FREE( font->cf2_instance.data ); - } - } - - -/* END */ diff --git a/3party/freetype/src/cff/cffload.h b/3party/freetype/src/cff/cffload.h deleted file mode 100644 index 459e7b0446..0000000000 --- a/3party/freetype/src/cff/cffload.h +++ /dev/null @@ -1,83 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffload.h */ -/* */ -/* OpenType & CFF data/program tables loader (specification). */ -/* */ -/* Copyright 1996-2015 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 __CFFLOAD_H__ -#define __CFFLOAD_H__ - - -#include <ft2build.h> -#include "cfftypes.h" - - -FT_BEGIN_HEADER - - FT_LOCAL( FT_UShort ) - cff_get_standard_encoding( FT_UInt charcode ); - - - FT_LOCAL( FT_String* ) - cff_index_get_string( CFF_Font font, - FT_UInt element ); - - FT_LOCAL( FT_String* ) - cff_index_get_sid_string( CFF_Font font, - FT_UInt sid ); - - - FT_LOCAL( FT_Error ) - cff_index_access_element( CFF_Index idx, - FT_UInt element, - FT_Byte** pbytes, - FT_ULong* pbyte_len ); - - FT_LOCAL( void ) - cff_index_forget_element( CFF_Index idx, - FT_Byte** pbytes ); - - FT_LOCAL( FT_String* ) - cff_index_get_name( CFF_Font font, - FT_UInt element ); - - - FT_LOCAL( FT_UInt ) - cff_charset_cid_to_gindex( CFF_Charset charset, - FT_UInt cid ); - - - FT_LOCAL( FT_Error ) - cff_font_load( FT_Library library, - FT_Stream stream, - FT_Int face_index, - CFF_Font font, - FT_Bool pure_cff ); - - FT_LOCAL( void ) - cff_font_done( CFF_Font font ); - - - FT_LOCAL( FT_Byte ) - cff_fd_select_get( CFF_FDSelect fdselect, - FT_UInt glyph_index ); - - -FT_END_HEADER - -#endif /* __CFFLOAD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cffobjs.c b/3party/freetype/src/cff/cffobjs.c deleted file mode 100644 index 0e0d5b034b..0000000000 --- a/3party/freetype/src/cff/cffobjs.c +++ /dev/null @@ -1,1077 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffobjs.c */ -/* */ -/* OpenType objects manager (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> - -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_STREAM_H -#include FT_ERRORS_H -#include FT_TRUETYPE_IDS_H -#include FT_TRUETYPE_TAGS_H -#include FT_INTERNAL_SFNT_H -#include FT_CFF_DRIVER_H - -#include "cffobjs.h" -#include "cffload.h" -#include "cffcmap.h" -#include "cffpic.h" - -#include "cfferrs.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cffobjs - - - /*************************************************************************/ - /* */ - /* SIZE FUNCTIONS */ - /* */ - /* Note that we store the global hints in the size's `internal' root */ - /* field. */ - /* */ - /*************************************************************************/ - - - static PSH_Globals_Funcs - cff_size_get_globals_funcs( CFF_Size size ) - { - CFF_Face face = (CFF_Face)size->root.face; - CFF_Font font = (CFF_Font)face->extra.data; - PSHinter_Service pshinter = font->pshinter; - FT_Module module; - - - module = FT_Get_Module( size->root.face->driver->root.library, - "pshinter" ); - return ( module && pshinter && pshinter->get_globals_funcs ) - ? pshinter->get_globals_funcs( module ) - : 0; - } - - - FT_LOCAL_DEF( void ) - cff_size_done( FT_Size cffsize ) /* CFF_Size */ - { - CFF_Size size = (CFF_Size)cffsize; - CFF_Face face = (CFF_Face)size->root.face; - CFF_Font font = (CFF_Font)face->extra.data; - CFF_Internal internal = (CFF_Internal)cffsize->internal; - - - if ( internal ) - { - PSH_Globals_Funcs funcs; - - - funcs = cff_size_get_globals_funcs( size ); - if ( funcs ) - { - FT_UInt i; - - - funcs->destroy( internal->topfont ); - - for ( i = font->num_subfonts; i > 0; i-- ) - funcs->destroy( internal->subfonts[i - 1] ); - } - - /* `internal' is freed by destroy_size (in ftobjs.c) */ - } - } - - - /* CFF and Type 1 private dictionaries have slightly different */ - /* structures; we need to synthesize a Type 1 dictionary on the fly */ - - static void - cff_make_private_dict( CFF_SubFont subfont, - PS_Private priv ) - { - CFF_Private cpriv = &subfont->private_dict; - FT_UInt n, count; - - - FT_MEM_ZERO( priv, sizeof ( *priv ) ); - - count = priv->num_blue_values = cpriv->num_blue_values; - for ( n = 0; n < count; n++ ) - priv->blue_values[n] = (FT_Short)cpriv->blue_values[n]; - - count = priv->num_other_blues = cpriv->num_other_blues; - for ( n = 0; n < count; n++ ) - priv->other_blues[n] = (FT_Short)cpriv->other_blues[n]; - - count = priv->num_family_blues = cpriv->num_family_blues; - for ( n = 0; n < count; n++ ) - priv->family_blues[n] = (FT_Short)cpriv->family_blues[n]; - - count = priv->num_family_other_blues = cpriv->num_family_other_blues; - for ( n = 0; n < count; n++ ) - priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n]; - - priv->blue_scale = cpriv->blue_scale; - priv->blue_shift = (FT_Int)cpriv->blue_shift; - priv->blue_fuzz = (FT_Int)cpriv->blue_fuzz; - - priv->standard_width[0] = (FT_UShort)cpriv->standard_width; - priv->standard_height[0] = (FT_UShort)cpriv->standard_height; - - count = priv->num_snap_widths = cpriv->num_snap_widths; - for ( n = 0; n < count; n++ ) - priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n]; - - count = priv->num_snap_heights = cpriv->num_snap_heights; - for ( n = 0; n < count; n++ ) - priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n]; - - priv->force_bold = cpriv->force_bold; - priv->language_group = cpriv->language_group; - priv->lenIV = cpriv->lenIV; - } - - - FT_LOCAL_DEF( FT_Error ) - cff_size_init( FT_Size cffsize ) /* CFF_Size */ - { - CFF_Size size = (CFF_Size)cffsize; - FT_Error error = FT_Err_Ok; - PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size ); - - - if ( funcs ) - { - CFF_Face face = (CFF_Face)cffsize->face; - CFF_Font font = (CFF_Font)face->extra.data; - CFF_Internal internal = NULL; - - PS_PrivateRec priv; - FT_Memory memory = cffsize->face->memory; - - FT_UInt i; - - - if ( FT_NEW( internal ) ) - goto Exit; - - cff_make_private_dict( &font->top_font, &priv ); - error = funcs->create( cffsize->face->memory, &priv, - &internal->topfont ); - if ( error ) - goto Exit; - - for ( i = font->num_subfonts; i > 0; i-- ) - { - CFF_SubFont sub = font->subfonts[i - 1]; - - - cff_make_private_dict( sub, &priv ); - error = funcs->create( cffsize->face->memory, &priv, - &internal->subfonts[i - 1] ); - if ( error ) - goto Exit; - } - - cffsize->internal = (FT_Size_Internal)(void*)internal; - } - - size->strike_index = 0xFFFFFFFFUL; - - Exit: - return error; - } - - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - FT_LOCAL_DEF( FT_Error ) - cff_size_select( FT_Size size, - FT_ULong strike_index ) - { - CFF_Size cffsize = (CFF_Size)size; - PSH_Globals_Funcs funcs; - - - cffsize->strike_index = strike_index; - - FT_Select_Metrics( size->face, strike_index ); - - funcs = cff_size_get_globals_funcs( cffsize ); - - if ( funcs ) - { - CFF_Face face = (CFF_Face)size->face; - CFF_Font font = (CFF_Font)face->extra.data; - CFF_Internal internal = (CFF_Internal)size->internal; - - FT_Long top_upm = (FT_Long)font->top_font.font_dict.units_per_em; - FT_UInt i; - - - funcs->set_scale( internal->topfont, - size->metrics.x_scale, size->metrics.y_scale, - 0, 0 ); - - for ( i = font->num_subfonts; i > 0; i-- ) - { - CFF_SubFont sub = font->subfonts[i - 1]; - FT_Long sub_upm = (FT_Long)sub->font_dict.units_per_em; - FT_Pos x_scale, y_scale; - - - if ( top_upm != sub_upm ) - { - x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); - y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); - } - else - { - x_scale = size->metrics.x_scale; - y_scale = size->metrics.y_scale; - } - - funcs->set_scale( internal->subfonts[i - 1], - x_scale, y_scale, 0, 0 ); - } - } - - return FT_Err_Ok; - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - - FT_LOCAL_DEF( FT_Error ) - cff_size_request( FT_Size size, - FT_Size_Request req ) - { - CFF_Size cffsize = (CFF_Size)size; - PSH_Globals_Funcs funcs; - - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - if ( FT_HAS_FIXED_SIZES( size->face ) ) - { - CFF_Face cffface = (CFF_Face)size->face; - SFNT_Service sfnt = (SFNT_Service)cffface->sfnt; - FT_ULong strike_index; - - - if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) ) - cffsize->strike_index = 0xFFFFFFFFUL; - else - return cff_size_select( size, strike_index ); - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - FT_Request_Metrics( size->face, req ); - - funcs = cff_size_get_globals_funcs( cffsize ); - - if ( funcs ) - { - CFF_Face cffface = (CFF_Face)size->face; - CFF_Font font = (CFF_Font)cffface->extra.data; - CFF_Internal internal = (CFF_Internal)size->internal; - - FT_Long top_upm = (FT_Long)font->top_font.font_dict.units_per_em; - FT_UInt i; - - - funcs->set_scale( internal->topfont, - size->metrics.x_scale, size->metrics.y_scale, - 0, 0 ); - - for ( i = font->num_subfonts; i > 0; i-- ) - { - CFF_SubFont sub = font->subfonts[i - 1]; - FT_Long sub_upm = (FT_Long)sub->font_dict.units_per_em; - FT_Pos x_scale, y_scale; - - - if ( top_upm != sub_upm ) - { - x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); - y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); - } - else - { - x_scale = size->metrics.x_scale; - y_scale = size->metrics.y_scale; - } - - funcs->set_scale( internal->subfonts[i - 1], - x_scale, y_scale, 0, 0 ); - } - } - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* SLOT FUNCTIONS */ - /* */ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - cff_slot_done( FT_GlyphSlot slot ) - { - slot->internal->glyph_hints = NULL; - } - - - FT_LOCAL_DEF( FT_Error ) - cff_slot_init( FT_GlyphSlot slot ) - { - CFF_Face face = (CFF_Face)slot->face; - CFF_Font font = (CFF_Font)face->extra.data; - PSHinter_Service pshinter = font->pshinter; - - - if ( pshinter ) - { - FT_Module module; - - - module = FT_Get_Module( slot->face->driver->root.library, - "pshinter" ); - if ( module ) - { - T2_Hints_Funcs funcs; - - - funcs = pshinter->get_t2_funcs( module ); - slot->internal->glyph_hints = (void*)funcs; - } - } - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* FACE FUNCTIONS */ - /* */ - /*************************************************************************/ - - static FT_String* - cff_strcpy( FT_Memory memory, - const FT_String* source ) - { - FT_Error error; - FT_String* result; - - - (void)FT_STRDUP( result, source ); - - FT_UNUSED( error ); - - return result; - } - - - /* Strip all subset prefixes of the form `ABCDEF+'. Usually, there */ - /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold' */ - /* have been seen in the wild. */ - - static void - remove_subset_prefix( FT_String* name ) - { - FT_Int32 idx = 0; - FT_Int32 length = (FT_Int32)strlen( name ) + 1; - FT_Bool continue_search = 1; - - - while ( continue_search ) - { - if ( length >= 7 && name[6] == '+' ) - { - for ( idx = 0; idx < 6; idx++ ) - { - /* ASCII uppercase letters */ - if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) ) - continue_search = 0; - } - - if ( continue_search ) - { - for ( idx = 7; idx < length; idx++ ) - name[idx - 7] = name[idx]; - length -= 7; - } - } - else - continue_search = 0; - } - } - - - /* Remove the style part from the family name (if present). */ - - static void - remove_style( FT_String* family_name, - const FT_String* style_name ) - { - FT_Int32 family_name_length, style_name_length; - - - family_name_length = (FT_Int32)strlen( family_name ); - style_name_length = (FT_Int32)strlen( style_name ); - - if ( family_name_length > style_name_length ) - { - FT_Int idx; - - - for ( idx = 1; idx <= style_name_length; ++idx ) - { - if ( family_name[family_name_length - idx] != - style_name[style_name_length - idx] ) - break; - } - - if ( idx > style_name_length ) - { - /* family_name ends with style_name; remove it */ - idx = family_name_length - style_name_length - 1; - - /* also remove special characters */ - /* between real family name and style */ - while ( idx > 0 && - ( family_name[idx] == '-' || - family_name[idx] == ' ' || - family_name[idx] == '_' || - family_name[idx] == '+' ) ) - --idx; - - if ( idx > 0 ) - family_name[idx + 1] = '\0'; - } - } - } - - - FT_LOCAL_DEF( FT_Error ) - cff_face_init( FT_Stream stream, - FT_Face cffface, /* CFF_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ) - { - CFF_Face face = (CFF_Face)cffface; - FT_Error error; - SFNT_Service sfnt; - FT_Service_PsCMaps psnames; - PSHinter_Service pshinter; - FT_Bool pure_cff = 1; - FT_Bool sfnt_format = 0; - FT_Library library = cffface->driver->root.library; - - - sfnt = (SFNT_Service)FT_Get_Module_Interface( - library, "sfnt" ); - if ( !sfnt ) - { - FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" )); - error = FT_THROW( Missing_Module ); - goto Exit; - } - - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); - - pshinter = (PSHinter_Service)FT_Get_Module_Interface( - library, "pshinter" ); - - FT_TRACE2(( "CFF driver\n" )); - - /* create input stream from resource */ - if ( FT_STREAM_SEEK( 0 ) ) - goto Exit; - - /* check whether we have a valid OpenType file */ - error = sfnt->init_face( stream, face, face_index, num_params, params ); - if ( !error ) - { - if ( face->format_tag != TTAG_OTTO ) /* `OTTO'; OpenType/CFF font */ - { - FT_TRACE2(( " not an OpenType/CFF font\n" )); - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - /* if we are performing a simple font format check, exit immediately */ - if ( face_index < 0 ) - return FT_Err_Ok; - - sfnt_format = 1; - - /* now, the font can be either an OpenType/CFF font, or an SVG CEF */ - /* font; in the latter case it doesn't have a `head' table */ - error = face->goto_table( face, TTAG_head, stream, 0 ); - if ( !error ) - { - pure_cff = 0; - - /* load font directory */ - error = sfnt->load_face( stream, face, face_index, - num_params, params ); - if ( error ) - goto Exit; - } - else - { - /* load the `cmap' table explicitly */ - error = sfnt->load_cmap( face, stream ); - if ( error ) - goto Exit; - } - - /* now load the CFF part of the file */ - error = face->goto_table( face, TTAG_CFF, stream, 0 ); - if ( error ) - goto Exit; - } - else - { - /* rewind to start of file; we are going to load a pure-CFF font */ - if ( FT_STREAM_SEEK( 0 ) ) - goto Exit; - error = FT_Err_Ok; - } - - /* now load and parse the CFF table in the file */ - { - CFF_Font cff = NULL; - CFF_FontRecDict dict; - FT_Memory memory = cffface->memory; - FT_Int32 flags; - FT_UInt i; - - - if ( FT_NEW( cff ) ) - goto Exit; - - face->extra.data = cff; - error = cff_font_load( library, stream, face_index, cff, pure_cff ); - if ( error ) - goto Exit; - - /* if we are performing a simple font format check, exit immediately */ - /* (this is here for pure CFF) */ - if ( face_index < 0 ) - return FT_Err_Ok; - - cff->pshinter = pshinter; - cff->psnames = psnames; - - cffface->face_index = face_index & 0xFFFF; - - /* Complement the root flags with some interesting information. */ - /* Note that this is only necessary for pure CFF and CEF fonts; */ - /* SFNT based fonts use the `name' table instead. */ - - cffface->num_glyphs = (FT_Long)cff->num_glyphs; - - dict = &cff->top_font.font_dict; - - /* we need the `PSNames' module for CFF and CEF formats */ - /* which aren't CID-keyed */ - if ( dict->cid_registry == 0xFFFFU && !psnames ) - { - FT_ERROR(( "cff_face_init:" - " cannot open CFF & CEF fonts\n" - " " - " without the `PSNames' module\n" )); - error = FT_THROW( Missing_Module ); - goto Exit; - } - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_UInt idx; - FT_String* s; - - - FT_TRACE4(( "SIDs\n" )); - - /* dump string index, including default strings for convenience */ - for ( idx = 0; idx < cff->num_strings + 390; idx++ ) - { - s = cff_index_get_sid_string( cff, idx ); - if ( s ) - FT_TRACE4((" %5d %s\n", idx, s )); - } - } -#endif /* FT_DEBUG_LEVEL_TRACE */ - - if ( !dict->has_font_matrix ) - dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM; - - /* Normalize the font matrix so that `matrix->yy' is 1; the */ - /* scaling is done with `units_per_em' then (at this point, */ - /* it already contains the scaling factor, but without */ - /* normalization of the matrix). */ - /* */ - /* Note that the offsets must be expressed in integer font */ - /* units. */ - - { - FT_Matrix* matrix = &dict->font_matrix; - FT_Vector* offset = &dict->font_offset; - FT_ULong* upm = &dict->units_per_em; - FT_Fixed temp = FT_ABS( matrix->yy ); - - - if ( temp != 0x10000L ) - { - *upm = (FT_ULong)FT_DivFix( (FT_Long)*upm, temp ); - - matrix->xx = FT_DivFix( matrix->xx, temp ); - matrix->yx = FT_DivFix( matrix->yx, temp ); - matrix->xy = FT_DivFix( matrix->xy, temp ); - matrix->yy = FT_DivFix( matrix->yy, temp ); - offset->x = FT_DivFix( offset->x, temp ); - offset->y = FT_DivFix( offset->y, temp ); - } - - offset->x >>= 16; - offset->y >>= 16; - } - - for ( i = cff->num_subfonts; i > 0; i-- ) - { - CFF_FontRecDict sub = &cff->subfonts[i - 1]->font_dict; - CFF_FontRecDict top = &cff->top_font.font_dict; - - FT_Matrix* matrix; - FT_Vector* offset; - FT_ULong* upm; - FT_Fixed temp; - - - if ( sub->has_font_matrix ) - { - FT_Long scaling; - - - /* if we have a top-level matrix, */ - /* concatenate the subfont matrix */ - - if ( top->has_font_matrix ) - { - if ( top->units_per_em > 1 && sub->units_per_em > 1 ) - scaling = (FT_Long)FT_MIN( top->units_per_em, - sub->units_per_em ); - else - scaling = 1; - - FT_Matrix_Multiply_Scaled( &top->font_matrix, - &sub->font_matrix, - scaling ); - FT_Vector_Transform_Scaled( &sub->font_offset, - &top->font_matrix, - scaling ); - - sub->units_per_em = (FT_ULong) - FT_MulDiv( (FT_Long)sub->units_per_em, - (FT_Long)top->units_per_em, - scaling ); - } - } - else - { - sub->font_matrix = top->font_matrix; - sub->font_offset = top->font_offset; - - sub->units_per_em = top->units_per_em; - } - - matrix = &sub->font_matrix; - offset = &sub->font_offset; - upm = &sub->units_per_em; - temp = FT_ABS( matrix->yy ); - - if ( temp != 0x10000L ) - { - *upm = (FT_ULong)FT_DivFix( (FT_Long)*upm, temp ); - - matrix->xx = FT_DivFix( matrix->xx, temp ); - matrix->yx = FT_DivFix( matrix->yx, temp ); - matrix->xy = FT_DivFix( matrix->xy, temp ); - matrix->yy = FT_DivFix( matrix->yy, temp ); - offset->x = FT_DivFix( offset->x, temp ); - offset->y = FT_DivFix( offset->y, temp ); - } - - offset->x >>= 16; - offset->y >>= 16; - } - - if ( pure_cff ) - { - char* style_name = NULL; - - - /* set up num_faces */ - cffface->num_faces = (FT_Long)cff->num_faces; - - /* compute number of glyphs */ - if ( dict->cid_registry != 0xFFFFU ) - cffface->num_glyphs = (FT_Long)( cff->charset.max_cid + 1 ); - else - cffface->num_glyphs = (FT_Long)cff->charstrings_index.count; - - /* set global bbox, as well as EM size */ - cffface->bbox.xMin = dict->font_bbox.xMin >> 16; - cffface->bbox.yMin = dict->font_bbox.yMin >> 16; - /* no `U' suffix here to 0xFFFF! */ - cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16; - cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16; - - cffface->units_per_EM = (FT_UShort)( dict->units_per_em ); - - cffface->ascender = (FT_Short)( cffface->bbox.yMax ); - cffface->descender = (FT_Short)( cffface->bbox.yMin ); - - cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 ); - if ( cffface->height < cffface->ascender - cffface->descender ) - cffface->height = (FT_Short)( cffface->ascender - cffface->descender ); - - cffface->underline_position = - (FT_Short)( dict->underline_position >> 16 ); - cffface->underline_thickness = - (FT_Short)( dict->underline_thickness >> 16 ); - - /* retrieve font family & style name */ - cffface->family_name = cff_index_get_name( - cff, - (FT_UInt)( face_index & 0xFFFF ) ); - if ( cffface->family_name ) - { - char* full = cff_index_get_sid_string( cff, - dict->full_name ); - char* fullp = full; - char* family = cffface->family_name; - char* family_name = NULL; - - - remove_subset_prefix( cffface->family_name ); - - if ( dict->family_name ) - { - family_name = cff_index_get_sid_string( cff, - dict->family_name ); - if ( family_name ) - family = family_name; - } - - /* We try to extract the style name from the full name. */ - /* We need to ignore spaces and dashes during the search. */ - if ( full && family ) - { - while ( *fullp ) - { - /* skip common characters at the start of both strings */ - if ( *fullp == *family ) - { - family++; - fullp++; - continue; - } - - /* ignore spaces and dashes in full name during comparison */ - if ( *fullp == ' ' || *fullp == '-' ) - { - fullp++; - continue; - } - - /* ignore spaces and dashes in family name during comparison */ - if ( *family == ' ' || *family == '-' ) - { - family++; - continue; - } - - if ( !*family && *fullp ) - { - /* The full name begins with the same characters as the */ - /* family name, with spaces and dashes removed. In this */ - /* case, the remaining string in `fullp' will be used as */ - /* the style name. */ - style_name = cff_strcpy( memory, fullp ); - - /* remove the style part from the family name (if present) */ - remove_style( cffface->family_name, style_name ); - } - break; - } - } - } - else - { - char *cid_font_name = - cff_index_get_sid_string( cff, - dict->cid_font_name ); - - - /* do we have a `/FontName' for a CID-keyed font? */ - if ( cid_font_name ) - cffface->family_name = cff_strcpy( memory, cid_font_name ); - } - - if ( style_name ) - cffface->style_name = style_name; - else - /* assume "Regular" style if we don't know better */ - cffface->style_name = cff_strcpy( memory, (char *)"Regular" ); - - /*******************************************************************/ - /* */ - /* Compute face flags. */ - /* */ - flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ - FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ - FT_FACE_FLAG_HINTER; /* has native hinter */ - - if ( sfnt_format ) - flags |= FT_FACE_FLAG_SFNT; - - /* fixed width font? */ - if ( dict->is_fixed_pitch ) - flags |= FT_FACE_FLAG_FIXED_WIDTH; - - /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */ -#if 0 - /* kerning available? */ - if ( face->kern_pairs ) - flags |= FT_FACE_FLAG_KERNING; -#endif - - cffface->face_flags |= flags; - - /*******************************************************************/ - /* */ - /* Compute style flags. */ - /* */ - flags = 0; - - if ( dict->italic_angle ) - flags |= FT_STYLE_FLAG_ITALIC; - - { - char *weight = cff_index_get_sid_string( cff, - dict->weight ); - - - if ( weight ) - if ( !ft_strcmp( weight, "Bold" ) || - !ft_strcmp( weight, "Black" ) ) - flags |= FT_STYLE_FLAG_BOLD; - } - - /* double check */ - if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name ) - if ( !ft_strncmp( cffface->style_name, "Bold", 4 ) || - !ft_strncmp( cffface->style_name, "Black", 5 ) ) - flags |= FT_STYLE_FLAG_BOLD; - - cffface->style_flags = flags; - } - - -#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES - /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */ - /* has unset this flag because of the 3.0 `post' table. */ - if ( dict->cid_registry == 0xFFFFU ) - cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; -#endif - - if ( dict->cid_registry != 0xFFFFU && pure_cff ) - cffface->face_flags |= FT_FACE_FLAG_CID_KEYED; - - - /*******************************************************************/ - /* */ - /* Compute char maps. */ - /* */ - - /* Try to synthesize a Unicode charmap if there is none available */ - /* already. If an OpenType font contains a Unicode "cmap", we */ - /* will use it, whatever be in the CFF part of the file. */ - { - FT_CharMapRec cmaprec; - FT_CharMap cmap; - FT_UInt nn; - CFF_Encoding encoding = &cff->encoding; - - - for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ ) - { - cmap = cffface->charmaps[nn]; - - /* Windows Unicode? */ - if ( cmap->platform_id == TT_PLATFORM_MICROSOFT && - cmap->encoding_id == TT_MS_ID_UNICODE_CS ) - goto Skip_Unicode; - - /* Apple Unicode platform id? */ - if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE ) - goto Skip_Unicode; /* Apple Unicode */ - } - - /* since CID-keyed fonts don't contain glyph names, we can't */ - /* construct a cmap */ - if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU ) - goto Exit; - - /* we didn't find a Unicode charmap -- synthesize one */ - cmaprec.face = cffface; - cmaprec.platform_id = TT_PLATFORM_MICROSOFT; - cmaprec.encoding_id = TT_MS_ID_UNICODE_CS; - cmaprec.encoding = FT_ENCODING_UNICODE; - - nn = (FT_UInt)cffface->num_charmaps; - - error = FT_CMap_New( &CFF_CMAP_UNICODE_CLASS_REC_GET, NULL, - &cmaprec, NULL ); - if ( error && - FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) ) - goto Exit; - error = FT_Err_Ok; - - /* if no Unicode charmap was previously selected, select this one */ - if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps ) - cffface->charmap = cffface->charmaps[nn]; - - Skip_Unicode: - if ( encoding->count > 0 ) - { - FT_CMap_Class clazz; - - - cmaprec.face = cffface; - cmaprec.platform_id = TT_PLATFORM_ADOBE; /* Adobe platform id */ - - if ( encoding->offset == 0 ) - { - cmaprec.encoding_id = TT_ADOBE_ID_STANDARD; - cmaprec.encoding = FT_ENCODING_ADOBE_STANDARD; - clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET; - } - else if ( encoding->offset == 1 ) - { - cmaprec.encoding_id = TT_ADOBE_ID_EXPERT; - cmaprec.encoding = FT_ENCODING_ADOBE_EXPERT; - clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET; - } - else - { - cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM; - cmaprec.encoding = FT_ENCODING_ADOBE_CUSTOM; - clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET; - } - - error = FT_CMap_New( clazz, NULL, &cmaprec, NULL ); - } - } - } - - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - cff_face_done( FT_Face cffface ) /* CFF_Face */ - { - CFF_Face face = (CFF_Face)cffface; - FT_Memory memory; - SFNT_Service sfnt; - - - if ( !face ) - return; - - memory = cffface->memory; - sfnt = (SFNT_Service)face->sfnt; - - if ( sfnt ) - sfnt->done_face( face ); - - { - CFF_Font cff = (CFF_Font)face->extra.data; - - - if ( cff ) - { - cff_font_done( cff ); - FT_FREE( face->extra.data ); - } - } - } - - - FT_LOCAL_DEF( FT_Error ) - cff_driver_init( FT_Module module ) /* CFF_Driver */ - { - CFF_Driver driver = (CFF_Driver)module; - - - /* set default property values, cf. `ftcffdrv.h' */ -#ifdef CFF_CONFIG_OPTION_OLD_ENGINE - driver->hinting_engine = FT_CFF_HINTING_FREETYPE; -#else - driver->hinting_engine = FT_CFF_HINTING_ADOBE; -#endif - - driver->no_stem_darkening = FALSE; - - driver->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1; - driver->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1; - driver->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2; - driver->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2; - driver->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3; - driver->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3; - driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4; - driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4; - - return FT_Err_Ok; - } - - - FT_LOCAL_DEF( void ) - cff_driver_done( FT_Module module ) /* CFF_Driver */ - { - FT_UNUSED( module ); - } - - -/* END */ diff --git a/3party/freetype/src/cff/cffobjs.h b/3party/freetype/src/cff/cffobjs.h deleted file mode 100644 index 3cc953143b..0000000000 --- a/3party/freetype/src/cff/cffobjs.h +++ /dev/null @@ -1,185 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffobjs.h */ -/* */ -/* OpenType objects manager (specification). */ -/* */ -/* Copyright 1996-2015 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 __CFFOBJS_H__ -#define __CFFOBJS_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include "cfftypes.h" -#include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* CFF_Driver */ - /* */ - /* <Description> */ - /* A handle to an OpenType driver object. */ - /* */ - typedef struct CFF_DriverRec_* CFF_Driver; - - typedef TT_Face CFF_Face; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* CFF_Size */ - /* */ - /* <Description> */ - /* A handle to an OpenType size object. */ - /* */ - typedef struct CFF_SizeRec_ - { - FT_SizeRec root; - FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ - - } CFF_SizeRec, *CFF_Size; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* CFF_GlyphSlot */ - /* */ - /* <Description> */ - /* A handle to an OpenType glyph slot object. */ - /* */ - typedef struct CFF_GlyphSlotRec_ - { - FT_GlyphSlotRec root; - - FT_Bool hint; - FT_Bool scaled; - - FT_Fixed x_scale; - FT_Fixed y_scale; - - } CFF_GlyphSlotRec, *CFF_GlyphSlot; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* CFF_Internal */ - /* */ - /* <Description> */ - /* The interface to the `internal' field of `FT_Size'. */ - /* */ - typedef struct CFF_InternalRec_ - { - PSH_Globals topfont; - PSH_Globals subfonts[CFF_MAX_CID_FONTS]; - - } CFF_InternalRec, *CFF_Internal; - - - /*************************************************************************/ - /* */ - /* Subglyph transformation record. */ - /* */ - typedef struct CFF_Transform_ - { - FT_Fixed xx, xy; /* transformation matrix coefficients */ - FT_Fixed yx, yy; - FT_F26Dot6 ox, oy; /* offsets */ - - } CFF_Transform; - - - /***********************************************************************/ - /* */ - /* CFF driver class. */ - /* */ - typedef struct CFF_DriverRec_ - { - FT_DriverRec root; - - FT_UInt hinting_engine; - FT_Bool no_stem_darkening; - - FT_Int darken_params[8]; - - } CFF_DriverRec; - - - FT_LOCAL( FT_Error ) - cff_size_init( FT_Size size ); /* CFF_Size */ - - FT_LOCAL( void ) - cff_size_done( FT_Size size ); /* CFF_Size */ - - FT_LOCAL( FT_Error ) - cff_size_request( FT_Size size, - FT_Size_Request req ); - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - FT_LOCAL( FT_Error ) - cff_size_select( FT_Size size, - FT_ULong strike_index ); - -#endif - - FT_LOCAL( void ) - cff_slot_done( FT_GlyphSlot slot ); - - FT_LOCAL( FT_Error ) - cff_slot_init( FT_GlyphSlot slot ); - - - /*************************************************************************/ - /* */ - /* Face functions */ - /* */ - FT_LOCAL( FT_Error ) - cff_face_init( FT_Stream stream, - FT_Face face, /* CFF_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - FT_LOCAL( void ) - cff_face_done( FT_Face face ); /* CFF_Face */ - - - /*************************************************************************/ - /* */ - /* Driver functions */ - /* */ - FT_LOCAL( FT_Error ) - cff_driver_init( FT_Module module ); /* CFF_Driver */ - - FT_LOCAL( void ) - cff_driver_done( FT_Module module ); /* CFF_Driver */ - - -FT_END_HEADER - -#endif /* __CFFOBJS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cffparse.c b/3party/freetype/src/cff/cffparse.c deleted file mode 100644 index 063b3517c5..0000000000 --- a/3party/freetype/src/cff/cffparse.c +++ /dev/null @@ -1,1193 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffparse.c */ -/* */ -/* CFF token stream parser (body) */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include "cffparse.h" -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H - -#include "cfferrs.h" -#include "cffpic.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cffparse - - - FT_LOCAL_DEF( void ) - cff_parser_init( CFF_Parser parser, - FT_UInt code, - void* object, - FT_Library library) - { - FT_MEM_ZERO( parser, sizeof ( *parser ) ); - - parser->top = parser->stack; - parser->object_code = code; - parser->object = object; - parser->library = library; - } - - - /* read an integer */ - static FT_Long - cff_parse_integer( FT_Byte* start, - FT_Byte* limit ) - { - FT_Byte* p = start; - FT_Int v = *p++; - FT_Long val = 0; - - - if ( v == 28 ) - { - if ( p + 2 > limit ) - goto Bad; - - val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] ); - } - else if ( v == 29 ) - { - if ( p + 4 > limit ) - goto Bad; - - val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) | - ( (FT_ULong)p[1] << 16 ) | - ( (FT_ULong)p[2] << 8 ) | - (FT_ULong)p[3] ); - } - else if ( v < 247 ) - { - val = v - 139; - } - else if ( v < 251 ) - { - if ( p + 1 > limit ) - goto Bad; - - val = ( v - 247 ) * 256 + p[0] + 108; - } - else - { - if ( p + 1 > limit ) - goto Bad; - - val = -( v - 251 ) * 256 - p[0] - 108; - } - - Exit: - return val; - - Bad: - val = 0; - FT_TRACE4(( "!!!END OF DATA:!!!" )); - goto Exit; - } - - - static const FT_Long power_tens[] = - { - 1L, - 10L, - 100L, - 1000L, - 10000L, - 100000L, - 1000000L, - 10000000L, - 100000000L, - 1000000000L - }; - - - /* read a real */ - static FT_Fixed - cff_parse_real( FT_Byte* start, - FT_Byte* limit, - FT_Long power_ten, - FT_Long* scaling ) - { - FT_Byte* p = start; - FT_Int nib; - FT_UInt phase; - - FT_Long result, number, exponent; - FT_Int sign = 0, exponent_sign = 0, have_overflow = 0; - FT_Long exponent_add, integer_length, fraction_length; - - - if ( scaling ) - *scaling = 0; - - result = 0; - - number = 0; - exponent = 0; - - exponent_add = 0; - integer_length = 0; - fraction_length = 0; - - /* First of all, read the integer part. */ - phase = 4; - - for (;;) - { - /* If we entered this iteration with phase == 4, we need to */ - /* read a new byte. This also skips past the initial 0x1E. */ - if ( phase ) - { - p++; - - /* Make sure we don't read past the end. */ - if ( p >= limit ) - goto Bad; - } - - /* Get the nibble. */ - nib = (FT_Int)( p[0] >> phase ) & 0xF; - phase = 4 - phase; - - if ( nib == 0xE ) - sign = 1; - else if ( nib > 9 ) - break; - else - { - /* Increase exponent if we can't add the digit. */ - if ( number >= 0xCCCCCCCL ) - exponent_add++; - /* Skip leading zeros. */ - else if ( nib || number ) - { - integer_length++; - number = number * 10 + nib; - } - } - } - - /* Read fraction part, if any. */ - if ( nib == 0xA ) - for (;;) - { - /* If we entered this iteration with phase == 4, we need */ - /* to read a new byte. */ - if ( phase ) - { - p++; - - /* Make sure we don't read past the end. */ - if ( p >= limit ) - goto Bad; - } - - /* Get the nibble. */ - nib = ( p[0] >> phase ) & 0xF; - phase = 4 - phase; - if ( nib >= 10 ) - break; - - /* Skip leading zeros if possible. */ - if ( !nib && !number ) - exponent_add--; - /* Only add digit if we don't overflow. */ - else if ( number < 0xCCCCCCCL && fraction_length < 9 ) - { - fraction_length++; - number = number * 10 + nib; - } - } - - /* Read exponent, if any. */ - if ( nib == 12 ) - { - exponent_sign = 1; - nib = 11; - } - - if ( nib == 11 ) - { - for (;;) - { - /* If we entered this iteration with phase == 4, */ - /* we need to read a new byte. */ - if ( phase ) - { - p++; - - /* Make sure we don't read past the end. */ - if ( p >= limit ) - goto Bad; - } - - /* Get the nibble. */ - nib = ( p[0] >> phase ) & 0xF; - phase = 4 - phase; - if ( nib >= 10 ) - break; - - /* Arbitrarily limit exponent. */ - if ( exponent > 1000 ) - have_overflow = 1; - else - exponent = exponent * 10 + nib; - } - - if ( exponent_sign ) - exponent = -exponent; - } - - if ( !number ) - goto Exit; - - if ( have_overflow ) - { - if ( exponent_sign ) - goto Underflow; - else - goto Overflow; - } - - /* We don't check `power_ten' and `exponent_add'. */ - exponent += power_ten + exponent_add; - - if ( scaling ) - { - /* Only use `fraction_length'. */ - fraction_length += integer_length; - exponent += integer_length; - - if ( fraction_length <= 5 ) - { - if ( number > 0x7FFFL ) - { - result = FT_DivFix( number, 10 ); - *scaling = exponent - fraction_length + 1; - } - else - { - if ( exponent > 0 ) - { - FT_Long new_fraction_length, shift; - - - /* Make `scaling' as small as possible. */ - new_fraction_length = FT_MIN( exponent, 5 ); - shift = new_fraction_length - fraction_length; - - if ( shift > 0 ) - { - exponent -= new_fraction_length; - number *= power_tens[shift]; - if ( number > 0x7FFFL ) - { - number /= 10; - exponent += 1; - } - } - else - exponent -= fraction_length; - } - else - exponent -= fraction_length; - - result = (FT_Long)( (FT_ULong)number << 16 ); - *scaling = exponent; - } - } - else - { - if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL ) - { - result = FT_DivFix( number, power_tens[fraction_length - 4] ); - *scaling = exponent - 4; - } - else - { - result = FT_DivFix( number, power_tens[fraction_length - 5] ); - *scaling = exponent - 5; - } - } - } - else - { - integer_length += exponent; - fraction_length -= exponent; - - if ( integer_length > 5 ) - goto Overflow; - if ( integer_length < -5 ) - goto Underflow; - - /* Remove non-significant digits. */ - if ( integer_length < 0 ) - { - number /= power_tens[-integer_length]; - fraction_length += integer_length; - } - - /* this can only happen if exponent was non-zero */ - if ( fraction_length == 10 ) - { - number /= 10; - fraction_length -= 1; - } - - /* Convert into 16.16 format. */ - if ( fraction_length > 0 ) - { - if ( ( number / power_tens[fraction_length] ) > 0x7FFFL ) - goto Exit; - - result = FT_DivFix( number, power_tens[fraction_length] ); - } - else - { - number *= power_tens[-fraction_length]; - - if ( number > 0x7FFFL ) - goto Overflow; - - result = (FT_Long)( (FT_ULong)number << 16 ); - } - } - - Exit: - if ( sign ) - result = -result; - - return result; - - Overflow: - result = 0x7FFFFFFFL; - FT_TRACE4(( "!!!OVERFLOW:!!!" )); - goto Exit; - - Underflow: - result = 0; - FT_TRACE4(( "!!!UNDERFLOW:!!!" )); - goto Exit; - - Bad: - result = 0; - FT_TRACE4(( "!!!END OF DATA:!!!" )); - goto Exit; - } - - - /* read a number, either integer or real */ - static FT_Long - cff_parse_num( FT_Byte** d ) - { - return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 ) - : cff_parse_integer( d[0], d[1] ); - } - - - /* read a floating point number, either integer or real */ - static FT_Fixed - do_fixed( FT_Byte** d, - FT_Long scaling ) - { - if ( **d == 30 ) - return cff_parse_real( d[0], d[1], scaling, NULL ); - else - { - FT_Long val = cff_parse_integer( d[0], d[1] ); - - - if ( scaling ) - val *= power_tens[scaling]; - - if ( val > 0x7FFF ) - { - val = 0x7FFFFFFFL; - goto Overflow; - } - else if ( val < -0x7FFF ) - { - val = -0x7FFFFFFFL; - goto Overflow; - } - - return (FT_Long)( (FT_ULong)val << 16 ); - - Overflow: - FT_TRACE4(( "!!!OVERFLOW:!!!" )); - return val; - } - } - - - /* read a floating point number, either integer or real */ - static FT_Fixed - cff_parse_fixed( FT_Byte** d ) - { - return do_fixed( d, 0 ); - } - - - /* read a floating point number, either integer or real, */ - /* but return `10^scaling' times the number read in */ - static FT_Fixed - cff_parse_fixed_scaled( FT_Byte** d, - FT_Long scaling ) - { - return do_fixed( d, scaling ); - } - - - /* read a floating point number, either integer or real, */ - /* and return it as precise as possible -- `scaling' returns */ - /* the scaling factor (as a power of 10) */ - static FT_Fixed - cff_parse_fixed_dynamic( FT_Byte** d, - FT_Long* scaling ) - { - FT_ASSERT( scaling ); - - if ( **d == 30 ) - return cff_parse_real( d[0], d[1], 0, scaling ); - else - { - FT_Long number; - FT_Int integer_length; - - - number = cff_parse_integer( d[0], d[1] ); - - if ( number > 0x7FFFL ) - { - for ( integer_length = 5; integer_length < 10; integer_length++ ) - if ( number < power_tens[integer_length] ) - break; - - if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL ) - { - *scaling = integer_length - 4; - return FT_DivFix( number, power_tens[integer_length - 4] ); - } - else - { - *scaling = integer_length - 5; - return FT_DivFix( number, power_tens[integer_length - 5] ); - } - } - else - { - *scaling = 0; - return (FT_Long)( (FT_ULong)number << 16 ); - } - } - } - - - static FT_Error - cff_parse_font_matrix( CFF_Parser parser ) - { - CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; - FT_Matrix* matrix = &dict->font_matrix; - FT_Vector* offset = &dict->font_offset; - FT_ULong* upm = &dict->units_per_em; - FT_Byte** data = parser->stack; - FT_Error error = FT_ERR( Stack_Underflow ); - - - if ( parser->top >= parser->stack + 6 ) - { - FT_Long scaling; - - - error = FT_Err_Ok; - - dict->has_font_matrix = TRUE; - - /* We expect a well-formed font matrix, this is, the matrix elements */ - /* `xx' and `yy' are of approximately the same magnitude. To avoid */ - /* loss of precision, we use the magnitude of element `xx' to scale */ - /* all other elements. The scaling factor is then contained in the */ - /* `units_per_em' value. */ - - matrix->xx = cff_parse_fixed_dynamic( data++, &scaling ); - - scaling = -scaling; - - if ( scaling < 0 || scaling > 9 ) - { - /* Return default matrix in case of unlikely values. */ - - FT_TRACE1(( "cff_parse_font_matrix:" - " strange scaling value for xx element (%d),\n" - " " - " using default matrix\n", scaling )); - - matrix->xx = 0x10000L; - matrix->yx = 0; - matrix->xy = 0; - matrix->yy = 0x10000L; - offset->x = 0; - offset->y = 0; - *upm = 1; - - goto Exit; - } - - matrix->yx = cff_parse_fixed_scaled( data++, scaling ); - matrix->xy = cff_parse_fixed_scaled( data++, scaling ); - matrix->yy = cff_parse_fixed_scaled( data++, scaling ); - offset->x = cff_parse_fixed_scaled( data++, scaling ); - offset->y = cff_parse_fixed_scaled( data, scaling ); - - *upm = (FT_ULong)power_tens[scaling]; - - FT_TRACE4(( " [%f %f %f %f %f %f]\n", - (double)matrix->xx / *upm / 65536, - (double)matrix->xy / *upm / 65536, - (double)matrix->yx / *upm / 65536, - (double)matrix->yy / *upm / 65536, - (double)offset->x / *upm / 65536, - (double)offset->y / *upm / 65536 )); - } - - Exit: - return error; - } - - - static FT_Error - cff_parse_font_bbox( CFF_Parser parser ) - { - CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; - FT_BBox* bbox = &dict->font_bbox; - FT_Byte** data = parser->stack; - FT_Error error; - - - error = FT_ERR( Stack_Underflow ); - - if ( parser->top >= parser->stack + 4 ) - { - bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) ); - bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) ); - bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) ); - bbox->yMax = FT_RoundFix( cff_parse_fixed( data ) ); - error = FT_Err_Ok; - - FT_TRACE4(( " [%d %d %d %d]\n", - bbox->xMin / 65536, - bbox->yMin / 65536, - bbox->xMax / 65536, - bbox->yMax / 65536 )); - } - - return error; - } - - - static FT_Error - cff_parse_private_dict( CFF_Parser parser ) - { - CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; - FT_Byte** data = parser->stack; - FT_Error error; - - - error = FT_ERR( Stack_Underflow ); - - if ( parser->top >= parser->stack + 2 ) - { - FT_Long tmp; - - - tmp = cff_parse_num( data++ ); - if ( tmp < 0 ) - { - FT_ERROR(( "cff_parse_private_dict: Invalid dictionary size\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - dict->private_size = (FT_ULong)tmp; - - tmp = cff_parse_num( data ); - if ( tmp < 0 ) - { - FT_ERROR(( "cff_parse_private_dict: Invalid dictionary offset\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - dict->private_offset = (FT_ULong)tmp; - - FT_TRACE4(( " %lu %lu\n", - dict->private_size, dict->private_offset )); - - error = FT_Err_Ok; - } - - Fail: - return error; - } - - - static FT_Error - cff_parse_cid_ros( CFF_Parser parser ) - { - CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; - FT_Byte** data = parser->stack; - FT_Error error; - - - error = FT_ERR( Stack_Underflow ); - - if ( parser->top >= parser->stack + 3 ) - { - dict->cid_registry = (FT_UInt)cff_parse_num( data++ ); - dict->cid_ordering = (FT_UInt)cff_parse_num( data++ ); - if ( **data == 30 ) - FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" )); - dict->cid_supplement = cff_parse_num( data ); - if ( dict->cid_supplement < 0 ) - FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n", - dict->cid_supplement )); - error = FT_Err_Ok; - - FT_TRACE4(( " %d %d %d\n", - dict->cid_registry, - dict->cid_ordering, - dict->cid_supplement )); - } - - return error; - } - - -#define CFF_FIELD_NUM( code, name, id ) \ - CFF_FIELD( code, name, id, cff_kind_num ) -#define CFF_FIELD_FIXED( code, name, id ) \ - CFF_FIELD( code, name, id, cff_kind_fixed ) -#define CFF_FIELD_FIXED_1000( code, name, id ) \ - CFF_FIELD( code, name, id, cff_kind_fixed_thousand ) -#define CFF_FIELD_STRING( code, name, id ) \ - CFF_FIELD( code, name, id, cff_kind_string ) -#define CFF_FIELD_BOOL( code, name, id ) \ - CFF_FIELD( code, name, id, cff_kind_bool ) - -#define CFFCODE_TOPDICT 0x1000 -#define CFFCODE_PRIVATE 0x2000 - - -#ifndef FT_CONFIG_OPTION_PIC - - -#undef CFF_FIELD -#undef CFF_FIELD_DELTA - - -#ifndef FT_DEBUG_LEVEL_TRACE - - -#define CFF_FIELD_CALLBACK( code, name, id ) \ - { \ - cff_kind_callback, \ - code | CFFCODE, \ - 0, 0, \ - cff_parse_ ## name, \ - 0, 0 \ - }, - -#define CFF_FIELD( code, name, id, kind ) \ - { \ - kind, \ - code | CFFCODE, \ - FT_FIELD_OFFSET( name ), \ - FT_FIELD_SIZE( name ), \ - 0, 0, 0 \ - }, - -#define CFF_FIELD_DELTA( code, name, max, id ) \ - { \ - cff_kind_delta, \ - code | CFFCODE, \ - FT_FIELD_OFFSET( name ), \ - FT_FIELD_SIZE_DELTA( name ), \ - 0, \ - max, \ - FT_FIELD_OFFSET( num_ ## name ) \ - }, - - static const CFF_Field_Handler cff_field_handlers[] = - { - -#include "cfftoken.h" - - { 0, 0, 0, 0, 0, 0, 0 } - }; - - -#else /* FT_DEBUG_LEVEL_TRACE */ - - - -#define CFF_FIELD_CALLBACK( code, name, id ) \ - { \ - cff_kind_callback, \ - code | CFFCODE, \ - 0, 0, \ - cff_parse_ ## name, \ - 0, 0, \ - id \ - }, - -#define CFF_FIELD( code, name, id, kind ) \ - { \ - kind, \ - code | CFFCODE, \ - FT_FIELD_OFFSET( name ), \ - FT_FIELD_SIZE( name ), \ - 0, 0, 0, \ - id \ - }, - -#define CFF_FIELD_DELTA( code, name, max, id ) \ - { \ - cff_kind_delta, \ - code | CFFCODE, \ - FT_FIELD_OFFSET( name ), \ - FT_FIELD_SIZE_DELTA( name ), \ - 0, \ - max, \ - FT_FIELD_OFFSET( num_ ## name ), \ - id \ - }, - - static const CFF_Field_Handler cff_field_handlers[] = - { - -#include "cfftoken.h" - - { 0, 0, 0, 0, 0, 0, 0, 0 } - }; - - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - -#else /* FT_CONFIG_OPTION_PIC */ - - - void - FT_Destroy_Class_cff_field_handlers( FT_Library library, - CFF_Field_Handler* clazz ) - { - FT_Memory memory = library->memory; - - - if ( clazz ) - FT_FREE( clazz ); - } - - - FT_Error - FT_Create_Class_cff_field_handlers( FT_Library library, - CFF_Field_Handler** output_class ) - { - CFF_Field_Handler* clazz = NULL; - FT_Error error; - FT_Memory memory = library->memory; - - int i = 0; - - -#undef CFF_FIELD -#define CFF_FIELD( code, name, id, kind ) i++; -#undef CFF_FIELD_DELTA -#define CFF_FIELD_DELTA( code, name, max, id ) i++; -#undef CFF_FIELD_CALLBACK -#define CFF_FIELD_CALLBACK( code, name, id ) i++; - -#include "cfftoken.h" - - i++; /* { 0, 0, 0, 0, 0, 0, 0 } */ - - if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) ) - return error; - - i = 0; - - -#ifndef FT_DEBUG_LEVEL_TRACE - - -#undef CFF_FIELD_CALLBACK -#define CFF_FIELD_CALLBACK( code_, name_, id_ ) \ - clazz[i].kind = cff_kind_callback; \ - clazz[i].code = code_ | CFFCODE; \ - clazz[i].offset = 0; \ - clazz[i].size = 0; \ - clazz[i].reader = cff_parse_ ## name_; \ - clazz[i].array_max = 0; \ - clazz[i].count_offset = 0; \ - i++; - -#undef CFF_FIELD -#define CFF_FIELD( code_, name_, id_, kind_ ) \ - clazz[i].kind = kind_; \ - clazz[i].code = code_ | CFFCODE; \ - clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ - clazz[i].size = FT_FIELD_SIZE( name_ ); \ - clazz[i].reader = 0; \ - clazz[i].array_max = 0; \ - clazz[i].count_offset = 0; \ - i++; \ - -#undef CFF_FIELD_DELTA -#define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \ - clazz[i].kind = cff_kind_delta; \ - clazz[i].code = code_ | CFFCODE; \ - clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ - clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ - clazz[i].reader = 0; \ - clazz[i].array_max = max_; \ - clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ - i++; - -#include "cfftoken.h" - - clazz[i].kind = 0; - clazz[i].code = 0; - clazz[i].offset = 0; - clazz[i].size = 0; - clazz[i].reader = 0; - clazz[i].array_max = 0; - clazz[i].count_offset = 0; - - -#else /* FT_DEBUG_LEVEL_TRACE */ - - -#undef CFF_FIELD_CALLBACK -#define CFF_FIELD_CALLBACK( code_, name_, id_ ) \ - clazz[i].kind = cff_kind_callback; \ - clazz[i].code = code_ | CFFCODE; \ - clazz[i].offset = 0; \ - clazz[i].size = 0; \ - clazz[i].reader = cff_parse_ ## name_; \ - clazz[i].array_max = 0; \ - clazz[i].count_offset = 0; \ - clazz[i].id = id_; \ - i++; - -#undef CFF_FIELD -#define CFF_FIELD( code_, name_, id_, kind_ ) \ - clazz[i].kind = kind_; \ - clazz[i].code = code_ | CFFCODE; \ - clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ - clazz[i].size = FT_FIELD_SIZE( name_ ); \ - clazz[i].reader = 0; \ - clazz[i].array_max = 0; \ - clazz[i].count_offset = 0; \ - clazz[i].id = id_; \ - i++; \ - -#undef CFF_FIELD_DELTA -#define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \ - clazz[i].kind = cff_kind_delta; \ - clazz[i].code = code_ | CFFCODE; \ - clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ - clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ - clazz[i].reader = 0; \ - clazz[i].array_max = max_; \ - clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ - clazz[i].id = id_; \ - i++; - -#include "cfftoken.h" - - clazz[i].kind = 0; - clazz[i].code = 0; - clazz[i].offset = 0; - clazz[i].size = 0; - clazz[i].reader = 0; - clazz[i].array_max = 0; - clazz[i].count_offset = 0; - clazz[i].id = 0; - - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - - *output_class = clazz; - - return FT_Err_Ok; - } - - -#endif /* FT_CONFIG_OPTION_PIC */ - - - FT_LOCAL_DEF( FT_Error ) - cff_parser_run( CFF_Parser parser, - FT_Byte* start, - FT_Byte* limit ) - { - FT_Byte* p = start; - FT_Error error = FT_Err_Ok; - FT_Library library = parser->library; - FT_UNUSED( library ); - - - parser->top = parser->stack; - parser->start = start; - parser->limit = limit; - parser->cursor = start; - - while ( p < limit ) - { - FT_UInt v = *p; - - - if ( v >= 27 && v != 31 ) - { - /* it's a number; we will push its position on the stack */ - if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH ) - goto Stack_Overflow; - - *parser->top ++ = p; - - /* now, skip it */ - if ( v == 30 ) - { - /* skip real number */ - p++; - for (;;) - { - /* An unterminated floating point number at the */ - /* end of a dictionary is invalid but harmless. */ - if ( p >= limit ) - goto Exit; - v = p[0] >> 4; - if ( v == 15 ) - break; - v = p[0] & 0xF; - if ( v == 15 ) - break; - p++; - } - } - else if ( v == 28 ) - p += 2; - else if ( v == 29 ) - p += 4; - else if ( v > 246 ) - p += 1; - } - else - { - /* This is not a number, hence it's an operator. Compute its code */ - /* and look for it in our current list. */ - - FT_UInt code; - FT_UInt num_args = (FT_UInt) - ( parser->top - parser->stack ); - const CFF_Field_Handler* field; - - - *parser->top = p; - code = v; - if ( v == 12 ) - { - /* two byte operator */ - p++; - if ( p >= limit ) - goto Syntax_Error; - - code = 0x100 | p[0]; - } - code = code | parser->object_code; - - for ( field = CFF_FIELD_HANDLERS_GET; field->kind; field++ ) - { - if ( field->code == (FT_Int)code ) - { - /* we found our field's handler; read it */ - FT_Long val; - FT_Byte* q = (FT_Byte*)parser->object + field->offset; - - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( " %s", field->id )); -#endif - - /* check that we have enough arguments -- except for */ - /* delta encoded arrays, which can be empty */ - if ( field->kind != cff_kind_delta && num_args < 1 ) - goto Stack_Underflow; - - switch ( field->kind ) - { - case cff_kind_bool: - case cff_kind_string: - case cff_kind_num: - val = cff_parse_num( parser->stack ); - goto Store_Number; - - case cff_kind_fixed: - val = cff_parse_fixed( parser->stack ); - goto Store_Number; - - case cff_kind_fixed_thousand: - val = cff_parse_fixed_scaled( parser->stack, 3 ); - - Store_Number: - switch ( field->size ) - { - case (8 / FT_CHAR_BIT): - *(FT_Byte*)q = (FT_Byte)val; - break; - - case (16 / FT_CHAR_BIT): - *(FT_Short*)q = (FT_Short)val; - break; - - case (32 / FT_CHAR_BIT): - *(FT_Int32*)q = (FT_Int)val; - break; - - default: /* for 64-bit systems */ - *(FT_Long*)q = val; - } - -#ifdef FT_DEBUG_LEVEL_TRACE - switch ( field->kind ) - { - case cff_kind_bool: - FT_TRACE4(( " %s\n", val ? "true" : "false" )); - break; - - case cff_kind_string: - FT_TRACE4(( " %ld (SID)\n", val )); - break; - - case cff_kind_num: - FT_TRACE4(( " %ld\n", val )); - break; - - case cff_kind_fixed: - FT_TRACE4(( " %f\n", (double)val / 65536 )); - break; - - case cff_kind_fixed_thousand: - FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 )); - - default: - ; /* never reached */ - } -#endif - - break; - - case cff_kind_delta: - { - FT_Byte* qcount = (FT_Byte*)parser->object + - field->count_offset; - - FT_Byte** data = parser->stack; - - - if ( num_args > field->array_max ) - num_args = field->array_max; - - FT_TRACE4(( " [" )); - - /* store count */ - *qcount = (FT_Byte)num_args; - - val = 0; - while ( num_args > 0 ) - { - val += cff_parse_num( data++ ); - switch ( field->size ) - { - case (8 / FT_CHAR_BIT): - *(FT_Byte*)q = (FT_Byte)val; - break; - - case (16 / FT_CHAR_BIT): - *(FT_Short*)q = (FT_Short)val; - break; - - case (32 / FT_CHAR_BIT): - *(FT_Int32*)q = (FT_Int)val; - break; - - default: /* for 64-bit systems */ - *(FT_Long*)q = val; - } - - FT_TRACE4(( " %ld", val )); - - q += field->size; - num_args--; - } - - FT_TRACE4(( "]\n" )); - } - break; - - default: /* callback */ - error = field->reader( parser ); - if ( error ) - goto Exit; - } - goto Found; - } - } - - /* this is an unknown operator, or it is unsupported; */ - /* we will ignore it for now. */ - - Found: - /* clear stack */ - parser->top = parser->stack; - } - p++; - } - - Exit: - return error; - - Stack_Overflow: - error = FT_THROW( Invalid_Argument ); - goto Exit; - - Stack_Underflow: - error = FT_THROW( Invalid_Argument ); - goto Exit; - - Syntax_Error: - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - -/* END */ diff --git a/3party/freetype/src/cff/cffparse.h b/3party/freetype/src/cff/cffparse.h deleted file mode 100644 index 8ad02ea1e2..0000000000 --- a/3party/freetype/src/cff/cffparse.h +++ /dev/null @@ -1,106 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffparse.h */ -/* */ -/* CFF token stream parser (specification) */ -/* */ -/* Copyright 1996-2015 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 __CFF_PARSE_H__ -#define __CFF_PARSE_H__ - - -#include <ft2build.h> -#include "cfftypes.h" -#include FT_INTERNAL_OBJECTS_H - - -FT_BEGIN_HEADER - - -#define CFF_MAX_STACK_DEPTH 96 - -#define CFF_CODE_TOPDICT 0x1000 -#define CFF_CODE_PRIVATE 0x2000 - - - typedef struct CFF_ParserRec_ - { - FT_Library library; - FT_Byte* start; - FT_Byte* limit; - FT_Byte* cursor; - - FT_Byte* stack[CFF_MAX_STACK_DEPTH + 1]; - FT_Byte** top; - - FT_UInt object_code; - void* object; - - } CFF_ParserRec, *CFF_Parser; - - - FT_LOCAL( void ) - cff_parser_init( CFF_Parser parser, - FT_UInt code, - void* object, - FT_Library library); - - FT_LOCAL( FT_Error ) - cff_parser_run( CFF_Parser parser, - FT_Byte* start, - FT_Byte* limit ); - - - enum - { - cff_kind_none = 0, - cff_kind_num, - cff_kind_fixed, - cff_kind_fixed_thousand, - cff_kind_string, - cff_kind_bool, - cff_kind_delta, - cff_kind_callback, - - cff_kind_max /* do not remove */ - }; - - - /* now generate handlers for the most simple fields */ - typedef FT_Error (*CFF_Field_Reader)( CFF_Parser parser ); - - typedef struct CFF_Field_Handler_ - { - int kind; - int code; - FT_UInt offset; - FT_Byte size; - CFF_Field_Reader reader; - FT_UInt array_max; - FT_UInt count_offset; - -#ifdef FT_DEBUG_LEVEL_TRACE - const char* id; -#endif - - } CFF_Field_Handler; - - -FT_END_HEADER - - -#endif /* __CFF_PARSE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cffpic.c b/3party/freetype/src/cff/cffpic.c deleted file mode 100644 index d40dec50e9..0000000000 --- a/3party/freetype/src/cff/cffpic.c +++ /dev/null @@ -1,138 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffpic.c */ -/* */ -/* The FreeType position independent code services for cff module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "cffcmap.h" -#include "cffpic.h" -#include "cfferrs.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from cffdrivr.c */ - FT_Error - FT_Create_Class_cff_services( FT_Library library, - FT_ServiceDescRec** output_class ); - void - FT_Destroy_Class_cff_services( FT_Library library, - FT_ServiceDescRec* clazz ); - void - FT_Init_Class_cff_service_ps_info( FT_Library library, - FT_Service_PsInfoRec* clazz ); - void - FT_Init_Class_cff_service_glyph_dict( FT_Library library, - FT_Service_GlyphDictRec* clazz ); - void - FT_Init_Class_cff_service_ps_name( FT_Library library, - FT_Service_PsFontNameRec* clazz ); - void - FT_Init_Class_cff_service_get_cmap_info( FT_Library library, - FT_Service_TTCMapsRec* clazz ); - void - FT_Init_Class_cff_service_cid_info( FT_Library library, - FT_Service_CIDRec* clazz ); - - /* forward declaration of PIC init functions from cffparse.c */ - FT_Error - FT_Create_Class_cff_field_handlers( FT_Library library, - CFF_Field_Handler** output_class ); - void - FT_Destroy_Class_cff_field_handlers( FT_Library library, - CFF_Field_Handler* clazz ); - - - void - cff_driver_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->cff ) - { - CffModulePIC* container = (CffModulePIC*)pic_container->cff; - - - if ( container->cff_services ) - FT_Destroy_Class_cff_services( library, - container->cff_services ); - container->cff_services = NULL; - if ( container->cff_field_handlers ) - FT_Destroy_Class_cff_field_handlers( - library, container->cff_field_handlers ); - container->cff_field_handlers = NULL; - FT_FREE( container ); - pic_container->cff = NULL; - } - } - - - FT_Error - cff_driver_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - CffModulePIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC ( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->cff = container; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - error = FT_Create_Class_cff_services( library, - &container->cff_services ); - if ( error ) - goto Exit; - - error = FT_Create_Class_cff_field_handlers( - library, &container->cff_field_handlers ); - if ( error ) - goto Exit; - - FT_Init_Class_cff_service_ps_info( - library, &container->cff_service_ps_info ); - FT_Init_Class_cff_service_glyph_dict( - library, &container->cff_service_glyph_dict ); - FT_Init_Class_cff_service_ps_name( - library, &container->cff_service_ps_name ); - FT_Init_Class_cff_service_get_cmap_info( - library, &container->cff_service_get_cmap_info ); - FT_Init_Class_cff_service_cid_info( - library, &container->cff_service_cid_info ); - FT_Init_Class_cff_cmap_encoding_class_rec( - library, &container->cff_cmap_encoding_class_rec ); - FT_Init_Class_cff_cmap_unicode_class_rec( - library, &container->cff_cmap_unicode_class_rec ); - - Exit: - if ( error ) - cff_driver_class_pic_free( library ); - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/3party/freetype/src/cff/cffpic.h b/3party/freetype/src/cff/cffpic.h deleted file mode 100644 index 9a221a7b7e..0000000000 --- a/3party/freetype/src/cff/cffpic.h +++ /dev/null @@ -1,108 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffpic.h */ -/* */ -/* The FreeType position independent code services for cff module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 __CFFPIC_H__ -#define __CFFPIC_H__ - - -#include FT_INTERNAL_PIC_H - - -#ifndef FT_CONFIG_OPTION_PIC - -#define CFF_SERVICE_PS_INFO_GET cff_service_ps_info -#define CFF_SERVICE_GLYPH_DICT_GET cff_service_glyph_dict -#define CFF_SERVICE_PS_NAME_GET cff_service_ps_name -#define CFF_SERVICE_GET_CMAP_INFO_GET cff_service_get_cmap_info -#define CFF_SERVICE_CID_INFO_GET cff_service_cid_info -#define CFF_SERVICE_PROPERTIES_GET cff_service_properties -#define CFF_SERVICES_GET cff_services -#define CFF_CMAP_ENCODING_CLASS_REC_GET cff_cmap_encoding_class_rec -#define CFF_CMAP_UNICODE_CLASS_REC_GET cff_cmap_unicode_class_rec -#define CFF_FIELD_HANDLERS_GET cff_field_handlers - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_SERVICE_GLYPH_DICT_H -#include "cffparse.h" -#include FT_SERVICE_POSTSCRIPT_INFO_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_TT_CMAP_H -#include FT_SERVICE_CID_H -#include FT_SERVICE_PROPERTIES_H - - -FT_BEGIN_HEADER - - typedef struct CffModulePIC_ - { - FT_ServiceDescRec* cff_services; - CFF_Field_Handler* cff_field_handlers; - FT_Service_PsInfoRec cff_service_ps_info; - FT_Service_GlyphDictRec cff_service_glyph_dict; - FT_Service_PsFontNameRec cff_service_ps_name; - FT_Service_TTCMapsRec cff_service_get_cmap_info; - FT_Service_CIDRec cff_service_cid_info; - FT_Service_PropertiesRec cff_service_properties; - FT_CMap_ClassRec cff_cmap_encoding_class_rec; - FT_CMap_ClassRec cff_cmap_unicode_class_rec; - - } CffModulePIC; - - -#define GET_PIC( lib ) \ - ( (CffModulePIC*)( (lib)->pic_container.cff ) ) - -#define CFF_SERVICE_PS_INFO_GET \ - ( GET_PIC( library )->cff_service_ps_info ) -#define CFF_SERVICE_GLYPH_DICT_GET \ - ( GET_PIC( library )->cff_service_glyph_dict ) -#define CFF_SERVICE_PS_NAME_GET \ - ( GET_PIC( library )->cff_service_ps_name ) -#define CFF_SERVICE_GET_CMAP_INFO_GET \ - ( GET_PIC( library )->cff_service_get_cmap_info ) -#define CFF_SERVICE_CID_INFO_GET \ - ( GET_PIC( library )->cff_service_cid_info ) -#define CFF_SERVICE_PROPERTIES_GET \ - ( GET_PIC( library )->cff_service_properties ) -#define CFF_SERVICES_GET \ - ( GET_PIC( library )->cff_services ) -#define CFF_CMAP_ENCODING_CLASS_REC_GET \ - ( GET_PIC( library )->cff_cmap_encoding_class_rec ) -#define CFF_CMAP_UNICODE_CLASS_REC_GET \ - ( GET_PIC( library )->cff_cmap_unicode_class_rec ) -#define CFF_FIELD_HANDLERS_GET \ - ( GET_PIC( library )->cff_field_handlers ) - - /* see cffpic.c for the implementation */ - void - cff_driver_class_pic_free( FT_Library library ); - - FT_Error - cff_driver_class_pic_init( FT_Library library ); - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* __CFFPIC_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/cfftoken.h b/3party/freetype/src/cff/cfftoken.h deleted file mode 100644 index 5b32076ab8..0000000000 --- a/3party/freetype/src/cff/cfftoken.h +++ /dev/null @@ -1,97 +0,0 @@ -/***************************************************************************/ -/* */ -/* cfftoken.h */ -/* */ -/* CFF token definitions (specification only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - -#undef FT_STRUCTURE -#define FT_STRUCTURE CFF_FontRecDictRec - -#undef CFFCODE -#define CFFCODE CFFCODE_TOPDICT - - CFF_FIELD_STRING ( 0, version, "Version" ) - CFF_FIELD_STRING ( 1, notice, "Notice" ) - CFF_FIELD_STRING ( 0x100, copyright, "Copyright" ) - CFF_FIELD_STRING ( 2, full_name, "FullName" ) - CFF_FIELD_STRING ( 3, family_name, "FamilyName" ) - CFF_FIELD_STRING ( 4, weight, "Weight" ) - CFF_FIELD_BOOL ( 0x101, is_fixed_pitch, "isFixedPitch" ) - CFF_FIELD_FIXED ( 0x102, italic_angle, "ItalicAngle" ) - CFF_FIELD_FIXED ( 0x103, underline_position, "UnderlinePosition" ) - CFF_FIELD_FIXED ( 0x104, underline_thickness, "UnderlineThickness" ) - CFF_FIELD_NUM ( 0x105, paint_type, "PaintType" ) - CFF_FIELD_NUM ( 0x106, charstring_type, "CharstringType" ) - CFF_FIELD_CALLBACK( 0x107, font_matrix, "FontMatrix" ) - CFF_FIELD_NUM ( 13, unique_id, "UniqueID" ) - CFF_FIELD_CALLBACK( 5, font_bbox, "FontBBox" ) - CFF_FIELD_NUM ( 0x108, stroke_width, "StrokeWidth" ) - CFF_FIELD_NUM ( 15, charset_offset, "charset" ) - CFF_FIELD_NUM ( 16, encoding_offset, "Encoding" ) - CFF_FIELD_NUM ( 17, charstrings_offset, "CharStrings" ) - CFF_FIELD_CALLBACK( 18, private_dict, "Private" ) - CFF_FIELD_NUM ( 0x114, synthetic_base, "SyntheticBase" ) - CFF_FIELD_STRING ( 0x115, embedded_postscript, "PostScript" ) - -#if 0 - CFF_FIELD_STRING ( 0x116, base_font_name, "BaseFontName" ) - CFF_FIELD_DELTA ( 0x117, base_font_blend, 16, "BaseFontBlend" ) - CFF_FIELD_CALLBACK( 0x118, multiple_master, "MultipleMaster" ) - CFF_FIELD_CALLBACK( 0x119, blend_axis_types, "BlendAxisTypes" ) -#endif - - CFF_FIELD_CALLBACK( 0x11E, cid_ros, "ROS" ) - CFF_FIELD_NUM ( 0x11F, cid_font_version, "CIDFontVersion" ) - CFF_FIELD_NUM ( 0x120, cid_font_revision, "CIDFontRevision" ) - CFF_FIELD_NUM ( 0x121, cid_font_type, "CIDFontType" ) - CFF_FIELD_NUM ( 0x122, cid_count, "CIDCount" ) - CFF_FIELD_NUM ( 0x123, cid_uid_base, "UIDBase" ) - CFF_FIELD_NUM ( 0x124, cid_fd_array_offset, "FDArray" ) - CFF_FIELD_NUM ( 0x125, cid_fd_select_offset, "FDSelect" ) - CFF_FIELD_STRING ( 0x126, cid_font_name, "FontName" ) - -#if 0 - CFF_FIELD_NUM ( 0x127, chameleon, "Chameleon" ) -#endif - - -#undef FT_STRUCTURE -#define FT_STRUCTURE CFF_PrivateRec -#undef CFFCODE -#define CFFCODE CFFCODE_PRIVATE - - CFF_FIELD_DELTA ( 6, blue_values, 14, "BlueValues" ) - CFF_FIELD_DELTA ( 7, other_blues, 10, "OtherBlues" ) - CFF_FIELD_DELTA ( 8, family_blues, 14, "FamilyBlues" ) - CFF_FIELD_DELTA ( 9, family_other_blues, 10, "FamilyOtherBlues" ) - CFF_FIELD_FIXED_1000( 0x109, blue_scale, "BlueScale" ) - CFF_FIELD_NUM ( 0x10A, blue_shift, "BlueShift" ) - CFF_FIELD_NUM ( 0x10B, blue_fuzz, "BlueFuzz" ) - CFF_FIELD_NUM ( 10, standard_width, "StdHW" ) - CFF_FIELD_NUM ( 11, standard_height, "StdVW" ) - CFF_FIELD_DELTA ( 0x10C, snap_widths, 13, "StemSnapH" ) - CFF_FIELD_DELTA ( 0x10D, snap_heights, 13, "StemSnapV" ) - CFF_FIELD_BOOL ( 0x10E, force_bold, "ForceBold" ) - CFF_FIELD_FIXED ( 0x10F, force_bold_threshold, "ForceBoldThreshold" ) - CFF_FIELD_NUM ( 0x110, lenIV, "lenIV" ) - CFF_FIELD_NUM ( 0x111, language_group, "LanguageGroup" ) - CFF_FIELD_FIXED ( 0x112, expansion_factor, "ExpansionFactor" ) - CFF_FIELD_NUM ( 0x113, initial_random_seed, "initialRandomSeed" ) - CFF_FIELD_NUM ( 19, local_subrs_offset, "Subrs" ) - CFF_FIELD_NUM ( 20, default_width, "defaultWidthX" ) - CFF_FIELD_NUM ( 21, nominal_width, "nominalWidthX" ) - - -/* END */ diff --git a/3party/freetype/src/cff/cfftypes.h b/3party/freetype/src/cff/cfftypes.h deleted file mode 100644 index de8a5ee9b4..0000000000 --- a/3party/freetype/src/cff/cfftypes.h +++ /dev/null @@ -1,284 +0,0 @@ -/***************************************************************************/ -/* */ -/* cfftypes.h */ -/* */ -/* Basic OpenType/CFF type definitions and interface (specification */ -/* only). */ -/* */ -/* Copyright 1996-2015 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 __CFFTYPES_H__ -#define __CFFTYPES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_TYPE1_TABLES_H -#include FT_INTERNAL_SERVICE_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CFF_IndexRec */ - /* */ - /* <Description> */ - /* A structure used to model a CFF Index table. */ - /* */ - /* <Fields> */ - /* stream :: The source input stream. */ - /* */ - /* start :: The position of the first index byte in the */ - /* input stream. */ - /* */ - /* count :: The number of elements in the index. */ - /* */ - /* off_size :: The size in bytes of object offsets in index. */ - /* */ - /* data_offset :: The position of first data byte in the index's */ - /* bytes. */ - /* */ - /* data_size :: The size of the data table in this index. */ - /* */ - /* offsets :: A table of element offsets in the index. Must be */ - /* loaded explicitly. */ - /* */ - /* bytes :: If the index is loaded in memory, its bytes. */ - /* */ - typedef struct CFF_IndexRec_ - { - FT_Stream stream; - FT_ULong start; - FT_UInt count; - FT_Byte off_size; - FT_ULong data_offset; - FT_ULong data_size; - - FT_ULong* offsets; - FT_Byte* bytes; - - } CFF_IndexRec, *CFF_Index; - - - typedef struct CFF_EncodingRec_ - { - FT_UInt format; - FT_ULong offset; - - FT_UInt count; - FT_UShort sids [256]; /* avoid dynamic allocations */ - FT_UShort codes[256]; - - } CFF_EncodingRec, *CFF_Encoding; - - - typedef struct CFF_CharsetRec_ - { - - FT_UInt format; - FT_ULong offset; - - FT_UShort* sids; - FT_UShort* cids; /* the inverse mapping of `sids'; only needed */ - /* for CID-keyed fonts */ - FT_UInt max_cid; - FT_UInt num_glyphs; - - } CFF_CharsetRec, *CFF_Charset; - - - typedef struct CFF_FontRecDictRec_ - { - FT_UInt version; - FT_UInt notice; - FT_UInt copyright; - FT_UInt full_name; - FT_UInt family_name; - FT_UInt weight; - FT_Bool is_fixed_pitch; - FT_Fixed italic_angle; - FT_Fixed underline_position; - FT_Fixed underline_thickness; - FT_Int paint_type; - FT_Int charstring_type; - FT_Matrix font_matrix; - FT_Bool has_font_matrix; - FT_ULong units_per_em; /* temporarily used as scaling value also */ - FT_Vector font_offset; - FT_ULong unique_id; - FT_BBox font_bbox; - FT_Pos stroke_width; - FT_ULong charset_offset; - FT_ULong encoding_offset; - FT_ULong charstrings_offset; - FT_ULong private_offset; - FT_ULong private_size; - FT_Long synthetic_base; - FT_UInt embedded_postscript; - - /* these should only be used for the top-level font dictionary */ - FT_UInt cid_registry; - FT_UInt cid_ordering; - FT_Long cid_supplement; - - FT_Long cid_font_version; - FT_Long cid_font_revision; - FT_Long cid_font_type; - FT_ULong cid_count; - FT_ULong cid_uid_base; - FT_ULong cid_fd_array_offset; - FT_ULong cid_fd_select_offset; - FT_UInt cid_font_name; - - } CFF_FontRecDictRec, *CFF_FontRecDict; - - - typedef struct CFF_PrivateRec_ - { - FT_Byte num_blue_values; - FT_Byte num_other_blues; - FT_Byte num_family_blues; - FT_Byte num_family_other_blues; - - FT_Pos blue_values[14]; - FT_Pos other_blues[10]; - FT_Pos family_blues[14]; - FT_Pos family_other_blues[10]; - - FT_Fixed blue_scale; - FT_Pos blue_shift; - FT_Pos blue_fuzz; - FT_Pos standard_width; - FT_Pos standard_height; - - FT_Byte num_snap_widths; - FT_Byte num_snap_heights; - FT_Pos snap_widths[13]; - FT_Pos snap_heights[13]; - FT_Bool force_bold; - FT_Fixed force_bold_threshold; - FT_Int lenIV; - FT_Int language_group; - FT_Fixed expansion_factor; - FT_Long initial_random_seed; - FT_ULong local_subrs_offset; - FT_Pos default_width; - FT_Pos nominal_width; - - } CFF_PrivateRec, *CFF_Private; - - - typedef struct CFF_FDSelectRec_ - { - FT_Byte format; - FT_UInt range_count; - - /* that's the table, taken from the file `as is' */ - FT_Byte* data; - FT_UInt data_size; - - /* small cache for format 3 only */ - FT_UInt cache_first; - FT_UInt cache_count; - FT_Byte cache_fd; - - } CFF_FDSelectRec, *CFF_FDSelect; - - - /* A SubFont packs a font dict and a private dict together. They are */ - /* needed to support CID-keyed CFF fonts. */ - typedef struct CFF_SubFontRec_ - { - CFF_FontRecDictRec font_dict; - CFF_PrivateRec private_dict; - - CFF_IndexRec local_subrs_index; - FT_Byte** local_subrs; /* array of pointers into Local Subrs INDEX data */ - - } CFF_SubFontRec, *CFF_SubFont; - - -#define CFF_MAX_CID_FONTS 256 - - - typedef struct CFF_FontRec_ - { - FT_Stream stream; - FT_Memory memory; - FT_UInt num_faces; - FT_UInt num_glyphs; - - FT_Byte version_major; - FT_Byte version_minor; - FT_Byte header_size; - FT_Byte absolute_offsize; - - - CFF_IndexRec name_index; - CFF_IndexRec top_dict_index; - CFF_IndexRec global_subrs_index; - - CFF_EncodingRec encoding; - CFF_CharsetRec charset; - - CFF_IndexRec charstrings_index; - CFF_IndexRec font_dict_index; - CFF_IndexRec private_index; - CFF_IndexRec local_subrs_index; - - FT_String* font_name; - - /* array of pointers into Global Subrs INDEX data */ - FT_Byte** global_subrs; - - /* array of pointers into String INDEX data stored at string_pool */ - FT_UInt num_strings; - FT_Byte** strings; - FT_Byte* string_pool; - - CFF_SubFontRec top_font; - FT_UInt num_subfonts; - CFF_SubFont subfonts[CFF_MAX_CID_FONTS]; - - CFF_FDSelectRec fd_select; - - /* interface to PostScript hinter */ - PSHinter_Service pshinter; - - /* interface to Postscript Names service */ - FT_Service_PsCMaps psnames; - - /* since version 2.3.0 */ - PS_FontInfoRec* font_info; /* font info dictionary */ - - /* since version 2.3.6 */ - FT_String* registry; - FT_String* ordering; - - /* since version 2.4.12 */ - FT_Generic cf2_instance; - - } CFF_FontRec, *CFF_Font; - - -FT_END_HEADER - -#endif /* __CFFTYPES_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cff/module.mk b/3party/freetype/src/cff/module.mk deleted file mode 100644 index ba08ebcb79..0000000000 --- a/3party/freetype/src/cff/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 CFF module definition -# - - -# Copyright 1996-2015 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. - - -FTMODULE_H_COMMANDS += CFF_DRIVER - -define CFF_DRIVER -$(OPEN_DRIVER) FT_Driver_ClassRec, cff_driver_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)cff $(ECHO_DRIVER_DESC)OpenType fonts with extension *.otf$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/cff/rules.mk b/3party/freetype/src/cff/rules.mk deleted file mode 100644 index 7f6e857e28..0000000000 --- a/3party/freetype/src/cff/rules.mk +++ /dev/null @@ -1,89 +0,0 @@ -# -# FreeType 2 OpenType/CFF driver configuration rules -# - - -# Copyright 1996-2015 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. - - -# OpenType driver directory -# -CFF_DIR := $(SRC_DIR)/cff - - -CFF_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(CFF_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# CFF driver sources (i.e., C files) -# -CFF_DRV_SRC := $(CFF_DIR)/cffcmap.c \ - $(CFF_DIR)/cffdrivr.c \ - $(CFF_DIR)/cffgload.c \ - $(CFF_DIR)/cffload.c \ - $(CFF_DIR)/cffobjs.c \ - $(CFF_DIR)/cffparse.c \ - $(CFF_DIR)/cffpic.c \ - $(CFF_DIR)/cf2arrst.c \ - $(CFF_DIR)/cf2blues.c \ - $(CFF_DIR)/cf2error.c \ - $(CFF_DIR)/cf2font.c \ - $(CFF_DIR)/cf2ft.c \ - $(CFF_DIR)/cf2hints.c \ - $(CFF_DIR)/cf2intrp.c \ - $(CFF_DIR)/cf2read.c \ - $(CFF_DIR)/cf2stack.c - - -# CFF driver headers -# -CFF_DRV_H := $(CFF_DRV_SRC:%.c=%.h) \ - $(CFF_DIR)/cfferrs.h \ - $(CFF_DIR)/cfftoken.h \ - $(CFF_DIR)/cfftypes.h \ - $(CFF_DIR)/cf2fixed.h \ - $(CFF_DIR)/cf2glue.h \ - $(CFF_DIR)/cf2types.h - - -# CFF driver object(s) -# -# CFF_DRV_OBJ_M is used during `multi' builds -# CFF_DRV_OBJ_S is used during `single' builds -# -CFF_DRV_OBJ_M := $(CFF_DRV_SRC:$(CFF_DIR)/%.c=$(OBJ_DIR)/%.$O) -CFF_DRV_OBJ_S := $(OBJ_DIR)/cff.$O - -# CFF driver source file for single build -# -CFF_DRV_SRC_S := $(CFF_DIR)/cff.c - - -# CFF driver - single object -# -$(CFF_DRV_OBJ_S): $(CFF_DRV_SRC_S) $(CFF_DRV_SRC) $(FREETYPE_H) $(CFF_DRV_H) - $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CFF_DRV_SRC_S)) - - -# CFF driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(CFF_DIR)/%.c $(FREETYPE_H) $(CFF_DRV_H) - $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(CFF_DRV_OBJ_S) -DRV_OBJS_M += $(CFF_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/cid/Jamfile b/3party/freetype/src/cid/Jamfile deleted file mode 100644 index 64e1523157..0000000000 --- a/3party/freetype/src/cid/Jamfile +++ /dev/null @@ -1,34 +0,0 @@ -# FreeType 2 src/cid Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) cid ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = cidgload - cidload - cidobjs - cidparse - cidriver - ; - } - else - { - _sources = type1cid ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/cid Jamfile diff --git a/3party/freetype/src/cid/ciderrs.h b/3party/freetype/src/cid/ciderrs.h deleted file mode 100644 index 5e0e776ee1..0000000000 --- a/3party/freetype/src/cid/ciderrs.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* ciderrs.h */ -/* */ -/* CID error codes (specification only). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the CID error enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __CIDERRS_H__ -#define __CIDERRS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX CID_Err_ -#define FT_ERR_BASE FT_Mod_Err_CID - -#include FT_ERRORS_H - -#endif /* __CIDERRS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cid/cidgload.c b/3party/freetype/src/cid/cidgload.c deleted file mode 100644 index d00674fe0d..0000000000 --- a/3party/freetype/src/cid/cidgload.c +++ /dev/null @@ -1,446 +0,0 @@ -/***************************************************************************/ -/* */ -/* cidgload.c */ -/* */ -/* CID-keyed Type1 Glyph Loader (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include "cidload.h" -#include "cidgload.h" -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_OUTLINE_H -#include FT_INTERNAL_CALC_H - -#include "ciderrs.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cidgload - - - FT_CALLBACK_DEF( FT_Error ) - cid_load_glyph( T1_Decoder decoder, - FT_UInt glyph_index ) - { - CID_Face face = (CID_Face)decoder->builder.face; - CID_FaceInfo cid = &face->cid; - FT_Byte* p; - FT_ULong fd_select; - FT_Stream stream = face->cid_stream; - FT_Error error = FT_Err_Ok; - FT_Byte* charstring = NULL; - FT_Memory memory = face->root.memory; - FT_ULong glyph_length = 0; - PSAux_Service psaux = (PSAux_Service)face->psaux; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - FT_Incremental_InterfaceRec *inc = - face->root.internal->incremental_interface; -#endif - - - FT_TRACE1(( "cid_load_glyph: glyph index %d\n", glyph_index )); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - /* For incremental fonts get the character data using */ - /* the callback function. */ - if ( inc ) - { - FT_Data glyph_data; - - - error = inc->funcs->get_glyph_data( inc->object, - glyph_index, &glyph_data ); - if ( error ) - goto Exit; - - p = (FT_Byte*)glyph_data.pointer; - fd_select = cid_get_offset( &p, (FT_Byte)cid->fd_bytes ); - - if ( glyph_data.length != 0 ) - { - glyph_length = (FT_ULong)( glyph_data.length - cid->fd_bytes ); - (void)FT_ALLOC( charstring, glyph_length ); - if ( !error ) - ft_memcpy( charstring, glyph_data.pointer + cid->fd_bytes, - glyph_length ); - } - - inc->funcs->free_glyph_data( inc->object, &glyph_data ); - - if ( error ) - goto Exit; - } - - else - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - /* For ordinary fonts read the CID font dictionary index */ - /* and charstring offset from the CIDMap. */ - { - FT_UInt entry_len = (FT_UInt)( cid->fd_bytes + cid->gd_bytes ); - FT_ULong off1; - - - if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset + - glyph_index * entry_len ) || - FT_FRAME_ENTER( 2 * entry_len ) ) - goto Exit; - - p = (FT_Byte*)stream->cursor; - fd_select = cid_get_offset( &p, (FT_Byte)cid->fd_bytes ); - off1 = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ); - p += cid->fd_bytes; - glyph_length = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ) - off1; - FT_FRAME_EXIT(); - - if ( fd_select >= (FT_ULong)cid->num_dicts ) - { - error = FT_THROW( Invalid_Offset ); - goto Exit; - } - if ( glyph_length == 0 ) - goto Exit; - if ( FT_ALLOC( charstring, glyph_length ) ) - goto Exit; - if ( FT_STREAM_READ_AT( cid->data_offset + off1, - charstring, glyph_length ) ) - goto Exit; - } - - /* Now set up the subrs array and parse the charstrings. */ - { - CID_FaceDict dict; - CID_Subrs cid_subrs = face->subrs + fd_select; - FT_UInt cs_offset; - - - /* Set up subrs */ - decoder->num_subrs = cid_subrs->num_subrs; - decoder->subrs = cid_subrs->code; - decoder->subrs_len = 0; - - /* Set up font matrix */ - dict = cid->font_dicts + fd_select; - - decoder->font_matrix = dict->font_matrix; - decoder->font_offset = dict->font_offset; - decoder->lenIV = dict->private_dict.lenIV; - - /* Decode the charstring. */ - - /* Adjustment for seed bytes. */ - cs_offset = decoder->lenIV >= 0 ? (FT_UInt)decoder->lenIV : 0; - - /* Decrypt only if lenIV >= 0. */ - if ( decoder->lenIV >= 0 ) - psaux->t1_decrypt( charstring, glyph_length, 4330 ); - - error = decoder->funcs.parse_charstrings( - decoder, charstring + cs_offset, - glyph_length - cs_offset ); - } - - FT_FREE( charstring ); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - /* Incremental fonts can optionally override the metrics. */ - if ( !error && inc && inc->funcs->get_glyph_metrics ) - { - FT_Incremental_MetricsRec metrics; - - - metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x ); - metrics.bearing_y = 0; - metrics.advance = FIXED_TO_INT( decoder->builder.advance.x ); - metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y ); - - error = inc->funcs->get_glyph_metrics( inc->object, - glyph_index, FALSE, &metrics ); - - decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x ); - decoder->builder.advance.x = INT_TO_FIXED( metrics.advance ); - decoder->builder.advance.y = INT_TO_FIXED( metrics.advance_v ); - } - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - Exit: - return error; - } - - -#if 0 - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /********** *********/ - /********** *********/ - /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ - /********** *********/ - /********** The following code is in charge of computing *********/ - /********** the maximum advance width of the font. It *********/ - /********** quickly processes each glyph charstring to *********/ - /********** extract the value from either a `sbw' or `seac' *********/ - /********** operator. *********/ - /********** *********/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_LOCAL_DEF( FT_Error ) - cid_face_compute_max_advance( CID_Face face, - FT_Int* max_advance ) - { - FT_Error error; - T1_DecoderRec decoder; - FT_Int glyph_index; - - PSAux_Service psaux = (PSAux_Service)face->psaux; - - - *max_advance = 0; - - /* Initialize load decoder */ - error = psaux->t1_decoder_funcs->init( &decoder, - (FT_Face)face, - 0, /* size */ - 0, /* glyph slot */ - 0, /* glyph names! XXX */ - 0, /* blend == 0 */ - 0, /* hinting == 0 */ - cid_load_glyph ); - if ( error ) - return error; - - /* TODO: initialize decoder.len_buildchar and decoder.buildchar */ - /* if we ever support CID-keyed multiple master fonts */ - - decoder.builder.metrics_only = 1; - decoder.builder.load_points = 0; - - /* for each glyph, parse the glyph charstring and extract */ - /* the advance width */ - for ( glyph_index = 0; glyph_index < face->root.num_glyphs; - glyph_index++ ) - { - /* now get load the unscaled outline */ - error = cid_load_glyph( &decoder, glyph_index ); - /* ignore the error if one occurred - skip to next glyph */ - } - - *max_advance = FIXED_TO_INT( decoder.builder.advance.x ); - - psaux->t1_decoder_funcs->done( &decoder ); - - return FT_Err_Ok; - } - - -#endif /* 0 */ - - - FT_LOCAL_DEF( FT_Error ) - cid_slot_load_glyph( FT_GlyphSlot cidglyph, /* CID_GlyphSlot */ - FT_Size cidsize, /* CID_Size */ - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - CID_GlyphSlot glyph = (CID_GlyphSlot)cidglyph; - FT_Error error; - T1_DecoderRec decoder; - CID_Face face = (CID_Face)cidglyph->face; - FT_Bool hinting; - - PSAux_Service psaux = (PSAux_Service)face->psaux; - FT_Matrix font_matrix; - FT_Vector font_offset; - - - if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - if ( load_flags & FT_LOAD_NO_RECURSE ) - load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; - - glyph->x_scale = cidsize->metrics.x_scale; - glyph->y_scale = cidsize->metrics.y_scale; - - cidglyph->outline.n_points = 0; - cidglyph->outline.n_contours = 0; - - hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 && - ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); - - cidglyph->format = FT_GLYPH_FORMAT_OUTLINE; - - error = psaux->t1_decoder_funcs->init( &decoder, - cidglyph->face, - cidsize, - cidglyph, - 0, /* glyph names -- XXX */ - 0, /* blend == 0 */ - hinting, - FT_LOAD_TARGET_MODE( load_flags ), - cid_load_glyph ); - if ( error ) - goto Exit; - - /* TODO: initialize decoder.len_buildchar and decoder.buildchar */ - /* if we ever support CID-keyed multiple master fonts */ - - /* set up the decoder */ - decoder.builder.no_recurse = FT_BOOL( - ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ) ); - - error = cid_load_glyph( &decoder, glyph_index ); - if ( error ) - goto Exit; - - font_matrix = decoder.font_matrix; - font_offset = decoder.font_offset; - - /* save new glyph tables */ - psaux->t1_decoder_funcs->done( &decoder ); - - /* now set the metrics -- this is rather simple, as */ - /* the left side bearing is the xMin, and the top side */ - /* bearing the yMax */ - cidglyph->outline.flags &= FT_OUTLINE_OWNER; - cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL; - - /* for composite glyphs, return only left side bearing and */ - /* advance width */ - if ( load_flags & FT_LOAD_NO_RECURSE ) - { - FT_Slot_Internal internal = cidglyph->internal; - - - cidglyph->metrics.horiBearingX = - FIXED_TO_INT( decoder.builder.left_bearing.x ); - cidglyph->metrics.horiAdvance = - FIXED_TO_INT( decoder.builder.advance.x ); - - internal->glyph_matrix = font_matrix; - internal->glyph_delta = font_offset; - internal->glyph_transformed = 1; - } - else - { - FT_BBox cbox; - FT_Glyph_Metrics* metrics = &cidglyph->metrics; - - - /* copy the _unscaled_ advance width */ - metrics->horiAdvance = - FIXED_TO_INT( decoder.builder.advance.x ); - cidglyph->linearHoriAdvance = - FIXED_TO_INT( decoder.builder.advance.x ); - cidglyph->internal->glyph_transformed = 0; - - /* make up vertical ones */ - metrics->vertAdvance = ( face->cid.font_bbox.yMax - - face->cid.font_bbox.yMin ) >> 16; - cidglyph->linearVertAdvance = metrics->vertAdvance; - - cidglyph->format = FT_GLYPH_FORMAT_OUTLINE; - - if ( cidsize->metrics.y_ppem < 24 ) - cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; - - /* apply the font matrix, if any */ - if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L || - font_matrix.xy != 0 || font_matrix.yx != 0 ) - { - FT_Outline_Transform( &cidglyph->outline, &font_matrix ); - - metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, - font_matrix.xx ); - metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, - font_matrix.yy ); - } - - if ( font_offset.x || font_offset.y ) - { - FT_Outline_Translate( &cidglyph->outline, - font_offset.x, - font_offset.y ); - - metrics->horiAdvance += font_offset.x; - metrics->vertAdvance += font_offset.y; - } - - if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ) - { - /* scale the outline and the metrics */ - FT_Int n; - FT_Outline* cur = decoder.builder.base; - FT_Vector* vec = cur->points; - FT_Fixed x_scale = glyph->x_scale; - FT_Fixed y_scale = glyph->y_scale; - - - /* First of all, scale the points */ - if ( !hinting || !decoder.builder.hints_funcs ) - for ( n = cur->n_points; n > 0; n--, vec++ ) - { - vec->x = FT_MulFix( vec->x, x_scale ); - vec->y = FT_MulFix( vec->y, y_scale ); - } - - /* Then scale the metrics */ - metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); - metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); - } - - /* compute the other metrics */ - FT_Outline_Get_CBox( &cidglyph->outline, &cbox ); - - metrics->width = cbox.xMax - cbox.xMin; - metrics->height = cbox.yMax - cbox.yMin; - - metrics->horiBearingX = cbox.xMin; - metrics->horiBearingY = cbox.yMax; - - if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) - { - /* make up vertical ones */ - ft_synthesize_vertical_metrics( metrics, - metrics->vertAdvance ); - } - } - - Exit: - return error; - } - - -/* END */ diff --git a/3party/freetype/src/cid/cidgload.h b/3party/freetype/src/cid/cidgload.h deleted file mode 100644 index 4a10ce505c..0000000000 --- a/3party/freetype/src/cid/cidgload.h +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************/ -/* */ -/* cidgload.h */ -/* */ -/* OpenType Glyph Loader (specification). */ -/* */ -/* Copyright 1996-2015 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 __CIDGLOAD_H__ -#define __CIDGLOAD_H__ - - -#include <ft2build.h> -#include "cidobjs.h" - - -FT_BEGIN_HEADER - - -#if 0 - - /* Compute the maximum advance width of a font through quick parsing */ - FT_LOCAL( FT_Error ) - cid_face_compute_max_advance( CID_Face face, - FT_Int* max_advance ); - -#endif /* 0 */ - - FT_LOCAL( FT_Error ) - cid_slot_load_glyph( FT_GlyphSlot glyph, /* CID_Glyph_Slot */ - FT_Size size, /* CID_Size */ - FT_UInt glyph_index, - FT_Int32 load_flags ); - - -FT_END_HEADER - -#endif /* __CIDGLOAD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cid/cidload.c b/3party/freetype/src/cid/cidload.c deleted file mode 100644 index e23b82f673..0000000000 --- a/3party/freetype/src/cid/cidload.c +++ /dev/null @@ -1,705 +0,0 @@ -/***************************************************************************/ -/* */ -/* cidload.c */ -/* */ -/* CID-keyed Type1 font loader (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_CONFIG_CONFIG_H -#include FT_MULTIPLE_MASTERS_H -#include FT_INTERNAL_TYPE1_TYPES_H - -#include "cidload.h" - -#include "ciderrs.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cidload - - - /* read a single offset */ - FT_LOCAL_DEF( FT_ULong ) - cid_get_offset( FT_Byte* *start, - FT_Byte offsize ) - { - FT_ULong result; - FT_Byte* p = *start; - - - for ( result = 0; offsize > 0; offsize-- ) - { - result <<= 8; - result |= *p++; - } - - *start = p; - return result; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE 1 SYMBOL PARSING *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - static FT_Error - cid_load_keyword( CID_Face face, - CID_Loader* loader, - const T1_Field keyword ) - { - FT_Error error; - CID_Parser* parser = &loader->parser; - FT_Byte* object; - void* dummy_object; - CID_FaceInfo cid = &face->cid; - - - /* if the keyword has a dedicated callback, call it */ - if ( keyword->type == T1_FIELD_TYPE_CALLBACK ) - { - keyword->reader( (FT_Face)face, parser ); - error = parser->root.error; - goto Exit; - } - - /* we must now compute the address of our target object */ - switch ( keyword->location ) - { - case T1_FIELD_LOCATION_CID_INFO: - object = (FT_Byte*)cid; - break; - - case T1_FIELD_LOCATION_FONT_INFO: - object = (FT_Byte*)&cid->font_info; - break; - - case T1_FIELD_LOCATION_FONT_EXTRA: - object = (FT_Byte*)&face->font_extra; - break; - - case T1_FIELD_LOCATION_BBOX: - object = (FT_Byte*)&cid->font_bbox; - break; - - default: - { - CID_FaceDict dict; - - - if ( parser->num_dict < 0 || parser->num_dict >= cid->num_dicts ) - { - FT_ERROR(( "cid_load_keyword: invalid use of `%s'\n", - keyword->ident )); - error = FT_THROW( Syntax_Error ); - goto Exit; - } - - dict = cid->font_dicts + parser->num_dict; - switch ( keyword->location ) - { - case T1_FIELD_LOCATION_PRIVATE: - object = (FT_Byte*)&dict->private_dict; - break; - - default: - object = (FT_Byte*)dict; - } - } - } - - dummy_object = object; - - /* now, load the keyword data in the object's field(s) */ - if ( keyword->type == T1_FIELD_TYPE_INTEGER_ARRAY || - keyword->type == T1_FIELD_TYPE_FIXED_ARRAY ) - error = cid_parser_load_field_table( &loader->parser, keyword, - &dummy_object ); - else - error = cid_parser_load_field( &loader->parser, - keyword, &dummy_object ); - Exit: - return error; - } - - - FT_CALLBACK_DEF( FT_Error ) - cid_parse_font_matrix( CID_Face face, - CID_Parser* parser ) - { - CID_FaceDict dict; - FT_Face root = (FT_Face)&face->root; - FT_Fixed temp[6]; - FT_Fixed temp_scale; - - - if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts ) - { - FT_Matrix* matrix; - FT_Vector* offset; - FT_Int result; - - - dict = face->cid.font_dicts + parser->num_dict; - matrix = &dict->font_matrix; - offset = &dict->font_offset; - - /* input is scaled by 1000 to accommodate default FontMatrix */ - result = cid_parser_to_fixed_array( parser, 6, temp, 3 ); - - if ( result < 6 ) - return FT_THROW( Invalid_File_Format ); - - temp_scale = FT_ABS( temp[3] ); - - if ( temp_scale == 0 ) - { - FT_ERROR(( "cid_parse_font_matrix: invalid font matrix\n" )); - return FT_THROW( Invalid_File_Format ); - } - - /* atypical case */ - if ( temp_scale != 0x10000L ) - { - /* set units per EM based on FontMatrix values */ - root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale ); - - temp[0] = FT_DivFix( temp[0], temp_scale ); - temp[1] = FT_DivFix( temp[1], temp_scale ); - temp[2] = FT_DivFix( temp[2], temp_scale ); - temp[4] = FT_DivFix( temp[4], temp_scale ); - temp[5] = FT_DivFix( temp[5], temp_scale ); - temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L; - } - - matrix->xx = temp[0]; - matrix->yx = temp[1]; - matrix->xy = temp[2]; - matrix->yy = temp[3]; - - /* note that the font offsets are expressed in integer font units */ - offset->x = temp[4] >> 16; - offset->y = temp[5] >> 16; - } - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_Error ) - parse_fd_array( CID_Face face, - CID_Parser* parser ) - { - CID_FaceInfo cid = &face->cid; - FT_Memory memory = face->root.memory; - FT_Error error = FT_Err_Ok; - FT_Long num_dicts; - - - num_dicts = cid_parser_to_int( parser ); - if ( num_dicts < 0 ) - { - FT_ERROR(( "parse_fd_array: invalid number of dictionaries\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - if ( !cid->font_dicts ) - { - FT_Int n; - - - if ( FT_NEW_ARRAY( cid->font_dicts, num_dicts ) ) - goto Exit; - - cid->num_dicts = num_dicts; - - /* don't forget to set a few defaults */ - for ( n = 0; n < cid->num_dicts; n++ ) - { - CID_FaceDict dict = cid->font_dicts + n; - - - /* default value for lenIV */ - dict->private_dict.lenIV = 4; - } - } - - Exit: - return error; - } - - - /* by mistake, `expansion_factor' appears both in PS_PrivateRec */ - /* and CID_FaceDictRec (both are public header files and can't */ - /* changed); we simply copy the value */ - - FT_CALLBACK_DEF( FT_Error ) - parse_expansion_factor( CID_Face face, - CID_Parser* parser ) - { - CID_FaceDict dict; - - - if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts ) - { - dict = face->cid.font_dicts + parser->num_dict; - - dict->expansion_factor = cid_parser_to_fixed( parser, 0 ); - dict->private_dict.expansion_factor = dict->expansion_factor; - } - - return FT_Err_Ok; - } - - - static - const T1_FieldRec cid_field_records[] = - { - -#include "cidtoken.h" - - T1_FIELD_CALLBACK( "FDArray", parse_fd_array, 0 ) - T1_FIELD_CALLBACK( "FontMatrix", cid_parse_font_matrix, 0 ) - T1_FIELD_CALLBACK( "ExpansionFactor", parse_expansion_factor, 0 ) - - { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 } - }; - - - static FT_Error - cid_parse_dict( CID_Face face, - CID_Loader* loader, - FT_Byte* base, - FT_ULong size ) - { - CID_Parser* parser = &loader->parser; - - - parser->root.cursor = base; - parser->root.limit = base + size; - parser->root.error = FT_Err_Ok; - - { - FT_Byte* cur = base; - FT_Byte* limit = cur + size; - - - for (;;) - { - FT_Byte* newlimit; - - - parser->root.cursor = cur; - cid_parser_skip_spaces( parser ); - - if ( parser->root.cursor >= limit ) - newlimit = limit - 1 - 17; - else - newlimit = parser->root.cursor - 17; - - /* look for `%ADOBeginFontDict' */ - for ( ; cur < newlimit; cur++ ) - { - if ( *cur == '%' && - ft_strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 ) - { - /* if /FDArray was found, then cid->num_dicts is > 0, and */ - /* we can start increasing parser->num_dict */ - if ( face->cid.num_dicts > 0 ) - parser->num_dict++; - } - } - - cur = parser->root.cursor; - /* no error can occur in cid_parser_skip_spaces */ - if ( cur >= limit ) - break; - - cid_parser_skip_PS_token( parser ); - if ( parser->root.cursor >= limit || parser->root.error ) - break; - - /* look for immediates */ - if ( *cur == '/' && cur + 2 < limit ) - { - FT_UInt len; - - - cur++; - len = (FT_UInt)( parser->root.cursor - cur ); - - if ( len > 0 && len < 22 ) - { - /* now compare the immediate name to the keyword table */ - T1_Field keyword = (T1_Field)cid_field_records; - - - for (;;) - { - FT_Byte* name; - - - name = (FT_Byte*)keyword->ident; - if ( !name ) - break; - - if ( cur[0] == name[0] && - len == ft_strlen( (const char*)name ) ) - { - FT_UInt n; - - - for ( n = 1; n < len; n++ ) - if ( cur[n] != name[n] ) - break; - - if ( n >= len ) - { - /* we found it - run the parsing callback */ - parser->root.error = cid_load_keyword( face, - loader, - keyword ); - if ( parser->root.error ) - return parser->root.error; - break; - } - } - keyword++; - } - } - } - - cur = parser->root.cursor; - } - } - return parser->root.error; - } - - - /* read the subrmap and the subrs of each font dict */ - static FT_Error - cid_read_subrs( CID_Face face ) - { - CID_FaceInfo cid = &face->cid; - FT_Memory memory = face->root.memory; - FT_Stream stream = face->cid_stream; - FT_Error error; - FT_Int n; - CID_Subrs subr; - FT_UInt max_offsets = 0; - FT_ULong* offsets = NULL; - PSAux_Service psaux = (PSAux_Service)face->psaux; - - - if ( FT_NEW_ARRAY( face->subrs, cid->num_dicts ) ) - goto Exit; - - subr = face->subrs; - for ( n = 0; n < cid->num_dicts; n++, subr++ ) - { - CID_FaceDict dict = cid->font_dicts + n; - FT_Int lenIV = dict->private_dict.lenIV; - FT_UInt count, num_subrs = dict->num_subrs; - FT_ULong data_len; - FT_Byte* p; - - - /* Check for possible overflow. */ - if ( num_subrs == FT_UINT_MAX ) - { - error = FT_THROW( Syntax_Error ); - goto Fail; - } - - /* reallocate offsets array if needed */ - if ( num_subrs + 1 > max_offsets ) - { - FT_UInt new_max = FT_PAD_CEIL( num_subrs + 1, 4 ); - - - if ( new_max <= max_offsets ) - { - error = FT_THROW( Syntax_Error ); - goto Fail; - } - - if ( FT_RENEW_ARRAY( offsets, max_offsets, new_max ) ) - goto Fail; - - max_offsets = new_max; - } - - /* read the subrmap's offsets */ - if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) || - FT_FRAME_ENTER( ( num_subrs + 1 ) * (FT_UInt)dict->sd_bytes ) ) - goto Fail; - - p = (FT_Byte*)stream->cursor; - for ( count = 0; count <= num_subrs; count++ ) - offsets[count] = cid_get_offset( &p, (FT_Byte)dict->sd_bytes ); - - FT_FRAME_EXIT(); - - /* offsets must be ordered */ - for ( count = 1; count <= num_subrs; count++ ) - if ( offsets[count - 1] > offsets[count] ) - goto Fail; - - /* now, compute the size of subrs charstrings, */ - /* allocate, and read them */ - data_len = offsets[num_subrs] - offsets[0]; - - if ( FT_NEW_ARRAY( subr->code, num_subrs + 1 ) || - FT_ALLOC( subr->code[0], data_len ) ) - goto Fail; - - if ( FT_STREAM_SEEK( cid->data_offset + offsets[0] ) || - FT_STREAM_READ( subr->code[0], data_len ) ) - goto Fail; - - /* set up pointers */ - for ( count = 1; count <= num_subrs; count++ ) - { - FT_ULong len; - - - len = offsets[count] - offsets[count - 1]; - subr->code[count] = subr->code[count - 1] + len; - } - - /* decrypt subroutines, but only if lenIV >= 0 */ - if ( lenIV >= 0 ) - { - for ( count = 0; count < num_subrs; count++ ) - { - FT_ULong len; - - - len = offsets[count + 1] - offsets[count]; - psaux->t1_decrypt( subr->code[count], len, 4330 ); - } - } - - subr->num_subrs = (FT_Int)num_subrs; - } - - Exit: - FT_FREE( offsets ); - return error; - - Fail: - if ( face->subrs ) - { - for ( n = 0; n < cid->num_dicts; n++ ) - { - if ( face->subrs[n].code ) - FT_FREE( face->subrs[n].code[0] ); - - FT_FREE( face->subrs[n].code ); - } - FT_FREE( face->subrs ); - } - goto Exit; - } - - - static void - cid_init_loader( CID_Loader* loader, - CID_Face face ) - { - FT_UNUSED( face ); - - FT_MEM_ZERO( loader, sizeof ( *loader ) ); - } - - - static void - cid_done_loader( CID_Loader* loader ) - { - CID_Parser* parser = &loader->parser; - - - /* finalize parser */ - cid_parser_done( parser ); - } - - - static FT_Error - cid_hex_to_binary( FT_Byte* data, - FT_ULong data_len, - FT_ULong offset, - CID_Face face ) - { - FT_Stream stream = face->root.stream; - FT_Error error; - - FT_Byte buffer[256]; - FT_Byte *p, *plimit; - FT_Byte *d, *dlimit; - FT_Byte val; - - FT_Bool upper_nibble, done; - - - if ( FT_STREAM_SEEK( offset ) ) - goto Exit; - - d = data; - dlimit = d + data_len; - p = buffer; - plimit = p; - - upper_nibble = 1; - done = 0; - - while ( d < dlimit ) - { - if ( p >= plimit ) - { - FT_ULong oldpos = FT_STREAM_POS(); - FT_ULong size = stream->size - oldpos; - - - if ( size == 0 ) - { - error = FT_THROW( Syntax_Error ); - goto Exit; - } - - if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) ) - goto Exit; - p = buffer; - plimit = p + FT_STREAM_POS() - oldpos; - } - - if ( ft_isdigit( *p ) ) - val = (FT_Byte)( *p - '0' ); - else if ( *p >= 'a' && *p <= 'f' ) - val = (FT_Byte)( *p - 'a' ); - else if ( *p >= 'A' && *p <= 'F' ) - val = (FT_Byte)( *p - 'A' + 10 ); - else if ( *p == ' ' || - *p == '\t' || - *p == '\r' || - *p == '\n' || - *p == '\f' || - *p == '\0' ) - { - p++; - continue; - } - else if ( *p == '>' ) - { - val = 0; - done = 1; - } - else - { - error = FT_THROW( Syntax_Error ); - goto Exit; - } - - if ( upper_nibble ) - *d = (FT_Byte)( val << 4 ); - else - { - *d = (FT_Byte)( *d + val ); - d++; - } - - upper_nibble = (FT_Byte)( 1 - upper_nibble ); - - if ( done ) - break; - - p++; - } - - error = FT_Err_Ok; - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - cid_face_open( CID_Face face, - FT_Int face_index ) - { - CID_Loader loader; - CID_Parser* parser; - FT_Memory memory = face->root.memory; - FT_Error error; - - - cid_init_loader( &loader, face ); - - parser = &loader.parser; - error = cid_parser_new( parser, face->root.stream, face->root.memory, - (PSAux_Service)face->psaux ); - if ( error ) - goto Exit; - - error = cid_parse_dict( face, &loader, - parser->postscript, - parser->postscript_len ); - if ( error ) - goto Exit; - - if ( face_index < 0 ) - goto Exit; - - if ( FT_NEW( face->cid_stream ) ) - goto Exit; - - if ( parser->binary_length ) - { - /* we must convert the data section from hexadecimal to binary */ - if ( FT_ALLOC( face->binary_data, parser->binary_length ) || - cid_hex_to_binary( face->binary_data, parser->binary_length, - parser->data_offset, face ) ) - goto Exit; - - FT_Stream_OpenMemory( face->cid_stream, - face->binary_data, parser->binary_length ); - face->cid.data_offset = 0; - } - else - { - *face->cid_stream = *face->root.stream; - face->cid.data_offset = loader.parser.data_offset; - } - - error = cid_read_subrs( face ); - - Exit: - cid_done_loader( &loader ); - return error; - } - - -/* END */ diff --git a/3party/freetype/src/cid/cidload.h b/3party/freetype/src/cid/cidload.h deleted file mode 100644 index d7776d2f88..0000000000 --- a/3party/freetype/src/cid/cidload.h +++ /dev/null @@ -1,53 +0,0 @@ -/***************************************************************************/ -/* */ -/* cidload.h */ -/* */ -/* CID-keyed Type1 font loader (specification). */ -/* */ -/* Copyright 1996-2015 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 __CIDLOAD_H__ -#define __CIDLOAD_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_STREAM_H -#include "cidparse.h" - - -FT_BEGIN_HEADER - - - typedef struct CID_Loader_ - { - CID_Parser parser; /* parser used to read the stream */ - FT_Int num_chars; /* number of characters in encoding */ - - } CID_Loader; - - - FT_LOCAL( FT_ULong ) - cid_get_offset( FT_Byte** start, - FT_Byte offsize ); - - FT_LOCAL( FT_Error ) - cid_face_open( CID_Face face, - FT_Int face_index ); - - -FT_END_HEADER - -#endif /* __CIDLOAD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cid/cidobjs.c b/3party/freetype/src/cid/cidobjs.c deleted file mode 100644 index bf1519bc6e..0000000000 --- a/3party/freetype/src/cid/cidobjs.c +++ /dev/null @@ -1,492 +0,0 @@ -/***************************************************************************/ -/* */ -/* cidobjs.c */ -/* */ -/* CID objects manager (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H - -#include "cidgload.h" -#include "cidload.h" - -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - -#include "ciderrs.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cidobjs - - - /*************************************************************************/ - /* */ - /* SLOT FUNCTIONS */ - /* */ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - cid_slot_done( FT_GlyphSlot slot ) - { - slot->internal->glyph_hints = NULL; - } - - - FT_LOCAL_DEF( FT_Error ) - cid_slot_init( FT_GlyphSlot slot ) - { - CID_Face face; - PSHinter_Service pshinter; - - - face = (CID_Face)slot->face; - pshinter = (PSHinter_Service)face->pshinter; - - if ( pshinter ) - { - FT_Module module; - - - module = FT_Get_Module( slot->face->driver->root.library, - "pshinter" ); - if ( module ) - { - T1_Hints_Funcs funcs; - - - funcs = pshinter->get_t1_funcs( module ); - slot->internal->glyph_hints = (void*)funcs; - } - } - - return 0; - } - - - /*************************************************************************/ - /* */ - /* SIZE FUNCTIONS */ - /* */ - /*************************************************************************/ - - - static PSH_Globals_Funcs - cid_size_get_globals_funcs( CID_Size size ) - { - CID_Face face = (CID_Face)size->root.face; - PSHinter_Service pshinter = (PSHinter_Service)face->pshinter; - FT_Module module; - - - module = FT_Get_Module( size->root.face->driver->root.library, - "pshinter" ); - return ( module && pshinter && pshinter->get_globals_funcs ) - ? pshinter->get_globals_funcs( module ) - : 0; - } - - - FT_LOCAL_DEF( void ) - cid_size_done( FT_Size cidsize ) /* CID_Size */ - { - CID_Size size = (CID_Size)cidsize; - - - if ( cidsize->internal ) - { - PSH_Globals_Funcs funcs; - - - funcs = cid_size_get_globals_funcs( size ); - if ( funcs ) - funcs->destroy( (PSH_Globals)cidsize->internal ); - - cidsize->internal = NULL; - } - } - - - FT_LOCAL_DEF( FT_Error ) - cid_size_init( FT_Size cidsize ) /* CID_Size */ - { - CID_Size size = (CID_Size)cidsize; - FT_Error error = FT_Err_Ok; - PSH_Globals_Funcs funcs = cid_size_get_globals_funcs( size ); - - - if ( funcs ) - { - PSH_Globals globals; - CID_Face face = (CID_Face)cidsize->face; - CID_FaceDict dict = face->cid.font_dicts + face->root.face_index; - PS_Private priv = &dict->private_dict; - - - error = funcs->create( cidsize->face->memory, priv, &globals ); - if ( !error ) - cidsize->internal = (FT_Size_Internal)(void*)globals; - } - - return error; - } - - - FT_LOCAL( FT_Error ) - cid_size_request( FT_Size size, - FT_Size_Request req ) - { - PSH_Globals_Funcs funcs; - - - FT_Request_Metrics( size->face, req ); - - funcs = cid_size_get_globals_funcs( (CID_Size)size ); - - if ( funcs ) - funcs->set_scale( (PSH_Globals)size->internal, - size->metrics.x_scale, - size->metrics.y_scale, - 0, 0 ); - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* FACE FUNCTIONS */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cid_face_done */ - /* */ - /* <Description> */ - /* Finalizes a given face object. */ - /* */ - /* <Input> */ - /* face :: A pointer to the face object to destroy. */ - /* */ - FT_LOCAL_DEF( void ) - cid_face_done( FT_Face cidface ) /* CID_Face */ - { - CID_Face face = (CID_Face)cidface; - FT_Memory memory; - CID_FaceInfo cid; - PS_FontInfo info; - - - if ( !face ) - return; - - cid = &face->cid; - info = &cid->font_info; - memory = cidface->memory; - - /* release subrs */ - if ( face->subrs ) - { - FT_Int n; - - - for ( n = 0; n < cid->num_dicts; n++ ) - { - CID_Subrs subr = face->subrs + n; - - - if ( subr->code ) - { - FT_FREE( subr->code[0] ); - FT_FREE( subr->code ); - } - } - - FT_FREE( face->subrs ); - } - - /* release FontInfo strings */ - FT_FREE( info->version ); - FT_FREE( info->notice ); - FT_FREE( info->full_name ); - FT_FREE( info->family_name ); - FT_FREE( info->weight ); - - /* release font dictionaries */ - FT_FREE( cid->font_dicts ); - cid->num_dicts = 0; - - /* release other strings */ - FT_FREE( cid->cid_font_name ); - FT_FREE( cid->registry ); - FT_FREE( cid->ordering ); - - cidface->family_name = NULL; - cidface->style_name = NULL; - - FT_FREE( face->binary_data ); - FT_FREE( face->cid_stream ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cid_face_init */ - /* */ - /* <Description> */ - /* Initializes a given CID face object. */ - /* */ - /* <Input> */ - /* stream :: The source font stream. */ - /* */ - /* face_index :: The index of the font face in the resource. */ - /* */ - /* num_params :: Number of additional generic parameters. Ignored. */ - /* */ - /* params :: Additional generic parameters. Ignored. */ - /* */ - /* <InOut> */ - /* face :: The newly built face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - cid_face_init( FT_Stream stream, - FT_Face cidface, /* CID_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ) - { - CID_Face face = (CID_Face)cidface; - FT_Error error; - PSAux_Service psaux; - PSHinter_Service pshinter; - - FT_UNUSED( num_params ); - FT_UNUSED( params ); - FT_UNUSED( stream ); - - - cidface->num_faces = 1; - - psaux = (PSAux_Service)face->psaux; - if ( !psaux ) - { - psaux = (PSAux_Service)FT_Get_Module_Interface( - FT_FACE_LIBRARY( face ), "psaux" ); - - if ( !psaux ) - { - FT_ERROR(( "cid_face_init: cannot access `psaux' module\n" )); - error = FT_THROW( Missing_Module ); - goto Exit; - } - - face->psaux = psaux; - } - - pshinter = (PSHinter_Service)face->pshinter; - if ( !pshinter ) - { - pshinter = (PSHinter_Service)FT_Get_Module_Interface( - FT_FACE_LIBRARY( face ), "pshinter" ); - - face->pshinter = pshinter; - } - - FT_TRACE2(( "CID driver\n" )); - - /* open the tokenizer; this will also check the font format */ - if ( FT_STREAM_SEEK( 0 ) ) - goto Exit; - - error = cid_face_open( face, face_index ); - if ( error ) - goto Exit; - - /* if we just wanted to check the format, leave successfully now */ - if ( face_index < 0 ) - goto Exit; - - /* check the face index */ - /* XXX: handle CID fonts with more than a single face */ - if ( ( face_index & 0xFFFF ) != 0 ) - { - FT_ERROR(( "cid_face_init: invalid face index\n" )); - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* now load the font program into the face object */ - - /* initialize the face object fields */ - - /* set up root face fields */ - { - CID_FaceInfo cid = &face->cid; - PS_FontInfo info = &cid->font_info; - - - cidface->num_glyphs = (FT_Long)cid->cid_count; - cidface->num_charmaps = 0; - - cidface->face_index = face_index & 0xFFFF; - - cidface->face_flags |= FT_FACE_FLAG_SCALABLE | /* scalable outlines */ - FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ - FT_FACE_FLAG_HINTER; /* has native hinter */ - - if ( info->is_fixed_pitch ) - cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; - - /* XXX: TODO: add kerning with .afm support */ - - /* get style name -- be careful, some broken fonts only */ - /* have a /FontName dictionary entry! */ - cidface->family_name = info->family_name; - /* assume "Regular" style if we don't know better */ - cidface->style_name = (char *)"Regular"; - if ( cidface->family_name ) - { - char* full = info->full_name; - char* family = cidface->family_name; - - - if ( full ) - { - while ( *full ) - { - if ( *full == *family ) - { - family++; - full++; - } - else - { - if ( *full == ' ' || *full == '-' ) - full++; - else if ( *family == ' ' || *family == '-' ) - family++; - else - { - if ( !*family ) - cidface->style_name = full; - break; - } - } - } - } - } - else - { - /* do we have a `/FontName'? */ - if ( cid->cid_font_name ) - cidface->family_name = cid->cid_font_name; - } - - /* compute style flags */ - cidface->style_flags = 0; - if ( info->italic_angle ) - cidface->style_flags |= FT_STYLE_FLAG_ITALIC; - if ( info->weight ) - { - if ( !ft_strcmp( info->weight, "Bold" ) || - !ft_strcmp( info->weight, "Black" ) ) - cidface->style_flags |= FT_STYLE_FLAG_BOLD; - } - - /* no embedded bitmap support */ - cidface->num_fixed_sizes = 0; - cidface->available_sizes = NULL; - - cidface->bbox.xMin = cid->font_bbox.xMin >> 16; - cidface->bbox.yMin = cid->font_bbox.yMin >> 16; - /* no `U' suffix here to 0xFFFF! */ - cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFF ) >> 16; - cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFF ) >> 16; - - if ( !cidface->units_per_EM ) - cidface->units_per_EM = 1000; - - cidface->ascender = (FT_Short)( cidface->bbox.yMax ); - cidface->descender = (FT_Short)( cidface->bbox.yMin ); - - cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 ); - if ( cidface->height < cidface->ascender - cidface->descender ) - cidface->height = (FT_Short)( cidface->ascender - cidface->descender ); - - cidface->underline_position = (FT_Short)info->underline_position; - cidface->underline_thickness = (FT_Short)info->underline_thickness; - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cid_driver_init */ - /* */ - /* <Description> */ - /* Initializes a given CID driver object. */ - /* */ - /* <Input> */ - /* driver :: A handle to the target driver object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - cid_driver_init( FT_Module driver ) - { - FT_UNUSED( driver ); - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cid_driver_done */ - /* */ - /* <Description> */ - /* Finalizes a given CID driver. */ - /* */ - /* <Input> */ - /* driver :: A handle to the target CID driver. */ - /* */ - FT_LOCAL_DEF( void ) - cid_driver_done( FT_Module driver ) - { - FT_UNUSED( driver ); - } - - -/* END */ diff --git a/3party/freetype/src/cid/cidobjs.h b/3party/freetype/src/cid/cidobjs.h deleted file mode 100644 index e9095ca68e..0000000000 --- a/3party/freetype/src/cid/cidobjs.h +++ /dev/null @@ -1,154 +0,0 @@ -/***************************************************************************/ -/* */ -/* cidobjs.h */ -/* */ -/* CID objects manager (specification). */ -/* */ -/* Copyright 1996-2015 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 __CIDOBJS_H__ -#define __CIDOBJS_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_TYPE1_TYPES_H - - -FT_BEGIN_HEADER - - - /* The following structures must be defined by the hinter */ - typedef struct CID_Size_Hints_ CID_Size_Hints; - typedef struct CID_Glyph_Hints_ CID_Glyph_Hints; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* CID_Driver */ - /* */ - /* <Description> */ - /* A handle to a Type 1 driver object. */ - /* */ - typedef struct CID_DriverRec_* CID_Driver; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* CID_Size */ - /* */ - /* <Description> */ - /* A handle to a Type 1 size object. */ - /* */ - typedef struct CID_SizeRec_* CID_Size; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* CID_GlyphSlot */ - /* */ - /* <Description> */ - /* A handle to a Type 1 glyph slot object. */ - /* */ - typedef struct CID_GlyphSlotRec_* CID_GlyphSlot; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* CID_CharMap */ - /* */ - /* <Description> */ - /* A handle to a Type 1 character mapping object. */ - /* */ - /* <Note> */ - /* The Type 1 format doesn't use a charmap but an encoding table. */ - /* The driver is responsible for making up charmap objects */ - /* corresponding to these tables. */ - /* */ - typedef struct CID_CharMapRec_* CID_CharMap; - - - /*************************************************************************/ - /* */ - /* HERE BEGINS THE TYPE 1 SPECIFIC STUFF */ - /* */ - /*************************************************************************/ - - - typedef struct CID_SizeRec_ - { - FT_SizeRec root; - FT_Bool valid; - - } CID_SizeRec; - - - typedef struct CID_GlyphSlotRec_ - { - FT_GlyphSlotRec root; - - FT_Bool hint; - FT_Bool scaled; - - FT_Fixed x_scale; - FT_Fixed y_scale; - - } CID_GlyphSlotRec; - - - FT_LOCAL( void ) - cid_slot_done( FT_GlyphSlot slot ); - - FT_LOCAL( FT_Error ) - cid_slot_init( FT_GlyphSlot slot ); - - - FT_LOCAL( void ) - cid_size_done( FT_Size size ); /* CID_Size */ - - FT_LOCAL( FT_Error ) - cid_size_init( FT_Size size ); /* CID_Size */ - - FT_LOCAL( FT_Error ) - cid_size_request( FT_Size size, /* CID_Size */ - FT_Size_Request req ); - - FT_LOCAL( FT_Error ) - cid_face_init( FT_Stream stream, - FT_Face face, /* CID_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - FT_LOCAL( void ) - cid_face_done( FT_Face face ); /* CID_Face */ - - - FT_LOCAL( FT_Error ) - cid_driver_init( FT_Module driver ); - - FT_LOCAL( void ) - cid_driver_done( FT_Module driver ); - - -FT_END_HEADER - -#endif /* __CIDOBJS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cid/cidparse.c b/3party/freetype/src/cid/cidparse.c deleted file mode 100644 index c276949779..0000000000 --- a/3party/freetype/src/cid/cidparse.c +++ /dev/null @@ -1,234 +0,0 @@ -/***************************************************************************/ -/* */ -/* cidparse.c */ -/* */ -/* CID-keyed Type1 parser (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_STREAM_H - -#include "cidparse.h" - -#include "ciderrs.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cidparse - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** INPUT STREAM PARSER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_LOCAL_DEF( FT_Error ) - cid_parser_new( CID_Parser* parser, - FT_Stream stream, - FT_Memory memory, - PSAux_Service psaux ) - { - FT_Error error; - FT_ULong base_offset, offset, ps_len; - FT_Byte *cur, *limit; - FT_Byte *arg1, *arg2; - - - FT_MEM_ZERO( parser, sizeof ( *parser ) ); - psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory ); - - parser->stream = stream; - - base_offset = FT_STREAM_POS(); - - /* first of all, check the font format in the header */ - if ( FT_FRAME_ENTER( 31 ) ) - goto Exit; - - if ( ft_strncmp( (char *)stream->cursor, - "%!PS-Adobe-3.0 Resource-CIDFont", 31 ) ) - { - FT_TRACE2(( " not a CID-keyed font\n" )); - error = FT_THROW( Unknown_File_Format ); - } - - FT_FRAME_EXIT(); - if ( error ) - goto Exit; - - Again: - /* now, read the rest of the file until we find */ - /* `StartData' or `/sfnts' */ - { - FT_Byte buffer[256 + 10]; - FT_ULong read_len = 256 + 10; - FT_Byte* p = buffer; - - - for ( offset = FT_STREAM_POS(); ; offset += 256 ) - { - FT_ULong stream_len; - - - stream_len = stream->size - FT_STREAM_POS(); - if ( stream_len == 0 ) - { - FT_TRACE2(( "cid_parser_new: no `StartData' keyword found\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - read_len = FT_MIN( read_len, stream_len ); - if ( FT_STREAM_READ( p, read_len ) ) - goto Exit; - - if ( read_len < 256 ) - p[read_len] = '\0'; - - limit = p + read_len - 10; - - for ( p = buffer; p < limit; p++ ) - { - if ( p[0] == 'S' && ft_strncmp( (char*)p, "StartData", 9 ) == 0 ) - { - /* save offset of binary data after `StartData' */ - offset += (FT_ULong)( p - buffer + 10 ); - goto Found; - } - else if ( p[1] == 's' && ft_strncmp( (char*)p, "/sfnts", 6 ) == 0 ) - { - offset += (FT_ULong)( p - buffer + 7 ); - goto Found; - } - } - - FT_MEM_MOVE( buffer, p, 10 ); - read_len = 256; - p = buffer + 10; - } - } - - Found: - /* We have found the start of the binary data or the `/sfnts' token. */ - /* Now rewind and extract the frame corresponding to this PostScript */ - /* section. */ - - ps_len = offset - base_offset; - if ( FT_STREAM_SEEK( base_offset ) || - FT_FRAME_EXTRACT( ps_len, parser->postscript ) ) - goto Exit; - - parser->data_offset = offset; - parser->postscript_len = ps_len; - parser->root.base = parser->postscript; - parser->root.cursor = parser->postscript; - parser->root.limit = parser->root.cursor + ps_len; - parser->num_dict = -1; - - /* Finally, we check whether `StartData' or `/sfnts' was real -- */ - /* it could be in a comment or string. We also get the arguments */ - /* of `StartData' to find out whether the data is represented in */ - /* binary or hex format. */ - - arg1 = parser->root.cursor; - cid_parser_skip_PS_token( parser ); - cid_parser_skip_spaces ( parser ); - arg2 = parser->root.cursor; - cid_parser_skip_PS_token( parser ); - cid_parser_skip_spaces ( parser ); - - limit = parser->root.limit; - cur = parser->root.cursor; - - while ( cur < limit ) - { - if ( parser->root.error ) - { - error = parser->root.error; - goto Exit; - } - - if ( cur[0] == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 ) - { - if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 ) - { - FT_Long tmp = ft_atol( (const char *)arg2 ); - - - if ( tmp < 0 ) - { - FT_ERROR(( "cid_parser_new: invalid length of hex data\n" )); - error = FT_THROW( Invalid_File_Format ); - } - else - parser->binary_length = (FT_ULong)tmp; - } - - goto Exit; - } - else if ( cur[1] == 's' && ft_strncmp( (char*)cur, "/sfnts", 6 ) == 0 ) - { - FT_TRACE2(( "cid_parser_new: cannot handle Type 11 fonts\n" )); - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - cid_parser_skip_PS_token( parser ); - cid_parser_skip_spaces ( parser ); - arg1 = arg2; - arg2 = cur; - cur = parser->root.cursor; - } - - /* we haven't found the correct `StartData'; go back and continue */ - /* searching */ - FT_FRAME_RELEASE( parser->postscript ); - if ( !FT_STREAM_SEEK( offset ) ) - goto Again; - - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - cid_parser_done( CID_Parser* parser ) - { - /* always free the private dictionary */ - if ( parser->postscript ) - { - FT_Stream stream = parser->stream; - - - FT_FRAME_RELEASE( parser->postscript ); - } - parser->root.funcs.done( &parser->root ); - } - - -/* END */ diff --git a/3party/freetype/src/cid/cidparse.h b/3party/freetype/src/cid/cidparse.h deleted file mode 100644 index f581bb43ff..0000000000 --- a/3party/freetype/src/cid/cidparse.h +++ /dev/null @@ -1,123 +0,0 @@ -/***************************************************************************/ -/* */ -/* cidparse.h */ -/* */ -/* CID-keyed Type1 parser (specification). */ -/* */ -/* Copyright 1996-2015 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 __CIDPARSE_H__ -#define __CIDPARSE_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CID_Parser */ - /* */ - /* <Description> */ - /* A CID_Parser is an object used to parse a Type 1 fonts very */ - /* quickly. */ - /* */ - /* <Fields> */ - /* root :: The root PS_ParserRec fields. */ - /* */ - /* stream :: The current input stream. */ - /* */ - /* postscript :: A pointer to the data to be parsed. */ - /* */ - /* postscript_len :: The length of the data to be parsed. */ - /* */ - /* data_offset :: The start position of the binary data (i.e., the */ - /* end of the data to be parsed. */ - /* */ - /* binary_length :: The length of the data after the `StartData' */ - /* command if the data format is hexadecimal. */ - /* */ - /* cid :: A structure which holds the information about */ - /* the current font. */ - /* */ - /* num_dict :: The number of font dictionaries. */ - /* */ - typedef struct CID_Parser_ - { - PS_ParserRec root; - FT_Stream stream; - - FT_Byte* postscript; - FT_ULong postscript_len; - - FT_ULong data_offset; - - FT_ULong binary_length; - - CID_FaceInfo cid; - FT_Int num_dict; - - } CID_Parser; - - - FT_LOCAL( FT_Error ) - cid_parser_new( CID_Parser* parser, - FT_Stream stream, - FT_Memory memory, - PSAux_Service psaux ); - - FT_LOCAL( void ) - cid_parser_done( CID_Parser* parser ); - - - /*************************************************************************/ - /* */ - /* PARSING ROUTINES */ - /* */ - /*************************************************************************/ - -#define cid_parser_skip_spaces( p ) \ - (p)->root.funcs.skip_spaces( &(p)->root ) -#define cid_parser_skip_PS_token( p ) \ - (p)->root.funcs.skip_PS_token( &(p)->root ) - -#define cid_parser_to_int( p ) (p)->root.funcs.to_int( &(p)->root ) -#define cid_parser_to_fixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) - -#define cid_parser_to_coord_array( p, m, c ) \ - (p)->root.funcs.to_coord_array( &(p)->root, m, c ) -#define cid_parser_to_fixed_array( p, m, f, t ) \ - (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) -#define cid_parser_to_token( p, t ) \ - (p)->root.funcs.to_token( &(p)->root, t ) -#define cid_parser_to_token_array( p, t, m, c ) \ - (p)->root.funcs.to_token_array( &(p)->root, t, m, c ) - -#define cid_parser_load_field( p, f, o ) \ - (p)->root.funcs.load_field( &(p)->root, f, o, 0, 0 ) -#define cid_parser_load_field_table( p, f, o ) \ - (p)->root.funcs.load_field_table( &(p)->root, f, o, 0, 0 ) - - -FT_END_HEADER - -#endif /* __CIDPARSE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cid/cidriver.c b/3party/freetype/src/cid/cidriver.c deleted file mode 100644 index 07c4cc410b..0000000000 --- a/3party/freetype/src/cid/cidriver.c +++ /dev/null @@ -1,236 +0,0 @@ -/***************************************************************************/ -/* */ -/* cidriver.c */ -/* */ -/* CID driver interface (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include "cidriver.h" -#include "cidgload.h" -#include FT_INTERNAL_DEBUG_H - -#include "ciderrs.h" - -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_FONT_FORMAT_H -#include FT_SERVICE_POSTSCRIPT_INFO_H -#include FT_SERVICE_CID_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ciddriver - - - /* - * POSTSCRIPT NAME SERVICE - * - */ - - static const char* - cid_get_postscript_name( CID_Face face ) - { - const char* result = face->cid.cid_font_name; - - - if ( result && result[0] == '/' ) - result++; - - return result; - } - - - static const FT_Service_PsFontNameRec cid_service_ps_name = - { - (FT_PsName_GetFunc) cid_get_postscript_name - }; - - - /* - * POSTSCRIPT INFO SERVICE - * - */ - - static FT_Error - cid_ps_get_font_info( FT_Face face, - PS_FontInfoRec* afont_info ) - { - *afont_info = ((CID_Face)face)->cid.font_info; - - return FT_Err_Ok; - } - - static FT_Error - cid_ps_get_font_extra( FT_Face face, - PS_FontExtraRec* afont_extra ) - { - *afont_extra = ((CID_Face)face)->font_extra; - - return FT_Err_Ok; - } - - static const FT_Service_PsInfoRec cid_service_ps_info = - { - (PS_GetFontInfoFunc) cid_ps_get_font_info, - (PS_GetFontExtraFunc) cid_ps_get_font_extra, - (PS_HasGlyphNamesFunc) NULL, /* unsupported with CID fonts */ - (PS_GetFontPrivateFunc)NULL, /* unsupported */ - (PS_GetFontValueFunc) NULL /* not implemented */ - }; - - - /* - * CID INFO SERVICE - * - */ - static FT_Error - cid_get_ros( CID_Face face, - const char* *registry, - const char* *ordering, - FT_Int *supplement ) - { - CID_FaceInfo cid = &face->cid; - - - if ( registry ) - *registry = cid->registry; - - if ( ordering ) - *ordering = cid->ordering; - - if ( supplement ) - *supplement = cid->supplement; - - return FT_Err_Ok; - } - - - static FT_Error - cid_get_is_cid( CID_Face face, - FT_Bool *is_cid ) - { - FT_Error error = FT_Err_Ok; - FT_UNUSED( face ); - - - if ( is_cid ) - *is_cid = 1; /* cid driver is only used for CID keyed fonts */ - - return error; - } - - - static FT_Error - cid_get_cid_from_glyph_index( CID_Face face, - FT_UInt glyph_index, - FT_UInt *cid ) - { - FT_Error error = FT_Err_Ok; - FT_UNUSED( face ); - - - if ( cid ) - *cid = glyph_index; /* identity mapping */ - - return error; - } - - - static const FT_Service_CIDRec cid_service_cid_info = - { - (FT_CID_GetRegistryOrderingSupplementFunc)cid_get_ros, - (FT_CID_GetIsInternallyCIDKeyedFunc) cid_get_is_cid, - (FT_CID_GetCIDFromGlyphIndexFunc) cid_get_cid_from_glyph_index - }; - - - /* - * SERVICE LIST - * - */ - - static const FT_ServiceDescRec cid_services[] = - { - { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CID }, - { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name }, - { FT_SERVICE_ID_POSTSCRIPT_INFO, &cid_service_ps_info }, - { FT_SERVICE_ID_CID, &cid_service_cid_info }, - { NULL, NULL } - }; - - - FT_CALLBACK_DEF( FT_Module_Interface ) - cid_get_interface( FT_Module module, - const char* cid_interface ) - { - FT_UNUSED( module ); - - return ft_service_list_lookup( cid_services, cid_interface ); - } - - - - FT_CALLBACK_TABLE_DEF - const FT_Driver_ClassRec t1cid_driver_class = - { - /* first of all, the FT_Module_Class fields */ - { - FT_MODULE_FONT_DRIVER | - FT_MODULE_DRIVER_SCALABLE | - FT_MODULE_DRIVER_HAS_HINTER, - - sizeof ( FT_DriverRec ), - "t1cid", /* module name */ - 0x10000L, /* version 1.0 of driver */ - 0x20000L, /* requires FreeType 2.0 */ - - 0, - - cid_driver_init, - cid_driver_done, - cid_get_interface - }, - - /* then the other font drivers fields */ - sizeof ( CID_FaceRec ), - sizeof ( CID_SizeRec ), - sizeof ( CID_GlyphSlotRec ), - - cid_face_init, - cid_face_done, - - cid_size_init, - cid_size_done, - cid_slot_init, - cid_slot_done, - - cid_slot_load_glyph, - - 0, /* FT_Face_GetKerningFunc */ - 0, /* FT_Face_AttachFunc */ - - 0, /* FT_Face_GetAdvancesFunc */ - - cid_size_request, - 0 /* FT_Size_SelectFunc */ - }; - - -/* END */ diff --git a/3party/freetype/src/cid/cidriver.h b/3party/freetype/src/cid/cidriver.h deleted file mode 100644 index e5b8678464..0000000000 --- a/3party/freetype/src/cid/cidriver.h +++ /dev/null @@ -1,43 +0,0 @@ -/***************************************************************************/ -/* */ -/* cidriver.h */ -/* */ -/* High-level CID driver interface (specification). */ -/* */ -/* Copyright 1996-2015 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 __CIDRIVER_H__ -#define __CIDRIVER_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_DRIVER_H - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC -#error "this module does not support PIC yet" -#endif - - - FT_CALLBACK_TABLE - const FT_Driver_ClassRec t1cid_driver_class; - - -FT_END_HEADER - -#endif /* __CIDRIVER_H__ */ - - -/* END */ diff --git a/3party/freetype/src/cid/cidtoken.h b/3party/freetype/src/cid/cidtoken.h deleted file mode 100644 index 82eae0ca6b..0000000000 --- a/3party/freetype/src/cid/cidtoken.h +++ /dev/null @@ -1,112 +0,0 @@ -/***************************************************************************/ -/* */ -/* cidtoken.h */ -/* */ -/* CID token definitions (specification only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - -#undef FT_STRUCTURE -#define FT_STRUCTURE CID_FaceInfoRec -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_CID_INFO - - T1_FIELD_KEY ( "CIDFontName", cid_font_name, 0 ) - T1_FIELD_FIXED ( "CIDFontVersion", cid_version, 0 ) - T1_FIELD_NUM ( "CIDFontType", cid_font_type, 0 ) - T1_FIELD_STRING( "Registry", registry, 0 ) - T1_FIELD_STRING( "Ordering", ordering, 0 ) - T1_FIELD_NUM ( "Supplement", supplement, 0 ) - T1_FIELD_NUM ( "UIDBase", uid_base, 0 ) - T1_FIELD_NUM ( "CIDMapOffset", cidmap_offset, 0 ) - T1_FIELD_NUM ( "FDBytes", fd_bytes, 0 ) - T1_FIELD_NUM ( "GDBytes", gd_bytes, 0 ) - T1_FIELD_NUM ( "CIDCount", cid_count, 0 ) - - -#undef FT_STRUCTURE -#define FT_STRUCTURE PS_FontInfoRec -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_FONT_INFO - - T1_FIELD_STRING( "version", version, 0 ) - T1_FIELD_STRING( "Notice", notice, 0 ) - T1_FIELD_STRING( "FullName", full_name, 0 ) - T1_FIELD_STRING( "FamilyName", family_name, 0 ) - T1_FIELD_STRING( "Weight", weight, 0 ) - T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 ) - T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 ) - T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 ) - T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 ) - -#undef FT_STRUCTURE -#define FT_STRUCTURE PS_FontExtraRec -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA - - T1_FIELD_NUM ( "FSType", fs_type, 0 ) - - -#undef FT_STRUCTURE -#define FT_STRUCTURE CID_FaceDictRec -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_FONT_DICT - - T1_FIELD_NUM ( "PaintType", paint_type, 0 ) - T1_FIELD_NUM ( "FontType", font_type, 0 ) - T1_FIELD_NUM ( "SubrMapOffset", subrmap_offset, 0 ) - T1_FIELD_NUM ( "SDBytes", sd_bytes, 0 ) - T1_FIELD_NUM ( "SubrCount", num_subrs, 0 ) - T1_FIELD_NUM ( "lenBuildCharArray", len_buildchar, 0 ) - T1_FIELD_FIXED( "ForceBoldThreshold", forcebold_threshold, 0 ) - T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 ) - - -#undef FT_STRUCTURE -#define FT_STRUCTURE PS_PrivateRec -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_PRIVATE - - T1_FIELD_NUM ( "UniqueID", unique_id, 0 ) - T1_FIELD_NUM ( "lenIV", lenIV, 0 ) - T1_FIELD_NUM ( "LanguageGroup", language_group, 0 ) - T1_FIELD_NUM ( "password", password, 0 ) - - T1_FIELD_FIXED_1000( "BlueScale", blue_scale, 0 ) - T1_FIELD_NUM ( "BlueShift", blue_shift, 0 ) - T1_FIELD_NUM ( "BlueFuzz", blue_fuzz, 0 ) - - T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14, 0 ) - T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10, 0 ) - T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14, 0 ) - T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, 0 ) - - T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1, 0 ) - T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1, 0 ) - T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2, 0 ) - - T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12, 0 ) - T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12, 0 ) - - T1_FIELD_BOOL ( "ForceBold", force_bold, 0 ) - - -#undef FT_STRUCTURE -#define FT_STRUCTURE FT_BBox -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_BBOX - - T1_FIELD_BBOX( "FontBBox", xMin, 0 ) - - -/* END */ diff --git a/3party/freetype/src/cid/module.mk b/3party/freetype/src/cid/module.mk deleted file mode 100644 index e312a3ca1a..0000000000 --- a/3party/freetype/src/cid/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 CID module definition -# - - -# Copyright 1996-2015 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. - - -FTMODULE_H_COMMANDS += TYPE1CID_DRIVER - -define TYPE1CID_DRIVER -$(OPEN_DRIVER) FT_Driver_ClassRec, t1cid_driver_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)cid $(ECHO_DRIVER_DESC)Postscript CID-keyed fonts, no known extension$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/cid/rules.mk b/3party/freetype/src/cid/rules.mk deleted file mode 100644 index 282f2aad7a..0000000000 --- a/3party/freetype/src/cid/rules.mk +++ /dev/null @@ -1,73 +0,0 @@ -# -# FreeType 2 CID driver configuration rules -# - - -# Copyright 1996-2015 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. - - -# CID driver directory -# -CID_DIR := $(SRC_DIR)/cid - - -CID_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(CID_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# CID driver sources (i.e., C files) -# -CID_DRV_SRC := $(CID_DIR)/cidparse.c \ - $(CID_DIR)/cidload.c \ - $(CID_DIR)/cidriver.c \ - $(CID_DIR)/cidgload.c \ - $(CID_DIR)/cidobjs.c - -# CID driver headers -# -CID_DRV_H := $(CID_DRV_SRC:%.c=%.h) \ - $(CID_DIR)/cidtoken.h \ - $(CID_DIR)/ciderrs.h - - -# CID driver object(s) -# -# CID_DRV_OBJ_M is used during `multi' builds -# CID_DRV_OBJ_S is used during `single' builds -# -CID_DRV_OBJ_M := $(CID_DRV_SRC:$(CID_DIR)/%.c=$(OBJ_DIR)/%.$O) -CID_DRV_OBJ_S := $(OBJ_DIR)/type1cid.$O - -# CID driver source file for single build -# -CID_DRV_SRC_S := $(CID_DIR)/type1cid.c - - -# CID driver - single object -# -$(CID_DRV_OBJ_S): $(CID_DRV_SRC_S) $(CID_DRV_SRC) $(FREETYPE_H) $(CID_DRV_H) - $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CID_DRV_SRC_S)) - - -# CID driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(CID_DIR)/%.c $(FREETYPE_H) $(CID_DRV_H) - $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(CID_DRV_OBJ_S) -DRV_OBJS_M += $(CID_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/cid/type1cid.c b/3party/freetype/src/cid/type1cid.c deleted file mode 100644 index 0d54ca7f44..0000000000 --- a/3party/freetype/src/cid/type1cid.c +++ /dev/null @@ -1,29 +0,0 @@ -/***************************************************************************/ -/* */ -/* type1cid.c */ -/* */ -/* FreeType OpenType driver component (body only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "cidparse.c" -#include "cidload.c" -#include "cidobjs.c" -#include "cidriver.c" -#include "cidgload.c" - - -/* END */ diff --git a/3party/freetype/src/gxvalid/Jamfile b/3party/freetype/src/gxvalid/Jamfile deleted file mode 100644 index d367cad77c..0000000000 --- a/3party/freetype/src/gxvalid/Jamfile +++ /dev/null @@ -1,52 +0,0 @@ -# FreeType 2 src/gxvalid Jamfile -# -# Copyright 2005-2015 by -# suzuki toshiya, Masatake YAMATO and Red Hat K.K. -# -# 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) gxvalid ; - - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = gxvbsln - gxvcommn - gxvfeat - gxvjust - gxvkern - gxvlcar - gxvmod - gxvmort - gxvmort0 - gxvmort1 - gxvmort2 - gxvmort4 - gxvmort5 - gxvmorx - gxvmorx0 - gxvmorx1 - gxvmorx2 - gxvmorx4 - gxvmorx5 - gxvopbd - gxvprop - gxvtrak - ; - } - else - { - _sources = gxvalid ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/gxvalid Jamfile diff --git a/3party/freetype/src/gxvalid/README b/3party/freetype/src/gxvalid/README deleted file mode 100644 index 60f2fc185e..0000000000 --- a/3party/freetype/src/gxvalid/README +++ /dev/null @@ -1,532 +0,0 @@ -gxvalid: TrueType GX validator -============================== - - -1. What is this ---------------- - - `gxvalid' is a module to validate TrueType GX tables: a collection of - additional tables in TrueType font which are used by `QuickDraw GX - Text', Apple Advanced Typography (AAT). In addition, gxvalid can - validates `kern' tables which have been extended for AAT. Like the - otvalid module, gxvalid uses Freetype 2's validator framework - (ftvalid). - - You can link gxvalid with your program; before running your own layout - engine, gxvalid validates a font file. As the result, you can remove - error-checking code from the layout engine. It is also possible to - use gxvalid as a stand-alone font validator; the `ftvalid' test - program included in the ft2demo bundle calls gxvalid internally. - A stand-alone font validator may be useful for font developers. - - This documents documents the following issues. - - - supported TrueType GX tables - - fundamental validation limitations - - permissive error handling of broken GX tables - - `kern' table issue. - - -2. Supported tables -------------------- - - The following GX tables are currently supported. - - bsln - feat - just - kern(*) - lcar - mort - morx - opbd - prop - trak - - The following GX tables are currently unsupported. - - cvar - fdsc - fmtx - fvar - gvar - Zapf - - The following GX tables won't be supported. - - acnt(**) - hsty(***) - - The following undocumented tables in TrueType fonts designed for Apple - platform aren't handled either. - - addg - CVTM - TPNM - umif - - - *) The `kern' validator handles both the classic and the new kern - formats; the former is supported on both Microsoft and Apple - platforms, while the latter is supported on Apple platforms. - - **) `acnt' tables are not supported by currently available Apple font - tools. - - ***) There is one more Apple extension, `hsty', but it is for - Newton-OS, not GX (Newton-OS is a platform by Apple, but it can - use sfnt- housed bitmap fonts only). Therefore, it should be - excluded from `Apple platform' in the context of TrueType. - gxvalid ignores it as Apple font tools do so. - - - We have checked 183 fonts bundled with MacOS 9.1, MacOS 9.2, MacOS - 10.0, MacOS X 10.1, MSIE for MacOS, and AppleWorks 6.0. In addition, - we have checked 67 Dynalab fonts (designed for MacOS) and 189 Ricoh - fonts (designed for Windows and MacOS dual platforms). The number of - fonts including TrueType GX tables are as follows. - - bsln: 76 - feat: 191 - just: 84 - kern: 59 - lcar: 4 - mort: 326 - morx: 19 - opbd: 4 - prop: 114 - trak: 16 - - Dynalab and Ricoh fonts don't have GX tables except of `feat' and - `mort'. - - -3. Fundamental validation limitations -------------------------------------- - - TrueType GX provides layout information to libraries for font - rasterizers and text layout. gxvalid can check whether the layout - data in a font is conformant to the TrueType GX format specified by - Apple. But gxvalid cannot check a how QuickDraw GX/AAT renderer uses - the stored information. - - 3-1. Validation of State Machine activity - ----------------------------------------- - - QuickDraw GX/AAT uses a `State Machine' to provide `stateful' layout - features, and TrueType GX stores the state transition diagram of - this `State Machine' in a `StateTable' data structure. While the - State Machine receives a series of glyph IDs, the State Machine - starts with `start of text' state, walks around various states and - generates various layout information to the renderer, and finally - reaches the `end of text' state. - - gxvalid can check essential errors like: - - - possibility of state transitions to undefined states - - existence of glyph IDs that the State Machine doesn't know how - to handle - - the State Machine cannot compute the layout information from - given diagram - - These errors can be checked within finite steps, and without the - State Machine itself, because these are `expression' errors of state - transition diagram. - - There is no limitation about how long the State Machine walks - around, so validation of the algorithm in the state transition - diagram requires infinite steps, even if we had a State Machine in - gxvalid. Therefore, the following errors and problems cannot be - checked. - - - existence of states which the State Machine never transits to - - the possibility that the State Machine never reaches `end of - text' - - the possibility of stack underflow/overflow in the State Machine - (in ligature and contextual glyph substitutions, the State - Machine can store 16 glyphs onto its stack) - - In addition, gxvalid doesn't check `temporary glyph IDs' used in the - chained State Machines (in `mort' and `morx' tables). If a layout - feature is implemented by a single State Machine, a glyph ID - converted by the State Machine is passed to the glyph renderer, thus - it should not point to an undefined glyph ID. But if a layout - feature is implemented by chained State Machines, a component State - Machine (if it is not the final one) is permitted to generate - undefined glyph IDs for temporary use, because it is handled by next - component State Machine and not by the glyph renderer. To validate - such temporary glyph IDs, gxvalid must stack all undefined glyph IDs - which can occur in the output of the previous State Machine and - search them in the `ClassTable' structure of the current State - Machine. It is too complex to list all possible glyph IDs from the - StateTable, especially from a ligature substitution table. - - 3-2. Validation of relationship between multiple layout features - ---------------------------------------------------------------- - - gxvalid does not validate the relationship between multiple layout - features at all. - - If multiple layout features are defined in TrueType GX tables, - possible interactions, overrides, and conflicts between layout - features are implicitly given in the font too. For example, there - are several predefined spacing control features: - - - Text Spacing (Proportional/Monospace/Half-width/Normal) - - Number Spacing (Monospaced-numbers/Proportional-numbers) - - Kana Spacing (Full-width/Proportional) - - Ideographic Spacing (Full-width/Proportional) - - CJK Roman Spacing (Half-width/Proportional/Default-roman - /Full-width-roman/Proportional) - - If all layout features are independently managed, we can activate - inconsistent typographic rules like `Text Spacing=Monospace' and - `Ideographic Spacing=Proportional' at the same time. - - The combinations of layout features is managed by a 32bit integer - (one bit each for selector setting), so we can define relationships - between up to 32 features, theoretically. But if one feature - setting affects another feature setting, we need typographic - priority rules to validate the relationship. Unfortunately, the - TrueType GX format specification does not give such information even - for predefined features. - - -4. Permissive error handling of broken GX tables ------------------------------------------------- - - When Apple's font rendering system finds an inconsistency, like a - specification violation or an unspecified value in a TrueType GX - table, it does not always return error. In most cases, the rendering - engine silently ignores such wrong values or even whole tables. In - fact, MacOS is shipped with fonts including broken GX/AAT tables, but - no harmful effects due to `officially broken' fonts are observed by - end-users. - - gxvalid is designed to continue the validation process as long as - possible. When gxvalid find wrong values, gxvalid warns it at least, - and takes a fallback procedure if possible. The fallback procedure - depends on the debug level. - - We used the following three tools to investigate Apple's error handling. - - - FontValidator (for MacOS 8.5 - 9.2) resource fork font - - ftxvalidator (for MacOS X 10.1 -) dfont or naked-sfnt - - ftxdumperfuser (for MacOS X 10.1 -) dfont or naked-sfnt - - However, all tests were done on a PowerPC based Macintosh; at present, - we have not checked those tools on a m68k-based Macintosh. - - In total, we checked 183 fonts bundled to MacOS 9.1, MacOS 9.2, MacOS - 10.0, MacOS X 10.1, MSIE for MacOS, and AppleWorks 6.0. These fonts - are distributed officially, but many broken GX/AAT tables were found - by Apple's font tools. In the following, we list typical violation of - the GX specification, in fonts officially distributed with those Apple - systems. - - 4-1. broken BinSrchHeader (19/183) - ---------------------------------- - - `BinSrchHeader' is a header of a data array for m68k platforms to - access memory efficiently. Although there are only two independent - parameters for real (`unitSize' and `nUnits'), BinSrchHeader has - three additional parameters which can be calculated from `unitSize' - and `nUnits', for fast setup. Apple font tools ignore them - silently, so gxvalid warns if it finds and inconsistency, and always - continues validation. The additional parameters are ignored - regardless of the consistency. - - 19 fonts include such inconsistencies; all breaks are in the - BinSrchHeader structure of the `kern' table. - - 4-2. too-short LookupTable (5/183) - ---------------------------------- - - LookupTable format 0 is a simple array to get a value from a given - GID (glyph ID); the index of this array is a GID too. Therefore, - the length of the array is expected to be same as the maximum GID - value defined in the `maxp' table, but there are some fonts whose - LookupTable format 0 is too short to cover all GIDs. FontValidator - ignores this error silently, ftxvalidator and ftxdumperfuser both - warn and continue. Similar problems are found in format 3 subtables - of `kern'. gxvalid warns always and abort if the validation level - is set to FT_VALIDATE_PARANOID. - - 5 fonts include too-short kern format 0 subtables. - 1 font includes too-short kern format 3 subtable. - - 4-3. broken LookupTable format 2 (1/183) - ---------------------------------------- - - LookupTable format 2, subformat 4 covers the GID space by a - collection of segments which are specified by `firstGlyph' and - `lastGlyph'. Some fonts store `firstGlyph' and `lastGlyph' in - reverse order, so the segment specification is broken. Apple font - tools ignore this error silently; a broken segment is ignored as if - it did not exist. gxvalid warns and normalize the segment at - FT_VALIDATE_DEFAULT, or ignore the segment at FT_VALIDATE_TIGHT, or - abort at FT_VALIDATE_PARANOID. - - 1 font includes broken LookupTable format 2, in the `just' table. - - *) It seems that all fonts manufactured by ITC for AppleWorks have - this error. - - 4-4. bad bracketing in glyph property (14/183) - ---------------------------------------------- - - GX/AAT defines a `bracketing' property of the glyphs in the `prop' - table, to control layout features of strings enclosed inside and - outside of brackets. Some fonts give inappropriate bracket - properties to glyphs. Apple font tools warn about this error; - gxvalid warns too and aborts at FT_VALIDATE_PARANOID. - - 14 fonts include wrong bracket properties. - - - 4-5. invalid feature number (117/183) - ------------------------------------- - - The GX/AAT extension can include 255 different layout features, but - popular layout features are predefined (see - http://developer.apple.com/fonts/Registry/index.html). Some fonts - include feature numbers which are incompatible with the predefined - feature registry. - - In our survey, there are 140 fonts including `feat' table. - - a) 67 fonts use a feature number which should not be used. - b) 117 fonts set the wrong feature range (nSetting). This is mostly - found in the `mort' and `morx' tables. - - Apple font tools give no warning, although they cannot recognize - what the feature is. At FT_VALIDATE_DEFAULT, gxvalid warns but - continues in both cases (a, b). At FT_VALIDATE_TIGHT, gxvalid warns - and aborts for (a), but continues for (b). At FT_VALIDATE_PARANOID, - gxvalid warns and aborts in both cases (a, b). - - 4-6. invalid prop version (10/183) - ---------------------------------- - - As most TrueType GX tables, the `prop' table must start with a 32bit - version identifier: 0x00010000, 0x00020000 or 0x00030000. But some - fonts store nonsense binary data instead. When Apple font tools - find them, they abort the processing immediately, and the data which - follows is unhandled. gxvalid does the same. - - 10 fonts include broken `prop' version. - - All of these fonts are classic TrueType fonts for the Japanese - script, manufactured by Apple. - - 4-7. unknown resource name (2/183) - ------------------------------------ - - NOTE: THIS IS NOT A TRUETYPE GX ERROR. - - If a TrueType font is stored in the resource fork or in dfont - format, the data must be tagged as `sfnt' in the resource fork index - to invoke TrueType font handler for the data. But the TrueType font - data in `Keyboard.dfont' is tagged as `kbd', and that in - `LastResort.dfont' is tagged as `lst'. Apple font tools can detect - that the data is in TrueType format and successfully validate them. - Maybe this is possible because they are known to be dfont. The - current implementation of the resource fork driver of FreeType - cannot do that, thus gxvalid cannot validate them. - - 2 fonts use an unknown tag for the TrueType font resource. - -5. `kern' table issues ----------------------- - - In common terminology of TrueType, `kern' is classified as a basic and - platform-independent table. But there are Apple extensions of `kern', - and there is an extension which requires a GX state machine for - contextual kerning. Therefore, gxvalid includes a special validator - for `kern' tables. Unfortunately, there is no exact algorithm to - check Apple's extension, so gxvalid includes a heuristic algorithm to - find the proper validation routines for all possible data formats, - including the data format for Microsoft. By calling - classic_kern_validate() instead of gxv_validate(), you can specify the - `kern' format explicitly. However, current FreeType2 uses Microsoft - `kern' format only, others are ignored (and should be handled in a - library one level higher than FreeType). - - 5-1. History - ------------ - - The original 16bit version of `kern' was designed by Apple in the - pre-GX era, and it was also approved by Microsoft. Afterwards, - Apple designed a new 32bit version of the `kern' table. According - to the documentation, the difference between the 16bit and 32bit - version is only the size of variables in the `kern' header. In the - following, we call the original 16bit version as `classic', and - 32bit version as `new'. - - 5-2. Versions and dialects which should be differentiated - --------------------------------------------------------- - - The `kern' table consists of a table header and several subtables. - The version number which identifies a `classic' or a `new' version - is explicitly written in the table header, but there are - undocumented differences between Microsoft's and Apple's formats. - It is called a `dialect' in the following. There are three cases - which should be handled: the new Apple-dialect, the classic - Apple-dialect, and the classic Microsoft-dialect. An analysis of - the formats and the auto detection algorithm of gxvalid is described - in the following. - - 5-2-1. Version detection: classic and new kern - ---------------------------------------------- - - According to Apple TrueType specification, there are only two - differences between the classic and the new: - - - The `kern' table header starts with the version number. - The classic version starts with 0x0000 (16bit), - the new version starts with 0x00010000 (32bit). - - - In the `kern' table header, the number of subtables follows - the version number. - In the classic version, it is stored as a 16bit value. - In the new version, it is stored as a 32bit value. - - From Apple font tool's output (DumpKERN is also tested in addition - to the three Apple font tools in above), there is another - undocumented difference. In the new version, the subtable header - includes a 16bit variable named `tupleIndex' which does not exist - in the classic version. - - The new version can store all subtable formats (0, 1, 2, and 3), - but the Apple TrueType specification does not mention the subtable - formats available in the classic version. - - 5-2-2. Available subtable formats in classic version - ---------------------------------------------------- - - Although the Apple TrueType specification recommends to use the - classic version in the case if the font is designed for both the - Apple and Microsoft platforms, it does not document the available - subtable formats in the classic version. - - According to the Microsoft TrueType specification, the subtable - format assured for Windows and OS/2 support is only subtable - format 0. The Microsoft TrueType specification also describes - subtable format 2, but does not mention which platforms support - it. Aubtable formats 1, 3, and higher are documented as reserved - for future use. Therefore, the classic version can store subtable - formats 0 and 2, at least. `ttfdump.exe', a font tool provided by - Microsoft, ignores the subtable format written in the subtable - header, and parses the table as if all subtables are in format 0. - - `kern' subtable format 1 uses a StateTable, so it cannot be - utilized without a GX State Machine. Therefore, it is reasonable - to assume that format 1 (and 3) were introduced after Apple had - introduced GX and moved to the new 32bit version. - - 5-2-3. Apple and Microsoft dialects - ----------------------------------- - - The `kern' subtable has a 16bit `coverage' field to describe - kerning attributes, but bit interpretations by Apple and Microsoft - are different: For example, Apple uses bits 0-7 to identify the - subtable, while Microsoft uses bits 8-15. - - In addition, due to the output of DumpKERN and FontValidator, - Apple's bit interpretations of coverage in classic and new version - are incompatible also. In summary, there are three dialects: - classic Apple dialect, classic Microsoft dialect, and new Apple - dialect. The classic Microsoft dialect and the new Apple dialect - are documented by each vendors' TrueType font specification, but - the documentation for classic Apple dialect is not available. - - For example, in the new Apple dialect, bit 15 is documented as - `set to 1 if the kerning is vertical'. On the other hand, in - classic Microsoft dialect, bit 1 is documented as `set to 1 if the - kerning is horizontal'. From the outputs of DumpKERN and - FontValidator, classic Apple dialect recognizes 15 as `set to 1 - when the kerning is horizontal'. From the results of similar - experiments, classic Apple dialect seems to be the Endian reverse - of the classic Microsoft dialect. - - As a conclusion it must be noted that no font tool can identify - classic Apple dialect or classic Microsoft dialect automatically. - - 5-2-4. gxvalid auto dialect detection algorithm - ----------------------------------------------- - - The first 16 bits of the `kern' table are enough to identify the - version: - - - if the first 16 bits are 0x0000, the `kern' table is in - classic Apple dialect or classic Microsoft dialect - - if the first 16 bits are 0x0001, and next 16 bits are 0x0000, - the kern table is in new Apple dialect. - - If the `kern' table is a classic one, the 16bit `coverage' field - is checked next. Firstly, the coverage bits are decoded for the - classic Apple dialect using the following bit masks (this is based - on DumpKERN output): - - 0x8000: 1=horizontal, 0=vertical - 0x4000: not used - 0x2000: 1=cross-stream, 0=normal - 0x1FF0: reserved - 0x000F: subtable format - - If any of reserved bits are set or the subtable bits is - interpreted as format 1 or 3, we take it as `impossible in classic - Apple dialect' and retry, using the classic Microsoft dialect. - - The most popular coverage in new Apple-dialect: 0x8000, - The most popular coverage in classic Apple-dialect: 0x0000, - The most popular coverage in classic Microsoft dialect: 0x0001. - - 5-3. Tested fonts - ----------------- - - We checked 59 fonts bundled with MacOS and 38 fonts bundled with - Windows, where all font include a `kern' table. - - - fonts bundled with MacOS - * new Apple dialect - format 0: 18 - format 2: 1 - format 3: 1 - * classic Apple dialect - format 0: 14 - * classic Microsoft dialect - format 0: 15 - - - fonts bundled with Windows - * classic Microsoft dialect - format 0: 38 - - It looks strange that classic Microsoft-dialect fonts are bundled to - MacOS: they come from MSIE for MacOS, except of MarkerFelt.dfont. - - - ACKNOWLEDGEMENT - --------------- - - Some parts of gxvalid are derived from both the `gxlayout' module and - the `otvalid' module. Development of gxlayout was supported by the - Information-technology Promotion Agency(IPA), Japan. - - The detailed analysis of undefined glyph ID utilization in `mort' and - `morx' tables is provided by George Williams. - ------------------------------------------------------------------------- - -Copyright 2004-2015 by -suzuki toshiya, Masatake YAMATO, Red hat K.K., -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. - - ---- end of README --- diff --git a/3party/freetype/src/gxvalid/gxvalid.c b/3party/freetype/src/gxvalid/gxvalid.c deleted file mode 100644 index 7b5b0914db..0000000000 --- a/3party/freetype/src/gxvalid/gxvalid.c +++ /dev/null @@ -1,47 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvalid.c */ -/* */ -/* FreeType validator for TrueTypeGX/AAT tables (body only). */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> - -#include "gxvfeat.c" -#include "gxvcommn.c" -#include "gxvbsln.c" -#include "gxvtrak.c" -#include "gxvjust.c" -#include "gxvmort.c" -#include "gxvmort0.c" -#include "gxvmort1.c" -#include "gxvmort2.c" -#include "gxvmort4.c" -#include "gxvmort5.c" -#include "gxvmorx.c" -#include "gxvmorx0.c" -#include "gxvmorx1.c" -#include "gxvmorx2.c" -#include "gxvmorx4.c" -#include "gxvmorx5.c" -#include "gxvkern.c" -#include "gxvopbd.c" -#include "gxvprop.c" -#include "gxvlcar.c" -#include "gxvmod.c" - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvalid.h b/3party/freetype/src/gxvalid/gxvalid.h deleted file mode 100644 index 8c227d0e0b..0000000000 --- a/3party/freetype/src/gxvalid/gxvalid.h +++ /dev/null @@ -1,108 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvalid.h */ -/* */ -/* TrueTyeeGX/AAT table validation (specification only). */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#ifndef __GXVALID_H__ -#define __GXVALID_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#include "gxverror.h" /* must come before FT_INTERNAL_VALIDATE_H */ - -#include FT_INTERNAL_VALIDATE_H -#include FT_INTERNAL_STREAM_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( void ) - gxv_feat_validate( FT_Bytes table, - FT_Face face, - FT_Validator valid ); - - - FT_LOCAL( void ) - gxv_bsln_validate( FT_Bytes table, - FT_Face face, - FT_Validator valid ); - - - FT_LOCAL( void ) - gxv_trak_validate( FT_Bytes table, - FT_Face face, - FT_Validator valid ); - - FT_LOCAL( void ) - gxv_just_validate( FT_Bytes table, - FT_Face face, - FT_Validator valid ); - - FT_LOCAL( void ) - gxv_mort_validate( FT_Bytes table, - FT_Face face, - FT_Validator valid ); - - FT_LOCAL( void ) - gxv_morx_validate( FT_Bytes table, - FT_Face face, - FT_Validator valid ); - - FT_LOCAL( void ) - gxv_kern_validate( FT_Bytes table, - FT_Face face, - FT_Validator valid ); - - FT_LOCAL( void ) - gxv_kern_validate_classic( FT_Bytes table, - FT_Face face, - FT_Int dialect_flags, - FT_Validator valid ); - - FT_LOCAL( void ) - gxv_opbd_validate( FT_Bytes table, - FT_Face face, - FT_Validator valid ); - - FT_LOCAL( void ) - gxv_prop_validate( FT_Bytes table, - FT_Face face, - FT_Validator valid ); - - FT_LOCAL( void ) - gxv_lcar_validate( FT_Bytes table, - FT_Face face, - FT_Validator valid ); - - -FT_END_HEADER - - -#endif /* __GXVALID_H__ */ - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvbsln.c b/3party/freetype/src/gxvalid/gxvbsln.c deleted file mode 100644 index 1b17a5d033..0000000000 --- a/3party/freetype/src/gxvalid/gxvbsln.c +++ /dev/null @@ -1,334 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvbsln.c */ -/* */ -/* TrueTypeGX/AAT bsln table validation (body). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvalid.h" -#include "gxvcommn.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvbsln - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Data and Types *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define GXV_BSLN_VALUE_COUNT 32 -#define GXV_BSLN_VALUE_EMPTY 0xFFFFU - - - typedef struct GXV_bsln_DataRec_ - { - FT_Bytes ctlPoints_p; - FT_UShort defaultBaseline; - - } GXV_bsln_DataRec, *GXV_bsln_Data; - - -#define GXV_BSLN_DATA( field ) GXV_TABLE_DATA( bsln, field ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** UTILITY FUNCTIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - gxv_bsln_LookupValue_validate( FT_UShort glyph, - GXV_LookupValueCPtr value_p, - GXV_Validator gxvalid ) - { - FT_UShort v = value_p->u; - FT_UShort* ctlPoints; - - FT_UNUSED( glyph ); - - - GXV_NAME_ENTER( "lookup value" ); - - if ( v >= GXV_BSLN_VALUE_COUNT ) - FT_INVALID_DATA; - - ctlPoints = (FT_UShort*)GXV_BSLN_DATA( ctlPoints_p ); - if ( ctlPoints && ctlPoints[v] == GXV_BSLN_VALUE_EMPTY ) - FT_INVALID_DATA; - - GXV_EXIT; - } - - - /* - +===============+ --------+ - | lookup header | | - +===============+ | - | BinSrchHeader | | - +===============+ | - | lastGlyph[0] | | - +---------------+ | - | firstGlyph[0] | | head of lookup table - +---------------+ | + - | offset[0] | -> | offset [byte] - +===============+ | + - | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] - +---------------+ | - | firstGlyph[1] | | - +---------------+ | - | offset[1] | | - +===============+ | - | - ... | - | - 16bit value array | - +===============+ | - | value | <-------+ - ... - */ - - static GXV_LookupValueDesc - gxv_bsln_LookupFmt4_transit( FT_UShort relative_gindex, - GXV_LookupValueCPtr base_value_p, - FT_Bytes lookuptbl_limit, - GXV_Validator gxvalid ) - { - FT_Bytes p; - FT_Bytes limit; - FT_UShort offset; - GXV_LookupValueDesc value; - - /* XXX: check range ? */ - offset = (FT_UShort)( base_value_p->u + - ( relative_gindex * sizeof ( FT_UShort ) ) ); - - p = gxvalid->lookuptbl_head + offset; - limit = lookuptbl_limit; - GXV_LIMIT_CHECK( 2 ); - - value.u = FT_NEXT_USHORT( p ); - - return value; - } - - - static void - gxv_bsln_parts_fmt0_validate( FT_Bytes tables, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = tables; - - - GXV_NAME_ENTER( "parts format 0" ); - - /* deltas */ - GXV_LIMIT_CHECK( 2 * GXV_BSLN_VALUE_COUNT ); - - gxvalid->table_data = NULL; /* No ctlPoints here. */ - - GXV_EXIT; - } - - - static void - gxv_bsln_parts_fmt1_validate( FT_Bytes tables, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = tables; - - - GXV_NAME_ENTER( "parts format 1" ); - - /* deltas */ - gxv_bsln_parts_fmt0_validate( p, limit, gxvalid ); - - /* mappingData */ - gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; - gxvalid->lookupval_func = gxv_bsln_LookupValue_validate; - gxvalid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit; - gxv_LookupTable_validate( p + 2 * GXV_BSLN_VALUE_COUNT, - limit, - gxvalid ); - - GXV_EXIT; - } - - - static void - gxv_bsln_parts_fmt2_validate( FT_Bytes tables, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = tables; - - FT_UShort stdGlyph; - FT_UShort ctlPoint; - FT_Int i; - - FT_UShort defaultBaseline = GXV_BSLN_DATA( defaultBaseline ); - - - GXV_NAME_ENTER( "parts format 2" ); - - GXV_LIMIT_CHECK( 2 + ( 2 * GXV_BSLN_VALUE_COUNT ) ); - - /* stdGlyph */ - stdGlyph = FT_NEXT_USHORT( p ); - GXV_TRACE(( " (stdGlyph = %u)\n", stdGlyph )); - - gxv_glyphid_validate( stdGlyph, gxvalid ); - - /* Record the position of ctlPoints */ - GXV_BSLN_DATA( ctlPoints_p ) = p; - - /* ctlPoints */ - for ( i = 0; i < GXV_BSLN_VALUE_COUNT; i++ ) - { - ctlPoint = FT_NEXT_USHORT( p ); - if ( ctlPoint == GXV_BSLN_VALUE_EMPTY ) - { - if ( i == defaultBaseline ) - FT_INVALID_DATA; - } - else - gxv_ctlPoint_validate( stdGlyph, ctlPoint, gxvalid ); - } - - GXV_EXIT; - } - - - static void - gxv_bsln_parts_fmt3_validate( FT_Bytes tables, - FT_Bytes limit, - GXV_Validator gxvalid) - { - FT_Bytes p = tables; - - - GXV_NAME_ENTER( "parts format 3" ); - - /* stdGlyph + ctlPoints */ - gxv_bsln_parts_fmt2_validate( p, limit, gxvalid ); - - /* mappingData */ - gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; - gxvalid->lookupval_func = gxv_bsln_LookupValue_validate; - gxvalid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit; - gxv_LookupTable_validate( p + ( 2 + 2 * GXV_BSLN_VALUE_COUNT ), - limit, - gxvalid ); - - GXV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** bsln TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - gxv_bsln_validate( FT_Bytes table, - FT_Face face, - FT_Validator ftvalid ) - { - GXV_ValidatorRec gxvalidrec; - GXV_Validator gxvalid = &gxvalidrec; - - GXV_bsln_DataRec bslnrec; - GXV_bsln_Data bsln = &bslnrec; - - FT_Bytes p = table; - FT_Bytes limit = 0; - - FT_ULong version; - FT_UShort format; - FT_UShort defaultBaseline; - - GXV_Validate_Func fmt_funcs_table [] = - { - gxv_bsln_parts_fmt0_validate, - gxv_bsln_parts_fmt1_validate, - gxv_bsln_parts_fmt2_validate, - gxv_bsln_parts_fmt3_validate, - }; - - - gxvalid->root = ftvalid; - gxvalid->table_data = bsln; - gxvalid->face = face; - - FT_TRACE3(( "validating `bsln' table\n" )); - GXV_INIT; - - - GXV_LIMIT_CHECK( 4 + 2 + 2 ); - version = FT_NEXT_ULONG( p ); - format = FT_NEXT_USHORT( p ); - defaultBaseline = FT_NEXT_USHORT( p ); - - /* only version 1.0 is defined (1996) */ - if ( version != 0x00010000UL ) - FT_INVALID_FORMAT; - - /* only format 1, 2, 3 are defined (1996) */ - GXV_TRACE(( " (format = %d)\n", format )); - if ( format > 3 ) - FT_INVALID_FORMAT; - - if ( defaultBaseline > 31 ) - FT_INVALID_FORMAT; - - bsln->defaultBaseline = defaultBaseline; - - fmt_funcs_table[format]( p, limit, gxvalid ); - - FT_TRACE4(( "\n" )); - } - - -/* arch-tag: ebe81143-fdaa-4c68-a4d1-b57227daa3bc - (do not change this comment) */ - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvcommn.c b/3party/freetype/src/gxvalid/gxvcommn.c deleted file mode 100644 index 93f6ffbe23..0000000000 --- a/3party/freetype/src/gxvalid/gxvcommn.c +++ /dev/null @@ -1,1751 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvcommn.c */ -/* */ -/* TrueTypeGX/AAT common tables validation (body). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvcommn.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvcommon - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** 16bit offset sorter *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static int - gxv_compare_ushort_offset( FT_UShort* a, - FT_UShort* b ) - { - if ( *a < *b ) - return -1; - else if ( *a > *b ) - return 1; - else - return 0; - } - - - FT_LOCAL_DEF( void ) - gxv_set_length_by_ushort_offset( FT_UShort* offset, - FT_UShort** length, - FT_UShort* buff, - FT_UInt nmemb, - FT_UShort limit, - GXV_Validator gxvalid ) - { - FT_UInt i; - - - for ( i = 0; i < nmemb; i++ ) - *(length[i]) = 0; - - for ( i = 0; i < nmemb; i++ ) - buff[i] = offset[i]; - buff[nmemb] = limit; - - ft_qsort( buff, ( nmemb + 1 ), sizeof ( FT_UShort ), - ( int(*)(const void*, const void*) )gxv_compare_ushort_offset ); - - if ( buff[nmemb] > limit ) - FT_INVALID_OFFSET; - - for ( i = 0; i < nmemb; i++ ) - { - FT_UInt j; - - - for ( j = 0; j < nmemb; j++ ) - if ( buff[j] == offset[i] ) - break; - - if ( j == nmemb ) - FT_INVALID_OFFSET; - - *(length[i]) = (FT_UShort)( buff[j + 1] - buff[j] ); - - if ( 0 != offset[i] && 0 == *(length[i]) ) - FT_INVALID_OFFSET; - } - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** 32bit offset sorter *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static int - gxv_compare_ulong_offset( FT_ULong* a, - FT_ULong* b ) - { - if ( *a < *b ) - return -1; - else if ( *a > *b ) - return 1; - else - return 0; - } - - - FT_LOCAL_DEF( void ) - gxv_set_length_by_ulong_offset( FT_ULong* offset, - FT_ULong** length, - FT_ULong* buff, - FT_UInt nmemb, - FT_ULong limit, - GXV_Validator gxvalid) - { - FT_UInt i; - - - for ( i = 0; i < nmemb; i++ ) - *(length[i]) = 0; - - for ( i = 0; i < nmemb; i++ ) - buff[i] = offset[i]; - buff[nmemb] = limit; - - ft_qsort( buff, ( nmemb + 1 ), sizeof ( FT_ULong ), - ( int(*)(const void*, const void*) )gxv_compare_ulong_offset ); - - if ( buff[nmemb] > limit ) - FT_INVALID_OFFSET; - - for ( i = 0; i < nmemb; i++ ) - { - FT_UInt j; - - - for ( j = 0; j < nmemb; j++ ) - if ( buff[j] == offset[i] ) - break; - - if ( j == nmemb ) - FT_INVALID_OFFSET; - - *(length[i]) = buff[j + 1] - buff[j]; - - if ( 0 != offset[i] && 0 == *(length[i]) ) - FT_INVALID_OFFSET; - } - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** scan value array and get min & max *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_LOCAL_DEF( void ) - gxv_array_getlimits_byte( FT_Bytes table, - FT_Bytes limit, - FT_Byte* min, - FT_Byte* max, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - - *min = 0xFF; - *max = 0x00; - - while ( p < limit ) - { - FT_Byte val; - - - GXV_LIMIT_CHECK( 1 ); - val = FT_NEXT_BYTE( p ); - - *min = (FT_Byte)FT_MIN( *min, val ); - *max = (FT_Byte)FT_MAX( *max, val ); - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - } - - - FT_LOCAL_DEF( void ) - gxv_array_getlimits_ushort( FT_Bytes table, - FT_Bytes limit, - FT_UShort* min, - FT_UShort* max, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - - *min = 0xFFFFU; - *max = 0x0000; - - while ( p < limit ) - { - FT_UShort val; - - - GXV_LIMIT_CHECK( 2 ); - val = FT_NEXT_USHORT( p ); - - *min = (FT_Byte)FT_MIN( *min, val ); - *max = (FT_Byte)FT_MAX( *max, val ); - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** BINSEARCHHEADER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct GXV_BinSrchHeader_ - { - FT_UShort unitSize; - FT_UShort nUnits; - FT_UShort searchRange; - FT_UShort entrySelector; - FT_UShort rangeShift; - - } GXV_BinSrchHeader; - - - static void - gxv_BinSrchHeader_check_consistency( GXV_BinSrchHeader* binSrchHeader, - GXV_Validator gxvalid ) - { - FT_UShort searchRange; - FT_UShort entrySelector; - FT_UShort rangeShift; - - - if ( binSrchHeader->unitSize == 0 ) - FT_INVALID_DATA; - - if ( binSrchHeader->nUnits == 0 ) - { - if ( binSrchHeader->searchRange == 0 && - binSrchHeader->entrySelector == 0 && - binSrchHeader->rangeShift == 0 ) - return; - else - FT_INVALID_DATA; - } - - for ( searchRange = 1, entrySelector = 1; - ( searchRange * 2 ) <= binSrchHeader->nUnits && - searchRange < 0x8000U; - searchRange *= 2, entrySelector++ ) - ; - - entrySelector--; - searchRange = (FT_UShort)( searchRange * binSrchHeader->unitSize ); - rangeShift = (FT_UShort)( binSrchHeader->nUnits * binSrchHeader->unitSize - - searchRange ); - - if ( searchRange != binSrchHeader->searchRange || - entrySelector != binSrchHeader->entrySelector || - rangeShift != binSrchHeader->rangeShift ) - { - GXV_TRACE(( "Inconsistency found in BinSrchHeader\n" )); - GXV_TRACE(( "originally: unitSize=%d, nUnits=%d, " - "searchRange=%d, entrySelector=%d, " - "rangeShift=%d\n", - binSrchHeader->unitSize, binSrchHeader->nUnits, - binSrchHeader->searchRange, binSrchHeader->entrySelector, - binSrchHeader->rangeShift )); - GXV_TRACE(( "calculated: unitSize=%d, nUnits=%d, " - "searchRange=%d, entrySelector=%d, " - "rangeShift=%d\n", - binSrchHeader->unitSize, binSrchHeader->nUnits, - searchRange, entrySelector, rangeShift )); - - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - } - } - - - /* - * parser & validator of BinSrchHeader - * which is used in LookupTable format 2, 4, 6. - * - * Essential parameters (unitSize, nUnits) are returned by - * given pointer, others (searchRange, entrySelector, rangeShift) - * can be calculated by essential parameters, so they are just - * validated and discarded. - * - * However, wrong values in searchRange, entrySelector, rangeShift - * won't cause fatal errors, because these parameters might be - * only used in old m68k font driver in MacOS. - * -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> - */ - - FT_LOCAL_DEF( void ) - gxv_BinSrchHeader_validate( FT_Bytes table, - FT_Bytes limit, - FT_UShort* unitSize_p, - FT_UShort* nUnits_p, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - GXV_BinSrchHeader binSrchHeader; - - - GXV_NAME_ENTER( "BinSrchHeader validate" ); - - if ( *unitSize_p == 0 ) - { - GXV_LIMIT_CHECK( 2 ); - binSrchHeader.unitSize = FT_NEXT_USHORT( p ); - } - else - binSrchHeader.unitSize = *unitSize_p; - - if ( *nUnits_p == 0 ) - { - GXV_LIMIT_CHECK( 2 ); - binSrchHeader.nUnits = FT_NEXT_USHORT( p ); - } - else - binSrchHeader.nUnits = *nUnits_p; - - GXV_LIMIT_CHECK( 2 + 2 + 2 ); - binSrchHeader.searchRange = FT_NEXT_USHORT( p ); - binSrchHeader.entrySelector = FT_NEXT_USHORT( p ); - binSrchHeader.rangeShift = FT_NEXT_USHORT( p ); - GXV_TRACE(( "nUnits %d\n", binSrchHeader.nUnits )); - - gxv_BinSrchHeader_check_consistency( &binSrchHeader, gxvalid ); - - if ( *unitSize_p == 0 ) - *unitSize_p = binSrchHeader.unitSize; - - if ( *nUnits_p == 0 ) - *nUnits_p = binSrchHeader.nUnits; - - gxvalid->subtable_length = (FT_ULong)( p - table ); - GXV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** LOOKUP TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define GXV_LOOKUP_VALUE_LOAD( P, SIGNSPEC ) \ - ( P += 2, gxv_lookup_value_load( P - 2, SIGNSPEC ) ) - - static GXV_LookupValueDesc - gxv_lookup_value_load( FT_Bytes p, - int signspec ) - { - GXV_LookupValueDesc v; - - - if ( signspec == GXV_LOOKUPVALUE_UNSIGNED ) - v.u = FT_NEXT_USHORT( p ); - else - v.s = FT_NEXT_SHORT( p ); - - return v; - } - - -#define GXV_UNITSIZE_VALIDATE( FORMAT, UNITSIZE, NUNITS, CORRECTSIZE ) \ - FT_BEGIN_STMNT \ - if ( UNITSIZE != CORRECTSIZE ) \ - { \ - FT_ERROR(( "unitSize=%d differs from" \ - " expected unitSize=%d" \ - " in LookupTable %s\n", \ - UNITSIZE, CORRECTSIZE, FORMAT )); \ - if ( UNITSIZE != 0 && NUNITS != 0 ) \ - { \ - FT_ERROR(( " cannot validate anymore\n" )); \ - FT_INVALID_FORMAT; \ - } \ - else \ - FT_ERROR(( " forcibly continues\n" )); \ - } \ - FT_END_STMNT - - - /* ================= Simple Array Format 0 Lookup Table ================ */ - static void - gxv_LookupTable_fmt0_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort i; - - GXV_LookupValueDesc value; - - - GXV_NAME_ENTER( "LookupTable format 0" ); - - GXV_LIMIT_CHECK( 2 * gxvalid->face->num_glyphs ); - - for ( i = 0; i < gxvalid->face->num_glyphs; i++ ) - { - GXV_LIMIT_CHECK( 2 ); - if ( p + 2 >= limit ) /* some fonts have too-short fmt0 array */ - { - GXV_TRACE(( "too short, glyphs %d - %d are missing\n", - i, gxvalid->face->num_glyphs )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); - break; - } - - value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign ); - gxvalid->lookupval_func( i, &value, gxvalid ); - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - GXV_EXIT; - } - - - /* ================= Segment Single Format 2 Loolup Table ============== */ - /* - * Apple spec says: - * - * To guarantee that a binary search terminates, you must include one or - * more special `end of search table' values at the end of the data to - * be searched. The number of termination values that need to be - * included is table-specific. The value that indicates binary search - * termination is 0xFFFF. - * - * The problem is that nUnits does not include this end-marker. It's - * quite difficult to discriminate whether the following 0xFFFF comes from - * the end-marker or some next data. - * - * -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> - */ - static void - gxv_LookupTable_fmt2_skip_endmarkers( FT_Bytes table, - FT_UShort unitSize, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - - while ( ( p + 4 ) < gxvalid->root->limit ) - { - if ( p[0] != 0xFF || p[1] != 0xFF || /* lastGlyph */ - p[2] != 0xFF || p[3] != 0xFF ) /* firstGlyph */ - break; - p += unitSize; - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - } - - - static void - gxv_LookupTable_fmt2_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort gid; - - FT_UShort unitSize; - FT_UShort nUnits; - FT_UShort unit; - FT_UShort lastGlyph; - FT_UShort firstGlyph; - GXV_LookupValueDesc value; - - - GXV_NAME_ENTER( "LookupTable format 2" ); - - unitSize = nUnits = 0; - gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, gxvalid ); - p += gxvalid->subtable_length; - - GXV_UNITSIZE_VALIDATE( "format2", unitSize, nUnits, 6 ); - - for ( unit = 0, gid = 0; unit < nUnits; unit++ ) - { - GXV_LIMIT_CHECK( 2 + 2 + 2 ); - lastGlyph = FT_NEXT_USHORT( p ); - firstGlyph = FT_NEXT_USHORT( p ); - value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign ); - - gxv_glyphid_validate( firstGlyph, gxvalid ); - gxv_glyphid_validate( lastGlyph, gxvalid ); - - if ( lastGlyph < gid ) - { - GXV_TRACE(( "reverse ordered segment specification:" - " lastGlyph[%d]=%d < lastGlyph[%d]=%d\n", - unit, lastGlyph, unit - 1 , gid )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); - } - - if ( lastGlyph < firstGlyph ) - { - GXV_TRACE(( "reverse ordered range specification at unit %d:", - " lastGlyph %d < firstGlyph %d ", - unit, lastGlyph, firstGlyph )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); - - if ( gxvalid->root->level == FT_VALIDATE_TIGHT ) - continue; /* ftxvalidator silently skips such an entry */ - - FT_TRACE4(( "continuing with exchanged values\n" )); - gid = firstGlyph; - firstGlyph = lastGlyph; - lastGlyph = gid; - } - - for ( gid = firstGlyph; gid <= lastGlyph; gid++ ) - gxvalid->lookupval_func( gid, &value, gxvalid ); - } - - gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, gxvalid ); - p += gxvalid->subtable_length; - - gxvalid->subtable_length = (FT_ULong)( p - table ); - GXV_EXIT; - } - - - /* ================= Segment Array Format 4 Lookup Table =============== */ - static void - gxv_LookupTable_fmt4_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort unit; - FT_UShort gid; - - FT_UShort unitSize; - FT_UShort nUnits; - FT_UShort lastGlyph; - FT_UShort firstGlyph; - GXV_LookupValueDesc base_value; - GXV_LookupValueDesc value; - - - GXV_NAME_ENTER( "LookupTable format 4" ); - - unitSize = nUnits = 0; - gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, gxvalid ); - p += gxvalid->subtable_length; - - GXV_UNITSIZE_VALIDATE( "format4", unitSize, nUnits, 6 ); - - for ( unit = 0, gid = 0; unit < nUnits; unit++ ) - { - GXV_LIMIT_CHECK( 2 + 2 ); - lastGlyph = FT_NEXT_USHORT( p ); - firstGlyph = FT_NEXT_USHORT( p ); - - gxv_glyphid_validate( firstGlyph, gxvalid ); - gxv_glyphid_validate( lastGlyph, gxvalid ); - - if ( lastGlyph < gid ) - { - GXV_TRACE(( "reverse ordered segment specification:" - " lastGlyph[%d]=%d < lastGlyph[%d]=%d\n", - unit, lastGlyph, unit - 1 , gid )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); - } - - if ( lastGlyph < firstGlyph ) - { - GXV_TRACE(( "reverse ordered range specification at unit %d:", - " lastGlyph %d < firstGlyph %d ", - unit, lastGlyph, firstGlyph )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); - - if ( gxvalid->root->level == FT_VALIDATE_TIGHT ) - continue; /* ftxvalidator silently skips such an entry */ - - FT_TRACE4(( "continuing with exchanged values\n" )); - gid = firstGlyph; - firstGlyph = lastGlyph; - lastGlyph = gid; - } - - GXV_LIMIT_CHECK( 2 ); - base_value = GXV_LOOKUP_VALUE_LOAD( p, GXV_LOOKUPVALUE_UNSIGNED ); - - for ( gid = firstGlyph; gid <= lastGlyph; gid++ ) - { - value = gxvalid->lookupfmt4_trans( (FT_UShort)( gid - firstGlyph ), - &base_value, - limit, - gxvalid ); - - gxvalid->lookupval_func( gid, &value, gxvalid ); - } - } - - gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, gxvalid ); - p += gxvalid->subtable_length; - - gxvalid->subtable_length = (FT_ULong)( p - table ); - GXV_EXIT; - } - - - /* ================= Segment Table Format 6 Lookup Table =============== */ - static void - gxv_LookupTable_fmt6_skip_endmarkers( FT_Bytes table, - FT_UShort unitSize, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - - while ( p < gxvalid->root->limit ) - { - if ( p[0] != 0xFF || p[1] != 0xFF ) - break; - p += unitSize; - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - } - - - static void - gxv_LookupTable_fmt6_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort unit; - FT_UShort prev_glyph; - - FT_UShort unitSize; - FT_UShort nUnits; - FT_UShort glyph; - GXV_LookupValueDesc value; - - - GXV_NAME_ENTER( "LookupTable format 6" ); - - unitSize = nUnits = 0; - gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, gxvalid ); - p += gxvalid->subtable_length; - - GXV_UNITSIZE_VALIDATE( "format6", unitSize, nUnits, 4 ); - - for ( unit = 0, prev_glyph = 0; unit < nUnits; unit++ ) - { - GXV_LIMIT_CHECK( 2 + 2 ); - glyph = FT_NEXT_USHORT( p ); - value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign ); - - if ( gxv_glyphid_validate( glyph, gxvalid ) ) - GXV_TRACE(( " endmarker found within defined range" - " (entry %d < nUnits=%d)\n", - unit, nUnits )); - - if ( prev_glyph > glyph ) - { - GXV_TRACE(( "current gid 0x%04x < previous gid 0x%04x\n", - glyph, prev_glyph )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); - } - prev_glyph = glyph; - - gxvalid->lookupval_func( glyph, &value, gxvalid ); - } - - gxv_LookupTable_fmt6_skip_endmarkers( p, unitSize, gxvalid ); - p += gxvalid->subtable_length; - - gxvalid->subtable_length = (FT_ULong)( p - table ); - GXV_EXIT; - } - - - /* ================= Trimmed Array Format 8 Lookup Table =============== */ - static void - gxv_LookupTable_fmt8_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort i; - - GXV_LookupValueDesc value; - FT_UShort firstGlyph; - FT_UShort glyphCount; - - - GXV_NAME_ENTER( "LookupTable format 8" ); - - /* firstGlyph + glyphCount */ - GXV_LIMIT_CHECK( 2 + 2 ); - firstGlyph = FT_NEXT_USHORT( p ); - glyphCount = FT_NEXT_USHORT( p ); - - gxv_glyphid_validate( firstGlyph, gxvalid ); - gxv_glyphid_validate( (FT_UShort)( firstGlyph + glyphCount ), gxvalid ); - - /* valueArray */ - for ( i = 0; i < glyphCount; i++ ) - { - GXV_LIMIT_CHECK( 2 ); - value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign ); - gxvalid->lookupval_func( (FT_UShort)( firstGlyph + i ), &value, gxvalid ); - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - GXV_EXIT; - } - - - FT_LOCAL_DEF( void ) - gxv_LookupTable_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort format; - - GXV_Validate_Func fmt_funcs_table[] = - { - gxv_LookupTable_fmt0_validate, /* 0 */ - NULL, /* 1 */ - gxv_LookupTable_fmt2_validate, /* 2 */ - NULL, /* 3 */ - gxv_LookupTable_fmt4_validate, /* 4 */ - NULL, /* 5 */ - gxv_LookupTable_fmt6_validate, /* 6 */ - NULL, /* 7 */ - gxv_LookupTable_fmt8_validate, /* 8 */ - }; - - GXV_Validate_Func func; - - - GXV_NAME_ENTER( "LookupTable" ); - - /* lookuptbl_head may be used in fmt4 transit function. */ - gxvalid->lookuptbl_head = table; - - /* format */ - GXV_LIMIT_CHECK( 2 ); - format = FT_NEXT_USHORT( p ); - GXV_TRACE(( " (format %d)\n", format )); - - if ( format > 8 ) - FT_INVALID_FORMAT; - - func = fmt_funcs_table[format]; - if ( func == NULL ) - FT_INVALID_FORMAT; - - func( p, limit, gxvalid ); - p += gxvalid->subtable_length; - - gxvalid->subtable_length = (FT_ULong)( p - table ); - - GXV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Glyph ID *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( FT_Int ) - gxv_glyphid_validate( FT_UShort gid, - GXV_Validator gxvalid ) - { - FT_Face face; - - - if ( gid == 0xFFFFU ) - { - GXV_EXIT; - return 1; - } - - face = gxvalid->face; - if ( face->num_glyphs < gid ) - { - GXV_TRACE(( " gxv_glyphid_check() gid overflow: num_glyphs %d < %d\n", - face->num_glyphs, gid )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); - } - - return 0; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CONTROL POINT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - gxv_ctlPoint_validate( FT_UShort gid, - FT_UShort ctl_point, - GXV_Validator gxvalid ) - { - FT_Face face; - FT_Error error; - - FT_GlyphSlot glyph; - FT_Outline outline; - FT_UShort n_points; - - - face = gxvalid->face; - - error = FT_Load_Glyph( face, - gid, - FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM ); - if ( error ) - FT_INVALID_GLYPH_ID; - - glyph = face->glyph; - outline = glyph->outline; - n_points = (FT_UShort)outline.n_points; - - if ( !( ctl_point < n_points ) ) - FT_INVALID_DATA; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** SFNT NAME *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - gxv_sfntName_validate( FT_UShort name_index, - FT_UShort min_index, - FT_UShort max_index, - GXV_Validator gxvalid ) - { - FT_SfntName name; - FT_UInt i; - FT_UInt nnames; - - - GXV_NAME_ENTER( "sfntName" ); - - if ( name_index < min_index || max_index < name_index ) - FT_INVALID_FORMAT; - - nnames = FT_Get_Sfnt_Name_Count( gxvalid->face ); - for ( i = 0; i < nnames; i++ ) - { - if ( FT_Get_Sfnt_Name( gxvalid->face, i, &name ) != FT_Err_Ok ) - continue ; - - if ( name.name_id == name_index ) - goto Out; - } - - GXV_TRACE(( " nameIndex = %d (UNTITLED)\n", name_index )); - FT_INVALID_DATA; - goto Exit; /* make compiler happy */ - - Out: - FT_TRACE1(( " nameIndex = %d (", name_index )); - GXV_TRACE_HEXDUMP_SFNTNAME( name ); - FT_TRACE1(( ")\n" )); - - Exit: - GXV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** STATE TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* -------------------------- Class Table --------------------------- */ - - /* - * highestClass specifies how many classes are defined in this - * Class Subtable. Apple spec does not mention whether undefined - * holes in the class (e.g.: 0-3 are predefined, 4 is unused, 5 is used) - * are permitted. At present, holes in a defined class are not checked. - * -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> - */ - - static void - gxv_ClassTable_validate( FT_Bytes table, - FT_UShort* length_p, - FT_UShort stateSize, - FT_Byte* maxClassID_p, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_Bytes limit = table + *length_p; - FT_UShort firstGlyph; - FT_UShort nGlyphs; - - - GXV_NAME_ENTER( "ClassTable" ); - - *maxClassID_p = 3; /* Classes 0, 2, and 3 are predefined */ - - GXV_LIMIT_CHECK( 2 + 2 ); - firstGlyph = FT_NEXT_USHORT( p ); - nGlyphs = FT_NEXT_USHORT( p ); - - GXV_TRACE(( " (firstGlyph = %d, nGlyphs = %d)\n", firstGlyph, nGlyphs )); - - if ( !nGlyphs ) - goto Out; - - gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs ), gxvalid ); - - { - FT_Byte nGlyphInClass[256]; - FT_Byte classID; - FT_UShort i; - - - ft_memset( nGlyphInClass, 0, 256 ); - - - for ( i = 0; i < nGlyphs; i++ ) - { - GXV_LIMIT_CHECK( 1 ); - classID = FT_NEXT_BYTE( p ); - switch ( classID ) - { - /* following classes should not appear in class array */ - case 0: /* end of text */ - case 2: /* out of bounds */ - case 3: /* end of line */ - FT_INVALID_DATA; - break; - - case 1: /* out of bounds */ - default: /* user-defined: 4 - ( stateSize - 1 ) */ - if ( classID >= stateSize ) - FT_INVALID_DATA; /* assign glyph to undefined state */ - - nGlyphInClass[classID]++; - break; - } - } - *length_p = (FT_UShort)( p - table ); - - /* scan max ClassID in use */ - for ( i = 0; i < stateSize; i++ ) - if ( ( 3 < i ) && ( nGlyphInClass[i] > 0 ) ) - *maxClassID_p = (FT_Byte)i; /* XXX: Check Range? */ - } - - Out: - GXV_TRACE(( "Declared stateSize=0x%02x, Used maxClassID=0x%02x\n", - stateSize, *maxClassID_p )); - GXV_EXIT; - } - - - /* --------------------------- State Array ----------------------------- */ - - static void - gxv_StateArray_validate( FT_Bytes table, - FT_UShort* length_p, - FT_Byte maxClassID, - FT_UShort stateSize, - FT_Byte* maxState_p, - FT_Byte* maxEntry_p, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_Bytes limit = table + *length_p; - FT_Byte clazz; - FT_Byte entry; - - FT_UNUSED( stateSize ); /* for the non-debugging case */ - - - GXV_NAME_ENTER( "StateArray" ); - - GXV_TRACE(( "parse %d bytes by stateSize=%d maxClassID=%d\n", - (int)(*length_p), stateSize, (int)(maxClassID) )); - - /* - * 2 states are predefined and must be described in StateArray: - * state 0 (start of text), 1 (start of line) - */ - GXV_LIMIT_CHECK( ( 1 + maxClassID ) * 2 ); - - *maxState_p = 0; - *maxEntry_p = 0; - - /* read if enough to read another state */ - while ( p + ( 1 + maxClassID ) <= limit ) - { - (*maxState_p)++; - for ( clazz = 0; clazz <= maxClassID; clazz++ ) - { - entry = FT_NEXT_BYTE( p ); - *maxEntry_p = (FT_Byte)FT_MAX( *maxEntry_p, entry ); - } - } - GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n", - *maxState_p, *maxEntry_p )); - - *length_p = (FT_UShort)( p - table ); - - GXV_EXIT; - } - - - /* --------------------------- Entry Table ----------------------------- */ - - static void - gxv_EntryTable_validate( FT_Bytes table, - FT_UShort* length_p, - FT_Byte maxEntry, - FT_UShort stateArray, - FT_UShort stateArray_length, - FT_Byte maxClassID, - FT_Bytes statetable_table, - FT_Bytes statetable_limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_Bytes limit = table + *length_p; - FT_Byte entry; - FT_Byte state; - FT_Int entrySize = 2 + 2 + GXV_GLYPHOFFSET_SIZE( statetable ); - - GXV_XStateTable_GlyphOffsetDesc glyphOffset; - - - GXV_NAME_ENTER( "EntryTable" ); - - GXV_TRACE(( "maxEntry=%d entrySize=%d\n", maxEntry, entrySize )); - - if ( ( maxEntry + 1 ) * entrySize > *length_p ) - { - GXV_SET_ERR_IF_PARANOID( FT_INVALID_TOO_SHORT ); - - /* ftxvalidator and FontValidator both warn and continue */ - maxEntry = (FT_Byte)( *length_p / entrySize - 1 ); - GXV_TRACE(( "too large maxEntry, shrinking to %d fit EntryTable length\n", - maxEntry )); - } - - for ( entry = 0; entry <= maxEntry; entry++ ) - { - FT_UShort newState; - FT_UShort flags; - - - GXV_LIMIT_CHECK( 2 + 2 ); - newState = FT_NEXT_USHORT( p ); - flags = FT_NEXT_USHORT( p ); - - - if ( newState < stateArray || - stateArray + stateArray_length < newState ) - { - GXV_TRACE(( " newState offset 0x%04x is out of stateArray\n", - newState )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); - continue; - } - - if ( 0 != ( ( newState - stateArray ) % ( 1 + maxClassID ) ) ) - { - GXV_TRACE(( " newState offset 0x%04x is not aligned to %d-classes\n", - newState, 1 + maxClassID )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); - continue; - } - - state = (FT_Byte)( ( newState - stateArray ) / ( 1 + maxClassID ) ); - - switch ( GXV_GLYPHOFFSET_FMT( statetable ) ) - { - case GXV_GLYPHOFFSET_NONE: - glyphOffset.uc = 0; /* make compiler happy */ - break; - - case GXV_GLYPHOFFSET_UCHAR: - glyphOffset.uc = FT_NEXT_BYTE( p ); - break; - - case GXV_GLYPHOFFSET_CHAR: - glyphOffset.c = FT_NEXT_CHAR( p ); - break; - - case GXV_GLYPHOFFSET_USHORT: - glyphOffset.u = FT_NEXT_USHORT( p ); - break; - - case GXV_GLYPHOFFSET_SHORT: - glyphOffset.s = FT_NEXT_SHORT( p ); - break; - - case GXV_GLYPHOFFSET_ULONG: - glyphOffset.ul = FT_NEXT_ULONG( p ); - break; - - case GXV_GLYPHOFFSET_LONG: - glyphOffset.l = FT_NEXT_LONG( p ); - break; - - default: - GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT ); - goto Exit; - } - - if ( NULL != gxvalid->statetable.entry_validate_func ) - gxvalid->statetable.entry_validate_func( state, - flags, - &glyphOffset, - statetable_table, - statetable_limit, - gxvalid ); - } - - Exit: - *length_p = (FT_UShort)( p - table ); - - GXV_EXIT; - } - - - /* =========================== State Table ============================= */ - - FT_LOCAL_DEF( void ) - gxv_StateTable_subtable_setup( FT_UShort table_size, - FT_UShort classTable, - FT_UShort stateArray, - FT_UShort entryTable, - FT_UShort* classTable_length_p, - FT_UShort* stateArray_length_p, - FT_UShort* entryTable_length_p, - GXV_Validator gxvalid ) - { - FT_UShort o[3]; - FT_UShort* l[3]; - FT_UShort buff[4]; - - - o[0] = classTable; - o[1] = stateArray; - o[2] = entryTable; - l[0] = classTable_length_p; - l[1] = stateArray_length_p; - l[2] = entryTable_length_p; - - gxv_set_length_by_ushort_offset( o, l, buff, 3, table_size, gxvalid ); - } - - - FT_LOCAL_DEF( void ) - gxv_StateTable_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_UShort stateSize; - FT_UShort classTable; /* offset to Class(Sub)Table */ - FT_UShort stateArray; /* offset to StateArray */ - FT_UShort entryTable; /* offset to EntryTable */ - - FT_UShort classTable_length; - FT_UShort stateArray_length; - FT_UShort entryTable_length; - FT_Byte maxClassID; - FT_Byte maxState; - FT_Byte maxEntry; - - GXV_StateTable_Subtable_Setup_Func setup_func; - - FT_Bytes p = table; - - - GXV_NAME_ENTER( "StateTable" ); - - GXV_TRACE(( "StateTable header\n" )); - - GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 ); - stateSize = FT_NEXT_USHORT( p ); - classTable = FT_NEXT_USHORT( p ); - stateArray = FT_NEXT_USHORT( p ); - entryTable = FT_NEXT_USHORT( p ); - - GXV_TRACE(( "stateSize=0x%04x\n", stateSize )); - GXV_TRACE(( "offset to classTable=0x%04x\n", classTable )); - GXV_TRACE(( "offset to stateArray=0x%04x\n", stateArray )); - GXV_TRACE(( "offset to entryTable=0x%04x\n", entryTable )); - - if ( stateSize > 0xFF ) - FT_INVALID_DATA; - - if ( gxvalid->statetable.optdata_load_func != NULL ) - gxvalid->statetable.optdata_load_func( p, limit, gxvalid ); - - if ( gxvalid->statetable.subtable_setup_func != NULL) - setup_func = gxvalid->statetable.subtable_setup_func; - else - setup_func = gxv_StateTable_subtable_setup; - - setup_func( (FT_UShort)( limit - table ), - classTable, - stateArray, - entryTable, - &classTable_length, - &stateArray_length, - &entryTable_length, - gxvalid ); - - GXV_TRACE(( "StateTable Subtables\n" )); - - if ( classTable != 0 ) - gxv_ClassTable_validate( table + classTable, - &classTable_length, - stateSize, - &maxClassID, - gxvalid ); - else - maxClassID = (FT_Byte)( stateSize - 1 ); - - if ( stateArray != 0 ) - gxv_StateArray_validate( table + stateArray, - &stateArray_length, - maxClassID, - stateSize, - &maxState, - &maxEntry, - gxvalid ); - else - { -#if 0 - maxState = 1; /* 0:start of text, 1:start of line are predefined */ -#endif - maxEntry = 0; - } - - if ( maxEntry > 0 && entryTable == 0 ) - FT_INVALID_OFFSET; - - if ( entryTable != 0 ) - gxv_EntryTable_validate( table + entryTable, - &entryTable_length, - maxEntry, - stateArray, - stateArray_length, - maxClassID, - table, - limit, - gxvalid ); - - GXV_EXIT; - } - - - /* ================= eXtended State Table (for morx) =================== */ - - FT_LOCAL_DEF( void ) - gxv_XStateTable_subtable_setup( FT_ULong table_size, - FT_ULong classTable, - FT_ULong stateArray, - FT_ULong entryTable, - FT_ULong* classTable_length_p, - FT_ULong* stateArray_length_p, - FT_ULong* entryTable_length_p, - GXV_Validator gxvalid ) - { - FT_ULong o[3]; - FT_ULong* l[3]; - FT_ULong buff[4]; - - - o[0] = classTable; - o[1] = stateArray; - o[2] = entryTable; - l[0] = classTable_length_p; - l[1] = stateArray_length_p; - l[2] = entryTable_length_p; - - gxv_set_length_by_ulong_offset( o, l, buff, 3, table_size, gxvalid ); - } - - - static void - gxv_XClassTable_lookupval_validate( FT_UShort glyph, - GXV_LookupValueCPtr value_p, - GXV_Validator gxvalid ) - { - FT_UNUSED( glyph ); - - if ( value_p->u >= gxvalid->xstatetable.nClasses ) - FT_INVALID_DATA; - if ( value_p->u > gxvalid->xstatetable.maxClassID ) - gxvalid->xstatetable.maxClassID = value_p->u; - } - - - /* - +===============+ --------+ - | lookup header | | - +===============+ | - | BinSrchHeader | | - +===============+ | - | lastGlyph[0] | | - +---------------+ | - | firstGlyph[0] | | head of lookup table - +---------------+ | + - | offset[0] | -> | offset [byte] - +===============+ | + - | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] - +---------------+ | - | firstGlyph[1] | | - +---------------+ | - | offset[1] | | - +===============+ | - | - .... | - | - 16bit value array | - +===============+ | - | value | <-------+ - .... - */ - static GXV_LookupValueDesc - gxv_XClassTable_lookupfmt4_transit( FT_UShort relative_gindex, - GXV_LookupValueCPtr base_value_p, - FT_Bytes lookuptbl_limit, - GXV_Validator gxvalid ) - { - FT_Bytes p; - FT_Bytes limit; - FT_UShort offset; - GXV_LookupValueDesc value; - - /* XXX: check range? */ - offset = (FT_UShort)( base_value_p->u + - relative_gindex * sizeof ( FT_UShort ) ); - - p = gxvalid->lookuptbl_head + offset; - limit = lookuptbl_limit; - - GXV_LIMIT_CHECK ( 2 ); - value.u = FT_NEXT_USHORT( p ); - - return value; - } - - - static void - gxv_XStateArray_validate( FT_Bytes table, - FT_ULong* length_p, - FT_UShort maxClassID, - FT_ULong stateSize, - FT_UShort* maxState_p, - FT_UShort* maxEntry_p, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_Bytes limit = table + *length_p; - FT_UShort clazz; - FT_UShort entry; - - FT_UNUSED( stateSize ); /* for the non-debugging case */ - - - GXV_NAME_ENTER( "XStateArray" ); - - GXV_TRACE(( "parse % 3d bytes by stateSize=% 3d maxClassID=% 3d\n", - (int)(*length_p), stateSize, (int)(maxClassID) )); - - /* - * 2 states are predefined and must be described: - * state 0 (start of text), 1 (start of line) - */ - GXV_LIMIT_CHECK( ( 1 + maxClassID ) * 2 * 2 ); - - *maxState_p = 0; - *maxEntry_p = 0; - - /* read if enough to read another state */ - while ( p + ( ( 1 + maxClassID ) * 2 ) <= limit ) - { - (*maxState_p)++; - for ( clazz = 0; clazz <= maxClassID; clazz++ ) - { - entry = FT_NEXT_USHORT( p ); - *maxEntry_p = (FT_UShort)FT_MAX( *maxEntry_p, entry ); - } - } - GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n", - *maxState_p, *maxEntry_p )); - - *length_p = (FT_ULong)( p - table ); - - GXV_EXIT; - } - - - static void - gxv_XEntryTable_validate( FT_Bytes table, - FT_ULong* length_p, - FT_UShort maxEntry, - FT_ULong stateArray_length, - FT_UShort maxClassID, - FT_Bytes xstatetable_table, - FT_Bytes xstatetable_limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_Bytes limit = table + *length_p; - FT_UShort entry; - FT_UShort state; - FT_Int entrySize = 2 + 2 + GXV_GLYPHOFFSET_SIZE( xstatetable ); - - - GXV_NAME_ENTER( "XEntryTable" ); - GXV_TRACE(( "maxEntry=%d entrySize=%d\n", maxEntry, entrySize )); - - if ( ( p + ( maxEntry + 1 ) * entrySize ) > limit ) - FT_INVALID_TOO_SHORT; - - for (entry = 0; entry <= maxEntry ; entry++ ) - { - FT_UShort newState_idx; - FT_UShort flags; - GXV_XStateTable_GlyphOffsetDesc glyphOffset; - - - GXV_LIMIT_CHECK( 2 + 2 ); - newState_idx = FT_NEXT_USHORT( p ); - flags = FT_NEXT_USHORT( p ); - - if ( stateArray_length < (FT_ULong)( newState_idx * 2 ) ) - { - GXV_TRACE(( " newState index 0x%04x points out of stateArray\n", - newState_idx )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); - } - - state = (FT_UShort)( newState_idx / ( 1 + maxClassID ) ); - if ( 0 != ( newState_idx % ( 1 + maxClassID ) ) ) - { - FT_TRACE4(( "-> new state = %d (supposed)\n" - "but newState index 0x%04x is not aligned to %d-classes\n", - state, newState_idx, 1 + maxClassID )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); - } - - switch ( GXV_GLYPHOFFSET_FMT( xstatetable ) ) - { - case GXV_GLYPHOFFSET_NONE: - glyphOffset.uc = 0; /* make compiler happy */ - break; - - case GXV_GLYPHOFFSET_UCHAR: - glyphOffset.uc = FT_NEXT_BYTE( p ); - break; - - case GXV_GLYPHOFFSET_CHAR: - glyphOffset.c = FT_NEXT_CHAR( p ); - break; - - case GXV_GLYPHOFFSET_USHORT: - glyphOffset.u = FT_NEXT_USHORT( p ); - break; - - case GXV_GLYPHOFFSET_SHORT: - glyphOffset.s = FT_NEXT_SHORT( p ); - break; - - case GXV_GLYPHOFFSET_ULONG: - glyphOffset.ul = FT_NEXT_ULONG( p ); - break; - - case GXV_GLYPHOFFSET_LONG: - glyphOffset.l = FT_NEXT_LONG( p ); - break; - - default: - GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT ); - goto Exit; - } - - if ( NULL != gxvalid->xstatetable.entry_validate_func ) - gxvalid->xstatetable.entry_validate_func( state, - flags, - &glyphOffset, - xstatetable_table, - xstatetable_limit, - gxvalid ); - } - - Exit: - *length_p = (FT_ULong)( p - table ); - - GXV_EXIT; - } - - - FT_LOCAL_DEF( void ) - gxv_XStateTable_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - /* StateHeader members */ - FT_ULong classTable; /* offset to Class(Sub)Table */ - FT_ULong stateArray; /* offset to StateArray */ - FT_ULong entryTable; /* offset to EntryTable */ - - FT_ULong classTable_length; - FT_ULong stateArray_length; - FT_ULong entryTable_length; - FT_UShort maxState; - FT_UShort maxEntry; - - GXV_XStateTable_Subtable_Setup_Func setup_func; - - FT_Bytes p = table; - - - GXV_NAME_ENTER( "XStateTable" ); - - GXV_TRACE(( "XStateTable header\n" )); - - GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 ); - gxvalid->xstatetable.nClasses = FT_NEXT_ULONG( p ); - classTable = FT_NEXT_ULONG( p ); - stateArray = FT_NEXT_ULONG( p ); - entryTable = FT_NEXT_ULONG( p ); - - GXV_TRACE(( "nClasses =0x%08x\n", gxvalid->xstatetable.nClasses )); - GXV_TRACE(( "offset to classTable=0x%08x\n", classTable )); - GXV_TRACE(( "offset to stateArray=0x%08x\n", stateArray )); - GXV_TRACE(( "offset to entryTable=0x%08x\n", entryTable )); - - if ( gxvalid->xstatetable.nClasses > 0xFFFFU ) - FT_INVALID_DATA; - - GXV_TRACE(( "StateTable Subtables\n" )); - - if ( gxvalid->xstatetable.optdata_load_func != NULL ) - gxvalid->xstatetable.optdata_load_func( p, limit, gxvalid ); - - if ( gxvalid->xstatetable.subtable_setup_func != NULL ) - setup_func = gxvalid->xstatetable.subtable_setup_func; - else - setup_func = gxv_XStateTable_subtable_setup; - - setup_func( (FT_ULong)( limit - table ), - classTable, - stateArray, - entryTable, - &classTable_length, - &stateArray_length, - &entryTable_length, - gxvalid ); - - if ( classTable != 0 ) - { - gxvalid->xstatetable.maxClassID = 0; - gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; - gxvalid->lookupval_func = gxv_XClassTable_lookupval_validate; - gxvalid->lookupfmt4_trans = gxv_XClassTable_lookupfmt4_transit; - gxv_LookupTable_validate( table + classTable, - table + classTable + classTable_length, - gxvalid ); -#if 0 - if ( gxvalid->subtable_length < classTable_length ) - classTable_length = gxvalid->subtable_length; -#endif - } - else - { - /* XXX: check range? */ - gxvalid->xstatetable.maxClassID = - (FT_UShort)( gxvalid->xstatetable.nClasses - 1 ); - } - - if ( stateArray != 0 ) - gxv_XStateArray_validate( table + stateArray, - &stateArray_length, - gxvalid->xstatetable.maxClassID, - gxvalid->xstatetable.nClasses, - &maxState, - &maxEntry, - gxvalid ); - else - { -#if 0 - maxState = 1; /* 0:start of text, 1:start of line are predefined */ -#endif - maxEntry = 0; - } - - if ( maxEntry > 0 && entryTable == 0 ) - FT_INVALID_OFFSET; - - if ( entryTable != 0 ) - gxv_XEntryTable_validate( table + entryTable, - &entryTable_length, - maxEntry, - stateArray_length, - gxvalid->xstatetable.maxClassID, - table, - limit, - gxvalid ); - - GXV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Table overlapping *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static int - gxv_compare_ranges( FT_Bytes table1_start, - FT_ULong table1_length, - FT_Bytes table2_start, - FT_ULong table2_length ) - { - if ( table1_start == table2_start ) - { - if ( ( table1_length == 0 || table2_length == 0 ) ) - goto Out; - } - else if ( table1_start < table2_start ) - { - if ( ( table1_start + table1_length ) <= table2_start ) - goto Out; - } - else if ( table1_start > table2_start ) - { - if ( ( table1_start >= table2_start + table2_length ) ) - goto Out; - } - return 1; - - Out: - return 0; - } - - - FT_LOCAL_DEF( void ) - gxv_odtect_add_range( FT_Bytes start, - FT_ULong length, - const FT_String* name, - GXV_odtect_Range odtect ) - { - odtect->range[odtect->nRanges].start = start; - odtect->range[odtect->nRanges].length = length; - odtect->range[odtect->nRanges].name = (FT_String*)name; - odtect->nRanges++; - } - - - FT_LOCAL_DEF( void ) - gxv_odtect_validate( GXV_odtect_Range odtect, - GXV_Validator gxvalid ) - { - FT_UInt i, j; - - - GXV_NAME_ENTER( "check overlap among multi ranges" ); - - for ( i = 0; i < odtect->nRanges; i++ ) - for ( j = 0; j < i; j++ ) - if ( 0 != gxv_compare_ranges( odtect->range[i].start, - odtect->range[i].length, - odtect->range[j].start, - odtect->range[j].length ) ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - if ( odtect->range[i].name || odtect->range[j].name ) - GXV_TRACE(( "found overlap between range %d and range %d\n", - i, j )); - else - GXV_TRACE(( "found overlap between `%s' and `%s\'\n", - odtect->range[i].name, - odtect->range[j].name )); -#endif - FT_INVALID_OFFSET; - } - - GXV_EXIT; - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvcommn.h b/3party/freetype/src/gxvalid/gxvcommn.h deleted file mode 100644 index b24608c257..0000000000 --- a/3party/freetype/src/gxvalid/gxvcommn.h +++ /dev/null @@ -1,582 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvcommn.h */ -/* */ -/* TrueTypeGX/AAT common tables validation (specification). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - - /* - * keywords in variable naming - * --------------------------- - * table: Of type FT_Bytes, pointing to the start of this table/subtable. - * limit: Of type FT_Bytes, pointing to the end of this table/subtable, - * including padding for alignment. - * offset: Of type FT_UInt, the number of octets from the start to target. - * length: Of type FT_UInt, the number of octets from the start to the - * end in this table/subtable, including padding for alignment. - * - * _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc. - */ - - -#ifndef __GXVCOMMN_H__ -#define __GXVCOMMN_H__ - - -#include <ft2build.h> -#include "gxvalid.h" -#include FT_INTERNAL_DEBUG_H -#include FT_SFNT_NAMES_H - - -FT_BEGIN_HEADER - - - /* some variables are not evaluated or only used in trace */ - -#ifdef FT_DEBUG_LEVEL_TRACE -#define GXV_LOAD_TRACE_VARS -#else -#undef GXV_LOAD_TRACE_VARS -#endif - -#undef GXV_LOAD_UNUSED_VARS /* debug purpose */ - -#define IS_PARANOID_VALIDATION ( gxvalid->root->level >= FT_VALIDATE_PARANOID ) -#define GXV_SET_ERR_IF_PARANOID( err ) { if ( IS_PARANOID_VALIDATION ) ( err ); } - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** VALIDATION *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct GXV_ValidatorRec_* GXV_Validator; - - -#define DUMMY_LIMIT 0 - - typedef void - (*GXV_Validate_Func)( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - - /* ====================== LookupTable Validator ======================== */ - - typedef union GXV_LookupValueDesc_ - { - FT_UShort u; - FT_Short s; - - } GXV_LookupValueDesc; - - typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr; - - typedef enum GXV_LookupValue_SignSpec_ - { - GXV_LOOKUPVALUE_UNSIGNED = 0, - GXV_LOOKUPVALUE_SIGNED - - } GXV_LookupValue_SignSpec; - - - typedef void - (*GXV_Lookup_Value_Validate_Func)( FT_UShort glyph, - GXV_LookupValueCPtr value_p, - GXV_Validator gxvalid ); - - typedef GXV_LookupValueDesc - (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort relative_gindex, - GXV_LookupValueCPtr base_value_p, - FT_Bytes lookuptbl_limit, - GXV_Validator gxvalid ); - - - /* ====================== StateTable Validator ========================= */ - - typedef enum GXV_GlyphOffset_Format_ - { - GXV_GLYPHOFFSET_NONE = -1, - GXV_GLYPHOFFSET_UCHAR = 2, - GXV_GLYPHOFFSET_CHAR, - GXV_GLYPHOFFSET_USHORT = 4, - GXV_GLYPHOFFSET_SHORT, - GXV_GLYPHOFFSET_ULONG = 8, - GXV_GLYPHOFFSET_LONG - - } GXV_GlyphOffset_Format; - - -#define GXV_GLYPHOFFSET_FMT( table ) \ - ( gxvalid->table.entry_glyphoffset_fmt ) - -#define GXV_GLYPHOFFSET_SIZE( table ) \ - ( gxvalid->table.entry_glyphoffset_fmt / 2 ) - - - /* ----------------------- 16bit StateTable ---------------------------- */ - - typedef union GXV_StateTable_GlyphOffsetDesc_ - { - FT_Byte uc; - FT_UShort u; /* same as GXV_LookupValueDesc */ - FT_ULong ul; - FT_Char c; - FT_Short s; /* same as GXV_LookupValueDesc */ - FT_Long l; - - } GXV_StateTable_GlyphOffsetDesc; - - typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr; - - typedef void - (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort table_size, - FT_UShort classTable, - FT_UShort stateArray, - FT_UShort entryTable, - FT_UShort* classTable_length_p, - FT_UShort* stateArray_length_p, - FT_UShort* entryTable_length_p, - GXV_Validator gxvalid ); - - typedef void - (*GXV_StateTable_Entry_Validate_Func)( - FT_Byte state, - FT_UShort flags, - GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, - FT_Bytes statetable_table, - FT_Bytes statetable_limit, - GXV_Validator gxvalid ); - - typedef void - (*GXV_StateTable_OptData_Load_Func)( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - typedef struct GXV_StateTable_ValidatorRec_ - { - GXV_GlyphOffset_Format entry_glyphoffset_fmt; - void* optdata; - - GXV_StateTable_Subtable_Setup_Func subtable_setup_func; - GXV_StateTable_Entry_Validate_Func entry_validate_func; - GXV_StateTable_OptData_Load_Func optdata_load_func; - - } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData; - - - /* ---------------------- 32bit XStateTable ---------------------------- */ - - typedef GXV_StateTable_GlyphOffsetDesc GXV_XStateTable_GlyphOffsetDesc; - - typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr; - - typedef void - (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong table_size, - FT_ULong classTable, - FT_ULong stateArray, - FT_ULong entryTable, - FT_ULong* classTable_length_p, - FT_ULong* stateArray_length_p, - FT_ULong* entryTable_length_p, - GXV_Validator gxvalid ); - - typedef void - (*GXV_XStateTable_Entry_Validate_Func)( - FT_UShort state, - FT_UShort flags, - GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, - FT_Bytes xstatetable_table, - FT_Bytes xstatetable_limit, - GXV_Validator gxvalid ); - - - typedef GXV_StateTable_OptData_Load_Func GXV_XStateTable_OptData_Load_Func; - - - typedef struct GXV_XStateTable_ValidatorRec_ - { - int entry_glyphoffset_fmt; - void* optdata; - - GXV_XStateTable_Subtable_Setup_Func subtable_setup_func; - GXV_XStateTable_Entry_Validate_Func entry_validate_func; - GXV_XStateTable_OptData_Load_Func optdata_load_func; - - FT_ULong nClasses; - FT_UShort maxClassID; - - } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData; - - - /* ===================================================================== */ - - typedef struct GXV_ValidatorRec_ - { - FT_Validator root; - - FT_Face face; - void* table_data; - - FT_ULong subtable_length; - - GXV_LookupValue_SignSpec lookupval_sign; - GXV_Lookup_Value_Validate_Func lookupval_func; - GXV_Lookup_Fmt4_Transit_Func lookupfmt4_trans; - FT_Bytes lookuptbl_head; - - FT_UShort min_gid; - FT_UShort max_gid; - - GXV_StateTable_ValidatorRec statetable; - GXV_XStateTable_ValidatorRec xstatetable; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_UInt debug_indent; - const FT_String* debug_function_name[3]; -#endif - - } GXV_ValidatorRec; - - -#define GXV_TABLE_DATA( tag, field ) \ - ( ( (GXV_ ## tag ## _Data)gxvalid->table_data )->field ) - -#undef FT_INVALID_ -#define FT_INVALID_( _error ) \ - ft_validator_error( gxvalid->root, FT_THROW( _error ) ) - -#define GXV_LIMIT_CHECK( _count ) \ - FT_BEGIN_STMNT \ - if ( p + _count > ( limit? limit : gxvalid->root->limit ) ) \ - FT_INVALID_TOO_SHORT; \ - FT_END_STMNT - - -#ifdef FT_DEBUG_LEVEL_TRACE - -#define GXV_INIT gxvalid->debug_indent = 0 - -#define GXV_NAME_ENTER( name ) \ - FT_BEGIN_STMNT \ - gxvalid->debug_indent += 2; \ - FT_TRACE4(( "%*.s", gxvalid->debug_indent, 0 )); \ - FT_TRACE4(( "%s table\n", name )); \ - FT_END_STMNT - -#define GXV_EXIT gxvalid->debug_indent -= 2 - -#define GXV_TRACE( s ) \ - FT_BEGIN_STMNT \ - FT_TRACE4(( "%*.s", gxvalid->debug_indent, 0 )); \ - FT_TRACE4( s ); \ - FT_END_STMNT - -#else /* !FT_DEBUG_LEVEL_TRACE */ - -#define GXV_INIT do { } while ( 0 ) -#define GXV_NAME_ENTER( name ) do { } while ( 0 ) -#define GXV_EXIT do { } while ( 0 ) - -#define GXV_TRACE( s ) do { } while ( 0 ) - -#endif /* !FT_DEBUG_LEVEL_TRACE */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** 32bit alignment checking *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \ - FT_BEGIN_STMNT \ - { \ - if ( (a) & 3 ) \ - FT_INVALID_OFFSET; \ - } \ - FT_END_STMNT - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Dumping Binary Data *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define GXV_TRACE_HEXDUMP( p, len ) \ - FT_BEGIN_STMNT \ - { \ - FT_Bytes b; \ - \ - \ - for ( b = p; b < (FT_Bytes)p + len; b++ ) \ - FT_TRACE1(("\\x%02x", *b)) ; \ - } \ - FT_END_STMNT - -#define GXV_TRACE_HEXDUMP_C( p, len ) \ - FT_BEGIN_STMNT \ - { \ - FT_Bytes b; \ - \ - \ - for ( b = p; b < (FT_Bytes)p + len; b++ ) \ - if ( 0x40 < *b && *b < 0x7E ) \ - FT_TRACE1(("%c", *b)) ; \ - else \ - FT_TRACE1(("\\x%02x", *b)) ; \ - } \ - FT_END_STMNT - -#define GXV_TRACE_HEXDUMP_SFNTNAME( n ) \ - GXV_TRACE_HEXDUMP( n.string, n.string_len ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** LOOKUP TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - gxv_BinSrchHeader_validate( FT_Bytes p, - FT_Bytes limit, - FT_UShort* unitSize_p, - FT_UShort* nUnits_p, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_LookupTable_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Glyph ID *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( FT_Int ) - gxv_glyphid_validate( FT_UShort gid, - GXV_Validator gxvalid ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CONTROL POINT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - gxv_ctlPoint_validate( FT_UShort gid, - FT_UShort ctl_point, - GXV_Validator gxvalid ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** SFNT NAME *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - gxv_sfntName_validate( FT_UShort name_index, - FT_UShort min_index, - FT_UShort max_index, - GXV_Validator gxvalid ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** STATE TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - gxv_StateTable_subtable_setup( FT_UShort table_size, - FT_UShort classTable, - FT_UShort stateArray, - FT_UShort entryTable, - FT_UShort* classTable_length_p, - FT_UShort* stateArray_length_p, - FT_UShort* entryTable_length_p, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_XStateTable_subtable_setup( FT_ULong table_size, - FT_ULong classTable, - FT_ULong stateArray, - FT_ULong entryTable, - FT_ULong* classTable_length_p, - FT_ULong* stateArray_length_p, - FT_ULong* entryTable_length_p, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_StateTable_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_XStateTable_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** UTILITY MACROS AND FUNCTIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - gxv_array_getlimits_byte( FT_Bytes table, - FT_Bytes limit, - FT_Byte* min, - FT_Byte* max, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_array_getlimits_ushort( FT_Bytes table, - FT_Bytes limit, - FT_UShort* min, - FT_UShort* max, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_set_length_by_ushort_offset( FT_UShort* offset, - FT_UShort** length, - FT_UShort* buff, - FT_UInt nmemb, - FT_UShort limit, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_set_length_by_ulong_offset( FT_ULong* offset, - FT_ULong** length, - FT_ULong* buff, - FT_UInt nmemb, - FT_ULong limit, - GXV_Validator gxvalid); - - -#define GXV_SUBTABLE_OFFSET_CHECK( _offset ) \ - FT_BEGIN_STMNT \ - if ( (_offset) > gxvalid->subtable_length ) \ - FT_INVALID_OFFSET; \ - FT_END_STMNT - -#define GXV_SUBTABLE_LIMIT_CHECK( _count ) \ - FT_BEGIN_STMNT \ - if ( ( p + (_count) - gxvalid->subtable_start ) > \ - gxvalid->subtable_length ) \ - FT_INVALID_TOO_SHORT; \ - FT_END_STMNT - -#define GXV_USHORT_TO_SHORT( _us ) \ - ( ( 0x8000U < ( _us ) ) ? ( ( _us ) - 0x8000U ) : ( _us ) ) - -#define GXV_STATETABLE_HEADER_SIZE ( 2 + 2 + 2 + 2 ) -#define GXV_STATEHEADER_SIZE GXV_STATETABLE_HEADER_SIZE - -#define GXV_XSTATETABLE_HEADER_SIZE ( 4 + 4 + 4 + 4 ) -#define GXV_XSTATEHEADER_SIZE GXV_XSTATETABLE_HEADER_SIZE - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Table overlapping *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct GXV_odtect_DataRec_ - { - FT_Bytes start; - FT_ULong length; - FT_String* name; - - } GXV_odtect_DataRec, *GXV_odtect_Data; - - typedef struct GXV_odtect_RangeRec_ - { - FT_UInt nRanges; - GXV_odtect_Data range; - - } GXV_odtect_RangeRec, *GXV_odtect_Range; - - - FT_LOCAL( void ) - gxv_odtect_add_range( FT_Bytes start, - FT_ULong length, - const FT_String* name, - GXV_odtect_Range odtect ); - - FT_LOCAL( void ) - gxv_odtect_validate( GXV_odtect_Range odtect, - GXV_Validator gxvalid ); - - -#define GXV_ODTECT( n, odtect ) \ - GXV_odtect_DataRec odtect ## _range[n]; \ - GXV_odtect_RangeRec odtect ## _rec = { 0, NULL }; \ - GXV_odtect_Range odtect = NULL - -#define GXV_ODTECT_INIT( odtect ) \ - FT_BEGIN_STMNT \ - odtect ## _rec.nRanges = 0; \ - odtect ## _rec.range = odtect ## _range; \ - odtect = & odtect ## _rec; \ - FT_END_STMNT - - - /* */ - -FT_END_HEADER - -#endif /* __GXVCOMMN_H__ */ - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxverror.h b/3party/freetype/src/gxvalid/gxverror.h deleted file mode 100644 index 6bbc23aa03..0000000000 --- a/3party/freetype/src/gxvalid/gxverror.h +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxverror.h */ -/* */ -/* TrueTypeGX/AAT validation module error codes (specification only). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the OpenType validation module error */ - /* enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __GXVERROR_H__ -#define __GXVERROR_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX GXV_Err_ -#define FT_ERR_BASE FT_Mod_Err_GXvalid - -#include FT_ERRORS_H - -#endif /* __GXVERROR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvfeat.c b/3party/freetype/src/gxvalid/gxvfeat.c deleted file mode 100644 index 0da9777642..0000000000 --- a/3party/freetype/src/gxvalid/gxvfeat.c +++ /dev/null @@ -1,339 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvfeat.c */ -/* */ -/* TrueTypeGX/AAT feat table validation (body). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvalid.h" -#include "gxvcommn.h" -#include "gxvfeat.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvfeat - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Data and Types *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct GXV_feat_DataRec_ - { - FT_UInt reserved_size; - FT_UShort feature; - FT_UShort setting; - - } GXV_feat_DataRec, *GXV_feat_Data; - - -#define GXV_FEAT_DATA( field ) GXV_TABLE_DATA( feat, field ) - - - typedef enum GXV_FeatureFlagsMask_ - { - GXV_FEAT_MASK_EXCLUSIVE_SETTINGS = 0x8000U, - GXV_FEAT_MASK_DYNAMIC_DEFAULT = 0x4000, - GXV_FEAT_MASK_UNUSED = 0x3F00, - GXV_FEAT_MASK_DEFAULT_SETTING = 0x00FF - - } GXV_FeatureFlagsMask; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** UTILITY FUNCTIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - gxv_feat_registry_validate( FT_UShort feature, - FT_UShort nSettings, - FT_Bool exclusive, - GXV_Validator gxvalid ) - { - GXV_NAME_ENTER( "feature in registry" ); - - GXV_TRACE(( " (feature = %u)\n", feature )); - - if ( feature >= gxv_feat_registry_length ) - { - GXV_TRACE(( "feature number %d is out of range %d\n", - feature, gxv_feat_registry_length )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - goto Exit; - } - - if ( gxv_feat_registry[feature].existence == 0 ) - { - GXV_TRACE(( "feature number %d is in defined range but doesn't exist\n", - feature )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - goto Exit; - } - - if ( gxv_feat_registry[feature].apple_reserved ) - { - /* Don't use here. Apple is reserved. */ - GXV_TRACE(( "feature number %d is reserved by Apple\n", feature )); - if ( gxvalid->root->level >= FT_VALIDATE_TIGHT ) - FT_INVALID_DATA; - } - - if ( nSettings != gxv_feat_registry[feature].nSettings ) - { - GXV_TRACE(( "feature %d: nSettings %d != defined nSettings %d\n", - feature, nSettings, - gxv_feat_registry[feature].nSettings )); - if ( gxvalid->root->level >= FT_VALIDATE_TIGHT ) - FT_INVALID_DATA; - } - - if ( exclusive != gxv_feat_registry[feature].exclusive ) - { - GXV_TRACE(( "exclusive flag %d differs from predefined value\n", - exclusive )); - if ( gxvalid->root->level >= FT_VALIDATE_TIGHT ) - FT_INVALID_DATA; - } - - Exit: - GXV_EXIT; - } - - - static void - gxv_feat_name_index_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - FT_Short nameIndex; - - - GXV_NAME_ENTER( "nameIndex" ); - - GXV_LIMIT_CHECK( 2 ); - nameIndex = FT_NEXT_SHORT ( p ); - GXV_TRACE(( " (nameIndex = %d)\n", nameIndex )); - - gxv_sfntName_validate( (FT_UShort)nameIndex, - 255, - 32768U, - gxvalid ); - - GXV_EXIT; - } - - - static void - gxv_feat_setting_validate( FT_Bytes table, - FT_Bytes limit, - FT_Bool exclusive, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort setting; - - - GXV_NAME_ENTER( "setting" ); - - GXV_LIMIT_CHECK( 2 ); - - setting = FT_NEXT_USHORT( p ); - - /* If we have exclusive setting, the setting should be odd. */ - if ( exclusive && ( setting & 1 ) == 0 ) - FT_INVALID_DATA; - - gxv_feat_name_index_validate( p, limit, gxvalid ); - - GXV_FEAT_DATA( setting ) = setting; - - GXV_EXIT; - } - - - static void - gxv_feat_name_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UInt reserved_size = GXV_FEAT_DATA( reserved_size ); - - FT_UShort feature; - FT_UShort nSettings; - FT_ULong settingTable; - FT_UShort featureFlags; - - FT_Bool exclusive; - FT_Int last_setting; - FT_UInt i; - - - GXV_NAME_ENTER( "name" ); - - /* feature + nSettings + settingTable + featureFlags */ - GXV_LIMIT_CHECK( 2 + 2 + 4 + 2 ); - - feature = FT_NEXT_USHORT( p ); - GXV_FEAT_DATA( feature ) = feature; - - nSettings = FT_NEXT_USHORT( p ); - settingTable = FT_NEXT_ULONG ( p ); - featureFlags = FT_NEXT_USHORT( p ); - - if ( settingTable < reserved_size ) - FT_INVALID_OFFSET; - - if ( ( featureFlags & GXV_FEAT_MASK_UNUSED ) == 0 ) - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - - exclusive = FT_BOOL( featureFlags & GXV_FEAT_MASK_EXCLUSIVE_SETTINGS ); - if ( exclusive ) - { - FT_Byte dynamic_default; - - - if ( featureFlags & GXV_FEAT_MASK_DYNAMIC_DEFAULT ) - dynamic_default = (FT_Byte)( featureFlags & - GXV_FEAT_MASK_DEFAULT_SETTING ); - else - dynamic_default = 0; - - /* If exclusive, check whether default setting is in the range. */ - if ( !( dynamic_default < nSettings ) ) - FT_INVALID_FORMAT; - } - - gxv_feat_registry_validate( feature, nSettings, exclusive, gxvalid ); - - gxv_feat_name_index_validate( p, limit, gxvalid ); - - p = gxvalid->root->base + settingTable; - for ( last_setting = -1, i = 0; i < nSettings; i++ ) - { - gxv_feat_setting_validate( p, limit, exclusive, gxvalid ); - - if ( (FT_Int)GXV_FEAT_DATA( setting ) <= last_setting ) - GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT ); - - last_setting = (FT_Int)GXV_FEAT_DATA( setting ); - /* setting + nameIndex */ - p += ( 2 + 2 ); - } - - GXV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** feat TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - gxv_feat_validate( FT_Bytes table, - FT_Face face, - FT_Validator ftvalid ) - { - GXV_ValidatorRec gxvalidrec; - GXV_Validator gxvalid = &gxvalidrec; - - GXV_feat_DataRec featrec; - GXV_feat_Data feat = &featrec; - - FT_Bytes p = table; - FT_Bytes limit = 0; - - FT_UInt featureNameCount; - - FT_UInt i; - FT_Int last_feature; - - - gxvalid->root = ftvalid; - gxvalid->table_data = feat; - gxvalid->face = face; - - FT_TRACE3(( "validating `feat' table\n" )); - GXV_INIT; - - feat->reserved_size = 0; - - /* version + featureNameCount + none_0 + none_1 */ - GXV_LIMIT_CHECK( 4 + 2 + 2 + 4 ); - feat->reserved_size += 4 + 2 + 2 + 4; - - if ( FT_NEXT_ULONG( p ) != 0x00010000UL ) /* Version */ - FT_INVALID_FORMAT; - - featureNameCount = FT_NEXT_USHORT( p ); - GXV_TRACE(( " (featureNameCount = %d)\n", featureNameCount )); - - if ( !( IS_PARANOID_VALIDATION ) ) - p += 6; /* skip (none) and (none) */ - else - { - if ( FT_NEXT_USHORT( p ) != 0 ) - FT_INVALID_DATA; - - if ( FT_NEXT_ULONG( p ) != 0 ) - FT_INVALID_DATA; - } - - feat->reserved_size += featureNameCount * ( 2 + 2 + 4 + 2 + 2 ); - - for ( last_feature = -1, i = 0; i < featureNameCount; i++ ) - { - gxv_feat_name_validate( p, limit, gxvalid ); - - if ( (FT_Int)GXV_FEAT_DATA( feature ) <= last_feature ) - GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT ); - - last_feature = GXV_FEAT_DATA( feature ); - p += 2 + 2 + 4 + 2 + 2; - } - - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvfeat.h b/3party/freetype/src/gxvalid/gxvfeat.h deleted file mode 100644 index b617df5d53..0000000000 --- a/3party/freetype/src/gxvalid/gxvfeat.h +++ /dev/null @@ -1,173 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvfeat.h */ -/* */ -/* TrueTypeGX/AAT feat table validation (specification). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#ifndef __GXVFEAT_H__ -#define __GXVFEAT_H__ - - -#include "gxvalid.h" -#include "gxvcommn.h" - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Registry predefined by Apple *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* TODO: More compact format */ - typedef struct GXV_Feature_RegistryRec_ - { - FT_Bool existence; - FT_Bool apple_reserved; - FT_Bool exclusive; - FT_Byte nSettings; - - } GX_Feature_RegistryRec; - - -#define gxv_feat_registry_length \ - ( sizeof ( gxv_feat_registry ) / \ - sizeof ( GX_Feature_RegistryRec ) ) - - - static GX_Feature_RegistryRec gxv_feat_registry[] = - { - /* Generated from gxvfgen.c */ - {1, 0, 0, 1}, /* All Typographic Features */ - {1, 0, 0, 8}, /* Ligatures */ - {1, 0, 1, 3}, /* Cursive Connection */ - {1, 0, 1, 6}, /* Letter Case */ - {1, 0, 0, 1}, /* Vertical Substitution */ - {1, 0, 0, 1}, /* Linguistic Rearrangement */ - {1, 0, 1, 2}, /* Number Spacing */ - {1, 1, 0, 0}, /* Apple Reserved 1 */ - {1, 0, 0, 5}, /* Smart Swashes */ - {1, 0, 1, 3}, /* Diacritics */ - {1, 0, 1, 4}, /* Vertical Position */ - {1, 0, 1, 3}, /* Fractions */ - {1, 1, 0, 0}, /* Apple Reserved 2 */ - {1, 0, 0, 1}, /* Overlapping Characters */ - {1, 0, 0, 6}, /* Typographic Extras */ - {1, 0, 0, 5}, /* Mathematical Extras */ - {1, 0, 1, 7}, /* Ornament Sets */ - {1, 0, 1, 1}, /* Character Alternatives */ - {1, 0, 1, 5}, /* Design Complexity */ - {1, 0, 1, 6}, /* Style Options */ - {1, 0, 1, 11}, /* Character Shape */ - {1, 0, 1, 2}, /* Number Case */ - {1, 0, 1, 4}, /* Text Spacing */ - {1, 0, 1, 10}, /* Transliteration */ - {1, 0, 1, 9}, /* Annotation */ - {1, 0, 1, 2}, /* Kana Spacing */ - {1, 0, 1, 2}, /* Ideographic Spacing */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {0, 0, 0, 0}, /* __EMPTY__ */ - {1, 0, 1, 4}, /* Text Spacing */ - {1, 0, 1, 2}, /* Kana Spacing */ - {1, 0, 1, 2}, /* Ideographic Spacing */ - {1, 0, 1, 4}, /* CJK Roman Spacing */ - }; - - -#endif /* __GXVFEAT_H__ */ - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvfgen.c b/3party/freetype/src/gxvalid/gxvfgen.c deleted file mode 100644 index 75c5e20d22..0000000000 --- a/3party/freetype/src/gxvalid/gxvfgen.c +++ /dev/null @@ -1,483 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxfgen.c */ -/* */ -/* Generate feature registry data for gxv `feat' validator. */ -/* This program is derived from gxfeatreg.c in gxlayout. */ -/* */ -/* Copyright 2004-2015 by */ -/* Masatake YAMATO and Redhat K.K. */ -/* */ -/* This file 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxfeatreg.c */ -/* */ -/* Database of font features pre-defined by Apple Computer, Inc. */ -/* http://developer.apple.com/fonts/Registry/ */ -/* (body). */ -/* */ -/* Copyright 2003 by */ -/* Masatake YAMATO and Redhat K.K. */ -/* */ -/* This file 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* Development of gxfeatreg.c is supported by */ -/* Information-technology Promotion Agency, Japan. */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* This file is compiled as a stand-alone executable. */ -/* This file is never compiled into `libfreetype2'. */ -/* The output of this file is used in `gxvfeat.c'. */ -/* ----------------------------------------------------------------------- */ -/* Compile: gcc `pkg-config --cflags freetype2` gxvfgen.c -o gxvfgen */ -/* Run: ./gxvfgen > tmp.c */ -/* */ -/***************************************************************************/ - - /*******************************************************************/ - /* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING */ - /*******************************************************************/ - - /* - * If you add a new setting to a feature, check the number of settings - * in the feature. If the number is greater than the value defined as - * FEATREG_MAX_SETTING, update the value. - */ -#define FEATREG_MAX_SETTING 12 - - /*******************************************************************/ - /* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING */ - /*******************************************************************/ - - -#include <stdio.h> -#include <string.h> - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Data and Types *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define APPLE_RESERVED "Apple Reserved" -#define APPLE_RESERVED_LENGTH 14 - - typedef struct GX_Feature_RegistryRec_ - { - const char* feat_name; - char exclusive; - char* setting_name[FEATREG_MAX_SETTING]; - - } GX_Feature_RegistryRec; - - -#define EMPTYFEAT {0, 0, {NULL}} - - - static GX_Feature_RegistryRec featreg_table[] = { - { /* 0 */ - "All Typographic Features", - 0, - { - "All Type Features", - NULL - } - }, { /* 1 */ - "Ligatures", - 0, - { - "Required Ligatures", - "Common Ligatures", - "Rare Ligatures", - "Logos", - "Rebus Pictures", - "Diphthong Ligatures", - "Squared Ligatures", - "Squared Ligatures, Abbreviated", - NULL - } - }, { /* 2 */ - "Cursive Connection", - 1, - { - "Unconnected", - "Partially Connected", - "Cursive", - NULL - } - }, { /* 3 */ - "Letter Case", - 1, - { - "Upper & Lower Case", - "All Caps", - "All Lower Case", - "Small Caps", - "Initial Caps", - "Initial Caps & Small Caps", - NULL - } - }, { /* 4 */ - "Vertical Substitution", - 0, - { - /* "Substitute Vertical Forms", */ - "Turns on the feature", - NULL - } - }, { /* 5 */ - "Linguistic Rearrangement", - 0, - { - /* "Linguistic Rearrangement", */ - "Turns on the feature", - NULL - } - }, { /* 6 */ - "Number Spacing", - 1, - { - "Monospaced Numbers", - "Proportional Numbers", - NULL - } - }, { /* 7 */ - APPLE_RESERVED " 1", - 0, - {NULL} - }, { /* 8 */ - "Smart Swashes", - 0, - { - "Word Initial Swashes", - "Word Final Swashes", - "Line Initial Swashes", - "Line Final Swashes", - "Non-Final Swashes", - NULL - } - }, { /* 9 */ - "Diacritics", - 1, - { - "Show Diacritics", - "Hide Diacritics", - "Decompose Diacritics", - NULL - } - }, { /* 10 */ - "Vertical Position", - 1, - { - /* "Normal Position", */ - "No Vertical Position", - "Superiors", - "Inferiors", - "Ordinals", - NULL - } - }, { /* 11 */ - "Fractions", - 1, - { - "No Fractions", - "Vertical Fractions", - "Diagonal Fractions", - NULL - } - }, { /* 12 */ - APPLE_RESERVED " 2", - 0, - {NULL} - }, { /* 13 */ - "Overlapping Characters", - 0, - { - /* "Prevent Overlap", */ - "Turns on the feature", - NULL - } - }, { /* 14 */ - "Typographic Extras", - 0, - { - "Hyphens to Em Dash", - "Hyphens to En Dash", - "Unslashed Zero", - "Form Interrobang", - "Smart Quotes", - "Periods to Ellipsis", - NULL - } - }, { /* 15 */ - "Mathematical Extras", - 0, - { - "Hyphens to Minus", - "Asterisk to Multiply", - "Slash to Divide", - "Inequality Ligatures", - "Exponents", - NULL - } - }, { /* 16 */ - "Ornament Sets", - 1, - { - "No Ornaments", - "Dingbats", - "Pi Characters", - "Fleurons", - "Decorative Borders", - "International Symbols", - "Math Symbols", - NULL - } - }, { /* 17 */ - "Character Alternatives", - 1, - { - "No Alternates", - /* TODO */ - NULL - } - }, { /* 18 */ - "Design Complexity", - 1, - { - "Design Level 1", - "Design Level 2", - "Design Level 3", - "Design Level 4", - "Design Level 5", - /* TODO */ - NULL - } - }, { /* 19 */ - "Style Options", - 1, - { - "No Style Options", - "Display Text", - "Engraved Text", - "Illuminated Caps", - "Tilling Caps", - "Tall Caps", - NULL - } - }, { /* 20 */ - "Character Shape", - 1, - { - "Traditional Characters", - "Simplified Characters", - "JIS 1978 Characters", - "JIS 1983 Characters", - "JIS 1990 Characters", - "Traditional Characters, Alternative Set 1", - "Traditional Characters, Alternative Set 2", - "Traditional Characters, Alternative Set 3", - "Traditional Characters, Alternative Set 4", - "Traditional Characters, Alternative Set 5", - "Expert Characters", - NULL /* count => 12 */ - } - }, { /* 21 */ - "Number Case", - 1, - { - "Lower Case Numbers", - "Upper Case Numbers", - NULL - } - }, { /* 22 */ - "Text Spacing", - 1, - { - "Proportional", - "Monospaced", - "Half-width", - "Normal", - NULL - } - }, /* Here after Newer */ { /* 23 */ - "Transliteration", - 1, - { - "No Transliteration", - "Hanja To Hangul", - "Hiragana to Katakana", - "Katakana to Hiragana", - "Kana to Romanization", - "Romanization to Hiragana", - "Romanization to Katakana", - "Hanja to Hangul, Alternative Set 1", - "Hanja to Hangul, Alternative Set 2", - "Hanja to Hangul, Alternative Set 3", - NULL - } - }, { /* 24 */ - "Annotation", - 1, - { - "No Annotation", - "Box Annotation", - "Rounded Box Annotation", - "Circle Annotation", - "Inverted Circle Annotation", - "Parenthesis Annotation", - "Period Annotation", - "Roman Numeral Annotation", - "Diamond Annotation", - NULL - } - }, { /* 25 */ - "Kana Spacing", - 1, - { - "Full Width", - "Proportional", - NULL - } - }, { /* 26 */ - "Ideographic Spacing", - 1, - { - "Full Width", - "Proportional", - NULL - } - }, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 27-30 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 31-35 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 36-40 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 40-45 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 46-50 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 51-55 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 56-60 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 61-65 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 66-70 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 71-75 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 76-80 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 81-85 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 86-90 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 91-95 */ - EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 96-98 */ - EMPTYFEAT, /* 99 */ { /* 100 => 22 */ - "Text Spacing", - 1, - { - "Proportional", - "Monospaced", - "Half-width", - "Normal", - NULL - } - }, { /* 101 => 25 */ - "Kana Spacing", - 1, - { - "Full Width", - "Proportional", - NULL - } - }, { /* 102 => 26 */ - "Ideographic Spacing", - 1, - { - "Full Width", - "Proportional", - NULL - } - }, { /* 103 */ - "CJK Roman Spacing", - 1, - { - "Half-width", - "Proportional", - "Default Roman", - "Full-width Roman", - NULL - } - }, { /* 104 => 1 */ - "All Typographic Features", - 0, - { - "All Type Features", - NULL - } - } - }; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Generator *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - int - main( void ) - { - int i; - - - printf( " {\n" ); - printf( " /* Generated from %s */\n", __FILE__ ); - - for ( i = 0; - i < sizeof ( featreg_table ) / sizeof ( GX_Feature_RegistryRec ); - i++ ) - { - const char* feat_name; - int nSettings; - - - feat_name = featreg_table[i].feat_name; - for ( nSettings = 0; - featreg_table[i].setting_name[nSettings]; - nSettings++) - ; /* Do nothing */ - - printf( " {%1d, %1d, %1d, %2d}, /* %s */\n", - feat_name ? 1 : 0, - ( feat_name && - ( ft_strncmp( feat_name, - APPLE_RESERVED, APPLE_RESERVED_LENGTH ) == 0 ) - ) ? 1 : 0, - featreg_table[i].exclusive ? 1 : 0, - nSettings, - feat_name ? feat_name : "__EMPTY__" ); - } - - printf( " };\n" ); - - return 0; - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvjust.c b/3party/freetype/src/gxvalid/gxvjust.c deleted file mode 100644 index 55b44bc2a8..0000000000 --- a/3party/freetype/src/gxvalid/gxvjust.c +++ /dev/null @@ -1,719 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvjust.c */ -/* */ -/* TrueTypeGX/AAT just table validation (body). */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvalid.h" -#include "gxvcommn.h" - -#include FT_SFNT_NAMES_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvjust - - /* - * referred `just' table format specification: - * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6just.html - * last updated 2000. - * ---------------------------------------------- - * [JUST HEADER]: GXV_JUST_HEADER_SIZE - * version (fixed: 32bit) = 0x00010000 - * format (uint16: 16bit) = 0 is only defined (2000) - * horizOffset (uint16: 16bit) - * vertOffset (uint16: 16bit) - * ---------------------------------------------- - */ - - typedef struct GXV_just_DataRec_ - { - FT_UShort wdc_offset_max; - FT_UShort wdc_offset_min; - FT_UShort pc_offset_max; - FT_UShort pc_offset_min; - - } GXV_just_DataRec, *GXV_just_Data; - - -#define GXV_JUST_DATA( a ) GXV_TABLE_DATA( just, a ) - - - /* GX just table does not define their subset of GID */ - static void - gxv_just_check_max_gid( FT_UShort gid, - const FT_String* msg_tag, - GXV_Validator gxvalid ) - { - if ( gid < gxvalid->face->num_glyphs ) - return; - - GXV_TRACE(( "just table includes too large %s" - " GID=%d > %d (in maxp)\n", - msg_tag, gid, gxvalid->face->num_glyphs )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); - } - - - static void - gxv_just_wdp_entry_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_ULong justClass; -#ifdef GXV_LOAD_UNUSED_VARS - FT_Fixed beforeGrowLimit; - FT_Fixed beforeShrinkGrowLimit; - FT_Fixed afterGrowLimit; - FT_Fixed afterShrinkGrowLimit; - FT_UShort growFlags; - FT_UShort shrinkFlags; -#endif - - - GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 + 4 + 2 + 2 ); - justClass = FT_NEXT_ULONG( p ); -#ifndef GXV_LOAD_UNUSED_VARS - p += 4 + 4 + 4 + 4 + 2 + 2; -#else - beforeGrowLimit = FT_NEXT_ULONG( p ); - beforeShrinkGrowLimit = FT_NEXT_ULONG( p ); - afterGrowLimit = FT_NEXT_ULONG( p ); - afterShrinkGrowLimit = FT_NEXT_ULONG( p ); - growFlags = FT_NEXT_USHORT( p ); - shrinkFlags = FT_NEXT_USHORT( p ); -#endif - - /* According to Apple spec, only 7bits in justClass is used */ - if ( ( justClass & 0xFFFFFF80UL ) != 0 ) - { - GXV_TRACE(( "just table includes non-zero value" - " in unused justClass higher bits" - " of WidthDeltaPair" )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - } - - - static void - gxv_just_wdc_entry_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_ULong count, i; - - - GXV_LIMIT_CHECK( 4 ); - count = FT_NEXT_ULONG( p ); - for ( i = 0; i < count; i++ ) - { - GXV_TRACE(( "validating wdc pair %d/%d\n", i + 1, count )); - gxv_just_wdp_entry_validate( p, limit, gxvalid ); - p += gxvalid->subtable_length; - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - } - - - static void - gxv_just_widthDeltaClusters_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table ; - FT_Bytes wdc_end = table + GXV_JUST_DATA( wdc_offset_max ); - FT_UInt i; - - - GXV_NAME_ENTER( "just justDeltaClusters" ); - - if ( limit <= wdc_end ) - FT_INVALID_OFFSET; - - for ( i = 0; p <= wdc_end; i++ ) - { - gxv_just_wdc_entry_validate( p, limit, gxvalid ); - p += gxvalid->subtable_length; - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - - GXV_EXIT; - } - - - static void - gxv_just_actSubrecord_type0_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - FT_Fixed lowerLimit; - FT_Fixed upperLimit; -#ifdef GXV_LOAD_UNUSED_VARS - FT_UShort order; -#endif - FT_UShort decomposedCount; - - FT_UInt i; - - - GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 ); - lowerLimit = FT_NEXT_LONG( p ); - upperLimit = FT_NEXT_LONG( p ); -#ifdef GXV_LOAD_UNUSED_VARS - order = FT_NEXT_USHORT( p ); -#else - p += 2; -#endif - decomposedCount = FT_NEXT_USHORT( p ); - - if ( lowerLimit >= upperLimit ) - { - GXV_TRACE(( "just table includes invalid range spec:" - " lowerLimit(%d) > upperLimit(%d)\n" )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - } - - for ( i = 0; i < decomposedCount; i++ ) - { - FT_UShort glyphs; - - - GXV_LIMIT_CHECK( 2 ); - glyphs = FT_NEXT_USHORT( p ); - gxv_just_check_max_gid( glyphs, "type0:glyphs", gxvalid ); - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - } - - - static void - gxv_just_actSubrecord_type1_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort addGlyph; - - - GXV_LIMIT_CHECK( 2 ); - addGlyph = FT_NEXT_USHORT( p ); - - gxv_just_check_max_gid( addGlyph, "type1:addGlyph", gxvalid ); - - gxvalid->subtable_length = (FT_ULong)( p - table ); - } - - - static void - gxv_just_actSubrecord_type2_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; -#ifdef GXV_LOAD_UNUSED_VARS - FT_Fixed substThreshhold; /* Apple misspelled "Threshhold" */ -#endif - FT_UShort addGlyph; - FT_UShort substGlyph; - - - GXV_LIMIT_CHECK( 4 + 2 + 2 ); -#ifdef GXV_LOAD_UNUSED_VARS - substThreshhold = FT_NEXT_ULONG( p ); -#else - p += 4; -#endif - addGlyph = FT_NEXT_USHORT( p ); - substGlyph = FT_NEXT_USHORT( p ); - - if ( addGlyph != 0xFFFF ) - gxv_just_check_max_gid( addGlyph, "type2:addGlyph", gxvalid ); - - gxv_just_check_max_gid( substGlyph, "type2:substGlyph", gxvalid ); - - gxvalid->subtable_length = (FT_ULong)( p - table ); - } - - - static void - gxv_just_actSubrecord_type4_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_ULong variantsAxis; - FT_Fixed minimumLimit; - FT_Fixed noStretchValue; - FT_Fixed maximumLimit; - - - GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 ); - variantsAxis = FT_NEXT_ULONG( p ); - minimumLimit = FT_NEXT_LONG( p ); - noStretchValue = FT_NEXT_LONG( p ); - maximumLimit = FT_NEXT_LONG( p ); - - gxvalid->subtable_length = (FT_ULong)( p - table ); - - if ( variantsAxis != 0x64756374L ) /* 'duct' */ - GXV_TRACE(( "variantsAxis 0x%08x is non default value", - variantsAxis )); - - if ( minimumLimit > noStretchValue ) - GXV_TRACE(( "type4:minimumLimit 0x%08x > noStretchValue 0x%08x\n", - minimumLimit, noStretchValue )); - else if ( noStretchValue > maximumLimit ) - GXV_TRACE(( "type4:noStretchValue 0x%08x > maximumLimit 0x%08x\n", - noStretchValue, maximumLimit )); - else if ( !IS_PARANOID_VALIDATION ) - return; - - FT_INVALID_DATA; - } - - - static void - gxv_just_actSubrecord_type5_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort flags; - FT_UShort glyph; - - - GXV_LIMIT_CHECK( 2 + 2 ); - flags = FT_NEXT_USHORT( p ); - glyph = FT_NEXT_USHORT( p ); - - if ( flags ) - GXV_TRACE(( "type5: nonzero value 0x%04x in unused flags\n", - flags )); - gxv_just_check_max_gid( glyph, "type5:glyph", gxvalid ); - - gxvalid->subtable_length = (FT_ULong)( p - table ); - } - - - /* parse single actSubrecord */ - static void - gxv_just_actSubrecord_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort actionClass; - FT_UShort actionType; - FT_ULong actionLength; - - - GXV_NAME_ENTER( "just actSubrecord" ); - - GXV_LIMIT_CHECK( 2 + 2 + 4 ); - actionClass = FT_NEXT_USHORT( p ); - actionType = FT_NEXT_USHORT( p ); - actionLength = FT_NEXT_ULONG( p ); - - /* actionClass is related with justClass using 7bit only */ - if ( ( actionClass & 0xFF80 ) != 0 ) - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - - if ( actionType == 0 ) - gxv_just_actSubrecord_type0_validate( p, limit, gxvalid ); - else if ( actionType == 1 ) - gxv_just_actSubrecord_type1_validate( p, limit, gxvalid ); - else if ( actionType == 2 ) - gxv_just_actSubrecord_type2_validate( p, limit, gxvalid ); - else if ( actionType == 3 ) - ; /* Stretch glyph action: no actionData */ - else if ( actionType == 4 ) - gxv_just_actSubrecord_type4_validate( p, limit, gxvalid ); - else if ( actionType == 5 ) - gxv_just_actSubrecord_type5_validate( p, limit, gxvalid ); - else - FT_INVALID_DATA; - - gxvalid->subtable_length = actionLength; - - GXV_EXIT; - } - - - static void - gxv_just_pcActionRecord_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_ULong actionCount; - FT_ULong i; - - - GXV_LIMIT_CHECK( 4 ); - actionCount = FT_NEXT_ULONG( p ); - GXV_TRACE(( "actionCount = %d\n", actionCount )); - - for ( i = 0; i < actionCount; i++ ) - { - gxv_just_actSubrecord_validate( p, limit, gxvalid ); - p += gxvalid->subtable_length; - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - - GXV_EXIT; - } - - - static void - gxv_just_pcTable_LookupValue_entry_validate( FT_UShort glyph, - GXV_LookupValueCPtr value_p, - GXV_Validator gxvalid ) - { - FT_UNUSED( glyph ); - - if ( value_p->u > GXV_JUST_DATA( pc_offset_max ) ) - GXV_JUST_DATA( pc_offset_max ) = value_p->u; - if ( value_p->u < GXV_JUST_DATA( pc_offset_max ) ) - GXV_JUST_DATA( pc_offset_min ) = value_p->u; - } - - - static void - gxv_just_pcLookupTable_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - - GXV_NAME_ENTER( "just pcLookupTable" ); - GXV_JUST_DATA( pc_offset_max ) = 0x0000; - GXV_JUST_DATA( pc_offset_min ) = 0xFFFFU; - - gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; - gxvalid->lookupval_func = gxv_just_pcTable_LookupValue_entry_validate; - - gxv_LookupTable_validate( p, limit, gxvalid ); - - /* subtable_length is set by gxv_LookupTable_validate() */ - - GXV_EXIT; - } - - - static void - gxv_just_postcompTable_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - - GXV_NAME_ENTER( "just postcompTable" ); - - gxv_just_pcLookupTable_validate( p, limit, gxvalid ); - p += gxvalid->subtable_length; - - gxv_just_pcActionRecord_validate( p, limit, gxvalid ); - p += gxvalid->subtable_length; - - gxvalid->subtable_length = (FT_ULong)( p - table ); - - GXV_EXIT; - } - - - static void - gxv_just_classTable_entry_validate( - FT_Byte state, - FT_UShort flags, - GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, - FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { -#ifdef GXV_LOAD_UNUSED_VARS - /* TODO: validate markClass & currentClass */ - FT_UShort setMark; - FT_UShort dontAdvance; - FT_UShort markClass; - FT_UShort currentClass; -#endif - - FT_UNUSED( state ); - FT_UNUSED( glyphOffset_p ); - FT_UNUSED( table ); - FT_UNUSED( limit ); - FT_UNUSED( gxvalid ); - -#ifndef GXV_LOAD_UNUSED_VARS - FT_UNUSED( flags ); -#else - setMark = (FT_UShort)( ( flags >> 15 ) & 1 ); - dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); - markClass = (FT_UShort)( ( flags >> 7 ) & 0x7F ); - currentClass = (FT_UShort)( flags & 0x7F ); -#endif - } - - - static void - gxv_just_justClassTable_validate ( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort length; - FT_UShort coverage; - FT_ULong subFeatureFlags; - - - GXV_NAME_ENTER( "just justClassTable" ); - - GXV_LIMIT_CHECK( 2 + 2 + 4 ); - length = FT_NEXT_USHORT( p ); - coverage = FT_NEXT_USHORT( p ); - subFeatureFlags = FT_NEXT_ULONG( p ); - - GXV_TRACE(( " justClassTable: coverage = 0x%04x (%s) ", coverage )); - if ( ( coverage & 0x4000 ) == 0 ) - GXV_TRACE(( "ascending\n" )); - else - GXV_TRACE(( "descending\n" )); - - if ( subFeatureFlags ) - GXV_TRACE(( " justClassTable: nonzero value (0x%08x)" - " in unused subFeatureFlags\n", subFeatureFlags )); - - gxvalid->statetable.optdata = NULL; - gxvalid->statetable.optdata_load_func = NULL; - gxvalid->statetable.subtable_setup_func = NULL; - gxvalid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE; - gxvalid->statetable.entry_validate_func = - gxv_just_classTable_entry_validate; - - gxv_StateTable_validate( p, table + length, gxvalid ); - - /* subtable_length is set by gxv_LookupTable_validate() */ - - GXV_EXIT; - } - - - static void - gxv_just_wdcTable_LookupValue_validate( FT_UShort glyph, - GXV_LookupValueCPtr value_p, - GXV_Validator gxvalid ) - { - FT_UNUSED( glyph ); - - if ( value_p->u > GXV_JUST_DATA( wdc_offset_max ) ) - GXV_JUST_DATA( wdc_offset_max ) = value_p->u; - if ( value_p->u < GXV_JUST_DATA( wdc_offset_min ) ) - GXV_JUST_DATA( wdc_offset_min ) = value_p->u; - } - - - static void - gxv_just_justData_lookuptable_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - - GXV_JUST_DATA( wdc_offset_max ) = 0x0000; - GXV_JUST_DATA( wdc_offset_min ) = 0xFFFFU; - - gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; - gxvalid->lookupval_func = gxv_just_wdcTable_LookupValue_validate; - - gxv_LookupTable_validate( p, limit, gxvalid ); - - /* subtable_length is set by gxv_LookupTable_validate() */ - - GXV_EXIT; - } - - - /* - * gxv_just_justData_validate() parses and validates horizData, vertData. - */ - static void - gxv_just_justData_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - /* - * following 3 offsets are measured from the start of `just' - * (which table points to), not justData - */ - FT_UShort justClassTableOffset; - FT_UShort wdcTableOffset; - FT_UShort pcTableOffset; - FT_Bytes p = table; - - GXV_ODTECT( 4, odtect ); - - - GXV_NAME_ENTER( "just justData" ); - - GXV_ODTECT_INIT( odtect ); - GXV_LIMIT_CHECK( 2 + 2 + 2 ); - justClassTableOffset = FT_NEXT_USHORT( p ); - wdcTableOffset = FT_NEXT_USHORT( p ); - pcTableOffset = FT_NEXT_USHORT( p ); - - GXV_TRACE(( " (justClassTableOffset = 0x%04x)\n", justClassTableOffset )); - GXV_TRACE(( " (wdcTableOffset = 0x%04x)\n", wdcTableOffset )); - GXV_TRACE(( " (pcTableOffset = 0x%04x)\n", pcTableOffset )); - - gxv_just_justData_lookuptable_validate( p, limit, gxvalid ); - gxv_odtect_add_range( p, gxvalid->subtable_length, - "just_LookupTable", odtect ); - - if ( wdcTableOffset ) - { - gxv_just_widthDeltaClusters_validate( - gxvalid->root->base + wdcTableOffset, limit, gxvalid ); - gxv_odtect_add_range( gxvalid->root->base + wdcTableOffset, - gxvalid->subtable_length, "just_wdcTable", odtect ); - } - - if ( pcTableOffset ) - { - gxv_just_postcompTable_validate( gxvalid->root->base + pcTableOffset, - limit, gxvalid ); - gxv_odtect_add_range( gxvalid->root->base + pcTableOffset, - gxvalid->subtable_length, "just_pcTable", odtect ); - } - - if ( justClassTableOffset ) - { - gxv_just_justClassTable_validate( - gxvalid->root->base + justClassTableOffset, limit, gxvalid ); - gxv_odtect_add_range( gxvalid->root->base + justClassTableOffset, - gxvalid->subtable_length, "just_justClassTable", - odtect ); - } - - gxv_odtect_validate( odtect, gxvalid ); - - GXV_EXIT; - } - - - FT_LOCAL_DEF( void ) - gxv_just_validate( FT_Bytes table, - FT_Face face, - FT_Validator ftvalid ) - { - FT_Bytes p = table; - FT_Bytes limit = 0; - - GXV_ValidatorRec gxvalidrec; - GXV_Validator gxvalid = &gxvalidrec; - GXV_just_DataRec justrec; - GXV_just_Data just = &justrec; - - FT_ULong version; - FT_UShort format; - FT_UShort horizOffset; - FT_UShort vertOffset; - - GXV_ODTECT( 3, odtect ); - - - GXV_ODTECT_INIT( odtect ); - - gxvalid->root = ftvalid; - gxvalid->table_data = just; - gxvalid->face = face; - - FT_TRACE3(( "validating `just' table\n" )); - GXV_INIT; - - limit = gxvalid->root->limit; - - GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 ); - version = FT_NEXT_ULONG( p ); - format = FT_NEXT_USHORT( p ); - horizOffset = FT_NEXT_USHORT( p ); - vertOffset = FT_NEXT_USHORT( p ); - gxv_odtect_add_range( table, (FT_ULong)( p - table ), - "just header", odtect ); - - - /* Version 1.0 (always:2000) */ - GXV_TRACE(( " (version = 0x%08x)\n", version )); - if ( version != 0x00010000UL ) - FT_INVALID_FORMAT; - - /* format 0 (always:2000) */ - GXV_TRACE(( " (format = 0x%04x)\n", format )); - if ( format != 0x0000 ) - FT_INVALID_FORMAT; - - GXV_TRACE(( " (horizOffset = %d)\n", horizOffset )); - GXV_TRACE(( " (vertOffset = %d)\n", vertOffset )); - - - /* validate justData */ - if ( 0 < horizOffset ) - { - gxv_just_justData_validate( table + horizOffset, limit, gxvalid ); - gxv_odtect_add_range( table + horizOffset, gxvalid->subtable_length, - "horizJustData", odtect ); - } - - if ( 0 < vertOffset ) - { - gxv_just_justData_validate( table + vertOffset, limit, gxvalid ); - gxv_odtect_add_range( table + vertOffset, gxvalid->subtable_length, - "vertJustData", odtect ); - } - - gxv_odtect_validate( odtect, gxvalid ); - - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvkern.c b/3party/freetype/src/gxvalid/gxvkern.c deleted file mode 100644 index f257c03760..0000000000 --- a/3party/freetype/src/gxvalid/gxvkern.c +++ /dev/null @@ -1,920 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvkern.c */ -/* */ -/* TrueTypeGX/AAT kern table validation (body). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvalid.h" -#include "gxvcommn.h" - -#include FT_SFNT_NAMES_H -#include FT_SERVICE_GX_VALIDATE_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvkern - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Data and Types *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef enum GXV_kern_Version_ - { - KERN_VERSION_CLASSIC = 0x0000, - KERN_VERSION_NEW = 0x0001 - - } GXV_kern_Version; - - - typedef enum GXV_kern_Dialect_ - { - KERN_DIALECT_UNKNOWN = 0, - KERN_DIALECT_MS = FT_VALIDATE_MS, - KERN_DIALECT_APPLE = FT_VALIDATE_APPLE, - KERN_DIALECT_ANY = FT_VALIDATE_CKERN - - } GXV_kern_Dialect; - - - typedef struct GXV_kern_DataRec_ - { - GXV_kern_Version version; - void *subtable_data; - GXV_kern_Dialect dialect_request; - - } GXV_kern_DataRec, *GXV_kern_Data; - - -#define GXV_KERN_DATA( field ) GXV_TABLE_DATA( kern, field ) - -#define KERN_IS_CLASSIC( gxvalid ) \ - ( KERN_VERSION_CLASSIC == GXV_KERN_DATA( version ) ) -#define KERN_IS_NEW( gxvalid ) \ - ( KERN_VERSION_NEW == GXV_KERN_DATA( version ) ) - -#define KERN_DIALECT( gxvalid ) \ - GXV_KERN_DATA( dialect_request ) -#define KERN_ALLOWS_MS( gxvalid ) \ - ( KERN_DIALECT( gxvalid ) & KERN_DIALECT_MS ) -#define KERN_ALLOWS_APPLE( gxvalid ) \ - ( KERN_DIALECT( gxvalid ) & KERN_DIALECT_APPLE ) - -#define GXV_KERN_HEADER_SIZE ( KERN_IS_NEW( gxvalid ) ? 8 : 4 ) -#define GXV_KERN_SUBTABLE_HEADER_SIZE ( KERN_IS_NEW( gxvalid ) ? 8 : 6 ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** SUBTABLE VALIDATORS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* ============================= format 0 ============================== */ - - static void - gxv_kern_subtable_fmt0_pairs_validate( FT_Bytes table, - FT_Bytes limit, - FT_UShort nPairs, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort i; - - FT_UShort last_gid_left = 0; - FT_UShort last_gid_right = 0; - - FT_UNUSED( limit ); - - - GXV_NAME_ENTER( "kern format 0 pairs" ); - - for ( i = 0; i < nPairs; i++ ) - { - FT_UShort gid_left; - FT_UShort gid_right; -#ifdef GXV_LOAD_UNUSED_VARS - FT_Short kernValue; -#endif - - - /* left */ - gid_left = FT_NEXT_USHORT( p ); - gxv_glyphid_validate( gid_left, gxvalid ); - - /* right */ - gid_right = FT_NEXT_USHORT( p ); - gxv_glyphid_validate( gid_right, gxvalid ); - - /* Pairs of left and right GIDs must be unique and sorted. */ - GXV_TRACE(( "left gid = %u, right gid = %u\n", gid_left, gid_right )); - if ( gid_left == last_gid_left ) - { - if ( last_gid_right < gid_right ) - last_gid_right = gid_right; - else - FT_INVALID_DATA; - } - else if ( last_gid_left < gid_left ) - { - last_gid_left = gid_left; - last_gid_right = gid_right; - } - else - FT_INVALID_DATA; - - /* skip the kern value */ -#ifdef GXV_LOAD_UNUSED_VARS - kernValue = FT_NEXT_SHORT( p ); -#else - p += 2; -#endif - } - - GXV_EXIT; - } - - static void - gxv_kern_subtable_fmt0_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE; - - FT_UShort nPairs; - FT_UShort unitSize; - - - GXV_NAME_ENTER( "kern subtable format 0" ); - - unitSize = 2 + 2 + 2; - nPairs = 0; - - /* nPairs, searchRange, entrySelector, rangeShift */ - GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 ); - gxv_BinSrchHeader_validate( p, limit, &unitSize, &nPairs, gxvalid ); - p += 2 + 2 + 2 + 2; - - gxv_kern_subtable_fmt0_pairs_validate( p, limit, nPairs, gxvalid ); - - GXV_EXIT; - } - - - /* ============================= format 1 ============================== */ - - - typedef struct GXV_kern_fmt1_StateOptRec_ - { - FT_UShort valueTable; - FT_UShort valueTable_length; - - } GXV_kern_fmt1_StateOptRec, *GXV_kern_fmt1_StateOptRecData; - - - static void - gxv_kern_subtable_fmt1_valueTable_load( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - GXV_kern_fmt1_StateOptRecData optdata = - (GXV_kern_fmt1_StateOptRecData)gxvalid->statetable.optdata; - - - GXV_LIMIT_CHECK( 2 ); - optdata->valueTable = FT_NEXT_USHORT( p ); - } - - - /* - * passed tables_size covers whole StateTable, including kern fmt1 header - */ - static void - gxv_kern_subtable_fmt1_subtable_setup( FT_UShort table_size, - FT_UShort classTable, - FT_UShort stateArray, - FT_UShort entryTable, - FT_UShort* classTable_length_p, - FT_UShort* stateArray_length_p, - FT_UShort* entryTable_length_p, - GXV_Validator gxvalid ) - { - FT_UShort o[4]; - FT_UShort *l[4]; - FT_UShort buff[5]; - - GXV_kern_fmt1_StateOptRecData optdata = - (GXV_kern_fmt1_StateOptRecData)gxvalid->statetable.optdata; - - - o[0] = classTable; - o[1] = stateArray; - o[2] = entryTable; - o[3] = optdata->valueTable; - l[0] = classTable_length_p; - l[1] = stateArray_length_p; - l[2] = entryTable_length_p; - l[3] = &(optdata->valueTable_length); - - gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, gxvalid ); - } - - - /* - * passed table & limit are of whole StateTable, not including subtables - */ - static void - gxv_kern_subtable_fmt1_entry_validate( - FT_Byte state, - FT_UShort flags, - GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, - FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { -#ifdef GXV_LOAD_UNUSED_VARS - FT_UShort push; - FT_UShort dontAdvance; -#endif - FT_UShort valueOffset; -#ifdef GXV_LOAD_UNUSED_VARS - FT_UShort kernAction; - FT_UShort kernValue; -#endif - - FT_UNUSED( state ); - FT_UNUSED( glyphOffset_p ); - - -#ifdef GXV_LOAD_UNUSED_VARS - push = (FT_UShort)( ( flags >> 15 ) & 1 ); - dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); -#endif - valueOffset = (FT_UShort)( flags & 0x3FFF ); - - { - GXV_kern_fmt1_StateOptRecData vt_rec = - (GXV_kern_fmt1_StateOptRecData)gxvalid->statetable.optdata; - FT_Bytes p; - - - if ( valueOffset < vt_rec->valueTable ) - FT_INVALID_OFFSET; - - p = table + valueOffset; - limit = table + vt_rec->valueTable + vt_rec->valueTable_length; - - GXV_LIMIT_CHECK( 2 + 2 ); -#ifdef GXV_LOAD_UNUSED_VARS - kernAction = FT_NEXT_USHORT( p ); - kernValue = FT_NEXT_USHORT( p ); -#endif - } - } - - - static void - gxv_kern_subtable_fmt1_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - GXV_kern_fmt1_StateOptRec vt_rec; - - - GXV_NAME_ENTER( "kern subtable format 1" ); - - gxvalid->statetable.optdata = - &vt_rec; - gxvalid->statetable.optdata_load_func = - gxv_kern_subtable_fmt1_valueTable_load; - gxvalid->statetable.subtable_setup_func = - gxv_kern_subtable_fmt1_subtable_setup; - gxvalid->statetable.entry_glyphoffset_fmt = - GXV_GLYPHOFFSET_NONE; - gxvalid->statetable.entry_validate_func = - gxv_kern_subtable_fmt1_entry_validate; - - gxv_StateTable_validate( p, limit, gxvalid ); - - GXV_EXIT; - } - - - /* ================ Data for Class-Based Subtables 2, 3 ================ */ - - typedef enum GXV_kern_ClassSpec_ - { - GXV_KERN_CLS_L = 0, - GXV_KERN_CLS_R - - } GXV_kern_ClassSpec; - - - /* ============================= format 2 ============================== */ - - /* ---------------------- format 2 specific data ----------------------- */ - - typedef struct GXV_kern_subtable_fmt2_DataRec_ - { - FT_UShort rowWidth; - FT_UShort array; - FT_UShort offset_min[2]; - FT_UShort offset_max[2]; - const FT_String* class_tag[2]; - GXV_odtect_Range odtect; - - } GXV_kern_subtable_fmt2_DataRec, *GXV_kern_subtable_fmt2_Data; - - -#define GXV_KERN_FMT2_DATA( field ) \ - ( ( (GXV_kern_subtable_fmt2_DataRec *) \ - ( GXV_KERN_DATA( subtable_data ) ) )->field ) - - - /* -------------------------- utility functions ----------------------- */ - - static void - gxv_kern_subtable_fmt2_clstbl_validate( FT_Bytes table, - FT_Bytes limit, - GXV_kern_ClassSpec spec, - GXV_Validator gxvalid ) - { - const FT_String* tag = GXV_KERN_FMT2_DATA( class_tag[spec] ); - GXV_odtect_Range odtect = GXV_KERN_FMT2_DATA( odtect ); - - FT_Bytes p = table; - FT_UShort firstGlyph; - FT_UShort nGlyphs; - - - GXV_NAME_ENTER( "kern format 2 classTable" ); - - GXV_LIMIT_CHECK( 2 + 2 ); - firstGlyph = FT_NEXT_USHORT( p ); - nGlyphs = FT_NEXT_USHORT( p ); - GXV_TRACE(( " %s firstGlyph=%d, nGlyphs=%d\n", - tag, firstGlyph, nGlyphs )); - - gxv_glyphid_validate( firstGlyph, gxvalid ); - gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs - 1 ), gxvalid ); - - gxv_array_getlimits_ushort( p, p + ( 2 * nGlyphs ), - &( GXV_KERN_FMT2_DATA( offset_min[spec] ) ), - &( GXV_KERN_FMT2_DATA( offset_max[spec] ) ), - gxvalid ); - - gxv_odtect_add_range( table, 2 * nGlyphs, tag, odtect ); - - GXV_EXIT; - } - - - static void - gxv_kern_subtable_fmt2_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - GXV_ODTECT( 3, odtect ); - GXV_kern_subtable_fmt2_DataRec fmt2_rec = - { 0, 0, { 0, 0 }, { 0, 0 }, { "leftClass", "rightClass" }, NULL }; - - FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE; - FT_UShort leftOffsetTable; - FT_UShort rightOffsetTable; - - - GXV_NAME_ENTER( "kern subtable format 2" ); - - GXV_ODTECT_INIT( odtect ); - fmt2_rec.odtect = odtect; - GXV_KERN_DATA( subtable_data ) = &fmt2_rec; - - GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 ); - GXV_KERN_FMT2_DATA( rowWidth ) = FT_NEXT_USHORT( p ); - leftOffsetTable = FT_NEXT_USHORT( p ); - rightOffsetTable = FT_NEXT_USHORT( p ); - GXV_KERN_FMT2_DATA( array ) = FT_NEXT_USHORT( p ); - - GXV_TRACE(( "rowWidth = %d\n", GXV_KERN_FMT2_DATA( rowWidth ) )); - - - GXV_LIMIT_CHECK( leftOffsetTable ); - GXV_LIMIT_CHECK( rightOffsetTable ); - GXV_LIMIT_CHECK( GXV_KERN_FMT2_DATA( array ) ); - - gxv_kern_subtable_fmt2_clstbl_validate( table + leftOffsetTable, limit, - GXV_KERN_CLS_L, gxvalid ); - - gxv_kern_subtable_fmt2_clstbl_validate( table + rightOffsetTable, limit, - GXV_KERN_CLS_R, gxvalid ); - - if ( GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_L] ) + - GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_R] ) - < GXV_KERN_FMT2_DATA( array ) ) - FT_INVALID_OFFSET; - - gxv_odtect_add_range( table + GXV_KERN_FMT2_DATA( array ), - GXV_KERN_FMT2_DATA( offset_max[GXV_KERN_CLS_L] ) - + GXV_KERN_FMT2_DATA( offset_max[GXV_KERN_CLS_R] ) - - GXV_KERN_FMT2_DATA( array ), - "array", odtect ); - - gxv_odtect_validate( odtect, gxvalid ); - - GXV_EXIT; - } - - - /* ============================= format 3 ============================== */ - - static void - gxv_kern_subtable_fmt3_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE; - FT_UShort glyphCount; - FT_Byte kernValueCount; - FT_Byte leftClassCount; - FT_Byte rightClassCount; - FT_Byte flags; - - - GXV_NAME_ENTER( "kern subtable format 3" ); - - GXV_LIMIT_CHECK( 2 + 1 + 1 + 1 + 1 ); - glyphCount = FT_NEXT_USHORT( p ); - kernValueCount = FT_NEXT_BYTE( p ); - leftClassCount = FT_NEXT_BYTE( p ); - rightClassCount = FT_NEXT_BYTE( p ); - flags = FT_NEXT_BYTE( p ); - - if ( gxvalid->face->num_glyphs != glyphCount ) - { - GXV_TRACE(( "maxGID=%d, but glyphCount=%d\n", - gxvalid->face->num_glyphs, glyphCount )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); - } - - if ( flags != 0 ) - GXV_TRACE(( "kern subtable fmt3 has nonzero value" - " (%d) in unused flag\n", flags )); - /* - * just skip kernValue[kernValueCount] - */ - GXV_LIMIT_CHECK( 2 * kernValueCount ); - p += 2 * kernValueCount; - - /* - * check leftClass[gid] < leftClassCount - */ - { - FT_Byte min, max; - - - GXV_LIMIT_CHECK( glyphCount ); - gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, gxvalid ); - p += gxvalid->subtable_length; - - if ( leftClassCount < max ) - FT_INVALID_DATA; - } - - /* - * check rightClass[gid] < rightClassCount - */ - { - FT_Byte min, max; - - - GXV_LIMIT_CHECK( glyphCount ); - gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, gxvalid ); - p += gxvalid->subtable_length; - - if ( rightClassCount < max ) - FT_INVALID_DATA; - } - - /* - * check kernIndex[i, j] < kernValueCount - */ - { - FT_UShort i, j; - - - for ( i = 0; i < leftClassCount; i++ ) - { - for ( j = 0; j < rightClassCount; j++ ) - { - GXV_LIMIT_CHECK( 1 ); - if ( kernValueCount < FT_NEXT_BYTE( p ) ) - FT_INVALID_OFFSET; - } - } - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - - GXV_EXIT; - } - - - static FT_Bool - gxv_kern_coverage_new_apple_validate( FT_UShort coverage, - FT_UShort* format, - GXV_Validator gxvalid ) - { - /* new Apple-dialect */ -#ifdef GXV_LOAD_TRACE_VARS - FT_Bool kernVertical; - FT_Bool kernCrossStream; - FT_Bool kernVariation; -#endif - - FT_UNUSED( gxvalid ); - - - /* reserved bits = 0 */ - if ( coverage & 0x1FFC ) - return FALSE; - -#ifdef GXV_LOAD_TRACE_VARS - kernVertical = FT_BOOL( ( coverage >> 15 ) & 1 ); - kernCrossStream = FT_BOOL( ( coverage >> 14 ) & 1 ); - kernVariation = FT_BOOL( ( coverage >> 13 ) & 1 ); -#endif - - *format = (FT_UShort)( coverage & 0x0003 ); - - GXV_TRACE(( "new Apple-dialect: " - "horizontal=%d, cross-stream=%d, variation=%d, format=%d\n", - !kernVertical, kernCrossStream, kernVariation, *format )); - - GXV_TRACE(( "kerning values in Apple format subtable are ignored\n" )); - - return TRUE; - } - - - static FT_Bool - gxv_kern_coverage_classic_apple_validate( FT_UShort coverage, - FT_UShort* format, - GXV_Validator gxvalid ) - { - /* classic Apple-dialect */ -#ifdef GXV_LOAD_TRACE_VARS - FT_Bool horizontal; - FT_Bool cross_stream; -#endif - - - /* check expected flags, but don't check if MS-dialect is impossible */ - if ( !( coverage & 0xFD00 ) && KERN_ALLOWS_MS( gxvalid ) ) - return FALSE; - - /* reserved bits = 0 */ - if ( coverage & 0x02FC ) - return FALSE; - -#ifdef GXV_LOAD_TRACE_VARS - horizontal = FT_BOOL( ( coverage >> 15 ) & 1 ); - cross_stream = FT_BOOL( ( coverage >> 13 ) & 1 ); -#endif - - *format = (FT_UShort)( coverage & 0x0003 ); - - GXV_TRACE(( "classic Apple-dialect: " - "horizontal=%d, cross-stream=%d, format=%d\n", - horizontal, cross_stream, *format )); - - /* format 1 requires GX State Machine, too new for classic */ - if ( *format == 1 ) - return FALSE; - - GXV_TRACE(( "kerning values in Apple format subtable are ignored\n" )); - - return TRUE; - } - - - static FT_Bool - gxv_kern_coverage_classic_microsoft_validate( FT_UShort coverage, - FT_UShort* format, - GXV_Validator gxvalid ) - { - /* classic Microsoft-dialect */ -#ifdef GXV_LOAD_TRACE_VARS - FT_Bool horizontal; - FT_Bool minimum; - FT_Bool cross_stream; - FT_Bool override; -#endif - - FT_UNUSED( gxvalid ); - - - /* reserved bits = 0 */ - if ( coverage & 0xFDF0 ) - return FALSE; - -#ifdef GXV_LOAD_TRACE_VARS - horizontal = FT_BOOL( coverage & 1 ); - minimum = FT_BOOL( ( coverage >> 1 ) & 1 ); - cross_stream = FT_BOOL( ( coverage >> 2 ) & 1 ); - override = FT_BOOL( ( coverage >> 3 ) & 1 ); -#endif - - *format = (FT_UShort)( ( coverage >> 8 ) & 0x0003 ); - - GXV_TRACE(( "classic Microsoft-dialect: " - "horizontal=%d, minimum=%d, cross-stream=%d, " - "override=%d, format=%d\n", - horizontal, minimum, cross_stream, override, *format )); - - if ( *format == 2 ) - GXV_TRACE(( - "kerning values in Microsoft format 2 subtable are ignored\n" )); - - return TRUE; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** MAIN *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static GXV_kern_Dialect - gxv_kern_coverage_validate( FT_UShort coverage, - FT_UShort* format, - GXV_Validator gxvalid ) - { - GXV_kern_Dialect result = KERN_DIALECT_UNKNOWN; - - - GXV_NAME_ENTER( "validating coverage" ); - - GXV_TRACE(( "interprete coverage 0x%04x by Apple style\n", coverage )); - - if ( KERN_IS_NEW( gxvalid ) ) - { - if ( gxv_kern_coverage_new_apple_validate( coverage, - format, - gxvalid ) ) - { - result = KERN_DIALECT_APPLE; - goto Exit; - } - } - - if ( KERN_IS_CLASSIC( gxvalid ) && KERN_ALLOWS_APPLE( gxvalid ) ) - { - if ( gxv_kern_coverage_classic_apple_validate( coverage, - format, - gxvalid ) ) - { - result = KERN_DIALECT_APPLE; - goto Exit; - } - } - - if ( KERN_IS_CLASSIC( gxvalid ) && KERN_ALLOWS_MS( gxvalid ) ) - { - if ( gxv_kern_coverage_classic_microsoft_validate( coverage, - format, - gxvalid ) ) - { - result = KERN_DIALECT_MS; - goto Exit; - } - } - - GXV_TRACE(( "cannot interprete coverage, broken kern subtable\n" )); - - Exit: - GXV_EXIT; - return result; - } - - - static void - gxv_kern_subtable_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; -#ifdef GXV_LOAD_TRACE_VARS - FT_UShort version = 0; /* MS only: subtable version, unused */ -#endif - FT_ULong length; /* MS: 16bit, Apple: 32bit*/ - FT_UShort coverage; -#ifdef GXV_LOAD_TRACE_VARS - FT_UShort tupleIndex = 0; /* Apple only */ -#endif - FT_UShort u16[2]; - FT_UShort format = 255; /* subtable format */ - - - GXV_NAME_ENTER( "kern subtable" ); - - GXV_LIMIT_CHECK( 2 + 2 + 2 ); - u16[0] = FT_NEXT_USHORT( p ); /* Apple: length_hi MS: version */ - u16[1] = FT_NEXT_USHORT( p ); /* Apple: length_lo MS: length */ - coverage = FT_NEXT_USHORT( p ); - - switch ( gxv_kern_coverage_validate( coverage, &format, gxvalid ) ) - { - case KERN_DIALECT_MS: -#ifdef GXV_LOAD_TRACE_VARS - version = u16[0]; -#endif - length = u16[1]; -#ifdef GXV_LOAD_TRACE_VARS - tupleIndex = 0; -#endif - GXV_TRACE(( "Subtable version = %d\n", version )); - GXV_TRACE(( "Subtable length = %d\n", length )); - break; - - case KERN_DIALECT_APPLE: -#ifdef GXV_LOAD_TRACE_VARS - version = 0; -#endif - length = ( (FT_ULong)u16[0] << 16 ) + u16[1]; -#ifdef GXV_LOAD_TRACE_VARS - tupleIndex = 0; -#endif - GXV_TRACE(( "Subtable length = %d\n", length )); - - if ( KERN_IS_NEW( gxvalid ) ) - { - GXV_LIMIT_CHECK( 2 ); -#ifdef GXV_LOAD_TRACE_VARS - tupleIndex = FT_NEXT_USHORT( p ); -#else - p += 2; -#endif - GXV_TRACE(( "Subtable tupleIndex = %d\n", tupleIndex )); - } - break; - - default: - length = u16[1]; - GXV_TRACE(( "cannot detect subtable dialect, " - "just skip %d byte\n", length )); - goto Exit; - } - - /* formats 1, 2, 3 require the position of the start of this subtable */ - if ( format == 0 ) - gxv_kern_subtable_fmt0_validate( table, table + length, gxvalid ); - else if ( format == 1 ) - gxv_kern_subtable_fmt1_validate( table, table + length, gxvalid ); - else if ( format == 2 ) - gxv_kern_subtable_fmt2_validate( table, table + length, gxvalid ); - else if ( format == 3 ) - gxv_kern_subtable_fmt3_validate( table, table + length, gxvalid ); - else - FT_INVALID_DATA; - - Exit: - gxvalid->subtable_length = length; - GXV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** kern TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - gxv_kern_validate_generic( FT_Bytes table, - FT_Face face, - FT_Bool classic_only, - GXV_kern_Dialect dialect_request, - FT_Validator ftvalid ) - { - GXV_ValidatorRec gxvalidrec; - GXV_Validator gxvalid = &gxvalidrec; - - GXV_kern_DataRec kernrec; - GXV_kern_Data kern = &kernrec; - - FT_Bytes p = table; - FT_Bytes limit = 0; - - FT_ULong nTables = 0; - FT_UInt i; - - - gxvalid->root = ftvalid; - gxvalid->table_data = kern; - gxvalid->face = face; - - FT_TRACE3(( "validating `kern' table\n" )); - GXV_INIT; - KERN_DIALECT( gxvalid ) = dialect_request; - - GXV_LIMIT_CHECK( 2 ); - GXV_KERN_DATA( version ) = (GXV_kern_Version)FT_NEXT_USHORT( p ); - GXV_TRACE(( "version 0x%04x (higher 16bit)\n", - GXV_KERN_DATA( version ) )); - - if ( 0x0001 < GXV_KERN_DATA( version ) ) - FT_INVALID_FORMAT; - else if ( KERN_IS_CLASSIC( gxvalid ) ) - { - GXV_LIMIT_CHECK( 2 ); - nTables = FT_NEXT_USHORT( p ); - } - else if ( KERN_IS_NEW( gxvalid ) ) - { - if ( classic_only ) - FT_INVALID_FORMAT; - - if ( 0x0000 != FT_NEXT_USHORT( p ) ) - FT_INVALID_FORMAT; - - GXV_LIMIT_CHECK( 4 ); - nTables = FT_NEXT_ULONG( p ); - } - - for ( i = 0; i < nTables; i++ ) - { - GXV_TRACE(( "validating subtable %d/%d\n", i, nTables )); - /* p should be 32bit-aligned? */ - gxv_kern_subtable_validate( p, 0, gxvalid ); - p += gxvalid->subtable_length; - } - - FT_TRACE4(( "\n" )); - } - - - FT_LOCAL_DEF( void ) - gxv_kern_validate( FT_Bytes table, - FT_Face face, - FT_Validator ftvalid ) - { - gxv_kern_validate_generic( table, face, 0, KERN_DIALECT_ANY, ftvalid ); - } - - - FT_LOCAL_DEF( void ) - gxv_kern_validate_classic( FT_Bytes table, - FT_Face face, - FT_Int dialect_flags, - FT_Validator ftvalid ) - { - GXV_kern_Dialect dialect_request; - - - dialect_request = (GXV_kern_Dialect)dialect_flags; - gxv_kern_validate_generic( table, face, 1, dialect_request, ftvalid ); - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvlcar.c b/3party/freetype/src/gxvalid/gxvlcar.c deleted file mode 100644 index af589fdb6f..0000000000 --- a/3party/freetype/src/gxvalid/gxvlcar.c +++ /dev/null @@ -1,224 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvlcar.c */ -/* */ -/* TrueTypeGX/AAT lcar table validation (body). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvalid.h" -#include "gxvcommn.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvlcar - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Data and Types *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct GXV_lcar_DataRec_ - { - FT_UShort format; - - } GXV_lcar_DataRec, *GXV_lcar_Data; - - -#define GXV_LCAR_DATA( FIELD ) GXV_TABLE_DATA( lcar, FIELD ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** UTILITY FUNCTIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - gxv_lcar_partial_validate( FT_Short partial, - FT_UShort glyph, - GXV_Validator gxvalid ) - { - GXV_NAME_ENTER( "partial" ); - - if ( GXV_LCAR_DATA( format ) != 1 ) - goto Exit; - - gxv_ctlPoint_validate( glyph, (FT_UShort)partial, gxvalid ); - - Exit: - GXV_EXIT; - } - - - static void - gxv_lcar_LookupValue_validate( FT_UShort glyph, - GXV_LookupValueCPtr value_p, - GXV_Validator gxvalid ) - { - FT_Bytes p = gxvalid->root->base + value_p->u; - FT_Bytes limit = gxvalid->root->limit; - FT_UShort count; - FT_Short partial; - FT_UShort i; - - - GXV_NAME_ENTER( "element in lookupTable" ); - - GXV_LIMIT_CHECK( 2 ); - count = FT_NEXT_USHORT( p ); - - GXV_LIMIT_CHECK( 2 * count ); - for ( i = 0; i < count; i++ ) - { - partial = FT_NEXT_SHORT( p ); - gxv_lcar_partial_validate( partial, glyph, gxvalid ); - } - - GXV_EXIT; - } - - - /* - +------ lcar --------------------+ - | | - | +===============+ | - | | looup header | | - | +===============+ | - | | BinSrchHeader | | - | +===============+ | - | | lastGlyph[0] | | - | +---------------+ | - | | firstGlyph[0] | | head of lcar sfnt table - | +---------------+ | + - | | offset[0] | -> | offset [byte] - | +===============+ | + - | | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] - | +---------------+ | - | | firstGlyph[1] | | - | +---------------+ | - | | offset[1] | | - | +===============+ | - | | - | .... | - | | - | 16bit value array | - | +===============+ | - +------| value | <-------+ - | .... - | - | - | - | - | - +----> lcar values...handled by lcar callback function - */ - - static GXV_LookupValueDesc - gxv_lcar_LookupFmt4_transit( FT_UShort relative_gindex, - GXV_LookupValueCPtr base_value_p, - FT_Bytes lookuptbl_limit, - GXV_Validator gxvalid ) - { - FT_Bytes p; - FT_Bytes limit; - FT_UShort offset; - GXV_LookupValueDesc value; - - FT_UNUSED( lookuptbl_limit ); - - /* XXX: check range? */ - offset = (FT_UShort)( base_value_p->u + - relative_gindex * sizeof ( FT_UShort ) ); - p = gxvalid->root->base + offset; - limit = gxvalid->root->limit; - - GXV_LIMIT_CHECK ( 2 ); - value.u = FT_NEXT_USHORT( p ); - - return value; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** lcar TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - gxv_lcar_validate( FT_Bytes table, - FT_Face face, - FT_Validator ftvalid ) - { - FT_Bytes p = table; - FT_Bytes limit = 0; - GXV_ValidatorRec gxvalidrec; - GXV_Validator gxvalid = &gxvalidrec; - - GXV_lcar_DataRec lcarrec; - GXV_lcar_Data lcar = &lcarrec; - - FT_Fixed version; - - - gxvalid->root = ftvalid; - gxvalid->table_data = lcar; - gxvalid->face = face; - - FT_TRACE3(( "validating `lcar' table\n" )); - GXV_INIT; - - GXV_LIMIT_CHECK( 4 + 2 ); - version = FT_NEXT_LONG( p ); - GXV_LCAR_DATA( format ) = FT_NEXT_USHORT( p ); - - if ( version != 0x00010000UL) - FT_INVALID_FORMAT; - - if ( GXV_LCAR_DATA( format ) > 1 ) - FT_INVALID_FORMAT; - - gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; - gxvalid->lookupval_func = gxv_lcar_LookupValue_validate; - gxvalid->lookupfmt4_trans = gxv_lcar_LookupFmt4_transit; - gxv_LookupTable_validate( p, limit, gxvalid ); - - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmod.c b/3party/freetype/src/gxvalid/gxvmod.c deleted file mode 100644 index 17a02e7b8b..0000000000 --- a/3party/freetype/src/gxvalid/gxvmod.c +++ /dev/null @@ -1,285 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmod.c */ -/* */ -/* FreeType's TrueTypeGX/AAT validation module implementation (body). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_TRUETYPE_TABLES_H -#include FT_TRUETYPE_TAGS_H -#include FT_GX_VALIDATE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_GX_VALIDATE_H - -#include "gxvmod.h" -#include "gxvalid.h" -#include "gxvcommn.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvmodule - - - static FT_Error - gxv_load_table( FT_Face face, - FT_Tag tag, - FT_Byte* volatile* table, - FT_ULong* table_len ) - { - FT_Error error; - FT_Memory memory = FT_FACE_MEMORY( face ); - - - error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len ); - if ( FT_ERR_EQ( error, Table_Missing ) ) - return FT_Err_Ok; - if ( error ) - goto Exit; - - if ( FT_ALLOC( *table, *table_len ) ) - goto Exit; - - error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len ); - - Exit: - return error; - } - - -#define GXV_TABLE_DECL( _sfnt ) \ - FT_Byte* volatile _sfnt = NULL; \ - FT_ULong len_ ## _sfnt = 0 - -#define GXV_TABLE_LOAD( _sfnt ) \ - if ( ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) && \ - ( gx_flags & FT_VALIDATE_ ## _sfnt ) ) \ - { \ - error = gxv_load_table( face, TTAG_ ## _sfnt, \ - &_sfnt, &len_ ## _sfnt ); \ - if ( error ) \ - goto Exit; \ - } - -#define GXV_TABLE_VALIDATE( _sfnt ) \ - if ( _sfnt ) \ - { \ - ft_validator_init( &valid, _sfnt, _sfnt + len_ ## _sfnt, \ - FT_VALIDATE_DEFAULT ); \ - if ( ft_setjmp( valid.jump_buffer ) == 0 ) \ - gxv_ ## _sfnt ## _validate( _sfnt, face, &valid ); \ - error = valid.error; \ - if ( error ) \ - goto Exit; \ - } - -#define GXV_TABLE_SET( _sfnt ) \ - if ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) \ - tables[FT_VALIDATE_ ## _sfnt ## _INDEX] = (FT_Bytes)_sfnt - - - static FT_Error - gxv_validate( FT_Face face, - FT_UInt gx_flags, - FT_Bytes tables[FT_VALIDATE_GX_LENGTH], - FT_UInt table_count ) - { - FT_Memory volatile memory = FT_FACE_MEMORY( face ); - - FT_Error error = FT_Err_Ok; - FT_ValidatorRec volatile valid; - - FT_UInt i; - - - GXV_TABLE_DECL( feat ); - GXV_TABLE_DECL( bsln ); - GXV_TABLE_DECL( trak ); - GXV_TABLE_DECL( just ); - GXV_TABLE_DECL( mort ); - GXV_TABLE_DECL( morx ); - GXV_TABLE_DECL( kern ); - GXV_TABLE_DECL( opbd ); - GXV_TABLE_DECL( prop ); - GXV_TABLE_DECL( lcar ); - - for ( i = 0; i < table_count; i++ ) - tables[i] = 0; - - /* load tables */ - GXV_TABLE_LOAD( feat ); - GXV_TABLE_LOAD( bsln ); - GXV_TABLE_LOAD( trak ); - GXV_TABLE_LOAD( just ); - GXV_TABLE_LOAD( mort ); - GXV_TABLE_LOAD( morx ); - GXV_TABLE_LOAD( kern ); - GXV_TABLE_LOAD( opbd ); - GXV_TABLE_LOAD( prop ); - GXV_TABLE_LOAD( lcar ); - - /* validate tables */ - GXV_TABLE_VALIDATE( feat ); - GXV_TABLE_VALIDATE( bsln ); - GXV_TABLE_VALIDATE( trak ); - GXV_TABLE_VALIDATE( just ); - GXV_TABLE_VALIDATE( mort ); - GXV_TABLE_VALIDATE( morx ); - GXV_TABLE_VALIDATE( kern ); - GXV_TABLE_VALIDATE( opbd ); - GXV_TABLE_VALIDATE( prop ); - GXV_TABLE_VALIDATE( lcar ); - - /* Set results */ - GXV_TABLE_SET( feat ); - GXV_TABLE_SET( mort ); - GXV_TABLE_SET( morx ); - GXV_TABLE_SET( bsln ); - GXV_TABLE_SET( just ); - GXV_TABLE_SET( kern ); - GXV_TABLE_SET( opbd ); - GXV_TABLE_SET( trak ); - GXV_TABLE_SET( prop ); - GXV_TABLE_SET( lcar ); - - Exit: - if ( error ) - { - FT_FREE( feat ); - FT_FREE( bsln ); - FT_FREE( trak ); - FT_FREE( just ); - FT_FREE( mort ); - FT_FREE( morx ); - FT_FREE( kern ); - FT_FREE( opbd ); - FT_FREE( prop ); - FT_FREE( lcar ); - } - - return error; - } - - - static FT_Error - classic_kern_validate( FT_Face face, - FT_UInt ckern_flags, - FT_Bytes* ckern_table ) - { - FT_Memory volatile memory = FT_FACE_MEMORY( face ); - - FT_Byte* volatile ckern = NULL; - FT_ULong len_ckern = 0; - - /* without volatile on `error' GCC 4.1.1. emits: */ - /* warning: variable 'error' might be clobbered by 'longjmp' or 'vfork' */ - /* this warning seems spurious but --- */ - FT_Error volatile error; - FT_ValidatorRec volatile valid; - - - *ckern_table = NULL; - - error = gxv_load_table( face, TTAG_kern, &ckern, &len_ckern ); - if ( error ) - goto Exit; - - if ( ckern ) - { - ft_validator_init( &valid, ckern, ckern + len_ckern, - FT_VALIDATE_DEFAULT ); - if ( ft_setjmp( valid.jump_buffer ) == 0 ) - gxv_kern_validate_classic( ckern, face, - ckern_flags & FT_VALIDATE_CKERN, &valid ); - error = valid.error; - if ( error ) - goto Exit; - } - - *ckern_table = ckern; - - Exit: - if ( error ) - FT_FREE( ckern ); - - return error; - } - - - static - const FT_Service_GXvalidateRec gxvalid_interface = - { - gxv_validate - }; - - - static - const FT_Service_CKERNvalidateRec ckernvalid_interface = - { - classic_kern_validate - }; - - - static - const FT_ServiceDescRec gxvalid_services[] = - { - { FT_SERVICE_ID_GX_VALIDATE, &gxvalid_interface }, - { FT_SERVICE_ID_CLASSICKERN_VALIDATE, &ckernvalid_interface }, - { NULL, NULL } - }; - - - static FT_Pointer - gxvalid_get_service( FT_Module module, - const char* service_id ) - { - FT_UNUSED( module ); - - return ft_service_list_lookup( gxvalid_services, service_id ); - } - - - FT_CALLBACK_TABLE_DEF - const FT_Module_Class gxv_module_class = - { - 0, - sizeof ( FT_ModuleRec ), - "gxvalid", - 0x10000L, - 0x20000L, - - 0, /* module-specific interface */ - - (FT_Module_Constructor)0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) gxvalid_get_service - }; - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmod.h b/3party/freetype/src/gxvalid/gxvmod.h deleted file mode 100644 index 1ff2cfc8bb..0000000000 --- a/3party/freetype/src/gxvalid/gxvmod.h +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmod.h */ -/* */ -/* FreeType's TrueTypeGX/AAT validation module implementation */ -/* (specification). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#ifndef __GXVMOD_H__ -#define __GXVMOD_H__ - -#include <ft2build.h> -#include FT_MODULE_H - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC -#error "this module does not support PIC yet" -#endif - - - FT_EXPORT_VAR( const FT_Module_Class ) gxv_module_class; - - -FT_END_HEADER - -#endif /* __GXVMOD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmort.c b/3party/freetype/src/gxvalid/gxvmort.c deleted file mode 100644 index a9e7a58fea..0000000000 --- a/3party/freetype/src/gxvalid/gxvmort.c +++ /dev/null @@ -1,300 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmort.c */ -/* */ -/* TrueTypeGX/AAT mort table validation (body). */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvmort.h" -#include "gxvfeat.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvmort - - - static void - gxv_mort_feature_validate( GXV_mort_feature f, - GXV_Validator gxvalid ) - { - if ( f->featureType >= gxv_feat_registry_length ) - { - GXV_TRACE(( "featureType %d is out of registered range, " - "setting %d is unchecked\n", - f->featureType, f->featureSetting )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - } - else if ( !gxv_feat_registry[f->featureType].existence ) - { - GXV_TRACE(( "featureType %d is within registered area " - "but undefined, setting %d is unchecked\n", - f->featureType, f->featureSetting )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - } - else - { - FT_Byte nSettings_max; - - - /* nSettings in gxvfeat.c is halved for exclusive on/off settings */ - nSettings_max = gxv_feat_registry[f->featureType].nSettings; - if ( gxv_feat_registry[f->featureType].exclusive ) - nSettings_max = (FT_Byte)( 2 * nSettings_max ); - - GXV_TRACE(( "featureType %d is registered", f->featureType )); - GXV_TRACE(( "setting %d", f->featureSetting )); - - if ( f->featureSetting > nSettings_max ) - { - GXV_TRACE(( "out of defined range %d", nSettings_max )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - } - GXV_TRACE(( "\n" )); - } - - /* TODO: enableFlags must be unique value in specified chain? */ - } - - - /* - * nFeatureFlags is typed to FT_ULong to accept that in - * mort (typed FT_UShort) and morx (typed FT_ULong). - */ - FT_LOCAL_DEF( void ) - gxv_mort_featurearray_validate( FT_Bytes table, - FT_Bytes limit, - FT_ULong nFeatureFlags, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_ULong i; - - GXV_mort_featureRec f = GXV_MORT_FEATURE_OFF; - - - GXV_NAME_ENTER( "mort feature list" ); - for ( i = 0; i < nFeatureFlags; i++ ) - { - GXV_LIMIT_CHECK( 2 + 2 + 4 + 4 ); - f.featureType = FT_NEXT_USHORT( p ); - f.featureSetting = FT_NEXT_USHORT( p ); - f.enableFlags = FT_NEXT_ULONG( p ); - f.disableFlags = FT_NEXT_ULONG( p ); - - gxv_mort_feature_validate( &f, gxvalid ); - } - - if ( !IS_GXV_MORT_FEATURE_OFF( f ) ) - FT_INVALID_DATA; - - gxvalid->subtable_length = (FT_ULong)( p - table ); - GXV_EXIT; - } - - - FT_LOCAL_DEF( void ) - gxv_mort_coverage_validate( FT_UShort coverage, - GXV_Validator gxvalid ) - { - FT_UNUSED( gxvalid ); - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( coverage & 0x8000U ) - GXV_TRACE(( " this subtable is for vertical text only\n" )); - else - GXV_TRACE(( " this subtable is for horizontal text only\n" )); - - if ( coverage & 0x4000 ) - GXV_TRACE(( " this subtable is applied to glyph array " - "in descending order\n" )); - else - GXV_TRACE(( " this subtable is applied to glyph array " - "in ascending order\n" )); - - if ( coverage & 0x2000 ) - GXV_TRACE(( " this subtable is forcibly applied to " - "vertical/horizontal text\n" )); - - if ( coverage & 0x1FF8 ) - GXV_TRACE(( " coverage has non-zero bits in reserved area\n" )); -#endif - } - - - static void - gxv_mort_subtables_validate( FT_Bytes table, - FT_Bytes limit, - FT_UShort nSubtables, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - GXV_Validate_Func fmt_funcs_table[] = - { - gxv_mort_subtable_type0_validate, /* 0 */ - gxv_mort_subtable_type1_validate, /* 1 */ - gxv_mort_subtable_type2_validate, /* 2 */ - NULL, /* 3 */ - gxv_mort_subtable_type4_validate, /* 4 */ - gxv_mort_subtable_type5_validate, /* 5 */ - - }; - - FT_UShort i; - - - GXV_NAME_ENTER( "subtables in a chain" ); - - for ( i = 0; i < nSubtables; i++ ) - { - GXV_Validate_Func func; - - FT_UShort length; - FT_UShort coverage; -#ifdef GXV_LOAD_UNUSED_VARS - FT_ULong subFeatureFlags; -#endif - FT_UInt type; - FT_UInt rest; - - - GXV_LIMIT_CHECK( 2 + 2 + 4 ); - length = FT_NEXT_USHORT( p ); - coverage = FT_NEXT_USHORT( p ); -#ifdef GXV_LOAD_UNUSED_VARS - subFeatureFlags = FT_NEXT_ULONG( p ); -#else - p += 4; -#endif - - GXV_TRACE(( "validating chain subtable %d/%d (%d bytes)\n", - i + 1, nSubtables, length )); - type = coverage & 0x0007; - rest = length - ( 2 + 2 + 4 ); - - GXV_LIMIT_CHECK( rest ); - gxv_mort_coverage_validate( coverage, gxvalid ); - - if ( type > 5 ) - FT_INVALID_FORMAT; - - func = fmt_funcs_table[type]; - if ( func == NULL ) - GXV_TRACE(( "morx type %d is reserved\n", type )); - - func( p, p + rest, gxvalid ); - - p += rest; - /* TODO: validate subFeatureFlags */ - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - - GXV_EXIT; - } - - - static void - gxv_mort_chain_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; -#ifdef GXV_LOAD_UNUSED_VARS - FT_ULong defaultFlags; -#endif - FT_ULong chainLength; - FT_UShort nFeatureFlags; - FT_UShort nSubtables; - - - GXV_NAME_ENTER( "mort chain header" ); - - GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 ); -#ifdef GXV_LOAD_UNUSED_VARS - defaultFlags = FT_NEXT_ULONG( p ); -#else - p += 4; -#endif - chainLength = FT_NEXT_ULONG( p ); - nFeatureFlags = FT_NEXT_USHORT( p ); - nSubtables = FT_NEXT_USHORT( p ); - - gxv_mort_featurearray_validate( p, table + chainLength, - nFeatureFlags, gxvalid ); - p += gxvalid->subtable_length; - gxv_mort_subtables_validate( p, table + chainLength, nSubtables, gxvalid ); - gxvalid->subtable_length = chainLength; - - /* TODO: validate defaultFlags */ - GXV_EXIT; - } - - - FT_LOCAL_DEF( void ) - gxv_mort_validate( FT_Bytes table, - FT_Face face, - FT_Validator ftvalid ) - { - GXV_ValidatorRec gxvalidrec; - GXV_Validator gxvalid = &gxvalidrec; - FT_Bytes p = table; - FT_Bytes limit = 0; - FT_ULong version; - FT_ULong nChains; - FT_ULong i; - - - gxvalid->root = ftvalid; - gxvalid->face = face; - limit = gxvalid->root->limit; - - FT_TRACE3(( "validating `mort' table\n" )); - GXV_INIT; - - GXV_LIMIT_CHECK( 4 + 4 ); - version = FT_NEXT_ULONG( p ); - nChains = FT_NEXT_ULONG( p ); - - if (version != 0x00010000UL) - FT_INVALID_FORMAT; - - for ( i = 0; i < nChains; i++ ) - { - GXV_TRACE(( "validating chain %d/%d\n", i + 1, nChains )); - GXV_32BIT_ALIGNMENT_VALIDATE( p - table ); - gxv_mort_chain_validate( p, limit, gxvalid ); - p += gxvalid->subtable_length; - } - - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmort.h b/3party/freetype/src/gxvalid/gxvmort.h deleted file mode 100644 index c95391b61f..0000000000 --- a/3party/freetype/src/gxvalid/gxvmort.h +++ /dev/null @@ -1,94 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmort.h */ -/* */ -/* TrueTypeGX/AAT common definition for mort table (specification). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#ifndef __GXVMORT_H__ -#define __GXVMORT_H__ - -#include "gxvalid.h" -#include "gxvcommn.h" - -#include FT_SFNT_NAMES_H - - - typedef struct GXV_mort_featureRec_ - { - FT_UShort featureType; - FT_UShort featureSetting; - FT_ULong enableFlags; - FT_ULong disableFlags; - - } GXV_mort_featureRec, *GXV_mort_feature; - -#define GXV_MORT_FEATURE_OFF {0, 1, 0x00000000UL, 0x00000000UL} - -#define IS_GXV_MORT_FEATURE_OFF( f ) \ - ( (f).featureType == 0 || \ - (f).featureSetting == 1 || \ - (f).enableFlags == 0x00000000UL || \ - (f).disableFlags == 0x00000000UL ) - - - FT_LOCAL( void ) - gxv_mort_featurearray_validate( FT_Bytes table, - FT_Bytes limit, - FT_ULong nFeatureFlags, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_mort_coverage_validate( FT_UShort coverage, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_mort_subtable_type0_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_mort_subtable_type1_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_mort_subtable_type2_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_mort_subtable_type4_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_mort_subtable_type5_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - -#endif /* __GXVMORT_H__ */ - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmort0.c b/3party/freetype/src/gxvalid/gxvmort0.c deleted file mode 100644 index 0cace35ae2..0000000000 --- a/3party/freetype/src/gxvalid/gxvmort0.c +++ /dev/null @@ -1,152 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmort0.c */ -/* */ -/* TrueTypeGX/AAT mort table validation */ -/* body for type0 (Indic Script Rearrangement) subtable. */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvmort.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvmort - - - static const char* GXV_Mort_IndicScript_Msg[] = - { - "no change", - "Ax => xA", - "xD => Dx", - "AxD => DxA", - "ABx => xAB", - "ABx => xBA", - "xCD => CDx", - "xCD => DCx", - "AxCD => CDxA", - "AxCD => DCxA", - "ABxD => DxAB", - "ABxD => DxBA", - "ABxCD => CDxAB", - "ABxCD => CDxBA", - "ABxCD => DCxAB", - "ABxCD => DCxBA", - - }; - - - static void - gxv_mort_subtable_type0_entry_validate( - FT_Byte state, - FT_UShort flags, - GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, - FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_UShort markFirst; - FT_UShort dontAdvance; - FT_UShort markLast; - FT_UShort reserved; - FT_UShort verb = 0; - - FT_UNUSED( state ); - FT_UNUSED( table ); - FT_UNUSED( limit ); - - FT_UNUSED( GXV_Mort_IndicScript_Msg[verb] ); /* for the non-debugging */ - FT_UNUSED( glyphOffset_p ); /* case */ - - - markFirst = (FT_UShort)( ( flags >> 15 ) & 1 ); - dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); - markLast = (FT_UShort)( ( flags >> 13 ) & 1 ); - - reserved = (FT_UShort)( flags & 0x1FF0 ); - verb = (FT_UShort)( flags & 0x000F ); - - GXV_TRACE(( " IndicScript MorphRule for glyphOffset 0x%04x", - glyphOffset_p->u )); - GXV_TRACE(( " markFirst=%01d", markFirst )); - GXV_TRACE(( " dontAdvance=%01d", dontAdvance )); - GXV_TRACE(( " markLast=%01d", markLast )); - GXV_TRACE(( " %02d", verb )); - GXV_TRACE(( " %s\n", GXV_Mort_IndicScript_Msg[verb] )); - - if ( markFirst > 0 && markLast > 0 ) - { - GXV_TRACE(( " [odd] a glyph is marked as the first and last" - " in Indic rearrangement\n" )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - } - - if ( markFirst > 0 && dontAdvance > 0 ) - { - GXV_TRACE(( " [odd] the first glyph is marked as dontAdvance" - " in Indic rearrangement\n" )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - } - - if ( 0 < reserved ) - { - GXV_TRACE(( " non-zero bits found in reserved range\n" )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - } - else - GXV_TRACE(( "\n" )); - } - - - FT_LOCAL_DEF( void ) - gxv_mort_subtable_type0_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - - GXV_NAME_ENTER( - "mort chain subtable type0 (Indic-Script Rearrangement)" ); - - GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE ); - - gxvalid->statetable.optdata = NULL; - gxvalid->statetable.optdata_load_func = NULL; - gxvalid->statetable.subtable_setup_func = NULL; - gxvalid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE; - gxvalid->statetable.entry_validate_func = - gxv_mort_subtable_type0_entry_validate; - - gxv_StateTable_validate( p, limit, gxvalid ); - - GXV_EXIT; - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmort1.c b/3party/freetype/src/gxvalid/gxvmort1.c deleted file mode 100644 index aa02df5a99..0000000000 --- a/3party/freetype/src/gxvalid/gxvmort1.c +++ /dev/null @@ -1,260 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmort1.c */ -/* */ -/* TrueTypeGX/AAT mort table validation */ -/* body for type1 (Contextual Substitution) subtable. */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvmort.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvmort - - - typedef struct GXV_mort_subtable_type1_StateOptRec_ - { - FT_UShort substitutionTable; - FT_UShort substitutionTable_length; - - } GXV_mort_subtable_type1_StateOptRec, - *GXV_mort_subtable_type1_StateOptRecData; - -#define GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE \ - ( GXV_STATETABLE_HEADER_SIZE + 2 ) - - - static void - gxv_mort_subtable_type1_substitutionTable_load( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - GXV_mort_subtable_type1_StateOptRecData optdata = - (GXV_mort_subtable_type1_StateOptRecData)gxvalid->statetable.optdata; - - - GXV_LIMIT_CHECK( 2 ); - optdata->substitutionTable = FT_NEXT_USHORT( p ); - } - - - static void - gxv_mort_subtable_type1_subtable_setup( FT_UShort table_size, - FT_UShort classTable, - FT_UShort stateArray, - FT_UShort entryTable, - FT_UShort* classTable_length_p, - FT_UShort* stateArray_length_p, - FT_UShort* entryTable_length_p, - GXV_Validator gxvalid ) - { - FT_UShort o[4]; - FT_UShort *l[4]; - FT_UShort buff[5]; - - GXV_mort_subtable_type1_StateOptRecData optdata = - (GXV_mort_subtable_type1_StateOptRecData)gxvalid->statetable.optdata; - - - o[0] = classTable; - o[1] = stateArray; - o[2] = entryTable; - o[3] = optdata->substitutionTable; - l[0] = classTable_length_p; - l[1] = stateArray_length_p; - l[2] = entryTable_length_p; - l[3] = &( optdata->substitutionTable_length ); - - gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, gxvalid ); - } - - - static void - gxv_mort_subtable_type1_offset_to_subst_validate( - FT_Short wordOffset, - const FT_String* tag, - FT_Byte state, - GXV_Validator gxvalid ) - { - FT_UShort substTable; - FT_UShort substTable_limit; - - FT_UNUSED( tag ); - FT_UNUSED( state ); - - - substTable = - ((GXV_mort_subtable_type1_StateOptRec *) - (gxvalid->statetable.optdata))->substitutionTable; - substTable_limit = - (FT_UShort)( substTable + - ((GXV_mort_subtable_type1_StateOptRec *) - (gxvalid->statetable.optdata))->substitutionTable_length ); - - gxvalid->min_gid = (FT_UShort)( ( substTable - wordOffset * 2 ) / 2 ); - gxvalid->max_gid = (FT_UShort)( ( substTable_limit - wordOffset * 2 ) / 2 ); - gxvalid->max_gid = (FT_UShort)( FT_MAX( gxvalid->max_gid, - gxvalid->face->num_glyphs ) ); - - /* XXX: check range? */ - - /* TODO: min_gid & max_gid comparison with ClassTable contents */ - } - - - static void - gxv_mort_subtable_type1_entry_validate( - FT_Byte state, - FT_UShort flags, - GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, - FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { -#ifdef GXV_LOAD_UNUSED_VARS - FT_UShort setMark; - FT_UShort dontAdvance; -#endif - FT_UShort reserved; - FT_Short markOffset; - FT_Short currentOffset; - - FT_UNUSED( table ); - FT_UNUSED( limit ); - - -#ifdef GXV_LOAD_UNUSED_VARS - setMark = (FT_UShort)( flags >> 15 ); - dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); -#endif - reserved = (FT_UShort)( flags & 0x3FFF ); - - markOffset = (FT_Short)( glyphOffset_p->ul >> 16 ); - currentOffset = (FT_Short)( glyphOffset_p->ul ); - - if ( 0 < reserved ) - { - GXV_TRACE(( " non-zero bits found in reserved range\n" )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - } - - gxv_mort_subtable_type1_offset_to_subst_validate( markOffset, - "markOffset", - state, - gxvalid ); - - gxv_mort_subtable_type1_offset_to_subst_validate( currentOffset, - "currentOffset", - state, - gxvalid ); - } - - - static void - gxv_mort_subtable_type1_substTable_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort num_gids = (FT_UShort)( - ((GXV_mort_subtable_type1_StateOptRec *) - (gxvalid->statetable.optdata))->substitutionTable_length / 2 ); - FT_UShort i; - - - GXV_NAME_ENTER( "validating contents of substitutionTable" ); - for ( i = 0; i < num_gids ; i ++ ) - { - FT_UShort dst_gid; - - - GXV_LIMIT_CHECK( 2 ); - dst_gid = FT_NEXT_USHORT( p ); - - if ( dst_gid >= 0xFFFFU ) - continue; - - if ( dst_gid < gxvalid->min_gid || gxvalid->max_gid < dst_gid ) - { - GXV_TRACE(( "substTable include a strange gid[%d]=%d >" - " out of define range (%d..%d)\n", - i, dst_gid, gxvalid->min_gid, gxvalid->max_gid )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); - } - } - - GXV_EXIT; - } - - - /* - * subtable for Contextual glyph substitution is a modified StateTable. - * In addition to classTable, stateArray, and entryTable, the field - * `substitutionTable' is added. - */ - FT_LOCAL_DEF( void ) - gxv_mort_subtable_type1_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - GXV_mort_subtable_type1_StateOptRec st_rec; - - - GXV_NAME_ENTER( "mort chain subtable type1 (Contextual Glyph Subst)" ); - - GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE ); - - gxvalid->statetable.optdata = - &st_rec; - gxvalid->statetable.optdata_load_func = - gxv_mort_subtable_type1_substitutionTable_load; - gxvalid->statetable.subtable_setup_func = - gxv_mort_subtable_type1_subtable_setup; - gxvalid->statetable.entry_glyphoffset_fmt = - GXV_GLYPHOFFSET_ULONG; - gxvalid->statetable.entry_validate_func = - - gxv_mort_subtable_type1_entry_validate; - gxv_StateTable_validate( p, limit, gxvalid ); - - gxv_mort_subtable_type1_substTable_validate( - table + st_rec.substitutionTable, - table + st_rec.substitutionTable + st_rec.substitutionTable_length, - gxvalid ); - - GXV_EXIT; - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmort2.c b/3party/freetype/src/gxvalid/gxvmort2.c deleted file mode 100644 index 6f56c94ca7..0000000000 --- a/3party/freetype/src/gxvalid/gxvmort2.c +++ /dev/null @@ -1,312 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmort2.c */ -/* */ -/* TrueTypeGX/AAT mort table validation */ -/* body for type2 (Ligature Substitution) subtable. */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvmort.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvmort - - - typedef struct GXV_mort_subtable_type2_StateOptRec_ - { - FT_UShort ligActionTable; - FT_UShort componentTable; - FT_UShort ligatureTable; - FT_UShort ligActionTable_length; - FT_UShort componentTable_length; - FT_UShort ligatureTable_length; - - } GXV_mort_subtable_type2_StateOptRec, - *GXV_mort_subtable_type2_StateOptRecData; - -#define GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE \ - ( GXV_STATETABLE_HEADER_SIZE + 2 + 2 + 2 ) - - - static void - gxv_mort_subtable_type2_opttable_load( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - GXV_mort_subtable_type2_StateOptRecData optdata = - (GXV_mort_subtable_type2_StateOptRecData)gxvalid->statetable.optdata; - - - GXV_LIMIT_CHECK( 2 + 2 + 2 ); - optdata->ligActionTable = FT_NEXT_USHORT( p ); - optdata->componentTable = FT_NEXT_USHORT( p ); - optdata->ligatureTable = FT_NEXT_USHORT( p ); - - GXV_TRACE(( "offset to ligActionTable=0x%04x\n", - optdata->ligActionTable )); - GXV_TRACE(( "offset to componentTable=0x%04x\n", - optdata->componentTable )); - GXV_TRACE(( "offset to ligatureTable=0x%04x\n", - optdata->ligatureTable )); - } - - - static void - gxv_mort_subtable_type2_subtable_setup( FT_UShort table_size, - FT_UShort classTable, - FT_UShort stateArray, - FT_UShort entryTable, - FT_UShort *classTable_length_p, - FT_UShort *stateArray_length_p, - FT_UShort *entryTable_length_p, - GXV_Validator gxvalid ) - { - FT_UShort o[6]; - FT_UShort *l[6]; - FT_UShort buff[7]; - - GXV_mort_subtable_type2_StateOptRecData optdata = - (GXV_mort_subtable_type2_StateOptRecData)gxvalid->statetable.optdata; - - - GXV_NAME_ENTER( "subtable boundaries setup" ); - - o[0] = classTable; - o[1] = stateArray; - o[2] = entryTable; - o[3] = optdata->ligActionTable; - o[4] = optdata->componentTable; - o[5] = optdata->ligatureTable; - l[0] = classTable_length_p; - l[1] = stateArray_length_p; - l[2] = entryTable_length_p; - l[3] = &(optdata->ligActionTable_length); - l[4] = &(optdata->componentTable_length); - l[5] = &(optdata->ligatureTable_length); - - gxv_set_length_by_ushort_offset( o, l, buff, 6, table_size, gxvalid ); - - GXV_TRACE(( "classTable: offset=0x%04x length=0x%04x\n", - classTable, *classTable_length_p )); - GXV_TRACE(( "stateArray: offset=0x%04x length=0x%04x\n", - stateArray, *stateArray_length_p )); - GXV_TRACE(( "entryTable: offset=0x%04x length=0x%04x\n", - entryTable, *entryTable_length_p )); - GXV_TRACE(( "ligActionTable: offset=0x%04x length=0x%04x\n", - optdata->ligActionTable, - optdata->ligActionTable_length )); - GXV_TRACE(( "componentTable: offset=0x%04x length=0x%04x\n", - optdata->componentTable, - optdata->componentTable_length )); - GXV_TRACE(( "ligatureTable: offset=0x%04x length=0x%04x\n", - optdata->ligatureTable, - optdata->ligatureTable_length )); - - GXV_EXIT; - } - - - static void - gxv_mort_subtable_type2_ligActionOffset_validate( - FT_Bytes table, - FT_UShort ligActionOffset, - GXV_Validator gxvalid ) - { - /* access ligActionTable */ - GXV_mort_subtable_type2_StateOptRecData optdata = - (GXV_mort_subtable_type2_StateOptRecData)gxvalid->statetable.optdata; - - FT_Bytes lat_base = table + optdata->ligActionTable; - FT_Bytes p = table + ligActionOffset; - FT_Bytes lat_limit = lat_base + optdata->ligActionTable; - - - GXV_32BIT_ALIGNMENT_VALIDATE( ligActionOffset ); - if ( p < lat_base ) - { - GXV_TRACE(( "too short offset 0x%04x: p < lat_base (%d byte rewind)\n", - ligActionOffset, lat_base - p )); - - /* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */ - GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); - } - else if ( lat_limit < p ) - { - GXV_TRACE(( "too large offset 0x%04x: lat_limit < p (%d byte overrun)\n", - ligActionOffset, p - lat_limit )); - - /* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */ - GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); - } - else - { - /* validate entry in ligActionTable */ - FT_ULong lig_action; -#ifdef GXV_LOAD_UNUSED_VARS - FT_UShort last; - FT_UShort store; -#endif - FT_ULong offset; - - - lig_action = FT_NEXT_ULONG( p ); -#ifdef GXV_LOAD_UNUSED_VARS - last = (FT_UShort)( ( lig_action >> 31 ) & 1 ); - store = (FT_UShort)( ( lig_action >> 30 ) & 1 ); -#endif - - /* Apple spec defines this offset as a word offset */ - offset = lig_action & 0x3FFFFFFFUL; - if ( offset * 2 < optdata->ligatureTable ) - { - GXV_TRACE(( "too short offset 0x%08x:" - " 2 x offset < ligatureTable (%d byte rewind)\n", - offset, optdata->ligatureTable - offset * 2 )); - - GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); - } else if ( offset * 2 > - optdata->ligatureTable + optdata->ligatureTable_length ) - { - GXV_TRACE(( "too long offset 0x%08x:" - " 2 x offset > ligatureTable + ligatureTable_length" - " (%d byte overrun)\n", - offset, - optdata->ligatureTable + optdata->ligatureTable_length - - offset * 2 )); - - GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); - } - } - } - - - static void - gxv_mort_subtable_type2_entry_validate( - FT_Byte state, - FT_UShort flags, - GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, - FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { -#ifdef GXV_LOAD_UNUSED_VARS - FT_UShort setComponent; - FT_UShort dontAdvance; -#endif - FT_UShort offset; - - FT_UNUSED( state ); - FT_UNUSED( glyphOffset_p ); - FT_UNUSED( limit ); - - -#ifdef GXV_LOAD_UNUSED_VARS - setComponent = (FT_UShort)( ( flags >> 15 ) & 1 ); - dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); -#endif - - offset = (FT_UShort)( flags & 0x3FFFU ); - - if ( 0 < offset ) - gxv_mort_subtable_type2_ligActionOffset_validate( table, offset, - gxvalid ); - } - - - static void - gxv_mort_subtable_type2_ligatureTable_validate( FT_Bytes table, - GXV_Validator gxvalid ) - { - GXV_mort_subtable_type2_StateOptRecData optdata = - (GXV_mort_subtable_type2_StateOptRecData)gxvalid->statetable.optdata; - - FT_Bytes p = table + optdata->ligatureTable; - FT_Bytes limit = table + optdata->ligatureTable - + optdata->ligatureTable_length; - - - GXV_NAME_ENTER( "mort chain subtable type2 - substitutionTable" ); - if ( 0 != optdata->ligatureTable ) - { - /* Apple does not give specification of ligatureTable format */ - while ( p < limit ) - { - FT_UShort lig_gid; - - - GXV_LIMIT_CHECK( 2 ); - lig_gid = FT_NEXT_USHORT( p ); - - if ( gxvalid->face->num_glyphs < lig_gid ) - GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); - } - } - GXV_EXIT; - } - - - FT_LOCAL_DEF( void ) - gxv_mort_subtable_type2_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - GXV_mort_subtable_type2_StateOptRec lig_rec; - - - GXV_NAME_ENTER( "mort chain subtable type2 (Ligature Substitution)" ); - - GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE ); - - gxvalid->statetable.optdata = - &lig_rec; - gxvalid->statetable.optdata_load_func = - gxv_mort_subtable_type2_opttable_load; - gxvalid->statetable.subtable_setup_func = - gxv_mort_subtable_type2_subtable_setup; - gxvalid->statetable.entry_glyphoffset_fmt = - GXV_GLYPHOFFSET_NONE; - gxvalid->statetable.entry_validate_func = - gxv_mort_subtable_type2_entry_validate; - - gxv_StateTable_validate( p, limit, gxvalid ); - - p += gxvalid->subtable_length; - gxv_mort_subtable_type2_ligatureTable_validate( table, gxvalid ); - - gxvalid->subtable_length = (FT_ULong)( p - table ); - - GXV_EXIT; - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmort4.c b/3party/freetype/src/gxvalid/gxvmort4.c deleted file mode 100644 index 535f37716d..0000000000 --- a/3party/freetype/src/gxvalid/gxvmort4.c +++ /dev/null @@ -1,126 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmort4.c */ -/* */ -/* TrueTypeGX/AAT mort table validation */ -/* body for type4 (Non-Contextual Glyph Substitution) subtable. */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvmort.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvmort - - - static void - gxv_mort_subtable_type4_lookupval_validate( FT_UShort glyph, - GXV_LookupValueCPtr value_p, - GXV_Validator gxvalid ) - { - FT_UNUSED( glyph ); - - gxv_glyphid_validate( value_p->u, gxvalid ); - } - - /* - +===============+ --------+ - | lookup header | | - +===============+ | - | BinSrchHeader | | - +===============+ | - | lastGlyph[0] | | - +---------------+ | - | firstGlyph[0] | | head of lookup table - +---------------+ | + - | offset[0] | -> | offset [byte] - +===============+ | + - | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] - +---------------+ | - | firstGlyph[1] | | - +---------------+ | - | offset[1] | | - +===============+ | - | - .... | - | - 16bit value array | - +===============+ | - | value | <-------+ - .... - */ - - static GXV_LookupValueDesc - gxv_mort_subtable_type4_lookupfmt4_transit( - FT_UShort relative_gindex, - GXV_LookupValueCPtr base_value_p, - FT_Bytes lookuptbl_limit, - GXV_Validator gxvalid ) - { - FT_Bytes p; - FT_Bytes limit; - FT_UShort offset; - GXV_LookupValueDesc value; - - /* XXX: check range? */ - offset = (FT_UShort)( base_value_p->u + - relative_gindex * sizeof ( FT_UShort ) ); - - p = gxvalid->lookuptbl_head + offset; - limit = lookuptbl_limit; - - GXV_LIMIT_CHECK( 2 ); - value.u = FT_NEXT_USHORT( p ); - - return value; - } - - - FT_LOCAL_DEF( void ) - gxv_mort_subtable_type4_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - - GXV_NAME_ENTER( "mort chain subtable type4 " - "(Non-Contextual Glyph Substitution)" ); - - gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; - gxvalid->lookupval_func = gxv_mort_subtable_type4_lookupval_validate; - gxvalid->lookupfmt4_trans = gxv_mort_subtable_type4_lookupfmt4_transit; - - gxv_LookupTable_validate( p, limit, gxvalid ); - - GXV_EXIT; - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmort5.c b/3party/freetype/src/gxvalid/gxvmort5.c deleted file mode 100644 index fb2f915fce..0000000000 --- a/3party/freetype/src/gxvalid/gxvmort5.c +++ /dev/null @@ -1,234 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmort5.c */ -/* */ -/* TrueTypeGX/AAT mort table validation */ -/* body for type5 (Contextual Glyph Insertion) subtable. */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvmort.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvmort - - - /* - * mort subtable type5 (Contextual Glyph Insertion) - * has the format of StateTable with insertion-glyph-list, - * but without name. The offset is given by glyphOffset in - * entryTable. There is no table location declaration - * like xxxTable. - */ - - typedef struct GXV_mort_subtable_type5_StateOptRec_ - { - FT_UShort classTable; - FT_UShort stateArray; - FT_UShort entryTable; - -#define GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE GXV_STATETABLE_HEADER_SIZE - - FT_UShort* classTable_length_p; - FT_UShort* stateArray_length_p; - FT_UShort* entryTable_length_p; - - } GXV_mort_subtable_type5_StateOptRec, - *GXV_mort_subtable_type5_StateOptRecData; - - - FT_LOCAL_DEF( void ) - gxv_mort_subtable_type5_subtable_setup( FT_UShort table_size, - FT_UShort classTable, - FT_UShort stateArray, - FT_UShort entryTable, - FT_UShort* classTable_length_p, - FT_UShort* stateArray_length_p, - FT_UShort* entryTable_length_p, - GXV_Validator gxvalid ) - { - GXV_mort_subtable_type5_StateOptRecData optdata = - (GXV_mort_subtable_type5_StateOptRecData)gxvalid->statetable.optdata; - - - gxv_StateTable_subtable_setup( table_size, - classTable, - stateArray, - entryTable, - classTable_length_p, - stateArray_length_p, - entryTable_length_p, - gxvalid ); - - optdata->classTable = classTable; - optdata->stateArray = stateArray; - optdata->entryTable = entryTable; - - optdata->classTable_length_p = classTable_length_p; - optdata->stateArray_length_p = stateArray_length_p; - optdata->entryTable_length_p = entryTable_length_p; - } - - - static void - gxv_mort_subtable_type5_InsertList_validate( FT_UShort offset, - FT_UShort count, - FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - /* - * We don't know the range of insertion-glyph-list. - * Set range by whole of state table. - */ - FT_Bytes p = table + offset; - - GXV_mort_subtable_type5_StateOptRecData optdata = - (GXV_mort_subtable_type5_StateOptRecData)gxvalid->statetable.optdata; - - if ( optdata->classTable < offset && - offset < optdata->classTable + *(optdata->classTable_length_p) ) - GXV_TRACE(( " offset runs into ClassTable" )); - if ( optdata->stateArray < offset && - offset < optdata->stateArray + *(optdata->stateArray_length_p) ) - GXV_TRACE(( " offset runs into StateArray" )); - if ( optdata->entryTable < offset && - offset < optdata->entryTable + *(optdata->entryTable_length_p) ) - GXV_TRACE(( " offset runs into EntryTable" )); - -#ifndef GXV_LOAD_TRACE_VARS - GXV_LIMIT_CHECK( count * 2 ); -#else - while ( p < table + offset + ( count * 2 ) ) - { - FT_UShort insert_glyphID; - - - GXV_LIMIT_CHECK( 2 ); - insert_glyphID = FT_NEXT_USHORT( p ); - GXV_TRACE(( " 0x%04x", insert_glyphID )); - } - GXV_TRACE(( "\n" )); -#endif - } - - - static void - gxv_mort_subtable_type5_entry_validate( - FT_Byte state, - FT_UShort flags, - GXV_StateTable_GlyphOffsetCPtr glyphOffset, - FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { -#ifdef GXV_LOAD_UNUSED_VARS - FT_Bool setMark; - FT_Bool dontAdvance; - FT_Bool currentIsKashidaLike; - FT_Bool markedIsKashidaLike; - FT_Bool currentInsertBefore; - FT_Bool markedInsertBefore; -#endif - FT_Byte currentInsertCount; - FT_Byte markedInsertCount; - FT_UShort currentInsertList; - FT_UShort markedInsertList; - - FT_UNUSED( state ); - - -#ifdef GXV_LOAD_UNUSED_VARS - setMark = FT_BOOL( ( flags >> 15 ) & 1 ); - dontAdvance = FT_BOOL( ( flags >> 14 ) & 1 ); - currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 ); - markedIsKashidaLike = FT_BOOL( ( flags >> 12 ) & 1 ); - currentInsertBefore = FT_BOOL( ( flags >> 11 ) & 1 ); - markedInsertBefore = FT_BOOL( ( flags >> 10 ) & 1 ); -#endif - - currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F ); - markedInsertCount = (FT_Byte)( flags & 0x001F ); - - currentInsertList = (FT_UShort)( glyphOffset->ul >> 16 ); - markedInsertList = (FT_UShort)( glyphOffset->ul ); - - if ( 0 != currentInsertList && 0 != currentInsertCount ) - { - gxv_mort_subtable_type5_InsertList_validate( currentInsertList, - currentInsertCount, - table, - limit, - gxvalid ); - } - - if ( 0 != markedInsertList && 0 != markedInsertCount ) - { - gxv_mort_subtable_type5_InsertList_validate( markedInsertList, - markedInsertCount, - table, - limit, - gxvalid ); - } - } - - - FT_LOCAL_DEF( void ) - gxv_mort_subtable_type5_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - GXV_mort_subtable_type5_StateOptRec et_rec; - GXV_mort_subtable_type5_StateOptRecData et = &et_rec; - - - GXV_NAME_ENTER( "mort chain subtable type5 (Glyph Insertion)" ); - - GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE ); - - gxvalid->statetable.optdata = - et; - gxvalid->statetable.optdata_load_func = - NULL; - gxvalid->statetable.subtable_setup_func = - gxv_mort_subtable_type5_subtable_setup; - gxvalid->statetable.entry_glyphoffset_fmt = - GXV_GLYPHOFFSET_ULONG; - gxvalid->statetable.entry_validate_func = - gxv_mort_subtable_type5_entry_validate; - - gxv_StateTable_validate( p, limit, gxvalid ); - - GXV_EXIT; - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmorx.c b/3party/freetype/src/gxvalid/gxvmorx.c deleted file mode 100644 index 1c6b3f2973..0000000000 --- a/3party/freetype/src/gxvalid/gxvmorx.c +++ /dev/null @@ -1,199 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmorx.c */ -/* */ -/* TrueTypeGX/AAT morx table validation (body). */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvmorx.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvmorx - - - static void - gxv_morx_subtables_validate( FT_Bytes table, - FT_Bytes limit, - FT_UShort nSubtables, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - GXV_Validate_Func fmt_funcs_table[] = - { - gxv_morx_subtable_type0_validate, /* 0 */ - gxv_morx_subtable_type1_validate, /* 1 */ - gxv_morx_subtable_type2_validate, /* 2 */ - NULL, /* 3 */ - gxv_morx_subtable_type4_validate, /* 4 */ - gxv_morx_subtable_type5_validate, /* 5 */ - - }; - - FT_UShort i; - - - GXV_NAME_ENTER( "subtables in a chain" ); - - for ( i = 0; i < nSubtables; i++ ) - { - GXV_Validate_Func func; - - FT_ULong length; - FT_ULong coverage; -#ifdef GXV_LOAD_UNUSED_VARS - FT_ULong subFeatureFlags; -#endif - FT_ULong type; - FT_ULong rest; - - - GXV_LIMIT_CHECK( 4 + 4 + 4 ); - length = FT_NEXT_ULONG( p ); - coverage = FT_NEXT_ULONG( p ); -#ifdef GXV_LOAD_UNUSED_VARS - subFeatureFlags = FT_NEXT_ULONG( p ); -#else - p += 4; -#endif - - GXV_TRACE(( "validating chain subtable %d/%d (%d bytes)\n", - i + 1, nSubtables, length )); - - type = coverage & 0x0007; - rest = length - ( 4 + 4 + 4 ); - GXV_LIMIT_CHECK( rest ); - - /* morx coverage consists of mort_coverage & 16bit padding */ - gxv_mort_coverage_validate( (FT_UShort)( ( coverage >> 16 ) | coverage ), - gxvalid ); - if ( type > 5 ) - FT_INVALID_FORMAT; - - func = fmt_funcs_table[type]; - if ( func == NULL ) - GXV_TRACE(( "morx type %d is reserved\n", type )); - - func( p, p + rest, gxvalid ); - - /* TODO: subFeatureFlags should be unique in a table? */ - p += rest; - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - - GXV_EXIT; - } - - - static void - gxv_morx_chain_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; -#ifdef GXV_LOAD_UNUSED_VARS - FT_ULong defaultFlags; -#endif - FT_ULong chainLength; - FT_ULong nFeatureFlags; - FT_ULong nSubtables; - - - GXV_NAME_ENTER( "morx chain header" ); - - GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 ); -#ifdef GXV_LOAD_UNUSED_VARS - defaultFlags = FT_NEXT_ULONG( p ); -#else - p += 4; -#endif - chainLength = FT_NEXT_ULONG( p ); - nFeatureFlags = FT_NEXT_ULONG( p ); - nSubtables = FT_NEXT_ULONG( p ); - - /* feature-array of morx is same with that of mort */ - gxv_mort_featurearray_validate( p, limit, nFeatureFlags, gxvalid ); - p += gxvalid->subtable_length; - - if ( nSubtables >= 0x10000L ) - FT_INVALID_DATA; - - gxv_morx_subtables_validate( p, table + chainLength, - (FT_UShort)nSubtables, gxvalid ); - - gxvalid->subtable_length = chainLength; - - /* TODO: defaultFlags should be compared with the flags in tables */ - - GXV_EXIT; - } - - - FT_LOCAL_DEF( void ) - gxv_morx_validate( FT_Bytes table, - FT_Face face, - FT_Validator ftvalid ) - { - GXV_ValidatorRec gxvalidrec; - GXV_Validator gxvalid = &gxvalidrec; - FT_Bytes p = table; - FT_Bytes limit = 0; - FT_ULong version; - FT_ULong nChains; - FT_ULong i; - - - gxvalid->root = ftvalid; - gxvalid->face = face; - - FT_TRACE3(( "validating `morx' table\n" )); - GXV_INIT; - - GXV_LIMIT_CHECK( 4 + 4 ); - version = FT_NEXT_ULONG( p ); - nChains = FT_NEXT_ULONG( p ); - - if ( version != 0x00020000UL ) - FT_INVALID_FORMAT; - - for ( i = 0; i < nChains; i++ ) - { - GXV_TRACE(( "validating chain %d/%d\n", i + 1, nChains )); - GXV_32BIT_ALIGNMENT_VALIDATE( p - table ); - gxv_morx_chain_validate( p, limit, gxvalid ); - p += gxvalid->subtable_length; - } - - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmorx.h b/3party/freetype/src/gxvalid/gxvmorx.h deleted file mode 100644 index 60efdfd0ce..0000000000 --- a/3party/freetype/src/gxvalid/gxvmorx.h +++ /dev/null @@ -1,68 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmorx.h */ -/* */ -/* TrueTypeGX/AAT common definition for morx table (specification). */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#ifndef __GXVMORX_H__ -#define __GXVMORX_H__ - - -#include "gxvalid.h" -#include "gxvcommn.h" -#include "gxvmort.h" - -#include FT_SFNT_NAMES_H - - - FT_LOCAL( void ) - gxv_morx_subtable_type0_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_morx_subtable_type1_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_morx_subtable_type2_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_morx_subtable_type4_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - FT_LOCAL( void ) - gxv_morx_subtable_type5_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ); - - -#endif /* __GXVMORX_H__ */ - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmorx0.c b/3party/freetype/src/gxvalid/gxvmorx0.c deleted file mode 100644 index e340baa5e4..0000000000 --- a/3party/freetype/src/gxvalid/gxvmorx0.c +++ /dev/null @@ -1,112 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmorx0.c */ -/* */ -/* TrueTypeGX/AAT morx table validation */ -/* body for type0 (Indic Script Rearrangement) subtable. */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvmorx.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvmorx - - - static void - gxv_morx_subtable_type0_entry_validate( - FT_UShort state, - FT_UShort flags, - GXV_XStateTable_GlyphOffsetCPtr glyphOffset_p, - FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { -#ifdef GXV_LOAD_UNUSED_VARS - FT_UShort markFirst; - FT_UShort dontAdvance; - FT_UShort markLast; -#endif - FT_UShort reserved; -#ifdef GXV_LOAD_UNUSED_VARS - FT_UShort verb; -#endif - - FT_UNUSED( state ); - FT_UNUSED( glyphOffset_p ); - FT_UNUSED( table ); - FT_UNUSED( limit ); - - -#ifdef GXV_LOAD_UNUSED_VARS - markFirst = (FT_UShort)( ( flags >> 15 ) & 1 ); - dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); - markLast = (FT_UShort)( ( flags >> 13 ) & 1 ); -#endif - - reserved = (FT_UShort)( flags & 0x1FF0 ); -#ifdef GXV_LOAD_UNUSED_VARS - verb = (FT_UShort)( flags & 0x000F ); -#endif - - if ( 0 < reserved ) - { - GXV_TRACE(( " non-zero bits found in reserved range\n" )); - FT_INVALID_DATA; - } - } - - - FT_LOCAL_DEF( void ) - gxv_morx_subtable_type0_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - - GXV_NAME_ENTER( - "morx chain subtable type0 (Indic-Script Rearrangement)" ); - - GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE ); - - gxvalid->xstatetable.optdata = NULL; - gxvalid->xstatetable.optdata_load_func = NULL; - gxvalid->xstatetable.subtable_setup_func = NULL; - gxvalid->xstatetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE; - gxvalid->xstatetable.entry_validate_func = - gxv_morx_subtable_type0_entry_validate; - - gxv_XStateTable_validate( p, limit, gxvalid ); - - GXV_EXIT; - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmorx1.c b/3party/freetype/src/gxvalid/gxvmorx1.c deleted file mode 100644 index 7ba290914d..0000000000 --- a/3party/freetype/src/gxvalid/gxvmorx1.c +++ /dev/null @@ -1,278 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmorx1.c */ -/* */ -/* TrueTypeGX/AAT morx table validation */ -/* body for type1 (Contextual Substitution) subtable. */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvmorx.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvmorx - - - typedef struct GXV_morx_subtable_type1_StateOptRec_ - { - FT_ULong substitutionTable; - FT_ULong substitutionTable_length; - FT_UShort substitutionTable_num_lookupTables; - - } GXV_morx_subtable_type1_StateOptRec, - *GXV_morx_subtable_type1_StateOptRecData; - - -#define GXV_MORX_SUBTABLE_TYPE1_HEADER_SIZE \ - ( GXV_STATETABLE_HEADER_SIZE + 2 ) - - - static void - gxv_morx_subtable_type1_substitutionTable_load( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - GXV_morx_subtable_type1_StateOptRecData optdata = - (GXV_morx_subtable_type1_StateOptRecData)gxvalid->xstatetable.optdata; - - - GXV_LIMIT_CHECK( 2 ); - optdata->substitutionTable = FT_NEXT_USHORT( p ); - } - - - static void - gxv_morx_subtable_type1_subtable_setup( FT_ULong table_size, - FT_ULong classTable, - FT_ULong stateArray, - FT_ULong entryTable, - FT_ULong* classTable_length_p, - FT_ULong* stateArray_length_p, - FT_ULong* entryTable_length_p, - GXV_Validator gxvalid ) - { - FT_ULong o[4]; - FT_ULong *l[4]; - FT_ULong buff[5]; - - GXV_morx_subtable_type1_StateOptRecData optdata = - (GXV_morx_subtable_type1_StateOptRecData)gxvalid->xstatetable.optdata; - - - o[0] = classTable; - o[1] = stateArray; - o[2] = entryTable; - o[3] = optdata->substitutionTable; - l[0] = classTable_length_p; - l[1] = stateArray_length_p; - l[2] = entryTable_length_p; - l[3] = &(optdata->substitutionTable_length); - - gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, gxvalid ); - } - - - static void - gxv_morx_subtable_type1_entry_validate( - FT_UShort state, - FT_UShort flags, - GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, - FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { -#ifdef GXV_LOAD_TRACE_VARS - FT_UShort setMark; - FT_UShort dontAdvance; -#endif - FT_UShort reserved; - FT_Short markIndex; - FT_Short currentIndex; - - GXV_morx_subtable_type1_StateOptRecData optdata = - (GXV_morx_subtable_type1_StateOptRecData)gxvalid->xstatetable.optdata; - - FT_UNUSED( state ); - FT_UNUSED( table ); - FT_UNUSED( limit ); - - -#ifdef GXV_LOAD_TRACE_VARS - setMark = (FT_UShort)( ( flags >> 15 ) & 1 ); - dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); -#endif - - reserved = (FT_UShort)( flags & 0x3FFF ); - - markIndex = (FT_Short)( glyphOffset_p->ul >> 16 ); - currentIndex = (FT_Short)( glyphOffset_p->ul ); - - GXV_TRACE(( " setMark=%01d dontAdvance=%01d\n", - setMark, dontAdvance )); - - if ( 0 < reserved ) - { - GXV_TRACE(( " non-zero bits found in reserved range\n" )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); - } - - GXV_TRACE(( "markIndex = %d, currentIndex = %d\n", - markIndex, currentIndex )); - - if ( optdata->substitutionTable_num_lookupTables < markIndex + 1 ) - optdata->substitutionTable_num_lookupTables = - (FT_UShort)( markIndex + 1 ); - - if ( optdata->substitutionTable_num_lookupTables < currentIndex + 1 ) - optdata->substitutionTable_num_lookupTables = - (FT_UShort)( currentIndex + 1 ); - } - - - static void - gxv_morx_subtable_type1_LookupValue_validate( FT_UShort glyph, - GXV_LookupValueCPtr value_p, - GXV_Validator gxvalid ) - { - FT_UNUSED( glyph ); /* for the non-debugging case */ - - GXV_TRACE(( "morx subtable type1 subst.: %d -> %d\n", glyph, value_p->u )); - - if ( value_p->u > gxvalid->face->num_glyphs ) - FT_INVALID_GLYPH_ID; - } - - - static GXV_LookupValueDesc - gxv_morx_subtable_type1_LookupFmt4_transit( - FT_UShort relative_gindex, - GXV_LookupValueCPtr base_value_p, - FT_Bytes lookuptbl_limit, - GXV_Validator gxvalid ) - { - FT_Bytes p; - FT_Bytes limit; - FT_UShort offset; - GXV_LookupValueDesc value; - - /* XXX: check range? */ - offset = (FT_UShort)( base_value_p->u + - relative_gindex * sizeof ( FT_UShort ) ); - - p = gxvalid->lookuptbl_head + offset; - limit = lookuptbl_limit; - - GXV_LIMIT_CHECK ( 2 ); - value.u = FT_NEXT_USHORT( p ); - - return value; - } - - - /* - * TODO: length should be limit? - **/ - static void - gxv_morx_subtable_type1_substitutionTable_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort i; - - GXV_morx_subtable_type1_StateOptRecData optdata = - (GXV_morx_subtable_type1_StateOptRecData)gxvalid->xstatetable.optdata; - - - /* TODO: calculate offset/length for each lookupTables */ - gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; - gxvalid->lookupval_func = gxv_morx_subtable_type1_LookupValue_validate; - gxvalid->lookupfmt4_trans = gxv_morx_subtable_type1_LookupFmt4_transit; - - for ( i = 0; i < optdata->substitutionTable_num_lookupTables; i++ ) - { - FT_ULong offset; - - - GXV_LIMIT_CHECK( 4 ); - offset = FT_NEXT_ULONG( p ); - - gxv_LookupTable_validate( table + offset, limit, gxvalid ); - } - - /* TODO: overlapping of lookupTables in substitutionTable */ - } - - - /* - * subtable for Contextual glyph substitution is a modified StateTable. - * In addition to classTable, stateArray, entryTable, the field - * `substitutionTable' is added. - */ - FT_LOCAL_DEF( void ) - gxv_morx_subtable_type1_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - GXV_morx_subtable_type1_StateOptRec st_rec; - - - GXV_NAME_ENTER( "morx chain subtable type1 (Contextual Glyph Subst)" ); - - GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE1_HEADER_SIZE ); - - st_rec.substitutionTable_num_lookupTables = 0; - - gxvalid->xstatetable.optdata = - &st_rec; - gxvalid->xstatetable.optdata_load_func = - gxv_morx_subtable_type1_substitutionTable_load; - gxvalid->xstatetable.subtable_setup_func = - gxv_morx_subtable_type1_subtable_setup; - gxvalid->xstatetable.entry_glyphoffset_fmt = - GXV_GLYPHOFFSET_ULONG; - gxvalid->xstatetable.entry_validate_func = - gxv_morx_subtable_type1_entry_validate; - - gxv_XStateTable_validate( p, limit, gxvalid ); - - gxv_morx_subtable_type1_substitutionTable_validate( - table + st_rec.substitutionTable, - table + st_rec.substitutionTable + st_rec.substitutionTable_length, - gxvalid ); - - GXV_EXIT; - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmorx2.c b/3party/freetype/src/gxvalid/gxvmorx2.c deleted file mode 100644 index 51e305580f..0000000000 --- a/3party/freetype/src/gxvalid/gxvmorx2.c +++ /dev/null @@ -1,331 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmorx2.c */ -/* */ -/* TrueTypeGX/AAT morx table validation */ -/* body for type2 (Ligature Substitution) subtable. */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvmorx.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvmorx - - - typedef struct GXV_morx_subtable_type2_StateOptRec_ - { - FT_ULong ligActionTable; - FT_ULong componentTable; - FT_ULong ligatureTable; - FT_ULong ligActionTable_length; - FT_ULong componentTable_length; - FT_ULong ligatureTable_length; - - } GXV_morx_subtable_type2_StateOptRec, - *GXV_morx_subtable_type2_StateOptRecData; - - -#define GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE \ - ( GXV_XSTATETABLE_HEADER_SIZE + 4 + 4 + 4 ) - - - static void - gxv_morx_subtable_type2_opttable_load( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - GXV_morx_subtable_type2_StateOptRecData optdata = - (GXV_morx_subtable_type2_StateOptRecData)gxvalid->xstatetable.optdata; - - - GXV_LIMIT_CHECK( 4 + 4 + 4 ); - optdata->ligActionTable = FT_NEXT_ULONG( p ); - optdata->componentTable = FT_NEXT_ULONG( p ); - optdata->ligatureTable = FT_NEXT_ULONG( p ); - - GXV_TRACE(( "offset to ligActionTable=0x%08x\n", - optdata->ligActionTable )); - GXV_TRACE(( "offset to componentTable=0x%08x\n", - optdata->componentTable )); - GXV_TRACE(( "offset to ligatureTable=0x%08x\n", - optdata->ligatureTable )); - } - - - static void - gxv_morx_subtable_type2_subtable_setup( FT_ULong table_size, - FT_ULong classTable, - FT_ULong stateArray, - FT_ULong entryTable, - FT_ULong* classTable_length_p, - FT_ULong* stateArray_length_p, - FT_ULong* entryTable_length_p, - GXV_Validator gxvalid ) - { - FT_ULong o[6]; - FT_ULong* l[6]; - FT_ULong buff[7]; - - GXV_morx_subtable_type2_StateOptRecData optdata = - (GXV_morx_subtable_type2_StateOptRecData)gxvalid->xstatetable.optdata; - - - GXV_NAME_ENTER( "subtable boundaries setup" ); - - o[0] = classTable; - o[1] = stateArray; - o[2] = entryTable; - o[3] = optdata->ligActionTable; - o[4] = optdata->componentTable; - o[5] = optdata->ligatureTable; - l[0] = classTable_length_p; - l[1] = stateArray_length_p; - l[2] = entryTable_length_p; - l[3] = &(optdata->ligActionTable_length); - l[4] = &(optdata->componentTable_length); - l[5] = &(optdata->ligatureTable_length); - - gxv_set_length_by_ulong_offset( o, l, buff, 6, table_size, gxvalid ); - - GXV_TRACE(( "classTable: offset=0x%08x length=0x%08x\n", - classTable, *classTable_length_p )); - GXV_TRACE(( "stateArray: offset=0x%08x length=0x%08x\n", - stateArray, *stateArray_length_p )); - GXV_TRACE(( "entryTable: offset=0x%08x length=0x%08x\n", - entryTable, *entryTable_length_p )); - GXV_TRACE(( "ligActionTable: offset=0x%08x length=0x%08x\n", - optdata->ligActionTable, - optdata->ligActionTable_length )); - GXV_TRACE(( "componentTable: offset=0x%08x length=0x%08x\n", - optdata->componentTable, - optdata->componentTable_length )); - GXV_TRACE(( "ligatureTable: offset=0x%08x length=0x%08x\n", - optdata->ligatureTable, - optdata->ligatureTable_length )); - - GXV_EXIT; - } - - -#define GXV_MORX_LIGACTION_ENTRY_SIZE 4 - - - static void - gxv_morx_subtable_type2_ligActionIndex_validate( - FT_Bytes table, - FT_UShort ligActionIndex, - GXV_Validator gxvalid ) - { - /* access ligActionTable */ - GXV_morx_subtable_type2_StateOptRecData optdata = - (GXV_morx_subtable_type2_StateOptRecData)gxvalid->xstatetable.optdata; - - FT_Bytes lat_base = table + optdata->ligActionTable; - FT_Bytes p = lat_base + - ligActionIndex * GXV_MORX_LIGACTION_ENTRY_SIZE; - FT_Bytes lat_limit = lat_base + optdata->ligActionTable; - - - if ( p < lat_base ) - { - GXV_TRACE(( "p < lat_base (%d byte rewind)\n", lat_base - p )); - FT_INVALID_OFFSET; - } - else if ( lat_limit < p ) - { - GXV_TRACE(( "lat_limit < p (%d byte overrun)\n", p - lat_limit )); - FT_INVALID_OFFSET; - } - - { - /* validate entry in ligActionTable */ - FT_ULong lig_action; -#ifdef GXV_LOAD_UNUSED_VARS - FT_UShort last; - FT_UShort store; -#endif - FT_ULong offset; - FT_Long gid_limit; - - - lig_action = FT_NEXT_ULONG( p ); -#ifdef GXV_LOAD_UNUSED_VARS - last = (FT_UShort)( ( lig_action >> 31 ) & 1 ); - store = (FT_UShort)( ( lig_action >> 30 ) & 1 ); -#endif - - offset = lig_action & 0x3FFFFFFFUL; - - /* this offset is 30-bit signed value to add to GID */ - /* it is different from the location offset in mort */ - if ( ( offset & 0x3FFF0000UL ) == 0x3FFF0000UL ) - { /* negative offset */ - gid_limit = gxvalid->face->num_glyphs - - (FT_Long)( offset & 0x0000FFFFUL ); - if ( gid_limit > 0 ) - return; - - GXV_TRACE(( "ligature action table includes" - " too negative offset moving all GID" - " below defined range: 0x%04x\n", - offset & 0xFFFFU )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); - } - else if ( ( offset & 0x3FFF0000UL ) == 0x00000000UL ) - { /* positive offset */ - if ( (FT_Long)offset < gxvalid->face->num_glyphs ) - return; - - GXV_TRACE(( "ligature action table includes" - " too large offset moving all GID" - " over defined range: 0x%04x\n", - offset & 0xFFFFU )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); - } - - GXV_TRACE(( "ligature action table includes" - " invalid offset to add to 16-bit GID:" - " 0x%08x\n", offset )); - GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); - } - } - - - static void - gxv_morx_subtable_type2_entry_validate( - FT_UShort state, - FT_UShort flags, - GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, - FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { -#ifdef GXV_LOAD_UNUSED_VARS - FT_UShort setComponent; - FT_UShort dontAdvance; - FT_UShort performAction; -#endif - FT_UShort reserved; - FT_UShort ligActionIndex; - - FT_UNUSED( state ); - FT_UNUSED( limit ); - - -#ifdef GXV_LOAD_UNUSED_VARS - setComponent = (FT_UShort)( ( flags >> 15 ) & 1 ); - dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); - performAction = (FT_UShort)( ( flags >> 13 ) & 1 ); -#endif - - reserved = (FT_UShort)( flags & 0x1FFF ); - ligActionIndex = glyphOffset_p->u; - - if ( reserved > 0 ) - GXV_TRACE(( " reserved 14bit is non-zero\n" )); - - if ( 0 < ligActionIndex ) - gxv_morx_subtable_type2_ligActionIndex_validate( - table, ligActionIndex, gxvalid ); - } - - - static void - gxv_morx_subtable_type2_ligatureTable_validate( FT_Bytes table, - GXV_Validator gxvalid ) - { - GXV_morx_subtable_type2_StateOptRecData optdata = - (GXV_morx_subtable_type2_StateOptRecData)gxvalid->xstatetable.optdata; - - FT_Bytes p = table + optdata->ligatureTable; - FT_Bytes limit = table + optdata->ligatureTable - + optdata->ligatureTable_length; - - - GXV_NAME_ENTER( "morx chain subtable type2 - substitutionTable" ); - - if ( 0 != optdata->ligatureTable ) - { - /* Apple does not give specification of ligatureTable format */ - while ( p < limit ) - { - FT_UShort lig_gid; - - - GXV_LIMIT_CHECK( 2 ); - lig_gid = FT_NEXT_USHORT( p ); - if ( lig_gid < gxvalid->face->num_glyphs ) - GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); - } - } - - GXV_EXIT; - } - - - FT_LOCAL_DEF( void ) - gxv_morx_subtable_type2_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - GXV_morx_subtable_type2_StateOptRec lig_rec; - - - GXV_NAME_ENTER( "morx chain subtable type2 (Ligature Substitution)" ); - - GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE ); - - gxvalid->xstatetable.optdata = - &lig_rec; - gxvalid->xstatetable.optdata_load_func = - gxv_morx_subtable_type2_opttable_load; - gxvalid->xstatetable.subtable_setup_func = - gxv_morx_subtable_type2_subtable_setup; - gxvalid->xstatetable.entry_glyphoffset_fmt = - GXV_GLYPHOFFSET_USHORT; - gxvalid->xstatetable.entry_validate_func = - gxv_morx_subtable_type2_entry_validate; - - gxv_XStateTable_validate( p, limit, gxvalid ); - -#if 0 - p += gxvalid->subtable_length; -#endif - gxv_morx_subtable_type2_ligatureTable_validate( table, gxvalid ); - - GXV_EXIT; - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmorx4.c b/3party/freetype/src/gxvalid/gxvmorx4.c deleted file mode 100644 index c42677d45b..0000000000 --- a/3party/freetype/src/gxvalid/gxvmorx4.c +++ /dev/null @@ -1,56 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmorx4.c */ -/* */ -/* TrueTypeGX/AAT morx table validation */ -/* body for "morx" type4 (Non-Contextual Glyph Substitution) subtable. */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvmorx.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvmorx - - - FT_LOCAL_DEF( void ) - gxv_morx_subtable_type4_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - GXV_NAME_ENTER( "morx chain subtable type4 " - "(Non-Contextual Glyph Substitution)" ); - - gxv_mort_subtable_type4_validate( table, limit, gxvalid ); - - GXV_EXIT; - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvmorx5.c b/3party/freetype/src/gxvalid/gxvmorx5.c deleted file mode 100644 index 7ac872f9d7..0000000000 --- a/3party/freetype/src/gxvalid/gxvmorx5.c +++ /dev/null @@ -1,226 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvmorx5.c */ -/* */ -/* TrueTypeGX/AAT morx table validation */ -/* body for type5 (Contextual Glyph Insertion) subtable. */ -/* */ -/* Copyright 2005-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvmorx.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvmorx - - - /* - * `morx' subtable type5 (Contextual Glyph Insertion) - * has format of a StateTable with insertion-glyph-list - * without name. However, the 32bit offset from the head - * of subtable to the i-g-l is given after `entryTable', - * without variable name specification (the existence of - * this offset to the table is different from mort type5). - */ - - - typedef struct GXV_morx_subtable_type5_StateOptRec_ - { - FT_ULong insertionGlyphList; - FT_ULong insertionGlyphList_length; - - } GXV_morx_subtable_type5_StateOptRec, - *GXV_morx_subtable_type5_StateOptRecData; - - -#define GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE \ - ( GXV_STATETABLE_HEADER_SIZE + 4 ) - - - static void - gxv_morx_subtable_type5_insertionGlyphList_load( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - GXV_morx_subtable_type5_StateOptRecData optdata = - (GXV_morx_subtable_type5_StateOptRecData)gxvalid->xstatetable.optdata; - - - GXV_LIMIT_CHECK( 4 ); - optdata->insertionGlyphList = FT_NEXT_ULONG( p ); - } - - - static void - gxv_morx_subtable_type5_subtable_setup( FT_ULong table_size, - FT_ULong classTable, - FT_ULong stateArray, - FT_ULong entryTable, - FT_ULong* classTable_length_p, - FT_ULong* stateArray_length_p, - FT_ULong* entryTable_length_p, - GXV_Validator gxvalid ) - { - FT_ULong o[4]; - FT_ULong* l[4]; - FT_ULong buff[5]; - - GXV_morx_subtable_type5_StateOptRecData optdata = - (GXV_morx_subtable_type5_StateOptRecData)gxvalid->xstatetable.optdata; - - - o[0] = classTable; - o[1] = stateArray; - o[2] = entryTable; - o[3] = optdata->insertionGlyphList; - l[0] = classTable_length_p; - l[1] = stateArray_length_p; - l[2] = entryTable_length_p; - l[3] = &(optdata->insertionGlyphList_length); - - gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, gxvalid ); - } - - - static void - gxv_morx_subtable_type5_InsertList_validate( FT_UShort table_index, - FT_UShort count, - FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table + table_index * 2; - - -#ifndef GXV_LOAD_TRACE_VARS - GXV_LIMIT_CHECK( count * 2 ); -#else - while ( p < table + count * 2 + table_index * 2 ) - { - FT_UShort insert_glyphID; - - - GXV_LIMIT_CHECK( 2 ); - insert_glyphID = FT_NEXT_USHORT( p ); - GXV_TRACE(( " 0x%04x", insert_glyphID )); - } - - GXV_TRACE(( "\n" )); -#endif - } - - - static void - gxv_morx_subtable_type5_entry_validate( - FT_UShort state, - FT_UShort flags, - GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, - FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { -#ifdef GXV_LOAD_UNUSED_VARS - FT_Bool setMark; - FT_Bool dontAdvance; - FT_Bool currentIsKashidaLike; - FT_Bool markedIsKashidaLike; - FT_Bool currentInsertBefore; - FT_Bool markedInsertBefore; -#endif - FT_Byte currentInsertCount; - FT_Byte markedInsertCount; - FT_Byte currentInsertList; - FT_UShort markedInsertList; - - FT_UNUSED( state ); - - -#ifdef GXV_LOAD_UNUSED_VARS - setMark = FT_BOOL( ( flags >> 15 ) & 1 ); - dontAdvance = FT_BOOL( ( flags >> 14 ) & 1 ); - currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 ); - markedIsKashidaLike = FT_BOOL( ( flags >> 12 ) & 1 ); - currentInsertBefore = FT_BOOL( ( flags >> 11 ) & 1 ); - markedInsertBefore = FT_BOOL( ( flags >> 10 ) & 1 ); -#endif - - currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F ); - markedInsertCount = (FT_Byte)( flags & 0x001F ); - - currentInsertList = (FT_Byte) ( glyphOffset_p->ul >> 16 ); - markedInsertList = (FT_UShort)( glyphOffset_p->ul ); - - if ( currentInsertList && 0 != currentInsertCount ) - gxv_morx_subtable_type5_InsertList_validate( currentInsertList, - currentInsertCount, - table, limit, - gxvalid ); - - if ( markedInsertList && 0 != markedInsertCount ) - gxv_morx_subtable_type5_InsertList_validate( markedInsertList, - markedInsertCount, - table, limit, - gxvalid ); - } - - - FT_LOCAL_DEF( void ) - gxv_morx_subtable_type5_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - GXV_morx_subtable_type5_StateOptRec et_rec; - GXV_morx_subtable_type5_StateOptRecData et = &et_rec; - - - GXV_NAME_ENTER( "morx chain subtable type5 (Glyph Insertion)" ); - - GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE ); - - gxvalid->xstatetable.optdata = - et; - gxvalid->xstatetable.optdata_load_func = - gxv_morx_subtable_type5_insertionGlyphList_load; - gxvalid->xstatetable.subtable_setup_func = - gxv_morx_subtable_type5_subtable_setup; - gxvalid->xstatetable.entry_glyphoffset_fmt = - GXV_GLYPHOFFSET_ULONG; - gxvalid->xstatetable.entry_validate_func = - gxv_morx_subtable_type5_entry_validate; - - gxv_XStateTable_validate( p, limit, gxvalid ); - - GXV_EXIT; - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvopbd.c b/3party/freetype/src/gxvalid/gxvopbd.c deleted file mode 100644 index 7cd5163b17..0000000000 --- a/3party/freetype/src/gxvalid/gxvopbd.c +++ /dev/null @@ -1,218 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvopbd.c */ -/* */ -/* TrueTypeGX/AAT opbd table validation (body). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvalid.h" -#include "gxvcommn.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvopbd - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Data and Types *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct GXV_opbd_DataRec_ - { - FT_UShort format; - FT_UShort valueOffset_min; - - } GXV_opbd_DataRec, *GXV_opbd_Data; - - -#define GXV_OPBD_DATA( FIELD ) GXV_TABLE_DATA( opbd, FIELD ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** UTILITY FUNCTIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - gxv_opbd_LookupValue_validate( FT_UShort glyph, - GXV_LookupValueCPtr value_p, - GXV_Validator gxvalid ) - { - /* offset in LookupTable is measured from the head of opbd table */ - FT_Bytes p = gxvalid->root->base + value_p->u; - FT_Bytes limit = gxvalid->root->limit; - FT_Short delta_value; - int i; - - - if ( value_p->u < GXV_OPBD_DATA( valueOffset_min ) ) - GXV_OPBD_DATA( valueOffset_min ) = value_p->u; - - for ( i = 0; i < 4; i++ ) - { - GXV_LIMIT_CHECK( 2 ); - delta_value = FT_NEXT_SHORT( p ); - - if ( GXV_OPBD_DATA( format ) ) /* format 1, value is ctrl pt. */ - { - if ( delta_value == -1 ) - continue; - - gxv_ctlPoint_validate( glyph, (FT_UShort)delta_value, gxvalid ); - } - else /* format 0, value is distance */ - continue; - } - } - - - /* - opbd ---------------------+ - | - +===============+ | - | lookup header | | - +===============+ | - | BinSrchHeader | | - +===============+ | - | lastGlyph[0] | | - +---------------+ | - | firstGlyph[0] | | head of opbd sfnt table - +---------------+ | + - | offset[0] | -> | offset [byte] - +===============+ | + - | lastGlyph[1] | | (glyphID - firstGlyph) * 4 * sizeof(FT_Short) [byte] - +---------------+ | - | firstGlyph[1] | | - +---------------+ | - | offset[1] | | - +===============+ | - | - .... | - | - 48bit value array | - +===============+ | - | value | <-------+ - | | - | | - | | - +---------------+ - .... */ - - static GXV_LookupValueDesc - gxv_opbd_LookupFmt4_transit( FT_UShort relative_gindex, - GXV_LookupValueCPtr base_value_p, - FT_Bytes lookuptbl_limit, - GXV_Validator gxvalid ) - { - GXV_LookupValueDesc value; - - FT_UNUSED( lookuptbl_limit ); - FT_UNUSED( gxvalid ); - - /* XXX: check range? */ - value.u = (FT_UShort)( base_value_p->u + - relative_gindex * 4 * sizeof ( FT_Short ) ); - - return value; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** opbd TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - gxv_opbd_validate( FT_Bytes table, - FT_Face face, - FT_Validator ftvalid ) - { - GXV_ValidatorRec gxvalidrec; - GXV_Validator gxvalid = &gxvalidrec; - GXV_opbd_DataRec opbdrec; - GXV_opbd_Data opbd = &opbdrec; - FT_Bytes p = table; - FT_Bytes limit = 0; - - FT_ULong version; - - - gxvalid->root = ftvalid; - gxvalid->table_data = opbd; - gxvalid->face = face; - - FT_TRACE3(( "validating `opbd' table\n" )); - GXV_INIT; - GXV_OPBD_DATA( valueOffset_min ) = 0xFFFFU; - - - GXV_LIMIT_CHECK( 4 + 2 ); - version = FT_NEXT_ULONG( p ); - GXV_OPBD_DATA( format ) = FT_NEXT_USHORT( p ); - - - /* only 0x00010000 is defined (1996) */ - GXV_TRACE(( "(version=0x%08x)\n", version )); - if ( 0x00010000UL != version ) - FT_INVALID_FORMAT; - - /* only values 0 and 1 are defined (1996) */ - GXV_TRACE(( "(format=0x%04x)\n", GXV_OPBD_DATA( format ) )); - if ( 0x0001 < GXV_OPBD_DATA( format ) ) - FT_INVALID_FORMAT; - - gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; - gxvalid->lookupval_func = gxv_opbd_LookupValue_validate; - gxvalid->lookupfmt4_trans = gxv_opbd_LookupFmt4_transit; - - gxv_LookupTable_validate( p, limit, gxvalid ); - p += gxvalid->subtable_length; - - if ( p > table + GXV_OPBD_DATA( valueOffset_min ) ) - { - GXV_TRACE(( - "found overlap between LookupTable and opbd_value array\n" )); - FT_INVALID_OFFSET; - } - - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvprop.c b/3party/freetype/src/gxvalid/gxvprop.c deleted file mode 100644 index ecc3c94d2c..0000000000 --- a/3party/freetype/src/gxvalid/gxvprop.c +++ /dev/null @@ -1,330 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvprop.c */ -/* */ -/* TrueTypeGX/AAT prop table validation (body). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvalid.h" -#include "gxvcommn.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvprop - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Data and Types *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define GXV_PROP_HEADER_SIZE ( 4 + 2 + 2 ) -#define GXV_PROP_SIZE_MIN GXV_PROP_HEADER_SIZE - - typedef struct GXV_prop_DataRec_ - { - FT_Fixed version; - - } GXV_prop_DataRec, *GXV_prop_Data; - -#define GXV_PROP_DATA( field ) GXV_TABLE_DATA( prop, field ) - -#define GXV_PROP_FLOATER 0x8000U -#define GXV_PROP_USE_COMPLEMENTARY_BRACKET 0x1000U -#define GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET 0x0F00U -#define GXV_PROP_ATTACHING_TO_RIGHT 0x0080U -#define GXV_PROP_RESERVED 0x0060U -#define GXV_PROP_DIRECTIONALITY_CLASS 0x001FU - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** UTILITY FUNCTIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - gxv_prop_zero_advance_validate( FT_UShort gid, - GXV_Validator gxvalid ) - { - FT_Face face; - FT_Error error; - FT_GlyphSlot glyph; - - - GXV_NAME_ENTER( "zero advance" ); - - face = gxvalid->face; - - error = FT_Load_Glyph( face, - gid, - FT_LOAD_IGNORE_TRANSFORM ); - if ( error ) - FT_INVALID_GLYPH_ID; - - glyph = face->glyph; - - if ( glyph->advance.x != (FT_Pos)0 || - glyph->advance.y != (FT_Pos)0 ) - { - GXV_TRACE(( " found non-zero advance in zero-advance glyph\n" )); - FT_INVALID_DATA; - } - - GXV_EXIT; - } - - - /* Pass 0 as GLYPH to check the default property */ - static void - gxv_prop_property_validate( FT_UShort property, - FT_UShort glyph, - GXV_Validator gxvalid ) - { - if ( glyph != 0 && ( property & GXV_PROP_FLOATER ) ) - gxv_prop_zero_advance_validate( glyph, gxvalid ); - - if ( property & GXV_PROP_USE_COMPLEMENTARY_BRACKET ) - { - FT_UShort offset; - char complement; - - - offset = (FT_UShort)( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET ); - if ( offset == 0 ) - { - GXV_TRACE(( " found zero offset to property\n" )); - FT_INVALID_OFFSET; - } - - complement = (char)( offset >> 8 ); - if ( complement & 0x08 ) - { - /* Top bit is set: negative */ - - /* Calculate the absolute offset */ - complement = (char)( ( complement & 0x07 ) + 1 ); - - /* The gid for complement must be greater than 0 */ - if ( glyph <= complement ) - { - GXV_TRACE(( " found non-positive glyph complement\n" )); - FT_INVALID_DATA; - } - } - else - { - /* The gid for complement must be the face. */ - gxv_glyphid_validate( (FT_UShort)( glyph + complement ), gxvalid ); - } - } - else - { - if ( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET ) - GXV_TRACE(( "glyph %d cannot have complementary bracketing\n", - glyph )); - } - - /* this is introduced in version 2.0 */ - if ( property & GXV_PROP_ATTACHING_TO_RIGHT ) - { - if ( GXV_PROP_DATA( version ) == 0x00010000UL ) - { - GXV_TRACE(( " found older version (1.0) in new version table\n" )); - FT_INVALID_DATA; - } - } - - if ( property & GXV_PROP_RESERVED ) - { - GXV_TRACE(( " found non-zero bits in reserved bits\n" )); - FT_INVALID_DATA; - } - - if ( ( property & GXV_PROP_DIRECTIONALITY_CLASS ) > 11 ) - { - /* TODO: Too restricted. Use the validation level. */ - if ( GXV_PROP_DATA( version ) == 0x00010000UL || - GXV_PROP_DATA( version ) == 0x00020000UL ) - { - GXV_TRACE(( " found too old version in directionality class\n" )); - FT_INVALID_DATA; - } - } - } - - - static void - gxv_prop_LookupValue_validate( FT_UShort glyph, - GXV_LookupValueCPtr value_p, - GXV_Validator gxvalid ) - { - gxv_prop_property_validate( value_p->u, glyph, gxvalid ); - } - - - /* - +===============+ --------+ - | lookup header | | - +===============+ | - | BinSrchHeader | | - +===============+ | - | lastGlyph[0] | | - +---------------+ | - | firstGlyph[0] | | head of lookup table - +---------------+ | + - | offset[0] | -> | offset [byte] - +===============+ | + - | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] - +---------------+ | - | firstGlyph[1] | | - +---------------+ | - | offset[1] | | - +===============+ | - | - ... | - | - 16bit value array | - +===============+ | - | value | <-------+ - ... - */ - - static GXV_LookupValueDesc - gxv_prop_LookupFmt4_transit( FT_UShort relative_gindex, - GXV_LookupValueCPtr base_value_p, - FT_Bytes lookuptbl_limit, - GXV_Validator gxvalid ) - { - FT_Bytes p; - FT_Bytes limit; - FT_UShort offset; - GXV_LookupValueDesc value; - - /* XXX: check range? */ - offset = (FT_UShort)( base_value_p->u + - relative_gindex * sizeof ( FT_UShort ) ); - p = gxvalid->lookuptbl_head + offset; - limit = lookuptbl_limit; - - GXV_LIMIT_CHECK ( 2 ); - value.u = FT_NEXT_USHORT( p ); - - return value; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** prop TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - gxv_prop_validate( FT_Bytes table, - FT_Face face, - FT_Validator ftvalid ) - { - FT_Bytes p = table; - FT_Bytes limit = 0; - GXV_ValidatorRec gxvalidrec; - GXV_Validator gxvalid = &gxvalidrec; - - GXV_prop_DataRec proprec; - GXV_prop_Data prop = &proprec; - - FT_Fixed version; - FT_UShort format; - FT_UShort defaultProp; - - - gxvalid->root = ftvalid; - gxvalid->table_data = prop; - gxvalid->face = face; - - FT_TRACE3(( "validating `prop' table\n" )); - GXV_INIT; - - GXV_LIMIT_CHECK( 4 + 2 + 2 ); - version = FT_NEXT_LONG( p ); - format = FT_NEXT_USHORT( p ); - defaultProp = FT_NEXT_USHORT( p ); - - GXV_TRACE(( " version 0x%08x\n", version )); - GXV_TRACE(( " format 0x%04x\n", format )); - GXV_TRACE(( " defaultProp 0x%04x\n", defaultProp )); - - /* only versions 1.0, 2.0, 3.0 are defined (1996) */ - if ( version != 0x00010000UL && - version != 0x00020000UL && - version != 0x00030000UL ) - { - GXV_TRACE(( " found unknown version\n" )); - FT_INVALID_FORMAT; - } - - - /* only formats 0x0000, 0x0001 are defined (1996) */ - if ( format > 1 ) - { - GXV_TRACE(( " found unknown format\n" )); - FT_INVALID_FORMAT; - } - - gxv_prop_property_validate( defaultProp, 0, gxvalid ); - - if ( format == 0 ) - { - FT_TRACE3(( "(format 0, no per-glyph properties, " - "remaining %d bytes are skipped)", limit - p )); - goto Exit; - } - - /* format == 1 */ - GXV_PROP_DATA( version ) = version; - - gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; - gxvalid->lookupval_func = gxv_prop_LookupValue_validate; - gxvalid->lookupfmt4_trans = gxv_prop_LookupFmt4_transit; - - gxv_LookupTable_validate( p, limit, gxvalid ); - - Exit: - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/gxvtrak.c b/3party/freetype/src/gxvalid/gxvtrak.c deleted file mode 100644 index c4d29e4dff..0000000000 --- a/3party/freetype/src/gxvalid/gxvtrak.c +++ /dev/null @@ -1,288 +0,0 @@ -/***************************************************************************/ -/* */ -/* gxvtrak.c */ -/* */ -/* TrueTypeGX/AAT trak table validation (body). */ -/* */ -/* Copyright 2004-2015 by */ -/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ -/* 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. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#include "gxvalid.h" -#include "gxvcommn.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_gxvtrak - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Data and Types *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * referred track table format specification: - * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6trak.html - * last update was 1996. - * ---------------------------------------------- - * [MINIMUM HEADER]: GXV_TRAK_SIZE_MIN - * version (fixed: 32bit) = 0x00010000 - * format (uint16: 16bit) = 0 is only defined (1996) - * horizOffset (uint16: 16bit) - * vertOffset (uint16: 16bit) - * reserved (uint16: 16bit) = 0 - * ---------------------------------------------- - * [VARIABLE BODY]: - * horizData - * header ( 2 + 2 + 4 - * trackTable + nTracks * ( 4 + 2 + 2 ) - * sizeTable + nSizes * 4 ) - * ---------------------------------------------- - * vertData - * header ( 2 + 2 + 4 - * trackTable + nTracks * ( 4 + 2 + 2 ) - * sizeTable + nSizes * 4 ) - * ---------------------------------------------- - */ - typedef struct GXV_trak_DataRec_ - { - FT_UShort trackValueOffset_min; - FT_UShort trackValueOffset_max; - - } GXV_trak_DataRec, *GXV_trak_Data; - - -#define GXV_TRAK_DATA( FIELD ) GXV_TABLE_DATA( trak, FIELD ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** UTILITY FUNCTIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - gxv_trak_trackTable_validate( FT_Bytes table, - FT_Bytes limit, - FT_UShort nTracks, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - - FT_Fixed track, t; - FT_UShort nameIndex; - FT_UShort offset; - FT_UShort i, j; - - - GXV_NAME_ENTER( "trackTable" ); - - GXV_TRAK_DATA( trackValueOffset_min ) = 0xFFFFU; - GXV_TRAK_DATA( trackValueOffset_max ) = 0x0000; - - GXV_LIMIT_CHECK( nTracks * ( 4 + 2 + 2 ) ); - - for ( i = 0; i < nTracks; i ++ ) - { - p = table + i * ( 4 + 2 + 2 ); - track = FT_NEXT_LONG( p ); - nameIndex = FT_NEXT_USHORT( p ); - offset = FT_NEXT_USHORT( p ); - - if ( offset < GXV_TRAK_DATA( trackValueOffset_min ) ) - GXV_TRAK_DATA( trackValueOffset_min ) = offset; - if ( offset > GXV_TRAK_DATA( trackValueOffset_max ) ) - GXV_TRAK_DATA( trackValueOffset_max ) = offset; - - gxv_sfntName_validate( nameIndex, 256, 32767, gxvalid ); - - for ( j = i; j < nTracks; j ++ ) - { - p = table + j * ( 4 + 2 + 2 ); - t = FT_NEXT_LONG( p ); - if ( t == track ) - GXV_TRACE(( "duplicated entries found for track value 0x%x\n", - track )); - } - } - - gxvalid->subtable_length = (FT_ULong)( p - table ); - GXV_EXIT; - } - - - static void - gxv_trak_trackData_validate( FT_Bytes table, - FT_Bytes limit, - GXV_Validator gxvalid ) - { - FT_Bytes p = table; - FT_UShort nTracks; - FT_UShort nSizes; - FT_ULong sizeTableOffset; - - GXV_ODTECT( 4, odtect ); - - - GXV_ODTECT_INIT( odtect ); - GXV_NAME_ENTER( "trackData" ); - - /* read the header of trackData */ - GXV_LIMIT_CHECK( 2 + 2 + 4 ); - nTracks = FT_NEXT_USHORT( p ); - nSizes = FT_NEXT_USHORT( p ); - sizeTableOffset = FT_NEXT_ULONG( p ); - - gxv_odtect_add_range( table, (FT_ULong)( p - table ), - "trackData header", odtect ); - - /* validate trackTable */ - gxv_trak_trackTable_validate( p, limit, nTracks, gxvalid ); - gxv_odtect_add_range( p, gxvalid->subtable_length, - "trackTable", odtect ); - - /* sizeTable is array of FT_Fixed, don't check contents */ - p = gxvalid->root->base + sizeTableOffset; - GXV_LIMIT_CHECK( nSizes * 4 ); - gxv_odtect_add_range( p, nSizes * 4, "sizeTable", odtect ); - - /* validate trackValueOffet */ - p = gxvalid->root->base + GXV_TRAK_DATA( trackValueOffset_min ); - if ( limit - p < nTracks * nSizes * 2 ) - GXV_TRACE(( "too short trackValue array\n" )); - - p = gxvalid->root->base + GXV_TRAK_DATA( trackValueOffset_max ); - GXV_LIMIT_CHECK( nSizes * 2 ); - - gxv_odtect_add_range( gxvalid->root->base - + GXV_TRAK_DATA( trackValueOffset_min ), - GXV_TRAK_DATA( trackValueOffset_max ) - - GXV_TRAK_DATA( trackValueOffset_min ) - + nSizes * 2, - "trackValue array", odtect ); - - gxv_odtect_validate( odtect, gxvalid ); - - GXV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** trak TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - gxv_trak_validate( FT_Bytes table, - FT_Face face, - FT_Validator ftvalid ) - { - FT_Bytes p = table; - FT_Bytes limit = 0; - - GXV_ValidatorRec gxvalidrec; - GXV_Validator gxvalid = &gxvalidrec; - GXV_trak_DataRec trakrec; - GXV_trak_Data trak = &trakrec; - - FT_ULong version; - FT_UShort format; - FT_UShort horizOffset; - FT_UShort vertOffset; - FT_UShort reserved; - - - GXV_ODTECT( 3, odtect ); - - GXV_ODTECT_INIT( odtect ); - gxvalid->root = ftvalid; - gxvalid->table_data = trak; - gxvalid->face = face; - - limit = gxvalid->root->limit; - - FT_TRACE3(( "validating `trak' table\n" )); - GXV_INIT; - - GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 + 2 ); - version = FT_NEXT_ULONG( p ); - format = FT_NEXT_USHORT( p ); - horizOffset = FT_NEXT_USHORT( p ); - vertOffset = FT_NEXT_USHORT( p ); - reserved = FT_NEXT_USHORT( p ); - - GXV_TRACE(( " (version = 0x%08x)\n", version )); - GXV_TRACE(( " (format = 0x%04x)\n", format )); - GXV_TRACE(( " (horizOffset = 0x%04x)\n", horizOffset )); - GXV_TRACE(( " (vertOffset = 0x%04x)\n", vertOffset )); - GXV_TRACE(( " (reserved = 0x%04x)\n", reserved )); - - /* Version 1.0 (always:1996) */ - if ( version != 0x00010000UL ) - FT_INVALID_FORMAT; - - /* format 0 (always:1996) */ - if ( format != 0x0000 ) - FT_INVALID_FORMAT; - - GXV_32BIT_ALIGNMENT_VALIDATE( horizOffset ); - GXV_32BIT_ALIGNMENT_VALIDATE( vertOffset ); - - /* Reserved Fixed Value (always) */ - if ( reserved != 0x0000 ) - FT_INVALID_DATA; - - /* validate trackData */ - if ( 0 < horizOffset ) - { - gxv_trak_trackData_validate( table + horizOffset, limit, gxvalid ); - gxv_odtect_add_range( table + horizOffset, gxvalid->subtable_length, - "horizJustData", odtect ); - } - - if ( 0 < vertOffset ) - { - gxv_trak_trackData_validate( table + vertOffset, limit, gxvalid ); - gxv_odtect_add_range( table + vertOffset, gxvalid->subtable_length, - "vertJustData", odtect ); - } - - gxv_odtect_validate( odtect, gxvalid ); - - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/gxvalid/module.mk b/3party/freetype/src/gxvalid/module.mk deleted file mode 100644 index 1d7649478e..0000000000 --- a/3party/freetype/src/gxvalid/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 gxvalid module definition -# - -# Copyright 2004-2015 by -# suzuki toshiya, Masatake YAMATO, Red Hat K.K., -# 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. - - -FTMODULE_H_COMMANDS += GXVALID_MODULE - -define GXVALID_MODULE -$(OPEN_DRIVER) FT_Module_Class, gxv_module_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)gxvalid $(ECHO_DRIVER_DESC)TrueTypeGX/AAT validation module$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/gxvalid/rules.mk b/3party/freetype/src/gxvalid/rules.mk deleted file mode 100644 index 44a2d43250..0000000000 --- a/3party/freetype/src/gxvalid/rules.mk +++ /dev/null @@ -1,98 +0,0 @@ -# -# FreeType 2 TrueTypeGX/AAT validation driver configuration rules -# - - -# Copyright 2004-2015 by -# suzuki toshiya, Masatake YAMATO, Red Hat K.K., -# 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. - - -# GXV driver directory -# -GXV_DIR := $(SRC_DIR)/gxvalid - - -# compilation flags for the driver -# -GXV_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(GXV_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# GXV driver sources (i.e., C files) -# -GXV_DRV_SRC := $(GXV_DIR)/gxvcommn.c \ - $(GXV_DIR)/gxvfeat.c \ - $(GXV_DIR)/gxvbsln.c \ - $(GXV_DIR)/gxvtrak.c \ - $(GXV_DIR)/gxvopbd.c \ - $(GXV_DIR)/gxvprop.c \ - $(GXV_DIR)/gxvjust.c \ - $(GXV_DIR)/gxvmort.c \ - $(GXV_DIR)/gxvmort0.c \ - $(GXV_DIR)/gxvmort1.c \ - $(GXV_DIR)/gxvmort2.c \ - $(GXV_DIR)/gxvmort4.c \ - $(GXV_DIR)/gxvmort5.c \ - $(GXV_DIR)/gxvmorx.c \ - $(GXV_DIR)/gxvmorx0.c \ - $(GXV_DIR)/gxvmorx1.c \ - $(GXV_DIR)/gxvmorx2.c \ - $(GXV_DIR)/gxvmorx4.c \ - $(GXV_DIR)/gxvmorx5.c \ - $(GXV_DIR)/gxvlcar.c \ - $(GXV_DIR)/gxvkern.c \ - $(GXV_DIR)/gxvmod.c - -# GXV driver headers -# -GXV_DRV_H := $(GXV_DIR)/gxvalid.h \ - $(GXV_DIR)/gxverror.h \ - $(GXV_DIR)/gxvcommn.h \ - $(GXV_DIR)/gxvfeat.h \ - $(GXV_DIR)/gxvmod.h \ - $(GXV_DIR)/gxvmort.h \ - $(GXV_DIR)/gxvmorx.h - - -# GXV driver object(s) -# -# GXV_DRV_OBJ_M is used during `multi' builds. -# GXV_DRV_OBJ_S is used during `single' builds. -# -GXV_DRV_OBJ_M := $(GXV_DRV_SRC:$(GXV_DIR)/%.c=$(OBJ_DIR)/%.$O) -GXV_DRV_OBJ_S := $(OBJ_DIR)/gxvalid.$O - -# GXV driver source file for single build -# -GXV_DRV_SRC_S := $(GXV_DIR)/gxvalid.c - - -# GXV driver - single object -# -$(GXV_DRV_OBJ_S): $(GXV_DRV_SRC_S) $(GXV_DRV_SRC) \ - $(FREETYPE_H) $(GXV_DRV_H) - $(GXV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GXV_DRV_SRC_S)) - - -# GXV driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(GXV_DIR)/%.c $(FREETYPE_H) $(GXV_DRV_H) - $(GXV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(GXV_DRV_OBJ_S) -DRV_OBJS_M += $(GXV_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/gzip/Jamfile b/3party/freetype/src/gzip/Jamfile deleted file mode 100644 index 0944a5f2c4..0000000000 --- a/3party/freetype/src/gzip/Jamfile +++ /dev/null @@ -1,16 +0,0 @@ -# FreeType 2 src/gzip Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) gzip ; - -Library $(FT2_LIB) : ftgzip.c ; - -# end of src/pcf Jamfile diff --git a/3party/freetype/src/gzip/adler32.c b/3party/freetype/src/gzip/adler32.c deleted file mode 100644 index c53f9dd125..0000000000 --- a/3party/freetype/src/gzip/adler32.c +++ /dev/null @@ -1,48 +0,0 @@ -/* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2002 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zlib.h" - -#define BASE 65521L /* largest prime smaller than 65536 */ -#define NMAX 5552 -/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ - -#define DO1(buf,i) {s1 += buf[i]; s2 += s1;} -#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); -#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); -#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); -#define DO16(buf) DO8(buf,0); DO8(buf,8); - -/* ========================================================================= */ -ZEXPORT(uLong) adler32( /* adler, buf, len) */ - uLong adler, - const Bytef *buf, - uInt len ) -{ - unsigned long s1 = adler & 0xffff; - unsigned long s2 = (adler >> 16) & 0xffff; - int k; - - if (buf == Z_NULL) return 1L; - - while (len > 0) { - k = len < NMAX ? len : NMAX; - len -= k; - while (k >= 16) { - DO16(buf); - buf += 16; - k -= 16; - } - if (k != 0) do { - s1 += *buf++; - s2 += s1; - } while (--k); - s1 %= BASE; - s2 %= BASE; - } - return (s2 << 16) | s1; -} diff --git a/3party/freetype/src/gzip/ftgzip.c b/3party/freetype/src/gzip/ftgzip.c deleted file mode 100644 index 879eb88a70..0000000000 --- a/3party/freetype/src/gzip/ftgzip.c +++ /dev/null @@ -1,790 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgzip.c */ -/* */ -/* FreeType support for .gz compressed files. */ -/* */ -/* This optional component relies on zlib. It should mainly be used to */ -/* parse compressed PCF fonts, as found with many X11 server */ -/* distributions. */ -/* */ -/* Copyright 2002-2015 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 <ft2build.h> -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H -#include FT_GZIP_H -#include FT_CONFIG_STANDARD_LIBRARY_H - - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX Gzip_Err_ -#define FT_ERR_BASE FT_Mod_Err_Gzip - -#include FT_ERRORS_H - - -#ifdef FT_CONFIG_OPTION_USE_ZLIB - -#ifdef FT_CONFIG_OPTION_PIC -#error "gzip code does not support PIC yet" -#endif - -#ifdef FT_CONFIG_OPTION_SYSTEM_ZLIB - -#include <zlib.h> - -#else /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */ - - /* In this case, we include our own modified sources of the ZLib */ - /* within the "ftgzip" component. The modifications were necessary */ - /* to #include all files without conflicts, as well as preventing */ - /* the definition of "extern" functions that may cause linking */ - /* conflicts when a program is linked with both FreeType and the */ - /* original ZLib. */ - -#ifndef USE_ZLIB_ZCALLOC -#define MY_ZCALLOC /* prevent all zcalloc() & zfree() in zutils.c */ -#endif - -#include "zlib.h" - -#undef SLOW -#define SLOW 1 /* we can't use asm-optimized sources here! */ - -#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ - /* We disable the warning `conversion from XXX to YYY, */ - /* possible loss of data' in order to compile cleanly with */ - /* the maximum level of warnings: zlib is non-FreeType */ - /* code. */ -#pragma warning( push ) -#pragma warning( disable : 4244 ) -#endif /* _MSC_VER */ - - /* Urgh. `inflate_mask' must not be declared twice -- C++ doesn't like - this. We temporarily disable it and load all necessary header files. */ -#define NO_INFLATE_MASK -#include "zutil.h" -#include "inftrees.h" -#include "infblock.h" -#include "infcodes.h" -#include "infutil.h" -#undef NO_INFLATE_MASK - - /* infutil.c must be included before infcodes.c */ -#include "zutil.c" -#include "inftrees.c" -#include "infutil.c" -#include "infcodes.c" -#include "infblock.c" -#include "inflate.c" -#include "adler32.c" - -#if defined( _MSC_VER ) -#pragma warning( pop ) -#endif - -#endif /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */ - - -/***************************************************************************/ -/***************************************************************************/ -/***** *****/ -/***** Z L I B M E M O R Y M A N A G E M E N T *****/ -/***** *****/ -/***************************************************************************/ -/***************************************************************************/ - - /* it is better to use FreeType memory routines instead of raw - 'malloc/free' */ - - static voidpf - ft_gzip_alloc( FT_Memory memory, - uInt items, - uInt size ) - { - FT_ULong sz = (FT_ULong)size * items; - FT_Error error; - FT_Pointer p = NULL; - - - (void)FT_ALLOC( p, sz ); - return p; - } - - - static void - ft_gzip_free( FT_Memory memory, - voidpf address ) - { - FT_MEM_FREE( address ); - } - - -#if !defined( FT_CONFIG_OPTION_SYSTEM_ZLIB ) && !defined( USE_ZLIB_ZCALLOC ) - - local voidpf - zcalloc ( voidpf opaque, - unsigned items, - unsigned size ) - { - return ft_gzip_alloc( (FT_Memory)opaque, items, size ); - } - - local void - zcfree( voidpf opaque, - voidpf ptr ) - { - ft_gzip_free( (FT_Memory)opaque, ptr ); - } - -#endif /* !SYSTEM_ZLIB && !USE_ZLIB_ZCALLOC */ - - -/***************************************************************************/ -/***************************************************************************/ -/***** *****/ -/***** Z L I B F I L E D E S C R I P T O R *****/ -/***** *****/ -/***************************************************************************/ -/***************************************************************************/ - -#define FT_GZIP_BUFFER_SIZE 4096 - - typedef struct FT_GZipFileRec_ - { - FT_Stream source; /* parent/source stream */ - FT_Stream stream; /* embedding stream */ - FT_Memory memory; /* memory allocator */ - z_stream zstream; /* zlib input stream */ - - FT_ULong start; /* starting position, after .gz header */ - FT_Byte input[FT_GZIP_BUFFER_SIZE]; /* input read buffer */ - - FT_Byte buffer[FT_GZIP_BUFFER_SIZE]; /* output buffer */ - FT_ULong pos; /* position in output */ - FT_Byte* cursor; - FT_Byte* limit; - - } FT_GZipFileRec, *FT_GZipFile; - - - /* gzip flag byte */ -#define FT_GZIP_ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ -#define FT_GZIP_HEAD_CRC 0x02 /* bit 1 set: header CRC present */ -#define FT_GZIP_EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ -#define FT_GZIP_ORIG_NAME 0x08 /* bit 3 set: original file name present */ -#define FT_GZIP_COMMENT 0x10 /* bit 4 set: file comment present */ -#define FT_GZIP_RESERVED 0xE0 /* bits 5..7: reserved */ - - - /* check and skip .gz header - we don't support `transparent' compression */ - static FT_Error - ft_gzip_check_header( FT_Stream stream ) - { - FT_Error error; - FT_Byte head[4]; - - - if ( FT_STREAM_SEEK( 0 ) || - FT_STREAM_READ( head, 4 ) ) - goto Exit; - - /* head[0] && head[1] are the magic numbers; */ - /* head[2] is the method, and head[3] the flags */ - if ( head[0] != 0x1F || - head[1] != 0x8B || - head[2] != Z_DEFLATED || - (head[3] & FT_GZIP_RESERVED) ) - { - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* skip time, xflags and os code */ - (void)FT_STREAM_SKIP( 6 ); - - /* skip the extra field */ - if ( head[3] & FT_GZIP_EXTRA_FIELD ) - { - FT_UInt len; - - - if ( FT_READ_USHORT_LE( len ) || - FT_STREAM_SKIP( len ) ) - goto Exit; - } - - /* skip original file name */ - if ( head[3] & FT_GZIP_ORIG_NAME ) - for (;;) - { - FT_UInt c; - - - if ( FT_READ_BYTE( c ) ) - goto Exit; - - if ( c == 0 ) - break; - } - - /* skip .gz comment */ - if ( head[3] & FT_GZIP_COMMENT ) - for (;;) - { - FT_UInt c; - - - if ( FT_READ_BYTE( c ) ) - goto Exit; - - if ( c == 0 ) - break; - } - - /* skip CRC */ - if ( head[3] & FT_GZIP_HEAD_CRC ) - if ( FT_STREAM_SKIP( 2 ) ) - goto Exit; - - Exit: - return error; - } - - - static FT_Error - ft_gzip_file_init( FT_GZipFile zip, - FT_Stream stream, - FT_Stream source ) - { - z_stream* zstream = &zip->zstream; - FT_Error error = FT_Err_Ok; - - - zip->stream = stream; - zip->source = source; - zip->memory = stream->memory; - - zip->limit = zip->buffer + FT_GZIP_BUFFER_SIZE; - zip->cursor = zip->limit; - zip->pos = 0; - - /* check and skip .gz header */ - { - stream = source; - - error = ft_gzip_check_header( stream ); - if ( error ) - goto Exit; - - zip->start = FT_STREAM_POS(); - } - - /* initialize zlib -- there is no zlib header in the compressed stream */ - zstream->zalloc = (alloc_func)ft_gzip_alloc; - zstream->zfree = (free_func) ft_gzip_free; - zstream->opaque = stream->memory; - - zstream->avail_in = 0; - zstream->next_in = zip->buffer; - - if ( inflateInit2( zstream, -MAX_WBITS ) != Z_OK || - zstream->next_in == NULL ) - error = FT_THROW( Invalid_File_Format ); - - Exit: - return error; - } - - - static void - ft_gzip_file_done( FT_GZipFile zip ) - { - z_stream* zstream = &zip->zstream; - - - inflateEnd( zstream ); - - /* clear the rest */ - zstream->zalloc = NULL; - zstream->zfree = NULL; - zstream->opaque = NULL; - zstream->next_in = NULL; - zstream->next_out = NULL; - zstream->avail_in = 0; - zstream->avail_out = 0; - - zip->memory = NULL; - zip->source = NULL; - zip->stream = NULL; - } - - - static FT_Error - ft_gzip_file_reset( FT_GZipFile zip ) - { - FT_Stream stream = zip->source; - FT_Error error; - - - if ( !FT_STREAM_SEEK( zip->start ) ) - { - z_stream* zstream = &zip->zstream; - - - inflateReset( zstream ); - - zstream->avail_in = 0; - zstream->next_in = zip->input; - zstream->avail_out = 0; - zstream->next_out = zip->buffer; - - zip->limit = zip->buffer + FT_GZIP_BUFFER_SIZE; - zip->cursor = zip->limit; - zip->pos = 0; - } - - return error; - } - - - static FT_Error - ft_gzip_file_fill_input( FT_GZipFile zip ) - { - z_stream* zstream = &zip->zstream; - FT_Stream stream = zip->source; - FT_ULong size; - - - if ( stream->read ) - { - size = stream->read( stream, stream->pos, zip->input, - FT_GZIP_BUFFER_SIZE ); - if ( size == 0 ) - return FT_THROW( Invalid_Stream_Operation ); - } - else - { - size = stream->size - stream->pos; - if ( size > FT_GZIP_BUFFER_SIZE ) - size = FT_GZIP_BUFFER_SIZE; - - if ( size == 0 ) - return FT_THROW( Invalid_Stream_Operation ); - - FT_MEM_COPY( zip->input, stream->base + stream->pos, size ); - } - stream->pos += size; - - zstream->next_in = zip->input; - zstream->avail_in = size; - - return FT_Err_Ok; - } - - - static FT_Error - ft_gzip_file_fill_output( FT_GZipFile zip ) - { - z_stream* zstream = &zip->zstream; - FT_Error error = FT_Err_Ok; - - - zip->cursor = zip->buffer; - zstream->next_out = zip->cursor; - zstream->avail_out = FT_GZIP_BUFFER_SIZE; - - while ( zstream->avail_out > 0 ) - { - int err; - - - if ( zstream->avail_in == 0 ) - { - error = ft_gzip_file_fill_input( zip ); - if ( error ) - break; - } - - err = inflate( zstream, Z_NO_FLUSH ); - - if ( err == Z_STREAM_END ) - { - zip->limit = zstream->next_out; - if ( zip->limit == zip->cursor ) - error = FT_THROW( Invalid_Stream_Operation ); - break; - } - else if ( err != Z_OK ) - { - error = FT_THROW( Invalid_Stream_Operation ); - break; - } - } - - return error; - } - - - /* fill output buffer; `count' must be <= FT_GZIP_BUFFER_SIZE */ - static FT_Error - ft_gzip_file_skip_output( FT_GZipFile zip, - FT_ULong count ) - { - FT_Error error = FT_Err_Ok; - FT_ULong delta; - - - for (;;) - { - delta = (FT_ULong)( zip->limit - zip->cursor ); - if ( delta >= count ) - delta = count; - - zip->cursor += delta; - zip->pos += delta; - - count -= delta; - if ( count == 0 ) - break; - - error = ft_gzip_file_fill_output( zip ); - if ( error ) - break; - } - - return error; - } - - - static FT_ULong - ft_gzip_file_io( FT_GZipFile zip, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ) - { - FT_ULong result = 0; - FT_Error error; - - - /* Reset inflate stream if we're seeking backwards. */ - /* Yes, that is not too efficient, but it saves memory :-) */ - if ( pos < zip->pos ) - { - error = ft_gzip_file_reset( zip ); - if ( error ) - goto Exit; - } - - /* skip unwanted bytes */ - if ( pos > zip->pos ) - { - error = ft_gzip_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); - if ( error ) - goto Exit; - } - - if ( count == 0 ) - goto Exit; - - /* now read the data */ - for (;;) - { - FT_ULong delta; - - - delta = (FT_ULong)( zip->limit - zip->cursor ); - if ( delta >= count ) - delta = count; - - FT_MEM_COPY( buffer, zip->cursor, delta ); - buffer += delta; - result += delta; - zip->cursor += delta; - zip->pos += delta; - - count -= delta; - if ( count == 0 ) - break; - - error = ft_gzip_file_fill_output( zip ); - if ( error ) - break; - } - - Exit: - return result; - } - - -/***************************************************************************/ -/***************************************************************************/ -/***** *****/ -/***** G Z E M B E D D I N G S T R E A M *****/ -/***** *****/ -/***************************************************************************/ -/***************************************************************************/ - - static void - ft_gzip_stream_close( FT_Stream stream ) - { - FT_GZipFile zip = (FT_GZipFile)stream->descriptor.pointer; - FT_Memory memory = stream->memory; - - - if ( zip ) - { - /* finalize gzip file descriptor */ - ft_gzip_file_done( zip ); - - FT_FREE( zip ); - - stream->descriptor.pointer = NULL; - } - } - - - static FT_ULong - ft_gzip_stream_io( FT_Stream stream, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ) - { - FT_GZipFile zip = (FT_GZipFile)stream->descriptor.pointer; - - - return ft_gzip_file_io( zip, pos, buffer, count ); - } - - - static FT_ULong - ft_gzip_get_uncompressed_size( FT_Stream stream ) - { - FT_Error error; - FT_ULong old_pos; - FT_ULong result = 0; - - - old_pos = stream->pos; - if ( !FT_Stream_Seek( stream, stream->size - 4 ) ) - { - result = FT_Stream_ReadULong( stream, &error ); - if ( error ) - result = 0; - - (void)FT_Stream_Seek( stream, old_pos ); - } - - return result; - } - - - /* documentation is in ftgzip.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stream_OpenGzip( FT_Stream stream, - FT_Stream source ) - { - FT_Error error; - FT_Memory memory; - FT_GZipFile zip = NULL; - - - if ( !stream || !source ) - { - error = FT_THROW( Invalid_Stream_Handle ); - goto Exit; - } - - memory = source->memory; - - /* - * check the header right now; this prevents allocating un-necessary - * objects when we don't need them - */ - error = ft_gzip_check_header( source ); - if ( error ) - goto Exit; - - FT_ZERO( stream ); - stream->memory = memory; - - if ( !FT_QNEW( zip ) ) - { - error = ft_gzip_file_init( zip, stream, source ); - if ( error ) - { - FT_FREE( zip ); - goto Exit; - } - - stream->descriptor.pointer = zip; - } - - /* - * We use the following trick to try to dramatically improve the - * performance while dealing with small files. If the original stream - * size is less than a certain threshold, we try to load the whole font - * file into memory. This saves us from using the 32KB buffer needed - * to inflate the file, plus the two 4KB intermediate input/output - * buffers used in the `FT_GZipFile' structure. - */ - { - FT_ULong zip_size = ft_gzip_get_uncompressed_size( source ); - - - if ( zip_size != 0 && zip_size < 40 * 1024 ) - { - FT_Byte* zip_buff = NULL; - - - if ( !FT_ALLOC( zip_buff, zip_size ) ) - { - FT_ULong count; - - - count = ft_gzip_file_io( zip, 0, zip_buff, zip_size ); - if ( count == zip_size ) - { - ft_gzip_file_done( zip ); - FT_FREE( zip ); - - stream->descriptor.pointer = NULL; - - stream->size = zip_size; - stream->pos = 0; - stream->base = zip_buff; - stream->read = NULL; - stream->close = ft_gzip_stream_close; - - goto Exit; - } - - ft_gzip_file_io( zip, 0, NULL, 0 ); - FT_FREE( zip_buff ); - } - error = FT_Err_Ok; - } - } - - stream->size = 0x7FFFFFFFL; /* don't know the real size! */ - stream->pos = 0; - stream->base = 0; - stream->read = ft_gzip_stream_io; - stream->close = ft_gzip_stream_close; - - Exit: - return error; - } - - - /* documentation is in ftgzip.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Gzip_Uncompress( FT_Memory memory, - FT_Byte* output, - FT_ULong* output_len, - const FT_Byte* input, - FT_ULong input_len ) - { - z_stream stream; - int err; - - - /* check for `input' delayed to `inflate' */ - - if ( !memory || ! output_len || !output ) - return FT_THROW( Invalid_Argument ); - - /* this function is modeled after zlib's `uncompress' function */ - - stream.next_in = (Bytef*)input; - stream.avail_in = (uInt)input_len; - - stream.next_out = output; - stream.avail_out = (uInt)*output_len; - - stream.zalloc = (alloc_func)ft_gzip_alloc; - stream.zfree = (free_func) ft_gzip_free; - stream.opaque = memory; - - err = inflateInit2( &stream, MAX_WBITS ); - if ( err != Z_OK ) - return FT_THROW( Invalid_Argument ); - - err = inflate( &stream, Z_FINISH ); - if ( err != Z_STREAM_END ) - { - inflateEnd( &stream ); - if ( err == Z_OK ) - err = Z_BUF_ERROR; - } - else - { - *output_len = stream.total_out; - - err = inflateEnd( &stream ); - } - - if ( err == Z_MEM_ERROR ) - return FT_THROW( Out_Of_Memory ); - - if ( err == Z_BUF_ERROR ) - return FT_THROW( Array_Too_Large ); - - if ( err == Z_DATA_ERROR ) - return FT_THROW( Invalid_Table ); - - return FT_Err_Ok; - } - - -#else /* !FT_CONFIG_OPTION_USE_ZLIB */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stream_OpenGzip( FT_Stream stream, - FT_Stream source ) - { - FT_UNUSED( stream ); - FT_UNUSED( source ); - - return FT_THROW( Unimplemented_Feature ); - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Gzip_Uncompress( FT_Memory memory, - FT_Byte* output, - FT_ULong* output_len, - const FT_Byte* input, - FT_ULong input_len ) - { - FT_UNUSED( memory ); - FT_UNUSED( output ); - FT_UNUSED( output_len ); - FT_UNUSED( input ); - FT_UNUSED( input_len ); - - return FT_THROW( Unimplemented_Feature ); - } - -#endif /* !FT_CONFIG_OPTION_USE_ZLIB */ - - -/* END */ diff --git a/3party/freetype/src/gzip/infblock.c b/3party/freetype/src/gzip/infblock.c deleted file mode 100644 index d6e2dc297d..0000000000 --- a/3party/freetype/src/gzip/infblock.c +++ /dev/null @@ -1,387 +0,0 @@ -/* infblock.c -- interpret and process block types to last block - * Copyright (C) 1995-2002 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "infblock.h" -#include "inftrees.h" -#include "infcodes.h" -#include "infutil.h" - - -/* simplify the use of the inflate_huft type with some defines */ -#define exop word.what.Exop -#define bits word.what.Bits - -/* Table for deflate from PKZIP's appnote.txt. */ -local const uInt border[] = { /* Order of the bit length code lengths */ - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - -/* - Notes beyond the 1.93a appnote.txt: - - 1. Distance pointers never point before the beginning of the output - stream. - 2. Distance pointers can point back across blocks, up to 32k away. - 3. There is an implied maximum of 7 bits for the bit length table and - 15 bits for the actual data. - 4. If only one code exists, then it is encoded using one bit. (Zero - would be more efficient, but perhaps a little confusing.) If two - codes exist, they are coded using one bit each (0 and 1). - 5. There is no way of sending zero distance codes--a dummy must be - sent if there are none. (History: a pre 2.0 version of PKZIP would - store blocks with no distance codes, but this was discovered to be - too harsh a criterion.) Valid only for 1.93a. 2.04c does allow - zero distance codes, which is sent as one code of zero bits in - length. - 6. There are up to 286 literal/length codes. Code 256 represents the - end-of-block. Note however that the static length tree defines - 288 codes just to fill out the Huffman codes. Codes 286 and 287 - cannot be used though, since there is no length base or extra bits - defined for them. Similarily, there are up to 30 distance codes. - However, static trees define 32 codes (all 5 bits) to fill out the - Huffman codes, but the last two had better not show up in the data. - 7. Unzip can check dynamic Huffman blocks for complete code sets. - The exception is that a single code would not be complete (see #4). - 8. The five bits following the block type is really the number of - literal codes sent minus 257. - 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits - (1+6+6). Therefore, to output three times the length, you output - three codes (1+1+1), whereas to output four times the same length, - you only need two codes (1+3). Hmm. - 10. In the tree reconstruction algorithm, Code = Code + Increment - only if BitLength(i) is not zero. (Pretty obvious.) - 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) - 12. Note: length code 284 can represent 227-258, but length code 285 - really is 258. The last length deserves its own, short code - since it gets used a lot in very redundant files. The length - 258 is special since 258 - 3 (the min match length) is 255. - 13. The literal/length and distance code bit lengths are read as a - single stream of lengths. It is possible (and advantageous) for - a repeat code (16, 17, or 18) to go across the boundary between - the two sets of lengths. - */ - - -local void inflate_blocks_reset( /* s, z, c) */ -inflate_blocks_statef *s, -z_streamp z, -uLongf *c ) -{ - if (c != Z_NULL) - *c = s->check; - if (s->mode == BTREE || s->mode == DTREE) - ZFREE(z, s->sub.trees.blens); - if (s->mode == CODES) - inflate_codes_free(s->sub.decode.codes, z); - s->mode = TYPE; - s->bitk = 0; - s->bitb = 0; - s->read = s->write = s->window; - if (s->checkfn != Z_NULL) - z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0); - Tracev((stderr, "inflate: blocks reset\n")); -} - - -local inflate_blocks_statef *inflate_blocks_new( /* z, c, w) */ -z_streamp z, -check_func c, -uInt w ) -{ - inflate_blocks_statef *s; - - if ((s = (inflate_blocks_statef *)ZALLOC - (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL) - return s; - if ((s->hufts = - (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL) - { - ZFREE(z, s); - return Z_NULL; - } - if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL) - { - ZFREE(z, s->hufts); - ZFREE(z, s); - return Z_NULL; - } - s->end = s->window + w; - s->checkfn = c; - s->mode = TYPE; - Tracev((stderr, "inflate: blocks allocated\n")); - inflate_blocks_reset(s, z, Z_NULL); - return s; -} - - -local int inflate_blocks( /* s, z, r) */ -inflate_blocks_statef *s, -z_streamp z, -int r ) -{ - uInt t; /* temporary storage */ - uLong b; /* bit buffer */ - uInt k; /* bits in bit buffer */ - Bytef *p; /* input data pointer */ - uInt n; /* bytes available there */ - Bytef *q; /* output window write pointer */ - uInt m; /* bytes to end of window or read pointer */ - - /* copy input/output information to locals (UPDATE macro restores) */ - LOAD - - /* process input based on current state */ - while (1) switch (s->mode) - { - case TYPE: - NEEDBITS(3) - t = (uInt)b & 7; - s->last = t & 1; - switch (t >> 1) - { - case 0: /* stored */ - Tracev((stderr, "inflate: stored block%s\n", - s->last ? " (last)" : "")); - DUMPBITS(3) - t = k & 7; /* go to byte boundary */ - DUMPBITS(t) - s->mode = LENS; /* get length of stored block */ - break; - case 1: /* fixed */ - Tracev((stderr, "inflate: fixed codes block%s\n", - s->last ? " (last)" : "")); - { - uInt bl, bd; - inflate_huft *tl, *td; - - inflate_trees_fixed(&bl, &bd, (const inflate_huft**)&tl, - (const inflate_huft**)&td, z); - s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); - if (s->sub.decode.codes == Z_NULL) - { - r = Z_MEM_ERROR; - LEAVE - } - } - DUMPBITS(3) - s->mode = CODES; - break; - case 2: /* dynamic */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - s->last ? " (last)" : "")); - DUMPBITS(3) - s->mode = TABLE; - break; - case 3: /* illegal */ - DUMPBITS(3) - s->mode = BAD; - z->msg = (char*)"invalid block type"; - r = Z_DATA_ERROR; - LEAVE - } - break; - case LENS: - NEEDBITS(32) - if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) - { - s->mode = BAD; - z->msg = (char*)"invalid stored block lengths"; - r = Z_DATA_ERROR; - LEAVE - } - s->sub.left = (uInt)b & 0xffff; - b = k = 0; /* dump bits */ - Tracev((stderr, "inflate: stored length %u\n", s->sub.left)); - s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); - break; - case STORED: - if (n == 0) - LEAVE - NEEDOUT - t = s->sub.left; - if (t > n) t = n; - if (t > m) t = m; - zmemcpy(q, p, t); - p += t; n -= t; - q += t; m -= t; - if ((s->sub.left -= t) != 0) - break; - Tracev((stderr, "inflate: stored end, %lu total out\n", - z->total_out + (q >= s->read ? q - s->read : - (s->end - s->read) + (q - s->window)))); - s->mode = s->last ? DRY : TYPE; - break; - case TABLE: - NEEDBITS(14) - s->sub.trees.table = t = (uInt)b & 0x3fff; -#ifndef PKZIP_BUG_WORKAROUND - if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) - { - s->mode = BAD; - z->msg = (char*)"too many length or distance symbols"; - r = Z_DATA_ERROR; - LEAVE - } -#endif - t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); - if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL) - { - r = Z_MEM_ERROR; - LEAVE - } - DUMPBITS(14) - s->sub.trees.index = 0; - Tracev((stderr, "inflate: table sizes ok\n")); - s->mode = BTREE; - case BTREE: - while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) - { - NEEDBITS(3) - s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; - DUMPBITS(3) - } - while (s->sub.trees.index < 19) - s->sub.trees.blens[border[s->sub.trees.index++]] = 0; - s->sub.trees.bb = 7; - t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, - &s->sub.trees.tb, s->hufts, z); - if (t != Z_OK) - { - r = t; - if (r == Z_DATA_ERROR) - { - ZFREE(z, s->sub.trees.blens); - s->mode = BAD; - } - LEAVE - } - s->sub.trees.index = 0; - Tracev((stderr, "inflate: bits tree ok\n")); - s->mode = DTREE; - case DTREE: - while (t = s->sub.trees.table, - s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) - { - inflate_huft *h; - uInt i, j, c; - - t = s->sub.trees.bb; - NEEDBITS(t) - h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]); - t = h->bits; - c = h->base; - if (c < 16) - { - DUMPBITS(t) - s->sub.trees.blens[s->sub.trees.index++] = c; - } - else /* c == 16..18 */ - { - i = c == 18 ? 7 : c - 14; - j = c == 18 ? 11 : 3; - NEEDBITS(t + i) - DUMPBITS(t) - j += (uInt)b & inflate_mask[i]; - DUMPBITS(i) - i = s->sub.trees.index; - t = s->sub.trees.table; - if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || - (c == 16 && i < 1)) - { - ZFREE(z, s->sub.trees.blens); - s->mode = BAD; - z->msg = (char*)"invalid bit length repeat"; - r = Z_DATA_ERROR; - LEAVE - } - c = c == 16 ? s->sub.trees.blens[i - 1] : 0; - do { - s->sub.trees.blens[i++] = c; - } while (--j); - s->sub.trees.index = i; - } - } - s->sub.trees.tb = Z_NULL; - { - uInt bl, bd; - inflate_huft *tl, *td; - inflate_codes_statef *c; - - bl = 9; /* must be <= 9 for lookahead assumptions */ - bd = 6; /* must be <= 9 for lookahead assumptions */ - t = s->sub.trees.table; - t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), - s->sub.trees.blens, &bl, &bd, &tl, &td, - s->hufts, z); - if (t != Z_OK) - { - if (t == (uInt)Z_DATA_ERROR) - { - ZFREE(z, s->sub.trees.blens); - s->mode = BAD; - } - r = t; - LEAVE - } - Tracev((stderr, "inflate: trees ok\n")); - if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) - { - r = Z_MEM_ERROR; - LEAVE - } - s->sub.decode.codes = c; - } - ZFREE(z, s->sub.trees.blens); - s->mode = CODES; - case CODES: - UPDATE - if ((r = inflate_codes(s, z, r)) != Z_STREAM_END) - return inflate_flush(s, z, r); - r = Z_OK; - inflate_codes_free(s->sub.decode.codes, z); - LOAD - Tracev((stderr, "inflate: codes end, %lu total out\n", - z->total_out + (q >= s->read ? q - s->read : - (s->end - s->read) + (q - s->window)))); - if (!s->last) - { - s->mode = TYPE; - break; - } - s->mode = DRY; - case DRY: - FLUSH - if (s->read != s->write) - LEAVE - s->mode = DONE; - case DONE: - r = Z_STREAM_END; - LEAVE - case BAD: - r = Z_DATA_ERROR; - LEAVE - default: - r = Z_STREAM_ERROR; - LEAVE - } -#ifdef NEED_DUMMY_RETURN - return 0; -#endif -} - - -local int inflate_blocks_free( /* s, z) */ -inflate_blocks_statef *s, -z_streamp z ) -{ - inflate_blocks_reset(s, z, Z_NULL); - ZFREE(z, s->window); - ZFREE(z, s->hufts); - ZFREE(z, s); - Tracev((stderr, "inflate: blocks freed\n")); - return Z_OK; -} - - diff --git a/3party/freetype/src/gzip/infblock.h b/3party/freetype/src/gzip/infblock.h deleted file mode 100644 index c2535a1e45..0000000000 --- a/3party/freetype/src/gzip/infblock.h +++ /dev/null @@ -1,36 +0,0 @@ -/* infblock.h -- header to use infblock.c - * Copyright (C) 1995-2002 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -#ifndef _INFBLOCK_H -#define _INFBLOCK_H - -struct inflate_blocks_state; -typedef struct inflate_blocks_state FAR inflate_blocks_statef; - -local inflate_blocks_statef * inflate_blocks_new OF(( - z_streamp z, - check_func c, /* check function */ - uInt w)); /* window size */ - -local int inflate_blocks OF(( - inflate_blocks_statef *, - z_streamp , - int)); /* initial return code */ - -local void inflate_blocks_reset OF(( - inflate_blocks_statef *, - z_streamp , - uLongf *)); /* check value on output */ - -local int inflate_blocks_free OF(( - inflate_blocks_statef *, - z_streamp)); - -#endif /* _INFBLOCK_H */ diff --git a/3party/freetype/src/gzip/infcodes.c b/3party/freetype/src/gzip/infcodes.c deleted file mode 100644 index f7bfd58c4f..0000000000 --- a/3party/freetype/src/gzip/infcodes.c +++ /dev/null @@ -1,250 +0,0 @@ -/* infcodes.c -- process literals and length/distance pairs - * Copyright (C) 1995-2002 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" -#include "infblock.h" -#include "infcodes.h" -#include "infutil.h" - -/* simplify the use of the inflate_huft type with some defines */ -#define exop word.what.Exop -#define bits word.what.Bits - -typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ - START, /* x: set up for LEN */ - LEN, /* i: get length/literal/eob next */ - LENEXT, /* i: getting length extra (have base) */ - DIST, /* i: get distance next */ - DISTEXT, /* i: getting distance extra */ - COPY, /* o: copying bytes in window, waiting for space */ - LIT, /* o: got literal, waiting for output space */ - WASH, /* o: got eob, possibly still output waiting */ - END, /* x: got eob and all data flushed */ - BADCODE} /* x: got error */ -inflate_codes_mode; - -/* inflate codes private state */ -struct inflate_codes_state { - - /* mode */ - inflate_codes_mode mode; /* current inflate_codes mode */ - - /* mode dependent information */ - uInt len; - union { - struct { - inflate_huft *tree; /* pointer into tree */ - uInt need; /* bits needed */ - } code; /* if LEN or DIST, where in tree */ - uInt lit; /* if LIT, literal */ - struct { - uInt get; /* bits to get for extra */ - uInt dist; /* distance back to copy from */ - } copy; /* if EXT or COPY, where and how much */ - } sub; /* submode */ - - /* mode independent information */ - Byte lbits; /* ltree bits decoded per branch */ - Byte dbits; /* dtree bits decoder per branch */ - inflate_huft *ltree; /* literal/length/eob tree */ - inflate_huft *dtree; /* distance tree */ - -}; - - -local inflate_codes_statef *inflate_codes_new( /* bl, bd, tl, td, z) */ -uInt bl, uInt bd, -inflate_huft *tl, -inflate_huft *td, /* need separate declaration for Borland C++ */ -z_streamp z ) -{ - inflate_codes_statef *c; - - if ((c = (inflate_codes_statef *) - ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL) - { - c->mode = START; - c->lbits = (Byte)bl; - c->dbits = (Byte)bd; - c->ltree = tl; - c->dtree = td; - Tracev((stderr, "inflate: codes new\n")); - } - return c; -} - - -local int inflate_codes( /* s, z, r) */ -inflate_blocks_statef *s, -z_streamp z, -int r ) -{ - uInt j; /* temporary storage */ - inflate_huft *t; /* temporary pointer */ - uInt e; /* extra bits or operation */ - uLong b; /* bit buffer */ - uInt k; /* bits in bit buffer */ - Bytef *p; /* input data pointer */ - uInt n; /* bytes available there */ - Bytef *q; /* output window write pointer */ - uInt m; /* bytes to end of window or read pointer */ - Bytef *f; /* pointer to copy strings from */ - inflate_codes_statef *c = s->sub.decode.codes; /* codes state */ - - /* copy input/output information to locals (UPDATE macro restores) */ - LOAD - - /* process input and output based on current state */ - while (1) switch (c->mode) - { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ - case START: /* x: set up for LEN */ -#ifndef SLOW - if (m >= 258 && n >= 10) - { - UPDATE - r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); - LOAD - if (r != Z_OK) - { - c->mode = r == Z_STREAM_END ? WASH : BADCODE; - break; - } - } -#endif /* !SLOW */ - c->sub.code.need = c->lbits; - c->sub.code.tree = c->ltree; - c->mode = LEN; - case LEN: /* i: get length/literal/eob next */ - j = c->sub.code.need; - NEEDBITS(j) - t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); - DUMPBITS(t->bits) - e = (uInt)(t->exop); - if (e == 0) /* literal */ - { - c->sub.lit = t->base; - Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", t->base)); - c->mode = LIT; - break; - } - if (e & 16) /* length */ - { - c->sub.copy.get = e & 15; - c->len = t->base; - c->mode = LENEXT; - break; - } - if ((e & 64) == 0) /* next table */ - { - c->sub.code.need = e; - c->sub.code.tree = t + t->base; - break; - } - if (e & 32) /* end of block */ - { - Tracevv((stderr, "inflate: end of block\n")); - c->mode = WASH; - break; - } - c->mode = BADCODE; /* invalid code */ - z->msg = (char*)"invalid literal/length code"; - r = Z_DATA_ERROR; - LEAVE - case LENEXT: /* i: getting length extra (have base) */ - j = c->sub.copy.get; - NEEDBITS(j) - c->len += (uInt)b & inflate_mask[j]; - DUMPBITS(j) - c->sub.code.need = c->dbits; - c->sub.code.tree = c->dtree; - Tracevv((stderr, "inflate: length %u\n", c->len)); - c->mode = DIST; - case DIST: /* i: get distance next */ - j = c->sub.code.need; - NEEDBITS(j) - t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); - DUMPBITS(t->bits) - e = (uInt)(t->exop); - if (e & 16) /* distance */ - { - c->sub.copy.get = e & 15; - c->sub.copy.dist = t->base; - c->mode = DISTEXT; - break; - } - if ((e & 64) == 0) /* next table */ - { - c->sub.code.need = e; - c->sub.code.tree = t + t->base; - break; - } - c->mode = BADCODE; /* invalid code */ - z->msg = (char*)"invalid distance code"; - r = Z_DATA_ERROR; - LEAVE - case DISTEXT: /* i: getting distance extra */ - j = c->sub.copy.get; - NEEDBITS(j) - c->sub.copy.dist += (uInt)b & inflate_mask[j]; - DUMPBITS(j) - Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist)); - c->mode = COPY; - case COPY: /* o: copying bytes in window, waiting for space */ - f = q - c->sub.copy.dist; - while (f < s->window) /* modulo window size-"while" instead */ - f += s->end - s->window; /* of "if" handles invalid distances */ - while (c->len) - { - NEEDOUT - OUTBYTE(*f++) - if (f == s->end) - f = s->window; - c->len--; - } - c->mode = START; - break; - case LIT: /* o: got literal, waiting for output space */ - NEEDOUT - OUTBYTE(c->sub.lit) - c->mode = START; - break; - case WASH: /* o: got eob, possibly more output */ - if (k > 7) /* return unused byte, if any */ - { - Assert(k < 16, "inflate_codes grabbed too many bytes") - k -= 8; - n++; - p--; /* can always return one */ - } - FLUSH - if (s->read != s->write) - LEAVE - c->mode = END; - case END: - r = Z_STREAM_END; - LEAVE - case BADCODE: /* x: got error */ - r = Z_DATA_ERROR; - LEAVE - default: - r = Z_STREAM_ERROR; - LEAVE - } -#ifdef NEED_DUMMY_RETURN - return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ -#endif -} - - -local void inflate_codes_free( /* c, z) */ -inflate_codes_statef *c, -z_streamp z ) -{ - ZFREE(z, c); - Tracev((stderr, "inflate: codes free\n")); -} diff --git a/3party/freetype/src/gzip/infcodes.h b/3party/freetype/src/gzip/infcodes.h deleted file mode 100644 index 154d7f896c..0000000000 --- a/3party/freetype/src/gzip/infcodes.h +++ /dev/null @@ -1,31 +0,0 @@ -/* infcodes.h -- header to use infcodes.c - * Copyright (C) 1995-2002 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -#ifndef _INFCODES_H -#define _INFCODES_H - -struct inflate_codes_state; -typedef struct inflate_codes_state FAR inflate_codes_statef; - -local inflate_codes_statef *inflate_codes_new OF(( - uInt, uInt, - inflate_huft *, inflate_huft *, - z_streamp )); - -local int inflate_codes OF(( - inflate_blocks_statef *, - z_streamp , - int)); - -local void inflate_codes_free OF(( - inflate_codes_statef *, - z_streamp )); - -#endif /* _INFCODES_H */ diff --git a/3party/freetype/src/gzip/inffixed.h b/3party/freetype/src/gzip/inffixed.h deleted file mode 100644 index 4d4760ea00..0000000000 --- a/3party/freetype/src/gzip/inffixed.h +++ /dev/null @@ -1,151 +0,0 @@ -/* inffixed.h -- table for decoding fixed codes - * Generated automatically by the maketree.c program - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -local const uInt fixed_bl = 9; -local const uInt fixed_bd = 5; -local const inflate_huft fixed_tl[] = { - {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, - {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192}, - {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160}, - {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224}, - {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144}, - {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208}, - {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176}, - {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240}, - {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, - {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200}, - {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168}, - {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232}, - {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152}, - {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216}, - {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184}, - {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248}, - {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, - {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196}, - {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164}, - {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228}, - {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148}, - {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212}, - {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180}, - {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244}, - {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, - {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204}, - {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172}, - {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236}, - {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156}, - {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220}, - {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188}, - {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252}, - {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, - {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194}, - {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162}, - {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226}, - {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146}, - {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210}, - {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178}, - {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242}, - {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, - {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202}, - {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170}, - {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234}, - {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154}, - {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218}, - {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186}, - {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250}, - {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, - {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198}, - {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166}, - {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230}, - {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150}, - {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214}, - {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182}, - {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246}, - {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, - {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206}, - {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174}, - {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238}, - {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158}, - {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222}, - {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190}, - {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254}, - {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, - {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193}, - {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161}, - {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225}, - {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145}, - {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209}, - {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177}, - {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241}, - {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, - {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201}, - {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169}, - {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233}, - {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153}, - {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217}, - {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185}, - {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249}, - {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, - {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197}, - {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165}, - {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229}, - {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149}, - {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213}, - {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181}, - {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245}, - {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, - {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205}, - {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173}, - {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237}, - {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157}, - {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221}, - {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189}, - {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253}, - {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, - {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195}, - {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163}, - {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227}, - {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147}, - {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211}, - {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179}, - {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243}, - {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, - {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203}, - {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171}, - {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235}, - {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155}, - {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219}, - {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187}, - {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251}, - {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, - {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199}, - {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167}, - {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231}, - {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151}, - {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215}, - {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183}, - {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247}, - {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, - {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207}, - {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175}, - {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239}, - {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159}, - {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223}, - {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191}, - {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255} - }; -local const inflate_huft fixed_td[] = { - {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097}, - {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385}, - {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193}, - {{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577}, - {{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145}, - {{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577}, - {{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289}, - {{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577} - }; diff --git a/3party/freetype/src/gzip/inflate.c b/3party/freetype/src/gzip/inflate.c deleted file mode 100644 index 8877fa3eb2..0000000000 --- a/3party/freetype/src/gzip/inflate.c +++ /dev/null @@ -1,273 +0,0 @@ -/* inflate.c -- zlib interface to inflate modules - * Copyright (C) 1995-2002 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "infblock.h" - -#define DONE INFLATE_DONE -#define BAD INFLATE_BAD - -typedef enum { - METHOD, /* waiting for method byte */ - FLAG, /* waiting for flag byte */ - DICT4, /* four dictionary check bytes to go */ - DICT3, /* three dictionary check bytes to go */ - DICT2, /* two dictionary check bytes to go */ - DICT1, /* one dictionary check byte to go */ - DICT0, /* waiting for inflateSetDictionary */ - BLOCKS, /* decompressing blocks */ - CHECK4, /* four check bytes to go */ - CHECK3, /* three check bytes to go */ - CHECK2, /* two check bytes to go */ - CHECK1, /* one check byte to go */ - DONE, /* finished check, done */ - BAD} /* got an error--stay here */ -inflate_mode; - -/* inflate private state */ -struct internal_state { - - /* mode */ - inflate_mode mode; /* current inflate mode */ - - /* mode dependent information */ - union { - uInt method; /* if FLAGS, method byte */ - struct { - uLong was; /* computed check value */ - uLong need; /* stream check value */ - } check; /* if CHECK, check values to compare */ - uInt marker; /* if BAD, inflateSync's marker bytes count */ - } sub; /* submode */ - - /* mode independent information */ - int nowrap; /* flag for no wrapper */ - uInt wbits; /* log2(window size) (8..15, defaults to 15) */ - inflate_blocks_statef - *blocks; /* current inflate_blocks state */ - -}; - - -ZEXPORT(int) inflateReset( /* z) */ -z_streamp z ) -{ - if (z == Z_NULL || z->state == Z_NULL) - return Z_STREAM_ERROR; - z->total_in = z->total_out = 0; - z->msg = Z_NULL; - z->state->mode = z->state->nowrap ? BLOCKS : METHOD; - inflate_blocks_reset(z->state->blocks, z, Z_NULL); - Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} - - -ZEXPORT(int) inflateEnd( /* z) */ -z_streamp z ) -{ - if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL) - return Z_STREAM_ERROR; - if (z->state->blocks != Z_NULL) - inflate_blocks_free(z->state->blocks, z); - ZFREE(z, z->state); - z->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} - - -ZEXPORT(int) inflateInit2_( /* z, w, version, stream_size) */ -z_streamp z, -int w, -const char *version, -int stream_size ) -{ - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != sizeof(z_stream)) - return Z_VERSION_ERROR; - - /* initialize state */ - if (z == Z_NULL) - return Z_STREAM_ERROR; - z->msg = Z_NULL; - if (z->zalloc == Z_NULL) - { - z->zalloc = zcalloc; - z->opaque = (voidpf)0; - } - if (z->zfree == Z_NULL) z->zfree = zcfree; - if ((z->state = (struct internal_state FAR *) - ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) - return Z_MEM_ERROR; - z->state->blocks = Z_NULL; - - /* handle undocumented nowrap option (no zlib header or check) */ - z->state->nowrap = 0; - if (w < 0) - { - w = - w; - z->state->nowrap = 1; - } - - /* set window size */ - if (w < 8 || w > 15) - { - inflateEnd(z); - return Z_STREAM_ERROR; - } - z->state->wbits = (uInt)w; - - /* create inflate_blocks state */ - if ((z->state->blocks = - inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w)) - == Z_NULL) - { - inflateEnd(z); - return Z_MEM_ERROR; - } - Tracev((stderr, "inflate: allocated\n")); - - /* reset state */ - inflateReset(z); - return Z_OK; -} - - - -#undef NEEDBYTE -#define NEEDBYTE {if(z->avail_in==0)return r;r=f;} - -#undef NEXTBYTE -#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) - - -ZEXPORT(int) inflate( /* z, f) */ -z_streamp z, -int f ) -{ - int r; - uInt b; - - if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL) - return Z_STREAM_ERROR; - f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; - r = Z_BUF_ERROR; - while (1) switch (z->state->mode) - { - case METHOD: - NEEDBYTE - if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) - { - z->state->mode = BAD; - z->msg = (char*)"unknown compression method"; - z->state->sub.marker = 5; /* can't try inflateSync */ - break; - } - if ((z->state->sub.method >> 4) + 8 > z->state->wbits) - { - z->state->mode = BAD; - z->msg = (char*)"invalid window size"; - z->state->sub.marker = 5; /* can't try inflateSync */ - break; - } - z->state->mode = FLAG; - case FLAG: - NEEDBYTE - b = NEXTBYTE; - if (((z->state->sub.method << 8) + b) % 31) - { - z->state->mode = BAD; - z->msg = (char*)"incorrect header check"; - z->state->sub.marker = 5; /* can't try inflateSync */ - break; - } - Tracev((stderr, "inflate: zlib header ok\n")); - if (!(b & PRESET_DICT)) - { - z->state->mode = BLOCKS; - break; - } - z->state->mode = DICT4; - case DICT4: - NEEDBYTE - z->state->sub.check.need = (uLong)NEXTBYTE << 24; - z->state->mode = DICT3; - case DICT3: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE << 16; - z->state->mode = DICT2; - case DICT2: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE << 8; - z->state->mode = DICT1; - case DICT1: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE; - z->adler = z->state->sub.check.need; - z->state->mode = DICT0; - return Z_NEED_DICT; - case DICT0: - z->state->mode = BAD; - z->msg = (char*)"need dictionary"; - z->state->sub.marker = 0; /* can try inflateSync */ - return Z_STREAM_ERROR; - case BLOCKS: - r = inflate_blocks(z->state->blocks, z, r); - if (r == Z_DATA_ERROR) - { - z->state->mode = BAD; - z->state->sub.marker = 0; /* can try inflateSync */ - break; - } - if (r == Z_OK) - r = f; - if (r != Z_STREAM_END) - return r; - r = f; - inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); - if (z->state->nowrap) - { - z->state->mode = DONE; - break; - } - z->state->mode = CHECK4; - case CHECK4: - NEEDBYTE - z->state->sub.check.need = (uLong)NEXTBYTE << 24; - z->state->mode = CHECK3; - case CHECK3: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE << 16; - z->state->mode = CHECK2; - case CHECK2: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE << 8; - z->state->mode = CHECK1; - case CHECK1: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE; - - if (z->state->sub.check.was != z->state->sub.check.need) - { - z->state->mode = BAD; - z->msg = (char*)"incorrect data check"; - z->state->sub.marker = 5; /* can't try inflateSync */ - break; - } - Tracev((stderr, "inflate: zlib check ok\n")); - z->state->mode = DONE; - case DONE: - return Z_STREAM_END; - case BAD: - return Z_DATA_ERROR; - default: - return Z_STREAM_ERROR; - } -#ifdef NEED_DUMMY_RETURN - return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ -#endif -} - diff --git a/3party/freetype/src/gzip/inftrees.c b/3party/freetype/src/gzip/inftrees.c deleted file mode 100644 index 56f52b1701..0000000000 --- a/3party/freetype/src/gzip/inftrees.c +++ /dev/null @@ -1,468 +0,0 @@ -/* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2002 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" - -#if !defined(BUILDFIXED) && !defined(STDC) -# define BUILDFIXED /* non ANSI compilers may not accept inffixed.h */ -#endif - - -#if 0 -local const char inflate_copyright[] = - " inflate 1.1.4 Copyright 1995-2002 Mark Adler "; -#endif -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* simplify the use of the inflate_huft type with some defines */ -#define exop word.what.Exop -#define bits word.what.Bits - - -local int huft_build OF(( - uIntf *, /* code lengths in bits */ - uInt, /* number of codes */ - uInt, /* number of "simple" codes */ - const uIntf *, /* list of base values for non-simple codes */ - const uIntf *, /* list of extra bits for non-simple codes */ - inflate_huft * FAR*,/* result: starting table */ - uIntf *, /* maximum lookup bits (returns actual) */ - inflate_huft *, /* space for trees */ - uInt *, /* hufts used in space */ - uIntf * )); /* space for values */ - -/* Tables for deflate from PKZIP's appnote.txt. */ -local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - /* see note #13 above about 258 */ -local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ -local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577}; -local const uInt cpdext[30] = { /* Extra bits for distance codes */ - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, - 12, 12, 13, 13}; - -/* - Huffman code decoding is performed using a multi-level table lookup. - The fastest way to decode is to simply build a lookup table whose - size is determined by the longest code. However, the time it takes - to build this table can also be a factor if the data being decoded - is not very long. The most common codes are necessarily the - shortest codes, so those codes dominate the decoding time, and hence - the speed. The idea is you can have a shorter table that decodes the - shorter, more probable codes, and then point to subsidiary tables for - the longer codes. The time it costs to decode the longer codes is - then traded against the time it takes to make longer tables. - - This results of this trade are in the variables lbits and dbits - below. lbits is the number of bits the first level table for literal/ - length codes can decode in one step, and dbits is the same thing for - the distance codes. Subsequent tables are also less than or equal to - those sizes. These values may be adjusted either when all of the - codes are shorter than that, in which case the longest code length in - bits is used, or when the shortest code is *longer* than the requested - table size, in which case the length of the shortest code in bits is - used. - - There are two different values for the two tables, since they code a - different number of possibilities each. The literal/length table - codes 286 possible values, or in a flat code, a little over eight - bits. The distance table codes 30 possible values, or a little less - than five bits, flat. The optimum values for speed end up being - about one bit more than those, so lbits is 8+1 and dbits is 5+1. - The optimum values may differ though from machine to machine, and - possibly even between compilers. Your mileage may vary. - */ - - -/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ -#define BMAX 15 /* maximum bit length of any code */ - -local int huft_build( /* b, n, s, d, e, t, m, hp, hn, v) */ -uIntf *b, /* code lengths in bits (all assumed <= BMAX) */ -uInt n, /* number of codes (assumed <= 288) */ -uInt s, /* number of simple-valued codes (0..s-1) */ -const uIntf *d, /* list of base values for non-simple codes */ -const uIntf *e, /* list of extra bits for non-simple codes */ -inflate_huft * FAR *t, /* result: starting table */ -uIntf *m, /* maximum lookup bits, returns actual */ -inflate_huft *hp, /* space for trees */ -uInt *hn, /* hufts used in space */ -uIntf *v /* working area: values in order of bit length */ -/* Given a list of code lengths and a maximum table size, make a set of - tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR - if the given code set is incomplete (the tables are still built in this - case), or Z_DATA_ERROR if the input is invalid. */ -) -{ - - uInt a; /* counter for codes of length k */ - uInt c[BMAX+1]; /* bit length count table */ - uInt f; /* i repeats in table every f entries */ - int g; /* maximum code length */ - int h; /* table level */ - uInt i; /* counter, current code */ - uInt j; /* counter */ - int k; /* number of bits in current code */ - int l; /* bits per table (returned in m) */ - uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */ - uIntf *p; /* pointer into c[], b[], or v[] */ - inflate_huft *q; /* points to current table */ - struct inflate_huft_s r; /* table entry for structure assignment */ - inflate_huft *u[BMAX]; /* table stack */ - int w; /* bits before this table == (l * h) */ - uInt x[BMAX+1]; /* bit offsets, then code stack */ - uIntf *xp; /* pointer into x */ - int y; /* number of dummy codes added */ - uInt z; /* number of entries in current table */ - - - /* Make compiler happy */ - r.base = 0; - - /* Generate counts for each bit length */ - p = c; -#define C0 *p++ = 0; -#define C2 C0 C0 C0 C0 -#define C4 C2 C2 C2 C2 - C4 /* clear c[]--assume BMAX+1 is 16 */ - p = b; i = n; - do { - c[*p++]++; /* assume all entries <= BMAX */ - } while (--i); - if (c[0] == n) /* null input--all zero length codes */ - { - *t = (inflate_huft *)Z_NULL; - *m = 0; - return Z_OK; - } - - - /* Find minimum and maximum length, bound *m by those */ - l = *m; - for (j = 1; j <= BMAX; j++) - if (c[j]) - break; - k = j; /* minimum code length */ - if ((uInt)l < j) - l = j; - for (i = BMAX; i; i--) - if (c[i]) - break; - g = i; /* maximum code length */ - if ((uInt)l > i) - l = i; - *m = l; - - - /* Adjust last length count to fill out codes, if needed */ - for (y = 1 << j; j < i; j++, y <<= 1) - if ((y -= c[j]) < 0) - return Z_DATA_ERROR; - if ((y -= c[i]) < 0) - return Z_DATA_ERROR; - c[i] += y; - - - /* Generate starting offsets into the value table for each length */ - x[1] = j = 0; - p = c + 1; xp = x + 2; - while (--i) { /* note that i == g from above */ - *xp++ = (j += *p++); - } - - - /* Make a table of values in order of bit lengths */ - p = b; i = 0; - do { - if ((j = *p++) != 0) - v[x[j]++] = i; - } while (++i < n); - n = x[g]; /* set n to length of v */ - - - /* Generate the Huffman codes and for each, make the table entries */ - x[0] = i = 0; /* first Huffman code is zero */ - p = v; /* grab values in bit order */ - h = -1; /* no tables yet--level -1 */ - w = -l; /* bits decoded == (l * h) */ - u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */ - q = (inflate_huft *)Z_NULL; /* ditto */ - z = 0; /* ditto */ - - /* go through the bit lengths (k already is bits in shortest code) */ - for (; k <= g; k++) - { - a = c[k]; - while (a--) - { - /* here i is the Huffman code of length k bits for value *p */ - /* make tables up to required level */ - while (k > w + l) - { - h++; - w += l; /* previous table always l bits */ - - /* compute minimum size table less than or equal to l bits */ - z = g - w; - z = z > (uInt)l ? (uInt)l : z; /* table size upper limit */ - if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ - { /* too few codes for k-w bit table */ - f -= a + 1; /* deduct codes from patterns left */ - xp = c + k; - if (j < z) - while (++j < z) /* try smaller tables up to z bits */ - { - if ((f <<= 1) <= *++xp) - break; /* enough codes to use up j bits */ - f -= *xp; /* else deduct codes from patterns */ - } - } - z = 1 << j; /* table entries for j-bit table */ - - /* allocate new table */ - if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ - return Z_DATA_ERROR; /* overflow of MANY */ - u[h] = q = hp + *hn; - *hn += z; - - /* connect to last table, if there is one */ - if (h) - { - x[h] = i; /* save pattern for backing up */ - r.bits = (Byte)l; /* bits to dump before this table */ - r.exop = (Byte)j; /* bits in this table */ - j = i >> (w - l); - r.base = (uInt)(q - u[h-1] - j); /* offset to this table */ - u[h-1][j] = r; /* connect to last table */ - } - else - *t = q; /* first table is returned result */ - } - - /* set up table entry in r */ - r.bits = (Byte)(k - w); - if (p >= v + n) - r.exop = 128 + 64; /* out of values--invalid code */ - else if (*p < s) - { - r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ - r.base = *p++; /* simple code is just the value */ - } - else - { - r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ - r.base = d[*p++ - s]; - } - - /* fill code-like entries with r */ - f = 1 << (k - w); - for (j = i >> w; j < z; j += f) - q[j] = r; - - /* backwards increment the k-bit code i */ - for (j = 1 << (k - 1); i & j; j >>= 1) - i ^= j; - i ^= j; - - /* backup over finished tables */ - mask = (1 << w) - 1; /* needed on HP, cc -O bug */ - while ((i & mask) != x[h]) - { - h--; /* don't need to update q */ - w -= l; - mask = (1 << w) - 1; - } - } - } - - - /* Return Z_BUF_ERROR if we were given an incomplete table */ - return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; -} - - -local int inflate_trees_bits( /* c, bb, tb, hp, z) */ -uIntf *c, /* 19 code lengths */ -uIntf *bb, /* bits tree desired/actual depth */ -inflate_huft * FAR *tb, /* bits tree result */ -inflate_huft *hp, /* space for trees */ -z_streamp z /* for messages */ -) -{ - int r; - uInt hn = 0; /* hufts used in space */ - uIntf *v; /* work area for huft_build */ - - if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL) - return Z_MEM_ERROR; - r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, - tb, bb, hp, &hn, v); - if (r == Z_DATA_ERROR) - z->msg = (char*)"oversubscribed dynamic bit lengths tree"; - else if (r == Z_BUF_ERROR || *bb == 0) - { - z->msg = (char*)"incomplete dynamic bit lengths tree"; - r = Z_DATA_ERROR; - } - ZFREE(z, v); - return r; -} - - -local int inflate_trees_dynamic( /* nl, nd, c, bl, bd, tl, td, hp, z) */ -uInt nl, /* number of literal/length codes */ -uInt nd, /* number of distance codes */ -uIntf *c, /* that many (total) code lengths */ -uIntf *bl, /* literal desired/actual bit depth */ -uIntf *bd, /* distance desired/actual bit depth */ -inflate_huft * FAR *tl, /* literal/length tree result */ -inflate_huft * FAR *td, /* distance tree result */ -inflate_huft *hp, /* space for trees */ -z_streamp z /* for messages */ -) -{ - int r; - uInt hn = 0; /* hufts used in space */ - uIntf *v; /* work area for huft_build */ - - /* allocate work area */ - if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) - return Z_MEM_ERROR; - - /* build literal/length tree */ - r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v); - if (r != Z_OK || *bl == 0) - { - if (r == Z_DATA_ERROR) - z->msg = (char*)"oversubscribed literal/length tree"; - else if (r != Z_MEM_ERROR) - { - z->msg = (char*)"incomplete literal/length tree"; - r = Z_DATA_ERROR; - } - ZFREE(z, v); - return r; - } - - /* build distance tree */ - r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v); - if (r != Z_OK || (*bd == 0 && nl > 257)) - { - if (r == Z_DATA_ERROR) - z->msg = (char*)"oversubscribed distance tree"; - else if (r == Z_BUF_ERROR) { -#if 0 - { -#endif -#ifdef PKZIP_BUG_WORKAROUND - r = Z_OK; - } -#else - z->msg = (char*)"incomplete distance tree"; - r = Z_DATA_ERROR; - } - else if (r != Z_MEM_ERROR) - { - z->msg = (char*)"empty distance tree with lengths"; - r = Z_DATA_ERROR; - } - ZFREE(z, v); - return r; -#endif - } - - /* done */ - ZFREE(z, v); - return Z_OK; -} - - -/* build fixed tables only once--keep them here */ -#ifdef BUILDFIXED -local int fixed_built = 0; -#define FIXEDH 544 /* number of hufts used by fixed tables */ -local inflate_huft fixed_mem[FIXEDH]; -local uInt fixed_bl; -local uInt fixed_bd; -local inflate_huft *fixed_tl; -local inflate_huft *fixed_td; -#else -#include "inffixed.h" -#endif - - -local int inflate_trees_fixed( /* bl, bd, tl, td, z) */ -uIntf *bl, /* literal desired/actual bit depth */ -uIntf *bd, /* distance desired/actual bit depth */ -const inflate_huft * FAR *tl, /* literal/length tree result */ -const inflate_huft * FAR *td, /* distance tree result */ -z_streamp z /* for memory allocation */ -) -{ -#ifdef BUILDFIXED - /* build fixed tables if not already */ - if (!fixed_built) - { - int k; /* temporary variable */ - uInt f = 0; /* number of hufts used in fixed_mem */ - uIntf *c; /* length list for huft_build */ - uIntf *v; /* work area for huft_build */ - - /* allocate memory */ - if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) - return Z_MEM_ERROR; - if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) - { - ZFREE(z, c); - return Z_MEM_ERROR; - } - - /* literal table */ - for (k = 0; k < 144; k++) - c[k] = 8; - for (; k < 256; k++) - c[k] = 9; - for (; k < 280; k++) - c[k] = 7; - for (; k < 288; k++) - c[k] = 8; - fixed_bl = 9; - huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, - fixed_mem, &f, v); - - /* distance table */ - for (k = 0; k < 30; k++) - c[k] = 5; - fixed_bd = 5; - huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, - fixed_mem, &f, v); - - /* done */ - ZFREE(z, v); - ZFREE(z, c); - fixed_built = 1; - } -#else - FT_UNUSED(z); -#endif - *bl = fixed_bl; - *bd = fixed_bd; - *tl = fixed_tl; - *td = fixed_td; - return Z_OK; -} diff --git a/3party/freetype/src/gzip/inftrees.h b/3party/freetype/src/gzip/inftrees.h deleted file mode 100644 index 07bf2aa0bf..0000000000 --- a/3party/freetype/src/gzip/inftrees.h +++ /dev/null @@ -1,63 +0,0 @@ -/* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-2002 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* Huffman code lookup table entry--this entry is four bytes for machines - that have 16-bit pointers (e.g. PC's in the small or medium model). */ - -#ifndef _INFTREES_H -#define _INFTREES_H - -typedef struct inflate_huft_s FAR inflate_huft; - -struct inflate_huft_s { - union { - struct { - Byte Exop; /* number of extra bits or operation */ - Byte Bits; /* number of bits in this code or subcode */ - } what; - uInt pad; /* pad structure to a power of 2 (4 bytes for */ - } word; /* 16-bit, 8 bytes for 32-bit int's) */ - uInt base; /* literal, length base, distance base, - or table offset */ -}; - -/* Maximum size of dynamic tree. The maximum found in a long but non- - exhaustive search was 1004 huft structures (850 for length/literals - and 154 for distances, the latter actually the result of an - exhaustive search). The actual maximum is not known, but the - value below is more than safe. */ -#define MANY 1440 - -local int inflate_trees_bits OF(( - uIntf *, /* 19 code lengths */ - uIntf *, /* bits tree desired/actual depth */ - inflate_huft * FAR *, /* bits tree result */ - inflate_huft *, /* space for trees */ - z_streamp)); /* for messages */ - -local int inflate_trees_dynamic OF(( - uInt, /* number of literal/length codes */ - uInt, /* number of distance codes */ - uIntf *, /* that many (total) code lengths */ - uIntf *, /* literal desired/actual bit depth */ - uIntf *, /* distance desired/actual bit depth */ - inflate_huft * FAR *, /* literal/length tree result */ - inflate_huft * FAR *, /* distance tree result */ - inflate_huft *, /* space for trees */ - z_streamp)); /* for messages */ - -local int inflate_trees_fixed OF(( - uIntf *, /* literal desired/actual bit depth */ - uIntf *, /* distance desired/actual bit depth */ - const inflate_huft * FAR *, /* literal/length tree result */ - const inflate_huft * FAR *, /* distance tree result */ - z_streamp)); /* for memory allocation */ - -#endif /* _INFTREES_H */ diff --git a/3party/freetype/src/gzip/infutil.c b/3party/freetype/src/gzip/infutil.c deleted file mode 100644 index 6087b40647..0000000000 --- a/3party/freetype/src/gzip/infutil.c +++ /dev/null @@ -1,86 +0,0 @@ -/* inflate_util.c -- data and routines common to blocks and codes - * Copyright (C) 1995-2002 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "infblock.h" -#include "inftrees.h" -#include "infcodes.h" -#include "infutil.h" - - -/* And'ing with mask[n] masks the lower n bits */ -local const uInt inflate_mask[17] = { - 0x0000, - 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, - 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff -}; - - -/* copy as much as possible from the sliding window to the output area */ -local int inflate_flush( /* s, z, r) */ -inflate_blocks_statef *s, -z_streamp z, -int r ) -{ - uInt n; - Bytef *p; - Bytef *q; - - /* local copies of source and destination pointers */ - p = z->next_out; - q = s->read; - - /* compute number of bytes to copy as far as end of window */ - n = (uInt)((q <= s->write ? s->write : s->end) - q); - if (n > z->avail_out) n = z->avail_out; - if (n && r == Z_BUF_ERROR) r = Z_OK; - - /* update counters */ - z->avail_out -= n; - z->total_out += n; - - /* update check information */ - if (s->checkfn != Z_NULL) - z->adler = s->check = (*s->checkfn)(s->check, q, n); - - /* copy as far as end of window */ - zmemcpy(p, q, n); - p += n; - q += n; - - /* see if more to copy at beginning of window */ - if (q == s->end) - { - /* wrap pointers */ - q = s->window; - if (s->write == s->end) - s->write = s->window; - - /* compute bytes to copy */ - n = (uInt)(s->write - q); - if (n > z->avail_out) n = z->avail_out; - if (n && r == Z_BUF_ERROR) r = Z_OK; - - /* update counters */ - z->avail_out -= n; - z->total_out += n; - - /* update check information */ - if (s->checkfn != Z_NULL) - z->adler = s->check = (*s->checkfn)(s->check, q, n); - - /* copy */ - zmemcpy(p, q, n); - p += n; - q += n; - } - - /* update pointers */ - z->next_out = p; - s->read = q; - - /* done */ - return r; -} diff --git a/3party/freetype/src/gzip/infutil.h b/3party/freetype/src/gzip/infutil.h deleted file mode 100644 index 7174b6dd0f..0000000000 --- a/3party/freetype/src/gzip/infutil.h +++ /dev/null @@ -1,98 +0,0 @@ -/* infutil.h -- types and macros common to blocks and codes - * Copyright (C) 1995-2002 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -#ifndef _INFUTIL_H -#define _INFUTIL_H - -typedef enum { - TYPE, /* get type bits (3, including end bit) */ - LENS, /* get lengths for stored */ - STORED, /* processing stored block */ - TABLE, /* get table lengths */ - BTREE, /* get bit lengths tree for a dynamic block */ - DTREE, /* get length, distance trees for a dynamic block */ - CODES, /* processing fixed or dynamic block */ - DRY, /* output remaining window bytes */ - DONE, /* finished last block, done */ - BAD} /* got a data error--stuck here */ -inflate_block_mode; - -/* inflate blocks semi-private state */ -struct inflate_blocks_state { - - /* mode */ - inflate_block_mode mode; /* current inflate_block mode */ - - /* mode dependent information */ - union { - uInt left; /* if STORED, bytes left to copy */ - struct { - uInt table; /* table lengths (14 bits) */ - uInt index; /* index into blens (or border) */ - uIntf *blens; /* bit lengths of codes */ - uInt bb; /* bit length tree depth */ - inflate_huft *tb; /* bit length decoding tree */ - } trees; /* if DTREE, decoding info for trees */ - struct { - inflate_codes_statef - *codes; - } decode; /* if CODES, current state */ - } sub; /* submode */ - uInt last; /* true if this block is the last block */ - - /* mode independent information */ - uInt bitk; /* bits in bit buffer */ - uLong bitb; /* bit buffer */ - inflate_huft *hufts; /* single malloc for tree space */ - Bytef *window; /* sliding window */ - Bytef *end; /* one byte after sliding window */ - Bytef *read; /* window read pointer */ - Bytef *write; /* window write pointer */ - check_func checkfn; /* check function */ - uLong check; /* check on output */ - -}; - - -/* defines for inflate input/output */ -/* update pointers and return */ -#define UPDBITS {s->bitb=b;s->bitk=k;} -#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} -#define UPDOUT {s->write=q;} -#define UPDATE {UPDBITS UPDIN UPDOUT} -#define LEAVE {UPDATE return inflate_flush(s,z,r);} -/* get bytes and bits */ -#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} -#define NEEDBYTE {if(n)r=Z_OK;else LEAVE} -#define NEXTBYTE (n--,*p++) -#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} -#define DUMPBITS(j) {b>>=(j);k-=(j);} -/* output bytes */ -#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q) -#define LOADOUT {q=s->write;m=(uInt)WAVAIL;} -#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} -#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT} -#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} -#define OUTBYTE(a) {*q++=(Byte)(a);m--;} -/* load local pointers */ -#define LOAD {LOADIN LOADOUT} - -/* masks for lower bits (size given to avoid silly warnings with Visual C++) */ -#ifndef NO_INFLATE_MASK -local uInt inflate_mask[17]; -#endif - -/* copy as much as possible from the sliding window to the output area */ -local int inflate_flush OF(( - inflate_blocks_statef *, - z_streamp , - int)); - -#endif diff --git a/3party/freetype/src/gzip/rules.mk b/3party/freetype/src/gzip/rules.mk deleted file mode 100644 index a8f74ec3c3..0000000000 --- a/3party/freetype/src/gzip/rules.mk +++ /dev/null @@ -1,83 +0,0 @@ -# -# FreeType 2 GZip support configuration rules -# - - -# Copyright 2002-2015 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. - - -# gzip driver directory -# -GZIP_DIR := $(SRC_DIR)/gzip - - -# compilation flags for the driver -# -ifeq ($(SYSTEM_ZLIB),) - GZIP_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(GZIP_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) -else - GZIP_COMPILE := $(CC) $(ANSIFLAGS) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) -endif - - -# gzip support sources -# -# All source and header files get loaded by `ftgzip.c' only if SYTEM_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)/infblock.c \ - $(GZIP_DIR)/infblock.h \ - $(GZIP_DIR)/infcodes.c \ - $(GZIP_DIR)/infcodes.h \ - $(GZIP_DIR)/inffixed.h \ - $(GZIP_DIR)/inflate.c \ - $(GZIP_DIR)/inftrees.c \ - $(GZIP_DIR)/inftrees.h \ - $(GZIP_DIR)/infutil.c \ - $(GZIP_DIR)/infutil.h \ - $(GZIP_DIR)/zconf.h \ - $(GZIP_DIR)/zlib.h \ - $(GZIP_DIR)/zutil.c \ - $(GZIP_DIR)/zutil.h - - -# gzip driver object(s) -# -# GZIP_DRV_OBJ is used during both `single' and `multi' builds -# -GZIP_DRV_OBJ := $(OBJ_DIR)/ftgzip.$O - - -# gzip main source file -# -GZIP_DRV_SRC := $(GZIP_DIR)/ftgzip.c - - -# gzip support - object -# -$(GZIP_DRV_OBJ): $(GZIP_DRV_SRC) $(GZIP_DRV_SRCS) $(FREETYPE_H) - $(GZIP_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GZIP_DRV_SRC)) - - -# update main driver object lists -# -DRV_OBJS_S += $(GZIP_DRV_OBJ) -DRV_OBJS_M += $(GZIP_DRV_OBJ) - - -# EOF diff --git a/3party/freetype/src/gzip/zconf.h b/3party/freetype/src/gzip/zconf.h deleted file mode 100644 index 3abf0ba03b..0000000000 --- a/3party/freetype/src/gzip/zconf.h +++ /dev/null @@ -1,284 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2002 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#ifndef _ZCONF_H -#define _ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateReset z_inflateReset -# define compress z_compress -# define compress2 z_compress2 -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table - -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) -# define WIN32 -#endif -#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386) -# ifndef __32BIT__ -# define __32BIT__ -# endif -#endif -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif - -/* WinCE doesn't have errno.h */ -#ifdef _WIN32_WCE -# define NO_ERRNO_H -#endif - - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#if defined(MSDOS) && !defined(__32BIT__) -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC) -# define STDC -#endif -#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__) -# ifndef STDC -# define STDC -# endif -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Old Borland C and LCC incorrectly complains about missing returns: */ -#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500) -# define NEED_DUMMY_RETURN -#endif - -#if defined(__LCC__) -# define NEED_DUMMY_RETURN -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -#endif -#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__)) -# ifndef __32BIT__ -# define SMALL_MEDIUM -# define FAR _far -# endif -#endif - -/* Compile with -DZLIB_DLL for Windows DLL support */ -#if defined(ZLIB_DLL) -# if defined(_WINDOWS) || defined(WINDOWS) -# ifdef FAR -# undef FAR -# endif -# include <windows.h> -# define ZEXPORT(x) x WINAPI -# ifdef WIN32 -# define ZEXPORTVA(x) x WINAPIV -# else -# define ZEXPORTVA(x) x FAR _cdecl _export -# endif -# endif -# if defined (__BORLANDC__) -# if (__BORLANDC__ >= 0x0500) && defined (WIN32) -# include <windows.h> -# define ZEXPORT(x) x __declspec(dllexport) WINAPI -# define ZEXPORTRVA(x) x __declspec(dllexport) WINAPIV -# else -# if defined (_Windows) && defined (__DLL__) -# define ZEXPORT(x) x _export -# define ZEXPORTVA(x) x _export -# endif -# endif -# endif -#endif - - -#ifndef ZEXPORT -# define ZEXPORT(x) static x -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA(x) static x -#endif -#ifndef ZEXTERN -# define ZEXTERN(x) static x -#endif -#ifndef ZEXTERNDEF -# define ZEXTERNDEF(x) static x -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(MACOS) && !defined(TARGET_OS_MAC) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#ifdef HAVE_UNISTD_H -# include <sys/types.h> /* for off_t */ -# include <unistd.h> /* for SEEK_* and off_t */ -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif -#ifndef z_off_t -# define z_off_t long -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(inflate_blocks,"INBL") -# pragma map(inflate_blocks_new,"INBLNE") -# pragma map(inflate_blocks_free,"INBLFR") -# pragma map(inflate_blocks_reset,"INBLRE") -# pragma map(inflate_codes_free,"INCOFR") -# pragma map(inflate_codes,"INCO") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_flush,"INFLU") -# pragma map(inflate_mask,"INMA") -# pragma map(inflate_set_dictionary,"INSEDI2") -# pragma map(inflate_copyright,"INCOPY") -# pragma map(inflate_trees_bits,"INTRBI") -# pragma map(inflate_trees_dynamic,"INTRDY") -# pragma map(inflate_trees_fixed,"INTRFI") -# pragma map(inflate_trees_free,"INTRFR") -#endif - -#endif /* _ZCONF_H */ diff --git a/3party/freetype/src/gzip/zlib.h b/3party/freetype/src/gzip/zlib.h deleted file mode 100644 index 50d0d3f146..0000000000 --- a/3party/freetype/src/gzip/zlib.h +++ /dev/null @@ -1,830 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.1.4, March 11th, 2002 - - Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). -*/ - -#ifndef _ZLIB_H -#define _ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZLIB_VERSION "1.1.4" - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed - data. This version of the library supports only one compression method - (deflation) but other algorithms will be added later and will have the same - stream interface. - - Compression can be done in a single step if the buffers are large - enough (for example if an input file is mmap'ed), or can be done by - repeated calls of the compression function. In the latter case, the - application must provide more input and/or consume the output - (providing more output space) before each call. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio. - - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never - crash even in case of corrupted input. -*/ - -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ - - Bytef *next_out; /* next output byte should be put there */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ - - char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: ascii or binary */ - uLong adler; /* adler32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - The application must update next_in and avail_in when avail_in has - dropped to zero. It must update next_out and avail_out when avail_out - has dropped to zero. The application must initialize zalloc, zfree and - opaque before calling the init function. All other fields are set by the - compression library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this - if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, - pointers returned by zalloc for objects of exactly 65536 bytes *must* - have their offset normalized to zero. The default allocation function - provided by this library ensures this (see zutil.c). To reduce memory - requirements and avoid any allocation of 64K objects, at the expense of - compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or - progress reports. After compression, total_in holds the total size of - the uncompressed data and may be saved for use in the decompressor - (particularly if the decompressor wants to decompress everything in - a single step). -*/ - - /* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -/* Allowed flush values; see deflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative - * values are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_ASCII 1 -#define Z_UNKNOWN 2 -/* Possible values of the data_type field */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - - - /* basic functions */ - -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is - not compatible with the zlib.h header file used by the application. - This check is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN(int) deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. - If zalloc and zfree are set to Z_NULL, deflateInit updates them to - use default allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at - all (the input data is simply copied a block at a time). - Z_DEFAULT_COMPRESSION requests a default compromise between speed and - compression (currently equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if level is not a valid compression level, - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). - msg is set to null if there is no error message. deflateInit does not - perform any compression: this will be done by deflate(). -*/ - - -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce some - output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). - Some output may be provided even if flush is not set. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating avail_in or avail_out accordingly; avail_out - should never be zero before the call. The application can consume the - compressed output when it wants, for example when the output buffer is full - (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK - and with zero avail_out, it must be called again after making room in the - output buffer because there might be more output pending. - - If the parameter flush is set to Z_SYNC_FLUSH, all pending output is - flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In particular - avail_in is zero after the call if enough output space has been provided - before the call.) Flushing may degrade compression for some compression - algorithms and so it should be used only when necessary. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_SYNC_FLUSH, and the compression state is reset so that decompression can - restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade - the compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there - was enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the - stream are deflateReset or deflateEnd. - - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least - 0.1% larger than avail_in plus 12 bytes. If deflate does not return - Z_STREAM_END, then it must be called again as described above. - - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). - - deflate() may update data_type if it can make a good guess about - the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered - binary. This field is only for information purposes and does not affect - the compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). -*/ - - -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, - msg may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN(int) inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the exact - value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller. msg is set to null if there is no error - message. inflateInit does not perform any decompression apart from reading - the zlib header if present: this will be done by inflate(). (So next_in and - avail_in may be modified, but next_out and avail_out are unchanged.) -*/ - - -ZEXTERN(int) inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may some - introduce some output latency (reading input without producing any output) - except when forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing - will resume at this point for the next call of inflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there - is no more input data or no more space in the output buffer (see below - about the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating the next_* and avail_* values accordingly. - The application can consume the uncompressed output when it wants, for - example when the output buffer is full (avail_out == 0), or after each - call of inflate(). If inflate returns Z_OK and with zero avail_out, it - must be called again after making room in the output buffer because there - might be more output pending. - - If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much - output as possible to the output buffer. The flushing behavior of inflate is - not specified for values of the flush parameter other than Z_SYNC_FLUSH - and Z_FINISH, but the current implementation actually flushes as much output - as possible anyway. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step - (a single call of inflate), the parameter flush should be set to - Z_FINISH. In this case all pending input is processed and all pending - output is flushed; avail_out must be large enough to hold all the - uncompressed data. (The size of the uncompressed data may have been saved - by the compressor for this purpose.) The next operation on this stream must - be inflateEnd to deallocate the decompression state. The use of Z_FINISH - is never required, but can be used to inform inflate that a faster routine - may be used for the single inflate() call. - - If a preset dictionary is needed at this point (see inflateSetDictionary - below), inflate sets strm-adler to the adler32 checksum of the - dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise - it sets strm->adler to the adler32 checksum of all output produced - so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or - an error code as described below. At the end of the stream, inflate() - checks that its computed adler32 checksum is equal to that saved by the - compressor and returns Z_STREAM_END only if the checksum is correct. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect - adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent - (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if no progress is possible or if there was not - enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR - case, the application may then call inflateSync to look for a good - compression block. -*/ - - -ZEXTERN(int) inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). -*/ - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN(int) deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by - the caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but - is slow and reduces compression ratio; memLevel=9 uses maximum memory - for optimal speed. The default value is 8. See zconf.h for total memory - usage as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match). Filtered data consists mostly of small values with a - somewhat random distribution. In this case, the compression algorithm is - tuned to compress them better. The effect of Z_FILTERED is to force more - Huffman coding and less string matching; it is somewhat intermediate - between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects - the compression ratio but not the correctness of the compressed output even - if it is not set appropriately. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid - method). msg is set to null if there is no error message. deflateInit2 does - not perform any compression: this will be done by deflate(). -*/ - -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any - call of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size in - deflate or deflate2. Thus the strings most likely to be useful should be - put at the end of the dictionary, not at the front. - - Upon return of this function, strm->adler is set to the Adler32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The Adler32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). -*/ - -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and - can consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -/* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. - The stream will keep the same compression level and any other attributes - that may have been set by deflateInit2. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different - strategy. If the compression level is changed, the input available so far - is compressed with the old level (and may be flushed); the new level will - take effect only at the next call of deflate(). - - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to - be compressed and flushed. In particular, strm->avail_out must be non-zero. - - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR - if strm->avail_out was zero. -*/ - -/* -ZEXTERN(int) inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. If a compressed stream with a larger window size is given as - input, inflate() will return with the error code Z_DATA_ERROR instead of - trying to allocate a larger window. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative - memLevel). msg is set to null if there is no error message. inflateInit2 - does not perform any decompression apart from reading the zlib header if - present: this will be done by inflate(). (So next_in and avail_in may be - modified, but next_out and avail_out are unchanged.) -*/ - -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate - if this call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the Adler32 value returned by this call of - inflate. The compressor and decompressor must use exactly the same - dictionary (see deflateSetDictionary). - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect Adler32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -/* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been found, - or Z_STREAM_ERROR if the stream structure was inconsistent. In the success - case, the application may save the current current value of total_in which - indicates where valid compressed data was found. In the error case, the - application may repeatedly call inflateSync, providing more input each time, - until success or end of the input data. -*/ - -ZEXTERN(int) inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. - The stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - - - /* utility functions */ - -/* - The following utility functions are implemented on top of the - basic stream-oriented functions. To simplify the interface, some - default options are assumed (compression level and memory usage, - standard memory allocation functions). The source code of these - utility functions can easily be modified if you need special options. -*/ - -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be at least 0.1% larger than - sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the - compressed buffer. - This function can be used to compress a whole file at once if the - input file is mmap'ed. - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least 0.1% larger than sourceLen plus - 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted. -*/ - - -/* - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb") but can also include a compression level - ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for - Huffman only compression as in "wb1h". (See the description - of deflateInit2 for more information about the strategy parameter.) - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. - - gzopen returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). */ - -/* - gzdopen() associates a gzFile with the file descriptor fd. File - descriptors are obtained from calls like open, dup, creat, pipe or - fileno (in the file has been previously opened with fopen). - The mode parameter is as in gzopen. - The next call of gzclose on the returned gzFile will also close the - file descriptor fd, just like fclose(fdopen(fd), mode) closes the file - descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). - gzdopen returns NULL if there was insufficient memory to allocate - the (de)compression state. -*/ - -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. -*/ - -/* - Reads the given number of uncompressed bytes from the compressed file. - If the input file was not in gzip format, gzread copies the given number - of bytes into the buffer. - gzread returns the number of uncompressed bytes actually read (0 for - end of file, -1 for error). */ - -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes actually written - (0 in case of error). -*/ - -/* - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). -*/ - -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. -*/ - -/* - Reads bytes from the compressed file until len-1 characters are read, or - a newline character is read and transferred to buf, or an end-of-file - condition is encountered. The string is then terminated with a null - character. - gzgets returns buf, or Z_NULL in case of error. -*/ - -/* - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. -*/ - -/* - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. -*/ - -/* - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. The return value is the zlib - error number (see function gzerror below). gzflush returns Z_OK if - the flush parameter is Z_FINISH and all output could be flushed. - gzflush should be called only when strictly necessary because it can - degrade compression. -*/ - -/* - Sets the starting position for the next gzread or gzwrite on the - given compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -/* - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -/* - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ - -/* - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. The return value is the zlib - error number (see function gzerror below). -*/ - -/* - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. -*/ - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the - compression library. -*/ - -ZEXTERN(uLong) adler32 OF((uLong adler, const Bytef *buf, uInt len)); - -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is NULL, this function returns - the required initial value for the checksum. - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -/* - Update a running crc with the bytes buf[0..len-1] and return the updated - crc. If buf is NULL, this function returns the required initial value - for the crc. Pre- and post-conditioning (one's complement) is performed - within this function so it shouldn't be done by the application. - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN(int) inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) - - -#ifdef __cplusplus -} -#endif - -#endif /* _ZLIB_H */ diff --git a/3party/freetype/src/gzip/zutil.c b/3party/freetype/src/gzip/zutil.c deleted file mode 100644 index 7ad0c1f81b..0000000000 --- a/3party/freetype/src/gzip/zutil.c +++ /dev/null @@ -1,181 +0,0 @@ -/* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2002 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zutil.h" - -#ifndef STDC -extern void exit OF((int)); -#endif - - -#ifndef HAVE_MEMCPY - -void zmemcpy(dest, source, len) - Bytef* dest; - const Bytef* source; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = *source++; /* ??? to be unrolled */ - } while (--len != 0); -} - -int zmemcmp(s1, s2, len) - const Bytef* s1; - const Bytef* s2; - uInt len; -{ - uInt j; - - for (j = 0; j < len; j++) { - if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; - } - return 0; -} - -void zmemzero(dest, len) - Bytef* dest; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = 0; /* ??? to be unrolled */ - } while (--len != 0); -} -#endif - -#if defined( MSDOS ) && defined( __TURBOC__ ) && !defined( MY_ZCALLOC ) -#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__) -/* Small and medium model in Turbo C are for now limited to near allocation - * with reduced MAX_WBITS and MAX_MEM_LEVEL - */ -# define MY_ZCALLOC - -/* Turbo C malloc() does not allow dynamic allocation of 64K bytes - * and farmalloc(64K) returns a pointer with an offset of 8, so we - * must fix the pointer. Warning: the pointer must be put back to its - * original form in order to free it, use zcfree(). - */ - -#define MAX_PTR 10 -/* 10*64K = 640K */ - -local int next_ptr = 0; - -typedef struct ptr_table_s { - voidpf org_ptr; - voidpf new_ptr; -} ptr_table; - -local ptr_table table[MAX_PTR]; -/* This table is used to remember the original form of pointers - * to large buffers (64K). Such pointers are normalized with a zero offset. - * Since MSDOS is not a preemptive multitasking OS, this table is not - * protected from concurrent access. This hack doesn't work anyway on - * a protected system like OS/2. Use Microsoft C instead. - */ - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - voidpf buf = opaque; /* just to make some compilers happy */ - ulg bsize = (ulg)items*size; - - /* If we allocate less than 65520 bytes, we assume that farmalloc - * will return a usable pointer which doesn't have to be normalized. - */ - if (bsize < 65520L) { - buf = farmalloc(bsize); - if (*(ush*)&buf != 0) return buf; - } else { - buf = farmalloc(bsize + 16L); - } - if (buf == NULL || next_ptr >= MAX_PTR) return NULL; - table[next_ptr].org_ptr = buf; - - /* Normalize the pointer to seg:0 */ - *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; - *(ush*)&buf = 0; - table[next_ptr++].new_ptr = buf; - return buf; -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - int n; - if (*(ush*)&ptr != 0) { /* object < 64K */ - farfree(ptr); - return; - } - /* Find the original pointer */ - for (n = 0; n < next_ptr; n++) { - if (ptr != table[n].new_ptr) continue; - - farfree(table[n].org_ptr); - while (++n < next_ptr) { - table[n-1] = table[n]; - } - next_ptr--; - return; - } - ptr = opaque; /* just to make some compilers happy */ - Assert(0, "zcfree: ptr not found"); -} -#endif -#endif /* MSDOS && __TURBOC__ */ - - -#if defined(M_I86) && !defined(__32BIT__) && !defined( MY_ZCALLOC ) -/* Microsoft C in 16-bit mode */ - -# define MY_ZCALLOC - -#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) -# define _halloc halloc -# define _hfree hfree -#endif - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - return _halloc((long)items, size); -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - _hfree(ptr); -} - -#endif /* MSC */ - - -#ifndef MY_ZCALLOC /* Any system without a special alloc function */ - -#ifndef STDC -extern voidp ft_scalloc OF((uInt items, uInt size)); -extern void ft_sfree OF((voidpf ptr)); -#endif - -voidpf zcalloc (opaque, items, size) - voidpf opaque; - unsigned items; - unsigned size; -{ - if (opaque) items += size - size; /* make compiler happy */ - return (voidpf)ft_scalloc(items, size); -} - -void zcfree (opaque, ptr) - voidpf opaque; - voidpf ptr; -{ - ft_sfree(ptr); - if (opaque) return; /* make compiler happy */ -} - -#endif /* MY_ZCALLOC */ diff --git a/3party/freetype/src/gzip/zutil.h b/3party/freetype/src/gzip/zutil.h deleted file mode 100644 index c9688cd9c0..0000000000 --- a/3party/freetype/src/gzip/zutil.h +++ /dev/null @@ -1,215 +0,0 @@ -/* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2002 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id$ */ - -#ifndef _Z_UTIL_H -#define _Z_UTIL_H - -#include "zlib.h" - -#ifdef STDC -# include <stddef.h> -# include <string.h> -# include <stdlib.h> -#endif -#ifdef NO_ERRNO_H - extern int errno; -#else -# include <errno.h> -#endif - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -typedef unsigned char uch; -typedef uch FAR uchf; -typedef unsigned short ush; -typedef ush FAR ushf; -typedef unsigned long ulg; - - -#define ERR_RETURN(strm,err) \ - return (strm->msg = (char*)ERR_MSG(err), (err)) -/* To be used only when the state is known to be valid */ - - /* common constants */ - -#ifndef DEF_WBITS -# define DEF_WBITS MAX_WBITS -#endif -/* default windowBits for decompression. MAX_WBITS is for compression only */ - -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -/* default memLevel */ - -#define STORED_BLOCK 0 -#define STATIC_TREES 1 -#define DYN_TREES 2 -/* The three kinds of block type */ - -#define MIN_MATCH 3 -#define MAX_MATCH 258 -/* The minimum and maximum match lengths */ - -#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ - - /* target dependencies */ - -#ifdef MSDOS -# define OS_CODE 0x00 -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) - /* Allow compilation with ANSI keywords only enabled */ - void _Cdecl farfree( void *block ); - void *_Cdecl farmalloc( unsigned long nbytes ); -# else -# include <alloc.h> -# endif -# else /* MSC or DJGPP */ -# endif -#endif - -#ifdef OS2 -# define OS_CODE 0x06 -#endif - -#ifdef WIN32 /* Window 95 & Windows NT */ -# define OS_CODE 0x0b -#endif - -#if defined(VAXC) || defined(VMS) -# define OS_CODE 0x02 -# define F_OPEN(name, mode) \ - ft_fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") -#endif - -#ifdef AMIGA -# define OS_CODE 0x01 -#endif - -#if defined(ATARI) || defined(atarist) -# define OS_CODE 0x05 -#endif - -#if defined(MACOS) || defined(TARGET_OS_MAC) -# define OS_CODE 0x07 -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include <unix.h> /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -#endif - -#ifdef __50SERIES /* Prime/PRIMOS */ -# define OS_CODE 0x0F -#endif - -#ifdef TOPS20 -# define OS_CODE 0x0a -#endif - -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) -# define fdopen(fd,type) _fdopen(fd,type) -#endif - - - /* Common defaults */ - -#ifndef OS_CODE -# define OS_CODE 0x03 /* assume Unix */ -#endif - -#ifndef F_OPEN -# define F_OPEN(name, mode) ft_fopen((name), (mode)) -#endif - - /* functions */ - -#ifdef HAVE_STRERROR - extern char *strerror OF((int)); -# define zstrerror(errnum) strerror(errnum) -#else -# define zstrerror(errnum) "" -#endif - -#if defined(pyr) -# define NO_MEMCPY -#endif -#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) - /* Use our own functions for small and medium model with MSC <= 5.0. - * You may have to use the same strategy for Borland C (untested). - * The __SC__ check is for Symantec. - */ -# define NO_MEMCPY -#endif -#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) -# define HAVE_MEMCPY -#endif -#ifdef HAVE_MEMCPY -# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ -# define zmemcpy _fmemcpy -# define zmemcmp _fmemcmp -# define zmemzero(dest, len) _fmemset(dest, 0, len) -# else -# define zmemcpy ft_memcpy -# define zmemcmp ft_memcmp -# define zmemzero(dest, len) ft_memset(dest, 0, len) -# endif -#else - extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - extern void zmemzero OF((Bytef* dest, uInt len)); -#endif - -/* Diagnostic functions */ -#ifdef DEBUG -# include <stdio.h> - extern int z_verbose; - extern void z_error OF((char *m)); -# define Assert(cond,msg) {if(!(cond)) z_error(msg);} -# define Trace(x) {if (z_verbose>=0) fprintf x ;} -# define Tracev(x) {if (z_verbose>0) fprintf x ;} -# define Tracevv(x) {if (z_verbose>1) fprintf x ;} -# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} -# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} -#else -# define Assert(cond,msg) -# define Trace(x) -# define Tracev(x) -# define Tracevv(x) -# define Tracec(c,x) -# define Tracecv(c,x) -#endif - - -typedef uLong (*check_func) OF((uLong check, const Bytef *buf, - uInt len)); -local voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); -local void zcfree OF((voidpf opaque, voidpf ptr)); - -#define ZALLOC(strm, items, size) \ - (*((strm)->zalloc))((strm)->opaque, (items), (size)) -#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) -#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} - -#endif /* _Z_UTIL_H */ diff --git a/3party/freetype/src/lzw/Jamfile b/3party/freetype/src/lzw/Jamfile deleted file mode 100644 index 91effe20c4..0000000000 --- a/3party/freetype/src/lzw/Jamfile +++ /dev/null @@ -1,16 +0,0 @@ -# FreeType 2 src/lzw Jamfile -# -# Copyright 2004-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) lzw ; - -Library $(FT2_LIB) : ftlzw.c ; - -# end of src/lzw Jamfile diff --git a/3party/freetype/src/lzw/ftlzw.c b/3party/freetype/src/lzw/ftlzw.c deleted file mode 100644 index 5664ff9cfd..0000000000 --- a/3party/freetype/src/lzw/ftlzw.c +++ /dev/null @@ -1,420 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftlzw.c */ -/* */ -/* FreeType support for .Z compressed files. */ -/* */ -/* This optional component relies on NetBSD's zopen(). It should mainly */ -/* be used to parse compressed PCF fonts, as found with many X11 server */ -/* distributions. */ -/* */ -/* Copyright 2004-2015 by */ -/* Albert Chin-A-Young. */ -/* */ -/* based on code in `src/gzip/ftgzip.c' */ -/* */ -/* 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 <ft2build.h> -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H -#include FT_LZW_H -#include FT_CONFIG_STANDARD_LIBRARY_H - - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX LZW_Err_ -#define FT_ERR_BASE FT_Mod_Err_LZW - -#include FT_ERRORS_H - - -#ifdef FT_CONFIG_OPTION_USE_LZW - -#ifdef FT_CONFIG_OPTION_PIC -#error "lzw code does not support PIC yet" -#endif - -#include "ftzopen.h" - - -/***************************************************************************/ -/***************************************************************************/ -/***** *****/ -/***** M E M O R Y M A N A G E M E N T *****/ -/***** *****/ -/***************************************************************************/ -/***************************************************************************/ - -/***************************************************************************/ -/***************************************************************************/ -/***** *****/ -/***** F I L E D E S C R I P T O R *****/ -/***** *****/ -/***************************************************************************/ -/***************************************************************************/ - -#define FT_LZW_BUFFER_SIZE 4096 - - typedef struct FT_LZWFileRec_ - { - FT_Stream source; /* parent/source stream */ - FT_Stream stream; /* embedding stream */ - FT_Memory memory; /* memory allocator */ - FT_LzwStateRec lzw; /* lzw decompressor state */ - - FT_Byte buffer[FT_LZW_BUFFER_SIZE]; /* output buffer */ - FT_ULong pos; /* position in output */ - FT_Byte* cursor; - FT_Byte* limit; - - } FT_LZWFileRec, *FT_LZWFile; - - - /* check and skip .Z header */ - static FT_Error - ft_lzw_check_header( FT_Stream stream ) - { - FT_Error error; - FT_Byte head[2]; - - - if ( FT_STREAM_SEEK( 0 ) || - FT_STREAM_READ( head, 2 ) ) - goto Exit; - - /* head[0] && head[1] are the magic numbers */ - if ( head[0] != 0x1F || - head[1] != 0x9D ) - error = FT_THROW( Invalid_File_Format ); - - Exit: - return error; - } - - - static FT_Error - ft_lzw_file_init( FT_LZWFile zip, - FT_Stream stream, - FT_Stream source ) - { - FT_LzwState lzw = &zip->lzw; - FT_Error error; - - - zip->stream = stream; - zip->source = source; - zip->memory = stream->memory; - - zip->limit = zip->buffer + FT_LZW_BUFFER_SIZE; - zip->cursor = zip->limit; - zip->pos = 0; - - /* check and skip .Z header */ - error = ft_lzw_check_header( source ); - if ( error ) - goto Exit; - - /* initialize internal lzw variable */ - ft_lzwstate_init( lzw, source ); - - Exit: - return error; - } - - - static void - ft_lzw_file_done( FT_LZWFile zip ) - { - /* clear the rest */ - ft_lzwstate_done( &zip->lzw ); - - zip->memory = NULL; - zip->source = NULL; - zip->stream = NULL; - } - - - static FT_Error - ft_lzw_file_reset( FT_LZWFile zip ) - { - FT_Stream stream = zip->source; - FT_Error error; - - - if ( !FT_STREAM_SEEK( 0 ) ) - { - ft_lzwstate_reset( &zip->lzw ); - - zip->limit = zip->buffer + FT_LZW_BUFFER_SIZE; - zip->cursor = zip->limit; - zip->pos = 0; - } - - return error; - } - - - static FT_Error - ft_lzw_file_fill_output( FT_LZWFile zip ) - { - FT_LzwState lzw = &zip->lzw; - FT_ULong count; - FT_Error error = FT_Err_Ok; - - - zip->cursor = zip->buffer; - - count = ft_lzwstate_io( lzw, zip->buffer, FT_LZW_BUFFER_SIZE ); - - zip->limit = zip->cursor + count; - - if ( count == 0 ) - error = FT_THROW( Invalid_Stream_Operation ); - - return error; - } - - - /* fill output buffer; `count' must be <= FT_LZW_BUFFER_SIZE */ - static FT_Error - ft_lzw_file_skip_output( FT_LZWFile zip, - FT_ULong count ) - { - FT_Error error = FT_Err_Ok; - - - /* first, we skip what we can from the output buffer */ - { - FT_ULong delta = (FT_ULong)( zip->limit - zip->cursor ); - - - if ( delta >= count ) - delta = count; - - zip->cursor += delta; - zip->pos += delta; - - count -= delta; - } - - /* next, we skip as many bytes remaining as possible */ - while ( count > 0 ) - { - FT_ULong delta = FT_LZW_BUFFER_SIZE; - FT_ULong numread; - - - if ( delta > count ) - delta = count; - - numread = ft_lzwstate_io( &zip->lzw, NULL, delta ); - if ( numread < delta ) - { - /* not enough bytes */ - error = FT_THROW( Invalid_Stream_Operation ); - break; - } - - zip->pos += delta; - count -= delta; - } - - return error; - } - - - static FT_ULong - ft_lzw_file_io( FT_LZWFile zip, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ) - { - FT_ULong result = 0; - FT_Error error; - - - /* seeking backwards. */ - if ( pos < zip->pos ) - { - /* If the new position is within the output buffer, simply */ - /* decrement pointers, otherwise we reset the stream completely! */ - if ( ( zip->pos - pos ) <= (FT_ULong)( zip->cursor - zip->buffer ) ) - { - zip->cursor -= zip->pos - pos; - zip->pos = pos; - } - else - { - error = ft_lzw_file_reset( zip ); - if ( error ) - goto Exit; - } - } - - /* skip unwanted bytes */ - if ( pos > zip->pos ) - { - error = ft_lzw_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); - if ( error ) - goto Exit; - } - - if ( count == 0 ) - goto Exit; - - /* now read the data */ - for (;;) - { - FT_ULong delta; - - - delta = (FT_ULong)( zip->limit - zip->cursor ); - if ( delta >= count ) - delta = count; - - FT_MEM_COPY( buffer + result, zip->cursor, delta ); - result += delta; - zip->cursor += delta; - zip->pos += delta; - - count -= delta; - if ( count == 0 ) - break; - - error = ft_lzw_file_fill_output( zip ); - if ( error ) - break; - } - - Exit: - return result; - } - - -/***************************************************************************/ -/***************************************************************************/ -/***** *****/ -/***** L Z W E M B E D D I N G S T R E A M *****/ -/***** *****/ -/***************************************************************************/ -/***************************************************************************/ - - static void - ft_lzw_stream_close( FT_Stream stream ) - { - FT_LZWFile zip = (FT_LZWFile)stream->descriptor.pointer; - FT_Memory memory = stream->memory; - - - if ( zip ) - { - /* finalize lzw file descriptor */ - ft_lzw_file_done( zip ); - - FT_FREE( zip ); - - stream->descriptor.pointer = NULL; - } - } - - - static FT_ULong - ft_lzw_stream_io( FT_Stream stream, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ) - { - FT_LZWFile zip = (FT_LZWFile)stream->descriptor.pointer; - - - return ft_lzw_file_io( zip, pos, buffer, count ); - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Stream_OpenLZW( FT_Stream stream, - FT_Stream source ) - { - FT_Error error; - FT_Memory memory; - FT_LZWFile zip = NULL; - - - if ( !stream || !source ) - { - error = FT_THROW( Invalid_Stream_Handle ); - goto Exit; - } - - memory = source->memory; - - /* - * Check the header right now; this prevents allocation of a huge - * LZWFile object (400 KByte of heap memory) if not necessary. - * - * Did I mention that you should never use .Z compressed font - * files? - */ - error = ft_lzw_check_header( source ); - if ( error ) - goto Exit; - - FT_ZERO( stream ); - stream->memory = memory; - - if ( !FT_NEW( zip ) ) - { - error = ft_lzw_file_init( zip, stream, source ); - if ( error ) - { - FT_FREE( zip ); - goto Exit; - } - - stream->descriptor.pointer = zip; - } - - stream->size = 0x7FFFFFFFL; /* don't know the real size! */ - stream->pos = 0; - stream->base = 0; - stream->read = ft_lzw_stream_io; - stream->close = ft_lzw_stream_close; - - Exit: - return error; - } - - -#include "ftzopen.c" - - -#else /* !FT_CONFIG_OPTION_USE_LZW */ - - - FT_EXPORT_DEF( FT_Error ) - FT_Stream_OpenLZW( FT_Stream stream, - FT_Stream source ) - { - FT_UNUSED( stream ); - FT_UNUSED( source ); - - return FT_THROW( Unimplemented_Feature ); - } - - -#endif /* !FT_CONFIG_OPTION_USE_LZW */ - - -/* END */ diff --git a/3party/freetype/src/lzw/ftzopen.c b/3party/freetype/src/lzw/ftzopen.c deleted file mode 100644 index f96bb73d98..0000000000 --- a/3party/freetype/src/lzw/ftzopen.c +++ /dev/null @@ -1,416 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftzopen.c */ -/* */ -/* FreeType support for .Z compressed files. */ -/* */ -/* This optional component relies on NetBSD's zopen(). It should mainly */ -/* be used to parse compressed PCF fonts, as found with many X11 server */ -/* distributions. */ -/* */ -/* Copyright 2005-2015 by */ -/* David Turner. */ -/* */ -/* 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 "ftzopen.h" -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H - - - static int - ft_lzwstate_refill( FT_LzwState state ) - { - FT_ULong count; - - - if ( state->in_eof ) - return -1; - - count = FT_Stream_TryRead( state->source, - state->buf_tab, - state->num_bits ); /* WHY? */ - - state->buf_size = (FT_UInt)count; - state->buf_total += count; - state->in_eof = FT_BOOL( count < state->num_bits ); - state->buf_offset = 0; - state->buf_size = ( state->buf_size << 3 ) - ( state->num_bits - 1 ); - - if ( count == 0 ) /* end of file */ - return -1; - - return 0; - } - - - static FT_Int32 - ft_lzwstate_get_code( FT_LzwState state ) - { - FT_UInt num_bits = state->num_bits; - FT_UInt offset = state->buf_offset; - FT_Byte* p; - FT_Int result; - - - if ( state->buf_clear || - offset >= state->buf_size || - state->free_ent >= state->free_bits ) - { - if ( state->free_ent >= state->free_bits ) - { - state->num_bits = ++num_bits; - state->free_bits = state->num_bits < state->max_bits - ? (FT_UInt)( ( 1UL << num_bits ) - 256 ) - : state->max_free + 1; - } - - if ( state->buf_clear ) - { - state->num_bits = num_bits = LZW_INIT_BITS; - state->free_bits = (FT_UInt)( ( 1UL << num_bits ) - 256 ); - state->buf_clear = 0; - } - - if ( ft_lzwstate_refill( state ) < 0 ) - return -1; - - offset = 0; - } - - state->buf_offset = offset + num_bits; - - p = &state->buf_tab[offset >> 3]; - offset &= 7; - result = *p++ >> offset; - offset = 8 - offset; - num_bits -= offset; - - if ( num_bits >= 8 ) - { - result |= *p++ << offset; - offset += 8; - num_bits -= 8; - } - if ( num_bits > 0 ) - result |= ( *p & LZW_MASK( num_bits ) ) << offset; - - return result; - } - - - /* grow the character stack */ - static int - ft_lzwstate_stack_grow( FT_LzwState state ) - { - if ( state->stack_top >= state->stack_size ) - { - FT_Memory memory = state->memory; - FT_Error error; - FT_Offset old_size = state->stack_size; - FT_Offset new_size = old_size; - - new_size = new_size + ( new_size >> 1 ) + 4; - - if ( state->stack == state->stack_0 ) - { - state->stack = NULL; - old_size = 0; - } - - /* requirement of the character stack larger than 1<<LZW_MAX_BITS */ - /* implies bug in the decompression code */ - if ( new_size > ( 1 << LZW_MAX_BITS ) ) - { - new_size = 1 << LZW_MAX_BITS; - if ( new_size == old_size ) - return -1; - } - - if ( FT_RENEW_ARRAY( state->stack, old_size, new_size ) ) - return -1; - - state->stack_size = new_size; - } - return 0; - } - - - /* grow the prefix/suffix arrays */ - static int - ft_lzwstate_prefix_grow( FT_LzwState state ) - { - FT_UInt old_size = state->prefix_size; - FT_UInt new_size = old_size; - FT_Memory memory = state->memory; - FT_Error error; - - - if ( new_size == 0 ) /* first allocation -> 9 bits */ - new_size = 512; - else - new_size += new_size >> 2; /* don't grow too fast */ - - /* - * Note that the `suffix' array is located in the same memory block - * pointed to by `prefix'. - * - * I know that sizeof(FT_Byte) == 1 by definition, but it is clearer - * to write it literally. - * - */ - if ( FT_REALLOC_MULT( state->prefix, old_size, new_size, - sizeof ( FT_UShort ) + sizeof ( FT_Byte ) ) ) - return -1; - - /* now adjust `suffix' and move the data accordingly */ - state->suffix = (FT_Byte*)( state->prefix + new_size ); - - FT_MEM_MOVE( state->suffix, - state->prefix + old_size, - old_size * sizeof ( FT_Byte ) ); - - state->prefix_size = new_size; - return 0; - } - - - FT_LOCAL_DEF( void ) - ft_lzwstate_reset( FT_LzwState state ) - { - state->in_eof = 0; - state->buf_offset = 0; - state->buf_size = 0; - state->buf_clear = 0; - state->buf_total = 0; - state->stack_top = 0; - state->num_bits = LZW_INIT_BITS; - state->phase = FT_LZW_PHASE_START; - } - - - FT_LOCAL_DEF( void ) - ft_lzwstate_init( FT_LzwState state, - FT_Stream source ) - { - FT_ZERO( state ); - - state->source = source; - state->memory = source->memory; - - state->prefix = NULL; - state->suffix = NULL; - state->prefix_size = 0; - - state->stack = state->stack_0; - state->stack_size = sizeof ( state->stack_0 ); - - ft_lzwstate_reset( state ); - } - - - FT_LOCAL_DEF( void ) - ft_lzwstate_done( FT_LzwState state ) - { - FT_Memory memory = state->memory; - - - ft_lzwstate_reset( state ); - - if ( state->stack != state->stack_0 ) - FT_FREE( state->stack ); - - FT_FREE( state->prefix ); - state->suffix = NULL; - - FT_ZERO( state ); - } - - -#define FTLZW_STACK_PUSH( c ) \ - FT_BEGIN_STMNT \ - if ( state->stack_top >= state->stack_size && \ - ft_lzwstate_stack_grow( state ) < 0 ) \ - goto Eof; \ - \ - state->stack[state->stack_top++] = (FT_Byte)(c); \ - FT_END_STMNT - - - FT_LOCAL_DEF( FT_ULong ) - ft_lzwstate_io( FT_LzwState state, - FT_Byte* buffer, - FT_ULong out_size ) - { - FT_ULong result = 0; - - FT_UInt old_char = state->old_char; - FT_UInt old_code = state->old_code; - FT_UInt in_code = state->in_code; - - - if ( out_size == 0 ) - goto Exit; - - switch ( state->phase ) - { - case FT_LZW_PHASE_START: - { - FT_Byte max_bits; - FT_Int32 c; - - - /* skip magic bytes, and read max_bits + block_flag */ - if ( FT_Stream_Seek( state->source, 2 ) != 0 || - FT_Stream_TryRead( state->source, &max_bits, 1 ) != 1 ) - goto Eof; - - state->max_bits = max_bits & LZW_BIT_MASK; - state->block_mode = max_bits & LZW_BLOCK_MASK; - state->max_free = (FT_UInt)( ( 1UL << state->max_bits ) - 256 ); - - if ( state->max_bits > LZW_MAX_BITS ) - goto Eof; - - state->num_bits = LZW_INIT_BITS; - state->free_ent = ( state->block_mode ? LZW_FIRST - : LZW_CLEAR ) - 256; - in_code = 0; - - state->free_bits = state->num_bits < state->max_bits - ? (FT_UInt)( ( 1UL << state->num_bits ) - 256 ) - : state->max_free + 1; - - c = ft_lzwstate_get_code( state ); - if ( c < 0 || c > 255 ) - goto Eof; - - old_code = old_char = (FT_UInt)c; - - if ( buffer ) - buffer[result] = (FT_Byte)old_char; - - if ( ++result >= out_size ) - goto Exit; - - state->phase = FT_LZW_PHASE_CODE; - } - /* fall-through */ - - case FT_LZW_PHASE_CODE: - { - FT_Int32 c; - FT_UInt code; - - - NextCode: - c = ft_lzwstate_get_code( state ); - if ( c < 0 ) - goto Eof; - - code = (FT_UInt)c; - - if ( code == LZW_CLEAR && state->block_mode ) - { - /* why not LZW_FIRST-256 ? */ - state->free_ent = ( LZW_FIRST - 1 ) - 256; - state->buf_clear = 1; - - /* not quite right, but at least more predictable */ - old_code = 0; - old_char = 0; - - goto NextCode; - } - - in_code = code; /* save code for later */ - - if ( code >= 256U ) - { - /* special case for KwKwKwK */ - if ( code - 256U >= state->free_ent ) - { - /* corrupted LZW stream */ - if ( code - 256U > state->free_ent ) - goto Eof; - - FTLZW_STACK_PUSH( old_char ); - code = old_code; - } - - while ( code >= 256U ) - { - if ( !state->prefix ) - goto Eof; - - FTLZW_STACK_PUSH( state->suffix[code - 256] ); - code = state->prefix[code - 256]; - } - } - - old_char = code; - FTLZW_STACK_PUSH( old_char ); - - state->phase = FT_LZW_PHASE_STACK; - } - /* fall-through */ - - case FT_LZW_PHASE_STACK: - { - while ( state->stack_top > 0 ) - { - --state->stack_top; - - if ( buffer ) - buffer[result] = state->stack[state->stack_top]; - - if ( ++result == out_size ) - goto Exit; - } - - /* now create new entry */ - if ( state->free_ent < state->max_free ) - { - if ( state->free_ent >= state->prefix_size && - ft_lzwstate_prefix_grow( state ) < 0 ) - goto Eof; - - FT_ASSERT( state->free_ent < state->prefix_size ); - - state->prefix[state->free_ent] = (FT_UShort)old_code; - state->suffix[state->free_ent] = (FT_Byte) old_char; - - state->free_ent += 1; - } - - old_code = in_code; - - state->phase = FT_LZW_PHASE_CODE; - goto NextCode; - } - - default: /* state == EOF */ - ; - } - - Exit: - state->old_code = old_code; - state->old_char = old_char; - state->in_code = in_code; - - return result; - - Eof: - state->phase = FT_LZW_PHASE_EOF; - goto Exit; - } - - -/* END */ diff --git a/3party/freetype/src/lzw/ftzopen.h b/3party/freetype/src/lzw/ftzopen.h deleted file mode 100644 index d35e380595..0000000000 --- a/3party/freetype/src/lzw/ftzopen.h +++ /dev/null @@ -1,172 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftzopen.h */ -/* */ -/* FreeType support for .Z compressed files. */ -/* */ -/* This optional component relies on NetBSD's zopen(). It should mainly */ -/* be used to parse compressed PCF fonts, as found with many X11 server */ -/* distributions. */ -/* */ -/* Copyright 2005-2015 by */ -/* David Turner. */ -/* */ -/* 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 __FT_ZOPEN_H__ -#define __FT_ZOPEN_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - - - /* - * This is a complete re-implementation of the LZW file reader, - * since the old one was incredibly badly written, using - * 400 KByte of heap memory before decompressing anything. - * - */ - -#define FT_LZW_IN_BUFF_SIZE 64 -#define FT_LZW_DEFAULT_STACK_SIZE 64 - -#define LZW_INIT_BITS 9 -#define LZW_MAX_BITS 16 - -#define LZW_CLEAR 256 -#define LZW_FIRST 257 - -#define LZW_BIT_MASK 0x1F -#define LZW_BLOCK_MASK 0x80 -#define LZW_MASK( n ) ( ( 1U << (n) ) - 1U ) - - - typedef enum FT_LzwPhase_ - { - FT_LZW_PHASE_START = 0, - FT_LZW_PHASE_CODE, - FT_LZW_PHASE_STACK, - FT_LZW_PHASE_EOF - - } FT_LzwPhase; - - - /* - * state of LZW decompressor - * - * small technical note - * -------------------- - * - * We use a few tricks in this implementation that are explained here to - * ease debugging and maintenance. - * - * - First of all, the `prefix' and `suffix' arrays contain the suffix - * and prefix for codes over 256; this means that - * - * prefix_of(code) == state->prefix[code-256] - * suffix_of(code) == state->suffix[code-256] - * - * Each prefix is a 16-bit code, and each suffix an 8-bit byte. - * - * Both arrays are stored in a single memory block, pointed to by - * `state->prefix'. This means that the following equality is always - * true: - * - * state->suffix == (FT_Byte*)(state->prefix + state->prefix_size) - * - * Of course, state->prefix_size is the number of prefix/suffix slots - * in the arrays, corresponding to codes 256..255+prefix_size. - * - * - `free_ent' is the index of the next free entry in the `prefix' - * and `suffix' arrays. This means that the corresponding `next free - * code' is really `256+free_ent'. - * - * Moreover, `max_free' is the maximum value that `free_ent' can reach. - * - * `max_free' corresponds to `(1 << max_bits) - 256'. Note that this - * value is always <= 0xFF00, which means that both `free_ent' and - * `max_free' can be stored in an FT_UInt variable, even on 16-bit - * machines. - * - * If `free_ent == max_free', you cannot add new codes to the - * prefix/suffix table. - * - * - `num_bits' is the current number of code bits, starting at 9 and - * growing each time `free_ent' reaches the value of `free_bits'. The - * latter is computed as follows - * - * if num_bits < max_bits: - * free_bits = (1 << num_bits)-256 - * else: - * free_bits = max_free + 1 - * - * Since the value of `max_free + 1' can never be reached by - * `free_ent', `num_bits' cannot grow larger than `max_bits'. - */ - - typedef struct FT_LzwStateRec_ - { - FT_LzwPhase phase; - FT_Int in_eof; - - FT_Byte buf_tab[16]; - FT_UInt buf_offset; - FT_UInt buf_size; - FT_Bool buf_clear; - FT_Offset buf_total; - - FT_UInt max_bits; /* max code bits, from file header */ - FT_Int block_mode; /* block mode flag, from file header */ - FT_UInt max_free; /* (1 << max_bits) - 256 */ - - FT_UInt num_bits; /* current code bit number */ - FT_UInt free_ent; /* index of next free entry */ - FT_UInt free_bits; /* if reached by free_ent, increment num_bits */ - FT_UInt old_code; - FT_UInt old_char; - FT_UInt in_code; - - FT_UShort* prefix; /* always dynamically allocated / reallocated */ - FT_Byte* suffix; /* suffix = (FT_Byte*)(prefix + prefix_size) */ - FT_UInt prefix_size; /* number of slots in `prefix' or `suffix' */ - - FT_Byte* stack; /* character stack */ - FT_UInt stack_top; - FT_Offset stack_size; - FT_Byte stack_0[FT_LZW_DEFAULT_STACK_SIZE]; /* minimize heap alloc */ - - FT_Stream source; /* source stream */ - FT_Memory memory; - - } FT_LzwStateRec, *FT_LzwState; - - - FT_LOCAL( void ) - ft_lzwstate_init( FT_LzwState state, - FT_Stream source ); - - FT_LOCAL( void ) - ft_lzwstate_done( FT_LzwState state ); - - - FT_LOCAL( void ) - ft_lzwstate_reset( FT_LzwState state ); - - - FT_LOCAL( FT_ULong ) - ft_lzwstate_io( FT_LzwState state, - FT_Byte* buffer, - FT_ULong out_size ); - -/* */ - -#endif /* __FT_ZOPEN_H__ */ - - -/* END */ diff --git a/3party/freetype/src/lzw/rules.mk b/3party/freetype/src/lzw/rules.mk deleted file mode 100644 index ab1c02fb50..0000000000 --- a/3party/freetype/src/lzw/rules.mk +++ /dev/null @@ -1,72 +0,0 @@ -# -# FreeType 2 LZW support configuration rules -# - - -# Copyright 2004-2015 by -# Albert Chin-A-Young. -# -# based on `src/lzw/rules.mk' -# -# 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. - - -# LZW driver directory -# -LZW_DIR := $(SRC_DIR)/lzw - - -# compilation flags for the driver -# -LZW_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(LZW_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# LZW support sources (i.e., C files) -# -LZW_DRV_SRC := $(LZW_DIR)/ftlzw.c - -# LZW support headers -# -LZW_DRV_H := $(LZW_DIR)/ftzopen.h \ - $(LZW_DIR)/ftzopen.c - - -# LZW driver object(s) -# -# LZW_DRV_OBJ_M is used during `multi' builds -# LZW_DRV_OBJ_S is used during `single' builds -# -LZW_DRV_OBJ_M := $(OBJ_DIR)/ftlzw.$O -LZW_DRV_OBJ_S := $(OBJ_DIR)/ftlzw.$O - -# LZW support source file for single build -# -LZW_DRV_SRC_S := $(LZW_DIR)/ftlzw.c - - -# LZW support - single object -# -$(LZW_DRV_OBJ_S): $(LZW_DRV_SRC_S) $(LZW_DRV_SRC) $(FREETYPE_H) $(LZW_DRV_H) - $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(LZW_DRV_SRC_S)) - - -# LZW support - multiple objects -# -$(OBJ_DIR)/%.$O: $(LZW_DIR)/%.c $(FREETYPE_H) $(LZW_DRV_H) - $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(LZW_DRV_OBJ_S) -DRV_OBJS_M += $(LZW_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/otvalid/Jamfile b/3party/freetype/src/otvalid/Jamfile deleted file mode 100644 index 461a222174..0000000000 --- a/3party/freetype/src/otvalid/Jamfile +++ /dev/null @@ -1,37 +0,0 @@ -# FreeType 2 src/otvalid Jamfile -# -# Copyright 2004-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) otvalid ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = otvbase - otvcommn - otvgdef - otvgpos - otvgsub - otvjstf - otvmath - otvmod - ; - } - else - { - _sources = otvalid ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/otvalid Jamfile diff --git a/3party/freetype/src/otvalid/module.mk b/3party/freetype/src/otvalid/module.mk deleted file mode 100644 index 3d8c0d9f2e..0000000000 --- a/3party/freetype/src/otvalid/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 otvalid module definition -# - - -# Copyright 2004-2015 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. - - -FTMODULE_H_COMMANDS += OTVALID_MODULE - -define OTVALID_MODULE -$(OPEN_DRIVER) FT_Module_Class, otv_module_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)otvalid $(ECHO_DRIVER_DESC)OpenType validation module$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/otvalid/otvalid.c b/3party/freetype/src/otvalid/otvalid.c deleted file mode 100644 index ca597d707c..0000000000 --- a/3party/freetype/src/otvalid/otvalid.c +++ /dev/null @@ -1,31 +0,0 @@ -/***************************************************************************/ -/* */ -/* otvalid.c */ -/* */ -/* FreeType validator for OpenType tables (body only). */ -/* */ -/* Copyright 2004-2015 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. */ -/* */ -/***************************************************************************/ - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> - -#include "otvbase.c" -#include "otvcommn.c" -#include "otvgdef.c" -#include "otvgpos.c" -#include "otvgsub.c" -#include "otvjstf.c" -#include "otvmath.c" -#include "otvmod.c" - -/* END */ diff --git a/3party/freetype/src/otvalid/otvalid.h b/3party/freetype/src/otvalid/otvalid.h deleted file mode 100644 index 3475deb7a2..0000000000 --- a/3party/freetype/src/otvalid/otvalid.h +++ /dev/null @@ -1,78 +0,0 @@ -/***************************************************************************/ -/* */ -/* otvalid.h */ -/* */ -/* OpenType table validation (specification only). */ -/* */ -/* Copyright 2004-2015 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 __OTVALID_H__ -#define __OTVALID_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#include "otverror.h" /* must come before FT_INTERNAL_VALIDATE_H */ - -#include FT_INTERNAL_VALIDATE_H -#include FT_INTERNAL_STREAM_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( void ) - otv_BASE_validate( FT_Bytes table, - FT_Validator valid ); - - /* GSUB and GPOS tables should already be validated; */ - /* if missing, set corresponding argument to 0 */ - FT_LOCAL( void ) - otv_GDEF_validate( FT_Bytes table, - FT_Bytes gsub, - FT_Bytes gpos, - FT_UInt glyph_count, - FT_Validator valid ); - - FT_LOCAL( void ) - otv_GPOS_validate( FT_Bytes table, - FT_UInt glyph_count, - FT_Validator valid ); - - FT_LOCAL( void ) - otv_GSUB_validate( FT_Bytes table, - FT_UInt glyph_count, - FT_Validator valid ); - - /* GSUB and GPOS tables should already be validated; */ - /* if missing, set corresponding argument to 0 */ - FT_LOCAL( void ) - otv_JSTF_validate( FT_Bytes table, - FT_Bytes gsub, - FT_Bytes gpos, - FT_UInt glyph_count, - FT_Validator valid ); - - FT_LOCAL( void ) - otv_MATH_validate( FT_Bytes table, - FT_UInt glyph_count, - FT_Validator ftvalid ); - - -FT_END_HEADER - -#endif /* __OTVALID_H__ */ - - -/* END */ diff --git a/3party/freetype/src/otvalid/otvbase.c b/3party/freetype/src/otvalid/otvbase.c deleted file mode 100644 index 24038c63b7..0000000000 --- a/3party/freetype/src/otvalid/otvbase.c +++ /dev/null @@ -1,318 +0,0 @@ -/***************************************************************************/ -/* */ -/* otvbase.c */ -/* */ -/* OpenType BASE table validation (body). */ -/* */ -/* Copyright 2004-2015 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 "otvalid.h" -#include "otvcommn.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_otvbase - - - static void - otv_BaseCoord_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt BaseCoordFormat; - - - OTV_NAME_ENTER( "BaseCoord" ); - - OTV_LIMIT_CHECK( 4 ); - BaseCoordFormat = FT_NEXT_USHORT( p ); - p += 2; /* skip Coordinate */ - - OTV_TRACE(( " (format %d)\n", BaseCoordFormat )); - - switch ( BaseCoordFormat ) - { - case 1: /* BaseCoordFormat1 */ - break; - - case 2: /* BaseCoordFormat2 */ - OTV_LIMIT_CHECK( 4 ); /* ReferenceGlyph, BaseCoordPoint */ - break; - - case 3: /* BaseCoordFormat3 */ - OTV_LIMIT_CHECK( 2 ); - /* DeviceTable */ - otv_Device_validate( table + FT_NEXT_USHORT( p ), otvalid ); - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - static void - otv_BaseTagList_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt BaseTagCount; - - - OTV_NAME_ENTER( "BaseTagList" ); - - OTV_LIMIT_CHECK( 2 ); - - BaseTagCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (BaseTagCount = %d)\n", BaseTagCount )); - - OTV_LIMIT_CHECK( BaseTagCount * 4 ); /* BaselineTag */ - - OTV_EXIT; - } - - - static void - otv_BaseValues_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt BaseCoordCount; - - - OTV_NAME_ENTER( "BaseValues" ); - - OTV_LIMIT_CHECK( 4 ); - - p += 2; /* skip DefaultIndex */ - BaseCoordCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (BaseCoordCount = %d)\n", BaseCoordCount )); - - OTV_LIMIT_CHECK( BaseCoordCount * 2 ); - - /* BaseCoord */ - for ( ; BaseCoordCount > 0; BaseCoordCount-- ) - otv_BaseCoord_validate( table + FT_NEXT_USHORT( p ), otvalid ); - - OTV_EXIT; - } - - - static void - otv_MinMax_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt table_size; - FT_UInt FeatMinMaxCount; - - OTV_OPTIONAL_TABLE( MinCoord ); - OTV_OPTIONAL_TABLE( MaxCoord ); - - - OTV_NAME_ENTER( "MinMax" ); - - OTV_LIMIT_CHECK( 6 ); - - OTV_OPTIONAL_OFFSET( MinCoord ); - OTV_OPTIONAL_OFFSET( MaxCoord ); - FeatMinMaxCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (FeatMinMaxCount = %d)\n", FeatMinMaxCount )); - - table_size = FeatMinMaxCount * 8 + 6; - - OTV_SIZE_CHECK( MinCoord ); - if ( MinCoord ) - otv_BaseCoord_validate( table + MinCoord, otvalid ); - - OTV_SIZE_CHECK( MaxCoord ); - if ( MaxCoord ) - otv_BaseCoord_validate( table + MaxCoord, otvalid ); - - OTV_LIMIT_CHECK( FeatMinMaxCount * 8 ); - - /* FeatMinMaxRecord */ - for ( ; FeatMinMaxCount > 0; FeatMinMaxCount-- ) - { - p += 4; /* skip FeatureTableTag */ - - OTV_OPTIONAL_OFFSET( MinCoord ); - OTV_OPTIONAL_OFFSET( MaxCoord ); - - OTV_SIZE_CHECK( MinCoord ); - if ( MinCoord ) - otv_BaseCoord_validate( table + MinCoord, otvalid ); - - OTV_SIZE_CHECK( MaxCoord ); - if ( MaxCoord ) - otv_BaseCoord_validate( table + MaxCoord, otvalid ); - } - - OTV_EXIT; - } - - - static void - otv_BaseScript_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt table_size; - FT_UInt BaseLangSysCount; - - OTV_OPTIONAL_TABLE( BaseValues ); - OTV_OPTIONAL_TABLE( DefaultMinMax ); - - - OTV_NAME_ENTER( "BaseScript" ); - - OTV_LIMIT_CHECK( 6 ); - OTV_OPTIONAL_OFFSET( BaseValues ); - OTV_OPTIONAL_OFFSET( DefaultMinMax ); - BaseLangSysCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (BaseLangSysCount = %d)\n", BaseLangSysCount )); - - table_size = BaseLangSysCount * 6 + 6; - - OTV_SIZE_CHECK( BaseValues ); - if ( BaseValues ) - otv_BaseValues_validate( table + BaseValues, otvalid ); - - OTV_SIZE_CHECK( DefaultMinMax ); - if ( DefaultMinMax ) - otv_MinMax_validate( table + DefaultMinMax, otvalid ); - - OTV_LIMIT_CHECK( BaseLangSysCount * 6 ); - - /* BaseLangSysRecord */ - for ( ; BaseLangSysCount > 0; BaseLangSysCount-- ) - { - p += 4; /* skip BaseLangSysTag */ - - otv_MinMax_validate( table + FT_NEXT_USHORT( p ), otvalid ); - } - - OTV_EXIT; - } - - - static void - otv_BaseScriptList_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt BaseScriptCount; - - - OTV_NAME_ENTER( "BaseScriptList" ); - - OTV_LIMIT_CHECK( 2 ); - BaseScriptCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (BaseScriptCount = %d)\n", BaseScriptCount )); - - OTV_LIMIT_CHECK( BaseScriptCount * 6 ); - - /* BaseScriptRecord */ - for ( ; BaseScriptCount > 0; BaseScriptCount-- ) - { - p += 4; /* skip BaseScriptTag */ - - /* BaseScript */ - otv_BaseScript_validate( table + FT_NEXT_USHORT( p ), otvalid ); - } - - OTV_EXIT; - } - - - static void - otv_Axis_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt table_size; - - OTV_OPTIONAL_TABLE( BaseTagList ); - - - OTV_NAME_ENTER( "Axis" ); - - OTV_LIMIT_CHECK( 4 ); - OTV_OPTIONAL_OFFSET( BaseTagList ); - - table_size = 4; - - OTV_SIZE_CHECK( BaseTagList ); - if ( BaseTagList ) - otv_BaseTagList_validate( table + BaseTagList, otvalid ); - - /* BaseScriptList */ - otv_BaseScriptList_validate( table + FT_NEXT_USHORT( p ), otvalid ); - - OTV_EXIT; - } - - - FT_LOCAL_DEF( void ) - otv_BASE_validate( FT_Bytes table, - FT_Validator ftvalid ) - { - OTV_ValidatorRec otvalidrec; - OTV_Validator otvalid = &otvalidrec; - FT_Bytes p = table; - FT_UInt table_size; - - OTV_OPTIONAL_TABLE( HorizAxis ); - OTV_OPTIONAL_TABLE( VertAxis ); - - - otvalid->root = ftvalid; - - FT_TRACE3(( "validating BASE table\n" )); - OTV_INIT; - - OTV_LIMIT_CHECK( 6 ); - - if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ - FT_INVALID_FORMAT; - - table_size = 6; - - OTV_OPTIONAL_OFFSET( HorizAxis ); - OTV_SIZE_CHECK( HorizAxis ); - if ( HorizAxis ) - otv_Axis_validate( table + HorizAxis, otvalid ); - - OTV_OPTIONAL_OFFSET( VertAxis ); - OTV_SIZE_CHECK( VertAxis ); - if ( VertAxis ) - otv_Axis_validate( table + VertAxis, otvalid ); - - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/otvalid/otvcommn.c b/3party/freetype/src/otvalid/otvcommn.c deleted file mode 100644 index 103ffba3e8..0000000000 --- a/3party/freetype/src/otvalid/otvcommn.c +++ /dev/null @@ -1,1086 +0,0 @@ -/***************************************************************************/ -/* */ -/* otvcommn.c */ -/* */ -/* OpenType common tables validation (body). */ -/* */ -/* Copyright 2004-2015 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 "otvcommn.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_otvcommon - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** COVERAGE TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - otv_Coverage_validate( FT_Bytes table, - OTV_Validator otvalid, - FT_Int expected_count ) - { - FT_Bytes p = table; - FT_UInt CoverageFormat; - FT_UInt total = 0; - - - OTV_NAME_ENTER( "Coverage" ); - - OTV_LIMIT_CHECK( 4 ); - CoverageFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", CoverageFormat )); - - switch ( CoverageFormat ) - { - case 1: /* CoverageFormat1 */ - { - FT_UInt GlyphCount; - FT_UInt i; - - - GlyphCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); - - OTV_LIMIT_CHECK( GlyphCount * 2 ); /* GlyphArray */ - - for ( i = 0; i < GlyphCount; ++i ) - { - FT_UInt gid; - - - gid = FT_NEXT_USHORT( p ); - if ( gid >= otvalid->glyph_count ) - FT_INVALID_GLYPH_ID; - } - - total = GlyphCount; - } - break; - - case 2: /* CoverageFormat2 */ - { - FT_UInt n, RangeCount; - FT_UInt Start, End, StartCoverageIndex, last = 0; - - - RangeCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (RangeCount = %d)\n", RangeCount )); - - OTV_LIMIT_CHECK( RangeCount * 6 ); - - /* RangeRecord */ - for ( n = 0; n < RangeCount; n++ ) - { - Start = FT_NEXT_USHORT( p ); - End = FT_NEXT_USHORT( p ); - StartCoverageIndex = FT_NEXT_USHORT( p ); - - if ( Start > End || StartCoverageIndex != total ) - FT_INVALID_DATA; - - if ( End >= otvalid->glyph_count ) - FT_INVALID_GLYPH_ID; - - if ( n > 0 && Start <= last ) - FT_INVALID_DATA; - - total += End - Start + 1; - last = End; - } - } - break; - - default: - FT_INVALID_FORMAT; - } - - /* Generally, a coverage table offset has an associated count field. */ - /* The number of glyphs in the table should match this field. If */ - /* there is no associated count, a value of -1 tells us not to check. */ - if ( expected_count != -1 && (FT_UInt)expected_count != total ) - FT_INVALID_DATA; - - OTV_EXIT; - } - - - FT_LOCAL_DEF( FT_UInt ) - otv_Coverage_get_first( FT_Bytes table ) - { - FT_Bytes p = table; - - - p += 4; /* skip CoverageFormat and Glyph/RangeCount */ - - return FT_NEXT_USHORT( p ); - } - - - FT_LOCAL_DEF( FT_UInt ) - otv_Coverage_get_last( FT_Bytes table ) - { - FT_Bytes p = table; - FT_UInt CoverageFormat = FT_NEXT_USHORT( p ); - FT_UInt count = FT_NEXT_USHORT( p ); /* Glyph/RangeCount */ - FT_UInt result = 0; - - - switch ( CoverageFormat ) - { - case 1: - p += ( count - 1 ) * 2; - result = FT_NEXT_USHORT( p ); - break; - - case 2: - p += ( count - 1 ) * 6 + 2; - result = FT_NEXT_USHORT( p ); - break; - - default: - ; - } - - return result; - } - - - FT_LOCAL_DEF( FT_UInt ) - otv_Coverage_get_count( FT_Bytes table ) - { - FT_Bytes p = table; - FT_UInt CoverageFormat = FT_NEXT_USHORT( p ); - FT_UInt count = FT_NEXT_USHORT( p ); /* Glyph/RangeCount */ - FT_UInt result = 0; - - - switch ( CoverageFormat ) - { - case 1: - return count; - - case 2: - { - FT_UInt Start, End; - - - for ( ; count > 0; count-- ) - { - Start = FT_NEXT_USHORT( p ); - End = FT_NEXT_USHORT( p ); - p += 2; /* skip StartCoverageIndex */ - - result += End - Start + 1; - } - } - break; - - default: - ; - } - - return result; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CLASS DEFINITION TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - otv_ClassDef_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt ClassFormat; - - - OTV_NAME_ENTER( "ClassDef" ); - - OTV_LIMIT_CHECK( 4 ); - ClassFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", ClassFormat )); - - switch ( ClassFormat ) - { - case 1: /* ClassDefFormat1 */ - { - FT_UInt StartGlyph; - FT_UInt GlyphCount; - - - OTV_LIMIT_CHECK( 4 ); - - StartGlyph = FT_NEXT_USHORT( p ); - GlyphCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); - - OTV_LIMIT_CHECK( GlyphCount * 2 ); /* ClassValueArray */ - - if ( StartGlyph + GlyphCount - 1 >= otvalid->glyph_count ) - FT_INVALID_GLYPH_ID; - } - break; - - case 2: /* ClassDefFormat2 */ - { - FT_UInt n, ClassRangeCount; - FT_UInt Start, End, last = 0; - - - ClassRangeCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (ClassRangeCount = %d)\n", ClassRangeCount )); - - OTV_LIMIT_CHECK( ClassRangeCount * 6 ); - - /* ClassRangeRecord */ - for ( n = 0; n < ClassRangeCount; n++ ) - { - Start = FT_NEXT_USHORT( p ); - End = FT_NEXT_USHORT( p ); - p += 2; /* skip Class */ - - if ( Start > End || ( n > 0 && Start <= last ) ) - FT_INVALID_DATA; - - if ( End >= otvalid->glyph_count ) - FT_INVALID_GLYPH_ID; - - last = End; - } - } - break; - - default: - FT_INVALID_FORMAT; - } - - /* no need to check glyph indices used as input to class definition */ - /* tables since even invalid glyph indices return a meaningful result */ - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** DEVICE TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - otv_Device_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt StartSize, EndSize, DeltaFormat, count; - - - OTV_NAME_ENTER( "Device" ); - - OTV_LIMIT_CHECK( 8 ); - StartSize = FT_NEXT_USHORT( p ); - EndSize = FT_NEXT_USHORT( p ); - DeltaFormat = FT_NEXT_USHORT( p ); - - if ( DeltaFormat < 1 || DeltaFormat > 3 ) - FT_INVALID_FORMAT; - - if ( EndSize < StartSize ) - FT_INVALID_DATA; - - count = EndSize - StartSize + 1; - OTV_LIMIT_CHECK( ( 1 << DeltaFormat ) * count / 8 ); /* DeltaValue */ - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** LOOKUPS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* uses otvalid->type_count */ - /* uses otvalid->type_funcs */ - - FT_LOCAL_DEF( void ) - otv_Lookup_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt LookupType, SubTableCount; - OTV_Validate_Func validate; - - - OTV_NAME_ENTER( "Lookup" ); - - OTV_LIMIT_CHECK( 6 ); - LookupType = FT_NEXT_USHORT( p ); - p += 2; /* skip LookupFlag */ - SubTableCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (type %d)\n", LookupType )); - - if ( LookupType == 0 || LookupType > otvalid->type_count ) - FT_INVALID_DATA; - - validate = otvalid->type_funcs[LookupType - 1]; - - OTV_TRACE(( " (SubTableCount = %d)\n", SubTableCount )); - - OTV_LIMIT_CHECK( SubTableCount * 2 ); - - /* SubTable */ - for ( ; SubTableCount > 0; SubTableCount-- ) - validate( table + FT_NEXT_USHORT( p ), otvalid ); - - OTV_EXIT; - } - - - /* uses valid->lookup_count */ - - FT_LOCAL_DEF( void ) - otv_LookupList_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt LookupCount; - - - OTV_NAME_ENTER( "LookupList" ); - - OTV_LIMIT_CHECK( 2 ); - LookupCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (LookupCount = %d)\n", LookupCount )); - - OTV_LIMIT_CHECK( LookupCount * 2 ); - - otvalid->lookup_count = LookupCount; - - /* Lookup */ - for ( ; LookupCount > 0; LookupCount-- ) - otv_Lookup_validate( table + FT_NEXT_USHORT( p ), otvalid ); - - OTV_EXIT; - } - - - static FT_UInt - otv_LookupList_get_count( FT_Bytes table ) - { - return FT_NEXT_USHORT( table ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FEATURES *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* uses otvalid->lookup_count */ - - FT_LOCAL_DEF( void ) - otv_Feature_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt LookupCount; - - - OTV_NAME_ENTER( "Feature" ); - - OTV_LIMIT_CHECK( 4 ); - p += 2; /* skip FeatureParams (unused) */ - LookupCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (LookupCount = %d)\n", LookupCount )); - - OTV_LIMIT_CHECK( LookupCount * 2 ); - - /* LookupListIndex */ - for ( ; LookupCount > 0; LookupCount-- ) - if ( FT_NEXT_USHORT( p ) >= otvalid->lookup_count ) - FT_INVALID_DATA; - - OTV_EXIT; - } - - - static FT_UInt - otv_Feature_get_count( FT_Bytes table ) - { - return FT_NEXT_USHORT( table ); - } - - - /* sets otvalid->lookup_count */ - - FT_LOCAL_DEF( void ) - otv_FeatureList_validate( FT_Bytes table, - FT_Bytes lookups, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt FeatureCount; - - - OTV_NAME_ENTER( "FeatureList" ); - - OTV_LIMIT_CHECK( 2 ); - FeatureCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (FeatureCount = %d)\n", FeatureCount )); - - OTV_LIMIT_CHECK( FeatureCount * 2 ); - - otvalid->lookup_count = otv_LookupList_get_count( lookups ); - - /* FeatureRecord */ - for ( ; FeatureCount > 0; FeatureCount-- ) - { - p += 4; /* skip FeatureTag */ - - /* Feature */ - otv_Feature_validate( table + FT_NEXT_USHORT( p ), otvalid ); - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** LANGUAGE SYSTEM *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* uses otvalid->extra1 (number of features) */ - - FT_LOCAL_DEF( void ) - otv_LangSys_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt ReqFeatureIndex; - FT_UInt FeatureCount; - - - OTV_NAME_ENTER( "LangSys" ); - - OTV_LIMIT_CHECK( 6 ); - p += 2; /* skip LookupOrder (unused) */ - ReqFeatureIndex = FT_NEXT_USHORT( p ); - FeatureCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (ReqFeatureIndex = %d)\n", ReqFeatureIndex )); - OTV_TRACE(( " (FeatureCount = %d)\n", FeatureCount )); - - if ( ReqFeatureIndex != 0xFFFFU && ReqFeatureIndex >= otvalid->extra1 ) - FT_INVALID_DATA; - - OTV_LIMIT_CHECK( FeatureCount * 2 ); - - /* FeatureIndex */ - for ( ; FeatureCount > 0; FeatureCount-- ) - if ( FT_NEXT_USHORT( p ) >= otvalid->extra1 ) - FT_INVALID_DATA; - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** SCRIPTS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - otv_Script_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_UInt DefaultLangSys, LangSysCount; - FT_Bytes p = table; - - - OTV_NAME_ENTER( "Script" ); - - OTV_LIMIT_CHECK( 4 ); - DefaultLangSys = FT_NEXT_USHORT( p ); - LangSysCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (LangSysCount = %d)\n", LangSysCount )); - - if ( DefaultLangSys != 0 ) - otv_LangSys_validate( table + DefaultLangSys, otvalid ); - - OTV_LIMIT_CHECK( LangSysCount * 6 ); - - /* LangSysRecord */ - for ( ; LangSysCount > 0; LangSysCount-- ) - { - p += 4; /* skip LangSysTag */ - - /* LangSys */ - otv_LangSys_validate( table + FT_NEXT_USHORT( p ), otvalid ); - } - - OTV_EXIT; - } - - - /* sets otvalid->extra1 (number of features) */ - - FT_LOCAL_DEF( void ) - otv_ScriptList_validate( FT_Bytes table, - FT_Bytes features, - OTV_Validator otvalid ) - { - FT_UInt ScriptCount; - FT_Bytes p = table; - - - OTV_NAME_ENTER( "ScriptList" ); - - OTV_LIMIT_CHECK( 2 ); - ScriptCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (ScriptCount = %d)\n", ScriptCount )); - - OTV_LIMIT_CHECK( ScriptCount * 6 ); - - otvalid->extra1 = otv_Feature_get_count( features ); - - /* ScriptRecord */ - for ( ; ScriptCount > 0; ScriptCount-- ) - { - p += 4; /* skip ScriptTag */ - - otv_Script_validate( table + FT_NEXT_USHORT( p ), otvalid ); /* Script */ - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** UTILITY FUNCTIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - u: uint16 - ux: unit16 [x] - - s: struct - sx: struct [x] - sxy: struct [x], using external y count - - x: uint16 x - - C: Coverage - - O: Offset - On: Offset (NULL) - Ox: Offset [x] - Onx: Offset (NULL) [x] - */ - - FT_LOCAL_DEF( void ) - otv_x_Ox( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt Count; - OTV_Validate_Func func; - - - OTV_ENTER; - - OTV_LIMIT_CHECK( 2 ); - Count = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (Count = %d)\n", Count )); - - OTV_LIMIT_CHECK( Count * 2 ); - - otvalid->nesting_level++; - func = otvalid->func[otvalid->nesting_level]; - - for ( ; Count > 0; Count-- ) - func( table + FT_NEXT_USHORT( p ), otvalid ); - - otvalid->nesting_level--; - - OTV_EXIT; - } - - - FT_LOCAL_DEF( void ) - otv_u_C_x_Ox( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt Count, Coverage; - OTV_Validate_Func func; - - - OTV_ENTER; - - p += 2; /* skip Format */ - - OTV_LIMIT_CHECK( 4 ); - Coverage = FT_NEXT_USHORT( p ); - Count = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (Count = %d)\n", Count )); - - otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)Count ); - - OTV_LIMIT_CHECK( Count * 2 ); - - otvalid->nesting_level++; - func = otvalid->func[otvalid->nesting_level]; - - for ( ; Count > 0; Count-- ) - func( table + FT_NEXT_USHORT( p ), otvalid ); - - otvalid->nesting_level--; - - OTV_EXIT; - } - - - /* uses otvalid->extra1 (if > 0: array value limit) */ - - FT_LOCAL_DEF( void ) - otv_x_ux( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt Count; - - - OTV_ENTER; - - OTV_LIMIT_CHECK( 2 ); - Count = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (Count = %d)\n", Count )); - - OTV_LIMIT_CHECK( Count * 2 ); - - if ( otvalid->extra1 ) - { - for ( ; Count > 0; Count-- ) - if ( FT_NEXT_USHORT( p ) >= otvalid->extra1 ) - FT_INVALID_DATA; - } - - OTV_EXIT; - } - - - /* `ux' in the function's name is not really correct since only x-1 */ - /* elements are tested */ - - /* uses otvalid->extra1 (array value limit) */ - - FT_LOCAL_DEF( void ) - otv_x_y_ux_sy( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt Count1, Count2; - - - OTV_ENTER; - - OTV_LIMIT_CHECK( 4 ); - Count1 = FT_NEXT_USHORT( p ); - Count2 = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (Count1 = %d)\n", Count1 )); - OTV_TRACE(( " (Count2 = %d)\n", Count2 )); - - if ( Count1 == 0 ) - FT_INVALID_DATA; - - OTV_LIMIT_CHECK( ( Count1 - 1 ) * 2 + Count2 * 4 ); - p += ( Count1 - 1 ) * 2; - - for ( ; Count2 > 0; Count2-- ) - { - if ( FT_NEXT_USHORT( p ) >= Count1 ) - FT_INVALID_DATA; - - if ( FT_NEXT_USHORT( p ) >= otvalid->extra1 ) - FT_INVALID_DATA; - } - - OTV_EXIT; - } - - - /* `uy' in the function's name is not really correct since only y-1 */ - /* elements are tested */ - - /* uses otvalid->extra1 (array value limit) */ - - FT_LOCAL_DEF( void ) - otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt BacktrackCount, InputCount, LookaheadCount; - FT_UInt Count; - - - OTV_ENTER; - - OTV_LIMIT_CHECK( 2 ); - BacktrackCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (BacktrackCount = %d)\n", BacktrackCount )); - - OTV_LIMIT_CHECK( BacktrackCount * 2 + 2 ); - p += BacktrackCount * 2; - - InputCount = FT_NEXT_USHORT( p ); - if ( InputCount == 0 ) - FT_INVALID_DATA; - - OTV_TRACE(( " (InputCount = %d)\n", InputCount )); - - OTV_LIMIT_CHECK( InputCount * 2 ); - p += ( InputCount - 1 ) * 2; - - LookaheadCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (LookaheadCount = %d)\n", LookaheadCount )); - - OTV_LIMIT_CHECK( LookaheadCount * 2 + 2 ); - p += LookaheadCount * 2; - - Count = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (Count = %d)\n", Count )); - - OTV_LIMIT_CHECK( Count * 4 ); - - for ( ; Count > 0; Count-- ) - { - if ( FT_NEXT_USHORT( p ) >= InputCount ) - FT_INVALID_DATA; - - if ( FT_NEXT_USHORT( p ) >= otvalid->extra1 ) - FT_INVALID_DATA; - } - - OTV_EXIT; - } - - - /* sets otvalid->extra1 (valid->lookup_count) */ - - FT_LOCAL_DEF( void ) - otv_u_O_O_x_Onx( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt Coverage, ClassDef, ClassSetCount; - OTV_Validate_Func func; - - - OTV_ENTER; - - p += 2; /* skip Format */ - - OTV_LIMIT_CHECK( 6 ); - Coverage = FT_NEXT_USHORT( p ); - ClassDef = FT_NEXT_USHORT( p ); - ClassSetCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (ClassSetCount = %d)\n", ClassSetCount )); - - otv_Coverage_validate( table + Coverage, otvalid, -1 ); - otv_ClassDef_validate( table + ClassDef, otvalid ); - - OTV_LIMIT_CHECK( ClassSetCount * 2 ); - - otvalid->nesting_level++; - func = otvalid->func[otvalid->nesting_level]; - otvalid->extra1 = otvalid->lookup_count; - - for ( ; ClassSetCount > 0; ClassSetCount-- ) - { - FT_UInt offset = FT_NEXT_USHORT( p ); - - - if ( offset ) - func( table + offset, otvalid ); - } - - otvalid->nesting_level--; - - OTV_EXIT; - } - - - /* uses otvalid->lookup_count */ - - FT_LOCAL_DEF( void ) - otv_u_x_y_Ox_sy( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt GlyphCount, Count, count1; - - - OTV_ENTER; - - p += 2; /* skip Format */ - - OTV_LIMIT_CHECK( 4 ); - GlyphCount = FT_NEXT_USHORT( p ); - Count = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); - OTV_TRACE(( " (Count = %d)\n", Count )); - - OTV_LIMIT_CHECK( GlyphCount * 2 + Count * 4 ); - - for ( count1 = GlyphCount; count1 > 0; count1-- ) - otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 ); - - for ( ; Count > 0; Count-- ) - { - if ( FT_NEXT_USHORT( p ) >= GlyphCount ) - FT_INVALID_DATA; - - if ( FT_NEXT_USHORT( p ) >= otvalid->lookup_count ) - FT_INVALID_DATA; - } - - OTV_EXIT; - } - - - /* sets otvalid->extra1 (valid->lookup_count) */ - - FT_LOCAL_DEF( void ) - otv_u_O_O_O_O_x_Onx( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt Coverage; - FT_UInt BacktrackClassDef, InputClassDef, LookaheadClassDef; - FT_UInt ChainClassSetCount; - OTV_Validate_Func func; - - - OTV_ENTER; - - p += 2; /* skip Format */ - - OTV_LIMIT_CHECK( 10 ); - Coverage = FT_NEXT_USHORT( p ); - BacktrackClassDef = FT_NEXT_USHORT( p ); - InputClassDef = FT_NEXT_USHORT( p ); - LookaheadClassDef = FT_NEXT_USHORT( p ); - ChainClassSetCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (ChainClassSetCount = %d)\n", ChainClassSetCount )); - - otv_Coverage_validate( table + Coverage, otvalid, -1 ); - - otv_ClassDef_validate( table + BacktrackClassDef, otvalid ); - otv_ClassDef_validate( table + InputClassDef, otvalid ); - otv_ClassDef_validate( table + LookaheadClassDef, otvalid ); - - OTV_LIMIT_CHECK( ChainClassSetCount * 2 ); - - otvalid->nesting_level++; - func = otvalid->func[otvalid->nesting_level]; - otvalid->extra1 = otvalid->lookup_count; - - for ( ; ChainClassSetCount > 0; ChainClassSetCount-- ) - { - FT_UInt offset = FT_NEXT_USHORT( p ); - - - if ( offset ) - func( table + offset, otvalid ); - } - - otvalid->nesting_level--; - - OTV_EXIT; - } - - - /* uses otvalid->lookup_count */ - - FT_LOCAL_DEF( void ) - otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt BacktrackGlyphCount, InputGlyphCount, LookaheadGlyphCount; - FT_UInt count1, count2; - - - OTV_ENTER; - - p += 2; /* skip Format */ - - OTV_LIMIT_CHECK( 2 ); - BacktrackGlyphCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (BacktrackGlyphCount = %d)\n", BacktrackGlyphCount )); - - OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 ); - - for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- ) - otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 ); - - InputGlyphCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (InputGlyphCount = %d)\n", InputGlyphCount )); - - OTV_LIMIT_CHECK( InputGlyphCount * 2 + 2 ); - - for ( count1 = InputGlyphCount; count1 > 0; count1-- ) - otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 ); - - LookaheadGlyphCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (LookaheadGlyphCount = %d)\n", LookaheadGlyphCount )); - - OTV_LIMIT_CHECK( LookaheadGlyphCount * 2 + 2 ); - - for ( ; LookaheadGlyphCount > 0; LookaheadGlyphCount-- ) - otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 ); - - count2 = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (Count = %d)\n", count2 )); - - OTV_LIMIT_CHECK( count2 * 4 ); - - for ( ; count2 > 0; count2-- ) - { - if ( FT_NEXT_USHORT( p ) >= InputGlyphCount ) - FT_INVALID_DATA; - - if ( FT_NEXT_USHORT( p ) >= otvalid->lookup_count ) - FT_INVALID_DATA; - } - - OTV_EXIT; - } - - - FT_LOCAL_DEF( FT_UInt ) - otv_GSUBGPOS_get_Lookup_count( FT_Bytes table ) - { - FT_Bytes p = table + 8; - - - return otv_LookupList_get_count( table + FT_NEXT_USHORT( p ) ); - } - - - FT_LOCAL_DEF( FT_UInt ) - otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table ) - { - FT_Bytes p, lookup; - FT_UInt count; - - - if ( !table ) - return 0; - - /* LookupList */ - p = table + 8; - table += FT_NEXT_USHORT( p ); - - /* LookupCount */ - p = table; - count = FT_NEXT_USHORT( p ); - - for ( ; count > 0; count-- ) - { - FT_Bytes oldp; - - - /* Lookup */ - lookup = table + FT_NEXT_USHORT( p ); - - oldp = p; - - /* LookupFlag */ - p = lookup + 2; - if ( FT_NEXT_USHORT( p ) & 0xFF00U ) - return 1; - - p = oldp; - } - - return 0; - } - - -/* END */ diff --git a/3party/freetype/src/otvalid/otvcommn.h b/3party/freetype/src/otvalid/otvcommn.h deleted file mode 100644 index 3aebf0200d..0000000000 --- a/3party/freetype/src/otvalid/otvcommn.h +++ /dev/null @@ -1,437 +0,0 @@ -/***************************************************************************/ -/* */ -/* otvcommn.h */ -/* */ -/* OpenType common tables validation (specification). */ -/* */ -/* Copyright 2004-2015 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 __OTVCOMMN_H__ -#define __OTVCOMMN_H__ - - -#include <ft2build.h> -#include "otvalid.h" -#include FT_INTERNAL_DEBUG_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** VALIDATION *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct OTV_ValidatorRec_* OTV_Validator; - - typedef void (*OTV_Validate_Func)( FT_Bytes table, - OTV_Validator otvalid ); - - typedef struct OTV_ValidatorRec_ - { - FT_Validator root; - FT_UInt type_count; - OTV_Validate_Func* type_funcs; - - FT_UInt lookup_count; - FT_UInt glyph_count; - - FT_UInt nesting_level; - - OTV_Validate_Func func[3]; - - FT_UInt extra1; /* for passing parameters */ - FT_UInt extra2; - FT_Bytes extra3; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_UInt debug_indent; - const FT_String* debug_function_name[3]; -#endif - - } OTV_ValidatorRec; - - -#undef FT_INVALID_ -#define FT_INVALID_( _error ) \ - ft_validator_error( otvalid->root, FT_THROW( _error ) ) - -#define OTV_OPTIONAL_TABLE( _table ) FT_UShort _table; \ - FT_Bytes _table ## _p - -#define OTV_OPTIONAL_OFFSET( _offset ) \ - FT_BEGIN_STMNT \ - _offset ## _p = p; \ - _offset = FT_NEXT_USHORT( p ); \ - FT_END_STMNT - -#define OTV_LIMIT_CHECK( _count ) \ - FT_BEGIN_STMNT \ - if ( p + (_count) > otvalid->root->limit ) \ - FT_INVALID_TOO_SHORT; \ - FT_END_STMNT - -#define OTV_SIZE_CHECK( _size ) \ - FT_BEGIN_STMNT \ - if ( _size > 0 && _size < table_size ) \ - { \ - if ( otvalid->root->level == FT_VALIDATE_PARANOID ) \ - FT_INVALID_OFFSET; \ - else \ - { \ - /* strip off `const' */ \ - FT_Byte* pp = (FT_Byte*)_size ## _p; \ - \ - \ - FT_TRACE3(( "\n" \ - "Invalid offset to optional table `%s'" \ - " set to zero.\n" \ - "\n", #_size )); \ - \ - /* always assume 16bit entities */ \ - _size = pp[0] = pp[1] = 0; \ - } \ - } \ - FT_END_STMNT - - -#define OTV_NAME_(x) #x -#define OTV_NAME(x) OTV_NAME_(x) - -#define OTV_FUNC_(x) x##Func -#define OTV_FUNC(x) OTV_FUNC_(x) - -#ifdef FT_DEBUG_LEVEL_TRACE - -#define OTV_NEST1( x ) \ - FT_BEGIN_STMNT \ - otvalid->nesting_level = 0; \ - otvalid->func[0] = OTV_FUNC( x ); \ - otvalid->debug_function_name[0] = OTV_NAME( x ); \ - FT_END_STMNT - -#define OTV_NEST2( x, y ) \ - FT_BEGIN_STMNT \ - otvalid->nesting_level = 0; \ - otvalid->func[0] = OTV_FUNC( x ); \ - otvalid->func[1] = OTV_FUNC( y ); \ - otvalid->debug_function_name[0] = OTV_NAME( x ); \ - otvalid->debug_function_name[1] = OTV_NAME( y ); \ - FT_END_STMNT - -#define OTV_NEST3( x, y, z ) \ - FT_BEGIN_STMNT \ - otvalid->nesting_level = 0; \ - otvalid->func[0] = OTV_FUNC( x ); \ - otvalid->func[1] = OTV_FUNC( y ); \ - otvalid->func[2] = OTV_FUNC( z ); \ - otvalid->debug_function_name[0] = OTV_NAME( x ); \ - otvalid->debug_function_name[1] = OTV_NAME( y ); \ - otvalid->debug_function_name[2] = OTV_NAME( z ); \ - FT_END_STMNT - -#define OTV_INIT otvalid->debug_indent = 0 - -#define OTV_ENTER \ - FT_BEGIN_STMNT \ - otvalid->debug_indent += 2; \ - FT_TRACE4(( "%*.s", otvalid->debug_indent, 0 )); \ - FT_TRACE4(( "%s table\n", \ - otvalid->debug_function_name[otvalid->nesting_level] )); \ - FT_END_STMNT - -#define OTV_NAME_ENTER( name ) \ - FT_BEGIN_STMNT \ - otvalid->debug_indent += 2; \ - FT_TRACE4(( "%*.s", otvalid->debug_indent, 0 )); \ - FT_TRACE4(( "%s table\n", name )); \ - FT_END_STMNT - -#define OTV_EXIT otvalid->debug_indent -= 2 - -#define OTV_TRACE( s ) \ - FT_BEGIN_STMNT \ - FT_TRACE4(( "%*.s", otvalid->debug_indent, 0 )); \ - FT_TRACE4( s ); \ - FT_END_STMNT - -#else /* !FT_DEBUG_LEVEL_TRACE */ - -#define OTV_NEST1( x ) \ - FT_BEGIN_STMNT \ - otvalid->nesting_level = 0; \ - otvalid->func[0] = OTV_FUNC( x ); \ - FT_END_STMNT - -#define OTV_NEST2( x, y ) \ - FT_BEGIN_STMNT \ - otvalid->nesting_level = 0; \ - otvalid->func[0] = OTV_FUNC( x ); \ - otvalid->func[1] = OTV_FUNC( y ); \ - FT_END_STMNT - -#define OTV_NEST3( x, y, z ) \ - FT_BEGIN_STMNT \ - otvalid->nesting_level = 0; \ - otvalid->func[0] = OTV_FUNC( x ); \ - otvalid->func[1] = OTV_FUNC( y ); \ - otvalid->func[2] = OTV_FUNC( z ); \ - FT_END_STMNT - -#define OTV_INIT do { } while ( 0 ) -#define OTV_ENTER do { } while ( 0 ) -#define OTV_NAME_ENTER( name ) do { } while ( 0 ) -#define OTV_EXIT do { } while ( 0 ) - -#define OTV_TRACE( s ) do { } while ( 0 ) - -#endif /* !FT_DEBUG_LEVEL_TRACE */ - - -#define OTV_RUN otvalid->func[0] - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** COVERAGE TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - otv_Coverage_validate( FT_Bytes table, - OTV_Validator otvalid, - FT_Int expected_count ); - - /* return first covered glyph */ - FT_LOCAL( FT_UInt ) - otv_Coverage_get_first( FT_Bytes table ); - - /* return last covered glyph */ - FT_LOCAL( FT_UInt ) - otv_Coverage_get_last( FT_Bytes table ); - - /* return number of covered glyphs */ - FT_LOCAL( FT_UInt ) - otv_Coverage_get_count( FT_Bytes table ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CLASS DEFINITION TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - otv_ClassDef_validate( FT_Bytes table, - OTV_Validator otvalid ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** DEVICE TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - otv_Device_validate( FT_Bytes table, - OTV_Validator otvalid ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** LOOKUPS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - otv_Lookup_validate( FT_Bytes table, - OTV_Validator otvalid ); - - FT_LOCAL( void ) - otv_LookupList_validate( FT_Bytes table, - OTV_Validator otvalid ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FEATURES *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - otv_Feature_validate( FT_Bytes table, - OTV_Validator otvalid ); - - /* lookups must already be validated */ - FT_LOCAL( void ) - otv_FeatureList_validate( FT_Bytes table, - FT_Bytes lookups, - OTV_Validator otvalid ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** LANGUAGE SYSTEM *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - otv_LangSys_validate( FT_Bytes table, - OTV_Validator otvalid ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** SCRIPTS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - otv_Script_validate( FT_Bytes table, - OTV_Validator otvalid ); - - /* features must already be validated */ - FT_LOCAL( void ) - otv_ScriptList_validate( FT_Bytes table, - FT_Bytes features, - OTV_Validator otvalid ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** UTILITY FUNCTIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define ChainPosClassSetFunc otv_x_Ox -#define ChainPosRuleSetFunc otv_x_Ox -#define ChainSubClassSetFunc otv_x_Ox -#define ChainSubRuleSetFunc otv_x_Ox -#define JstfLangSysFunc otv_x_Ox -#define JstfMaxFunc otv_x_Ox -#define LigGlyphFunc otv_x_Ox -#define LigatureArrayFunc otv_x_Ox -#define LigatureSetFunc otv_x_Ox -#define PosClassSetFunc otv_x_Ox -#define PosRuleSetFunc otv_x_Ox -#define SubClassSetFunc otv_x_Ox -#define SubRuleSetFunc otv_x_Ox - - FT_LOCAL( void ) - otv_x_Ox ( FT_Bytes table, - OTV_Validator otvalid ); - -#define AlternateSubstFormat1Func otv_u_C_x_Ox -#define ChainContextPosFormat1Func otv_u_C_x_Ox -#define ChainContextSubstFormat1Func otv_u_C_x_Ox -#define ContextPosFormat1Func otv_u_C_x_Ox -#define ContextSubstFormat1Func otv_u_C_x_Ox -#define LigatureSubstFormat1Func otv_u_C_x_Ox -#define MultipleSubstFormat1Func otv_u_C_x_Ox - - FT_LOCAL( void ) - otv_u_C_x_Ox( FT_Bytes table, - OTV_Validator otvalid ); - -#define AlternateSetFunc otv_x_ux -#define AttachPointFunc otv_x_ux -#define ExtenderGlyphFunc otv_x_ux -#define JstfGPOSModListFunc otv_x_ux -#define JstfGSUBModListFunc otv_x_ux -#define SequenceFunc otv_x_ux - - FT_LOCAL( void ) - otv_x_ux( FT_Bytes table, - OTV_Validator otvalid ); - -#define PosClassRuleFunc otv_x_y_ux_sy -#define PosRuleFunc otv_x_y_ux_sy -#define SubClassRuleFunc otv_x_y_ux_sy -#define SubRuleFunc otv_x_y_ux_sy - - FT_LOCAL( void ) - otv_x_y_ux_sy( FT_Bytes table, - OTV_Validator otvalid ); - -#define ChainPosClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp -#define ChainPosRuleFunc otv_x_ux_y_uy_z_uz_p_sp -#define ChainSubClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp -#define ChainSubRuleFunc otv_x_ux_y_uy_z_uz_p_sp - - FT_LOCAL( void ) - otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table, - OTV_Validator otvalid ); - -#define ContextPosFormat2Func otv_u_O_O_x_Onx -#define ContextSubstFormat2Func otv_u_O_O_x_Onx - - FT_LOCAL( void ) - otv_u_O_O_x_Onx( FT_Bytes table, - OTV_Validator otvalid ); - -#define ContextPosFormat3Func otv_u_x_y_Ox_sy -#define ContextSubstFormat3Func otv_u_x_y_Ox_sy - - FT_LOCAL( void ) - otv_u_x_y_Ox_sy( FT_Bytes table, - OTV_Validator otvalid ); - -#define ChainContextPosFormat2Func otv_u_O_O_O_O_x_Onx -#define ChainContextSubstFormat2Func otv_u_O_O_O_O_x_Onx - - FT_LOCAL( void ) - otv_u_O_O_O_O_x_Onx( FT_Bytes table, - OTV_Validator otvalid ); - -#define ChainContextPosFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp -#define ChainContextSubstFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp - - FT_LOCAL( void ) - otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table, - OTV_Validator otvalid ); - - - FT_LOCAL( FT_UInt ) - otv_GSUBGPOS_get_Lookup_count( FT_Bytes table ); - - FT_LOCAL( FT_UInt ) - otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table ); - - /* */ - -FT_END_HEADER - -#endif /* __OTVCOMMN_H__ */ - - -/* END */ diff --git a/3party/freetype/src/otvalid/otverror.h b/3party/freetype/src/otvalid/otverror.h deleted file mode 100644 index 214795e170..0000000000 --- a/3party/freetype/src/otvalid/otverror.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************/ -/* */ -/* otverror.h */ -/* */ -/* OpenType validation module error codes (specification only). */ -/* */ -/* Copyright 2004-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the OpenType validation module error */ - /* enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __OTVERROR_H__ -#define __OTVERROR_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX OTV_Err_ -#define FT_ERR_BASE FT_Mod_Err_OTvalid - -#include FT_ERRORS_H - -#endif /* __OTVERROR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/otvalid/otvgdef.c b/3party/freetype/src/otvalid/otvgdef.c deleted file mode 100644 index 8269d2f5b8..0000000000 --- a/3party/freetype/src/otvalid/otvgdef.c +++ /dev/null @@ -1,224 +0,0 @@ -/***************************************************************************/ -/* */ -/* otvgdef.c */ -/* */ -/* OpenType GDEF table validation (body). */ -/* */ -/* Copyright 2004-2015 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 "otvalid.h" -#include "otvcommn.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_otvgdef - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** UTILITY FUNCTIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define AttachListFunc otv_O_x_Ox -#define LigCaretListFunc otv_O_x_Ox - - /* sets valid->extra1 (0) */ - - static void - otv_O_x_Ox( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_Bytes Coverage; - FT_UInt GlyphCount; - OTV_Validate_Func func; - - - OTV_ENTER; - - OTV_LIMIT_CHECK( 4 ); - Coverage = table + FT_NEXT_USHORT( p ); - GlyphCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); - - otv_Coverage_validate( Coverage, otvalid, (FT_Int)GlyphCount ); - if ( GlyphCount != otv_Coverage_get_count( Coverage ) ) - FT_INVALID_DATA; - - OTV_LIMIT_CHECK( GlyphCount * 2 ); - - otvalid->nesting_level++; - func = otvalid->func[otvalid->nesting_level]; - otvalid->extra1 = 0; - - for ( ; GlyphCount > 0; GlyphCount-- ) - func( table + FT_NEXT_USHORT( p ), otvalid ); - - otvalid->nesting_level--; - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** LIGATURE CARETS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define CaretValueFunc otv_CaretValue_validate - - static void - otv_CaretValue_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt CaretValueFormat; - - - OTV_ENTER; - - OTV_LIMIT_CHECK( 4 ); - - CaretValueFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format = %d)\n", CaretValueFormat )); - - switch ( CaretValueFormat ) - { - case 1: /* CaretValueFormat1 */ - /* skip Coordinate, no test */ - break; - - case 2: /* CaretValueFormat2 */ - /* skip CaretValuePoint, no test */ - break; - - case 3: /* CaretValueFormat3 */ - p += 2; /* skip Coordinate */ - - OTV_LIMIT_CHECK( 2 ); - - /* DeviceTable */ - otv_Device_validate( table + FT_NEXT_USHORT( p ), otvalid ); - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GDEF TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* sets otvalid->glyph_count */ - - FT_LOCAL_DEF( void ) - otv_GDEF_validate( FT_Bytes table, - FT_Bytes gsub, - FT_Bytes gpos, - FT_UInt glyph_count, - FT_Validator ftvalid ) - { - OTV_ValidatorRec otvalidrec; - OTV_Validator otvalid = &otvalidrec; - FT_Bytes p = table; - FT_UInt table_size; - FT_Bool need_MarkAttachClassDef; - - OTV_OPTIONAL_TABLE( GlyphClassDef ); - OTV_OPTIONAL_TABLE( AttachListOffset ); - OTV_OPTIONAL_TABLE( LigCaretListOffset ); - OTV_OPTIONAL_TABLE( MarkAttachClassDef ); - - - otvalid->root = ftvalid; - - FT_TRACE3(( "validating GDEF table\n" )); - OTV_INIT; - - OTV_LIMIT_CHECK( 12 ); - - if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ - FT_INVALID_FORMAT; - - /* MarkAttachClassDef has been added to the OpenType */ - /* specification without increasing GDEF's version, */ - /* so we use this ugly hack to find out whether the */ - /* table is needed actually. */ - - need_MarkAttachClassDef = FT_BOOL( - otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) || - otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) ); - - if ( need_MarkAttachClassDef ) - table_size = 12; /* OpenType >= 1.2 */ - else - table_size = 10; /* OpenType < 1.2 */ - - otvalid->glyph_count = glyph_count; - - OTV_OPTIONAL_OFFSET( GlyphClassDef ); - OTV_SIZE_CHECK( GlyphClassDef ); - if ( GlyphClassDef ) - otv_ClassDef_validate( table + GlyphClassDef, otvalid ); - - OTV_OPTIONAL_OFFSET( AttachListOffset ); - OTV_SIZE_CHECK( AttachListOffset ); - if ( AttachListOffset ) - { - OTV_NEST2( AttachList, AttachPoint ); - OTV_RUN( table + AttachListOffset, otvalid ); - } - - OTV_OPTIONAL_OFFSET( LigCaretListOffset ); - OTV_SIZE_CHECK( LigCaretListOffset ); - if ( LigCaretListOffset ) - { - OTV_NEST3( LigCaretList, LigGlyph, CaretValue ); - OTV_RUN( table + LigCaretListOffset, otvalid ); - } - - if ( need_MarkAttachClassDef ) - { - OTV_OPTIONAL_OFFSET( MarkAttachClassDef ); - OTV_SIZE_CHECK( MarkAttachClassDef ); - if ( MarkAttachClassDef ) - otv_ClassDef_validate( table + MarkAttachClassDef, otvalid ); - } - - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/otvalid/otvgpos.c b/3party/freetype/src/otvalid/otvgpos.c deleted file mode 100644 index 44c43c53a1..0000000000 --- a/3party/freetype/src/otvalid/otvgpos.c +++ /dev/null @@ -1,1021 +0,0 @@ -/***************************************************************************/ -/* */ -/* otvgpos.c */ -/* */ -/* OpenType GPOS table validation (body). */ -/* */ -/* Copyright 2002-2015 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 "otvalid.h" -#include "otvcommn.h" -#include "otvgpos.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_otvgpos - - - static void - otv_Anchor_validate( FT_Bytes table, - OTV_Validator valid ); - - static void - otv_MarkArray_validate( FT_Bytes table, - OTV_Validator valid ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** UTILITY FUNCTIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define BaseArrayFunc otv_x_sxy -#define LigatureAttachFunc otv_x_sxy -#define Mark2ArrayFunc otv_x_sxy - - /* uses valid->extra1 (counter) */ - /* uses valid->extra2 (boolean to handle NULL anchor field) */ - - static void - otv_x_sxy( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt Count, count1, table_size; - - - OTV_ENTER; - - OTV_LIMIT_CHECK( 2 ); - - Count = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (Count = %d)\n", Count )); - - OTV_LIMIT_CHECK( Count * otvalid->extra1 * 2 ); - - table_size = Count * otvalid->extra1 * 2 + 2; - - for ( ; Count > 0; Count-- ) - for ( count1 = otvalid->extra1; count1 > 0; count1-- ) - { - OTV_OPTIONAL_TABLE( anchor_offset ); - - - OTV_OPTIONAL_OFFSET( anchor_offset ); - - if ( otvalid->extra2 ) - { - OTV_SIZE_CHECK( anchor_offset ); - if ( anchor_offset ) - otv_Anchor_validate( table + anchor_offset, otvalid ); - } - else - otv_Anchor_validate( table + anchor_offset, otvalid ); - } - - OTV_EXIT; - } - - -#define MarkBasePosFormat1Func otv_u_O_O_u_O_O -#define MarkLigPosFormat1Func otv_u_O_O_u_O_O -#define MarkMarkPosFormat1Func otv_u_O_O_u_O_O - - /* sets otvalid->extra1 (class count) */ - - static void - otv_u_O_O_u_O_O( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt Coverage1, Coverage2, ClassCount; - FT_UInt Array1, Array2; - OTV_Validate_Func func; - - - OTV_ENTER; - - p += 2; /* skip PosFormat */ - - OTV_LIMIT_CHECK( 10 ); - Coverage1 = FT_NEXT_USHORT( p ); - Coverage2 = FT_NEXT_USHORT( p ); - ClassCount = FT_NEXT_USHORT( p ); - Array1 = FT_NEXT_USHORT( p ); - Array2 = FT_NEXT_USHORT( p ); - - otv_Coverage_validate( table + Coverage1, otvalid, -1 ); - otv_Coverage_validate( table + Coverage2, otvalid, -1 ); - - otv_MarkArray_validate( table + Array1, otvalid ); - - otvalid->nesting_level++; - func = otvalid->func[otvalid->nesting_level]; - otvalid->extra1 = ClassCount; - - func( table + Array2, otvalid ); - - otvalid->nesting_level--; - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** VALUE RECORDS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static FT_UInt - otv_value_length( FT_UInt format ) - { - FT_UInt count; - - - count = ( ( format & 0xAA ) >> 1 ) + ( format & 0x55 ); - count = ( ( count & 0xCC ) >> 2 ) + ( count & 0x33 ); - count = ( ( count & 0xF0 ) >> 4 ) + ( count & 0x0F ); - - return count * 2; - } - - - /* uses otvalid->extra3 (pointer to base table) */ - - static void - otv_ValueRecord_validate( FT_Bytes table, - FT_UInt format, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt count; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_Int loop; - FT_ULong res = 0; - - - OTV_NAME_ENTER( "ValueRecord" ); - - /* display `format' in dual representation */ - for ( loop = 7; loop >= 0; loop-- ) - { - res <<= 4; - res += ( format >> loop ) & 1; - } - - OTV_TRACE(( " (format 0b%08lx)\n", res )); -#endif - - if ( format >= 0x100 ) - FT_INVALID_FORMAT; - - for ( count = 4; count > 0; count-- ) - { - if ( format & 1 ) - { - /* XPlacement, YPlacement, XAdvance, YAdvance */ - OTV_LIMIT_CHECK( 2 ); - p += 2; - } - - format >>= 1; - } - - for ( count = 4; count > 0; count-- ) - { - if ( format & 1 ) - { - FT_PtrDist table_size; - - OTV_OPTIONAL_TABLE( device ); - - - /* XPlaDevice, YPlaDevice, XAdvDevice, YAdvDevice */ - OTV_LIMIT_CHECK( 2 ); - OTV_OPTIONAL_OFFSET( device ); - - /* XXX: this value is usually too small, especially if the current */ - /* ValueRecord is part of an array -- getting the correct table */ - /* size is probably not worth the trouble */ - - table_size = p - otvalid->extra3; - - OTV_SIZE_CHECK( device ); - if ( device ) - otv_Device_validate( otvalid->extra3 + device, otvalid ); - } - format >>= 1; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** ANCHORS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - otv_Anchor_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt AnchorFormat; - - - OTV_NAME_ENTER( "Anchor"); - - OTV_LIMIT_CHECK( 6 ); - AnchorFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", AnchorFormat )); - - p += 4; /* skip XCoordinate and YCoordinate */ - - switch ( AnchorFormat ) - { - case 1: - break; - - case 2: - OTV_LIMIT_CHECK( 2 ); /* AnchorPoint */ - break; - - case 3: - { - FT_UInt table_size; - - OTV_OPTIONAL_TABLE( XDeviceTable ); - OTV_OPTIONAL_TABLE( YDeviceTable ); - - - OTV_LIMIT_CHECK( 4 ); - OTV_OPTIONAL_OFFSET( XDeviceTable ); - OTV_OPTIONAL_OFFSET( YDeviceTable ); - - table_size = 6 + 4; - - OTV_SIZE_CHECK( XDeviceTable ); - if ( XDeviceTable ) - otv_Device_validate( table + XDeviceTable, otvalid ); - - OTV_SIZE_CHECK( YDeviceTable ); - if ( YDeviceTable ) - otv_Device_validate( table + YDeviceTable, otvalid ); - } - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** MARK ARRAYS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - otv_MarkArray_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt MarkCount; - - - OTV_NAME_ENTER( "MarkArray" ); - - OTV_LIMIT_CHECK( 2 ); - MarkCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (MarkCount = %d)\n", MarkCount )); - - OTV_LIMIT_CHECK( MarkCount * 4 ); - - /* MarkRecord */ - for ( ; MarkCount > 0; MarkCount-- ) - { - p += 2; /* skip Class */ - /* MarkAnchor */ - otv_Anchor_validate( table + FT_NEXT_USHORT( p ), otvalid ); - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GPOS LOOKUP TYPE 1 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* sets otvalid->extra3 (pointer to base table) */ - - static void - otv_SinglePos_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt PosFormat; - - - OTV_NAME_ENTER( "SinglePos" ); - - OTV_LIMIT_CHECK( 2 ); - PosFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", PosFormat )); - - otvalid->extra3 = table; - - switch ( PosFormat ) - { - case 1: /* SinglePosFormat1 */ - { - FT_UInt Coverage, ValueFormat; - - - OTV_LIMIT_CHECK( 4 ); - Coverage = FT_NEXT_USHORT( p ); - ValueFormat = FT_NEXT_USHORT( p ); - - otv_Coverage_validate( table + Coverage, otvalid, -1 ); - otv_ValueRecord_validate( p, ValueFormat, otvalid ); /* Value */ - } - break; - - case 2: /* SinglePosFormat2 */ - { - FT_UInt Coverage, ValueFormat, ValueCount, len_value; - - - OTV_LIMIT_CHECK( 6 ); - Coverage = FT_NEXT_USHORT( p ); - ValueFormat = FT_NEXT_USHORT( p ); - ValueCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (ValueCount = %d)\n", ValueCount )); - - len_value = otv_value_length( ValueFormat ); - - otv_Coverage_validate( table + Coverage, - otvalid, - (FT_Int)ValueCount ); - - OTV_LIMIT_CHECK( ValueCount * len_value ); - - /* Value */ - for ( ; ValueCount > 0; ValueCount-- ) - { - otv_ValueRecord_validate( p, ValueFormat, otvalid ); - p += len_value; - } - } - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GPOS LOOKUP TYPE 2 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - otv_PairSet_validate( FT_Bytes table, - FT_UInt format1, - FT_UInt format2, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt value_len1, value_len2, PairValueCount; - - - OTV_NAME_ENTER( "PairSet" ); - - OTV_LIMIT_CHECK( 2 ); - PairValueCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (PairValueCount = %d)\n", PairValueCount )); - - value_len1 = otv_value_length( format1 ); - value_len2 = otv_value_length( format2 ); - - OTV_LIMIT_CHECK( PairValueCount * ( value_len1 + value_len2 + 2 ) ); - - /* PairValueRecord */ - for ( ; PairValueCount > 0; PairValueCount-- ) - { - p += 2; /* skip SecondGlyph */ - - if ( format1 ) - otv_ValueRecord_validate( p, format1, otvalid ); /* Value1 */ - p += value_len1; - - if ( format2 ) - otv_ValueRecord_validate( p, format2, otvalid ); /* Value2 */ - p += value_len2; - } - - OTV_EXIT; - } - - - /* sets otvalid->extra3 (pointer to base table) */ - - static void - otv_PairPos_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt PosFormat; - - - OTV_NAME_ENTER( "PairPos" ); - - OTV_LIMIT_CHECK( 2 ); - PosFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", PosFormat )); - - otvalid->extra3 = table; - - switch ( PosFormat ) - { - case 1: /* PairPosFormat1 */ - { - FT_UInt Coverage, ValueFormat1, ValueFormat2, PairSetCount; - - - OTV_LIMIT_CHECK( 8 ); - Coverage = FT_NEXT_USHORT( p ); - ValueFormat1 = FT_NEXT_USHORT( p ); - ValueFormat2 = FT_NEXT_USHORT( p ); - PairSetCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (PairSetCount = %d)\n", PairSetCount )); - - otv_Coverage_validate( table + Coverage, otvalid, -1 ); - - OTV_LIMIT_CHECK( PairSetCount * 2 ); - - /* PairSetOffset */ - for ( ; PairSetCount > 0; PairSetCount-- ) - otv_PairSet_validate( table + FT_NEXT_USHORT( p ), - ValueFormat1, ValueFormat2, otvalid ); - } - break; - - case 2: /* PairPosFormat2 */ - { - FT_UInt Coverage, ValueFormat1, ValueFormat2, ClassDef1, ClassDef2; - FT_UInt ClassCount1, ClassCount2, len_value1, len_value2, count; - - - OTV_LIMIT_CHECK( 14 ); - Coverage = FT_NEXT_USHORT( p ); - ValueFormat1 = FT_NEXT_USHORT( p ); - ValueFormat2 = FT_NEXT_USHORT( p ); - ClassDef1 = FT_NEXT_USHORT( p ); - ClassDef2 = FT_NEXT_USHORT( p ); - ClassCount1 = FT_NEXT_USHORT( p ); - ClassCount2 = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (ClassCount1 = %d)\n", ClassCount1 )); - OTV_TRACE(( " (ClassCount2 = %d)\n", ClassCount2 )); - - len_value1 = otv_value_length( ValueFormat1 ); - len_value2 = otv_value_length( ValueFormat2 ); - - otv_Coverage_validate( table + Coverage, otvalid, -1 ); - otv_ClassDef_validate( table + ClassDef1, otvalid ); - otv_ClassDef_validate( table + ClassDef2, otvalid ); - - OTV_LIMIT_CHECK( ClassCount1 * ClassCount2 * - ( len_value1 + len_value2 ) ); - - /* Class1Record */ - for ( ; ClassCount1 > 0; ClassCount1-- ) - { - /* Class2Record */ - for ( count = ClassCount2; count > 0; count-- ) - { - if ( ValueFormat1 ) - /* Value1 */ - otv_ValueRecord_validate( p, ValueFormat1, otvalid ); - p += len_value1; - - if ( ValueFormat2 ) - /* Value2 */ - otv_ValueRecord_validate( p, ValueFormat2, otvalid ); - p += len_value2; - } - } - } - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GPOS LOOKUP TYPE 3 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - otv_CursivePos_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt PosFormat; - - - OTV_NAME_ENTER( "CursivePos" ); - - OTV_LIMIT_CHECK( 2 ); - PosFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", PosFormat )); - - switch ( PosFormat ) - { - case 1: /* CursivePosFormat1 */ - { - FT_UInt table_size; - FT_UInt Coverage, EntryExitCount; - - OTV_OPTIONAL_TABLE( EntryAnchor ); - OTV_OPTIONAL_TABLE( ExitAnchor ); - - - OTV_LIMIT_CHECK( 4 ); - Coverage = FT_NEXT_USHORT( p ); - EntryExitCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (EntryExitCount = %d)\n", EntryExitCount )); - - otv_Coverage_validate( table + Coverage, - otvalid, - (FT_Int)EntryExitCount ); - - OTV_LIMIT_CHECK( EntryExitCount * 4 ); - - table_size = EntryExitCount * 4 + 4; - - /* EntryExitRecord */ - for ( ; EntryExitCount > 0; EntryExitCount-- ) - { - OTV_OPTIONAL_OFFSET( EntryAnchor ); - OTV_OPTIONAL_OFFSET( ExitAnchor ); - - OTV_SIZE_CHECK( EntryAnchor ); - if ( EntryAnchor ) - otv_Anchor_validate( table + EntryAnchor, otvalid ); - - OTV_SIZE_CHECK( ExitAnchor ); - if ( ExitAnchor ) - otv_Anchor_validate( table + ExitAnchor, otvalid ); - } - } - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GPOS LOOKUP TYPE 4 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* UNDOCUMENTED (in OpenType 1.5): */ - /* BaseRecord tables can contain NULL pointers. */ - - /* sets otvalid->extra2 (1) */ - - static void - otv_MarkBasePos_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt PosFormat; - - - OTV_NAME_ENTER( "MarkBasePos" ); - - OTV_LIMIT_CHECK( 2 ); - PosFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", PosFormat )); - - switch ( PosFormat ) - { - case 1: - otvalid->extra2 = 1; - OTV_NEST2( MarkBasePosFormat1, BaseArray ); - OTV_RUN( table, otvalid ); - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GPOS LOOKUP TYPE 5 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* sets otvalid->extra2 (1) */ - - static void - otv_MarkLigPos_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt PosFormat; - - - OTV_NAME_ENTER( "MarkLigPos" ); - - OTV_LIMIT_CHECK( 2 ); - PosFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", PosFormat )); - - switch ( PosFormat ) - { - case 1: - otvalid->extra2 = 1; - OTV_NEST3( MarkLigPosFormat1, LigatureArray, LigatureAttach ); - OTV_RUN( table, otvalid ); - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GPOS LOOKUP TYPE 6 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* sets otvalid->extra2 (0) */ - - static void - otv_MarkMarkPos_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt PosFormat; - - - OTV_NAME_ENTER( "MarkMarkPos" ); - - OTV_LIMIT_CHECK( 2 ); - PosFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", PosFormat )); - - switch ( PosFormat ) - { - case 1: - otvalid->extra2 = 0; - OTV_NEST2( MarkMarkPosFormat1, Mark2Array ); - OTV_RUN( table, otvalid ); - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GPOS LOOKUP TYPE 7 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* sets otvalid->extra1 (lookup count) */ - - static void - otv_ContextPos_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt PosFormat; - - - OTV_NAME_ENTER( "ContextPos" ); - - OTV_LIMIT_CHECK( 2 ); - PosFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", PosFormat )); - - switch ( PosFormat ) - { - case 1: - /* no need to check glyph indices/classes used as input for these */ - /* context rules since even invalid glyph indices/classes return */ - /* meaningful results */ - - otvalid->extra1 = otvalid->lookup_count; - OTV_NEST3( ContextPosFormat1, PosRuleSet, PosRule ); - OTV_RUN( table, otvalid ); - break; - - case 2: - /* no need to check glyph indices/classes used as input for these */ - /* context rules since even invalid glyph indices/classes return */ - /* meaningful results */ - - OTV_NEST3( ContextPosFormat2, PosClassSet, PosClassRule ); - OTV_RUN( table, otvalid ); - break; - - case 3: - OTV_NEST1( ContextPosFormat3 ); - OTV_RUN( table, otvalid ); - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GPOS LOOKUP TYPE 8 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* sets otvalid->extra1 (lookup count) */ - - static void - otv_ChainContextPos_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt PosFormat; - - - OTV_NAME_ENTER( "ChainContextPos" ); - - OTV_LIMIT_CHECK( 2 ); - PosFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", PosFormat )); - - switch ( PosFormat ) - { - case 1: - /* no need to check glyph indices/classes used as input for these */ - /* context rules since even invalid glyph indices/classes return */ - /* meaningful results */ - - otvalid->extra1 = otvalid->lookup_count; - OTV_NEST3( ChainContextPosFormat1, - ChainPosRuleSet, ChainPosRule ); - OTV_RUN( table, otvalid ); - break; - - case 2: - /* no need to check glyph indices/classes used as input for these */ - /* context rules since even invalid glyph indices/classes return */ - /* meaningful results */ - - OTV_NEST3( ChainContextPosFormat2, - ChainPosClassSet, ChainPosClassRule ); - OTV_RUN( table, otvalid ); - break; - - case 3: - OTV_NEST1( ChainContextPosFormat3 ); - OTV_RUN( table, otvalid ); - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GPOS LOOKUP TYPE 9 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* uses otvalid->type_funcs */ - - static void - otv_ExtensionPos_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt PosFormat; - - - OTV_NAME_ENTER( "ExtensionPos" ); - - OTV_LIMIT_CHECK( 2 ); - PosFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", PosFormat )); - - switch ( PosFormat ) - { - case 1: /* ExtensionPosFormat1 */ - { - FT_UInt ExtensionLookupType; - FT_ULong ExtensionOffset; - OTV_Validate_Func validate; - - - OTV_LIMIT_CHECK( 6 ); - ExtensionLookupType = FT_NEXT_USHORT( p ); - ExtensionOffset = FT_NEXT_ULONG( p ); - - if ( ExtensionLookupType == 0 || ExtensionLookupType >= 9 ) - FT_INVALID_DATA; - - validate = otvalid->type_funcs[ExtensionLookupType - 1]; - validate( table + ExtensionOffset, otvalid ); - } - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - static const OTV_Validate_Func otv_gpos_validate_funcs[9] = - { - otv_SinglePos_validate, - otv_PairPos_validate, - otv_CursivePos_validate, - otv_MarkBasePos_validate, - otv_MarkLigPos_validate, - otv_MarkMarkPos_validate, - otv_ContextPos_validate, - otv_ChainContextPos_validate, - otv_ExtensionPos_validate - }; - - - /* sets otvalid->type_count */ - /* sets otvalid->type_funcs */ - - FT_LOCAL_DEF( void ) - otv_GPOS_subtable_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - otvalid->type_count = 9; - otvalid->type_funcs = (OTV_Validate_Func*)otv_gpos_validate_funcs; - - otv_Lookup_validate( table, otvalid ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GPOS TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* sets otvalid->glyph_count */ - - FT_LOCAL_DEF( void ) - otv_GPOS_validate( FT_Bytes table, - FT_UInt glyph_count, - FT_Validator ftvalid ) - { - OTV_ValidatorRec validrec; - OTV_Validator otvalid = &validrec; - FT_Bytes p = table; - FT_UInt ScriptList, FeatureList, LookupList; - - - otvalid->root = ftvalid; - - FT_TRACE3(( "validating GPOS table\n" )); - OTV_INIT; - - OTV_LIMIT_CHECK( 10 ); - - if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ - FT_INVALID_FORMAT; - - ScriptList = FT_NEXT_USHORT( p ); - FeatureList = FT_NEXT_USHORT( p ); - LookupList = FT_NEXT_USHORT( p ); - - otvalid->type_count = 9; - otvalid->type_funcs = (OTV_Validate_Func*)otv_gpos_validate_funcs; - otvalid->glyph_count = glyph_count; - - otv_LookupList_validate( table + LookupList, - otvalid ); - otv_FeatureList_validate( table + FeatureList, table + LookupList, - otvalid ); - otv_ScriptList_validate( table + ScriptList, table + FeatureList, - otvalid ); - - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/otvalid/otvgpos.h b/3party/freetype/src/otvalid/otvgpos.h deleted file mode 100644 index a792bd9519..0000000000 --- a/3party/freetype/src/otvalid/otvgpos.h +++ /dev/null @@ -1,36 +0,0 @@ -/***************************************************************************/ -/* */ -/* otvgpos.h */ -/* */ -/* OpenType GPOS table validator (specification). */ -/* */ -/* Copyright 2004-2015 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 __OTVGPOS_H__ -#define __OTVGPOS_H__ - - -FT_BEGIN_HEADER - - - FT_LOCAL( void ) - otv_GPOS_subtable_validate( FT_Bytes table, - OTV_Validator valid ); - - -FT_END_HEADER - -#endif /* __OTVGPOS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/otvalid/otvgsub.c b/3party/freetype/src/otvalid/otvgsub.c deleted file mode 100644 index 0f8b02cd20..0000000000 --- a/3party/freetype/src/otvalid/otvgsub.c +++ /dev/null @@ -1,587 +0,0 @@ -/***************************************************************************/ -/* */ -/* otvgsub.c */ -/* */ -/* OpenType GSUB table validation (body). */ -/* */ -/* Copyright 2004-2015 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 "otvalid.h" -#include "otvcommn.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_otvgsub - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GSUB LOOKUP TYPE 1 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* uses otvalid->glyph_count */ - - static void - otv_SingleSubst_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt SubstFormat; - - - OTV_NAME_ENTER( "SingleSubst" ); - - OTV_LIMIT_CHECK( 2 ); - SubstFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", SubstFormat )); - - switch ( SubstFormat ) - { - case 1: /* SingleSubstFormat1 */ - { - FT_Bytes Coverage; - FT_Int DeltaGlyphID; - FT_Long idx; - - - OTV_LIMIT_CHECK( 4 ); - Coverage = table + FT_NEXT_USHORT( p ); - DeltaGlyphID = FT_NEXT_SHORT( p ); - - otv_Coverage_validate( Coverage, otvalid, -1 ); - - idx = (FT_Long)otv_Coverage_get_first( Coverage ) + DeltaGlyphID; - if ( idx < 0 ) - FT_INVALID_DATA; - - idx = (FT_Long)otv_Coverage_get_last( Coverage ) + DeltaGlyphID; - if ( (FT_UInt)idx >= otvalid->glyph_count ) - FT_INVALID_DATA; - } - break; - - case 2: /* SingleSubstFormat2 */ - { - FT_UInt Coverage, GlyphCount; - - - OTV_LIMIT_CHECK( 4 ); - Coverage = FT_NEXT_USHORT( p ); - GlyphCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); - - otv_Coverage_validate( table + Coverage, - otvalid, - (FT_Int)GlyphCount ); - - OTV_LIMIT_CHECK( GlyphCount * 2 ); - - /* Substitute */ - for ( ; GlyphCount > 0; GlyphCount-- ) - if ( FT_NEXT_USHORT( p ) >= otvalid->glyph_count ) - FT_INVALID_GLYPH_ID; - } - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GSUB LOOKUP TYPE 2 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* sets otvalid->extra1 (glyph count) */ - - static void - otv_MultipleSubst_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt SubstFormat; - - - OTV_NAME_ENTER( "MultipleSubst" ); - - OTV_LIMIT_CHECK( 2 ); - SubstFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", SubstFormat )); - - switch ( SubstFormat ) - { - case 1: - otvalid->extra1 = otvalid->glyph_count; - OTV_NEST2( MultipleSubstFormat1, Sequence ); - OTV_RUN( table, otvalid ); - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GSUB LOOKUP TYPE 3 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* sets otvalid->extra1 (glyph count) */ - - static void - otv_AlternateSubst_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt SubstFormat; - - - OTV_NAME_ENTER( "AlternateSubst" ); - - OTV_LIMIT_CHECK( 2 ); - SubstFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", SubstFormat )); - - switch ( SubstFormat ) - { - case 1: - otvalid->extra1 = otvalid->glyph_count; - OTV_NEST2( AlternateSubstFormat1, AlternateSet ); - OTV_RUN( table, otvalid ); - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GSUB LOOKUP TYPE 4 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define LigatureFunc otv_Ligature_validate - - /* uses otvalid->glyph_count */ - - static void - otv_Ligature_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt LigatureGlyph, CompCount; - - - OTV_ENTER; - - OTV_LIMIT_CHECK( 4 ); - LigatureGlyph = FT_NEXT_USHORT( p ); - if ( LigatureGlyph >= otvalid->glyph_count ) - FT_INVALID_DATA; - - CompCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (CompCount = %d)\n", CompCount )); - - if ( CompCount == 0 ) - FT_INVALID_DATA; - - CompCount--; - - OTV_LIMIT_CHECK( CompCount * 2 ); /* Component */ - - /* no need to check the Component glyph indices */ - - OTV_EXIT; - } - - - static void - otv_LigatureSubst_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt SubstFormat; - - - OTV_NAME_ENTER( "LigatureSubst" ); - - OTV_LIMIT_CHECK( 2 ); - SubstFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", SubstFormat )); - - switch ( SubstFormat ) - { - case 1: - OTV_NEST3( LigatureSubstFormat1, LigatureSet, Ligature ); - OTV_RUN( table, otvalid ); - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GSUB LOOKUP TYPE 5 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* sets otvalid->extra1 (lookup count) */ - - static void - otv_ContextSubst_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt SubstFormat; - - - OTV_NAME_ENTER( "ContextSubst" ); - - OTV_LIMIT_CHECK( 2 ); - SubstFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", SubstFormat )); - - switch ( SubstFormat ) - { - case 1: - /* no need to check glyph indices/classes used as input for these */ - /* context rules since even invalid glyph indices/classes return */ - /* meaningful results */ - - otvalid->extra1 = otvalid->lookup_count; - OTV_NEST3( ContextSubstFormat1, SubRuleSet, SubRule ); - OTV_RUN( table, otvalid ); - break; - - case 2: - /* no need to check glyph indices/classes used as input for these */ - /* context rules since even invalid glyph indices/classes return */ - /* meaningful results */ - - OTV_NEST3( ContextSubstFormat2, SubClassSet, SubClassRule ); - OTV_RUN( table, otvalid ); - break; - - case 3: - OTV_NEST1( ContextSubstFormat3 ); - OTV_RUN( table, otvalid ); - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GSUB LOOKUP TYPE 6 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* sets otvalid->extra1 (lookup count) */ - - static void - otv_ChainContextSubst_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt SubstFormat; - - - OTV_NAME_ENTER( "ChainContextSubst" ); - - OTV_LIMIT_CHECK( 2 ); - SubstFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", SubstFormat )); - - switch ( SubstFormat ) - { - case 1: - /* no need to check glyph indices/classes used as input for these */ - /* context rules since even invalid glyph indices/classes return */ - /* meaningful results */ - - otvalid->extra1 = otvalid->lookup_count; - OTV_NEST3( ChainContextSubstFormat1, - ChainSubRuleSet, ChainSubRule ); - OTV_RUN( table, otvalid ); - break; - - case 2: - /* no need to check glyph indices/classes used as input for these */ - /* context rules since even invalid glyph indices/classes return */ - /* meaningful results */ - - OTV_NEST3( ChainContextSubstFormat2, - ChainSubClassSet, ChainSubClassRule ); - OTV_RUN( table, otvalid ); - break; - - case 3: - OTV_NEST1( ChainContextSubstFormat3 ); - OTV_RUN( table, otvalid ); - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GSUB LOOKUP TYPE 7 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* uses otvalid->type_funcs */ - - static void - otv_ExtensionSubst_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt SubstFormat; - - - OTV_NAME_ENTER( "ExtensionSubst" ); - - OTV_LIMIT_CHECK( 2 ); - SubstFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", SubstFormat )); - - switch ( SubstFormat ) - { - case 1: /* ExtensionSubstFormat1 */ - { - FT_UInt ExtensionLookupType; - FT_ULong ExtensionOffset; - OTV_Validate_Func validate; - - - OTV_LIMIT_CHECK( 6 ); - ExtensionLookupType = FT_NEXT_USHORT( p ); - ExtensionOffset = FT_NEXT_ULONG( p ); - - if ( ExtensionLookupType == 0 || - ExtensionLookupType == 7 || - ExtensionLookupType > 8 ) - FT_INVALID_DATA; - - validate = otvalid->type_funcs[ExtensionLookupType - 1]; - validate( table + ExtensionOffset, otvalid ); - } - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GSUB LOOKUP TYPE 8 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* uses otvalid->glyph_count */ - - static void - otv_ReverseChainSingleSubst_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table, Coverage; - FT_UInt SubstFormat; - FT_UInt BacktrackGlyphCount, LookaheadGlyphCount, GlyphCount; - - - OTV_NAME_ENTER( "ReverseChainSingleSubst" ); - - OTV_LIMIT_CHECK( 2 ); - SubstFormat = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (format %d)\n", SubstFormat )); - - switch ( SubstFormat ) - { - case 1: /* ReverseChainSingleSubstFormat1 */ - OTV_LIMIT_CHECK( 4 ); - Coverage = table + FT_NEXT_USHORT( p ); - BacktrackGlyphCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (BacktrackGlyphCount = %d)\n", BacktrackGlyphCount )); - - otv_Coverage_validate( Coverage, otvalid, -1 ); - - OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 ); - - for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- ) - otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 ); - - LookaheadGlyphCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (LookaheadGlyphCount = %d)\n", LookaheadGlyphCount )); - - OTV_LIMIT_CHECK( LookaheadGlyphCount * 2 + 2 ); - - for ( ; LookaheadGlyphCount > 0; LookaheadGlyphCount-- ) - otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 ); - - GlyphCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); - - if ( GlyphCount != otv_Coverage_get_count( Coverage ) ) - FT_INVALID_DATA; - - OTV_LIMIT_CHECK( GlyphCount * 2 ); - - /* Substitute */ - for ( ; GlyphCount > 0; GlyphCount-- ) - if ( FT_NEXT_USHORT( p ) >= otvalid->glyph_count ) - FT_INVALID_DATA; - - break; - - default: - FT_INVALID_FORMAT; - } - - OTV_EXIT; - } - - - static const OTV_Validate_Func otv_gsub_validate_funcs[8] = - { - otv_SingleSubst_validate, - otv_MultipleSubst_validate, - otv_AlternateSubst_validate, - otv_LigatureSubst_validate, - otv_ContextSubst_validate, - otv_ChainContextSubst_validate, - otv_ExtensionSubst_validate, - otv_ReverseChainSingleSubst_validate - }; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GSUB TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* sets otvalid->type_count */ - /* sets otvalid->type_funcs */ - /* sets otvalid->glyph_count */ - - FT_LOCAL_DEF( void ) - otv_GSUB_validate( FT_Bytes table, - FT_UInt glyph_count, - FT_Validator ftvalid ) - { - OTV_ValidatorRec otvalidrec; - OTV_Validator otvalid = &otvalidrec; - FT_Bytes p = table; - FT_UInt ScriptList, FeatureList, LookupList; - - - otvalid->root = ftvalid; - - FT_TRACE3(( "validating GSUB table\n" )); - OTV_INIT; - - OTV_LIMIT_CHECK( 10 ); - - if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ - FT_INVALID_FORMAT; - - ScriptList = FT_NEXT_USHORT( p ); - FeatureList = FT_NEXT_USHORT( p ); - LookupList = FT_NEXT_USHORT( p ); - - otvalid->type_count = 8; - otvalid->type_funcs = (OTV_Validate_Func*)otv_gsub_validate_funcs; - otvalid->glyph_count = glyph_count; - - otv_LookupList_validate( table + LookupList, - otvalid ); - otv_FeatureList_validate( table + FeatureList, table + LookupList, - otvalid ); - otv_ScriptList_validate( table + ScriptList, table + FeatureList, - otvalid ); - - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/otvalid/otvjstf.c b/3party/freetype/src/otvalid/otvjstf.c deleted file mode 100644 index fe68a60f60..0000000000 --- a/3party/freetype/src/otvalid/otvjstf.c +++ /dev/null @@ -1,259 +0,0 @@ -/***************************************************************************/ -/* */ -/* otvjstf.c */ -/* */ -/* OpenType JSTF table validation (body). */ -/* */ -/* Copyright 2004-2015 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 "otvalid.h" -#include "otvcommn.h" -#include "otvgpos.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_otvjstf - - -#define JstfPriorityFunc otv_JstfPriority_validate -#define JstfLookupFunc otv_GPOS_subtable_validate - - /* uses otvalid->extra1 (GSUB lookup count) */ - /* uses otvalid->extra2 (GPOS lookup count) */ - /* sets otvalid->extra1 (counter) */ - - static void - otv_JstfPriority_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt table_size; - FT_UInt gsub_lookup_count, gpos_lookup_count; - - OTV_OPTIONAL_TABLE( ShrinkageEnableGSUB ); - OTV_OPTIONAL_TABLE( ShrinkageDisableGSUB ); - OTV_OPTIONAL_TABLE( ShrinkageEnableGPOS ); - OTV_OPTIONAL_TABLE( ShrinkageDisableGPOS ); - OTV_OPTIONAL_TABLE( ExtensionEnableGSUB ); - OTV_OPTIONAL_TABLE( ExtensionDisableGSUB ); - OTV_OPTIONAL_TABLE( ExtensionEnableGPOS ); - OTV_OPTIONAL_TABLE( ExtensionDisableGPOS ); - OTV_OPTIONAL_TABLE( ShrinkageJstfMax ); - OTV_OPTIONAL_TABLE( ExtensionJstfMax ); - - - OTV_ENTER; - OTV_TRACE(( "JstfPriority table\n" )); - - OTV_LIMIT_CHECK( 20 ); - - gsub_lookup_count = otvalid->extra1; - gpos_lookup_count = otvalid->extra2; - - table_size = 20; - - otvalid->extra1 = gsub_lookup_count; - - OTV_OPTIONAL_OFFSET( ShrinkageEnableGSUB ); - OTV_SIZE_CHECK( ShrinkageEnableGSUB ); - if ( ShrinkageEnableGSUB ) - otv_x_ux( table + ShrinkageEnableGSUB, otvalid ); - - OTV_OPTIONAL_OFFSET( ShrinkageDisableGSUB ); - OTV_SIZE_CHECK( ShrinkageDisableGSUB ); - if ( ShrinkageDisableGSUB ) - otv_x_ux( table + ShrinkageDisableGSUB, otvalid ); - - otvalid->extra1 = gpos_lookup_count; - - OTV_OPTIONAL_OFFSET( ShrinkageEnableGPOS ); - OTV_SIZE_CHECK( ShrinkageEnableGPOS ); - if ( ShrinkageEnableGPOS ) - otv_x_ux( table + ShrinkageEnableGPOS, otvalid ); - - OTV_OPTIONAL_OFFSET( ShrinkageDisableGPOS ); - OTV_SIZE_CHECK( ShrinkageDisableGPOS ); - if ( ShrinkageDisableGPOS ) - otv_x_ux( table + ShrinkageDisableGPOS, otvalid ); - - OTV_OPTIONAL_OFFSET( ShrinkageJstfMax ); - OTV_SIZE_CHECK( ShrinkageJstfMax ); - if ( ShrinkageJstfMax ) - { - /* XXX: check lookup types? */ - OTV_NEST2( JstfMax, JstfLookup ); - OTV_RUN( table + ShrinkageJstfMax, otvalid ); - } - - otvalid->extra1 = gsub_lookup_count; - - OTV_OPTIONAL_OFFSET( ExtensionEnableGSUB ); - OTV_SIZE_CHECK( ExtensionEnableGSUB ); - if ( ExtensionEnableGSUB ) - otv_x_ux( table + ExtensionEnableGSUB, otvalid ); - - OTV_OPTIONAL_OFFSET( ExtensionDisableGSUB ); - OTV_SIZE_CHECK( ExtensionDisableGSUB ); - if ( ExtensionDisableGSUB ) - otv_x_ux( table + ExtensionDisableGSUB, otvalid ); - - otvalid->extra1 = gpos_lookup_count; - - OTV_OPTIONAL_OFFSET( ExtensionEnableGPOS ); - OTV_SIZE_CHECK( ExtensionEnableGPOS ); - if ( ExtensionEnableGPOS ) - otv_x_ux( table + ExtensionEnableGPOS, otvalid ); - - OTV_OPTIONAL_OFFSET( ExtensionDisableGPOS ); - OTV_SIZE_CHECK( ExtensionDisableGPOS ); - if ( ExtensionDisableGPOS ) - otv_x_ux( table + ExtensionDisableGPOS, otvalid ); - - OTV_OPTIONAL_OFFSET( ExtensionJstfMax ); - OTV_SIZE_CHECK( ExtensionJstfMax ); - if ( ExtensionJstfMax ) - { - /* XXX: check lookup types? */ - OTV_NEST2( JstfMax, JstfLookup ); - OTV_RUN( table + ExtensionJstfMax, otvalid ); - } - - otvalid->extra1 = gsub_lookup_count; - otvalid->extra2 = gpos_lookup_count; - - OTV_EXIT; - } - - - /* sets otvalid->extra (glyph count) */ - /* sets otvalid->func1 (otv_JstfPriority_validate) */ - - static void - otv_JstfScript_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt table_size; - FT_UInt JstfLangSysCount; - - OTV_OPTIONAL_TABLE( ExtGlyph ); - OTV_OPTIONAL_TABLE( DefJstfLangSys ); - - - OTV_NAME_ENTER( "JstfScript" ); - - OTV_LIMIT_CHECK( 6 ); - OTV_OPTIONAL_OFFSET( ExtGlyph ); - OTV_OPTIONAL_OFFSET( DefJstfLangSys ); - JstfLangSysCount = FT_NEXT_USHORT( p ); - - OTV_TRACE(( " (JstfLangSysCount = %d)\n", JstfLangSysCount )); - - table_size = JstfLangSysCount * 6 + 6; - - OTV_SIZE_CHECK( ExtGlyph ); - if ( ExtGlyph ) - { - otvalid->extra1 = otvalid->glyph_count; - OTV_NEST1( ExtenderGlyph ); - OTV_RUN( table + ExtGlyph, otvalid ); - } - - OTV_SIZE_CHECK( DefJstfLangSys ); - if ( DefJstfLangSys ) - { - OTV_NEST2( JstfLangSys, JstfPriority ); - OTV_RUN( table + DefJstfLangSys, otvalid ); - } - - OTV_LIMIT_CHECK( 6 * JstfLangSysCount ); - - /* JstfLangSysRecord */ - OTV_NEST2( JstfLangSys, JstfPriority ); - for ( ; JstfLangSysCount > 0; JstfLangSysCount-- ) - { - p += 4; /* skip JstfLangSysTag */ - - OTV_RUN( table + FT_NEXT_USHORT( p ), otvalid ); - } - - OTV_EXIT; - } - - - /* sets otvalid->extra1 (GSUB lookup count) */ - /* sets otvalid->extra2 (GPOS lookup count) */ - /* sets otvalid->glyph_count */ - - FT_LOCAL_DEF( void ) - otv_JSTF_validate( FT_Bytes table, - FT_Bytes gsub, - FT_Bytes gpos, - FT_UInt glyph_count, - FT_Validator ftvalid ) - { - OTV_ValidatorRec otvalidrec; - OTV_Validator otvalid = &otvalidrec; - FT_Bytes p = table; - FT_UInt JstfScriptCount; - - - otvalid->root = ftvalid; - - - FT_TRACE3(( "validating JSTF table\n" )); - OTV_INIT; - - OTV_LIMIT_CHECK( 6 ); - - if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ - FT_INVALID_FORMAT; - - JstfScriptCount = FT_NEXT_USHORT( p ); - - FT_TRACE3(( " (JstfScriptCount = %d)\n", JstfScriptCount )); - - OTV_LIMIT_CHECK( JstfScriptCount * 6 ); - - if ( gsub ) - otvalid->extra1 = otv_GSUBGPOS_get_Lookup_count( gsub ); - else - otvalid->extra1 = 0; - - if ( gpos ) - otvalid->extra2 = otv_GSUBGPOS_get_Lookup_count( gpos ); - else - otvalid->extra2 = 0; - - otvalid->glyph_count = glyph_count; - - /* JstfScriptRecord */ - for ( ; JstfScriptCount > 0; JstfScriptCount-- ) - { - p += 4; /* skip JstfScriptTag */ - - /* JstfScript */ - otv_JstfScript_validate( table + FT_NEXT_USHORT( p ), otvalid ); - } - - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/otvalid/otvmath.c b/3party/freetype/src/otvalid/otvmath.c deleted file mode 100644 index db3d5f8f52..0000000000 --- a/3party/freetype/src/otvalid/otvmath.c +++ /dev/null @@ -1,453 +0,0 @@ -/***************************************************************************/ -/* */ -/* otvmath.c */ -/* */ -/* OpenType MATH table validation (body). */ -/* */ -/* Copyright 2007-2015 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* Written by George Williams. */ -/* */ -/* 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 "otvalid.h" -#include "otvcommn.h" -#include "otvgpos.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_otvmath - - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** MATH TYPOGRAPHIC CONSTANTS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - otv_MathConstants_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt i; - FT_UInt table_size; - - OTV_OPTIONAL_TABLE( DeviceTableOffset ); - - - OTV_NAME_ENTER( "MathConstants" ); - - /* 56 constants, 51 have device tables */ - OTV_LIMIT_CHECK( 2 * ( 56 + 51 ) ); - table_size = 2 * ( 56 + 51 ); - - p += 4 * 2; /* First 4 constants have no device tables */ - for ( i = 0; i < 51; ++i ) - { - p += 2; /* skip the value */ - OTV_OPTIONAL_OFFSET( DeviceTableOffset ); - OTV_SIZE_CHECK( DeviceTableOffset ); - if ( DeviceTableOffset ) - otv_Device_validate( table + DeviceTableOffset, otvalid ); - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** MATH ITALICS CORRECTION *****/ - /***** MATH TOP ACCENT ATTACHMENT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - otv_MathItalicsCorrectionInfo_validate( FT_Bytes table, - OTV_Validator otvalid, - FT_Int isItalic ) - { - FT_Bytes p = table; - FT_UInt i, cnt, table_size ; - - OTV_OPTIONAL_TABLE( Coverage ); - OTV_OPTIONAL_TABLE( DeviceTableOffset ); - - FT_UNUSED( isItalic ); /* only used if tracing is active */ - - - OTV_NAME_ENTER( isItalic ? "MathItalicsCorrectionInfo" - : "MathTopAccentAttachment" ); - - OTV_LIMIT_CHECK( 4 ); - - OTV_OPTIONAL_OFFSET( Coverage ); - cnt = FT_NEXT_USHORT( p ); - - OTV_LIMIT_CHECK( 4 * cnt ); - table_size = 4 + 4 * cnt; - - OTV_SIZE_CHECK( Coverage ); - otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)cnt ); - - for ( i = 0; i < cnt; ++i ) - { - p += 2; /* Skip the value */ - OTV_OPTIONAL_OFFSET( DeviceTableOffset ); - OTV_SIZE_CHECK( DeviceTableOffset ); - if ( DeviceTableOffset ) - otv_Device_validate( table + DeviceTableOffset, otvalid ); - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** MATH KERNING *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - otv_MathKern_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt i, cnt, table_size; - - OTV_OPTIONAL_TABLE( DeviceTableOffset ); - - - /* OTV_NAME_ENTER( "MathKern" );*/ - - OTV_LIMIT_CHECK( 2 ); - - cnt = FT_NEXT_USHORT( p ); - - OTV_LIMIT_CHECK( 4 * cnt + 2 ); - table_size = 4 + 4 * cnt; - - /* Heights */ - for ( i = 0; i < cnt; ++i ) - { - p += 2; /* Skip the value */ - OTV_OPTIONAL_OFFSET( DeviceTableOffset ); - OTV_SIZE_CHECK( DeviceTableOffset ); - if ( DeviceTableOffset ) - otv_Device_validate( table + DeviceTableOffset, otvalid ); - } - - /* One more Kerning value */ - for ( i = 0; i < cnt + 1; ++i ) - { - p += 2; /* Skip the value */ - OTV_OPTIONAL_OFFSET( DeviceTableOffset ); - OTV_SIZE_CHECK( DeviceTableOffset ); - if ( DeviceTableOffset ) - otv_Device_validate( table + DeviceTableOffset, otvalid ); - } - - OTV_EXIT; - } - - - static void - otv_MathKernInfo_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt i, j, cnt, table_size; - - OTV_OPTIONAL_TABLE( Coverage ); - OTV_OPTIONAL_TABLE( MKRecordOffset ); - - - OTV_NAME_ENTER( "MathKernInfo" ); - - OTV_LIMIT_CHECK( 4 ); - - OTV_OPTIONAL_OFFSET( Coverage ); - cnt = FT_NEXT_USHORT( p ); - - OTV_LIMIT_CHECK( 8 * cnt ); - table_size = 4 + 8 * cnt; - - OTV_SIZE_CHECK( Coverage ); - otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)cnt ); - - for ( i = 0; i < cnt; ++i ) - { - for ( j = 0; j < 4; ++j ) - { - OTV_OPTIONAL_OFFSET( MKRecordOffset ); - OTV_SIZE_CHECK( MKRecordOffset ); - if ( MKRecordOffset ) - otv_MathKern_validate( table + MKRecordOffset, otvalid ); - } - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** MATH GLYPH INFO *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - otv_MathGlyphInfo_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt MathItalicsCorrectionInfo, MathTopAccentAttachment; - FT_UInt ExtendedShapeCoverage, MathKernInfo; - - - OTV_NAME_ENTER( "MathGlyphInfo" ); - - OTV_LIMIT_CHECK( 8 ); - - MathItalicsCorrectionInfo = FT_NEXT_USHORT( p ); - MathTopAccentAttachment = FT_NEXT_USHORT( p ); - ExtendedShapeCoverage = FT_NEXT_USHORT( p ); - MathKernInfo = FT_NEXT_USHORT( p ); - - if ( MathItalicsCorrectionInfo ) - otv_MathItalicsCorrectionInfo_validate( - table + MathItalicsCorrectionInfo, otvalid, TRUE ); - - /* Italic correction and Top Accent Attachment have the same format */ - if ( MathTopAccentAttachment ) - otv_MathItalicsCorrectionInfo_validate( - table + MathTopAccentAttachment, otvalid, FALSE ); - - if ( ExtendedShapeCoverage ) - { - OTV_NAME_ENTER( "ExtendedShapeCoverage" ); - otv_Coverage_validate( table + ExtendedShapeCoverage, otvalid, -1 ); - OTV_EXIT; - } - - if ( MathKernInfo ) - otv_MathKernInfo_validate( table + MathKernInfo, otvalid ); - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** MATH GLYPH CONSTRUCTION *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - otv_GlyphAssembly_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt pcnt, table_size; - FT_UInt i; - - OTV_OPTIONAL_TABLE( DeviceTableOffset ); - - - /* OTV_NAME_ENTER( "GlyphAssembly" ); */ - - OTV_LIMIT_CHECK( 6 ); - - p += 2; /* Skip the Italics Correction value */ - OTV_OPTIONAL_OFFSET( DeviceTableOffset ); - pcnt = FT_NEXT_USHORT( p ); - - OTV_LIMIT_CHECK( 8 * pcnt ); - table_size = 6 + 8 * pcnt; - - OTV_SIZE_CHECK( DeviceTableOffset ); - if ( DeviceTableOffset ) - otv_Device_validate( table + DeviceTableOffset, otvalid ); - - for ( i = 0; i < pcnt; ++i ) - { - FT_UInt gid; - - - gid = FT_NEXT_USHORT( p ); - if ( gid >= otvalid->glyph_count ) - FT_INVALID_GLYPH_ID; - p += 2*4; /* skip the Start, End, Full, and Flags fields */ - } - - /* OTV_EXIT; */ - } - - - static void - otv_MathGlyphConstruction_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt vcnt, table_size; - FT_UInt i; - - OTV_OPTIONAL_TABLE( GlyphAssembly ); - - - /* OTV_NAME_ENTER( "MathGlyphConstruction" ); */ - - OTV_LIMIT_CHECK( 4 ); - - OTV_OPTIONAL_OFFSET( GlyphAssembly ); - vcnt = FT_NEXT_USHORT( p ); - - OTV_LIMIT_CHECK( 4 * vcnt ); - table_size = 4 + 4 * vcnt; - - for ( i = 0; i < vcnt; ++i ) - { - FT_UInt gid; - - - gid = FT_NEXT_USHORT( p ); - if ( gid >= otvalid->glyph_count ) - FT_INVALID_GLYPH_ID; - p += 2; /* skip the size */ - } - - OTV_SIZE_CHECK( GlyphAssembly ); - if ( GlyphAssembly ) - otv_GlyphAssembly_validate( table+GlyphAssembly, otvalid ); - - /* OTV_EXIT; */ - } - - - static void - otv_MathVariants_validate( FT_Bytes table, - OTV_Validator otvalid ) - { - FT_Bytes p = table; - FT_UInt vcnt, hcnt, i, table_size; - - OTV_OPTIONAL_TABLE( VCoverage ); - OTV_OPTIONAL_TABLE( HCoverage ); - OTV_OPTIONAL_TABLE( Offset ); - - - OTV_NAME_ENTER( "MathVariants" ); - - OTV_LIMIT_CHECK( 10 ); - - p += 2; /* Skip the MinConnectorOverlap constant */ - OTV_OPTIONAL_OFFSET( VCoverage ); - OTV_OPTIONAL_OFFSET( HCoverage ); - vcnt = FT_NEXT_USHORT( p ); - hcnt = FT_NEXT_USHORT( p ); - - OTV_LIMIT_CHECK( 2 * vcnt + 2 * hcnt ); - table_size = 10 + 2 * vcnt + 2 * hcnt; - - OTV_SIZE_CHECK( VCoverage ); - if ( VCoverage ) - otv_Coverage_validate( table + VCoverage, otvalid, (FT_Int)vcnt ); - - OTV_SIZE_CHECK( HCoverage ); - if ( HCoverage ) - otv_Coverage_validate( table + HCoverage, otvalid, (FT_Int)hcnt ); - - for ( i = 0; i < vcnt; ++i ) - { - OTV_OPTIONAL_OFFSET( Offset ); - OTV_SIZE_CHECK( Offset ); - otv_MathGlyphConstruction_validate( table + Offset, otvalid ); - } - - for ( i = 0; i < hcnt; ++i ) - { - OTV_OPTIONAL_OFFSET( Offset ); - OTV_SIZE_CHECK( Offset ); - otv_MathGlyphConstruction_validate( table + Offset, otvalid ); - } - - OTV_EXIT; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** MATH TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* sets otvalid->glyph_count */ - - FT_LOCAL_DEF( void ) - otv_MATH_validate( FT_Bytes table, - FT_UInt glyph_count, - FT_Validator ftvalid ) - { - OTV_ValidatorRec otvalidrec; - OTV_Validator otvalid = &otvalidrec; - FT_Bytes p = table; - FT_UInt MathConstants, MathGlyphInfo, MathVariants; - - - otvalid->root = ftvalid; - - FT_TRACE3(( "validating MATH table\n" )); - OTV_INIT; - - OTV_LIMIT_CHECK( 10 ); - - if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ - FT_INVALID_FORMAT; - - MathConstants = FT_NEXT_USHORT( p ); - MathGlyphInfo = FT_NEXT_USHORT( p ); - MathVariants = FT_NEXT_USHORT( p ); - - otvalid->glyph_count = glyph_count; - - otv_MathConstants_validate( table + MathConstants, - otvalid ); - otv_MathGlyphInfo_validate( table + MathGlyphInfo, - otvalid ); - otv_MathVariants_validate ( table + MathVariants, - otvalid ); - - FT_TRACE4(( "\n" )); - } - - -/* END */ diff --git a/3party/freetype/src/otvalid/otvmod.c b/3party/freetype/src/otvalid/otvmod.c deleted file mode 100644 index 92f851398d..0000000000 --- a/3party/freetype/src/otvalid/otvmod.c +++ /dev/null @@ -1,282 +0,0 @@ -/***************************************************************************/ -/* */ -/* otvmod.c */ -/* */ -/* FreeType's OpenType validation module implementation (body). */ -/* */ -/* Copyright 2004-2015 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 <ft2build.h> -#include FT_TRUETYPE_TABLES_H -#include FT_TRUETYPE_TAGS_H -#include FT_OPENTYPE_VALIDATE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_OPENTYPE_VALIDATE_H - -#include "otvmod.h" -#include "otvalid.h" -#include "otvcommn.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_otvmodule - - - static FT_Error - otv_load_table( FT_Face face, - FT_Tag tag, - FT_Byte* volatile* table, - FT_ULong* table_len ) - { - FT_Error error; - FT_Memory memory = FT_FACE_MEMORY( face ); - - - error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len ); - if ( FT_ERR_EQ( error, Table_Missing ) ) - return FT_Err_Ok; - if ( error ) - goto Exit; - - if ( FT_ALLOC( *table, *table_len ) ) - goto Exit; - - error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len ); - - Exit: - return error; - } - - - static FT_Error - otv_validate( FT_Face volatile face, - FT_UInt ot_flags, - FT_Bytes *ot_base, - FT_Bytes *ot_gdef, - FT_Bytes *ot_gpos, - FT_Bytes *ot_gsub, - FT_Bytes *ot_jstf ) - { - FT_Error error = FT_Err_Ok; - FT_Byte* volatile base; - FT_Byte* volatile gdef; - FT_Byte* volatile gpos; - FT_Byte* volatile gsub; - FT_Byte* volatile jstf; - FT_Byte* volatile math; - FT_ULong len_base, len_gdef, len_gpos, len_gsub, len_jstf; - FT_ULong len_math; - FT_UInt num_glyphs = (FT_UInt)face->num_glyphs; - FT_ValidatorRec volatile valid; - - - base = gdef = gpos = gsub = jstf = math = NULL; - len_base = len_gdef = len_gpos = len_gsub = len_jstf = len_math = 0; - - /* - * XXX: OpenType tables cannot handle 32-bit glyph index, - * although broken TrueType can have 32-bit glyph index. - */ - if ( face->num_glyphs > 0xFFFFL ) - { - FT_TRACE1(( "otv_validate: Invalid glyphs index (0x0000FFFF - 0x%08x) ", - face->num_glyphs )); - FT_TRACE1(( "are not handled by OpenType tables\n" )); - num_glyphs = 0xFFFF; - } - - /* load tables */ - - if ( ot_flags & FT_VALIDATE_BASE ) - { - error = otv_load_table( face, TTAG_BASE, &base, &len_base ); - if ( error ) - goto Exit; - } - - if ( ot_flags & FT_VALIDATE_GDEF ) - { - error = otv_load_table( face, TTAG_GDEF, &gdef, &len_gdef ); - if ( error ) - goto Exit; - } - - if ( ot_flags & FT_VALIDATE_GPOS ) - { - error = otv_load_table( face, TTAG_GPOS, &gpos, &len_gpos ); - if ( error ) - goto Exit; - } - - if ( ot_flags & FT_VALIDATE_GSUB ) - { - error = otv_load_table( face, TTAG_GSUB, &gsub, &len_gsub ); - if ( error ) - goto Exit; - } - - if ( ot_flags & FT_VALIDATE_JSTF ) - { - error = otv_load_table( face, TTAG_JSTF, &jstf, &len_jstf ); - if ( error ) - goto Exit; - } - - if ( ot_flags & FT_VALIDATE_MATH ) - { - error = otv_load_table( face, TTAG_MATH, &math, &len_math ); - if ( error ) - goto Exit; - } - - /* validate tables */ - - if ( base ) - { - ft_validator_init( &valid, base, base + len_base, FT_VALIDATE_DEFAULT ); - if ( ft_setjmp( valid.jump_buffer ) == 0 ) - otv_BASE_validate( base, &valid ); - error = valid.error; - if ( error ) - goto Exit; - } - - if ( gpos ) - { - ft_validator_init( &valid, gpos, gpos + len_gpos, FT_VALIDATE_DEFAULT ); - if ( ft_setjmp( valid.jump_buffer ) == 0 ) - otv_GPOS_validate( gpos, num_glyphs, &valid ); - error = valid.error; - if ( error ) - goto Exit; - } - - if ( gsub ) - { - ft_validator_init( &valid, gsub, gsub + len_gsub, FT_VALIDATE_DEFAULT ); - if ( ft_setjmp( valid.jump_buffer ) == 0 ) - otv_GSUB_validate( gsub, num_glyphs, &valid ); - error = valid.error; - if ( error ) - goto Exit; - } - - if ( gdef ) - { - ft_validator_init( &valid, gdef, gdef + len_gdef, FT_VALIDATE_DEFAULT ); - if ( ft_setjmp( valid.jump_buffer ) == 0 ) - otv_GDEF_validate( gdef, gsub, gpos, num_glyphs, &valid ); - error = valid.error; - if ( error ) - goto Exit; - } - - if ( jstf ) - { - ft_validator_init( &valid, jstf, jstf + len_jstf, FT_VALIDATE_DEFAULT ); - if ( ft_setjmp( valid.jump_buffer ) == 0 ) - otv_JSTF_validate( jstf, gsub, gpos, num_glyphs, &valid ); - error = valid.error; - if ( error ) - goto Exit; - } - - if ( math ) - { - ft_validator_init( &valid, math, math + len_math, FT_VALIDATE_DEFAULT ); - if ( ft_setjmp( valid.jump_buffer ) == 0 ) - otv_MATH_validate( math, num_glyphs, &valid ); - error = valid.error; - if ( error ) - goto Exit; - } - - *ot_base = (FT_Bytes)base; - *ot_gdef = (FT_Bytes)gdef; - *ot_gpos = (FT_Bytes)gpos; - *ot_gsub = (FT_Bytes)gsub; - *ot_jstf = (FT_Bytes)jstf; - - Exit: - if ( error ) - { - FT_Memory memory = FT_FACE_MEMORY( face ); - - - FT_FREE( base ); - FT_FREE( gdef ); - FT_FREE( gpos ); - FT_FREE( gsub ); - FT_FREE( jstf ); - } - - { - FT_Memory memory = FT_FACE_MEMORY( face ); - - - FT_FREE( math ); /* Can't return this as API is frozen */ - } - - return error; - } - - - static - const FT_Service_OTvalidateRec otvalid_interface = - { - otv_validate - }; - - - static - const FT_ServiceDescRec otvalid_services[] = - { - { FT_SERVICE_ID_OPENTYPE_VALIDATE, &otvalid_interface }, - { NULL, NULL } - }; - - - static FT_Pointer - otvalid_get_service( FT_Module module, - const char* service_id ) - { - FT_UNUSED( module ); - - return ft_service_list_lookup( otvalid_services, service_id ); - } - - - FT_CALLBACK_TABLE_DEF - const FT_Module_Class otv_module_class = - { - 0, - sizeof ( FT_ModuleRec ), - "otvalid", - 0x10000L, - 0x20000L, - - 0, /* module-specific interface */ - - (FT_Module_Constructor)0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) otvalid_get_service - }; - - -/* END */ diff --git a/3party/freetype/src/otvalid/otvmod.h b/3party/freetype/src/otvalid/otvmod.h deleted file mode 100644 index c3a0234e9e..0000000000 --- a/3party/freetype/src/otvalid/otvmod.h +++ /dev/null @@ -1,43 +0,0 @@ -/***************************************************************************/ -/* */ -/* otvmod.h */ -/* */ -/* FreeType's OpenType validation module implementation */ -/* (specification). */ -/* */ -/* Copyright 2004-2015 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 __OTVMOD_H__ -#define __OTVMOD_H__ - - -#include <ft2build.h> -#include FT_MODULE_H - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC -#error "this module does not support PIC yet" -#endif - - - FT_EXPORT_VAR( const FT_Module_Class ) otv_module_class; - - -FT_END_HEADER - -#endif /* __OTVMOD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/otvalid/rules.mk b/3party/freetype/src/otvalid/rules.mk deleted file mode 100644 index 56d749cc97..0000000000 --- a/3party/freetype/src/otvalid/rules.mk +++ /dev/null @@ -1,81 +0,0 @@ -# -# FreeType 2 OpenType validation driver configuration rules -# - - -# Copyright 2004-2015 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. - - -# OTV driver directory -# -OTV_DIR := $(SRC_DIR)/otvalid - - -# compilation flags for the driver -# -OTV_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(OTV_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# OTV driver sources (i.e., C files) -# -OTV_DRV_SRC := $(OTV_DIR)/otvbase.c \ - $(OTV_DIR)/otvcommn.c \ - $(OTV_DIR)/otvgdef.c \ - $(OTV_DIR)/otvgpos.c \ - $(OTV_DIR)/otvgsub.c \ - $(OTV_DIR)/otvjstf.c \ - $(OTV_DIR)/otvmath.c \ - $(OTV_DIR)/otvmod.c - -# OTV driver headers -# -OTV_DRV_H := $(OTV_DIR)/otvalid.h \ - $(OTV_DIR)/otvcommn.h \ - $(OTV_DIR)/otverror.h \ - $(OTV_DIR)/otvgpos.h \ - $(OTV_DIR)/otvmod.h - - -# OTV driver object(s) -# -# OTV_DRV_OBJ_M is used during `multi' builds. -# OTV_DRV_OBJ_S is used during `single' builds. -# -OTV_DRV_OBJ_M := $(OTV_DRV_SRC:$(OTV_DIR)/%.c=$(OBJ_DIR)/%.$O) -OTV_DRV_OBJ_S := $(OBJ_DIR)/otvalid.$O - -# OTV driver source file for single build -# -OTV_DRV_SRC_S := $(OTV_DIR)/otvalid.c - - -# OTV driver - single object -# -$(OTV_DRV_OBJ_S): $(OTV_DRV_SRC_S) $(OTV_DRV_SRC) \ - $(FREETYPE_H) $(OTV_DRV_H) - $(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(OTV_DRV_SRC_S)) - - -# OTV driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(OTV_DIR)/%.c $(FREETYPE_H) $(OTV_DRV_H) - $(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(OTV_DRV_OBJ_S) -DRV_OBJS_M += $(OTV_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/pcf/Jamfile b/3party/freetype/src/pcf/Jamfile deleted file mode 100644 index f4789ea625..0000000000 --- a/3party/freetype/src/pcf/Jamfile +++ /dev/null @@ -1,32 +0,0 @@ -# FreeType 2 src/pcf Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) pcf ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = pcfdrivr - pcfread - pcfutil - ; - } - else - { - _sources = pcf ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/pcf Jamfile diff --git a/3party/freetype/src/pcf/README b/3party/freetype/src/pcf/README deleted file mode 100644 index 10eff15fbe..0000000000 --- a/3party/freetype/src/pcf/README +++ /dev/null @@ -1,96 +0,0 @@ - FreeType font driver for PCF fonts - - Francesco Zappa Nardelli - <francesco.zappa.nardelli@ens.fr> - - -Introduction -************ - -PCF (Portable Compiled Format) is a binary bitmap font format, largely used -in X world. This code implements a PCF driver for the FreeType library. -Glyph images are loaded into memory only on demand, thus leading to a small -memory footprint. - -Information on the PCF font format can only be worked out from -`pcfread.c', and `pcfwrite.c', to be found, for instance, in the XFree86 -(www.xfree86.org) source tree (xc/lib/font/bitmap/). - -Many good bitmap fonts in bdf format come with XFree86: they can be -compiled into the pcf format using the `bdftopcf' utility. - - -Supported hardware -****************** - -The driver has been tested on linux/x86 and sunos5.5/sparc. In both -cases the compiler was gcc. When back in Paris, I will test it also -on linux/alpha. - - -Encodings -********* - -Use `FT_Get_BDF_Charset_ID' to access the encoding and registry. - -The driver always exports `ft_encoding_none' as face->charmap.encoding. -FT_Get_Char_Index() behavior is unmodified, that is, it converts the ULong -value given as argument into the corresponding glyph number. - - -Known problems -************** - -- dealing explicitly with encodings breaks the uniformity of freetype2 - api. - -- except for encodings properties, client applications have no - visibility of the PCF_Face object. This means that applications - cannot directly access font tables and are obliged to trust - FreeType. - -- currently, glyph names and ink_metrics are ignored. - -I plan to give full visibility of the PCF_Face object in the next -release of the driver, thus implementing also glyph names and -ink_metrics. - -- height is defined as (ascent - descent). Is this correct? - -- if unable to read size information from the font, PCF_Init_Face - sets available_size->width and available_size->height to 12. - -- too many english grammar errors in the readme file :-( - - -License -******* - -Copyright (C) 2000 by Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -Credits -******* - -Keith Packard wrote the pcf driver found in XFree86. His work is at -the same time the specification and the sample implementation of the -PCF format. Undoubtedly, this driver is inspired from his work. diff --git a/3party/freetype/src/pcf/module.mk b/3party/freetype/src/pcf/module.mk deleted file mode 100644 index df383ff0fb..0000000000 --- a/3party/freetype/src/pcf/module.mk +++ /dev/null @@ -1,34 +0,0 @@ -# -# FreeType 2 PCF module definition -# - -# Copyright 2000, 2006 by -# Francesco Zappa Nardelli -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - - -FTMODULE_H_COMMANDS += PCF_DRIVER - -define PCF_DRIVER -$(OPEN_DRIVER) FT_Driver_ClassRec, pcf_driver_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)pcf $(ECHO_DRIVER_DESC)pcf bitmap fonts$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/pcf/pcf.c b/3party/freetype/src/pcf/pcf.c deleted file mode 100644 index 11d5b7b2a0..0000000000 --- a/3party/freetype/src/pcf/pcf.c +++ /dev/null @@ -1,36 +0,0 @@ -/* pcf.c - - FreeType font driver for pcf fonts - - Copyright 2000-2001, 2003 by - Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - - -#include <ft2build.h> -#include "pcfutil.c" -#include "pcfread.c" -#include "pcfdrivr.c" - -/* END */ diff --git a/3party/freetype/src/pcf/pcf.h b/3party/freetype/src/pcf/pcf.h deleted file mode 100644 index c0da503412..0000000000 --- a/3party/freetype/src/pcf/pcf.h +++ /dev/null @@ -1,237 +0,0 @@ -/* pcf.h - - FreeType font driver for pcf fonts - - Copyright (C) 2000, 2001, 2002, 2003, 2006, 2010 by - Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - - -#ifndef __PCF_H__ -#define __PCF_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_DRIVER_H -#include FT_INTERNAL_STREAM_H - - -FT_BEGIN_HEADER - - typedef struct PCF_TableRec_ - { - FT_ULong type; - FT_ULong format; - FT_ULong size; - FT_ULong offset; - - } PCF_TableRec, *PCF_Table; - - - typedef struct PCF_TocRec_ - { - FT_ULong version; - FT_ULong count; - PCF_Table tables; - - } PCF_TocRec, *PCF_Toc; - - - typedef struct PCF_ParsePropertyRec_ - { - FT_Long name; - FT_Byte isString; - FT_Long value; - - } PCF_ParsePropertyRec, *PCF_ParseProperty; - - - typedef struct PCF_PropertyRec_ - { - FT_String* name; - FT_Byte isString; - - union - { - FT_String* atom; - FT_Long l; - FT_ULong ul; - - } value; - - } PCF_PropertyRec, *PCF_Property; - - - typedef struct PCF_Compressed_MetricRec_ - { - FT_Byte leftSideBearing; - FT_Byte rightSideBearing; - FT_Byte characterWidth; - FT_Byte ascent; - FT_Byte descent; - - } PCF_Compressed_MetricRec, *PCF_Compressed_Metric; - - - typedef struct PCF_MetricRec_ - { - FT_Short leftSideBearing; - FT_Short rightSideBearing; - FT_Short characterWidth; - FT_Short ascent; - FT_Short descent; - FT_Short attributes; - FT_ULong bits; - - } PCF_MetricRec, *PCF_Metric; - - - typedef struct PCF_AccelRec_ - { - FT_Byte noOverlap; - FT_Byte constantMetrics; - FT_Byte terminalFont; - FT_Byte constantWidth; - FT_Byte inkInside; - FT_Byte inkMetrics; - FT_Byte drawDirection; - FT_Long fontAscent; - FT_Long fontDescent; - FT_Long maxOverlap; - PCF_MetricRec minbounds; - PCF_MetricRec maxbounds; - PCF_MetricRec ink_minbounds; - PCF_MetricRec ink_maxbounds; - - } PCF_AccelRec, *PCF_Accel; - - - typedef struct PCF_EncodingRec_ - { - FT_Long enc; - FT_UShort glyph; - - } PCF_EncodingRec, *PCF_Encoding; - - - typedef struct PCF_FaceRec_ - { - FT_FaceRec root; - - FT_StreamRec comp_stream; - FT_Stream comp_source; - - char* charset_encoding; - char* charset_registry; - - PCF_TocRec toc; - PCF_AccelRec accel; - - int nprops; - PCF_Property properties; - - FT_ULong nmetrics; - PCF_Metric metrics; - FT_ULong nencodings; - PCF_Encoding encodings; - - FT_Short defaultChar; - - FT_ULong bitmapsFormat; - - FT_CharMap charmap_handle; - FT_CharMapRec charmap; /* a single charmap per face */ - - } PCF_FaceRec, *PCF_Face; - - - /* macros for pcf font format */ - -#define LSBFirst 0 -#define MSBFirst 1 - -#define PCF_FILE_VERSION ( ( 'p' << 24 ) | \ - ( 'c' << 16 ) | \ - ( 'f' << 8 ) | 1 ) -#define PCF_FORMAT_MASK 0xFFFFFF00UL - -#define PCF_DEFAULT_FORMAT 0x00000000UL -#define PCF_INKBOUNDS 0x00000200UL -#define PCF_ACCEL_W_INKBOUNDS 0x00000100UL -#define PCF_COMPRESSED_METRICS 0x00000100UL - -#define PCF_FORMAT_MATCH( a, b ) \ - ( ( (a) & PCF_FORMAT_MASK ) == ( (b) & PCF_FORMAT_MASK ) ) - -#define PCF_GLYPH_PAD_MASK ( 3 << 0 ) -#define PCF_BYTE_MASK ( 1 << 2 ) -#define PCF_BIT_MASK ( 1 << 3 ) -#define PCF_SCAN_UNIT_MASK ( 3 << 4 ) - -#define PCF_BYTE_ORDER( f ) \ - ( ( (f) & PCF_BYTE_MASK ) ? MSBFirst : LSBFirst ) -#define PCF_BIT_ORDER( f ) \ - ( ( (f) & PCF_BIT_MASK ) ? MSBFirst : LSBFirst ) -#define PCF_GLYPH_PAD_INDEX( f ) \ - ( (f) & PCF_GLYPH_PAD_MASK ) -#define PCF_GLYPH_PAD( f ) \ - ( 1 << PCF_GLYPH_PAD_INDEX( f ) ) -#define PCF_SCAN_UNIT_INDEX( f ) \ - ( ( (f) & PCF_SCAN_UNIT_MASK ) >> 4 ) -#define PCF_SCAN_UNIT( f ) \ - ( 1 << PCF_SCAN_UNIT_INDEX( f ) ) -#define PCF_FORMAT_BITS( f ) \ - ( (f) & ( PCF_GLYPH_PAD_MASK | \ - PCF_BYTE_MASK | \ - PCF_BIT_MASK | \ - PCF_SCAN_UNIT_MASK ) ) - -#define PCF_SIZE_TO_INDEX( s ) ( (s) == 4 ? 2 : (s) == 2 ? 1 : 0 ) -#define PCF_INDEX_TO_SIZE( b ) ( 1 << b ) - -#define PCF_FORMAT( bit, byte, glyph, scan ) \ - ( ( PCF_SIZE_TO_INDEX( scan ) << 4 ) | \ - ( ( (bit) == MSBFirst ? 1 : 0 ) << 3 ) | \ - ( ( (byte) == MSBFirst ? 1 : 0 ) << 2 ) | \ - ( PCF_SIZE_TO_INDEX( glyph ) << 0 ) ) - -#define PCF_PROPERTIES ( 1 << 0 ) -#define PCF_ACCELERATORS ( 1 << 1 ) -#define PCF_METRICS ( 1 << 2 ) -#define PCF_BITMAPS ( 1 << 3 ) -#define PCF_INK_METRICS ( 1 << 4 ) -#define PCF_BDF_ENCODINGS ( 1 << 5 ) -#define PCF_SWIDTHS ( 1 << 6 ) -#define PCF_GLYPH_NAMES ( 1 << 7 ) -#define PCF_BDF_ACCELERATORS ( 1 << 8 ) - -#define GLYPHPADOPTIONS 4 /* I'm not sure about this */ - - FT_LOCAL( FT_Error ) - pcf_load_font( FT_Stream, - PCF_Face ); - -FT_END_HEADER - -#endif /* __PCF_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pcf/pcfdrivr.c b/3party/freetype/src/pcf/pcfdrivr.c deleted file mode 100644 index 8d2ed7cf4d..0000000000 --- a/3party/freetype/src/pcf/pcfdrivr.c +++ /dev/null @@ -1,730 +0,0 @@ -/* pcfdrivr.c - - FreeType font driver for pcf files - - Copyright (C) 2000-2004, 2006-2011, 2013, 2014 by - Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - - -#include <ft2build.h> - -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_OBJECTS_H -#include FT_GZIP_H -#include FT_LZW_H -#include FT_BZIP2_H -#include FT_ERRORS_H -#include FT_BDF_H -#include FT_TRUETYPE_IDS_H - -#include "pcf.h" -#include "pcfdrivr.h" -#include "pcfread.h" - -#include "pcferror.h" -#include "pcfutil.h" - -#undef FT_COMPONENT -#define FT_COMPONENT trace_pcfread - -#include FT_SERVICE_BDF_H -#include FT_SERVICE_FONT_FORMAT_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_pcfdriver - - - typedef struct PCF_CMapRec_ - { - FT_CMapRec root; - FT_ULong num_encodings; - PCF_Encoding encodings; - - } PCF_CMapRec, *PCF_CMap; - - - FT_CALLBACK_DEF( FT_Error ) - pcf_cmap_init( FT_CMap pcfcmap, /* PCF_CMap */ - FT_Pointer init_data ) - { - PCF_CMap cmap = (PCF_CMap)pcfcmap; - PCF_Face face = (PCF_Face)FT_CMAP_FACE( pcfcmap ); - - FT_UNUSED( init_data ); - - - cmap->num_encodings = face->nencodings; - cmap->encodings = face->encodings; - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( void ) - pcf_cmap_done( FT_CMap pcfcmap ) /* PCF_CMap */ - { - PCF_CMap cmap = (PCF_CMap)pcfcmap; - - - cmap->encodings = NULL; - cmap->num_encodings = 0; - } - - - FT_CALLBACK_DEF( FT_UInt ) - pcf_cmap_char_index( FT_CMap pcfcmap, /* PCF_CMap */ - FT_UInt32 charcode ) - { - PCF_CMap cmap = (PCF_CMap)pcfcmap; - PCF_Encoding encodings = cmap->encodings; - FT_ULong min, max, mid; - FT_UInt result = 0; - - - min = 0; - max = cmap->num_encodings; - - while ( min < max ) - { - FT_ULong code; - - - mid = ( min + max ) >> 1; - code = (FT_ULong)encodings[mid].enc; - - if ( charcode == code ) - { - result = encodings[mid].glyph + 1; - break; - } - - if ( charcode < code ) - max = mid; - else - min = mid + 1; - } - - return result; - } - - - FT_CALLBACK_DEF( FT_UInt ) - pcf_cmap_char_next( FT_CMap pcfcmap, /* PCF_CMap */ - FT_UInt32 *acharcode ) - { - PCF_CMap cmap = (PCF_CMap)pcfcmap; - PCF_Encoding encodings = cmap->encodings; - FT_ULong min, max, mid; - FT_ULong charcode = *acharcode + 1; - FT_UInt result = 0; - - - min = 0; - max = cmap->num_encodings; - - while ( min < max ) - { - FT_ULong code; - - - mid = ( min + max ) >> 1; - code = (FT_ULong)encodings[mid].enc; - - if ( charcode == code ) - { - result = encodings[mid].glyph + 1; - goto Exit; - } - - if ( charcode < code ) - max = mid; - else - min = mid + 1; - } - - charcode = 0; - if ( min < cmap->num_encodings ) - { - charcode = (FT_ULong)encodings[min].enc; - result = encodings[min].glyph + 1; - } - - Exit: - if ( charcode > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "pcf_cmap_char_next: charcode 0x%x > 32bit API" )); - *acharcode = 0; - /* XXX: result should be changed to indicate an overflow error */ - } - else - *acharcode = (FT_UInt32)charcode; - return result; - } - - - static - const FT_CMap_ClassRec pcf_cmap_class = - { - sizeof ( PCF_CMapRec ), - pcf_cmap_init, - pcf_cmap_done, - pcf_cmap_char_index, - pcf_cmap_char_next, - - NULL, NULL, NULL, NULL, NULL - }; - - - FT_CALLBACK_DEF( void ) - PCF_Face_Done( FT_Face pcfface ) /* PCF_Face */ - { - PCF_Face face = (PCF_Face)pcfface; - FT_Memory memory; - - - if ( !face ) - return; - - memory = FT_FACE_MEMORY( face ); - - FT_FREE( face->encodings ); - FT_FREE( face->metrics ); - - /* free properties */ - if ( face->properties ) - { - FT_Int i; - - - for ( i = 0; i < face->nprops; i++ ) - { - PCF_Property prop = &face->properties[i]; - - - if ( prop ) - { - FT_FREE( prop->name ); - if ( prop->isString ) - FT_FREE( prop->value.atom ); - } - } - - FT_FREE( face->properties ); - } - - FT_FREE( face->toc.tables ); - FT_FREE( pcfface->family_name ); - FT_FREE( pcfface->style_name ); - FT_FREE( pcfface->available_sizes ); - FT_FREE( face->charset_encoding ); - FT_FREE( face->charset_registry ); - - /* close compressed stream if any */ - if ( pcfface->stream == &face->comp_stream ) - { - FT_Stream_Close( &face->comp_stream ); - pcfface->stream = face->comp_source; - } - } - - - FT_CALLBACK_DEF( FT_Error ) - PCF_Face_Init( FT_Stream stream, - FT_Face pcfface, /* PCF_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ) - { - PCF_Face face = (PCF_Face)pcfface; - FT_Error error; - - FT_UNUSED( num_params ); - FT_UNUSED( params ); - - - FT_TRACE2(( "PCF driver\n" )); - - error = pcf_load_font( stream, face ); - if ( error ) - { - PCF_Face_Done( pcfface ); - -#if defined( FT_CONFIG_OPTION_USE_ZLIB ) || \ - defined( FT_CONFIG_OPTION_USE_LZW ) || \ - defined( FT_CONFIG_OPTION_USE_BZIP2 ) - -#ifdef FT_CONFIG_OPTION_USE_ZLIB - { - FT_Error error2; - - - /* this didn't work, try gzip support! */ - error2 = FT_Stream_OpenGzip( &face->comp_stream, stream ); - if ( FT_ERR_EQ( error2, Unimplemented_Feature ) ) - goto Fail; - - error = error2; - } -#endif /* FT_CONFIG_OPTION_USE_ZLIB */ - -#ifdef FT_CONFIG_OPTION_USE_LZW - if ( error ) - { - FT_Error error3; - - - /* this didn't work, try LZW support! */ - error3 = FT_Stream_OpenLZW( &face->comp_stream, stream ); - if ( FT_ERR_EQ( error3, Unimplemented_Feature ) ) - goto Fail; - - error = error3; - } -#endif /* FT_CONFIG_OPTION_USE_LZW */ - -#ifdef FT_CONFIG_OPTION_USE_BZIP2 - if ( error ) - { - FT_Error error4; - - - /* this didn't work, try Bzip2 support! */ - error4 = FT_Stream_OpenBzip2( &face->comp_stream, stream ); - if ( FT_ERR_EQ( error4, Unimplemented_Feature ) ) - goto Fail; - - error = error4; - } -#endif /* FT_CONFIG_OPTION_USE_BZIP2 */ - - if ( error ) - goto Fail; - - face->comp_source = stream; - pcfface->stream = &face->comp_stream; - - stream = pcfface->stream; - - error = pcf_load_font( stream, face ); - if ( error ) - goto Fail; - -#else /* !(FT_CONFIG_OPTION_USE_ZLIB || - FT_CONFIG_OPTION_USE_LZW || - FT_CONFIG_OPTION_USE_BZIP2) */ - - goto Fail; - -#endif - } - - /* PCF cannot have multiple faces in a single font file. - * XXX: A non-zero face_index is already an invalid argument, but - * Type1, Type42 drivers have a convention to return - * an invalid argument error when the font could be - * opened by the specified driver. - */ - if ( face_index > 0 && ( face_index & 0xFFFF ) > 0 ) - { - FT_ERROR(( "PCF_Face_Init: invalid face index\n" )); - PCF_Face_Done( pcfface ); - return FT_THROW( Invalid_Argument ); - } - - /* set up charmap */ - { - FT_String *charset_registry = face->charset_registry; - FT_String *charset_encoding = face->charset_encoding; - FT_Bool unicode_charmap = 0; - - - if ( charset_registry && charset_encoding ) - { - char* s = charset_registry; - - - /* Uh, oh, compare first letters manually to avoid dependency - on locales. */ - if ( ( s[0] == 'i' || s[0] == 'I' ) && - ( s[1] == 's' || s[1] == 'S' ) && - ( s[2] == 'o' || s[2] == 'O' ) ) - { - s += 3; - if ( !ft_strcmp( s, "10646" ) || - ( !ft_strcmp( s, "8859" ) && - !ft_strcmp( face->charset_encoding, "1" ) ) ) - unicode_charmap = 1; - } - } - - { - FT_CharMapRec charmap; - - - charmap.face = FT_FACE( face ); - charmap.encoding = FT_ENCODING_NONE; - /* initial platform/encoding should indicate unset status? */ - charmap.platform_id = TT_PLATFORM_APPLE_UNICODE; - charmap.encoding_id = TT_APPLE_ID_DEFAULT; - - if ( unicode_charmap ) - { - charmap.encoding = FT_ENCODING_UNICODE; - charmap.platform_id = TT_PLATFORM_MICROSOFT; - charmap.encoding_id = TT_MS_ID_UNICODE_CS; - } - - error = FT_CMap_New( &pcf_cmap_class, NULL, &charmap, NULL ); - -#if 0 - /* Select default charmap */ - if ( pcfface->num_charmaps ) - pcfface->charmap = pcfface->charmaps[0]; -#endif - } - } - - Exit: - return error; - - Fail: - FT_TRACE2(( " not a PCF file\n" )); - PCF_Face_Done( pcfface ); - error = FT_THROW( Unknown_File_Format ); /* error */ - goto Exit; - } - - - FT_CALLBACK_DEF( FT_Error ) - PCF_Size_Select( FT_Size size, - FT_ULong strike_index ) - { - PCF_Accel accel = &( (PCF_Face)size->face )->accel; - - - FT_Select_Metrics( size->face, strike_index ); - - size->metrics.ascender = accel->fontAscent * 64; - size->metrics.descender = -accel->fontDescent * 64; - size->metrics.max_advance = accel->maxbounds.characterWidth * 64; - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_Error ) - PCF_Size_Request( FT_Size size, - FT_Size_Request req ) - { - PCF_Face face = (PCF_Face)size->face; - FT_Bitmap_Size* bsize = size->face->available_sizes; - FT_Error error = FT_ERR( Invalid_Pixel_Size ); - FT_Long height; - - - height = FT_REQUEST_HEIGHT( req ); - height = ( height + 32 ) >> 6; - - switch ( req->type ) - { - case FT_SIZE_REQUEST_TYPE_NOMINAL: - if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) ) - error = FT_Err_Ok; - break; - - case FT_SIZE_REQUEST_TYPE_REAL_DIM: - if ( height == ( face->accel.fontAscent + - face->accel.fontDescent ) ) - error = FT_Err_Ok; - break; - - default: - error = FT_THROW( Unimplemented_Feature ); - break; - } - - if ( error ) - return error; - else - return PCF_Size_Select( size, 0 ); - } - - - FT_CALLBACK_DEF( FT_Error ) - PCF_Glyph_Load( FT_GlyphSlot slot, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - PCF_Face face = (PCF_Face)FT_SIZE_FACE( size ); - FT_Stream stream; - FT_Error error = FT_Err_Ok; - FT_Bitmap* bitmap = &slot->bitmap; - PCF_Metric metric; - FT_ULong bytes; - - FT_UNUSED( load_flags ); - - - FT_TRACE1(( "PCF_Glyph_Load: glyph index %d\n", glyph_index )); - - if ( !face ) - { - error = FT_THROW( Invalid_Face_Handle ); - goto Exit; - } - - if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - stream = face->root.stream; - - if ( glyph_index > 0 ) - glyph_index--; - - metric = face->metrics + glyph_index; - - bitmap->rows = (unsigned int)( metric->ascent + - metric->descent ); - bitmap->width = (unsigned int)( metric->rightSideBearing - - metric->leftSideBearing ); - bitmap->num_grays = 1; - bitmap->pixel_mode = FT_PIXEL_MODE_MONO; - - FT_TRACE6(( "BIT_ORDER %d ; BYTE_ORDER %d ; GLYPH_PAD %d\n", - PCF_BIT_ORDER( face->bitmapsFormat ), - PCF_BYTE_ORDER( face->bitmapsFormat ), - PCF_GLYPH_PAD( face->bitmapsFormat ) )); - - switch ( PCF_GLYPH_PAD( face->bitmapsFormat ) ) - { - case 1: - bitmap->pitch = (int)( ( bitmap->width + 7 ) >> 3 ); - break; - - case 2: - bitmap->pitch = (int)( ( ( bitmap->width + 15 ) >> 4 ) << 1 ); - break; - - case 4: - bitmap->pitch = (int)( ( ( bitmap->width + 31 ) >> 5 ) << 2 ); - break; - - case 8: - bitmap->pitch = (int)( ( ( bitmap->width + 63 ) >> 6 ) << 3 ); - break; - - default: - return FT_THROW( Invalid_File_Format ); - } - - /* XXX: to do: are there cases that need repadding the bitmap? */ - bytes = (FT_ULong)bitmap->pitch * bitmap->rows; - - error = ft_glyphslot_alloc_bitmap( slot, (FT_ULong)bytes ); - if ( error ) - goto Exit; - - if ( FT_STREAM_SEEK( metric->bits ) || - FT_STREAM_READ( bitmap->buffer, bytes ) ) - goto Exit; - - if ( PCF_BIT_ORDER( face->bitmapsFormat ) != MSBFirst ) - BitOrderInvert( bitmap->buffer, bytes ); - - if ( ( PCF_BYTE_ORDER( face->bitmapsFormat ) != - PCF_BIT_ORDER( face->bitmapsFormat ) ) ) - { - switch ( PCF_SCAN_UNIT( face->bitmapsFormat ) ) - { - case 1: - break; - - case 2: - TwoByteSwap( bitmap->buffer, bytes ); - break; - - case 4: - FourByteSwap( bitmap->buffer, bytes ); - break; - } - } - - slot->format = FT_GLYPH_FORMAT_BITMAP; - slot->bitmap_left = metric->leftSideBearing; - slot->bitmap_top = metric->ascent; - - slot->metrics.horiAdvance = (FT_Pos)( metric->characterWidth * 64 ); - slot->metrics.horiBearingX = (FT_Pos)( metric->leftSideBearing * 64 ); - slot->metrics.horiBearingY = (FT_Pos)( metric->ascent * 64 ); - slot->metrics.width = (FT_Pos)( ( metric->rightSideBearing - - metric->leftSideBearing ) * 64 ); - slot->metrics.height = (FT_Pos)( bitmap->rows * 64 ); - - ft_synthesize_vertical_metrics( &slot->metrics, - ( face->accel.fontAscent + - face->accel.fontDescent ) * 64 ); - - Exit: - return error; - } - - - /* - * - * BDF SERVICE - * - */ - - static FT_Error - pcf_get_bdf_property( PCF_Face face, - const char* prop_name, - BDF_PropertyRec *aproperty ) - { - PCF_Property prop; - - - prop = pcf_find_property( face, prop_name ); - if ( prop != NULL ) - { - if ( prop->isString ) - { - aproperty->type = BDF_PROPERTY_TYPE_ATOM; - aproperty->u.atom = prop->value.atom; - } - else - { - if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) ) - { - FT_TRACE1(( "pcf_get_bdf_property: " )); - FT_TRACE1(( "too large integer 0x%x is truncated\n" )); - } - /* Apparently, the PCF driver loads all properties as signed integers! - * This really doesn't seem to be a problem, because this is - * sufficient for any meaningful values. - */ - aproperty->type = BDF_PROPERTY_TYPE_INTEGER; - aproperty->u.integer = (FT_Int32)prop->value.l; - } - return 0; - } - - return FT_THROW( Invalid_Argument ); - } - - - static FT_Error - pcf_get_charset_id( PCF_Face face, - const char* *acharset_encoding, - const char* *acharset_registry ) - { - *acharset_encoding = face->charset_encoding; - *acharset_registry = face->charset_registry; - - return 0; - } - - - static const FT_Service_BDFRec pcf_service_bdf = - { - (FT_BDF_GetCharsetIdFunc)pcf_get_charset_id, - (FT_BDF_GetPropertyFunc) pcf_get_bdf_property - }; - - - /* - * - * SERVICE LIST - * - */ - - static const FT_ServiceDescRec pcf_services[] = - { - { FT_SERVICE_ID_BDF, &pcf_service_bdf }, - { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_PCF }, - { NULL, NULL } - }; - - - FT_CALLBACK_DEF( FT_Module_Interface ) - pcf_driver_requester( FT_Module module, - const char* name ) - { - FT_UNUSED( module ); - - return ft_service_list_lookup( pcf_services, name ); - } - - - FT_CALLBACK_TABLE_DEF - const FT_Driver_ClassRec pcf_driver_class = - { - { - FT_MODULE_FONT_DRIVER | - FT_MODULE_DRIVER_NO_OUTLINES, - sizeof ( FT_DriverRec ), - - "pcf", - 0x10000L, - 0x20000L, - - 0, - - 0, /* FT_Module_Constructor */ - 0, /* FT_Module_Destructor */ - pcf_driver_requester - }, - - sizeof ( PCF_FaceRec ), - sizeof ( FT_SizeRec ), - sizeof ( FT_GlyphSlotRec ), - - PCF_Face_Init, - PCF_Face_Done, - 0, /* FT_Size_InitFunc */ - 0, /* FT_Size_DoneFunc */ - 0, /* FT_Slot_InitFunc */ - 0, /* FT_Slot_DoneFunc */ - - PCF_Glyph_Load, - - 0, /* FT_Face_GetKerningFunc */ - 0, /* FT_Face_AttachFunc */ - 0, /* FT_Face_GetAdvancesFunc */ - - PCF_Size_Request, - PCF_Size_Select - }; - - -/* END */ diff --git a/3party/freetype/src/pcf/pcfdrivr.h b/3party/freetype/src/pcf/pcfdrivr.h deleted file mode 100644 index 54614951b5..0000000000 --- a/3party/freetype/src/pcf/pcfdrivr.h +++ /dev/null @@ -1,48 +0,0 @@ -/* pcfdrivr.h - - FreeType font driver for pcf fonts - - Copyright 2000-2001, 2002 by - Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - - -#ifndef __PCFDRIVR_H__ -#define __PCFDRIVR_H__ - -#include <ft2build.h> -#include FT_INTERNAL_DRIVER_H - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC -#error "this module does not support PIC yet" -#endif - - FT_EXPORT_VAR( const FT_Driver_ClassRec ) pcf_driver_class; - -FT_END_HEADER - - -#endif /* __PCFDRIVR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pcf/pcferror.h b/3party/freetype/src/pcf/pcferror.h deleted file mode 100644 index e51fff8ea6..0000000000 --- a/3party/freetype/src/pcf/pcferror.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* pcferror.h */ -/* */ -/* PCF error codes (specification only). */ -/* */ -/* Copyright 2001, 2012 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the PCF error enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __PCFERROR_H__ -#define __PCFERROR_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX PCF_Err_ -#define FT_ERR_BASE FT_Mod_Err_PCF - -#include FT_ERRORS_H - -#endif /* __PCFERROR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pcf/pcfread.c b/3party/freetype/src/pcf/pcfread.c deleted file mode 100644 index 039af33e90..0000000000 --- a/3party/freetype/src/pcf/pcfread.c +++ /dev/null @@ -1,1349 +0,0 @@ -/* pcfread.c - - FreeType font driver for pcf fonts - - Copyright 2000-2010, 2012-2014 by - Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - - -#include <ft2build.h> - -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_OBJECTS_H - -#include "pcf.h" -#include "pcfread.h" - -#include "pcferror.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_pcfread - - -#ifdef FT_DEBUG_LEVEL_TRACE - static const char* const tableNames[] = - { - "prop", "accl", "mtrcs", "bmps", "imtrcs", - "enc", "swidth", "names", "accel" - }; -#endif - - - static - const FT_Frame_Field pcf_toc_header[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE PCF_TocRec - - FT_FRAME_START( 8 ), - FT_FRAME_ULONG_LE( version ), - FT_FRAME_ULONG_LE( count ), - FT_FRAME_END - }; - - - static - const FT_Frame_Field pcf_table_header[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE PCF_TableRec - - FT_FRAME_START( 16 ), - FT_FRAME_ULONG_LE( type ), - FT_FRAME_ULONG_LE( format ), - FT_FRAME_ULONG_LE( size ), /* rounded up to a multiple of 4 */ - FT_FRAME_ULONG_LE( offset ), - FT_FRAME_END - }; - - - static FT_Error - pcf_read_TOC( FT_Stream stream, - PCF_Face face ) - { - FT_Error error; - PCF_Toc toc = &face->toc; - PCF_Table tables; - - FT_Memory memory = FT_FACE( face )->memory; - FT_UInt n; - - FT_ULong size; - - - if ( FT_STREAM_SEEK( 0 ) || - FT_STREAM_READ_FIELDS( pcf_toc_header, toc ) ) - return FT_THROW( Cannot_Open_Resource ); - - if ( toc->version != PCF_FILE_VERSION || - toc->count > FT_ARRAY_MAX( face->toc.tables ) || - toc->count == 0 ) - return FT_THROW( Invalid_File_Format ); - - if ( FT_NEW_ARRAY( face->toc.tables, toc->count ) ) - return FT_THROW( Out_Of_Memory ); - - tables = face->toc.tables; - for ( n = 0; n < toc->count; n++ ) - { - if ( FT_STREAM_READ_FIELDS( pcf_table_header, tables ) ) - goto Exit; - tables++; - } - - /* Sort tables and check for overlaps. Because they are almost */ - /* always ordered already, an in-place bubble sort with simultaneous */ - /* boundary checking seems appropriate. */ - tables = face->toc.tables; - - for ( n = 0; n < toc->count - 1; n++ ) - { - FT_UInt i, have_change; - - - have_change = 0; - - for ( i = 0; i < toc->count - 1 - n; i++ ) - { - PCF_TableRec tmp; - - - if ( tables[i].offset > tables[i + 1].offset ) - { - tmp = tables[i]; - tables[i] = tables[i + 1]; - tables[i + 1] = tmp; - - have_change = 1; - } - - if ( ( tables[i].size > tables[i + 1].offset ) || - ( tables[i].offset > tables[i + 1].offset - tables[i].size ) ) - { - error = FT_THROW( Invalid_Offset ); - goto Exit; - } - } - - if ( !have_change ) - break; - } - - /* - * We now check whether the `size' and `offset' values are reasonable: - * `offset' + `size' must not exceed the stream size. - * - * Note, however, that X11's `pcfWriteFont' routine (used by the - * `bdftopcf' program to create PDF font files) has two special - * features. - * - * - It always assigns the accelerator table a size of 100 bytes in the - * TOC, regardless of its real size, which can vary between 34 and 72 - * bytes. - * - * - Due to the way the routine is designed, it ships out the last font - * table with its real size, ignoring the TOC's size value. Since - * the TOC size values are always rounded up to a multiple of 4, the - * difference can be up to three bytes for all tables except the - * accelerator table, for which the difference can be as large as 66 - * bytes. - * - */ - - tables = face->toc.tables; - size = stream->size; - - for ( n = 0; n < toc->count - 1; n++ ) - { - /* we need two checks to avoid overflow */ - if ( ( tables->size > size ) || - ( tables->offset > size - tables->size ) ) - { - error = FT_THROW( Invalid_Table ); - goto Exit; - } - tables++; - } - - /* only check `tables->offset' for last table element ... */ - if ( ( tables->offset > size ) ) - { - error = FT_THROW( Invalid_Table ); - goto Exit; - } - /* ... and adjust `tables->size' to the real value if necessary */ - if ( tables->size > size - tables->offset ) - tables->size = size - tables->offset; - -#ifdef FT_DEBUG_LEVEL_TRACE - - { - FT_UInt i, j; - const char* name = "?"; - - - FT_TRACE4(( "pcf_read_TOC:\n" )); - - FT_TRACE4(( " number of tables: %ld\n", face->toc.count )); - - tables = face->toc.tables; - for ( i = 0; i < toc->count; i++ ) - { - for ( j = 0; j < sizeof ( tableNames ) / sizeof ( tableNames[0] ); - j++ ) - if ( tables[i].type == (FT_UInt)( 1 << j ) ) - name = tableNames[j]; - - FT_TRACE4(( " %d: type=%s, format=0x%X, " - "size=%ld (0x%lX), offset=%ld (0x%lX)\n", - i, name, - tables[i].format, - tables[i].size, tables[i].size, - tables[i].offset, tables[i].offset )); - } - } - -#endif - - return FT_Err_Ok; - - Exit: - FT_FREE( face->toc.tables ); - return error; - } - - -#define PCF_METRIC_SIZE 12 - - static - const FT_Frame_Field pcf_metric_header[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE PCF_MetricRec - - FT_FRAME_START( PCF_METRIC_SIZE ), - FT_FRAME_SHORT_LE( leftSideBearing ), - FT_FRAME_SHORT_LE( rightSideBearing ), - FT_FRAME_SHORT_LE( characterWidth ), - FT_FRAME_SHORT_LE( ascent ), - FT_FRAME_SHORT_LE( descent ), - FT_FRAME_SHORT_LE( attributes ), - FT_FRAME_END - }; - - - static - const FT_Frame_Field pcf_metric_msb_header[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE PCF_MetricRec - - FT_FRAME_START( PCF_METRIC_SIZE ), - FT_FRAME_SHORT( leftSideBearing ), - FT_FRAME_SHORT( rightSideBearing ), - FT_FRAME_SHORT( characterWidth ), - FT_FRAME_SHORT( ascent ), - FT_FRAME_SHORT( descent ), - FT_FRAME_SHORT( attributes ), - FT_FRAME_END - }; - - -#define PCF_COMPRESSED_METRIC_SIZE 5 - - static - const FT_Frame_Field pcf_compressed_metric_header[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE PCF_Compressed_MetricRec - - FT_FRAME_START( PCF_COMPRESSED_METRIC_SIZE ), - FT_FRAME_BYTE( leftSideBearing ), - FT_FRAME_BYTE( rightSideBearing ), - FT_FRAME_BYTE( characterWidth ), - FT_FRAME_BYTE( ascent ), - FT_FRAME_BYTE( descent ), - FT_FRAME_END - }; - - - static FT_Error - pcf_get_metric( FT_Stream stream, - FT_ULong format, - PCF_Metric metric ) - { - FT_Error error = FT_Err_Ok; - - - if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) - { - const FT_Frame_Field* fields; - - - /* parsing normal metrics */ - fields = PCF_BYTE_ORDER( format ) == MSBFirst - ? pcf_metric_msb_header - : pcf_metric_header; - - /* the following sets `error' but doesn't return in case of failure */ - (void)FT_STREAM_READ_FIELDS( fields, metric ); - } - else - { - PCF_Compressed_MetricRec compr; - - - /* parsing compressed metrics */ - if ( FT_STREAM_READ_FIELDS( pcf_compressed_metric_header, &compr ) ) - goto Exit; - - metric->leftSideBearing = (FT_Short)( compr.leftSideBearing - 0x80 ); - metric->rightSideBearing = (FT_Short)( compr.rightSideBearing - 0x80 ); - metric->characterWidth = (FT_Short)( compr.characterWidth - 0x80 ); - metric->ascent = (FT_Short)( compr.ascent - 0x80 ); - metric->descent = (FT_Short)( compr.descent - 0x80 ); - metric->attributes = 0; - } - - Exit: - return error; - } - - - static FT_Error - pcf_seek_to_table_type( FT_Stream stream, - PCF_Table tables, - FT_ULong ntables, /* same as PCF_Toc->count */ - FT_ULong type, - FT_ULong *aformat, - FT_ULong *asize ) - { - FT_Error error = FT_ERR( Invalid_File_Format ); - FT_ULong i; - - - for ( i = 0; i < ntables; i++ ) - if ( tables[i].type == type ) - { - if ( stream->pos > tables[i].offset ) - { - error = FT_THROW( Invalid_Stream_Skip ); - goto Fail; - } - - if ( FT_STREAM_SKIP( tables[i].offset - stream->pos ) ) - { - error = FT_THROW( Invalid_Stream_Skip ); - goto Fail; - } - - *asize = tables[i].size; - *aformat = tables[i].format; - - return FT_Err_Ok; - } - - Fail: - *asize = 0; - return error; - } - - - static FT_Bool - pcf_has_table_type( PCF_Table tables, - FT_ULong ntables, /* same as PCF_Toc->count */ - FT_ULong type ) - { - FT_ULong i; - - - for ( i = 0; i < ntables; i++ ) - if ( tables[i].type == type ) - return TRUE; - - return FALSE; - } - - -#define PCF_PROPERTY_SIZE 9 - - static - const FT_Frame_Field pcf_property_header[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE PCF_ParsePropertyRec - - FT_FRAME_START( PCF_PROPERTY_SIZE ), - FT_FRAME_LONG_LE( name ), - FT_FRAME_BYTE ( isString ), - FT_FRAME_LONG_LE( value ), - FT_FRAME_END - }; - - - static - const FT_Frame_Field pcf_property_msb_header[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE PCF_ParsePropertyRec - - FT_FRAME_START( PCF_PROPERTY_SIZE ), - FT_FRAME_LONG( name ), - FT_FRAME_BYTE( isString ), - FT_FRAME_LONG( value ), - FT_FRAME_END - }; - - - FT_LOCAL_DEF( PCF_Property ) - pcf_find_property( PCF_Face face, - const FT_String* prop ) - { - PCF_Property properties = face->properties; - FT_Bool found = 0; - int i; - - - for ( i = 0 ; i < face->nprops && !found; i++ ) - { - if ( !ft_strcmp( properties[i].name, prop ) ) - found = 1; - } - - if ( found ) - return properties + i - 1; - else - return NULL; - } - - - static FT_Error - pcf_get_properties( FT_Stream stream, - PCF_Face face ) - { - PCF_ParseProperty props = NULL; - PCF_Property properties = NULL; - FT_ULong nprops, i; - FT_ULong format, size; - FT_Error error; - FT_Memory memory = FT_FACE( face )->memory; - FT_ULong string_size; - FT_String* strings = NULL; - - - error = pcf_seek_to_table_type( stream, - face->toc.tables, - face->toc.count, - PCF_PROPERTIES, - &format, - &size ); - if ( error ) - goto Bail; - - if ( FT_READ_ULONG_LE( format ) ) - goto Bail; - - FT_TRACE4(( "pcf_get_properties:\n" )); - - FT_TRACE4(( " format = %ld\n", format )); - - if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) - goto Bail; - - if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - (void)FT_READ_ULONG( nprops ); - else - (void)FT_READ_ULONG_LE( nprops ); - if ( error ) - goto Bail; - - FT_TRACE4(( " nprop = %d (truncate %d props)\n", - (int)nprops, nprops - (FT_ULong)(int)nprops )); - - nprops = (FT_ULong)(int)nprops; - - /* rough estimate */ - if ( nprops > size / PCF_PROPERTY_SIZE ) - { - error = FT_THROW( Invalid_Table ); - goto Bail; - } - - face->nprops = (int)nprops; - - if ( FT_NEW_ARRAY( props, nprops ) ) - goto Bail; - - for ( i = 0; i < nprops; i++ ) - { - if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - { - if ( FT_STREAM_READ_FIELDS( pcf_property_msb_header, props + i ) ) - goto Bail; - } - else - { - if ( FT_STREAM_READ_FIELDS( pcf_property_header, props + i ) ) - goto Bail; - } - } - - /* pad the property array */ - /* */ - /* clever here - nprops is the same as the number of odd-units read, */ - /* as only isStringProp are odd length (Keith Packard) */ - /* */ - if ( nprops & 3 ) - { - i = 4 - ( nprops & 3 ); - if ( FT_STREAM_SKIP( i ) ) - { - error = FT_THROW( Invalid_Stream_Skip ); - goto Bail; - } - } - - if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - (void)FT_READ_ULONG( string_size ); - else - (void)FT_READ_ULONG_LE( string_size ); - if ( error ) - goto Bail; - - FT_TRACE4(( " string_size = %ld\n", string_size )); - - /* rough estimate */ - if ( string_size > size - nprops * PCF_PROPERTY_SIZE ) - { - error = FT_THROW( Invalid_Table ); - goto Bail; - } - - /* allocate one more byte so that we have a final null byte */ - if ( FT_NEW_ARRAY( strings, string_size + 1 ) ) - goto Bail; - - error = FT_Stream_Read( stream, (FT_Byte*)strings, string_size ); - if ( error ) - goto Bail; - - if ( FT_NEW_ARRAY( properties, nprops ) ) - goto Bail; - - face->properties = properties; - - for ( i = 0; i < nprops; i++ ) - { - FT_Long name_offset = props[i].name; - - - if ( ( name_offset < 0 ) || - ( (FT_ULong)name_offset > string_size ) ) - { - error = FT_THROW( Invalid_Offset ); - goto Bail; - } - - if ( FT_STRDUP( properties[i].name, strings + name_offset ) ) - goto Bail; - - FT_TRACE4(( " %s:", properties[i].name )); - - properties[i].isString = props[i].isString; - - if ( props[i].isString ) - { - FT_Long value_offset = props[i].value; - - - if ( ( value_offset < 0 ) || - ( (FT_ULong)value_offset > string_size ) ) - { - error = FT_THROW( Invalid_Offset ); - goto Bail; - } - - if ( FT_STRDUP( properties[i].value.atom, strings + value_offset ) ) - goto Bail; - - FT_TRACE4(( " `%s'\n", properties[i].value.atom )); - } - else - { - properties[i].value.l = props[i].value; - - FT_TRACE4(( " %d\n", properties[i].value.l )); - } - } - - error = FT_Err_Ok; - - Bail: - FT_FREE( props ); - FT_FREE( strings ); - - return error; - } - - - static FT_Error - pcf_get_metrics( FT_Stream stream, - PCF_Face face ) - { - FT_Error error; - FT_Memory memory = FT_FACE( face )->memory; - FT_ULong format, size; - PCF_Metric metrics = NULL; - FT_ULong nmetrics, i; - - - error = pcf_seek_to_table_type( stream, - face->toc.tables, - face->toc.count, - PCF_METRICS, - &format, - &size ); - if ( error ) - return error; - - if ( FT_READ_ULONG_LE( format ) ) - goto Bail; - - if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) && - !PCF_FORMAT_MATCH( format, PCF_COMPRESSED_METRICS ) ) - return FT_THROW( Invalid_File_Format ); - - if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) - { - if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - (void)FT_READ_ULONG( nmetrics ); - else - (void)FT_READ_ULONG_LE( nmetrics ); - } - else - { - if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - (void)FT_READ_USHORT( nmetrics ); - else - (void)FT_READ_USHORT_LE( nmetrics ); - } - if ( error ) - return FT_THROW( Invalid_File_Format ); - - face->nmetrics = nmetrics; - - if ( !nmetrics ) - return FT_THROW( Invalid_Table ); - - FT_TRACE4(( "pcf_get_metrics:\n" )); - - FT_TRACE4(( " number of metrics: %d\n", nmetrics )); - - /* rough estimate */ - if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) - { - if ( nmetrics > size / PCF_METRIC_SIZE ) - return FT_THROW( Invalid_Table ); - } - else - { - if ( nmetrics > size / PCF_COMPRESSED_METRIC_SIZE ) - return FT_THROW( Invalid_Table ); - } - - if ( FT_NEW_ARRAY( face->metrics, nmetrics ) ) - return FT_THROW( Out_Of_Memory ); - - metrics = face->metrics; - for ( i = 0; i < nmetrics; i++, metrics++ ) - { - error = pcf_get_metric( stream, format, metrics ); - - metrics->bits = 0; - - FT_TRACE5(( " idx %d: width=%d, " - "lsb=%d, rsb=%d, ascent=%d, descent=%d, swidth=%d\n", - i, - metrics->characterWidth, - metrics->leftSideBearing, - metrics->rightSideBearing, - metrics->ascent, - metrics->descent, - metrics->attributes )); - - if ( error ) - break; - - /* sanity checks -- those values are used in `PCF_Glyph_Load' to */ - /* compute a glyph's bitmap dimensions, thus setting them to zero in */ - /* case of an error disables this particular glyph only */ - if ( metrics->rightSideBearing < metrics->leftSideBearing || - metrics->ascent + metrics->descent < 0 ) - { - metrics->characterWidth = 0; - metrics->leftSideBearing = 0; - metrics->rightSideBearing = 0; - metrics->ascent = 0; - metrics->descent = 0; - - FT_TRACE0(( "pcf_get_metrics:" - " invalid metrics for glyph %d\n", i )); - } - } - - if ( error ) - FT_FREE( face->metrics ); - - Bail: - return error; - } - - - static FT_Error - pcf_get_bitmaps( FT_Stream stream, - PCF_Face face ) - { - FT_Error error; - FT_Memory memory = FT_FACE( face )->memory; - FT_Long* offsets = NULL; - FT_Long bitmapSizes[GLYPHPADOPTIONS]; - FT_ULong format, size; - FT_ULong nbitmaps, i, sizebitmaps = 0; - - - error = pcf_seek_to_table_type( stream, - face->toc.tables, - face->toc.count, - PCF_BITMAPS, - &format, - &size ); - if ( error ) - return error; - - error = FT_Stream_EnterFrame( stream, 8 ); - if ( error ) - return error; - - format = FT_GET_ULONG_LE(); - if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - nbitmaps = FT_GET_ULONG(); - else - nbitmaps = FT_GET_ULONG_LE(); - - FT_Stream_ExitFrame( stream ); - - if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) - return FT_THROW( Invalid_File_Format ); - - FT_TRACE4(( "pcf_get_bitmaps:\n" )); - - FT_TRACE4(( " number of bitmaps: %d\n", nbitmaps )); - - if ( nbitmaps != face->nmetrics ) - return FT_THROW( Invalid_File_Format ); - - if ( FT_NEW_ARRAY( offsets, nbitmaps ) ) - return error; - - for ( i = 0; i < nbitmaps; i++ ) - { - if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - (void)FT_READ_LONG( offsets[i] ); - else - (void)FT_READ_LONG_LE( offsets[i] ); - - FT_TRACE5(( " bitmap %d: offset %ld (0x%lX)\n", - i, offsets[i], offsets[i] )); - } - if ( error ) - goto Bail; - - for ( i = 0; i < GLYPHPADOPTIONS; i++ ) - { - if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - (void)FT_READ_LONG( bitmapSizes[i] ); - else - (void)FT_READ_LONG_LE( bitmapSizes[i] ); - if ( error ) - goto Bail; - - sizebitmaps = (FT_ULong)bitmapSizes[PCF_GLYPH_PAD_INDEX( format )]; - - FT_TRACE4(( " padding %d implies a size of %ld\n", - i, bitmapSizes[i] )); - } - - FT_TRACE4(( " %d bitmaps, padding index %ld\n", - nbitmaps, - PCF_GLYPH_PAD_INDEX( format ) )); - FT_TRACE4(( " bitmap size = %d\n", sizebitmaps )); - - FT_UNUSED( sizebitmaps ); /* only used for debugging */ - - for ( i = 0; i < nbitmaps; i++ ) - { - /* rough estimate */ - if ( ( offsets[i] < 0 ) || - ( (FT_ULong)offsets[i] > size ) ) - { - FT_TRACE0(( "pcf_get_bitmaps:" - " invalid offset to bitmap data of glyph %d\n", i )); - } - else - face->metrics[i].bits = stream->pos + (FT_ULong)offsets[i]; - } - - face->bitmapsFormat = format; - - Bail: - FT_FREE( offsets ); - return error; - } - - - static FT_Error - pcf_get_encodings( FT_Stream stream, - PCF_Face face ) - { - FT_Error error; - FT_Memory memory = FT_FACE( face )->memory; - FT_ULong format, size; - int firstCol, lastCol; - int firstRow, lastRow; - FT_ULong nencoding; - int encodingOffset; - int i, j; - FT_ULong k; - PCF_Encoding encoding = NULL; - - - error = pcf_seek_to_table_type( stream, - face->toc.tables, - face->toc.count, - PCF_BDF_ENCODINGS, - &format, - &size ); - if ( error ) - return error; - - error = FT_Stream_EnterFrame( stream, 14 ); - if ( error ) - return error; - - format = FT_GET_ULONG_LE(); - - if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - { - firstCol = FT_GET_SHORT(); - lastCol = FT_GET_SHORT(); - firstRow = FT_GET_SHORT(); - lastRow = FT_GET_SHORT(); - face->defaultChar = FT_GET_SHORT(); - } - else - { - firstCol = FT_GET_SHORT_LE(); - lastCol = FT_GET_SHORT_LE(); - firstRow = FT_GET_SHORT_LE(); - lastRow = FT_GET_SHORT_LE(); - face->defaultChar = FT_GET_SHORT_LE(); - } - - FT_Stream_ExitFrame( stream ); - - if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) - return FT_THROW( Invalid_File_Format ); - - /* sanity checks */ - if ( firstCol < 0 || - firstCol > lastCol || - lastCol > 0xFF || - firstRow < 0 || - firstRow > lastRow || - lastRow > 0xFF ) - return FT_THROW( Invalid_Table ); - - FT_TRACE4(( "pdf_get_encodings:\n" )); - - FT_TRACE4(( " firstCol %d, lastCol %d, firstRow %d, lastRow %d\n", - firstCol, lastCol, firstRow, lastRow )); - - nencoding = (FT_ULong)( lastCol - firstCol + 1 ) * - (FT_ULong)( lastRow - firstRow + 1 ); - - if ( FT_NEW_ARRAY( encoding, nencoding ) ) - return FT_THROW( Out_Of_Memory ); - - error = FT_Stream_EnterFrame( stream, 2 * nencoding ); - if ( error ) - goto Bail; - - k = 0; - for ( i = firstRow; i <= lastRow; i++ ) - { - for ( j = firstCol; j <= lastCol; j++ ) - { - if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - encodingOffset = FT_GET_SHORT(); - else - encodingOffset = FT_GET_SHORT_LE(); - - if ( encodingOffset > -1 ) - { - encoding[k].enc = i * 256 + j; - encoding[k].glyph = (FT_UShort)encodingOffset; - - FT_TRACE5(( " code %d (0x%04X): idx %d\n", - encoding[k].enc, encoding[k].enc, encoding[k].glyph )); - - k++; - } - } - } - FT_Stream_ExitFrame( stream ); - - if ( FT_RENEW_ARRAY( encoding, nencoding, k ) ) - goto Bail; - - face->nencodings = k; - face->encodings = encoding; - - return error; - - Bail: - FT_FREE( encoding ); - return error; - } - - - static - const FT_Frame_Field pcf_accel_header[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE PCF_AccelRec - - FT_FRAME_START( 20 ), - FT_FRAME_BYTE ( noOverlap ), - FT_FRAME_BYTE ( constantMetrics ), - FT_FRAME_BYTE ( terminalFont ), - FT_FRAME_BYTE ( constantWidth ), - FT_FRAME_BYTE ( inkInside ), - FT_FRAME_BYTE ( inkMetrics ), - FT_FRAME_BYTE ( drawDirection ), - FT_FRAME_SKIP_BYTES( 1 ), - FT_FRAME_LONG_LE ( fontAscent ), - FT_FRAME_LONG_LE ( fontDescent ), - FT_FRAME_LONG_LE ( maxOverlap ), - FT_FRAME_END - }; - - - static - const FT_Frame_Field pcf_accel_msb_header[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE PCF_AccelRec - - FT_FRAME_START( 20 ), - FT_FRAME_BYTE ( noOverlap ), - FT_FRAME_BYTE ( constantMetrics ), - FT_FRAME_BYTE ( terminalFont ), - FT_FRAME_BYTE ( constantWidth ), - FT_FRAME_BYTE ( inkInside ), - FT_FRAME_BYTE ( inkMetrics ), - FT_FRAME_BYTE ( drawDirection ), - FT_FRAME_SKIP_BYTES( 1 ), - FT_FRAME_LONG ( fontAscent ), - FT_FRAME_LONG ( fontDescent ), - FT_FRAME_LONG ( maxOverlap ), - FT_FRAME_END - }; - - - static FT_Error - pcf_get_accel( FT_Stream stream, - PCF_Face face, - FT_ULong type ) - { - FT_ULong format, size; - FT_Error error; - PCF_Accel accel = &face->accel; - - - error = pcf_seek_to_table_type( stream, - face->toc.tables, - face->toc.count, - type, - &format, - &size ); - if ( error ) - goto Bail; - - if ( FT_READ_ULONG_LE( format ) ) - goto Bail; - - if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) && - !PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ) - goto Bail; - - if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - { - if ( FT_STREAM_READ_FIELDS( pcf_accel_msb_header, accel ) ) - goto Bail; - } - else - { - if ( FT_STREAM_READ_FIELDS( pcf_accel_header, accel ) ) - goto Bail; - } - - error = pcf_get_metric( stream, - format & ( ~PCF_FORMAT_MASK ), - &(accel->minbounds) ); - if ( error ) - goto Bail; - - error = pcf_get_metric( stream, - format & ( ~PCF_FORMAT_MASK ), - &(accel->maxbounds) ); - if ( error ) - goto Bail; - - if ( PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ) - { - error = pcf_get_metric( stream, - format & ( ~PCF_FORMAT_MASK ), - &(accel->ink_minbounds) ); - if ( error ) - goto Bail; - - error = pcf_get_metric( stream, - format & ( ~PCF_FORMAT_MASK ), - &(accel->ink_maxbounds) ); - if ( error ) - goto Bail; - } - else - { - accel->ink_minbounds = accel->minbounds; /* I'm not sure about this */ - accel->ink_maxbounds = accel->maxbounds; - } - - Bail: - return error; - } - - - static FT_Error - pcf_interpret_style( PCF_Face pcf ) - { - FT_Error error = FT_Err_Ok; - FT_Face face = FT_FACE( pcf ); - FT_Memory memory = face->memory; - - PCF_Property prop; - - size_t nn, len; - char* strings[4] = { NULL, NULL, NULL, NULL }; - size_t lengths[4]; - - - face->style_flags = 0; - - prop = pcf_find_property( pcf, "SLANT" ); - if ( prop && prop->isString && - ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' || - *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) ) - { - face->style_flags |= FT_STYLE_FLAG_ITALIC; - strings[2] = ( *(prop->value.atom) == 'O' || - *(prop->value.atom) == 'o' ) ? (char *)"Oblique" - : (char *)"Italic"; - } - - prop = pcf_find_property( pcf, "WEIGHT_NAME" ); - if ( prop && prop->isString && - ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) - { - face->style_flags |= FT_STYLE_FLAG_BOLD; - strings[1] = (char*)"Bold"; - } - - prop = pcf_find_property( pcf, "SETWIDTH_NAME" ); - if ( prop && prop->isString && - *(prop->value.atom) && - !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) - strings[3] = (char*)( prop->value.atom ); - - prop = pcf_find_property( pcf, "ADD_STYLE_NAME" ); - if ( prop && prop->isString && - *(prop->value.atom) && - !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) - strings[0] = (char*)( prop->value.atom ); - - for ( len = 0, nn = 0; nn < 4; nn++ ) - { - lengths[nn] = 0; - if ( strings[nn] ) - { - lengths[nn] = ft_strlen( strings[nn] ); - len += lengths[nn] + 1; - } - } - - if ( len == 0 ) - { - strings[0] = (char*)"Regular"; - lengths[0] = ft_strlen( strings[0] ); - len = lengths[0] + 1; - } - - { - char* s; - - - if ( FT_ALLOC( face->style_name, len ) ) - return error; - - s = face->style_name; - - for ( nn = 0; nn < 4; nn++ ) - { - char* src = strings[nn]; - - - len = lengths[nn]; - - if ( src == NULL ) - continue; - - /* separate elements with a space */ - if ( s != face->style_name ) - *s++ = ' '; - - ft_memcpy( s, src, len ); - - /* need to convert spaces to dashes for */ - /* add_style_name and setwidth_name */ - if ( nn == 0 || nn == 3 ) - { - size_t mm; - - - for ( mm = 0; mm < len; mm++ ) - if ( s[mm] == ' ' ) - s[mm] = '-'; - } - - s += len; - } - *s = 0; - } - - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - pcf_load_font( FT_Stream stream, - PCF_Face face ) - { - FT_Error error; - FT_Memory memory = FT_FACE( face )->memory; - FT_Bool hasBDFAccelerators; - - - error = pcf_read_TOC( stream, face ); - if ( error ) - goto Exit; - - error = pcf_get_properties( stream, face ); - if ( error ) - goto Exit; - - /* Use the old accelerators if no BDF accelerators are in the file. */ - hasBDFAccelerators = pcf_has_table_type( face->toc.tables, - face->toc.count, - PCF_BDF_ACCELERATORS ); - if ( !hasBDFAccelerators ) - { - error = pcf_get_accel( stream, face, PCF_ACCELERATORS ); - if ( error ) - goto Exit; - } - - /* metrics */ - error = pcf_get_metrics( stream, face ); - if ( error ) - goto Exit; - - /* bitmaps */ - error = pcf_get_bitmaps( stream, face ); - if ( error ) - goto Exit; - - /* encodings */ - error = pcf_get_encodings( stream, face ); - if ( error ) - goto Exit; - - /* BDF style accelerators (i.e. bounds based on encoded glyphs) */ - if ( hasBDFAccelerators ) - { - error = pcf_get_accel( stream, face, PCF_BDF_ACCELERATORS ); - if ( error ) - goto Exit; - } - - /* XXX: TO DO: inkmetrics and glyph_names are missing */ - - /* now construct the face object */ - { - FT_Face root = FT_FACE( face ); - PCF_Property prop; - - - root->num_faces = 1; - root->face_index = 0; - - root->face_flags |= FT_FACE_FLAG_FIXED_SIZES | - FT_FACE_FLAG_HORIZONTAL | - FT_FACE_FLAG_FAST_GLYPHS; - - if ( face->accel.constantWidth ) - root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; - - if ( ( error = pcf_interpret_style( face ) ) != 0 ) - goto Exit; - - prop = pcf_find_property( face, "FAMILY_NAME" ); - if ( prop && prop->isString ) - { - if ( FT_STRDUP( root->family_name, prop->value.atom ) ) - goto Exit; - } - else - root->family_name = NULL; - - /* - * Note: We shift all glyph indices by +1 since we must - * respect the convention that glyph 0 always corresponds - * to the `missing glyph'. - * - * This implies bumping the number of `available' glyphs by 1. - */ - root->num_glyphs = (FT_Long)( face->nmetrics + 1 ); - - root->num_fixed_sizes = 1; - if ( FT_NEW_ARRAY( root->available_sizes, 1 ) ) - goto Exit; - - { - FT_Bitmap_Size* bsize = root->available_sizes; - FT_Short resolution_x = 0, resolution_y = 0; - - - FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) ); - -#if 0 - bsize->height = face->accel.maxbounds.ascent << 6; -#endif - bsize->height = (FT_Short)( face->accel.fontAscent + - face->accel.fontDescent ); - - prop = pcf_find_property( face, "AVERAGE_WIDTH" ); - if ( prop ) - bsize->width = (FT_Short)( ( prop->value.l + 5 ) / 10 ); - else - bsize->width = (FT_Short)( bsize->height * 2/3 ); - - prop = pcf_find_property( face, "POINT_SIZE" ); - if ( prop ) - /* convert from 722.7 decipoints to 72 points per inch */ - bsize->size = - (FT_Pos)( ( prop->value.l * 64 * 7200 + 36135L ) / 72270L ); - - prop = pcf_find_property( face, "PIXEL_SIZE" ); - if ( prop ) - bsize->y_ppem = (FT_Short)prop->value.l << 6; - - prop = pcf_find_property( face, "RESOLUTION_X" ); - if ( prop ) - resolution_x = (FT_Short)prop->value.l; - - prop = pcf_find_property( face, "RESOLUTION_Y" ); - if ( prop ) - resolution_y = (FT_Short)prop->value.l; - - if ( bsize->y_ppem == 0 ) - { - bsize->y_ppem = bsize->size; - if ( resolution_y ) - bsize->y_ppem = bsize->y_ppem * resolution_y / 72; - } - if ( resolution_x && resolution_y ) - bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y; - else - bsize->x_ppem = bsize->y_ppem; - } - - /* set up charset */ - { - PCF_Property charset_registry, charset_encoding; - - - charset_registry = pcf_find_property( face, "CHARSET_REGISTRY" ); - charset_encoding = pcf_find_property( face, "CHARSET_ENCODING" ); - - if ( charset_registry && charset_registry->isString && - charset_encoding && charset_encoding->isString ) - { - if ( FT_STRDUP( face->charset_encoding, - charset_encoding->value.atom ) || - FT_STRDUP( face->charset_registry, - charset_registry->value.atom ) ) - goto Exit; - } - } - } - - Exit: - if ( error ) - { - /* This is done to respect the behaviour of the original */ - /* PCF font driver. */ - error = FT_THROW( Invalid_File_Format ); - } - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/pcf/pcfread.h b/3party/freetype/src/pcf/pcfread.h deleted file mode 100644 index c9524f1346..0000000000 --- a/3party/freetype/src/pcf/pcfread.h +++ /dev/null @@ -1,45 +0,0 @@ -/* pcfread.h - - FreeType font driver for pcf fonts - - Copyright 2003 by - Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - - -#ifndef __PCFREAD_H__ -#define __PCFREAD_H__ - - -#include <ft2build.h> - -FT_BEGIN_HEADER - - FT_LOCAL( PCF_Property ) - pcf_find_property( PCF_Face face, - const FT_String* prop ); - -FT_END_HEADER - -#endif /* __PCFREAD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pcf/pcfutil.c b/3party/freetype/src/pcf/pcfutil.c deleted file mode 100644 index 0451ee8def..0000000000 --- a/3party/freetype/src/pcf/pcfutil.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - -Copyright 1990, 1994, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from The Open Group. - -*/ -/* $XFree86: xc/lib/font/util/utilbitmap.c,v 1.3 1999/08/22 08:58:58 dawes Exp $ */ - -/* - * Author: Keith Packard, MIT X Consortium - */ - -/* Modified for use with FreeType */ - - -#include <ft2build.h> -#include "pcfutil.h" - - - /* - * Invert bit order within each BYTE of an array. - */ - - FT_LOCAL_DEF( void ) - BitOrderInvert( unsigned char* buf, - size_t nbytes ) - { - for ( ; nbytes > 0; nbytes--, buf++ ) - { - unsigned int val = *buf; - - - val = ( ( val >> 1 ) & 0x55 ) | ( ( val << 1 ) & 0xAA ); - val = ( ( val >> 2 ) & 0x33 ) | ( ( val << 2 ) & 0xCC ); - val = ( ( val >> 4 ) & 0x0F ) | ( ( val << 4 ) & 0xF0 ); - - *buf = (unsigned char)val; - } - } - - - /* - * Invert byte order within each 16-bits of an array. - */ - - FT_LOCAL_DEF( void ) - TwoByteSwap( unsigned char* buf, - size_t nbytes ) - { - for ( ; nbytes >= 2; nbytes -= 2, buf += 2 ) - { - unsigned char c; - - - c = buf[0]; - buf[0] = buf[1]; - buf[1] = c; - } - } - - /* - * Invert byte order within each 32-bits of an array. - */ - - FT_LOCAL_DEF( void ) - FourByteSwap( unsigned char* buf, - size_t nbytes ) - { - for ( ; nbytes >= 4; nbytes -= 4, buf += 4 ) - { - unsigned char c; - - - c = buf[0]; - buf[0] = buf[3]; - buf[3] = c; - - c = buf[1]; - buf[1] = buf[2]; - buf[2] = c; - } - } - - -/* END */ diff --git a/3party/freetype/src/pcf/pcfutil.h b/3party/freetype/src/pcf/pcfutil.h deleted file mode 100644 index ce10fb541d..0000000000 --- a/3party/freetype/src/pcf/pcfutil.h +++ /dev/null @@ -1,55 +0,0 @@ -/* pcfutil.h - - FreeType font driver for pcf fonts - - Copyright 2000, 2001, 2004 by - Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - - -#ifndef __PCFUTIL_H__ -#define __PCFUTIL_H__ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H - - -FT_BEGIN_HEADER - - FT_LOCAL( void ) - BitOrderInvert( unsigned char* buf, - size_t nbytes ); - - FT_LOCAL( void ) - TwoByteSwap( unsigned char* buf, - size_t nbytes ); - - FT_LOCAL( void ) - FourByteSwap( unsigned char* buf, - size_t nbytes ); - -FT_END_HEADER - -#endif /* __PCFUTIL_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pcf/rules.mk b/3party/freetype/src/pcf/rules.mk deleted file mode 100644 index 1b55daf4f4..0000000000 --- a/3party/freetype/src/pcf/rules.mk +++ /dev/null @@ -1,82 +0,0 @@ -# -# FreeType 2 pcf driver configuration rules -# - - -# Copyright (C) 2000, 2001, 2003, 2008 by -# Francesco Zappa Nardelli -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - - -# pcf driver directory -# -PCF_DIR := $(SRC_DIR)/pcf - - -PCF_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(PCF_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# pcf driver sources (i.e., C files) -# -PCF_DRV_SRC := $(PCF_DIR)/pcfdrivr.c \ - $(PCF_DIR)/pcfread.c \ - $(PCF_DIR)/pcfutil.c - -# pcf driver headers -# -PCF_DRV_H := $(PCF_DRV_SRC:%.c=%.h) \ - $(PCF_DIR)/pcf.h \ - $(PCF_DIR)/pcferror.h - -# pcf driver object(s) -# -# PCF_DRV_OBJ_M is used during `multi' builds -# PCF_DRV_OBJ_S is used during `single' builds -# -PCF_DRV_OBJ_M := $(PCF_DRV_SRC:$(PCF_DIR)/%.c=$(OBJ_DIR)/%.$O) -PCF_DRV_OBJ_S := $(OBJ_DIR)/pcf.$O - -# pcf driver source file for single build -# -PCF_DRV_SRC_S := $(PCF_DIR)/pcf.c - - -# pcf driver - single object -# -$(PCF_DRV_OBJ_S): $(PCF_DRV_SRC_S) $(PCF_DRV_SRC) $(FREETYPE_H) $(PCF_DRV_H) - $(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PCF_DRV_SRC_S)) - - -# pcf driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(PCF_DIR)/%.c $(FREETYPE_H) $(PCF_DRV_H) - $(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(PCF_DRV_OBJ_S) -DRV_OBJS_M += $(PCF_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/pfr/Jamfile b/3party/freetype/src/pfr/Jamfile deleted file mode 100644 index c5b35be870..0000000000 --- a/3party/freetype/src/pfr/Jamfile +++ /dev/null @@ -1,35 +0,0 @@ -# FreeType 2 src/pfr Jamfile -# -# Copyright 2002-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) pfr ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = pfrcmap - pfrdrivr - pfrgload - pfrload - pfrobjs - pfrsbit - ; - } - else - { - _sources = pfr ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/pfr Jamfile diff --git a/3party/freetype/src/pfr/module.mk b/3party/freetype/src/pfr/module.mk deleted file mode 100644 index 3f5a47e888..0000000000 --- a/3party/freetype/src/pfr/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 PFR module definition -# - - -# Copyright 2002-2015 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. - - -FTMODULE_H_COMMANDS += PFR_DRIVER - -define PFR_DRIVER -$(OPEN_DRIVER) FT_Driver_ClassRec, pfr_driver_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)pfr $(ECHO_DRIVER_DESC)PFR/TrueDoc font files with extension *.pfr$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/pfr/pfr.c b/3party/freetype/src/pfr/pfr.c deleted file mode 100644 index 96e67300a5..0000000000 --- a/3party/freetype/src/pfr/pfr.c +++ /dev/null @@ -1,29 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfr.c */ -/* */ -/* FreeType PFR driver component. */ -/* */ -/* Copyright 2002-2015 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. */ -/* */ -/***************************************************************************/ - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> - -#include "pfrload.c" -#include "pfrgload.c" -#include "pfrcmap.c" -#include "pfrobjs.c" -#include "pfrdrivr.c" -#include "pfrsbit.c" - -/* END */ diff --git a/3party/freetype/src/pfr/pfrcmap.c b/3party/freetype/src/pfr/pfrcmap.c deleted file mode 100644 index 88ff55a806..0000000000 --- a/3party/freetype/src/pfr/pfrcmap.c +++ /dev/null @@ -1,173 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrcmap.c */ -/* */ -/* FreeType PFR cmap handling (body). */ -/* */ -/* Copyright 2002-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include "pfrcmap.h" -#include "pfrobjs.h" - -#include "pfrerror.h" - - - FT_CALLBACK_DEF( FT_Error ) - pfr_cmap_init( PFR_CMap cmap, - FT_Pointer pointer ) - { - FT_Error error = FT_Err_Ok; - PFR_Face face = (PFR_Face)FT_CMAP_FACE( cmap ); - - FT_UNUSED( pointer ); - - - cmap->num_chars = face->phy_font.num_chars; - cmap->chars = face->phy_font.chars; - - /* just for safety, check that the character entries are correctly */ - /* sorted in increasing character code order */ - { - FT_UInt n; - - - for ( n = 1; n < cmap->num_chars; n++ ) - { - if ( cmap->chars[n - 1].char_code >= cmap->chars[n].char_code ) - { - error = FT_THROW( Invalid_Table ); - goto Exit; - } - } - } - - Exit: - return error; - } - - - FT_CALLBACK_DEF( void ) - pfr_cmap_done( PFR_CMap cmap ) - { - cmap->chars = NULL; - cmap->num_chars = 0; - } - - - FT_CALLBACK_DEF( FT_UInt ) - pfr_cmap_char_index( PFR_CMap cmap, - FT_UInt32 char_code ) - { - FT_UInt min = 0; - FT_UInt max = cmap->num_chars; - - - while ( min < max ) - { - PFR_Char gchar; - FT_UInt mid; - - - mid = min + ( max - min ) / 2; - gchar = cmap->chars + mid; - - if ( gchar->char_code == char_code ) - return mid + 1; - - if ( gchar->char_code < char_code ) - min = mid + 1; - else - max = mid; - } - return 0; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - pfr_cmap_char_next( PFR_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_UInt result = 0; - FT_UInt32 char_code = *pchar_code + 1; - - - Restart: - { - FT_UInt min = 0; - FT_UInt max = cmap->num_chars; - FT_UInt mid; - PFR_Char gchar; - - - while ( min < max ) - { - mid = min + ( ( max - min ) >> 1 ); - gchar = cmap->chars + mid; - - if ( gchar->char_code == char_code ) - { - result = mid; - if ( result != 0 ) - { - result++; - goto Exit; - } - - char_code++; - goto Restart; - } - - if ( gchar->char_code < char_code ) - min = mid+1; - else - max = mid; - } - - /* we didn't find it, but we have a pair just above it */ - char_code = 0; - - if ( min < cmap->num_chars ) - { - gchar = cmap->chars + min; - result = min; - if ( result != 0 ) - { - result++; - char_code = gchar->char_code; - } - } - } - - Exit: - *pchar_code = char_code; - return result; - } - - - FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec - pfr_cmap_class_rec = - { - sizeof ( PFR_CMapRec ), - - (FT_CMap_InitFunc) pfr_cmap_init, - (FT_CMap_DoneFunc) pfr_cmap_done, - (FT_CMap_CharIndexFunc)pfr_cmap_char_index, - (FT_CMap_CharNextFunc) pfr_cmap_char_next, - - NULL, NULL, NULL, NULL, NULL - }; - - -/* END */ diff --git a/3party/freetype/src/pfr/pfrcmap.h b/3party/freetype/src/pfr/pfrcmap.h deleted file mode 100644 index 87e1e5b942..0000000000 --- a/3party/freetype/src/pfr/pfrcmap.h +++ /dev/null @@ -1,46 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrcmap.h */ -/* */ -/* FreeType PFR cmap handling (specification). */ -/* */ -/* Copyright 2002-2015 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 __PFRCMAP_H__ -#define __PFRCMAP_H__ - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include "pfrtypes.h" - - -FT_BEGIN_HEADER - - typedef struct PFR_CMapRec_ - { - FT_CMapRec cmap; - FT_UInt num_chars; - PFR_Char chars; - - } PFR_CMapRec, *PFR_CMap; - - - FT_CALLBACK_TABLE const FT_CMap_ClassRec pfr_cmap_class_rec; - -FT_END_HEADER - - -#endif /* __PFRCMAP_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pfr/pfrdrivr.c b/3party/freetype/src/pfr/pfrdrivr.c deleted file mode 100644 index 875374889c..0000000000 --- a/3party/freetype/src/pfr/pfrdrivr.c +++ /dev/null @@ -1,212 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrdrivr.c */ -/* */ -/* FreeType PFR driver interface (body). */ -/* */ -/* Copyright 2002-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_SERVICE_PFR_H -#include FT_SERVICE_FONT_FORMAT_H -#include "pfrdrivr.h" -#include "pfrobjs.h" - -#include "pfrerror.h" - - - FT_CALLBACK_DEF( FT_Error ) - pfr_get_kerning( FT_Face pfrface, /* PFR_Face */ - FT_UInt left, - FT_UInt right, - FT_Vector *avector ) - { - PFR_Face face = (PFR_Face)pfrface; - PFR_PhyFont phys = &face->phy_font; - - - (void)pfr_face_get_kerning( pfrface, left, right, avector ); - - /* convert from metrics to outline units when necessary */ - if ( phys->outline_resolution != phys->metrics_resolution ) - { - if ( avector->x != 0 ) - avector->x = FT_MulDiv( avector->x, - (FT_Long)phys->outline_resolution, - (FT_Long)phys->metrics_resolution ); - - if ( avector->y != 0 ) - avector->y = FT_MulDiv( avector->y, - (FT_Long)phys->outline_resolution, - (FT_Long)phys->metrics_resolution ); - } - - return FT_Err_Ok; - } - - - /* - * PFR METRICS SERVICE - * - */ - - FT_CALLBACK_DEF( FT_Error ) - pfr_get_advance( FT_Face pfrface, /* PFR_Face */ - FT_UInt gindex, - FT_Pos *anadvance ) - { - PFR_Face face = (PFR_Face)pfrface; - FT_Error error = FT_ERR( Invalid_Argument ); - - - *anadvance = 0; - - if ( !gindex ) - goto Exit; - - gindex--; - - if ( face ) - { - PFR_PhyFont phys = &face->phy_font; - - - if ( gindex < phys->num_chars ) - { - *anadvance = phys->chars[gindex].advance; - error = FT_Err_Ok; - } - } - - Exit: - return error; - } - - - FT_CALLBACK_DEF( FT_Error ) - pfr_get_metrics( FT_Face pfrface, /* PFR_Face */ - FT_UInt *anoutline_resolution, - FT_UInt *ametrics_resolution, - FT_Fixed *ametrics_x_scale, - FT_Fixed *ametrics_y_scale ) - { - PFR_Face face = (PFR_Face)pfrface; - PFR_PhyFont phys = &face->phy_font; - FT_Fixed x_scale, y_scale; - FT_Size size = face->root.size; - - - if ( anoutline_resolution ) - *anoutline_resolution = phys->outline_resolution; - - if ( ametrics_resolution ) - *ametrics_resolution = phys->metrics_resolution; - - x_scale = 0x10000L; - y_scale = 0x10000L; - - if ( size ) - { - x_scale = FT_DivFix( size->metrics.x_ppem << 6, - (FT_Long)phys->metrics_resolution ); - - y_scale = FT_DivFix( size->metrics.y_ppem << 6, - (FT_Long)phys->metrics_resolution ); - } - - if ( ametrics_x_scale ) - *ametrics_x_scale = x_scale; - - if ( ametrics_y_scale ) - *ametrics_y_scale = y_scale; - - return FT_Err_Ok; - } - - - static - const FT_Service_PfrMetricsRec pfr_metrics_service_rec = - { - pfr_get_metrics, - pfr_face_get_kerning, - pfr_get_advance - }; - - - /* - * SERVICE LIST - * - */ - - static const FT_ServiceDescRec pfr_services[] = - { - { FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec }, - { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_PFR }, - { NULL, NULL } - }; - - - FT_CALLBACK_DEF( FT_Module_Interface ) - pfr_get_service( FT_Module module, - const FT_String* service_id ) - { - FT_UNUSED( module ); - - return ft_service_list_lookup( pfr_services, service_id ); - } - - - FT_CALLBACK_TABLE_DEF - const FT_Driver_ClassRec pfr_driver_class = - { - { - FT_MODULE_FONT_DRIVER | - FT_MODULE_DRIVER_SCALABLE, - - sizeof ( FT_DriverRec ), - - "pfr", - 0x10000L, - 0x20000L, - - NULL, - - 0, /* FT_Module_Constructor */ - 0, /* FT_Module_Destructor */ - pfr_get_service - }, - - sizeof ( PFR_FaceRec ), - sizeof ( PFR_SizeRec ), - sizeof ( PFR_SlotRec ), - - pfr_face_init, - pfr_face_done, - 0, /* FT_Size_InitFunc */ - 0, /* FT_Size_DoneFunc */ - pfr_slot_init, - pfr_slot_done, - - pfr_slot_load, - - pfr_get_kerning, - 0, /* FT_Face_AttachFunc */ - 0, /* FT_Face_GetAdvancesFunc */ - 0, /* FT_Size_RequestFunc */ - 0, /* FT_Size_SelectFunc */ - }; - - -/* END */ diff --git a/3party/freetype/src/pfr/pfrdrivr.h b/3party/freetype/src/pfr/pfrdrivr.h deleted file mode 100644 index b5be4709c8..0000000000 --- a/3party/freetype/src/pfr/pfrdrivr.h +++ /dev/null @@ -1,43 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrdrivr.h */ -/* */ -/* High-level Type PFR driver interface (specification). */ -/* */ -/* Copyright 2002-2015 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 __PFRDRIVR_H__ -#define __PFRDRIVR_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_DRIVER_H - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC -#error "this module does not support PIC yet" -#endif - - - FT_EXPORT_VAR( const FT_Driver_ClassRec ) pfr_driver_class; - - -FT_END_HEADER - - -#endif /* __PFRDRIVR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pfr/pfrerror.h b/3party/freetype/src/pfr/pfrerror.h deleted file mode 100644 index 978e7b2d34..0000000000 --- a/3party/freetype/src/pfr/pfrerror.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrerror.h */ -/* */ -/* PFR error codes (specification only). */ -/* */ -/* Copyright 2002-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the PFR error enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __PFRERROR_H__ -#define __PFRERROR_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX PFR_Err_ -#define FT_ERR_BASE FT_Mod_Err_PFR - -#include FT_ERRORS_H - -#endif /* __PFRERROR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pfr/pfrgload.c b/3party/freetype/src/pfr/pfrgload.c deleted file mode 100644 index 88df06a03d..0000000000 --- a/3party/freetype/src/pfr/pfrgload.c +++ /dev/null @@ -1,844 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrgload.c */ -/* */ -/* FreeType PFR glyph loader (body). */ -/* */ -/* Copyright 2002-2015 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 "pfrgload.h" -#include "pfrsbit.h" -#include "pfrload.h" /* for macro definitions */ -#include FT_INTERNAL_DEBUG_H - -#include "pfrerror.h" - -#undef FT_COMPONENT -#define FT_COMPONENT trace_pfr - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PFR GLYPH BUILDER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_LOCAL_DEF( void ) - pfr_glyph_init( PFR_Glyph glyph, - FT_GlyphLoader loader ) - { - FT_ZERO( glyph ); - - glyph->loader = loader; - glyph->path_begun = 0; - - FT_GlyphLoader_Rewind( loader ); - } - - - FT_LOCAL_DEF( void ) - pfr_glyph_done( PFR_Glyph glyph ) - { - FT_Memory memory = glyph->loader->memory; - - - FT_FREE( glyph->x_control ); - glyph->y_control = NULL; - - glyph->max_xy_control = 0; -#if 0 - glyph->num_x_control = 0; - glyph->num_y_control = 0; -#endif - - FT_FREE( glyph->subs ); - - glyph->max_subs = 0; - glyph->num_subs = 0; - - glyph->loader = NULL; - glyph->path_begun = 0; - } - - - /* close current contour, if any */ - static void - pfr_glyph_close_contour( PFR_Glyph glyph ) - { - FT_GlyphLoader loader = glyph->loader; - FT_Outline* outline = &loader->current.outline; - FT_Int last, first; - - - if ( !glyph->path_begun ) - return; - - /* compute first and last point indices in current glyph outline */ - last = outline->n_points - 1; - first = 0; - if ( outline->n_contours > 0 ) - first = outline->contours[outline->n_contours - 1]; - - /* if the last point falls on the same location than the first one */ - /* we need to delete it */ - if ( last > first ) - { - FT_Vector* p1 = outline->points + first; - FT_Vector* p2 = outline->points + last; - - - if ( p1->x == p2->x && p1->y == p2->y ) - { - outline->n_points--; - last--; - } - } - - /* don't add empty contours */ - if ( last >= first ) - outline->contours[outline->n_contours++] = (short)last; - - glyph->path_begun = 0; - } - - - /* reset glyph to start the loading of a new glyph */ - static void - pfr_glyph_start( PFR_Glyph glyph ) - { - glyph->path_begun = 0; - } - - - static FT_Error - pfr_glyph_line_to( PFR_Glyph glyph, - FT_Vector* to ) - { - FT_GlyphLoader loader = glyph->loader; - FT_Outline* outline = &loader->current.outline; - FT_Error error; - - - /* check that we have begun a new path */ - if ( !glyph->path_begun ) - { - error = FT_THROW( Invalid_Table ); - FT_ERROR(( "pfr_glyph_line_to: invalid glyph data\n" )); - goto Exit; - } - - error = FT_GLYPHLOADER_CHECK_POINTS( loader, 1, 0 ); - if ( !error ) - { - FT_Int n = outline->n_points; - - - outline->points[n] = *to; - outline->tags [n] = FT_CURVE_TAG_ON; - - outline->n_points++; - } - - Exit: - return error; - } - - - static FT_Error - pfr_glyph_curve_to( PFR_Glyph glyph, - FT_Vector* control1, - FT_Vector* control2, - FT_Vector* to ) - { - FT_GlyphLoader loader = glyph->loader; - FT_Outline* outline = &loader->current.outline; - FT_Error error; - - - /* check that we have begun a new path */ - if ( !glyph->path_begun ) - { - error = FT_THROW( Invalid_Table ); - FT_ERROR(( "pfr_glyph_line_to: invalid glyph data\n" )); - goto Exit; - } - - error = FT_GLYPHLOADER_CHECK_POINTS( loader, 3, 0 ); - if ( !error ) - { - FT_Vector* vec = outline->points + outline->n_points; - FT_Byte* tag = (FT_Byte*)outline->tags + outline->n_points; - - - vec[0] = *control1; - vec[1] = *control2; - vec[2] = *to; - tag[0] = FT_CURVE_TAG_CUBIC; - tag[1] = FT_CURVE_TAG_CUBIC; - tag[2] = FT_CURVE_TAG_ON; - - outline->n_points = (FT_Short)( outline->n_points + 3 ); - } - - Exit: - return error; - } - - - static FT_Error - pfr_glyph_move_to( PFR_Glyph glyph, - FT_Vector* to ) - { - FT_GlyphLoader loader = glyph->loader; - FT_Error error; - - - /* close current contour if any */ - pfr_glyph_close_contour( glyph ); - - /* indicate that a new contour has started */ - glyph->path_begun = 1; - - /* check that there is space for a new contour and a new point */ - error = FT_GLYPHLOADER_CHECK_POINTS( loader, 1, 1 ); - if ( !error ) - /* add new start point */ - error = pfr_glyph_line_to( glyph, to ); - - return error; - } - - - static void - pfr_glyph_end( PFR_Glyph glyph ) - { - /* close current contour if any */ - pfr_glyph_close_contour( glyph ); - - /* merge the current glyph into the stack */ - FT_GlyphLoader_Add( glyph->loader ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PFR GLYPH LOADER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* load a simple glyph */ - static FT_Error - pfr_glyph_load_simple( PFR_Glyph glyph, - FT_Byte* p, - FT_Byte* limit ) - { - FT_Error error = FT_Err_Ok; - FT_Memory memory = glyph->loader->memory; - FT_UInt flags, x_count, y_count, i, count, mask; - FT_Int x; - - - PFR_CHECK( 1 ); - flags = PFR_NEXT_BYTE( p ); - - /* test for composite glyphs */ - if ( flags & PFR_GLYPH_IS_COMPOUND ) - goto Failure; - - x_count = 0; - y_count = 0; - - if ( flags & PFR_GLYPH_1BYTE_XYCOUNT ) - { - PFR_CHECK( 1 ); - count = PFR_NEXT_BYTE( p ); - x_count = count & 15; - y_count = count >> 4; - } - else - { - if ( flags & PFR_GLYPH_XCOUNT ) - { - PFR_CHECK( 1 ); - x_count = PFR_NEXT_BYTE( p ); - } - - if ( flags & PFR_GLYPH_YCOUNT ) - { - PFR_CHECK( 1 ); - y_count = PFR_NEXT_BYTE( p ); - } - } - - count = x_count + y_count; - - /* re-allocate array when necessary */ - if ( count > glyph->max_xy_control ) - { - FT_UInt new_max = FT_PAD_CEIL( count, 8 ); - - - if ( FT_RENEW_ARRAY( glyph->x_control, - glyph->max_xy_control, - new_max ) ) - goto Exit; - - glyph->max_xy_control = new_max; - } - - glyph->y_control = glyph->x_control + x_count; - - mask = 0; - x = 0; - - for ( i = 0; i < count; i++ ) - { - if ( ( i & 7 ) == 0 ) - { - PFR_CHECK( 1 ); - mask = PFR_NEXT_BYTE( p ); - } - - if ( mask & 1 ) - { - PFR_CHECK( 2 ); - x = PFR_NEXT_SHORT( p ); - } - else - { - PFR_CHECK( 1 ); - x += PFR_NEXT_BYTE( p ); - } - - glyph->x_control[i] = x; - - mask >>= 1; - } - - /* XXX: for now we ignore the secondary stroke and edge definitions */ - /* since we don't want to support native PFR hinting */ - /* */ - if ( flags & PFR_GLYPH_EXTRA_ITEMS ) - { - error = pfr_extra_items_skip( &p, limit ); - if ( error ) - goto Exit; - } - - pfr_glyph_start( glyph ); - - /* now load a simple glyph */ - { - FT_Vector pos[4]; - FT_Vector* cur; - - - pos[0].x = pos[0].y = 0; - pos[3] = pos[0]; - - for (;;) - { - FT_UInt format, format_low, args_format = 0, args_count, n; - - - /***************************************************************/ - /* read instruction */ - /* */ - PFR_CHECK( 1 ); - format = PFR_NEXT_BYTE( p ); - format_low = format & 15; - - switch ( format >> 4 ) - { - case 0: /* end glyph */ - FT_TRACE6(( "- end glyph" )); - args_count = 0; - break; - - case 1: /* general line operation */ - FT_TRACE6(( "- general line" )); - goto Line1; - - case 4: /* move to inside contour */ - FT_TRACE6(( "- move to inside" )); - goto Line1; - - case 5: /* move to outside contour */ - FT_TRACE6(( "- move to outside" )); - Line1: - args_format = format_low; - args_count = 1; - break; - - case 2: /* horizontal line to */ - FT_TRACE6(( "- horizontal line to cx.%d", format_low )); - if ( format_low >= x_count ) - goto Failure; - pos[0].x = glyph->x_control[format_low]; - pos[0].y = pos[3].y; - pos[3] = pos[0]; - args_count = 0; - break; - - case 3: /* vertical line to */ - FT_TRACE6(( "- vertical line to cy.%d", format_low )); - if ( format_low >= y_count ) - goto Failure; - pos[0].x = pos[3].x; - pos[0].y = glyph->y_control[format_low]; - pos[3] = pos[0]; - args_count = 0; - break; - - case 6: /* horizontal to vertical curve */ - FT_TRACE6(( "- hv curve " )); - args_format = 0xB8E; - args_count = 3; - break; - - case 7: /* vertical to horizontal curve */ - FT_TRACE6(( "- vh curve" )); - args_format = 0xE2B; - args_count = 3; - break; - - default: /* general curve to */ - FT_TRACE6(( "- general curve" )); - args_count = 4; - args_format = format_low; - } - - /***********************************************************/ - /* now read arguments */ - /* */ - cur = pos; - for ( n = 0; n < args_count; n++ ) - { - FT_UInt idx; - FT_Int delta; - - - /* read the X argument */ - switch ( args_format & 3 ) - { - case 0: /* 8-bit index */ - PFR_CHECK( 1 ); - idx = PFR_NEXT_BYTE( p ); - if ( idx >= x_count ) - goto Failure; - cur->x = glyph->x_control[idx]; - FT_TRACE7(( " cx#%d", idx )); - break; - - case 1: /* 16-bit value */ - PFR_CHECK( 2 ); - cur->x = PFR_NEXT_SHORT( p ); - FT_TRACE7(( " x.%d", cur->x )); - break; - - case 2: /* 8-bit delta */ - PFR_CHECK( 1 ); - delta = PFR_NEXT_INT8( p ); - cur->x = pos[3].x + delta; - FT_TRACE7(( " dx.%d", delta )); - break; - - default: - FT_TRACE7(( " |" )); - cur->x = pos[3].x; - } - - /* read the Y argument */ - switch ( ( args_format >> 2 ) & 3 ) - { - case 0: /* 8-bit index */ - PFR_CHECK( 1 ); - idx = PFR_NEXT_BYTE( p ); - if ( idx >= y_count ) - goto Failure; - cur->y = glyph->y_control[idx]; - FT_TRACE7(( " cy#%d", idx )); - break; - - case 1: /* 16-bit absolute value */ - PFR_CHECK( 2 ); - cur->y = PFR_NEXT_SHORT( p ); - FT_TRACE7(( " y.%d", cur->y )); - break; - - case 2: /* 8-bit delta */ - PFR_CHECK( 1 ); - delta = PFR_NEXT_INT8( p ); - cur->y = pos[3].y + delta; - FT_TRACE7(( " dy.%d", delta )); - break; - - default: - FT_TRACE7(( " -" )); - cur->y = pos[3].y; - } - - /* read the additional format flag for the general curve */ - if ( n == 0 && args_count == 4 ) - { - PFR_CHECK( 1 ); - args_format = PFR_NEXT_BYTE( p ); - args_count--; - } - else - args_format >>= 4; - - /* save the previous point */ - pos[3] = cur[0]; - cur++; - } - - FT_TRACE7(( "\n" )); - - /***********************************************************/ - /* finally, execute instruction */ - /* */ - switch ( format >> 4 ) - { - case 0: /* end glyph => EXIT */ - pfr_glyph_end( glyph ); - goto Exit; - - case 1: /* line operations */ - case 2: - case 3: - error = pfr_glyph_line_to( glyph, pos ); - goto Test_Error; - - case 4: /* move to inside contour */ - case 5: /* move to outside contour */ - error = pfr_glyph_move_to( glyph, pos ); - goto Test_Error; - - default: /* curve operations */ - error = pfr_glyph_curve_to( glyph, pos, pos + 1, pos + 2 ); - - Test_Error: /* test error condition */ - if ( error ) - goto Exit; - } - } /* for (;;) */ - } - - Exit: - return error; - - Failure: - Too_Short: - error = FT_THROW( Invalid_Table ); - FT_ERROR(( "pfr_glyph_load_simple: invalid glyph data\n" )); - goto Exit; - } - - - /* load a composite/compound glyph */ - static FT_Error - pfr_glyph_load_compound( PFR_Glyph glyph, - FT_Byte* p, - FT_Byte* limit ) - { - FT_Error error = FT_Err_Ok; - FT_GlyphLoader loader = glyph->loader; - FT_Memory memory = loader->memory; - PFR_SubGlyph subglyph; - FT_UInt flags, i, count, org_count; - FT_Int x_pos, y_pos; - - - PFR_CHECK( 1 ); - flags = PFR_NEXT_BYTE( p ); - - /* test for composite glyphs */ - if ( !( flags & PFR_GLYPH_IS_COMPOUND ) ) - goto Failure; - - count = flags & 0x3F; - - /* ignore extra items when present */ - /* */ - if ( flags & PFR_GLYPH_EXTRA_ITEMS ) - { - error = pfr_extra_items_skip( &p, limit ); - if (error) goto Exit; - } - - /* we can't rely on the FT_GlyphLoader to load sub-glyphs, because */ - /* the PFR format is dumb, using direct file offsets to point to the */ - /* sub-glyphs (instead of glyph indices). Sigh. */ - /* */ - /* For now, we load the list of sub-glyphs into a different array */ - /* but this will prevent us from using the auto-hinter at its best */ - /* quality. */ - /* */ - org_count = glyph->num_subs; - - if ( org_count + count > glyph->max_subs ) - { - FT_UInt new_max = ( org_count + count + 3 ) & (FT_UInt)-4; - - - /* we arbitrarily limit the number of subglyphs */ - /* to avoid endless recursion */ - if ( new_max > 64 ) - { - error = FT_THROW( Invalid_Table ); - FT_ERROR(( "pfr_glyph_load_compound:" - " too many compound glyphs components\n" )); - goto Exit; - } - - if ( FT_RENEW_ARRAY( glyph->subs, glyph->max_subs, new_max ) ) - goto Exit; - - glyph->max_subs = new_max; - } - - subglyph = glyph->subs + org_count; - - for ( i = 0; i < count; i++, subglyph++ ) - { - FT_UInt format; - - - x_pos = 0; - y_pos = 0; - - PFR_CHECK( 1 ); - format = PFR_NEXT_BYTE( p ); - - /* read scale when available */ - subglyph->x_scale = 0x10000L; - if ( format & PFR_SUBGLYPH_XSCALE ) - { - PFR_CHECK( 2 ); - subglyph->x_scale = PFR_NEXT_SHORT( p ) * 16; - } - - subglyph->y_scale = 0x10000L; - if ( format & PFR_SUBGLYPH_YSCALE ) - { - PFR_CHECK( 2 ); - subglyph->y_scale = PFR_NEXT_SHORT( p ) * 16; - } - - /* read offset */ - switch ( format & 3 ) - { - case 1: - PFR_CHECK( 2 ); - x_pos = PFR_NEXT_SHORT( p ); - break; - - case 2: - PFR_CHECK( 1 ); - x_pos += PFR_NEXT_INT8( p ); - break; - - default: - ; - } - - switch ( ( format >> 2 ) & 3 ) - { - case 1: - PFR_CHECK( 2 ); - y_pos = PFR_NEXT_SHORT( p ); - break; - - case 2: - PFR_CHECK( 1 ); - y_pos += PFR_NEXT_INT8( p ); - break; - - default: - ; - } - - subglyph->x_delta = x_pos; - subglyph->y_delta = y_pos; - - /* read glyph position and size now */ - if ( format & PFR_SUBGLYPH_2BYTE_SIZE ) - { - PFR_CHECK( 2 ); - subglyph->gps_size = PFR_NEXT_USHORT( p ); - } - else - { - PFR_CHECK( 1 ); - subglyph->gps_size = PFR_NEXT_BYTE( p ); - } - - if ( format & PFR_SUBGLYPH_3BYTE_OFFSET ) - { - PFR_CHECK( 3 ); - subglyph->gps_offset = PFR_NEXT_ULONG( p ); - } - else - { - PFR_CHECK( 2 ); - subglyph->gps_offset = PFR_NEXT_USHORT( p ); - } - - glyph->num_subs++; - } - - Exit: - return error; - - Failure: - Too_Short: - error = FT_THROW( Invalid_Table ); - FT_ERROR(( "pfr_glyph_load_compound: invalid glyph data\n" )); - goto Exit; - } - - - static FT_Error - pfr_glyph_load_rec( PFR_Glyph glyph, - FT_Stream stream, - FT_ULong gps_offset, - FT_ULong offset, - FT_ULong size ) - { - FT_Error error; - FT_Byte* p; - FT_Byte* limit; - - - if ( FT_STREAM_SEEK( gps_offset + offset ) || - FT_FRAME_ENTER( size ) ) - goto Exit; - - p = (FT_Byte*)stream->cursor; - limit = p + size; - - if ( size > 0 && *p & PFR_GLYPH_IS_COMPOUND ) - { - FT_UInt n, old_count, count; - FT_GlyphLoader loader = glyph->loader; - FT_Outline* base = &loader->base.outline; - - - old_count = glyph->num_subs; - - /* this is a compound glyph - load it */ - error = pfr_glyph_load_compound( glyph, p, limit ); - - FT_FRAME_EXIT(); - - if ( error ) - goto Exit; - - count = glyph->num_subs - old_count; - - FT_TRACE4(( "compound glyph with %d elements (offset %lu):\n", - count, offset )); - - /* now, load each individual glyph */ - for ( n = 0; n < count; n++ ) - { - FT_Int i, old_points, num_points; - PFR_SubGlyph subglyph; - - - FT_TRACE4(( " subglyph %d:\n", n )); - - subglyph = glyph->subs + old_count + n; - old_points = base->n_points; - - error = pfr_glyph_load_rec( glyph, stream, gps_offset, - subglyph->gps_offset, - subglyph->gps_size ); - if ( error ) - break; - - /* note that `glyph->subs' might have been re-allocated */ - subglyph = glyph->subs + old_count + n; - num_points = base->n_points - old_points; - - /* translate and eventually scale the new glyph points */ - if ( subglyph->x_scale != 0x10000L || subglyph->y_scale != 0x10000L ) - { - FT_Vector* vec = base->points + old_points; - - - for ( i = 0; i < num_points; i++, vec++ ) - { - vec->x = FT_MulFix( vec->x, subglyph->x_scale ) + - subglyph->x_delta; - vec->y = FT_MulFix( vec->y, subglyph->y_scale ) + - subglyph->y_delta; - } - } - else - { - FT_Vector* vec = loader->base.outline.points + old_points; - - - for ( i = 0; i < num_points; i++, vec++ ) - { - vec->x += subglyph->x_delta; - vec->y += subglyph->y_delta; - } - } - - /* proceed to next sub-glyph */ - } - - FT_TRACE4(( "end compound glyph with %d elements\n", count )); - } - else - { - FT_TRACE4(( "simple glyph (offset %lu)\n", offset )); - - /* load a simple glyph */ - error = pfr_glyph_load_simple( glyph, p, limit ); - - FT_FRAME_EXIT(); - } - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - pfr_glyph_load( PFR_Glyph glyph, - FT_Stream stream, - FT_ULong gps_offset, - FT_ULong offset, - FT_ULong size ) - { - /* initialize glyph loader */ - FT_GlyphLoader_Rewind( glyph->loader ); - - glyph->num_subs = 0; - - /* load the glyph, recursively when needed */ - return pfr_glyph_load_rec( glyph, stream, gps_offset, offset, size ); - } - - -/* END */ diff --git a/3party/freetype/src/pfr/pfrgload.h b/3party/freetype/src/pfr/pfrgload.h deleted file mode 100644 index c7c8da15a1..0000000000 --- a/3party/freetype/src/pfr/pfrgload.h +++ /dev/null @@ -1,49 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrgload.h */ -/* */ -/* FreeType PFR glyph loader (specification). */ -/* */ -/* Copyright 2002-2015 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 __PFRGLOAD_H__ -#define __PFRGLOAD_H__ - -#include "pfrtypes.h" - -FT_BEGIN_HEADER - - - FT_LOCAL( void ) - pfr_glyph_init( PFR_Glyph glyph, - FT_GlyphLoader loader ); - - FT_LOCAL( void ) - pfr_glyph_done( PFR_Glyph glyph ); - - - FT_LOCAL( FT_Error ) - pfr_glyph_load( PFR_Glyph glyph, - FT_Stream stream, - FT_ULong gps_offset, - FT_ULong offset, - FT_ULong size ); - - -FT_END_HEADER - - -#endif /* __PFRGLOAD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pfr/pfrload.c b/3party/freetype/src/pfr/pfrload.c deleted file mode 100644 index ec7311df56..0000000000 --- a/3party/freetype/src/pfr/pfrload.c +++ /dev/null @@ -1,941 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrload.c */ -/* */ -/* FreeType PFR loader (body). */ -/* */ -/* Copyright 2002-2015 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 "pfrload.h" -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H - -#include "pfrerror.h" - -#undef FT_COMPONENT -#define FT_COMPONENT trace_pfr - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** EXTRA ITEMS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_LOCAL_DEF( FT_Error ) - pfr_extra_items_skip( FT_Byte* *pp, - FT_Byte* limit ) - { - return pfr_extra_items_parse( pp, limit, NULL, NULL ); - } - - - FT_LOCAL_DEF( FT_Error ) - pfr_extra_items_parse( FT_Byte* *pp, - FT_Byte* limit, - PFR_ExtraItem item_list, - FT_Pointer item_data ) - { - FT_Error error = FT_Err_Ok; - FT_Byte* p = *pp; - FT_UInt num_items, item_type, item_size; - - - PFR_CHECK( 1 ); - num_items = PFR_NEXT_BYTE( p ); - - for ( ; num_items > 0; num_items-- ) - { - PFR_CHECK( 2 ); - item_size = PFR_NEXT_BYTE( p ); - item_type = PFR_NEXT_BYTE( p ); - - PFR_CHECK( item_size ); - - if ( item_list ) - { - PFR_ExtraItem extra = item_list; - - - for ( extra = item_list; extra->parser != NULL; extra++ ) - { - if ( extra->type == item_type ) - { - error = extra->parser( p, p + item_size, item_data ); - if ( error ) goto Exit; - - break; - } - } - } - - p += item_size; - } - - Exit: - *pp = p; - return error; - - Too_Short: - FT_ERROR(( "pfr_extra_items_parse: invalid extra items table\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PFR HEADER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static const FT_Frame_Field pfr_header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE PFR_HeaderRec - - FT_FRAME_START( 58 ), - FT_FRAME_ULONG ( signature ), - FT_FRAME_USHORT( version ), - FT_FRAME_USHORT( signature2 ), - FT_FRAME_USHORT( header_size ), - - FT_FRAME_USHORT( log_dir_size ), - FT_FRAME_USHORT( log_dir_offset ), - - FT_FRAME_USHORT( log_font_max_size ), - FT_FRAME_UOFF3 ( log_font_section_size ), - FT_FRAME_UOFF3 ( log_font_section_offset ), - - FT_FRAME_USHORT( phy_font_max_size ), - FT_FRAME_UOFF3 ( phy_font_section_size ), - FT_FRAME_UOFF3 ( phy_font_section_offset ), - - FT_FRAME_USHORT( gps_max_size ), - FT_FRAME_UOFF3 ( gps_section_size ), - FT_FRAME_UOFF3 ( gps_section_offset ), - - FT_FRAME_BYTE ( max_blue_values ), - FT_FRAME_BYTE ( max_x_orus ), - FT_FRAME_BYTE ( max_y_orus ), - - FT_FRAME_BYTE ( phy_font_max_size_high ), - FT_FRAME_BYTE ( color_flags ), - - FT_FRAME_UOFF3 ( bct_max_size ), - FT_FRAME_UOFF3 ( bct_set_max_size ), - FT_FRAME_UOFF3 ( phy_bct_set_max_size ), - - FT_FRAME_USHORT( num_phy_fonts ), - FT_FRAME_BYTE ( max_vert_stem_snap ), - FT_FRAME_BYTE ( max_horz_stem_snap ), - FT_FRAME_USHORT( max_chars ), - FT_FRAME_END - }; - - - FT_LOCAL_DEF( FT_Error ) - pfr_header_load( PFR_Header header, - FT_Stream stream ) - { - FT_Error error; - - - /* read header directly */ - if ( !FT_STREAM_SEEK( 0 ) && - !FT_STREAM_READ_FIELDS( pfr_header_fields, header ) ) - { - /* make a few adjustments to the header */ - header->phy_font_max_size += - (FT_UInt32)header->phy_font_max_size_high << 16; - } - - return error; - } - - - FT_LOCAL_DEF( FT_Bool ) - pfr_header_check( PFR_Header header ) - { - FT_Bool result = 1; - - - /* check signature and header size */ - if ( header->signature != 0x50465230L || /* "PFR0" */ - header->version > 4 || - header->header_size < 58 || - header->signature2 != 0x0D0A ) /* CR/LF */ - { - result = 0; - } - return result; - } - - - /***********************************************************************/ - /***********************************************************************/ - /***** *****/ - /***** PFR LOGICAL FONTS *****/ - /***** *****/ - /***********************************************************************/ - /***********************************************************************/ - - - FT_LOCAL_DEF( FT_Error ) - pfr_log_font_count( FT_Stream stream, - FT_UInt32 section_offset, - FT_Long *acount ) - { - FT_Error error; - FT_UInt count; - FT_UInt result = 0; - - - if ( FT_STREAM_SEEK( section_offset ) || FT_READ_USHORT( count ) ) - goto Exit; - - result = count; - - Exit: - *acount = (FT_Long)result; - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - pfr_log_font_load( PFR_LogFont log_font, - FT_Stream stream, - FT_UInt idx, - FT_UInt32 section_offset, - FT_Bool size_increment ) - { - FT_UInt num_log_fonts; - FT_UInt flags; - FT_UInt32 offset; - FT_UInt32 size; - FT_Error error; - - - if ( FT_STREAM_SEEK( section_offset ) || - FT_READ_USHORT( num_log_fonts ) ) - goto Exit; - - if ( idx >= num_log_fonts ) - return FT_THROW( Invalid_Argument ); - - if ( FT_STREAM_SKIP( idx * 5 ) || - FT_READ_USHORT( size ) || - FT_READ_UOFF3 ( offset ) ) - goto Exit; - - /* save logical font size and offset */ - log_font->size = size; - log_font->offset = offset; - - /* now, check the rest of the table before loading it */ - { - FT_Byte* p; - FT_Byte* limit; - FT_UInt local; - - - if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) ) - goto Exit; - - p = stream->cursor; - limit = p + size; - - PFR_CHECK(13); - - log_font->matrix[0] = PFR_NEXT_LONG( p ); - log_font->matrix[1] = PFR_NEXT_LONG( p ); - log_font->matrix[2] = PFR_NEXT_LONG( p ); - log_font->matrix[3] = PFR_NEXT_LONG( p ); - - flags = PFR_NEXT_BYTE( p ); - - local = 0; - if ( flags & PFR_LOG_STROKE ) - { - local++; - if ( flags & PFR_LOG_2BYTE_STROKE ) - local++; - - if ( (flags & PFR_LINE_JOIN_MASK) == PFR_LINE_JOIN_MITER ) - local += 3; - } - if ( flags & PFR_LOG_BOLD ) - { - local++; - if ( flags & PFR_LOG_2BYTE_BOLD ) - local++; - } - - PFR_CHECK( local ); - - if ( flags & PFR_LOG_STROKE ) - { - log_font->stroke_thickness = ( flags & PFR_LOG_2BYTE_STROKE ) - ? PFR_NEXT_SHORT( p ) - : PFR_NEXT_BYTE( p ); - - if ( ( flags & PFR_LINE_JOIN_MASK ) == PFR_LINE_JOIN_MITER ) - log_font->miter_limit = PFR_NEXT_LONG( p ); - } - - if ( flags & PFR_LOG_BOLD ) - { - log_font->bold_thickness = ( flags & PFR_LOG_2BYTE_BOLD ) - ? PFR_NEXT_SHORT( p ) - : PFR_NEXT_BYTE( p ); - } - - if ( flags & PFR_LOG_EXTRA_ITEMS ) - { - error = pfr_extra_items_skip( &p, limit ); - if (error) goto Fail; - } - - PFR_CHECK(5); - log_font->phys_size = PFR_NEXT_USHORT( p ); - log_font->phys_offset = PFR_NEXT_ULONG( p ); - if ( size_increment ) - { - PFR_CHECK( 1 ); - log_font->phys_size += (FT_UInt32)PFR_NEXT_BYTE( p ) << 16; - } - } - - Fail: - FT_FRAME_EXIT(); - - Exit: - return error; - - Too_Short: - FT_ERROR(( "pfr_log_font_load: invalid logical font table\n" )); - error = FT_THROW( Invalid_Table ); - goto Fail; - } - - - /***********************************************************************/ - /***********************************************************************/ - /***** *****/ - /***** PFR PHYSICAL FONTS *****/ - /***** *****/ - /***********************************************************************/ - /***********************************************************************/ - - - /* load bitmap strikes lists */ - FT_CALLBACK_DEF( FT_Error ) - pfr_extra_item_load_bitmap_info( FT_Byte* p, - FT_Byte* limit, - PFR_PhyFont phy_font ) - { - FT_Memory memory = phy_font->memory; - PFR_Strike strike; - FT_UInt flags0; - FT_UInt n, count, size1; - FT_Error error = FT_Err_Ok; - - - PFR_CHECK( 5 ); - - p += 3; /* skip bctSize */ - flags0 = PFR_NEXT_BYTE( p ); - count = PFR_NEXT_BYTE( p ); - - /* re-allocate when needed */ - if ( phy_font->num_strikes + count > phy_font->max_strikes ) - { - FT_UInt new_max = FT_PAD_CEIL( phy_font->num_strikes + count, 4 ); - - - if ( FT_RENEW_ARRAY( phy_font->strikes, - phy_font->num_strikes, - new_max ) ) - goto Exit; - - phy_font->max_strikes = new_max; - } - - size1 = 1 + 1 + 1 + 2 + 2 + 1; - if ( flags0 & PFR_STRIKE_2BYTE_XPPM ) - size1++; - - if ( flags0 & PFR_STRIKE_2BYTE_YPPM ) - size1++; - - if ( flags0 & PFR_STRIKE_3BYTE_SIZE ) - size1++; - - if ( flags0 & PFR_STRIKE_3BYTE_OFFSET ) - size1++; - - if ( flags0 & PFR_STRIKE_2BYTE_COUNT ) - size1++; - - strike = phy_font->strikes + phy_font->num_strikes; - - PFR_CHECK( count * size1 ); - - for ( n = 0; n < count; n++, strike++ ) - { - strike->x_ppm = ( flags0 & PFR_STRIKE_2BYTE_XPPM ) - ? PFR_NEXT_USHORT( p ) - : PFR_NEXT_BYTE( p ); - - strike->y_ppm = ( flags0 & PFR_STRIKE_2BYTE_YPPM ) - ? PFR_NEXT_USHORT( p ) - : PFR_NEXT_BYTE( p ); - - strike->flags = PFR_NEXT_BYTE( p ); - - strike->bct_size = ( flags0 & PFR_STRIKE_3BYTE_SIZE ) - ? PFR_NEXT_ULONG( p ) - : PFR_NEXT_USHORT( p ); - - strike->bct_offset = ( flags0 & PFR_STRIKE_3BYTE_OFFSET ) - ? PFR_NEXT_ULONG( p ) - : PFR_NEXT_USHORT( p ); - - strike->num_bitmaps = ( flags0 & PFR_STRIKE_2BYTE_COUNT ) - ? PFR_NEXT_USHORT( p ) - : PFR_NEXT_BYTE( p ); - } - - phy_font->num_strikes += count; - - Exit: - return error; - - Too_Short: - error = FT_THROW( Invalid_Table ); - FT_ERROR(( "pfr_extra_item_load_bitmap_info:" - " invalid bitmap info table\n" )); - goto Exit; - } - - - /* Load font ID. This is a so-called "unique" name that is rather - * long and descriptive (like "Tiresias ScreenFont v7.51"). - * - * Note that a PFR font's family name is contained in an *undocumented* - * string of the "auxiliary data" portion of a physical font record. This - * may also contain the "real" style name! - * - * If no family name is present, the font ID is used instead for the - * family. - */ - FT_CALLBACK_DEF( FT_Error ) - pfr_extra_item_load_font_id( FT_Byte* p, - FT_Byte* limit, - PFR_PhyFont phy_font ) - { - FT_Error error = FT_Err_Ok; - FT_Memory memory = phy_font->memory; - FT_UInt len = (FT_UInt)( limit - p ); - - - if ( phy_font->font_id != NULL ) - goto Exit; - - if ( FT_ALLOC( phy_font->font_id, len + 1 ) ) - goto Exit; - - /* copy font ID name, and terminate it for safety */ - FT_MEM_COPY( phy_font->font_id, p, len ); - phy_font->font_id[len] = 0; - - Exit: - return error; - } - - - /* load stem snap tables */ - FT_CALLBACK_DEF( FT_Error ) - pfr_extra_item_load_stem_snaps( FT_Byte* p, - FT_Byte* limit, - PFR_PhyFont phy_font ) - { - FT_UInt count, num_vert, num_horz; - FT_Int* snaps = NULL; - FT_Error error = FT_Err_Ok; - FT_Memory memory = phy_font->memory; - - - if ( phy_font->vertical.stem_snaps != NULL ) - goto Exit; - - PFR_CHECK( 1 ); - count = PFR_NEXT_BYTE( p ); - - num_vert = count & 15; - num_horz = count >> 4; - count = num_vert + num_horz; - - PFR_CHECK( count * 2 ); - - if ( FT_NEW_ARRAY( snaps, count ) ) - goto Exit; - - phy_font->vertical.stem_snaps = snaps; - phy_font->horizontal.stem_snaps = snaps + num_vert; - - for ( ; count > 0; count--, snaps++ ) - *snaps = FT_NEXT_SHORT( p ); - - Exit: - return error; - - Too_Short: - error = FT_THROW( Invalid_Table ); - FT_ERROR(( "pfr_exta_item_load_stem_snaps:" - " invalid stem snaps table\n" )); - goto Exit; - } - - - - /* load kerning pair data */ - FT_CALLBACK_DEF( FT_Error ) - pfr_extra_item_load_kerning_pairs( FT_Byte* p, - FT_Byte* limit, - PFR_PhyFont phy_font ) - { - PFR_KernItem item = NULL; - FT_Error error = FT_Err_Ok; - FT_Memory memory = phy_font->memory; - - - FT_TRACE2(( "pfr_extra_item_load_kerning_pairs()\n" )); - - if ( FT_NEW( item ) ) - goto Exit; - - PFR_CHECK( 4 ); - - item->pair_count = PFR_NEXT_BYTE( p ); - item->base_adj = PFR_NEXT_SHORT( p ); - item->flags = PFR_NEXT_BYTE( p ); - item->offset = phy_font->offset + - (FT_Offset)( p - phy_font->cursor ); - -#ifndef PFR_CONFIG_NO_CHECKS - item->pair_size = 3; - - if ( item->flags & PFR_KERN_2BYTE_CHAR ) - item->pair_size += 2; - - if ( item->flags & PFR_KERN_2BYTE_ADJ ) - item->pair_size += 1; - - PFR_CHECK( item->pair_count * item->pair_size ); -#endif - - /* load first and last pairs into the item to speed up */ - /* lookup later... */ - if ( item->pair_count > 0 ) - { - FT_UInt char1, char2; - FT_Byte* q; - - - if ( item->flags & PFR_KERN_2BYTE_CHAR ) - { - q = p; - char1 = PFR_NEXT_USHORT( q ); - char2 = PFR_NEXT_USHORT( q ); - - item->pair1 = PFR_KERN_INDEX( char1, char2 ); - - q = p + item->pair_size * ( item->pair_count - 1 ); - char1 = PFR_NEXT_USHORT( q ); - char2 = PFR_NEXT_USHORT( q ); - - item->pair2 = PFR_KERN_INDEX( char1, char2 ); - } - else - { - q = p; - char1 = PFR_NEXT_BYTE( q ); - char2 = PFR_NEXT_BYTE( q ); - - item->pair1 = PFR_KERN_INDEX( char1, char2 ); - - q = p + item->pair_size * ( item->pair_count - 1 ); - char1 = PFR_NEXT_BYTE( q ); - char2 = PFR_NEXT_BYTE( q ); - - item->pair2 = PFR_KERN_INDEX( char1, char2 ); - } - - /* add new item to the current list */ - item->next = NULL; - *phy_font->kern_items_tail = item; - phy_font->kern_items_tail = &item->next; - phy_font->num_kern_pairs += item->pair_count; - } - else - { - /* empty item! */ - FT_FREE( item ); - } - - Exit: - return error; - - Too_Short: - FT_FREE( item ); - - error = FT_THROW( Invalid_Table ); - FT_ERROR(( "pfr_extra_item_load_kerning_pairs:" - " invalid kerning pairs table\n" )); - goto Exit; - } - - - - static const PFR_ExtraItemRec pfr_phy_font_extra_items[] = - { - { 1, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_bitmap_info }, - { 2, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_font_id }, - { 3, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_stem_snaps }, - { 4, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_kerning_pairs }, - { 0, NULL } - }; - - - /* Loads a name from the auxiliary data. Since this extracts undocumented - * strings from the font file, we need to be careful here. - */ - static FT_Error - pfr_aux_name_load( FT_Byte* p, - FT_UInt len, - FT_Memory memory, - FT_String* *astring ) - { - FT_Error error = FT_Err_Ok; - FT_String* result = NULL; - FT_UInt n, ok; - - - if ( len > 0 && p[len - 1] == 0 ) - len--; - - /* check that each character is ASCII for making sure not to - load garbage - */ - ok = ( len > 0 ); - for ( n = 0; n < len; n++ ) - if ( p[n] < 32 || p[n] > 127 ) - { - ok = 0; - break; - } - - if ( ok ) - { - if ( FT_ALLOC( result, len + 1 ) ) - goto Exit; - - FT_MEM_COPY( result, p, len ); - result[len] = 0; - } - Exit: - *astring = result; - return error; - } - - - FT_LOCAL_DEF( void ) - pfr_phy_font_done( PFR_PhyFont phy_font, - FT_Memory memory ) - { - FT_FREE( phy_font->font_id ); - FT_FREE( phy_font->family_name ); - FT_FREE( phy_font->style_name ); - - FT_FREE( phy_font->vertical.stem_snaps ); - phy_font->vertical.num_stem_snaps = 0; - - phy_font->horizontal.stem_snaps = NULL; - phy_font->horizontal.num_stem_snaps = 0; - - FT_FREE( phy_font->strikes ); - phy_font->num_strikes = 0; - phy_font->max_strikes = 0; - - FT_FREE( phy_font->chars ); - phy_font->num_chars = 0; - phy_font->chars_offset = 0; - - FT_FREE( phy_font->blue_values ); - phy_font->num_blue_values = 0; - - { - PFR_KernItem item, next; - - - item = phy_font->kern_items; - while ( item ) - { - next = item->next; - FT_FREE( item ); - item = next; - } - phy_font->kern_items = NULL; - phy_font->kern_items_tail = NULL; - } - - phy_font->num_kern_pairs = 0; - } - - - FT_LOCAL_DEF( FT_Error ) - pfr_phy_font_load( PFR_PhyFont phy_font, - FT_Stream stream, - FT_UInt32 offset, - FT_UInt32 size ) - { - FT_Error error; - FT_Memory memory = stream->memory; - FT_UInt flags; - FT_ULong num_aux; - FT_Byte* p; - FT_Byte* limit; - - - phy_font->memory = memory; - phy_font->offset = offset; - - phy_font->kern_items = NULL; - phy_font->kern_items_tail = &phy_font->kern_items; - - if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) ) - goto Exit; - - phy_font->cursor = stream->cursor; - - p = stream->cursor; - limit = p + size; - - PFR_CHECK( 15 ); - phy_font->font_ref_number = PFR_NEXT_USHORT( p ); - phy_font->outline_resolution = PFR_NEXT_USHORT( p ); - phy_font->metrics_resolution = PFR_NEXT_USHORT( p ); - phy_font->bbox.xMin = PFR_NEXT_SHORT( p ); - phy_font->bbox.yMin = PFR_NEXT_SHORT( p ); - phy_font->bbox.xMax = PFR_NEXT_SHORT( p ); - phy_font->bbox.yMax = PFR_NEXT_SHORT( p ); - phy_font->flags = flags = PFR_NEXT_BYTE( p ); - - /* get the standard advance for non-proportional fonts */ - if ( !(flags & PFR_PHY_PROPORTIONAL) ) - { - PFR_CHECK( 2 ); - phy_font->standard_advance = PFR_NEXT_SHORT( p ); - } - - /* load the extra items when present */ - if ( flags & PFR_PHY_EXTRA_ITEMS ) - { - error = pfr_extra_items_parse( &p, limit, - pfr_phy_font_extra_items, phy_font ); - - if ( error ) - goto Fail; - } - - /* In certain fonts, the auxiliary bytes contain interesting */ - /* information. These are not in the specification but can be */ - /* guessed by looking at the content of a few PFR0 fonts. */ - PFR_CHECK( 3 ); - num_aux = PFR_NEXT_ULONG( p ); - - if ( num_aux > 0 ) - { - FT_Byte* q = p; - FT_Byte* q2; - - - PFR_CHECK( num_aux ); - p += num_aux; - - while ( num_aux > 0 ) - { - FT_UInt length, type; - - - if ( q + 4 > p ) - break; - - length = PFR_NEXT_USHORT( q ); - if ( length < 4 || length > num_aux ) - break; - - q2 = q + length - 2; - type = PFR_NEXT_USHORT( q ); - - switch ( type ) - { - case 1: - /* this seems to correspond to the font's family name, - * padded to 16-bits with one zero when necessary - */ - error = pfr_aux_name_load( q, length - 4U, memory, - &phy_font->family_name ); - if ( error ) - goto Exit; - break; - - case 2: - if ( q + 32 > q2 ) - break; - - q += 10; - phy_font->ascent = PFR_NEXT_SHORT( q ); - phy_font->descent = PFR_NEXT_SHORT( q ); - phy_font->leading = PFR_NEXT_SHORT( q ); - break; - - case 3: - /* this seems to correspond to the font's style name, - * padded to 16-bits with one zero when necessary - */ - error = pfr_aux_name_load( q, length - 4U, memory, - &phy_font->style_name ); - if ( error ) - goto Exit; - break; - - default: - ; - } - - q = q2; - num_aux -= length; - } - } - - /* read the blue values */ - { - FT_UInt n, count; - - - PFR_CHECK( 1 ); - phy_font->num_blue_values = count = PFR_NEXT_BYTE( p ); - - PFR_CHECK( count * 2 ); - - if ( FT_NEW_ARRAY( phy_font->blue_values, count ) ) - goto Fail; - - for ( n = 0; n < count; n++ ) - phy_font->blue_values[n] = PFR_NEXT_SHORT( p ); - } - - PFR_CHECK( 8 ); - phy_font->blue_fuzz = PFR_NEXT_BYTE( p ); - phy_font->blue_scale = PFR_NEXT_BYTE( p ); - - phy_font->vertical.standard = PFR_NEXT_USHORT( p ); - phy_font->horizontal.standard = PFR_NEXT_USHORT( p ); - - /* read the character descriptors */ - { - FT_UInt n, count, Size; - - - phy_font->num_chars = count = PFR_NEXT_USHORT( p ); - phy_font->chars_offset = offset + (FT_Offset)( p - stream->cursor ); - - if ( FT_NEW_ARRAY( phy_font->chars, count ) ) - goto Fail; - - Size = 1 + 1 + 2; - if ( flags & PFR_PHY_2BYTE_CHARCODE ) - Size += 1; - - if ( flags & PFR_PHY_PROPORTIONAL ) - Size += 2; - - if ( flags & PFR_PHY_ASCII_CODE ) - Size += 1; - - if ( flags & PFR_PHY_2BYTE_GPS_SIZE ) - Size += 1; - - if ( flags & PFR_PHY_3BYTE_GPS_OFFSET ) - Size += 1; - - PFR_CHECK( count * Size ); - - for ( n = 0; n < count; n++ ) - { - PFR_Char cur = &phy_font->chars[n]; - - - cur->char_code = ( flags & PFR_PHY_2BYTE_CHARCODE ) - ? PFR_NEXT_USHORT( p ) - : PFR_NEXT_BYTE( p ); - - cur->advance = ( flags & PFR_PHY_PROPORTIONAL ) - ? PFR_NEXT_SHORT( p ) - : phy_font->standard_advance; - -#if 0 - cur->ascii = ( flags & PFR_PHY_ASCII_CODE ) - ? PFR_NEXT_BYTE( p ) - : 0; -#else - if ( flags & PFR_PHY_ASCII_CODE ) - p += 1; -#endif - cur->gps_size = ( flags & PFR_PHY_2BYTE_GPS_SIZE ) - ? PFR_NEXT_USHORT( p ) - : PFR_NEXT_BYTE( p ); - - cur->gps_offset = ( flags & PFR_PHY_3BYTE_GPS_OFFSET ) - ? PFR_NEXT_ULONG( p ) - : PFR_NEXT_USHORT( p ); - } - } - - /* that's it! */ - - Fail: - FT_FRAME_EXIT(); - - /* save position of bitmap info */ - phy_font->bct_offset = FT_STREAM_POS(); - phy_font->cursor = NULL; - - Exit: - return error; - - Too_Short: - error = FT_THROW( Invalid_Table ); - FT_ERROR(( "pfr_phy_font_load: invalid physical font table\n" )); - goto Fail; - } - - -/* END */ diff --git a/3party/freetype/src/pfr/pfrload.h b/3party/freetype/src/pfr/pfrload.h deleted file mode 100644 index 0a512346b6..0000000000 --- a/3party/freetype/src/pfr/pfrload.h +++ /dev/null @@ -1,118 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrload.h */ -/* */ -/* FreeType PFR loader (specification). */ -/* */ -/* Copyright 2002-2015 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 __PFRLOAD_H__ -#define __PFRLOAD_H__ - -#include "pfrobjs.h" -#include FT_INTERNAL_STREAM_H - - -FT_BEGIN_HEADER - -#ifdef PFR_CONFIG_NO_CHECKS -#define PFR_CHECK( x ) do { } while ( 0 ) -#else -#define PFR_CHECK( x ) do \ - { \ - if ( p + (x) > limit ) \ - goto Too_Short; \ - } while ( 0 ) -#endif - -#define PFR_NEXT_BYTE( p ) FT_NEXT_BYTE( p ) -#define PFR_NEXT_INT8( p ) FT_NEXT_CHAR( p ) -#define PFR_NEXT_SHORT( p ) FT_NEXT_SHORT( p ) -#define PFR_NEXT_USHORT( p ) FT_NEXT_USHORT( p ) -#define PFR_NEXT_LONG( p ) FT_NEXT_OFF3( p ) -#define PFR_NEXT_ULONG( p ) FT_NEXT_UOFF3( p ) - - - /* handling extra items */ - - typedef FT_Error - (*PFR_ExtraItem_ParseFunc)( FT_Byte* p, - FT_Byte* limit, - FT_Pointer data ); - - typedef struct PFR_ExtraItemRec_ - { - FT_UInt type; - PFR_ExtraItem_ParseFunc parser; - - } PFR_ExtraItemRec; - - typedef const struct PFR_ExtraItemRec_* PFR_ExtraItem; - - - FT_LOCAL( FT_Error ) - pfr_extra_items_skip( FT_Byte* *pp, - FT_Byte* limit ); - - FT_LOCAL( FT_Error ) - pfr_extra_items_parse( FT_Byte* *pp, - FT_Byte* limit, - PFR_ExtraItem item_list, - FT_Pointer item_data ); - - - /* load a PFR header */ - FT_LOCAL( FT_Error ) - pfr_header_load( PFR_Header header, - FT_Stream stream ); - - /* check a PFR header */ - FT_LOCAL( FT_Bool ) - pfr_header_check( PFR_Header header ); - - - /* return number of logical fonts in this file */ - FT_LOCAL( FT_Error ) - pfr_log_font_count( FT_Stream stream, - FT_UInt32 log_section_offset, - FT_Long *acount ); - - /* load a pfr logical font entry */ - FT_LOCAL( FT_Error ) - pfr_log_font_load( PFR_LogFont log_font, - FT_Stream stream, - FT_UInt face_index, - FT_UInt32 section_offset, - FT_Bool size_increment ); - - - /* load a physical font entry */ - FT_LOCAL( FT_Error ) - pfr_phy_font_load( PFR_PhyFont phy_font, - FT_Stream stream, - FT_UInt32 offset, - FT_UInt32 size ); - - /* finalize a physical font */ - FT_LOCAL( void ) - pfr_phy_font_done( PFR_PhyFont phy_font, - FT_Memory memory ); - - /* */ - -FT_END_HEADER - -#endif /* __PFRLOAD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pfr/pfrobjs.c b/3party/freetype/src/pfr/pfrobjs.c deleted file mode 100644 index b854b00ba8..0000000000 --- a/3party/freetype/src/pfr/pfrobjs.c +++ /dev/null @@ -1,599 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrobjs.c */ -/* */ -/* FreeType PFR object methods (body). */ -/* */ -/* Copyright 2002-2015 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 "pfrobjs.h" -#include "pfrload.h" -#include "pfrgload.h" -#include "pfrcmap.h" -#include "pfrsbit.h" -#include FT_OUTLINE_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_TRUETYPE_IDS_H - -#include "pfrerror.h" - -#undef FT_COMPONENT -#define FT_COMPONENT trace_pfr - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FACE OBJECT METHODS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - pfr_face_done( FT_Face pfrface ) /* PFR_Face */ - { - PFR_Face face = (PFR_Face)pfrface; - FT_Memory memory; - - - if ( !face ) - return; - - memory = pfrface->driver->root.memory; - - /* we don't want dangling pointers */ - pfrface->family_name = NULL; - pfrface->style_name = NULL; - - /* finalize the physical font record */ - pfr_phy_font_done( &face->phy_font, FT_FACE_MEMORY( face ) ); - - /* no need to finalize the logical font or the header */ - FT_FREE( pfrface->available_sizes ); - } - - - FT_LOCAL_DEF( FT_Error ) - pfr_face_init( FT_Stream stream, - FT_Face pfrface, - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ) - { - PFR_Face face = (PFR_Face)pfrface; - FT_Error error; - - FT_UNUSED( num_params ); - FT_UNUSED( params ); - - - FT_TRACE2(( "PFR driver\n" )); - - /* load the header and check it */ - error = pfr_header_load( &face->header, stream ); - if ( error ) - goto Exit; - - if ( !pfr_header_check( &face->header ) ) - { - FT_TRACE2(( " not a PFR font\n" )); - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - /* check face index */ - { - FT_Long num_faces; - - - error = pfr_log_font_count( stream, - face->header.log_dir_offset, - &num_faces ); - if ( error ) - goto Exit; - - pfrface->num_faces = num_faces; - } - - if ( face_index < 0 ) - goto Exit; - - if ( ( face_index & 0xFFFF ) >= pfrface->num_faces ) - { - FT_ERROR(( "pfr_face_init: invalid face index\n" )); - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* load the face */ - error = pfr_log_font_load( - &face->log_font, stream, (FT_UInt)( face_index & 0xFFFF ), - face->header.log_dir_offset, - FT_BOOL( face->header.phy_font_max_size_high != 0 ) ); - if ( error ) - goto Exit; - - /* now load the physical font descriptor */ - error = pfr_phy_font_load( &face->phy_font, stream, - face->log_font.phys_offset, - face->log_font.phys_size ); - if ( error ) - goto Exit; - - /* now set up all root face fields */ - { - PFR_PhyFont phy_font = &face->phy_font; - - - pfrface->face_index = face_index & 0xFFFF; - pfrface->num_glyphs = (FT_Long)phy_font->num_chars + 1; - - pfrface->face_flags |= FT_FACE_FLAG_SCALABLE; - - /* if all characters point to the same gps_offset 0, we */ - /* assume that the font only contains bitmaps */ - { - FT_UInt nn; - - - for ( nn = 0; nn < phy_font->num_chars; nn++ ) - if ( phy_font->chars[nn].gps_offset != 0 ) - break; - - if ( nn == phy_font->num_chars ) - { - if ( phy_font->num_strikes > 0 ) - pfrface->face_flags = 0; /* not scalable */ - else - { - FT_ERROR(( "pfr_face_init: font doesn't contain glyphs\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - } - } - - if ( (phy_font->flags & PFR_PHY_PROPORTIONAL) == 0 ) - pfrface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; - - if ( phy_font->flags & PFR_PHY_VERTICAL ) - pfrface->face_flags |= FT_FACE_FLAG_VERTICAL; - else - pfrface->face_flags |= FT_FACE_FLAG_HORIZONTAL; - - if ( phy_font->num_strikes > 0 ) - pfrface->face_flags |= FT_FACE_FLAG_FIXED_SIZES; - - if ( phy_font->num_kern_pairs > 0 ) - pfrface->face_flags |= FT_FACE_FLAG_KERNING; - - /* If no family name was found in the "undocumented" auxiliary - * data, use the font ID instead. This sucks but is better than - * nothing. - */ - pfrface->family_name = phy_font->family_name; - if ( pfrface->family_name == NULL ) - pfrface->family_name = phy_font->font_id; - - /* note that the style name can be NULL in certain PFR fonts, - * probably meaning "Regular" - */ - pfrface->style_name = phy_font->style_name; - - pfrface->num_fixed_sizes = 0; - pfrface->available_sizes = NULL; - - pfrface->bbox = phy_font->bbox; - pfrface->units_per_EM = (FT_UShort)phy_font->outline_resolution; - pfrface->ascender = (FT_Short) phy_font->bbox.yMax; - pfrface->descender = (FT_Short) phy_font->bbox.yMin; - - pfrface->height = (FT_Short)( ( pfrface->units_per_EM * 12 ) / 10 ); - if ( pfrface->height < pfrface->ascender - pfrface->descender ) - pfrface->height = (FT_Short)(pfrface->ascender - pfrface->descender); - - if ( phy_font->num_strikes > 0 ) - { - FT_UInt n, count = phy_font->num_strikes; - FT_Bitmap_Size* size; - PFR_Strike strike; - FT_Memory memory = pfrface->stream->memory; - - - if ( FT_NEW_ARRAY( pfrface->available_sizes, count ) ) - goto Exit; - - size = pfrface->available_sizes; - strike = phy_font->strikes; - for ( n = 0; n < count; n++, size++, strike++ ) - { - size->height = (FT_Short)strike->y_ppm; - size->width = (FT_Short)strike->x_ppm; - size->size = (FT_Pos)( strike->y_ppm << 6 ); - size->x_ppem = (FT_Pos)( strike->x_ppm << 6 ); - size->y_ppem = (FT_Pos)( strike->y_ppm << 6 ); - } - pfrface->num_fixed_sizes = (FT_Int)count; - } - - /* now compute maximum advance width */ - if ( ( phy_font->flags & PFR_PHY_PROPORTIONAL ) == 0 ) - pfrface->max_advance_width = (FT_Short)phy_font->standard_advance; - else - { - FT_Int max = 0; - FT_UInt count = phy_font->num_chars; - PFR_Char gchar = phy_font->chars; - - - for ( ; count > 0; count--, gchar++ ) - { - if ( max < gchar->advance ) - max = gchar->advance; - } - - pfrface->max_advance_width = (FT_Short)max; - } - - pfrface->max_advance_height = pfrface->height; - - pfrface->underline_position = (FT_Short)( -pfrface->units_per_EM / 10 ); - pfrface->underline_thickness = (FT_Short)( pfrface->units_per_EM / 30 ); - - /* create charmap */ - { - FT_CharMapRec charmap; - - - charmap.face = pfrface; - charmap.platform_id = TT_PLATFORM_MICROSOFT; - charmap.encoding_id = TT_MS_ID_UNICODE_CS; - charmap.encoding = FT_ENCODING_UNICODE; - - error = FT_CMap_New( &pfr_cmap_class_rec, NULL, &charmap, NULL ); - -#if 0 - /* Select default charmap */ - if ( pfrface->num_charmaps ) - pfrface->charmap = pfrface->charmaps[0]; -#endif - } - - /* check whether we've loaded any kerning pairs */ - if ( phy_font->num_kern_pairs ) - pfrface->face_flags |= FT_FACE_FLAG_KERNING; - } - - Exit: - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** SLOT OBJECT METHOD *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( FT_Error ) - pfr_slot_init( FT_GlyphSlot pfrslot ) /* PFR_Slot */ - { - PFR_Slot slot = (PFR_Slot)pfrslot; - FT_GlyphLoader loader = pfrslot->internal->loader; - - - pfr_glyph_init( &slot->glyph, loader ); - - return 0; - } - - - FT_LOCAL_DEF( void ) - pfr_slot_done( FT_GlyphSlot pfrslot ) /* PFR_Slot */ - { - PFR_Slot slot = (PFR_Slot)pfrslot; - - - pfr_glyph_done( &slot->glyph ); - } - - - FT_LOCAL_DEF( FT_Error ) - pfr_slot_load( FT_GlyphSlot pfrslot, /* PFR_Slot */ - FT_Size pfrsize, /* PFR_Size */ - FT_UInt gindex, - FT_Int32 load_flags ) - { - PFR_Slot slot = (PFR_Slot)pfrslot; - PFR_Size size = (PFR_Size)pfrsize; - FT_Error error; - PFR_Face face = (PFR_Face)pfrslot->face; - PFR_Char gchar; - FT_Outline* outline = &pfrslot->outline; - FT_ULong gps_offset; - - - FT_TRACE1(( "pfr_slot_load: glyph index %d\n", gindex )); - - if ( gindex > 0 ) - gindex--; - - if ( !face || gindex >= face->phy_font.num_chars ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* try to load an embedded bitmap */ - if ( ( load_flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP ) ) == 0 ) - { - error = pfr_slot_load_bitmap( slot, size, gindex ); - if ( error == 0 ) - goto Exit; - } - - if ( load_flags & FT_LOAD_SBITS_ONLY ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - gchar = face->phy_font.chars + gindex; - pfrslot->format = FT_GLYPH_FORMAT_OUTLINE; - outline->n_points = 0; - outline->n_contours = 0; - gps_offset = face->header.gps_section_offset; - - /* load the glyph outline (FT_LOAD_NO_RECURSE isn't supported) */ - error = pfr_glyph_load( &slot->glyph, face->root.stream, - gps_offset, gchar->gps_offset, gchar->gps_size ); - - if ( !error ) - { - FT_BBox cbox; - FT_Glyph_Metrics* metrics = &pfrslot->metrics; - FT_Pos advance; - FT_UInt em_metrics, em_outline; - FT_Bool scaling; - - - scaling = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ); - - /* copy outline data */ - *outline = slot->glyph.loader->base.outline; - - outline->flags &= ~FT_OUTLINE_OWNER; - outline->flags |= FT_OUTLINE_REVERSE_FILL; - - if ( size && pfrsize->metrics.y_ppem < 24 ) - outline->flags |= FT_OUTLINE_HIGH_PRECISION; - - /* compute the advance vector */ - metrics->horiAdvance = 0; - metrics->vertAdvance = 0; - - advance = gchar->advance; - em_metrics = face->phy_font.metrics_resolution; - em_outline = face->phy_font.outline_resolution; - - if ( em_metrics != em_outline ) - advance = FT_MulDiv( advance, - (FT_Long)em_outline, - (FT_Long)em_metrics ); - - if ( face->phy_font.flags & PFR_PHY_VERTICAL ) - metrics->vertAdvance = advance; - else - metrics->horiAdvance = advance; - - pfrslot->linearHoriAdvance = metrics->horiAdvance; - pfrslot->linearVertAdvance = metrics->vertAdvance; - - /* make-up vertical metrics(?) */ - metrics->vertBearingX = 0; - metrics->vertBearingY = 0; - -#if 0 /* some fonts seem to be broken here! */ - - /* Apply the font matrix, if any. */ - /* TODO: Test existing fonts with unusual matrix */ - /* whether we have to adjust Units per EM. */ - { - FT_Matrix font_matrix; - - - font_matrix.xx = face->log_font.matrix[0] << 8; - font_matrix.yx = face->log_font.matrix[1] << 8; - font_matrix.xy = face->log_font.matrix[2] << 8; - font_matrix.yy = face->log_font.matrix[3] << 8; - - FT_Outline_Transform( outline, &font_matrix ); - } -#endif - - /* scale when needed */ - if ( scaling ) - { - FT_Int n; - FT_Fixed x_scale = pfrsize->metrics.x_scale; - FT_Fixed y_scale = pfrsize->metrics.y_scale; - FT_Vector* vec = outline->points; - - - /* scale outline points */ - for ( n = 0; n < outline->n_points; n++, vec++ ) - { - vec->x = FT_MulFix( vec->x, x_scale ); - vec->y = FT_MulFix( vec->y, y_scale ); - } - - /* scale the advance */ - metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); - metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); - } - - /* compute the rest of the metrics */ - FT_Outline_Get_CBox( outline, &cbox ); - - metrics->width = cbox.xMax - cbox.xMin; - metrics->height = cbox.yMax - cbox.yMin; - metrics->horiBearingX = cbox.xMin; - metrics->horiBearingY = cbox.yMax - metrics->height; - } - - Exit: - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** KERNING METHOD *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( FT_Error ) - pfr_face_get_kerning( FT_Face pfrface, /* PFR_Face */ - FT_UInt glyph1, - FT_UInt glyph2, - FT_Vector* kerning ) - { - PFR_Face face = (PFR_Face)pfrface; - FT_Error error = FT_Err_Ok; - PFR_PhyFont phy_font = &face->phy_font; - FT_UInt32 code1, code2, pair; - - - kerning->x = 0; - kerning->y = 0; - - if ( glyph1 > 0 ) - glyph1--; - - if ( glyph2 > 0 ) - glyph2--; - - /* convert glyph indices to character codes */ - if ( glyph1 > phy_font->num_chars || - glyph2 > phy_font->num_chars ) - goto Exit; - - code1 = phy_font->chars[glyph1].char_code; - code2 = phy_font->chars[glyph2].char_code; - pair = PFR_KERN_INDEX( code1, code2 ); - - /* now search the list of kerning items */ - { - PFR_KernItem item = phy_font->kern_items; - FT_Stream stream = pfrface->stream; - - - for ( ; item; item = item->next ) - { - if ( pair >= item->pair1 && pair <= item->pair2 ) - goto FoundPair; - } - goto Exit; - - FoundPair: /* we found an item, now parse it and find the value if any */ - if ( FT_STREAM_SEEK( item->offset ) || - FT_FRAME_ENTER( item->pair_count * item->pair_size ) ) - goto Exit; - - { - FT_UInt count = item->pair_count; - FT_UInt size = item->pair_size; - FT_UInt power = 1 << FT_MSB( count ); - FT_UInt probe = power * size; - FT_UInt extra = count - power; - FT_Byte* base = stream->cursor; - FT_Bool twobytes = FT_BOOL( item->flags & 1 ); - FT_Bool twobyte_adj = FT_BOOL( item->flags & 2 ); - FT_Byte* p; - FT_UInt32 cpair; - - - if ( extra > 0 ) - { - p = base + extra * size; - - if ( twobytes ) - cpair = FT_NEXT_ULONG( p ); - else - cpair = PFR_NEXT_KPAIR( p ); - - if ( cpair == pair ) - goto Found; - - if ( cpair < pair ) - { - if ( twobyte_adj ) - p += 2; - else - p++; - base = p; - } - } - - while ( probe > size ) - { - probe >>= 1; - p = base + probe; - - if ( twobytes ) - cpair = FT_NEXT_ULONG( p ); - else - cpair = PFR_NEXT_KPAIR( p ); - - if ( cpair == pair ) - goto Found; - - if ( cpair < pair ) - base += probe; - } - - p = base; - - if ( twobytes ) - cpair = FT_NEXT_ULONG( p ); - else - cpair = PFR_NEXT_KPAIR( p ); - - if ( cpair == pair ) - { - FT_Int value; - - - Found: - if ( twobyte_adj ) - value = FT_PEEK_SHORT( p ); - else - value = p[0]; - - kerning->x = item->base_adj + value; - } - } - - FT_FRAME_EXIT(); - } - - Exit: - return error; - } - -/* END */ diff --git a/3party/freetype/src/pfr/pfrobjs.h b/3party/freetype/src/pfr/pfrobjs.h deleted file mode 100644 index e990b45a0a..0000000000 --- a/3party/freetype/src/pfr/pfrobjs.h +++ /dev/null @@ -1,96 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrobjs.h */ -/* */ -/* FreeType PFR object methods (specification). */ -/* */ -/* Copyright 2002-2015 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 __PFROBJS_H__ -#define __PFROBJS_H__ - -#include "pfrtypes.h" - - -FT_BEGIN_HEADER - - typedef struct PFR_FaceRec_* PFR_Face; - - typedef struct PFR_SizeRec_* PFR_Size; - - typedef struct PFR_SlotRec_* PFR_Slot; - - - typedef struct PFR_FaceRec_ - { - FT_FaceRec root; - PFR_HeaderRec header; - PFR_LogFontRec log_font; - PFR_PhyFontRec phy_font; - - } PFR_FaceRec; - - - typedef struct PFR_SizeRec_ - { - FT_SizeRec root; - - } PFR_SizeRec; - - - typedef struct PFR_SlotRec_ - { - FT_GlyphSlotRec root; - PFR_GlyphRec glyph; - - } PFR_SlotRec; - - - FT_LOCAL( FT_Error ) - pfr_face_init( FT_Stream stream, - FT_Face face, /* PFR_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - FT_LOCAL( void ) - pfr_face_done( FT_Face face ); /* PFR_Face */ - - - FT_LOCAL( FT_Error ) - pfr_face_get_kerning( FT_Face face, /* PFR_Face */ - FT_UInt glyph1, - FT_UInt glyph2, - FT_Vector* kerning ); - - - FT_LOCAL( FT_Error ) - pfr_slot_init( FT_GlyphSlot slot ); /* PFR_Slot */ - - FT_LOCAL( void ) - pfr_slot_done( FT_GlyphSlot slot ); /* PFR_Slot */ - - - FT_LOCAL( FT_Error ) - pfr_slot_load( FT_GlyphSlot slot, /* PFR_Slot */ - FT_Size size, /* PFR_Size */ - FT_UInt gindex, - FT_Int32 load_flags ); - - -FT_END_HEADER - -#endif /* __PFROBJS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pfr/pfrsbit.c b/3party/freetype/src/pfr/pfrsbit.c deleted file mode 100644 index bb5df5c9f9..0000000000 --- a/3party/freetype/src/pfr/pfrsbit.c +++ /dev/null @@ -1,705 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrsbit.c */ -/* */ -/* FreeType PFR bitmap loader (body). */ -/* */ -/* Copyright 2002-2015 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 "pfrsbit.h" -#include "pfrload.h" -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H - -#include "pfrerror.h" - -#undef FT_COMPONENT -#define FT_COMPONENT trace_pfr - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PFR BIT WRITER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct PFR_BitWriter_ - { - FT_Byte* line; /* current line start */ - FT_Int pitch; /* line size in bytes */ - FT_UInt width; /* width in pixels/bits */ - FT_UInt rows; /* number of remaining rows to scan */ - FT_UInt total; /* total number of bits to draw */ - - } PFR_BitWriterRec, *PFR_BitWriter; - - - static void - pfr_bitwriter_init( PFR_BitWriter writer, - FT_Bitmap* target, - FT_Bool decreasing ) - { - writer->line = target->buffer; - writer->pitch = target->pitch; - writer->width = target->width; - writer->rows = target->rows; - writer->total = writer->width * writer->rows; - - if ( !decreasing ) - { - writer->line += writer->pitch * (FT_Int)( target->rows - 1 ); - writer->pitch = -writer->pitch; - } - } - - - static void - pfr_bitwriter_decode_bytes( PFR_BitWriter writer, - FT_Byte* p, - FT_Byte* limit ) - { - FT_UInt n, reload; - FT_UInt left = writer->width; - FT_Byte* cur = writer->line; - FT_UInt mask = 0x80; - FT_UInt val = 0; - FT_UInt c = 0; - - - n = (FT_UInt)( limit - p ) * 8; - if ( n > writer->total ) - n = writer->total; - - reload = n & 7; - - for ( ; n > 0; n-- ) - { - if ( ( n & 7 ) == reload ) - val = *p++; - - if ( val & 0x80 ) - c |= mask; - - val <<= 1; - mask >>= 1; - - if ( --left <= 0 ) - { - cur[0] = (FT_Byte)c; - left = writer->width; - mask = 0x80; - - writer->line += writer->pitch; - cur = writer->line; - c = 0; - } - else if ( mask == 0 ) - { - cur[0] = (FT_Byte)c; - mask = 0x80; - c = 0; - cur++; - } - } - - if ( mask != 0x80 ) - cur[0] = (FT_Byte)c; - } - - - static void - pfr_bitwriter_decode_rle1( PFR_BitWriter writer, - FT_Byte* p, - FT_Byte* limit ) - { - FT_Int phase, count, counts[2]; - FT_UInt n, reload; - FT_UInt left = writer->width; - FT_Byte* cur = writer->line; - FT_UInt mask = 0x80; - FT_UInt c = 0; - - - n = writer->total; - - phase = 1; - counts[0] = 0; - counts[1] = 0; - count = 0; - reload = 1; - - for ( ; n > 0; n-- ) - { - if ( reload ) - { - do - { - if ( phase ) - { - FT_Int v; - - - if ( p >= limit ) - break; - - v = *p++; - counts[0] = v >> 4; - counts[1] = v & 15; - phase = 0; - count = counts[0]; - } - else - { - phase = 1; - count = counts[1]; - } - - } while ( count == 0 ); - } - - if ( phase ) - c |= mask; - - mask >>= 1; - - if ( --left <= 0 ) - { - cur[0] = (FT_Byte)c; - left = writer->width; - mask = 0x80; - - writer->line += writer->pitch; - cur = writer->line; - c = 0; - } - else if ( mask == 0 ) - { - cur[0] = (FT_Byte)c; - mask = 0x80; - c = 0; - cur++; - } - - reload = ( --count <= 0 ); - } - - if ( mask != 0x80 ) - cur[0] = (FT_Byte) c; - } - - - static void - pfr_bitwriter_decode_rle2( PFR_BitWriter writer, - FT_Byte* p, - FT_Byte* limit ) - { - FT_Int phase, count; - FT_UInt n, reload; - FT_UInt left = writer->width; - FT_Byte* cur = writer->line; - FT_UInt mask = 0x80; - FT_UInt c = 0; - - - n = writer->total; - - phase = 1; - count = 0; - reload = 1; - - for ( ; n > 0; n-- ) - { - if ( reload ) - { - do - { - if ( p >= limit ) - break; - - count = *p++; - phase = phase ^ 1; - - } while ( count == 0 ); - } - - if ( phase ) - c |= mask; - - mask >>= 1; - - if ( --left <= 0 ) - { - cur[0] = (FT_Byte)c; - c = 0; - mask = 0x80; - left = writer->width; - - writer->line += writer->pitch; - cur = writer->line; - } - else if ( mask == 0 ) - { - cur[0] = (FT_Byte)c; - c = 0; - mask = 0x80; - cur++; - } - - reload = ( --count <= 0 ); - } - - if ( mask != 0x80 ) - cur[0] = (FT_Byte) c; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** BITMAP DATA DECODING *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - pfr_lookup_bitmap_data( FT_Byte* base, - FT_Byte* limit, - FT_UInt count, - FT_UInt flags, - FT_UInt char_code, - FT_ULong* found_offset, - FT_ULong* found_size ) - { - FT_UInt left, right, char_len; - FT_Bool two = FT_BOOL( flags & 1 ); - FT_Byte* buff; - - - char_len = 4; - if ( two ) char_len += 1; - if ( flags & 2 ) char_len += 1; - if ( flags & 4 ) char_len += 1; - - left = 0; - right = count; - - while ( left < right ) - { - FT_UInt middle, code; - - - middle = ( left + right ) >> 1; - buff = base + middle * char_len; - - /* check that we are not outside of the table -- */ - /* this is possible with broken fonts... */ - if ( buff + char_len > limit ) - goto Fail; - - if ( two ) - code = PFR_NEXT_USHORT( buff ); - else - code = PFR_NEXT_BYTE( buff ); - - if ( code == char_code ) - goto Found_It; - - if ( code < char_code ) - left = middle; - else - right = middle; - } - - Fail: - /* Not found */ - *found_size = 0; - *found_offset = 0; - return; - - Found_It: - if ( flags & 2 ) - *found_size = PFR_NEXT_USHORT( buff ); - else - *found_size = PFR_NEXT_BYTE( buff ); - - if ( flags & 4 ) - *found_offset = PFR_NEXT_ULONG( buff ); - else - *found_offset = PFR_NEXT_USHORT( buff ); - } - - - /* load bitmap metrics. "*padvance" must be set to the default value */ - /* before calling this function... */ - /* */ - static FT_Error - pfr_load_bitmap_metrics( FT_Byte** pdata, - FT_Byte* limit, - FT_Long scaled_advance, - FT_Long *axpos, - FT_Long *aypos, - FT_UInt *axsize, - FT_UInt *aysize, - FT_Long *aadvance, - FT_UInt *aformat ) - { - FT_Error error = FT_Err_Ok; - FT_Byte flags; - FT_Char c; - FT_Byte b; - FT_Byte* p = *pdata; - FT_Long xpos, ypos, advance; - FT_UInt xsize, ysize; - - - PFR_CHECK( 1 ); - flags = PFR_NEXT_BYTE( p ); - - xpos = 0; - ypos = 0; - xsize = 0; - ysize = 0; - advance = 0; - - switch ( flags & 3 ) - { - case 0: - PFR_CHECK( 1 ); - c = PFR_NEXT_INT8( p ); - xpos = c >> 4; - ypos = ( (FT_Char)( c << 4 ) ) >> 4; - break; - - case 1: - PFR_CHECK( 2 ); - xpos = PFR_NEXT_INT8( p ); - ypos = PFR_NEXT_INT8( p ); - break; - - case 2: - PFR_CHECK( 4 ); - xpos = PFR_NEXT_SHORT( p ); - ypos = PFR_NEXT_SHORT( p ); - break; - - case 3: - PFR_CHECK( 6 ); - xpos = PFR_NEXT_LONG( p ); - ypos = PFR_NEXT_LONG( p ); - break; - - default: - ; - } - - flags >>= 2; - switch ( flags & 3 ) - { - case 0: - /* blank image */ - xsize = 0; - ysize = 0; - break; - - case 1: - PFR_CHECK( 1 ); - b = PFR_NEXT_BYTE( p ); - xsize = ( b >> 4 ) & 0xF; - ysize = b & 0xF; - break; - - case 2: - PFR_CHECK( 2 ); - xsize = PFR_NEXT_BYTE( p ); - ysize = PFR_NEXT_BYTE( p ); - break; - - case 3: - PFR_CHECK( 4 ); - xsize = PFR_NEXT_USHORT( p ); - ysize = PFR_NEXT_USHORT( p ); - break; - - default: - ; - } - - flags >>= 2; - switch ( flags & 3 ) - { - case 0: - advance = scaled_advance; - break; - - case 1: - PFR_CHECK( 1 ); - advance = PFR_NEXT_INT8( p ) << 8; - break; - - case 2: - PFR_CHECK( 2 ); - advance = PFR_NEXT_SHORT( p ); - break; - - case 3: - PFR_CHECK( 3 ); - advance = PFR_NEXT_LONG( p ); - break; - - default: - ; - } - - *axpos = xpos; - *aypos = ypos; - *axsize = xsize; - *aysize = ysize; - *aadvance = advance; - *aformat = flags >> 2; - *pdata = p; - - Exit: - return error; - - Too_Short: - error = FT_THROW( Invalid_Table ); - FT_ERROR(( "pfr_load_bitmap_metrics: invalid glyph data\n" )); - goto Exit; - } - - - static FT_Error - pfr_load_bitmap_bits( FT_Byte* p, - FT_Byte* limit, - FT_UInt format, - FT_Bool decreasing, - FT_Bitmap* target ) - { - FT_Error error = FT_Err_Ok; - PFR_BitWriterRec writer; - - - if ( target->rows > 0 && target->width > 0 ) - { - pfr_bitwriter_init( &writer, target, decreasing ); - - switch ( format ) - { - case 0: /* packed bits */ - pfr_bitwriter_decode_bytes( &writer, p, limit ); - break; - - case 1: /* RLE1 */ - pfr_bitwriter_decode_rle1( &writer, p, limit ); - break; - - case 2: /* RLE2 */ - pfr_bitwriter_decode_rle2( &writer, p, limit ); - break; - - default: - FT_ERROR(( "pfr_read_bitmap_data: invalid image type\n" )); - error = FT_THROW( Invalid_File_Format ); - } - } - - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** BITMAP LOADING *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( FT_Error ) - pfr_slot_load_bitmap( PFR_Slot glyph, - PFR_Size size, - FT_UInt glyph_index ) - { - FT_Error error; - PFR_Face face = (PFR_Face) glyph->root.face; - FT_Stream stream = face->root.stream; - PFR_PhyFont phys = &face->phy_font; - FT_ULong gps_offset; - FT_ULong gps_size; - PFR_Char character; - PFR_Strike strike; - - - character = &phys->chars[glyph_index]; - - /* Look-up a bitmap strike corresponding to the current */ - /* character dimensions */ - { - FT_UInt n; - - - strike = phys->strikes; - for ( n = 0; n < phys->num_strikes; n++ ) - { - if ( strike->x_ppm == (FT_UInt)size->root.metrics.x_ppem && - strike->y_ppm == (FT_UInt)size->root.metrics.y_ppem ) - { - goto Found_Strike; - } - - strike++; - } - - /* couldn't find it */ - return FT_THROW( Invalid_Argument ); - } - - Found_Strike: - - /* Now lookup the glyph's position within the file */ - { - FT_UInt char_len; - - - char_len = 4; - if ( strike->flags & 1 ) char_len += 1; - if ( strike->flags & 2 ) char_len += 1; - if ( strike->flags & 4 ) char_len += 1; - - /* Access data directly in the frame to speed lookups */ - if ( FT_STREAM_SEEK( phys->bct_offset + strike->bct_offset ) || - FT_FRAME_ENTER( char_len * strike->num_bitmaps ) ) - goto Exit; - - pfr_lookup_bitmap_data( stream->cursor, - stream->limit, - strike->num_bitmaps, - strike->flags, - character->char_code, - &gps_offset, - &gps_size ); - - FT_FRAME_EXIT(); - - if ( gps_size == 0 ) - { - /* Could not find a bitmap program string for this glyph */ - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - } - - /* get the bitmap metrics */ - { - FT_Long xpos = 0, ypos = 0, advance = 0; - FT_UInt xsize = 0, ysize = 0, format = 0; - FT_Byte* p; - - - /* compute linear advance */ - advance = character->advance; - if ( phys->metrics_resolution != phys->outline_resolution ) - advance = FT_MulDiv( advance, - (FT_Long)phys->outline_resolution, - (FT_Long)phys->metrics_resolution ); - - glyph->root.linearHoriAdvance = advance; - - /* compute default advance, i.e., scaled advance. This can be */ - /* overridden in the bitmap header of certain glyphs. */ - advance = FT_MulDiv( (FT_Fixed)size->root.metrics.x_ppem << 8, - character->advance, - (FT_Long)phys->metrics_resolution ); - - if ( FT_STREAM_SEEK( face->header.gps_section_offset + gps_offset ) || - FT_FRAME_ENTER( gps_size ) ) - goto Exit; - - p = stream->cursor; - error = pfr_load_bitmap_metrics( &p, stream->limit, - advance, - &xpos, &ypos, - &xsize, &ysize, - &advance, &format ); - - /* - * XXX: on 16bit systems we return an error for huge bitmaps - * that cause size truncation, because truncated - * size properties make bitmap glyphs broken. - */ - if ( xpos > FT_INT_MAX || - xpos < FT_INT_MIN || - ysize > FT_INT_MAX || - ypos > FT_INT_MAX - (FT_Long)ysize || - ypos + (FT_Long)ysize < FT_INT_MIN ) - { - FT_TRACE1(( "pfr_slot_load_bitmap:" )); - FT_TRACE1(( "huge bitmap glyph %dx%d over FT_GlyphSlot\n", - xpos, ypos )); - error = FT_THROW( Invalid_Pixel_Size ); - } - - if ( !error ) - { - glyph->root.format = FT_GLYPH_FORMAT_BITMAP; - - /* Set up glyph bitmap and metrics */ - - /* XXX: needs casts to fit FT_Bitmap.{width|rows|pitch} */ - glyph->root.bitmap.width = xsize; - glyph->root.bitmap.rows = ysize; - glyph->root.bitmap.pitch = (FT_Int)( xsize + 7 ) >> 3; - glyph->root.bitmap.pixel_mode = FT_PIXEL_MODE_MONO; - - /* XXX: needs casts to fit FT_Glyph_Metrics.{width|height} */ - glyph->root.metrics.width = (FT_Pos)xsize << 6; - glyph->root.metrics.height = (FT_Pos)ysize << 6; - glyph->root.metrics.horiBearingX = xpos << 6; - glyph->root.metrics.horiBearingY = ypos << 6; - glyph->root.metrics.horiAdvance = FT_PIX_ROUND( ( advance >> 2 ) ); - glyph->root.metrics.vertBearingX = - glyph->root.metrics.width >> 1; - glyph->root.metrics.vertBearingY = 0; - glyph->root.metrics.vertAdvance = size->root.metrics.height; - - /* XXX: needs casts fit FT_GlyphSlotRec.bitmap_{left|top} */ - glyph->root.bitmap_left = (FT_Int)xpos; - glyph->root.bitmap_top = (FT_Int)( ypos + (FT_Long)ysize ); - - /* Allocate and read bitmap data */ - { - FT_ULong len = (FT_ULong)glyph->root.bitmap.pitch * ysize; - - - error = ft_glyphslot_alloc_bitmap( &glyph->root, len ); - if ( !error ) - { - error = pfr_load_bitmap_bits( - p, - stream->limit, - format, - FT_BOOL(face->header.color_flags & 2), - &glyph->root.bitmap ); - } - } - } - - FT_FRAME_EXIT(); - } - - Exit: - return error; - } - -/* END */ diff --git a/3party/freetype/src/pfr/pfrsbit.h b/3party/freetype/src/pfr/pfrsbit.h deleted file mode 100644 index 0db2cd5ebd..0000000000 --- a/3party/freetype/src/pfr/pfrsbit.h +++ /dev/null @@ -1,36 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrsbit.h */ -/* */ -/* FreeType PFR bitmap loader (specification). */ -/* */ -/* Copyright 2002-2015 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 __PFRSBIT_H__ -#define __PFRSBIT_H__ - -#include "pfrobjs.h" - -FT_BEGIN_HEADER - - FT_LOCAL( FT_Error ) - pfr_slot_load_bitmap( PFR_Slot glyph, - PFR_Size size, - FT_UInt glyph_index ); - -FT_END_HEADER - -#endif /* __PFR_SBIT_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pfr/pfrtypes.h b/3party/freetype/src/pfr/pfrtypes.h deleted file mode 100644 index 5ffb1b14ee..0000000000 --- a/3party/freetype/src/pfr/pfrtypes.h +++ /dev/null @@ -1,362 +0,0 @@ -/***************************************************************************/ -/* */ -/* pfrtypes.h */ -/* */ -/* FreeType PFR data structures (specification only). */ -/* */ -/* Copyright 2002-2015 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 __PFRTYPES_H__ -#define __PFRTYPES_H__ - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H - -FT_BEGIN_HEADER - - /************************************************************************/ - - /* the PFR Header structure */ - typedef struct PFR_HeaderRec_ - { - FT_UInt32 signature; - FT_UInt version; - FT_UInt signature2; - FT_UInt header_size; - - FT_UInt log_dir_size; - FT_UInt log_dir_offset; - - FT_UInt log_font_max_size; - FT_UInt32 log_font_section_size; - FT_UInt32 log_font_section_offset; - - FT_UInt32 phy_font_max_size; - FT_UInt32 phy_font_section_size; - FT_UInt32 phy_font_section_offset; - - FT_UInt gps_max_size; - FT_UInt32 gps_section_size; - FT_UInt32 gps_section_offset; - - FT_UInt max_blue_values; - FT_UInt max_x_orus; - FT_UInt max_y_orus; - - FT_UInt phy_font_max_size_high; - FT_UInt color_flags; - - FT_UInt32 bct_max_size; - FT_UInt32 bct_set_max_size; - FT_UInt32 phy_bct_set_max_size; - - FT_UInt num_phy_fonts; - FT_UInt max_vert_stem_snap; - FT_UInt max_horz_stem_snap; - FT_UInt max_chars; - - } PFR_HeaderRec, *PFR_Header; - - - /* used in `color_flags' field of the PFR_Header */ - typedef enum PFR_HeaderFlags_ - { - PFR_FLAG_BLACK_PIXEL = 1, - PFR_FLAG_INVERT_BITMAP = 2 - - } PFR_HeaderFlags; - - - /************************************************************************/ - - typedef struct PFR_LogFontRec_ - { - FT_UInt32 size; - FT_UInt32 offset; - - FT_Int32 matrix[4]; - FT_UInt stroke_flags; - FT_Int stroke_thickness; - FT_Int bold_thickness; - FT_Int32 miter_limit; - - FT_UInt32 phys_size; - FT_UInt32 phys_offset; - - } PFR_LogFontRec, *PFR_LogFont; - - - typedef enum PFR_LogFlags_ - { - PFR_LOG_EXTRA_ITEMS = 0x40, - PFR_LOG_2BYTE_BOLD = 0x20, - PFR_LOG_BOLD = 0x10, - PFR_LOG_2BYTE_STROKE = 8, - PFR_LOG_STROKE = 4, - PFR_LINE_JOIN_MASK = 3 - - } PFR_LogFlags; - - - typedef enum PFR_LineJoinFlags_ - { - PFR_LINE_JOIN_MITER = 0, - PFR_LINE_JOIN_ROUND = 1, - PFR_LINE_JOIN_BEVEL = 2 - - } PFR_LineJoinFlags; - - - /************************************************************************/ - - typedef enum PFR_BitmapFlags_ - { - PFR_BITMAP_3BYTE_OFFSET = 4, - PFR_BITMAP_2BYTE_SIZE = 2, - PFR_BITMAP_2BYTE_CHARCODE = 1 - - } PFR_BitmapFlags; - - - typedef struct PFR_BitmapCharRec_ - { - FT_UInt char_code; - FT_UInt gps_size; - FT_UInt32 gps_offset; - - } PFR_BitmapCharRec, *PFR_BitmapChar; - - - typedef enum PFR_StrikeFlags_ - { - PFR_STRIKE_2BYTE_COUNT = 0x10, - PFR_STRIKE_3BYTE_OFFSET = 0x08, - PFR_STRIKE_3BYTE_SIZE = 0x04, - PFR_STRIKE_2BYTE_YPPM = 0x02, - PFR_STRIKE_2BYTE_XPPM = 0x01 - - } PFR_StrikeFlags; - - - typedef struct PFR_StrikeRec_ - { - FT_UInt x_ppm; - FT_UInt y_ppm; - FT_UInt flags; - - FT_UInt32 gps_size; - FT_UInt32 gps_offset; - - FT_UInt32 bct_size; - FT_UInt32 bct_offset; - - /* optional */ - FT_UInt num_bitmaps; - PFR_BitmapChar bitmaps; - - } PFR_StrikeRec, *PFR_Strike; - - - /************************************************************************/ - - typedef struct PFR_CharRec_ - { - FT_UInt char_code; - FT_Int advance; - FT_UInt gps_size; - FT_UInt32 gps_offset; - - } PFR_CharRec, *PFR_Char; - - - /************************************************************************/ - - typedef struct PFR_DimensionRec_ - { - FT_UInt standard; - FT_UInt num_stem_snaps; - FT_Int* stem_snaps; - - } PFR_DimensionRec, *PFR_Dimension; - - /************************************************************************/ - - typedef struct PFR_KernItemRec_* PFR_KernItem; - - typedef struct PFR_KernItemRec_ - { - PFR_KernItem next; - FT_Byte pair_count; - FT_Byte flags; - FT_Short base_adj; - FT_UInt pair_size; - FT_Offset offset; - FT_UInt32 pair1; - FT_UInt32 pair2; - - } PFR_KernItemRec; - - -#define PFR_KERN_INDEX( g1, g2 ) \ - ( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) ) - -#define PFR_KERN_PAIR_INDEX( pair ) \ - PFR_KERN_INDEX( (pair)->glyph1, (pair)->glyph2 ) - -#define PFR_NEXT_KPAIR( p ) ( p += 2, \ - ( (FT_UInt32)p[-2] << 16 ) | p[-1] ) - - - /************************************************************************/ - - typedef struct PFR_PhyFontRec_ - { - FT_Memory memory; - FT_UInt32 offset; - - FT_UInt font_ref_number; - FT_UInt outline_resolution; - FT_UInt metrics_resolution; - FT_BBox bbox; - FT_UInt flags; - FT_Int standard_advance; - - FT_Int ascent; /* optional, bbox.yMax if not present */ - FT_Int descent; /* optional, bbox.yMin if not present */ - FT_Int leading; /* optional, 0 if not present */ - - PFR_DimensionRec horizontal; - PFR_DimensionRec vertical; - - FT_String* font_id; - FT_String* family_name; - FT_String* style_name; - - FT_UInt num_strikes; - FT_UInt max_strikes; - PFR_StrikeRec* strikes; - - FT_UInt num_blue_values; - FT_Int *blue_values; - FT_UInt blue_fuzz; - FT_UInt blue_scale; - - FT_UInt num_chars; - FT_Offset chars_offset; - PFR_Char chars; - - FT_UInt num_kern_pairs; - PFR_KernItem kern_items; - PFR_KernItem* kern_items_tail; - - /* not part of the spec, but used during load */ - FT_ULong bct_offset; - FT_Byte* cursor; - - } PFR_PhyFontRec, *PFR_PhyFont; - - - typedef enum PFR_PhyFlags_ - { - PFR_PHY_EXTRA_ITEMS = 0x80, - PFR_PHY_3BYTE_GPS_OFFSET = 0x20, - PFR_PHY_2BYTE_GPS_SIZE = 0x10, - PFR_PHY_ASCII_CODE = 0x08, - PFR_PHY_PROPORTIONAL = 0x04, - PFR_PHY_2BYTE_CHARCODE = 0x02, - PFR_PHY_VERTICAL = 0x01 - - } PFR_PhyFlags; - - - typedef enum PFR_KernFlags_ - { - PFR_KERN_2BYTE_CHAR = 0x01, - PFR_KERN_2BYTE_ADJ = 0x02 - - } PFR_KernFlags; - - - /************************************************************************/ - - typedef enum PFR_GlyphFlags_ - { - PFR_GLYPH_IS_COMPOUND = 0x80, - PFR_GLYPH_EXTRA_ITEMS = 0x08, - PFR_GLYPH_1BYTE_XYCOUNT = 0x04, - PFR_GLYPH_XCOUNT = 0x02, - PFR_GLYPH_YCOUNT = 0x01 - - } PFR_GlyphFlags; - - - /* controlled coordinate */ - typedef struct PFR_CoordRec_ - { - FT_UInt org; - FT_UInt cur; - - } PFR_CoordRec, *PFR_Coord; - - - typedef struct PFR_SubGlyphRec_ - { - FT_Fixed x_scale; - FT_Fixed y_scale; - FT_Int x_delta; - FT_Int y_delta; - FT_UInt32 gps_offset; - FT_UInt gps_size; - - } PFR_SubGlyphRec, *PFR_SubGlyph; - - - typedef enum PFR_SubgGlyphFlags_ - { - PFR_SUBGLYPH_3BYTE_OFFSET = 0x80, - PFR_SUBGLYPH_2BYTE_SIZE = 0x40, - PFR_SUBGLYPH_YSCALE = 0x20, - PFR_SUBGLYPH_XSCALE = 0x10 - - } PFR_SubGlyphFlags; - - - typedef struct PFR_GlyphRec_ - { - FT_Byte format; - -#if 0 - FT_UInt num_x_control; - FT_UInt num_y_control; -#endif - FT_UInt max_xy_control; - FT_Pos* x_control; - FT_Pos* y_control; - - - FT_UInt num_subs; - FT_UInt max_subs; - PFR_SubGlyphRec* subs; - - FT_GlyphLoader loader; - FT_Bool path_begun; - - } PFR_GlyphRec, *PFR_Glyph; - - -FT_END_HEADER - -#endif /* __PFRTYPES_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pfr/rules.mk b/3party/freetype/src/pfr/rules.mk deleted file mode 100644 index e665460103..0000000000 --- a/3party/freetype/src/pfr/rules.mk +++ /dev/null @@ -1,76 +0,0 @@ -# -# FreeType 2 PFR driver configuration rules -# - - -# Copyright 2002-2015 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. - - -# pfr driver directory -# -PFR_DIR := $(SRC_DIR)/pfr - - -# compilation flags for the driver -# -PFR_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(PFR_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# pfr driver sources (i.e., C files) -# -PFR_DRV_SRC := $(PFR_DIR)/pfrload.c \ - $(PFR_DIR)/pfrgload.c \ - $(PFR_DIR)/pfrcmap.c \ - $(PFR_DIR)/pfrdrivr.c \ - $(PFR_DIR)/pfrsbit.c \ - $(PFR_DIR)/pfrobjs.c - -# pfr driver headers -# -PFR_DRV_H := $(PFR_DRV_SRC:%.c=%.h) \ - $(PFR_DIR)/pfrerror.h \ - $(PFR_DIR)/pfrtypes.h - - -# Pfr driver object(s) -# -# PFR_DRV_OBJ_M is used during `multi' builds -# PFR_DRV_OBJ_S is used during `single' builds -# -PFR_DRV_OBJ_M := $(PFR_DRV_SRC:$(PFR_DIR)/%.c=$(OBJ_DIR)/%.$O) -PFR_DRV_OBJ_S := $(OBJ_DIR)/pfr.$O - -# pfr driver source file for single build -# -PFR_DRV_SRC_S := $(PFR_DIR)/pfr.c - - -# pfr driver - single object -# -$(PFR_DRV_OBJ_S): $(PFR_DRV_SRC_S) $(PFR_DRV_SRC) $(FREETYPE_H) $(PFR_DRV_H) - $(PFR_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PFR_DRV_SRC_S)) - - -# pfr driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(PFR_DIR)/%.c $(FREETYPE_H) $(PFR_DRV_H) - $(PFR_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(PFR_DRV_OBJ_S) -DRV_OBJS_M += $(PFR_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/psaux/Jamfile b/3party/freetype/src/psaux/Jamfile deleted file mode 100644 index 6793f0d581..0000000000 --- a/3party/freetype/src/psaux/Jamfile +++ /dev/null @@ -1,35 +0,0 @@ -# FreeType 2 src/psaux Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) psaux ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = afmparse - psauxmod - psconv - psobjs - t1cmap - t1decode - ; - } - else - { - _sources = psaux ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/psaux Jamfile diff --git a/3party/freetype/src/psaux/afmparse.c b/3party/freetype/src/psaux/afmparse.c deleted file mode 100644 index 3ad44ec724..0000000000 --- a/3party/freetype/src/psaux/afmparse.c +++ /dev/null @@ -1,977 +0,0 @@ -/***************************************************************************/ -/* */ -/* afmparse.c */ -/* */ -/* AFM parser (body). */ -/* */ -/* Copyright 2006-2015 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H - -#include "afmparse.h" -#include "psconv.h" - -#include "psauxerr.h" - - -/***************************************************************************/ -/* */ -/* AFM_Stream */ -/* */ -/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib. */ -/* */ -/* */ - - enum - { - AFM_STREAM_STATUS_NORMAL, - AFM_STREAM_STATUS_EOC, - AFM_STREAM_STATUS_EOL, - AFM_STREAM_STATUS_EOF - }; - - - typedef struct AFM_StreamRec_ - { - FT_Byte* cursor; - FT_Byte* base; - FT_Byte* limit; - - FT_Int status; - - } AFM_StreamRec; - - -#ifndef EOF -#define EOF -1 -#endif - - - /* this works because empty lines are ignored */ -#define AFM_IS_NEWLINE( ch ) ( (ch) == '\r' || (ch) == '\n' ) - -#define AFM_IS_EOF( ch ) ( (ch) == EOF || (ch) == '\x1a' ) -#define AFM_IS_SPACE( ch ) ( (ch) == ' ' || (ch) == '\t' ) - - /* column separator; there is no `column' in the spec actually */ -#define AFM_IS_SEP( ch ) ( (ch) == ';' ) - -#define AFM_GETC() \ - ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \ - : EOF ) - -#define AFM_STREAM_KEY_BEGIN( stream ) \ - (char*)( (stream)->cursor - 1 ) - -#define AFM_STREAM_KEY_LEN( stream, key ) \ - (FT_Offset)( (char*)(stream)->cursor - key - 1 ) - -#define AFM_STATUS_EOC( stream ) \ - ( (stream)->status >= AFM_STREAM_STATUS_EOC ) - -#define AFM_STATUS_EOL( stream ) \ - ( (stream)->status >= AFM_STREAM_STATUS_EOL ) - -#define AFM_STATUS_EOF( stream ) \ - ( (stream)->status >= AFM_STREAM_STATUS_EOF ) - - - static int - afm_stream_skip_spaces( AFM_Stream stream ) - { - int ch = 0; /* make stupid compiler happy */ - - - if ( AFM_STATUS_EOC( stream ) ) - return ';'; - - while ( 1 ) - { - ch = AFM_GETC(); - if ( !AFM_IS_SPACE( ch ) ) - break; - } - - if ( AFM_IS_NEWLINE( ch ) ) - stream->status = AFM_STREAM_STATUS_EOL; - else if ( AFM_IS_SEP( ch ) ) - stream->status = AFM_STREAM_STATUS_EOC; - else if ( AFM_IS_EOF( ch ) ) - stream->status = AFM_STREAM_STATUS_EOF; - - return ch; - } - - - /* read a key or value in current column */ - static char* - afm_stream_read_one( AFM_Stream stream ) - { - char* str; - - - afm_stream_skip_spaces( stream ); - if ( AFM_STATUS_EOC( stream ) ) - return NULL; - - str = AFM_STREAM_KEY_BEGIN( stream ); - - while ( 1 ) - { - int ch = AFM_GETC(); - - - if ( AFM_IS_SPACE( ch ) ) - break; - else if ( AFM_IS_NEWLINE( ch ) ) - { - stream->status = AFM_STREAM_STATUS_EOL; - break; - } - else if ( AFM_IS_SEP( ch ) ) - { - stream->status = AFM_STREAM_STATUS_EOC; - break; - } - else if ( AFM_IS_EOF( ch ) ) - { - stream->status = AFM_STREAM_STATUS_EOF; - break; - } - } - - return str; - } - - - /* read a string (i.e., read to EOL) */ - static char* - afm_stream_read_string( AFM_Stream stream ) - { - char* str; - - - afm_stream_skip_spaces( stream ); - if ( AFM_STATUS_EOL( stream ) ) - return NULL; - - str = AFM_STREAM_KEY_BEGIN( stream ); - - /* scan to eol */ - while ( 1 ) - { - int ch = AFM_GETC(); - - - if ( AFM_IS_NEWLINE( ch ) ) - { - stream->status = AFM_STREAM_STATUS_EOL; - break; - } - else if ( AFM_IS_EOF( ch ) ) - { - stream->status = AFM_STREAM_STATUS_EOF; - break; - } - } - - return str; - } - - - /*************************************************************************/ - /* */ - /* AFM_Parser */ - /* */ - /* */ - - /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */ - typedef enum AFM_Token_ - { - AFM_TOKEN_ASCENDER, - AFM_TOKEN_AXISLABEL, - AFM_TOKEN_AXISTYPE, - AFM_TOKEN_B, - AFM_TOKEN_BLENDAXISTYPES, - AFM_TOKEN_BLENDDESIGNMAP, - AFM_TOKEN_BLENDDESIGNPOSITIONS, - AFM_TOKEN_C, - AFM_TOKEN_CC, - AFM_TOKEN_CH, - AFM_TOKEN_CAPHEIGHT, - AFM_TOKEN_CHARWIDTH, - AFM_TOKEN_CHARACTERSET, - AFM_TOKEN_CHARACTERS, - AFM_TOKEN_DESCENDER, - AFM_TOKEN_ENCODINGSCHEME, - AFM_TOKEN_ENDAXIS, - AFM_TOKEN_ENDCHARMETRICS, - AFM_TOKEN_ENDCOMPOSITES, - AFM_TOKEN_ENDDIRECTION, - AFM_TOKEN_ENDFONTMETRICS, - AFM_TOKEN_ENDKERNDATA, - AFM_TOKEN_ENDKERNPAIRS, - AFM_TOKEN_ENDTRACKKERN, - AFM_TOKEN_ESCCHAR, - AFM_TOKEN_FAMILYNAME, - AFM_TOKEN_FONTBBOX, - AFM_TOKEN_FONTNAME, - AFM_TOKEN_FULLNAME, - AFM_TOKEN_ISBASEFONT, - AFM_TOKEN_ISCIDFONT, - AFM_TOKEN_ISFIXEDPITCH, - AFM_TOKEN_ISFIXEDV, - AFM_TOKEN_ITALICANGLE, - AFM_TOKEN_KP, - AFM_TOKEN_KPH, - AFM_TOKEN_KPX, - AFM_TOKEN_KPY, - AFM_TOKEN_L, - AFM_TOKEN_MAPPINGSCHEME, - AFM_TOKEN_METRICSSETS, - AFM_TOKEN_N, - AFM_TOKEN_NOTICE, - AFM_TOKEN_PCC, - AFM_TOKEN_STARTAXIS, - AFM_TOKEN_STARTCHARMETRICS, - AFM_TOKEN_STARTCOMPOSITES, - AFM_TOKEN_STARTDIRECTION, - AFM_TOKEN_STARTFONTMETRICS, - AFM_TOKEN_STARTKERNDATA, - AFM_TOKEN_STARTKERNPAIRS, - AFM_TOKEN_STARTKERNPAIRS0, - AFM_TOKEN_STARTKERNPAIRS1, - AFM_TOKEN_STARTTRACKKERN, - AFM_TOKEN_STDHW, - AFM_TOKEN_STDVW, - AFM_TOKEN_TRACKKERN, - AFM_TOKEN_UNDERLINEPOSITION, - AFM_TOKEN_UNDERLINETHICKNESS, - AFM_TOKEN_VV, - AFM_TOKEN_VVECTOR, - AFM_TOKEN_VERSION, - AFM_TOKEN_W, - AFM_TOKEN_W0, - AFM_TOKEN_W0X, - AFM_TOKEN_W0Y, - AFM_TOKEN_W1, - AFM_TOKEN_W1X, - AFM_TOKEN_W1Y, - AFM_TOKEN_WX, - AFM_TOKEN_WY, - AFM_TOKEN_WEIGHT, - AFM_TOKEN_WEIGHTVECTOR, - AFM_TOKEN_XHEIGHT, - N_AFM_TOKENS, - AFM_TOKEN_UNKNOWN - - } AFM_Token; - - - static const char* const afm_key_table[N_AFM_TOKENS] = - { - "Ascender", - "AxisLabel", - "AxisType", - "B", - "BlendAxisTypes", - "BlendDesignMap", - "BlendDesignPositions", - "C", - "CC", - "CH", - "CapHeight", - "CharWidth", - "CharacterSet", - "Characters", - "Descender", - "EncodingScheme", - "EndAxis", - "EndCharMetrics", - "EndComposites", - "EndDirection", - "EndFontMetrics", - "EndKernData", - "EndKernPairs", - "EndTrackKern", - "EscChar", - "FamilyName", - "FontBBox", - "FontName", - "FullName", - "IsBaseFont", - "IsCIDFont", - "IsFixedPitch", - "IsFixedV", - "ItalicAngle", - "KP", - "KPH", - "KPX", - "KPY", - "L", - "MappingScheme", - "MetricsSets", - "N", - "Notice", - "PCC", - "StartAxis", - "StartCharMetrics", - "StartComposites", - "StartDirection", - "StartFontMetrics", - "StartKernData", - "StartKernPairs", - "StartKernPairs0", - "StartKernPairs1", - "StartTrackKern", - "StdHW", - "StdVW", - "TrackKern", - "UnderlinePosition", - "UnderlineThickness", - "VV", - "VVector", - "Version", - "W", - "W0", - "W0X", - "W0Y", - "W1", - "W1X", - "W1Y", - "WX", - "WY", - "Weight", - "WeightVector", - "XHeight" - }; - - - /* - * `afm_parser_read_vals' and `afm_parser_next_key' provide - * high-level operations to an AFM_Stream. The rest of the - * parser functions should use them without accessing the - * AFM_Stream directly. - */ - - FT_LOCAL_DEF( FT_Int ) - afm_parser_read_vals( AFM_Parser parser, - AFM_Value vals, - FT_Int n ) - { - AFM_Stream stream = parser->stream; - char* str; - FT_Int i; - - - if ( n > AFM_MAX_ARGUMENTS ) - return 0; - - for ( i = 0; i < n; i++ ) - { - FT_Offset len; - AFM_Value val = vals + i; - - - if ( val->type == AFM_VALUE_TYPE_STRING ) - str = afm_stream_read_string( stream ); - else - str = afm_stream_read_one( stream ); - - if ( !str ) - break; - - len = AFM_STREAM_KEY_LEN( stream, str ); - - switch ( val->type ) - { - case AFM_VALUE_TYPE_STRING: - case AFM_VALUE_TYPE_NAME: - { - FT_Memory memory = parser->memory; - FT_Error error; - - - if ( !FT_QALLOC( val->u.s, len + 1 ) ) - { - ft_memcpy( val->u.s, str, len ); - val->u.s[len] = '\0'; - } - } - break; - - case AFM_VALUE_TYPE_FIXED: - val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str, - (FT_Byte*)str + len, 0 ); - break; - - case AFM_VALUE_TYPE_INTEGER: - val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str, - (FT_Byte*)str + len ); - break; - - case AFM_VALUE_TYPE_BOOL: - val->u.b = FT_BOOL( len == 4 && - !ft_strncmp( str, "true", 4 ) ); - break; - - case AFM_VALUE_TYPE_INDEX: - if ( parser->get_index ) - val->u.i = parser->get_index( str, len, parser->user_data ); - else - val->u.i = 0; - break; - } - } - - return i; - } - - - FT_LOCAL_DEF( char* ) - afm_parser_next_key( AFM_Parser parser, - FT_Bool line, - FT_Offset* len ) - { - AFM_Stream stream = parser->stream; - char* key = NULL; /* make stupid compiler happy */ - - - if ( line ) - { - while ( 1 ) - { - /* skip current line */ - if ( !AFM_STATUS_EOL( stream ) ) - afm_stream_read_string( stream ); - - stream->status = AFM_STREAM_STATUS_NORMAL; - key = afm_stream_read_one( stream ); - - /* skip empty line */ - if ( !key && - !AFM_STATUS_EOF( stream ) && - AFM_STATUS_EOL( stream ) ) - continue; - - break; - } - } - else - { - while ( 1 ) - { - /* skip current column */ - while ( !AFM_STATUS_EOC( stream ) ) - afm_stream_read_one( stream ); - - stream->status = AFM_STREAM_STATUS_NORMAL; - key = afm_stream_read_one( stream ); - - /* skip empty column */ - if ( !key && - !AFM_STATUS_EOF( stream ) && - AFM_STATUS_EOC( stream ) ) - continue; - - break; - } - } - - if ( len ) - *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key ) - : 0; - - return key; - } - - - static AFM_Token - afm_tokenize( const char* key, - FT_Offset len ) - { - int n; - - - for ( n = 0; n < N_AFM_TOKENS; n++ ) - { - if ( *( afm_key_table[n] ) == *key ) - { - for ( ; n < N_AFM_TOKENS; n++ ) - { - if ( *( afm_key_table[n] ) != *key ) - return AFM_TOKEN_UNKNOWN; - - if ( ft_strncmp( afm_key_table[n], key, len ) == 0 ) - return (AFM_Token) n; - } - } - } - - return AFM_TOKEN_UNKNOWN; - } - - - FT_LOCAL_DEF( FT_Error ) - afm_parser_init( AFM_Parser parser, - FT_Memory memory, - FT_Byte* base, - FT_Byte* limit ) - { - AFM_Stream stream = NULL; - FT_Error error; - - - if ( FT_NEW( stream ) ) - return error; - - stream->cursor = stream->base = base; - stream->limit = limit; - - /* don't skip the first line during the first call */ - stream->status = AFM_STREAM_STATUS_EOL; - - parser->memory = memory; - parser->stream = stream; - parser->FontInfo = NULL; - parser->get_index = NULL; - - return FT_Err_Ok; - } - - - FT_LOCAL( void ) - afm_parser_done( AFM_Parser parser ) - { - FT_Memory memory = parser->memory; - - - FT_FREE( parser->stream ); - } - - - static FT_Error - afm_parser_read_int( AFM_Parser parser, - FT_Int* aint ) - { - AFM_ValueRec val; - - - val.type = AFM_VALUE_TYPE_INTEGER; - - if ( afm_parser_read_vals( parser, &val, 1 ) == 1 ) - { - *aint = val.u.i; - - return FT_Err_Ok; - } - else - return FT_THROW( Syntax_Error ); - } - - - static FT_Error - afm_parse_track_kern( AFM_Parser parser ) - { - AFM_FontInfo fi = parser->FontInfo; - AFM_TrackKern tk; - char* key; - FT_Offset len; - int n = -1; - FT_Int tmp; - - - if ( afm_parser_read_int( parser, &tmp ) ) - goto Fail; - - if ( tmp < 0 ) - goto Fail; - - fi->NumTrackKern = (FT_UInt)tmp; - - if ( fi->NumTrackKern ) - { - FT_Memory memory = parser->memory; - FT_Error error; - - - if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) ) - return error; - } - - while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) - { - AFM_ValueRec shared_vals[5]; - - - switch ( afm_tokenize( key, len ) ) - { - case AFM_TOKEN_TRACKKERN: - n++; - - if ( n >= (int)fi->NumTrackKern ) - goto Fail; - - tk = fi->TrackKerns + n; - - shared_vals[0].type = AFM_VALUE_TYPE_INTEGER; - shared_vals[1].type = AFM_VALUE_TYPE_FIXED; - shared_vals[2].type = AFM_VALUE_TYPE_FIXED; - shared_vals[3].type = AFM_VALUE_TYPE_FIXED; - shared_vals[4].type = AFM_VALUE_TYPE_FIXED; - if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 ) - goto Fail; - - tk->degree = shared_vals[0].u.i; - tk->min_ptsize = shared_vals[1].u.f; - tk->min_kern = shared_vals[2].u.f; - tk->max_ptsize = shared_vals[3].u.f; - tk->max_kern = shared_vals[4].u.f; - - break; - - case AFM_TOKEN_ENDTRACKKERN: - case AFM_TOKEN_ENDKERNDATA: - case AFM_TOKEN_ENDFONTMETRICS: - fi->NumTrackKern = (FT_UInt)( n + 1 ); - return FT_Err_Ok; - - case AFM_TOKEN_UNKNOWN: - break; - - default: - goto Fail; - } - } - - Fail: - return FT_THROW( Syntax_Error ); - } - - -#undef KERN_INDEX -#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 ) - - - /* compare two kerning pairs */ - FT_CALLBACK_DEF( int ) - afm_compare_kern_pairs( const void* a, - const void* b ) - { - AFM_KernPair kp1 = (AFM_KernPair)a; - AFM_KernPair kp2 = (AFM_KernPair)b; - - FT_ULong index1 = KERN_INDEX( kp1->index1, kp1->index2 ); - FT_ULong index2 = KERN_INDEX( kp2->index1, kp2->index2 ); - - - if ( index1 > index2 ) - return 1; - else if ( index1 < index2 ) - return -1; - else - return 0; - } - - - static FT_Error - afm_parse_kern_pairs( AFM_Parser parser ) - { - AFM_FontInfo fi = parser->FontInfo; - AFM_KernPair kp; - char* key; - FT_Offset len; - int n = -1; - FT_Int tmp; - - - if ( afm_parser_read_int( parser, &tmp ) ) - goto Fail; - - if ( tmp < 0 ) - goto Fail; - - fi->NumKernPair = (FT_UInt)tmp; - - if ( fi->NumKernPair ) - { - FT_Memory memory = parser->memory; - FT_Error error; - - - if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) ) - return error; - } - - while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) - { - AFM_Token token = afm_tokenize( key, len ); - - - switch ( token ) - { - case AFM_TOKEN_KP: - case AFM_TOKEN_KPX: - case AFM_TOKEN_KPY: - { - FT_Int r; - AFM_ValueRec shared_vals[4]; - - - n++; - - if ( n >= (int)fi->NumKernPair ) - goto Fail; - - kp = fi->KernPairs + n; - - shared_vals[0].type = AFM_VALUE_TYPE_INDEX; - shared_vals[1].type = AFM_VALUE_TYPE_INDEX; - shared_vals[2].type = AFM_VALUE_TYPE_INTEGER; - shared_vals[3].type = AFM_VALUE_TYPE_INTEGER; - r = afm_parser_read_vals( parser, shared_vals, 4 ); - if ( r < 3 ) - goto Fail; - - /* index values can't be negative */ - kp->index1 = shared_vals[0].u.u; - kp->index2 = shared_vals[1].u.u; - if ( token == AFM_TOKEN_KPY ) - { - kp->x = 0; - kp->y = shared_vals[2].u.i; - } - else - { - kp->x = shared_vals[2].u.i; - kp->y = ( token == AFM_TOKEN_KP && r == 4 ) - ? shared_vals[3].u.i : 0; - } - } - break; - - case AFM_TOKEN_ENDKERNPAIRS: - case AFM_TOKEN_ENDKERNDATA: - case AFM_TOKEN_ENDFONTMETRICS: - fi->NumKernPair = (FT_UInt)( n + 1 ); - ft_qsort( fi->KernPairs, fi->NumKernPair, - sizeof ( AFM_KernPairRec ), - afm_compare_kern_pairs ); - return FT_Err_Ok; - - case AFM_TOKEN_UNKNOWN: - break; - - default: - goto Fail; - } - } - - Fail: - return FT_THROW( Syntax_Error ); - } - - - static FT_Error - afm_parse_kern_data( AFM_Parser parser ) - { - FT_Error error; - char* key; - FT_Offset len; - - - while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) - { - switch ( afm_tokenize( key, len ) ) - { - case AFM_TOKEN_STARTTRACKKERN: - error = afm_parse_track_kern( parser ); - if ( error ) - return error; - break; - - case AFM_TOKEN_STARTKERNPAIRS: - case AFM_TOKEN_STARTKERNPAIRS0: - error = afm_parse_kern_pairs( parser ); - if ( error ) - return error; - break; - - case AFM_TOKEN_ENDKERNDATA: - case AFM_TOKEN_ENDFONTMETRICS: - return FT_Err_Ok; - - case AFM_TOKEN_UNKNOWN: - break; - - default: - goto Fail; - } - } - - Fail: - return FT_THROW( Syntax_Error ); - } - - - static FT_Error - afm_parser_skip_section( AFM_Parser parser, - FT_Int n, - AFM_Token end_section ) - { - char* key; - FT_Offset len; - - - while ( n-- > 0 ) - { - key = afm_parser_next_key( parser, 1, NULL ); - if ( !key ) - goto Fail; - } - - while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) - { - AFM_Token token = afm_tokenize( key, len ); - - - if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS ) - return FT_Err_Ok; - } - - Fail: - return FT_THROW( Syntax_Error ); - } - - - FT_LOCAL_DEF( FT_Error ) - afm_parser_parse( AFM_Parser parser ) - { - FT_Memory memory = parser->memory; - AFM_FontInfo fi = parser->FontInfo; - FT_Error error = FT_ERR( Syntax_Error ); - char* key; - FT_Offset len; - FT_Int metrics_sets = 0; - - - if ( !fi ) - return FT_THROW( Invalid_Argument ); - - key = afm_parser_next_key( parser, 1, &len ); - if ( !key || len != 16 || - ft_strncmp( key, "StartFontMetrics", 16 ) != 0 ) - return FT_THROW( Unknown_File_Format ); - - while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) - { - AFM_ValueRec shared_vals[4]; - - - switch ( afm_tokenize( key, len ) ) - { - case AFM_TOKEN_METRICSSETS: - if ( afm_parser_read_int( parser, &metrics_sets ) ) - goto Fail; - - if ( metrics_sets != 0 && metrics_sets != 2 ) - { - error = FT_THROW( Unimplemented_Feature ); - - goto Fail; - } - break; - - case AFM_TOKEN_ISCIDFONT: - shared_vals[0].type = AFM_VALUE_TYPE_BOOL; - if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) - goto Fail; - - fi->IsCIDFont = shared_vals[0].u.b; - break; - - case AFM_TOKEN_FONTBBOX: - shared_vals[0].type = AFM_VALUE_TYPE_FIXED; - shared_vals[1].type = AFM_VALUE_TYPE_FIXED; - shared_vals[2].type = AFM_VALUE_TYPE_FIXED; - shared_vals[3].type = AFM_VALUE_TYPE_FIXED; - if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 ) - goto Fail; - - fi->FontBBox.xMin = shared_vals[0].u.f; - fi->FontBBox.yMin = shared_vals[1].u.f; - fi->FontBBox.xMax = shared_vals[2].u.f; - fi->FontBBox.yMax = shared_vals[3].u.f; - break; - - case AFM_TOKEN_ASCENDER: - shared_vals[0].type = AFM_VALUE_TYPE_FIXED; - if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) - goto Fail; - - fi->Ascender = shared_vals[0].u.f; - break; - - case AFM_TOKEN_DESCENDER: - shared_vals[0].type = AFM_VALUE_TYPE_FIXED; - if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) - goto Fail; - - fi->Descender = shared_vals[0].u.f; - break; - - case AFM_TOKEN_STARTCHARMETRICS: - { - FT_Int n = 0; - - - if ( afm_parser_read_int( parser, &n ) ) - goto Fail; - - error = afm_parser_skip_section( parser, n, - AFM_TOKEN_ENDCHARMETRICS ); - if ( error ) - return error; - } - break; - - case AFM_TOKEN_STARTKERNDATA: - error = afm_parse_kern_data( parser ); - if ( error ) - goto Fail; - /* fall through since we only support kern data */ - - case AFM_TOKEN_ENDFONTMETRICS: - return FT_Err_Ok; - - default: - break; - } - } - - Fail: - FT_FREE( fi->TrackKerns ); - fi->NumTrackKern = 0; - - FT_FREE( fi->KernPairs ); - fi->NumKernPair = 0; - - fi->IsCIDFont = 0; - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/psaux/afmparse.h b/3party/freetype/src/psaux/afmparse.h deleted file mode 100644 index f922c4ebde..0000000000 --- a/3party/freetype/src/psaux/afmparse.h +++ /dev/null @@ -1,89 +0,0 @@ -/***************************************************************************/ -/* */ -/* afmparse.h */ -/* */ -/* AFM parser (specification). */ -/* */ -/* Copyright 2006-2015 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 __AFMPARSE_H__ -#define __AFMPARSE_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_AUX_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - afm_parser_init( AFM_Parser parser, - FT_Memory memory, - FT_Byte* base, - FT_Byte* limit ); - - - FT_LOCAL( void ) - afm_parser_done( AFM_Parser parser ); - - - FT_LOCAL( FT_Error ) - afm_parser_parse( AFM_Parser parser ); - - - enum AFM_ValueType_ - { - AFM_VALUE_TYPE_STRING, - AFM_VALUE_TYPE_NAME, - AFM_VALUE_TYPE_FIXED, /* real number */ - AFM_VALUE_TYPE_INTEGER, - AFM_VALUE_TYPE_BOOL, - AFM_VALUE_TYPE_INDEX /* glyph index */ - }; - - - typedef struct AFM_ValueRec_ - { - enum AFM_ValueType_ type; - union - { - char* s; - FT_Fixed f; - FT_Int i; - FT_UInt u; - FT_Bool b; - - } u; - - } AFM_ValueRec, *AFM_Value; - -#define AFM_MAX_ARGUMENTS 5 - - FT_LOCAL( FT_Int ) - afm_parser_read_vals( AFM_Parser parser, - AFM_Value vals, - FT_Int n ); - - /* read the next key from the next line or column */ - FT_LOCAL( char* ) - afm_parser_next_key( AFM_Parser parser, - FT_Bool line, - FT_Offset* len ); - -FT_END_HEADER - -#endif /* __AFMPARSE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/psaux/module.mk b/3party/freetype/src/psaux/module.mk deleted file mode 100644 index 1d90e14ce4..0000000000 --- a/3party/freetype/src/psaux/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 PSaux module definition -# - - -# Copyright 1996-2015 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. - - -FTMODULE_H_COMMANDS += PSAUX_MODULE - -define PSAUX_MODULE -$(OPEN_DRIVER) FT_Module_Class, psaux_module_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)psaux $(ECHO_DRIVER_DESC)Postscript Type 1 & Type 2 helper module$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/psaux/psaux.c b/3party/freetype/src/psaux/psaux.c deleted file mode 100644 index 7f1d9aa595..0000000000 --- a/3party/freetype/src/psaux/psaux.c +++ /dev/null @@ -1,34 +0,0 @@ -/***************************************************************************/ -/* */ -/* psaux.c */ -/* */ -/* FreeType auxiliary PostScript driver component (body only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "psobjs.c" -#include "psauxmod.c" -#include "t1decode.c" -#include "t1cmap.c" - -#ifndef T1_CONFIG_OPTION_NO_AFM -#include "afmparse.c" -#endif - -#include "psconv.c" - - -/* END */ diff --git a/3party/freetype/src/psaux/psauxerr.h b/3party/freetype/src/psaux/psauxerr.h deleted file mode 100644 index 97712f0795..0000000000 --- a/3party/freetype/src/psaux/psauxerr.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************/ -/* */ -/* psauxerr.h */ -/* */ -/* PS auxiliary module error codes (specification only). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the PS auxiliary module error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __PSAUXERR_H__ -#define __PSAUXERR_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX PSaux_Err_ -#define FT_ERR_BASE FT_Mod_Err_PSaux - -#include FT_ERRORS_H - -#endif /* __PSAUXERR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/psaux/psauxmod.c b/3party/freetype/src/psaux/psauxmod.c deleted file mode 100644 index 06fcab0c4a..0000000000 --- a/3party/freetype/src/psaux/psauxmod.c +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************/ -/* */ -/* psauxmod.c */ -/* */ -/* FreeType auxiliary PostScript module implementation (body). */ -/* */ -/* Copyright 2000-2015 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 <ft2build.h> -#include "psauxmod.h" -#include "psobjs.h" -#include "t1decode.h" -#include "t1cmap.h" - -#ifndef T1_CONFIG_OPTION_NO_AFM -#include "afmparse.h" -#endif - - - FT_CALLBACK_TABLE_DEF - const PS_Table_FuncsRec ps_table_funcs = - { - ps_table_new, - ps_table_done, - ps_table_add, - ps_table_release - }; - - - FT_CALLBACK_TABLE_DEF - const PS_Parser_FuncsRec ps_parser_funcs = - { - ps_parser_init, - ps_parser_done, - ps_parser_skip_spaces, - ps_parser_skip_PS_token, - ps_parser_to_int, - ps_parser_to_fixed, - ps_parser_to_bytes, - ps_parser_to_coord_array, - ps_parser_to_fixed_array, - ps_parser_to_token, - ps_parser_to_token_array, - ps_parser_load_field, - ps_parser_load_field_table - }; - - - FT_CALLBACK_TABLE_DEF - const T1_Builder_FuncsRec t1_builder_funcs = - { - t1_builder_init, - t1_builder_done, - t1_builder_check_points, - t1_builder_add_point, - t1_builder_add_point1, - t1_builder_add_contour, - t1_builder_start_point, - t1_builder_close_contour - }; - - - FT_CALLBACK_TABLE_DEF - const T1_Decoder_FuncsRec t1_decoder_funcs = - { - t1_decoder_init, - t1_decoder_done, - t1_decoder_parse_charstrings - }; - - -#ifndef T1_CONFIG_OPTION_NO_AFM - FT_CALLBACK_TABLE_DEF - const AFM_Parser_FuncsRec afm_parser_funcs = - { - afm_parser_init, - afm_parser_done, - afm_parser_parse - }; -#endif - - - FT_CALLBACK_TABLE_DEF - const T1_CMap_ClassesRec t1_cmap_classes = - { - &t1_cmap_standard_class_rec, - &t1_cmap_expert_class_rec, - &t1_cmap_custom_class_rec, - &t1_cmap_unicode_class_rec - }; - - - static - const PSAux_Interface psaux_interface = - { - &ps_table_funcs, - &ps_parser_funcs, - &t1_builder_funcs, - &t1_decoder_funcs, - t1_decrypt, - - (const T1_CMap_ClassesRec*) &t1_cmap_classes, - -#ifndef T1_CONFIG_OPTION_NO_AFM - &afm_parser_funcs, -#else - 0, -#endif - }; - - - FT_CALLBACK_TABLE_DEF - const FT_Module_Class psaux_module_class = - { - 0, - sizeof ( FT_ModuleRec ), - "psaux", - 0x20000L, - 0x20000L, - - &psaux_interface, /* module-specific interface */ - - (FT_Module_Constructor)0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - }; - - -/* END */ diff --git a/3party/freetype/src/psaux/psauxmod.h b/3party/freetype/src/psaux/psauxmod.h deleted file mode 100644 index ae6a8f9383..0000000000 --- a/3party/freetype/src/psaux/psauxmod.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************/ -/* */ -/* psauxmod.h */ -/* */ -/* FreeType auxiliary PostScript module implementation (specification). */ -/* */ -/* Copyright 2000-2015 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 __PSAUXMOD_H__ -#define __PSAUXMOD_H__ - - -#include <ft2build.h> -#include FT_MODULE_H - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC -#error "this module does not support PIC yet" -#endif - - - FT_EXPORT_VAR( const FT_Module_Class ) psaux_driver_class; - - -FT_END_HEADER - -#endif /* __PSAUXMOD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/psaux/psconv.c b/3party/freetype/src/psaux/psconv.c deleted file mode 100644 index aca741204f..0000000000 --- a/3party/freetype/src/psaux/psconv.c +++ /dev/null @@ -1,603 +0,0 @@ -/***************************************************************************/ -/* */ -/* psconv.c */ -/* */ -/* Some convenience conversions (body). */ -/* */ -/* Copyright 2006-2015 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 <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_DEBUG_H - -#include "psconv.h" -#include "psauxerr.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_psconv - - - /* The following array is used by various functions to quickly convert */ - /* digits (both decimal and non-decimal) into numbers. */ - -#if 'A' == 65 - /* ASCII */ - - static const FT_Char ft_char_table[128] = - { - /* 0x00 */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, - }; - - /* no character >= 0x80 can represent a valid number */ -#define OP >= - -#endif /* 'A' == 65 */ - -#if 'A' == 193 - /* EBCDIC */ - - static const FT_Char ft_char_table[128] = - { - /* 0x80 */ - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, - -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, - -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, - -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, - -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, - }; - - /* no character < 0x80 can represent a valid number */ -#define OP < - -#endif /* 'A' == 193 */ - - - FT_LOCAL_DEF( FT_Long ) - PS_Conv_Strtol( FT_Byte** cursor, - FT_Byte* limit, - FT_Long base ) - { - FT_Byte* p = *cursor; - - FT_Long num = 0; - FT_Bool sign = 0; - FT_Bool have_overflow = 0; - - FT_Long num_limit; - FT_Char c_limit; - - - if ( p >= limit ) - goto Bad; - - if ( base < 2 || base > 36 ) - { - FT_TRACE4(( "!!!INVALID BASE:!!!" )); - return 0; - } - - if ( *p == '-' || *p == '+' ) - { - sign = FT_BOOL( *p == '-' ); - - p++; - if ( p == limit ) - goto Bad; - } - - num_limit = 0x7FFFFFFFL / base; - c_limit = (FT_Char)( 0x7FFFFFFFL % base ); - - for ( ; p < limit; p++ ) - { - FT_Char c; - - - if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) - break; - - c = ft_char_table[*p & 0x7F]; - - if ( c < 0 || c >= base ) - break; - - if ( num > num_limit || ( num == num_limit && c > c_limit ) ) - have_overflow = 1; - else - num = num * base + c; - } - - *cursor = p; - - if ( have_overflow ) - { - num = 0x7FFFFFFFL; - FT_TRACE4(( "!!!OVERFLOW:!!!" )); - } - - if ( sign ) - num = -num; - - return num; - - Bad: - FT_TRACE4(( "!!!END OF DATA:!!!" )); - return 0; - } - - - FT_LOCAL_DEF( FT_Long ) - PS_Conv_ToInt( FT_Byte** cursor, - FT_Byte* limit ) - - { - FT_Byte* p = *cursor; - FT_Byte* curp; - - FT_Long num; - - - curp = p; - num = PS_Conv_Strtol( &p, limit, 10 ); - - if ( p == curp ) - return 0; - - if ( p < limit && *p == '#' ) - { - p++; - - curp = p; - num = PS_Conv_Strtol( &p, limit, num ); - - if ( p == curp ) - return 0; - } - - *cursor = p; - - return num; - } - - - FT_LOCAL_DEF( FT_Fixed ) - PS_Conv_ToFixed( FT_Byte** cursor, - FT_Byte* limit, - FT_Long power_ten ) - { - FT_Byte* p = *cursor; - FT_Byte* curp; - - FT_Fixed integral = 0; - FT_Long decimal = 0; - FT_Long divider = 1; - - FT_Bool sign = 0; - FT_Bool have_overflow = 0; - FT_Bool have_underflow = 0; - - - if ( p >= limit ) - goto Bad; - - if ( *p == '-' || *p == '+' ) - { - sign = FT_BOOL( *p == '-' ); - - p++; - if ( p == limit ) - goto Bad; - } - - /* read the integer part */ - if ( *p != '.' ) - { - curp = p; - integral = PS_Conv_ToInt( &p, limit ); - - if ( p == curp ) - return 0; - - if ( integral > 0x7FFF ) - have_overflow = 1; - else - integral = (FT_Fixed)( (FT_UInt32)integral << 16 ); - } - - /* read the decimal part */ - if ( p < limit && *p == '.' ) - { - p++; - - for ( ; p < limit; p++ ) - { - FT_Char c; - - - if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) - break; - - c = ft_char_table[*p & 0x7F]; - - if ( c < 0 || c >= 10 ) - break; - - /* only add digit if we don't overflow */ - if ( divider < 0xCCCCCCCL && decimal < 0xCCCCCCCL ) - { - decimal = decimal * 10 + c; - - if ( !integral && power_ten > 0 ) - power_ten--; - else - divider *= 10; - } - } - } - - /* read exponent, if any */ - if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) ) - { - FT_Long exponent; - - - p++; - - curp = p; - exponent = PS_Conv_ToInt( &p, limit ); - - if ( curp == p ) - return 0; - - /* arbitrarily limit exponent */ - if ( exponent > 1000 ) - have_overflow = 1; - else if ( exponent < -1000 ) - have_underflow = 1; - else - power_ten += exponent; - } - - *cursor = p; - - if ( !integral && !decimal ) - return 0; - - if ( have_overflow ) - goto Overflow; - if ( have_underflow ) - goto Underflow; - - while ( power_ten > 0 ) - { - if ( integral >= 0xCCCCCCCL ) - goto Overflow; - integral *= 10; - - if ( decimal >= 0xCCCCCCCL ) - { - if ( divider == 1 ) - goto Overflow; - divider /= 10; - } - else - decimal *= 10; - - power_ten--; - } - - while ( power_ten < 0 ) - { - integral /= 10; - if ( divider < 0xCCCCCCCL ) - divider *= 10; - else - decimal /= 10; - - if ( !integral && !decimal ) - goto Underflow; - - power_ten++; - } - - if ( decimal ) - { - decimal = FT_DivFix( decimal, divider ); - /* it's not necessary to check this addition for overflow */ - /* due to the structure of the real number representation */ - integral += decimal; - } - - Exit: - if ( sign ) - integral = -integral; - - return integral; - - Bad: - FT_TRACE4(( "!!!END OF DATA:!!!" )); - return 0; - - Overflow: - integral = 0x7FFFFFFFL; - FT_TRACE4(( "!!!OVERFLOW:!!!" )); - goto Exit; - - Underflow: - FT_TRACE4(( "!!!UNDERFLOW:!!!" )); - return 0; - } - - -#if 0 - FT_LOCAL_DEF( FT_UInt ) - PS_Conv_StringDecode( FT_Byte** cursor, - FT_Byte* limit, - FT_Byte* buffer, - FT_Offset n ) - { - FT_Byte* p; - FT_UInt r = 0; - - - for ( p = *cursor; r < n && p < limit; p++ ) - { - FT_Byte b; - - - if ( *p != '\\' ) - { - buffer[r++] = *p; - - continue; - } - - p++; - - switch ( *p ) - { - case 'n': - b = '\n'; - break; - case 'r': - b = '\r'; - break; - case 't': - b = '\t'; - break; - case 'b': - b = '\b'; - break; - case 'f': - b = '\f'; - break; - case '\r': - p++; - if ( *p != '\n' ) - { - b = *p; - - break; - } - /* no break */ - case '\n': - continue; - break; - default: - if ( IS_PS_DIGIT( *p ) ) - { - b = *p - '0'; - - p++; - - if ( IS_PS_DIGIT( *p ) ) - { - b = b * 8 + *p - '0'; - - p++; - - if ( IS_PS_DIGIT( *p ) ) - b = b * 8 + *p - '0'; - else - { - buffer[r++] = b; - b = *p; - } - } - else - { - buffer[r++] = b; - b = *p; - } - } - else - b = *p; - break; - } - - buffer[r++] = b; - } - - *cursor = p; - - return r; - } -#endif /* 0 */ - - - FT_LOCAL_DEF( FT_UInt ) - PS_Conv_ASCIIHexDecode( FT_Byte** cursor, - FT_Byte* limit, - FT_Byte* buffer, - FT_Offset n ) - { - FT_Byte* p; - FT_UInt r = 0; - FT_UInt w = 0; - FT_UInt pad = 0x01; - - - n *= 2; - -#if 1 - - p = *cursor; - - if ( p >= limit ) - return 0; - - if ( n > (FT_UInt)( limit - p ) ) - n = (FT_UInt)( limit - p ); - - /* we try to process two nibbles at a time to be as fast as possible */ - for ( ; r < n; r++ ) - { - FT_UInt c = p[r]; - - - if ( IS_PS_SPACE( c ) ) - continue; - - if ( c OP 0x80 ) - break; - - c = (FT_UInt)ft_char_table[c & 0x7F]; - if ( c >= 16 ) - break; - - pad = ( pad << 4 ) | c; - if ( pad & 0x100 ) - { - buffer[w++] = (FT_Byte)pad; - pad = 0x01; - } - } - - if ( pad != 0x01 ) - buffer[w++] = (FT_Byte)( pad << 4 ); - - *cursor = p + r; - - return w; - -#else /* 0 */ - - for ( r = 0; r < n; r++ ) - { - FT_Char c; - - - if ( IS_PS_SPACE( *p ) ) - continue; - - if ( *p OP 0x80 ) - break; - - c = ft_char_table[*p & 0x7F]; - - if ( (unsigned)c >= 16 ) - break; - - if ( r & 1 ) - { - *buffer = (FT_Byte)(*buffer + c); - buffer++; - } - else - *buffer = (FT_Byte)(c << 4); - - r++; - } - - *cursor = p; - - return ( r + 1 ) / 2; - -#endif /* 0 */ - - } - - - FT_LOCAL_DEF( FT_UInt ) - PS_Conv_EexecDecode( FT_Byte** cursor, - FT_Byte* limit, - FT_Byte* buffer, - FT_Offset n, - FT_UShort* seed ) - { - FT_Byte* p; - FT_UInt r; - FT_UInt s = *seed; - - -#if 1 - - p = *cursor; - - if ( p >= limit ) - return 0; - - if ( n > (FT_UInt)(limit - p) ) - n = (FT_UInt)(limit - p); - - for ( r = 0; r < n; r++ ) - { - FT_UInt val = p[r]; - FT_UInt b = ( val ^ ( s >> 8 ) ); - - - s = ( (val + s)*52845U + 22719 ) & 0xFFFFU; - buffer[r] = (FT_Byte) b; - } - - *cursor = p + n; - *seed = (FT_UShort)s; - -#else /* 0 */ - - for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ ) - { - FT_Byte b = (FT_Byte)( *p ^ ( s >> 8 ) ); - - - s = (FT_UShort)( ( *p + s ) * 52845U + 22719 ); - *buffer++ = b; - } - *cursor = p; - *seed = s; - -#endif /* 0 */ - - return r; - } - - -/* END */ diff --git a/3party/freetype/src/psaux/psconv.h b/3party/freetype/src/psaux/psconv.h deleted file mode 100644 index 10f1ff7fb1..0000000000 --- a/3party/freetype/src/psaux/psconv.h +++ /dev/null @@ -1,71 +0,0 @@ -/***************************************************************************/ -/* */ -/* psconv.h */ -/* */ -/* Some convenience conversions (specification). */ -/* */ -/* Copyright 2006-2015 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 __PSCONV_H__ -#define __PSCONV_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_AUX_H - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Long ) - PS_Conv_Strtol( FT_Byte** cursor, - FT_Byte* limit, - FT_Long base ); - - - FT_LOCAL( FT_Long ) - PS_Conv_ToInt( FT_Byte** cursor, - FT_Byte* limit ); - - FT_LOCAL( FT_Fixed ) - PS_Conv_ToFixed( FT_Byte** cursor, - FT_Byte* limit, - FT_Long power_ten ); - -#if 0 - FT_LOCAL( FT_UInt ) - PS_Conv_StringDecode( FT_Byte** cursor, - FT_Byte* limit, - FT_Byte* buffer, - FT_Offset n ); -#endif - - FT_LOCAL( FT_UInt ) - PS_Conv_ASCIIHexDecode( FT_Byte** cursor, - FT_Byte* limit, - FT_Byte* buffer, - FT_Offset n ); - - FT_LOCAL( FT_UInt ) - PS_Conv_EexecDecode( FT_Byte** cursor, - FT_Byte* limit, - FT_Byte* buffer, - FT_Offset n, - FT_UShort* seed ); - - -FT_END_HEADER - -#endif /* __PSCONV_H__ */ - - -/* END */ diff --git a/3party/freetype/src/psaux/psobjs.c b/3party/freetype/src/psaux/psobjs.c deleted file mode 100644 index c7cbc67c67..0000000000 --- a/3party/freetype/src/psaux/psobjs.c +++ /dev/null @@ -1,1769 +0,0 @@ -/***************************************************************************/ -/* */ -/* psobjs.c */ -/* */ -/* Auxiliary functions for PostScript fonts (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H - -#include "psobjs.h" -#include "psconv.h" - -#include "psauxerr.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_psobjs - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PS_TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ps_table_new */ - /* */ - /* <Description> */ - /* Initializes a PS_Table. */ - /* */ - /* <InOut> */ - /* table :: The address of the target table. */ - /* */ - /* <Input> */ - /* count :: The table size = the maximum number of elements. */ - /* */ - /* memory :: The memory object to use for all subsequent */ - /* reallocations. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - ps_table_new( PS_Table table, - FT_Int count, - FT_Memory memory ) - { - FT_Error error; - - - table->memory = memory; - if ( FT_NEW_ARRAY( table->elements, count ) || - FT_NEW_ARRAY( table->lengths, count ) ) - goto Exit; - - table->max_elems = count; - table->init = 0xDEADBEEFUL; - table->num_elems = 0; - table->block = NULL; - table->capacity = 0; - table->cursor = 0; - - *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs; - - Exit: - if ( error ) - FT_FREE( table->elements ); - - return error; - } - - - static void - shift_elements( PS_Table table, - FT_Byte* old_base ) - { - FT_PtrDist delta = table->block - old_base; - FT_Byte** offset = table->elements; - FT_Byte** limit = offset + table->max_elems; - - - for ( ; offset < limit; offset++ ) - { - if ( offset[0] ) - offset[0] += delta; - } - } - - - static FT_Error - reallocate_t1_table( PS_Table table, - FT_Offset new_size ) - { - FT_Memory memory = table->memory; - FT_Byte* old_base = table->block; - FT_Error error; - - - /* allocate new base block */ - if ( FT_ALLOC( table->block, new_size ) ) - { - table->block = old_base; - return error; - } - - /* copy elements and shift offsets */ - if ( old_base ) - { - FT_MEM_COPY( table->block, old_base, table->capacity ); - shift_elements( table, old_base ); - FT_FREE( old_base ); - } - - table->capacity = new_size; - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ps_table_add */ - /* */ - /* <Description> */ - /* Adds an object to a PS_Table, possibly growing its memory block. */ - /* */ - /* <InOut> */ - /* table :: The target table. */ - /* */ - /* <Input> */ - /* idx :: The index of the object in the table. */ - /* */ - /* object :: The address of the object to copy in memory. */ - /* */ - /* length :: The length in bytes of the source object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. An error is returned if a */ - /* reallocation fails. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - ps_table_add( PS_Table table, - FT_Int idx, - void* object, - FT_UInt length ) - { - if ( idx < 0 || idx >= table->max_elems ) - { - FT_ERROR(( "ps_table_add: invalid index\n" )); - return FT_THROW( Invalid_Argument ); - } - - /* grow the base block if needed */ - if ( table->cursor + length > table->capacity ) - { - FT_Error error; - FT_Offset new_size = table->capacity; - FT_PtrDist in_offset; - - - in_offset = (FT_Byte*)object - table->block; - if ( in_offset < 0 || (FT_Offset)in_offset >= table->capacity ) - in_offset = -1; - - while ( new_size < table->cursor + length ) - { - /* increase size by 25% and round up to the nearest multiple - of 1024 */ - new_size += ( new_size >> 2 ) + 1; - new_size = FT_PAD_CEIL( new_size, 1024 ); - } - - error = reallocate_t1_table( table, new_size ); - if ( error ) - return error; - - if ( in_offset >= 0 ) - object = table->block + in_offset; - } - - /* add the object to the base block and adjust offset */ - table->elements[idx] = table->block + table->cursor; - table->lengths [idx] = length; - FT_MEM_COPY( table->block + table->cursor, object, length ); - - table->cursor += length; - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ps_table_done */ - /* */ - /* <Description> */ - /* Finalizes a PS_TableRec (i.e., reallocate it to its current */ - /* cursor). */ - /* */ - /* <InOut> */ - /* table :: The target table. */ - /* */ - /* <Note> */ - /* This function does NOT release the heap's memory block. It is up */ - /* to the caller to clean it, or reference it in its own structures. */ - /* */ - FT_LOCAL_DEF( void ) - ps_table_done( PS_Table table ) - { - FT_Memory memory = table->memory; - FT_Error error; - FT_Byte* old_base = table->block; - - - /* should never fail, because rec.cursor <= rec.size */ - if ( !old_base ) - return; - - if ( FT_ALLOC( table->block, table->cursor ) ) - return; - FT_MEM_COPY( table->block, old_base, table->cursor ); - shift_elements( table, old_base ); - - table->capacity = table->cursor; - FT_FREE( old_base ); - - FT_UNUSED( error ); - } - - - FT_LOCAL_DEF( void ) - ps_table_release( PS_Table table ) - { - FT_Memory memory = table->memory; - - - if ( (FT_ULong)table->init == 0xDEADBEEFUL ) - { - FT_FREE( table->block ); - FT_FREE( table->elements ); - FT_FREE( table->lengths ); - table->init = 0; - } - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 PARSER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* first character must be already part of the comment */ - - static void - skip_comment( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur = *acur; - - - while ( cur < limit ) - { - if ( IS_PS_NEWLINE( *cur ) ) - break; - cur++; - } - - *acur = cur; - } - - - static void - skip_spaces( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur = *acur; - - - while ( cur < limit ) - { - if ( !IS_PS_SPACE( *cur ) ) - { - if ( *cur == '%' ) - /* According to the PLRM, a comment is equal to a space. */ - skip_comment( &cur, limit ); - else - break; - } - cur++; - } - - *acur = cur; - } - - -#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' ) - - - /* first character must be `('; */ - /* *acur is positioned at the character after the closing `)' */ - - static FT_Error - skip_literal_string( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur = *acur; - FT_Int embed = 0; - FT_Error error = FT_ERR( Invalid_File_Format ); - unsigned int i; - - - while ( cur < limit ) - { - FT_Byte c = *cur; - - - ++cur; - - if ( c == '\\' ) - { - /* Red Book 3rd ed., section `Literal Text Strings', p. 29: */ - /* A backslash can introduce three different types */ - /* of escape sequences: */ - /* - a special escaped char like \r, \n, etc. */ - /* - a one-, two-, or three-digit octal number */ - /* - none of the above in which case the backslash is ignored */ - - if ( cur == limit ) - /* error (or to be ignored?) */ - break; - - switch ( *cur ) - { - /* skip `special' escape */ - case 'n': - case 'r': - case 't': - case 'b': - case 'f': - case '\\': - case '(': - case ')': - ++cur; - break; - - default: - /* skip octal escape or ignore backslash */ - for ( i = 0; i < 3 && cur < limit; ++i ) - { - if ( !IS_OCTAL_DIGIT( *cur ) ) - break; - - ++cur; - } - } - } - else if ( c == '(' ) - embed++; - else if ( c == ')' ) - { - embed--; - if ( embed == 0 ) - { - error = FT_Err_Ok; - break; - } - } - } - - *acur = cur; - - return error; - } - - - /* first character must be `<' */ - - static FT_Error - skip_string( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur = *acur; - FT_Error err = FT_Err_Ok; - - - while ( ++cur < limit ) - { - /* All whitespace characters are ignored. */ - skip_spaces( &cur, limit ); - if ( cur >= limit ) - break; - - if ( !IS_PS_XDIGIT( *cur ) ) - break; - } - - if ( cur < limit && *cur != '>' ) - { - FT_ERROR(( "skip_string: missing closing delimiter `>'\n" )); - err = FT_THROW( Invalid_File_Format ); - } - else - cur++; - - *acur = cur; - return err; - } - - - /* first character must be the opening brace that */ - /* starts the procedure */ - - /* NB: [ and ] need not match: */ - /* `/foo {[} def' is a valid PostScript fragment, */ - /* even within a Type1 font */ - - static FT_Error - skip_procedure( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur; - FT_Int embed = 0; - FT_Error error = FT_Err_Ok; - - - FT_ASSERT( **acur == '{' ); - - for ( cur = *acur; cur < limit && error == FT_Err_Ok; ++cur ) - { - switch ( *cur ) - { - case '{': - ++embed; - break; - - case '}': - --embed; - if ( embed == 0 ) - { - ++cur; - goto end; - } - break; - - case '(': - error = skip_literal_string( &cur, limit ); - break; - - case '<': - error = skip_string( &cur, limit ); - break; - - case '%': - skip_comment( &cur, limit ); - break; - } - } - - end: - if ( embed != 0 ) - error = FT_THROW( Invalid_File_Format ); - - *acur = cur; - - return error; - } - - - /***********************************************************************/ - /* */ - /* All exported parsing routines handle leading whitespace and stop at */ - /* the first character which isn't part of the just handled token. */ - /* */ - /***********************************************************************/ - - - FT_LOCAL_DEF( void ) - ps_parser_skip_PS_token( PS_Parser parser ) - { - /* Note: PostScript allows any non-delimiting, non-whitespace */ - /* character in a name (PS Ref Manual, 3rd ed, p31). */ - /* PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */ - - FT_Byte* cur = parser->cursor; - FT_Byte* limit = parser->limit; - FT_Error error = FT_Err_Ok; - - - skip_spaces( &cur, limit ); /* this also skips comments */ - if ( cur >= limit ) - goto Exit; - - /* self-delimiting, single-character tokens */ - if ( *cur == '[' || *cur == ']' ) - { - cur++; - goto Exit; - } - - /* skip balanced expressions (procedures and strings) */ - - if ( *cur == '{' ) /* {...} */ - { - error = skip_procedure( &cur, limit ); - goto Exit; - } - - if ( *cur == '(' ) /* (...) */ - { - error = skip_literal_string( &cur, limit ); - goto Exit; - } - - if ( *cur == '<' ) /* <...> */ - { - if ( cur + 1 < limit && *(cur + 1) == '<' ) /* << */ - { - cur++; - cur++; - } - else - error = skip_string( &cur, limit ); - - goto Exit; - } - - if ( *cur == '>' ) - { - cur++; - if ( cur >= limit || *cur != '>' ) /* >> */ - { - FT_ERROR(( "ps_parser_skip_PS_token:" - " unexpected closing delimiter `>'\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - cur++; - goto Exit; - } - - if ( *cur == '/' ) - cur++; - - /* anything else */ - while ( cur < limit ) - { - /* *cur might be invalid (e.g., ')' or '}'), but this */ - /* is handled by the test `cur == parser->cursor' below */ - if ( IS_PS_DELIM( *cur ) ) - break; - - cur++; - } - - Exit: - if ( cur < limit && cur == parser->cursor ) - { - FT_ERROR(( "ps_parser_skip_PS_token:" - " current token is `%c' which is self-delimiting\n" - " " - " but invalid at this point\n", - *cur )); - - error = FT_THROW( Invalid_File_Format ); - } - - parser->error = error; - parser->cursor = cur; - } - - - FT_LOCAL_DEF( void ) - ps_parser_skip_spaces( PS_Parser parser ) - { - skip_spaces( &parser->cursor, parser->limit ); - } - - - /* `token' here means either something between balanced delimiters */ - /* or the next token; the delimiters are not removed. */ - - FT_LOCAL_DEF( void ) - ps_parser_to_token( PS_Parser parser, - T1_Token token ) - { - FT_Byte* cur; - FT_Byte* limit; - FT_Int embed; - - - token->type = T1_TOKEN_TYPE_NONE; - token->start = NULL; - token->limit = NULL; - - /* first of all, skip leading whitespace */ - ps_parser_skip_spaces( parser ); - - cur = parser->cursor; - limit = parser->limit; - - if ( cur >= limit ) - return; - - switch ( *cur ) - { - /************* check for literal string *****************/ - case '(': - token->type = T1_TOKEN_TYPE_STRING; - token->start = cur; - - if ( skip_literal_string( &cur, limit ) == FT_Err_Ok ) - token->limit = cur; - break; - - /************* check for programs/array *****************/ - case '{': - token->type = T1_TOKEN_TYPE_ARRAY; - token->start = cur; - - if ( skip_procedure( &cur, limit ) == FT_Err_Ok ) - token->limit = cur; - break; - - /************* check for table/array ********************/ - /* XXX: in theory we should also look for "<<" */ - /* since this is semantically equivalent to "["; */ - /* in practice it doesn't matter (?) */ - case '[': - token->type = T1_TOKEN_TYPE_ARRAY; - embed = 1; - token->start = cur++; - - /* we need this to catch `[ ]' */ - parser->cursor = cur; - ps_parser_skip_spaces( parser ); - cur = parser->cursor; - - while ( cur < limit && !parser->error ) - { - /* XXX: this is wrong because it does not */ - /* skip comments, procedures, and strings */ - if ( *cur == '[' ) - embed++; - else if ( *cur == ']' ) - { - embed--; - if ( embed <= 0 ) - { - token->limit = ++cur; - break; - } - } - - parser->cursor = cur; - ps_parser_skip_PS_token( parser ); - /* we need this to catch `[XXX ]' */ - ps_parser_skip_spaces ( parser ); - cur = parser->cursor; - } - break; - - /* ************ otherwise, it is any token **************/ - default: - token->start = cur; - token->type = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY ); - ps_parser_skip_PS_token( parser ); - cur = parser->cursor; - if ( !parser->error ) - token->limit = cur; - } - - if ( !token->limit ) - { - token->start = NULL; - token->type = T1_TOKEN_TYPE_NONE; - } - - parser->cursor = cur; - } - - - /* NB: `tokens' can be NULL if we only want to count */ - /* the number of array elements */ - - FT_LOCAL_DEF( void ) - ps_parser_to_token_array( PS_Parser parser, - T1_Token tokens, - FT_UInt max_tokens, - FT_Int* pnum_tokens ) - { - T1_TokenRec master; - - - *pnum_tokens = -1; - - /* this also handles leading whitespace */ - ps_parser_to_token( parser, &master ); - - if ( master.type == T1_TOKEN_TYPE_ARRAY ) - { - FT_Byte* old_cursor = parser->cursor; - FT_Byte* old_limit = parser->limit; - T1_Token cur = tokens; - T1_Token limit = cur + max_tokens; - - - /* don't include outermost delimiters */ - parser->cursor = master.start + 1; - parser->limit = master.limit - 1; - - while ( parser->cursor < parser->limit ) - { - T1_TokenRec token; - - - ps_parser_to_token( parser, &token ); - if ( !token.type ) - break; - - if ( tokens != NULL && cur < limit ) - *cur = token; - - cur++; - } - - *pnum_tokens = (FT_Int)( cur - tokens ); - - parser->cursor = old_cursor; - parser->limit = old_limit; - } - } - - - /* first character must be a delimiter or a part of a number */ - /* NB: `coords' can be NULL if we just want to skip the */ - /* array; in this case we ignore `max_coords' */ - - static FT_Int - ps_tocoordarray( FT_Byte* *acur, - FT_Byte* limit, - FT_Int max_coords, - FT_Short* coords ) - { - FT_Byte* cur = *acur; - FT_Int count = 0; - FT_Byte c, ender; - - - if ( cur >= limit ) - goto Exit; - - /* check for the beginning of an array; otherwise, only one number */ - /* will be read */ - c = *cur; - ender = 0; - - if ( c == '[' ) - ender = ']'; - else if ( c == '{' ) - ender = '}'; - - if ( ender ) - cur++; - - /* now, read the coordinates */ - while ( cur < limit ) - { - FT_Short dummy; - FT_Byte* old_cur; - - - /* skip whitespace in front of data */ - skip_spaces( &cur, limit ); - if ( cur >= limit ) - goto Exit; - - if ( *cur == ender ) - { - cur++; - break; - } - - old_cur = cur; - - if ( coords != NULL && count >= max_coords ) - break; - - /* call PS_Conv_ToFixed() even if coords == NULL */ - /* to properly parse number at `cur' */ - *( coords != NULL ? &coords[count] : &dummy ) = - (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 ); - - if ( old_cur == cur ) - { - count = -1; - goto Exit; - } - else - count++; - - if ( !ender ) - break; - } - - Exit: - *acur = cur; - return count; - } - - - /* first character must be a delimiter or a part of a number */ - /* NB: `values' can be NULL if we just want to skip the */ - /* array; in this case we ignore `max_values' */ - /* */ - /* return number of successfully parsed values */ - - static FT_Int - ps_tofixedarray( FT_Byte* *acur, - FT_Byte* limit, - FT_Int max_values, - FT_Fixed* values, - FT_Int power_ten ) - { - FT_Byte* cur = *acur; - FT_Int count = 0; - FT_Byte c, ender; - - - if ( cur >= limit ) - goto Exit; - - /* Check for the beginning of an array. Otherwise, only one number */ - /* will be read. */ - c = *cur; - ender = 0; - - if ( c == '[' ) - ender = ']'; - else if ( c == '{' ) - ender = '}'; - - if ( ender ) - cur++; - - /* now, read the values */ - while ( cur < limit ) - { - FT_Fixed dummy; - FT_Byte* old_cur; - - - /* skip whitespace in front of data */ - skip_spaces( &cur, limit ); - if ( cur >= limit ) - goto Exit; - - if ( *cur == ender ) - { - cur++; - break; - } - - old_cur = cur; - - if ( values != NULL && count >= max_values ) - break; - - /* call PS_Conv_ToFixed() even if coords == NULL */ - /* to properly parse number at `cur' */ - *( values != NULL ? &values[count] : &dummy ) = - PS_Conv_ToFixed( &cur, limit, power_ten ); - - if ( old_cur == cur ) - { - count = -1; - goto Exit; - } - else - count++; - - if ( !ender ) - break; - } - - Exit: - *acur = cur; - return count; - } - - -#if 0 - - static FT_String* - ps_tostring( FT_Byte** cursor, - FT_Byte* limit, - FT_Memory memory ) - { - FT_Byte* cur = *cursor; - FT_UInt len = 0; - FT_Int count; - FT_String* result; - FT_Error error; - - - /* XXX: some stupid fonts have a `Notice' or `Copyright' string */ - /* that simply doesn't begin with an opening parenthesis, even */ - /* though they have a closing one! E.g. "amuncial.pfb" */ - /* */ - /* We must deal with these ill-fated cases there. Note that */ - /* these fonts didn't work with the old Type 1 driver as the */ - /* notice/copyright was not recognized as a valid string token */ - /* and made the old token parser commit errors. */ - - while ( cur < limit && ( *cur == ' ' || *cur == '\t' ) ) - cur++; - if ( cur + 1 >= limit ) - return 0; - - if ( *cur == '(' ) - cur++; /* skip the opening parenthesis, if there is one */ - - *cursor = cur; - count = 0; - - /* then, count its length */ - for ( ; cur < limit; cur++ ) - { - if ( *cur == '(' ) - count++; - - else if ( *cur == ')' ) - { - count--; - if ( count < 0 ) - break; - } - } - - len = (FT_UInt)( cur - *cursor ); - if ( cur >= limit || FT_ALLOC( result, len + 1 ) ) - return 0; - - /* now copy the string */ - FT_MEM_COPY( result, *cursor, len ); - result[len] = '\0'; - *cursor = cur; - return result; - } - -#endif /* 0 */ - - - static int - ps_tobool( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur = *acur; - FT_Bool result = 0; - - - /* return 1 if we find `true', 0 otherwise */ - if ( cur + 3 < limit && - cur[0] == 't' && - cur[1] == 'r' && - cur[2] == 'u' && - cur[3] == 'e' ) - { - result = 1; - cur += 5; - } - else if ( cur + 4 < limit && - cur[0] == 'f' && - cur[1] == 'a' && - cur[2] == 'l' && - cur[3] == 's' && - cur[4] == 'e' ) - { - result = 0; - cur += 6; - } - - *acur = cur; - return result; - } - - - /* load a simple field (i.e. non-table) into the current list of objects */ - - FT_LOCAL_DEF( FT_Error ) - ps_parser_load_field( PS_Parser parser, - const T1_Field field, - void** objects, - FT_UInt max_objects, - FT_ULong* pflags ) - { - T1_TokenRec token; - FT_Byte* cur; - FT_Byte* limit; - FT_UInt count; - FT_UInt idx; - FT_Error error; - T1_FieldType type; - - - /* this also skips leading whitespace */ - ps_parser_to_token( parser, &token ); - if ( !token.type ) - goto Fail; - - count = 1; - idx = 0; - cur = token.start; - limit = token.limit; - - type = field->type; - - /* we must detect arrays in /FontBBox */ - if ( type == T1_FIELD_TYPE_BBOX ) - { - T1_TokenRec token2; - FT_Byte* old_cur = parser->cursor; - FT_Byte* old_limit = parser->limit; - - - /* don't include delimiters */ - parser->cursor = token.start + 1; - parser->limit = token.limit - 1; - - ps_parser_to_token( parser, &token2 ); - parser->cursor = old_cur; - parser->limit = old_limit; - - if ( token2.type == T1_TOKEN_TYPE_ARRAY ) - { - type = T1_FIELD_TYPE_MM_BBOX; - goto FieldArray; - } - } - else if ( token.type == T1_TOKEN_TYPE_ARRAY ) - { - count = max_objects; - - FieldArray: - /* if this is an array and we have no blend, an error occurs */ - if ( max_objects == 0 ) - goto Fail; - - idx = 1; - - /* don't include delimiters */ - cur++; - limit--; - } - - for ( ; count > 0; count--, idx++ ) - { - FT_Byte* q = (FT_Byte*)objects[idx] + field->offset; - FT_Long val; - FT_String* string; - - - skip_spaces( &cur, limit ); - - switch ( type ) - { - case T1_FIELD_TYPE_BOOL: - val = ps_tobool( &cur, limit ); - goto Store_Integer; - - case T1_FIELD_TYPE_FIXED: - val = PS_Conv_ToFixed( &cur, limit, 0 ); - goto Store_Integer; - - case T1_FIELD_TYPE_FIXED_1000: - val = PS_Conv_ToFixed( &cur, limit, 3 ); - goto Store_Integer; - - case T1_FIELD_TYPE_INTEGER: - val = PS_Conv_ToInt( &cur, limit ); - /* fall through */ - - Store_Integer: - switch ( field->size ) - { - case (8 / FT_CHAR_BIT): - *(FT_Byte*)q = (FT_Byte)val; - break; - - case (16 / FT_CHAR_BIT): - *(FT_UShort*)q = (FT_UShort)val; - break; - - case (32 / FT_CHAR_BIT): - *(FT_UInt32*)q = (FT_UInt32)val; - break; - - default: /* for 64-bit systems */ - *(FT_Long*)q = val; - } - break; - - case T1_FIELD_TYPE_STRING: - case T1_FIELD_TYPE_KEY: - { - FT_Memory memory = parser->memory; - FT_UInt len = (FT_UInt)( limit - cur ); - - - if ( cur >= limit ) - break; - - /* we allow both a string or a name */ - /* for cases like /FontName (foo) def */ - if ( token.type == T1_TOKEN_TYPE_KEY ) - { - /* don't include leading `/' */ - len--; - cur++; - } - else if ( token.type == T1_TOKEN_TYPE_STRING ) - { - /* don't include delimiting parentheses */ - /* XXX we don't handle <<...>> here */ - /* XXX should we convert octal escapes? */ - /* if so, what encoding should we use? */ - cur++; - len -= 2; - } - else - { - FT_ERROR(( "ps_parser_load_field:" - " expected a name or string\n" - " " - " but found token of type %d instead\n", - token.type )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* for this to work (FT_String**)q must have been */ - /* initialized to NULL */ - if ( *(FT_String**)q != NULL ) - { - FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n", - field->ident )); - FT_FREE( *(FT_String**)q ); - *(FT_String**)q = NULL; - } - - if ( FT_ALLOC( string, len + 1 ) ) - goto Exit; - - FT_MEM_COPY( string, cur, len ); - string[len] = 0; - - *(FT_String**)q = string; - } - break; - - case T1_FIELD_TYPE_BBOX: - { - FT_Fixed temp[4]; - FT_BBox* bbox = (FT_BBox*)q; - FT_Int result; - - - result = ps_tofixedarray( &cur, limit, 4, temp, 0 ); - - if ( result < 4 ) - { - FT_ERROR(( "ps_parser_load_field:" - " expected four integers in bounding box\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - bbox->xMin = FT_RoundFix( temp[0] ); - bbox->yMin = FT_RoundFix( temp[1] ); - bbox->xMax = FT_RoundFix( temp[2] ); - bbox->yMax = FT_RoundFix( temp[3] ); - } - break; - - case T1_FIELD_TYPE_MM_BBOX: - { - FT_Memory memory = parser->memory; - FT_Fixed* temp; - FT_Int result; - FT_UInt i; - - - if ( FT_NEW_ARRAY( temp, max_objects * 4 ) ) - goto Exit; - - for ( i = 0; i < 4; i++ ) - { - result = ps_tofixedarray( &cur, limit, (FT_Int)max_objects, - temp + i * max_objects, 0 ); - if ( result < 0 || (FT_UInt)result < max_objects ) - { - FT_ERROR(( "ps_parser_load_field:" - " expected %d integers in the %s subarray\n" - " " - " of /FontBBox in the /Blend dictionary\n", - max_objects, - i == 0 ? "first" - : ( i == 1 ? "second" - : ( i == 2 ? "third" - : "fourth" ) ) )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - skip_spaces( &cur, limit ); - } - - for ( i = 0; i < max_objects; i++ ) - { - FT_BBox* bbox = (FT_BBox*)objects[i]; - - - bbox->xMin = FT_RoundFix( temp[i ] ); - bbox->yMin = FT_RoundFix( temp[i + max_objects] ); - bbox->xMax = FT_RoundFix( temp[i + 2 * max_objects] ); - bbox->yMax = FT_RoundFix( temp[i + 3 * max_objects] ); - } - - FT_FREE( temp ); - } - break; - - default: - /* an error occurred */ - goto Fail; - } - } - -#if 0 /* obsolete -- keep for reference */ - if ( pflags ) - *pflags |= 1L << field->flag_bit; -#else - FT_UNUSED( pflags ); -#endif - - error = FT_Err_Ok; - - Exit: - return error; - - Fail: - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - -#define T1_MAX_TABLE_ELEMENTS 32 - - - FT_LOCAL_DEF( FT_Error ) - ps_parser_load_field_table( PS_Parser parser, - const T1_Field field, - void** objects, - FT_UInt max_objects, - FT_ULong* pflags ) - { - T1_TokenRec elements[T1_MAX_TABLE_ELEMENTS]; - T1_Token token; - FT_Int num_elements; - FT_Error error = FT_Err_Ok; - FT_Byte* old_cursor; - FT_Byte* old_limit; - T1_FieldRec fieldrec = *(T1_Field)field; - - - fieldrec.type = T1_FIELD_TYPE_INTEGER; - if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY || - field->type == T1_FIELD_TYPE_BBOX ) - fieldrec.type = T1_FIELD_TYPE_FIXED; - - ps_parser_to_token_array( parser, elements, - T1_MAX_TABLE_ELEMENTS, &num_elements ); - if ( num_elements < 0 ) - { - error = FT_ERR( Ignore ); - goto Exit; - } - if ( (FT_UInt)num_elements > field->array_max ) - num_elements = (FT_Int)field->array_max; - - old_cursor = parser->cursor; - old_limit = parser->limit; - - /* we store the elements count if necessary; */ - /* we further assume that `count_offset' can't be zero */ - if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 ) - *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) = - (FT_Byte)num_elements; - - /* we now load each element, adjusting the field.offset on each one */ - token = elements; - for ( ; num_elements > 0; num_elements--, token++ ) - { - parser->cursor = token->start; - parser->limit = token->limit; - - error = ps_parser_load_field( parser, - &fieldrec, - objects, - max_objects, - 0 ); - if ( error ) - break; - - fieldrec.offset += fieldrec.size; - } - -#if 0 /* obsolete -- keep for reference */ - if ( pflags ) - *pflags |= 1L << field->flag_bit; -#else - FT_UNUSED( pflags ); -#endif - - parser->cursor = old_cursor; - parser->limit = old_limit; - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Long ) - ps_parser_to_int( PS_Parser parser ) - { - ps_parser_skip_spaces( parser ); - return PS_Conv_ToInt( &parser->cursor, parser->limit ); - } - - - /* first character must be `<' if `delimiters' is non-zero */ - - FT_LOCAL_DEF( FT_Error ) - ps_parser_to_bytes( PS_Parser parser, - FT_Byte* bytes, - FT_Offset max_bytes, - FT_ULong* pnum_bytes, - FT_Bool delimiters ) - { - FT_Error error = FT_Err_Ok; - FT_Byte* cur; - - - ps_parser_skip_spaces( parser ); - cur = parser->cursor; - - if ( cur >= parser->limit ) - goto Exit; - - if ( delimiters ) - { - if ( *cur != '<' ) - { - FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - cur++; - } - - *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur, - parser->limit, - bytes, - max_bytes ); - - if ( delimiters ) - { - if ( cur < parser->limit && *cur != '>' ) - { - FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - cur++; - } - - parser->cursor = cur; - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Fixed ) - ps_parser_to_fixed( PS_Parser parser, - FT_Int power_ten ) - { - ps_parser_skip_spaces( parser ); - return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten ); - } - - - FT_LOCAL_DEF( FT_Int ) - ps_parser_to_coord_array( PS_Parser parser, - FT_Int max_coords, - FT_Short* coords ) - { - ps_parser_skip_spaces( parser ); - return ps_tocoordarray( &parser->cursor, parser->limit, - max_coords, coords ); - } - - - FT_LOCAL_DEF( FT_Int ) - ps_parser_to_fixed_array( PS_Parser parser, - FT_Int max_values, - FT_Fixed* values, - FT_Int power_ten ) - { - ps_parser_skip_spaces( parser ); - return ps_tofixedarray( &parser->cursor, parser->limit, - max_values, values, power_ten ); - } - - -#if 0 - - FT_LOCAL_DEF( FT_String* ) - T1_ToString( PS_Parser parser ) - { - return ps_tostring( &parser->cursor, parser->limit, parser->memory ); - } - - - FT_LOCAL_DEF( FT_Bool ) - T1_ToBool( PS_Parser parser ) - { - return ps_tobool( &parser->cursor, parser->limit ); - } - -#endif /* 0 */ - - - FT_LOCAL_DEF( void ) - ps_parser_init( PS_Parser parser, - FT_Byte* base, - FT_Byte* limit, - FT_Memory memory ) - { - parser->error = FT_Err_Ok; - parser->base = base; - parser->limit = limit; - parser->cursor = base; - parser->memory = memory; - parser->funcs = ps_parser_funcs; - } - - - FT_LOCAL_DEF( void ) - ps_parser_done( PS_Parser parser ) - { - FT_UNUSED( parser ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 BUILDER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* <Function> */ - /* t1_builder_init */ - /* */ - /* <Description> */ - /* Initializes a given glyph builder. */ - /* */ - /* <InOut> */ - /* builder :: A pointer to the glyph builder to initialize. */ - /* */ - /* <Input> */ - /* face :: The current face object. */ - /* */ - /* size :: The current size object. */ - /* */ - /* glyph :: The current glyph object. */ - /* */ - /* hinting :: Whether hinting should be applied. */ - /* */ - FT_LOCAL_DEF( void ) - t1_builder_init( T1_Builder builder, - FT_Face face, - FT_Size size, - FT_GlyphSlot glyph, - FT_Bool hinting ) - { - builder->parse_state = T1_Parse_Start; - builder->load_points = 1; - - builder->face = face; - builder->glyph = glyph; - builder->memory = face->memory; - - if ( glyph ) - { - FT_GlyphLoader loader = glyph->internal->loader; - - - builder->loader = loader; - builder->base = &loader->base.outline; - builder->current = &loader->current.outline; - FT_GlyphLoader_Rewind( loader ); - - builder->hints_globals = size->internal; - builder->hints_funcs = NULL; - - if ( hinting ) - builder->hints_funcs = glyph->internal->glyph_hints; - } - - builder->pos_x = 0; - builder->pos_y = 0; - - builder->left_bearing.x = 0; - builder->left_bearing.y = 0; - builder->advance.x = 0; - builder->advance.y = 0; - - builder->funcs = t1_builder_funcs; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* t1_builder_done */ - /* */ - /* <Description> */ - /* Finalizes a given glyph builder. Its contents can still be used */ - /* after the call, but the function saves important information */ - /* within the corresponding glyph slot. */ - /* */ - /* <Input> */ - /* builder :: A pointer to the glyph builder to finalize. */ - /* */ - FT_LOCAL_DEF( void ) - t1_builder_done( T1_Builder builder ) - { - FT_GlyphSlot glyph = builder->glyph; - - - if ( glyph ) - glyph->outline = *builder->base; - } - - - /* check that there is enough space for `count' more points */ - FT_LOCAL_DEF( FT_Error ) - t1_builder_check_points( T1_Builder builder, - FT_Int count ) - { - return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); - } - - - /* add a new point, do not check space */ - FT_LOCAL_DEF( void ) - t1_builder_add_point( T1_Builder builder, - FT_Pos x, - FT_Pos y, - FT_Byte flag ) - { - FT_Outline* outline = builder->current; - - - if ( builder->load_points ) - { - FT_Vector* point = outline->points + outline->n_points; - FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; - - - point->x = FIXED_TO_INT( x ); - point->y = FIXED_TO_INT( y ); - *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); - } - outline->n_points++; - } - - - /* check space for a new on-curve point, then add it */ - FT_LOCAL_DEF( FT_Error ) - t1_builder_add_point1( T1_Builder builder, - FT_Pos x, - FT_Pos y ) - { - FT_Error error; - - - error = t1_builder_check_points( builder, 1 ); - if ( !error ) - t1_builder_add_point( builder, x, y, 1 ); - - return error; - } - - - /* check space for a new contour, then add it */ - FT_LOCAL_DEF( FT_Error ) - t1_builder_add_contour( T1_Builder builder ) - { - FT_Outline* outline = builder->current; - FT_Error error; - - - /* this might happen in invalid fonts */ - if ( !outline ) - { - FT_ERROR(( "t1_builder_add_contour: no outline to add points to\n" )); - return FT_THROW( Invalid_File_Format ); - } - - if ( !builder->load_points ) - { - outline->n_contours++; - return FT_Err_Ok; - } - - error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); - if ( !error ) - { - if ( outline->n_contours > 0 ) - outline->contours[outline->n_contours - 1] = - (short)( outline->n_points - 1 ); - - outline->n_contours++; - } - - return error; - } - - - /* if a path was begun, add its first on-curve point */ - FT_LOCAL_DEF( FT_Error ) - t1_builder_start_point( T1_Builder builder, - FT_Pos x, - FT_Pos y ) - { - FT_Error error = FT_ERR( Invalid_File_Format ); - - - /* test whether we are building a new contour */ - - if ( builder->parse_state == T1_Parse_Have_Path ) - error = FT_Err_Ok; - else - { - builder->parse_state = T1_Parse_Have_Path; - error = t1_builder_add_contour( builder ); - if ( !error ) - error = t1_builder_add_point1( builder, x, y ); - } - - return error; - } - - - /* close the current contour */ - FT_LOCAL_DEF( void ) - t1_builder_close_contour( T1_Builder builder ) - { - FT_Outline* outline = builder->current; - FT_Int first; - - - if ( !outline ) - return; - - first = outline->n_contours <= 1 - ? 0 : outline->contours[outline->n_contours - 2] + 1; - - /* We must not include the last point in the path if it */ - /* is located on the first point. */ - if ( outline->n_points > 1 ) - { - FT_Vector* p1 = outline->points + first; - FT_Vector* p2 = outline->points + outline->n_points - 1; - FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; - - - /* `delete' last point only if it coincides with the first */ - /* point and it is not a control point (which can happen). */ - if ( p1->x == p2->x && p1->y == p2->y ) - if ( *control == FT_CURVE_TAG_ON ) - outline->n_points--; - } - - if ( outline->n_contours > 0 ) - { - /* Don't add contours only consisting of one point, i.e., */ - /* check whether the first and the last point is the same. */ - if ( first == outline->n_points - 1 ) - { - outline->n_contours--; - outline->n_points--; - } - else - outline->contours[outline->n_contours - 1] = - (short)( outline->n_points - 1 ); - } - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** OTHER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - t1_decrypt( FT_Byte* buffer, - FT_Offset length, - FT_UShort seed ) - { - PS_Conv_EexecDecode( &buffer, - buffer + length, - buffer, - length, - &seed ); - } - - -/* END */ diff --git a/3party/freetype/src/psaux/psobjs.h b/3party/freetype/src/psaux/psobjs.h deleted file mode 100644 index bf879c1faf..0000000000 --- a/3party/freetype/src/psaux/psobjs.h +++ /dev/null @@ -1,212 +0,0 @@ -/***************************************************************************/ -/* */ -/* psobjs.h */ -/* */ -/* Auxiliary functions for PostScript fonts (specification). */ -/* */ -/* Copyright 1996-2015 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 __PSOBJS_H__ -#define __PSOBJS_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_AUX_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1_TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_CALLBACK_TABLE - const PS_Table_FuncsRec ps_table_funcs; - - FT_CALLBACK_TABLE - const PS_Parser_FuncsRec ps_parser_funcs; - - FT_CALLBACK_TABLE - const T1_Builder_FuncsRec t1_builder_funcs; - - - FT_LOCAL( FT_Error ) - ps_table_new( PS_Table table, - FT_Int count, - FT_Memory memory ); - - FT_LOCAL( FT_Error ) - ps_table_add( PS_Table table, - FT_Int idx, - void* object, - FT_UInt length ); - - FT_LOCAL( void ) - ps_table_done( PS_Table table ); - - - FT_LOCAL( void ) - ps_table_release( PS_Table table ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 PARSER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_LOCAL( void ) - ps_parser_skip_spaces( PS_Parser parser ); - - FT_LOCAL( void ) - ps_parser_skip_PS_token( PS_Parser parser ); - - FT_LOCAL( void ) - ps_parser_to_token( PS_Parser parser, - T1_Token token ); - - FT_LOCAL( void ) - ps_parser_to_token_array( PS_Parser parser, - T1_Token tokens, - FT_UInt max_tokens, - FT_Int* pnum_tokens ); - - FT_LOCAL( FT_Error ) - ps_parser_load_field( PS_Parser parser, - const T1_Field field, - void** objects, - FT_UInt max_objects, - FT_ULong* pflags ); - - FT_LOCAL( FT_Error ) - ps_parser_load_field_table( PS_Parser parser, - const T1_Field field, - void** objects, - FT_UInt max_objects, - FT_ULong* pflags ); - - FT_LOCAL( FT_Long ) - ps_parser_to_int( PS_Parser parser ); - - - FT_LOCAL( FT_Error ) - ps_parser_to_bytes( PS_Parser parser, - FT_Byte* bytes, - FT_Offset max_bytes, - FT_ULong* pnum_bytes, - FT_Bool delimiters ); - - - FT_LOCAL( FT_Fixed ) - ps_parser_to_fixed( PS_Parser parser, - FT_Int power_ten ); - - - FT_LOCAL( FT_Int ) - ps_parser_to_coord_array( PS_Parser parser, - FT_Int max_coords, - FT_Short* coords ); - - FT_LOCAL( FT_Int ) - ps_parser_to_fixed_array( PS_Parser parser, - FT_Int max_values, - FT_Fixed* values, - FT_Int power_ten ); - - - FT_LOCAL( void ) - ps_parser_init( PS_Parser parser, - FT_Byte* base, - FT_Byte* limit, - FT_Memory memory ); - - FT_LOCAL( void ) - ps_parser_done( PS_Parser parser ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 BUILDER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - t1_builder_init( T1_Builder builder, - FT_Face face, - FT_Size size, - FT_GlyphSlot glyph, - FT_Bool hinting ); - - FT_LOCAL( void ) - t1_builder_done( T1_Builder builder ); - - FT_LOCAL( FT_Error ) - t1_builder_check_points( T1_Builder builder, - FT_Int count ); - - FT_LOCAL( void ) - t1_builder_add_point( T1_Builder builder, - FT_Pos x, - FT_Pos y, - FT_Byte flag ); - - FT_LOCAL( FT_Error ) - t1_builder_add_point1( T1_Builder builder, - FT_Pos x, - FT_Pos y ); - - FT_LOCAL( FT_Error ) - t1_builder_add_contour( T1_Builder builder ); - - - FT_LOCAL( FT_Error ) - t1_builder_start_point( T1_Builder builder, - FT_Pos x, - FT_Pos y ); - - - FT_LOCAL( void ) - t1_builder_close_contour( T1_Builder builder ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** OTHER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - t1_decrypt( FT_Byte* buffer, - FT_Offset length, - FT_UShort seed ); - - -FT_END_HEADER - -#endif /* __PSOBJS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/psaux/rules.mk b/3party/freetype/src/psaux/rules.mk deleted file mode 100644 index 0d2118c014..0000000000 --- a/3party/freetype/src/psaux/rules.mk +++ /dev/null @@ -1,76 +0,0 @@ -# -# FreeType 2 PSaux driver configuration rules -# - - -# Copyright 1996-2015 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. - - -# PSAUX driver directory -# -PSAUX_DIR := $(SRC_DIR)/psaux - - -# compilation flags for the driver -# -PSAUX_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(PSAUX_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# PSAUX driver sources (i.e., C files) -# -PSAUX_DRV_SRC := $(PSAUX_DIR)/psobjs.c \ - $(PSAUX_DIR)/t1decode.c \ - $(PSAUX_DIR)/t1cmap.c \ - $(PSAUX_DIR)/afmparse.c \ - $(PSAUX_DIR)/psconv.c \ - $(PSAUX_DIR)/psauxmod.c - -# PSAUX driver headers -# -PSAUX_DRV_H := $(PSAUX_DRV_SRC:%c=%h) \ - $(PSAUX_DIR)/psauxerr.h - - -# PSAUX driver object(s) -# -# PSAUX_DRV_OBJ_M is used during `multi' builds. -# PSAUX_DRV_OBJ_S is used during `single' builds. -# -PSAUX_DRV_OBJ_M := $(PSAUX_DRV_SRC:$(PSAUX_DIR)/%.c=$(OBJ_DIR)/%.$O) -PSAUX_DRV_OBJ_S := $(OBJ_DIR)/psaux.$O - -# PSAUX driver source file for single build -# -PSAUX_DRV_SRC_S := $(PSAUX_DIR)/psaux.c - - -# PSAUX driver - single object -# -$(PSAUX_DRV_OBJ_S): $(PSAUX_DRV_SRC_S) $(PSAUX_DRV_SRC) \ - $(FREETYPE_H) $(PSAUX_DRV_H) - $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSAUX_DRV_SRC_S)) - - -# PSAUX driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(PSAUX_DIR)/%.c $(FREETYPE_H) $(PSAUX_DRV_H) - $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(PSAUX_DRV_OBJ_S) -DRV_OBJS_M += $(PSAUX_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/psaux/t1cmap.c b/3party/freetype/src/psaux/t1cmap.c deleted file mode 100644 index 2e2d433fc4..0000000000 --- a/3party/freetype/src/psaux/t1cmap.c +++ /dev/null @@ -1,355 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1cmap.c */ -/* */ -/* Type 1 character map support (body). */ -/* */ -/* Copyright 2002-2015 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 "t1cmap.h" - -#include FT_INTERNAL_DEBUG_H - -#include "psauxerr.h" - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - t1_cmap_std_init( T1_CMapStd cmap, - FT_Int is_expert ) - { - T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; - - - cmap->num_glyphs = (FT_UInt)face->type1.num_glyphs; - cmap->glyph_names = (const char* const*)face->type1.glyph_names; - cmap->sid_to_string = psnames->adobe_std_strings; - cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding - : psnames->adobe_std_encoding; - - FT_ASSERT( cmap->code_to_sid != NULL ); - } - - - FT_CALLBACK_DEF( void ) - t1_cmap_std_done( T1_CMapStd cmap ) - { - cmap->num_glyphs = 0; - cmap->glyph_names = NULL; - cmap->sid_to_string = NULL; - cmap->code_to_sid = NULL; - } - - - FT_CALLBACK_DEF( FT_UInt ) - t1_cmap_std_char_index( T1_CMapStd cmap, - FT_UInt32 char_code ) - { - FT_UInt result = 0; - - - if ( char_code < 256 ) - { - FT_UInt code, n; - const char* glyph_name; - - - /* convert character code to Adobe SID string */ - code = cmap->code_to_sid[char_code]; - glyph_name = cmap->sid_to_string( code ); - - /* look for the corresponding glyph name */ - for ( n = 0; n < cmap->num_glyphs; n++ ) - { - const char* gname = cmap->glyph_names[n]; - - - if ( gname && gname[0] == glyph_name[0] && - ft_strcmp( gname, glyph_name ) == 0 ) - { - result = n; - break; - } - } - } - - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - t1_cmap_std_char_next( T1_CMapStd cmap, - FT_UInt32 *pchar_code ) - { - FT_UInt result = 0; - FT_UInt32 char_code = *pchar_code + 1; - - - while ( char_code < 256 ) - { - result = t1_cmap_std_char_index( cmap, char_code ); - if ( result != 0 ) - goto Exit; - - char_code++; - } - char_code = 0; - - Exit: - *pchar_code = char_code; - return result; - } - - - FT_CALLBACK_DEF( FT_Error ) - t1_cmap_standard_init( T1_CMapStd cmap, - FT_Pointer pointer ) - { - FT_UNUSED( pointer ); - - - t1_cmap_std_init( cmap, 0 ); - return 0; - } - - - FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec - t1_cmap_standard_class_rec = - { - sizeof ( T1_CMapStdRec ), - - (FT_CMap_InitFunc) t1_cmap_standard_init, - (FT_CMap_DoneFunc) t1_cmap_std_done, - (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, - (FT_CMap_CharNextFunc) t1_cmap_std_char_next, - - NULL, NULL, NULL, NULL, NULL - }; - - - FT_CALLBACK_DEF( FT_Error ) - t1_cmap_expert_init( T1_CMapStd cmap, - FT_Pointer pointer ) - { - FT_UNUSED( pointer ); - - - t1_cmap_std_init( cmap, 1 ); - return 0; - } - - FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec - t1_cmap_expert_class_rec = - { - sizeof ( T1_CMapStdRec ), - - (FT_CMap_InitFunc) t1_cmap_expert_init, - (FT_CMap_DoneFunc) t1_cmap_std_done, - (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, - (FT_CMap_CharNextFunc) t1_cmap_std_char_next, - - NULL, NULL, NULL, NULL, NULL - }; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 CUSTOM ENCODING CMAP *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_CALLBACK_DEF( FT_Error ) - t1_cmap_custom_init( T1_CMapCustom cmap, - FT_Pointer pointer ) - { - T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); - T1_Encoding encoding = &face->type1.encoding; - - FT_UNUSED( pointer ); - - - cmap->first = (FT_UInt)encoding->code_first; - cmap->count = (FT_UInt)encoding->code_last - cmap->first; - cmap->indices = encoding->char_index; - - FT_ASSERT( cmap->indices != NULL ); - FT_ASSERT( encoding->code_first <= encoding->code_last ); - - return 0; - } - - - FT_CALLBACK_DEF( void ) - t1_cmap_custom_done( T1_CMapCustom cmap ) - { - cmap->indices = NULL; - cmap->first = 0; - cmap->count = 0; - } - - - FT_CALLBACK_DEF( FT_UInt ) - t1_cmap_custom_char_index( T1_CMapCustom cmap, - FT_UInt32 char_code ) - { - FT_UInt result = 0; - - - if ( ( char_code >= cmap->first ) && - ( char_code < ( cmap->first + cmap->count ) ) ) - result = cmap->indices[char_code]; - - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - t1_cmap_custom_char_next( T1_CMapCustom cmap, - FT_UInt32 *pchar_code ) - { - FT_UInt result = 0; - FT_UInt32 char_code = *pchar_code; - - - ++char_code; - - if ( char_code < cmap->first ) - char_code = cmap->first; - - for ( ; char_code < ( cmap->first + cmap->count ); char_code++ ) - { - result = cmap->indices[char_code]; - if ( result != 0 ) - goto Exit; - } - - char_code = 0; - - Exit: - *pchar_code = char_code; - return result; - } - - - FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec - t1_cmap_custom_class_rec = - { - sizeof ( T1_CMapCustomRec ), - - (FT_CMap_InitFunc) t1_cmap_custom_init, - (FT_CMap_DoneFunc) t1_cmap_custom_done, - (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index, - (FT_CMap_CharNextFunc) t1_cmap_custom_char_next, - - NULL, NULL, NULL, NULL, NULL - }; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_CALLBACK_DEF( const char * ) - psaux_get_glyph_name( T1_Face face, - FT_UInt idx ) - { - return face->type1.glyph_names[idx]; - } - - - FT_CALLBACK_DEF( FT_Error ) - t1_cmap_unicode_init( PS_Unicodes unicodes, - FT_Pointer pointer ) - { - T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; - - FT_UNUSED( pointer ); - - - return psnames->unicodes_init( memory, - unicodes, - (FT_UInt)face->type1.num_glyphs, - (PS_GetGlyphNameFunc)&psaux_get_glyph_name, - (PS_FreeGlyphNameFunc)NULL, - (FT_Pointer)face ); - } - - - FT_CALLBACK_DEF( void ) - t1_cmap_unicode_done( PS_Unicodes unicodes ) - { - FT_Face face = FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); - - - FT_FREE( unicodes->maps ); - unicodes->num_maps = 0; - } - - - FT_CALLBACK_DEF( FT_UInt ) - t1_cmap_unicode_char_index( PS_Unicodes unicodes, - FT_UInt32 char_code ) - { - T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; - - - return psnames->unicodes_char_index( unicodes, char_code ); - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - t1_cmap_unicode_char_next( PS_Unicodes unicodes, - FT_UInt32 *pchar_code ) - { - T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; - - - return psnames->unicodes_char_next( unicodes, pchar_code ); - } - - - FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec - t1_cmap_unicode_class_rec = - { - sizeof ( PS_UnicodesRec ), - - (FT_CMap_InitFunc) t1_cmap_unicode_init, - (FT_CMap_DoneFunc) t1_cmap_unicode_done, - (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index, - (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next, - - NULL, NULL, NULL, NULL, NULL - }; - - -/* END */ diff --git a/3party/freetype/src/psaux/t1cmap.h b/3party/freetype/src/psaux/t1cmap.h deleted file mode 100644 index b8ba06cc3b..0000000000 --- a/3party/freetype/src/psaux/t1cmap.h +++ /dev/null @@ -1,105 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1cmap.h */ -/* */ -/* Type 1 character map support (specification). */ -/* */ -/* Copyright 2002-2015 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 __T1CMAP_H__ -#define __T1CMAP_H__ - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_TYPE1_TYPES_H - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* standard (and expert) encoding cmaps */ - typedef struct T1_CMapStdRec_* T1_CMapStd; - - typedef struct T1_CMapStdRec_ - { - FT_CMapRec cmap; - - const FT_UShort* code_to_sid; - PS_Adobe_Std_StringsFunc sid_to_string; - - FT_UInt num_glyphs; - const char* const* glyph_names; - - } T1_CMapStdRec; - - - FT_CALLBACK_TABLE const FT_CMap_ClassRec - t1_cmap_standard_class_rec; - - FT_CALLBACK_TABLE const FT_CMap_ClassRec - t1_cmap_expert_class_rec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 CUSTOM ENCODING CMAP *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct T1_CMapCustomRec_* T1_CMapCustom; - - typedef struct T1_CMapCustomRec_ - { - FT_CMapRec cmap; - FT_UInt first; - FT_UInt count; - FT_UShort* indices; - - } T1_CMapCustomRec; - - - FT_CALLBACK_TABLE const FT_CMap_ClassRec - t1_cmap_custom_class_rec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* unicode (synthetic) cmaps */ - - FT_CALLBACK_TABLE const FT_CMap_ClassRec - t1_cmap_unicode_class_rec; - - /* */ - - -FT_END_HEADER - -#endif /* __T1CMAP_H__ */ - - -/* END */ diff --git a/3party/freetype/src/psaux/t1decode.c b/3party/freetype/src/psaux/t1decode.c deleted file mode 100644 index 2e199286f6..0000000000 --- a/3party/freetype/src/psaux/t1decode.c +++ /dev/null @@ -1,1624 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1decode.c */ -/* */ -/* PostScript Type 1 decoding routines (body). */ -/* */ -/* Copyright 2000-2015 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 <ft2build.h> -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H -#include FT_OUTLINE_H - -#include "t1decode.h" -#include "psobjs.h" - -#include "psauxerr.h" - -/* ensure proper sign extension */ -#define Fix2Int( f ) ( (FT_Int)(FT_Short)( (f) >> 16 ) ) - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_t1decode - - - typedef enum T1_Operator_ - { - op_none = 0, - op_endchar, - op_hsbw, - op_seac, - op_sbw, - op_closepath, - op_hlineto, - op_hmoveto, - op_hvcurveto, - op_rlineto, - op_rmoveto, - op_rrcurveto, - op_vhcurveto, - op_vlineto, - op_vmoveto, - op_dotsection, - op_hstem, - op_hstem3, - op_vstem, - op_vstem3, - op_div, - op_callothersubr, - op_callsubr, - op_pop, - op_return, - op_setcurrentpoint, - op_unknown15, - - op_max /* never remove this one */ - - } T1_Operator; - - - static - const FT_Int t1_args_count[op_max] = - { - 0, /* none */ - 0, /* endchar */ - 2, /* hsbw */ - 5, /* seac */ - 4, /* sbw */ - 0, /* closepath */ - 1, /* hlineto */ - 1, /* hmoveto */ - 4, /* hvcurveto */ - 2, /* rlineto */ - 2, /* rmoveto */ - 6, /* rrcurveto */ - 4, /* vhcurveto */ - 1, /* vlineto */ - 1, /* vmoveto */ - 0, /* dotsection */ - 2, /* hstem */ - 6, /* hstem3 */ - 2, /* vstem */ - 6, /* vstem3 */ - 2, /* div */ - -1, /* callothersubr */ - 1, /* callsubr */ - 0, /* pop */ - 0, /* return */ - 2, /* setcurrentpoint */ - 2 /* opcode 15 (undocumented and obsolete) */ - }; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* t1_lookup_glyph_by_stdcharcode */ - /* */ - /* <Description> */ - /* Looks up a given glyph by its StandardEncoding charcode. Used to */ - /* implement the SEAC Type 1 operator. */ - /* */ - /* <Input> */ - /* face :: The current face object. */ - /* */ - /* charcode :: The character code to look for. */ - /* */ - /* <Return> */ - /* A glyph index in the font face. Returns -1 if the corresponding */ - /* glyph wasn't found. */ - /* */ - static FT_Int - t1_lookup_glyph_by_stdcharcode( T1_Decoder decoder, - FT_Int charcode ) - { - FT_UInt n; - const FT_String* glyph_name; - FT_Service_PsCMaps psnames = decoder->psnames; - - - /* check range of standard char code */ - if ( charcode < 0 || charcode > 255 ) - return -1; - - glyph_name = psnames->adobe_std_strings( - psnames->adobe_std_encoding[charcode]); - - for ( n = 0; n < decoder->num_glyphs; n++ ) - { - FT_String* name = (FT_String*)decoder->glyph_names[n]; - - - if ( name && - name[0] == glyph_name[0] && - ft_strcmp( name, glyph_name ) == 0 ) - return (FT_Int)n; - } - - return -1; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* t1operator_seac */ - /* */ - /* <Description> */ - /* Implements the `seac' Type 1 operator for a Type 1 decoder. */ - /* */ - /* <Input> */ - /* decoder :: The current CID decoder. */ - /* */ - /* asb :: The accent's side bearing. */ - /* */ - /* adx :: The horizontal offset of the accent. */ - /* */ - /* ady :: The vertical offset of the accent. */ - /* */ - /* bchar :: The base character's StandardEncoding charcode. */ - /* */ - /* achar :: The accent character's StandardEncoding charcode. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - t1operator_seac( T1_Decoder decoder, - FT_Pos asb, - FT_Pos adx, - FT_Pos ady, - FT_Int bchar, - FT_Int achar ) - { - FT_Error error; - FT_Int bchar_index, achar_index; -#if 0 - FT_Int n_base_points; - FT_Outline* base = decoder->builder.base; -#endif - FT_Vector left_bearing, advance; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - T1_Face face = (T1_Face)decoder->builder.face; -#endif - - - if ( decoder->seac ) - { - FT_ERROR(( "t1operator_seac: invalid nested seac\n" )); - return FT_THROW( Syntax_Error ); - } - - if ( decoder->builder.metrics_only ) - { - FT_ERROR(( "t1operator_seac: unexpected seac\n" )); - return FT_THROW( Syntax_Error ); - } - - /* seac weirdness */ - adx += decoder->builder.left_bearing.x; - - /* `glyph_names' is set to 0 for CID fonts which do not */ - /* include an encoding. How can we deal with these? */ -#ifdef FT_CONFIG_OPTION_INCREMENTAL - if ( decoder->glyph_names == 0 && - !face->root.internal->incremental_interface ) -#else - if ( decoder->glyph_names == 0 ) -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - { - FT_ERROR(( "t1operator_seac:" - " glyph names table not available in this font\n" )); - return FT_THROW( Syntax_Error ); - } - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - if ( face->root.internal->incremental_interface ) - { - /* the caller must handle the font encoding also */ - bchar_index = bchar; - achar_index = achar; - } - else -#endif - { - bchar_index = t1_lookup_glyph_by_stdcharcode( decoder, bchar ); - achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar ); - } - - if ( bchar_index < 0 || achar_index < 0 ) - { - FT_ERROR(( "t1operator_seac:" - " invalid seac character code arguments\n" )); - return FT_THROW( Syntax_Error ); - } - - /* if we are trying to load a composite glyph, do not load the */ - /* accent character and return the array of subglyphs. */ - if ( decoder->builder.no_recurse ) - { - FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph; - FT_GlyphLoader loader = glyph->internal->loader; - FT_SubGlyph subg; - - - /* reallocate subglyph array if necessary */ - error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); - if ( error ) - goto Exit; - - subg = loader->current.subglyphs; - - /* subglyph 0 = base character */ - subg->index = bchar_index; - subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | - FT_SUBGLYPH_FLAG_USE_MY_METRICS; - subg->arg1 = 0; - subg->arg2 = 0; - subg++; - - /* subglyph 1 = accent character */ - subg->index = achar_index; - subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; - subg->arg1 = (FT_Int)FIXED_TO_INT( adx - asb ); - subg->arg2 = (FT_Int)FIXED_TO_INT( ady ); - - /* set up remaining glyph fields */ - glyph->num_subglyphs = 2; - glyph->subglyphs = loader->base.subglyphs; - glyph->format = FT_GLYPH_FORMAT_COMPOSITE; - - loader->current.num_subglyphs = 2; - goto Exit; - } - - /* First load `bchar' in builder */ - /* now load the unscaled outline */ - - FT_GlyphLoader_Prepare( decoder->builder.loader ); /* prepare loader */ - - /* the seac operator must not be nested */ - decoder->seac = TRUE; - error = t1_decoder_parse_glyph( decoder, (FT_UInt)bchar_index ); - decoder->seac = FALSE; - if ( error ) - goto Exit; - - /* save the left bearing and width of the base character */ - /* as they will be erased by the next load. */ - - left_bearing = decoder->builder.left_bearing; - advance = decoder->builder.advance; - - decoder->builder.left_bearing.x = 0; - decoder->builder.left_bearing.y = 0; - - decoder->builder.pos_x = adx - asb; - decoder->builder.pos_y = ady; - - /* Now load `achar' on top of */ - /* the base outline */ - - /* the seac operator must not be nested */ - decoder->seac = TRUE; - error = t1_decoder_parse_glyph( decoder, (FT_UInt)achar_index ); - decoder->seac = FALSE; - if ( error ) - goto Exit; - - /* restore the left side bearing and */ - /* advance width of the base character */ - - decoder->builder.left_bearing = left_bearing; - decoder->builder.advance = advance; - - decoder->builder.pos_x = 0; - decoder->builder.pos_y = 0; - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* t1_decoder_parse_charstrings */ - /* */ - /* <Description> */ - /* Parses a given Type 1 charstrings program. */ - /* */ - /* <Input> */ - /* decoder :: The current Type 1 decoder. */ - /* */ - /* charstring_base :: The base address of the charstring stream. */ - /* */ - /* charstring_len :: The length in bytes of the charstring stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - t1_decoder_parse_charstrings( T1_Decoder decoder, - FT_Byte* charstring_base, - FT_UInt charstring_len ) - { - FT_Error error; - T1_Decoder_Zone zone; - FT_Byte* ip; - FT_Byte* limit; - T1_Builder builder = &decoder->builder; - FT_Pos x, y, orig_x, orig_y; - FT_Int known_othersubr_result_cnt = 0; - FT_Int unknown_othersubr_result_cnt = 0; - FT_Bool large_int; - FT_Fixed seed; - - T1_Hints_Funcs hinter; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_Bool bol = TRUE; -#endif - - - /* compute random seed from stack address of parameter */ - seed = (FT_Fixed)( ( (FT_Offset)(char*)&seed ^ - (FT_Offset)(char*)&decoder ^ - (FT_Offset)(char*)&charstring_base ) & - FT_ULONG_MAX ); - seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL; - if ( seed == 0 ) - seed = 0x7384; - - /* First of all, initialize the decoder */ - decoder->top = decoder->stack; - decoder->zone = decoder->zones; - zone = decoder->zones; - - builder->parse_state = T1_Parse_Start; - - hinter = (T1_Hints_Funcs)builder->hints_funcs; - - /* a font that reads BuildCharArray without setting */ - /* its values first is buggy, but ... */ - FT_ASSERT( ( decoder->len_buildchar == 0 ) == - ( decoder->buildchar == NULL ) ); - - if ( decoder->buildchar && decoder->len_buildchar > 0 ) - ft_memset( &decoder->buildchar[0], - 0, - sizeof ( decoder->buildchar[0] ) * decoder->len_buildchar ); - - FT_TRACE4(( "\n" - "Start charstring\n" )); - - zone->base = charstring_base; - limit = zone->limit = charstring_base + charstring_len; - ip = zone->cursor = zone->base; - - error = FT_Err_Ok; - - x = orig_x = builder->pos_x; - y = orig_y = builder->pos_y; - - /* begin hints recording session, if any */ - if ( hinter ) - hinter->open( hinter->hints ); - - large_int = FALSE; - - /* now, execute loop */ - while ( ip < limit ) - { - FT_Long* top = decoder->top; - T1_Operator op = op_none; - FT_Int32 value = 0; - - - FT_ASSERT( known_othersubr_result_cnt == 0 || - unknown_othersubr_result_cnt == 0 ); - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( bol ) - { - FT_TRACE5(( " (%d)", decoder->top - decoder->stack )); - bol = FALSE; - } -#endif - - /*********************************************************************/ - /* */ - /* Decode operator or operand */ - /* */ - /* */ - - /* first of all, decompress operator or value */ - switch ( *ip++ ) - { - case 1: - op = op_hstem; - break; - - case 3: - op = op_vstem; - break; - case 4: - op = op_vmoveto; - break; - case 5: - op = op_rlineto; - break; - case 6: - op = op_hlineto; - break; - case 7: - op = op_vlineto; - break; - case 8: - op = op_rrcurveto; - break; - case 9: - op = op_closepath; - break; - case 10: - op = op_callsubr; - break; - case 11: - op = op_return; - break; - - case 13: - op = op_hsbw; - break; - case 14: - op = op_endchar; - break; - - case 15: /* undocumented, obsolete operator */ - op = op_unknown15; - break; - - case 21: - op = op_rmoveto; - break; - case 22: - op = op_hmoveto; - break; - - case 30: - op = op_vhcurveto; - break; - case 31: - op = op_hvcurveto; - break; - - case 12: - if ( ip > limit ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " invalid escape (12+EOF)\n" )); - goto Syntax_Error; - } - - switch ( *ip++ ) - { - case 0: - op = op_dotsection; - break; - case 1: - op = op_vstem3; - break; - case 2: - op = op_hstem3; - break; - case 6: - op = op_seac; - break; - case 7: - op = op_sbw; - break; - case 12: - op = op_div; - break; - case 16: - op = op_callothersubr; - break; - case 17: - op = op_pop; - break; - case 33: - op = op_setcurrentpoint; - break; - - default: - FT_ERROR(( "t1_decoder_parse_charstrings:" - " invalid escape (12+%d)\n", - ip[-1] )); - goto Syntax_Error; - } - break; - - case 255: /* four bytes integer */ - if ( ip + 4 > limit ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unexpected EOF in integer\n" )); - goto Syntax_Error; - } - - value = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) | - ( (FT_UInt32)ip[1] << 16 ) | - ( (FT_UInt32)ip[2] << 8 ) | - (FT_UInt32)ip[3] ); - ip += 4; - - /* According to the specification, values > 32000 or < -32000 must */ - /* be followed by a `div' operator to make the result be in the */ - /* range [-32000;32000]. We expect that the second argument of */ - /* `div' is not a large number. Additionally, we don't handle */ - /* stuff like `<large1> <large2> <num> div <num> div' or */ - /* <large1> <large2> <num> div div'. This is probably not allowed */ - /* anyway. */ - if ( value > 32000 || value < -32000 ) - { - if ( large_int ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " no `div' after large integer\n" )); - } - else - large_int = TRUE; - } - else - { - if ( !large_int ) - value = (FT_Int32)( (FT_UInt32)value << 16 ); - } - - break; - - default: - if ( ip[-1] >= 32 ) - { - if ( ip[-1] < 247 ) - value = (FT_Int32)ip[-1] - 139; - else - { - if ( ++ip > limit ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unexpected EOF in integer\n" )); - goto Syntax_Error; - } - - if ( ip[-2] < 251 ) - value = ( ( ip[-2] - 247 ) * 256 ) + ip[-1] + 108; - else - value = -( ( ( ip[-2] - 251 ) * 256 ) + ip[-1] + 108 ); - } - - if ( !large_int ) - value = (FT_Int32)( (FT_UInt32)value << 16 ); - } - else - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " invalid byte (%d)\n", ip[-1] )); - goto Syntax_Error; - } - } - - if ( unknown_othersubr_result_cnt > 0 ) - { - switch ( op ) - { - case op_callsubr: - case op_return: - case op_none: - case op_pop: - break; - - default: - /* all operands have been transferred by previous pops */ - unknown_othersubr_result_cnt = 0; - break; - } - } - - if ( large_int && !( op == op_none || op == op_div ) ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " no `div' after large integer\n" )); - - large_int = FALSE; - } - - /*********************************************************************/ - /* */ - /* Push value on stack, or process operator */ - /* */ - /* */ - if ( op == op_none ) - { - if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS ) - { - FT_ERROR(( "t1_decoder_parse_charstrings: stack overflow\n" )); - goto Syntax_Error; - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( large_int ) - FT_TRACE4(( " %ld", value )); - else - FT_TRACE4(( " %ld", Fix2Int( value ) )); -#endif - - *top++ = value; - decoder->top = top; - } - else if ( op == op_callothersubr ) /* callothersubr */ - { - FT_Int subr_no; - FT_Int arg_cnt; - - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( " callothersubr\n" )); - bol = TRUE; -#endif - - if ( top - decoder->stack < 2 ) - goto Stack_Underflow; - - top -= 2; - - subr_no = Fix2Int( top[1] ); - arg_cnt = Fix2Int( top[0] ); - - /***********************************************************/ - /* */ - /* remove all operands to callothersubr from the stack */ - /* */ - /* for handled othersubrs, where we know the number of */ - /* arguments, we increase the stack by the value of */ - /* known_othersubr_result_cnt */ - /* */ - /* for unhandled othersubrs the following pops adjust the */ - /* stack pointer as necessary */ - - if ( arg_cnt > top - decoder->stack ) - goto Stack_Underflow; - - top -= arg_cnt; - - known_othersubr_result_cnt = 0; - unknown_othersubr_result_cnt = 0; - - /* XXX TODO: The checks to `arg_count == <whatever>' */ - /* might not be correct; an othersubr expects a certain */ - /* number of operands on the PostScript stack (as opposed */ - /* to the T1 stack) but it doesn't have to put them there */ - /* by itself; previous othersubrs might have left the */ - /* operands there if they were not followed by an */ - /* appropriate number of pops */ - /* */ - /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */ - /* accept a font that contains charstrings like */ - /* */ - /* 100 200 2 20 callothersubr */ - /* 300 1 20 callothersubr pop */ - /* */ - /* Perhaps this is the reason why BuildCharArray exists. */ - - switch ( subr_no ) - { - case 0: /* end flex feature */ - if ( arg_cnt != 3 ) - goto Unexpected_OtherSubr; - - if ( decoder->flex_state == 0 || - decoder->num_flex_vectors != 7 ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unexpected flex end\n" )); - goto Syntax_Error; - } - - /* the two `results' are popped by the following setcurrentpoint */ - top[0] = x; - top[1] = y; - known_othersubr_result_cnt = 2; - break; - - case 1: /* start flex feature */ - if ( arg_cnt != 0 ) - goto Unexpected_OtherSubr; - - decoder->flex_state = 1; - decoder->num_flex_vectors = 0; - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok || - ( error = t1_builder_check_points( builder, 6 ) ) - != FT_Err_Ok ) - goto Fail; - break; - - case 2: /* add flex vectors */ - { - FT_Int idx; - - - if ( arg_cnt != 0 ) - goto Unexpected_OtherSubr; - - if ( decoder->flex_state == 0 ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " missing flex start\n" )); - goto Syntax_Error; - } - - /* note that we should not add a point for index 0; */ - /* this will move our current position to the flex */ - /* point without adding any point to the outline */ - idx = decoder->num_flex_vectors++; - if ( idx > 0 && idx < 7 ) - t1_builder_add_point( builder, - x, - y, - (FT_Byte)( idx == 3 || idx == 6 ) ); - } - break; - - case 3: /* change hints */ - if ( arg_cnt != 1 ) - goto Unexpected_OtherSubr; - - known_othersubr_result_cnt = 1; - - if ( hinter ) - hinter->reset( hinter->hints, - (FT_UInt)builder->current->n_points ); - break; - - case 12: - case 13: - /* counter control hints, clear stack */ - top = decoder->stack; - break; - - case 14: - case 15: - case 16: - case 17: - case 18: /* multiple masters */ - { - PS_Blend blend = decoder->blend; - FT_UInt num_points, nn, mm; - FT_Long* delta; - FT_Long* values; - - - if ( !blend ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unexpected multiple masters operator\n" )); - goto Syntax_Error; - } - - num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 ); - if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " incorrect number of multiple masters arguments\n" )); - goto Syntax_Error; - } - - /* We want to compute */ - /* */ - /* a0*w0 + a1*w1 + ... + ak*wk */ - /* */ - /* but we only have a0, a1-a0, a2-a0, ..., ak-a0. */ - /* */ - /* However, given that w0 + w1 + ... + wk == 1, we can */ - /* rewrite it easily as */ - /* */ - /* a0 + (a1-a0)*w1 + (a2-a0)*w2 + ... + (ak-a0)*wk */ - /* */ - /* where k == num_designs-1. */ - /* */ - /* I guess that's why it's written in this `compact' */ - /* form. */ - /* */ - delta = top + num_points; - values = top; - for ( nn = 0; nn < num_points; nn++ ) - { - FT_Long tmp = values[0]; - - - for ( mm = 1; mm < blend->num_designs; mm++ ) - tmp += FT_MulFix( *delta++, blend->weight_vector[mm] ); - - *values++ = tmp; - } - - known_othersubr_result_cnt = (FT_Int)num_points; - break; - } - - case 19: - /* <idx> 1 19 callothersubr */ - /* => replace elements starting from index cvi( <idx> ) */ - /* of BuildCharArray with WeightVector */ - { - FT_Int idx; - PS_Blend blend = decoder->blend; - - - if ( arg_cnt != 1 || blend == NULL ) - goto Unexpected_OtherSubr; - - idx = Fix2Int( top[0] ); - - if ( idx < 0 || - (FT_UInt)idx + blend->num_designs > decoder->len_buildchar ) - goto Unexpected_OtherSubr; - - ft_memcpy( &decoder->buildchar[idx], - blend->weight_vector, - blend->num_designs * - sizeof ( blend->weight_vector[0] ) ); - } - break; - - case 20: - /* <arg1> <arg2> 2 20 callothersubr pop */ - /* ==> push <arg1> + <arg2> onto T1 stack */ - if ( arg_cnt != 2 ) - goto Unexpected_OtherSubr; - - top[0] += top[1]; /* XXX (over|under)flow */ - - known_othersubr_result_cnt = 1; - break; - - case 21: - /* <arg1> <arg2> 2 21 callothersubr pop */ - /* ==> push <arg1> - <arg2> onto T1 stack */ - if ( arg_cnt != 2 ) - goto Unexpected_OtherSubr; - - top[0] -= top[1]; /* XXX (over|under)flow */ - - known_othersubr_result_cnt = 1; - break; - - case 22: - /* <arg1> <arg2> 2 22 callothersubr pop */ - /* ==> push <arg1> * <arg2> onto T1 stack */ - if ( arg_cnt != 2 ) - goto Unexpected_OtherSubr; - - top[0] = FT_MulFix( top[0], top[1] ); - - known_othersubr_result_cnt = 1; - break; - - case 23: - /* <arg1> <arg2> 2 23 callothersubr pop */ - /* ==> push <arg1> / <arg2> onto T1 stack */ - if ( arg_cnt != 2 || top[1] == 0 ) - goto Unexpected_OtherSubr; - - top[0] = FT_DivFix( top[0], top[1] ); - - known_othersubr_result_cnt = 1; - break; - - case 24: - /* <val> <idx> 2 24 callothersubr */ - /* ==> set BuildCharArray[cvi( <idx> )] = <val> */ - { - FT_Int idx; - PS_Blend blend = decoder->blend; - - - if ( arg_cnt != 2 || blend == NULL ) - goto Unexpected_OtherSubr; - - idx = Fix2Int( top[1] ); - - if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) - goto Unexpected_OtherSubr; - - decoder->buildchar[idx] = top[0]; - } - break; - - case 25: - /* <idx> 1 25 callothersubr pop */ - /* ==> push BuildCharArray[cvi( idx )] */ - /* onto T1 stack */ - { - FT_Int idx; - PS_Blend blend = decoder->blend; - - - if ( arg_cnt != 1 || blend == NULL ) - goto Unexpected_OtherSubr; - - idx = Fix2Int( top[0] ); - - if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) - goto Unexpected_OtherSubr; - - top[0] = decoder->buildchar[idx]; - } - - known_othersubr_result_cnt = 1; - break; - -#if 0 - case 26: - /* <val> mark <idx> ==> set BuildCharArray[cvi( <idx> )] = <val>, */ - /* leave mark on T1 stack */ - /* <val> <idx> ==> set BuildCharArray[cvi( <idx> )] = <val> */ - XXX which routine has left its mark on the (PostScript) stack?; - break; -#endif - - case 27: - /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */ - /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */ - /* otherwise push <res2> */ - if ( arg_cnt != 4 ) - goto Unexpected_OtherSubr; - - if ( top[2] > top[3] ) - top[0] = top[1]; - - known_othersubr_result_cnt = 1; - break; - - case 28: - /* 0 28 callothersubr pop */ - /* => push random value from interval [0, 1) onto stack */ - if ( arg_cnt != 0 ) - goto Unexpected_OtherSubr; - - { - FT_Fixed Rand; - - - Rand = seed; - if ( Rand >= 0x8000L ) - Rand++; - - top[0] = Rand; - - seed = FT_MulFix( seed, 0x10000L - seed ); - if ( seed == 0 ) - seed += 0x2873; - } - - known_othersubr_result_cnt = 1; - break; - - default: - if ( arg_cnt >= 0 && subr_no >= 0 ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unknown othersubr [%d %d], wish me luck\n", - arg_cnt, subr_no )); - unknown_othersubr_result_cnt = arg_cnt; - break; - } - /* fall through */ - - Unexpected_OtherSubr: - FT_ERROR(( "t1_decoder_parse_charstrings:" - " invalid othersubr [%d %d]\n", arg_cnt, subr_no )); - goto Syntax_Error; - } - - top += known_othersubr_result_cnt; - - decoder->top = top; - } - else /* general operator */ - { - FT_Int num_args = t1_args_count[op]; - - - FT_ASSERT( num_args >= 0 ); - - if ( top - decoder->stack < num_args ) - goto Stack_Underflow; - - /* XXX Operators usually take their operands from the */ - /* bottom of the stack, i.e., the operands are */ - /* decoder->stack[0], ..., decoder->stack[num_args - 1]; */ - /* only div, callsubr, and callothersubr are different. */ - /* In practice it doesn't matter (?). */ - -#ifdef FT_DEBUG_LEVEL_TRACE - - switch ( op ) - { - case op_callsubr: - case op_div: - case op_callothersubr: - case op_pop: - case op_return: - break; - - default: - if ( top - decoder->stack != num_args ) - FT_TRACE0(( "t1_decoder_parse_charstrings:" - " too much operands on the stack" - " (seen %d, expected %d)\n", - top - decoder->stack, num_args )); - break; - } - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - top -= num_args; - - switch ( op ) - { - case op_endchar: - FT_TRACE4(( " endchar\n" )); - - t1_builder_close_contour( builder ); - - /* close hints recording session */ - if ( hinter ) - { - if ( hinter->close( hinter->hints, - (FT_UInt)builder->current->n_points ) ) - goto Syntax_Error; - - /* apply hints to the loaded glyph outline now */ - error = hinter->apply( hinter->hints, - builder->current, - (PSH_Globals)builder->hints_globals, - decoder->hint_mode ); - if ( error ) - goto Fail; - } - - /* add current outline to the glyph slot */ - FT_GlyphLoader_Add( builder->loader ); - - /* the compiler should optimize away this empty loop but ... */ - -#ifdef FT_DEBUG_LEVEL_TRACE - - if ( decoder->len_buildchar > 0 ) - { - FT_UInt i; - - - FT_TRACE4(( "BuildCharArray = [ " )); - - for ( i = 0; i < decoder->len_buildchar; ++i ) - FT_TRACE4(( "%d ", decoder->buildchar[i] )); - - FT_TRACE4(( "]\n" )); - } - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - FT_TRACE4(( "\n" )); - - /* return now! */ - return FT_Err_Ok; - - case op_hsbw: - FT_TRACE4(( " hsbw" )); - - builder->parse_state = T1_Parse_Have_Width; - - builder->left_bearing.x += top[0]; - builder->advance.x = top[1]; - builder->advance.y = 0; - - orig_x = x = builder->pos_x + top[0]; - orig_y = y = builder->pos_y; - - FT_UNUSED( orig_y ); - - /* the `metrics_only' indicates that we only want to compute */ - /* the glyph's metrics (lsb + advance width), not load the */ - /* rest of it; so exit immediately */ - if ( builder->metrics_only ) - return FT_Err_Ok; - - break; - - case op_seac: - return t1operator_seac( decoder, - top[0], - top[1], - top[2], - Fix2Int( top[3] ), - Fix2Int( top[4] ) ); - - case op_sbw: - FT_TRACE4(( " sbw" )); - - builder->parse_state = T1_Parse_Have_Width; - - builder->left_bearing.x += top[0]; - builder->left_bearing.y += top[1]; - builder->advance.x = top[2]; - builder->advance.y = top[3]; - - x = builder->pos_x + top[0]; - y = builder->pos_y + top[1]; - - /* the `metrics_only' indicates that we only want to compute */ - /* the glyph's metrics (lsb + advance width), not load the */ - /* rest of it; so exit immediately */ - if ( builder->metrics_only ) - return FT_Err_Ok; - - break; - - case op_closepath: - FT_TRACE4(( " closepath" )); - - /* if there is no path, `closepath' is a no-op */ - if ( builder->parse_state == T1_Parse_Have_Path || - builder->parse_state == T1_Parse_Have_Moveto ) - t1_builder_close_contour( builder ); - - builder->parse_state = T1_Parse_Have_Width; - break; - - case op_hlineto: - FT_TRACE4(( " hlineto" )); - - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok ) - goto Fail; - - x += top[0]; - goto Add_Line; - - case op_hmoveto: - FT_TRACE4(( " hmoveto" )); - - x += top[0]; - if ( !decoder->flex_state ) - { - if ( builder->parse_state == T1_Parse_Start ) - goto Syntax_Error; - builder->parse_state = T1_Parse_Have_Moveto; - } - break; - - case op_hvcurveto: - FT_TRACE4(( " hvcurveto" )); - - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok || - ( error = t1_builder_check_points( builder, 3 ) ) - != FT_Err_Ok ) - goto Fail; - - x += top[0]; - t1_builder_add_point( builder, x, y, 0 ); - x += top[1]; - y += top[2]; - t1_builder_add_point( builder, x, y, 0 ); - y += top[3]; - t1_builder_add_point( builder, x, y, 1 ); - break; - - case op_rlineto: - FT_TRACE4(( " rlineto" )); - - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok ) - goto Fail; - - x += top[0]; - y += top[1]; - - Add_Line: - if ( ( error = t1_builder_add_point1( builder, x, y ) ) - != FT_Err_Ok ) - goto Fail; - break; - - case op_rmoveto: - FT_TRACE4(( " rmoveto" )); - - x += top[0]; - y += top[1]; - if ( !decoder->flex_state ) - { - if ( builder->parse_state == T1_Parse_Start ) - goto Syntax_Error; - builder->parse_state = T1_Parse_Have_Moveto; - } - break; - - case op_rrcurveto: - FT_TRACE4(( " rrcurveto" )); - - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok || - ( error = t1_builder_check_points( builder, 3 ) ) - != FT_Err_Ok ) - goto Fail; - - x += top[0]; - y += top[1]; - t1_builder_add_point( builder, x, y, 0 ); - - x += top[2]; - y += top[3]; - t1_builder_add_point( builder, x, y, 0 ); - - x += top[4]; - y += top[5]; - t1_builder_add_point( builder, x, y, 1 ); - break; - - case op_vhcurveto: - FT_TRACE4(( " vhcurveto" )); - - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok || - ( error = t1_builder_check_points( builder, 3 ) ) - != FT_Err_Ok ) - goto Fail; - - y += top[0]; - t1_builder_add_point( builder, x, y, 0 ); - x += top[1]; - y += top[2]; - t1_builder_add_point( builder, x, y, 0 ); - x += top[3]; - t1_builder_add_point( builder, x, y, 1 ); - break; - - case op_vlineto: - FT_TRACE4(( " vlineto" )); - - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok ) - goto Fail; - - y += top[0]; - goto Add_Line; - - case op_vmoveto: - FT_TRACE4(( " vmoveto" )); - - y += top[0]; - if ( !decoder->flex_state ) - { - if ( builder->parse_state == T1_Parse_Start ) - goto Syntax_Error; - builder->parse_state = T1_Parse_Have_Moveto; - } - break; - - case op_div: - FT_TRACE4(( " div" )); - - /* if `large_int' is set, we divide unscaled numbers; */ - /* otherwise, we divide numbers in 16.16 format -- */ - /* in both cases, it is the same operation */ - *top = FT_DivFix( top[0], top[1] ); - ++top; - - large_int = FALSE; - break; - - case op_callsubr: - { - FT_Int idx; - - - FT_TRACE4(( " callsubr" )); - - idx = Fix2Int( top[0] ); - if ( idx < 0 || idx >= decoder->num_subrs ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " invalid subrs index\n" )); - goto Syntax_Error; - } - - if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " too many nested subrs\n" )); - goto Syntax_Error; - } - - zone->cursor = ip; /* save current instruction pointer */ - - zone++; - - /* The Type 1 driver stores subroutines without the seed bytes. */ - /* The CID driver stores subroutines with seed bytes. This */ - /* case is taken care of when decoder->subrs_len == 0. */ - zone->base = decoder->subrs[idx]; - - if ( decoder->subrs_len ) - zone->limit = zone->base + decoder->subrs_len[idx]; - else - { - /* We are using subroutines from a CID font. We must adjust */ - /* for the seed bytes. */ - zone->base += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); - zone->limit = decoder->subrs[idx + 1]; - } - - zone->cursor = zone->base; - - if ( !zone->base ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " invoking empty subrs\n" )); - goto Syntax_Error; - } - - decoder->zone = zone; - ip = zone->base; - limit = zone->limit; - break; - } - - case op_pop: - FT_TRACE4(( " pop" )); - - if ( known_othersubr_result_cnt > 0 ) - { - known_othersubr_result_cnt--; - /* ignore, we pushed the operands ourselves */ - break; - } - - if ( unknown_othersubr_result_cnt == 0 ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " no more operands for othersubr\n" )); - goto Syntax_Error; - } - - unknown_othersubr_result_cnt--; - top++; /* `push' the operand to callothersubr onto the stack */ - break; - - case op_return: - FT_TRACE4(( " return" )); - - if ( zone <= decoder->zones ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unexpected return\n" )); - goto Syntax_Error; - } - - zone--; - ip = zone->cursor; - limit = zone->limit; - decoder->zone = zone; - break; - - case op_dotsection: - FT_TRACE4(( " dotsection" )); - - break; - - case op_hstem: - FT_TRACE4(( " hstem" )); - - /* record horizontal hint */ - if ( hinter ) - { - /* top[0] += builder->left_bearing.y; */ - hinter->stem( hinter->hints, 1, top ); - } - break; - - case op_hstem3: - FT_TRACE4(( " hstem3" )); - - /* record horizontal counter-controlled hints */ - if ( hinter ) - hinter->stem3( hinter->hints, 1, top ); - break; - - case op_vstem: - FT_TRACE4(( " vstem" )); - - /* record vertical hint */ - if ( hinter ) - { - top[0] += orig_x; - hinter->stem( hinter->hints, 0, top ); - } - break; - - case op_vstem3: - FT_TRACE4(( " vstem3" )); - - /* record vertical counter-controlled hints */ - if ( hinter ) - { - FT_Pos dx = orig_x; - - - top[0] += dx; - top[2] += dx; - top[4] += dx; - hinter->stem3( hinter->hints, 0, top ); - } - break; - - case op_setcurrentpoint: - FT_TRACE4(( " setcurrentpoint" )); - - /* From the T1 specification, section 6.4: */ - /* */ - /* The setcurrentpoint command is used only in */ - /* conjunction with results from OtherSubrs procedures. */ - - /* known_othersubr_result_cnt != 0 is already handled */ - /* above. */ - - /* Note, however, that both Ghostscript and Adobe */ - /* Distiller handle this situation by silently ignoring */ - /* the inappropriate `setcurrentpoint' instruction. So */ - /* we do the same. */ -#if 0 - - if ( decoder->flex_state != 1 ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unexpected `setcurrentpoint'\n" )); - goto Syntax_Error; - } - else - ... -#endif - - x = top[0]; - y = top[1]; - decoder->flex_state = 0; - break; - - case op_unknown15: - FT_TRACE4(( " opcode_15" )); - /* nothing to do except to pop the two arguments */ - break; - - default: - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unhandled opcode %d\n", op )); - goto Syntax_Error; - } - - /* XXX Operators usually clear the operand stack; */ - /* only div, callsubr, callothersubr, pop, and */ - /* return are different. */ - /* In practice it doesn't matter (?). */ - - decoder->top = top; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( "\n" )); - bol = TRUE; -#endif - - } /* general operator processing */ - - } /* while ip < limit */ - - FT_TRACE4(( "..end..\n\n" )); - - Fail: - return error; - - Syntax_Error: - return FT_THROW( Syntax_Error ); - - Stack_Underflow: - return FT_THROW( Stack_Underflow ); - } - - - /* parse a single Type 1 glyph */ - FT_LOCAL_DEF( FT_Error ) - t1_decoder_parse_glyph( T1_Decoder decoder, - FT_UInt glyph ) - { - return decoder->parse_callback( decoder, glyph ); - } - - - /* initialize T1 decoder */ - FT_LOCAL_DEF( FT_Error ) - t1_decoder_init( T1_Decoder decoder, - FT_Face face, - FT_Size size, - FT_GlyphSlot slot, - FT_Byte** glyph_names, - PS_Blend blend, - FT_Bool hinting, - FT_Render_Mode hint_mode, - T1_Decoder_Callback parse_callback ) - { - FT_MEM_ZERO( decoder, sizeof ( *decoder ) ); - - /* retrieve PSNames interface from list of current modules */ - { - FT_Service_PsCMaps psnames; - - - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); - if ( !psnames ) - { - FT_ERROR(( "t1_decoder_init:" - " the `psnames' module is not available\n" )); - return FT_THROW( Unimplemented_Feature ); - } - - decoder->psnames = psnames; - } - - t1_builder_init( &decoder->builder, face, size, slot, hinting ); - - /* decoder->buildchar and decoder->len_buildchar have to be */ - /* initialized by the caller since we cannot know the length */ - /* of the BuildCharArray */ - - decoder->num_glyphs = (FT_UInt)face->num_glyphs; - decoder->glyph_names = glyph_names; - decoder->hint_mode = hint_mode; - decoder->blend = blend; - decoder->parse_callback = parse_callback; - - decoder->funcs = t1_decoder_funcs; - - return FT_Err_Ok; - } - - - /* finalize T1 decoder */ - FT_LOCAL_DEF( void ) - t1_decoder_done( T1_Decoder decoder ) - { - t1_builder_done( &decoder->builder ); - } - - -/* END */ diff --git a/3party/freetype/src/psaux/t1decode.h b/3party/freetype/src/psaux/t1decode.h deleted file mode 100644 index e83078f719..0000000000 --- a/3party/freetype/src/psaux/t1decode.h +++ /dev/null @@ -1,64 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1decode.h */ -/* */ -/* PostScript Type 1 decoding routines (specification). */ -/* */ -/* Copyright 2000-2015 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 __T1DECODE_H__ -#define __T1DECODE_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_TYPE1_TYPES_H - - -FT_BEGIN_HEADER - - - FT_CALLBACK_TABLE - const T1_Decoder_FuncsRec t1_decoder_funcs; - - - FT_LOCAL( FT_Error ) - t1_decoder_parse_glyph( T1_Decoder decoder, - FT_UInt glyph_index ); - - FT_LOCAL( FT_Error ) - t1_decoder_parse_charstrings( T1_Decoder decoder, - FT_Byte* base, - FT_UInt len ); - - FT_LOCAL( FT_Error ) - t1_decoder_init( T1_Decoder decoder, - FT_Face face, - FT_Size size, - FT_GlyphSlot slot, - FT_Byte** glyph_names, - PS_Blend blend, - FT_Bool hinting, - FT_Render_Mode hint_mode, - T1_Decoder_Callback parse_glyph ); - - FT_LOCAL( void ) - t1_decoder_done( T1_Decoder decoder ); - - -FT_END_HEADER - -#endif /* __T1DECODE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pshinter/Jamfile b/3party/freetype/src/pshinter/Jamfile deleted file mode 100644 index 6fb3be11c7..0000000000 --- a/3party/freetype/src/pshinter/Jamfile +++ /dev/null @@ -1,34 +0,0 @@ -# FreeType 2 src/pshinter Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) pshinter ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = pshalgo - pshglob - pshmod - pshpic - pshrec - ; - } - else - { - _sources = pshinter ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/pshinter Jamfile diff --git a/3party/freetype/src/pshinter/module.mk b/3party/freetype/src/pshinter/module.mk deleted file mode 100644 index 1fd8e55a33..0000000000 --- a/3party/freetype/src/pshinter/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 PSHinter module definition -# - - -# Copyright 1996-2015 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. - - -FTMODULE_H_COMMANDS += PSHINTER_MODULE - -define PSHINTER_MODULE -$(OPEN_DRIVER) FT_Module_Class, pshinter_module_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)pshinter $(ECHO_DRIVER_DESC)Postscript hinter module$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/pshinter/pshalgo.c b/3party/freetype/src/pshinter/pshalgo.c deleted file mode 100644 index 6e654cb1ef..0000000000 --- a/3party/freetype/src/pshinter/pshalgo.c +++ /dev/null @@ -1,2195 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshalgo.c */ -/* */ -/* PostScript hinting algorithm (body). */ -/* */ -/* Copyright 2001-2015 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 <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include "pshalgo.h" - -#include "pshnterr.h" - - -#undef FT_COMPONENT -#define FT_COMPONENT trace_pshalgo2 - - -#ifdef DEBUG_HINTER - PSH_Hint_Table ps_debug_hint_table = NULL; - PSH_HintFunc ps_debug_hint_func = NULL; - PSH_Glyph ps_debug_glyph = NULL; -#endif - - -#define COMPUTE_INFLEXS /* compute inflection points to optimize `S' */ - /* and similar glyphs */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** BASIC HINTS RECORDINGS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* return true if two stem hints overlap */ - static FT_Int - psh_hint_overlap( PSH_Hint hint1, - PSH_Hint hint2 ) - { - return hint1->org_pos + hint1->org_len >= hint2->org_pos && - hint2->org_pos + hint2->org_len >= hint1->org_pos; - } - - - /* destroy hints table */ - static void - psh_hint_table_done( PSH_Hint_Table table, - FT_Memory memory ) - { - FT_FREE( table->zones ); - table->num_zones = 0; - table->zone = NULL; - - FT_FREE( table->sort ); - FT_FREE( table->hints ); - table->num_hints = 0; - table->max_hints = 0; - table->sort_global = NULL; - } - - - /* deactivate all hints in a table */ - static void - psh_hint_table_deactivate( PSH_Hint_Table table ) - { - FT_UInt count = table->max_hints; - PSH_Hint hint = table->hints; - - - for ( ; count > 0; count--, hint++ ) - { - psh_hint_deactivate( hint ); - hint->order = -1; - } - } - - - /* internal function to record a new hint */ - static void - psh_hint_table_record( PSH_Hint_Table table, - FT_UInt idx ) - { - PSH_Hint hint = table->hints + idx; - - - if ( idx >= table->max_hints ) - { - FT_TRACE0(( "psh_hint_table_record: invalid hint index %d\n", idx )); - return; - } - - /* ignore active hints */ - if ( psh_hint_is_active( hint ) ) - return; - - psh_hint_activate( hint ); - - /* now scan the current active hint set to check */ - /* whether `hint' overlaps with another hint */ - { - PSH_Hint* sorted = table->sort_global; - FT_UInt count = table->num_hints; - PSH_Hint hint2; - - - hint->parent = NULL; - for ( ; count > 0; count--, sorted++ ) - { - hint2 = sorted[0]; - - if ( psh_hint_overlap( hint, hint2 ) ) - { - hint->parent = hint2; - break; - } - } - } - - if ( table->num_hints < table->max_hints ) - table->sort_global[table->num_hints++] = hint; - else - FT_TRACE0(( "psh_hint_table_record: too many sorted hints! BUG!\n" )); - } - - - static void - psh_hint_table_record_mask( PSH_Hint_Table table, - PS_Mask hint_mask ) - { - FT_Int mask = 0, val = 0; - FT_Byte* cursor = hint_mask->bytes; - FT_UInt idx, limit; - - - limit = hint_mask->num_bits; - - for ( idx = 0; idx < limit; idx++ ) - { - if ( mask == 0 ) - { - val = *cursor++; - mask = 0x80; - } - - if ( val & mask ) - psh_hint_table_record( table, idx ); - - mask >>= 1; - } - } - - - /* create hints table */ - static FT_Error - psh_hint_table_init( PSH_Hint_Table table, - PS_Hint_Table hints, - PS_Mask_Table hint_masks, - PS_Mask_Table counter_masks, - FT_Memory memory ) - { - FT_UInt count; - FT_Error error; - - FT_UNUSED( counter_masks ); - - - count = hints->num_hints; - - /* allocate our tables */ - if ( FT_NEW_ARRAY( table->sort, 2 * count ) || - FT_NEW_ARRAY( table->hints, count ) || - FT_NEW_ARRAY( table->zones, 2 * count + 1 ) ) - goto Exit; - - table->max_hints = count; - table->sort_global = table->sort + count; - table->num_hints = 0; - table->num_zones = 0; - table->zone = NULL; - - /* initialize the `table->hints' array */ - { - PSH_Hint write = table->hints; - PS_Hint read = hints->hints; - - - for ( ; count > 0; count--, write++, read++ ) - { - write->org_pos = read->pos; - write->org_len = read->len; - write->flags = read->flags; - } - } - - /* we now need to determine the initial `parent' stems; first */ - /* activate the hints that are given by the initial hint masks */ - if ( hint_masks ) - { - PS_Mask mask = hint_masks->masks; - - - count = hint_masks->num_masks; - table->hint_masks = hint_masks; - - for ( ; count > 0; count--, mask++ ) - psh_hint_table_record_mask( table, mask ); - } - - /* finally, do a linear parse in case some hints were left alone */ - if ( table->num_hints != table->max_hints ) - { - FT_UInt idx; - - - FT_TRACE0(( "psh_hint_table_init: missing/incorrect hint masks\n" )); - - count = table->max_hints; - for ( idx = 0; idx < count; idx++ ) - psh_hint_table_record( table, idx ); - } - - Exit: - return error; - } - - - static void - psh_hint_table_activate_mask( PSH_Hint_Table table, - PS_Mask hint_mask ) - { - FT_Int mask = 0, val = 0; - FT_Byte* cursor = hint_mask->bytes; - FT_UInt idx, limit, count; - - - limit = hint_mask->num_bits; - count = 0; - - psh_hint_table_deactivate( table ); - - for ( idx = 0; idx < limit; idx++ ) - { - if ( mask == 0 ) - { - val = *cursor++; - mask = 0x80; - } - - if ( val & mask ) - { - PSH_Hint hint = &table->hints[idx]; - - - if ( !psh_hint_is_active( hint ) ) - { - FT_UInt count2; - -#if 0 - PSH_Hint* sort = table->sort; - PSH_Hint hint2; - - - for ( count2 = count; count2 > 0; count2--, sort++ ) - { - hint2 = sort[0]; - if ( psh_hint_overlap( hint, hint2 ) ) - FT_TRACE0(( "psh_hint_table_activate_mask:" - " found overlapping hints\n" )) - } -#else - count2 = 0; -#endif - - if ( count2 == 0 ) - { - psh_hint_activate( hint ); - if ( count < table->max_hints ) - table->sort[count++] = hint; - else - FT_TRACE0(( "psh_hint_tableactivate_mask:" - " too many active hints\n" )); - } - } - } - - mask >>= 1; - } - table->num_hints = count; - - /* now, sort the hints; they are guaranteed to not overlap */ - /* so we can compare their "org_pos" field directly */ - { - FT_Int i1, i2; - PSH_Hint hint1, hint2; - PSH_Hint* sort = table->sort; - - - /* a simple bubble sort will do, since in 99% of cases, the hints */ - /* will be already sorted -- and the sort will be linear */ - for ( i1 = 1; i1 < (FT_Int)count; i1++ ) - { - hint1 = sort[i1]; - for ( i2 = i1 - 1; i2 >= 0; i2-- ) - { - hint2 = sort[i2]; - - if ( hint2->org_pos < hint1->org_pos ) - break; - - sort[i2 + 1] = hint2; - sort[i2] = hint1; - } - } - } - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** HINTS GRID-FITTING AND OPTIMIZATION *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#if 1 - static FT_Pos - psh_dimension_quantize_len( PSH_Dimension dim, - FT_Pos len, - FT_Bool do_snapping ) - { - if ( len <= 64 ) - len = 64; - else - { - FT_Pos delta = len - dim->stdw.widths[0].cur; - - - if ( delta < 0 ) - delta = -delta; - - if ( delta < 40 ) - { - len = dim->stdw.widths[0].cur; - if ( len < 48 ) - len = 48; - } - - if ( len < 3 * 64 ) - { - delta = ( len & 63 ); - len &= -64; - - if ( delta < 10 ) - len += delta; - - else if ( delta < 32 ) - len += 10; - - else if ( delta < 54 ) - len += 54; - - else - len += delta; - } - else - len = FT_PIX_ROUND( len ); - } - - if ( do_snapping ) - len = FT_PIX_ROUND( len ); - - return len; - } -#endif /* 0 */ - - -#ifdef DEBUG_HINTER - - static void - ps_simple_scale( PSH_Hint_Table table, - FT_Fixed scale, - FT_Fixed delta, - FT_Int dimension ) - { - FT_UInt count; - - - for ( count = 0; count < table->max_hints; count++ ) - { - PSH_Hint hint = table->hints + count; - - - hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta; - hint->cur_len = FT_MulFix( hint->org_len, scale ); - - if ( ps_debug_hint_func ) - ps_debug_hint_func( hint, dimension ); - } - } - -#endif /* DEBUG_HINTER */ - - - static FT_Fixed - psh_hint_snap_stem_side_delta( FT_Fixed pos, - FT_Fixed len ) - { - FT_Fixed delta1 = FT_PIX_ROUND( pos ) - pos; - FT_Fixed delta2 = FT_PIX_ROUND( pos + len ) - pos - len; - - - if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) ) - return delta1; - else - return delta2; - } - - - static void - psh_hint_align( PSH_Hint hint, - PSH_Globals globals, - FT_Int dimension, - PSH_Glyph glyph ) - { - PSH_Dimension dim = &globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - FT_Fixed delta = dim->scale_delta; - - - if ( !psh_hint_is_fitted( hint ) ) - { - FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; - FT_Pos len = FT_MulFix( hint->org_len, scale ); - - FT_Int do_snapping; - FT_Pos fit_len; - PSH_AlignmentRec align; - - - /* ignore stem alignments when requested through the hint flags */ - if ( ( dimension == 0 && !glyph->do_horz_hints ) || - ( dimension == 1 && !glyph->do_vert_hints ) ) - { - hint->cur_pos = pos; - hint->cur_len = len; - - psh_hint_set_fitted( hint ); - return; - } - - /* perform stem snapping when requested - this is necessary - * for monochrome and LCD hinting modes only - */ - do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) || - ( dimension == 1 && glyph->do_vert_snapping ); - - hint->cur_len = fit_len = len; - - /* check blue zones for horizontal stems */ - align.align = PSH_BLUE_ALIGN_NONE; - align.align_bot = align.align_top = 0; - - if ( dimension == 1 ) - psh_blues_snap_stem( &globals->blues, - hint->org_pos + hint->org_len, - hint->org_pos, - &align ); - - switch ( align.align ) - { - case PSH_BLUE_ALIGN_TOP: - /* the top of the stem is aligned against a blue zone */ - hint->cur_pos = align.align_top - fit_len; - break; - - case PSH_BLUE_ALIGN_BOT: - /* the bottom of the stem is aligned against a blue zone */ - hint->cur_pos = align.align_bot; - break; - - case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: - /* both edges of the stem are aligned against blue zones */ - hint->cur_pos = align.align_bot; - hint->cur_len = align.align_top - align.align_bot; - break; - - default: - { - PSH_Hint parent = hint->parent; - - - if ( parent ) - { - FT_Pos par_org_center, par_cur_center; - FT_Pos cur_org_center, cur_delta; - - - /* ensure that parent is already fitted */ - if ( !psh_hint_is_fitted( parent ) ) - psh_hint_align( parent, globals, dimension, glyph ); - - /* keep original relation between hints, this is, use the */ - /* scaled distance between the centers of the hints to */ - /* compute the new position */ - par_org_center = parent->org_pos + ( parent->org_len >> 1 ); - par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 ); - cur_org_center = hint->org_pos + ( hint->org_len >> 1 ); - - cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); - pos = par_cur_center + cur_delta - ( len >> 1 ); - } - - hint->cur_pos = pos; - hint->cur_len = fit_len; - - /* Stem adjustment tries to snap stem widths to standard - * ones. This is important to prevent unpleasant rounding - * artefacts. - */ - if ( glyph->do_stem_adjust ) - { - if ( len <= 64 ) - { - /* the stem is less than one pixel; we will center it - * around the nearest pixel center - */ - if ( len >= 32 ) - { - /* This is a special case where we also widen the stem - * and align it to the pixel grid. - * - * stem_center = pos + (len/2) - * nearest_pixel_center = FT_ROUND(stem_center-32)+32 - * new_pos = nearest_pixel_center-32 - * = FT_ROUND(stem_center-32) - * = FT_FLOOR(stem_center-32+32) - * = FT_FLOOR(stem_center) - * new_len = 64 - */ - pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ); - len = 64; - } - else if ( len > 0 ) - { - /* This is a very small stem; we simply align it to the - * pixel grid, trying to find the minimum displacement. - * - * left = pos - * right = pos + len - * left_nearest_edge = ROUND(pos) - * right_nearest_edge = ROUND(right) - * - * if ( ABS(left_nearest_edge - left) <= - * ABS(right_nearest_edge - right) ) - * new_pos = left - * else - * new_pos = right - */ - FT_Pos left_nearest = FT_PIX_ROUND( pos ); - FT_Pos right_nearest = FT_PIX_ROUND( pos + len ); - FT_Pos left_disp = left_nearest - pos; - FT_Pos right_disp = right_nearest - ( pos + len ); - - - if ( left_disp < 0 ) - left_disp = -left_disp; - if ( right_disp < 0 ) - right_disp = -right_disp; - if ( left_disp <= right_disp ) - pos = left_nearest; - else - pos = right_nearest; - } - else - { - /* this is a ghost stem; we simply round it */ - pos = FT_PIX_ROUND( pos ); - } - } - else - { - len = psh_dimension_quantize_len( dim, len, 0 ); - } - } - - /* now that we have a good hinted stem width, try to position */ - /* the stem along a pixel grid integer coordinate */ - hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len ); - hint->cur_len = len; - } - } - - if ( do_snapping ) - { - pos = hint->cur_pos; - len = hint->cur_len; - - if ( len < 64 ) - len = 64; - else - len = FT_PIX_ROUND( len ); - - switch ( align.align ) - { - case PSH_BLUE_ALIGN_TOP: - hint->cur_pos = align.align_top - len; - hint->cur_len = len; - break; - - case PSH_BLUE_ALIGN_BOT: - hint->cur_len = len; - break; - - case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP: - /* don't touch */ - break; - - - default: - hint->cur_len = len; - if ( len & 64 ) - pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32; - else - pos = FT_PIX_ROUND( pos + ( len >> 1 ) ); - - hint->cur_pos = pos - ( len >> 1 ); - hint->cur_len = len; - } - } - - psh_hint_set_fitted( hint ); - -#ifdef DEBUG_HINTER - if ( ps_debug_hint_func ) - ps_debug_hint_func( hint, dimension ); -#endif - } - } - - -#if 0 /* not used for now, experimental */ - - /* - * A variant to perform "light" hinting (i.e. FT_RENDER_MODE_LIGHT) - * of stems - */ - static void - psh_hint_align_light( PSH_Hint hint, - PSH_Globals globals, - FT_Int dimension, - PSH_Glyph glyph ) - { - PSH_Dimension dim = &globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - FT_Fixed delta = dim->scale_delta; - - - if ( !psh_hint_is_fitted( hint ) ) - { - FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; - FT_Pos len = FT_MulFix( hint->org_len, scale ); - - FT_Pos fit_len; - - PSH_AlignmentRec align; - - - /* ignore stem alignments when requested through the hint flags */ - if ( ( dimension == 0 && !glyph->do_horz_hints ) || - ( dimension == 1 && !glyph->do_vert_hints ) ) - { - hint->cur_pos = pos; - hint->cur_len = len; - - psh_hint_set_fitted( hint ); - return; - } - - fit_len = len; - - hint->cur_len = fit_len; - - /* check blue zones for horizontal stems */ - align.align = PSH_BLUE_ALIGN_NONE; - align.align_bot = align.align_top = 0; - - if ( dimension == 1 ) - psh_blues_snap_stem( &globals->blues, - hint->org_pos + hint->org_len, - hint->org_pos, - &align ); - - switch ( align.align ) - { - case PSH_BLUE_ALIGN_TOP: - /* the top of the stem is aligned against a blue zone */ - hint->cur_pos = align.align_top - fit_len; - break; - - case PSH_BLUE_ALIGN_BOT: - /* the bottom of the stem is aligned against a blue zone */ - hint->cur_pos = align.align_bot; - break; - - case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: - /* both edges of the stem are aligned against blue zones */ - hint->cur_pos = align.align_bot; - hint->cur_len = align.align_top - align.align_bot; - break; - - default: - { - PSH_Hint parent = hint->parent; - - - if ( parent ) - { - FT_Pos par_org_center, par_cur_center; - FT_Pos cur_org_center, cur_delta; - - - /* ensure that parent is already fitted */ - if ( !psh_hint_is_fitted( parent ) ) - psh_hint_align_light( parent, globals, dimension, glyph ); - - par_org_center = parent->org_pos + ( parent->org_len / 2 ); - par_cur_center = parent->cur_pos + ( parent->cur_len / 2 ); - cur_org_center = hint->org_pos + ( hint->org_len / 2 ); - - cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); - pos = par_cur_center + cur_delta - ( len >> 1 ); - } - - /* Stems less than one pixel wide are easy -- we want to - * make them as dark as possible, so they must fall within - * one pixel. If the stem is split between two pixels - * then snap the edge that is nearer to the pixel boundary - * to the pixel boundary. - */ - if ( len <= 64 ) - { - if ( ( pos + len + 63 ) / 64 != pos / 64 + 1 ) - pos += psh_hint_snap_stem_side_delta ( pos, len ); - } - - /* Position stems other to minimize the amount of mid-grays. - * There are, in general, two positions that do this, - * illustrated as A) and B) below. - * - * + + + + - * - * A) |--------------------------------| - * B) |--------------------------------| - * C) |--------------------------------| - * - * Position A) (split the excess stem equally) should be better - * for stems of width N + f where f < 0.5. - * - * Position B) (split the deficiency equally) should be better - * for stems of width N + f where f > 0.5. - * - * It turns out though that minimizing the total number of lit - * pixels is also important, so position C), with one edge - * aligned with a pixel boundary is actually preferable - * to A). There are also more possibile positions for C) than - * for A) or B), so it involves less distortion of the overall - * character shape. - */ - else /* len > 64 */ - { - FT_Fixed frac_len = len & 63; - FT_Fixed center = pos + ( len >> 1 ); - FT_Fixed delta_a, delta_b; - - - if ( ( len / 64 ) & 1 ) - { - delta_a = FT_PIX_FLOOR( center ) + 32 - center; - delta_b = FT_PIX_ROUND( center ) - center; - } - else - { - delta_a = FT_PIX_ROUND( center ) - center; - delta_b = FT_PIX_FLOOR( center ) + 32 - center; - } - - /* We choose between B) and C) above based on the amount - * of fractinal stem width; for small amounts, choose - * C) always, for large amounts, B) always, and inbetween, - * pick whichever one involves less stem movement. - */ - if ( frac_len < 32 ) - { - pos += psh_hint_snap_stem_side_delta ( pos, len ); - } - else if ( frac_len < 48 ) - { - FT_Fixed side_delta = psh_hint_snap_stem_side_delta ( pos, - len ); - - if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) ) - pos += side_delta; - else - pos += delta_b; - } - else - { - pos += delta_b; - } - } - - hint->cur_pos = pos; - } - } /* switch */ - - psh_hint_set_fitted( hint ); - -#ifdef DEBUG_HINTER - if ( ps_debug_hint_func ) - ps_debug_hint_func( hint, dimension ); -#endif - } - } - -#endif /* 0 */ - - - static void - psh_hint_table_align_hints( PSH_Hint_Table table, - PSH_Globals globals, - FT_Int dimension, - PSH_Glyph glyph ) - { - PSH_Hint hint; - FT_UInt count; - -#ifdef DEBUG_HINTER - - PSH_Dimension dim = &globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - FT_Fixed delta = dim->scale_delta; - - - if ( ps_debug_no_vert_hints && dimension == 0 ) - { - ps_simple_scale( table, scale, delta, dimension ); - return; - } - - if ( ps_debug_no_horz_hints && dimension == 1 ) - { - ps_simple_scale( table, scale, delta, dimension ); - return; - } - -#endif /* DEBUG_HINTER*/ - - hint = table->hints; - count = table->max_hints; - - for ( ; count > 0; count--, hint++ ) - psh_hint_align( hint, globals, dimension, glyph ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** POINTS INTERPOLATION ROUTINES *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define xxDEBUG_ZONES - - -#ifdef DEBUG_ZONES - -#include FT_CONFIG_STANDARD_LIBRARY_H - - static void - psh_print_zone( PSH_Zone zone ) - { - printf( "zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\n", - zone->scale / 65536.0, - zone->delta / 64.0, - zone->min, - zone->max ); - } - -#endif /* DEBUG_ZONES */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** HINTER GLYPH MANAGEMENT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define psh_corner_is_flat ft_corner_is_flat -#define psh_corner_orientation ft_corner_orientation - - -#ifdef COMPUTE_INFLEXS - - /* compute all inflex points in a given glyph */ - static void - psh_glyph_compute_inflections( PSH_Glyph glyph ) - { - FT_UInt n; - - - for ( n = 0; n < glyph->num_contours; n++ ) - { - PSH_Point first, start, end, before, after; - FT_Pos in_x, in_y, out_x, out_y; - FT_Int orient_prev, orient_cur; - FT_Int finished = 0; - - - /* we need at least 4 points to create an inflection point */ - if ( glyph->contours[n].count < 4 ) - continue; - - /* compute first segment in contour */ - first = glyph->contours[n].start; - - start = end = first; - do - { - end = end->next; - if ( end == first ) - goto Skip; - - in_x = end->org_u - start->org_u; - in_y = end->org_v - start->org_v; - - } while ( in_x == 0 && in_y == 0 ); - - /* extend the segment start whenever possible */ - before = start; - do - { - do - { - start = before; - before = before->prev; - if ( before == first ) - goto Skip; - - out_x = start->org_u - before->org_u; - out_y = start->org_v - before->org_v; - - } while ( out_x == 0 && out_y == 0 ); - - orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y ); - - } while ( orient_prev == 0 ); - - first = start; - in_x = out_x; - in_y = out_y; - - /* now, process all segments in the contour */ - do - { - /* first, extend current segment's end whenever possible */ - after = end; - do - { - do - { - end = after; - after = after->next; - if ( after == first ) - finished = 1; - - out_x = after->org_u - end->org_u; - out_y = after->org_v - end->org_v; - - } while ( out_x == 0 && out_y == 0 ); - - orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y ); - - } while ( orient_cur == 0 ); - - if ( ( orient_cur ^ orient_prev ) < 0 ) - { - do - { - psh_point_set_inflex( start ); - start = start->next; - } - while ( start != end ); - - psh_point_set_inflex( start ); - } - - start = end; - end = after; - orient_prev = orient_cur; - in_x = out_x; - in_y = out_y; - - } while ( !finished ); - - Skip: - ; - } - } - -#endif /* COMPUTE_INFLEXS */ - - - static void - psh_glyph_done( PSH_Glyph glyph ) - { - FT_Memory memory = glyph->memory; - - - psh_hint_table_done( &glyph->hint_tables[1], memory ); - psh_hint_table_done( &glyph->hint_tables[0], memory ); - - FT_FREE( glyph->points ); - FT_FREE( glyph->contours ); - - glyph->num_points = 0; - glyph->num_contours = 0; - - glyph->memory = NULL; - } - - - static int - psh_compute_dir( FT_Pos dx, - FT_Pos dy ) - { - FT_Pos ax, ay; - int result = PSH_DIR_NONE; - - - ax = FT_ABS( dx ); - ay = FT_ABS( dy ); - - if ( ay * 12 < ax ) - { - /* |dy| <<< |dx| means a near-horizontal segment */ - result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT; - } - else if ( ax * 12 < ay ) - { - /* |dx| <<< |dy| means a near-vertical segment */ - result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN; - } - - return result; - } - - - /* load outline point coordinates into hinter glyph */ - static void - psh_glyph_load_points( PSH_Glyph glyph, - FT_Int dimension ) - { - FT_Vector* vec = glyph->outline->points; - PSH_Point point = glyph->points; - FT_UInt count = glyph->num_points; - - - for ( ; count > 0; count--, point++, vec++ ) - { - point->flags2 = 0; - point->hint = NULL; - if ( dimension == 0 ) - { - point->org_u = vec->x; - point->org_v = vec->y; - } - else - { - point->org_u = vec->y; - point->org_v = vec->x; - } - -#ifdef DEBUG_HINTER - point->org_x = vec->x; - point->org_y = vec->y; -#endif - - } - } - - - /* save hinted point coordinates back to outline */ - static void - psh_glyph_save_points( PSH_Glyph glyph, - FT_Int dimension ) - { - FT_UInt n; - PSH_Point point = glyph->points; - FT_Vector* vec = glyph->outline->points; - char* tags = glyph->outline->tags; - - - for ( n = 0; n < glyph->num_points; n++ ) - { - if ( dimension == 0 ) - vec[n].x = point->cur_u; - else - vec[n].y = point->cur_u; - - if ( psh_point_is_strong( point ) ) - tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 ); - -#ifdef DEBUG_HINTER - - if ( dimension == 0 ) - { - point->cur_x = point->cur_u; - point->flags_x = point->flags2 | point->flags; - } - else - { - point->cur_y = point->cur_u; - point->flags_y = point->flags2 | point->flags; - } - -#endif - - point++; - } - } - - - static FT_Error - psh_glyph_init( PSH_Glyph glyph, - FT_Outline* outline, - PS_Hints ps_hints, - PSH_Globals globals ) - { - FT_Error error; - FT_Memory memory; - - - /* clear all fields */ - FT_MEM_ZERO( glyph, sizeof ( *glyph ) ); - - memory = glyph->memory = globals->memory; - - /* allocate and setup points + contours arrays */ - if ( FT_NEW_ARRAY( glyph->points, outline->n_points ) || - FT_NEW_ARRAY( glyph->contours, outline->n_contours ) ) - goto Exit; - - glyph->num_points = (FT_UInt)outline->n_points; - glyph->num_contours = (FT_UInt)outline->n_contours; - - { - FT_UInt first = 0, next, n; - PSH_Point points = glyph->points; - PSH_Contour contour = glyph->contours; - - - for ( n = 0; n < glyph->num_contours; n++ ) - { - FT_UInt count; - PSH_Point point; - - - next = (FT_UInt)outline->contours[n] + 1; - count = next - first; - - contour->start = points + first; - contour->count = count; - - if ( count > 0 ) - { - point = points + first; - - point->prev = points + next - 1; - point->contour = contour; - - for ( ; count > 1; count-- ) - { - point[0].next = point + 1; - point[1].prev = point; - point++; - point->contour = contour; - } - point->next = points + first; - } - - contour++; - first = next; - } - } - - { - PSH_Point points = glyph->points; - PSH_Point point = points; - FT_Vector* vec = outline->points; - FT_UInt n; - - - for ( n = 0; n < glyph->num_points; n++, point++ ) - { - FT_Int n_prev = (FT_Int)( point->prev - points ); - FT_Int n_next = (FT_Int)( point->next - points ); - FT_Pos dxi, dyi, dxo, dyo; - - - if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) ) - point->flags = PSH_POINT_OFF; - - dxi = vec[n].x - vec[n_prev].x; - dyi = vec[n].y - vec[n_prev].y; - - point->dir_in = (FT_Char)psh_compute_dir( dxi, dyi ); - - dxo = vec[n_next].x - vec[n].x; - dyo = vec[n_next].y - vec[n].y; - - point->dir_out = (FT_Char)psh_compute_dir( dxo, dyo ); - - /* detect smooth points */ - if ( point->flags & PSH_POINT_OFF ) - point->flags |= PSH_POINT_SMOOTH; - - else if ( point->dir_in == point->dir_out ) - { - if ( point->dir_out != PSH_DIR_NONE || - psh_corner_is_flat( dxi, dyi, dxo, dyo ) ) - point->flags |= PSH_POINT_SMOOTH; - } - } - } - - glyph->outline = outline; - glyph->globals = globals; - -#ifdef COMPUTE_INFLEXS - psh_glyph_load_points( glyph, 0 ); - psh_glyph_compute_inflections( glyph ); -#endif /* COMPUTE_INFLEXS */ - - /* now deal with hints tables */ - error = psh_hint_table_init( &glyph->hint_tables [0], - &ps_hints->dimension[0].hints, - &ps_hints->dimension[0].masks, - &ps_hints->dimension[0].counters, - memory ); - if ( error ) - goto Exit; - - error = psh_hint_table_init( &glyph->hint_tables [1], - &ps_hints->dimension[1].hints, - &ps_hints->dimension[1].masks, - &ps_hints->dimension[1].counters, - memory ); - if ( error ) - goto Exit; - - Exit: - return error; - } - - - /* compute all extrema in a glyph for a given dimension */ - static void - psh_glyph_compute_extrema( PSH_Glyph glyph ) - { - FT_UInt n; - - - /* first of all, compute all local extrema */ - for ( n = 0; n < glyph->num_contours; n++ ) - { - PSH_Point first = glyph->contours[n].start; - PSH_Point point, before, after; - - - if ( glyph->contours[n].count == 0 ) - continue; - - point = first; - before = point; - - do - { - before = before->prev; - if ( before == first ) - goto Skip; - - } while ( before->org_u == point->org_u ); - - first = point = before->next; - - for (;;) - { - after = point; - do - { - after = after->next; - if ( after == first ) - goto Next; - - } while ( after->org_u == point->org_u ); - - if ( before->org_u < point->org_u ) - { - if ( after->org_u < point->org_u ) - { - /* local maximum */ - goto Extremum; - } - } - else /* before->org_u > point->org_u */ - { - if ( after->org_u > point->org_u ) - { - /* local minimum */ - Extremum: - do - { - psh_point_set_extremum( point ); - point = point->next; - - } while ( point != after ); - } - } - - before = after->prev; - point = after; - - } /* for */ - - Next: - ; - } - - /* for each extremum, determine its direction along the */ - /* orthogonal axis */ - for ( n = 0; n < glyph->num_points; n++ ) - { - PSH_Point point, before, after; - - - point = &glyph->points[n]; - before = point; - after = point; - - if ( psh_point_is_extremum( point ) ) - { - do - { - before = before->prev; - if ( before == point ) - goto Skip; - - } while ( before->org_v == point->org_v ); - - do - { - after = after->next; - if ( after == point ) - goto Skip; - - } while ( after->org_v == point->org_v ); - } - - if ( before->org_v < point->org_v && - after->org_v > point->org_v ) - { - psh_point_set_positive( point ); - } - else if ( before->org_v > point->org_v && - after->org_v < point->org_v ) - { - psh_point_set_negative( point ); - } - - Skip: - ; - } - } - - - /* major_dir is the direction for points on the bottom/left of the stem; */ - /* Points on the top/right of the stem will have a direction of */ - /* -major_dir. */ - - static void - psh_hint_table_find_strong_points( PSH_Hint_Table table, - PSH_Point point, - FT_UInt count, - FT_Int threshold, - FT_Int major_dir ) - { - PSH_Hint* sort = table->sort; - FT_UInt num_hints = table->num_hints; - - - for ( ; count > 0; count--, point++ ) - { - FT_Int point_dir = 0; - FT_Pos org_u = point->org_u; - - - if ( psh_point_is_strong( point ) ) - continue; - - if ( PSH_DIR_COMPARE( point->dir_in, major_dir ) ) - point_dir = point->dir_in; - - else if ( PSH_DIR_COMPARE( point->dir_out, major_dir ) ) - point_dir = point->dir_out; - - if ( point_dir ) - { - if ( point_dir == major_dir ) - { - FT_UInt nn; - - - for ( nn = 0; nn < num_hints; nn++ ) - { - PSH_Hint hint = sort[nn]; - FT_Pos d = org_u - hint->org_pos; - - - if ( d < threshold && -d < threshold ) - { - psh_point_set_strong( point ); - point->flags2 |= PSH_POINT_EDGE_MIN; - point->hint = hint; - break; - } - } - } - else if ( point_dir == -major_dir ) - { - FT_UInt nn; - - - for ( nn = 0; nn < num_hints; nn++ ) - { - PSH_Hint hint = sort[nn]; - FT_Pos d = org_u - hint->org_pos - hint->org_len; - - - if ( d < threshold && -d < threshold ) - { - psh_point_set_strong( point ); - point->flags2 |= PSH_POINT_EDGE_MAX; - point->hint = hint; - break; - } - } - } - } - -#if 1 - else if ( psh_point_is_extremum( point ) ) - { - /* treat extrema as special cases for stem edge alignment */ - FT_UInt nn, min_flag, max_flag; - - - if ( major_dir == PSH_DIR_HORIZONTAL ) - { - min_flag = PSH_POINT_POSITIVE; - max_flag = PSH_POINT_NEGATIVE; - } - else - { - min_flag = PSH_POINT_NEGATIVE; - max_flag = PSH_POINT_POSITIVE; - } - - if ( point->flags2 & min_flag ) - { - for ( nn = 0; nn < num_hints; nn++ ) - { - PSH_Hint hint = sort[nn]; - FT_Pos d = org_u - hint->org_pos; - - - if ( d < threshold && -d < threshold ) - { - point->flags2 |= PSH_POINT_EDGE_MIN; - point->hint = hint; - psh_point_set_strong( point ); - break; - } - } - } - else if ( point->flags2 & max_flag ) - { - for ( nn = 0; nn < num_hints; nn++ ) - { - PSH_Hint hint = sort[nn]; - FT_Pos d = org_u - hint->org_pos - hint->org_len; - - - if ( d < threshold && -d < threshold ) - { - point->flags2 |= PSH_POINT_EDGE_MAX; - point->hint = hint; - psh_point_set_strong( point ); - break; - } - } - } - - if ( point->hint == NULL ) - { - for ( nn = 0; nn < num_hints; nn++ ) - { - PSH_Hint hint = sort[nn]; - - - if ( org_u >= hint->org_pos && - org_u <= hint->org_pos + hint->org_len ) - { - point->hint = hint; - break; - } - } - } - } - -#endif /* 1 */ - } - } - - - /* the accepted shift for strong points in fractional pixels */ -#define PSH_STRONG_THRESHOLD 32 - - /* the maximum shift value in font units */ -#define PSH_STRONG_THRESHOLD_MAXIMUM 30 - - - /* find strong points in a glyph */ - static void - psh_glyph_find_strong_points( PSH_Glyph glyph, - FT_Int dimension ) - { - /* a point is `strong' if it is located on a stem edge and */ - /* has an `in' or `out' tangent parallel to the hint's direction */ - - PSH_Hint_Table table = &glyph->hint_tables[dimension]; - PS_Mask mask = table->hint_masks->masks; - FT_UInt num_masks = table->hint_masks->num_masks; - FT_UInt first = 0; - FT_Int major_dir = dimension == 0 ? PSH_DIR_VERTICAL - : PSH_DIR_HORIZONTAL; - PSH_Dimension dim = &glyph->globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - FT_Int threshold; - - - threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale ); - if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM ) - threshold = PSH_STRONG_THRESHOLD_MAXIMUM; - - /* process secondary hints to `selected' points */ - if ( num_masks > 1 && glyph->num_points > 0 ) - { - /* the `endchar' op can reduce the number of points */ - first = mask->end_point > glyph->num_points - ? glyph->num_points - : mask->end_point; - mask++; - for ( ; num_masks > 1; num_masks--, mask++ ) - { - FT_UInt next = FT_MIN( mask->end_point, glyph->num_points ); - - - if ( next > first ) - { - FT_UInt count = next - first; - PSH_Point point = glyph->points + first; - - - psh_hint_table_activate_mask( table, mask ); - - psh_hint_table_find_strong_points( table, point, count, - threshold, major_dir ); - } - first = next; - } - } - - /* process primary hints for all points */ - if ( num_masks == 1 ) - { - FT_UInt count = glyph->num_points; - PSH_Point point = glyph->points; - - - psh_hint_table_activate_mask( table, table->hint_masks->masks ); - - psh_hint_table_find_strong_points( table, point, count, - threshold, major_dir ); - } - - /* now, certain points may have been attached to a hint and */ - /* not marked as strong; update their flags then */ - { - FT_UInt count = glyph->num_points; - PSH_Point point = glyph->points; - - - for ( ; count > 0; count--, point++ ) - if ( point->hint && !psh_point_is_strong( point ) ) - psh_point_set_strong( point ); - } - } - - - /* find points in a glyph which are in a blue zone and have `in' or */ - /* `out' tangents parallel to the horizontal axis */ - static void - psh_glyph_find_blue_points( PSH_Blues blues, - PSH_Glyph glyph ) - { - PSH_Blue_Table table; - PSH_Blue_Zone zone; - FT_UInt glyph_count = glyph->num_points; - FT_UInt blue_count; - PSH_Point point = glyph->points; - - - for ( ; glyph_count > 0; glyph_count--, point++ ) - { - FT_Pos y; - - - /* check tangents */ - if ( !PSH_DIR_COMPARE( point->dir_in, PSH_DIR_HORIZONTAL ) && - !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) ) - continue; - - /* skip strong points */ - if ( psh_point_is_strong( point ) ) - continue; - - y = point->org_u; - - /* look up top zones */ - table = &blues->normal_top; - blue_count = table->count; - zone = table->zones; - - for ( ; blue_count > 0; blue_count--, zone++ ) - { - FT_Pos delta = y - zone->org_bottom; - - - if ( delta < -blues->blue_fuzz ) - break; - - if ( y <= zone->org_top + blues->blue_fuzz ) - if ( blues->no_overshoots || delta <= blues->blue_threshold ) - { - point->cur_u = zone->cur_bottom; - psh_point_set_strong( point ); - psh_point_set_fitted( point ); - } - } - - /* look up bottom zones */ - table = &blues->normal_bottom; - blue_count = table->count; - zone = table->zones + blue_count - 1; - - for ( ; blue_count > 0; blue_count--, zone-- ) - { - FT_Pos delta = zone->org_top - y; - - - if ( delta < -blues->blue_fuzz ) - break; - - if ( y >= zone->org_bottom - blues->blue_fuzz ) - if ( blues->no_overshoots || delta < blues->blue_threshold ) - { - point->cur_u = zone->cur_top; - psh_point_set_strong( point ); - psh_point_set_fitted( point ); - } - } - } - } - - - /* interpolate strong points with the help of hinted coordinates */ - static void - psh_glyph_interpolate_strong_points( PSH_Glyph glyph, - FT_Int dimension ) - { - PSH_Dimension dim = &glyph->globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - - FT_UInt count = glyph->num_points; - PSH_Point point = glyph->points; - - - for ( ; count > 0; count--, point++ ) - { - PSH_Hint hint = point->hint; - - - if ( hint ) - { - FT_Pos delta; - - - if ( psh_point_is_edge_min( point ) ) - point->cur_u = hint->cur_pos; - - else if ( psh_point_is_edge_max( point ) ) - point->cur_u = hint->cur_pos + hint->cur_len; - - else - { - delta = point->org_u - hint->org_pos; - - if ( delta <= 0 ) - point->cur_u = hint->cur_pos + FT_MulFix( delta, scale ); - - else if ( delta >= hint->org_len ) - point->cur_u = hint->cur_pos + hint->cur_len + - FT_MulFix( delta - hint->org_len, scale ); - - else /* hint->org_len > 0 */ - point->cur_u = hint->cur_pos + - FT_MulDiv( delta, hint->cur_len, - hint->org_len ); - } - psh_point_set_fitted( point ); - } - } - } - - -#define PSH_MAX_STRONG_INTERNAL 16 - - static void - psh_glyph_interpolate_normal_points( PSH_Glyph glyph, - FT_Int dimension ) - { - -#if 1 - /* first technique: a point is strong if it is a local extremum */ - - PSH_Dimension dim = &glyph->globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - FT_Memory memory = glyph->memory; - - PSH_Point* strongs = NULL; - PSH_Point strongs_0[PSH_MAX_STRONG_INTERNAL]; - FT_UInt num_strongs = 0; - - PSH_Point points = glyph->points; - PSH_Point points_end = points + glyph->num_points; - PSH_Point point; - - - /* first count the number of strong points */ - for ( point = points; point < points_end; point++ ) - { - if ( psh_point_is_strong( point ) ) - num_strongs++; - } - - if ( num_strongs == 0 ) /* nothing to do here */ - return; - - /* allocate an array to store a list of points, */ - /* stored in increasing org_u order */ - if ( num_strongs <= PSH_MAX_STRONG_INTERNAL ) - strongs = strongs_0; - else - { - FT_Error error; - - - if ( FT_NEW_ARRAY( strongs, num_strongs ) ) - return; - } - - num_strongs = 0; - for ( point = points; point < points_end; point++ ) - { - PSH_Point* insert; - - - if ( !psh_point_is_strong( point ) ) - continue; - - for ( insert = strongs + num_strongs; insert > strongs; insert-- ) - { - if ( insert[-1]->org_u <= point->org_u ) - break; - - insert[0] = insert[-1]; - } - insert[0] = point; - num_strongs++; - } - - /* now try to interpolate all normal points */ - for ( point = points; point < points_end; point++ ) - { - if ( psh_point_is_strong( point ) ) - continue; - - /* sometimes, some local extrema are smooth points */ - if ( psh_point_is_smooth( point ) ) - { - if ( point->dir_in == PSH_DIR_NONE || - point->dir_in != point->dir_out ) - continue; - - if ( !psh_point_is_extremum( point ) && - !psh_point_is_inflex( point ) ) - continue; - - point->flags &= ~PSH_POINT_SMOOTH; - } - - /* find best enclosing point coordinates then interpolate */ - { - PSH_Point before, after; - FT_UInt nn; - - - for ( nn = 0; nn < num_strongs; nn++ ) - if ( strongs[nn]->org_u > point->org_u ) - break; - - if ( nn == 0 ) /* point before the first strong point */ - { - after = strongs[0]; - - point->cur_u = after->cur_u + - FT_MulFix( point->org_u - after->org_u, - scale ); - } - else - { - before = strongs[nn - 1]; - - for ( nn = num_strongs; nn > 0; nn-- ) - if ( strongs[nn - 1]->org_u < point->org_u ) - break; - - if ( nn == num_strongs ) /* point is after last strong point */ - { - before = strongs[nn - 1]; - - point->cur_u = before->cur_u + - FT_MulFix( point->org_u - before->org_u, - scale ); - } - else - { - FT_Pos u; - - - after = strongs[nn]; - - /* now interpolate point between before and after */ - u = point->org_u; - - if ( u == before->org_u ) - point->cur_u = before->cur_u; - - else if ( u == after->org_u ) - point->cur_u = after->cur_u; - - else - point->cur_u = before->cur_u + - FT_MulDiv( u - before->org_u, - after->cur_u - before->cur_u, - after->org_u - before->org_u ); - } - } - psh_point_set_fitted( point ); - } - } - - if ( strongs != strongs_0 ) - FT_FREE( strongs ); - -#endif /* 1 */ - - } - - - /* interpolate other points */ - static void - psh_glyph_interpolate_other_points( PSH_Glyph glyph, - FT_Int dimension ) - { - PSH_Dimension dim = &glyph->globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - FT_Fixed delta = dim->scale_delta; - PSH_Contour contour = glyph->contours; - FT_UInt num_contours = glyph->num_contours; - - - for ( ; num_contours > 0; num_contours--, contour++ ) - { - PSH_Point start = contour->start; - PSH_Point first, next, point; - FT_UInt fit_count; - - - /* count the number of strong points in this contour */ - next = start + contour->count; - fit_count = 0; - first = NULL; - - for ( point = start; point < next; point++ ) - if ( psh_point_is_fitted( point ) ) - { - if ( !first ) - first = point; - - fit_count++; - } - - /* if there are less than 2 fitted points in the contour, we */ - /* simply scale and eventually translate the contour points */ - if ( fit_count < 2 ) - { - if ( fit_count == 1 ) - delta = first->cur_u - FT_MulFix( first->org_u, scale ); - - for ( point = start; point < next; point++ ) - if ( point != first ) - point->cur_u = FT_MulFix( point->org_u, scale ) + delta; - - goto Next_Contour; - } - - /* there are more than 2 strong points in this contour; we */ - /* need to interpolate weak points between them */ - start = first; - do - { - /* skip consecutive fitted points */ - for (;;) - { - next = first->next; - if ( next == start ) - goto Next_Contour; - - if ( !psh_point_is_fitted( next ) ) - break; - - first = next; - } - - /* find next fitted point after unfitted one */ - for (;;) - { - next = next->next; - if ( psh_point_is_fitted( next ) ) - break; - } - - /* now interpolate between them */ - { - FT_Pos org_a, org_ab, cur_a, cur_ab; - FT_Pos org_c, org_ac, cur_c; - FT_Fixed scale_ab; - - - if ( first->org_u <= next->org_u ) - { - org_a = first->org_u; - cur_a = first->cur_u; - org_ab = next->org_u - org_a; - cur_ab = next->cur_u - cur_a; - } - else - { - org_a = next->org_u; - cur_a = next->cur_u; - org_ab = first->org_u - org_a; - cur_ab = first->cur_u - cur_a; - } - - scale_ab = 0x10000L; - if ( org_ab > 0 ) - scale_ab = FT_DivFix( cur_ab, org_ab ); - - point = first->next; - do - { - org_c = point->org_u; - org_ac = org_c - org_a; - - if ( org_ac <= 0 ) - { - /* on the left of the interpolation zone */ - cur_c = cur_a + FT_MulFix( org_ac, scale ); - } - else if ( org_ac >= org_ab ) - { - /* on the right on the interpolation zone */ - cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale ); - } - else - { - /* within the interpolation zone */ - cur_c = cur_a + FT_MulFix( org_ac, scale_ab ); - } - - point->cur_u = cur_c; - - point = point->next; - - } while ( point != next ); - } - - /* keep going until all points in the contours have been processed */ - first = next; - - } while ( first != start ); - - Next_Contour: - ; - } - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** HIGH-LEVEL INTERFACE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_Error - ps_hints_apply( PS_Hints ps_hints, - FT_Outline* outline, - PSH_Globals globals, - FT_Render_Mode hint_mode ) - { - PSH_GlyphRec glyphrec; - PSH_Glyph glyph = &glyphrec; - FT_Error error; -#ifdef DEBUG_HINTER - FT_Memory memory; -#endif - FT_Int dimension; - - - /* something to do? */ - if ( outline->n_points == 0 || outline->n_contours == 0 ) - return FT_Err_Ok; - -#ifdef DEBUG_HINTER - - memory = globals->memory; - - if ( ps_debug_glyph ) - { - psh_glyph_done( ps_debug_glyph ); - FT_FREE( ps_debug_glyph ); - } - - if ( FT_NEW( glyph ) ) - return error; - - ps_debug_glyph = glyph; - -#endif /* DEBUG_HINTER */ - - error = psh_glyph_init( glyph, outline, ps_hints, globals ); - if ( error ) - goto Exit; - - /* try to optimize the y_scale so that the top of non-capital letters - * is aligned on a pixel boundary whenever possible - */ - { - PSH_Dimension dim_x = &glyph->globals->dimension[0]; - PSH_Dimension dim_y = &glyph->globals->dimension[1]; - - FT_Fixed x_scale = dim_x->scale_mult; - FT_Fixed y_scale = dim_y->scale_mult; - - FT_Fixed old_x_scale = x_scale; - FT_Fixed old_y_scale = y_scale; - - FT_Fixed scaled; - FT_Fixed fitted; - - FT_Bool rescale = FALSE; - - - scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale ); - fitted = FT_PIX_ROUND( scaled ); - - if ( fitted != 0 && scaled != fitted ) - { - rescale = TRUE; - - y_scale = FT_MulDiv( y_scale, fitted, scaled ); - - if ( fitted < scaled ) - x_scale -= x_scale / 50; - - psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 ); - } - - glyph->do_horz_hints = 1; - glyph->do_vert_hints = 1; - - glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || - hint_mode == FT_RENDER_MODE_LCD ); - - glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || - hint_mode == FT_RENDER_MODE_LCD_V ); - - glyph->do_stem_adjust = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT ); - - for ( dimension = 0; dimension < 2; dimension++ ) - { - /* load outline coordinates into glyph */ - psh_glyph_load_points( glyph, dimension ); - - /* compute local extrema */ - psh_glyph_compute_extrema( glyph ); - - /* compute aligned stem/hints positions */ - psh_hint_table_align_hints( &glyph->hint_tables[dimension], - glyph->globals, - dimension, - glyph ); - - /* find strong points, align them, then interpolate others */ - psh_glyph_find_strong_points( glyph, dimension ); - if ( dimension == 1 ) - psh_glyph_find_blue_points( &globals->blues, glyph ); - psh_glyph_interpolate_strong_points( glyph, dimension ); - psh_glyph_interpolate_normal_points( glyph, dimension ); - psh_glyph_interpolate_other_points( glyph, dimension ); - - /* save hinted coordinates back to outline */ - psh_glyph_save_points( glyph, dimension ); - - if ( rescale ) - psh_globals_set_scale( glyph->globals, - old_x_scale, old_y_scale, 0, 0 ); - } - } - - Exit: - -#ifndef DEBUG_HINTER - psh_glyph_done( glyph ); -#endif - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/pshinter/pshalgo.h b/3party/freetype/src/pshinter/pshalgo.h deleted file mode 100644 index 8373e5ec29..0000000000 --- a/3party/freetype/src/pshinter/pshalgo.h +++ /dev/null @@ -1,241 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshalgo.h */ -/* */ -/* PostScript hinting algorithm (specification). */ -/* */ -/* Copyright 2001-2015 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 __PSHALGO_H__ -#define __PSHALGO_H__ - - -#include "pshrec.h" -#include "pshglob.h" - - -FT_BEGIN_HEADER - - - /* handle to Hint structure */ - typedef struct PSH_HintRec_* PSH_Hint; - - - /* hint bit-flags */ -#define PSH_HINT_GHOST PS_HINT_FLAG_GHOST -#define PSH_HINT_BOTTOM PS_HINT_FLAG_BOTTOM -#define PSH_HINT_ACTIVE 4U -#define PSH_HINT_FITTED 8U - - -#define psh_hint_is_active( x ) ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 ) -#define psh_hint_is_ghost( x ) ( ( (x)->flags & PSH_HINT_GHOST ) != 0 ) -#define psh_hint_is_fitted( x ) ( ( (x)->flags & PSH_HINT_FITTED ) != 0 ) - -#define psh_hint_activate( x ) (x)->flags |= PSH_HINT_ACTIVE -#define psh_hint_deactivate( x ) (x)->flags &= ~PSH_HINT_ACTIVE -#define psh_hint_set_fitted( x ) (x)->flags |= PSH_HINT_FITTED - - - /* hint structure */ - typedef struct PSH_HintRec_ - { - FT_Int org_pos; - FT_Int org_len; - FT_Pos cur_pos; - FT_Pos cur_len; - FT_UInt flags; - PSH_Hint parent; - FT_Int order; - - } PSH_HintRec; - - - /* this is an interpolation zone used for strong points; */ - /* weak points are interpolated according to their strong */ - /* neighbours */ - typedef struct PSH_ZoneRec_ - { - FT_Fixed scale; - FT_Fixed delta; - FT_Pos min; - FT_Pos max; - - } PSH_ZoneRec, *PSH_Zone; - - - typedef struct PSH_Hint_TableRec_ - { - FT_UInt max_hints; - FT_UInt num_hints; - PSH_Hint hints; - PSH_Hint* sort; - PSH_Hint* sort_global; - FT_UInt num_zones; - PSH_ZoneRec* zones; - PSH_Zone zone; - PS_Mask_Table hint_masks; - PS_Mask_Table counter_masks; - - } PSH_Hint_TableRec, *PSH_Hint_Table; - - - typedef struct PSH_PointRec_* PSH_Point; - typedef struct PSH_ContourRec_* PSH_Contour; - - enum - { - PSH_DIR_NONE = 4, - PSH_DIR_UP = -1, - PSH_DIR_DOWN = 1, - PSH_DIR_LEFT = -2, - PSH_DIR_RIGHT = 2 - }; - -#define PSH_DIR_HORIZONTAL 2 -#define PSH_DIR_VERTICAL 1 - -#define PSH_DIR_COMPARE( d1, d2 ) ( (d1) == (d2) || (d1) == -(d2) ) -#define PSH_DIR_IS_HORIZONTAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL ) -#define PSH_DIR_IS_VERTICAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL ) - - - /* the following bit-flags are computed once by the glyph */ - /* analyzer, for both dimensions */ -#define PSH_POINT_OFF 1U /* point is off the curve */ -#define PSH_POINT_SMOOTH 2U /* point is smooth */ -#define PSH_POINT_INFLEX 4U /* point is inflection */ - - -#define psh_point_is_smooth( p ) ( (p)->flags & PSH_POINT_SMOOTH ) -#define psh_point_is_off( p ) ( (p)->flags & PSH_POINT_OFF ) -#define psh_point_is_inflex( p ) ( (p)->flags & PSH_POINT_INFLEX ) - -#define psh_point_set_smooth( p ) (p)->flags |= PSH_POINT_SMOOTH -#define psh_point_set_off( p ) (p)->flags |= PSH_POINT_OFF -#define psh_point_set_inflex( p ) (p)->flags |= PSH_POINT_INFLEX - - - /* the following bit-flags are re-computed for each dimension */ -#define PSH_POINT_STRONG 16U /* point is strong */ -#define PSH_POINT_FITTED 32U /* point is already fitted */ -#define PSH_POINT_EXTREMUM 64U /* point is local extremum */ -#define PSH_POINT_POSITIVE 128U /* extremum has positive contour flow */ -#define PSH_POINT_NEGATIVE 256U /* extremum has negative contour flow */ -#define PSH_POINT_EDGE_MIN 512U /* point is aligned to left/bottom stem edge */ -#define PSH_POINT_EDGE_MAX 1024U /* point is aligned to top/right stem edge */ - - -#define psh_point_is_strong( p ) ( (p)->flags2 & PSH_POINT_STRONG ) -#define psh_point_is_fitted( p ) ( (p)->flags2 & PSH_POINT_FITTED ) -#define psh_point_is_extremum( p ) ( (p)->flags2 & PSH_POINT_EXTREMUM ) -#define psh_point_is_positive( p ) ( (p)->flags2 & PSH_POINT_POSITIVE ) -#define psh_point_is_negative( p ) ( (p)->flags2 & PSH_POINT_NEGATIVE ) -#define psh_point_is_edge_min( p ) ( (p)->flags2 & PSH_POINT_EDGE_MIN ) -#define psh_point_is_edge_max( p ) ( (p)->flags2 & PSH_POINT_EDGE_MAX ) - -#define psh_point_set_strong( p ) (p)->flags2 |= PSH_POINT_STRONG -#define psh_point_set_fitted( p ) (p)->flags2 |= PSH_POINT_FITTED -#define psh_point_set_extremum( p ) (p)->flags2 |= PSH_POINT_EXTREMUM -#define psh_point_set_positive( p ) (p)->flags2 |= PSH_POINT_POSITIVE -#define psh_point_set_negative( p ) (p)->flags2 |= PSH_POINT_NEGATIVE -#define psh_point_set_edge_min( p ) (p)->flags2 |= PSH_POINT_EDGE_MIN -#define psh_point_set_edge_max( p ) (p)->flags2 |= PSH_POINT_EDGE_MAX - - - typedef struct PSH_PointRec_ - { - PSH_Point prev; - PSH_Point next; - PSH_Contour contour; - FT_UInt flags; - FT_UInt flags2; - FT_Char dir_in; - FT_Char dir_out; - PSH_Hint hint; - FT_Pos org_u; - FT_Pos org_v; - FT_Pos cur_u; -#ifdef DEBUG_HINTER - FT_Pos org_x; - FT_Pos cur_x; - FT_Pos org_y; - FT_Pos cur_y; - FT_UInt flags_x; - FT_UInt flags_y; -#endif - - } PSH_PointRec; - - - typedef struct PSH_ContourRec_ - { - PSH_Point start; - FT_UInt count; - - } PSH_ContourRec; - - - typedef struct PSH_GlyphRec_ - { - FT_UInt num_points; - FT_UInt num_contours; - - PSH_Point points; - PSH_Contour contours; - - FT_Memory memory; - FT_Outline* outline; - PSH_Globals globals; - PSH_Hint_TableRec hint_tables[2]; - - FT_Bool vertical; - FT_Int major_dir; - FT_Int minor_dir; - - FT_Bool do_horz_hints; - FT_Bool do_vert_hints; - FT_Bool do_horz_snapping; - FT_Bool do_vert_snapping; - FT_Bool do_stem_adjust; - - } PSH_GlyphRec, *PSH_Glyph; - - -#ifdef DEBUG_HINTER - extern PSH_Hint_Table ps_debug_hint_table; - - typedef void - (*PSH_HintFunc)( PSH_Hint hint, - FT_Bool vertical ); - - extern PSH_HintFunc ps_debug_hint_func; - - extern PSH_Glyph ps_debug_glyph; -#endif - - - extern FT_Error - ps_hints_apply( PS_Hints ps_hints, - FT_Outline* outline, - PSH_Globals globals, - FT_Render_Mode hint_mode ); - - -FT_END_HEADER - - -#endif /* __PSHALGO_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pshinter/pshglob.c b/3party/freetype/src/pshinter/pshglob.c deleted file mode 100644 index 6723b717e8..0000000000 --- a/3party/freetype/src/pshinter/pshglob.c +++ /dev/null @@ -1,795 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshglob.c */ -/* */ -/* PostScript hinter global hinting management (body). */ -/* Inspired by the new auto-hinter module. */ -/* */ -/* Copyright 2001-2015 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "pshglob.h" - -#ifdef DEBUG_HINTER - PSH_Globals ps_debug_globals = NULL; -#endif - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** STANDARD WIDTHS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* scale the widths/heights table */ - static void - psh_globals_scale_widths( PSH_Globals globals, - FT_UInt direction ) - { - PSH_Dimension dim = &globals->dimension[direction]; - PSH_Widths stdw = &dim->stdw; - FT_UInt count = stdw->count; - PSH_Width width = stdw->widths; - PSH_Width stand = width; /* standard width/height */ - FT_Fixed scale = dim->scale_mult; - - - if ( count > 0 ) - { - width->cur = FT_MulFix( width->org, scale ); - width->fit = FT_PIX_ROUND( width->cur ); - - width++; - count--; - - for ( ; count > 0; count--, width++ ) - { - FT_Pos w, dist; - - - w = FT_MulFix( width->org, scale ); - dist = w - stand->cur; - - if ( dist < 0 ) - dist = -dist; - - if ( dist < 128 ) - w = stand->cur; - - width->cur = w; - width->fit = FT_PIX_ROUND( w ); - } - } - } - - -#if 0 - - /* org_width is is font units, result in device pixels, 26.6 format */ - FT_LOCAL_DEF( FT_Pos ) - psh_dimension_snap_width( PSH_Dimension dimension, - FT_Int org_width ) - { - FT_UInt n; - FT_Pos width = FT_MulFix( org_width, dimension->scale_mult ); - FT_Pos best = 64 + 32 + 2; - FT_Pos reference = width; - - - for ( n = 0; n < dimension->stdw.count; n++ ) - { - FT_Pos w; - FT_Pos dist; - - - w = dimension->stdw.widths[n].cur; - dist = width - w; - if ( dist < 0 ) - dist = -dist; - if ( dist < best ) - { - best = dist; - reference = w; - } - } - - if ( width >= reference ) - { - width -= 0x21; - if ( width < reference ) - width = reference; - } - else - { - width += 0x21; - if ( width > reference ) - width = reference; - } - - return width; - } - -#endif /* 0 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** BLUE ZONES *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - psh_blues_set_zones_0( PSH_Blues target, - FT_Bool is_others, - FT_UInt read_count, - FT_Short* read, - PSH_Blue_Table top_table, - PSH_Blue_Table bot_table ) - { - FT_UInt count_top = top_table->count; - FT_UInt count_bot = bot_table->count; - FT_Bool first = 1; - - FT_UNUSED( target ); - - - for ( ; read_count > 1; read_count -= 2 ) - { - FT_Int reference, delta; - FT_UInt count; - PSH_Blue_Zone zones, zone; - FT_Bool top; - - - /* read blue zone entry, and select target top/bottom zone */ - top = 0; - if ( first || is_others ) - { - reference = read[1]; - delta = read[0] - reference; - - zones = bot_table->zones; - count = count_bot; - first = 0; - } - else - { - reference = read[0]; - delta = read[1] - reference; - - zones = top_table->zones; - count = count_top; - top = 1; - } - - /* insert into sorted table */ - zone = zones; - for ( ; count > 0; count--, zone++ ) - { - if ( reference < zone->org_ref ) - break; - - if ( reference == zone->org_ref ) - { - FT_Int delta0 = zone->org_delta; - - - /* we have two zones on the same reference position -- */ - /* only keep the largest one */ - if ( delta < 0 ) - { - if ( delta < delta0 ) - zone->org_delta = delta; - } - else - { - if ( delta > delta0 ) - zone->org_delta = delta; - } - goto Skip; - } - } - - for ( ; count > 0; count-- ) - zone[count] = zone[count-1]; - - zone->org_ref = reference; - zone->org_delta = delta; - - if ( top ) - count_top++; - else - count_bot++; - - Skip: - read += 2; - } - - top_table->count = count_top; - bot_table->count = count_bot; - } - - - /* Re-read blue zones from the original fonts and store them into out */ - /* private structure. This function re-orders, sanitizes and */ - /* fuzz-expands the zones as well. */ - static void - psh_blues_set_zones( PSH_Blues target, - FT_UInt count, - FT_Short* blues, - FT_UInt count_others, - FT_Short* other_blues, - FT_Int fuzz, - FT_Int family ) - { - PSH_Blue_Table top_table, bot_table; - FT_UInt count_top, count_bot; - - - if ( family ) - { - top_table = &target->family_top; - bot_table = &target->family_bottom; - } - else - { - top_table = &target->normal_top; - bot_table = &target->normal_bottom; - } - - /* read the input blue zones, and build two sorted tables */ - /* (one for the top zones, the other for the bottom zones) */ - top_table->count = 0; - bot_table->count = 0; - - /* first, the blues */ - psh_blues_set_zones_0( target, 0, - count, blues, top_table, bot_table ); - psh_blues_set_zones_0( target, 1, - count_others, other_blues, top_table, bot_table ); - - count_top = top_table->count; - count_bot = bot_table->count; - - /* sanitize top table */ - if ( count_top > 0 ) - { - PSH_Blue_Zone zone = top_table->zones; - - - for ( count = count_top; count > 0; count--, zone++ ) - { - FT_Int delta; - - - if ( count > 1 ) - { - delta = zone[1].org_ref - zone[0].org_ref; - if ( zone->org_delta > delta ) - zone->org_delta = delta; - } - - zone->org_bottom = zone->org_ref; - zone->org_top = zone->org_delta + zone->org_ref; - } - } - - /* sanitize bottom table */ - if ( count_bot > 0 ) - { - PSH_Blue_Zone zone = bot_table->zones; - - - for ( count = count_bot; count > 0; count--, zone++ ) - { - FT_Int delta; - - - if ( count > 1 ) - { - delta = zone[0].org_ref - zone[1].org_ref; - if ( zone->org_delta < delta ) - zone->org_delta = delta; - } - - zone->org_top = zone->org_ref; - zone->org_bottom = zone->org_delta + zone->org_ref; - } - } - - /* expand top and bottom tables with blue fuzz */ - { - FT_Int dim, top, bot, delta; - PSH_Blue_Zone zone; - - - zone = top_table->zones; - count = count_top; - - for ( dim = 1; dim >= 0; dim-- ) - { - if ( count > 0 ) - { - /* expand the bottom of the lowest zone normally */ - zone->org_bottom -= fuzz; - - /* expand the top and bottom of intermediate zones; */ - /* checking that the interval is smaller than the fuzz */ - top = zone->org_top; - - for ( count--; count > 0; count-- ) - { - bot = zone[1].org_bottom; - delta = bot - top; - - if ( delta < 2 * fuzz ) - zone[0].org_top = zone[1].org_bottom = top + delta / 2; - else - { - zone[0].org_top = top + fuzz; - zone[1].org_bottom = bot - fuzz; - } - - zone++; - top = zone->org_top; - } - - /* expand the top of the highest zone normally */ - zone->org_top = top + fuzz; - } - zone = bot_table->zones; - count = count_bot; - } - } - } - - - /* reset the blues table when the device transform changes */ - static void - psh_blues_scale_zones( PSH_Blues blues, - FT_Fixed scale, - FT_Pos delta ) - { - FT_UInt count; - FT_UInt num; - PSH_Blue_Table table = NULL; - - /* */ - /* Determine whether we need to suppress overshoots or */ - /* not. We simply need to compare the vertical scale */ - /* parameter to the raw bluescale value. Here is why: */ - /* */ - /* We need to suppress overshoots for all pointsizes. */ - /* At 300dpi that satisfies: */ - /* */ - /* pointsize < 240*bluescale + 0.49 */ - /* */ - /* This corresponds to: */ - /* */ - /* pixelsize < 1000*bluescale + 49/24 */ - /* */ - /* scale*EM_Size < 1000*bluescale + 49/24 */ - /* */ - /* However, for normal Type 1 fonts, EM_Size is 1000! */ - /* We thus only check: */ - /* */ - /* scale < bluescale + 49/24000 */ - /* */ - /* which we shorten to */ - /* */ - /* "scale < bluescale" */ - /* */ - /* Note that `blue_scale' is stored 1000 times its real */ - /* value, and that `scale' converts from font units to */ - /* fractional pixels. */ - /* */ - - /* 1000 / 64 = 125 / 8 */ - if ( scale >= 0x20C49BAL ) - blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 ); - else - blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 ); - - /* */ - /* The blue threshold is the font units distance under */ - /* which overshoots are suppressed due to the BlueShift */ - /* even if the scale is greater than BlueScale. */ - /* */ - /* It is the smallest distance such that */ - /* */ - /* dist <= BlueShift && dist*scale <= 0.5 pixels */ - /* */ - { - FT_Int threshold = blues->blue_shift; - - - while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 ) - threshold--; - - blues->blue_threshold = threshold; - } - - for ( num = 0; num < 4; num++ ) - { - PSH_Blue_Zone zone; - - - switch ( num ) - { - case 0: - table = &blues->normal_top; - break; - case 1: - table = &blues->normal_bottom; - break; - case 2: - table = &blues->family_top; - break; - default: - table = &blues->family_bottom; - break; - } - - zone = table->zones; - count = table->count; - for ( ; count > 0; count--, zone++ ) - { - zone->cur_top = FT_MulFix( zone->org_top, scale ) + delta; - zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta; - zone->cur_ref = FT_MulFix( zone->org_ref, scale ) + delta; - zone->cur_delta = FT_MulFix( zone->org_delta, scale ); - - /* round scaled reference position */ - zone->cur_ref = FT_PIX_ROUND( zone->cur_ref ); - -#if 0 - if ( zone->cur_ref > zone->cur_top ) - zone->cur_ref -= 64; - else if ( zone->cur_ref < zone->cur_bottom ) - zone->cur_ref += 64; -#endif - } - } - - /* process the families now */ - - for ( num = 0; num < 2; num++ ) - { - PSH_Blue_Zone zone1, zone2; - FT_UInt count1, count2; - PSH_Blue_Table normal, family; - - - switch ( num ) - { - case 0: - normal = &blues->normal_top; - family = &blues->family_top; - break; - - default: - normal = &blues->normal_bottom; - family = &blues->family_bottom; - } - - zone1 = normal->zones; - count1 = normal->count; - - for ( ; count1 > 0; count1--, zone1++ ) - { - /* try to find a family zone whose reference position is less */ - /* than 1 pixel far from the current zone */ - zone2 = family->zones; - count2 = family->count; - - for ( ; count2 > 0; count2--, zone2++ ) - { - FT_Pos Delta; - - - Delta = zone1->org_ref - zone2->org_ref; - if ( Delta < 0 ) - Delta = -Delta; - - if ( FT_MulFix( Delta, scale ) < 64 ) - { - zone1->cur_top = zone2->cur_top; - zone1->cur_bottom = zone2->cur_bottom; - zone1->cur_ref = zone2->cur_ref; - zone1->cur_delta = zone2->cur_delta; - break; - } - } - } - } - } - - - /* calculate the maximum height of given blue zones */ - static FT_Short - psh_calc_max_height( FT_UInt num, - const FT_Short* values, - FT_Short cur_max ) - { - FT_UInt count; - - - for ( count = 0; count < num; count += 2 ) - { - FT_Short cur_height = values[count + 1] - values[count]; - - - if ( cur_height > cur_max ) - cur_max = cur_height; - } - - return cur_max; - } - - - FT_LOCAL_DEF( void ) - psh_blues_snap_stem( PSH_Blues blues, - FT_Int stem_top, - FT_Int stem_bot, - PSH_Alignment alignment ) - { - PSH_Blue_Table table; - FT_UInt count; - FT_Pos delta; - PSH_Blue_Zone zone; - FT_Int no_shoots; - - - alignment->align = PSH_BLUE_ALIGN_NONE; - - no_shoots = blues->no_overshoots; - - /* look up stem top in top zones table */ - table = &blues->normal_top; - count = table->count; - zone = table->zones; - - for ( ; count > 0; count--, zone++ ) - { - delta = stem_top - zone->org_bottom; - if ( delta < -blues->blue_fuzz ) - break; - - if ( stem_top <= zone->org_top + blues->blue_fuzz ) - { - if ( no_shoots || delta <= blues->blue_threshold ) - { - alignment->align |= PSH_BLUE_ALIGN_TOP; - alignment->align_top = zone->cur_ref; - } - break; - } - } - - /* look up stem bottom in bottom zones table */ - table = &blues->normal_bottom; - count = table->count; - zone = table->zones + count-1; - - for ( ; count > 0; count--, zone-- ) - { - delta = zone->org_top - stem_bot; - if ( delta < -blues->blue_fuzz ) - break; - - if ( stem_bot >= zone->org_bottom - blues->blue_fuzz ) - { - if ( no_shoots || delta < blues->blue_threshold ) - { - alignment->align |= PSH_BLUE_ALIGN_BOT; - alignment->align_bot = zone->cur_ref; - } - break; - } - } - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GLOBAL HINTS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - psh_globals_destroy( PSH_Globals globals ) - { - if ( globals ) - { - FT_Memory memory; - - - memory = globals->memory; - globals->dimension[0].stdw.count = 0; - globals->dimension[1].stdw.count = 0; - - globals->blues.normal_top.count = 0; - globals->blues.normal_bottom.count = 0; - globals->blues.family_top.count = 0; - globals->blues.family_bottom.count = 0; - - FT_FREE( globals ); - -#ifdef DEBUG_HINTER - ps_debug_globals = NULL; -#endif - } - } - - - static FT_Error - psh_globals_new( FT_Memory memory, - T1_Private* priv, - PSH_Globals *aglobals ) - { - PSH_Globals globals = NULL; - FT_Error error; - - - if ( !FT_NEW( globals ) ) - { - FT_UInt count; - FT_Short* read; - - - globals->memory = memory; - - /* copy standard widths */ - { - PSH_Dimension dim = &globals->dimension[1]; - PSH_Width write = dim->stdw.widths; - - - write->org = priv->standard_width[0]; - write++; - - read = priv->snap_widths; - for ( count = priv->num_snap_widths; count > 0; count-- ) - { - write->org = *read; - write++; - read++; - } - - dim->stdw.count = priv->num_snap_widths + 1; - } - - /* copy standard heights */ - { - PSH_Dimension dim = &globals->dimension[0]; - PSH_Width write = dim->stdw.widths; - - - write->org = priv->standard_height[0]; - write++; - read = priv->snap_heights; - for ( count = priv->num_snap_heights; count > 0; count-- ) - { - write->org = *read; - write++; - read++; - } - - dim->stdw.count = priv->num_snap_heights + 1; - } - - /* copy blue zones */ - psh_blues_set_zones( &globals->blues, priv->num_blue_values, - priv->blue_values, priv->num_other_blues, - priv->other_blues, priv->blue_fuzz, 0 ); - - psh_blues_set_zones( &globals->blues, priv->num_family_blues, - priv->family_blues, priv->num_family_other_blues, - priv->family_other_blues, priv->blue_fuzz, 1 ); - - /* limit the BlueScale value to `1 / max_of_blue_zone_heights' */ - { - FT_Fixed max_scale; - FT_Short max_height = 1; - - - max_height = psh_calc_max_height( priv->num_blue_values, - priv->blue_values, - max_height ); - max_height = psh_calc_max_height( priv->num_other_blues, - priv->other_blues, - max_height ); - max_height = psh_calc_max_height( priv->num_family_blues, - priv->family_blues, - max_height ); - max_height = psh_calc_max_height( priv->num_family_other_blues, - priv->family_other_blues, - max_height ); - - /* BlueScale is scaled 1000 times */ - max_scale = FT_DivFix( 1000, max_height ); - globals->blues.blue_scale = priv->blue_scale < max_scale - ? priv->blue_scale - : max_scale; - } - - globals->blues.blue_shift = priv->blue_shift; - globals->blues.blue_fuzz = priv->blue_fuzz; - - globals->dimension[0].scale_mult = 0; - globals->dimension[0].scale_delta = 0; - globals->dimension[1].scale_mult = 0; - globals->dimension[1].scale_delta = 0; - -#ifdef DEBUG_HINTER - ps_debug_globals = globals; -#endif - } - - *aglobals = globals; - return error; - } - - - FT_LOCAL_DEF( void ) - psh_globals_set_scale( PSH_Globals globals, - FT_Fixed x_scale, - FT_Fixed y_scale, - FT_Fixed x_delta, - FT_Fixed y_delta ) - { - PSH_Dimension dim; - - - dim = &globals->dimension[0]; - if ( x_scale != dim->scale_mult || - x_delta != dim->scale_delta ) - { - dim->scale_mult = x_scale; - dim->scale_delta = x_delta; - - psh_globals_scale_widths( globals, 0 ); - } - - dim = &globals->dimension[1]; - if ( y_scale != dim->scale_mult || - y_delta != dim->scale_delta ) - { - dim->scale_mult = y_scale; - dim->scale_delta = y_delta; - - psh_globals_scale_widths( globals, 1 ); - psh_blues_scale_zones( &globals->blues, y_scale, y_delta ); - } - } - - - FT_LOCAL_DEF( void ) - psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ) - { - funcs->create = psh_globals_new; - funcs->set_scale = psh_globals_set_scale; - funcs->destroy = psh_globals_destroy; - } - - -/* END */ diff --git a/3party/freetype/src/pshinter/pshglob.h b/3party/freetype/src/pshinter/pshglob.h deleted file mode 100644 index c376df7b9f..0000000000 --- a/3party/freetype/src/pshinter/pshglob.h +++ /dev/null @@ -1,196 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshglob.h */ -/* */ -/* PostScript hinter global hinting management. */ -/* */ -/* Copyright 2001-2015 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 __PSHGLOB_H__ -#define __PSHGLOB_H__ - - -#include FT_FREETYPE_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GLOBAL HINTS INTERNALS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* @constant: */ - /* PS_GLOBALS_MAX_BLUE_ZONES */ - /* */ - /* @description: */ - /* The maximum number of blue zones in a font global hints structure. */ - /* See @PS_Globals_BluesRec. */ - /* */ -#define PS_GLOBALS_MAX_BLUE_ZONES 16 - - - /*************************************************************************/ - /* */ - /* @constant: */ - /* PS_GLOBALS_MAX_STD_WIDTHS */ - /* */ - /* @description: */ - /* The maximum number of standard and snap widths in either the */ - /* horizontal or vertical direction. See @PS_Globals_WidthsRec. */ - /* */ -#define PS_GLOBALS_MAX_STD_WIDTHS 16 - - - /* standard and snap width */ - typedef struct PSH_WidthRec_ - { - FT_Int org; - FT_Pos cur; - FT_Pos fit; - - } PSH_WidthRec, *PSH_Width; - - - /* standard and snap widths table */ - typedef struct PSH_WidthsRec_ - { - FT_UInt count; - PSH_WidthRec widths[PS_GLOBALS_MAX_STD_WIDTHS]; - - } PSH_WidthsRec, *PSH_Widths; - - - typedef struct PSH_DimensionRec_ - { - PSH_WidthsRec stdw; - FT_Fixed scale_mult; - FT_Fixed scale_delta; - - } PSH_DimensionRec, *PSH_Dimension; - - - /* blue zone descriptor */ - typedef struct PSH_Blue_ZoneRec_ - { - FT_Int org_ref; - FT_Int org_delta; - FT_Int org_top; - FT_Int org_bottom; - - FT_Pos cur_ref; - FT_Pos cur_delta; - FT_Pos cur_bottom; - FT_Pos cur_top; - - } PSH_Blue_ZoneRec, *PSH_Blue_Zone; - - - typedef struct PSH_Blue_TableRec_ - { - FT_UInt count; - PSH_Blue_ZoneRec zones[PS_GLOBALS_MAX_BLUE_ZONES]; - - } PSH_Blue_TableRec, *PSH_Blue_Table; - - - /* blue zones table */ - typedef struct PSH_BluesRec_ - { - PSH_Blue_TableRec normal_top; - PSH_Blue_TableRec normal_bottom; - PSH_Blue_TableRec family_top; - PSH_Blue_TableRec family_bottom; - - FT_Fixed blue_scale; - FT_Int blue_shift; - FT_Int blue_threshold; - FT_Int blue_fuzz; - FT_Bool no_overshoots; - - } PSH_BluesRec, *PSH_Blues; - - - /* font globals. */ - /* dimension 0 => X coordinates + vertical hints/stems */ - /* dimension 1 => Y coordinates + horizontal hints/stems */ - typedef struct PSH_GlobalsRec_ - { - FT_Memory memory; - PSH_DimensionRec dimension[2]; - PSH_BluesRec blues; - - } PSH_GlobalsRec; - - -#define PSH_BLUE_ALIGN_NONE 0 -#define PSH_BLUE_ALIGN_TOP 1 -#define PSH_BLUE_ALIGN_BOT 2 - - - typedef struct PSH_AlignmentRec_ - { - int align; - FT_Pos align_top; - FT_Pos align_bot; - - } PSH_AlignmentRec, *PSH_Alignment; - - - FT_LOCAL( void ) - psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ); - - -#if 0 - /* snap a stem width to fitter coordinates. `org_width' is in font */ - /* units. The result is in device pixels (26.6 format). */ - FT_LOCAL( FT_Pos ) - psh_dimension_snap_width( PSH_Dimension dimension, - FT_Int org_width ); -#endif - - FT_LOCAL( void ) - psh_globals_set_scale( PSH_Globals globals, - FT_Fixed x_scale, - FT_Fixed y_scale, - FT_Fixed x_delta, - FT_Fixed y_delta ); - - /* snap a stem to one or two blue zones */ - FT_LOCAL( void ) - psh_blues_snap_stem( PSH_Blues blues, - FT_Int stem_top, - FT_Int stem_bot, - PSH_Alignment alignment ); - /* */ - -#ifdef DEBUG_HINTER - extern PSH_Globals ps_debug_globals; -#endif - - -FT_END_HEADER - - -#endif /* __PSHGLOB_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pshinter/pshinter.c b/3party/freetype/src/pshinter/pshinter.c deleted file mode 100644 index 9e65fe2a42..0000000000 --- a/3party/freetype/src/pshinter/pshinter.c +++ /dev/null @@ -1,29 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshinter.c */ -/* */ -/* FreeType PostScript Hinting module */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "pshpic.c" -#include "pshrec.c" -#include "pshglob.c" -#include "pshalgo.c" -#include "pshmod.c" - - -/* END */ diff --git a/3party/freetype/src/pshinter/pshmod.c b/3party/freetype/src/pshinter/pshmod.c deleted file mode 100644 index 961b468506..0000000000 --- a/3party/freetype/src/pshinter/pshmod.c +++ /dev/null @@ -1,119 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshmod.c */ -/* */ -/* FreeType PostScript hinter module implementation (body). */ -/* */ -/* Copyright 2001-2015 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 <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include "pshrec.h" -#include "pshalgo.h" -#include "pshpic.h" - - - /* the Postscript Hinter module structure */ - typedef struct PS_Hinter_Module_Rec_ - { - FT_ModuleRec root; - PS_HintsRec ps_hints; - - PSH_Globals_FuncsRec globals_funcs; - T1_Hints_FuncsRec t1_funcs; - T2_Hints_FuncsRec t2_funcs; - - } PS_Hinter_ModuleRec, *PS_Hinter_Module; - - - /* finalize module */ - FT_CALLBACK_DEF( void ) - ps_hinter_done( PS_Hinter_Module module ) - { - module->t1_funcs.hints = NULL; - module->t2_funcs.hints = NULL; - - ps_hints_done( &module->ps_hints ); - } - - - /* initialize module, create hints recorder and the interface */ - FT_CALLBACK_DEF( FT_Error ) - ps_hinter_init( PS_Hinter_Module module ) - { - FT_Memory memory = module->root.memory; - void* ph = &module->ps_hints; - - - ps_hints_init( &module->ps_hints, memory ); - - psh_globals_funcs_init( &module->globals_funcs ); - - t1_hints_funcs_init( &module->t1_funcs ); - module->t1_funcs.hints = (T1_Hints)ph; - - t2_hints_funcs_init( &module->t2_funcs ); - module->t2_funcs.hints = (T2_Hints)ph; - - return 0; - } - - - /* returns global hints interface */ - FT_CALLBACK_DEF( PSH_Globals_Funcs ) - pshinter_get_globals_funcs( FT_Module module ) - { - return &((PS_Hinter_Module)module)->globals_funcs; - } - - - /* return Type 1 hints interface */ - FT_CALLBACK_DEF( T1_Hints_Funcs ) - pshinter_get_t1_funcs( FT_Module module ) - { - return &((PS_Hinter_Module)module)->t1_funcs; - } - - - /* return Type 2 hints interface */ - FT_CALLBACK_DEF( T2_Hints_Funcs ) - pshinter_get_t2_funcs( FT_Module module ) - { - return &((PS_Hinter_Module)module)->t2_funcs; - } - - - FT_DEFINE_PSHINTER_INTERFACE( - pshinter_interface, - pshinter_get_globals_funcs, - pshinter_get_t1_funcs, - pshinter_get_t2_funcs ) - - - FT_DEFINE_MODULE( - pshinter_module_class, - - 0, - sizeof ( PS_Hinter_ModuleRec ), - "pshinter", - 0x10000L, - 0x20000L, - - &PSHINTER_INTERFACE_GET, /* module-specific interface */ - - (FT_Module_Constructor)ps_hinter_init, - (FT_Module_Destructor) ps_hinter_done, - (FT_Module_Requester) NULL ) /* no additional interface for now */ - - -/* END */ diff --git a/3party/freetype/src/pshinter/pshmod.h b/3party/freetype/src/pshinter/pshmod.h deleted file mode 100644 index a58d856533..0000000000 --- a/3party/freetype/src/pshinter/pshmod.h +++ /dev/null @@ -1,39 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshmod.h */ -/* */ -/* PostScript hinter module interface (specification). */ -/* */ -/* Copyright 2001-2015 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 __PSHMOD_H__ -#define __PSHMOD_H__ - - -#include <ft2build.h> -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - - FT_DECLARE_MODULE( pshinter_module_class ) - - -FT_END_HEADER - - -#endif /* __PSHMOD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pshinter/pshnterr.h b/3party/freetype/src/pshinter/pshnterr.h deleted file mode 100644 index ce790a8ef5..0000000000 --- a/3party/freetype/src/pshinter/pshnterr.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshnterr.h */ -/* */ -/* PS Hinter error codes (specification only). */ -/* */ -/* Copyright 2003-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the PSHinter error enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __PSHNTERR_H__ -#define __PSHNTERR_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX PSH_Err_ -#define FT_ERR_BASE FT_Mod_Err_PShinter - -#include FT_ERRORS_H - -#endif /* __PSHNTERR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pshinter/pshpic.c b/3party/freetype/src/pshinter/pshpic.c deleted file mode 100644 index afd8fb9678..0000000000 --- a/3party/freetype/src/pshinter/pshpic.c +++ /dev/null @@ -1,76 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshpic.c */ -/* */ -/* The FreeType position independent code services for pshinter module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "pshpic.h" -#include "pshnterr.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from pshmod.c */ - void - FT_Init_Class_pshinter_interface( FT_Library library, - PSHinter_Interface* clazz ); - - void - pshinter_module_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->pshinter ) - { - FT_FREE( pic_container->pshinter ); - pic_container->pshinter = NULL; - } - } - - - FT_Error - pshinter_module_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - PSHinterPIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->pshinter = container; - - /* add call to initialization function when you add new scripts */ - FT_Init_Class_pshinter_interface( - library, &container->pshinter_interface ); - - if ( error ) - pshinter_module_class_pic_free( library ); - - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/3party/freetype/src/pshinter/pshpic.h b/3party/freetype/src/pshinter/pshpic.h deleted file mode 100644 index ca35cd6fa9..0000000000 --- a/3party/freetype/src/pshinter/pshpic.h +++ /dev/null @@ -1,63 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshpic.h */ -/* */ -/* The FreeType position independent code services for pshinter module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 __PSHPIC_H__ -#define __PSHPIC_H__ - - -#include FT_INTERNAL_PIC_H - - -#ifndef FT_CONFIG_OPTION_PIC - -#define PSHINTER_INTERFACE_GET pshinter_interface - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - -FT_BEGIN_HEADER - - typedef struct PSHinterPIC_ - { - PSHinter_Interface pshinter_interface; - - } PSHinterPIC; - - -#define GET_PIC( lib ) ( (PSHinterPIC*)( (lib)->pic_container.pshinter ) ) - -#define PSHINTER_INTERFACE_GET ( GET_PIC( library )->pshinter_interface ) - - /* see pshpic.c for the implementation */ - void - pshinter_module_class_pic_free( FT_Library library ); - - FT_Error - pshinter_module_class_pic_init( FT_Library library ); - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* __PSHPIC_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pshinter/pshrec.c b/3party/freetype/src/pshinter/pshrec.c deleted file mode 100644 index f8895fc8d6..0000000000 --- a/3party/freetype/src/pshinter/pshrec.c +++ /dev/null @@ -1,1220 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshrec.c */ -/* */ -/* FreeType PostScript hints recorder (body). */ -/* */ -/* Copyright 2001-2015 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H - -#include "pshrec.h" -#include "pshalgo.h" - -#include "pshnterr.h" - -#undef FT_COMPONENT -#define FT_COMPONENT trace_pshrec - -#ifdef DEBUG_HINTER - PS_Hints ps_debug_hints = NULL; - int ps_debug_no_horz_hints = 0; - int ps_debug_no_vert_hints = 0; -#endif - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PS_HINT MANAGEMENT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* destroy hints table */ - static void - ps_hint_table_done( PS_Hint_Table table, - FT_Memory memory ) - { - FT_FREE( table->hints ); - table->num_hints = 0; - table->max_hints = 0; - } - - - /* ensure that a table can contain "count" elements */ - static FT_Error - ps_hint_table_ensure( PS_Hint_Table table, - FT_UInt count, - FT_Memory memory ) - { - FT_UInt old_max = table->max_hints; - FT_UInt new_max = count; - FT_Error error = FT_Err_Ok; - - - if ( new_max > old_max ) - { - /* try to grow the table */ - new_max = FT_PAD_CEIL( new_max, 8 ); - if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) ) - table->max_hints = new_max; - } - return error; - } - - - static FT_Error - ps_hint_table_alloc( PS_Hint_Table table, - FT_Memory memory, - PS_Hint *ahint ) - { - FT_Error error = FT_Err_Ok; - FT_UInt count; - PS_Hint hint = NULL; - - - count = table->num_hints; - count++; - - if ( count >= table->max_hints ) - { - error = ps_hint_table_ensure( table, count, memory ); - if ( error ) - goto Exit; - } - - hint = table->hints + count - 1; - hint->pos = 0; - hint->len = 0; - hint->flags = 0; - - table->num_hints = count; - - Exit: - *ahint = hint; - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PS_MASK MANAGEMENT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* destroy mask */ - static void - ps_mask_done( PS_Mask mask, - FT_Memory memory ) - { - FT_FREE( mask->bytes ); - mask->num_bits = 0; - mask->max_bits = 0; - mask->end_point = 0; - } - - - /* ensure that a mask can contain "count" bits */ - static FT_Error - ps_mask_ensure( PS_Mask mask, - FT_UInt count, - FT_Memory memory ) - { - FT_UInt old_max = ( mask->max_bits + 7 ) >> 3; - FT_UInt new_max = ( count + 7 ) >> 3; - FT_Error error = FT_Err_Ok; - - - if ( new_max > old_max ) - { - new_max = FT_PAD_CEIL( new_max, 8 ); - if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) ) - mask->max_bits = new_max * 8; - } - return error; - } - - - /* test a bit value in a given mask */ - static FT_Int - ps_mask_test_bit( PS_Mask mask, - FT_Int idx ) - { - if ( (FT_UInt)idx >= mask->num_bits ) - return 0; - - return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) ); - } - - - /* clear a given bit */ - static void - ps_mask_clear_bit( PS_Mask mask, - FT_UInt idx ) - { - FT_Byte* p; - - - if ( idx >= mask->num_bits ) - return; - - p = mask->bytes + ( idx >> 3 ); - p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) ); - } - - - /* set a given bit, possibly grow the mask */ - static FT_Error - ps_mask_set_bit( PS_Mask mask, - FT_UInt idx, - FT_Memory memory ) - { - FT_Error error = FT_Err_Ok; - FT_Byte* p; - - - if ( idx >= mask->num_bits ) - { - error = ps_mask_ensure( mask, idx + 1, memory ); - if ( error ) - goto Exit; - - mask->num_bits = idx + 1; - } - - p = mask->bytes + ( idx >> 3 ); - p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) ); - - Exit: - return error; - } - - - /* destroy mask table */ - static void - ps_mask_table_done( PS_Mask_Table table, - FT_Memory memory ) - { - FT_UInt count = table->max_masks; - PS_Mask mask = table->masks; - - - for ( ; count > 0; count--, mask++ ) - ps_mask_done( mask, memory ); - - FT_FREE( table->masks ); - table->num_masks = 0; - table->max_masks = 0; - } - - - /* ensure that a mask table can contain "count" masks */ - static FT_Error - ps_mask_table_ensure( PS_Mask_Table table, - FT_UInt count, - FT_Memory memory ) - { - FT_UInt old_max = table->max_masks; - FT_UInt new_max = count; - FT_Error error = FT_Err_Ok; - - - if ( new_max > old_max ) - { - new_max = FT_PAD_CEIL( new_max, 8 ); - if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) ) - table->max_masks = new_max; - } - return error; - } - - - /* allocate a new mask in a table */ - static FT_Error - ps_mask_table_alloc( PS_Mask_Table table, - FT_Memory memory, - PS_Mask *amask ) - { - FT_UInt count; - FT_Error error = FT_Err_Ok; - PS_Mask mask = NULL; - - - count = table->num_masks; - count++; - - if ( count > table->max_masks ) - { - error = ps_mask_table_ensure( table, count, memory ); - if ( error ) - goto Exit; - } - - mask = table->masks + count - 1; - mask->num_bits = 0; - mask->end_point = 0; - table->num_masks = count; - - Exit: - *amask = mask; - return error; - } - - - /* return last hint mask in a table, create one if the table is empty */ - static FT_Error - ps_mask_table_last( PS_Mask_Table table, - FT_Memory memory, - PS_Mask *amask ) - { - FT_Error error = FT_Err_Ok; - FT_UInt count; - PS_Mask mask; - - - count = table->num_masks; - if ( count == 0 ) - { - error = ps_mask_table_alloc( table, memory, &mask ); - if ( error ) - goto Exit; - } - else - mask = table->masks + count - 1; - - Exit: - *amask = mask; - return error; - } - - - /* set a new mask to a given bit range */ - static FT_Error - ps_mask_table_set_bits( PS_Mask_Table table, - const FT_Byte* source, - FT_UInt bit_pos, - FT_UInt bit_count, - FT_Memory memory ) - { - FT_Error error; - PS_Mask mask; - - - error = ps_mask_table_last( table, memory, &mask ); - if ( error ) - goto Exit; - - error = ps_mask_ensure( mask, bit_count, memory ); - if ( error ) - goto Exit; - - mask->num_bits = bit_count; - - /* now, copy bits */ - { - FT_Byte* read = (FT_Byte*)source + ( bit_pos >> 3 ); - FT_Int rmask = 0x80 >> ( bit_pos & 7 ); - FT_Byte* write = mask->bytes; - FT_Int wmask = 0x80; - FT_Int val; - - - for ( ; bit_count > 0; bit_count-- ) - { - val = write[0] & ~wmask; - - if ( read[0] & rmask ) - val |= wmask; - - write[0] = (FT_Byte)val; - - rmask >>= 1; - if ( rmask == 0 ) - { - read++; - rmask = 0x80; - } - - wmask >>= 1; - if ( wmask == 0 ) - { - write++; - wmask = 0x80; - } - } - } - - Exit: - return error; - } - - - /* test whether two masks in a table intersect */ - static FT_Int - ps_mask_table_test_intersect( PS_Mask_Table table, - FT_UInt index1, - FT_UInt index2 ) - { - PS_Mask mask1 = table->masks + index1; - PS_Mask mask2 = table->masks + index2; - FT_Byte* p1 = mask1->bytes; - FT_Byte* p2 = mask2->bytes; - FT_UInt count1 = mask1->num_bits; - FT_UInt count2 = mask2->num_bits; - FT_UInt count; - - - count = FT_MIN( count1, count2 ); - for ( ; count >= 8; count -= 8 ) - { - if ( p1[0] & p2[0] ) - return 1; - - p1++; - p2++; - } - - if ( count == 0 ) - return 0; - - return ( p1[0] & p2[0] ) & ~( 0xFF >> count ); - } - - - /* merge two masks, used by ps_mask_table_merge_all */ - static FT_Error - ps_mask_table_merge( PS_Mask_Table table, - FT_UInt index1, - FT_UInt index2, - FT_Memory memory ) - { - FT_Error error = FT_Err_Ok; - - - /* swap index1 and index2 so that index1 < index2 */ - if ( index1 > index2 ) - { - FT_UInt temp; - - - temp = index1; - index1 = index2; - index2 = temp; - } - - if ( index1 < index2 && index2 < table->num_masks ) - { - /* we need to merge the bitsets of index1 and index2 with a */ - /* simple union */ - PS_Mask mask1 = table->masks + index1; - PS_Mask mask2 = table->masks + index2; - FT_UInt count1 = mask1->num_bits; - FT_UInt count2 = mask2->num_bits; - FT_Int delta; - - - if ( count2 > 0 ) - { - FT_UInt pos; - FT_Byte* read; - FT_Byte* write; - - - /* if "count2" is greater than "count1", we need to grow the */ - /* first bitset, and clear the highest bits */ - if ( count2 > count1 ) - { - error = ps_mask_ensure( mask1, count2, memory ); - if ( error ) - goto Exit; - - for ( pos = count1; pos < count2; pos++ ) - ps_mask_clear_bit( mask1, pos ); - } - - /* merge (unite) the bitsets */ - read = mask2->bytes; - write = mask1->bytes; - pos = ( count2 + 7 ) >> 3; - - for ( ; pos > 0; pos-- ) - { - write[0] = (FT_Byte)( write[0] | read[0] ); - write++; - read++; - } - } - - /* Now, remove "mask2" from the list. We need to keep the masks */ - /* sorted in order of importance, so move table elements. */ - mask2->num_bits = 0; - mask2->end_point = 0; - - /* number of masks to move */ - delta = (FT_Int)( table->num_masks - 1 - index2 ); - if ( delta > 0 ) - { - /* move to end of table for reuse */ - PS_MaskRec dummy = *mask2; - - - ft_memmove( mask2, - mask2 + 1, - (FT_UInt)delta * sizeof ( PS_MaskRec ) ); - - mask2[delta] = dummy; - } - - table->num_masks--; - } - else - FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n", - index1, index2 )); - - Exit: - return error; - } - - - /* Try to merge all masks in a given table. This is used to merge */ - /* all counter masks into independent counter "paths". */ - /* */ - static FT_Error - ps_mask_table_merge_all( PS_Mask_Table table, - FT_Memory memory ) - { - FT_Int index1, index2; - FT_Error error = FT_Err_Ok; - - - /* both loops go down to 0, thus FT_Int for index1 and index2 */ - for ( index1 = (FT_Int)table->num_masks - 1; index1 > 0; index1-- ) - { - for ( index2 = index1 - 1; index2 >= 0; index2-- ) - { - if ( ps_mask_table_test_intersect( table, - (FT_UInt)index1, - (FT_UInt)index2 ) ) - { - error = ps_mask_table_merge( table, - (FT_UInt)index2, - (FT_UInt)index1, - memory ); - if ( error ) - goto Exit; - - break; - } - } - } - - Exit: - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PS_DIMENSION MANAGEMENT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* finalize a given dimension */ - static void - ps_dimension_done( PS_Dimension dimension, - FT_Memory memory ) - { - ps_mask_table_done( &dimension->counters, memory ); - ps_mask_table_done( &dimension->masks, memory ); - ps_hint_table_done( &dimension->hints, memory ); - } - - - /* initialize a given dimension */ - static void - ps_dimension_init( PS_Dimension dimension ) - { - dimension->hints.num_hints = 0; - dimension->masks.num_masks = 0; - dimension->counters.num_masks = 0; - } - - -#if 0 - - /* set a bit at a given index in the current hint mask */ - static FT_Error - ps_dimension_set_mask_bit( PS_Dimension dim, - FT_UInt idx, - FT_Memory memory ) - { - PS_Mask mask; - FT_Error error = FT_Err_Ok; - - - /* get last hint mask */ - error = ps_mask_table_last( &dim->masks, memory, &mask ); - if ( error ) - goto Exit; - - error = ps_mask_set_bit( mask, idx, memory ); - - Exit: - return error; - } - -#endif - - /* set the end point in a mask, called from "End" & "Reset" methods */ - static void - ps_dimension_end_mask( PS_Dimension dim, - FT_UInt end_point ) - { - FT_UInt count = dim->masks.num_masks; - - - if ( count > 0 ) - { - PS_Mask mask = dim->masks.masks + count - 1; - - - mask->end_point = end_point; - } - } - - - /* set the end point in the current mask, then create a new empty one */ - /* (called by "Reset" method) */ - static FT_Error - ps_dimension_reset_mask( PS_Dimension dim, - FT_UInt end_point, - FT_Memory memory ) - { - PS_Mask mask; - - - /* end current mask */ - ps_dimension_end_mask( dim, end_point ); - - /* allocate new one */ - return ps_mask_table_alloc( &dim->masks, memory, &mask ); - } - - - /* set a new mask, called from the "T2Stem" method */ - static FT_Error - ps_dimension_set_mask_bits( PS_Dimension dim, - const FT_Byte* source, - FT_UInt source_pos, - FT_UInt source_bits, - FT_UInt end_point, - FT_Memory memory ) - { - FT_Error error; - - - /* reset current mask, if any */ - error = ps_dimension_reset_mask( dim, end_point, memory ); - if ( error ) - goto Exit; - - /* set bits in new mask */ - error = ps_mask_table_set_bits( &dim->masks, source, - source_pos, source_bits, memory ); - - Exit: - return error; - } - - - /* add a new single stem (called from "T1Stem" method) */ - static FT_Error - ps_dimension_add_t1stem( PS_Dimension dim, - FT_Int pos, - FT_Int len, - FT_Memory memory, - FT_Int *aindex ) - { - FT_Error error = FT_Err_Ok; - FT_UInt flags = 0; - - - /* detect ghost stem */ - if ( len < 0 ) - { - flags |= PS_HINT_FLAG_GHOST; - if ( len == -21 ) - { - flags |= PS_HINT_FLAG_BOTTOM; - pos += len; - } - len = 0; - } - - if ( aindex ) - *aindex = -1; - - /* now, lookup stem in the current hints table */ - { - PS_Mask mask; - FT_UInt idx; - FT_UInt max = dim->hints.num_hints; - PS_Hint hint = dim->hints.hints; - - - for ( idx = 0; idx < max; idx++, hint++ ) - { - if ( hint->pos == pos && hint->len == len ) - break; - } - - /* we need to create a new hint in the table */ - if ( idx >= max ) - { - error = ps_hint_table_alloc( &dim->hints, memory, &hint ); - if ( error ) - goto Exit; - - hint->pos = pos; - hint->len = len; - hint->flags = flags; - } - - /* now, store the hint in the current mask */ - error = ps_mask_table_last( &dim->masks, memory, &mask ); - if ( error ) - goto Exit; - - error = ps_mask_set_bit( mask, idx, memory ); - if ( error ) - goto Exit; - - if ( aindex ) - *aindex = (FT_Int)idx; - } - - Exit: - return error; - } - - - /* add a "hstem3/vstem3" counter to our dimension table */ - static FT_Error - ps_dimension_add_counter( PS_Dimension dim, - FT_Int hint1, - FT_Int hint2, - FT_Int hint3, - FT_Memory memory ) - { - FT_Error error = FT_Err_Ok; - FT_UInt count = dim->counters.num_masks; - PS_Mask counter = dim->counters.masks; - - - /* try to find an existing counter mask that already uses */ - /* one of these stems here */ - for ( ; count > 0; count--, counter++ ) - { - if ( ps_mask_test_bit( counter, hint1 ) || - ps_mask_test_bit( counter, hint2 ) || - ps_mask_test_bit( counter, hint3 ) ) - break; - } - - /* create a new counter when needed */ - if ( count == 0 ) - { - error = ps_mask_table_alloc( &dim->counters, memory, &counter ); - if ( error ) - goto Exit; - } - - /* now, set the bits for our hints in the counter mask */ - if ( hint1 >= 0 ) - { - error = ps_mask_set_bit( counter, (FT_UInt)hint1, memory ); - if ( error ) - goto Exit; - } - - if ( hint2 >= 0 ) - { - error = ps_mask_set_bit( counter, (FT_UInt)hint2, memory ); - if ( error ) - goto Exit; - } - - if ( hint3 >= 0 ) - { - error = ps_mask_set_bit( counter, (FT_UInt)hint3, memory ); - if ( error ) - goto Exit; - } - - Exit: - return error; - } - - - /* end of recording session for a given dimension */ - static FT_Error - ps_dimension_end( PS_Dimension dim, - FT_UInt end_point, - FT_Memory memory ) - { - /* end hint mask table */ - ps_dimension_end_mask( dim, end_point ); - - /* merge all counter masks into independent "paths" */ - return ps_mask_table_merge_all( &dim->counters, memory ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PS_RECORDER MANAGEMENT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* destroy hints */ - FT_LOCAL( void ) - ps_hints_done( PS_Hints hints ) - { - FT_Memory memory = hints->memory; - - - ps_dimension_done( &hints->dimension[0], memory ); - ps_dimension_done( &hints->dimension[1], memory ); - - hints->error = FT_Err_Ok; - hints->memory = NULL; - } - - - FT_LOCAL( void ) - ps_hints_init( PS_Hints hints, - FT_Memory memory ) - { - FT_MEM_ZERO( hints, sizeof ( *hints ) ); - hints->memory = memory; - } - - - /* initialize a hints for a new session */ - static void - ps_hints_open( PS_Hints hints, - PS_Hint_Type hint_type ) - { - hints->error = FT_Err_Ok; - hints->hint_type = hint_type; - - ps_dimension_init( &hints->dimension[0] ); - ps_dimension_init( &hints->dimension[1] ); - } - - - /* add one or more stems to the current hints table */ - static void - ps_hints_stem( PS_Hints hints, - FT_UInt dimension, - FT_Int count, - FT_Long* stems ) - { - PS_Dimension dim; - - - if ( hints->error ) - return; - - /* limit "dimension" to 0..1 */ - if ( dimension > 1 ) - { - FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n", - dimension )); - dimension = ( dimension != 0 ); - } - - /* record the stems in the current hints/masks table */ - /* (Type 1 & 2's `hstem' or `vstem' operators) */ - dim = &hints->dimension[dimension]; - - for ( ; count > 0; count--, stems += 2 ) - { - FT_Error error; - FT_Memory memory = hints->memory; - - - error = ps_dimension_add_t1stem( dim, - (FT_Int)stems[0], - (FT_Int)stems[1], - memory, - NULL ); - if ( error ) - { - FT_ERROR(( "ps_hints_stem: could not add stem" - " (%d,%d) to hints table\n", stems[0], stems[1] )); - - hints->error = error; - return; - } - } - } - - - /* add one Type1 counter stem to the current hints table */ - static void - ps_hints_t1stem3( PS_Hints hints, - FT_UInt dimension, - FT_Fixed* stems ) - { - FT_Error error = FT_Err_Ok; - - - if ( !hints->error ) - { - PS_Dimension dim; - FT_Memory memory = hints->memory; - FT_Int count; - FT_Int idx[3]; - - - /* limit "dimension" to 0..1 */ - if ( dimension > 1 ) - { - FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n", - dimension )); - dimension = ( dimension != 0 ); - } - - dim = &hints->dimension[dimension]; - - /* there must be 6 elements in the 'stem' array */ - if ( hints->hint_type == PS_HINT_TYPE_1 ) - { - /* add the three stems to our hints/masks table */ - for ( count = 0; count < 3; count++, stems += 2 ) - { - error = ps_dimension_add_t1stem( dim, - (FT_Int)FIXED_TO_INT( stems[0] ), - (FT_Int)FIXED_TO_INT( stems[1] ), - memory, &idx[count] ); - if ( error ) - goto Fail; - } - - /* now, add the hints to the counters table */ - error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2], - memory ); - if ( error ) - goto Fail; - } - else - { - FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type\n" )); - error = FT_THROW( Invalid_Argument ); - goto Fail; - } - } - - return; - - Fail: - FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" )); - hints->error = error; - } - - - /* reset hints (only with Type 1 hints) */ - static void - ps_hints_t1reset( PS_Hints hints, - FT_UInt end_point ) - { - FT_Error error = FT_Err_Ok; - - - if ( !hints->error ) - { - FT_Memory memory = hints->memory; - - - if ( hints->hint_type == PS_HINT_TYPE_1 ) - { - error = ps_dimension_reset_mask( &hints->dimension[0], - end_point, memory ); - if ( error ) - goto Fail; - - error = ps_dimension_reset_mask( &hints->dimension[1], - end_point, memory ); - if ( error ) - goto Fail; - } - else - { - /* invalid hint type */ - error = FT_THROW( Invalid_Argument ); - goto Fail; - } - } - return; - - Fail: - hints->error = error; - } - - - /* Type2 "hintmask" operator, add a new hintmask to each direction */ - static void - ps_hints_t2mask( PS_Hints hints, - FT_UInt end_point, - FT_UInt bit_count, - const FT_Byte* bytes ) - { - FT_Error error; - - - if ( !hints->error ) - { - PS_Dimension dim = hints->dimension; - FT_Memory memory = hints->memory; - FT_UInt count1 = dim[0].hints.num_hints; - FT_UInt count2 = dim[1].hints.num_hints; - - - /* check bit count; must be equal to current total hint count */ - if ( bit_count != count1 + count2 ) - { - FT_TRACE0(( "ps_hints_t2mask:" - " called with invalid bitcount %d (instead of %d)\n", - bit_count, count1 + count2 )); - - /* simply ignore the operator */ - return; - } - - /* set-up new horizontal and vertical hint mask now */ - error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1, - end_point, memory ); - if ( error ) - goto Fail; - - error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2, - end_point, memory ); - if ( error ) - goto Fail; - } - return; - - Fail: - hints->error = error; - } - - - static void - ps_hints_t2counter( PS_Hints hints, - FT_UInt bit_count, - const FT_Byte* bytes ) - { - FT_Error error; - - - if ( !hints->error ) - { - PS_Dimension dim = hints->dimension; - FT_Memory memory = hints->memory; - FT_UInt count1 = dim[0].hints.num_hints; - FT_UInt count2 = dim[1].hints.num_hints; - - - /* check bit count, must be equal to current total hint count */ - if ( bit_count != count1 + count2 ) - { - FT_TRACE0(( "ps_hints_t2counter:" - " called with invalid bitcount %d (instead of %d)\n", - bit_count, count1 + count2 )); - - /* simply ignore the operator */ - return; - } - - /* set-up new horizontal and vertical hint mask now */ - error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1, - 0, memory ); - if ( error ) - goto Fail; - - error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2, - 0, memory ); - if ( error ) - goto Fail; - } - return; - - Fail: - hints->error = error; - } - - - /* end recording session */ - static FT_Error - ps_hints_close( PS_Hints hints, - FT_UInt end_point ) - { - FT_Error error; - - - error = hints->error; - if ( !error ) - { - FT_Memory memory = hints->memory; - PS_Dimension dim = hints->dimension; - - - error = ps_dimension_end( &dim[0], end_point, memory ); - if ( !error ) - { - error = ps_dimension_end( &dim[1], end_point, memory ); - } - } - -#ifdef DEBUG_HINTER - if ( !error ) - ps_debug_hints = hints; -#endif - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE 1 HINTS RECORDING INTERFACE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - t1_hints_open( T1_Hints hints ) - { - ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 ); - } - - static void - t1_hints_stem( T1_Hints hints, - FT_UInt dimension, - FT_Fixed* coords ) - { - FT_Pos stems[2]; - - - stems[0] = FIXED_TO_INT( coords[0] ); - stems[1] = FIXED_TO_INT( coords[1] ); - - ps_hints_stem( (PS_Hints)hints, dimension, 1, stems ); - } - - - FT_LOCAL_DEF( void ) - t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ) - { - FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) ); - - funcs->open = (T1_Hints_OpenFunc) t1_hints_open; - funcs->close = (T1_Hints_CloseFunc) ps_hints_close; - funcs->stem = (T1_Hints_SetStemFunc) t1_hints_stem; - funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3; - funcs->reset = (T1_Hints_ResetFunc) ps_hints_t1reset; - funcs->apply = (T1_Hints_ApplyFunc) ps_hints_apply; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE 2 HINTS RECORDING INTERFACE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - t2_hints_open( T2_Hints hints ) - { - ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 ); - } - - - static void - t2_hints_stems( T2_Hints hints, - FT_UInt dimension, - FT_Int count, - FT_Fixed* coords ) - { - FT_Pos stems[32], y; - FT_Int total = count, n; - - - y = 0; - while ( total > 0 ) - { - /* determine number of stems to write */ - count = total; - if ( count > 16 ) - count = 16; - - /* compute integer stem positions in font units */ - for ( n = 0; n < count * 2; n++ ) - { - y += coords[n]; - stems[n] = FIXED_TO_INT( y ); - } - - /* compute lengths */ - for ( n = 0; n < count * 2; n += 2 ) - stems[n + 1] = stems[n + 1] - stems[n]; - - /* add them to the current dimension */ - ps_hints_stem( (PS_Hints)hints, dimension, count, stems ); - - total -= count; - } - } - - - FT_LOCAL_DEF( void ) - t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ) - { - FT_MEM_ZERO( funcs, sizeof ( *funcs ) ); - - funcs->open = (T2_Hints_OpenFunc) t2_hints_open; - funcs->close = (T2_Hints_CloseFunc) ps_hints_close; - funcs->stems = (T2_Hints_StemsFunc) t2_hints_stems; - funcs->hintmask= (T2_Hints_MaskFunc) ps_hints_t2mask; - funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter; - funcs->apply = (T2_Hints_ApplyFunc) ps_hints_apply; - } - - -/* END */ diff --git a/3party/freetype/src/pshinter/pshrec.h b/3party/freetype/src/pshinter/pshrec.h deleted file mode 100644 index 2b1ad94936..0000000000 --- a/3party/freetype/src/pshinter/pshrec.h +++ /dev/null @@ -1,172 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshrec.h */ -/* */ -/* Postscript (Type1/Type2) hints recorder (specification). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - - /**************************************************************************/ - /* */ - /* The functions defined here are called from the Type 1, CID and CFF */ - /* font drivers to record the hints of a given character/glyph. */ - /* */ - /* The hints are recorded in a unified format, and are later processed */ - /* by the `optimizer' and `fitter' to adjust the outlines to the pixel */ - /* grid. */ - /* */ - /**************************************************************************/ - - -#ifndef __PSHREC_H__ -#define __PSHREC_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_HINTS_H -#include "pshglob.h" - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GLYPH HINTS RECORDER INTERNALS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* handle to hint record */ - typedef struct PS_HintRec_* PS_Hint; - - /* hint types */ - typedef enum PS_Hint_Type_ - { - PS_HINT_TYPE_1 = 1, - PS_HINT_TYPE_2 = 2 - - } PS_Hint_Type; - - - /* hint flags */ -#define PS_HINT_FLAG_GHOST 1U -#define PS_HINT_FLAG_BOTTOM 2U - - - /* hint descriptor */ - typedef struct PS_HintRec_ - { - FT_Int pos; - FT_Int len; - FT_UInt flags; - - } PS_HintRec; - - -#define ps_hint_is_active( x ) ( (x)->flags & PS_HINT_FLAG_ACTIVE ) -#define ps_hint_is_ghost( x ) ( (x)->flags & PS_HINT_FLAG_GHOST ) -#define ps_hint_is_bottom( x ) ( (x)->flags & PS_HINT_FLAG_BOTTOM ) - - - /* hints table descriptor */ - typedef struct PS_Hint_TableRec_ - { - FT_UInt num_hints; - FT_UInt max_hints; - PS_Hint hints; - - } PS_Hint_TableRec, *PS_Hint_Table; - - - /* hint and counter mask descriptor */ - typedef struct PS_MaskRec_ - { - FT_UInt num_bits; - FT_UInt max_bits; - FT_Byte* bytes; - FT_UInt end_point; - - } PS_MaskRec, *PS_Mask; - - - /* masks and counters table descriptor */ - typedef struct PS_Mask_TableRec_ - { - FT_UInt num_masks; - FT_UInt max_masks; - PS_Mask masks; - - } PS_Mask_TableRec, *PS_Mask_Table; - - - /* dimension-specific hints descriptor */ - typedef struct PS_DimensionRec_ - { - PS_Hint_TableRec hints; - PS_Mask_TableRec masks; - PS_Mask_TableRec counters; - - } PS_DimensionRec, *PS_Dimension; - - - /* glyph hints descriptor */ - /* dimension 0 => X coordinates + vertical hints/stems */ - /* dimension 1 => Y coordinates + horizontal hints/stems */ - typedef struct PS_HintsRec_ - { - FT_Memory memory; - FT_Error error; - FT_UInt32 magic; - PS_Hint_Type hint_type; - PS_DimensionRec dimension[2]; - - } PS_HintsRec, *PS_Hints; - - /* */ - - /* initialize hints recorder */ - FT_LOCAL( void ) - ps_hints_init( PS_Hints hints, - FT_Memory memory ); - - /* finalize hints recorder */ - FT_LOCAL( void ) - ps_hints_done( PS_Hints hints ); - - /* initialize Type1 hints recorder interface */ - FT_LOCAL( void ) - t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ); - - /* initialize Type2 hints recorder interface */ - FT_LOCAL( void ) - t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ); - - -#ifdef DEBUG_HINTER - extern PS_Hints ps_debug_hints; - extern int ps_debug_no_horz_hints; - extern int ps_debug_no_vert_hints; -#endif - - /* */ - - -FT_END_HEADER - - -#endif /* __PS_HINTER_RECORD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/pshinter/rules.mk b/3party/freetype/src/pshinter/rules.mk deleted file mode 100644 index 7838e676ec..0000000000 --- a/3party/freetype/src/pshinter/rules.mk +++ /dev/null @@ -1,76 +0,0 @@ -# -# FreeType 2 PSHinter driver configuration rules -# - - -# Copyright 2001-2015 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. - - -# PSHINTER driver directory -# -PSHINTER_DIR := $(SRC_DIR)/pshinter - - -# compilation flags for the driver -# -PSHINTER_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(PSHINTER_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# PSHINTER driver sources (i.e., C files) -# -PSHINTER_DRV_SRC := $(PSHINTER_DIR)/pshalgo.c \ - $(PSHINTER_DIR)/pshglob.c \ - $(PSHINTER_DIR)/pshmod.c \ - $(PSHINTER_DIR)/pshpic.c \ - $(PSHINTER_DIR)/pshrec.c - - -# PSHINTER driver headers -# -PSHINTER_DRV_H := $(PSHINTER_DRV_SRC:%c=%h) \ - $(PSHINTER_DIR)/pshnterr.h - - -# PSHINTER driver object(s) -# -# PSHINTER_DRV_OBJ_M is used during `multi' builds. -# PSHINTER_DRV_OBJ_S is used during `single' builds. -# -PSHINTER_DRV_OBJ_M := $(PSHINTER_DRV_SRC:$(PSHINTER_DIR)/%.c=$(OBJ_DIR)/%.$O) -PSHINTER_DRV_OBJ_S := $(OBJ_DIR)/pshinter.$O - -# PSHINTER driver source file for single build -# -PSHINTER_DRV_SRC_S := $(PSHINTER_DIR)/pshinter.c - - -# PSHINTER driver - single object -# -$(PSHINTER_DRV_OBJ_S): $(PSHINTER_DRV_SRC_S) $(PSHINTER_DRV_SRC) \ - $(FREETYPE_H) $(PSHINTER_DRV_H) - $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSHINTER_DRV_SRC_S)) - - -# PSHINTER driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(PSHINTER_DIR)/%.c $(FREETYPE_H) $(PSHINTER_DRV_H) - $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(PSHINTER_DRV_OBJ_S) -DRV_OBJS_M += $(PSHINTER_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/psnames/Jamfile b/3party/freetype/src/psnames/Jamfile deleted file mode 100644 index 6dcc8b8e94..0000000000 --- a/3party/freetype/src/psnames/Jamfile +++ /dev/null @@ -1,31 +0,0 @@ -# FreeType 2 src/psnames Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) psnames ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = psmodule - pspic - ; - } - else - { - _sources = psnames ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/psnames Jamfile diff --git a/3party/freetype/src/psnames/module.mk b/3party/freetype/src/psnames/module.mk deleted file mode 100644 index 3708f60362..0000000000 --- a/3party/freetype/src/psnames/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 PSnames module definition -# - - -# Copyright 1996-2015 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. - - -FTMODULE_H_COMMANDS += PSNAMES_MODULE - -define PSNAMES_MODULE -$(OPEN_DRIVER) FT_Module_Class, psnames_module_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)psnames $(ECHO_DRIVER_DESC)Postscript & Unicode Glyph name handling$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/psnames/psmodule.c b/3party/freetype/src/psnames/psmodule.c deleted file mode 100644 index 0f04c2fa7d..0000000000 --- a/3party/freetype/src/psnames/psmodule.c +++ /dev/null @@ -1,609 +0,0 @@ -/***************************************************************************/ -/* */ -/* psmodule.c */ -/* */ -/* PSNames module implementation (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H - -#include "psmodule.h" -#include "pstables.h" - -#include "psnamerr.h" -#include "pspic.h" - - -#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES - - -#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - - -#define VARIANT_BIT 0x80000000UL -#define BASE_GLYPH( code ) ( (FT_UInt32)( (code) & ~VARIANT_BIT ) ) - - - /* Return the Unicode value corresponding to a given glyph. Note that */ - /* we do deal with glyph variants by detecting a non-initial dot in */ - /* the name, as in `A.swash' or `e.final'; in this case, the */ - /* VARIANT_BIT is set in the return value. */ - /* */ - static FT_UInt32 - ps_unicode_value( const char* glyph_name ) - { - /* If the name begins with `uni', then the glyph name may be a */ - /* hard-coded unicode character code. */ - if ( glyph_name[0] == 'u' && - glyph_name[1] == 'n' && - glyph_name[2] == 'i' ) - { - /* determine whether the next four characters following are */ - /* hexadecimal. */ - - /* XXX: Add code to deal with ligatures, i.e. glyph names like */ - /* `uniXXXXYYYYZZZZ'... */ - - FT_Int count; - FT_UInt32 value = 0; - const char* p = glyph_name + 3; - - - for ( count = 4; count > 0; count--, p++ ) - { - char c = *p; - unsigned int d; - - - d = (unsigned char)c - '0'; - if ( d >= 10 ) - { - d = (unsigned char)c - 'A'; - if ( d >= 6 ) - d = 16; - else - d += 10; - } - - /* Exit if a non-uppercase hexadecimal character was found */ - /* -- this also catches character codes below `0' since such */ - /* negative numbers cast to `unsigned int' are far too big. */ - if ( d >= 16 ) - break; - - value = ( value << 4 ) + d; - } - - /* there must be exactly four hex digits */ - if ( count == 0 ) - { - if ( *p == '\0' ) - return value; - if ( *p == '.' ) - return (FT_UInt32)( value | VARIANT_BIT ); - } - } - - /* If the name begins with `u', followed by four to six uppercase */ - /* hexadecimal digits, it is a hard-coded unicode character code. */ - if ( glyph_name[0] == 'u' ) - { - FT_Int count; - FT_UInt32 value = 0; - const char* p = glyph_name + 1; - - - for ( count = 6; count > 0; count--, p++ ) - { - char c = *p; - unsigned int d; - - - d = (unsigned char)c - '0'; - if ( d >= 10 ) - { - d = (unsigned char)c - 'A'; - if ( d >= 6 ) - d = 16; - else - d += 10; - } - - if ( d >= 16 ) - break; - - value = ( value << 4 ) + d; - } - - if ( count <= 2 ) - { - if ( *p == '\0' ) - return value; - if ( *p == '.' ) - return (FT_UInt32)( value | VARIANT_BIT ); - } - } - - /* Look for a non-initial dot in the glyph name in order to */ - /* find variants like `A.swash', `e.final', etc. */ - { - const char* p = glyph_name; - const char* dot = NULL; - - - for ( ; *p; p++ ) - { - if ( *p == '.' && p > glyph_name ) - { - dot = p; - break; - } - } - - /* now look up the glyph in the Adobe Glyph List */ - if ( !dot ) - return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p ); - else - return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) | - VARIANT_BIT ); - } - } - - - /* ft_qsort callback to sort the unicode map */ - FT_CALLBACK_DEF( int ) - compare_uni_maps( const void* a, - const void* b ) - { - PS_UniMap* map1 = (PS_UniMap*)a; - PS_UniMap* map2 = (PS_UniMap*)b; - FT_UInt32 unicode1 = BASE_GLYPH( map1->unicode ); - FT_UInt32 unicode2 = BASE_GLYPH( map2->unicode ); - - - /* sort base glyphs before glyph variants */ - if ( unicode1 == unicode2 ) - { - if ( map1->unicode > map2->unicode ) - return 1; - else if ( map1->unicode < map2->unicode ) - return -1; - else - return 0; - } - else - { - if ( unicode1 > unicode2 ) - return 1; - else if ( unicode1 < unicode2 ) - return -1; - else - return 0; - } - } - - - /* support for extra glyphs not handled (well) in AGL; */ - /* we add extra mappings for them if necessary */ - -#define EXTRA_GLYPH_LIST_SIZE 10 - - static const FT_UInt32 ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] = - { - /* WGL 4 */ - 0x0394, - 0x03A9, - 0x2215, - 0x00AD, - 0x02C9, - 0x03BC, - 0x2219, - 0x00A0, - /* Romanian */ - 0x021A, - 0x021B - }; - - static const char ft_extra_glyph_names[] = - { - 'D','e','l','t','a',0, - 'O','m','e','g','a',0, - 'f','r','a','c','t','i','o','n',0, - 'h','y','p','h','e','n',0, - 'm','a','c','r','o','n',0, - 'm','u',0, - 'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0, - 's','p','a','c','e',0, - 'T','c','o','m','m','a','a','c','c','e','n','t',0, - 't','c','o','m','m','a','a','c','c','e','n','t',0 - }; - - static const FT_Int - ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] = - { - 0, - 6, - 12, - 21, - 28, - 35, - 38, - 53, - 59, - 72 - }; - - - static void - ps_check_extra_glyph_name( const char* gname, - FT_UInt glyph, - FT_UInt* extra_glyphs, - FT_UInt *states ) - { - FT_UInt n; - - - for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) - { - if ( ft_strcmp( ft_extra_glyph_names + - ft_extra_glyph_name_offsets[n], gname ) == 0 ) - { - if ( states[n] == 0 ) - { - /* mark this extra glyph as a candidate for the cmap */ - states[n] = 1; - extra_glyphs[n] = glyph; - } - - return; - } - } - } - - - static void - ps_check_extra_glyph_unicode( FT_UInt32 uni_char, - FT_UInt *states ) - { - FT_UInt n; - - - for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) - { - if ( uni_char == ft_extra_glyph_unicodes[n] ) - { - /* disable this extra glyph from being added to the cmap */ - states[n] = 2; - - return; - } - } - } - - - /* Build a table that maps Unicode values to glyph indices. */ - static FT_Error - ps_unicodes_init( FT_Memory memory, - PS_Unicodes table, - FT_UInt num_glyphs, - PS_GetGlyphNameFunc get_glyph_name, - PS_FreeGlyphNameFunc free_glyph_name, - FT_Pointer glyph_data ) - { - FT_Error error; - - FT_UInt extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - FT_UInt extra_glyphs[EXTRA_GLYPH_LIST_SIZE]; - - - /* we first allocate the table */ - table->num_maps = 0; - table->maps = NULL; - - if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) ) - { - FT_UInt n; - FT_UInt count; - PS_UniMap* map; - FT_UInt32 uni_char; - - - map = table->maps; - - for ( n = 0; n < num_glyphs; n++ ) - { - const char* gname = get_glyph_name( glyph_data, n ); - - - if ( gname ) - { - ps_check_extra_glyph_name( gname, n, - extra_glyphs, extra_glyph_list_states ); - uni_char = ps_unicode_value( gname ); - - if ( BASE_GLYPH( uni_char ) != 0 ) - { - ps_check_extra_glyph_unicode( uni_char, - extra_glyph_list_states ); - map->unicode = uni_char; - map->glyph_index = n; - map++; - } - - if ( free_glyph_name ) - free_glyph_name( glyph_data, gname ); - } - } - - for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) - { - if ( extra_glyph_list_states[n] == 1 ) - { - /* This glyph name has an additional representation. */ - /* Add it to the cmap. */ - - map->unicode = ft_extra_glyph_unicodes[n]; - map->glyph_index = extra_glyphs[n]; - map++; - } - } - - /* now compress the table a bit */ - count = (FT_UInt)( map - table->maps ); - - if ( count == 0 ) - { - /* No unicode chars here! */ - FT_FREE( table->maps ); - if ( !error ) - error = FT_THROW( No_Unicode_Glyph_Name ); - } - else - { - /* Reallocate if the number of used entries is much smaller. */ - if ( count < num_glyphs / 2 ) - { - (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count ); - error = FT_Err_Ok; - } - - /* Sort the table in increasing order of unicode values, */ - /* taking care of glyph variants. */ - ft_qsort( table->maps, count, sizeof ( PS_UniMap ), - compare_uni_maps ); - } - - table->num_maps = count; - } - - return error; - } - - - static FT_UInt - ps_unicodes_char_index( PS_Unicodes table, - FT_UInt32 unicode ) - { - PS_UniMap *min, *max, *mid, *result = NULL; - - - /* Perform a binary search on the table. */ - - min = table->maps; - max = min + table->num_maps - 1; - - while ( min <= max ) - { - FT_UInt32 base_glyph; - - - mid = min + ( ( max - min ) >> 1 ); - - if ( mid->unicode == unicode ) - { - result = mid; - break; - } - - base_glyph = BASE_GLYPH( mid->unicode ); - - if ( base_glyph == unicode ) - result = mid; /* remember match but continue search for base glyph */ - - if ( min == max ) - break; - - if ( base_glyph < unicode ) - min = mid + 1; - else - max = mid - 1; - } - - if ( result ) - return result->glyph_index; - else - return 0; - } - - - static FT_UInt32 - ps_unicodes_char_next( PS_Unicodes table, - FT_UInt32 *unicode ) - { - FT_UInt result = 0; - FT_UInt32 char_code = *unicode + 1; - - - { - FT_UInt min = 0; - FT_UInt max = table->num_maps; - FT_UInt mid; - PS_UniMap* map; - FT_UInt32 base_glyph; - - - while ( min < max ) - { - mid = min + ( ( max - min ) >> 1 ); - map = table->maps + mid; - - if ( map->unicode == char_code ) - { - result = map->glyph_index; - goto Exit; - } - - base_glyph = BASE_GLYPH( map->unicode ); - - if ( base_glyph == char_code ) - result = map->glyph_index; - - if ( base_glyph < char_code ) - min = mid + 1; - else - max = mid; - } - - if ( result ) - goto Exit; /* we have a variant glyph */ - - /* we didn't find it; check whether we have a map just above it */ - char_code = 0; - - if ( min < table->num_maps ) - { - map = table->maps + min; - result = map->glyph_index; - char_code = BASE_GLYPH( map->unicode ); - } - } - - Exit: - *unicode = char_code; - return result; - } - - -#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ - - - static const char* - ps_get_macintosh_name( FT_UInt name_index ) - { - if ( name_index >= FT_NUM_MAC_NAMES ) - name_index = 0; - - return ft_standard_glyph_names + ft_mac_names[name_index]; - } - - - static const char* - ps_get_standard_strings( FT_UInt sid ) - { - if ( sid >= FT_NUM_SID_NAMES ) - return 0; - - return ft_standard_glyph_names + ft_sid_names[sid]; - } - - -#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - - FT_DEFINE_SERVICE_PSCMAPSREC( - pscmaps_interface, - (PS_Unicode_ValueFunc) ps_unicode_value, - (PS_Unicodes_InitFunc) ps_unicodes_init, - (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, - (PS_Unicodes_CharNextFunc) ps_unicodes_char_next, - - (PS_Macintosh_NameFunc) ps_get_macintosh_name, - (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, - - t1_standard_encoding, - t1_expert_encoding ) - -#else - - FT_DEFINE_SERVICE_PSCMAPSREC( - pscmaps_interface, - NULL, - NULL, - NULL, - NULL, - - (PS_Macintosh_NameFunc) ps_get_macintosh_name, - (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, - - t1_standard_encoding, - t1_expert_encoding ) - -#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ - - - FT_DEFINE_SERVICEDESCREC1( - pscmaps_services, - FT_SERVICE_ID_POSTSCRIPT_CMAPS, &PSCMAPS_INTERFACE_GET ) - - - static FT_Pointer - psnames_get_service( FT_Module module, - const char* service_id ) - { - /* PSCMAPS_SERVICES_GET dereferences `library' in PIC mode */ -#ifdef FT_CONFIG_OPTION_PIC - FT_Library library; - - - if ( !module ) - return NULL; - library = module->library; - if ( !library ) - return NULL; -#else - FT_UNUSED( module ); -#endif - - return ft_service_list_lookup( PSCMAPS_SERVICES_GET, service_id ); - } - -#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ - - -#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES -#define PUT_PS_NAMES_SERVICE( a ) NULL -#else -#define PUT_PS_NAMES_SERVICE( a ) a -#endif - - FT_DEFINE_MODULE( - psnames_module_class, - - 0, /* this is not a font driver, nor a renderer */ - sizeof ( FT_ModuleRec ), - - "psnames", /* driver name */ - 0x10000L, /* driver version */ - 0x20000L, /* driver requires FreeType 2 or above */ - - PUT_PS_NAMES_SERVICE( - (void*)&PSCMAPS_INTERFACE_GET ), /* module specific interface */ - (FT_Module_Constructor)NULL, - (FT_Module_Destructor) NULL, - (FT_Module_Requester) PUT_PS_NAMES_SERVICE( psnames_get_service ) ) - - -/* END */ diff --git a/3party/freetype/src/psnames/psmodule.h b/3party/freetype/src/psnames/psmodule.h deleted file mode 100644 index f85f322193..0000000000 --- a/3party/freetype/src/psnames/psmodule.h +++ /dev/null @@ -1,38 +0,0 @@ -/***************************************************************************/ -/* */ -/* psmodule.h */ -/* */ -/* High-level PSNames module interface (specification). */ -/* */ -/* Copyright 1996-2015 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 __PSMODULE_H__ -#define __PSMODULE_H__ - - -#include <ft2build.h> -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - - FT_DECLARE_MODULE( psnames_module_class ) - - -FT_END_HEADER - -#endif /* __PSMODULE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/psnames/psnamerr.h b/3party/freetype/src/psnames/psnamerr.h deleted file mode 100644 index 09cc247b7d..0000000000 --- a/3party/freetype/src/psnames/psnamerr.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************/ -/* */ -/* psnamerr.h */ -/* */ -/* PS names module error codes (specification only). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the PS names module error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __PSNAMERR_H__ -#define __PSNAMERR_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX PSnames_Err_ -#define FT_ERR_BASE FT_Mod_Err_PSnames - -#include FT_ERRORS_H - -#endif /* __PSNAMERR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/psnames/psnames.c b/3party/freetype/src/psnames/psnames.c deleted file mode 100644 index a4385961e5..0000000000 --- a/3party/freetype/src/psnames/psnames.c +++ /dev/null @@ -1,26 +0,0 @@ -/***************************************************************************/ -/* */ -/* psnames.c */ -/* */ -/* FreeType PSNames module component (body only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "pspic.c" -#include "psmodule.c" - - -/* END */ diff --git a/3party/freetype/src/psnames/pspic.c b/3party/freetype/src/psnames/pspic.c deleted file mode 100644 index 1394f977e0..0000000000 --- a/3party/freetype/src/psnames/pspic.c +++ /dev/null @@ -1,97 +0,0 @@ -/***************************************************************************/ -/* */ -/* pspic.c */ -/* */ -/* The FreeType position independent code services for psnames module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "pspic.h" -#include "psnamerr.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from psmodule.c */ - FT_Error - FT_Create_Class_pscmaps_services( FT_Library library, - FT_ServiceDescRec** output_class ); - void - FT_Destroy_Class_pscmaps_services( FT_Library library, - FT_ServiceDescRec* clazz ); - - void - FT_Init_Class_pscmaps_interface( FT_Library library, - FT_Service_PsCMapsRec* clazz ); - - - void - psnames_module_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->psnames ) - { - PSModulePIC* container = (PSModulePIC*)pic_container->psnames; - - - if ( container->pscmaps_services ) - FT_Destroy_Class_pscmaps_services( library, - container->pscmaps_services ); - container->pscmaps_services = NULL; - FT_FREE( container ); - pic_container->psnames = NULL; - } - } - - - FT_Error - psnames_module_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - PSModulePIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->psnames = container; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - error = FT_Create_Class_pscmaps_services( - library, &container->pscmaps_services ); - if ( error ) - goto Exit; - FT_Init_Class_pscmaps_interface( library, - &container->pscmaps_interface ); - - Exit: - if ( error ) - psnames_module_class_pic_free( library ); - return error; - } - - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/3party/freetype/src/psnames/pspic.h b/3party/freetype/src/psnames/pspic.h deleted file mode 100644 index 443225af61..0000000000 --- a/3party/freetype/src/psnames/pspic.h +++ /dev/null @@ -1,68 +0,0 @@ -/***************************************************************************/ -/* */ -/* pspic.h */ -/* */ -/* The FreeType position independent code services for psnames module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 __PSPIC_H__ -#define __PSPIC_H__ - - -#include FT_INTERNAL_PIC_H - - -#ifndef FT_CONFIG_OPTION_PIC - -#define PSCMAPS_SERVICES_GET pscmaps_services -#define PSCMAPS_INTERFACE_GET pscmaps_interface - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_SERVICE_POSTSCRIPT_CMAPS_H - - -FT_BEGIN_HEADER - - typedef struct PSModulePIC_ - { - FT_ServiceDescRec* pscmaps_services; - FT_Service_PsCMapsRec pscmaps_interface; - - } PSModulePIC; - - -#define GET_PIC( lib ) \ - ( (PSModulePIC*)((lib)->pic_container.psnames) ) -#define PSCMAPS_SERVICES_GET ( GET_PIC( library )->pscmaps_services ) -#define PSCMAPS_INTERFACE_GET ( GET_PIC( library )->pscmaps_interface ) - - - /* see pspic.c for the implementation */ - void - psnames_module_class_pic_free( FT_Library library ); - - FT_Error - psnames_module_class_pic_init( FT_Library library ); - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* __PSPIC_H__ */ - - -/* END */ diff --git a/3party/freetype/src/psnames/pstables.h b/3party/freetype/src/psnames/pstables.h deleted file mode 100644 index 3f31c31b18..0000000000 --- a/3party/freetype/src/psnames/pstables.h +++ /dev/null @@ -1,4170 +0,0 @@ -/***************************************************************************/ -/* */ -/* pstables.h */ -/* */ -/* PostScript glyph names. */ -/* */ -/* Copyright 2005-2015 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. */ -/* */ -/***************************************************************************/ - - - /* This file has been generated automatically -- do not edit! */ - - - static const char ft_standard_glyph_names[3696] = - { - '.','n','u','l','l', 0, - 'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0, - 'n','o','t','e','q','u','a','l', 0, - 'i','n','f','i','n','i','t','y', 0, - 'l','e','s','s','e','q','u','a','l', 0, - 'g','r','e','a','t','e','r','e','q','u','a','l', 0, - 'p','a','r','t','i','a','l','d','i','f','f', 0, - 's','u','m','m','a','t','i','o','n', 0, - 'p','r','o','d','u','c','t', 0, - 'p','i', 0, - 'i','n','t','e','g','r','a','l', 0, - 'O','m','e','g','a', 0, - 'r','a','d','i','c','a','l', 0, - 'a','p','p','r','o','x','e','q','u','a','l', 0, - 'D','e','l','t','a', 0, - 'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0, - 'l','o','z','e','n','g','e', 0, - 'a','p','p','l','e', 0, - 'f','r','a','n','c', 0, - 'G','b','r','e','v','e', 0, - 'g','b','r','e','v','e', 0, - 'I','d','o','t','a','c','c','e','n','t', 0, - 'S','c','e','d','i','l','l','a', 0, - 's','c','e','d','i','l','l','a', 0, - 'C','a','c','u','t','e', 0, - 'c','a','c','u','t','e', 0, - 'C','c','a','r','o','n', 0, - 'c','c','a','r','o','n', 0, - 'd','c','r','o','a','t', 0, - '.','n','o','t','d','e','f', 0, - 's','p','a','c','e', 0, - 'e','x','c','l','a','m', 0, - 'q','u','o','t','e','d','b','l', 0, - 'n','u','m','b','e','r','s','i','g','n', 0, - 'd','o','l','l','a','r', 0, - 'p','e','r','c','e','n','t', 0, - 'a','m','p','e','r','s','a','n','d', 0, - 'q','u','o','t','e','r','i','g','h','t', 0, - 'p','a','r','e','n','l','e','f','t', 0, - 'p','a','r','e','n','r','i','g','h','t', 0, - 'a','s','t','e','r','i','s','k', 0, - 'p','l','u','s', 0, - 'c','o','m','m','a', 0, - 'h','y','p','h','e','n', 0, - 'p','e','r','i','o','d', 0, - 's','l','a','s','h', 0, - 'z','e','r','o', 0, - 'o','n','e', 0, - 't','w','o', 0, - 't','h','r','e','e', 0, - 'f','o','u','r', 0, - 'f','i','v','e', 0, - 's','i','x', 0, - 's','e','v','e','n', 0, - 'e','i','g','h','t', 0, - 'n','i','n','e', 0, - 'c','o','l','o','n', 0, - 's','e','m','i','c','o','l','o','n', 0, - 'l','e','s','s', 0, - 'e','q','u','a','l', 0, - 'g','r','e','a','t','e','r', 0, - 'q','u','e','s','t','i','o','n', 0, - 'a','t', 0, - 'A', 0, - 'B', 0, - 'C', 0, - 'D', 0, - 'E', 0, - 'F', 0, - 'G', 0, - 'H', 0, - 'I', 0, - 'J', 0, - 'K', 0, - 'L', 0, - 'M', 0, - 'N', 0, - 'O', 0, - 'P', 0, - 'Q', 0, - 'R', 0, - 'S', 0, - 'T', 0, - 'U', 0, - 'V', 0, - 'W', 0, - 'X', 0, - 'Y', 0, - 'Z', 0, - 'b','r','a','c','k','e','t','l','e','f','t', 0, - 'b','a','c','k','s','l','a','s','h', 0, - 'b','r','a','c','k','e','t','r','i','g','h','t', 0, - 'a','s','c','i','i','c','i','r','c','u','m', 0, - 'u','n','d','e','r','s','c','o','r','e', 0, - 'q','u','o','t','e','l','e','f','t', 0, - 'a', 0, - 'b', 0, - 'c', 0, - 'd', 0, - 'e', 0, - 'f', 0, - 'g', 0, - 'h', 0, - 'i', 0, - 'j', 0, - 'k', 0, - 'l', 0, - 'm', 0, - 'n', 0, - 'o', 0, - 'p', 0, - 'q', 0, - 'r', 0, - 's', 0, - 't', 0, - 'u', 0, - 'v', 0, - 'w', 0, - 'x', 0, - 'y', 0, - 'z', 0, - 'b','r','a','c','e','l','e','f','t', 0, - 'b','a','r', 0, - 'b','r','a','c','e','r','i','g','h','t', 0, - 'a','s','c','i','i','t','i','l','d','e', 0, - 'e','x','c','l','a','m','d','o','w','n', 0, - 'c','e','n','t', 0, - 's','t','e','r','l','i','n','g', 0, - 'f','r','a','c','t','i','o','n', 0, - 'y','e','n', 0, - 'f','l','o','r','i','n', 0, - 's','e','c','t','i','o','n', 0, - 'c','u','r','r','e','n','c','y', 0, - 'q','u','o','t','e','s','i','n','g','l','e', 0, - 'q','u','o','t','e','d','b','l','l','e','f','t', 0, - 'g','u','i','l','l','e','m','o','t','l','e','f','t', 0, - 'g','u','i','l','s','i','n','g','l','l','e','f','t', 0, - 'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0, - 'f','i', 0, - 'f','l', 0, - 'e','n','d','a','s','h', 0, - 'd','a','g','g','e','r', 0, - 'd','a','g','g','e','r','d','b','l', 0, - 'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0, - 'p','a','r','a','g','r','a','p','h', 0, - 'b','u','l','l','e','t', 0, - 'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0, - 'q','u','o','t','e','d','b','l','b','a','s','e', 0, - 'q','u','o','t','e','d','b','l','r','i','g','h','t', 0, - 'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0, - 'e','l','l','i','p','s','i','s', 0, - 'p','e','r','t','h','o','u','s','a','n','d', 0, - 'q','u','e','s','t','i','o','n','d','o','w','n', 0, - 'g','r','a','v','e', 0, - 'a','c','u','t','e', 0, - 'c','i','r','c','u','m','f','l','e','x', 0, - 't','i','l','d','e', 0, - 'm','a','c','r','o','n', 0, - 'b','r','e','v','e', 0, - 'd','o','t','a','c','c','e','n','t', 0, - 'd','i','e','r','e','s','i','s', 0, - 'r','i','n','g', 0, - 'c','e','d','i','l','l','a', 0, - 'h','u','n','g','a','r','u','m','l','a','u','t', 0, - 'o','g','o','n','e','k', 0, - 'c','a','r','o','n', 0, - 'e','m','d','a','s','h', 0, - 'A','E', 0, - 'o','r','d','f','e','m','i','n','i','n','e', 0, - 'L','s','l','a','s','h', 0, - 'O','s','l','a','s','h', 0, - 'O','E', 0, - 'o','r','d','m','a','s','c','u','l','i','n','e', 0, - 'a','e', 0, - 'd','o','t','l','e','s','s','i', 0, - 'l','s','l','a','s','h', 0, - 'o','s','l','a','s','h', 0, - 'o','e', 0, - 'g','e','r','m','a','n','d','b','l','s', 0, - 'o','n','e','s','u','p','e','r','i','o','r', 0, - 'l','o','g','i','c','a','l','n','o','t', 0, - 'm','u', 0, - 't','r','a','d','e','m','a','r','k', 0, - 'E','t','h', 0, - 'o','n','e','h','a','l','f', 0, - 'p','l','u','s','m','i','n','u','s', 0, - 'T','h','o','r','n', 0, - 'o','n','e','q','u','a','r','t','e','r', 0, - 'd','i','v','i','d','e', 0, - 'b','r','o','k','e','n','b','a','r', 0, - 'd','e','g','r','e','e', 0, - 't','h','o','r','n', 0, - 't','h','r','e','e','q','u','a','r','t','e','r','s', 0, - 't','w','o','s','u','p','e','r','i','o','r', 0, - 'r','e','g','i','s','t','e','r','e','d', 0, - 'm','i','n','u','s', 0, - 'e','t','h', 0, - 'm','u','l','t','i','p','l','y', 0, - 't','h','r','e','e','s','u','p','e','r','i','o','r', 0, - 'c','o','p','y','r','i','g','h','t', 0, - 'A','a','c','u','t','e', 0, - 'A','c','i','r','c','u','m','f','l','e','x', 0, - 'A','d','i','e','r','e','s','i','s', 0, - 'A','g','r','a','v','e', 0, - 'A','r','i','n','g', 0, - 'A','t','i','l','d','e', 0, - 'C','c','e','d','i','l','l','a', 0, - 'E','a','c','u','t','e', 0, - 'E','c','i','r','c','u','m','f','l','e','x', 0, - 'E','d','i','e','r','e','s','i','s', 0, - 'E','g','r','a','v','e', 0, - 'I','a','c','u','t','e', 0, - 'I','c','i','r','c','u','m','f','l','e','x', 0, - 'I','d','i','e','r','e','s','i','s', 0, - 'I','g','r','a','v','e', 0, - 'N','t','i','l','d','e', 0, - 'O','a','c','u','t','e', 0, - 'O','c','i','r','c','u','m','f','l','e','x', 0, - 'O','d','i','e','r','e','s','i','s', 0, - 'O','g','r','a','v','e', 0, - 'O','t','i','l','d','e', 0, - 'S','c','a','r','o','n', 0, - 'U','a','c','u','t','e', 0, - 'U','c','i','r','c','u','m','f','l','e','x', 0, - 'U','d','i','e','r','e','s','i','s', 0, - 'U','g','r','a','v','e', 0, - 'Y','a','c','u','t','e', 0, - 'Y','d','i','e','r','e','s','i','s', 0, - 'Z','c','a','r','o','n', 0, - 'a','a','c','u','t','e', 0, - 'a','c','i','r','c','u','m','f','l','e','x', 0, - 'a','d','i','e','r','e','s','i','s', 0, - 'a','g','r','a','v','e', 0, - 'a','r','i','n','g', 0, - 'a','t','i','l','d','e', 0, - 'c','c','e','d','i','l','l','a', 0, - 'e','a','c','u','t','e', 0, - 'e','c','i','r','c','u','m','f','l','e','x', 0, - 'e','d','i','e','r','e','s','i','s', 0, - 'e','g','r','a','v','e', 0, - 'i','a','c','u','t','e', 0, - 'i','c','i','r','c','u','m','f','l','e','x', 0, - 'i','d','i','e','r','e','s','i','s', 0, - 'i','g','r','a','v','e', 0, - 'n','t','i','l','d','e', 0, - 'o','a','c','u','t','e', 0, - 'o','c','i','r','c','u','m','f','l','e','x', 0, - 'o','d','i','e','r','e','s','i','s', 0, - 'o','g','r','a','v','e', 0, - 'o','t','i','l','d','e', 0, - 's','c','a','r','o','n', 0, - 'u','a','c','u','t','e', 0, - 'u','c','i','r','c','u','m','f','l','e','x', 0, - 'u','d','i','e','r','e','s','i','s', 0, - 'u','g','r','a','v','e', 0, - 'y','a','c','u','t','e', 0, - 'y','d','i','e','r','e','s','i','s', 0, - 'z','c','a','r','o','n', 0, - 'e','x','c','l','a','m','s','m','a','l','l', 0, - 'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0, - 'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0, - 'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0, - 'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0, - 'A','c','u','t','e','s','m','a','l','l', 0, - 'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0, - 'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0, - 't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0, - 'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0, - 'z','e','r','o','o','l','d','s','t','y','l','e', 0, - 'o','n','e','o','l','d','s','t','y','l','e', 0, - 't','w','o','o','l','d','s','t','y','l','e', 0, - 't','h','r','e','e','o','l','d','s','t','y','l','e', 0, - 'f','o','u','r','o','l','d','s','t','y','l','e', 0, - 'f','i','v','e','o','l','d','s','t','y','l','e', 0, - 's','i','x','o','l','d','s','t','y','l','e', 0, - 's','e','v','e','n','o','l','d','s','t','y','l','e', 0, - 'e','i','g','h','t','o','l','d','s','t','y','l','e', 0, - 'n','i','n','e','o','l','d','s','t','y','l','e', 0, - 'c','o','m','m','a','s','u','p','e','r','i','o','r', 0, - 't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0, - 'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0, - 'q','u','e','s','t','i','o','n','s','m','a','l','l', 0, - 'a','s','u','p','e','r','i','o','r', 0, - 'b','s','u','p','e','r','i','o','r', 0, - 'c','e','n','t','s','u','p','e','r','i','o','r', 0, - 'd','s','u','p','e','r','i','o','r', 0, - 'e','s','u','p','e','r','i','o','r', 0, - 'i','s','u','p','e','r','i','o','r', 0, - 'l','s','u','p','e','r','i','o','r', 0, - 'm','s','u','p','e','r','i','o','r', 0, - 'n','s','u','p','e','r','i','o','r', 0, - 'o','s','u','p','e','r','i','o','r', 0, - 'r','s','u','p','e','r','i','o','r', 0, - 's','s','u','p','e','r','i','o','r', 0, - 't','s','u','p','e','r','i','o','r', 0, - 'f','f', 0, - 'f','f','i', 0, - 'f','f','l', 0, - 'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0, - 'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0, - 'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, - 'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0, - 'G','r','a','v','e','s','m','a','l','l', 0, - 'A','s','m','a','l','l', 0, - 'B','s','m','a','l','l', 0, - 'C','s','m','a','l','l', 0, - 'D','s','m','a','l','l', 0, - 'E','s','m','a','l','l', 0, - 'F','s','m','a','l','l', 0, - 'G','s','m','a','l','l', 0, - 'H','s','m','a','l','l', 0, - 'I','s','m','a','l','l', 0, - 'J','s','m','a','l','l', 0, - 'K','s','m','a','l','l', 0, - 'L','s','m','a','l','l', 0, - 'M','s','m','a','l','l', 0, - 'N','s','m','a','l','l', 0, - 'O','s','m','a','l','l', 0, - 'P','s','m','a','l','l', 0, - 'Q','s','m','a','l','l', 0, - 'R','s','m','a','l','l', 0, - 'S','s','m','a','l','l', 0, - 'T','s','m','a','l','l', 0, - 'U','s','m','a','l','l', 0, - 'V','s','m','a','l','l', 0, - 'W','s','m','a','l','l', 0, - 'X','s','m','a','l','l', 0, - 'Y','s','m','a','l','l', 0, - 'Z','s','m','a','l','l', 0, - 'c','o','l','o','n','m','o','n','e','t','a','r','y', 0, - 'o','n','e','f','i','t','t','e','d', 0, - 'r','u','p','i','a','h', 0, - 'T','i','l','d','e','s','m','a','l','l', 0, - 'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0, - 'c','e','n','t','o','l','d','s','t','y','l','e', 0, - 'L','s','l','a','s','h','s','m','a','l','l', 0, - 'S','c','a','r','o','n','s','m','a','l','l', 0, - 'Z','c','a','r','o','n','s','m','a','l','l', 0, - 'D','i','e','r','e','s','i','s','s','m','a','l','l', 0, - 'B','r','e','v','e','s','m','a','l','l', 0, - 'C','a','r','o','n','s','m','a','l','l', 0, - 'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0, - 'M','a','c','r','o','n','s','m','a','l','l', 0, - 'f','i','g','u','r','e','d','a','s','h', 0, - 'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0, - 'O','g','o','n','e','k','s','m','a','l','l', 0, - 'R','i','n','g','s','m','a','l','l', 0, - 'C','e','d','i','l','l','a','s','m','a','l','l', 0, - 'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0, - 'o','n','e','e','i','g','h','t','h', 0, - 't','h','r','e','e','e','i','g','h','t','h','s', 0, - 'f','i','v','e','e','i','g','h','t','h','s', 0, - 's','e','v','e','n','e','i','g','h','t','h','s', 0, - 'o','n','e','t','h','i','r','d', 0, - 't','w','o','t','h','i','r','d','s', 0, - 'z','e','r','o','s','u','p','e','r','i','o','r', 0, - 'f','o','u','r','s','u','p','e','r','i','o','r', 0, - 'f','i','v','e','s','u','p','e','r','i','o','r', 0, - 's','i','x','s','u','p','e','r','i','o','r', 0, - 's','e','v','e','n','s','u','p','e','r','i','o','r', 0, - 'e','i','g','h','t','s','u','p','e','r','i','o','r', 0, - 'n','i','n','e','s','u','p','e','r','i','o','r', 0, - 'z','e','r','o','i','n','f','e','r','i','o','r', 0, - 'o','n','e','i','n','f','e','r','i','o','r', 0, - 't','w','o','i','n','f','e','r','i','o','r', 0, - 't','h','r','e','e','i','n','f','e','r','i','o','r', 0, - 'f','o','u','r','i','n','f','e','r','i','o','r', 0, - 'f','i','v','e','i','n','f','e','r','i','o','r', 0, - 's','i','x','i','n','f','e','r','i','o','r', 0, - 's','e','v','e','n','i','n','f','e','r','i','o','r', 0, - 'e','i','g','h','t','i','n','f','e','r','i','o','r', 0, - 'n','i','n','e','i','n','f','e','r','i','o','r', 0, - 'c','e','n','t','i','n','f','e','r','i','o','r', 0, - 'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0, - 'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0, - 'c','o','m','m','a','i','n','f','e','r','i','o','r', 0, - 'A','g','r','a','v','e','s','m','a','l','l', 0, - 'A','a','c','u','t','e','s','m','a','l','l', 0, - 'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, - 'A','t','i','l','d','e','s','m','a','l','l', 0, - 'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, - 'A','r','i','n','g','s','m','a','l','l', 0, - 'A','E','s','m','a','l','l', 0, - 'C','c','e','d','i','l','l','a','s','m','a','l','l', 0, - 'E','g','r','a','v','e','s','m','a','l','l', 0, - 'E','a','c','u','t','e','s','m','a','l','l', 0, - 'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, - 'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, - 'I','g','r','a','v','e','s','m','a','l','l', 0, - 'I','a','c','u','t','e','s','m','a','l','l', 0, - 'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, - 'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, - 'E','t','h','s','m','a','l','l', 0, - 'N','t','i','l','d','e','s','m','a','l','l', 0, - 'O','g','r','a','v','e','s','m','a','l','l', 0, - 'O','a','c','u','t','e','s','m','a','l','l', 0, - 'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, - 'O','t','i','l','d','e','s','m','a','l','l', 0, - 'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, - 'O','E','s','m','a','l','l', 0, - 'O','s','l','a','s','h','s','m','a','l','l', 0, - 'U','g','r','a','v','e','s','m','a','l','l', 0, - 'U','a','c','u','t','e','s','m','a','l','l', 0, - 'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, - 'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, - 'Y','a','c','u','t','e','s','m','a','l','l', 0, - 'T','h','o','r','n','s','m','a','l','l', 0, - 'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, - '0','0','1','.','0','0','0', 0, - '0','0','1','.','0','0','1', 0, - '0','0','1','.','0','0','2', 0, - '0','0','1','.','0','0','3', 0, - 'B','l','a','c','k', 0, - 'B','o','l','d', 0, - 'B','o','o','k', 0, - 'L','i','g','h','t', 0, - 'M','e','d','i','u','m', 0, - 'R','e','g','u','l','a','r', 0, - 'R','o','m','a','n', 0, - 'S','e','m','i','b','o','l','d', 0, - }; - - -#define FT_NUM_MAC_NAMES 258 - - /* Values are offsets into the `ft_standard_glyph_names' table */ - - static const short ft_mac_names[FT_NUM_MAC_NAMES] = - { - 253, 0, 6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351, - 360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, - 436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, - 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, - 528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610, - 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, - 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, - 1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652, - 1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776, - 1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346, - 1197, 985,1031, 23,1086,1108, 32,1219, 41, 51, 730,1194, 64, 76, - 86, 94, 97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120, - 132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916, - 598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856, - 888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500, - 163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053, - 1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229, - 1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200, - 209, 218, 225, 232, 239, 246 - }; - - -#define FT_NUM_SID_NAMES 391 - - /* Values are offsets into the `ft_standard_glyph_names' table */ - - static const short ft_sid_names[FT_NUM_SID_NAMES] = - { - 253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365, - 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441, - 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502, - 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530, - 532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614, - 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, - 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707, - 712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832, - 839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985, - 991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089, - 1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197, - 1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319, - 1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443, - 1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562, - 1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680, - 1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797, - 1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973, - 1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167, - 2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319, - 2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454, - 2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552, - 2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684, - 2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860, - 2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034, - 3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220, - 3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409, - 3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586, - 3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687 - }; - - - /* the following are indices into the SID name table */ - static const unsigned short t1_standard_encoding[256] = - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110, - 0,111,112,113,114, 0,115,116,117,118,119,120,121,122, 0,123, - 0,124,125,126,127,128,129,130,131, 0,132,133, 0,134,135,136, - 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,138, 0,139, 0, 0, 0, 0,140,141,142,143, 0, 0, 0, 0, - 0,144, 0, 0, 0,145, 0, 0,146,147,148,149, 0, 0, 0, 0 - }; - - - /* the following are indices into the SID name table */ - static const unsigned short t1_expert_encoding[256] = - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1,229,230, 0,231,232,233,234,235,236,237,238, 13, 14, 15, 99, - 239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252, - 0,253,254,255,256,257, 0, 0, 0,258, 0, 0,259,260,261,262, - 0, 0,263,264,265, 0,266,109,110,267,268,269, 0,270,271,272, - 273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288, - 289,290,291,292,293,294,295,296,297,298,299,300,301,302,303, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,304,305,306, 0, 0,307,308,309,310,311, 0,312, 0, 0,313, - 0, 0,314,315, 0, 0,316,317,318, 0, 0, 0,158,155,163,319, - 320,321,322,323,324,325, 0, 0,326,150,164,169,327,328,329,330, - 331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346, - 347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362, - 363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378 - }; - - - /* - * This table is a compressed version of the Adobe Glyph List (AGL), - * optimized for efficient searching. It has been generated by the - * `glnames.py' python script located in the `src/tools' directory. - * - * The lookup function to get the Unicode value for a given string - * is defined below the table. - */ - -#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - - static const unsigned char ft_adobe_glyph_list[55997L] = - { - 0, 52, 0,106, 2,167, 3, 63, 4,220, 6,125, 9,143, 10, 23, - 11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88, - 22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107, - 32,222, 33, 55, 34,154, 35,218, 58, 10, 64,122, 72,188, 80,109, - 88,104, 93, 61, 98,168,106, 91,114,111,115,237,122,180,127,255, - 135,164,143,132,149,213,158,108,161,115,168,175,183,147,197,199, - 202, 25,204,166,208,209,209, 81,215, 26, 65,143, 0, 65, 0,140, - 0,175, 0,193, 1, 15, 1,147, 1,233, 1,251, 2, 7, 2, 40, - 2, 57, 2, 82, 2, 91, 2,128, 2,136, 2,154, 69,131, 0,198, - 0,150, 0,158, 0,167,225,227,245,244,101,128, 1,252,237,225, - 227,242,239,110,128, 1,226,243,237,225,236,108,128,247,230,225, - 227,245,244,101,129, 0,193, 0,185,243,237,225,236,108,128,247, - 225,226,242,229,246,101,134, 1, 2, 0,213, 0,221, 0,232, 0, - 243, 0,251, 1, 7,225,227,245,244,101,128, 30,174,227,249,242, - 233,236,236,233, 99,128, 4,208,228,239,244,226,229,236,239,119, - 128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225, - 226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99, - 4, 1, 25, 1, 32, 1,121, 1,137,225,242,239,110,128, 1,205, - 233,242, 99, 2, 1, 40, 1, 45,236,101,128, 36,182,245,237,230, - 236,229,120,134, 0,194, 1, 66, 1, 74, 1, 85, 1, 93, 1,105, - 1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236, - 239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239, - 235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247, - 226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201, 1, - 129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99, - 128, 4, 16,100, 3, 1,155, 1,165, 1,209,226,236,231,242,225, - 246,101,128, 2, 0,233,229,242,229,243,233,115,131, 0,196, 1, - 181, 1,192, 1,201,227,249,242,233,236,236,233, 99,128, 4,210, - 237,225,227,242,239,110,128, 1,222,243,237,225,236,108,128,247, - 228,239,116, 2, 1,216, 1,224,226,229,236,239,119,128, 30,160, - 237,225,227,242,239,110,128, 1,224,231,242,225,246,101,129, 0, - 192, 1,243,243,237,225,236,108,128,247,224,232,239,239,235,225, - 226,239,246,101,128, 30,162,105, 2, 2, 13, 2, 25,229,227,249, - 242,233,236,236,233, 99,128, 4,212,238,246,229,242,244,229,228, - 226,242,229,246,101,128, 2, 2,236,240,232, 97,129, 3,145, 2, - 49,244,239,238,239,115,128, 3,134,109, 2, 2, 63, 2, 71,225, - 227,242,239,110,128, 1, 0,239,238,239,243,240,225,227,101,128, - 255, 33,239,231,239,238,229,107,128, 1, 4,242,233,238,103,131, - 0,197, 2,104, 2,112, 2,120,225,227,245,244,101,128, 1,250, - 226,229,236,239,119,128, 30, 0,243,237,225,236,108,128,247,229, - 243,237,225,236,108,128,247, 97,244,233,236,228,101,129, 0,195, - 2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229, - 238,233,225,110,128, 5, 49, 66,137, 0, 66, 2,189, 2,198, 2, - 223, 3, 3, 3, 10, 3, 22, 3, 34, 3, 46, 3, 54,227,233,242, - 227,236,101,128, 36,183,228,239,116, 2, 2,206, 2,215,225,227, - 227,229,238,116,128, 30, 2,226,229,236,239,119,128, 30, 4,101, - 3, 2,231, 2,242, 2,254,227,249,242,233,236,236,233, 99,128, - 4, 17,238,225,242,237,229,238,233,225,110,128, 5, 50,244, 97, - 128, 3,146,232,239,239,107,128, 1,129,236,233,238,229,226,229, - 236,239,119,128, 30, 6,237,239,238,239,243,240,225,227,101,128, - 255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237, - 225,236,108,128,247, 98,244,239,240,226,225,114,128, 1,130, 67, - 137, 0, 67, 3, 85, 3,127, 3,193, 3,210, 3,224, 4,171, 4, - 188, 4,200, 4,212, 97, 3, 3, 93, 3,104, 3,111,225,242,237, - 229,238,233,225,110,128, 5, 62,227,245,244,101,128, 1, 6,242, - 239,110,129,246,202, 3,119,243,237,225,236,108,128,246,245, 99, - 3, 3,135, 3,142, 3,171,225,242,239,110,128, 1, 12,229,228, - 233,236,236, 97,130, 0,199, 3,155, 3,163,225,227,245,244,101, - 128, 30, 8,243,237,225,236,108,128,247,231,233,242, 99, 2, 3, - 179, 3,184,236,101,128, 36,184,245,237,230,236,229,120,128, 1, - 8,228,239,116,129, 1, 10, 3,201,225,227,227,229,238,116,128, - 1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184, - 104, 4, 3,234, 3,246, 4,161, 4,165,225,225,242,237,229,238, - 233,225,110,128, 5, 73,101, 6, 4, 4, 4, 24, 4, 35, 4,103, - 4,115, 4,136,225,226,235,232,225,243,233,225,238,227,249,242, - 233,236,236,233, 99,128, 4,188,227,249,242,233,236,236,233, 99, - 128, 4, 39,100, 2, 4, 41, 4, 85,229,243,227,229,238,228,229, - 114, 2, 4, 54, 4, 74,225,226,235,232,225,243,233,225,238,227, - 249,242,233,236,236,233, 99,128, 4,190,227,249,242,233,236,236, - 233, 99,128, 4,182,233,229,242,229,243,233,243,227,249,242,233, - 236,236,233, 99,128, 4,244,232,225,242,237,229,238,233,225,110, - 128, 5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242, - 233,236,236,233, 99,128, 4,203,246,229,242,244,233,227,225,236, - 243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4, - 184,105,128, 3,167,239,239,107,128, 1,135,233,242,227,245,237, - 230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239, - 243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225, - 110,128, 5, 81,243,237,225,236,108,128,247, 99, 68,142, 0, 68, - 4,252, 5, 10, 5, 36, 5, 96, 5,121, 5,166, 5,173, 5,231, - 5,244, 6, 0, 6, 12, 6, 28, 6, 48, 6, 57, 90,129, 1,241, - 5, 2,227,225,242,239,110,128, 1,196, 97, 2, 5, 16, 5, 27, - 225,242,237,229,238,233,225,110,128, 5, 52,230,242,233,227,225, - 110,128, 1,137, 99, 4, 5, 46, 5, 53, 5, 62, 5, 89,225,242, - 239,110,128, 1, 14,229,228,233,236,236, 97,128, 30, 16,233,242, - 99, 2, 5, 70, 5, 75,236,101,128, 36,185,245,237,230,236,229, - 248,226,229,236,239,119,128, 30, 18,242,239,225,116,128, 1, 16, - 228,239,116, 2, 5,104, 5,113,225,227,227,229,238,116,128, 30, - 10,226,229,236,239,119,128, 30, 12,101, 3, 5,129, 5,140, 5, - 150,227,249,242,233,236,236,233, 99,128, 4, 20,233,227,239,240, - 244,233, 99,128, 3,238,236,244, 97,129, 34, 6, 5,158,231,242, - 229,229,107,128, 3,148,232,239,239,107,128, 1,138,105, 2, 5, - 179, 5,218,229,242,229,243,233,115,131,246,203, 5,194, 5,202, - 5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128, - 246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231, - 242,229,229,107,128, 3,220,234,229,227,249,242,233,236,236,233, - 99,128, 4, 2,236,233,238,229,226,229,236,239,119,128, 30, 14, - 237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227, - 227,229,238,244,243,237,225,236,108,128,246,247,115, 2, 6, 34, - 6, 41,236,225,243,104,128, 1, 16,237,225,236,108,128,247,100, - 244,239,240,226,225,114,128, 1,139,122,131, 1,242, 6, 67, 6, - 75, 6,112,227,225,242,239,110,128, 1,197,101, 2, 6, 81, 6, - 101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236, - 233, 99,128, 4,224,227,249,242,233,236,236,233, 99,128, 4, 5, - 232,229,227,249,242,233,236,236,233, 99,128, 4, 15, 69,146, 0, - 69, 6,165, 6,183, 6,191, 7, 89, 7,153, 7,165, 7,183, 7, - 211, 8, 7, 8, 36, 8, 94, 8,169, 8,189, 8,208, 8,248, 9, - 44, 9,109, 9,115,225,227,245,244,101,129, 0,201, 6,175,243, - 237,225,236,108,128,247,233,226,242,229,246,101,128, 1, 20, 99, - 5, 6,203, 6,210, 6,224, 6,236, 7, 79,225,242,239,110,128, - 1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28, - 232,225,242,237,229,238,233,225,110,128, 5, 53,233,242, 99, 2, - 6,244, 6,249,236,101,128, 36,186,245,237,230,236,229,120,135, - 0,202, 7, 16, 7, 24, 7, 32, 7, 43, 7, 51, 7, 63, 7, 71, - 225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24, - 228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101, - 128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243, - 237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249, - 242,233,236,236,233, 99,128, 4, 4,100, 3, 7, 97, 7,107, 7, - 127,226,236,231,242,225,246,101,128, 2, 4,233,229,242,229,243, - 233,115,129, 0,203, 7,119,243,237,225,236,108,128,247,235,239, - 116,130, 1, 22, 7,136, 7,145,225,227,227,229,238,116,128, 1, - 22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236, - 233, 99,128, 4, 36,231,242,225,246,101,129, 0,200, 7,175,243, - 237,225,236,108,128,247,232,104, 2, 7,189, 7,200,225,242,237, - 229,238,233,225,110,128, 5, 55,239,239,235,225,226,239,246,101, - 128, 30,186,105, 3, 7,219, 7,230, 7,245,231,232,244,242,239, - 237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229, - 246,101,128, 2, 6,239,244,233,230,233,229,228,227,249,242,233, - 236,236,233, 99,128, 4,100,108, 2, 8, 13, 8, 24,227,249,242, - 233,236,236,233, 99,128, 4, 27,229,246,229,238,242,239,237,225, - 110,128, 33,106,109, 3, 8, 44, 8, 72, 8, 83,225,227,242,239, - 110,130, 1, 18, 8, 56, 8, 64,225,227,245,244,101,128, 30, 22, - 231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99, - 128, 4, 28,239,238,239,243,240,225,227,101,128,255, 37,110, 4, - 8,104, 8,115, 8,135, 8,154,227,249,242,233,236,236,233, 99, - 128, 4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233, - 236,236,233, 99,128, 4,162,103,129, 1, 74, 8,141,232,229,227, - 249,242,233,236,236,233, 99,128, 4,164,232,239,239,235,227,249, - 242,233,236,236,233, 99,128, 4,199,111, 2, 8,175, 8,183,231, - 239,238,229,107,128, 1, 24,240,229,110,128, 1,144,240,243,233, - 236,239,110,129, 3,149, 8,200,244,239,238,239,115,128, 3,136, - 114, 2, 8,214, 8,225,227,249,242,233,236,236,233, 99,128, 4, - 32,229,246,229,242,243,229,100,129, 1,142, 8,237,227,249,242, - 233,236,236,233, 99,128, 4, 45,115, 4, 9, 2, 9, 13, 9, 33, - 9, 37,227,249,242,233,236,236,233, 99,128, 4, 33,228,229,243, - 227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4, - 170,104,128, 1,169,237,225,236,108,128,247,101,116, 3, 9, 52, - 9, 78, 9, 92, 97,130, 3,151, 9, 60, 9, 70,242,237,229,238, - 233,225,110,128, 5, 56,244,239,238,239,115,128, 3,137,104,129, - 0,208, 9, 84,243,237,225,236,108,128,247,240,233,236,228,101, - 129, 30,188, 9,101,226,229,236,239,119,128, 30, 26,245,242,111, - 128, 32,172,250,104,130, 1,183, 9,124, 9,132,227,225,242,239, - 110,128, 1,238,242,229,246,229,242,243,229,100,128, 1,184, 70, - 136, 0, 70, 9,163, 9,172, 9,184, 9,212, 9,219, 9,248, 10, - 4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225, - 227,227,229,238,116,128, 30, 30,101, 2, 9,190, 9,202,232,225, - 242,237,229,238,233,225,110,128, 5, 86,233,227,239,240,244,233, - 99,128, 3,228,232,239,239,107,128, 1,145,105, 2, 9,225, 9, - 238,244,225,227,249,242,233,236,236,233, 99,128, 4,114,246,229, - 242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227, - 101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243, - 237,225,236,108,128,247,102, 71,140, 0, 71, 10, 51, 10, 61, 10, - 107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11, - 90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97, 3, 10, - 69, 10, 76, 10, 94,227,245,244,101,128, 1,244,237,237, 97,129, - 3,147, 10, 84,225,230,242,233,227,225,110,128, 1,148,238,231, - 233,225,227,239,240,244,233, 99,128, 3,234,226,242,229,246,101, - 128, 1, 30, 99, 4, 10,125, 10,132, 10,141, 10,163,225,242,239, - 110,128, 1,230,229,228,233,236,236, 97,128, 1, 34,233,242, 99, - 2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120, - 128, 1, 28,239,237,237,225,225,227,227,229,238,116,128, 1, 34, - 228,239,116,129, 1, 32, 10,184,225,227,227,229,238,116,128, 1, - 32,229,227,249,242,233,236,236,233, 99,128, 4, 19,104, 3, 10, - 213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128, - 5, 66,101, 3, 10,234, 10,255, 11, 16,237,233,228,228,236,229, - 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,148,243, - 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,146, - 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4, - 144,239,239,107,128, 1,147,233,237,225,242,237,229,238,233,225, - 110,128, 5, 51,234,229,227,249,242,233,236,236,233, 99,128, 4, - 3,109, 2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239, - 238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246, - 206, 11, 99,243,237,225,236,108,128,247, 96,115, 2, 11,113, 11, - 129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128, 2, - 155,244,242,239,235,101,128, 1,228, 72,140, 0, 72, 11,165, 11, - 190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12, - 157, 12,165, 12,189,177,184, 53, 3, 11,175, 11,180, 11,185,179, - 51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178, - 176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203, - 97, 3, 11,216, 11,236, 12, 0,225,226,235,232,225,243,233,225, - 238,227,249,242,233,236,236,233, 99,128, 4,168,228,229,243,227, - 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,178, - 242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128, 4, - 42, 98, 2, 12, 23, 12, 28,225,114,128, 1, 38,242,229,246,229, - 226,229,236,239,119,128, 30, 42, 99, 2, 12, 46, 12, 55,229,228, - 233,236,236, 97,128, 30, 40,233,242, 99, 2, 12, 63, 12, 68,236, - 101,128, 36,189,245,237,230,236,229,120,128, 1, 36,100, 2, 12, - 83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116, 2, - 12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236, - 239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255, - 40,111, 2, 12,135, 12,146,225,242,237,229,238,233,225,110,128, - 5, 64,242,233,227,239,240,244,233, 99,128, 3,232,243,237,225, - 236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116, - 129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241, - 245,225,242,101,128, 51,144, 73,146, 0, 73, 12,239, 12,251, 12, - 255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13, - 242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193, - 227,249,242,233,236,236,233, 99,128, 4, 47, 74,128, 1, 50,213, - 227,249,242,233,236,236,233, 99,128, 4, 46,225,227,245,244,101, - 129, 0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229, - 246,101,128, 1, 44, 99, 3, 13, 45, 13, 52, 13, 84,225,242,239, - 110,128, 1,207,233,242, 99, 2, 13, 60, 13, 65,236,101,128, 36, - 190,245,237,230,236,229,120,129, 0,206, 13, 76,243,237,225,236, - 108,128,247,238,249,242,233,236,236,233, 99,128, 4, 6,100, 3, - 13,102, 13,112, 13,155,226,236,231,242,225,246,101,128, 2, 8, - 233,229,242,229,243,233,115,131, 0,207, 13,128, 13,136, 13,147, - 225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99, - 128, 4,228,243,237,225,236,108,128,247,239,239,116,130, 1, 48, - 13,164, 13,173,225,227,227,229,238,116,128, 1, 48,226,229,236, - 239,119,128, 30,202,101, 2, 13,187, 13,203,226,242,229,246,229, - 227,249,242,233,236,236,233, 99,128, 4,214,227,249,242,233,236, - 236,233, 99,128, 4, 21,230,242,225,235,244,245,114,128, 33, 17, - 231,242,225,246,101,129, 0,204, 13,234,243,237,225,236,108,128, - 247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105, 3, - 14, 6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128, 4, - 24,238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 10, - 243,232,239,242,244,227,249,242,233,236,236,233, 99,128, 4, 25, - 109, 2, 14, 54, 14, 75,225,227,242,239,110,129, 1, 42, 14, 64, - 227,249,242,233,236,236,233, 99,128, 4,226,239,238,239,243,240, - 225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110, - 128, 5, 59,111, 3, 14,107, 14,118, 14,126,227,249,242,233,236, - 236,233, 99,128, 4, 1,231,239,238,229,107,128, 1, 46,244, 97, - 131, 3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110, - 128, 1,150,228,233,229,242,229,243,233,115,128, 3,170,244,239, - 238,239,115,128, 3,138,115, 2, 14,172, 14,179,237,225,236,108, - 128,247,105,244,242,239,235,101,128, 1,151,244,233,236,228,101, - 129, 1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233, - 244,243, 97, 2, 14,216, 14,227,227,249,242,233,236,236,233, 99, - 128, 4,116,228,226,236,231,242,225,246,229,227,249,242,233,236, - 236,233, 99,128, 4,118, 74,134, 0, 74, 15, 6, 15, 18, 15, 41, - 15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128, - 5, 65,227,233,242, 99, 2, 15, 27, 15, 32,236,101,128, 36,191, - 245,237,230,236,229,120,128, 1, 52,229,227,249,242,233,236,236, - 233, 99,128, 4, 8,232,229,232,225,242,237,229,238,233,225,110, - 128, 5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243, - 237,225,236,108,128,247,106, 75,140, 0, 75, 15,115, 15,125, 15, - 135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16, - 180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241, - 245,225,242,101,128, 51,205, 97, 7, 15,151, 15,169, 15,191, 15, - 211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249, - 242,233,236,236,233, 99,128, 4,160, 99, 2, 15,175, 15,181,245, - 244,101,128, 30, 48,249,242,233,236,236,233, 99,128, 4, 26,228, - 229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99, - 128, 4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128, - 4,195,240,240, 97,128, 3,154,243,244,242,239,235,229,227,249, - 242,233,236,236,233, 99,128, 4,158,246,229,242,244,233,227,225, - 236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, - 4,156, 99, 4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110, - 128, 1,232,229,228,233,236,236, 97,128, 1, 54,233,242,227,236, - 101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128, 1, - 54,228,239,244,226,229,236,239,119,128, 30, 50,101, 2, 16, 82, - 16, 94,232,225,242,237,229,238,233,225,110,128, 5, 84,238,225, - 242,237,229,238,233,225,110,128, 5, 63,104, 3, 16,114, 16,126, - 16,137,225,227,249,242,233,236,236,233, 99,128, 4, 37,229,233, - 227,239,240,244,233, 99,128, 3,230,239,239,107,128, 1,152,234, - 229,227,249,242,233,236,236,233, 99,128, 4, 12,236,233,238,229, - 226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227, - 101,128,255, 43,239,240,240, 97, 2, 16,189, 16,200,227,249,242, - 233,236,236,233, 99,128, 4,128,231,242,229,229,107,128, 3,222, - 115, 2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128, - 4,110,237,225,236,108,128,247,107, 76,138, 0, 76, 17, 1, 17, - 5, 17, 9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17, - 189, 74,128, 1,199, 76,128,246,191, 97, 2, 17, 15, 17, 22,227, - 245,244,101,128, 1, 57,237,226,228, 97,128, 3,155, 99, 4, 17, - 39, 17, 46, 17, 55, 17, 82,225,242,239,110,128, 1, 61,229,228, - 233,236,236, 97,128, 1, 59,233,242, 99, 2, 17, 63, 17, 68,236, - 101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128, - 30, 60,239,237,237,225,225,227,227,229,238,116,128, 1, 59,228, - 239,116,130, 1, 63, 17,105, 17,114,225,227,227,229,238,116,128, - 1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242, - 239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110, - 128, 5, 60,106,129, 1,200, 17,153,229,227,249,242,233,236,236, - 233, 99,128, 4, 9,236,233,238,229,226,229,236,239,119,128, 30, - 58,237,239,238,239,243,240,225,227,101,128,255, 44,115, 2, 17, - 195, 17,212,236,225,243,104,129, 1, 65, 17,204,243,237,225,236, - 108,128,246,249,237,225,236,108,128,247,108, 77,137, 0, 77, 17, - 241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18, - 100,194,243,241,245,225,242,101,128, 51,134,225, 99, 2, 18, 2, - 18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128, - 247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36, - 194,228,239,116, 2, 18, 41, 18, 50,225,227,227,229,238,116,128, - 30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229, - 238,233,225,110,128, 5, 68,237,239,238,239,243,240,225,227,101, - 128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229, - 100,128, 1,156,117,128, 3,156, 78,141, 0, 78, 18,134, 18,138, - 18,146, 18,212, 18,237, 18,248, 19, 3, 19, 21, 19, 33, 19, 45, - 19, 58, 19, 66, 19, 84, 74,128, 1,202,225,227,245,244,101,128, - 1, 67, 99, 4, 18,156, 18,163, 18,172, 18,199,225,242,239,110, - 128, 1, 71,229,228,233,236,236, 97,128, 1, 69,233,242, 99, 2, - 18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226, - 229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238, - 116,128, 1, 69,228,239,116, 2, 18,220, 18,229,225,227,227,229, - 238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239, - 235,236,229,230,116,128, 1,157,233,238,229,242,239,237,225,110, - 128, 33,104,106,129, 1,203, 19, 9,229,227,249,242,233,236,236, - 233, 99,128, 4, 10,236,233,238,229,226,229,236,239,119,128, 30, - 72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225, - 242,237,229,238,233,225,110,128, 5, 70,243,237,225,236,108,128, - 247,110,244,233,236,228,101,129, 0,209, 19, 76,243,237,225,236, - 108,128,247,241,117,128, 3,157, 79,141, 0, 79, 19,118, 19,132, - 19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213, - 21,223, 21,254, 22, 53, 69,129, 1, 82, 19,124,243,237,225,236, - 108,128,246,250,225,227,245,244,101,129, 0,211, 19,142,243,237, - 225,236,108,128,247,243, 98, 2, 19,156, 19,196,225,242,242,229, - 100, 2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128, 4, - 232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, - 99,128, 4,234,242,229,246,101,128, 1, 78, 99, 4, 19,213, 19, - 220, 19,235, 20, 68,225,242,239,110,128, 1,209,229,238,244,229, - 242,229,228,244,233,236,228,101,128, 1,159,233,242, 99, 2, 19, - 243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134, 0, - 212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245, - 244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216, - 231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246, - 101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228, - 101,128, 30,214,249,242,233,236,236,233, 99,128, 4, 30,100, 3, - 20, 86, 20,109, 20,142,226,108, 2, 20, 93, 20,101,225,227,245, - 244,101,128, 1, 80,231,242,225,246,101,128, 2, 12,233,229,242, - 229,243,233,115,130, 0,214, 20,123, 20,134,227,249,242,233,236, - 236,233, 99,128, 4,230,243,237,225,236,108,128,247,246,239,244, - 226,229,236,239,119,128, 30,204,103, 2, 20,158, 20,170,239,238, - 229,235,243,237,225,236,108,128,246,251,242,225,246,101,129, 0, - 210, 20,179,243,237,225,236,108,128,247,242,104, 4, 20,197, 20, - 208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128, 5, 85, - 109,128, 33, 38,111, 2, 20,218, 20,228,239,235,225,226,239,246, - 101,128, 30,206,242,110,133, 1,160, 20,243, 20,251, 21, 6, 21, - 14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229, - 236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239, - 239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128, - 30,224,245,238,231,225,242,245,237,236,225,245,116,128, 1, 80, - 105,129, 1,162, 21, 54,238,246,229,242,244,229,228,226,242,229, - 246,101,128, 2, 14,109, 4, 21, 79, 21,107, 21,184, 21,202,225, - 227,242,239,110,130, 1, 76, 21, 91, 21, 99,225,227,245,244,101, - 128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33, - 38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233, - 99,128, 4, 96,231,242,229,229,107,128, 3,169,242,239,245,238, - 228,227,249,242,233,236,236,233, 99,128, 4,122,116, 2, 21,162, - 21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128, 4, - 124,239,238,239,115,128, 3,143,233,227,242,239,110,129, 3,159, - 21,194,244,239,238,239,115,128, 3,140,239,238,239,243,240,225, - 227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111, - 2, 21,229, 21,248,231,239,238,229,107,129, 1,234, 21,239,237, - 225,227,242,239,110,128, 1,236,240,229,110,128, 1,134,115, 3, - 22, 6, 22, 33, 22, 40,236,225,243,104,130, 0,216, 22, 17, 22, - 25,225,227,245,244,101,128, 1,254,243,237,225,236,108,128,247, - 248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245, - 244,101,128, 1,254,116, 2, 22, 59, 22, 70,227,249,242,233,236, - 236,233, 99,128, 4,126,233,236,228,101,131, 0,213, 22, 83, 22, - 91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229, - 243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136, - 0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246, - 23, 2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101, - 128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101, - 3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128, - 4, 31,232,225,242,237,229,238,233,225,110,128, 5, 74,237,233, - 228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99, - 128, 4,166,104, 2, 22,217, 22,221,105,128, 3,166,239,239,107, - 128, 1,164,105,129, 3,160, 22,233,247,242,225,242,237,229,238, - 233,225,110,128, 5, 83,237,239,238,239,243,240,225,227,101,128, - 255, 48,115, 2, 23, 8, 23, 25,105,129, 3,168, 23, 14,227,249, - 242,233,236,236,233, 99,128, 4,112,237,225,236,108,128,247,112, - 81,131, 0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101, - 128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243, - 237,225,236,108,128,247,113, 82,138, 0, 82, 23, 95, 23,119, 23, - 166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97, - 2, 23,101, 23,112,225,242,237,229,238,233,225,110,128, 5, 76, - 227,245,244,101,128, 1, 84, 99, 4, 23,129, 23,136, 23,145, 23, - 153,225,242,239,110,128, 1, 88,229,228,233,236,236, 97,128, 1, - 86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227, - 229,238,116,128, 1, 86,100, 2, 23,172, 23,182,226,236,231,242, - 225,246,101,128, 2, 16,239,116, 2, 23,189, 23,198,225,227,227, - 229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208, - 237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238, - 233,225,110,128, 5, 80,230,242,225,235,244,245,114,128, 33, 28, - 232,111,128, 3,161,233,110, 2, 23,252, 24, 5,231,243,237,225, - 236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101, - 128, 2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237, - 239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108, - 129,247,114, 24, 53,233,238,246,229,242,244,229,100,129, 2,129, - 24, 66,243,245,240,229,242,233,239,114,128, 2,182, 83,139, 0, - 83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27, - 105, 27,117, 27,135, 27,143, 70, 6, 24,117, 24,209, 24,241, 25, - 77, 25,119, 25,221, 48, 9, 24,137, 24,145, 24,153, 24,161, 24, - 169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37, - 12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37, - 16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37, - 60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37, - 52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37, - 36, 49, 3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37, - 0,177,176,176,176, 48,128, 37, 2,185,176,176,176, 48,128, 37, - 97, 50, 9, 25, 5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25, - 53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176, - 176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176, - 176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176, - 176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176, - 176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51, 4, 25, - 87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183, - 176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185, - 176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25, - 165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176, - 176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176, - 176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176, - 176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176, - 176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176, - 176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53, 5, 25, - 233, 25,241, 25,249, 26, 1, 26, 9,176,176,176,176, 48,128, 37, - 88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37, - 83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37, - 106, 97, 2, 26, 23, 26, 44,227,245,244,101,129, 1, 90, 26, 32, - 228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231, - 242,229,229,107,128, 3,224, 99, 5, 26, 67, 26, 98, 26,107, 26, - 147, 26,169,225,242,239,110,130, 1, 96, 26, 78, 26, 90,228,239, - 244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128, - 246,253,229,228,233,236,236, 97,128, 1, 94,232,247, 97,130, 1, - 143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128, 4,216, - 228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99, - 128, 4,218,233,242, 99, 2, 26,155, 26,160,236,101,128, 36,200, - 245,237,230,236,229,120,128, 1, 92,239,237,237,225,225,227,227, - 229,238,116,128, 2, 24,228,239,116, 2, 26,190, 26,199,225,227, - 227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26, - 209,228,239,244,225,227,227,229,238,116,128, 30,104,101, 2, 26, - 227, 26,239,232,225,242,237,229,238,233,225,110,128, 5, 77,246, - 229,238,242,239,237,225,110,128, 33,102,104, 5, 27, 6, 27, 34, - 27, 48, 27, 59, 27, 72, 97, 2, 27, 12, 27, 23,225,242,237,229, - 238,233,225,110,128, 5, 71,227,249,242,233,236,236,233, 99,128, - 4, 40,227,232,225,227,249,242,233,236,236,233, 99,128, 4, 41, - 229,233,227,239,240,244,233, 99,128, 3,226,232,225,227,249,242, - 233,236,236,233, 99,128, 4,186,233,237,225,227,239,240,244,233, - 99,128, 3,236,105, 2, 27, 90, 27, 96,231,237, 97,128, 3,163, - 248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225, - 227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233, - 236,236,233, 99,128, 4, 44,243,237,225,236,108,128,247,115,244, - 233,231,237,225,231,242,229,229,107,128, 3,218, 84,141, 0, 84, - 27,186, 27,191, 27,197, 28, 7, 28, 32, 28, 96, 28,147, 28,177, - 28,189, 28,201, 28,246, 29, 6, 29, 46,225,117,128, 3,164,226, - 225,114,128, 1,102, 99, 4, 27,207, 27,214, 27,223, 27,250,225, - 242,239,110,128, 1,100,229,228,233,236,236, 97,128, 1, 98,233, - 242, 99, 2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236, - 229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227, - 227,229,238,116,128, 1, 98,228,239,116, 2, 28, 15, 28, 24,225, - 227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108, - 101, 4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236, - 233, 99,128, 4, 34,228,229,243,227,229,238,228,229,242,227,249, - 242,233,236,236,233, 99,128, 4,172,238,242,239,237,225,110,128, - 33,105,244,243,229,227,249,242,233,236,236,233, 99,128, 4,180, - 104, 3, 28,104, 28,110, 28,136,229,244, 97,128, 3,152,111, 2, - 28,116, 28,121,239,107,128, 1,172,242,110,129, 0,222, 28,128, - 243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110, - 128, 33, 98,105, 2, 28,153, 28,164,236,228,229,243,237,225,236, - 108,128,246,254,247,238,225,242,237,229,238,233,225,110,128, 5, - 79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238, - 239,243,240,225,227,101,128,255, 52,111, 2, 28,207, 28,218,225, - 242,237,229,238,233,225,110,128, 5, 57,238,101, 3, 28,227, 28, - 234, 28,240,230,233,246,101,128, 1,188,243,233,120,128, 1,132, - 244,247,111,128, 1,167,242,229,244,242,239,230,236,229,248,232, - 239,239,107,128, 1,174,115, 3, 29, 14, 29, 26, 29, 39,229,227, - 249,242,233,236,236,233, 99,128, 4, 38,232,229,227,249,242,233, - 236,236,233, 99,128, 4, 11,237,225,236,108,128,247,116,119, 2, - 29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107, - 239,242,239,237,225,110,128, 33, 97, 85,142, 0, 85, 29,105, 29, - 123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31, - 21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129, 0, - 218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101, - 128, 1,108, 99, 3, 29,139, 29,146, 29,188,225,242,239,110,128, - 1,211,233,242, 99, 2, 29,154, 29,159,236,101,128, 36,202,245, - 237,230,236,229,120,130, 0,219, 29,172, 29,180,226,229,236,239, - 119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236, - 236,233, 99,128, 4, 35,100, 3, 29,206, 29,229, 30, 59,226,108, - 2, 29,213, 29,221,225,227,245,244,101,128, 1,112,231,242,225, - 246,101,128, 2, 20,233,229,242,229,243,233,115,134, 0,220, 29, - 251, 30, 3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101, - 128, 1,215,226,229,236,239,119,128, 30,114, 99, 2, 30, 17, 30, - 24,225,242,239,110,128, 1,217,249,242,233,236,236,233, 99,128, - 4,240,231,242,225,246,101,128, 1,219,237,225,227,242,239,110, - 128, 1,213,243,237,225,236,108,128,247,252,239,244,226,229,236, - 239,119,128, 30,228,231,242,225,246,101,129, 0,217, 30, 79,243, - 237,225,236,108,128,247,249,104, 2, 30, 93, 30,171,111, 2, 30, - 99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133, - 1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244, - 101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231, - 242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101, - 128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242, - 245,237,236,225,245,116,129, 1,112, 30,187,227,249,242,233,236, - 236,233, 99,128, 4,242,233,238,246,229,242,244,229,228,226,242, - 229,246,101,128, 2, 22,235,227,249,242,233,236,236,233, 99,128, - 4,120,109, 2, 30,232, 31, 10,225,227,242,239,110,130, 1,106, - 30,244, 30,255,227,249,242,233,236,236,233, 99,128, 4,238,228, - 233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225, - 227,101,128,255, 53,239,231,239,238,229,107,128, 1,114,240,243, - 233,236,239,110,133, 3,165, 31, 49, 31, 53, 31, 90, 31,121, 31, - 134, 49,128, 3,210, 97, 2, 31, 59, 31, 81,227,245,244,229,232, - 239,239,235,243,249,237,226,239,236,231,242,229,229,107,128, 3, - 211,230,242,233,227,225,110,128, 1,177,228,233,229,242,229,243, - 233,115,129, 3,171, 31,103,232,239,239,235,243,249,237,226,239, - 236,231,242,229,229,107,128, 3,212,232,239,239,235,243,249,237, - 226,239,108,128, 3,210,244,239,238,239,115,128, 3,142,242,233, - 238,103,128, 1,110,115, 3, 31,157, 31,172, 31,179,232,239,242, - 244,227,249,242,233,236,236,233, 99,128, 4, 14,237,225,236,108, - 128,247,117,244,242,225,233,231,232,116, 2, 31,191, 31,202,227, - 249,242,233,236,236,233, 99,128, 4,174,243,244,242,239,235,229, - 227,249,242,233,236,236,233, 99,128, 4,176,244,233,236,228,101, - 130, 1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226, - 229,236,239,119,128, 30,116, 86,136, 0, 86, 32, 11, 32, 20, 32, - 31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236, - 101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101, - 2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128, 4, 18, - 247,225,242,237,229,238,233,225,110,128, 5, 78,232,239,239,107, - 128, 1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239, - 225,242,237,229,238,233,225,110,128, 5, 72,243,237,225,236,108, - 128,247,118,244,233,236,228,101,128, 30,124, 87,134, 0, 87, 32, - 123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101, - 128, 30,130,227,233,242, 99, 2, 32,140, 32,145,236,101,128, 36, - 204,245,237,230,236,229,120,128, 1,116,100, 2, 32,160, 32,170, - 233,229,242,229,243,233,115,128, 30,132,239,116, 2, 32,177, 32, - 186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128, - 30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240, - 225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134, - 0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233, - 242,227,236,101,128, 36,205,100, 2, 32,253, 33, 7,233,229,242, - 229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128, - 30,138,229,232,225,242,237,229,238,233,225,110,128, 5, 61,105, - 128, 3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243, - 237,225,236,108,128,247,120, 89,139, 0, 89, 33, 81, 33,116, 33, - 139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34, - 68, 97, 2, 33, 87, 33,104,227,245,244,101,129, 0,221, 33, 96, - 243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233, - 99,128, 4, 98,227,233,242, 99, 2, 33,125, 33,130,236,101,128, - 36,206,245,237,230,236,229,120,128, 1,118,100, 2, 33,145, 33, - 165,233,229,242,229,243,233,115,129, 1,120, 33,157,243,237,225, - 236,108,128,247,255,239,116, 2, 33,172, 33,181,225,227,227,229, - 238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114, 2, - 33,196, 33,208,233,227,249,242,233,236,236,233, 99,128, 4, 43, - 245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, - 99,128, 4,248,231,242,225,246,101,128, 30,242,232,239,239,107, - 129, 1,179, 33,245,225,226,239,246,101,128, 30,246,105, 3, 34, - 5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128, 5, 69, - 227,249,242,233,236,236,233, 99,128, 4, 7,247,238,225,242,237, - 229,238,233,225,110,128, 5, 82,237,239,238,239,243,240,225,227, - 101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228, - 101,128, 30,248,245,115, 2, 34, 75, 34,113,226,233,103, 2, 34, - 83, 34, 94,227,249,242,233,236,236,233, 99,128, 4,106,233,239, - 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4, - 108,236,233,244,244,236,101, 2, 34,124, 34,135,227,249,242,233, - 236,236,233, 99,128, 4,102,233,239,244,233,230,233,229,228,227, - 249,242,233,236,236,233, 99,128, 4,104, 90,136, 0, 90, 34,174, - 34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97, 2, - 34,180, 34,191,225,242,237,229,238,233,225,110,128, 5, 54,227, - 245,244,101,128, 1,121, 99, 2, 34,204, 34,221,225,242,239,110, - 129, 1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99, - 2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120, - 128, 30,144,228,239,116,130, 1,123, 34,253, 35, 6,225,227,227, - 229,238,116,128, 1,123,226,229,236,239,119,128, 30,146,101, 3, - 35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128, 4, - 23,100, 2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227, - 249,242,233,236,236,233, 99,128, 4,152,233,229,242,229,243,233, - 243,227,249,242,233,236,236,233, 99,128, 4,222,244, 97,128, 3, - 150,232,101, 4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229, - 238,233,225,110,128, 5, 58,226,242,229,246,229,227,249,242,233, - 236,236,233, 99,128, 4,193,227,249,242,233,236,236,233, 99,128, - 4, 22,100, 2, 35,136, 35,155,229,243,227,229,238,228,229,242, - 227,249,242,233,236,236,233, 99,128, 4,150,233,229,242,229,243, - 233,243,227,249,242,233,236,236,233, 99,128, 4,220,236,233,238, - 229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225, - 227,101,128,255, 58,115, 2, 35,203, 35,210,237,225,236,108,128, - 247,122,244,242,239,235,101,128, 1,181, 97,158, 0, 97, 36, 26, - 38,154, 39, 4, 39, 68, 39,132, 39,196, 40, 4, 40, 68, 40,126, - 40,190, 41, 70, 41,217, 42,137, 42,237, 43, 17, 49,192, 49,229, - 50, 0, 50,225, 51, 7, 52, 96, 52,168, 53,123, 53,132, 54, 5, - 56, 13, 57, 3, 57, 50, 57,201, 57,215, 49,138, 39, 1, 36, 50, - 36,114, 36,154, 36,218, 37, 26, 37, 90, 37,154, 37,218, 38, 26, - 38, 90, 48,138, 39, 33, 36, 74, 36, 78, 36, 82, 36, 86, 36, 90, - 36, 94, 36, 98, 36,102, 36,106, 36,110, 48,128, 39, 94, 49,128, - 39, 97, 50,128, 39, 98, 51,128, 39, 99, 52,128, 39,100, 53,128, - 39, 16, 54,128, 39,101, 55,128, 39,102, 56,128, 39,103, 57,128, - 38, 96, 49,134, 38, 27, 36,130, 36,134, 36,138, 36,142, 36,146, - 36,150, 48,128, 38,101, 49,128, 38,102, 50,128, 38, 99, 55,128, - 39, 9, 56,128, 39, 8, 57,128, 39, 7, 50,138, 38, 30, 36,178, - 36,182, 36,186, 36,190, 36,194, 36,198, 36,202, 36,206, 36,210, - 36,214, 48,128, 36, 96, 49,128, 36, 97, 50,128, 36, 98, 51,128, - 36, 99, 52,128, 36,100, 53,128, 36,101, 54,128, 36,102, 55,128, - 36,103, 56,128, 36,104, 57,128, 36,105, 51,138, 39, 12, 36,242, - 36,246, 36,250, 36,254, 37, 2, 37, 6, 37, 10, 37, 14, 37, 18, - 37, 22, 48,128, 39,118, 49,128, 39,119, 50,128, 39,120, 51,128, - 39,121, 52,128, 39,122, 53,128, 39,123, 54,128, 39,124, 55,128, - 39,125, 56,128, 39,126, 57,128, 39,127, 52,138, 39, 13, 37, 50, - 37, 54, 37, 58, 37, 62, 37, 66, 37, 70, 37, 74, 37, 78, 37, 82, - 37, 86, 48,128, 39,128, 49,128, 39,129, 50,128, 39,130, 51,128, - 39,131, 52,128, 39,132, 53,128, 39,133, 54,128, 39,134, 55,128, - 39,135, 56,128, 39,136, 57,128, 39,137, 53,138, 39, 14, 37,114, - 37,118, 37,122, 37,126, 37,130, 37,134, 37,138, 37,142, 37,146, - 37,150, 48,128, 39,138, 49,128, 39,139, 50,128, 39,140, 51,128, - 39,141, 52,128, 39,142, 53,128, 39,143, 54,128, 39,144, 55,128, - 39,145, 56,128, 39,146, 57,128, 39,147, 54,138, 39, 15, 37,178, - 37,182, 37,186, 37,190, 37,194, 37,198, 37,202, 37,206, 37,210, - 37,214, 48,128, 39,148, 49,128, 33,146, 50,128, 39,163, 51,128, - 33,148, 52,128, 33,149, 53,128, 39,153, 54,128, 39,155, 55,128, - 39,156, 56,128, 39,157, 57,128, 39,158, 55,138, 39, 17, 37,242, - 37,246, 37,250, 37,254, 38, 2, 38, 6, 38, 10, 38, 14, 38, 18, - 38, 22, 48,128, 39,159, 49,128, 39,160, 50,128, 39,161, 51,128, - 39,162, 52,128, 39,164, 53,128, 39,165, 54,128, 39,166, 55,128, - 39,167, 56,128, 39,168, 57,128, 39,169, 56,138, 39, 18, 38, 50, - 38, 54, 38, 58, 38, 62, 38, 66, 38, 70, 38, 74, 38, 78, 38, 82, - 38, 86, 48,128, 39,171, 49,128, 39,173, 50,128, 39,175, 51,128, - 39,178, 52,128, 39,179, 53,128, 39,181, 54,128, 39,184, 55,128, - 39,186, 56,128, 39,187, 57,128, 39,188, 57,138, 39, 19, 38,114, - 38,118, 38,122, 38,126, 38,130, 38,134, 38,138, 38,142, 38,146, - 38,150, 48,128, 39,189, 49,128, 39,190, 50,128, 39,154, 51,128, - 39,170, 52,128, 39,182, 53,128, 39,185, 54,128, 39,152, 55,128, - 39,180, 56,128, 39,183, 57,128, 39,172, 50,138, 39, 2, 38,178, - 38,224, 38,228, 38,232, 38,236, 38,240, 38,244, 38,248, 38,252, - 39, 0, 48,135, 39, 20, 38,196, 38,200, 38,204, 38,208, 38,212, - 38,216, 38,220, 48,128, 39,174, 49,128, 39,177, 50,128, 39, 3, - 51,128, 39, 80, 52,128, 39, 82, 53,128, 39,110, 54,128, 39,112, - 49,128, 39, 21, 50,128, 39, 22, 51,128, 39, 23, 52,128, 39, 24, - 53,128, 39, 25, 54,128, 39, 26, 55,128, 39, 27, 56,128, 39, 28, - 57,128, 39, 34, 51,138, 39, 4, 39, 28, 39, 32, 39, 36, 39, 40, - 39, 44, 39, 48, 39, 52, 39, 56, 39, 60, 39, 64, 48,128, 39, 35, - 49,128, 39, 36, 50,128, 39, 37, 51,128, 39, 38, 52,128, 39, 39, - 53,128, 38, 5, 54,128, 39, 41, 55,128, 39, 42, 56,128, 39, 43, - 57,128, 39, 44, 52,138, 38, 14, 39, 92, 39, 96, 39,100, 39,104, - 39,108, 39,112, 39,116, 39,120, 39,124, 39,128, 48,128, 39, 45, - 49,128, 39, 46, 50,128, 39, 47, 51,128, 39, 48, 52,128, 39, 49, - 53,128, 39, 50, 54,128, 39, 51, 55,128, 39, 52, 56,128, 39, 53, - 57,128, 39, 54, 53,138, 39, 6, 39,156, 39,160, 39,164, 39,168, - 39,172, 39,176, 39,180, 39,184, 39,188, 39,192, 48,128, 39, 55, - 49,128, 39, 56, 50,128, 39, 57, 51,128, 39, 58, 52,128, 39, 59, - 53,128, 39, 60, 54,128, 39, 61, 55,128, 39, 62, 56,128, 39, 63, - 57,128, 39, 64, 54,138, 39, 29, 39,220, 39,224, 39,228, 39,232, - 39,236, 39,240, 39,244, 39,248, 39,252, 40, 0, 48,128, 39, 65, - 49,128, 39, 66, 50,128, 39, 67, 51,128, 39, 68, 52,128, 39, 69, - 53,128, 39, 70, 54,128, 39, 71, 55,128, 39, 72, 56,128, 39, 73, - 57,128, 39, 74, 55,138, 39, 30, 40, 28, 40, 32, 40, 36, 40, 40, - 40, 44, 40, 48, 40, 52, 40, 56, 40, 60, 40, 64, 48,128, 39, 75, - 49,128, 37,207, 50,128, 39, 77, 51,128, 37,160, 52,128, 39, 79, - 53,128, 39, 81, 54,128, 37,178, 55,128, 37,188, 56,128, 37,198, - 57,128, 39, 86, 56,137, 39, 31, 40, 90, 40, 94, 40, 98, 40,102, - 40,106, 40,110, 40,114, 40,118, 40,122, 49,128, 37,215, 50,128, - 39, 88, 51,128, 39, 89, 52,128, 39, 90, 53,128, 39,111, 54,128, - 39,113, 55,128, 39,114, 56,128, 39,115, 57,128, 39,104, 57,138, - 39, 32, 40,150, 40,154, 40,158, 40,162, 40,166, 40,170, 40,174, - 40,178, 40,182, 40,186, 48,128, 39,105, 49,128, 39,108, 50,128, - 39,109, 51,128, 39,106, 52,128, 39,107, 53,128, 39,116, 54,128, - 39,117, 55,128, 39, 91, 56,128, 39, 92, 57,128, 39, 93, 97, 7, - 40,206, 40,216, 40,223, 40,230, 40,255, 41, 15, 41, 26,226,229, - 238,231,225,236,105,128, 9,134,227,245,244,101,128, 0,225,228, - 229,246, 97,128, 9, 6,231,117, 2, 40,237, 40,246,234,225,242, - 225,244,105,128, 10,134,242,237,245,235,232,105,128, 10, 6,237, - 225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 62,242, - 245,243,241,245,225,242,101,128, 51, 3,246,239,247,229,236,243, - 233,231,110, 3, 41, 42, 41, 52, 41, 59,226,229,238,231,225,236, - 105,128, 9,190,228,229,246, 97,128, 9, 62,231,245,234,225,242, - 225,244,105,128, 10,190, 98, 4, 41, 80, 41,121, 41,130, 41,140, - 226,242,229,246,233,225,244,233,239,110, 2, 41, 95, 41,110,237, - 225,242,235,225,242,237,229,238,233,225,110,128, 5, 95,243,233, - 231,238,228,229,246, 97,128, 9,112,229,238,231,225,236,105,128, - 9,133,239,240,239,237,239,230,111,128, 49, 26,242,229,246,101, - 134, 1, 3, 41,159, 41,167, 41,178, 41,189, 41,197, 41,209,225, - 227,245,244,101,128, 30,175,227,249,242,233,236,236,233, 99,128, - 4,209,228,239,244,226,229,236,239,119,128, 30,183,231,242,225, - 246,101,128, 30,177,232,239,239,235,225,226,239,246,101,128, 30, - 179,244,233,236,228,101,128, 30,181, 99, 4, 41,227, 41,234, 42, - 57, 42,127,225,242,239,110,128, 1,206,233,242, 99, 2, 41,242, - 41,247,236,101,128, 36,208,245,237,230,236,229,120,133, 0,226, - 42, 10, 42, 18, 42, 29, 42, 37, 42, 49,225,227,245,244,101,128, - 30,165,228,239,244,226,229,236,239,119,128, 30,173,231,242,225, - 246,101,128, 30,167,232,239,239,235,225,226,239,246,101,128, 30, - 169,244,233,236,228,101,128, 30,171,245,244,101,133, 0,180, 42, - 73, 42, 84, 42,101, 42,108, 42,117,226,229,236,239,247,227,237, - 98,128, 3, 23, 99, 2, 42, 90, 42, 95,237, 98,128, 3, 1,239, - 237, 98,128, 3, 1,228,229,246, 97,128, 9, 84,236,239,247,237, - 239,100,128, 2,207,244,239,238,229,227,237, 98,128, 3, 65,249, - 242,233,236,236,233, 99,128, 4, 48,100, 5, 42,149, 42,159, 42, - 173, 42,179, 42,213,226,236,231,242,225,246,101,128, 2, 1,228, - 225,235,231,245,242,237,245,235,232,105,128, 10,113,229,246, 97, - 128, 9, 5,233,229,242,229,243,233,115,130, 0,228, 42,193, 42, - 204,227,249,242,233,236,236,233, 99,128, 4,211,237,225,227,242, - 239,110,128, 1,223,239,116, 2, 42,220, 42,228,226,229,236,239, - 119,128, 30,161,237,225,227,242,239,110,128, 1,225,101,131, 0, - 230, 42,247, 42,255, 43, 8,225,227,245,244,101,128, 1,253,235, - 239,242,229,225,110,128, 49, 80,237,225,227,242,239,110,128, 1, - 227,230,233,105, 6, 43, 33, 43, 53, 45,246, 45,252, 46, 11, 49, - 111, 48, 2, 43, 39, 43, 46,176,178,176, 56,128, 32, 21,184,185, - 180, 49,128, 32,164,177, 48, 3, 43, 62, 45, 86, 45,221, 48, 9, - 43, 82, 43,102, 43,164, 43,226, 44, 32, 44, 94, 44,156, 44,218, - 45, 24, 49, 3, 43, 90, 43, 94, 43, 98, 55,128, 4, 16, 56,128, - 4, 17, 57,128, 4, 18, 50, 10, 43,124, 43,128, 43,132, 43,136, - 43,140, 43,144, 43,148, 43,152, 43,156, 43,160, 48,128, 4, 19, - 49,128, 4, 20, 50,128, 4, 21, 51,128, 4, 1, 52,128, 4, 22, - 53,128, 4, 23, 54,128, 4, 24, 55,128, 4, 25, 56,128, 4, 26, - 57,128, 4, 27, 51, 10, 43,186, 43,190, 43,194, 43,198, 43,202, - 43,206, 43,210, 43,214, 43,218, 43,222, 48,128, 4, 28, 49,128, - 4, 29, 50,128, 4, 30, 51,128, 4, 31, 52,128, 4, 32, 53,128, - 4, 33, 54,128, 4, 34, 55,128, 4, 35, 56,128, 4, 36, 57,128, - 4, 37, 52, 10, 43,248, 43,252, 44, 0, 44, 4, 44, 8, 44, 12, - 44, 16, 44, 20, 44, 24, 44, 28, 48,128, 4, 38, 49,128, 4, 39, - 50,128, 4, 40, 51,128, 4, 41, 52,128, 4, 42, 53,128, 4, 43, - 54,128, 4, 44, 55,128, 4, 45, 56,128, 4, 46, 57,128, 4, 47, - 53, 10, 44, 54, 44, 58, 44, 62, 44, 66, 44, 70, 44, 74, 44, 78, - 44, 82, 44, 86, 44, 90, 48,128, 4,144, 49,128, 4, 2, 50,128, - 4, 3, 51,128, 4, 4, 52,128, 4, 5, 53,128, 4, 6, 54,128, - 4, 7, 55,128, 4, 8, 56,128, 4, 9, 57,128, 4, 10, 54, 10, - 44,116, 44,120, 44,124, 44,128, 44,132, 44,136, 44,140, 44,144, - 44,148, 44,152, 48,128, 4, 11, 49,128, 4, 12, 50,128, 4, 14, - 51,128,246,196, 52,128,246,197, 53,128, 4, 48, 54,128, 4, 49, - 55,128, 4, 50, 56,128, 4, 51, 57,128, 4, 52, 55, 10, 44,178, - 44,182, 44,186, 44,190, 44,194, 44,198, 44,202, 44,206, 44,210, - 44,214, 48,128, 4, 53, 49,128, 4, 81, 50,128, 4, 54, 51,128, - 4, 55, 52,128, 4, 56, 53,128, 4, 57, 54,128, 4, 58, 55,128, - 4, 59, 56,128, 4, 60, 57,128, 4, 61, 56, 10, 44,240, 44,244, - 44,248, 44,252, 45, 0, 45, 4, 45, 8, 45, 12, 45, 16, 45, 20, - 48,128, 4, 62, 49,128, 4, 63, 50,128, 4, 64, 51,128, 4, 65, - 52,128, 4, 66, 53,128, 4, 67, 54,128, 4, 68, 55,128, 4, 69, - 56,128, 4, 70, 57,128, 4, 71, 57, 10, 45, 46, 45, 50, 45, 54, - 45, 58, 45, 62, 45, 66, 45, 70, 45, 74, 45, 78, 45, 82, 48,128, - 4, 72, 49,128, 4, 73, 50,128, 4, 74, 51,128, 4, 75, 52,128, - 4, 76, 53,128, 4, 77, 54,128, 4, 78, 55,128, 4, 79, 56,128, - 4,145, 57,128, 4, 82, 49, 4, 45, 96, 45,158, 45,163, 45,189, - 48, 10, 45,118, 45,122, 45,126, 45,130, 45,134, 45,138, 45,142, - 45,146, 45,150, 45,154, 48,128, 4, 83, 49,128, 4, 84, 50,128, - 4, 85, 51,128, 4, 86, 52,128, 4, 87, 53,128, 4, 88, 54,128, - 4, 89, 55,128, 4, 90, 56,128, 4, 91, 57,128, 4, 92,177, 48, - 128, 4, 94, 52, 4, 45,173, 45,177, 45,181, 45,185, 53,128, 4, - 15, 54,128, 4, 98, 55,128, 4,114, 56,128, 4,116, 57, 5, 45, - 201, 45,205, 45,209, 45,213, 45,217, 50,128,246,198, 51,128, 4, - 95, 52,128, 4, 99, 53,128, 4,115, 54,128, 4,117, 56, 2, 45, - 227, 45,241, 51, 2, 45,233, 45,237, 49,128,246,199, 50,128,246, - 200,180, 54,128, 4,217,178,185, 57,128, 32, 14,179, 48, 2, 46, - 3, 46, 7, 48,128, 32, 15, 49,128, 32, 13,181, 55, 7, 46, 28, - 46, 98, 47,163, 47,240, 48,197, 49, 34, 49,105, 51, 2, 46, 34, - 46, 48, 56, 2, 46, 40, 46, 44, 49,128, 6,106, 56,128, 6, 12, - 57, 8, 46, 66, 46, 70, 46, 74, 46, 78, 46, 82, 46, 86, 46, 90, - 46, 94, 50,128, 6, 96, 51,128, 6, 97, 52,128, 6, 98, 53,128, - 6, 99, 54,128, 6,100, 55,128, 6,101, 56,128, 6,102, 57,128, - 6,103, 52, 7, 46,114, 46,146, 46,208, 47, 14, 47, 46, 47,102, - 47,158, 48, 5, 46,126, 46,130, 46,134, 46,138, 46,142, 48,128, - 6,104, 49,128, 6,105, 51,128, 6, 27, 55,128, 6, 31, 57,128, - 6, 33, 49, 10, 46,168, 46,172, 46,176, 46,180, 46,184, 46,188, - 46,192, 46,196, 46,200, 46,204, 48,128, 6, 34, 49,128, 6, 35, - 50,128, 6, 36, 51,128, 6, 37, 52,128, 6, 38, 53,128, 6, 39, - 54,128, 6, 40, 55,128, 6, 41, 56,128, 6, 42, 57,128, 6, 43, - 50, 10, 46,230, 46,234, 46,238, 46,242, 46,246, 46,250, 46,254, - 47, 2, 47, 6, 47, 10, 48,128, 6, 44, 49,128, 6, 45, 50,128, - 6, 46, 51,128, 6, 47, 52,128, 6, 48, 53,128, 6, 49, 54,128, - 6, 50, 55,128, 6, 51, 56,128, 6, 52, 57,128, 6, 53, 51, 5, - 47, 26, 47, 30, 47, 34, 47, 38, 47, 42, 48,128, 6, 54, 49,128, - 6, 55, 50,128, 6, 56, 51,128, 6, 57, 52,128, 6, 58, 52, 9, - 47, 66, 47, 70, 47, 74, 47, 78, 47, 82, 47, 86, 47, 90, 47, 94, - 47, 98, 48,128, 6, 64, 49,128, 6, 65, 50,128, 6, 66, 51,128, - 6, 67, 52,128, 6, 68, 53,128, 6, 69, 54,128, 6, 70, 56,128, - 6, 72, 57,128, 6, 73, 53, 9, 47,122, 47,126, 47,130, 47,134, - 47,138, 47,142, 47,146, 47,150, 47,154, 48,128, 6, 74, 49,128, - 6, 75, 50,128, 6, 76, 51,128, 6, 77, 52,128, 6, 78, 53,128, - 6, 79, 54,128, 6, 80, 55,128, 6, 81, 56,128, 6, 82,183, 48, - 128, 6, 71, 53, 3, 47,171, 47,203, 47,235, 48, 5, 47,183, 47, - 187, 47,191, 47,195, 47,199, 53,128, 6,164, 54,128, 6,126, 55, - 128, 6,134, 56,128, 6,152, 57,128, 6,175, 49, 5, 47,215, 47, - 219, 47,223, 47,227, 47,231, 49,128, 6,121, 50,128, 6,136, 51, - 128, 6,145, 52,128, 6,186, 57,128, 6,210,179, 52,128, 6,213, - 54, 7, 48, 0, 48, 5, 48, 10, 48, 15, 48, 53, 48,115, 48,177, - 179, 54,128, 32,170,180, 53,128, 5,190,181, 56,128, 5,195, 54, - 6, 48, 29, 48, 33, 48, 37, 48, 41, 48, 45, 48, 49, 52,128, 5, - 208, 53,128, 5,209, 54,128, 5,210, 55,128, 5,211, 56,128, 5, - 212, 57,128, 5,213, 55, 10, 48, 75, 48, 79, 48, 83, 48, 87, 48, - 91, 48, 95, 48, 99, 48,103, 48,107, 48,111, 48,128, 5,214, 49, - 128, 5,215, 50,128, 5,216, 51,128, 5,217, 52,128, 5,218, 53, - 128, 5,219, 54,128, 5,220, 55,128, 5,221, 56,128, 5,222, 57, - 128, 5,223, 56, 10, 48,137, 48,141, 48,145, 48,149, 48,153, 48, - 157, 48,161, 48,165, 48,169, 48,173, 48,128, 5,224, 49,128, 5, - 225, 50,128, 5,226, 51,128, 5,227, 52,128, 5,228, 53,128, 5, - 229, 54,128, 5,230, 55,128, 5,231, 56,128, 5,232, 57,128, 5, - 233, 57, 3, 48,185, 48,189, 48,193, 48,128, 5,234, 52,128,251, - 42, 53,128,251, 43, 55, 4, 48,207, 48,221, 48,241, 48,246, 48, - 2, 48,213, 48,217, 48,128,251, 75, 53,128,251, 31, 49, 3, 48, - 229, 48,233, 48,237, 54,128, 5,240, 55,128, 5,241, 56,128, 5, - 242,178, 51,128,251, 53, 57, 7, 49, 6, 49, 10, 49, 14, 49, 18, - 49, 22, 49, 26, 49, 30, 51,128, 5,180, 52,128, 5,181, 53,128, - 5,182, 54,128, 5,187, 55,128, 5,184, 56,128, 5,183, 57,128, - 5,176, 56, 3, 49, 42, 49, 86, 49, 91, 48, 7, 49, 58, 49, 62, - 49, 66, 49, 70, 49, 74, 49, 78, 49, 82, 48,128, 5,178, 49,128, - 5,177, 50,128, 5,179, 51,128, 5,194, 52,128, 5,193, 54,128, - 5,185, 55,128, 5,188,179, 57,128, 5,189, 52, 2, 49, 97, 49, - 101, 49,128, 5,191, 50,128, 5,192,185,178, 57,128, 2,188, 54, - 3, 49,119, 49,178, 49,185, 49, 4, 49,129, 49,145, 49,151, 49, - 172, 50, 2, 49,135, 49,140,180, 56,128, 33, 5,184, 57,128, 33, - 19,179,181, 50,128, 33, 22,181, 55, 3, 49,160, 49,164, 49,168, - 51,128, 32, 44, 52,128, 32, 45, 53,128, 32, 46,182,182, 52,128, - 32, 12,179,177,182, 55,128, 6,109,180,185,179, 55,128, 2,189, - 103, 2, 49,198, 49,205,242,225,246,101,128, 0,224,117, 2, 49, - 211, 49,220,234,225,242,225,244,105,128, 10,133,242,237,245,235, - 232,105,128, 10, 5,104, 2, 49,235, 49,245,233,242,225,231,225, - 238, 97,128, 48, 66,239,239,235,225,226,239,246,101,128, 30,163, - 105, 7, 50, 16, 50, 41, 50, 48, 50, 60, 50, 85, 50,101, 50,181, - 98, 2, 50, 22, 50, 31,229,238,231,225,236,105,128, 9,144,239, - 240,239,237,239,230,111,128, 49, 30,228,229,246, 97,128, 9, 16, - 229,227,249,242,233,236,236,233, 99,128, 4,213,231,117, 2, 50, - 67, 50, 76,234,225,242,225,244,105,128, 10,144,242,237,245,235, - 232,105,128, 10, 16,237,225,244,242,225,231,245,242,237,245,235, - 232,105,128, 10, 72,110, 5, 50,113, 50,122, 50,136, 50,152, 50, - 167,225,242,225,226,233, 99,128, 6, 57,230,233,238,225,236,225, - 242,225,226,233, 99,128,254,202,233,238,233,244,233,225,236,225, - 242,225,226,233, 99,128,254,203,237,229,228,233,225,236,225,242, - 225,226,233, 99,128,254,204,246,229,242,244,229,228,226,242,229, - 246,101,128, 2, 3,246,239,247,229,236,243,233,231,110, 3, 50, - 197, 50,207, 50,214,226,229,238,231,225,236,105,128, 9,200,228, - 229,246, 97,128, 9, 72,231,245,234,225,242,225,244,105,128, 10, - 200,107, 2, 50,231, 50,255,225,244,225,235,225,238, 97,129, 48, - 162, 50,243,232,225,236,230,247,233,228,244,104,128,255,113,239, - 242,229,225,110,128, 49, 79,108, 3, 51, 15, 52, 71, 52, 80,101, - 2, 51, 21, 52, 66,102,136, 5,208, 51, 41, 51, 50, 51, 65, 51, - 79, 51,168, 51,182, 52, 37, 52, 51,225,242,225,226,233, 99,128, - 6, 39,228,225,231,229,243,232,232,229,226,242,229,119,128,251, - 48,230,233,238,225,236,225,242,225,226,233, 99,128,254,142,104, - 2, 51, 85, 51,160,225,237,250, 97, 2, 51, 94, 51,127,225,226, - 239,246,101, 2, 51,104, 51,113,225,242,225,226,233, 99,128, 6, - 35,230,233,238,225,236,225,242,225,226,233, 99,128,254,132,226, - 229,236,239,119, 2, 51,137, 51,146,225,242,225,226,233, 99,128, - 6, 37,230,233,238,225,236,225,242,225,226,233, 99,128,254,136, - 229,226,242,229,119,128, 5,208,236,225,237,229,228,232,229,226, - 242,229,119,128,251, 79,237, 97, 2, 51,189, 51,225,228,228,225, - 225,226,239,246,101, 2, 51,202, 51,211,225,242,225,226,233, 99, - 128, 6, 34,230,233,238,225,236,225,242,225,226,233, 99,128,254, - 130,235,243,245,242, 97, 4, 51,239, 51,248, 52, 6, 52, 22,225, - 242,225,226,233, 99,128, 6, 73,230,233,238,225,236,225,242,225, - 226,233, 99,128,254,240,233,238,233,244,233,225,236,225,242,225, - 226,233, 99,128,254,243,237,229,228,233,225,236,225,242,225,226, - 233, 99,128,254,244,240,225,244,225,232,232,229,226,242,229,119, - 128,251, 46,241,225,237,225,244,243,232,229,226,242,229,119,128, - 251, 47,240,104,128, 33, 53,236,229,241,245,225,108,128, 34, 76, - 240,232, 97,129, 3,177, 52, 88,244,239,238,239,115,128, 3,172, - 109, 4, 52,106, 52,114, 52,125, 52,159,225,227,242,239,110,128, - 1, 1,239,238,239,243,240,225,227,101,128,255, 65,240,229,242, - 243,225,238,100,130, 0, 38, 52,139, 52,151,237,239,238,239,243, - 240,225,227,101,128,255, 6,243,237,225,236,108,128,247, 38,243, - 241,245,225,242,101,128, 51,194,110, 4, 52,178, 52,189, 53, 55, - 53, 65,226,239,240,239,237,239,230,111,128, 49, 34,103, 4, 52, - 199, 52,210, 52,224, 53, 47,226,239,240,239,237,239,230,111,128, - 49, 36,235,232,225,238,235,232,245,244,232,225,105,128, 14, 90, - 236,101,131, 34, 32, 52,235, 53, 32, 53, 39,226,242,225,227,235, - 229,116, 2, 52,247, 53, 11,236,229,230,116,129, 48, 8, 53, 0, - 246,229,242,244,233,227,225,108,128,254, 63,242,233,231,232,116, - 129, 48, 9, 53, 21,246,229,242,244,233,227,225,108,128,254, 64, - 236,229,230,116,128, 35, 41,242,233,231,232,116,128, 35, 42,243, - 244,242,239,109,128, 33, 43,239,244,229,236,229,233, 97,128, 3, - 135,117, 2, 53, 71, 53, 83,228,225,244,244,225,228,229,246, 97, - 128, 9, 82,243,246,225,242, 97, 3, 53, 95, 53,105, 53,112,226, - 229,238,231,225,236,105,128, 9,130,228,229,246, 97,128, 9, 2, - 231,245,234,225,242,225,244,105,128, 10,130,239,231,239,238,229, - 107,128, 1, 5,112, 3, 53,140, 53,164, 53,194, 97, 2, 53,146, - 53,158,225,244,239,243,241,245,225,242,101,128, 51, 0,242,229, - 110,128, 36,156,239,243,244,242,239,240,232,101, 2, 53,177, 53, - 188,225,242,237,229,238,233,225,110,128, 5, 90,237,239,100,128, - 2,188,112, 2, 53,200, 53,205,236,101,128,248,255,242,111, 2, - 53,212, 53,220,225,227,232,229,115,128, 34, 80,120, 2, 53,226, - 53,246,229,241,245,225,108,129, 34, 72, 53,236,239,242,233,237, - 225,231,101,128, 34, 82,233,237,225,244,229,236,249,229,241,245, - 225,108,128, 34, 69,114, 4, 54, 15, 54, 42, 54, 46, 54, 91,225, - 229, 97, 2, 54, 23, 54, 33,229,235,239,242,229,225,110,128, 49, - 142,235,239,242,229,225,110,128, 49,141, 99,128, 35, 18,105, 2, - 54, 52, 54, 66,231,232,244,232,225,236,230,242,233,238,103,128, - 30,154,238,103,130, 0,229, 54, 75, 54, 83,225,227,245,244,101, - 128, 1,251,226,229,236,239,119,128, 30, 1,242,239,119, 8, 54, - 111, 54,118, 54,247, 55, 57, 55,107, 55,162, 55,185, 56, 4,226, - 239,244,104,128, 33,148,100, 3, 54,126, 54,165, 54,212,225,243, - 104, 4, 54,138, 54,145, 54,152, 54,160,228,239,247,110,128, 33, - 227,236,229,230,116,128, 33,224,242,233,231,232,116,128, 33,226, - 245,112,128, 33,225,226,108, 5, 54,178, 54,185, 54,192, 54,199, - 54,207,226,239,244,104,128, 33,212,228,239,247,110,128, 33,211, - 236,229,230,116,128, 33,208,242,233,231,232,116,128, 33,210,245, - 112,128, 33,209,239,247,110,131, 33,147, 54,224, 54,231, 54,239, - 236,229,230,116,128, 33,153,242,233,231,232,116,128, 33,152,247, - 232,233,244,101,128, 33,233,104, 2, 54,253, 55, 48,229,225,100, - 4, 55, 9, 55, 19, 55, 29, 55, 40,228,239,247,238,237,239,100, - 128, 2,197,236,229,230,244,237,239,100,128, 2,194,242,233,231, - 232,244,237,239,100,128, 2,195,245,240,237,239,100,128, 2,196, - 239,242,233,250,229,120,128,248,231,236,229,230,116,131, 33,144, - 55, 70, 55, 87, 55, 99,228,226,108,129, 33,208, 55, 78,243,244, - 242,239,235,101,128, 33,205,239,246,229,242,242,233,231,232,116, - 128, 33,198,247,232,233,244,101,128, 33,230,242,233,231,232,116, - 132, 33,146, 55,123, 55,135, 55,143, 55,154,228,226,236,243,244, - 242,239,235,101,128, 33,207,232,229,225,246,121,128, 39,158,239, - 246,229,242,236,229,230,116,128, 33,196,247,232,233,244,101,128, - 33,232,244,225, 98, 2, 55,170, 55,177,236,229,230,116,128, 33, - 228,242,233,231,232,116,128, 33,229,245,112,132, 33,145, 55,198, - 55,226, 55,244, 55,252,100, 2, 55,204, 55,216,110,129, 33,149, - 55,210,226,243,101,128, 33,168,239,247,238,226,225,243,101,128, - 33,168,236,229,230,116,129, 33,150, 55,235,239,230,228,239,247, - 110,128, 33,197,242,233,231,232,116,128, 33,151,247,232,233,244, - 101,128, 33,231,246,229,242,244,229,120,128,248,230,115, 5, 56, - 25, 56,101, 56,146, 56,229, 56,239, 99, 2, 56, 31, 56, 83,233, - 105, 2, 56, 38, 56, 61,227,233,242,227,245,109,129, 0, 94, 56, - 49,237,239,238,239,243,240,225,227,101,128,255, 62,244,233,236, - 228,101,129, 0,126, 56, 71,237,239,238,239,243,240,225,227,101, - 128,255, 94,242,233,240,116,129, 2, 81, 56, 92,244,245,242,238, - 229,100,128, 2, 82,237,225,236,108, 2, 56,110, 56,121,232,233, - 242,225,231,225,238, 97,128, 48, 65,235,225,244,225,235,225,238, - 97,129, 48,161, 56,134,232,225,236,230,247,233,228,244,104,128, - 255,103,244,229,242,233,115, 2, 56,156, 56,225,107,131, 0, 42, - 56,166, 56,194, 56,217, 97, 2, 56,172, 56,186,236,244,239,238, - 229,225,242,225,226,233, 99,128, 6,109,242,225,226,233, 99,128, - 6,109,109, 2, 56,200, 56,206,225,244,104,128, 34, 23,239,238, - 239,243,240,225,227,101,128,255, 10,243,237,225,236,108,128,254, - 97,109,128, 32, 66,245,240,229,242,233,239,114,128,246,233,249, - 237,240,244,239,244,233,227,225,236,236,249,229,241,245,225,108, - 128, 34, 67,116,132, 0, 64, 57, 15, 57, 22, 57, 34, 57, 42,233, - 236,228,101,128, 0,227,237,239,238,239,243,240,225,227,101,128, - 255, 32,243,237,225,236,108,128,254,107,245,242,238,229,100,128, - 2, 80,117, 6, 57, 64, 57, 89, 57, 96, 57,121, 57,141, 57,157, - 98, 2, 57, 70, 57, 79,229,238,231,225,236,105,128, 9,148,239, - 240,239,237,239,230,111,128, 49, 32,228,229,246, 97,128, 9, 20, - 231,117, 2, 57,103, 57,112,234,225,242,225,244,105,128, 10,148, - 242,237,245,235,232,105,128, 10, 20,236,229,238,231,244,232,237, - 225,242,235,226,229,238,231,225,236,105,128, 9,215,237,225,244, - 242,225,231,245,242,237,245,235,232,105,128, 10, 76,246,239,247, - 229,236,243,233,231,110, 3, 57,173, 57,183, 57,190,226,229,238, - 231,225,236,105,128, 9,204,228,229,246, 97,128, 9, 76,231,245, - 234,225,242,225,244,105,128, 10,204,246,225,231,242,225,232,225, - 228,229,246, 97,128, 9, 61,121, 2, 57,221, 57,233,226,225,242, - 237,229,238,233,225,110,128, 5, 97,233,110,130, 5,226, 57,242, - 58, 1,225,236,244,239,238,229,232,229,226,242,229,119,128,251, - 32,232,229,226,242,229,119,128, 5,226, 98,144, 0, 98, 58, 46, - 58,181, 58,192, 58,201, 58,226, 60, 11, 60, 73, 60,146, 62, 72, - 62, 84, 62,127, 62,135, 62,145, 64, 15, 64, 39, 64, 48, 97, 7, - 58, 62, 58, 72, 58, 96, 58,103, 58,128, 58,152, 58,163,226,229, - 238,231,225,236,105,128, 9,172,227,235,243,236,225,243,104,129, - 0, 92, 58, 84,237,239,238,239,243,240,225,227,101,128,255, 60, - 228,229,246, 97,128, 9, 44,231,117, 2, 58,110, 58,119,234,225, - 242,225,244,105,128, 10,172,242,237,245,235,232,105,128, 10, 44, - 104, 2, 58,134, 58,144,233,242,225,231,225,238, 97,128, 48,112, - 244,244,232,225,105,128, 14, 63,235,225,244,225,235,225,238, 97, - 128, 48,208,114,129, 0,124, 58,169,237,239,238,239,243,240,225, - 227,101,128,255, 92,226,239,240,239,237,239,230,111,128, 49, 5, - 227,233,242,227,236,101,128, 36,209,228,239,116, 2, 58,209, 58, - 218,225,227,227,229,238,116,128, 30, 3,226,229,236,239,119,128, - 30, 5,101, 6, 58,240, 59, 5, 59, 28, 59,170, 59,181, 59,193, - 225,237,229,228,243,233,248,244,229,229,238,244,232,238,239,244, - 229,115,128, 38,108, 99, 2, 59, 11, 59, 18,225,245,243,101,128, - 34, 53,249,242,233,236,236,233, 99,128, 4, 49,104, 5, 59, 40, - 59, 49, 59, 63, 59, 93, 59,152,225,242,225,226,233, 99,128, 6, - 40,230,233,238,225,236,225,242,225,226,233, 99,128,254,144,105, - 2, 59, 69, 59, 84,238,233,244,233,225,236,225,242,225,226,233, - 99,128,254,145,242,225,231,225,238, 97,128, 48,121,237,101, 2, - 59,100, 59,113,228,233,225,236,225,242,225,226,233, 99,128,254, - 146,229,237,105, 2, 59,121, 59,136,238,233,244,233,225,236,225, - 242,225,226,233, 99,128,252,159,243,239,236,225,244,229,228,225, - 242,225,226,233, 99,128,252, 8,238,239,239,238,230,233,238,225, - 236,225,242,225,226,233, 99,128,252,109,235,225,244,225,235,225, - 238, 97,128, 48,217,238,225,242,237,229,238,233,225,110,128, 5, - 98,116,132, 5,209, 59,205, 59,225, 59,245, 59,254, 97,129, 3, - 178, 59,211,243,249,237,226,239,236,231,242,229,229,107,128, 3, - 208,228,225,231,229,243,104,129,251, 49, 59,236,232,229,226,242, - 229,119,128,251, 49,232,229,226,242,229,119,128, 5,209,242,225, - 230,229,232,229,226,242,229,119,128,251, 76,104, 2, 60, 17, 60, - 67, 97, 3, 60, 25, 60, 35, 60, 42,226,229,238,231,225,236,105, - 128, 9,173,228,229,246, 97,128, 9, 45,231,117, 2, 60, 49, 60, - 58,234,225,242,225,244,105,128, 10,173,242,237,245,235,232,105, - 128, 10, 45,239,239,107,128, 2, 83,105, 5, 60, 85, 60, 96, 60, - 107, 60,121, 60,135,232,233,242,225,231,225,238, 97,128, 48,115, - 235,225,244,225,235,225,238, 97,128, 48,211,236,225,226,233,225, - 236,227,236,233,227,107,128, 2,152,238,228,233,231,245,242,237, - 245,235,232,105,128, 10, 2,242,245,243,241,245,225,242,101,128, - 51, 49,108, 3, 60,154, 62, 55, 62, 66, 97, 2, 60,160, 62, 50, - 227,107, 6, 60,175, 60,184, 60,221, 61,114, 61,169, 61,221,227, - 233,242,227,236,101,128, 37,207,100, 2, 60,190, 60,199,233,225, - 237,239,238,100,128, 37,198,239,247,238,240,239,233,238,244,233, - 238,231,244,242,233,225,238,231,236,101,128, 37,188,108, 2, 60, - 227, 61, 74,101, 2, 60,233, 61, 13,230,244,240,239,233,238,244, - 233,238,103, 2, 60,248, 61, 2,240,239,233,238,244,229,114,128, - 37,196,244,242,233,225,238,231,236,101,128, 37,192,238,244,233, - 227,245,236,225,242,226,242,225,227,235,229,116, 2, 61, 33, 61, - 53,236,229,230,116,129, 48, 16, 61, 42,246,229,242,244,233,227, - 225,108,128,254, 59,242,233,231,232,116,129, 48, 17, 61, 63,246, - 229,242,244,233,227,225,108,128,254, 60,239,247,229,114, 2, 61, - 83, 61, 98,236,229,230,244,244,242,233,225,238,231,236,101,128, - 37,227,242,233,231,232,244,244,242,233,225,238,231,236,101,128, - 37,226,114, 2, 61,120, 61,131,229,227,244,225,238,231,236,101, - 128, 37,172,233,231,232,244,240,239,233,238,244,233,238,103, 2, - 61,148, 61,158,240,239,233,238,244,229,114,128, 37,186,244,242, - 233,225,238,231,236,101,128, 37,182,115, 3, 61,177, 61,207, 61, - 215,109, 2, 61,183, 61,195,225,236,236,243,241,245,225,242,101, - 128, 37,170,233,236,233,238,231,230,225,227,101,128, 38, 59,241, - 245,225,242,101,128, 37,160,244,225,114,128, 38, 5,245,240,112, - 2, 61,229, 62, 11,229,114, 2, 61,236, 61,251,236,229,230,244, - 244,242,233,225,238,231,236,101,128, 37,228,242,233,231,232,244, - 244,242,233,225,238,231,236,101,128, 37,229,239,233,238,244,233, - 238,103, 2, 62, 23, 62, 39,243,237,225,236,236,244,242,233,225, - 238,231,236,101,128, 37,180,244,242,233,225,238,231,236,101,128, - 37,178,238,107,128, 36, 35,233,238,229,226,229,236,239,119,128, - 30, 7,239,227,107,128, 37,136,237,239,238,239,243,240,225,227, - 101,128,255, 66,111, 3, 62, 92, 62,105, 62,116,226,225,233,237, - 225,233,244,232,225,105,128, 14, 26,232,233,242,225,231,225,238, - 97,128, 48,124,235,225,244,225,235,225,238, 97,128, 48,220,240, - 225,242,229,110,128, 36,157,241,243,241,245,225,242,101,128, 51, - 195,114, 4, 62,155, 63,149, 63,222, 64, 5,225, 99, 2, 62,162, - 63, 56,101, 3, 62,170, 62,175, 62,243,229,120,128,248,244,236, - 229,230,116,133, 0,123, 62,192, 62,197, 62,219, 62,227, 62,232, - 226,116,128,248,243,109, 2, 62,203, 62,208,233,100,128,248,242, - 239,238,239,243,240,225,227,101,128,255, 91,243,237,225,236,108, - 128,254, 91,244,112,128,248,241,246,229,242,244,233,227,225,108, - 128,254, 55,242,233,231,232,116,133, 0,125, 63, 5, 63, 10, 63, - 32, 63, 40, 63, 45,226,116,128,248,254,109, 2, 63, 16, 63, 21, - 233,100,128,248,253,239,238,239,243,240,225,227,101,128,255, 93, - 243,237,225,236,108,128,254, 92,244,112,128,248,252,246,229,242, - 244,233,227,225,108,128,254, 56,235,229,116, 2, 63, 64, 63,106, - 236,229,230,116,132, 0, 91, 63, 79, 63, 84, 63, 89, 63,101,226, - 116,128,248,240,229,120,128,248,239,237,239,238,239,243,240,225, - 227,101,128,255, 59,244,112,128,248,238,242,233,231,232,116,132, - 0, 93, 63,122, 63,127, 63,132, 63,144,226,116,128,248,251,229, - 120,128,248,250,237,239,238,239,243,240,225,227,101,128,255, 61, - 244,112,128,248,249,229,246,101,131, 2,216, 63,161, 63,172, 63, - 178,226,229,236,239,247,227,237, 98,128, 3, 46,227,237, 98,128, - 3, 6,233,238,246,229,242,244,229,100, 3, 63,193, 63,204, 63, - 210,226,229,236,239,247,227,237, 98,128, 3, 47,227,237, 98,128, - 3, 17,228,239,245,226,236,229,227,237, 98,128, 3, 97,233,228, - 231,101, 2, 63,231, 63,242,226,229,236,239,247,227,237, 98,128, - 3, 42,233,238,246,229,242,244,229,228,226,229,236,239,247,227, - 237, 98,128, 3, 58,239,235,229,238,226,225,114,128, 0,166,115, - 2, 64, 21, 64, 29,244,242,239,235,101,128, 1,128,245,240,229, - 242,233,239,114,128,246,234,244,239,240,226,225,114,128, 1,131, - 117, 3, 64, 56, 64, 67, 64, 78,232,233,242,225,231,225,238, 97, - 128, 48,118,235,225,244,225,235,225,238, 97,128, 48,214,236,108, - 2, 64, 85, 64,115,229,116,130, 32, 34, 64, 94, 64,104,233,238, - 246,229,242,243,101,128, 37,216,239,240,229,242,225,244,239,114, - 128, 34, 25,243,229,249,101,128, 37,206, 99,143, 0, 99, 64,156, - 65,105, 65,116, 65,180, 65,211, 66, 48, 67,215, 68,199, 69, 43, - 69, 92, 72, 84, 72, 92, 72,102, 72,114, 72,147, 97, 9, 64,176, - 64,187, 64,197, 64,204, 64,211, 64,236, 64,246, 65, 42, 65, 51, - 225,242,237,229,238,233,225,110,128, 5,110,226,229,238,231,225, - 236,105,128, 9,154,227,245,244,101,128, 1, 7,228,229,246, 97, - 128, 9, 26,231,117, 2, 64,218, 64,227,234,225,242,225,244,105, - 128, 10,154,242,237,245,235,232,105,128, 10, 26,236,243,241,245, - 225,242,101,128, 51,136,238,228,242,225,226,233,238,228,117, 4, - 65, 8, 65, 18, 65, 24, 65, 31,226,229,238,231,225,236,105,128, - 9,129,227,237, 98,128, 3, 16,228,229,246, 97,128, 9, 1,231, - 245,234,225,242,225,244,105,128, 10,129,240,243,236,239,227,107, - 128, 33,234,114, 3, 65, 59, 65, 65, 65, 91,229,239,102,128, 33, - 5,239,110,130, 2,199, 65, 74, 65, 85,226,229,236,239,247,227, - 237, 98,128, 3, 44,227,237, 98,128, 3, 12,242,233,225,231,229, - 242,229,244,245,242,110,128, 33,181,226,239,240,239,237,239,230, - 111,128, 49, 24, 99, 4, 65,126, 65,133, 65,152, 65,174,225,242, - 239,110,128, 1, 13,229,228,233,236,236, 97,129, 0,231, 65,144, - 225,227,245,244,101,128, 30, 9,233,242, 99, 2, 65,160, 65,165, - 236,101,128, 36,210,245,237,230,236,229,120,128, 1, 9,245,242, - 108,128, 2, 85,100, 2, 65,186, 65,202,239,116,129, 1, 11, 65, - 193,225,227,227,229,238,116,128, 1, 11,243,241,245,225,242,101, - 128, 51,197,101, 2, 65,217, 65,233,228,233,236,236, 97,129, 0, - 184, 65,227,227,237, 98,128, 3, 39,238,116,132, 0,162, 65,246, - 66, 14, 66, 26, 66, 37,105, 2, 65,252, 66, 4,231,242,225,228, - 101,128, 33, 3,238,230,229,242,233,239,114,128,246,223,237,239, - 238,239,243,240,225,227,101,128,255,224,239,236,228,243,244,249, - 236,101,128,247,162,243,245,240,229,242,233,239,114,128,246,224, - 104, 5, 66, 60, 66,123, 66,134, 67, 62, 67,154, 97, 4, 66, 70, - 66, 81, 66, 91, 66, 98,225,242,237,229,238,233,225,110,128, 5, - 121,226,229,238,231,225,236,105,128, 9,155,228,229,246, 97,128, - 9, 27,231,117, 2, 66,105, 66,114,234,225,242,225,244,105,128, - 10,155,242,237,245,235,232,105,128, 10, 27,226,239,240,239,237, - 239,230,111,128, 49, 20,101, 6, 66,148, 66,168, 66,192, 67, 4, - 67, 16, 67, 37,225,226,235,232,225,243,233,225,238,227,249,242, - 233,236,236,233, 99,128, 4,189, 99, 2, 66,174, 66,182,235,237, - 225,242,107,128, 39, 19,249,242,233,236,236,233, 99,128, 4, 71, - 100, 2, 66,198, 66,242,229,243,227,229,238,228,229,114, 2, 66, - 211, 66,231,225,226,235,232,225,243,233,225,238,227,249,242,233, - 236,236,233, 99,128, 4,191,227,249,242,233,236,236,233, 99,128, - 4,183,233,229,242,229,243,233,243,227,249,242,233,236,236,233, - 99,128, 4,245,232,225,242,237,229,238,233,225,110,128, 5,115, - 235,232,225,235,225,243,243,233,225,238,227,249,242,233,236,236, - 233, 99,128, 4,204,246,229,242,244,233,227,225,236,243,244,242, - 239,235,229,227,249,242,233,236,236,233, 99,128, 4,185,105,129, - 3,199, 67, 68,229,245,227,104, 4, 67, 81, 67,116, 67,131, 67, - 140, 97, 2, 67, 87, 67,102,227,233,242,227,236,229,235,239,242, - 229,225,110,128, 50,119,240,225,242,229,238,235,239,242,229,225, - 110,128, 50, 23,227,233,242,227,236,229,235,239,242,229,225,110, - 128, 50,105,235,239,242,229,225,110,128, 49, 74,240,225,242,229, - 238,235,239,242,229,225,110,128, 50, 9,111, 2, 67,160, 67,210, - 227,104, 3, 67,169, 67,191, 67,201,225,110, 2, 67,176, 67,184, - 231,244,232,225,105,128, 14, 10,244,232,225,105,128, 14, 8,233, - 238,231,244,232,225,105,128, 14, 9,239,229,244,232,225,105,128, - 14, 12,239,107,128, 1,136,105, 2, 67,221, 68, 67,229,245, 99, - 5, 67,235, 68, 14, 68, 29, 68, 38, 68, 52, 97, 2, 67,241, 68, - 0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,118, - 240,225,242,229,238,235,239,242,229,225,110,128, 50, 22,227,233, - 242,227,236,229,235,239,242,229,225,110,128, 50,104,235,239,242, - 229,225,110,128, 49, 72,240,225,242,229,238,235,239,242,229,225, - 110,128, 50, 8,245,240,225,242,229,238,235,239,242,229,225,110, - 128, 50, 28,242, 99, 2, 68, 74, 68,169,236,101,132, 37,203, 68, - 87, 68, 98, 68,103, 68,127,237,245,236,244,233,240,236,121,128, - 34,151,239,116,128, 34,153,112, 2, 68,109, 68,115,236,245,115, - 128, 34,149,239,243,244,225,236,237,225,242,107,128, 48, 54,247, - 233,244,104, 2, 68,136, 68,152,236,229,230,244,232,225,236,230, - 226,236,225,227,107,128, 37,208,242,233,231,232,244,232,225,236, - 230,226,236,225,227,107,128, 37,209,245,237,230,236,229,120,130, - 2,198, 68,182, 68,193,226,229,236,239,247,227,237, 98,128, 3, - 45,227,237, 98,128, 3, 2,108, 3, 68,207, 68,213, 69, 11,229, - 225,114,128, 35, 39,233,227,107, 4, 68,225, 68,236, 68,245, 68, - 255,225,236,246,229,239,236,225,114,128, 1,194,228,229,238,244, - 225,108,128, 1,192,236,225,244,229,242,225,108,128, 1,193,242, - 229,244,242,239,230,236,229,120,128, 1,195,245, 98,129, 38, 99, - 69, 18,243,245,233,116, 2, 69, 27, 69, 35,226,236,225,227,107, - 128, 38, 99,247,232,233,244,101,128, 38,103,109, 3, 69, 51, 69, - 65, 69, 76,227,245,226,229,228,243,241,245,225,242,101,128, 51, - 164,239,238,239,243,240,225,227,101,128,255, 67,243,241,245,225, - 242,229,228,243,241,245,225,242,101,128, 51,160,111, 8, 69,110, - 69,121, 69,208, 70,150, 71,179, 71,210, 72, 61, 72, 70,225,242, - 237,229,238,233,225,110,128, 5,129,236,239,110,131, 0, 58, 69, - 133, 69,158, 69,177,237,239,110, 2, 69,141, 69,149,229,244,225, - 242,121,128, 32,161,239,243,240,225,227,101,128,255, 26,115, 2, - 69,164, 69,170,233,231,110,128, 32,161,237,225,236,108,128,254, - 85,244,242,233,225,238,231,245,236,225,114, 2, 69,192, 69,202, - 232,225,236,230,237,239,100,128, 2,209,237,239,100,128, 2,208, - 109, 2, 69,214, 70,143,237, 97,134, 0, 44, 69,231, 70, 39, 70, - 50, 70, 62, 70, 92, 70,115, 97, 3, 69,239, 70, 9, 70, 17,226, - 239,246,101, 2, 69,248, 69,254,227,237, 98,128, 3, 19,242,233, - 231,232,244,227,237, 98,128, 3, 21,227,227,229,238,116,128,246, - 195,114, 2, 70, 23, 70, 30,225,226,233, 99,128, 6, 12,237,229, - 238,233,225,110,128, 5, 93,233,238,230,229,242,233,239,114,128, - 246,225,237,239,238,239,243,240,225,227,101,128,255, 12,242,229, - 246,229,242,243,229,100, 2, 70, 75, 70, 86,225,226,239,246,229, - 227,237, 98,128, 3, 20,237,239,100,128, 2,189,115, 2, 70, 98, - 70,105,237,225,236,108,128,254, 80,245,240,229,242,233,239,114, - 128,246,226,244,245,242,238,229,100, 2, 70,126, 70,137,225,226, - 239,246,229,227,237, 98,128, 3, 18,237,239,100,128, 2,187,240, - 225,243,115,128, 38, 60,110, 2, 70,156, 70,165,231,242,245,229, - 238,116,128, 34, 69,116, 2, 70,171, 70,185,239,245,242,233,238, - 244,229,231,242,225,108,128, 34, 46,242,239,108,142, 35, 3, 70, - 219, 70,225, 70,240, 70,255, 71, 43, 71, 88, 71,102, 71,107, 71, - 112, 71,117, 71,123, 71,128, 71,169, 71,174,193,195, 75,128, 0, - 6, 66, 2, 70,231, 70,236,197, 76,128, 0, 7, 83,128, 0, 8, - 67, 2, 70,246, 70,251,193, 78,128, 0, 24, 82,128, 0, 13, 68, - 3, 71, 7, 71, 33, 71, 38, 67, 4, 71, 17, 71, 21, 71, 25, 71, - 29, 49,128, 0, 17, 50,128, 0, 18, 51,128, 0, 19, 52,128, 0, - 20,197, 76,128, 0,127,204, 69,128, 0, 16, 69, 5, 71, 55, 71, - 59, 71, 64, 71, 69, 71, 74, 77,128, 0, 25,206, 81,128, 0, 5, - 207, 84,128, 0, 4,211, 67,128, 0, 27, 84, 2, 71, 80, 71, 84, - 66,128, 0, 23, 88,128, 0, 3, 70, 2, 71, 94, 71, 98, 70,128, - 0, 12, 83,128, 0, 28,199, 83,128, 0, 29,200, 84,128, 0, 9, - 204, 70,128, 0, 10,206,193, 75,128, 0, 21,210, 83,128, 0, 30, - 83, 5, 71,140, 71,144, 71,154, 71,159, 71,164, 73,128, 0, 15, - 79,129, 0, 14, 71,150, 84,128, 0, 2,212, 88,128, 0, 1,213, - 66,128, 0, 26,217, 78,128, 0, 22,213, 83,128, 0, 31,214, 84, - 128, 0, 11,240,249,242,233,231,232,116,129, 0,169, 71,191,115, - 2, 71,197, 71,203,225,238,115,128,248,233,229,242,233,102,128, - 246,217,114, 2, 71,216, 72, 44,238,229,242,226,242,225,227,235, - 229,116, 2, 71,231, 72, 9,236,229,230,116,130, 48, 12, 71,242, - 71,254,232,225,236,230,247,233,228,244,104,128,255, 98,246,229, - 242,244,233,227,225,108,128,254, 65,242,233,231,232,116,130, 48, - 13, 72, 21, 72, 33,232,225,236,230,247,233,228,244,104,128,255, - 99,246,229,242,244,233,227,225,108,128,254, 66,240,239,242,225, - 244,233,239,238,243,241,245,225,242,101,128, 51,127,243,241,245, - 225,242,101,128, 51,199,246,229,242,235,231,243,241,245,225,242, - 101,128, 51,198,240,225,242,229,110,128, 36,158,242,245,250,229, - 233,242,111,128, 32,162,243,244,242,229,244,227,232,229,100,128, - 2,151,245,114, 2, 72,121, 72,139,236,121, 2, 72,128, 72,134, - 225,238,100,128, 34,207,239,114,128, 34,206,242,229,238,227,121, - 128, 0,164,249,114, 4, 72,158, 72,166, 72,173, 72,181,194,242, - 229,246,101,128,246,209,198,236,229,120,128,246,210,226,242,229, - 246,101,128,246,212,230,236,229,120,128,246,213,100,146, 0,100, - 72,228, 74,110, 75,134, 75,194, 76,114, 77, 68, 77,130, 78, 59, - 78, 72, 78, 81, 78,107, 78,132, 78,141, 79,208, 79,216, 79,227, - 79,247, 80, 19, 97, 11, 72,252, 73, 7, 73, 17, 73, 89, 73,152, - 73,163, 73,174, 73,243, 74, 49, 74, 55, 74, 85,225,242,237,229, - 238,233,225,110,128, 5,100,226,229,238,231,225,236,105,128, 9, - 166,100, 5, 73, 29, 73, 38, 73, 44, 73, 58, 73, 74,225,242,225, - 226,233, 99,128, 6, 54,229,246, 97,128, 9, 38,230,233,238,225, - 236,225,242,225,226,233, 99,128,254,190,233,238,233,244,233,225, - 236,225,242,225,226,233, 99,128,254,191,237,229,228,233,225,236, - 225,242,225,226,233, 99,128,254,192,103, 3, 73, 97, 73,114, 73, - 128,229,243,104,129, 5,188, 73,105,232,229,226,242,229,119,128, - 5,188,231,229,114,129, 32, 32, 73,122,228,226,108,128, 32, 33, - 117, 2, 73,134, 73,143,234,225,242,225,244,105,128, 10,166,242, - 237,245,235,232,105,128, 10, 38,232,233,242,225,231,225,238, 97, - 128, 48, 96,235,225,244,225,235,225,238, 97,128, 48,192,108, 3, - 73,182, 73,191, 73,229,225,242,225,226,233, 99,128, 6, 47,229, - 116,130, 5,211, 73,200, 73,220,228,225,231,229,243,104,129,251, - 51, 73,211,232,229,226,242,229,119,128,251, 51,232,229,226,242, - 229,119,128, 5,211,230,233,238,225,236,225,242,225,226,233, 99, - 128,254,170,237,237, 97, 3, 73,253, 74, 6, 74, 18,225,242,225, - 226,233, 99,128, 6, 79,236,239,247,225,242,225,226,233, 99,128, - 6, 79,244,225,238, 97, 2, 74, 27, 74, 41,236,244,239,238,229, - 225,242,225,226,233, 99,128, 6, 76,242,225,226,233, 99,128, 6, - 76,238,228, 97,128, 9,100,242,231, 97, 2, 74, 63, 74, 72,232, - 229,226,242,229,119,128, 5,167,236,229,230,244,232,229,226,242, - 229,119,128, 5,167,243,233,225,240,238,229,245,237,225,244,225, - 227,249,242,233,236,236,233,227,227,237, 98,128, 4,133, 98, 3, - 74,118, 75,115, 75,125,108, 9, 74,138, 74,146, 75, 3, 75, 11, - 75, 27, 75, 38, 75, 56, 75, 70, 75, 81,199,242,225,246,101,128, - 246,211, 97, 2, 74,152, 74,209,238,231,236,229,226,242,225,227, - 235,229,116, 2, 74,168, 74,188,236,229,230,116,129, 48, 10, 74, - 177,246,229,242,244,233,227,225,108,128,254, 61,242,233,231,232, - 116,129, 48, 11, 74,198,246,229,242,244,233,227,225,108,128,254, - 62,114, 2, 74,215, 74,236,227,232,233,238,246,229,242,244,229, - 228,226,229,236,239,247,227,237, 98,128, 3, 43,242,239,119, 2, - 74,244, 74,251,236,229,230,116,128, 33,212,242,233,231,232,116, - 128, 33,210,228,225,238,228, 97,128, 9,101,231,242,225,246,101, - 129,246,214, 75, 21,227,237, 98,128, 3, 15,233,238,244,229,231, - 242,225,108,128, 34, 44,236,239,247,236,233,238,101,129, 32, 23, - 75, 50,227,237, 98,128, 3, 51,239,246,229,242,236,233,238,229, - 227,237, 98,128, 3, 63,240,242,233,237,229,237,239,100,128, 2, - 186,246,229,242,244,233,227,225,108, 2, 75, 94, 75,100,226,225, - 114,128, 32, 22,236,233,238,229,225,226,239,246,229,227,237, 98, - 128, 3, 14,239,240,239,237,239,230,111,128, 49, 9,243,241,245, - 225,242,101,128, 51,200, 99, 4, 75,144, 75,151, 75,160, 75,187, - 225,242,239,110,128, 1, 15,229,228,233,236,236, 97,128, 30, 17, - 233,242, 99, 2, 75,168, 75,173,236,101,128, 36,211,245,237,230, - 236,229,248,226,229,236,239,119,128, 30, 19,242,239,225,116,128, - 1, 17,100, 4, 75,204, 76, 29, 76, 39, 76, 90, 97, 4, 75,214, - 75,224, 75,231, 76, 0,226,229,238,231,225,236,105,128, 9,161, - 228,229,246, 97,128, 9, 33,231,117, 2, 75,238, 75,247,234,225, - 242,225,244,105,128, 10,161,242,237,245,235,232,105,128, 10, 33, - 108, 2, 76, 6, 76, 15,225,242,225,226,233, 99,128, 6,136,230, - 233,238,225,236,225,242,225,226,233, 99,128,251,137,228,232,225, - 228,229,246, 97,128, 9, 92,232, 97, 3, 76, 48, 76, 58, 76, 65, - 226,229,238,231,225,236,105,128, 9,162,228,229,246, 97,128, 9, - 34,231,117, 2, 76, 72, 76, 81,234,225,242,225,244,105,128, 10, - 162,242,237,245,235,232,105,128, 10, 34,239,116, 2, 76, 97, 76, - 106,225,227,227,229,238,116,128, 30, 11,226,229,236,239,119,128, - 30, 13,101, 8, 76,132, 76,185, 76,192, 76,217, 76,227, 76,238, - 77, 27, 77, 63, 99, 2, 76,138, 76,175,233,237,225,236,243,229, - 240,225,242,225,244,239,114, 2, 76,156, 76,165,225,242,225,226, - 233, 99,128, 6,107,240,229,242,243,233,225,110,128, 6,107,249, - 242,233,236,236,233, 99,128, 4, 52,231,242,229,101,128, 0,176, - 232,105, 2, 76,199, 76,208,232,229,226,242,229,119,128, 5,173, - 242,225,231,225,238, 97,128, 48,103,233,227,239,240,244,233, 99, - 128, 3,239,235,225,244,225,235,225,238, 97,128, 48,199,108, 2, - 76,244, 77, 11,229,244,101, 2, 76,252, 77, 3,236,229,230,116, - 128, 35, 43,242,233,231,232,116,128, 35, 38,244, 97,129, 3,180, - 77, 18,244,245,242,238,229,100,128, 1,141,238,239,237,233,238, - 225,244,239,242,237,233,238,245,243,239,238,229,238,245,237,229, - 242,225,244,239,242,226,229,238,231,225,236,105,128, 9,248,250, - 104,128, 2,164,104, 2, 77, 74, 77,124, 97, 3, 77, 82, 77, 92, - 77, 99,226,229,238,231,225,236,105,128, 9,167,228,229,246, 97, - 128, 9, 39,231,117, 2, 77,106, 77,115,234,225,242,225,244,105, - 128, 10,167,242,237,245,235,232,105,128, 10, 39,239,239,107,128, - 2, 87,105, 6, 77,144, 77,193, 77,253, 78, 8, 78, 19, 78, 29, - 97, 2, 77,150, 77,172,236,249,244,233,235,225,244,239,238,239, - 115,129, 3,133, 77,166,227,237, 98,128, 3, 68,237,239,238,100, - 129, 38,102, 77,181,243,245,233,244,247,232,233,244,101,128, 38, - 98,229,242,229,243,233,115,133, 0,168, 77,212, 77,220, 77,231, - 77,237, 77,245,225,227,245,244,101,128,246,215,226,229,236,239, - 247,227,237, 98,128, 3, 36,227,237, 98,128, 3, 8,231,242,225, - 246,101,128,246,216,244,239,238,239,115,128, 3,133,232,233,242, - 225,231,225,238, 97,128, 48, 98,235,225,244,225,235,225,238, 97, - 128, 48,194,244,244,239,237,225,242,107,128, 48, 3,246,105, 2, - 78, 36, 78, 47,228,101,129, 0,247, 78, 43,115,128, 34, 35,243, - 233,239,238,243,236,225,243,104,128, 34, 21,234,229,227,249,242, - 233,236,236,233, 99,128, 4, 82,235,243,232,225,228,101,128, 37, - 147,108, 2, 78, 87, 78, 98,233,238,229,226,229,236,239,119,128, - 30, 15,243,241,245,225,242,101,128, 51,151,109, 2, 78,113, 78, - 121,225,227,242,239,110,128, 1, 17,239,238,239,243,240,225,227, - 101,128,255, 68,238,226,236,239,227,107,128, 37,132,111, 10, 78, - 163, 78,175, 78,185, 78,196, 78,207, 79, 23, 79, 28, 79, 39, 79, - 154, 79,180,227,232,225,228,225,244,232,225,105,128, 14, 14,228, - 229,235,244,232,225,105,128, 14, 20,232,233,242,225,231,225,238, - 97,128, 48,105,235,225,244,225,235,225,238, 97,128, 48,201,236, - 236,225,114,132, 0, 36, 78,222, 78,233, 78,245, 79, 0,233,238, - 230,229,242,233,239,114,128,246,227,237,239,238,239,243,240,225, - 227,101,128,255, 4,239,236,228,243,244,249,236,101,128,247, 36, - 115, 2, 79, 6, 79, 13,237,225,236,108,128,254,105,245,240,229, - 242,233,239,114,128,246,228,238,103,128, 32,171,242,245,243,241, - 245,225,242,101,128, 51, 38,116, 6, 79, 53, 79, 70, 79, 92, 79, - 103, 79,135, 79,142,225,227,227,229,238,116,129, 2,217, 79, 64, - 227,237, 98,128, 3, 7,226,229,236,239,247, 99, 2, 79, 81, 79, - 86,237, 98,128, 3, 35,239,237, 98,128, 3, 35,235,225,244,225, - 235,225,238, 97,128, 48,251,236,229,243,115, 2, 79,112, 79,116, - 105,128, 1, 49,106,129,246,190, 79,122,243,244,242,239,235,229, - 232,239,239,107,128, 2,132,237,225,244,104,128, 34,197,244,229, - 228,227,233,242,227,236,101,128, 37,204,245,226,236,229,249,239, - 228,240,225,244,225,104,129,251, 31, 79,171,232,229,226,242,229, - 119,128,251, 31,247,238,244,225,227,107, 2, 79,191, 79,202,226, - 229,236,239,247,227,237, 98,128, 3, 30,237,239,100,128, 2,213, - 240,225,242,229,110,128, 36,159,243,245,240,229,242,233,239,114, - 128,246,235,116, 2, 79,233, 79,239,225,233,108,128, 2, 86,239, - 240,226,225,114,128, 1,140,117, 2, 79,253, 80, 8,232,233,242, - 225,231,225,238, 97,128, 48,101,235,225,244,225,235,225,238, 97, - 128, 48,197,122,132, 1,243, 80, 31, 80, 40, 80, 59, 80, 96,225, - 236,244,239,238,101,128, 2,163, 99, 2, 80, 46, 80, 53,225,242, - 239,110,128, 1,198,245,242,108,128, 2,165,101, 2, 80, 65, 80, - 85,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236, - 233, 99,128, 4,225,227,249,242,233,236,236,233, 99,128, 4, 85, - 232,229,227,249,242,233,236,236,233, 99,128, 4, 95,101,151, 0, - 101, 80,159, 80,178, 80,212, 81,186, 81,248, 82, 25, 82, 37, 82, - 60, 82,113, 83,225, 84, 27, 84,129, 84,245, 85,124, 85,199, 85, - 230, 86, 36, 86, 89, 87, 24, 87,157, 87,177, 87,221, 88, 56, 97, - 2, 80,165, 80,172,227,245,244,101,128, 0,233,242,244,104,128, - 38, 65, 98, 3, 80,186, 80,195, 80,205,229,238,231,225,236,105, - 128, 9,143,239,240,239,237,239,230,111,128, 49, 28,242,229,246, - 101,128, 1, 21, 99, 5, 80,224, 81, 41, 81, 55, 81, 87, 81,176, - 97, 2, 80,230, 81, 35,238,228,242, 97, 3, 80,241, 80,248, 81, - 3,228,229,246, 97,128, 9, 13,231,245,234,225,242,225,244,105, - 128, 10,141,246,239,247,229,236,243,233,231,110, 2, 81, 17, 81, - 24,228,229,246, 97,128, 9, 69,231,245,234,225,242,225,244,105, - 128, 10,197,242,239,110,128, 1, 27,229,228,233,236,236,225,226, - 242,229,246,101,128, 30, 29,104, 2, 81, 61, 81, 72,225,242,237, - 229,238,233,225,110,128, 5,101,249,233,247,238,225,242,237,229, - 238,233,225,110,128, 5,135,233,242, 99, 2, 81, 95, 81,100,236, - 101,128, 36,212,245,237,230,236,229,120,134, 0,234, 81,121, 81, - 129, 81,137, 81,148, 81,156, 81,168,225,227,245,244,101,128, 30, - 191,226,229,236,239,119,128, 30, 25,228,239,244,226,229,236,239, - 119,128, 30,199,231,242,225,246,101,128, 30,193,232,239,239,235, - 225,226,239,246,101,128, 30,195,244,233,236,228,101,128, 30,197, - 249,242,233,236,236,233, 99,128, 4, 84,100, 4, 81,196, 81,206, - 81,212, 81,222,226,236,231,242,225,246,101,128, 2, 5,229,246, - 97,128, 9, 15,233,229,242,229,243,233,115,128, 0,235,239,116, - 130, 1, 23, 81,231, 81,240,225,227,227,229,238,116,128, 1, 23, - 226,229,236,239,119,128, 30,185,101, 2, 81,254, 82, 9,231,245, - 242,237,245,235,232,105,128, 10, 15,237,225,244,242,225,231,245, - 242,237,245,235,232,105,128, 10, 71,230,227,249,242,233,236,236, - 233, 99,128, 4, 68,103, 2, 82, 43, 82, 50,242,225,246,101,128, - 0,232,245,234,225,242,225,244,105,128, 10,143,104, 4, 82, 70, - 82, 81, 82, 92, 82,102,225,242,237,229,238,233,225,110,128, 5, - 103,226,239,240,239,237,239,230,111,128, 49, 29,233,242,225,231, - 225,238, 97,128, 48, 72,239,239,235,225,226,239,246,101,128, 30, - 187,105, 4, 82,123, 82,134, 83,192, 83,207,226,239,240,239,237, - 239,230,111,128, 49, 31,231,232,116,142, 0, 56, 82,168, 82,177, - 82,187, 82,217, 82,224, 83, 6, 83, 31, 83, 76, 83,110, 83,122, - 83,133, 83,166, 83,174, 83,185,225,242,225,226,233, 99,128, 6, - 104,226,229,238,231,225,236,105,128, 9,238,227,233,242,227,236, - 101,129, 36,103, 82,198,233,238,246,229,242,243,229,243,225,238, - 243,243,229,242,233,102,128, 39,145,228,229,246, 97,128, 9,110, - 229,229,110, 2, 82,232, 82,241,227,233,242,227,236,101,128, 36, - 113,112, 2, 82,247, 82,254,225,242,229,110,128, 36,133,229,242, - 233,239,100,128, 36,153,231,117, 2, 83, 13, 83, 22,234,225,242, - 225,244,105,128, 10,238,242,237,245,235,232,105,128, 10,110,104, - 2, 83, 37, 83, 63, 97, 2, 83, 43, 83, 54,227,235,225,242,225, - 226,233, 99,128, 6,104,238,231,250,232,239,117,128, 48, 40,238, - 239,244,229,226,229,225,237,229,100,128, 38,107,105, 2, 83, 82, - 83,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229, - 110,128, 50, 39,238,230,229,242,233,239,114,128, 32,136,237,239, - 238,239,243,240,225,227,101,128,255, 24,239,236,228,243,244,249, - 236,101,128,247, 56,112, 2, 83,139, 83,146,225,242,229,110,128, - 36,123,229,114, 2, 83,153, 83,159,233,239,100,128, 36,143,243, - 233,225,110,128, 6,248,242,239,237,225,110,128, 33,119,243,245, - 240,229,242,233,239,114,128, 32,120,244,232,225,105,128, 14, 88, - 238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 7,239, - 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4, - 101,107, 2, 83,231, 83,255,225,244,225,235,225,238, 97,129, 48, - 168, 83,243,232,225,236,230,247,233,228,244,104,128,255,116,111, - 2, 84, 5, 84, 20,238,235,225,242,231,245,242,237,245,235,232, - 105,128, 10,116,242,229,225,110,128, 49, 84,108, 3, 84, 35, 84, - 46, 84,107,227,249,242,233,236,236,233, 99,128, 4, 59,101, 2, - 84, 52, 84, 59,237,229,238,116,128, 34, 8,246,229,110, 3, 84, - 69, 84, 78, 84, 99,227,233,242,227,236,101,128, 36,106,112, 2, - 84, 84, 84, 91,225,242,229,110,128, 36,126,229,242,233,239,100, - 128, 36,146,242,239,237,225,110,128, 33,122,236,233,240,243,233, - 115,129, 32, 38, 84,118,246,229,242,244,233,227,225,108,128, 34, - 238,109, 5, 84,141, 84,169, 84,180, 84,200, 84,211,225,227,242, - 239,110,130, 1, 19, 84,153, 84,161,225,227,245,244,101,128, 30, - 23,231,242,225,246,101,128, 30, 21,227,249,242,233,236,236,233, - 99,128, 4, 60,228,225,243,104,129, 32, 20, 84,189,246,229,242, - 244,233,227,225,108,128,254, 49,239,238,239,243,240,225,227,101, - 128,255, 69,112, 2, 84,217, 84,237,232,225,243,233,243,237,225, - 242,235,225,242,237,229,238,233,225,110,128, 5, 91,244,249,243, - 229,116,128, 34, 5,110, 6, 85, 3, 85, 14, 85, 25, 85, 69, 85, - 101, 85,116,226,239,240,239,237,239,230,111,128, 49, 35,227,249, - 242,233,236,236,233, 99,128, 4, 61,100, 2, 85, 31, 85, 50,225, - 243,104,129, 32, 19, 85, 39,246,229,242,244,233,227,225,108,128, - 254, 50,229,243,227,229,238,228,229,242,227,249,242,233,236,236, - 233, 99,128, 4,163,103,130, 1, 75, 85, 77, 85, 88,226,239,240, - 239,237,239,230,111,128, 49, 37,232,229,227,249,242,233,236,236, - 233, 99,128, 4,165,232,239,239,235,227,249,242,233,236,236,233, - 99,128, 4,200,243,240,225,227,101,128, 32, 2,111, 3, 85,132, - 85,140, 85,149,231,239,238,229,107,128, 1, 25,235,239,242,229, - 225,110,128, 49, 83,240,229,110,130, 2, 91, 85,159, 85,168,227, - 236,239,243,229,100,128, 2,154,242,229,246,229,242,243,229,100, - 130, 2, 92, 85,183, 85,192,227,236,239,243,229,100,128, 2, 94, - 232,239,239,107,128, 2, 93,112, 2, 85,205, 85,212,225,242,229, - 110,128, 36,160,243,233,236,239,110,129, 3,181, 85,222,244,239, - 238,239,115,128, 3,173,241,117, 2, 85,237, 86, 25,225,108,130, - 0, 61, 85,246, 86, 2,237,239,238,239,243,240,225,227,101,128, - 255, 29,115, 2, 86, 8, 86, 15,237,225,236,108,128,254,102,245, - 240,229,242,233,239,114,128, 32,124,233,246,225,236,229,238,227, - 101,128, 34, 97,114, 3, 86, 44, 86, 55, 86, 66,226,239,240,239, - 237,239,230,111,128, 49, 38,227,249,242,233,236,236,233, 99,128, - 4, 64,229,246,229,242,243,229,100,129, 2, 88, 86, 78,227,249, - 242,233,236,236,233, 99,128, 4, 77,115, 6, 86,103, 86,114, 86, - 134, 86,215, 87, 4, 87, 14,227,249,242,233,236,236,233, 99,128, - 4, 65,228,229,243,227,229,238,228,229,242,227,249,242,233,236, - 236,233, 99,128, 4,171,104,132, 2,131, 86,146, 86,153, 86,184, - 86,199,227,245,242,108,128, 2,134,239,242,116, 2, 86,161, 86, - 168,228,229,246, 97,128, 9, 14,246,239,247,229,236,243,233,231, - 238,228,229,246, 97,128, 9, 70,242,229,246,229,242,243,229,228, - 236,239,239,112,128, 1,170,243,241,245,225,244,242,229,246,229, - 242,243,229,100,128, 2,133,237,225,236,108, 2, 86,224, 86,235, - 232,233,242,225,231,225,238, 97,128, 48, 71,235,225,244,225,235, - 225,238, 97,129, 48,167, 86,248,232,225,236,230,247,233,228,244, - 104,128,255,106,244,233,237,225,244,229,100,128, 33, 46,245,240, - 229,242,233,239,114,128,246,236,116, 5, 87, 36, 87, 62, 87, 66, - 87, 83, 87,149, 97,130, 3,183, 87, 44, 87, 54,242,237,229,238, - 233,225,110,128, 5,104,244,239,238,239,115,128, 3,174,104,128, - 0,240,233,236,228,101,129, 30,189, 87, 75,226,229,236,239,119, - 128, 30, 27,238,225,232,244, 97, 3, 87, 95, 87,127, 87,136,230, - 239,245,235,104, 2, 87,105, 87,114,232,229,226,242,229,119,128, - 5,145,236,229,230,244,232,229,226,242,229,119,128, 5,145,232, - 229,226,242,229,119,128, 5,145,236,229,230,244,232,229,226,242, - 229,119,128, 5,145,245,242,238,229,100,128, 1,221,117, 2, 87, - 163, 87,172,235,239,242,229,225,110,128, 49, 97,242,111,128, 32, - 172,246,239,247,229,236,243,233,231,110, 3, 87,193, 87,203, 87, - 210,226,229,238,231,225,236,105,128, 9,199,228,229,246, 97,128, - 9, 71,231,245,234,225,242,225,244,105,128, 10,199,120, 2, 87, - 227, 88, 44,227,236,225,109,132, 0, 33, 87,242, 87,253, 88, 24, - 88, 36,225,242,237,229,238,233,225,110,128, 5, 92,100, 2, 88, - 3, 88, 8,226,108,128, 32, 60,239,247,110,129, 0,161, 88, 16, - 243,237,225,236,108,128,247,161,237,239,238,239,243,240,225,227, - 101,128,255, 1,243,237,225,236,108,128,247, 33,233,243,244,229, - 238,244,233,225,108,128, 34, 3,250,104,131, 2,146, 88, 67, 88, - 86, 88, 97, 99, 2, 88, 73, 88, 80,225,242,239,110,128, 1,239, - 245,242,108,128, 2,147,242,229,246,229,242,243,229,100,128, 1, - 185,244,225,233,108,128, 1,186,102,140, 0,102, 88,132, 88,214, - 88,225, 88,234, 88,246, 89, 93, 89,109, 91,117, 91,130, 91,156, - 93, 33, 93, 41, 97, 4, 88,142, 88,149, 88,160, 88,171,228,229, - 246, 97,128, 9, 94,231,245,242,237,245,235,232,105,128, 10, 94, - 232,242,229,238,232,229,233,116,128, 33, 9,244,232, 97, 3, 88, - 181, 88,190, 88,202,225,242,225,226,233, 99,128, 6, 78,236,239, - 247,225,242,225,226,233, 99,128, 6, 78,244,225,238,225,242,225, - 226,233, 99,128, 6, 75,226,239,240,239,237,239,230,111,128, 49, - 8,227,233,242,227,236,101,128, 36,213,228,239,244,225,227,227, - 229,238,116,128, 30, 31,101, 3, 88,254, 89, 76, 89, 86,104, 4, - 89, 8, 89, 31, 89, 45, 89, 61,225,114, 2, 89, 15, 89, 22,225, - 226,233, 99,128, 6, 65,237,229,238,233,225,110,128, 5,134,230, - 233,238,225,236,225,242,225,226,233, 99,128,254,210,233,238,233, - 244,233,225,236,225,242,225,226,233, 99,128,254,211,237,229,228, - 233,225,236,225,242,225,226,233, 99,128,254,212,233,227,239,240, - 244,233, 99,128, 3,229,237,225,236,101,128, 38, 64,102,130,251, - 0, 89,101, 89,105,105,128,251, 3,108,128,251, 4,105,136,251, - 1, 89,129, 89,169, 89,180, 89,202, 90, 68, 90, 85, 90, 93, 90, - 106,230,244,229,229,110, 2, 89,139, 89,148,227,233,242,227,236, - 101,128, 36,110,112, 2, 89,154, 89,161,225,242,229,110,128, 36, - 130,229,242,233,239,100,128, 36,150,231,245,242,229,228,225,243, - 104,128, 32, 18,236,236,229,100, 2, 89,189, 89,195,226,239,120, - 128, 37,160,242,229,227,116,128, 37,172,238,225,108, 5, 89,216, - 89,255, 90, 16, 90, 33, 90, 49,235,225,102,130, 5,218, 89,226, - 89,246,228,225,231,229,243,104,129,251, 58, 89,237,232,229,226, - 242,229,119,128,251, 58,232,229,226,242,229,119,128, 5,218,237, - 229,109,129, 5,221, 90, 7,232,229,226,242,229,119,128, 5,221, - 238,245,110,129, 5,223, 90, 24,232,229,226,242,229,119,128, 5, - 223,240,101,129, 5,227, 90, 40,232,229,226,242,229,119,128, 5, - 227,244,243,225,228,105,129, 5,229, 90, 59,232,229,226,242,229, - 119,128, 5,229,242,243,244,244,239,238,229,227,232,233,238,229, - 243,101,128, 2,201,243,232,229,249,101,128, 37,201,244,225,227, - 249,242,233,236,236,233, 99,128, 4,115,246,101,142, 0, 53, 90, - 139, 90,148, 90,158, 90,188, 90,195, 90,205, 90,230, 91, 1, 91, - 35, 91, 47, 91, 58, 91, 91, 91, 99, 91,110,225,242,225,226,233, - 99,128, 6,101,226,229,238,231,225,236,105,128, 9,235,227,233, - 242,227,236,101,129, 36,100, 90,169,233,238,246,229,242,243,229, - 243,225,238,243,243,229,242,233,102,128, 39,142,228,229,246, 97, - 128, 9,107,229,233,231,232,244,232,115,128, 33, 93,231,117, 2, - 90,212, 90,221,234,225,242,225,244,105,128, 10,235,242,237,245, - 235,232,105,128, 10,107,232, 97, 2, 90,237, 90,248,227,235,225, - 242,225,226,233, 99,128, 6,101,238,231,250,232,239,117,128, 48, - 37,105, 2, 91, 7, 91, 25,228,229,239,231,242,225,240,232,233, - 227,240,225,242,229,110,128, 50, 36,238,230,229,242,233,239,114, - 128, 32,133,237,239,238,239,243,240,225,227,101,128,255, 21,239, - 236,228,243,244,249,236,101,128,247, 53,112, 2, 91, 64, 91, 71, - 225,242,229,110,128, 36,120,229,114, 2, 91, 78, 91, 84,233,239, - 100,128, 36,140,243,233,225,110,128, 6,245,242,239,237,225,110, - 128, 33,116,243,245,240,229,242,233,239,114,128, 32,117,244,232, - 225,105,128, 14, 85,108,129,251, 2, 91,123,239,242,233,110,128, - 1,146,109, 2, 91,136, 91,147,239,238,239,243,240,225,227,101, - 128,255, 70,243,241,245,225,242,101,128, 51,153,111, 4, 91,166, - 91,188, 91,200, 91,207,230, 97, 2, 91,173, 91,181,238,244,232, - 225,105,128, 14, 31,244,232,225,105,128, 14, 29,238,231,237,225, - 238,244,232,225,105,128, 14, 79,242,225,236,108,128, 34, 0,245, - 114,142, 0, 52, 91,240, 91,249, 92, 3, 92, 33, 92, 40, 92, 65, - 92, 92, 92,126, 92,138, 92,157, 92,168, 92,201, 92,209, 92,220, - 225,242,225,226,233, 99,128, 6,100,226,229,238,231,225,236,105, - 128, 9,234,227,233,242,227,236,101,129, 36, 99, 92, 14,233,238, - 246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39, - 141,228,229,246, 97,128, 9,106,231,117, 2, 92, 47, 92, 56,234, - 225,242,225,244,105,128, 10,234,242,237,245,235,232,105,128, 10, - 106,232, 97, 2, 92, 72, 92, 83,227,235,225,242,225,226,233, 99, - 128, 6,100,238,231,250,232,239,117,128, 48, 36,105, 2, 92, 98, - 92,116,228,229,239,231,242,225,240,232,233,227,240,225,242,229, - 110,128, 50, 35,238,230,229,242,233,239,114,128, 32,132,237,239, - 238,239,243,240,225,227,101,128,255, 20,238,245,237,229,242,225, - 244,239,242,226,229,238,231,225,236,105,128, 9,247,239,236,228, - 243,244,249,236,101,128,247, 52,112, 2, 92,174, 92,181,225,242, - 229,110,128, 36,119,229,114, 2, 92,188, 92,194,233,239,100,128, - 36,139,243,233,225,110,128, 6,244,242,239,237,225,110,128, 33, - 115,243,245,240,229,242,233,239,114,128, 32,116,116, 2, 92,226, - 93, 8,229,229,110, 2, 92,234, 92,243,227,233,242,227,236,101, - 128, 36,109,112, 2, 92,249, 93, 0,225,242,229,110,128, 36,129, - 229,242,233,239,100,128, 36,149,104, 2, 93, 14, 93, 19,225,105, - 128, 14, 84,244,239,238,229,227,232,233,238,229,243,101,128, 2, - 203,240,225,242,229,110,128, 36,161,242, 97, 2, 93, 48, 93, 56, - 227,244,233,239,110,128, 32, 68,238, 99,128, 32,163,103,144, 0, - 103, 93, 97, 94, 43, 94, 66, 94,127, 94,144, 95, 65, 96, 58, 96, - 143, 96,156, 97, 14, 97, 39, 97, 67, 97, 89, 98, 34, 98, 56, 98, - 158, 97, 9, 93,117, 93,127, 93,134, 93,141, 93,205, 93,230, 93, - 241, 93,252, 94, 30,226,229,238,231,225,236,105,128, 9,151,227, - 245,244,101,128, 1,245,228,229,246, 97,128, 9, 23,102, 4, 93, - 151, 93,160, 93,174, 93,190,225,242,225,226,233, 99,128, 6,175, - 230,233,238,225,236,225,242,225,226,233, 99,128,251,147,233,238, - 233,244,233,225,236,225,242,225,226,233, 99,128,251,148,237,229, - 228,233,225,236,225,242,225,226,233, 99,128,251,149,231,117, 2, - 93,212, 93,221,234,225,242,225,244,105,128, 10,151,242,237,245, - 235,232,105,128, 10, 23,232,233,242,225,231,225,238, 97,128, 48, - 76,235,225,244,225,235,225,238, 97,128, 48,172,237,237, 97,130, - 3,179, 94, 6, 94, 19,236,225,244,233,238,243,237,225,236,108, - 128, 2, 99,243,245,240,229,242,233,239,114,128, 2,224,238,231, - 233,225,227,239,240,244,233, 99,128, 3,235, 98, 2, 94, 49, 94, - 59,239,240,239,237,239,230,111,128, 49, 13,242,229,246,101,128, - 1, 31, 99, 4, 94, 76, 94, 83, 94, 92, 94,114,225,242,239,110, - 128, 1,231,229,228,233,236,236, 97,128, 1, 35,233,242, 99, 2, - 94,100, 94,105,236,101,128, 36,214,245,237,230,236,229,120,128, - 1, 29,239,237,237,225,225,227,227,229,238,116,128, 1, 35,228, - 239,116,129, 1, 33, 94,135,225,227,227,229,238,116,128, 1, 33, - 101, 6, 94,158, 94,169, 94,180, 94,191, 94,210, 95, 56,227,249, - 242,233,236,236,233, 99,128, 4, 51,232,233,242,225,231,225,238, - 97,128, 48, 82,235,225,244,225,235,225,238, 97,128, 48,178,239, - 237,229,244,242,233,227,225,236,236,249,229,241,245,225,108,128, - 34, 81,114, 3, 94,218, 95, 11, 95, 21,229,243,104, 3, 94,228, - 94,243, 94,252,225,227,227,229,238,244,232,229,226,242,229,119, - 128, 5,156,232,229,226,242,229,119,128, 5,243,237,245,241,228, - 225,237,232,229,226,242,229,119,128, 5,157,237,225,238,228,226, - 236,115,128, 0,223,243,232,225,249,233,109, 2, 95, 32, 95, 47, - 225,227,227,229,238,244,232,229,226,242,229,119,128, 5,158,232, - 229,226,242,229,119,128, 5,244,244,225,237,225,242,107,128, 48, - 19,104, 5, 95, 77, 95,210, 96, 17, 96, 42, 96, 48, 97, 4, 95, - 87, 95, 97, 95,120, 95,145,226,229,238,231,225,236,105,128, 9, - 152,100, 2, 95,103, 95,114,225,242,237,229,238,233,225,110,128, - 5,114,229,246, 97,128, 9, 24,231,117, 2, 95,127, 95,136,234, - 225,242,225,244,105,128, 10,152,242,237,245,235,232,105,128, 10, - 24,233,110, 4, 95,156, 95,165, 95,179, 95,195,225,242,225,226, - 233, 99,128, 6, 58,230,233,238,225,236,225,242,225,226,233, 99, - 128,254,206,233,238,233,244,233,225,236,225,242,225,226,233, 99, - 128,254,207,237,229,228,233,225,236,225,242,225,226,233, 99,128, - 254,208,101, 3, 95,218, 95,239, 96, 0,237,233,228,228,236,229, - 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,149,243, - 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,147, - 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4, - 145,232, 97, 2, 96, 24, 96, 31,228,229,246, 97,128, 9, 90,231, - 245,242,237,245,235,232,105,128, 10, 90,239,239,107,128, 2, 96, - 250,243,241,245,225,242,101,128, 51,147,105, 3, 96, 66, 96, 77, - 96, 88,232,233,242,225,231,225,238, 97,128, 48, 78,235,225,244, - 225,235,225,238, 97,128, 48,174,109, 2, 96, 94, 96,105,225,242, - 237,229,238,233,225,110,128, 5, 99,229,108,130, 5,210, 96,114, - 96,134,228,225,231,229,243,104,129,251, 50, 96,125,232,229,226, - 242,229,119,128,251, 50,232,229,226,242,229,119,128, 5,210,234, - 229,227,249,242,233,236,236,233, 99,128, 4, 83,236,239,244,244, - 225,108, 2, 96,167, 96,184,233,238,246,229,242,244,229,228,243, - 244,242,239,235,101,128, 1,190,243,244,239,112,132, 2,148, 96, - 199, 96,210, 96,216, 96,248,233,238,246,229,242,244,229,100,128, - 2,150,237,239,100,128, 2,192,242,229,246,229,242,243,229,100, - 130, 2,149, 96,231, 96,237,237,239,100,128, 2,193,243,245,240, - 229,242,233,239,114,128, 2,228,243,244,242,239,235,101,129, 2, - 161, 97, 3,242,229,246,229,242,243,229,100,128, 2,162,109, 2, - 97, 20, 97, 28,225,227,242,239,110,128, 30, 33,239,238,239,243, - 240,225,227,101,128,255, 71,111, 2, 97, 45, 97, 56,232,233,242, - 225,231,225,238, 97,128, 48, 84,235,225,244,225,235,225,238, 97, - 128, 48,180,240, 97, 2, 97, 74, 97, 80,242,229,110,128, 36,162, - 243,241,245,225,242,101,128, 51,172,114, 2, 97, 95, 97,192, 97, - 2, 97,101, 97,109,228,233,229,238,116,128, 34, 7,246,101,134, - 0, 96, 97,126, 97,137, 97,154, 97,161, 97,170, 97,182,226,229, - 236,239,247,227,237, 98,128, 3, 22, 99, 2, 97,143, 97,148,237, - 98,128, 3, 0,239,237, 98,128, 3, 0,228,229,246, 97,128, 9, - 83,236,239,247,237,239,100,128, 2,206,237,239,238,239,243,240, - 225,227,101,128,255, 64,244,239,238,229,227,237, 98,128, 3, 64, - 229,225,244,229,114,132, 0, 62, 97,208, 97,227, 97,239, 98, 26, - 229,241,245,225,108,129, 34,101, 97,218,239,242,236,229,243,115, - 128, 34,219,237,239,238,239,243,240,225,227,101,128,255, 30,111, - 2, 97,245, 98, 15,114, 2, 97,251, 98, 8,229,241,245,233,246, - 225,236,229,238,116,128, 34,115,236,229,243,115,128, 34,119,246, - 229,242,229,241,245,225,108,128, 34,103,243,237,225,236,108,128, - 254,101,115, 2, 98, 40, 98, 48,227,242,233,240,116,128, 2, 97, - 244,242,239,235,101,128, 1,229,117, 4, 98, 66, 98, 77, 98,134, - 98,145,232,233,242,225,231,225,238, 97,128, 48, 80,233,108, 2, - 98, 84, 98,109,236,229,237,239,116, 2, 98, 94, 98,101,236,229, - 230,116,128, 0,171,242,233,231,232,116,128, 0,187,243,233,238, - 231,108, 2, 98,119, 98,126,236,229,230,116,128, 32, 57,242,233, - 231,232,116,128, 32, 58,235,225,244,225,235,225,238, 97,128, 48, - 176,242,225,237,245,243,241,245,225,242,101,128, 51, 24,249,243, - 241,245,225,242,101,128, 51,201,104,144, 0,104, 98,204,101, 90, - 101,125,101,162,101,202,103, 90,103,110,104, 75,104, 87,104, 99, - 105,167,105,175,105,186,105,195,106, 19,106, 23, 97, 13, 98,232, - 99, 15, 99, 25, 99, 55, 99, 80, 99,158, 99,170, 99,195, 99,210, - 99,239, 99,252,100, 54,100, 63, 97, 2, 98,238, 99, 1,226,235, - 232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128, 4, - 169,236,244,239,238,229,225,242,225,226,233, 99,128, 6,193,226, - 229,238,231,225,236,105,128, 9,185,228,101, 2, 99, 32, 99, 50, - 243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128, - 4,179,246, 97,128, 9, 57,231,117, 2, 99, 62, 99, 71,234,225, - 242,225,244,105,128, 10,185,242,237,245,235,232,105,128, 10, 57, - 104, 4, 99, 90, 99, 99, 99,113, 99,143,225,242,225,226,233, 99, - 128, 6, 45,230,233,238,225,236,225,242,225,226,233, 99,128,254, - 162,105, 2, 99,119, 99,134,238,233,244,233,225,236,225,242,225, - 226,233, 99,128,254,163,242,225,231,225,238, 97,128, 48,111,237, - 229,228,233,225,236,225,242,225,226,233, 99,128,254,164,233,244, - 245,243,241,245,225,242,101,128, 51, 42,235,225,244,225,235,225, - 238, 97,129, 48,207, 99,183,232,225,236,230,247,233,228,244,104, - 128,255,138,236,225,238,244,231,245,242,237,245,235,232,105,128, - 10, 77,237,250, 97, 2, 99,218, 99,227,225,242,225,226,233, 99, - 128, 6, 33,236,239,247,225,242,225,226,233, 99,128, 6, 33,238, - 231,245,236,230,233,236,236,229,114,128, 49,100,114, 2,100, 2, - 100, 18,228,243,233,231,238,227,249,242,233,236,236,233, 99,128, - 4, 74,240,239,239,110, 2,100, 27,100, 40,236,229,230,244,226, - 225,242,226,245,112,128, 33,188,242,233,231,232,244,226,225,242, - 226,245,112,128, 33,192,243,241,245,225,242,101,128, 51,202,244, - 225,102, 3,100, 73,100,165,101, 0,240,225,244,225,104,134, 5, - 178,100, 93,100, 98,100,112,100,121,100,136,100,152,177, 54,128, - 5,178, 50, 2,100,104,100,108, 51,128, 5,178,102,128, 5,178, - 232,229,226,242,229,119,128, 5,178,238,225,242,242,239,247,232, - 229,226,242,229,119,128, 5,178,241,245,225,242,244,229,242,232, - 229,226,242,229,119,128, 5,178,247,233,228,229,232,229,226,242, - 229,119,128, 5,178,241,225,237,225,244,115,135, 5,179,100,188, - 100,193,100,198,100,203,100,212,100,227,100,243,177, 98,128, 5, - 179,178, 56,128, 5,179,179, 52,128, 5,179,232,229,226,242,229, - 119,128, 5,179,238,225,242,242,239,247,232,229,226,242,229,119, - 128, 5,179,241,245,225,242,244,229,242,232,229,226,242,229,119, - 128, 5,179,247,233,228,229,232,229,226,242,229,119,128, 5,179, - 243,229,231,239,108,135, 5,177,101, 22,101, 27,101, 32,101, 37, - 101, 46,101, 61,101, 77,177, 55,128, 5,177,178, 52,128, 5,177, - 179, 48,128, 5,177,232,229,226,242,229,119,128, 5,177,238,225, - 242,242,239,247,232,229,226,242,229,119,128, 5,177,241,245,225, - 242,244,229,242,232,229,226,242,229,119,128, 5,177,247,233,228, - 229,232,229,226,242,229,119,128, 5,177, 98, 3,101, 98,101,103, - 101,113,225,114,128, 1, 39,239,240,239,237,239,230,111,128, 49, - 15,242,229,246,229,226,229,236,239,119,128, 30, 43, 99, 2,101, - 131,101,140,229,228,233,236,236, 97,128, 30, 41,233,242, 99, 2, - 101,148,101,153,236,101,128, 36,215,245,237,230,236,229,120,128, - 1, 37,100, 2,101,168,101,178,233,229,242,229,243,233,115,128, - 30, 39,239,116, 2,101,185,101,194,225,227,227,229,238,116,128, - 30, 35,226,229,236,239,119,128, 30, 37,101,136, 5,212,101,222, - 101,255,102, 19,102,248,103, 8,103, 53,103, 62,103, 75,225,242, - 116,129, 38,101,101,230,243,245,233,116, 2,101,239,101,247,226, - 236,225,227,107,128, 38,101,247,232,233,244,101,128, 38, 97,228, - 225,231,229,243,104,129,251, 52,102, 10,232,229,226,242,229,119, - 128,251, 52,104, 6,102, 33,102, 61,102, 69,102,119,102,165,102, - 214, 97, 2,102, 39,102, 53,236,244,239,238,229,225,242,225,226, - 233, 99,128, 6,193,242,225,226,233, 99,128, 6, 71,229,226,242, - 229,119,128, 5,212,230,233,238,225,236, 97, 2,102, 80,102,111, - 236,116, 2,102, 87,102, 99,239,238,229,225,242,225,226,233, 99, - 128,251,167,244,247,239,225,242,225,226,233, 99,128,254,234,242, - 225,226,233, 99,128,254,234,232,225,237,250,225,225,226,239,246, - 101, 2,102,134,102,148,230,233,238,225,236,225,242,225,226,233, - 99,128,251,165,233,243,239,236,225,244,229,228,225,242,225,226, - 233, 99,128,251,164,105, 2,102,171,102,205,238,233,244,233,225, - 236, 97, 2,102,183,102,197,236,244,239,238,229,225,242,225,226, - 233, 99,128,251,168,242,225,226,233, 99,128,254,235,242,225,231, - 225,238, 97,128, 48,120,237,229,228,233,225,236, 97, 2,102,226, - 102,240,236,244,239,238,229,225,242,225,226,233, 99,128,251,169, - 242,225,226,233, 99,128,254,236,233,243,229,233,229,242,225,243, - 241,245,225,242,101,128, 51,123,107, 2,103, 14,103, 38,225,244, - 225,235,225,238, 97,129, 48,216,103, 26,232,225,236,230,247,233, - 228,244,104,128,255,141,245,244,225,225,242,245,243,241,245,225, - 242,101,128, 51, 54,238,231,232,239,239,107,128, 2,103,242,245, - 244,245,243,241,245,225,242,101,128, 51, 57,116,129, 5,215,103, - 81,232,229,226,242,229,119,128, 5,215,232,239,239,107,129, 2, - 102,103, 99,243,245,240,229,242,233,239,114,128, 2,177,105, 4, - 103,120,103,205,103,216,103,241,229,245,104, 4,103,132,103,167, - 103,182,103,191, 97, 2,103,138,103,153,227,233,242,227,236,229, - 235,239,242,229,225,110,128, 50,123,240,225,242,229,238,235,239, - 242,229,225,110,128, 50, 27,227,233,242,227,236,229,235,239,242, - 229,225,110,128, 50,109,235,239,242,229,225,110,128, 49, 78,240, - 225,242,229,238,235,239,242,229,225,110,128, 50, 13,232,233,242, - 225,231,225,238, 97,128, 48,114,235,225,244,225,235,225,238, 97, - 129, 48,210,103,229,232,225,236,230,247,233,228,244,104,128,255, - 139,242,233,113,134, 5,180,104, 3,104, 8,104, 22,104, 31,104, - 46,104, 62,177, 52,128, 5,180, 50, 2,104, 14,104, 18, 49,128, - 5,180,100,128, 5,180,232,229,226,242,229,119,128, 5,180,238, - 225,242,242,239,247,232,229,226,242,229,119,128, 5,180,241,245, - 225,242,244,229,242,232,229,226,242,229,119,128, 5,180,247,233, - 228,229,232,229,226,242,229,119,128, 5,180,236,233,238,229,226, - 229,236,239,119,128, 30,150,237,239,238,239,243,240,225,227,101, - 128,255, 72,111, 9,104,119,104,130,104,154,104,179,105, 11,105, - 24,105,110,105,150,105,161,225,242,237,229,238,233,225,110,128, - 5,112,232,105, 2,104,137,104,145,240,244,232,225,105,128, 14, - 43,242,225,231,225,238, 97,128, 48,123,235,225,244,225,235,225, - 238, 97,129, 48,219,104,167,232,225,236,230,247,233,228,244,104, - 128,255,142,236,225,109,135, 5,185,104,199,104,204,104,209,104, - 214,104,223,104,238,104,254,177, 57,128, 5,185,178, 54,128, 5, - 185,179, 50,128, 5,185,232,229,226,242,229,119,128, 5,185,238, - 225,242,242,239,247,232,229,226,242,229,119,128, 5,185,241,245, - 225,242,244,229,242,232,229,226,242,229,119,128, 5,185,247,233, - 228,229,232,229,226,242,229,119,128, 5,185,238,239,235,232,245, - 235,244,232,225,105,128, 14, 46,111, 2,105, 30,105,100,107, 4, - 105, 40,105, 52,105, 58,105, 80,225,226,239,246,229,227,239,237, - 98,128, 3, 9,227,237, 98,128, 3, 9,240,225,236,225,244,225, - 236,233,250,229,228,226,229,236,239,247,227,237, 98,128, 3, 33, - 242,229,244,242,239,230,236,229,248,226,229,236,239,247,227,237, - 98,128, 3, 34,238,243,241,245,225,242,101,128, 51, 66,114, 2, - 105,116,105,143,105, 2,105,122,105,131,227,239,240,244,233, 99, - 128, 3,233,250,239,238,244,225,236,226,225,114,128, 32, 21,238, - 227,237, 98,128, 3, 27,244,243,240,242,233,238,231,115,128, 38, - 104,245,243,101,128, 35, 2,240,225,242,229,110,128, 36,163,243, - 245,240,229,242,233,239,114,128, 2,176,244,245,242,238,229,100, - 128, 2,101,117, 4,105,205,105,216,105,229,105,254,232,233,242, - 225,231,225,238, 97,128, 48,117,233,233,244,239,243,241,245,225, - 242,101,128, 51, 51,235,225,244,225,235,225,238, 97,129, 48,213, - 105,242,232,225,236,230,247,233,228,244,104,128,255,140,238,231, - 225,242,245,237,236,225,245,116,129, 2,221,106, 13,227,237, 98, - 128, 3, 11,118,128, 1,149,249,240,232,229,110,132, 0, 45,106, - 39,106, 50,106, 62,106, 85,233,238,230,229,242,233,239,114,128, - 246,229,237,239,238,239,243,240,225,227,101,128,255, 13,115, 2, - 106, 68,106, 75,237,225,236,108,128,254, 99,245,240,229,242,233, - 239,114,128,246,230,244,247,111,128, 32, 16,105,149, 0,105,106, - 137,106,160,106,194,106,241,110,123,110,243,111, 24,111, 51,111, - 213,111,217,111,255,112, 21,112,105,113, 14,113, 89,113, 97,113, - 110,113,197,113,254,114, 26,114, 70,225, 99, 2,106,144,106,150, - 245,244,101,128, 0,237,249,242,233,236,236,233, 99,128, 4, 79, - 98, 3,106,168,106,177,106,187,229,238,231,225,236,105,128, 9, - 135,239,240,239,237,239,230,111,128, 49, 39,242,229,246,101,128, - 1, 45, 99, 3,106,202,106,209,106,231,225,242,239,110,128, 1, - 208,233,242, 99, 2,106,217,106,222,236,101,128, 36,216,245,237, - 230,236,229,120,128, 0,238,249,242,233,236,236,233, 99,128, 4, - 86,100, 4,106,251,107, 5,110, 80,110,113,226,236,231,242,225, - 246,101,128, 2, 9,101, 2,107, 11,110, 75,239,231,242,225,240, - 104, 7,107, 32,107, 46,107, 59,109,244,110, 19,110, 32,110, 44, - 229,225,242,244,232,227,233,242,227,236,101,128, 50,143,230,233, - 242,229,227,233,242,227,236,101,128, 50,139,233, 99, 14,107, 90, - 107,106,107,205,108, 3,108, 69,108, 98,108,114,108,171,108,220, - 108,232,109, 3,109, 70,109,208,109,237,225,236,236,233,225,238, - 227,229,240,225,242,229,110,128, 50, 63, 99, 4,107,116,107,127, - 107,141,107,148,225,236,236,240,225,242,229,110,128, 50, 58,229, - 238,244,242,229,227,233,242,227,236,101,128, 50,165,236,239,243, - 101,128, 48, 6,111, 3,107,156,107,171,107,191,237,237, 97,129, - 48, 1,107,164,236,229,230,116,128,255,100,238,231,242,225,244, - 245,236,225,244,233,239,238,240,225,242,229,110,128, 50, 55,242, - 242,229,227,244,227,233,242,227,236,101,128, 50,163,101, 3,107, - 213,107,225,107,242,225,242,244,232,240,225,242,229,110,128, 50, - 47,238,244,229,242,240,242,233,243,229,240,225,242,229,110,128, - 50, 61,248,227,229,236,236,229,238,244,227,233,242,227,236,101, - 128, 50,157,102, 2,108, 9,108, 24,229,243,244,233,246,225,236, - 240,225,242,229,110,128, 50, 64,105, 2,108, 30,108, 59,238,225, - 238,227,233,225,108, 2,108, 42,108, 51,227,233,242,227,236,101, - 128, 50,150,240,225,242,229,110,128, 50, 54,242,229,240,225,242, - 229,110,128, 50, 43,104, 2,108, 75,108, 86,225,246,229,240,225, - 242,229,110,128, 50, 50,233,231,232,227,233,242,227,236,101,128, - 50,164,233,244,229,242,225,244,233,239,238,237,225,242,107,128, - 48, 5,108, 3,108,122,108,148,108,160,225,226,239,114, 2,108, - 131,108,140,227,233,242,227,236,101,128, 50,152,240,225,242,229, - 110,128, 50, 56,229,230,244,227,233,242,227,236,101,128, 50,167, - 239,247,227,233,242,227,236,101,128, 50,166,109, 2,108,177,108, - 209,101, 2,108,183,108,198,228,233,227,233,238,229,227,233,242, - 227,236,101,128, 50,169,244,225,236,240,225,242,229,110,128, 50, - 46,239,239,238,240,225,242,229,110,128, 50, 42,238,225,237,229, - 240,225,242,229,110,128, 50, 52,112, 2,108,238,108,246,229,242, - 233,239,100,128, 48, 2,242,233,238,244,227,233,242,227,236,101, - 128, 50,158,114, 2,109, 9,109, 57,101, 3,109, 17,109, 28,109, - 43,225,227,232,240,225,242,229,110,128, 50, 67,240,242,229,243, - 229,238,244,240,225,242,229,110,128, 50, 57,243,239,245,242,227, - 229,240,225,242,229,110,128, 50, 62,233,231,232,244,227,233,242, - 227,236,101,128, 50,168,115, 5,109, 82,109,111,109,125,109,150, - 109,178,101, 2,109, 88,109,101,227,242,229,244,227,233,242,227, - 236,101,128, 50,153,236,230,240,225,242,229,110,128, 50, 66,239, - 227,233,229,244,249,240,225,242,229,110,128, 50, 51,112, 2,109, - 131,109,137,225,227,101,128, 48, 0,229,227,233,225,236,240,225, - 242,229,110,128, 50, 53,116, 2,109,156,109,167,239,227,235,240, - 225,242,229,110,128, 50, 49,245,228,249,240,225,242,229,110,128, - 50, 59,117, 2,109,184,109,193,238,240,225,242,229,110,128, 50, - 48,240,229,242,246,233,243,229,240,225,242,229,110,128, 50, 60, - 119, 2,109,214,109,226,225,244,229,242,240,225,242,229,110,128, - 50, 44,239,239,228,240,225,242,229,110,128, 50, 45,250,229,242, - 111,128, 48, 7,109, 2,109,250,110, 7,229,244,225,236,227,233, - 242,227,236,101,128, 50,142,239,239,238,227,233,242,227,236,101, - 128, 50,138,238,225,237,229,227,233,242,227,236,101,128, 50,148, - 243,245,238,227,233,242,227,236,101,128, 50,144,119, 2,110, 50, - 110, 63,225,244,229,242,227,233,242,227,236,101,128, 50,140,239, - 239,228,227,233,242,227,236,101,128, 50,141,246, 97,128, 9, 7, - 233,229,242,229,243,233,115,130, 0,239,110, 94,110,102,225,227, - 245,244,101,128, 30, 47,227,249,242,233,236,236,233, 99,128, 4, - 229,239,244,226,229,236,239,119,128, 30,203,101, 3,110,131,110, - 147,110,158,226,242,229,246,229,227,249,242,233,236,236,233, 99, - 128, 4,215,227,249,242,233,236,236,233, 99,128, 4, 53,245,238, - 103, 4,110,170,110,205,110,220,110,229, 97, 2,110,176,110,191, - 227,233,242,227,236,229,235,239,242,229,225,110,128, 50,117,240, - 225,242,229,238,235,239,242,229,225,110,128, 50, 21,227,233,242, - 227,236,229,235,239,242,229,225,110,128, 50,103,235,239,242,229, - 225,110,128, 49, 71,240,225,242,229,238,235,239,242,229,225,110, - 128, 50, 7,103, 2,110,249,111, 0,242,225,246,101,128, 0,236, - 117, 2,111, 6,111, 15,234,225,242,225,244,105,128, 10,135,242, - 237,245,235,232,105,128, 10, 7,104, 2,111, 30,111, 40,233,242, - 225,231,225,238, 97,128, 48, 68,239,239,235,225,226,239,246,101, - 128, 30,201,105, 8,111, 69,111, 79,111, 90,111, 97,111,122,111, - 138,111,153,111,169,226,229,238,231,225,236,105,128, 9,136,227, - 249,242,233,236,236,233, 99,128, 4, 56,228,229,246, 97,128, 9, - 8,231,117, 2,111,104,111,113,234,225,242,225,244,105,128, 10, - 136,242,237,245,235,232,105,128, 10, 8,237,225,244,242,225,231, - 245,242,237,245,235,232,105,128, 10, 64,238,246,229,242,244,229, - 228,226,242,229,246,101,128, 2, 11,243,232,239,242,244,227,249, - 242,233,236,236,233, 99,128, 4, 57,246,239,247,229,236,243,233, - 231,110, 3,111,185,111,195,111,202,226,229,238,231,225,236,105, - 128, 9,192,228,229,246, 97,128, 9, 64,231,245,234,225,242,225, - 244,105,128, 10,192,106,128, 1, 51,107, 2,111,223,111,247,225, - 244,225,235,225,238, 97,129, 48,164,111,235,232,225,236,230,247, - 233,228,244,104,128,255,114,239,242,229,225,110,128, 49, 99,108, - 2,112, 5,112, 10,228,101,128, 2,220,245,249,232,229,226,242, - 229,119,128, 5,172,109, 2,112, 27,112, 94, 97, 3,112, 35,112, - 55,112, 80,227,242,239,110,129, 1, 43,112, 44,227,249,242,233, - 236,236,233, 99,128, 4,227,231,229,239,242,225,240,240,242,239, - 248,233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 83, - 244,242,225,231,245,242,237,245,235,232,105,128, 10, 63,239,238, - 239,243,240,225,227,101,128,255, 73,110, 5,112,117,112,127,112, - 136,112,148,112,232,227,242,229,237,229,238,116,128, 34, 6,230, - 233,238,233,244,121,128, 34, 30,233,225,242,237,229,238,233,225, - 110,128, 5,107,116, 2,112,154,112,222,101, 2,112,160,112,211, - 231,242,225,108,131, 34, 43,112,173,112,191,112,196, 98, 2,112, - 179,112,187,239,244,244,239,109,128, 35, 33,116,128, 35, 33,229, - 120,128,248,245,116, 2,112,202,112,207,239,112,128, 35, 32,112, - 128, 35, 32,242,243,229,227,244,233,239,110,128, 34, 41,233,243, - 241,245,225,242,101,128, 51, 5,118, 3,112,240,112,249,113, 2, - 226,245,236,236,229,116,128, 37,216,227,233,242,227,236,101,128, - 37,217,243,237,233,236,229,230,225,227,101,128, 38, 59,111, 3, - 113, 22,113, 33,113, 41,227,249,242,233,236,236,233, 99,128, 4, - 81,231,239,238,229,107,128, 1, 47,244, 97,131, 3,185,113, 52, - 113, 73,113, 81,228,233,229,242,229,243,233,115,129, 3,202,113, - 65,244,239,238,239,115,128, 3,144,236,225,244,233,110,128, 2, - 105,244,239,238,239,115,128, 3,175,240,225,242,229,110,128, 36, - 164,242,233,231,245,242,237,245,235,232,105,128, 10,114,115, 4, - 113,120,113,165,113,179,113,187,237,225,236,108, 2,113,129,113, - 140,232,233,242,225,231,225,238, 97,128, 48, 67,235,225,244,225, - 235,225,238, 97,129, 48,163,113,153,232,225,236,230,247,233,228, - 244,104,128,255,104,243,232,225,242,226,229,238,231,225,236,105, - 128, 9,250,244,242,239,235,101,128, 2,104,245,240,229,242,233, - 239,114,128,246,237,116, 2,113,203,113,237,229,242,225,244,233, - 239,110, 2,113,215,113,226,232,233,242,225,231,225,238, 97,128, - 48,157,235,225,244,225,235,225,238, 97,128, 48,253,233,236,228, - 101,129, 1, 41,113,246,226,229,236,239,119,128, 30, 45,117, 2, - 114, 4,114, 15,226,239,240,239,237,239,230,111,128, 49, 41,227, - 249,242,233,236,236,233, 99,128, 4, 78,246,239,247,229,236,243, - 233,231,110, 3,114, 42,114, 52,114, 59,226,229,238,231,225,236, - 105,128, 9,191,228,229,246, 97,128, 9, 63,231,245,234,225,242, - 225,244,105,128, 10,191,250,232,233,244,243, 97, 2,114, 81,114, - 92,227,249,242,233,236,236,233, 99,128, 4,117,228,226,236,231, - 242,225,246,229,227,249,242,233,236,236,233, 99,128, 4,119,106, - 138, 0,106,114,135,114,198,114,209,115, 3,115, 19,115,132,115, - 201,115,206,115,218,115,226, 97, 4,114,145,114,156,114,166,114, - 173,225,242,237,229,238,233,225,110,128, 5,113,226,229,238,231, - 225,236,105,128, 9,156,228,229,246, 97,128, 9, 28,231,117, 2, - 114,180,114,189,234,225,242,225,244,105,128, 10,156,242,237,245, - 235,232,105,128, 10, 28,226,239,240,239,237,239,230,111,128, 49, - 16, 99, 3,114,217,114,224,114,246,225,242,239,110,128, 1,240, - 233,242, 99, 2,114,232,114,237,236,101,128, 36,217,245,237,230, - 236,229,120,128, 1, 53,242,239,243,243,229,228,244,225,233,108, - 128, 2,157,228,239,244,236,229,243,243,243,244,242,239,235,101, - 128, 2, 95,101, 3,115, 27,115, 38,115,103,227,249,242,233,236, - 236,233, 99,128, 4, 88,229,109, 4,115, 49,115, 58,115, 72,115, - 88,225,242,225,226,233, 99,128, 6, 44,230,233,238,225,236,225, - 242,225,226,233, 99,128,254,158,233,238,233,244,233,225,236,225, - 242,225,226,233, 99,128,254,159,237,229,228,233,225,236,225,242, - 225,226,233, 99,128,254,160,104, 2,115,109,115,118,225,242,225, - 226,233, 99,128, 6,152,230,233,238,225,236,225,242,225,226,233, - 99,128,251,139,104, 2,115,138,115,188, 97, 3,115,146,115,156, - 115,163,226,229,238,231,225,236,105,128, 9,157,228,229,246, 97, - 128, 9, 29,231,117, 2,115,170,115,179,234,225,242,225,244,105, - 128, 10,157,242,237,245,235,232,105,128, 10, 29,229,232,225,242, - 237,229,238,233,225,110,128, 5,123,233,115,128, 48, 4,237,239, - 238,239,243,240,225,227,101,128,255, 74,240,225,242,229,110,128, - 36,165,243,245,240,229,242,233,239,114,128, 2,178,107,146, 0, - 107,116, 21,118,110,118,121,118,183,118,194,119, 28,119, 42,120, - 150,121, 90,121,103,121,129,121,178,122, 60,122, 82,122, 95,122, - 118,122,160,122,170, 97, 12,116, 47,116, 79,116,101,116,131,116, - 245,117, 14,117, 44,117, 69,117,175,117,189,118, 56,118, 85, 98, - 2,116, 53,116, 70,225,243,232,235,233,242,227,249,242,233,236, - 236,233, 99,128, 4,161,229,238,231,225,236,105,128, 9,149, 99, - 2,116, 85,116, 91,245,244,101,128, 30, 49,249,242,233,236,236, - 233, 99,128, 4, 58,228,101, 2,116,108,116,126,243,227,229,238, - 228,229,242,227,249,242,233,236,236,233, 99,128, 4,155,246, 97, - 128, 9, 21,102,135, 5,219,116,149,116,158,116,178,116,192,116, - 201,116,217,116,232,225,242,225,226,233, 99,128, 6, 67,228,225, - 231,229,243,104,129,251, 59,116,169,232,229,226,242,229,119,128, - 251, 59,230,233,238,225,236,225,242,225,226,233, 99,128,254,218, - 232,229,226,242,229,119,128, 5,219,233,238,233,244,233,225,236, - 225,242,225,226,233, 99,128,254,219,237,229,228,233,225,236,225, - 242,225,226,233, 99,128,254,220,242,225,230,229,232,229,226,242, - 229,119,128,251, 77,231,117, 2,116,252,117, 5,234,225,242,225, - 244,105,128, 10,149,242,237,245,235,232,105,128, 10, 21,104, 2, - 117, 20,117, 30,233,242,225,231,225,238, 97,128, 48, 75,239,239, - 235,227,249,242,233,236,236,233, 99,128, 4,196,235,225,244,225, - 235,225,238, 97,129, 48,171,117, 57,232,225,236,230,247,233,228, - 244,104,128,255,118,112, 2,117, 75,117, 96,240, 97,129, 3,186, - 117, 82,243,249,237,226,239,236,231,242,229,229,107,128, 3,240, - 249,229,239,245,110, 3,117,108,117,122,117,156,237,233,229,245, - 237,235,239,242,229,225,110,128, 49,113,112, 2,117,128,117,143, - 232,233,229,245,240,232,235,239,242,229,225,110,128, 49,132,233, - 229,245,240,235,239,242,229,225,110,128, 49,120,243,243,225,238, - 231,240,233,229,245,240,235,239,242,229,225,110,128, 49,121,242, - 239,242,233,233,243,241,245,225,242,101,128, 51, 13,115, 5,117, - 201,117,245,118, 4,118, 12,118, 40,232,233,228,225,225,245,244, - 111, 2,117,214,117,223,225,242,225,226,233, 99,128, 6, 64,238, - 239,243,233,228,229,226,229,225,242,233,238,231,225,242,225,226, - 233, 99,128, 6, 64,237,225,236,236,235,225,244,225,235,225,238, - 97,128, 48,245,241,245,225,242,101,128, 51,132,242, 97, 2,118, - 19,118, 28,225,242,225,226,233, 99,128, 6, 80,244,225,238,225, - 242,225,226,233, 99,128, 6, 77,244,242,239,235,229,227,249,242, - 233,236,236,233, 99,128, 4,159,244,225,232,233,242,225,240,242, - 239,236,239,238,231,237,225,242,235,232,225,236,230,247,233,228, - 244,104,128,255,112,246,229,242,244,233,227,225,236,243,244,242, - 239,235,229,227,249,242,233,236,236,233, 99,128, 4,157,226,239, - 240,239,237,239,230,111,128, 49, 14, 99, 4,118,131,118,153,118, - 162,118,170, 97, 2,118,137,118,147,236,243,241,245,225,242,101, - 128, 51,137,242,239,110,128, 1,233,229,228,233,236,236, 97,128, - 1, 55,233,242,227,236,101,128, 36,218,239,237,237,225,225,227, - 227,229,238,116,128, 1, 55,228,239,244,226,229,236,239,119,128, - 30, 51,101, 4,118,204,118,231,119, 0,119, 12,104, 2,118,210, - 118,221,225,242,237,229,238,233,225,110,128, 5,132,233,242,225, - 231,225,238, 97,128, 48, 81,235,225,244,225,235,225,238, 97,129, - 48,177,118,244,232,225,236,230,247,233,228,244,104,128,255,121, - 238,225,242,237,229,238,233,225,110,128, 5,111,243,237,225,236, - 236,235,225,244,225,235,225,238, 97,128, 48,246,231,242,229,229, - 238,236,225,238,228,233, 99,128, 1, 56,104, 6,119, 56,119,185, - 119,196,119,221,120, 52,120,140, 97, 5,119, 68,119, 78,119, 89, - 119, 96,119,121,226,229,238,231,225,236,105,128, 9,150,227,249, - 242,233,236,236,233, 99,128, 4, 69,228,229,246, 97,128, 9, 22, - 231,117, 2,119,103,119,112,234,225,242,225,244,105,128, 10,150, - 242,237,245,235,232,105,128, 10, 22,104, 4,119,131,119,140,119, - 154,119,170,225,242,225,226,233, 99,128, 6, 46,230,233,238,225, - 236,225,242,225,226,233, 99,128,254,166,233,238,233,244,233,225, - 236,225,242,225,226,233, 99,128,254,167,237,229,228,233,225,236, - 225,242,225,226,233, 99,128,254,168,229,233,227,239,240,244,233, - 99,128, 3,231,232, 97, 2,119,203,119,210,228,229,246, 97,128, - 9, 89,231,245,242,237,245,235,232,105,128, 10, 89,233,229,245, - 235,104, 4,119,235,120, 14,120, 29,120, 38, 97, 2,119,241,120, - 0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,120, - 240,225,242,229,238,235,239,242,229,225,110,128, 50, 24,227,233, - 242,227,236,229,235,239,242,229,225,110,128, 50,106,235,239,242, - 229,225,110,128, 49, 75,240,225,242,229,238,235,239,242,229,225, - 110,128, 50, 10,111, 4,120, 62,120,111,120,121,120,126,235,104, - 4,120, 73,120, 82,120, 91,120,101,225,233,244,232,225,105,128, - 14, 2,239,238,244,232,225,105,128, 14, 5,245,225,244,244,232, - 225,105,128, 14, 3,247,225,233,244,232,225,105,128, 14, 4,237, - 245,244,244,232,225,105,128, 14, 91,239,107,128, 1,153,242,225, - 235,232,225,238,231,244,232,225,105,128, 14, 6,250,243,241,245, - 225,242,101,128, 51,145,105, 4,120,160,120,171,120,196,120,245, - 232,233,242,225,231,225,238, 97,128, 48, 77,235,225,244,225,235, - 225,238, 97,129, 48,173,120,184,232,225,236,230,247,233,228,244, - 104,128,255,119,242,111, 3,120,205,120,220,120,236,231,245,242, - 225,237,245,243,241,245,225,242,101,128, 51, 21,237,229,229,244, - 239,242,245,243,241,245,225,242,101,128, 51, 22,243,241,245,225, - 242,101,128, 51, 20,249,229,239,107, 5,121, 4,121, 39,121, 54, - 121, 63,121, 77, 97, 2,121, 10,121, 25,227,233,242,227,236,229, - 235,239,242,229,225,110,128, 50,110,240,225,242,229,238,235,239, - 242,229,225,110,128, 50, 14,227,233,242,227,236,229,235,239,242, - 229,225,110,128, 50, 96,235,239,242,229,225,110,128, 49, 49,240, - 225,242,229,238,235,239,242,229,225,110,128, 50, 0,243,233,239, - 243,235,239,242,229,225,110,128, 49, 51,234,229,227,249,242,233, - 236,236,233, 99,128, 4, 92,108, 2,121,109,121,120,233,238,229, - 226,229,236,239,119,128, 30, 53,243,241,245,225,242,101,128, 51, - 152,109, 3,121,137,121,151,121,162,227,245,226,229,228,243,241, - 245,225,242,101,128, 51,166,239,238,239,243,240,225,227,101,128, - 255, 75,243,241,245,225,242,229,228,243,241,245,225,242,101,128, - 51,162,111, 5,121,190,121,216,121,254,122, 10,122, 24,104, 2, - 121,196,121,206,233,242,225,231,225,238, 97,128, 48, 83,237,243, - 241,245,225,242,101,128, 51,192,235, 97, 2,121,223,121,231,233, - 244,232,225,105,128, 14, 1,244,225,235,225,238, 97,129, 48,179, - 121,242,232,225,236,230,247,233,228,244,104,128,255,122,239,240, - 239,243,241,245,225,242,101,128, 51, 30,240,240,225,227,249,242, - 233,236,236,233, 99,128, 4,129,114, 2,122, 30,122, 50,229,225, - 238,243,244,225,238,228,225,242,228,243,249,237,226,239,108,128, - 50,127,239,238,233,243,227,237, 98,128, 3, 67,240, 97, 2,122, - 67,122, 73,242,229,110,128, 36,166,243,241,245,225,242,101,128, - 51,170,243,233,227,249,242,233,236,236,233, 99,128, 4,111,116, - 2,122,101,122,110,243,241,245,225,242,101,128, 51,207,245,242, - 238,229,100,128, 2,158,117, 2,122,124,122,135,232,233,242,225, - 231,225,238, 97,128, 48, 79,235,225,244,225,235,225,238, 97,129, - 48,175,122,148,232,225,236,230,247,233,228,244,104,128,255,120, - 246,243,241,245,225,242,101,128, 51,184,247,243,241,245,225,242, - 101,128, 51,190,108,146, 0,108,122,220,124,247,125, 20,125, 86, - 125,124,126, 20,126, 29,126, 45,126, 69,126, 87,126,205,126,246, - 127,125,127,133,127,166,127,175,127,183,127,245, 97, 7,122,236, - 122,246,122,253,123, 4,123, 29,123, 45,124,235,226,229,238,231, - 225,236,105,128, 9,178,227,245,244,101,128, 1, 58,228,229,246, - 97,128, 9, 50,231,117, 2,123, 11,123, 20,234,225,242,225,244, - 105,128, 10,178,242,237,245,235,232,105,128, 10, 50,235,235,232, - 225,238,231,249,225,239,244,232,225,105,128, 14, 69,109, 10,123, - 67,124, 6,124, 23,124, 61,124, 75,124, 94,124,110,124,130,124, - 150,124,173, 97, 2,123, 73,123,254,236,229,102, 4,123, 85,123, - 99,123,191,123,208,230,233,238,225,236,225,242,225,226,233, 99, - 128,254,252,232,225,237,250, 97, 2,123,109,123,150,225,226,239, - 246,101, 2,123,119,123,133,230,233,238,225,236,225,242,225,226, - 233, 99,128,254,248,233,243,239,236,225,244,229,228,225,242,225, - 226,233, 99,128,254,247,226,229,236,239,119, 2,123,160,123,174, - 230,233,238,225,236,225,242,225,226,233, 99,128,254,250,233,243, - 239,236,225,244,229,228,225,242,225,226,233, 99,128,254,249,233, - 243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,251, - 237,225,228,228,225,225,226,239,246,101, 2,123,223,123,237,230, - 233,238,225,236,225,242,225,226,233, 99,128,254,246,233,243,239, - 236,225,244,229,228,225,242,225,226,233, 99,128,254,245,242,225, - 226,233, 99,128, 6, 68,226,228, 97,129, 3,187,124, 14,243,244, - 242,239,235,101,128, 1,155,229,100,130, 5,220,124, 32,124, 52, - 228,225,231,229,243,104,129,251, 60,124, 43,232,229,226,242,229, - 119,128,251, 60,232,229,226,242,229,119,128, 5,220,230,233,238, - 225,236,225,242,225,226,233, 99,128,254,222,232,225,232,233,238, - 233,244,233,225,236,225,242,225,226,233, 99,128,252,202,233,238, - 233,244,233,225,236,225,242,225,226,233, 99,128,254,223,234,229, - 229,237,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, - 252,201,235,232,225,232,233,238,233,244,233,225,236,225,242,225, - 226,233, 99,128,252,203,236,225,237,232,229,232,233,243,239,236, - 225,244,229,228,225,242,225,226,233, 99,128,253,242,237,101, 2, - 124,180,124,193,228,233,225,236,225,242,225,226,233, 99,128,254, - 224,229,109, 2,124,200,124,219,232,225,232,233,238,233,244,233, - 225,236,225,242,225,226,233, 99,128,253,136,233,238,233,244,233, - 225,236,225,242,225,226,233, 99,128,252,204,242,231,229,227,233, - 242,227,236,101,128, 37,239, 98, 3,124,255,125, 4,125, 10,225, - 114,128, 1,154,229,236,116,128, 2,108,239,240,239,237,239,230, - 111,128, 49, 12, 99, 4,125, 30,125, 37,125, 46,125, 73,225,242, - 239,110,128, 1, 62,229,228,233,236,236, 97,128, 1, 60,233,242, - 99, 2,125, 54,125, 59,236,101,128, 36,219,245,237,230,236,229, - 248,226,229,236,239,119,128, 30, 61,239,237,237,225,225,227,227, - 229,238,116,128, 1, 60,228,239,116,130, 1, 64,125, 96,125,105, - 225,227,227,229,238,116,128, 1, 64,226,229,236,239,119,129, 30, - 55,125,115,237,225,227,242,239,110,128, 30, 57,101, 3,125,132, - 125,170,126, 15,230,116, 2,125,139,125,155,225,238,231,236,229, - 225,226,239,246,229,227,237, 98,128, 3, 26,244,225,227,235,226, - 229,236,239,247,227,237, 98,128, 3, 24,243,115,132, 0, 60,125, - 183,125,205,125,217,126, 7,229,241,245,225,108,129, 34,100,125, - 193,239,242,231,242,229,225,244,229,114,128, 34,218,237,239,238, - 239,243,240,225,227,101,128,255, 28,111, 2,125,223,125,252,114, - 2,125,229,125,242,229,241,245,233,246,225,236,229,238,116,128, - 34,114,231,242,229,225,244,229,114,128, 34,118,246,229,242,229, - 241,245,225,108,128, 34,102,243,237,225,236,108,128,254,100,250, - 104,128, 2,110,230,226,236,239,227,107,128, 37,140,232,239,239, - 235,242,229,244,242,239,230,236,229,120,128, 2,109,105, 2,126, - 51,126, 56,242, 97,128, 32,164,247,238,225,242,237,229,238,233, - 225,110,128, 5,108,106,129, 1,201,126, 75,229,227,249,242,233, - 236,236,233, 99,128, 4, 89,108,132,246,192,126, 99,126,123,126, - 134,126,143, 97, 2,126,105,126,112,228,229,246, 97,128, 9, 51, - 231,245,234,225,242,225,244,105,128, 10,179,233,238,229,226,229, - 236,239,119,128, 30, 59,236,225,228,229,246, 97,128, 9, 52,246, - 239,227,225,236,233, 99, 3,126,157,126,167,126,174,226,229,238, - 231,225,236,105,128, 9,225,228,229,246, 97,128, 9, 97,246,239, - 247,229,236,243,233,231,110, 2,126,188,126,198,226,229,238,231, - 225,236,105,128, 9,227,228,229,246, 97,128, 9, 99,109, 3,126, - 213,126,226,126,237,233,228,228,236,229,244,233,236,228,101,128, - 2,107,239,238,239,243,240,225,227,101,128,255, 76,243,241,245, - 225,242,101,128, 51,208,111, 6,127, 4,127, 16,127, 58,127, 69, - 127, 75,127,117,227,232,245,236,225,244,232,225,105,128, 14, 44, - 231,233,227,225,108, 3,127, 28,127, 34,127, 53,225,238,100,128, - 34, 39,238,239,116,129, 0,172,127, 42,242,229,246,229,242,243, - 229,100,128, 35, 16,239,114,128, 34, 40,236,233,238,231,244,232, - 225,105,128, 14, 37,238,231,115,128, 1,127,247,236,233,238,101, - 2,127, 85,127,108, 99, 2,127, 91,127,103,229,238,244,229,242, - 236,233,238,101,128,254, 78,237, 98,128, 3, 50,228,225,243,232, - 229,100,128,254, 77,250,229,238,231,101,128, 37,202,240,225,242, - 229,110,128, 36,167,115, 3,127,141,127,148,127,156,236,225,243, - 104,128, 1, 66,241,245,225,242,101,128, 33, 19,245,240,229,242, - 233,239,114,128,246,238,244,243,232,225,228,101,128, 37,145,245, - 244,232,225,105,128, 14, 38,246,239,227,225,236,233, 99, 3,127, - 197,127,207,127,214,226,229,238,231,225,236,105,128, 9,140,228, - 229,246, 97,128, 9, 12,246,239,247,229,236,243,233,231,110, 2, - 127,228,127,238,226,229,238,231,225,236,105,128, 9,226,228,229, - 246, 97,128, 9, 98,248,243,241,245,225,242,101,128, 51,211,109, - 144, 0,109,128, 35,130,144,130,169,130,196,130,221,132, 18,132, - 40,133, 95,133,125,133,174,134, 25,134, 47,134, 72,134, 81,135, - 108,135,136, 97, 12,128, 61,128, 71,128,135,128,142,128,167,128, - 215,130, 51,130, 76,130, 81,130, 95,130,107,130,112,226,229,238, - 231,225,236,105,128, 9,174, 99, 2,128, 77,128,129,242,239,110, - 132, 0,175,128, 91,128,102,128,108,128,117,226,229,236,239,247, - 227,237, 98,128, 3, 49,227,237, 98,128, 3, 4,236,239,247,237, - 239,100,128, 2,205,237,239,238,239,243,240,225,227,101,128,255, - 227,245,244,101,128, 30, 63,228,229,246, 97,128, 9, 46,231,117, - 2,128,149,128,158,234,225,242,225,244,105,128, 10,174,242,237, - 245,235,232,105,128, 10, 46,104, 2,128,173,128,205,225,240,225, - 235,104, 2,128,183,128,192,232,229,226,242,229,119,128, 5,164, - 236,229,230,244,232,229,226,242,229,119,128, 5,164,233,242,225, - 231,225,238, 97,128, 48,126,105, 5,128,227,129, 40,129,103,129, - 133,130, 39,227,232,225,244,244,225,247, 97, 3,128,242,129, 17, - 129, 24,236,239,119, 2,128,250,129, 5,236,229,230,244,244,232, - 225,105,128,248,149,242,233,231,232,244,244,232,225,105,128,248, - 148,244,232,225,105,128, 14, 75,245,240,240,229,242,236,229,230, - 244,244,232,225,105,128,248,147,229,107, 3,129, 49,129, 80,129, - 87,236,239,119, 2,129, 57,129, 68,236,229,230,244,244,232,225, - 105,128,248,140,242,233,231,232,244,244,232,225,105,128,248,139, - 244,232,225,105,128, 14, 72,245,240,240,229,242,236,229,230,244, - 244,232,225,105,128,248,138,232,225,238,225,235,225,116, 2,129, - 115,129,126,236,229,230,244,244,232,225,105,128,248,132,244,232, - 225,105,128, 14, 49,116, 3,129,141,129,169,129,232,225,233,235, - 232,117, 2,129,151,129,162,236,229,230,244,244,232,225,105,128, - 248,137,244,232,225,105,128, 14, 71,232,111, 3,129,178,129,209, - 129,216,236,239,119, 2,129,186,129,197,236,229,230,244,244,232, - 225,105,128,248,143,242,233,231,232,244,244,232,225,105,128,248, - 142,244,232,225,105,128, 14, 73,245,240,240,229,242,236,229,230, - 244,244,232,225,105,128,248,141,242,105, 3,129,241,130, 16,130, - 23,236,239,119, 2,129,249,130, 4,236,229,230,244,244,232,225, - 105,128,248,146,242,233,231,232,244,244,232,225,105,128,248,145, - 244,232,225,105,128, 14, 74,245,240,240,229,242,236,229,230,244, - 244,232,225,105,128,248,144,249,225,237,239,235,244,232,225,105, - 128, 14, 70,235,225,244,225,235,225,238, 97,129, 48,222,130, 64, - 232,225,236,230,247,233,228,244,104,128,255,143,236,101,128, 38, - 66,238,243,249,239,238,243,241,245,225,242,101,128, 51, 71,241, - 225,230,232,229,226,242,229,119,128, 5,190,242,115,128, 38, 66, - 115, 2,130,118,130,136,239,242,225,227,233,242,227,236,229,232, - 229,226,242,229,119,128, 5,175,241,245,225,242,101,128, 51,131, - 98, 2,130,150,130,160,239,240,239,237,239,230,111,128, 49, 7, - 243,241,245,225,242,101,128, 51,212, 99, 2,130,175,130,183,233, - 242,227,236,101,128, 36,220,245,226,229,228,243,241,245,225,242, - 101,128, 51,165,228,239,116, 2,130,204,130,213,225,227,227,229, - 238,116,128, 30, 65,226,229,236,239,119,128, 30, 67,101, 7,130, - 237,131,108,131,119,131,134,131,159,131,196,131,208,101, 2,130, - 243,131, 95,109, 4,130,253,131, 6,131, 20,131, 36,225,242,225, - 226,233, 99,128, 6, 69,230,233,238,225,236,225,242,225,226,233, - 99,128,254,226,233,238,233,244,233,225,236,225,242,225,226,233, - 99,128,254,227,237,101, 2,131, 43,131, 56,228,233,225,236,225, - 242,225,226,233, 99,128,254,228,229,237,105, 2,131, 64,131, 79, - 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,209,243, - 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 72,244, - 239,242,245,243,241,245,225,242,101,128, 51, 77,232,233,242,225, - 231,225,238, 97,128, 48,129,233,250,233,229,242,225,243,241,245, - 225,242,101,128, 51,126,235,225,244,225,235,225,238, 97,129, 48, - 225,131,147,232,225,236,230,247,233,228,244,104,128,255,146,109, - 130, 5,222,131,167,131,187,228,225,231,229,243,104,129,251, 62, - 131,178,232,229,226,242,229,119,128,251, 62,232,229,226,242,229, - 119,128, 5,222,238,225,242,237,229,238,233,225,110,128, 5,116, - 242,235,232, 97, 3,131,219,131,228,132, 5,232,229,226,242,229, - 119,128, 5,165,235,229,230,245,236, 97, 2,131,239,131,248,232, - 229,226,242,229,119,128, 5,166,236,229,230,244,232,229,226,242, - 229,119,128, 5,166,236,229,230,244,232,229,226,242,229,119,128, - 5,165,104, 2,132, 24,132, 30,239,239,107,128, 2,113,250,243, - 241,245,225,242,101,128, 51,146,105, 6,132, 54,132, 91,132,228, - 132,239,133, 8,133, 65,228,100, 2,132, 61,132, 86,236,229,228, - 239,244,235,225,244,225,235,225,238,225,232,225,236,230,247,233, - 228,244,104,128,255,101,239,116,128, 0,183,229,245,109, 5,132, - 105,132,140,132,155,132,164,132,215, 97, 2,132,111,132,126,227, - 233,242,227,236,229,235,239,242,229,225,110,128, 50,114,240,225, - 242,229,238,235,239,242,229,225,110,128, 50, 18,227,233,242,227, - 236,229,235,239,242,229,225,110,128, 50,100,235,239,242,229,225, - 110,128, 49, 65,112, 2,132,170,132,202, 97, 2,132,176,132,190, - 238,243,233,239,243,235,239,242,229,225,110,128, 49,112,242,229, - 238,235,239,242,229,225,110,128, 50, 4,233,229,245,240,235,239, - 242,229,225,110,128, 49,110,243,233,239,243,235,239,242,229,225, - 110,128, 49,111,232,233,242,225,231,225,238, 97,128, 48,127,235, - 225,244,225,235,225,238, 97,129, 48,223,132,252,232,225,236,230, - 247,233,228,244,104,128,255,144,238,117, 2,133, 15,133, 60,115, - 132, 34, 18,133, 27,133, 38,133, 47,133, 53,226,229,236,239,247, - 227,237, 98,128, 3, 32,227,233,242,227,236,101,128, 34,150,237, - 239,100,128, 2,215,240,236,245,115,128, 34, 19,244,101,128, 32, - 50,242,105, 2,133, 72,133, 86,226,225,225,242,245,243,241,245, - 225,242,101,128, 51, 74,243,241,245,225,242,101,128, 51, 73,108, - 2,133,101,133,116,239,238,231,236,229,231,244,245,242,238,229, - 100,128, 2,112,243,241,245,225,242,101,128, 51,150,109, 3,133, - 133,133,147,133,158,227,245,226,229,228,243,241,245,225,242,101, - 128, 51,163,239,238,239,243,240,225,227,101,128,255, 77,243,241, - 245,225,242,229,228,243,241,245,225,242,101,128, 51,159,111, 5, - 133,186,133,212,133,237,133,247,134, 0,104, 2,133,192,133,202, - 233,242,225,231,225,238, 97,128, 48,130,237,243,241,245,225,242, - 101,128, 51,193,235,225,244,225,235,225,238, 97,129, 48,226,133, - 225,232,225,236,230,247,233,228,244,104,128,255,147,236,243,241, - 245,225,242,101,128, 51,214,237,225,244,232,225,105,128, 14, 33, - 246,229,242,243,243,241,245,225,242,101,129, 51,167,134, 15,228, - 243,241,245,225,242,101,128, 51,168,240, 97, 2,134, 32,134, 38, - 242,229,110,128, 36,168,243,241,245,225,242,101,128, 51,171,115, - 2,134, 53,134, 62,243,241,245,225,242,101,128, 51,179,245,240, - 229,242,233,239,114,128,246,239,244,245,242,238,229,100,128, 2, - 111,117,141, 0,181,134,111,134,115,134,125,134,149,134,159,134, - 181,134,192,134,217,134,240,134,250,135, 24,135, 88,135, 98, 49, - 128, 0,181,225,243,241,245,225,242,101,128, 51,130,227,104, 2, - 134,132,134,142,231,242,229,225,244,229,114,128, 34,107,236,229, - 243,115,128, 34,106,230,243,241,245,225,242,101,128, 51,140,103, - 2,134,165,134,172,242,229,229,107,128, 3,188,243,241,245,225, - 242,101,128, 51,141,232,233,242,225,231,225,238, 97,128, 48,128, - 235,225,244,225,235,225,238, 97,129, 48,224,134,205,232,225,236, - 230,247,233,228,244,104,128,255,145,108, 2,134,223,134,232,243, - 241,245,225,242,101,128, 51,149,244,233,240,236,121,128, 0,215, - 237,243,241,245,225,242,101,128, 51,155,238,225,104, 2,135, 2, - 135, 11,232,229,226,242,229,119,128, 5,163,236,229,230,244,232, - 229,226,242,229,119,128, 5,163,115, 2,135, 30,135, 79,233, 99, - 3,135, 39,135, 56,135, 67,225,236,238,239,244,101,129, 38,106, - 135, 50,228,226,108,128, 38,107,230,236,225,244,243,233,231,110, - 128, 38,109,243,232,225,242,240,243,233,231,110,128, 38,111,243, - 241,245,225,242,101,128, 51,178,246,243,241,245,225,242,101,128, - 51,182,247,243,241,245,225,242,101,128, 51,188,118, 2,135,114, - 135,127,237,229,231,225,243,241,245,225,242,101,128, 51,185,243, - 241,245,225,242,101,128, 51,183,119, 2,135,142,135,155,237,229, - 231,225,243,241,245,225,242,101,128, 51,191,243,241,245,225,242, - 101,128, 51,189,110,150, 0,110,135,212,136, 90,136,114,136,180, - 136,205,137, 7,137, 17,137, 84,137,127,139,161,139,179,139,204, - 139,235,140, 5,140, 70,142, 52,142, 60,142, 85,142, 93,143, 61, - 143, 71,143, 81, 97, 8,135,230,135,250,136, 1,136, 8,136, 33, - 136, 44,136, 69,136, 81, 98, 2,135,236,135,245,229,238,231,225, - 236,105,128, 9,168,236, 97,128, 34, 7,227,245,244,101,128, 1, - 68,228,229,246, 97,128, 9, 40,231,117, 2,136, 15,136, 24,234, - 225,242,225,244,105,128, 10,168,242,237,245,235,232,105,128, 10, - 40,232,233,242,225,231,225,238, 97,128, 48,106,235,225,244,225, - 235,225,238, 97,129, 48,202,136, 57,232,225,236,230,247,233,228, - 244,104,128,255,133,240,239,243,244,242,239,240,232,101,128, 1, - 73,243,241,245,225,242,101,128, 51,129, 98, 2,136, 96,136,106, - 239,240,239,237,239,230,111,128, 49, 11,243,240,225,227,101,128, - 0,160, 99, 4,136,124,136,131,136,140,136,167,225,242,239,110, - 128, 1, 72,229,228,233,236,236, 97,128, 1, 70,233,242, 99, 2, - 136,148,136,153,236,101,128, 36,221,245,237,230,236,229,248,226, - 229,236,239,119,128, 30, 75,239,237,237,225,225,227,227,229,238, - 116,128, 1, 70,228,239,116, 2,136,188,136,197,225,227,227,229, - 238,116,128, 30, 69,226,229,236,239,119,128, 30, 71,101, 3,136, - 213,136,224,136,249,232,233,242,225,231,225,238, 97,128, 48,109, - 235,225,244,225,235,225,238, 97,129, 48,205,136,237,232,225,236, - 230,247,233,228,244,104,128,255,136,247,243,232,229,241,229,236, - 243,233,231,110,128, 32,170,230,243,241,245,225,242,101,128, 51, - 139,103, 2,137, 23,137, 73, 97, 3,137, 31,137, 41,137, 48,226, - 229,238,231,225,236,105,128, 9,153,228,229,246, 97,128, 9, 25, - 231,117, 2,137, 55,137, 64,234,225,242,225,244,105,128, 10,153, - 242,237,245,235,232,105,128, 10, 25,239,238,231,245,244,232,225, - 105,128, 14, 7,104, 2,137, 90,137,100,233,242,225,231,225,238, - 97,128, 48,147,239,239,107, 2,137,108,137,115,236,229,230,116, - 128, 2,114,242,229,244,242,239,230,236,229,120,128, 2,115,105, - 4,137,137,138, 50,138, 61,138,119,229,245,110, 7,137,155,137, - 190,137,222,137,236,137,245,138, 22,138, 35, 97, 2,137,161,137, - 176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,111, - 240,225,242,229,238,235,239,242,229,225,110,128, 50, 15,227,105, - 2,137,197,137,209,229,245,227,235,239,242,229,225,110,128, 49, - 53,242,227,236,229,235,239,242,229,225,110,128, 50, 97,232,233, - 229,245,232,235,239,242,229,225,110,128, 49, 54,235,239,242,229, - 225,110,128, 49, 52,240, 97, 2,137,252,138, 10,238,243,233,239, - 243,235,239,242,229,225,110,128, 49,104,242,229,238,235,239,242, - 229,225,110,128, 50, 1,243,233,239,243,235,239,242,229,225,110, - 128, 49,103,244,233,235,229,245,244,235,239,242,229,225,110,128, - 49,102,232,233,242,225,231,225,238, 97,128, 48,107,107, 2,138, - 67,138, 91,225,244,225,235,225,238, 97,129, 48,203,138, 79,232, - 225,236,230,247,233,228,244,104,128,255,134,232,225,232,233,116, - 2,138,101,138,112,236,229,230,244,244,232,225,105,128,248,153, - 244,232,225,105,128, 14, 77,238,101,141, 0, 57,138,150,138,159, - 138,169,138,199,138,206,138,231,139, 2,139, 36,139, 48,139, 59, - 139, 92,139,100,139,111,225,242,225,226,233, 99,128, 6,105,226, - 229,238,231,225,236,105,128, 9,239,227,233,242,227,236,101,129, - 36,104,138,180,233,238,246,229,242,243,229,243,225,238,243,243, - 229,242,233,102,128, 39,146,228,229,246, 97,128, 9,111,231,117, - 2,138,213,138,222,234,225,242,225,244,105,128, 10,239,242,237, - 245,235,232,105,128, 10,111,232, 97, 2,138,238,138,249,227,235, - 225,242,225,226,233, 99,128, 6,105,238,231,250,232,239,117,128, - 48, 41,105, 2,139, 8,139, 26,228,229,239,231,242,225,240,232, - 233,227,240,225,242,229,110,128, 50, 40,238,230,229,242,233,239, - 114,128, 32,137,237,239,238,239,243,240,225,227,101,128,255, 25, - 239,236,228,243,244,249,236,101,128,247, 57,112, 2,139, 65,139, - 72,225,242,229,110,128, 36,124,229,114, 2,139, 79,139, 85,233, - 239,100,128, 36,144,243,233,225,110,128, 6,249,242,239,237,225, - 110,128, 33,120,243,245,240,229,242,233,239,114,128, 32,121,116, - 2,139,117,139,155,229,229,110, 2,139,125,139,134,227,233,242, - 227,236,101,128, 36,114,112, 2,139,140,139,147,225,242,229,110, - 128, 36,134,229,242,233,239,100,128, 36,154,232,225,105,128, 14, - 89,106,129, 1,204,139,167,229,227,249,242,233,236,236,233, 99, - 128, 4, 90,235,225,244,225,235,225,238, 97,129, 48,243,139,192, - 232,225,236,230,247,233,228,244,104,128,255,157,108, 2,139,210, - 139,224,229,231,242,233,231,232,244,236,239,238,103,128, 1,158, - 233,238,229,226,229,236,239,119,128, 30, 73,109, 2,139,241,139, - 252,239,238,239,243,240,225,227,101,128,255, 78,243,241,245,225, - 242,101,128, 51,154,110, 2,140, 11,140, 61, 97, 3,140, 19,140, - 29,140, 36,226,229,238,231,225,236,105,128, 9,163,228,229,246, - 97,128, 9, 35,231,117, 2,140, 43,140, 52,234,225,242,225,244, - 105,128, 10,163,242,237,245,235,232,105,128, 10, 35,238,225,228, - 229,246, 97,128, 9, 41,111, 6,140, 84,140, 95,140,120,140,161, - 141,113,142, 40,232,233,242,225,231,225,238, 97,128, 48,110,235, - 225,244,225,235,225,238, 97,129, 48,206,140,108,232,225,236,230, - 247,233,228,244,104,128,255,137,110, 3,140,128,140,144,140,153, - 226,242,229,225,235,233,238,231,243,240,225,227,101,128, 0,160, - 229,238,244,232,225,105,128, 14, 19,245,244,232,225,105,128, 14, - 25,239,110, 7,140,178,140,187,140,201,140,235,140,251,141, 36, - 141, 95,225,242,225,226,233, 99,128, 6, 70,230,233,238,225,236, - 225,242,225,226,233, 99,128,254,230,231,232,245,238,238, 97, 2, - 140,212,140,221,225,242,225,226,233, 99,128, 6,186,230,233,238, - 225,236,225,242,225,226,233, 99,128,251,159,233,238,233,244,233, - 225,236,225,242,225,226,233, 99,128,254,231,234,229,229,237,105, - 2,141, 5,141, 20,238,233,244,233,225,236,225,242,225,226,233, - 99,128,252,210,243,239,236,225,244,229,228,225,242,225,226,233, - 99,128,252, 75,237,101, 2,141, 43,141, 56,228,233,225,236,225, - 242,225,226,233, 99,128,254,232,229,237,105, 2,141, 64,141, 79, - 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,213,243, - 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 78,238, - 239,239,238,230,233,238,225,236,225,242,225,226,233, 99,128,252, - 141,116, 7,141,129,141,140,141,169,141,204,141,216,141,236,142, - 6,227,239,238,244,225,233,238,115,128, 34, 12,101, 2,141,146, - 141,162,236,229,237,229,238,116,129, 34, 9,141,157,239,102,128, - 34, 9,241,245,225,108,128, 34, 96,231,242,229,225,244,229,114, - 129, 34,111,141,181,238,239,114, 2,141,189,141,197,229,241,245, - 225,108,128, 34,113,236,229,243,115,128, 34,121,233,228,229,238, - 244,233,227,225,108,128, 34, 98,236,229,243,115,129, 34,110,141, - 225,238,239,242,229,241,245,225,108,128, 34,112,112, 2,141,242, - 141,252,225,242,225,236,236,229,108,128, 34, 38,242,229,227,229, - 228,229,115,128, 34,128,243,117, 3,142, 15,142, 22,142, 31,226, - 243,229,116,128, 34,132,227,227,229,229,228,115,128, 34,129,240, - 229,242,243,229,116,128, 34,133,247,225,242,237,229,238,233,225, - 110,128, 5,118,240,225,242,229,110,128, 36,169,115, 2,142, 66, - 142, 75,243,241,245,225,242,101,128, 51,177,245,240,229,242,233, - 239,114,128, 32,127,244,233,236,228,101,128, 0,241,117,132, 3, - 189,142,105,142,116,142,197,143, 24,232,233,242,225,231,225,238, - 97,128, 48,108,107, 2,142,122,142,146,225,244,225,235,225,238, - 97,129, 48,204,142,134,232,225,236,230,247,233,228,244,104,128, - 255,135,244, 97, 3,142,155,142,165,142,172,226,229,238,231,225, - 236,105,128, 9,188,228,229,246, 97,128, 9, 60,231,117, 2,142, - 179,142,188,234,225,242,225,244,105,128, 10,188,242,237,245,235, - 232,105,128, 10, 60,109, 2,142,203,142,237,226,229,242,243,233, - 231,110,130, 0, 35,142,217,142,229,237,239,238,239,243,240,225, - 227,101,128,255, 3,243,237,225,236,108,128,254, 95,229,114, 2, - 142,244,143, 20,225,236,243,233,231,110, 2,142,255,143, 7,231, - 242,229,229,107,128, 3,116,236,239,247,229,242,231,242,229,229, - 107,128, 3,117,111,128, 33, 22,110,130, 5,224,143, 32,143, 52, - 228,225,231,229,243,104,129,251, 64,143, 43,232,229,226,242,229, - 119,128,251, 64,232,229,226,242,229,119,128, 5,224,246,243,241, - 245,225,242,101,128, 51,181,247,243,241,245,225,242,101,128, 51, - 187,249, 97, 3,143, 90,143,100,143,107,226,229,238,231,225,236, - 105,128, 9,158,228,229,246, 97,128, 9, 30,231,117, 2,143,114, - 143,123,234,225,242,225,244,105,128, 10,158,242,237,245,235,232, - 105,128, 10, 30,111,147, 0,111,143,174,143,196,144, 18,144,188, - 145, 4,145, 19,145, 59,145,182,145,203,145,241,145,252,146,174, - 148, 8,148, 72,148,105,148,151,149, 24,149, 71,149, 83, 97, 2, - 143,180,143,187,227,245,244,101,128, 0,243,238,231,244,232,225, - 105,128, 14, 45, 98, 4,143,206,143,248,144, 1,144, 11,225,242, - 242,229,100,130, 2,117,143,218,143,229,227,249,242,233,236,236, - 233, 99,128, 4,233,228,233,229,242,229,243,233,243,227,249,242, - 233,236,236,233, 99,128, 4,235,229,238,231,225,236,105,128, 9, - 147,239,240,239,237,239,230,111,128, 49, 27,242,229,246,101,128, - 1, 79, 99, 3,144, 26,144, 99,144,178, 97, 2,144, 32,144, 93, - 238,228,242, 97, 3,144, 43,144, 50,144, 61,228,229,246, 97,128, - 9, 17,231,245,234,225,242,225,244,105,128, 10,145,246,239,247, - 229,236,243,233,231,110, 2,144, 75,144, 82,228,229,246, 97,128, - 9, 73,231,245,234,225,242,225,244,105,128, 10,201,242,239,110, - 128, 1,210,233,242, 99, 2,144,107,144,112,236,101,128, 36,222, - 245,237,230,236,229,120,133, 0,244,144,131,144,139,144,150,144, - 158,144,170,225,227,245,244,101,128, 30,209,228,239,244,226,229, - 236,239,119,128, 30,217,231,242,225,246,101,128, 30,211,232,239, - 239,235,225,226,239,246,101,128, 30,213,244,233,236,228,101,128, - 30,215,249,242,233,236,236,233, 99,128, 4, 62,100, 4,144,198, - 144,221,144,227,144,250,226,108, 2,144,205,144,213,225,227,245, - 244,101,128, 1, 81,231,242,225,246,101,128, 2, 13,229,246, 97, - 128, 9, 19,233,229,242,229,243,233,115,129, 0,246,144,239,227, - 249,242,233,236,236,233, 99,128, 4,231,239,244,226,229,236,239, - 119,128, 30,205,101,129, 1, 83,145, 10,235,239,242,229,225,110, - 128, 49, 90,103, 3,145, 27,145, 42,145, 49,239,238,229,107,129, - 2,219,145, 36,227,237, 98,128, 3, 40,242,225,246,101,128, 0, - 242,245,234,225,242,225,244,105,128, 10,147,104, 4,145, 69,145, - 80,145, 90,145,168,225,242,237,229,238,233,225,110,128, 5,133, - 233,242,225,231,225,238, 97,128, 48, 74,111, 2,145, 96,145,106, - 239,235,225,226,239,246,101,128, 30,207,242,110,133, 1,161,145, - 121,145,129,145,140,145,148,145,160,225,227,245,244,101,128, 30, - 219,228,239,244,226,229,236,239,119,128, 30,227,231,242,225,246, - 101,128, 30,221,232,239,239,235,225,226,239,246,101,128, 30,223, - 244,233,236,228,101,128, 30,225,245,238,231,225,242,245,237,236, - 225,245,116,128, 1, 81,105,129, 1,163,145,188,238,246,229,242, - 244,229,228,226,242,229,246,101,128, 2, 15,107, 2,145,209,145, - 233,225,244,225,235,225,238, 97,129, 48,170,145,221,232,225,236, - 230,247,233,228,244,104,128,255,117,239,242,229,225,110,128, 49, - 87,236,229,232,229,226,242,229,119,128, 5,171,109, 6,146, 10, - 146, 38,146, 45,146,134,146,145,146,163,225,227,242,239,110,130, - 1, 77,146, 22,146, 30,225,227,245,244,101,128, 30, 83,231,242, - 225,246,101,128, 30, 81,228,229,246, 97,128, 9, 80,229,231, 97, - 133, 3,201,146, 61,146, 65,146, 76,146, 90,146,106, 49,128, 3, - 214,227,249,242,233,236,236,233, 99,128, 4, 97,236,225,244,233, - 238,227,236,239,243,229,100,128, 2,119,242,239,245,238,228,227, - 249,242,233,236,236,233, 99,128, 4,123,116, 2,146,112,146,127, - 233,244,236,239,227,249,242,233,236,236,233, 99,128, 4,125,239, - 238,239,115,128, 3,206,231,245,234,225,242,225,244,105,128, 10, - 208,233,227,242,239,110,129, 3,191,146,155,244,239,238,239,115, - 128, 3,204,239,238,239,243,240,225,227,101,128,255, 79,238,101, - 145, 0, 49,146,213,146,222,146,232,147, 6,147, 31,147, 40,147, - 49,147, 74,147,108,147,142,147,154,147,173,147,184,147,217,147, - 227,147,235,147,246,225,242,225,226,233, 99,128, 6, 97,226,229, - 238,231,225,236,105,128, 9,231,227,233,242,227,236,101,129, 36, - 96,146,243,233,238,246,229,242,243,229,243,225,238,243,243,229, - 242,233,102,128, 39,138,100, 2,147, 12,147, 18,229,246, 97,128, - 9,103,239,244,229,238,236,229,225,228,229,114,128, 32, 36,229, - 233,231,232,244,104,128, 33, 91,230,233,244,244,229,100,128,246, - 220,231,117, 2,147, 56,147, 65,234,225,242,225,244,105,128, 10, - 231,242,237,245,235,232,105,128, 10,103,232, 97, 3,147, 83,147, - 94,147, 99,227,235,225,242,225,226,233, 99,128, 6, 97,236,102, - 128, 0,189,238,231,250,232,239,117,128, 48, 33,105, 2,147,114, - 147,132,228,229,239,231,242,225,240,232,233,227,240,225,242,229, - 110,128, 50, 32,238,230,229,242,233,239,114,128, 32,129,237,239, - 238,239,243,240,225,227,101,128,255, 17,238,245,237,229,242,225, - 244,239,242,226,229,238,231,225,236,105,128, 9,244,239,236,228, - 243,244,249,236,101,128,247, 49,112, 2,147,190,147,197,225,242, - 229,110,128, 36,116,229,114, 2,147,204,147,210,233,239,100,128, - 36,136,243,233,225,110,128, 6,241,241,245,225,242,244,229,114, - 128, 0,188,242,239,237,225,110,128, 33,112,243,245,240,229,242, - 233,239,114,128, 0,185,244,104, 2,147,253,148, 2,225,105,128, - 14, 81,233,242,100,128, 33, 83,111, 3,148, 16,148, 50,148, 66, - 103, 2,148, 22,148, 40,239,238,229,107,129, 1,235,148, 31,237, - 225,227,242,239,110,128, 1,237,245,242,237,245,235,232,105,128, - 10, 19,237,225,244,242,225,231,245,242,237,245,235,232,105,128, - 10, 75,240,229,110,128, 2, 84,112, 3,148, 80,148, 87,148, 98, - 225,242,229,110,128, 36,170,229,238,226,245,236,236,229,116,128, - 37,230,244,233,239,110,128, 35, 37,114, 2,148,111,148,140,100, - 2,148,117,148,128,230,229,237,233,238,233,238,101,128, 0,170, - 237,225,243,227,245,236,233,238,101,128, 0,186,244,232,239,231, - 239,238,225,108,128, 34, 31,115, 5,148,163,148,195,148,212,149, - 1,149, 14,232,239,242,116, 2,148,172,148,179,228,229,246, 97, - 128, 9, 18,246,239,247,229,236,243,233,231,238,228,229,246, 97, - 128, 9, 74,236,225,243,104,129, 0,248,148,204,225,227,245,244, - 101,128, 1,255,237,225,236,108, 2,148,221,148,232,232,233,242, - 225,231,225,238, 97,128, 48, 73,235,225,244,225,235,225,238, 97, - 129, 48,169,148,245,232,225,236,230,247,233,228,244,104,128,255, - 107,244,242,239,235,229,225,227,245,244,101,128, 1,255,245,240, - 229,242,233,239,114,128,246,240,116, 2,149, 30,149, 41,227,249, - 242,233,236,236,233, 99,128, 4,127,233,236,228,101,130, 0,245, - 149, 52,149, 60,225,227,245,244,101,128, 30, 77,228,233,229,242, - 229,243,233,115,128, 30, 79,245,226,239,240,239,237,239,230,111, - 128, 49, 33,118, 2,149, 89,149,170,229,114, 2,149, 96,149,162, - 236,233,238,101,131, 32, 62,149,109,149,132,149,155, 99, 2,149, - 115,149,127,229,238,244,229,242,236,233,238,101,128,254, 74,237, - 98,128, 3, 5,100, 2,149,138,149,146,225,243,232,229,100,128, - 254, 73,226,236,247,225,246,121,128,254, 76,247,225,246,121,128, - 254, 75,243,227,239,242,101,128, 0,175,239,247,229,236,243,233, - 231,110, 3,149,185,149,195,149,202,226,229,238,231,225,236,105, - 128, 9,203,228,229,246, 97,128, 9, 75,231,245,234,225,242,225, - 244,105,128, 10,203,112,145, 0,112,149,251,152,123,152,134,152, - 143,152,155,154, 80,154, 90,155, 82,156,101,156,191,156,217,157, - 92,157,100,158, 2,158, 60,158, 88,158, 98, 97, 14,150, 25,150, - 57,150, 67,150, 74,150, 81,150,129,150,140,150,154,150,165,150, - 212,150,226,151,238,152, 21,152,111, 97, 2,150, 31,150, 43,237, - 240,243,243,241,245,225,242,101,128, 51,128,243,229,238,244,239, - 243,241,245,225,242,101,128, 51, 43,226,229,238,231,225,236,105, - 128, 9,170,227,245,244,101,128, 30, 85,228,229,246, 97,128, 9, - 42,103, 2,150, 87,150,105,101, 2,150, 93,150,100,228,239,247, - 110,128, 33,223,245,112,128, 33,222,117, 2,150,111,150,120,234, - 225,242,225,244,105,128, 10,170,242,237,245,235,232,105,128, 10, - 42,232,233,242,225,231,225,238, 97,128, 48,113,233,249,225,238, - 238,239,233,244,232,225,105,128, 14, 47,235,225,244,225,235,225, - 238, 97,128, 48,209,108, 2,150,171,150,196,225,244,225,236,233, - 250,225,244,233,239,238,227,249,242,233,236,236,233,227,227,237, - 98,128, 4,132,239,227,232,235,225,227,249,242,233,236,236,233, - 99,128, 4,192,238,243,233,239,243,235,239,242,229,225,110,128, - 49,127,114, 3,150,234,150,255,151,227, 97, 2,150,240,150,248, - 231,242,225,240,104,128, 0,182,236,236,229,108,128, 34, 37,229, - 110, 2,151, 6,151,116,236,229,230,116,136, 0, 40,151, 29,151, - 44,151, 49,151, 54,151, 65,151, 77,151,100,151,105,225,236,244, - 239,238,229,225,242,225,226,233, 99,128,253, 62,226,116,128,248, - 237,229,120,128,248,236,233,238,230,229,242,233,239,114,128, 32, - 141,237,239,238,239,243,240,225,227,101,128,255, 8,115, 2,151, - 83,151, 90,237,225,236,108,128,254, 89,245,240,229,242,233,239, - 114,128, 32,125,244,112,128,248,235,246,229,242,244,233,227,225, - 108,128,254, 53,242,233,231,232,116,136, 0, 41,151,140,151,155, - 151,160,151,165,151,176,151,188,151,211,151,216,225,236,244,239, - 238,229,225,242,225,226,233, 99,128,253, 63,226,116,128,248,248, - 229,120,128,248,247,233,238,230,229,242,233,239,114,128, 32,142, - 237,239,238,239,243,240,225,227,101,128,255, 9,115, 2,151,194, - 151,201,237,225,236,108,128,254, 90,245,240,229,242,233,239,114, - 128, 32,126,244,112,128,248,246,246,229,242,244,233,227,225,108, - 128,254, 54,244,233,225,236,228,233,230,102,128, 34, 2,115, 3, - 151,246,152, 1,152, 13,229,241,232,229,226,242,229,119,128, 5, - 192,232,244,225,232,229,226,242,229,119,128, 5,153,241,245,225, - 242,101,128, 51,169,244,225,104,134, 5,183,152, 39,152, 53,152, - 58,152, 67,152, 82,152, 98, 49, 2,152, 45,152, 49, 49,128, 5, - 183,100,128, 5,183,178, 97,128, 5,183,232,229,226,242,229,119, - 128, 5,183,238,225,242,242,239,247,232,229,226,242,229,119,128, - 5,183,241,245,225,242,244,229,242,232,229,226,242,229,119,128, - 5,183,247,233,228,229,232,229,226,242,229,119,128, 5,183,250, - 229,242,232,229,226,242,229,119,128, 5,161,226,239,240,239,237, - 239,230,111,128, 49, 6,227,233,242,227,236,101,128, 36,223,228, - 239,244,225,227,227,229,238,116,128, 30, 87,101,137, 5,228,152, - 177,152,188,152,208,152,220,152,240,153, 86,153, 97,153,118,154, - 73,227,249,242,233,236,236,233, 99,128, 4, 63,228,225,231,229, - 243,104,129,251, 68,152,199,232,229,226,242,229,119,128,251, 68, - 229,250,233,243,241,245,225,242,101,128, 51, 59,230,233,238,225, - 236,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 67, - 104, 5,152,252,153, 19,153, 27,153, 41,153, 71,225,114, 2,153, - 3,153, 10,225,226,233, 99,128, 6,126,237,229,238,233,225,110, - 128, 5,122,229,226,242,229,119,128, 5,228,230,233,238,225,236, - 225,242,225,226,233, 99,128,251, 87,105, 2,153, 47,153, 62,238, - 233,244,233,225,236,225,242,225,226,233, 99,128,251, 88,242,225, - 231,225,238, 97,128, 48,122,237,229,228,233,225,236,225,242,225, - 226,233, 99,128,251, 89,235,225,244,225,235,225,238, 97,128, 48, - 218,237,233,228,228,236,229,232,239,239,235,227,249,242,233,236, - 236,233, 99,128, 4,167,114, 5,153,130,153,142,153,184,154, 49, - 154, 62,225,230,229,232,229,226,242,229,119,128,251, 78,227,229, - 238,116,131, 0, 37,153,155,153,164,153,176,225,242,225,226,233, - 99,128, 6,106,237,239,238,239,243,240,225,227,101,128,255, 5, - 243,237,225,236,108,128,254,106,105, 2,153,190,154, 31,239,100, - 134, 0, 46,153,207,153,218,153,229,153,241,153,252,154, 8,225, - 242,237,229,238,233,225,110,128, 5,137,227,229,238,244,229,242, - 229,100,128, 0,183,232,225,236,230,247,233,228,244,104,128,255, - 97,233,238,230,229,242,233,239,114,128,246,231,237,239,238,239, - 243,240,225,227,101,128,255, 14,115, 2,154, 14,154, 21,237,225, - 236,108,128,254, 82,245,240,229,242,233,239,114,128,246,232,243, - 240,239,237,229,238,233,231,242,229,229,235,227,237, 98,128, 3, - 66,240,229,238,228,233,227,245,236,225,114,128, 34,165,244,232, - 239,245,243,225,238,100,128, 32, 48,243,229,244, 97,128, 32,167, - 230,243,241,245,225,242,101,128, 51,138,104, 3,154, 98,154,148, - 155, 29, 97, 3,154,106,154,116,154,123,226,229,238,231,225,236, - 105,128, 9,171,228,229,246, 97,128, 9, 43,231,117, 2,154,130, - 154,139,234,225,242,225,244,105,128, 10,171,242,237,245,235,232, - 105,128, 10, 43,105,133, 3,198,154,162,154,166,154,252,155, 4, - 155, 15, 49,128, 3,213,229,245,240,104, 4,154,179,154,214,154, - 229,154,238, 97, 2,154,185,154,200,227,233,242,227,236,229,235, - 239,242,229,225,110,128, 50,122,240,225,242,229,238,235,239,242, - 229,225,110,128, 50, 26,227,233,242,227,236,229,235,239,242,229, - 225,110,128, 50,108,235,239,242,229,225,110,128, 49, 77,240,225, - 242,229,238,235,239,242,229,225,110,128, 50, 12,236,225,244,233, - 110,128, 2,120,238,244,232,245,244,232,225,105,128, 14, 58,243, - 249,237,226,239,236,231,242,229,229,107,128, 3,213,111, 3,155, - 37,155, 42,155, 68,239,107,128, 1,165,240,104, 2,155, 49,155, - 58,225,238,244,232,225,105,128, 14, 30,245,238,231,244,232,225, - 105,128, 14, 28,243,225,237,240,232,225,239,244,232,225,105,128, - 14, 32,105,133, 3,192,155, 96,156, 52,156, 63,156, 74,156, 88, - 229,245,112, 6,155,112,155,147,155,179,155,207,155,221,156, 17, - 97, 2,155,118,155,133,227,233,242,227,236,229,235,239,242,229, - 225,110,128, 50,115,240,225,242,229,238,235,239,242,229,225,110, - 128, 50, 19,227,105, 2,155,154,155,166,229,245,227,235,239,242, - 229,225,110,128, 49,118,242,227,236,229,235,239,242,229,225,110, - 128, 50,101,107, 2,155,185,155,199,233,249,229,239,235,235,239, - 242,229,225,110,128, 49,114,239,242,229,225,110,128, 49, 66,240, - 225,242,229,238,235,239,242,229,225,110,128, 50, 5,243,233,239, - 115, 2,155,230,156, 2,107, 2,155,236,155,250,233,249,229,239, - 235,235,239,242,229,225,110,128, 49,116,239,242,229,225,110,128, - 49, 68,244,233,235,229,245,244,235,239,242,229,225,110,128, 49, - 117,116, 2,156, 23,156, 38,232,233,229,245,244,232,235,239,242, - 229,225,110,128, 49,119,233,235,229,245,244,235,239,242,229,225, - 110,128, 49,115,232,233,242,225,231,225,238, 97,128, 48,116,235, - 225,244,225,235,225,238, 97,128, 48,212,243,249,237,226,239,236, - 231,242,229,229,107,128, 3,214,247,242,225,242,237,229,238,233, - 225,110,128, 5,131,236,245,115,132, 0, 43,156,115,156,126,156, - 135,156,168,226,229,236,239,247,227,237, 98,128, 3, 31,227,233, - 242,227,236,101,128, 34,149,109, 2,156,141,156,148,233,238,245, - 115,128, 0,177,111, 2,156,154,156,158,100,128, 2,214,238,239, - 243,240,225,227,101,128,255, 11,115, 2,156,174,156,181,237,225, - 236,108,128,254, 98,245,240,229,242,233,239,114,128, 32,122,109, - 2,156,197,156,208,239,238,239,243,240,225,227,101,128,255, 80, - 243,241,245,225,242,101,128, 51,216,111, 5,156,229,156,240,157, - 51,157, 62,157, 72,232,233,242,225,231,225,238, 97,128, 48,125, - 233,238,244,233,238,231,233,238,228,229,120, 4,157, 4,157, 16, - 157, 28,157, 41,228,239,247,238,247,232,233,244,101,128, 38, 31, - 236,229,230,244,247,232,233,244,101,128, 38, 28,242,233,231,232, - 244,247,232,233,244,101,128, 38, 30,245,240,247,232,233,244,101, - 128, 38, 29,235,225,244,225,235,225,238, 97,128, 48,221,240,236, - 225,244,232,225,105,128, 14, 27,243,244,225,236,237,225,242,107, - 129, 48, 18,157, 85,230,225,227,101,128, 48, 32,240,225,242,229, - 110,128, 36,171,114, 3,157,108,157,134,157,159,101, 2,157,114, - 157,122,227,229,228,229,115,128, 34,122,243,227,242,233,240,244, - 233,239,110,128, 33, 30,233,237,101, 2,157,142,157,148,237,239, - 100,128, 2,185,242,229,246,229,242,243,229,100,128, 32, 53,111, - 4,157,169,157,176,157,186,157,199,228,245,227,116,128, 34, 15, - 234,229,227,244,233,246,101,128, 35, 5,236,239,238,231,229,228, - 235,225,238, 97,128, 48,252,112, 2,157,205,157,242,101, 2,157, - 211,157,218,236,236,239,114,128, 35, 24,242,243,117, 2,157,226, - 157,233,226,243,229,116,128, 34,130,240,229,242,243,229,116,128, - 34,131,239,242,244,233,239,110,129, 34, 55,157,253,225,108,128, - 34, 29,115, 2,158, 8,158, 51,105,130, 3,200,158, 16,158, 27, - 227,249,242,233,236,236,233, 99,128, 4,113,236,233,240,238,229, - 245,237,225,244,225,227,249,242,233,236,236,233,227,227,237, 98, - 128, 4,134,243,241,245,225,242,101,128, 51,176,117, 2,158, 66, - 158, 77,232,233,242,225,231,225,238, 97,128, 48,119,235,225,244, - 225,235,225,238, 97,128, 48,215,246,243,241,245,225,242,101,128, - 51,180,247,243,241,245,225,242,101,128, 51,186,113,136, 0,113, - 158,128,159,177,159,188,159,197,159,204,159,216,159,254,160, 6, - 97, 4,158,138,158,161,158,225,159,160,100, 2,158,144,158,150, - 229,246, 97,128, 9, 88,237,225,232,229,226,242,229,119,128, 5, - 168,102, 4,158,171,158,180,158,194,158,210,225,242,225,226,233, - 99,128, 6, 66,230,233,238,225,236,225,242,225,226,233, 99,128, - 254,214,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, - 254,215,237,229,228,233,225,236,225,242,225,226,233, 99,128,254, - 216,237,225,244,115,136, 5,184,158,248,159, 12,159, 26,159, 31, - 159, 36,159, 45,159, 60,159,147, 49, 3,159, 0,159, 4,159, 8, - 48,128, 5,184, 97,128, 5,184, 99,128, 5,184, 50, 2,159, 18, - 159, 22, 55,128, 5,184, 57,128, 5,184,179, 51,128, 5,184,228, - 101,128, 5,184,232,229,226,242,229,119,128, 5,184,238,225,242, - 242,239,247,232,229,226,242,229,119,128, 5,184,113, 2,159, 66, - 159,132,225,244,225,110, 4,159, 79,159, 88,159,103,159,119,232, - 229,226,242,229,119,128, 5,184,238,225,242,242,239,247,232,229, - 226,242,229,119,128, 5,184,241,245,225,242,244,229,242,232,229, - 226,242,229,119,128, 5,184,247,233,228,229,232,229,226,242,229, - 119,128, 5,184,245,225,242,244,229,242,232,229,226,242,229,119, - 128, 5,184,247,233,228,229,232,229,226,242,229,119,128, 5,184, - 242,238,229,249,240,225,242,225,232,229,226,242,229,119,128, 5, - 159,226,239,240,239,237,239,230,111,128, 49, 17,227,233,242,227, - 236,101,128, 36,224,232,239,239,107,128, 2,160,237,239,238,239, - 243,240,225,227,101,128,255, 81,239,102,130, 5,231,159,225,159, - 245,228,225,231,229,243,104,129,251, 71,159,236,232,229,226,242, - 229,119,128,251, 71,232,229,226,242,229,119,128, 5,231,240,225, - 242,229,110,128, 36,172,117, 4,160, 16,160, 28,160,117,160,204, - 225,242,244,229,242,238,239,244,101,128, 38,105,226,245,244,115, - 135, 5,187,160, 49,160, 54,160, 59,160, 64,160, 73,160, 88,160, - 104,177, 56,128, 5,187,178, 53,128, 5,187,179, 49,128, 5,187, - 232,229,226,242,229,119,128, 5,187,238,225,242,242,239,247,232, - 229,226,242,229,119,128, 5,187,241,245,225,242,244,229,242,232, - 229,226,242,229,119,128, 5,187,247,233,228,229,232,229,226,242, - 229,119,128, 5,187,229,243,244,233,239,110,133, 0, 63,160,136, - 160,159,160,176,160,184,160,196,225,114, 2,160,143,160,150,225, - 226,233, 99,128, 6, 31,237,229,238,233,225,110,128, 5, 94,228, - 239,247,110,129, 0,191,160,168,243,237,225,236,108,128,247,191, - 231,242,229,229,107,128, 3,126,237,239,238,239,243,240,225,227, - 101,128,255, 31,243,237,225,236,108,128,247, 63,239,244,101, 4, - 160,216,161, 31,161, 51,161, 80,228,226,108,133, 0, 34,160,232, - 160,239,160,246,161, 2,161, 23,226,225,243,101,128, 32, 30,236, - 229,230,116,128, 32, 28,237,239,238,239,243,240,225,227,101,128, - 255, 2,240,242,233,237,101,129, 48, 30,161, 12,242,229,246,229, - 242,243,229,100,128, 48, 29,242,233,231,232,116,128, 32, 29,236, - 229,230,116,129, 32, 24,161, 40,242,229,246,229,242,243,229,100, - 128, 32, 27,114, 2,161, 57,161, 67,229,246,229,242,243,229,100, - 128, 32, 27,233,231,232,116,129, 32, 25,161, 76,110,128, 1, 73, - 243,233,238,231,108, 2,161, 90,161, 97,226,225,243,101,128, 32, - 26,101,129, 0, 39,161,103,237,239,238,239,243,240,225,227,101, - 128,255, 7,114,145, 0,114,161,153,162,157,162,168,162,215,163, - 10,164, 27,164, 51,164,146,166,180,166,217,166,229,167, 27,167, - 35,167,197,167,208,167,243,168, 87, 97, 11,161,177,161,188,161, - 198,161,205,162, 14,162, 30,162, 55,162, 66,162, 91,162,114,162, - 151,225,242,237,229,238,233,225,110,128, 5,124,226,229,238,231, - 225,236,105,128, 9,176,227,245,244,101,128, 1, 85,100, 4,161, - 215,161,221,161,235,162, 5,229,246, 97,128, 9, 48,233,227,225, - 108,129, 34, 26,161,230,229,120,128,248,229,239,246,229,242,243, - 243,241,245,225,242,101,129, 51,174,161,251,228,243,241,245,225, - 242,101,128, 51,175,243,241,245,225,242,101,128, 51,173,230,101, - 129, 5,191,162, 21,232,229,226,242,229,119,128, 5,191,231,117, - 2,162, 37,162, 46,234,225,242,225,244,105,128, 10,176,242,237, - 245,235,232,105,128, 10, 48,232,233,242,225,231,225,238, 97,128, - 48,137,235,225,244,225,235,225,238, 97,129, 48,233,162, 79,232, - 225,236,230,247,233,228,244,104,128,255,151,236,239,247,229,242, - 228,233,225,231,239,238,225,236,226,229,238,231,225,236,105,128, - 9,241,109, 2,162,120,162,143,233,228,228,236,229,228,233,225, - 231,239,238,225,236,226,229,238,231,225,236,105,128, 9,240,243, - 232,239,242,110,128, 2,100,244,233,111,128, 34, 54,226,239,240, - 239,237,239,230,111,128, 49, 22, 99, 4,162,178,162,185,162,194, - 162,202,225,242,239,110,128, 1, 89,229,228,233,236,236, 97,128, - 1, 87,233,242,227,236,101,128, 36,225,239,237,237,225,225,227, - 227,229,238,116,128, 1, 87,100, 2,162,221,162,231,226,236,231, - 242,225,246,101,128, 2, 17,239,116, 2,162,238,162,247,225,227, - 227,229,238,116,128, 30, 89,226,229,236,239,119,129, 30, 91,163, - 1,237,225,227,242,239,110,128, 30, 93,101, 6,163, 24,163, 69, - 163,104,163,159,163,184,163,217,102, 2,163, 30,163, 43,229,242, - 229,238,227,229,237,225,242,107,128, 32, 59,236,229,248,243,117, - 2,163, 53,163, 60,226,243,229,116,128, 34,134,240,229,242,243, - 229,116,128, 34,135,231,233,243,244,229,114, 2,163, 80,163, 85, - 229,100,128, 0,174,115, 2,163, 91,163, 97,225,238,115,128,248, - 232,229,242,233,102,128,246,218,104, 3,163,112,163,135,163,149, - 225,114, 2,163,119,163,126,225,226,233, 99,128, 6, 49,237,229, - 238,233,225,110,128, 5,128,230,233,238,225,236,225,242,225,226, - 233, 99,128,254,174,233,242,225,231,225,238, 97,128, 48,140,235, - 225,244,225,235,225,238, 97,129, 48,236,163,172,232,225,236,230, - 247,233,228,244,104,128,255,154,243,104,130, 5,232,163,193,163, - 208,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 72, - 232,229,226,242,229,119,128, 5,232,118, 3,163,225,163,238,164, - 14,229,242,243,229,228,244,233,236,228,101,128, 34, 61,233, 97, - 2,163,245,163,254,232,229,226,242,229,119,128, 5,151,237,245, - 231,242,225,243,232,232,229,226,242,229,119,128, 5,151,236,239, - 231,233,227,225,236,238,239,116,128, 35, 16,230,233,243,232,232, - 239,239,107,129, 2,126,164, 40,242,229,246,229,242,243,229,100, - 128, 2,127,104, 2,164, 57,164, 80, 97, 2,164, 63,164, 73,226, - 229,238,231,225,236,105,128, 9,221,228,229,246, 97,128, 9, 93, - 111,131, 3,193,164, 90,164,119,164,133,239,107,129, 2,125,164, - 97,244,245,242,238,229,100,129, 2,123,164,108,243,245,240,229, - 242,233,239,114,128, 2,181,243,249,237,226,239,236,231,242,229, - 229,107,128, 3,241,244,233,227,232,239,239,235,237,239,100,128, - 2,222,105, 6,164,160,165,204,165,250,166, 5,166, 30,166,166, - 229,245,108, 9,164,182,164,217,164,232,164,246,165, 36,165, 50, - 165,136,165,149,165,184, 97, 2,164,188,164,203,227,233,242,227, - 236,229,235,239,242,229,225,110,128, 50,113,240,225,242,229,238, - 235,239,242,229,225,110,128, 50, 17,227,233,242,227,236,229,235, - 239,242,229,225,110,128, 50, 99,232,233,229,245,232,235,239,242, - 229,225,110,128, 49, 64,107, 2,164,252,165, 28,233,249,229,239, - 107, 2,165, 6,165, 15,235,239,242,229,225,110,128, 49, 58,243, - 233,239,243,235,239,242,229,225,110,128, 49,105,239,242,229,225, - 110,128, 49, 57,237,233,229,245,237,235,239,242,229,225,110,128, - 49, 59,112, 3,165, 58,165, 90,165,105, 97, 2,165, 64,165, 78, - 238,243,233,239,243,235,239,242,229,225,110,128, 49,108,242,229, - 238,235,239,242,229,225,110,128, 50, 3,232,233,229,245,240,232, - 235,239,242,229,225,110,128, 49, 63,233,229,245,112, 2,165,114, - 165,123,235,239,242,229,225,110,128, 49, 60,243,233,239,243,235, - 239,242,229,225,110,128, 49,107,243,233,239,243,235,239,242,229, - 225,110,128, 49, 61,116, 2,165,155,165,170,232,233,229,245,244, - 232,235,239,242,229,225,110,128, 49, 62,233,235,229,245,244,235, - 239,242,229,225,110,128, 49,106,249,229,239,242,233,238,232,233, - 229,245,232,235,239,242,229,225,110,128, 49,109,231,232,116, 2, - 165,212,165,220,225,238,231,236,101,128, 34, 31,116, 2,165,226, - 165,240,225,227,235,226,229,236,239,247,227,237, 98,128, 3, 25, - 242,233,225,238,231,236,101,128, 34,191,232,233,242,225,231,225, - 238, 97,128, 48,138,235,225,244,225,235,225,238, 97,129, 48,234, - 166, 18,232,225,236,230,247,233,228,244,104,128,255,152,110, 2, - 166, 36,166,152,103,131, 2,218,166, 46,166, 57,166, 63,226,229, - 236,239,247,227,237, 98,128, 3, 37,227,237, 98,128, 3, 10,232, - 225,236,102, 2,166, 72,166,118,236,229,230,116,131, 2,191,166, - 85,166, 96,166,107,225,242,237,229,238,233,225,110,128, 5, 89, - 226,229,236,239,247,227,237, 98,128, 3, 28,227,229,238,244,229, - 242,229,100,128, 2,211,242,233,231,232,116,130, 2,190,166,130, - 166,141,226,229,236,239,247,227,237, 98,128, 3, 57,227,229,238, - 244,229,242,229,100,128, 2,210,246,229,242,244,229,228,226,242, - 229,246,101,128, 2, 19,244,244,239,242,245,243,241,245,225,242, - 101,128, 51, 81,108, 2,166,186,166,197,233,238,229,226,229,236, - 239,119,128, 30, 95,239,238,231,236,229,103,129, 2,124,166,208, - 244,245,242,238,229,100,128, 2,122,237,239,238,239,243,240,225, - 227,101,128,255, 82,111, 3,166,237,166,248,167, 17,232,233,242, - 225,231,225,238, 97,128, 48,141,235,225,244,225,235,225,238, 97, - 129, 48,237,167, 5,232,225,236,230,247,233,228,244,104,128,255, - 155,242,245,225,244,232,225,105,128, 14, 35,240,225,242,229,110, - 128, 36,173,114, 3,167, 43,167, 79,167,109, 97, 3,167, 51,167, - 61,167, 68,226,229,238,231,225,236,105,128, 9,220,228,229,246, - 97,128, 9, 49,231,245,242,237,245,235,232,105,128, 10, 92,229, - 104, 2,167, 86,167, 95,225,242,225,226,233, 99,128, 6,145,230, - 233,238,225,236,225,242,225,226,233, 99,128,251,141,246,239,227, - 225,236,233, 99, 4,167,125,167,135,167,142,167,153,226,229,238, - 231,225,236,105,128, 9,224,228,229,246, 97,128, 9, 96,231,245, - 234,225,242,225,244,105,128, 10,224,246,239,247,229,236,243,233, - 231,110, 3,167,169,167,179,167,186,226,229,238,231,225,236,105, - 128, 9,196,228,229,246, 97,128, 9, 68,231,245,234,225,242,225, - 244,105,128, 10,196,243,245,240,229,242,233,239,114,128,246,241, - 116, 2,167,214,167,222,226,236,239,227,107,128, 37,144,245,242, - 238,229,100,129, 2,121,167,232,243,245,240,229,242,233,239,114, - 128, 2,180,117, 4,167,253,168, 8,168, 33,168, 80,232,233,242, - 225,231,225,238, 97,128, 48,139,235,225,244,225,235,225,238, 97, - 129, 48,235,168, 21,232,225,236,230,247,233,228,244,104,128,255, - 153,112, 2,168, 39,168, 74,229,101, 2,168, 46,168, 60,237,225, - 242,235,226,229,238,231,225,236,105,128, 9,242,243,233,231,238, - 226,229,238,231,225,236,105,128, 9,243,233,225,104,128,246,221, - 244,232,225,105,128, 14, 36,246,239,227,225,236,233, 99, 4,168, - 103,168,113,168,120,168,131,226,229,238,231,225,236,105,128, 9, - 139,228,229,246, 97,128, 9, 11,231,245,234,225,242,225,244,105, - 128, 10,139,246,239,247,229,236,243,233,231,110, 3,168,147,168, - 157,168,164,226,229,238,231,225,236,105,128, 9,195,228,229,246, - 97,128, 9, 67,231,245,234,225,242,225,244,105,128, 10,195,115, - 147, 0,115,168,217,170,187,170,198,171, 68,171,107,174, 49,174, - 60,176,203,179, 85,179,131,179,158,180, 93,180,160,181,193,181, - 203,182,133,182,206,183,120,183,130, 97, 9,168,237,168,247,169, - 12,169, 84,169,109,169,120,169,145,169,177,169,217,226,229,238, - 231,225,236,105,128, 9,184,227,245,244,101,129, 1, 91,169, 0, - 228,239,244,225,227,227,229,238,116,128, 30,101,100, 5,169, 24, - 169, 33,169, 39,169, 53,169, 69,225,242,225,226,233, 99,128, 6, - 53,229,246, 97,128, 9, 56,230,233,238,225,236,225,242,225,226, - 233, 99,128,254,186,233,238,233,244,233,225,236,225,242,225,226, - 233, 99,128,254,187,237,229,228,233,225,236,225,242,225,226,233, - 99,128,254,188,231,117, 2,169, 91,169,100,234,225,242,225,244, - 105,128, 10,184,242,237,245,235,232,105,128, 10, 56,232,233,242, - 225,231,225,238, 97,128, 48, 85,235,225,244,225,235,225,238, 97, - 129, 48,181,169,133,232,225,236,230,247,233,228,244,104,128,255, - 123,236,236,225,236,236,225,232,239,245,225,236,225,249,232,229, - 247,225,243,225,236,236,225,237,225,242,225,226,233, 99,128,253, - 250,237,229,235,104,130, 5,225,169,188,169,208,228,225,231,229, - 243,104,129,251, 65,169,199,232,229,226,242,229,119,128,251, 65, - 232,229,226,242,229,119,128, 5,225,242, 97, 5,169,230,170, 48, - 170, 56,170,106,170,114, 97, 5,169,242,169,250,170, 2,170, 33, - 170, 41,225,244,232,225,105,128, 14, 50,229,244,232,225,105,128, - 14, 65,233,237,225,233,109, 2,170, 12,170, 23,225,236,225,233, - 244,232,225,105,128, 14, 68,245,225,238,244,232,225,105,128, 14, - 67,237,244,232,225,105,128, 14, 51,244,232,225,105,128, 14, 48, - 229,244,232,225,105,128, 14, 64,105, 3,170, 64,170, 88,170, 99, - 105, 2,170, 70,170, 81,236,229,230,244,244,232,225,105,128,248, - 134,244,232,225,105,128, 14, 53,236,229,230,244,244,232,225,105, - 128,248,133,244,232,225,105,128, 14, 52,239,244,232,225,105,128, - 14, 66,117, 3,170,122,170,172,170,179,101, 3,170,130,170,154, - 170,165,101, 2,170,136,170,147,236,229,230,244,244,232,225,105, - 128,248,136,244,232,225,105,128, 14, 55,236,229,230,244,244,232, - 225,105,128,248,135,244,232,225,105,128, 14, 54,244,232,225,105, - 128, 14, 56,245,244,232,225,105,128, 14, 57,226,239,240,239,237, - 239,230,111,128, 49, 25, 99, 5,170,210,170,231,170,240,171, 33, - 171, 55,225,242,239,110,129, 1, 97,170,219,228,239,244,225,227, - 227,229,238,116,128, 30,103,229,228,233,236,236, 97,128, 1, 95, - 232,247, 97,131, 2, 89,170,252,171, 7,171, 26,227,249,242,233, - 236,236,233, 99,128, 4,217,228,233,229,242,229,243,233,243,227, - 249,242,233,236,236,233, 99,128, 4,219,232,239,239,107,128, 2, - 90,233,242, 99, 2,171, 41,171, 46,236,101,128, 36,226,245,237, - 230,236,229,120,128, 1, 93,239,237,237,225,225,227,227,229,238, - 116,128, 2, 25,228,239,116, 2,171, 76,171, 85,225,227,227,229, - 238,116,128, 30, 97,226,229,236,239,119,129, 30, 99,171, 95,228, - 239,244,225,227,227,229,238,116,128, 30,105,101, 9,171,127,171, - 143,171,178,171,243,172, 90,172,117,172,142,172,223,172,250,225, - 231,245,236,236,226,229,236,239,247,227,237, 98,128, 3, 60, 99, - 2,171,149,171,171,239,238,100,129, 32, 51,171,157,244,239,238, - 229,227,232,233,238,229,243,101,128, 2,202,244,233,239,110,128, - 0,167,229,110, 4,171,189,171,198,171,212,171,228,225,242,225, - 226,233, 99,128, 6, 51,230,233,238,225,236,225,242,225,226,233, - 99,128,254,178,233,238,233,244,233,225,236,225,242,225,226,233, - 99,128,254,179,237,229,228,233,225,236,225,242,225,226,233, 99, - 128,254,180,231,239,108,135, 5,182,172, 7,172, 21,172, 26,172, - 35,172, 50,172, 66,172, 77, 49, 2,172, 13,172, 17, 51,128, 5, - 182,102,128, 5,182,178, 99,128, 5,182,232,229,226,242,229,119, - 128, 5,182,238,225,242,242,239,247,232,229,226,242,229,119,128, - 5,182,241,245,225,242,244,229,242,232,229,226,242,229,119,128, - 5,182,244,225,232,229,226,242,229,119,128, 5,146,247,233,228, - 229,232,229,226,242,229,119,128, 5,182,104, 2,172, 96,172,107, - 225,242,237,229,238,233,225,110,128, 5,125,233,242,225,231,225, - 238, 97,128, 48, 91,235,225,244,225,235,225,238, 97,129, 48,187, - 172,130,232,225,236,230,247,233,228,244,104,128,255,126,237,105, - 2,172,149,172,192,227,239,236,239,110,131, 0, 59,172,163,172, - 172,172,184,225,242,225,226,233, 99,128, 6, 27,237,239,238,239, - 243,240,225,227,101,128,255, 27,243,237,225,236,108,128,254, 84, - 246,239,233,227,229,228,237,225,242,235,235,225,238, 97,129, 48, - 156,172,211,232,225,236,230,247,233,228,244,104,128,255,159,238, - 116, 2,172,230,172,240,233,243,241,245,225,242,101,128, 51, 34, - 239,243,241,245,225,242,101,128, 51, 35,246,229,110,142, 0, 55, - 173, 28,173, 37,173, 47,173, 77,173, 84,173, 94,173,119,173,146, - 173,180,173,192,173,203,173,236,173,244,173,255,225,242,225,226, - 233, 99,128, 6,103,226,229,238,231,225,236,105,128, 9,237,227, - 233,242,227,236,101,129, 36,102,173, 58,233,238,246,229,242,243, - 229,243,225,238,243,243,229,242,233,102,128, 39,144,228,229,246, - 97,128, 9,109,229,233,231,232,244,232,115,128, 33, 94,231,117, - 2,173,101,173,110,234,225,242,225,244,105,128, 10,237,242,237, - 245,235,232,105,128, 10,109,232, 97, 2,173,126,173,137,227,235, - 225,242,225,226,233, 99,128, 6,103,238,231,250,232,239,117,128, - 48, 39,105, 2,173,152,173,170,228,229,239,231,242,225,240,232, - 233,227,240,225,242,229,110,128, 50, 38,238,230,229,242,233,239, - 114,128, 32,135,237,239,238,239,243,240,225,227,101,128,255, 23, - 239,236,228,243,244,249,236,101,128,247, 55,112, 2,173,209,173, - 216,225,242,229,110,128, 36,122,229,114, 2,173,223,173,229,233, - 239,100,128, 36,142,243,233,225,110,128, 6,247,242,239,237,225, - 110,128, 33,118,243,245,240,229,242,233,239,114,128, 32,119,116, - 2,174, 5,174, 43,229,229,110, 2,174, 13,174, 22,227,233,242, - 227,236,101,128, 36,112,112, 2,174, 28,174, 35,225,242,229,110, - 128, 36,132,229,242,233,239,100,128, 36,152,232,225,105,128, 14, - 87,230,244,232,249,240,232,229,110,128, 0,173,104, 7,174, 76, - 175, 50,175, 61,175, 75,176, 20,176, 33,176,197, 97, 6,174, 90, - 174,101,174,111,174,122,175, 9,175, 34,225,242,237,229,238,233, - 225,110,128, 5,119,226,229,238,231,225,236,105,128, 9,182,227, - 249,242,233,236,236,233, 99,128, 4, 72,100, 2,174,128,174,224, - 228, 97, 4,174,139,174,148,174,179,174,193,225,242,225,226,233, - 99,128, 6, 81,228,225,237,237, 97, 2,174,158,174,167,225,242, - 225,226,233, 99,128,252, 97,244,225,238,225,242,225,226,233, 99, - 128,252, 94,230,225,244,232,225,225,242,225,226,233, 99,128,252, - 96,235,225,243,242, 97, 2,174,203,174,212,225,242,225,226,233, - 99,128,252, 98,244,225,238,225,242,225,226,233, 99,128,252, 95, - 101,132, 37,146,174,236,174,243,174,251,175, 4,228,225,242,107, - 128, 37,147,236,233,231,232,116,128, 37,145,237,229,228,233,245, - 109,128, 37,146,246, 97,128, 9, 54,231,117, 2,175, 16,175, 25, - 234,225,242,225,244,105,128, 10,182,242,237,245,235,232,105,128, - 10, 54,236,243,232,229,236,229,244,232,229,226,242,229,119,128, - 5,147,226,239,240,239,237,239,230,111,128, 49, 21,227,232,225, - 227,249,242,233,236,236,233, 99,128, 4, 73,101, 4,175, 85,175, - 150,175,160,175,177,229,110, 4,175, 96,175,105,175,119,175,135, - 225,242,225,226,233, 99,128, 6, 52,230,233,238,225,236,225,242, - 225,226,233, 99,128,254,182,233,238,233,244,233,225,236,225,242, - 225,226,233, 99,128,254,183,237,229,228,233,225,236,225,242,225, - 226,233, 99,128,254,184,233,227,239,240,244,233, 99,128, 3,227, - 241,229,108,129, 32,170,175,168,232,229,226,242,229,119,128, 32, - 170,246, 97,134, 5,176,175,194,175,209,175,223,175,232,175,247, - 176, 7, 49, 2,175,200,175,205,177, 53,128, 5,176, 53,128, 5, - 176, 50, 2,175,215,175,219, 50,128, 5,176,101,128, 5,176,232, - 229,226,242,229,119,128, 5,176,238,225,242,242,239,247,232,229, - 226,242,229,119,128, 5,176,241,245,225,242,244,229,242,232,229, - 226,242,229,119,128, 5,176,247,233,228,229,232,229,226,242,229, - 119,128, 5,176,232,225,227,249,242,233,236,236,233, 99,128, 4, - 187,105, 2,176, 39,176, 50,237,225,227,239,240,244,233, 99,128, - 3,237,110,131, 5,233,176, 60,176,143,176,152,100, 2,176, 66, - 176,132,225,231,229,243,104,130,251, 73,176, 78,176, 87,232,229, - 226,242,229,119,128,251, 73,115, 2,176, 93,176,113,232,233,238, - 228,239,116,129,251, 44,176,104,232,229,226,242,229,119,128,251, - 44,233,238,228,239,116,129,251, 45,176,123,232,229,226,242,229, - 119,128,251, 45,239,244,232,229,226,242,229,119,128, 5,193,232, - 229,226,242,229,119,128, 5,233,115, 2,176,158,176,178,232,233, - 238,228,239,116,129,251, 42,176,169,232,229,226,242,229,119,128, - 251, 42,233,238,228,239,116,129,251, 43,176,188,232,229,226,242, - 229,119,128,251, 43,239,239,107,128, 2,130,105, 8,176,221,177, - 9,177, 20,177, 45,177, 75,177, 83,177, 96,178, 11,231,237, 97, - 131, 3,195,176,233,176,237,176,245, 49,128, 3,194,230,233,238, - 225,108,128, 3,194,236,245,238,225,244,229,243,249,237,226,239, - 236,231,242,229,229,107,128, 3,242,232,233,242,225,231,225,238, - 97,128, 48, 87,235,225,244,225,235,225,238, 97,129, 48,183,177, - 33,232,225,236,230,247,233,228,244,104,128,255,124,236,245,113, - 2,177, 53,177, 62,232,229,226,242,229,119,128, 5,189,236,229, - 230,244,232,229,226,242,229,119,128, 5,189,237,233,236,225,114, - 128, 34, 60,238,228,239,244,232,229,226,242,229,119,128, 5,194, - 239,115, 6,177,111,177,146,177,178,177,206,177,220,177,252, 97, - 2,177,117,177,132,227,233,242,227,236,229,235,239,242,229,225, - 110,128, 50,116,240,225,242,229,238,235,239,242,229,225,110,128, - 50, 20,227,105, 2,177,153,177,165,229,245,227,235,239,242,229, - 225,110,128, 49,126,242,227,236,229,235,239,242,229,225,110,128, - 50,102,107, 2,177,184,177,198,233,249,229,239,235,235,239,242, - 229,225,110,128, 49,122,239,242,229,225,110,128, 49, 69,238,233, - 229,245,238,235,239,242,229,225,110,128, 49,123,112, 2,177,226, - 177,239,225,242,229,238,235,239,242,229,225,110,128, 50, 6,233, - 229,245,240,235,239,242,229,225,110,128, 49,125,244,233,235,229, - 245,244,235,239,242,229,225,110,128, 49,124,120,141, 0, 54,178, - 41,178, 50,178, 60,178, 90,178, 97,178,122,178,149,178,183,178, - 195,178,206,178,239,178,247,179, 2,225,242,225,226,233, 99,128, - 6,102,226,229,238,231,225,236,105,128, 9,236,227,233,242,227, - 236,101,129, 36,101,178, 71,233,238,246,229,242,243,229,243,225, - 238,243,243,229,242,233,102,128, 39,143,228,229,246, 97,128, 9, - 108,231,117, 2,178,104,178,113,234,225,242,225,244,105,128, 10, - 236,242,237,245,235,232,105,128, 10,108,232, 97, 2,178,129,178, - 140,227,235,225,242,225,226,233, 99,128, 6,102,238,231,250,232, - 239,117,128, 48, 38,105, 2,178,155,178,173,228,229,239,231,242, - 225,240,232,233,227,240,225,242,229,110,128, 50, 37,238,230,229, - 242,233,239,114,128, 32,134,237,239,238,239,243,240,225,227,101, - 128,255, 22,239,236,228,243,244,249,236,101,128,247, 54,112, 2, - 178,212,178,219,225,242,229,110,128, 36,121,229,114, 2,178,226, - 178,232,233,239,100,128, 36,141,243,233,225,110,128, 6,246,242, - 239,237,225,110,128, 33,117,243,245,240,229,242,233,239,114,128, - 32,118,116, 2,179, 8,179, 79,229,229,110, 2,179, 16,179, 58, - 99, 2,179, 22,179, 30,233,242,227,236,101,128, 36,111,245,242, - 242,229,238,227,249,228,229,238,239,237,233,238,225,244,239,242, - 226,229,238,231,225,236,105,128, 9,249,112, 2,179, 64,179, 71, - 225,242,229,110,128, 36,131,229,242,233,239,100,128, 36,151,232, - 225,105,128, 14, 86,108, 2,179, 91,179,111,225,243,104,129, 0, - 47,179, 99,237,239,238,239,243,240,225,227,101,128,255, 15,239, - 238,103,129, 1,127,179,119,228,239,244,225,227,227,229,238,116, - 128, 30,155,109, 2,179,137,179,147,233,236,229,230,225,227,101, - 128, 38, 58,239,238,239,243,240,225,227,101,128,255, 83,111, 6, - 179,172,179,222,179,233,180, 2,180, 47,180, 58,102, 2,179,178, - 179,192,240,225,243,245,241,232,229,226,242,229,119,128, 5,195, - 116, 2,179,198,179,207,232,249,240,232,229,110,128, 0,173,243, - 233,231,238,227,249,242,233,236,236,233, 99,128, 4, 76,232,233, - 242,225,231,225,238, 97,128, 48, 93,235,225,244,225,235,225,238, - 97,129, 48,189,179,246,232,225,236,230,247,233,228,244,104,128, - 255,127,236,233,228,245,115, 2,180, 12,180, 29,236,239,238,231, - 239,246,229,242,236,225,249,227,237, 98,128, 3, 56,243,232,239, - 242,244,239,246,229,242,236,225,249,227,237, 98,128, 3, 55,242, - 245,243,233,244,232,225,105,128, 14, 41,115, 3,180, 66,180, 76, - 180, 84,225,236,225,244,232,225,105,128, 14, 40,239,244,232,225, - 105,128, 14, 11,245,225,244,232,225,105,128, 14, 42,240, 97, 3, - 180,102,180,122,180,154,227,101,129, 0, 32,180,109,232,225,227, - 235,225,242,225,226,233, 99,128, 0, 32,228,101,129, 38, 96,180, - 129,243,245,233,116, 2,180,138,180,146,226,236,225,227,107,128, - 38, 96,247,232,233,244,101,128, 38,100,242,229,110,128, 36,174, - 241,245,225,242,101, 11,180,188,180,199,180,213,180,238,180,255, - 181, 25,181, 40,181, 73,181,100,181,156,181,171,226,229,236,239, - 247,227,237, 98,128, 3, 59, 99, 2,180,205,180,209, 99,128, 51, - 196,109,128, 51,157,228,233,225,231,239,238,225,236,227,242,239, - 243,243,232,225,244,227,232,230,233,236,108,128, 37,169,232,239, - 242,233,250,239,238,244,225,236,230,233,236,108,128, 37,164,107, - 2,181, 5,181, 9,103,128, 51,143,109,129, 51,158,181, 15,227, - 225,240,233,244,225,108,128, 51,206,108, 2,181, 31,181, 35,110, - 128, 51,209,239,103,128, 51,210,109, 4,181, 50,181, 54,181, 59, - 181, 63,103,128, 51,142,233,108,128, 51,213,109,128, 51,156,243, - 241,245,225,242,229,100,128, 51,161,239,242,244,232,239,231,239, - 238,225,236,227,242,239,243,243,232,225,244,227,232,230,233,236, - 108,128, 37,166,245,240,240,229,114, 2,181,110,181,133,236,229, - 230,244,244,239,236,239,247,229,242,242,233,231,232,244,230,233, - 236,108,128, 37,167,242,233,231,232,244,244,239,236,239,247,229, - 242,236,229,230,244,230,233,236,108,128, 37,168,246,229,242,244, - 233,227,225,236,230,233,236,108,128, 37,165,247,232,233,244,229, - 247,233,244,232,243,237,225,236,236,226,236,225,227,107,128, 37, - 163,242,243,241,245,225,242,101,128, 51,219,115, 2,181,209,182, - 123, 97, 4,181,219,181,229,181,236,181,247,226,229,238,231,225, - 236,105,128, 9,183,228,229,246, 97,128, 9, 55,231,245,234,225, - 242,225,244,105,128, 10,183,238,103, 8,182, 10,182, 24,182, 38, - 182, 52,182, 67,182, 81,182, 95,182,108,227,233,229,245,227,235, - 239,242,229,225,110,128, 49, 73,232,233,229,245,232,235,239,242, - 229,225,110,128, 49,133,233,229,245,238,231,235,239,242,229,225, - 110,128, 49,128,235,233,249,229,239,235,235,239,242,229,225,110, - 128, 49, 50,238,233,229,245,238,235,239,242,229,225,110,128, 49, - 101,240,233,229,245,240,235,239,242,229,225,110,128, 49, 67,243, - 233,239,243,235,239,242,229,225,110,128, 49, 70,244,233,235,229, - 245,244,235,239,242,229,225,110,128, 49, 56,245,240,229,242,233, - 239,114,128,246,242,116, 2,182,139,182,162,229,242,236,233,238, - 103,129, 0,163,182,150,237,239,238,239,243,240,225,227,101,128, - 255,225,242,239,235,101, 2,182,171,182,188,236,239,238,231,239, - 246,229,242,236,225,249,227,237, 98,128, 3, 54,243,232,239,242, - 244,239,246,229,242,236,225,249,227,237, 98,128, 3, 53,117, 7, - 182,222,182,254,183, 20,183, 31,183, 72,183, 82,183, 86,226,243, - 229,116,130, 34,130,182,233,182,244,238,239,244,229,241,245,225, - 108,128, 34,138,239,242,229,241,245,225,108,128, 34,134, 99, 2, - 183, 4,183, 12,227,229,229,228,115,128, 34,123,232,244,232,225, - 116,128, 34, 11,232,233,242,225,231,225,238, 97,128, 48, 89,107, - 2,183, 37,183, 61,225,244,225,235,225,238, 97,129, 48,185,183, - 49,232,225,236,230,247,233,228,244,104,128,255,125,245,238,225, - 242,225,226,233, 99,128, 6, 82,237,237,225,244,233,239,110,128, - 34, 17,110,128, 38, 60,240,229,242,243,229,116,130, 34,131,183, - 99,183,110,238,239,244,229,241,245,225,108,128, 34,139,239,242, - 229,241,245,225,108,128, 34,135,246,243,241,245,225,242,101,128, - 51,220,249,239,245,247,225,229,242,225,243,241,245,225,242,101, - 128, 51,124,116,144, 0,116,183,183,184,192,184,213,185,100,185, - 140,187,188,191, 70,192,145,192,157,192,169,193,202,193,227,194, - 57,194,237,195,165,195,255, 97, 10,183,205,183,215,183,236,183, - 243,184, 12,184, 90,184,107,184,132,184,146,184,150,226,229,238, - 231,225,236,105,128, 9,164,227,107, 2,183,222,183,229,228,239, - 247,110,128, 34,164,236,229,230,116,128, 34,163,228,229,246, 97, - 128, 9, 36,231,117, 2,183,250,184, 3,234,225,242,225,244,105, - 128, 10,164,242,237,245,235,232,105,128, 10, 36,104, 4,184, 22, - 184, 31,184, 45,184, 75,225,242,225,226,233, 99,128, 6, 55,230, - 233,238,225,236,225,242,225,226,233, 99,128,254,194,105, 2,184, - 51,184, 66,238,233,244,233,225,236,225,242,225,226,233, 99,128, - 254,195,242,225,231,225,238, 97,128, 48, 95,237,229,228,233,225, - 236,225,242,225,226,233, 99,128,254,196,233,243,249,239,245,229, - 242,225,243,241,245,225,242,101,128, 51,125,235,225,244,225,235, - 225,238, 97,129, 48,191,184,120,232,225,236,230,247,233,228,244, - 104,128,255,128,244,247,229,229,236,225,242,225,226,233, 99,128, - 6, 64,117,128, 3,196,118,130, 5,234,184,158,184,183,228,225, - 231,229,115,129,251, 74,184,168,104,129,251, 74,184,174,232,229, - 226,242,229,119,128,251, 74,232,229,226,242,229,119,128, 5,234, - 98, 2,184,198,184,203,225,114,128, 1,103,239,240,239,237,239, - 230,111,128, 49, 10, 99, 6,184,227,184,234,184,241,184,250,185, - 60,185, 87,225,242,239,110,128, 1,101,227,245,242,108,128, 2, - 168,229,228,233,236,236, 97,128, 1, 99,232,229,104, 4,185, 6, - 185, 15,185, 29,185, 45,225,242,225,226,233, 99,128, 6,134,230, - 233,238,225,236,225,242,225,226,233, 99,128,251,123,233,238,233, - 244,233,225,236,225,242,225,226,233, 99,128,251,124,237,229,228, - 233,225,236,225,242,225,226,233, 99,128,251,125,233,242, 99, 2, - 185, 68,185, 73,236,101,128, 36,227,245,237,230,236,229,248,226, - 229,236,239,119,128, 30,113,239,237,237,225,225,227,227,229,238, - 116,128, 1, 99,100, 2,185,106,185,116,233,229,242,229,243,233, - 115,128, 30,151,239,116, 2,185,123,185,132,225,227,227,229,238, - 116,128, 30,107,226,229,236,239,119,128, 30,109,101, 9,185,160, - 185,171,185,191,186,201,186,226,187, 34,187,101,187,106,187,158, - 227,249,242,233,236,236,233, 99,128, 4, 66,228,229,243,227,229, - 238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,173,104, - 7,185,207,185,216,185,230,186, 14,186, 44,186, 85,186,183,225, - 242,225,226,233, 99,128, 6, 42,230,233,238,225,236,225,242,225, - 226,233, 99,128,254,150,232,225,232,105, 2,185,239,185,254,238, - 233,244,233,225,236,225,242,225,226,233, 99,128,252,162,243,239, - 236,225,244,229,228,225,242,225,226,233, 99,128,252, 12,105, 2, - 186, 20,186, 35,238,233,244,233,225,236,225,242,225,226,233, 99, - 128,254,151,242,225,231,225,238, 97,128, 48,102,234,229,229,237, - 105, 2,186, 54,186, 69,238,233,244,233,225,236,225,242,225,226, - 233, 99,128,252,161,243,239,236,225,244,229,228,225,242,225,226, - 233, 99,128,252, 11,109, 2,186, 91,186,125,225,242,226,245,244, - 97, 2,186,102,186,111,225,242,225,226,233, 99,128, 6, 41,230, - 233,238,225,236,225,242,225,226,233, 99,128,254,148,101, 2,186, - 131,186,144,228,233,225,236,225,242,225,226,233, 99,128,254,152, - 229,237,105, 2,186,152,186,167,238,233,244,233,225,236,225,242, - 225,226,233, 99,128,252,164,243,239,236,225,244,229,228,225,242, - 225,226,233, 99,128,252, 14,238,239,239,238,230,233,238,225,236, - 225,242,225,226,233, 99,128,252,115,235,225,244,225,235,225,238, - 97,129, 48,198,186,214,232,225,236,230,247,233,228,244,104,128, - 255,131,108, 2,186,232,186,251,229,240,232,239,238,101,129, 33, - 33,186,243,226,236,225,227,107,128, 38, 14,233,243,232, 97, 2, - 187, 4,187, 19,231,229,228,239,236,225,232,229,226,242,229,119, - 128, 5,160,241,229,244,225,238,225,232,229,226,242,229,119,128, - 5,169,110, 4,187, 44,187, 53,187, 72,187, 93,227,233,242,227, - 236,101,128, 36,105,233,228,229,239,231,242,225,240,232,233,227, - 240,225,242,229,110,128, 50, 41,112, 2,187, 78,187, 85,225,242, - 229,110,128, 36,125,229,242,233,239,100,128, 36,145,242,239,237, - 225,110,128, 33,121,243,104,128, 2,167,116,131, 5,216,187,116, - 187,136,187,145,228,225,231,229,243,104,129,251, 56,187,127,232, - 229,226,242,229,119,128,251, 56,232,229,226,242,229,119,128, 5, - 216,243,229,227,249,242,233,236,236,233, 99,128, 4,181,246,233, - 114, 2,187,166,187,175,232,229,226,242,229,119,128, 5,155,236, - 229,230,244,232,229,226,242,229,119,128, 5,155,104, 6,187,202, - 188, 98,188,220,189, 96,190, 3,191, 60, 97, 5,187,214,187,224, - 187,231,188, 0,188, 29,226,229,238,231,225,236,105,128, 9,165, - 228,229,246, 97,128, 9, 37,231,117, 2,187,238,187,247,234,225, - 242,225,244,105,128, 10,165,242,237,245,235,232,105,128, 10, 37, - 108, 2,188, 6,188, 15,225,242,225,226,233, 99,128, 6, 48,230, - 233,238,225,236,225,242,225,226,233, 99,128,254,172,238,244,232, - 225,235,232,225,116, 3,188, 44,188, 75,188, 82,236,239,119, 2, - 188, 52,188, 63,236,229,230,244,244,232,225,105,128,248,152,242, - 233,231,232,244,244,232,225,105,128,248,151,244,232,225,105,128, - 14, 76,245,240,240,229,242,236,229,230,244,244,232,225,105,128, - 248,150,101, 3,188,106,188,170,188,193,104, 4,188,116,188,125, - 188,139,188,155,225,242,225,226,233, 99,128, 6, 43,230,233,238, - 225,236,225,242,225,226,233, 99,128,254,154,233,238,233,244,233, - 225,236,225,242,225,226,233, 99,128,254,155,237,229,228,233,225, - 236,225,242,225,226,233, 99,128,254,156,242,101, 2,188,177,188, - 186,229,248,233,243,244,115,128, 34, 3,230,239,242,101,128, 34, - 52,244, 97,130, 3,184,188,202,188,206, 49,128, 3,209,243,249, - 237,226,239,236,231,242,229,229,107,128, 3,209,105, 2,188,226, - 189, 56,229,245,244,104, 4,188,239,189, 18,189, 33,189, 42, 97, - 2,188,245,189, 4,227,233,242,227,236,229,235,239,242,229,225, - 110,128, 50,121,240,225,242,229,238,235,239,242,229,225,110,128, - 50, 25,227,233,242,227,236,229,235,239,242,229,225,110,128, 50, - 107,235,239,242,229,225,110,128, 49, 76,240,225,242,229,238,235, - 239,242,229,225,110,128, 50, 11,242,244,229,229,110, 2,189, 66, - 189, 75,227,233,242,227,236,101,128, 36,108,112, 2,189, 81,189, - 88,225,242,229,110,128, 36,128,229,242,233,239,100,128, 36,148, - 111, 6,189,110,189,127,189,132,189,146,189,151,189,204,238,225, - 238,231,237,239,238,244,232,239,244,232,225,105,128, 14, 17,239, - 107,128, 1,173,240,232,245,244,232,225,239,244,232,225,105,128, - 14, 18,242,110,128, 0,254,244,104, 3,189,160,189,184,189,194, - 97, 2,189,166,189,176,232,225,238,244,232,225,105,128, 14, 23, - 238,244,232,225,105,128, 14, 16,239,238,231,244,232,225,105,128, - 14, 24,245,238,231,244,232,225,105,128, 14, 22,245,243,225,238, - 100, 2,189,214,189,225,227,249,242,233,236,236,233, 99,128, 4, - 130,243,243,229,240,225,242,225,244,239,114, 2,189,240,189,249, - 225,242,225,226,233, 99,128, 6,108,240,229,242,243,233,225,110, - 128, 6,108,242,229,101,144, 0, 51,190, 41,190, 50,190, 60,190, - 90,190, 97,190,107,190,132,190,159,190,193,190,205,190,224,190, - 235,191, 12,191, 34,191, 42,191, 53,225,242,225,226,233, 99,128, - 6, 99,226,229,238,231,225,236,105,128, 9,233,227,233,242,227, - 236,101,129, 36, 98,190, 71,233,238,246,229,242,243,229,243,225, - 238,243,243,229,242,233,102,128, 39,140,228,229,246, 97,128, 9, - 105,229,233,231,232,244,232,115,128, 33, 92,231,117, 2,190,114, - 190,123,234,225,242,225,244,105,128, 10,233,242,237,245,235,232, - 105,128, 10,105,232, 97, 2,190,139,190,150,227,235,225,242,225, - 226,233, 99,128, 6, 99,238,231,250,232,239,117,128, 48, 35,105, - 2,190,165,190,183,228,229,239,231,242,225,240,232,233,227,240, - 225,242,229,110,128, 50, 34,238,230,229,242,233,239,114,128, 32, - 131,237,239,238,239,243,240,225,227,101,128,255, 19,238,245,237, - 229,242,225,244,239,242,226,229,238,231,225,236,105,128, 9,246, - 239,236,228,243,244,249,236,101,128,247, 51,112, 2,190,241,190, - 248,225,242,229,110,128, 36,118,229,114, 2,190,255,191, 5,233, - 239,100,128, 36,138,243,233,225,110,128, 6,243,241,245,225,242, - 244,229,242,115,129, 0,190,191, 25,229,237,228,225,243,104,128, - 246,222,242,239,237,225,110,128, 33,114,243,245,240,229,242,233, - 239,114,128, 0,179,244,232,225,105,128, 14, 83,250,243,241,245, - 225,242,101,128, 51,148,105, 7,191, 86,191, 97,191,212,192, 54, - 192, 66,192,115,192,132,232,233,242,225,231,225,238, 97,128, 48, - 97,107, 2,191,103,191,127,225,244,225,235,225,238, 97,129, 48, - 193,191,115,232,225,236,230,247,233,228,244,104,128,255,129,229, - 245,116, 4,191,139,191,174,191,189,191,198, 97, 2,191,145,191, - 160,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,112, - 240,225,242,229,238,235,239,242,229,225,110,128, 50, 16,227,233, - 242,227,236,229,235,239,242,229,225,110,128, 50, 98,235,239,242, - 229,225,110,128, 49, 55,240,225,242,229,238,235,239,242,229,225, - 110,128, 50, 2,236,228,101,133, 2,220,191,228,191,239,192, 0, - 192, 12,192, 40,226,229,236,239,247,227,237, 98,128, 3, 48, 99, - 2,191,245,191,250,237, 98,128, 3, 3,239,237, 98,128, 3, 3, - 228,239,245,226,236,229,227,237, 98,128, 3, 96,111, 2,192, 18, - 192, 28,240,229,242,225,244,239,114,128, 34, 60,246,229,242,236, - 225,249,227,237, 98,128, 3, 52,246,229,242,244,233,227,225,236, - 227,237, 98,128, 3, 62,237,229,243,227,233,242,227,236,101,128, - 34,151,112, 2,192, 72,192,102,229,232, 97, 2,192, 80,192, 89, - 232,229,226,242,229,119,128, 5,150,236,229,230,244,232,229,226, - 242,229,119,128, 5,150,240,233,231,245,242,237,245,235,232,105, - 128, 10,112,244,236,239,227,249,242,233,236,236,233,227,227,237, - 98,128, 4,131,247,238,225,242,237,229,238,233,225,110,128, 5, - 127,236,233,238,229,226,229,236,239,119,128, 30,111,237,239,238, - 239,243,240,225,227,101,128,255, 84,111, 7,192,185,192,196,192, - 207,192,232,193, 96,193,108,193,192,225,242,237,229,238,233,225, - 110,128, 5,105,232,233,242,225,231,225,238, 97,128, 48,104,235, - 225,244,225,235,225,238, 97,129, 48,200,192,220,232,225,236,230, - 247,233,228,244,104,128,255,132,110, 3,192,240,193, 82,193, 87, - 101, 4,192,250,193, 63,193, 70,193, 76,226,225,114, 4,193, 6, - 193, 35,193, 45,193, 54,229,248,244,242, 97, 2,193, 16,193, 26, - 232,233,231,232,237,239,100,128, 2,229,236,239,247,237,239,100, - 128, 2,233,232,233,231,232,237,239,100,128, 2,230,236,239,247, - 237,239,100,128, 2,232,237,233,228,237,239,100,128, 2,231,230, - 233,246,101,128, 1,189,243,233,120,128, 1,133,244,247,111,128, - 1,168,239,115,128, 3,132,243,241,245,225,242,101,128, 51, 39, - 240,225,244,225,235,244,232,225,105,128, 14, 15,242,244,239,233, - 243,229,243,232,229,236,236,226,242,225,227,235,229,116, 2,193, - 131,193,161,236,229,230,116,130, 48, 20,193,142,193,150,243,237, - 225,236,108,128,254, 93,246,229,242,244,233,227,225,108,128,254, - 57,242,233,231,232,116,130, 48, 21,193,173,193,181,243,237,225, - 236,108,128,254, 94,246,229,242,244,233,227,225,108,128,254, 58, - 244,225,239,244,232,225,105,128, 14, 21,240, 97, 2,193,209,193, - 221,236,225,244,225,236,232,239,239,107,128, 1,171,242,229,110, - 128, 36,175,114, 3,193,235,194, 10,194, 25,225,228,229,237,225, - 242,107,129, 33, 34,193,247,115, 2,193,253,194, 3,225,238,115, - 128,248,234,229,242,233,102,128,246,219,229,244,242,239,230,236, - 229,248,232,239,239,107,128, 2,136,233,225,103, 4,194, 37,194, - 42,194, 47,194, 52,228,110,128, 37,188,236,102,128, 37,196,242, - 116,128, 37,186,245,112,128, 37,178,115,132, 2,166,194, 69,194, - 108,194,214,194,227,225,228,105,130, 5,230,194, 79,194, 99,228, - 225,231,229,243,104,129,251, 70,194, 90,232,229,226,242,229,119, - 128,251, 70,232,229,226,242,229,119,128, 5,230,101, 2,194,114, - 194,125,227,249,242,233,236,236,233, 99,128, 4, 70,242,101,134, - 5,181,194,142,194,156,194,161,194,170,194,185,194,201, 49, 2, - 194,148,194,152, 50,128, 5,181,101,128, 5,181,178, 98,128, 5, - 181,232,229,226,242,229,119,128, 5,181,238,225,242,242,239,247, - 232,229,226,242,229,119,128, 5,181,241,245,225,242,244,229,242, - 232,229,226,242,229,119,128, 5,181,247,233,228,229,232,229,226, - 242,229,119,128, 5,181,232,229,227,249,242,233,236,236,233, 99, - 128, 4, 91,245,240,229,242,233,239,114,128,246,243,116, 4,194, - 247,195, 41,195,106,195,157, 97, 3,194,255,195, 9,195, 16,226, - 229,238,231,225,236,105,128, 9,159,228,229,246, 97,128, 9, 31, - 231,117, 2,195, 23,195, 32,234,225,242,225,244,105,128, 10,159, - 242,237,245,235,232,105,128, 10, 31,229,104, 4,195, 52,195, 61, - 195, 75,195, 91,225,242,225,226,233, 99,128, 6,121,230,233,238, - 225,236,225,242,225,226,233, 99,128,251,103,233,238,233,244,233, - 225,236,225,242,225,226,233, 99,128,251,104,237,229,228,233,225, - 236,225,242,225,226,233, 99,128,251,105,232, 97, 3,195,115,195, - 125,195,132,226,229,238,231,225,236,105,128, 9,160,228,229,246, - 97,128, 9, 32,231,117, 2,195,139,195,148,234,225,242,225,244, - 105,128, 10,160,242,237,245,235,232,105,128, 10, 32,245,242,238, - 229,100,128, 2,135,117, 3,195,173,195,184,195,209,232,233,242, - 225,231,225,238, 97,128, 48,100,235,225,244,225,235,225,238, 97, - 129, 48,196,195,197,232,225,236,230,247,233,228,244,104,128,255, - 130,243,237,225,236,108, 2,195,219,195,230,232,233,242,225,231, - 225,238, 97,128, 48, 99,235,225,244,225,235,225,238, 97,129, 48, - 195,195,243,232,225,236,230,247,233,228,244,104,128,255,111,119, - 2,196, 5,196,110,101, 2,196, 11,196, 59,236,246,101, 3,196, - 21,196, 30,196, 51,227,233,242,227,236,101,128, 36,107,112, 2, - 196, 36,196, 43,225,242,229,110,128, 36,127,229,242,233,239,100, - 128, 36,147,242,239,237,225,110,128, 33,123,238,244,121, 3,196, - 69,196, 78,196, 89,227,233,242,227,236,101,128, 36,115,232,225, - 238,231,250,232,239,117,128, 83, 68,112, 2,196, 95,196,102,225, - 242,229,110,128, 36,135,229,242,233,239,100,128, 36,155,111,142, - 0, 50,196,142,196,151,196,161,196,191,196,243,197, 12,197, 39, - 197, 73,197, 85,197,104,197,115,197,148,197,156,197,180,225,242, - 225,226,233, 99,128, 6, 98,226,229,238,231,225,236,105,128, 9, - 232,227,233,242,227,236,101,129, 36, 97,196,172,233,238,246,229, - 242,243,229,243,225,238,243,243,229,242,233,102,128, 39,139,100, - 2,196,197,196,203,229,246, 97,128, 9,104,239,116, 2,196,210, - 196,221,229,238,236,229,225,228,229,114,128, 32, 37,236,229,225, - 228,229,114,129, 32, 37,196,232,246,229,242,244,233,227,225,108, - 128,254, 48,231,117, 2,196,250,197, 3,234,225,242,225,244,105, - 128, 10,232,242,237,245,235,232,105,128, 10,104,232, 97, 2,197, - 19,197, 30,227,235,225,242,225,226,233, 99,128, 6, 98,238,231, - 250,232,239,117,128, 48, 34,105, 2,197, 45,197, 63,228,229,239, - 231,242,225,240,232,233,227,240,225,242,229,110,128, 50, 33,238, - 230,229,242,233,239,114,128, 32,130,237,239,238,239,243,240,225, - 227,101,128,255, 18,238,245,237,229,242,225,244,239,242,226,229, - 238,231,225,236,105,128, 9,245,239,236,228,243,244,249,236,101, - 128,247, 50,112, 2,197,121,197,128,225,242,229,110,128, 36,117, - 229,114, 2,197,135,197,141,233,239,100,128, 36,137,243,233,225, - 110,128, 6,242,242,239,237,225,110,128, 33,113,115, 2,197,162, - 197,170,244,242,239,235,101,128, 1,187,245,240,229,242,233,239, - 114,128, 0,178,244,104, 2,197,187,197,192,225,105,128, 14, 82, - 233,242,228,115,128, 33, 84,117,145, 0,117,197,237,197,245,198, - 30,198, 87,198,225,199, 6,199,129,199,145,199,196,200, 10,200, - 91,200,100,200,219,200,243,201, 95,201,123,201,237,225,227,245, - 244,101,128, 0,250, 98, 4,197,255,198, 4,198, 13,198, 23,225, - 114,128, 2,137,229,238,231,225,236,105,128, 9,137,239,240,239, - 237,239,230,111,128, 49, 40,242,229,246,101,128, 1,109, 99, 3, - 198, 38,198, 45,198, 77,225,242,239,110,128, 1,212,233,242, 99, - 2,198, 53,198, 58,236,101,128, 36,228,245,237,230,236,229,120, - 129, 0,251,198, 69,226,229,236,239,119,128, 30,119,249,242,233, - 236,236,233, 99,128, 4, 67,100, 5,198, 99,198,110,198,133,198, - 139,198,215,225,244,244,225,228,229,246, 97,128, 9, 81,226,108, - 2,198,117,198,125,225,227,245,244,101,128, 1,113,231,242,225, - 246,101,128, 2, 21,229,246, 97,128, 9, 9,233,229,242,229,243, - 233,115,133, 0,252,198,159,198,167,198,175,198,198,198,206,225, - 227,245,244,101,128, 1,216,226,229,236,239,119,128, 30,115, 99, - 2,198,181,198,188,225,242,239,110,128, 1,218,249,242,233,236, - 236,233, 99,128, 4,241,231,242,225,246,101,128, 1,220,237,225, - 227,242,239,110,128, 1,214,239,244,226,229,236,239,119,128, 30, - 229,103, 2,198,231,198,238,242,225,246,101,128, 0,249,117, 2, - 198,244,198,253,234,225,242,225,244,105,128, 10,137,242,237,245, - 235,232,105,128, 10, 9,104, 3,199, 14,199, 24,199,102,233,242, - 225,231,225,238, 97,128, 48, 70,111, 2,199, 30,199, 40,239,235, - 225,226,239,246,101,128, 30,231,242,110,133, 1,176,199, 55,199, - 63,199, 74,199, 82,199, 94,225,227,245,244,101,128, 30,233,228, - 239,244,226,229,236,239,119,128, 30,241,231,242,225,246,101,128, - 30,235,232,239,239,235,225,226,239,246,101,128, 30,237,244,233, - 236,228,101,128, 30,239,245,238,231,225,242,245,237,236,225,245, - 116,129, 1,113,199,118,227,249,242,233,236,236,233, 99,128, 4, - 243,233,238,246,229,242,244,229,228,226,242,229,246,101,128, 2, - 23,107, 3,199,153,199,177,199,188,225,244,225,235,225,238, 97, - 129, 48,166,199,165,232,225,236,230,247,233,228,244,104,128,255, - 115,227,249,242,233,236,236,233, 99,128, 4,121,239,242,229,225, - 110,128, 49, 92,109, 2,199,202,199,255, 97, 2,199,208,199,241, - 227,242,239,110,130, 1,107,199,219,199,230,227,249,242,233,236, - 236,233, 99,128, 4,239,228,233,229,242,229,243,233,115,128, 30, - 123,244,242,225,231,245,242,237,245,235,232,105,128, 10, 65,239, - 238,239,243,240,225,227,101,128,255, 85,110, 2,200, 16,200, 71, - 228,229,242,243,227,239,242,101,132, 0, 95,200, 35,200, 41,200, - 53,200, 64,228,226,108,128, 32, 23,237,239,238,239,243,240,225, - 227,101,128,255, 63,246,229,242,244,233,227,225,108,128,254, 51, - 247,225,246,121,128,254, 79,105, 2,200, 77,200, 82,239,110,128, - 34, 42,246,229,242,243,225,108,128, 34, 0,239,231,239,238,229, - 107,128, 1,115,112, 5,200,112,200,119,200,127,200,142,200,193, - 225,242,229,110,128, 36,176,226,236,239,227,107,128, 37,128,240, - 229,242,228,239,244,232,229,226,242,229,119,128, 5,196,243,233, - 236,239,110,131, 3,197,200,156,200,177,200,185,228,233,229,242, - 229,243,233,115,129, 3,203,200,169,244,239,238,239,115,128, 3, - 176,236,225,244,233,110,128, 2,138,244,239,238,239,115,128, 3, - 205,244,225,227,107, 2,200,202,200,213,226,229,236,239,247,227, - 237, 98,128, 3, 29,237,239,100,128, 2,212,114, 2,200,225,200, - 237,225,231,245,242,237,245,235,232,105,128, 10,115,233,238,103, - 128, 1,111,115, 3,200,251,201, 10,201, 55,232,239,242,244,227, - 249,242,233,236,236,233, 99,128, 4, 94,237,225,236,108, 2,201, - 19,201, 30,232,233,242,225,231,225,238, 97,128, 48, 69,235,225, - 244,225,235,225,238, 97,129, 48,165,201, 43,232,225,236,230,247, - 233,228,244,104,128,255,105,244,242,225,233,231,232,116, 2,201, - 67,201, 78,227,249,242,233,236,236,233, 99,128, 4,175,243,244, - 242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,177,244, - 233,236,228,101,130, 1,105,201,107,201,115,225,227,245,244,101, - 128, 30,121,226,229,236,239,119,128, 30,117,117, 5,201,135,201, - 145,201,152,201,177,201,193,226,229,238,231,225,236,105,128, 9, - 138,228,229,246, 97,128, 9, 10,231,117, 2,201,159,201,168,234, - 225,242,225,244,105,128, 10,138,242,237,245,235,232,105,128, 10, - 10,237,225,244,242,225,231,245,242,237,245,235,232,105,128, 10, - 66,246,239,247,229,236,243,233,231,110, 3,201,209,201,219,201, - 226,226,229,238,231,225,236,105,128, 9,194,228,229,246, 97,128, - 9, 66,231,245,234,225,242,225,244,105,128, 10,194,246,239,247, - 229,236,243,233,231,110, 3,201,253,202, 7,202, 14,226,229,238, - 231,225,236,105,128, 9,193,228,229,246, 97,128, 9, 65,231,245, - 234,225,242,225,244,105,128, 10,193,118,139, 0,118,202, 51,202, - 199,202,208,202,219,203,148,203,155,203,253,204, 9,204,109,204, - 117,204,138, 97, 4,202, 61,202, 68,202, 93,202,104,228,229,246, - 97,128, 9, 53,231,117, 2,202, 75,202, 84,234,225,242,225,244, - 105,128, 10,181,242,237,245,235,232,105,128, 10, 53,235,225,244, - 225,235,225,238, 97,128, 48,247,118,132, 5,213,202,116,202,143, - 202,175,202,187,228,225,231,229,243,104,130,251, 53,202,129,202, - 134,182, 53,128,251, 53,232,229,226,242,229,119,128,251, 53,104, - 2,202,149,202,157,229,226,242,229,119,128, 5,213,239,236,225, - 109,129,251, 75,202,166,232,229,226,242,229,119,128,251, 75,246, - 225,246,232,229,226,242,229,119,128, 5,240,249,239,228,232,229, - 226,242,229,119,128, 5,241,227,233,242,227,236,101,128, 36,229, - 228,239,244,226,229,236,239,119,128, 30,127,101, 6,202,233,202, - 244,203, 52,203, 63,203, 69,203,136,227,249,242,233,236,236,233, - 99,128, 4, 50,104, 4,202,254,203, 7,203, 21,203, 37,225,242, - 225,226,233, 99,128, 6,164,230,233,238,225,236,225,242,225,226, - 233, 99,128,251,107,233,238,233,244,233,225,236,225,242,225,226, - 233, 99,128,251,108,237,229,228,233,225,236,225,242,225,226,233, - 99,128,251,109,235,225,244,225,235,225,238, 97,128, 48,249,238, - 245,115,128, 38, 64,242,244,233,227,225,108, 2,203, 80,203, 86, - 226,225,114,128, 0,124,236,233,238,101, 4,203, 99,203,110,203, - 121,203,130,225,226,239,246,229,227,237, 98,128, 3, 13,226,229, - 236,239,247,227,237, 98,128, 3, 41,236,239,247,237,239,100,128, - 2,204,237,239,100,128, 2,200,247,225,242,237,229,238,233,225, - 110,128, 5,126,232,239,239,107,128, 2,139,105, 3,203,163,203, - 174,203,213,235,225,244,225,235,225,238, 97,128, 48,248,242,225, - 237, 97, 3,203,185,203,195,203,202,226,229,238,231,225,236,105, - 128, 9,205,228,229,246, 97,128, 9, 77,231,245,234,225,242,225, - 244,105,128, 10,205,243,225,242,231, 97, 3,203,225,203,235,203, - 242,226,229,238,231,225,236,105,128, 9,131,228,229,246, 97,128, - 9, 3,231,245,234,225,242,225,244,105,128, 10,131,237,239,238, - 239,243,240,225,227,101,128,255, 86,111, 3,204, 17,204, 28,204, - 98,225,242,237,229,238,233,225,110,128, 5,120,233,227,229,100, - 2,204, 37,204, 73,233,244,229,242,225,244,233,239,110, 2,204, - 51,204, 62,232,233,242,225,231,225,238, 97,128, 48,158,235,225, - 244,225,235,225,238, 97,128, 48,254,237,225,242,235,235,225,238, - 97,129, 48,155,204, 86,232,225,236,230,247,233,228,244,104,128, - 255,158,235,225,244,225,235,225,238, 97,128, 48,250,240,225,242, - 229,110,128, 36,177,116, 2,204,123,204,130,233,236,228,101,128, - 30,125,245,242,238,229,100,128, 2,140,117, 2,204,144,204,155, - 232,233,242,225,231,225,238, 97,128, 48,148,235,225,244,225,235, - 225,238, 97,128, 48,244,119,143, 0,119,204,200,205,177,205,187, - 205,210,205,250,206, 61,206, 69,208, 40,208, 81,208, 93,208,168, - 208,176,208,183,208,194,208,203, 97, 8,204,218,204,225,204,235, - 204,246,205, 28,205, 60,205, 72,205,108,227,245,244,101,128, 30, - 131,229,235,239,242,229,225,110,128, 49, 89,232,233,242,225,231, - 225,238, 97,128, 48,143,107, 2,204,252,205, 20,225,244,225,235, - 225,238, 97,129, 48,239,205, 8,232,225,236,230,247,233,228,244, - 104,128,255,156,239,242,229,225,110,128, 49, 88,243,237,225,236, - 108, 2,205, 38,205, 49,232,233,242,225,231,225,238, 97,128, 48, - 142,235,225,244,225,235,225,238, 97,128, 48,238,244,244,239,243, - 241,245,225,242,101,128, 51, 87,118, 2,205, 78,205, 86,229,228, - 225,243,104,128, 48, 28,249,245,238,228,229,242,243,227,239,242, - 229,246,229,242,244,233,227,225,108,128,254, 52,119, 3,205,116, - 205,125,205,139,225,242,225,226,233, 99,128, 6, 72,230,233,238, - 225,236,225,242,225,226,233, 99,128,254,238,232,225,237,250,225, - 225,226,239,246,101, 2,205,154,205,163,225,242,225,226,233, 99, - 128, 6, 36,230,233,238,225,236,225,242,225,226,233, 99,128,254, - 134,226,243,241,245,225,242,101,128, 51,221,227,233,242, 99, 2, - 205,196,205,201,236,101,128, 36,230,245,237,230,236,229,120,128, - 1,117,100, 2,205,216,205,226,233,229,242,229,243,233,115,128, - 30,133,239,116, 2,205,233,205,242,225,227,227,229,238,116,128, - 30,135,226,229,236,239,119,128, 30,137,101, 4,206, 4,206, 15, - 206, 27,206, 51,232,233,242,225,231,225,238, 97,128, 48,145,233, - 229,242,243,244,242,225,243,115,128, 33, 24,107, 2,206, 33,206, - 43,225,244,225,235,225,238, 97,128, 48,241,239,242,229,225,110, - 128, 49, 94,239,235,239,242,229,225,110,128, 49, 93,231,242,225, - 246,101,128, 30,129,232,233,244,101, 8,206, 90,206, 99,206,183, - 207, 17,207,101,207,146,207,198,207,254,226,245,236,236,229,116, - 128, 37,230, 99, 2,206,105,206,125,233,242,227,236,101,129, 37, - 203,206,115,233,238,246,229,242,243,101,128, 37,217,239,242,238, - 229,242,226,242,225,227,235,229,116, 2,206,142,206,162,236,229, - 230,116,129, 48, 14,206,151,246,229,242,244,233,227,225,108,128, - 254, 67,242,233,231,232,116,129, 48, 15,206,172,246,229,242,244, - 233,227,225,108,128,254, 68,100, 2,206,189,206,230,233,225,237, - 239,238,100,129, 37,199,206,200,227,239,238,244,225,233,238,233, - 238,231,226,236,225,227,235,243,237,225,236,236,228,233,225,237, - 239,238,100,128, 37,200,239,247,238,240,239,233,238,244,233,238, - 103, 2,206,246,207, 6,243,237,225,236,236,244,242,233,225,238, - 231,236,101,128, 37,191,244,242,233,225,238,231,236,101,128, 37, - 189,236,101, 2,207, 24,207, 66,230,244,240,239,233,238,244,233, - 238,103, 2,207, 39,207, 55,243,237,225,236,236,244,242,233,225, - 238,231,236,101,128, 37,195,244,242,233,225,238,231,236,101,128, - 37,193,238,244,233,227,245,236,225,242,226,242,225,227,235,229, - 116, 2,207, 86,207, 93,236,229,230,116,128, 48, 22,242,233,231, - 232,116,128, 48, 23,242,233,231,232,244,240,239,233,238,244,233, - 238,103, 2,207,119,207,135,243,237,225,236,236,244,242,233,225, - 238,231,236,101,128, 37,185,244,242,233,225,238,231,236,101,128, - 37,183,115, 3,207,154,207,184,207,192,109, 2,207,160,207,172, - 225,236,236,243,241,245,225,242,101,128, 37,171,233,236,233,238, - 231,230,225,227,101,128, 38, 58,241,245,225,242,101,128, 37,161, - 244,225,114,128, 38, 6,116, 2,207,204,207,215,229,236,229,240, - 232,239,238,101,128, 38, 15,239,242,244,239,233,243,229,243,232, - 229,236,236,226,242,225,227,235,229,116, 2,207,239,207,246,236, - 229,230,116,128, 48, 24,242,233,231,232,116,128, 48, 25,245,240, - 240,239,233,238,244,233,238,103, 2,208, 13,208, 29,243,237,225, - 236,236,244,242,233,225,238,231,236,101,128, 37,181,244,242,233, - 225,238,231,236,101,128, 37,179,105, 2,208, 46,208, 57,232,233, - 242,225,231,225,238, 97,128, 48,144,107, 2,208, 63,208, 73,225, - 244,225,235,225,238, 97,128, 48,240,239,242,229,225,110,128, 49, - 95,237,239,238,239,243,240,225,227,101,128,255, 87,111, 4,208, - 103,208,114,208,139,208,157,232,233,242,225,231,225,238, 97,128, - 48,146,235,225,244,225,235,225,238, 97,129, 48,242,208,127,232, - 225,236,230,247,233,228,244,104,128,255,102,110,129, 32,169,208, - 145,237,239,238,239,243,240,225,227,101,128,255,230,247,225,229, - 238,244,232,225,105,128, 14, 39,240,225,242,229,110,128, 36,178, - 242,233,238,103,128, 30,152,243,245,240,229,242,233,239,114,128, - 2,183,244,245,242,238,229,100,128, 2,141,249,238,110,128, 1, - 191,120,137, 0,120,208,231,208,242,208,253,209, 6,209, 33,209, - 46,209, 50,209, 62,209, 70,225,226,239,246,229,227,237, 98,128, - 3, 61,226,239,240,239,237,239,230,111,128, 49, 18,227,233,242, - 227,236,101,128, 36,231,100, 2,209, 12,209, 22,233,229,242,229, - 243,233,115,128, 30,141,239,244,225,227,227,229,238,116,128, 30, - 139,229,232,225,242,237,229,238,233,225,110,128, 5,109,105,128, - 3,190,237,239,238,239,243,240,225,227,101,128,255, 88,240,225, - 242,229,110,128, 36,179,243,245,240,229,242,233,239,114,128, 2, - 227,121,143, 0,121,209,115,210, 74,210, 97,210,137,212,103,212, - 111,212,128,212,192,212,204,213,201,213,241,213,253,214, 8,214, - 29,215, 2, 97, 11,209,139,209,151,209,161,209,168,209,175,209, - 185,209,210,209,221,210, 3,210, 16,210, 62,225,228,239,243,241, - 245,225,242,101,128, 51, 78,226,229,238,231,225,236,105,128, 9, - 175,227,245,244,101,128, 0,253,228,229,246, 97,128, 9, 47,229, - 235,239,242,229,225,110,128, 49, 82,231,117, 2,209,192,209,201, - 234,225,242,225,244,105,128, 10,175,242,237,245,235,232,105,128, - 10, 47,232,233,242,225,231,225,238, 97,128, 48,132,107, 2,209, - 227,209,251,225,244,225,235,225,238, 97,129, 48,228,209,239,232, - 225,236,230,247,233,228,244,104,128,255,148,239,242,229,225,110, - 128, 49, 81,237,225,235,235,225,238,244,232,225,105,128, 14, 78, - 243,237,225,236,108, 2,210, 26,210, 37,232,233,242,225,231,225, - 238, 97,128, 48,131,235,225,244,225,235,225,238, 97,129, 48,227, - 210, 50,232,225,236,230,247,233,228,244,104,128,255,108,244,227, - 249,242,233,236,236,233, 99,128, 4, 99,227,233,242, 99, 2,210, - 83,210, 88,236,101,128, 36,232,245,237,230,236,229,120,128, 1, - 119,100, 2,210,103,210,113,233,229,242,229,243,233,115,128, 0, - 255,239,116, 2,210,120,210,129,225,227,227,229,238,116,128, 30, - 143,226,229,236,239,119,128, 30,245,101, 7,210,153,211,161,211, - 170,211,188,211,220,212, 40,212, 91,104, 8,210,171,210,180,210, - 214,210,228,211, 45,211, 61,211,120,211,138,225,242,225,226,233, - 99,128, 6, 74,226,225,242,242,229,101, 2,210,191,210,200,225, - 242,225,226,233, 99,128, 6,210,230,233,238,225,236,225,242,225, - 226,233, 99,128,251,175,230,233,238,225,236,225,242,225,226,233, - 99,128,254,242,232,225,237,250,225,225,226,239,246,101, 4,210, - 247,211, 0,211, 14,211, 30,225,242,225,226,233, 99,128, 6, 38, - 230,233,238,225,236,225,242,225,226,233, 99,128,254,138,233,238, - 233,244,233,225,236,225,242,225,226,233, 99,128,254,139,237,229, - 228,233,225,236,225,242,225,226,233, 99,128,254,140,233,238,233, - 244,233,225,236,225,242,225,226,233, 99,128,254,243,237,101, 2, - 211, 68,211, 81,228,233,225,236,225,242,225,226,233, 99,128,254, - 244,229,237,105, 2,211, 89,211,104,238,233,244,233,225,236,225, - 242,225,226,233, 99,128,252,221,243,239,236,225,244,229,228,225, - 242,225,226,233, 99,128,252, 88,238,239,239,238,230,233,238,225, - 236,225,242,225,226,233, 99,128,252,148,244,232,242,229,229,228, - 239,244,243,226,229,236,239,247,225,242,225,226,233, 99,128, 6, - 209,235,239,242,229,225,110,128, 49, 86,110,129, 0,165,211,176, - 237,239,238,239,243,240,225,227,101,128,255,229,111, 2,211,194, - 211,203,235,239,242,229,225,110,128, 49, 85,242,233,238,232,233, - 229,245,232,235,239,242,229,225,110,128, 49,134,114, 3,211,228, - 212, 8,212, 20,225,232,226,229,238,249,239,237,111, 2,211,242, - 211,251,232,229,226,242,229,119,128, 5,170,236,229,230,244,232, - 229,226,242,229,119,128, 5,170,233,227,249,242,233,236,236,233, - 99,128, 4, 75,245,228,233,229,242,229,243,233,243,227,249,242, - 233,236,236,233, 99,128, 4,249,243,233,229,245,238,103, 3,212, - 53,212, 62,212, 78,235,239,242,229,225,110,128, 49,129,240,225, - 238,243,233,239,243,235,239,242,229,225,110,128, 49,131,243,233, - 239,243,235,239,242,229,225,110,128, 49,130,244,233,246,232,229, - 226,242,229,119,128, 5,154,231,242,225,246,101,128, 30,243,232, - 239,239,107,129, 1,180,212,120,225,226,239,246,101,128, 30,247, - 105, 5,212,140,212,151,212,162,212,171,212,179,225,242,237,229, - 238,233,225,110,128, 5,117,227,249,242,233,236,236,233, 99,128, - 4, 87,235,239,242,229,225,110,128, 49, 98,238,249,225,238,103, - 128, 38, 47,247,238,225,242,237,229,238,233,225,110,128, 5,130, - 237,239,238,239,243,240,225,227,101,128,255, 89,111, 7,212,220, - 213, 34,213, 45,213, 55,213, 93,213,139,213,148,100,131, 5,217, - 212,230,212,250,213, 3,228,225,231,229,243,104,129,251, 57,212, - 241,232,229,226,242,229,119,128,251, 57,232,229,226,242,229,119, - 128, 5,217,249,239,100, 2,213, 11,213, 20,232,229,226,242,229, - 119,128, 5,242,240,225,244,225,232,232,229,226,242,229,119,128, - 251, 31,232,233,242,225,231,225,238, 97,128, 48,136,233,235,239, - 242,229,225,110,128, 49,137,107, 2,213, 61,213, 85,225,244,225, - 235,225,238, 97,129, 48,232,213, 73,232,225,236,230,247,233,228, - 244,104,128,255,150,239,242,229,225,110,128, 49, 91,243,237,225, - 236,108, 2,213,103,213,114,232,233,242,225,231,225,238, 97,128, - 48,135,235,225,244,225,235,225,238, 97,129, 48,231,213,127,232, - 225,236,230,247,233,228,244,104,128,255,110,244,231,242,229,229, - 107,128, 3,243,121, 2,213,154,213,191, 97, 2,213,160,213,170, - 229,235,239,242,229,225,110,128, 49,136,107, 2,213,176,213,184, - 239,242,229,225,110,128, 49,135,244,232,225,105,128, 14, 34,233, - 238,231,244,232,225,105,128, 14, 13,112, 2,213,207,213,214,225, - 242,229,110,128, 36,180,239,231,229,231,242,225,237,237,229,238, - 105,129, 3,122,213,230,231,242,229,229,235,227,237, 98,128, 3, - 69,114,129, 1,166,213,247,233,238,103,128, 30,153,243,245,240, - 229,242,233,239,114,128, 2,184,116, 2,214, 14,214, 21,233,236, - 228,101,128, 30,249,245,242,238,229,100,128, 2,142,117, 5,214, - 41,214, 52,214, 62,214,100,214,232,232,233,242,225,231,225,238, - 97,128, 48,134,233,235,239,242,229,225,110,128, 49,140,107, 2, - 214, 68,214, 92,225,244,225,235,225,238, 97,129, 48,230,214, 80, - 232,225,236,230,247,233,228,244,104,128,255,149,239,242,229,225, - 110,128, 49, 96,115, 3,214,108,214,146,214,187,226,233,103, 2, - 214,116,214,127,227,249,242,233,236,236,233, 99,128, 4,107,233, - 239,244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, - 4,109,236,233,244,244,236,101, 2,214,157,214,168,227,249,242, - 233,236,236,233, 99,128, 4,103,233,239,244,233,230,233,229,228, - 227,249,242,233,236,236,233, 99,128, 4,105,237,225,236,108, 2, - 214,196,214,207,232,233,242,225,231,225,238, 97,128, 48,133,235, - 225,244,225,235,225,238, 97,129, 48,229,214,220,232,225,236,230, - 247,233,228,244,104,128,255,109,249,101, 2,214,239,214,248,235, - 239,242,229,225,110,128, 49,139,239,235,239,242,229,225,110,128, - 49,138,249, 97, 2,215, 9,215, 19,226,229,238,231,225,236,105, - 128, 9,223,228,229,246, 97,128, 9, 95,122,142, 0,122,215, 58, - 216, 66,216, 77,216,120,216,147,217,182,218, 34,218, 76,218, 88, - 218,100,218,128,218,136,218,152,218,161, 97, 10,215, 80,215, 91, - 215, 98,215,105,215,116,215,194,215,224,215,235,216, 15,216, 27, - 225,242,237,229,238,233,225,110,128, 5,102,227,245,244,101,128, - 1,122,228,229,246, 97,128, 9, 91,231,245,242,237,245,235,232, - 105,128, 10, 91,104, 4,215,126,215,135,215,149,215,179,225,242, - 225,226,233, 99,128, 6, 56,230,233,238,225,236,225,242,225,226, - 233, 99,128,254,198,105, 2,215,155,215,170,238,233,244,233,225, - 236,225,242,225,226,233, 99,128,254,199,242,225,231,225,238, 97, - 128, 48, 86,237,229,228,233,225,236,225,242,225,226,233, 99,128, - 254,200,233,110, 2,215,201,215,210,225,242,225,226,233, 99,128, - 6, 50,230,233,238,225,236,225,242,225,226,233, 99,128,254,176, - 235,225,244,225,235,225,238, 97,128, 48,182,241,229,102, 2,215, - 243,216, 1,231,225,228,239,236,232,229,226,242,229,119,128, 5, - 149,241,225,244,225,238,232,229,226,242,229,119,128, 5,148,242, - 241,225,232,229,226,242,229,119,128, 5,152,249,233,110,130, 5, - 214,216, 37,216, 57,228,225,231,229,243,104,129,251, 54,216, 48, - 232,229,226,242,229,119,128,251, 54,232,229,226,242,229,119,128, - 5,214,226,239,240,239,237,239,230,111,128, 49, 23, 99, 3,216, - 85,216, 92,216,114,225,242,239,110,128, 1,126,233,242, 99, 2, - 216,100,216,105,236,101,128, 36,233,245,237,230,236,229,120,128, - 30,145,245,242,108,128, 2,145,228,239,116,130, 1,124,216,130, - 216,139,225,227,227,229,238,116,128, 1,124,226,229,236,239,119, - 128, 30,147,101, 6,216,161,216,172,216,215,216,226,216,237,217, - 177,227,249,242,233,236,236,233, 99,128, 4, 55,100, 2,216,178, - 216,197,229,243,227,229,238,228,229,242,227,249,242,233,236,236, - 233, 99,128, 4,153,233,229,242,229,243,233,243,227,249,242,233, - 236,236,233, 99,128, 4,223,232,233,242,225,231,225,238, 97,128, - 48, 92,235,225,244,225,235,225,238, 97,128, 48,188,242,111,140, - 0, 48,217, 10,217, 19,217, 29,217, 36,217, 61,217, 74,217, 85, - 217, 97,217,108,217,118,217,129,217,136,225,242,225,226,233, 99, - 128, 6, 96,226,229,238,231,225,236,105,128, 9,230,228,229,246, - 97,128, 9,102,231,117, 2,217, 43,217, 52,234,225,242,225,244, - 105,128, 10,230,242,237,245,235,232,105,128, 10,102,232,225,227, - 235,225,242,225,226,233, 99,128, 6, 96,233,238,230,229,242,233, - 239,114,128, 32,128,237,239,238,239,243,240,225,227,101,128,255, - 16,239,236,228,243,244,249,236,101,128,247, 48,240,229,242,243, - 233,225,110,128, 6,240,243,245,240,229,242,233,239,114,128, 32, - 112,244,232,225,105,128, 14, 80,247,233,228,244,104, 3,217,148, - 217,157,217,169,234,239,233,238,229,114,128,254,255,238,239,238, - 234,239,233,238,229,114,128, 32, 12,243,240,225,227,101,128, 32, - 11,244, 97,128, 3,182,104, 2,217,188,217,199,226,239,240,239, - 237,239,230,111,128, 49, 19,101, 4,217,209,217,220,217,236,217, - 247,225,242,237,229,238,233,225,110,128, 5,106,226,242,229,246, - 229,227,249,242,233,236,236,233, 99,128, 4,194,227,249,242,233, - 236,236,233, 99,128, 4, 54,100, 2,217,253,218, 16,229,243,227, - 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,151, - 233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, - 4,221,105, 3,218, 42,218, 53,218, 64,232,233,242,225,231,225, - 238, 97,128, 48, 88,235,225,244,225,235,225,238, 97,128, 48,184, - 238,239,242,232,229,226,242,229,119,128, 5,174,236,233,238,229, - 226,229,236,239,119,128, 30,149,237,239,238,239,243,240,225,227, - 101,128,255, 90,111, 2,218,106,218,117,232,233,242,225,231,225, - 238, 97,128, 48, 94,235,225,244,225,235,225,238, 97,128, 48,190, - 240,225,242,229,110,128, 36,181,242,229,244,242,239,230,236,229, - 248,232,239,239,107,128, 2,144,243,244,242,239,235,101,128, 1, - 182,117, 2,218,167,218,178,232,233,242,225,231,225,238, 97,128, - 48, 90,235,225,244,225,235,225,238, 97,128, 48,186 - }; - - - /* - * This function searches the compressed table efficiently. - */ - static unsigned long - ft_get_adobe_glyph_index( const char* name, - const char* limit ) - { - int c = 0; - int count, min, max; - const unsigned char* p = ft_adobe_glyph_list; - - - if ( name == 0 || name >= limit ) - goto NotFound; - - c = *name++; - count = p[1]; - p += 2; - - min = 0; - max = count; - - while ( min < max ) - { - int mid = ( min + max ) >> 1; - const unsigned char* q = p + mid * 2; - int c2; - - - q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] ); - - c2 = q[0] & 127; - if ( c2 == c ) - { - p = q; - goto Found; - } - if ( c2 < c ) - min = mid + 1; - else - max = mid; - } - goto NotFound; - - Found: - for (;;) - { - /* assert (*p & 127) == c */ - - if ( name >= limit ) - { - if ( (p[0] & 128) == 0 && - (p[1] & 128) != 0 ) - return (unsigned long)( ( (int)p[2] << 8 ) | p[3] ); - - goto NotFound; - } - c = *name++; - if ( p[0] & 128 ) - { - p++; - if ( c != (p[0] & 127) ) - goto NotFound; - - continue; - } - - p++; - count = p[0] & 127; - if ( p[0] & 128 ) - p += 2; - - p++; - - for ( ; count > 0; count--, p += 2 ) - { - int offset = ( (int)p[0] << 8 ) | p[1]; - const unsigned char* q = ft_adobe_glyph_list + offset; - - if ( c == ( q[0] & 127 ) ) - { - p = q; - goto NextIter; - } - } - goto NotFound; - - NextIter: - ; - } - - NotFound: - return 0; - } - -#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ - - -/* END */ diff --git a/3party/freetype/src/psnames/rules.mk b/3party/freetype/src/psnames/rules.mk deleted file mode 100644 index 3c774867fd..0000000000 --- a/3party/freetype/src/psnames/rules.mk +++ /dev/null @@ -1,74 +0,0 @@ -# -# FreeType 2 PSNames driver configuration rules -# - - -# Copyright 1996-2015 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. - - -# PSNames driver directory -# -PSNAMES_DIR := $(SRC_DIR)/psnames - - -# compilation flags for the driver -# -PSNAMES_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(PSNAMES_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# PSNames driver sources (i.e., C files) -# -PSNAMES_DRV_SRC := $(PSNAMES_DIR)/psmodule.c \ - $(PSNAMES_DIR)/pspic.c - - -# PSNames driver headers -# -PSNAMES_DRV_H := $(PSNAMES_DRV_SRC:%.c=%.h) \ - $(PSNAMES_DIR)/psnamerr.h \ - $(PSNAMES_DIR)/pstables.h - - -# PSNames driver object(s) -# -# PSNAMES_DRV_OBJ_M is used during `multi' builds -# PSNAMES_DRV_OBJ_S is used during `single' builds -# -PSNAMES_DRV_OBJ_M := $(PSNAMES_DRV_SRC:$(PSNAMES_DIR)/%.c=$(OBJ_DIR)/%.$O) -PSNAMES_DRV_OBJ_S := $(OBJ_DIR)/psnames.$O - -# PSNames driver source file for single build -# -PSNAMES_DRV_SRC_S := $(PSNAMES_DIR)/psnames.c - - -# PSNames driver - single object -# -$(PSNAMES_DRV_OBJ_S): $(PSNAMES_DRV_SRC_S) $(PSNAMES_DRV_SRC) \ - $(FREETYPE_H) $(PSNAMES_DRV_H) - $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSNAMES_DRV_SRC_S)) - - -# PSNames driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(PSNAMES_DIR)/%.c $(FREETYPE_H) $(PSNAMES_DRV_H) - $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(PSNAMES_DRV_OBJ_S) -DRV_OBJS_M += $(PSNAMES_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/raster/Jamfile b/3party/freetype/src/raster/Jamfile deleted file mode 100644 index 71df5689ee..0000000000 --- a/3party/freetype/src/raster/Jamfile +++ /dev/null @@ -1,32 +0,0 @@ -# FreeType 2 src/raster Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) raster ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = ftraster - ftrend1 - rastpic - ; - } - else - { - _sources = raster ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/raster Jamfile diff --git a/3party/freetype/src/raster/ftmisc.h b/3party/freetype/src/raster/ftmisc.h deleted file mode 100644 index b87e0b62b7..0000000000 --- a/3party/freetype/src/raster/ftmisc.h +++ /dev/null @@ -1,142 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmisc.h */ -/* */ -/* Miscellaneous macros for stand-alone rasterizer (specification */ -/* only). */ -/* */ -/* Copyright 2005-2015 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. */ -/* */ -/***************************************************************************/ - - - /***************************************************/ - /* */ - /* This file is *not* portable! You have to adapt */ - /* its definitions to your platform. */ - /* */ - /***************************************************/ - -#ifndef __FTMISC_H__ -#define __FTMISC_H__ - - - /* memset */ -#include FT_CONFIG_STANDARD_LIBRARY_H - -#define FT_BEGIN_HEADER -#define FT_END_HEADER - -#define FT_LOCAL_DEF( x ) static x - - - /* from include/freetype/fttypes.h */ - - typedef unsigned char FT_Byte; - typedef signed int FT_Int; - typedef unsigned int FT_UInt; - typedef signed long FT_Long; - typedef unsigned long FT_ULong; - typedef signed long FT_F26Dot6; - typedef int FT_Error; - -#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ - ( ( (FT_ULong)_x1 << 24 ) | \ - ( (FT_ULong)_x2 << 16 ) | \ - ( (FT_ULong)_x3 << 8 ) | \ - (FT_ULong)_x4 ) - - - /* from include/freetype/ftsystem.h */ - - typedef struct FT_MemoryRec_* FT_Memory; - - typedef void* (*FT_Alloc_Func)( FT_Memory memory, - long size ); - - typedef void (*FT_Free_Func)( FT_Memory memory, - void* block ); - - typedef void* (*FT_Realloc_Func)( FT_Memory memory, - long cur_size, - long new_size, - void* block ); - - typedef struct FT_MemoryRec_ - { - void* user; - - FT_Alloc_Func alloc; - FT_Free_Func free; - FT_Realloc_Func realloc; - - } FT_MemoryRec; - - - /* from src/ftcalc.c */ - -#if ( defined _WIN32 || defined _WIN64 ) - - typedef __int64 FT_Int64; - -#else - -#include "inttypes.h" - - typedef int64_t FT_Int64; - -#endif - - - static FT_Long - FT_MulDiv( FT_Long a, - FT_Long b, - FT_Long c ) - { - FT_Int s; - FT_Long d; - - - s = 1; - if ( a < 0 ) { a = -a; s = -1; } - if ( b < 0 ) { b = -b; s = -s; } - if ( c < 0 ) { c = -c; s = -s; } - - d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c - : 0x7FFFFFFFL ); - - return ( s > 0 ) ? d : -d; - } - - - static FT_Long - FT_MulDiv_No_Round( FT_Long a, - FT_Long b, - FT_Long c ) - { - FT_Int s; - FT_Long d; - - - s = 1; - if ( a < 0 ) { a = -a; s = -1; } - if ( b < 0 ) { b = -b; s = -s; } - if ( c < 0 ) { c = -c; s = -s; } - - d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c - : 0x7FFFFFFFL ); - - return ( s > 0 ) ? d : -d; - } - -#endif /* __FTMISC_H__ */ - - -/* END */ diff --git a/3party/freetype/src/raster/ftraster.c b/3party/freetype/src/raster/ftraster.c deleted file mode 100644 index 8e9c79426a..0000000000 --- a/3party/freetype/src/raster/ftraster.c +++ /dev/null @@ -1,3202 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftraster.c */ -/* */ -/* The FreeType glyph rasterizer (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* This file can be compiled without the rest of the FreeType engine, by */ - /* defining the _STANDALONE_ macro when compiling it. You also need to */ - /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir) */ - /* directory. Typically, you should do something like */ - /* */ - /* - copy `src/raster/ftraster.c' (this file) to your current directory */ - /* */ - /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h' to your */ - /* current directory */ - /* */ - /* - compile `ftraster' with the _STANDALONE_ macro defined, as in */ - /* */ - /* cc -c -D_STANDALONE_ ftraster.c */ - /* */ - /* The renderer can be initialized with a call to */ - /* `ft_standard_raster.raster_new'; a bitmap can be generated */ - /* with a call to `ft_standard_raster.raster_render'. */ - /* */ - /* See the comments and documentation in the file `ftimage.h' for more */ - /* details on how the raster works. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This is a rewrite of the FreeType 1.x scan-line converter */ - /* */ - /*************************************************************************/ - -#ifdef _STANDALONE_ - - /* The size in bytes of the render pool used by the scan-line converter */ - /* to do all of its work. */ -#define FT_RENDER_POOL_SIZE 16384L - -#define FT_CONFIG_STANDARD_LIBRARY_H <stdlib.h> - -#include <string.h> /* for memset */ - -#include "ftmisc.h" -#include "ftimage.h" - -#else /* !_STANDALONE_ */ - -#include <ft2build.h> -#include "ftraster.h" -#include FT_INTERNAL_CALC_H /* for FT_MulDiv and FT_MulDiv_No_Round */ - -#include "rastpic.h" - -#endif /* !_STANDALONE_ */ - - - /*************************************************************************/ - /* */ - /* A simple technical note on how the raster works */ - /* ----------------------------------------------- */ - /* */ - /* Converting an outline into a bitmap is achieved in several steps: */ - /* */ - /* 1 - Decomposing the outline into successive `profiles'. Each */ - /* profile is simply an array of scanline intersections on a given */ - /* dimension. A profile's main attributes are */ - /* */ - /* o its scanline position boundaries, i.e. `Ymin' and `Ymax' */ - /* */ - /* o an array of intersection coordinates for each scanline */ - /* between `Ymin' and `Ymax' */ - /* */ - /* o a direction, indicating whether it was built going `up' or */ - /* `down', as this is very important for filling rules */ - /* */ - /* o its drop-out mode */ - /* */ - /* 2 - Sweeping the target map's scanlines in order to compute segment */ - /* `spans' which are then filled. Additionally, this pass */ - /* performs drop-out control. */ - /* */ - /* The outline data is parsed during step 1 only. The profiles are */ - /* built from the bottom of the render pool, used as a stack. The */ - /* following graphics shows the profile list under construction: */ - /* */ - /* __________________________________________________________ _ _ */ - /* | | | | | */ - /* | profile | coordinates for | profile | coordinates for |--> */ - /* | 1 | profile 1 | 2 | profile 2 |--> */ - /* |_________|_________________|_________|_________________|__ _ _ */ - /* */ - /* ^ ^ */ - /* | | */ - /* start of render pool top */ - /* */ - /* The top of the profile stack is kept in the `top' variable. */ - /* */ - /* As you can see, a profile record is pushed on top of the render */ - /* pool, which is then followed by its coordinates/intersections. If */ - /* a change of direction is detected in the outline, a new profile is */ - /* generated until the end of the outline. */ - /* */ - /* Note that when all profiles have been generated, the function */ - /* Finalize_Profile_Table() is used to record, for each profile, its */ - /* bottom-most scanline as well as the scanline above its upmost */ - /* boundary. These positions are called `y-turns' because they (sort */ - /* of) correspond to local extrema. They are stored in a sorted list */ - /* built from the top of the render pool as a downwards stack: */ - /* */ - /* _ _ _______________________________________ */ - /* | | */ - /* <--| sorted list of | */ - /* <--| extrema scanlines | */ - /* _ _ __________________|____________________| */ - /* */ - /* ^ ^ */ - /* | | */ - /* maxBuff sizeBuff = end of pool */ - /* */ - /* This list is later used during the sweep phase in order to */ - /* optimize performance (see technical note on the sweep below). */ - /* */ - /* Of course, the raster detects whether the two stacks collide and */ - /* handles the situation properly. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /** **/ - /** CONFIGURATION MACROS **/ - /** **/ - /*************************************************************************/ - /*************************************************************************/ - - /* define DEBUG_RASTER if you want to compile a debugging version */ -/* #define DEBUG_RASTER */ - - - /*************************************************************************/ - /*************************************************************************/ - /** **/ - /** OTHER MACROS (do not change) **/ - /** **/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_raster - - -#ifdef _STANDALONE_ - - /* Auxiliary macros for token concatenation. */ -#define FT_ERR_XCAT( x, y ) x ## y -#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) - -#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) - - /* This macro is used to indicate that a function parameter is unused. */ - /* Its purpose is simply to reduce compiler warnings. Note also that */ - /* simply defining it as `(void)x' doesn't avoid warnings with certain */ - /* ANSI compilers (e.g. LCC). */ -#define FT_UNUSED( x ) (x) = (x) - - /* Disable the tracing mechanism for simplicity -- developers can */ - /* activate it easily by redefining these macros. */ -#ifndef FT_ERROR -#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ -#endif - -#ifndef FT_TRACE -#define FT_TRACE( x ) do { } while ( 0 ) /* nothing */ -#define FT_TRACE1( x ) do { } while ( 0 ) /* nothing */ -#define FT_TRACE6( x ) do { } while ( 0 ) /* nothing */ -#define FT_TRACE7( x ) do { } while ( 0 ) /* nothing */ -#endif - -#ifndef FT_THROW -#define FT_THROW( e ) FT_ERR_CAT( Raster_Err_, e ) -#endif - -#define Raster_Err_None 0 -#define Raster_Err_Not_Ini -1 -#define Raster_Err_Overflow -2 -#define Raster_Err_Neg_Height -3 -#define Raster_Err_Invalid -4 -#define Raster_Err_Unsupported -5 - -#define ft_memset memset - -#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \ - raster_reset_, raster_set_mode_, \ - raster_render_, raster_done_ ) \ - const FT_Raster_Funcs class_ = \ - { \ - glyph_format_, \ - raster_new_, \ - raster_reset_, \ - raster_set_mode_, \ - raster_render_, \ - raster_done_ \ - }; - -#else /* !_STANDALONE_ */ - - -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H /* for FT_TRACE, FT_ERROR, and FT_THROW */ - -#include "rasterrs.h" - -#define Raster_Err_None FT_Err_Ok -#define Raster_Err_Not_Ini Raster_Err_Raster_Uninitialized -#define Raster_Err_Overflow Raster_Err_Raster_Overflow -#define Raster_Err_Neg_Height Raster_Err_Raster_Negative_Height -#define Raster_Err_Invalid Raster_Err_Invalid_Outline -#define Raster_Err_Unsupported Raster_Err_Cannot_Render_Glyph - - -#endif /* !_STANDALONE_ */ - - -#ifndef FT_MEM_SET -#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) -#endif - -#ifndef FT_MEM_ZERO -#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) -#endif - - /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is */ - /* typically a small value and the result of a*b is known to fit into */ - /* 32 bits. */ -#define FMulDiv( a, b, c ) ( (a) * (b) / (c) ) - - /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */ - /* for clipping computations. It simply uses the FT_MulDiv() function */ - /* defined in `ftcalc.h'. */ -#define SMulDiv FT_MulDiv -#define SMulDiv_No_Round FT_MulDiv_No_Round - - /* The rasterizer is a very general purpose component; please leave */ - /* the following redefinitions there (you never know your target */ - /* environment). */ - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef NULL -#define NULL (void*)0 -#endif - -#ifndef SUCCESS -#define SUCCESS 0 -#endif - -#ifndef FAILURE -#define FAILURE 1 -#endif - - -#define MaxBezier 32 /* The maximum number of stacked Bezier curves. */ - /* Setting this constant to more than 32 is a */ - /* pure waste of space. */ - -#define Pixel_Bits 6 /* fractional bits of *input* coordinates */ - - - /*************************************************************************/ - /*************************************************************************/ - /** **/ - /** SIMPLE TYPE DECLARATIONS **/ - /** **/ - /*************************************************************************/ - /*************************************************************************/ - - typedef int Int; - typedef unsigned int UInt; - typedef short Short; - typedef unsigned short UShort, *PUShort; - typedef long Long, *PLong; - typedef unsigned long ULong; - - typedef unsigned char Byte, *PByte; - typedef char Bool; - - - typedef union Alignment_ - { - Long l; - void* p; - void (*f)(void); - - } Alignment, *PAlignment; - - - typedef struct TPoint_ - { - Long x; - Long y; - - } TPoint; - - - /* values for the `flags' bit field */ -#define Flow_Up 0x08U -#define Overshoot_Top 0x10U -#define Overshoot_Bottom 0x20U - - - /* States of each line, arc, and profile */ - typedef enum TStates_ - { - Unknown_State, - Ascending_State, - Descending_State, - Flat_State - - } TStates; - - - typedef struct TProfile_ TProfile; - typedef TProfile* PProfile; - - struct TProfile_ - { - FT_F26Dot6 X; /* current coordinate during sweep */ - PProfile link; /* link to next profile (various purposes) */ - PLong offset; /* start of profile's data in render pool */ - UShort flags; /* Bit 0-2: drop-out mode */ - /* Bit 3: profile orientation (up/down) */ - /* Bit 4: is top profile? */ - /* Bit 5: is bottom profile? */ - Long height; /* profile's height in scanlines */ - Long start; /* profile's starting scanline */ - - Int countL; /* number of lines to step before this */ - /* profile becomes drawable */ - - PProfile next; /* next profile in same contour, used */ - /* during drop-out control */ - }; - - typedef PProfile TProfileList; - typedef PProfile* PProfileList; - - - /* Simple record used to implement a stack of bands, required */ - /* by the sub-banding mechanism */ - typedef struct black_TBand_ - { - Short y_min; /* band's minimum */ - Short y_max; /* band's maximum */ - - } black_TBand; - - -#define AlignProfileSize \ - ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( Long ) ) - - -#undef RAS_ARG -#undef RAS_ARGS -#undef RAS_VAR -#undef RAS_VARS - -#ifdef FT_STATIC_RASTER - - -#define RAS_ARGS /* void */ -#define RAS_ARG /* void */ - -#define RAS_VARS /* void */ -#define RAS_VAR /* void */ - -#define FT_UNUSED_RASTER do { } while ( 0 ) - - -#else /* !FT_STATIC_RASTER */ - - -#define RAS_ARGS black_PWorker worker, -#define RAS_ARG black_PWorker worker - -#define RAS_VARS worker, -#define RAS_VAR worker - -#define FT_UNUSED_RASTER FT_UNUSED( worker ) - - -#endif /* !FT_STATIC_RASTER */ - - - typedef struct black_TWorker_ black_TWorker, *black_PWorker; - - - /* prototypes used for sweep function dispatch */ - typedef void - Function_Sweep_Init( RAS_ARGS Short* min, - Short* max ); - - typedef void - Function_Sweep_Span( RAS_ARGS Short y, - FT_F26Dot6 x1, - FT_F26Dot6 x2, - PProfile left, - PProfile right ); - - typedef void - Function_Sweep_Step( RAS_ARG ); - - - /* NOTE: These operations are only valid on 2's complement processors */ -#undef FLOOR -#undef CEILING -#undef TRUNC -#undef SCALED - -#define FLOOR( x ) ( (x) & -ras.precision ) -#define CEILING( x ) ( ( (x) + ras.precision - 1 ) & -ras.precision ) -#define TRUNC( x ) ( (Long)(x) >> ras.precision_bits ) -#define FRAC( x ) ( (x) & ( ras.precision - 1 ) ) -#define SCALED( x ) ( ( (x) < 0 ? -( -(x) << ras.scale_shift ) \ - : ( (x) << ras.scale_shift ) ) \ - - ras.precision_half ) - -#define IS_BOTTOM_OVERSHOOT( x ) \ - (Bool)( CEILING( x ) - x >= ras.precision_half ) -#define IS_TOP_OVERSHOOT( x ) \ - (Bool)( x - FLOOR( x ) >= ras.precision_half ) - - /* The most used variables are positioned at the top of the structure. */ - /* Thus, their offset can be coded with less opcodes, resulting in a */ - /* smaller executable. */ - - struct black_TWorker_ - { - Int precision_bits; /* precision related variables */ - Int precision; - Int precision_half; - Int precision_shift; - Int precision_step; - Int precision_jitter; - - Int scale_shift; /* == precision_shift for bitmaps */ - /* == precision_shift+1 for pixmaps */ - - PLong buff; /* The profiles buffer */ - PLong sizeBuff; /* Render pool size */ - PLong maxBuff; /* Profiles buffer size */ - PLong top; /* Current cursor in buffer */ - - FT_Error error; - - Int numTurns; /* number of Y-turns in outline */ - - TPoint* arc; /* current Bezier arc pointer */ - - UShort bWidth; /* target bitmap width */ - PByte bTarget; /* target bitmap buffer */ - PByte gTarget; /* target pixmap buffer */ - - Long lastX, lastY; - Long minY, maxY; - - UShort num_Profs; /* current number of profiles */ - - Bool fresh; /* signals a fresh new profile which */ - /* `start' field must be completed */ - Bool joint; /* signals that the last arc ended */ - /* exactly on a scanline. Allows */ - /* removal of doublets */ - PProfile cProfile; /* current profile */ - PProfile fProfile; /* head of linked list of profiles */ - PProfile gProfile; /* contour's first profile in case */ - /* of impact */ - - TStates state; /* rendering state */ - - FT_Bitmap target; /* description of target bit/pixmap */ - FT_Outline outline; - - Long traceOfs; /* current offset in target bitmap */ - Long traceG; /* current offset in target pixmap */ - - Short traceIncr; /* sweep's increment in target bitmap */ - - /* dispatch variables */ - - Function_Sweep_Init* Proc_Sweep_Init; - Function_Sweep_Span* Proc_Sweep_Span; - Function_Sweep_Span* Proc_Sweep_Drop; - Function_Sweep_Step* Proc_Sweep_Step; - - Byte dropOutControl; /* current drop_out control method */ - - Bool second_pass; /* indicates whether a horizontal pass */ - /* should be performed to control */ - /* drop-out accurately when calling */ - /* Render_Glyph. */ - - TPoint arcs[3 * MaxBezier + 1]; /* The Bezier stack */ - - black_TBand band_stack[16]; /* band stack used for sub-banding */ - Int band_top; /* band stack top */ - - }; - - - typedef struct black_TRaster_ - { - void* memory; - - } black_TRaster, *black_PRaster; - -#ifdef FT_STATIC_RASTER - - static black_TWorker cur_ras; -#define ras cur_ras - -#else /* !FT_STATIC_RASTER */ - -#define ras (*worker) - -#endif /* !FT_STATIC_RASTER */ - - - /*************************************************************************/ - /*************************************************************************/ - /** **/ - /** PROFILES COMPUTATION **/ - /** **/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Set_High_Precision */ - /* */ - /* <Description> */ - /* Set precision variables according to param flag. */ - /* */ - /* <Input> */ - /* High :: Set to True for high precision (typically for ppem < 24), */ - /* false otherwise. */ - /* */ - static void - Set_High_Precision( RAS_ARGS Int High ) - { - /* - * `precision_step' is used in `Bezier_Up' to decide when to split a - * given y-monotonous Bezier arc that crosses a scanline before - * approximating it as a straight segment. The default value of 32 (for - * low accuracy) corresponds to - * - * 32 / 64 == 0.5 pixels, - * - * while for the high accuracy case we have - * - * 256 / (1 << 12) = 0.0625 pixels. - * - * `precision_jitter' is an epsilon threshold used in - * `Vertical_Sweep_Span' to deal with small imperfections in the Bezier - * decomposition (after all, we are working with approximations only); - * it avoids switching on additional pixels which would cause artifacts - * otherwise. - * - * The value of `precision_jitter' has been determined heuristically. - * - */ - - if ( High ) - { - ras.precision_bits = 12; - ras.precision_step = 256; - ras.precision_jitter = 30; - } - else - { - ras.precision_bits = 6; - ras.precision_step = 32; - ras.precision_jitter = 2; - } - - FT_TRACE6(( "Set_High_Precision(%s)\n", High ? "true" : "false" )); - - ras.precision = 1 << ras.precision_bits; - ras.precision_half = ras.precision / 2; - ras.precision_shift = ras.precision_bits - Pixel_Bits; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* New_Profile */ - /* */ - /* <Description> */ - /* Create a new profile in the render pool. */ - /* */ - /* <Input> */ - /* aState :: The state/orientation of the new profile. */ - /* */ - /* overshoot :: Whether the profile's unrounded start position */ - /* differs by at least a half pixel. */ - /* */ - /* <Return> */ - /* SUCCESS on success. FAILURE in case of overflow or of incoherent */ - /* profile. */ - /* */ - static Bool - New_Profile( RAS_ARGS TStates aState, - Bool overshoot ) - { - if ( !ras.fProfile ) - { - ras.cProfile = (PProfile)ras.top; - ras.fProfile = ras.cProfile; - ras.top += AlignProfileSize; - } - - if ( ras.top >= ras.maxBuff ) - { - ras.error = FT_THROW( Overflow ); - return FAILURE; - } - - ras.cProfile->flags = 0; - ras.cProfile->start = 0; - ras.cProfile->height = 0; - ras.cProfile->offset = ras.top; - ras.cProfile->link = (PProfile)0; - ras.cProfile->next = (PProfile)0; - ras.cProfile->flags = ras.dropOutControl; - - switch ( aState ) - { - case Ascending_State: - ras.cProfile->flags |= Flow_Up; - if ( overshoot ) - ras.cProfile->flags |= Overshoot_Bottom; - - FT_TRACE6(( " new ascending profile = %p\n", ras.cProfile )); - break; - - case Descending_State: - if ( overshoot ) - ras.cProfile->flags |= Overshoot_Top; - FT_TRACE6(( " new descending profile = %p\n", ras.cProfile )); - break; - - default: - FT_ERROR(( "New_Profile: invalid profile direction\n" )); - ras.error = FT_THROW( Invalid ); - return FAILURE; - } - - if ( !ras.gProfile ) - ras.gProfile = ras.cProfile; - - ras.state = aState; - ras.fresh = TRUE; - ras.joint = FALSE; - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* End_Profile */ - /* */ - /* <Description> */ - /* Finalize the current profile. */ - /* */ - /* <Input> */ - /* overshoot :: Whether the profile's unrounded end position differs */ - /* by at least a half pixel. */ - /* */ - /* <Return> */ - /* SUCCESS on success. FAILURE in case of overflow or incoherency. */ - /* */ - static Bool - End_Profile( RAS_ARGS Bool overshoot ) - { - Long h; - - - h = (Long)( ras.top - ras.cProfile->offset ); - - if ( h < 0 ) - { - FT_ERROR(( "End_Profile: negative height encountered\n" )); - ras.error = FT_THROW( Neg_Height ); - return FAILURE; - } - - if ( h > 0 ) - { - PProfile oldProfile; - - - FT_TRACE6(( " ending profile %p, start = %ld, height = %ld\n", - ras.cProfile, ras.cProfile->start, h )); - - ras.cProfile->height = h; - if ( overshoot ) - { - if ( ras.cProfile->flags & Flow_Up ) - ras.cProfile->flags |= Overshoot_Top; - else - ras.cProfile->flags |= Overshoot_Bottom; - } - - oldProfile = ras.cProfile; - ras.cProfile = (PProfile)ras.top; - - ras.top += AlignProfileSize; - - ras.cProfile->height = 0; - ras.cProfile->offset = ras.top; - - oldProfile->next = ras.cProfile; - ras.num_Profs++; - } - - if ( ras.top >= ras.maxBuff ) - { - FT_TRACE1(( "overflow in End_Profile\n" )); - ras.error = FT_THROW( Overflow ); - return FAILURE; - } - - ras.joint = FALSE; - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Insert_Y_Turn */ - /* */ - /* <Description> */ - /* Insert a salient into the sorted list placed on top of the render */ - /* pool. */ - /* */ - /* <Input> */ - /* New y scanline position. */ - /* */ - /* <Return> */ - /* SUCCESS on success. FAILURE in case of overflow. */ - /* */ - static Bool - Insert_Y_Turn( RAS_ARGS Int y ) - { - PLong y_turns; - Int n; - - - n = ras.numTurns - 1; - y_turns = ras.sizeBuff - ras.numTurns; - - /* look for first y value that is <= */ - while ( n >= 0 && y < y_turns[n] ) - n--; - - /* if it is <, simply insert it, ignore if == */ - if ( n >= 0 && y > y_turns[n] ) - while ( n >= 0 ) - { - Int y2 = (Int)y_turns[n]; - - - y_turns[n] = y; - y = y2; - n--; - } - - if ( n < 0 ) - { - ras.maxBuff--; - if ( ras.maxBuff <= ras.top ) - { - ras.error = FT_THROW( Overflow ); - return FAILURE; - } - ras.numTurns++; - ras.sizeBuff[-ras.numTurns] = y; - } - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Finalize_Profile_Table */ - /* */ - /* <Description> */ - /* Adjust all links in the profiles list. */ - /* */ - /* <Return> */ - /* SUCCESS on success. FAILURE in case of overflow. */ - /* */ - static Bool - Finalize_Profile_Table( RAS_ARG ) - { - UShort n; - PProfile p; - - - n = ras.num_Profs; - p = ras.fProfile; - - if ( n > 1 && p ) - { - while ( n > 0 ) - { - Int bottom, top; - - - if ( n > 1 ) - p->link = (PProfile)( p->offset + p->height ); - else - p->link = NULL; - - if ( p->flags & Flow_Up ) - { - bottom = (Int)p->start; - top = (Int)( p->start + p->height - 1 ); - } - else - { - bottom = (Int)( p->start - p->height + 1 ); - top = (Int)p->start; - p->start = bottom; - p->offset += p->height - 1; - } - - if ( Insert_Y_Turn( RAS_VARS bottom ) || - Insert_Y_Turn( RAS_VARS top + 1 ) ) - return FAILURE; - - p = p->link; - n--; - } - } - else - ras.fProfile = NULL; - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Split_Conic */ - /* */ - /* <Description> */ - /* Subdivide one conic Bezier into two joint sub-arcs in the Bezier */ - /* stack. */ - /* */ - /* <Input> */ - /* None (subdivided Bezier is taken from the top of the stack). */ - /* */ - /* <Note> */ - /* This routine is the `beef' of this component. It is _the_ inner */ - /* loop that should be optimized to hell to get the best performance. */ - /* */ - static void - Split_Conic( TPoint* base ) - { - Long a, b; - - - base[4].x = base[2].x; - b = base[1].x; - a = base[3].x = ( base[2].x + b ) / 2; - b = base[1].x = ( base[0].x + b ) / 2; - base[2].x = ( a + b ) / 2; - - base[4].y = base[2].y; - b = base[1].y; - a = base[3].y = ( base[2].y + b ) / 2; - b = base[1].y = ( base[0].y + b ) / 2; - base[2].y = ( a + b ) / 2; - - /* hand optimized. gcc doesn't seem to be too good at common */ - /* expression substitution and instruction scheduling ;-) */ - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Split_Cubic */ - /* */ - /* <Description> */ - /* Subdivide a third-order Bezier arc into two joint sub-arcs in the */ - /* Bezier stack. */ - /* */ - /* <Note> */ - /* This routine is the `beef' of the component. It is one of _the_ */ - /* inner loops that should be optimized like hell to get the best */ - /* performance. */ - /* */ - static void - Split_Cubic( TPoint* base ) - { - Long a, b, c, d; - - - base[6].x = base[3].x; - c = base[1].x; - d = base[2].x; - base[1].x = a = ( base[0].x + c + 1 ) >> 1; - base[5].x = b = ( base[3].x + d + 1 ) >> 1; - c = ( c + d + 1 ) >> 1; - base[2].x = a = ( a + c + 1 ) >> 1; - base[4].x = b = ( b + c + 1 ) >> 1; - base[3].x = ( a + b + 1 ) >> 1; - - base[6].y = base[3].y; - c = base[1].y; - d = base[2].y; - base[1].y = a = ( base[0].y + c + 1 ) >> 1; - base[5].y = b = ( base[3].y + d + 1 ) >> 1; - c = ( c + d + 1 ) >> 1; - base[2].y = a = ( a + c + 1 ) >> 1; - base[4].y = b = ( b + c + 1 ) >> 1; - base[3].y = ( a + b + 1 ) >> 1; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Line_Up */ - /* */ - /* <Description> */ - /* Compute the x-coordinates of an ascending line segment and store */ - /* them in the render pool. */ - /* */ - /* <Input> */ - /* x1 :: The x-coordinate of the segment's start point. */ - /* */ - /* y1 :: The y-coordinate of the segment's start point. */ - /* */ - /* x2 :: The x-coordinate of the segment's end point. */ - /* */ - /* y2 :: The y-coordinate of the segment's end point. */ - /* */ - /* miny :: A lower vertical clipping bound value. */ - /* */ - /* maxy :: An upper vertical clipping bound value. */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow. */ - /* */ - static Bool - Line_Up( RAS_ARGS Long x1, - Long y1, - Long x2, - Long y2, - Long miny, - Long maxy ) - { - Long Dx, Dy; - Int e1, e2, f1, f2, size; /* XXX: is `Short' sufficient? */ - Long Ix, Rx, Ax; - - PLong top; - - - Dx = x2 - x1; - Dy = y2 - y1; - - if ( Dy <= 0 || y2 < miny || y1 > maxy ) - return SUCCESS; - - if ( y1 < miny ) - { - /* Take care: miny-y1 can be a very large value; we use */ - /* a slow MulDiv function to avoid clipping bugs */ - x1 += SMulDiv( Dx, miny - y1, Dy ); - e1 = (Int)TRUNC( miny ); - f1 = 0; - } - else - { - e1 = (Int)TRUNC( y1 ); - f1 = (Int)FRAC( y1 ); - } - - if ( y2 > maxy ) - { - /* x2 += FMulDiv( Dx, maxy - y2, Dy ); UNNECESSARY */ - e2 = (Int)TRUNC( maxy ); - f2 = 0; - } - else - { - e2 = (Int)TRUNC( y2 ); - f2 = (Int)FRAC( y2 ); - } - - if ( f1 > 0 ) - { - if ( e1 == e2 ) - return SUCCESS; - else - { - x1 += SMulDiv( Dx, ras.precision - f1, Dy ); - e1 += 1; - } - } - else - if ( ras.joint ) - { - ras.top--; - ras.joint = FALSE; - } - - ras.joint = (char)( f2 == 0 ); - - if ( ras.fresh ) - { - ras.cProfile->start = e1; - ras.fresh = FALSE; - } - - size = e2 - e1 + 1; - if ( ras.top + size >= ras.maxBuff ) - { - ras.error = FT_THROW( Overflow ); - return FAILURE; - } - - if ( Dx > 0 ) - { - Ix = SMulDiv_No_Round( ras.precision, Dx, Dy ); - Rx = ( ras.precision * Dx ) % Dy; - Dx = 1; - } - else - { - Ix = -SMulDiv_No_Round( ras.precision, -Dx, Dy ); - Rx = ( ras.precision * -Dx ) % Dy; - Dx = -1; - } - - Ax = -Dy; - top = ras.top; - - while ( size > 0 ) - { - *top++ = x1; - - x1 += Ix; - Ax += Rx; - if ( Ax >= 0 ) - { - Ax -= Dy; - x1 += Dx; - } - size--; - } - - ras.top = top; - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Line_Down */ - /* */ - /* <Description> */ - /* Compute the x-coordinates of an descending line segment and store */ - /* them in the render pool. */ - /* */ - /* <Input> */ - /* x1 :: The x-coordinate of the segment's start point. */ - /* */ - /* y1 :: The y-coordinate of the segment's start point. */ - /* */ - /* x2 :: The x-coordinate of the segment's end point. */ - /* */ - /* y2 :: The y-coordinate of the segment's end point. */ - /* */ - /* miny :: A lower vertical clipping bound value. */ - /* */ - /* maxy :: An upper vertical clipping bound value. */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow. */ - /* */ - static Bool - Line_Down( RAS_ARGS Long x1, - Long y1, - Long x2, - Long y2, - Long miny, - Long maxy ) - { - Bool result, fresh; - - - fresh = ras.fresh; - - result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny ); - - if ( fresh && !ras.fresh ) - ras.cProfile->start = -ras.cProfile->start; - - return result; - } - - - /* A function type describing the functions used to split Bezier arcs */ - typedef void (*TSplitter)( TPoint* base ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Bezier_Up */ - /* */ - /* <Description> */ - /* Compute the x-coordinates of an ascending Bezier arc and store */ - /* them in the render pool. */ - /* */ - /* <Input> */ - /* degree :: The degree of the Bezier arc (either 2 or 3). */ - /* */ - /* splitter :: The function to split Bezier arcs. */ - /* */ - /* miny :: A lower vertical clipping bound value. */ - /* */ - /* maxy :: An upper vertical clipping bound value. */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow. */ - /* */ - static Bool - Bezier_Up( RAS_ARGS Int degree, - TSplitter splitter, - Long miny, - Long maxy ) - { - Long y1, y2, e, e2, e0; - Short f1; - - TPoint* arc; - TPoint* start_arc; - - PLong top; - - - arc = ras.arc; - y1 = arc[degree].y; - y2 = arc[0].y; - top = ras.top; - - if ( y2 < miny || y1 > maxy ) - goto Fin; - - e2 = FLOOR( y2 ); - - if ( e2 > maxy ) - e2 = maxy; - - e0 = miny; - - if ( y1 < miny ) - e = miny; - else - { - e = CEILING( y1 ); - f1 = (Short)( FRAC( y1 ) ); - e0 = e; - - if ( f1 == 0 ) - { - if ( ras.joint ) - { - top--; - ras.joint = FALSE; - } - - *top++ = arc[degree].x; - - e += ras.precision; - } - } - - if ( ras.fresh ) - { - ras.cProfile->start = TRUNC( e0 ); - ras.fresh = FALSE; - } - - if ( e2 < e ) - goto Fin; - - if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff ) - { - ras.top = top; - ras.error = FT_THROW( Overflow ); - return FAILURE; - } - - start_arc = arc; - - while ( arc >= start_arc && e <= e2 ) - { - ras.joint = FALSE; - - y2 = arc[0].y; - - if ( y2 > e ) - { - y1 = arc[degree].y; - if ( y2 - y1 >= ras.precision_step ) - { - splitter( arc ); - arc += degree; - } - else - { - *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x, - e - y1, y2 - y1 ); - arc -= degree; - e += ras.precision; - } - } - else - { - if ( y2 == e ) - { - ras.joint = TRUE; - *top++ = arc[0].x; - - e += ras.precision; - } - arc -= degree; - } - } - - Fin: - ras.top = top; - ras.arc -= degree; - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Bezier_Down */ - /* */ - /* <Description> */ - /* Compute the x-coordinates of an descending Bezier arc and store */ - /* them in the render pool. */ - /* */ - /* <Input> */ - /* degree :: The degree of the Bezier arc (either 2 or 3). */ - /* */ - /* splitter :: The function to split Bezier arcs. */ - /* */ - /* miny :: A lower vertical clipping bound value. */ - /* */ - /* maxy :: An upper vertical clipping bound value. */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow. */ - /* */ - static Bool - Bezier_Down( RAS_ARGS Int degree, - TSplitter splitter, - Long miny, - Long maxy ) - { - TPoint* arc = ras.arc; - Bool result, fresh; - - - arc[0].y = -arc[0].y; - arc[1].y = -arc[1].y; - arc[2].y = -arc[2].y; - if ( degree > 2 ) - arc[3].y = -arc[3].y; - - fresh = ras.fresh; - - result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny ); - - if ( fresh && !ras.fresh ) - ras.cProfile->start = -ras.cProfile->start; - - arc[0].y = -arc[0].y; - return result; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Line_To */ - /* */ - /* <Description> */ - /* Inject a new line segment and adjust the Profiles list. */ - /* */ - /* <Input> */ - /* x :: The x-coordinate of the segment's end point (its start point */ - /* is stored in `lastX'). */ - /* */ - /* y :: The y-coordinate of the segment's end point (its start point */ - /* is stored in `lastY'). */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ - /* profile. */ - /* */ - static Bool - Line_To( RAS_ARGS Long x, - Long y ) - { - /* First, detect a change of direction */ - - switch ( ras.state ) - { - case Unknown_State: - if ( y > ras.lastY ) - { - if ( New_Profile( RAS_VARS Ascending_State, - IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) - return FAILURE; - } - else - { - if ( y < ras.lastY ) - if ( New_Profile( RAS_VARS Descending_State, - IS_TOP_OVERSHOOT( ras.lastY ) ) ) - return FAILURE; - } - break; - - case Ascending_State: - if ( y < ras.lastY ) - { - if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) || - New_Profile( RAS_VARS Descending_State, - IS_TOP_OVERSHOOT( ras.lastY ) ) ) - return FAILURE; - } - break; - - case Descending_State: - if ( y > ras.lastY ) - { - if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) || - New_Profile( RAS_VARS Ascending_State, - IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) - return FAILURE; - } - break; - - default: - ; - } - - /* Then compute the lines */ - - switch ( ras.state ) - { - case Ascending_State: - if ( Line_Up( RAS_VARS ras.lastX, ras.lastY, - x, y, ras.minY, ras.maxY ) ) - return FAILURE; - break; - - case Descending_State: - if ( Line_Down( RAS_VARS ras.lastX, ras.lastY, - x, y, ras.minY, ras.maxY ) ) - return FAILURE; - break; - - default: - ; - } - - ras.lastX = x; - ras.lastY = y; - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Conic_To */ - /* */ - /* <Description> */ - /* Inject a new conic arc and adjust the profile list. */ - /* */ - /* <Input> */ - /* cx :: The x-coordinate of the arc's new control point. */ - /* */ - /* cy :: The y-coordinate of the arc's new control point. */ - /* */ - /* x :: The x-coordinate of the arc's end point (its start point is */ - /* stored in `lastX'). */ - /* */ - /* y :: The y-coordinate of the arc's end point (its start point is */ - /* stored in `lastY'). */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ - /* profile. */ - /* */ - static Bool - Conic_To( RAS_ARGS Long cx, - Long cy, - Long x, - Long y ) - { - Long y1, y2, y3, x3, ymin, ymax; - TStates state_bez; - - - ras.arc = ras.arcs; - ras.arc[2].x = ras.lastX; - ras.arc[2].y = ras.lastY; - ras.arc[1].x = cx; - ras.arc[1].y = cy; - ras.arc[0].x = x; - ras.arc[0].y = y; - - do - { - y1 = ras.arc[2].y; - y2 = ras.arc[1].y; - y3 = ras.arc[0].y; - x3 = ras.arc[0].x; - - /* first, categorize the Bezier arc */ - - if ( y1 <= y3 ) - { - ymin = y1; - ymax = y3; - } - else - { - ymin = y3; - ymax = y1; - } - - if ( y2 < ymin || y2 > ymax ) - { - /* this arc has no given direction, split it! */ - Split_Conic( ras.arc ); - ras.arc += 2; - } - else if ( y1 == y3 ) - { - /* this arc is flat, ignore it and pop it from the Bezier stack */ - ras.arc -= 2; - } - else - { - /* the arc is y-monotonous, either ascending or descending */ - /* detect a change of direction */ - state_bez = y1 < y3 ? Ascending_State : Descending_State; - if ( ras.state != state_bez ) - { - Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 ) - : IS_TOP_OVERSHOOT( y1 ); - - - /* finalize current profile if any */ - if ( ras.state != Unknown_State && - End_Profile( RAS_VARS o ) ) - goto Fail; - - /* create a new profile */ - if ( New_Profile( RAS_VARS state_bez, o ) ) - goto Fail; - } - - /* now call the appropriate routine */ - if ( state_bez == Ascending_State ) - { - if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) ) - goto Fail; - } - else - if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) ) - goto Fail; - } - - } while ( ras.arc >= ras.arcs ); - - ras.lastX = x3; - ras.lastY = y3; - - return SUCCESS; - - Fail: - return FAILURE; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Cubic_To */ - /* */ - /* <Description> */ - /* Inject a new cubic arc and adjust the profile list. */ - /* */ - /* <Input> */ - /* cx1 :: The x-coordinate of the arc's first new control point. */ - /* */ - /* cy1 :: The y-coordinate of the arc's first new control point. */ - /* */ - /* cx2 :: The x-coordinate of the arc's second new control point. */ - /* */ - /* cy2 :: The y-coordinate of the arc's second new control point. */ - /* */ - /* x :: The x-coordinate of the arc's end point (its start point is */ - /* stored in `lastX'). */ - /* */ - /* y :: The y-coordinate of the arc's end point (its start point is */ - /* stored in `lastY'). */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ - /* profile. */ - /* */ - static Bool - Cubic_To( RAS_ARGS Long cx1, - Long cy1, - Long cx2, - Long cy2, - Long x, - Long y ) - { - Long y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2; - TStates state_bez; - - - ras.arc = ras.arcs; - ras.arc[3].x = ras.lastX; - ras.arc[3].y = ras.lastY; - ras.arc[2].x = cx1; - ras.arc[2].y = cy1; - ras.arc[1].x = cx2; - ras.arc[1].y = cy2; - ras.arc[0].x = x; - ras.arc[0].y = y; - - do - { - y1 = ras.arc[3].y; - y2 = ras.arc[2].y; - y3 = ras.arc[1].y; - y4 = ras.arc[0].y; - x4 = ras.arc[0].x; - - /* first, categorize the Bezier arc */ - - if ( y1 <= y4 ) - { - ymin1 = y1; - ymax1 = y4; - } - else - { - ymin1 = y4; - ymax1 = y1; - } - - if ( y2 <= y3 ) - { - ymin2 = y2; - ymax2 = y3; - } - else - { - ymin2 = y3; - ymax2 = y2; - } - - if ( ymin2 < ymin1 || ymax2 > ymax1 ) - { - /* this arc has no given direction, split it! */ - Split_Cubic( ras.arc ); - ras.arc += 3; - } - else if ( y1 == y4 ) - { - /* this arc is flat, ignore it and pop it from the Bezier stack */ - ras.arc -= 3; - } - else - { - state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State; - - /* detect a change of direction */ - if ( ras.state != state_bez ) - { - Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 ) - : IS_TOP_OVERSHOOT( y1 ); - - - /* finalize current profile if any */ - if ( ras.state != Unknown_State && - End_Profile( RAS_VARS o ) ) - goto Fail; - - if ( New_Profile( RAS_VARS state_bez, o ) ) - goto Fail; - } - - /* compute intersections */ - if ( state_bez == Ascending_State ) - { - if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) ) - goto Fail; - } - else - if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) ) - goto Fail; - } - - } while ( ras.arc >= ras.arcs ); - - ras.lastX = x4; - ras.lastY = y4; - - return SUCCESS; - - Fail: - return FAILURE; - } - - -#undef SWAP_ -#define SWAP_( x, y ) do \ - { \ - Long swap = x; \ - \ - \ - x = y; \ - y = swap; \ - } while ( 0 ) - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Decompose_Curve */ - /* */ - /* <Description> */ - /* Scan the outline arrays in order to emit individual segments and */ - /* Beziers by calling Line_To() and Bezier_To(). It handles all */ - /* weird cases, like when the first point is off the curve, or when */ - /* there are simply no `on' points in the contour! */ - /* */ - /* <Input> */ - /* first :: The index of the first point in the contour. */ - /* */ - /* last :: The index of the last point in the contour. */ - /* */ - /* flipped :: If set, flip the direction of the curve. */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on error. */ - /* */ - static Bool - Decompose_Curve( RAS_ARGS UShort first, - UShort last, - Int flipped ) - { - FT_Vector v_last; - FT_Vector v_control; - FT_Vector v_start; - - FT_Vector* points; - FT_Vector* point; - FT_Vector* limit; - char* tags; - - UInt tag; /* current point's state */ - - - points = ras.outline.points; - limit = points + last; - - v_start.x = SCALED( points[first].x ); - v_start.y = SCALED( points[first].y ); - v_last.x = SCALED( points[last].x ); - v_last.y = SCALED( points[last].y ); - - if ( flipped ) - { - SWAP_( v_start.x, v_start.y ); - SWAP_( v_last.x, v_last.y ); - } - - v_control = v_start; - - point = points + first; - tags = ras.outline.tags + first; - - /* set scan mode if necessary */ - if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE ) - ras.dropOutControl = (Byte)tags[0] >> 5; - - tag = FT_CURVE_TAG( tags[0] ); - - /* A contour cannot start with a cubic control point! */ - if ( tag == FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - /* check first point to determine origin */ - if ( tag == FT_CURVE_TAG_CONIC ) - { - /* first point is conic control. Yes, this happens. */ - if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON ) - { - /* start at last point if it is on the curve */ - v_start = v_last; - limit--; - } - else - { - /* if both first and last points are conic, */ - /* start at their middle and record its position */ - /* for closure */ - v_start.x = ( v_start.x + v_last.x ) / 2; - v_start.y = ( v_start.y + v_last.y ) / 2; - - /* v_last = v_start; */ - } - point--; - tags--; - } - - ras.lastX = v_start.x; - ras.lastY = v_start.y; - - while ( point < limit ) - { - point++; - tags++; - - tag = FT_CURVE_TAG( tags[0] ); - - switch ( tag ) - { - case FT_CURVE_TAG_ON: /* emit a single line_to */ - { - Long x, y; - - - x = SCALED( point->x ); - y = SCALED( point->y ); - if ( flipped ) - SWAP_( x, y ); - - if ( Line_To( RAS_VARS x, y ) ) - goto Fail; - continue; - } - - case FT_CURVE_TAG_CONIC: /* consume conic arcs */ - v_control.x = SCALED( point[0].x ); - v_control.y = SCALED( point[0].y ); - - if ( flipped ) - SWAP_( v_control.x, v_control.y ); - - Do_Conic: - if ( point < limit ) - { - FT_Vector v_middle; - Long x, y; - - - point++; - tags++; - tag = FT_CURVE_TAG( tags[0] ); - - x = SCALED( point[0].x ); - y = SCALED( point[0].y ); - - if ( flipped ) - SWAP_( x, y ); - - if ( tag == FT_CURVE_TAG_ON ) - { - if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) ) - goto Fail; - continue; - } - - if ( tag != FT_CURVE_TAG_CONIC ) - goto Invalid_Outline; - - v_middle.x = ( v_control.x + x ) / 2; - v_middle.y = ( v_control.y + y ) / 2; - - if ( Conic_To( RAS_VARS v_control.x, v_control.y, - v_middle.x, v_middle.y ) ) - goto Fail; - - v_control.x = x; - v_control.y = y; - - goto Do_Conic; - } - - if ( Conic_To( RAS_VARS v_control.x, v_control.y, - v_start.x, v_start.y ) ) - goto Fail; - - goto Close; - - default: /* FT_CURVE_TAG_CUBIC */ - { - Long x1, y1, x2, y2, x3, y3; - - - if ( point + 1 > limit || - FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - point += 2; - tags += 2; - - x1 = SCALED( point[-2].x ); - y1 = SCALED( point[-2].y ); - x2 = SCALED( point[-1].x ); - y2 = SCALED( point[-1].y ); - - if ( flipped ) - { - SWAP_( x1, y1 ); - SWAP_( x2, y2 ); - } - - if ( point <= limit ) - { - x3 = SCALED( point[0].x ); - y3 = SCALED( point[0].y ); - - if ( flipped ) - SWAP_( x3, y3 ); - - if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) ) - goto Fail; - continue; - } - - if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) ) - goto Fail; - goto Close; - } - } - } - - /* close the contour with a line segment */ - if ( Line_To( RAS_VARS v_start.x, v_start.y ) ) - goto Fail; - - Close: - return SUCCESS; - - Invalid_Outline: - ras.error = FT_THROW( Invalid ); - - Fail: - return FAILURE; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Convert_Glyph */ - /* */ - /* <Description> */ - /* Convert a glyph into a series of segments and arcs and make a */ - /* profiles list with them. */ - /* */ - /* <Input> */ - /* flipped :: If set, flip the direction of curve. */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE if any error was encountered during */ - /* rendering. */ - /* */ - static Bool - Convert_Glyph( RAS_ARGS Int flipped ) - { - Int i; - UInt start; - - - ras.fProfile = NULL; - ras.joint = FALSE; - ras.fresh = FALSE; - - ras.maxBuff = ras.sizeBuff - AlignProfileSize; - - ras.numTurns = 0; - - ras.cProfile = (PProfile)ras.top; - ras.cProfile->offset = ras.top; - ras.num_Profs = 0; - - start = 0; - - for ( i = 0; i < ras.outline.n_contours; i++ ) - { - PProfile lastProfile; - Bool o; - - - ras.state = Unknown_State; - ras.gProfile = NULL; - - if ( Decompose_Curve( RAS_VARS (UShort)start, - (UShort)ras.outline.contours[i], - flipped ) ) - return FAILURE; - - start = (UShort)ras.outline.contours[i] + 1; - - /* we must now check whether the extreme arcs join or not */ - if ( FRAC( ras.lastY ) == 0 && - ras.lastY >= ras.minY && - ras.lastY <= ras.maxY ) - if ( ras.gProfile && - ( ras.gProfile->flags & Flow_Up ) == - ( ras.cProfile->flags & Flow_Up ) ) - ras.top--; - /* Note that ras.gProfile can be nil if the contour was too small */ - /* to be drawn. */ - - lastProfile = ras.cProfile; - if ( ras.top != ras.cProfile->offset && - ( ras.cProfile->flags & Flow_Up ) ) - o = IS_TOP_OVERSHOOT( ras.lastY ); - else - o = IS_BOTTOM_OVERSHOOT( ras.lastY ); - if ( End_Profile( RAS_VARS o ) ) - return FAILURE; - - /* close the `next profile in contour' linked list */ - if ( ras.gProfile ) - lastProfile->next = ras.gProfile; - } - - if ( Finalize_Profile_Table( RAS_VAR ) ) - return FAILURE; - - return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /** **/ - /** SCAN-LINE SWEEPS AND DRAWING **/ - /** **/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Init_Linked */ - /* */ - /* Initializes an empty linked list. */ - /* */ - static void - Init_Linked( TProfileList* l ) - { - *l = NULL; - } - - - /*************************************************************************/ - /* */ - /* InsNew */ - /* */ - /* Inserts a new profile in a linked list. */ - /* */ - static void - InsNew( PProfileList list, - PProfile profile ) - { - PProfile *old, current; - Long x; - - - old = list; - current = *old; - x = profile->X; - - while ( current ) - { - if ( x < current->X ) - break; - old = ¤t->link; - current = *old; - } - - profile->link = current; - *old = profile; - } - - - /*************************************************************************/ - /* */ - /* DelOld */ - /* */ - /* Removes an old profile from a linked list. */ - /* */ - static void - DelOld( PProfileList list, - PProfile profile ) - { - PProfile *old, current; - - - old = list; - current = *old; - - while ( current ) - { - if ( current == profile ) - { - *old = current->link; - return; - } - - old = ¤t->link; - current = *old; - } - - /* we should never get there, unless the profile was not part of */ - /* the list. */ - } - - - /*************************************************************************/ - /* */ - /* Sort */ - /* */ - /* Sorts a trace list. In 95%, the list is already sorted. We need */ - /* an algorithm which is fast in this case. Bubble sort is enough */ - /* and simple. */ - /* */ - static void - Sort( PProfileList list ) - { - PProfile *old, current, next; - - - /* First, set the new X coordinate of each profile */ - current = *list; - while ( current ) - { - current->X = *current->offset; - current->offset += current->flags & Flow_Up ? 1 : -1; - current->height--; - current = current->link; - } - - /* Then sort them */ - old = list; - current = *old; - - if ( !current ) - return; - - next = current->link; - - while ( next ) - { - if ( current->X <= next->X ) - { - old = ¤t->link; - current = *old; - - if ( !current ) - return; - } - else - { - *old = next; - current->link = next->link; - next->link = current; - - old = list; - current = *old; - } - - next = current->link; - } - } - - - /*************************************************************************/ - /* */ - /* Vertical Sweep Procedure Set */ - /* */ - /* These four routines are used during the vertical black/white sweep */ - /* phase by the generic Draw_Sweep() function. */ - /* */ - /*************************************************************************/ - - static void - Vertical_Sweep_Init( RAS_ARGS Short* min, - Short* max ) - { - Long pitch = ras.target.pitch; - - FT_UNUSED( max ); - - - ras.traceIncr = (Short)-pitch; - ras.traceOfs = -*min * pitch; - if ( pitch > 0 ) - ras.traceOfs += (Long)( ras.target.rows - 1 ) * pitch; - } - - - static void - Vertical_Sweep_Span( RAS_ARGS Short y, - FT_F26Dot6 x1, - FT_F26Dot6 x2, - PProfile left, - PProfile right ) - { - Long e1, e2; - Byte* target; - - Int dropOutControl = left->flags & 7; - - FT_UNUSED( y ); - FT_UNUSED( left ); - FT_UNUSED( right ); - - - /* in high-precision mode, we need 12 digits after the comma to */ - /* represent multiples of 1/(1<<12) = 1/4096 */ - FT_TRACE7(( " y=%d x=[%.12f;%.12f], drop-out=%d", - y, - x1 / (double)ras.precision, - x2 / (double)ras.precision, - dropOutControl )); - - /* Drop-out control */ - - e1 = TRUNC( CEILING( x1 ) ); - - if ( dropOutControl != 2 && - x2 - x1 - ras.precision <= ras.precision_jitter ) - e2 = e1; - else - e2 = TRUNC( FLOOR( x2 ) ); - - if ( e2 >= 0 && e1 < ras.bWidth ) - { - Int c1, c2; - Byte f1, f2; - - - if ( e1 < 0 ) - e1 = 0; - if ( e2 >= ras.bWidth ) - e2 = ras.bWidth - 1; - - FT_TRACE7(( " -> x=[%d;%d]", e1, e2 )); - - c1 = (Short)( e1 >> 3 ); - c2 = (Short)( e2 >> 3 ); - - f1 = (Byte) ( 0xFF >> ( e1 & 7 ) ); - f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) ); - - target = ras.bTarget + ras.traceOfs + c1; - c2 -= c1; - - if ( c2 > 0 ) - { - target[0] |= f1; - - /* memset() is slower than the following code on many platforms. */ - /* This is due to the fact that, in the vast majority of cases, */ - /* the span length in bytes is relatively small. */ - c2--; - while ( c2 > 0 ) - { - *(++target) = 0xFF; - c2--; - } - target[1] |= f2; - } - else - *target |= ( f1 & f2 ); - } - - FT_TRACE7(( "\n" )); - } - - - static void - Vertical_Sweep_Drop( RAS_ARGS Short y, - FT_F26Dot6 x1, - FT_F26Dot6 x2, - PProfile left, - PProfile right ) - { - Long e1, e2, pxl; - Short c1, f1; - - - FT_TRACE7(( " y=%d x=[%.12f;%.12f]", - y, - x1 / (double)ras.precision, - x2 / (double)ras.precision )); - - /* Drop-out control */ - - /* e2 x2 x1 e1 */ - /* */ - /* ^ | */ - /* | | */ - /* +-------------+---------------------+------------+ */ - /* | | */ - /* | v */ - /* */ - /* pixel contour contour pixel */ - /* center center */ - - /* drop-out mode scan conversion rules (as defined in OpenType) */ - /* --------------------------------------------------------------- */ - /* 0 1, 2, 3 */ - /* 1 1, 2, 4 */ - /* 2 1, 2 */ - /* 3 same as mode 2 */ - /* 4 1, 2, 5 */ - /* 5 1, 2, 6 */ - /* 6, 7 same as mode 2 */ - - e1 = CEILING( x1 ); - e2 = FLOOR ( x2 ); - pxl = e1; - - if ( e1 > e2 ) - { - Int dropOutControl = left->flags & 7; - - - FT_TRACE7(( ", drop-out=%d", dropOutControl )); - - if ( e1 == e2 + ras.precision ) - { - switch ( dropOutControl ) - { - case 0: /* simple drop-outs including stubs */ - pxl = e2; - break; - - case 4: /* smart drop-outs including stubs */ - pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); - break; - - case 1: /* simple drop-outs excluding stubs */ - case 5: /* smart drop-outs excluding stubs */ - - /* Drop-out Control Rules #4 and #6 */ - - /* The specification neither provides an exact definition */ - /* of a `stub' nor gives exact rules to exclude them. */ - /* */ - /* Here the constraints we use to recognize a stub. */ - /* */ - /* upper stub: */ - /* */ - /* - P_Left and P_Right are in the same contour */ - /* - P_Right is the successor of P_Left in that contour */ - /* - y is the top of P_Left and P_Right */ - /* */ - /* lower stub: */ - /* */ - /* - P_Left and P_Right are in the same contour */ - /* - P_Left is the successor of P_Right in that contour */ - /* - y is the bottom of P_Left */ - /* */ - /* We draw a stub if the following constraints are met. */ - /* */ - /* - for an upper or lower stub, there is top or bottom */ - /* overshoot, respectively */ - /* - the covered interval is greater or equal to a half */ - /* pixel */ - - /* upper stub test */ - if ( left->next == right && - left->height <= 0 && - !( left->flags & Overshoot_Top && - x2 - x1 >= ras.precision_half ) ) - goto Exit; - - /* lower stub test */ - if ( right->next == left && - left->start == y && - !( left->flags & Overshoot_Bottom && - x2 - x1 >= ras.precision_half ) ) - goto Exit; - - if ( dropOutControl == 1 ) - pxl = e2; - else - pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); - break; - - default: /* modes 2, 3, 6, 7 */ - goto Exit; /* no drop-out control */ - } - - /* undocumented but confirmed: If the drop-out would result in a */ - /* pixel outside of the bounding box, use the pixel inside of the */ - /* bounding box instead */ - if ( pxl < 0 ) - pxl = e1; - else if ( TRUNC( pxl ) >= ras.bWidth ) - pxl = e2; - - /* check that the other pixel isn't set */ - e1 = pxl == e1 ? e2 : e1; - - e1 = TRUNC( e1 ); - - c1 = (Short)( e1 >> 3 ); - f1 = (Short)( e1 & 7 ); - - if ( e1 >= 0 && e1 < ras.bWidth && - ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) ) - goto Exit; - } - else - goto Exit; - } - - e1 = TRUNC( pxl ); - - if ( e1 >= 0 && e1 < ras.bWidth ) - { - FT_TRACE7(( " -> x=%d (drop-out)", e1 )); - - c1 = (Short)( e1 >> 3 ); - f1 = (Short)( e1 & 7 ); - - ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 ); - } - - Exit: - FT_TRACE7(( "\n" )); - } - - - static void - Vertical_Sweep_Step( RAS_ARG ) - { - ras.traceOfs += ras.traceIncr; - } - - - /***********************************************************************/ - /* */ - /* Horizontal Sweep Procedure Set */ - /* */ - /* These four routines are used during the horizontal black/white */ - /* sweep phase by the generic Draw_Sweep() function. */ - /* */ - /***********************************************************************/ - - static void - Horizontal_Sweep_Init( RAS_ARGS Short* min, - Short* max ) - { - /* nothing, really */ - FT_UNUSED_RASTER; - FT_UNUSED( min ); - FT_UNUSED( max ); - } - - - static void - Horizontal_Sweep_Span( RAS_ARGS Short y, - FT_F26Dot6 x1, - FT_F26Dot6 x2, - PProfile left, - PProfile right ) - { - FT_UNUSED( left ); - FT_UNUSED( right ); - - - if ( x2 - x1 < ras.precision ) - { - Long e1, e2; - - - FT_TRACE7(( " x=%d y=[%.12f;%.12f]", - y, - x1 / (double)ras.precision, - x2 / (double)ras.precision )); - - e1 = CEILING( x1 ); - e2 = FLOOR ( x2 ); - - if ( e1 == e2 ) - { - e1 = TRUNC( e1 ); - - if ( e1 >= 0 && (ULong)e1 < ras.target.rows ) - { - Byte f1; - PByte bits; - PByte p; - - - FT_TRACE7(( " -> y=%d (drop-out)", e1 )); - - bits = ras.bTarget + ( y >> 3 ); - f1 = (Byte)( 0x80 >> ( y & 7 ) ); - p = bits - e1 * ras.target.pitch; - - if ( ras.target.pitch > 0 ) - p += (Long)( ras.target.rows - 1 ) * ras.target.pitch; - - p[0] |= f1; - } - } - - FT_TRACE7(( "\n" )); - } - } - - - static void - Horizontal_Sweep_Drop( RAS_ARGS Short y, - FT_F26Dot6 x1, - FT_F26Dot6 x2, - PProfile left, - PProfile right ) - { - Long e1, e2, pxl; - PByte bits; - Byte f1; - - - FT_TRACE7(( " x=%d y=[%.12f;%.12f]", - y, - x1 / (double)ras.precision, - x2 / (double)ras.precision )); - - /* During the horizontal sweep, we only take care of drop-outs */ - - /* e1 + <-- pixel center */ - /* | */ - /* x1 ---+--> <-- contour */ - /* | */ - /* | */ - /* x2 <--+--- <-- contour */ - /* | */ - /* | */ - /* e2 + <-- pixel center */ - - e1 = CEILING( x1 ); - e2 = FLOOR ( x2 ); - pxl = e1; - - if ( e1 > e2 ) - { - Int dropOutControl = left->flags & 7; - - - FT_TRACE7(( ", dropout=%d", dropOutControl )); - - if ( e1 == e2 + ras.precision ) - { - switch ( dropOutControl ) - { - case 0: /* simple drop-outs including stubs */ - pxl = e2; - break; - - case 4: /* smart drop-outs including stubs */ - pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); - break; - - case 1: /* simple drop-outs excluding stubs */ - case 5: /* smart drop-outs excluding stubs */ - /* see Vertical_Sweep_Drop for details */ - - /* rightmost stub test */ - if ( left->next == right && - left->height <= 0 && - !( left->flags & Overshoot_Top && - x2 - x1 >= ras.precision_half ) ) - goto Exit; - - /* leftmost stub test */ - if ( right->next == left && - left->start == y && - !( left->flags & Overshoot_Bottom && - x2 - x1 >= ras.precision_half ) ) - goto Exit; - - if ( dropOutControl == 1 ) - pxl = e2; - else - pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); - break; - - default: /* modes 2, 3, 6, 7 */ - goto Exit; /* no drop-out control */ - } - - /* undocumented but confirmed: If the drop-out would result in a */ - /* pixel outside of the bounding box, use the pixel inside of the */ - /* bounding box instead */ - if ( pxl < 0 ) - pxl = e1; - else if ( (ULong)( TRUNC( pxl ) ) >= ras.target.rows ) - pxl = e2; - - /* check that the other pixel isn't set */ - e1 = pxl == e1 ? e2 : e1; - - e1 = TRUNC( e1 ); - - bits = ras.bTarget + ( y >> 3 ); - f1 = (Byte)( 0x80 >> ( y & 7 ) ); - - bits -= e1 * ras.target.pitch; - if ( ras.target.pitch > 0 ) - bits += (Long)( ras.target.rows - 1 ) * ras.target.pitch; - - if ( e1 >= 0 && - (ULong)e1 < ras.target.rows && - *bits & f1 ) - goto Exit; - } - else - goto Exit; - } - - e1 = TRUNC( pxl ); - - if ( e1 >= 0 && (ULong)e1 < ras.target.rows ) - { - FT_TRACE7(( " -> y=%d (drop-out)", e1 )); - - bits = ras.bTarget + ( y >> 3 ); - f1 = (Byte)( 0x80 >> ( y & 7 ) ); - bits -= e1 * ras.target.pitch; - - if ( ras.target.pitch > 0 ) - bits += (Long)( ras.target.rows - 1 ) * ras.target.pitch; - - bits[0] |= f1; - } - - Exit: - FT_TRACE7(( "\n" )); - } - - - static void - Horizontal_Sweep_Step( RAS_ARG ) - { - /* Nothing, really */ - FT_UNUSED_RASTER; - } - - - /*************************************************************************/ - /* */ - /* Generic Sweep Drawing routine */ - /* */ - /*************************************************************************/ - - static Bool - Draw_Sweep( RAS_ARG ) - { - Short y, y_change, y_height; - - PProfile P, Q, P_Left, P_Right; - - Short min_Y, max_Y, top, bottom, dropouts; - - Long x1, x2, xs, e1, e2; - - TProfileList waiting; - TProfileList draw_left, draw_right; - - - /* initialize empty linked lists */ - - Init_Linked( &waiting ); - - Init_Linked( &draw_left ); - Init_Linked( &draw_right ); - - /* first, compute min and max Y */ - - P = ras.fProfile; - max_Y = (Short)TRUNC( ras.minY ); - min_Y = (Short)TRUNC( ras.maxY ); - - while ( P ) - { - Q = P->link; - - bottom = (Short)P->start; - top = (Short)( P->start + P->height - 1 ); - - if ( min_Y > bottom ) - min_Y = bottom; - if ( max_Y < top ) - max_Y = top; - - P->X = 0; - InsNew( &waiting, P ); - - P = Q; - } - - /* check the Y-turns */ - if ( ras.numTurns == 0 ) - { - ras.error = FT_THROW( Invalid ); - return FAILURE; - } - - /* now initialize the sweep */ - - ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y ); - - /* then compute the distance of each profile from min_Y */ - - P = waiting; - - while ( P ) - { - P->countL = P->start - min_Y; - P = P->link; - } - - /* let's go */ - - y = min_Y; - y_height = 0; - - if ( ras.numTurns > 0 && - ras.sizeBuff[-ras.numTurns] == min_Y ) - ras.numTurns--; - - while ( ras.numTurns > 0 ) - { - /* check waiting list for new activations */ - - P = waiting; - - while ( P ) - { - Q = P->link; - P->countL -= y_height; - if ( P->countL == 0 ) - { - DelOld( &waiting, P ); - - if ( P->flags & Flow_Up ) - InsNew( &draw_left, P ); - else - InsNew( &draw_right, P ); - } - - P = Q; - } - - /* sort the drawing lists */ - - Sort( &draw_left ); - Sort( &draw_right ); - - y_change = (Short)ras.sizeBuff[-ras.numTurns--]; - y_height = (Short)( y_change - y ); - - while ( y < y_change ) - { - /* let's trace */ - - dropouts = 0; - - P_Left = draw_left; - P_Right = draw_right; - - while ( P_Left ) - { - x1 = P_Left ->X; - x2 = P_Right->X; - - if ( x1 > x2 ) - { - xs = x1; - x1 = x2; - x2 = xs; - } - - e1 = FLOOR( x1 ); - e2 = CEILING( x2 ); - - if ( x2 - x1 <= ras.precision && - e1 != x1 && e2 != x2 ) - { - if ( e1 > e2 || e2 == e1 + ras.precision ) - { - Int dropOutControl = P_Left->flags & 7; - - - if ( dropOutControl != 2 ) - { - /* a drop-out was detected */ - - P_Left ->X = x1; - P_Right->X = x2; - - /* mark profile for drop-out processing */ - P_Left->countL = 1; - dropouts++; - } - - goto Skip_To_Next; - } - } - - ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right ); - - Skip_To_Next: - - P_Left = P_Left->link; - P_Right = P_Right->link; - } - - /* handle drop-outs _after_ the span drawing -- */ - /* drop-out processing has been moved out of the loop */ - /* for performance tuning */ - if ( dropouts > 0 ) - goto Scan_DropOuts; - - Next_Line: - - ras.Proc_Sweep_Step( RAS_VAR ); - - y++; - - if ( y < y_change ) - { - Sort( &draw_left ); - Sort( &draw_right ); - } - } - - /* now finalize the profiles that need it */ - - P = draw_left; - while ( P ) - { - Q = P->link; - if ( P->height == 0 ) - DelOld( &draw_left, P ); - P = Q; - } - - P = draw_right; - while ( P ) - { - Q = P->link; - if ( P->height == 0 ) - DelOld( &draw_right, P ); - P = Q; - } - } - - /* for gray-scaling, flush the bitmap scanline cache */ - while ( y <= max_Y ) - { - ras.Proc_Sweep_Step( RAS_VAR ); - y++; - } - - return SUCCESS; - - Scan_DropOuts: - - P_Left = draw_left; - P_Right = draw_right; - - while ( P_Left ) - { - if ( P_Left->countL ) - { - P_Left->countL = 0; -#if 0 - dropouts--; /* -- this is useful when debugging only */ -#endif - ras.Proc_Sweep_Drop( RAS_VARS y, - P_Left->X, - P_Right->X, - P_Left, - P_Right ); - } - - P_Left = P_Left->link; - P_Right = P_Right->link; - } - - goto Next_Line; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Render_Single_Pass */ - /* */ - /* <Description> */ - /* Perform one sweep with sub-banding. */ - /* */ - /* <Input> */ - /* flipped :: If set, flip the direction of the outline. */ - /* */ - /* <Return> */ - /* Renderer error code. */ - /* */ - static int - Render_Single_Pass( RAS_ARGS Bool flipped ) - { - Short i, j, k; - - - while ( ras.band_top >= 0 ) - { - ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision; - ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision; - - ras.top = ras.buff; - - ras.error = Raster_Err_None; - - if ( Convert_Glyph( RAS_VARS flipped ) ) - { - if ( ras.error != Raster_Err_Overflow ) - return FAILURE; - - ras.error = Raster_Err_None; - - /* sub-banding */ - -#ifdef DEBUG_RASTER - ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) ); -#endif - - i = ras.band_stack[ras.band_top].y_min; - j = ras.band_stack[ras.band_top].y_max; - - k = (Short)( ( i + j ) / 2 ); - - if ( ras.band_top >= 7 || k < i ) - { - ras.band_top = 0; - ras.error = FT_THROW( Invalid ); - - return ras.error; - } - - ras.band_stack[ras.band_top + 1].y_min = k; - ras.band_stack[ras.band_top + 1].y_max = j; - - ras.band_stack[ras.band_top].y_max = (Short)( k - 1 ); - - ras.band_top++; - } - else - { - if ( ras.fProfile ) - if ( Draw_Sweep( RAS_VAR ) ) - return ras.error; - ras.band_top--; - } - } - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Render_Glyph */ - /* */ - /* <Description> */ - /* Render a glyph in a bitmap. Sub-banding if needed. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - Render_Glyph( RAS_ARG ) - { - FT_Error error; - - - Set_High_Precision( RAS_VARS ras.outline.flags & - FT_OUTLINE_HIGH_PRECISION ); - ras.scale_shift = ras.precision_shift; - - if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS ) - ras.dropOutControl = 2; - else - { - if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS ) - ras.dropOutControl = 4; - else - ras.dropOutControl = 0; - - if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) ) - ras.dropOutControl += 1; - } - - ras.second_pass = (Bool)( !( ras.outline.flags & - FT_OUTLINE_SINGLE_PASS ) ); - - /* Vertical Sweep */ - FT_TRACE7(( "Vertical pass (ftraster)\n" )); - - ras.Proc_Sweep_Init = Vertical_Sweep_Init; - ras.Proc_Sweep_Span = Vertical_Sweep_Span; - ras.Proc_Sweep_Drop = Vertical_Sweep_Drop; - ras.Proc_Sweep_Step = Vertical_Sweep_Step; - - ras.band_top = 0; - ras.band_stack[0].y_min = 0; - ras.band_stack[0].y_max = (Short)( ras.target.rows - 1 ); - - ras.bWidth = (UShort)ras.target.width; - ras.bTarget = (Byte*)ras.target.buffer; - - if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 ) - return error; - - /* Horizontal Sweep */ - if ( ras.second_pass && ras.dropOutControl != 2 ) - { - FT_TRACE7(( "Horizontal pass (ftraster)\n" )); - - ras.Proc_Sweep_Init = Horizontal_Sweep_Init; - ras.Proc_Sweep_Span = Horizontal_Sweep_Span; - ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop; - ras.Proc_Sweep_Step = Horizontal_Sweep_Step; - - ras.band_top = 0; - ras.band_stack[0].y_min = 0; - ras.band_stack[0].y_max = (Short)( ras.target.width - 1 ); - - if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 ) - return error; - } - - return Raster_Err_None; - } - - - static void - ft_black_init( black_PRaster raster ) - { - FT_UNUSED( raster ); - } - - - /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/ - /**** a static object. *****/ - - -#ifdef _STANDALONE_ - - - static int - ft_black_new( void* memory, - FT_Raster *araster ) - { - static black_TRaster the_raster; - FT_UNUSED( memory ); - - - *araster = (FT_Raster)&the_raster; - FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); - ft_black_init( &the_raster ); - - return 0; - } - - - static void - ft_black_done( FT_Raster raster ) - { - /* nothing */ - FT_UNUSED( raster ); - } - - -#else /* !_STANDALONE_ */ - - - static int - ft_black_new( FT_Memory memory, - black_PRaster *araster ) - { - FT_Error error; - black_PRaster raster = NULL; - - - *araster = 0; - if ( !FT_NEW( raster ) ) - { - raster->memory = memory; - ft_black_init( raster ); - - *araster = raster; - } - - return error; - } - - - static void - ft_black_done( black_PRaster raster ) - { - FT_Memory memory = (FT_Memory)raster->memory; - - - FT_FREE( raster ); - } - - -#endif /* !_STANDALONE_ */ - - - static void - ft_black_reset( black_PRaster raster, - char* pool_base, - Long pool_size ) - { - FT_UNUSED( raster ); - FT_UNUSED( pool_base ); - FT_UNUSED( pool_size ); - } - - - static int - ft_black_set_mode( black_PRaster raster, - ULong mode, - const char* palette ) - { - FT_UNUSED( raster ); - FT_UNUSED( mode ); - FT_UNUSED( palette ); - - return 0; - } - - - static int - ft_black_render( black_PRaster raster, - const FT_Raster_Params* params ) - { - const FT_Outline* outline = (const FT_Outline*)params->source; - const FT_Bitmap* target_map = params->target; - - black_TWorker worker[1]; - - Long buffer[FT_MAX( FT_RENDER_POOL_SIZE, 2048 ) / sizeof ( Long )]; - - - if ( !raster ) - return FT_THROW( Not_Ini ); - - if ( !outline ) - return FT_THROW( Invalid ); - - /* return immediately if the outline is empty */ - if ( outline->n_points == 0 || outline->n_contours <= 0 ) - return Raster_Err_None; - - if ( !outline->contours || !outline->points ) - return FT_THROW( Invalid ); - - if ( outline->n_points != - outline->contours[outline->n_contours - 1] + 1 ) - return FT_THROW( Invalid ); - - /* this version of the raster does not support direct rendering, sorry */ - if ( params->flags & FT_RASTER_FLAG_DIRECT ) - return FT_THROW( Unsupported ); - - if ( params->flags & FT_RASTER_FLAG_AA ) - return FT_THROW( Unsupported ); - - if ( !target_map ) - return FT_THROW( Invalid ); - - /* nothing to do */ - if ( !target_map->width || !target_map->rows ) - return Raster_Err_None; - - if ( !target_map->buffer ) - return FT_THROW( Invalid ); - - ras.outline = *outline; - ras.target = *target_map; - - worker->buff = buffer; - worker->sizeBuff = (&buffer)[1]; /* Points to right after buffer. */ - - return Render_Glyph( RAS_VAR ); - } - - - FT_DEFINE_RASTER_FUNCS( - ft_standard_raster, - - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Raster_New_Func) ft_black_new, - (FT_Raster_Reset_Func) ft_black_reset, - (FT_Raster_Set_Mode_Func)ft_black_set_mode, - (FT_Raster_Render_Func) ft_black_render, - (FT_Raster_Done_Func) ft_black_done ) - - -/* END */ diff --git a/3party/freetype/src/raster/ftraster.h b/3party/freetype/src/raster/ftraster.h deleted file mode 100644 index a270d487b9..0000000000 --- a/3party/freetype/src/raster/ftraster.h +++ /dev/null @@ -1,46 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftraster.h */ -/* */ -/* The FreeType glyph rasterizer (specification). */ -/* */ -/* Copyright 1996-2015 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 __FTRASTER_H__ -#define __FTRASTER_H__ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_IMAGE_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* Uncomment the following line if you are using ftraster.c as a */ - /* standalone module, fully independent of FreeType. */ - /* */ -/* #define _STANDALONE_ */ - - FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_standard_raster; - - -FT_END_HEADER - -#endif /* __FTRASTER_H__ */ - - -/* END */ diff --git a/3party/freetype/src/raster/ftrend1.c b/3party/freetype/src/raster/ftrend1.c deleted file mode 100644 index f314392839..0000000000 --- a/3party/freetype/src/raster/ftrend1.c +++ /dev/null @@ -1,254 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftrend1.c */ -/* */ -/* The FreeType glyph rasterizer interface (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_OUTLINE_H -#include "ftrend1.h" -#include "ftraster.h" -#include "rastpic.h" - -#include "rasterrs.h" - - - /* initialize renderer -- init its raster */ - static FT_Error - ft_raster1_init( FT_Renderer render ) - { - FT_Library library = FT_MODULE_LIBRARY( render ); - - - render->clazz->raster_class->raster_reset( render->raster, - library->raster_pool, - library->raster_pool_size ); - - return FT_Err_Ok; - } - - - /* set render-specific mode */ - static FT_Error - ft_raster1_set_mode( FT_Renderer render, - FT_ULong mode_tag, - FT_Pointer data ) - { - /* we simply pass it to the raster */ - return render->clazz->raster_class->raster_set_mode( render->raster, - mode_tag, - data ); - } - - - /* transform a given glyph image */ - static FT_Error - ft_raster1_transform( FT_Renderer render, - FT_GlyphSlot slot, - const FT_Matrix* matrix, - const FT_Vector* delta ) - { - FT_Error error = FT_Err_Ok; - - - if ( slot->format != render->glyph_format ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - if ( matrix ) - FT_Outline_Transform( &slot->outline, matrix ); - - if ( delta ) - FT_Outline_Translate( &slot->outline, delta->x, delta->y ); - - Exit: - return error; - } - - - /* return the glyph's control box */ - static void - ft_raster1_get_cbox( FT_Renderer render, - FT_GlyphSlot slot, - FT_BBox* cbox ) - { - FT_MEM_ZERO( cbox, sizeof ( *cbox ) ); - - if ( slot->format == render->glyph_format ) - FT_Outline_Get_CBox( &slot->outline, cbox ); - } - - - /* convert a slot's glyph image into a bitmap */ - static FT_Error - ft_raster1_render( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin ) - { - FT_Error error; - FT_Outline* outline; - FT_BBox cbox, cbox0; - FT_UInt width, height, pitch; - FT_Bitmap* bitmap; - FT_Memory memory; - - FT_Raster_Params params; - - - /* check glyph image format */ - if ( slot->format != render->glyph_format ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* check rendering mode */ - if ( mode != FT_RENDER_MODE_MONO ) - { - /* raster1 is only capable of producing monochrome bitmaps */ - return FT_THROW( Cannot_Render_Glyph ); - } - - outline = &slot->outline; - - /* translate the outline to the new origin if needed */ - if ( origin ) - FT_Outline_Translate( outline, origin->x, origin->y ); - - /* compute the control box, and grid fit it */ - FT_Outline_Get_CBox( outline, &cbox0 ); - - /* undocumented but confirmed: bbox values get rounded */ -#if 1 - cbox.xMin = FT_PIX_ROUND( cbox0.xMin ); - cbox.yMin = FT_PIX_ROUND( cbox0.yMin ); - cbox.xMax = FT_PIX_ROUND( cbox0.xMax ); - cbox.yMax = FT_PIX_ROUND( cbox0.yMax ); -#else - cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); - cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); - cbox.xMax = FT_PIX_CEIL( cbox.xMax ); - cbox.yMax = FT_PIX_CEIL( cbox.yMax ); -#endif - - /* If either `width' or `height' round to 0, try */ - /* explicitly rounding up/down. In the case of */ - /* glyphs containing only one very narrow feature, */ - /* this gives the drop-out compensation in the scan */ - /* conversion code a chance to do its stuff. */ - width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); - if ( width == 0 ) - { - cbox.xMin = FT_PIX_FLOOR( cbox0.xMin ); - cbox.xMax = FT_PIX_CEIL( cbox0.xMax ); - - width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); - } - - height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); - if ( height == 0 ) - { - cbox.yMin = FT_PIX_FLOOR( cbox0.yMin ); - cbox.yMax = FT_PIX_CEIL( cbox0.yMax ); - - height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); - } - - if ( width > FT_USHORT_MAX || height > FT_USHORT_MAX ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - bitmap = &slot->bitmap; - memory = render->root.memory; - - /* release old bitmap buffer */ - if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) - { - FT_FREE( bitmap->buffer ); - slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; - } - - pitch = ( ( width + 15 ) >> 4 ) << 1; - bitmap->pixel_mode = FT_PIXEL_MODE_MONO; - - bitmap->width = width; - bitmap->rows = height; - bitmap->pitch = (int)pitch; - - if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) ) - goto Exit; - - slot->internal->flags |= FT_GLYPH_OWN_BITMAP; - - /* translate outline to render it into the bitmap */ - FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin ); - - /* set up parameters */ - params.target = bitmap; - params.source = outline; - params.flags = 0; - - /* render outline into the bitmap */ - error = render->raster_render( render->raster, ¶ms ); - - FT_Outline_Translate( outline, cbox.xMin, cbox.yMin ); - - if ( error ) - goto Exit; - - slot->format = FT_GLYPH_FORMAT_BITMAP; - slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 ); - slot->bitmap_top = (FT_Int)( cbox.yMax >> 6 ); - - Exit: - return error; - } - - - FT_DEFINE_RENDERER( ft_raster1_renderer_class, - - FT_MODULE_RENDERER, - sizeof ( FT_RendererRec ), - - "raster1", - 0x10000L, - 0x20000L, - - 0, /* module specific interface */ - - (FT_Module_Constructor)ft_raster1_init, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - , - - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Renderer_RenderFunc) ft_raster1_render, - (FT_Renderer_TransformFunc)ft_raster1_transform, - (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox, - (FT_Renderer_SetModeFunc) ft_raster1_set_mode, - - (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET - ) - - -/* END */ diff --git a/3party/freetype/src/raster/ftrend1.h b/3party/freetype/src/raster/ftrend1.h deleted file mode 100644 index edc5d13f4c..0000000000 --- a/3party/freetype/src/raster/ftrend1.h +++ /dev/null @@ -1,38 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftrend1.h */ -/* */ -/* The FreeType glyph rasterizer interface (specification). */ -/* */ -/* Copyright 1996-2015 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 __FTREND1_H__ -#define __FTREND1_H__ - - -#include <ft2build.h> -#include FT_RENDER_H - - -FT_BEGIN_HEADER - - - FT_DECLARE_RENDERER( ft_raster1_renderer_class ) - - -FT_END_HEADER - -#endif /* __FTREND1_H__ */ - - -/* END */ diff --git a/3party/freetype/src/raster/module.mk b/3party/freetype/src/raster/module.mk deleted file mode 100644 index 75ea107530..0000000000 --- a/3party/freetype/src/raster/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 renderer module definition -# - - -# Copyright 1996-2015 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. - - -FTMODULE_H_COMMANDS += RASTER_MODULE - -define RASTER_MODULE -$(OPEN_DRIVER) FT_Renderer_Class, ft_raster1_renderer_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)raster $(ECHO_DRIVER_DESC)monochrome bitmap renderer$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/raster/raster.c b/3party/freetype/src/raster/raster.c deleted file mode 100644 index 21bb16de1e..0000000000 --- a/3party/freetype/src/raster/raster.c +++ /dev/null @@ -1,27 +0,0 @@ -/***************************************************************************/ -/* */ -/* raster.c */ -/* */ -/* FreeType monochrome rasterer module component (body only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "rastpic.c" -#include "ftraster.c" -#include "ftrend1.c" - - -/* END */ diff --git a/3party/freetype/src/raster/rasterrs.h b/3party/freetype/src/raster/rasterrs.h deleted file mode 100644 index e7f00bcace..0000000000 --- a/3party/freetype/src/raster/rasterrs.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************/ -/* */ -/* rasterrs.h */ -/* */ -/* monochrome renderer error codes (specification only). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the monochrome renderer error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __RASTERRS_H__ -#define __RASTERRS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX Raster_Err_ -#define FT_ERR_BASE FT_Mod_Err_Raster - -#include FT_ERRORS_H - -#endif /* __RASTERRS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/raster/rastpic.c b/3party/freetype/src/raster/rastpic.c deleted file mode 100644 index 77e7ec3f90..0000000000 --- a/3party/freetype/src/raster/rastpic.c +++ /dev/null @@ -1,89 +0,0 @@ -/***************************************************************************/ -/* */ -/* rastpic.c */ -/* */ -/* The FreeType position independent code services for raster module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "rastpic.h" -#include "rasterrs.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from ftraster.c */ - void - FT_Init_Class_ft_standard_raster( FT_Raster_Funcs* funcs ); - - - void - ft_raster1_renderer_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->raster ) - { - RasterPIC* container = (RasterPIC*)pic_container->raster; - - - if ( --container->ref_count ) - return; - FT_FREE( container ); - pic_container->raster = NULL; - } - } - - - FT_Error - ft_raster1_renderer_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - RasterPIC* container = NULL; - FT_Memory memory = library->memory; - - - /* XXX: since this function also served the no longer available */ - /* raster5 renderer it uses reference counting, which could */ - /* be removed now */ - if ( pic_container->raster ) - { - ((RasterPIC*)pic_container->raster)->ref_count++; - return error; - } - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->raster = container; - - container->ref_count = 1; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - FT_Init_Class_ft_standard_raster( &container->ft_standard_raster ); - - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/3party/freetype/src/raster/rastpic.h b/3party/freetype/src/raster/rastpic.h deleted file mode 100644 index 408996a908..0000000000 --- a/3party/freetype/src/raster/rastpic.h +++ /dev/null @@ -1,63 +0,0 @@ -/***************************************************************************/ -/* */ -/* rastpic.h */ -/* */ -/* The FreeType position independent code services for raster module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 __RASTPIC_H__ -#define __RASTPIC_H__ - - -#include FT_INTERNAL_PIC_H - - -FT_BEGIN_HEADER - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_STANDARD_RASTER_GET ft_standard_raster - -#else /* FT_CONFIG_OPTION_PIC */ - - typedef struct RasterPIC_ - { - int ref_count; - FT_Raster_Funcs ft_standard_raster; - - } RasterPIC; - - -#define GET_PIC( lib ) \ - ( (RasterPIC*)( (lib)->pic_container.raster ) ) -#define FT_STANDARD_RASTER_GET ( GET_PIC( library )->ft_standard_raster ) - - - /* see rastpic.c for the implementation */ - void - ft_raster1_renderer_class_pic_free( FT_Library library ); - - FT_Error - ft_raster1_renderer_class_pic_init( FT_Library library ); - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* __RASTPIC_H__ */ - - -/* END */ diff --git a/3party/freetype/src/raster/rules.mk b/3party/freetype/src/raster/rules.mk deleted file mode 100644 index c214b35d37..0000000000 --- a/3party/freetype/src/raster/rules.mk +++ /dev/null @@ -1,73 +0,0 @@ -# -# FreeType 2 renderer module build rules -# - - -# Copyright 1996-2015 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. - - -# raster driver directory -# -RASTER_DIR := $(SRC_DIR)/raster - -# compilation flags for the driver -# -RASTER_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(RASTER_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# raster driver sources (i.e., C files) -# -RASTER_DRV_SRC := $(RASTER_DIR)/ftraster.c \ - $(RASTER_DIR)/ftrend1.c \ - $(RASTER_DIR)/rastpic.c - - -# raster driver headers -# -RASTER_DRV_H := $(RASTER_DRV_SRC:%.c=%.h) \ - $(RASTER_DIR)/rasterrs.h - - -# raster driver object(s) -# -# RASTER_DRV_OBJ_M is used during `multi' builds. -# RASTER_DRV_OBJ_S is used during `single' builds. -# -RASTER_DRV_OBJ_M := $(RASTER_DRV_SRC:$(RASTER_DIR)/%.c=$(OBJ_DIR)/%.$O) -RASTER_DRV_OBJ_S := $(OBJ_DIR)/raster.$O - -# raster driver source file for single build -# -RASTER_DRV_SRC_S := $(RASTER_DIR)/raster.c - - -# raster driver - single object -# -$(RASTER_DRV_OBJ_S): $(RASTER_DRV_SRC_S) $(RASTER_DRV_SRC) \ - $(FREETYPE_H) $(RASTER_DRV_H) - $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(RASTER_DRV_SRC_S)) - - -# raster driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(RASTER_DIR)/%.c $(FREETYPE_H) $(RASTER_DRV_H) - $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(RASTER_DRV_OBJ_S) -DRV_OBJS_M += $(RASTER_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/sfnt/Jamfile b/3party/freetype/src/sfnt/Jamfile deleted file mode 100644 index cc98d1011e..0000000000 --- a/3party/freetype/src/sfnt/Jamfile +++ /dev/null @@ -1,40 +0,0 @@ -# FreeType 2 src/sfnt Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) sfnt ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = pngshim - sfdriver - sfntpic - sfobjs - ttbdf - ttcmap - ttkern - ttload - ttmtx - ttpost - ttsbit - ; - } - else - { - _sources = sfnt ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/sfnt Jamfile diff --git a/3party/freetype/src/sfnt/module.mk b/3party/freetype/src/sfnt/module.mk deleted file mode 100644 index 535fe22afd..0000000000 --- a/3party/freetype/src/sfnt/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 SFNT module definition -# - - -# Copyright 1996-2015 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. - - -FTMODULE_H_COMMANDS += SFNT_MODULE - -define SFNT_MODULE -$(OPEN_DRIVER) FT_Module_Class, sfnt_module_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)sfnt $(ECHO_DRIVER_DESC)helper module for TrueType & OpenType formats$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/sfnt/pngshim.c b/3party/freetype/src/sfnt/pngshim.c deleted file mode 100644 index ea60452635..0000000000 --- a/3party/freetype/src/sfnt/pngshim.c +++ /dev/null @@ -1,378 +0,0 @@ -/***************************************************************************/ -/* */ -/* pngshim.c */ -/* */ -/* PNG Bitmap glyph support. */ -/* */ -/* Copyright 2013-2015 by */ -/* Google, Inc. */ -/* Written by Stuart Gill and Behdad Esfahbod. */ -/* */ -/* 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include FT_CONFIG_STANDARD_LIBRARY_H - - -#ifdef FT_CONFIG_OPTION_USE_PNG - - /* We always include <stjmp.h>, so make libpng shut up! */ -#define PNG_SKIP_SETJMP_CHECK 1 -#include <png.h> -#include "pngshim.h" - -#include "sferrors.h" - - - /* This code is freely based on cairo-png.c. There's so many ways */ - /* to call libpng, and the way cairo does it is defacto standard. */ - - static unsigned int - multiply_alpha( unsigned int alpha, - unsigned int color ) - { - unsigned int temp = alpha * color + 0x80; - - - return ( temp + ( temp >> 8 ) ) >> 8; - } - - - /* Premultiplies data and converts RGBA bytes => native endian. */ - static void - premultiply_data( png_structp png, - png_row_infop row_info, - png_bytep data ) - { - unsigned int i; - - FT_UNUSED( png ); - - - for ( i = 0; i < row_info->rowbytes; i += 4 ) - { - unsigned char* base = &data[i]; - unsigned int alpha = base[3]; - - - if ( alpha == 0 ) - base[0] = base[1] = base[2] = base[3] = 0; - - else - { - unsigned int red = base[0]; - unsigned int green = base[1]; - unsigned int blue = base[2]; - - - if ( alpha != 0xFF ) - { - red = multiply_alpha( alpha, red ); - green = multiply_alpha( alpha, green ); - blue = multiply_alpha( alpha, blue ); - } - - base[0] = (unsigned char)blue; - base[1] = (unsigned char)green; - base[2] = (unsigned char)red; - base[3] = (unsigned char)alpha; - } - } - } - - - /* Converts RGBx bytes to BGRA. */ - static void - convert_bytes_to_data( png_structp png, - png_row_infop row_info, - png_bytep data ) - { - unsigned int i; - - FT_UNUSED( png ); - - - for ( i = 0; i < row_info->rowbytes; i += 4 ) - { - unsigned char* base = &data[i]; - unsigned int red = base[0]; - unsigned int green = base[1]; - unsigned int blue = base[2]; - - - base[0] = (unsigned char)blue; - base[1] = (unsigned char)green; - base[2] = (unsigned char)red; - base[3] = 0xFF; - } - } - - - /* Use error callback to avoid png writing to stderr. */ - static void - error_callback( png_structp png, - png_const_charp error_msg ) - { - FT_Error* error = (FT_Error*)png_get_error_ptr( png ); - - FT_UNUSED( error_msg ); - - - *error = FT_THROW( Out_Of_Memory ); -#ifdef PNG_SETJMP_SUPPORTED - ft_longjmp( png_jmpbuf( png ), 1 ); -#endif - /* if we get here, then we have no choice but to abort ... */ - } - - - /* Use warning callback to avoid png writing to stderr. */ - static void - warning_callback( png_structp png, - png_const_charp error_msg ) - { - FT_UNUSED( png ); - FT_UNUSED( error_msg ); - - /* Just ignore warnings. */ - } - - - static void - read_data_from_FT_Stream( png_structp png, - png_bytep data, - png_size_t length ) - { - FT_Error error; - png_voidp p = png_get_io_ptr( png ); - FT_Stream stream = (FT_Stream)p; - - - if ( FT_FRAME_ENTER( length ) ) - { - FT_Error* e = (FT_Error*)png_get_error_ptr( png ); - - - *e = FT_THROW( Invalid_Stream_Read ); - png_error( png, NULL ); - - return; - } - - memcpy( data, stream->cursor, length ); - - FT_FRAME_EXIT(); - } - - - FT_LOCAL_DEF( FT_Error ) - Load_SBit_Png( FT_GlyphSlot slot, - FT_Int x_offset, - FT_Int y_offset, - FT_Int pix_bits, - TT_SBit_Metrics metrics, - FT_Memory memory, - FT_Byte* data, - FT_UInt png_len, - FT_Bool populate_map_and_metrics ) - { - FT_Bitmap *map = &slot->bitmap; - FT_Error error = FT_Err_Ok; - FT_StreamRec stream; - - png_structp png; - png_infop info; - png_uint_32 imgWidth, imgHeight; - - int bitdepth, color_type, interlace; - FT_Int i; - png_byte* *rows = NULL; /* pacify compiler */ - - - if ( x_offset < 0 || - y_offset < 0 ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - if ( !populate_map_and_metrics && - ( (FT_UInt)x_offset + metrics->width > map->width || - (FT_UInt)y_offset + metrics->height > map->rows || - pix_bits != 32 || - map->pixel_mode != FT_PIXEL_MODE_BGRA ) ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - FT_Stream_OpenMemory( &stream, data, png_len ); - - png = png_create_read_struct( PNG_LIBPNG_VER_STRING, - &error, - error_callback, - warning_callback ); - if ( !png ) - { - error = FT_THROW( Out_Of_Memory ); - goto Exit; - } - - info = png_create_info_struct( png ); - if ( !info ) - { - error = FT_THROW( Out_Of_Memory ); - png_destroy_read_struct( &png, NULL, NULL ); - goto Exit; - } - - if ( ft_setjmp( png_jmpbuf( png ) ) ) - { - error = FT_THROW( Invalid_File_Format ); - goto DestroyExit; - } - - png_set_read_fn( png, &stream, read_data_from_FT_Stream ); - - png_read_info( png, info ); - png_get_IHDR( png, info, - &imgWidth, &imgHeight, - &bitdepth, &color_type, &interlace, - NULL, NULL ); - - if ( error || - ( !populate_map_and_metrics && - ( (FT_Int)imgWidth != metrics->width || - (FT_Int)imgHeight != metrics->height ) ) ) - goto DestroyExit; - - if ( populate_map_and_metrics ) - { - FT_ULong size; - - - metrics->width = (FT_UShort)imgWidth; - metrics->height = (FT_UShort)imgHeight; - - map->width = metrics->width; - map->rows = metrics->height; - map->pixel_mode = FT_PIXEL_MODE_BGRA; - map->pitch = (int)( map->width * 4 ); - map->num_grays = 256; - - /* reject too large bitmaps similarly to the rasterizer */ - if ( map->rows > 0x7FFF || map->width > 0x7FFF ) - { - error = FT_THROW( Array_Too_Large ); - goto DestroyExit; - } - - /* this doesn't overflow: 0x7FFF * 0x7FFF * 4 < 2^32 */ - size = map->rows * (FT_ULong)map->pitch; - - error = ft_glyphslot_alloc_bitmap( slot, size ); - if ( error ) - goto DestroyExit; - } - - /* convert palette/gray image to rgb */ - if ( color_type == PNG_COLOR_TYPE_PALETTE ) - png_set_palette_to_rgb( png ); - - /* expand gray bit depth if needed */ - if ( color_type == PNG_COLOR_TYPE_GRAY ) - { -#if PNG_LIBPNG_VER >= 10209 - png_set_expand_gray_1_2_4_to_8( png ); -#else - png_set_gray_1_2_4_to_8( png ); -#endif - } - - /* transform transparency to alpha */ - if ( png_get_valid(png, info, PNG_INFO_tRNS ) ) - png_set_tRNS_to_alpha( png ); - - if ( bitdepth == 16 ) - png_set_strip_16( png ); - - if ( bitdepth < 8 ) - png_set_packing( png ); - - /* convert grayscale to RGB */ - if ( color_type == PNG_COLOR_TYPE_GRAY || - color_type == PNG_COLOR_TYPE_GRAY_ALPHA ) - png_set_gray_to_rgb( png ); - - if ( interlace != PNG_INTERLACE_NONE ) - png_set_interlace_handling( png ); - - png_set_filler( png, 0xFF, PNG_FILLER_AFTER ); - - /* recheck header after setting EXPAND options */ - png_read_update_info(png, info ); - png_get_IHDR( png, info, - &imgWidth, &imgHeight, - &bitdepth, &color_type, &interlace, - NULL, NULL ); - - if ( bitdepth != 8 || - !( color_type == PNG_COLOR_TYPE_RGB || - color_type == PNG_COLOR_TYPE_RGB_ALPHA ) ) - { - error = FT_THROW( Invalid_File_Format ); - goto DestroyExit; - } - - switch ( color_type ) - { - default: - /* Shouldn't happen, but fall through. */ - - case PNG_COLOR_TYPE_RGB_ALPHA: - png_set_read_user_transform_fn( png, premultiply_data ); - break; - - case PNG_COLOR_TYPE_RGB: - /* Humm, this smells. Carry on though. */ - png_set_read_user_transform_fn( png, convert_bytes_to_data ); - break; - } - - if ( FT_NEW_ARRAY( rows, imgHeight ) ) - { - error = FT_THROW( Out_Of_Memory ); - goto DestroyExit; - } - - for ( i = 0; i < (FT_Int)imgHeight; i++ ) - rows[i] = map->buffer + ( y_offset + i ) * map->pitch + x_offset * 4; - - png_read_image( png, rows ); - - FT_FREE( rows ); - - png_read_end( png, info ); - - DestroyExit: - png_destroy_read_struct( &png, &info, NULL ); - FT_Stream_Close( &stream ); - - Exit: - return error; - } - -#endif /* FT_CONFIG_OPTION_USE_PNG */ - - -/* END */ diff --git a/3party/freetype/src/sfnt/pngshim.h b/3party/freetype/src/sfnt/pngshim.h deleted file mode 100644 index 4cc5c2b3a0..0000000000 --- a/3party/freetype/src/sfnt/pngshim.h +++ /dev/null @@ -1,50 +0,0 @@ -/***************************************************************************/ -/* */ -/* pngshim.h */ -/* */ -/* PNG Bitmap glyph support. */ -/* */ -/* Copyright 2013-2015 by */ -/* Google, Inc. */ -/* Written by Stuart Gill and Behdad Esfahbod. */ -/* */ -/* 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 __PNGSHIM_H__ -#define __PNGSHIM_H__ - - -#include <ft2build.h> -#include "ttload.h" - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_USE_PNG - - FT_LOCAL( FT_Error ) - Load_SBit_Png( FT_GlyphSlot slot, - FT_Int x_offset, - FT_Int y_offset, - FT_Int pix_bits, - TT_SBit_Metrics metrics, - FT_Memory memory, - FT_Byte* data, - FT_UInt png_len, - FT_Bool populate_map_and_metrics ); - -#endif - -FT_END_HEADER - -#endif /* __PNGSHIM_H__ */ - - -/* END */ diff --git a/3party/freetype/src/sfnt/rules.mk b/3party/freetype/src/sfnt/rules.mk deleted file mode 100644 index 3cc76b3f7a..0000000000 --- a/3party/freetype/src/sfnt/rules.mk +++ /dev/null @@ -1,81 +0,0 @@ -# -# FreeType 2 SFNT driver configuration rules -# - - -# Copyright 1996-2015 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. - - -# SFNT driver directory -# -SFNT_DIR := $(SRC_DIR)/sfnt - - -# compilation flags for the driver -# -SFNT_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(SFNT_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# SFNT driver sources (i.e., C files) -# -SFNT_DRV_SRC := $(SFNT_DIR)/ttload.c \ - $(SFNT_DIR)/ttmtx.c \ - $(SFNT_DIR)/ttcmap.c \ - $(SFNT_DIR)/ttsbit.c \ - $(SFNT_DIR)/ttpost.c \ - $(SFNT_DIR)/ttkern.c \ - $(SFNT_DIR)/ttbdf.c \ - $(SFNT_DIR)/sfobjs.c \ - $(SFNT_DIR)/sfdriver.c \ - $(SFNT_DIR)/sfntpic.c \ - $(SFNT_DIR)/pngshim.c - -# SFNT driver headers -# -SFNT_DRV_H := $(SFNT_DRV_SRC:%c=%h) \ - $(SFNT_DIR)/sferrors.h - - -# SFNT driver object(s) -# -# SFNT_DRV_OBJ_M is used during `multi' builds. -# SFNT_DRV_OBJ_S is used during `single' builds. -# -SFNT_DRV_OBJ_M := $(SFNT_DRV_SRC:$(SFNT_DIR)/%.c=$(OBJ_DIR)/%.$O) -SFNT_DRV_OBJ_S := $(OBJ_DIR)/sfnt.$O - -# SFNT driver source file for single build -# -SFNT_DRV_SRC_S := $(SFNT_DIR)/sfnt.c - - -# SFNT driver - single object -# -$(SFNT_DRV_OBJ_S): $(SFNT_DRV_SRC_S) $(SFNT_DRV_SRC) \ - $(FREETYPE_H) $(SFNT_DRV_H) - $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SFNT_DRV_SRC_S)) - - -# SFNT driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(SFNT_DIR)/%.c $(FREETYPE_H) $(SFNT_DRV_H) - $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(SFNT_DRV_OBJ_S) -DRV_OBJS_M += $(SFNT_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/sfnt/sfdriver.c b/3party/freetype/src/sfnt/sfdriver.c deleted file mode 100644 index 6a3f0d9933..0000000000 --- a/3party/freetype/src/sfnt/sfdriver.c +++ /dev/null @@ -1,531 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfdriver.c */ -/* */ -/* High-level SFNT driver interface (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_OBJECTS_H - -#include "sfdriver.h" -#include "ttload.h" -#include "sfobjs.h" -#include "sfntpic.h" - -#include "sferrors.h" - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS -#include "ttsbit.h" -#endif - -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES -#include "ttpost.h" -#endif - -#ifdef TT_CONFIG_OPTION_BDF -#include "ttbdf.h" -#include FT_SERVICE_BDF_H -#endif - -#include "ttcmap.h" -#include "ttkern.h" -#include "ttmtx.h" - -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_TT_CMAP_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_sfdriver - - - /* - * SFNT TABLE SERVICE - * - */ - - static void* - get_sfnt_table( TT_Face face, - FT_Sfnt_Tag tag ) - { - void* table; - - - switch ( tag ) - { - case FT_SFNT_HEAD: - table = &face->header; - break; - - case FT_SFNT_HHEA: - table = &face->horizontal; - break; - - case FT_SFNT_VHEA: - table = face->vertical_info ? &face->vertical : NULL; - break; - - case FT_SFNT_OS2: - table = face->os2.version == 0xFFFFU ? NULL : &face->os2; - break; - - case FT_SFNT_POST: - table = &face->postscript; - break; - - case FT_SFNT_MAXP: - table = &face->max_profile; - break; - - case FT_SFNT_PCLT: - table = face->pclt.Version ? &face->pclt : NULL; - break; - - default: - table = NULL; - } - - return table; - } - - - static FT_Error - sfnt_table_info( TT_Face face, - FT_UInt idx, - FT_ULong *tag, - FT_ULong *offset, - FT_ULong *length ) - { - if ( !offset || !length ) - return FT_THROW( Invalid_Argument ); - - if ( !tag ) - *length = face->num_tables; - else - { - if ( idx >= face->num_tables ) - return FT_THROW( Table_Missing ); - - *tag = face->dir_tables[idx].Tag; - *offset = face->dir_tables[idx].Offset; - *length = face->dir_tables[idx].Length; - } - - return FT_Err_Ok; - } - - - FT_DEFINE_SERVICE_SFNT_TABLEREC( - sfnt_service_sfnt_table, - (FT_SFNT_TableLoadFunc)tt_face_load_any, - (FT_SFNT_TableGetFunc) get_sfnt_table, - (FT_SFNT_TableInfoFunc)sfnt_table_info ) - - -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES - - /* - * GLYPH DICT SERVICE - * - */ - - static FT_Error - sfnt_get_glyph_name( TT_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ) - { - FT_String* gname; - FT_Error error; - - - error = tt_face_get_ps_name( face, glyph_index, &gname ); - if ( !error ) - FT_STRCPYN( buffer, gname, buffer_max ); - - return error; - } - - - static FT_UInt - sfnt_get_name_index( TT_Face face, - FT_String* glyph_name ) - { - FT_Face root = &face->root; - - FT_UInt i, max_gid = FT_UINT_MAX; - - - if ( root->num_glyphs < 0 ) - return 0; - else if ( (FT_ULong)root->num_glyphs < FT_UINT_MAX ) - max_gid = (FT_UInt)root->num_glyphs; - else - FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n", - FT_UINT_MAX, root->num_glyphs )); - - for ( i = 0; i < max_gid; i++ ) - { - FT_String* gname; - FT_Error error = tt_face_get_ps_name( face, i, &gname ); - - - if ( error ) - continue; - - if ( !ft_strcmp( glyph_name, gname ) ) - return i; - } - - return 0; - } - - - FT_DEFINE_SERVICE_GLYPHDICTREC( - sfnt_service_glyph_dict, - (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, - (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index ) - - -#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ - - - /* - * POSTSCRIPT NAME SERVICE - * - */ - - static const char* - sfnt_get_ps_name( TT_Face face ) - { - FT_Int n, found_win, found_apple; - const char* result = NULL; - - - /* shouldn't happen, but just in case to avoid memory leaks */ - if ( face->postscript_name ) - return face->postscript_name; - - /* scan the name table to see whether we have a Postscript name here, */ - /* either in Macintosh or Windows platform encodings */ - found_win = -1; - found_apple = -1; - - for ( n = 0; n < face->num_names; n++ ) - { - TT_NameEntryRec* name = face->name_table.names + n; - - - if ( name->nameID == 6 && name->stringLength > 0 ) - { - if ( name->platformID == 3 && - name->encodingID == 1 && - name->languageID == 0x409 ) - found_win = n; - - if ( name->platformID == 1 && - name->encodingID == 0 && - name->languageID == 0 ) - found_apple = n; - } - } - - if ( found_win != -1 ) - { - FT_Memory memory = face->root.memory; - TT_NameEntryRec* name = face->name_table.names + found_win; - FT_UInt len = name->stringLength / 2; - FT_Error error = FT_Err_Ok; - - FT_UNUSED( error ); - - - if ( !FT_ALLOC( result, name->stringLength + 1 ) ) - { - FT_Stream stream = face->name_table.stream; - FT_String* r = (FT_String*)result; - FT_Char* p; - - - if ( FT_STREAM_SEEK( name->stringOffset ) || - FT_FRAME_ENTER( name->stringLength ) ) - { - FT_FREE( result ); - name->stringLength = 0; - name->stringOffset = 0; - FT_FREE( name->string ); - - goto Exit; - } - - p = (FT_Char*)stream->cursor; - - for ( ; len > 0; len--, p += 2 ) - { - if ( p[0] == 0 && p[1] >= 32 ) - *r++ = p[1]; - } - *r = '\0'; - - FT_FRAME_EXIT(); - } - goto Exit; - } - - if ( found_apple != -1 ) - { - FT_Memory memory = face->root.memory; - TT_NameEntryRec* name = face->name_table.names + found_apple; - FT_UInt len = name->stringLength; - FT_Error error = FT_Err_Ok; - - FT_UNUSED( error ); - - - if ( !FT_ALLOC( result, len + 1 ) ) - { - FT_Stream stream = face->name_table.stream; - - - if ( FT_STREAM_SEEK( name->stringOffset ) || - FT_STREAM_READ( result, len ) ) - { - name->stringOffset = 0; - name->stringLength = 0; - FT_FREE( name->string ); - FT_FREE( result ); - goto Exit; - } - ((char*)result)[len] = '\0'; - } - } - - Exit: - face->postscript_name = result; - return result; - } - - - FT_DEFINE_SERVICE_PSFONTNAMEREC( - sfnt_service_ps_name, - (FT_PsName_GetFunc)sfnt_get_ps_name ) - - - /* - * TT CMAP INFO - */ - FT_DEFINE_SERVICE_TTCMAPSREC( - tt_service_get_cmap_info, - (TT_CMap_Info_GetFunc)tt_get_cmap_info ) - - -#ifdef TT_CONFIG_OPTION_BDF - - static FT_Error - sfnt_get_charset_id( TT_Face face, - const char* *acharset_encoding, - const char* *acharset_registry ) - { - BDF_PropertyRec encoding, registry; - FT_Error error; - - - /* XXX: I don't know whether this is correct, since - * tt_face_find_bdf_prop only returns something correct if we have - * previously selected a size that is listed in the BDF table. - * Should we change the BDF table format to include single offsets - * for `CHARSET_REGISTRY' and `CHARSET_ENCODING'? - */ - error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", ®istry ); - if ( !error ) - { - error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding ); - if ( !error ) - { - if ( registry.type == BDF_PROPERTY_TYPE_ATOM && - encoding.type == BDF_PROPERTY_TYPE_ATOM ) - { - *acharset_encoding = encoding.u.atom; - *acharset_registry = registry.u.atom; - } - else - error = FT_THROW( Invalid_Argument ); - } - } - - return error; - } - - - FT_DEFINE_SERVICE_BDFRec( - sfnt_service_bdf, - (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id, - (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop ) - - -#endif /* TT_CONFIG_OPTION_BDF */ - - - /* - * SERVICE LIST - */ - -#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF - FT_DEFINE_SERVICEDESCREC5( - sfnt_services, - FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, - FT_SERVICE_ID_GLYPH_DICT, &SFNT_SERVICE_GLYPH_DICT_GET, - FT_SERVICE_ID_BDF, &SFNT_SERVICE_BDF_GET, - FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET ) -#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES - FT_DEFINE_SERVICEDESCREC4( - sfnt_services, - FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, - FT_SERVICE_ID_GLYPH_DICT, &SFNT_SERVICE_GLYPH_DICT_GET, - FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET ) -#elif defined TT_CONFIG_OPTION_BDF - FT_DEFINE_SERVICEDESCREC4( - sfnt_services, - FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, - FT_SERVICE_ID_BDF, &SFNT_SERVICE_BDF_GET, - FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET ) -#else - FT_DEFINE_SERVICEDESCREC3( - sfnt_services, - FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, - FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET ) -#endif - - - FT_CALLBACK_DEF( FT_Module_Interface ) - sfnt_get_interface( FT_Module module, - const char* module_interface ) - { - /* SFNT_SERVICES_GET dereferences `library' in PIC mode */ -#ifdef FT_CONFIG_OPTION_PIC - FT_Library library; - - - if ( !module ) - return NULL; - library = module->library; - if ( !library ) - return NULL; -#else - FT_UNUSED( module ); -#endif - - return ft_service_list_lookup( SFNT_SERVICES_GET, module_interface ); - } - - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS -#define PUT_EMBEDDED_BITMAPS( a ) a -#else -#define PUT_EMBEDDED_BITMAPS( a ) NULL -#endif - -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES -#define PUT_PS_NAMES( a ) a -#else -#define PUT_PS_NAMES( a ) NULL -#endif - - FT_DEFINE_SFNT_INTERFACE( - sfnt_interface, - tt_face_goto_table, - - sfnt_init_face, - sfnt_load_face, - sfnt_done_face, - sfnt_get_interface, - - tt_face_load_any, - - tt_face_load_head, - tt_face_load_hhea, - tt_face_load_cmap, - tt_face_load_maxp, - tt_face_load_os2, - tt_face_load_post, - - tt_face_load_name, - tt_face_free_name, - - tt_face_load_kern, - tt_face_load_gasp, - tt_face_load_pclt, - - /* see `ttload.h' */ - PUT_EMBEDDED_BITMAPS( tt_face_load_bhed ), - - PUT_EMBEDDED_BITMAPS( tt_face_load_sbit_image ), - - /* see `ttpost.h' */ - PUT_PS_NAMES( tt_face_get_ps_name ), - PUT_PS_NAMES( tt_face_free_ps_names ), - - /* since version 2.1.8 */ - tt_face_get_kerning, - - /* since version 2.2 */ - tt_face_load_font_dir, - tt_face_load_hmtx, - - /* see `ttsbit.h' and `sfnt.h' */ - PUT_EMBEDDED_BITMAPS( tt_face_load_sbit ), - PUT_EMBEDDED_BITMAPS( tt_face_free_sbit ), - - PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike ), - PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ), - - tt_face_get_metrics, - - tt_face_get_name - ) - - - FT_DEFINE_MODULE( - sfnt_module_class, - - 0, /* not a font driver or renderer */ - sizeof ( FT_ModuleRec ), - - "sfnt", /* driver name */ - 0x10000L, /* driver version 1.0 */ - 0x20000L, /* driver requires FreeType 2.0 or higher */ - - (const void*)&SFNT_INTERFACE_GET, /* module specific interface */ - - (FT_Module_Constructor)0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) sfnt_get_interface ) - - -/* END */ diff --git a/3party/freetype/src/sfnt/sfdriver.h b/3party/freetype/src/sfnt/sfdriver.h deleted file mode 100644 index 944119cc22..0000000000 --- a/3party/freetype/src/sfnt/sfdriver.h +++ /dev/null @@ -1,38 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfdriver.h */ -/* */ -/* High-level SFNT driver interface (specification). */ -/* */ -/* Copyright 1996-2015 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 __SFDRIVER_H__ -#define __SFDRIVER_H__ - - -#include <ft2build.h> -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - - FT_DECLARE_MODULE( sfnt_module_class ) - - -FT_END_HEADER - -#endif /* __SFDRIVER_H__ */ - - -/* END */ diff --git a/3party/freetype/src/sfnt/sferrors.h b/3party/freetype/src/sfnt/sferrors.h deleted file mode 100644 index e3bef3f743..0000000000 --- a/3party/freetype/src/sfnt/sferrors.h +++ /dev/null @@ -1,40 +0,0 @@ -/***************************************************************************/ -/* */ -/* sferrors.h */ -/* */ -/* SFNT error codes (specification only). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the SFNT error enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __SFERRORS_H__ -#define __SFERRORS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX SFNT_Err_ -#define FT_ERR_BASE FT_Mod_Err_SFNT - -#include FT_ERRORS_H - -#endif /* __SFERRORS_H__ */ - -/* END */ diff --git a/3party/freetype/src/sfnt/sfnt.c b/3party/freetype/src/sfnt/sfnt.c deleted file mode 100644 index 0b8b5f4578..0000000000 --- a/3party/freetype/src/sfnt/sfnt.c +++ /dev/null @@ -1,43 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfnt.c */ -/* */ -/* Single object library component. */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "sfntpic.c" -#include "ttload.c" -#include "ttmtx.c" -#include "ttcmap.c" -#include "ttkern.c" -#include "sfobjs.c" -#include "sfdriver.c" - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS -#include "pngshim.c" -#include "ttsbit.c" -#endif - -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES -#include "ttpost.c" -#endif - -#ifdef TT_CONFIG_OPTION_BDF -#include "ttbdf.c" -#endif - -/* END */ diff --git a/3party/freetype/src/sfnt/sfntpic.c b/3party/freetype/src/sfnt/sfntpic.c deleted file mode 100644 index 2aaf4bcc40..0000000000 --- a/3party/freetype/src/sfnt/sfntpic.c +++ /dev/null @@ -1,143 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfntpic.c */ -/* */ -/* The FreeType position independent code services for sfnt module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "sfntpic.h" -#include "sferrors.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from sfdriver.c */ - FT_Error - FT_Create_Class_sfnt_services( FT_Library library, - FT_ServiceDescRec** output_class ); - void - FT_Destroy_Class_sfnt_services( FT_Library library, - FT_ServiceDescRec* clazz ); - void - FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec* clazz ); - void - FT_Init_Class_sfnt_interface( FT_Library library, - SFNT_Interface* clazz ); - void - FT_Init_Class_sfnt_service_glyph_dict( - FT_Library library, - FT_Service_GlyphDictRec* clazz ); - void - FT_Init_Class_sfnt_service_ps_name( - FT_Library library, - FT_Service_PsFontNameRec* clazz ); - void - FT_Init_Class_tt_service_get_cmap_info( - FT_Library library, - FT_Service_TTCMapsRec* clazz ); - void - FT_Init_Class_sfnt_service_sfnt_table( - FT_Service_SFNT_TableRec* clazz ); - - - /* forward declaration of PIC init functions from ttcmap.c */ - FT_Error - FT_Create_Class_tt_cmap_classes( FT_Library library, - TT_CMap_Class** output_class ); - void - FT_Destroy_Class_tt_cmap_classes( FT_Library library, - TT_CMap_Class* clazz ); - - - void - sfnt_module_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->sfnt ) - { - sfntModulePIC* container = (sfntModulePIC*)pic_container->sfnt; - - - if ( container->sfnt_services ) - FT_Destroy_Class_sfnt_services( library, - container->sfnt_services ); - container->sfnt_services = NULL; - - if ( container->tt_cmap_classes ) - FT_Destroy_Class_tt_cmap_classes( library, - container->tt_cmap_classes ); - container->tt_cmap_classes = NULL; - - FT_FREE( container ); - pic_container->sfnt = NULL; - } - } - - - FT_Error - sfnt_module_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - sfntModulePIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->sfnt = container; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - error = FT_Create_Class_sfnt_services( library, - &container->sfnt_services ); - if ( error ) - goto Exit; - - error = FT_Create_Class_tt_cmap_classes( library, - &container->tt_cmap_classes ); - if ( error ) - goto Exit; - - FT_Init_Class_sfnt_service_glyph_dict( - library, &container->sfnt_service_glyph_dict ); - FT_Init_Class_sfnt_service_ps_name( - library, &container->sfnt_service_ps_name ); - FT_Init_Class_tt_service_get_cmap_info( - library, &container->tt_service_get_cmap_info ); - FT_Init_Class_sfnt_service_sfnt_table( - &container->sfnt_service_sfnt_table ); -#ifdef TT_CONFIG_OPTION_BDF - FT_Init_Class_sfnt_service_bdf( &container->sfnt_service_bdf ); -#endif - FT_Init_Class_sfnt_interface( library, &container->sfnt_interface ); - - Exit: - if ( error ) - sfnt_module_class_pic_free( library ); - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/3party/freetype/src/sfnt/sfntpic.h b/3party/freetype/src/sfnt/sfntpic.h deleted file mode 100644 index d99be6a824..0000000000 --- a/3party/freetype/src/sfnt/sfntpic.h +++ /dev/null @@ -1,112 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfntpic.h */ -/* */ -/* The FreeType position independent code services for sfnt module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 __SFNTPIC_H__ -#define __SFNTPIC_H__ - - -#include FT_INTERNAL_PIC_H - - -#ifndef FT_CONFIG_OPTION_PIC - -#define SFNT_SERVICES_GET sfnt_services -#define SFNT_SERVICE_GLYPH_DICT_GET sfnt_service_glyph_dict -#define SFNT_SERVICE_PS_NAME_GET sfnt_service_ps_name -#define TT_SERVICE_CMAP_INFO_GET tt_service_get_cmap_info -#define TT_CMAP_CLASSES_GET tt_cmap_classes -#define SFNT_SERVICE_SFNT_TABLE_GET sfnt_service_sfnt_table -#define SFNT_SERVICE_BDF_GET sfnt_service_bdf -#define SFNT_INTERFACE_GET sfnt_interface - -#else /* FT_CONFIG_OPTION_PIC */ - - /* some include files required for members of sfntModulePIC */ -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_TT_CMAP_H - -#ifdef TT_CONFIG_OPTION_BDF -#include "ttbdf.h" -#include FT_SERVICE_BDF_H -#endif - -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include "ttcmap.h" - - -FT_BEGIN_HEADER - - typedef struct sfntModulePIC_ - { - FT_ServiceDescRec* sfnt_services; - FT_Service_GlyphDictRec sfnt_service_glyph_dict; - FT_Service_PsFontNameRec sfnt_service_ps_name; - FT_Service_TTCMapsRec tt_service_get_cmap_info; - TT_CMap_Class* tt_cmap_classes; - FT_Service_SFNT_TableRec sfnt_service_sfnt_table; -#ifdef TT_CONFIG_OPTION_BDF - FT_Service_BDFRec sfnt_service_bdf; -#endif - SFNT_Interface sfnt_interface; - - } sfntModulePIC; - - -#define GET_PIC( lib ) \ - ( (sfntModulePIC*)( (lib)->pic_container.sfnt ) ) - -#define SFNT_SERVICES_GET \ - ( GET_PIC( library )->sfnt_services ) -#define SFNT_SERVICE_GLYPH_DICT_GET \ - ( GET_PIC( library )->sfnt_service_glyph_dict ) -#define SFNT_SERVICE_PS_NAME_GET \ - ( GET_PIC( library )->sfnt_service_ps_name ) -#define TT_SERVICE_CMAP_INFO_GET \ - ( GET_PIC( library )->tt_service_get_cmap_info ) -#define TT_CMAP_CLASSES_GET \ - ( GET_PIC( library )->tt_cmap_classes ) -#define SFNT_SERVICE_SFNT_TABLE_GET \ - ( GET_PIC( library )->sfnt_service_sfnt_table ) -#define SFNT_SERVICE_BDF_GET \ - ( GET_PIC( library )->sfnt_service_bdf ) -#define SFNT_INTERFACE_GET \ - ( GET_PIC( library )->sfnt_interface ) - - - /* see sfntpic.c for the implementation */ - void - sfnt_module_class_pic_free( FT_Library library ); - - FT_Error - sfnt_module_class_pic_init( FT_Library library ); - - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* __SFNTPIC_H__ */ - - -/* END */ diff --git a/3party/freetype/src/sfnt/sfobjs.c b/3party/freetype/src/sfnt/sfobjs.c deleted file mode 100644 index 14d3adef21..0000000000 --- a/3party/freetype/src/sfnt/sfobjs.c +++ /dev/null @@ -1,1603 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfobjs.c */ -/* */ -/* SFNT object management (base). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include "sfobjs.h" -#include "ttload.h" -#include "ttcmap.h" -#include "ttkern.h" -#include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_DEBUG_H -#include FT_TRUETYPE_IDS_H -#include FT_TRUETYPE_TAGS_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_SFNT_NAMES_H -#include FT_GZIP_H -#include "sferrors.h" - -#ifdef TT_CONFIG_OPTION_BDF -#include "ttbdf.h" -#endif - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_sfobjs - - - - /* convert a UTF-16 name entry to ASCII */ - static FT_String* - tt_name_entry_ascii_from_utf16( TT_NameEntry entry, - FT_Memory memory ) - { - FT_String* string = NULL; - FT_UInt len, code, n; - FT_Byte* read = (FT_Byte*)entry->string; - FT_Error error; - - - len = (FT_UInt)entry->stringLength / 2; - - if ( FT_NEW_ARRAY( string, len + 1 ) ) - return NULL; - - for ( n = 0; n < len; n++ ) - { - code = FT_NEXT_USHORT( read ); - - if ( code == 0 ) - break; - - if ( code < 32 || code > 127 ) - code = '?'; - - string[n] = (char)code; - } - - string[n] = 0; - - return string; - } - - - /* convert an Apple Roman or symbol name entry to ASCII */ - static FT_String* - tt_name_entry_ascii_from_other( TT_NameEntry entry, - FT_Memory memory ) - { - FT_String* string = NULL; - FT_UInt len, code, n; - FT_Byte* read = (FT_Byte*)entry->string; - FT_Error error; - - - len = (FT_UInt)entry->stringLength; - - if ( FT_NEW_ARRAY( string, len + 1 ) ) - return NULL; - - for ( n = 0; n < len; n++ ) - { - code = *read++; - - if ( code == 0 ) - break; - - if ( code < 32 || code > 127 ) - code = '?'; - - string[n] = (char)code; - } - - string[n] = 0; - - return string; - } - - - typedef FT_String* (*TT_NameEntry_ConvertFunc)( TT_NameEntry entry, - FT_Memory memory ); - - - /* documentation is in sfnt.h */ - - FT_LOCAL_DEF( FT_Error ) - tt_face_get_name( TT_Face face, - FT_UShort nameid, - FT_String** name ) - { - FT_Memory memory = face->root.memory; - FT_Error error = FT_Err_Ok; - FT_String* result = NULL; - FT_UShort n; - TT_NameEntryRec* rec; - FT_Int found_apple = -1; - FT_Int found_apple_roman = -1; - FT_Int found_apple_english = -1; - FT_Int found_win = -1; - FT_Int found_unicode = -1; - - FT_Bool is_english = 0; - - TT_NameEntry_ConvertFunc convert; - - - FT_ASSERT( name ); - - rec = face->name_table.names; - for ( n = 0; n < face->num_names; n++, rec++ ) - { - /* According to the OpenType 1.3 specification, only Microsoft or */ - /* Apple platform IDs might be used in the `name' table. The */ - /* `Unicode' platform is reserved for the `cmap' table, and the */ - /* `ISO' one is deprecated. */ - /* */ - /* However, the Apple TrueType specification doesn't say the same */ - /* thing and goes to suggest that all Unicode `name' table entries */ - /* should be coded in UTF-16 (in big-endian format I suppose). */ - /* */ - if ( rec->nameID == nameid && rec->stringLength > 0 ) - { - switch ( rec->platformID ) - { - case TT_PLATFORM_APPLE_UNICODE: - case TT_PLATFORM_ISO: - /* there is `languageID' to check there. We should use this */ - /* field only as a last solution when nothing else is */ - /* available. */ - /* */ - found_unicode = n; - break; - - case TT_PLATFORM_MACINTOSH: - /* This is a bit special because some fonts will use either */ - /* an English language id, or a Roman encoding id, to indicate */ - /* the English version of its font name. */ - /* */ - if ( rec->languageID == TT_MAC_LANGID_ENGLISH ) - found_apple_english = n; - else if ( rec->encodingID == TT_MAC_ID_ROMAN ) - found_apple_roman = n; - break; - - case TT_PLATFORM_MICROSOFT: - /* we only take a non-English name when there is nothing */ - /* else available in the font */ - /* */ - if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 ) - { - switch ( rec->encodingID ) - { - case TT_MS_ID_SYMBOL_CS: - case TT_MS_ID_UNICODE_CS: - case TT_MS_ID_UCS_4: - is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 ); - found_win = n; - break; - - default: - ; - } - } - break; - - default: - ; - } - } - } - - found_apple = found_apple_roman; - if ( found_apple_english >= 0 ) - found_apple = found_apple_english; - - /* some fonts contain invalid Unicode or Macintosh formatted entries; */ - /* we will thus favor names encoded in Windows formats if available */ - /* (provided it is an English name) */ - /* */ - convert = NULL; - if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) ) - { - rec = face->name_table.names + found_win; - switch ( rec->encodingID ) - { - /* all Unicode strings are encoded using UTF-16BE */ - case TT_MS_ID_UNICODE_CS: - case TT_MS_ID_SYMBOL_CS: - convert = tt_name_entry_ascii_from_utf16; - break; - - case TT_MS_ID_UCS_4: - /* Apparently, if this value is found in a name table entry, it is */ - /* documented as `full Unicode repertoire'. Experience with the */ - /* MsGothic font shipped with Windows Vista shows that this really */ - /* means UTF-16 encoded names (UCS-4 values are only used within */ - /* charmaps). */ - convert = tt_name_entry_ascii_from_utf16; - break; - - default: - ; - } - } - else if ( found_apple >= 0 ) - { - rec = face->name_table.names + found_apple; - convert = tt_name_entry_ascii_from_other; - } - else if ( found_unicode >= 0 ) - { - rec = face->name_table.names + found_unicode; - convert = tt_name_entry_ascii_from_utf16; - } - - if ( rec && convert ) - { - if ( rec->string == NULL ) - { - FT_Stream stream = face->name_table.stream; - - - if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) || - FT_STREAM_SEEK( rec->stringOffset ) || - FT_STREAM_READ( rec->string, rec->stringLength ) ) - { - FT_FREE( rec->string ); - rec->stringLength = 0; - result = NULL; - goto Exit; - } - } - - result = convert( rec, memory ); - } - - Exit: - *name = result; - return error; - } - - - static FT_Encoding - sfnt_find_encoding( int platform_id, - int encoding_id ) - { - typedef struct TEncoding_ - { - int platform_id; - int encoding_id; - FT_Encoding encoding; - - } TEncoding; - - static - const TEncoding tt_encodings[] = - { - { TT_PLATFORM_ISO, -1, FT_ENCODING_UNICODE }, - - { TT_PLATFORM_APPLE_UNICODE, -1, FT_ENCODING_UNICODE }, - - { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, FT_ENCODING_APPLE_ROMAN }, - - { TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS, FT_ENCODING_MS_SYMBOL }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, FT_ENCODING_UNICODE }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, FT_ENCODING_SJIS }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, FT_ENCODING_GB2312 }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, FT_ENCODING_BIG5 }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, FT_ENCODING_WANSUNG }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, FT_ENCODING_JOHAB } - }; - - const TEncoding *cur, *limit; - - - cur = tt_encodings; - limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] ); - - for ( ; cur < limit; cur++ ) - { - if ( cur->platform_id == platform_id ) - { - if ( cur->encoding_id == encoding_id || - cur->encoding_id == -1 ) - return cur->encoding; - } - } - - return FT_ENCODING_NONE; - } - - -#define WRITE_USHORT( p, v ) \ - do \ - { \ - *(p)++ = (FT_Byte)( (v) >> 8 ); \ - *(p)++ = (FT_Byte)( (v) >> 0 ); \ - \ - } while ( 0 ) - -#define WRITE_ULONG( p, v ) \ - do \ - { \ - *(p)++ = (FT_Byte)( (v) >> 24 ); \ - *(p)++ = (FT_Byte)( (v) >> 16 ); \ - *(p)++ = (FT_Byte)( (v) >> 8 ); \ - *(p)++ = (FT_Byte)( (v) >> 0 ); \ - \ - } while ( 0 ) - - - static void - sfnt_stream_close( FT_Stream stream ) - { - FT_Memory memory = stream->memory; - - - FT_FREE( stream->base ); - - stream->size = 0; - stream->base = NULL; - stream->close = NULL; - } - - - FT_CALLBACK_DEF( int ) - compare_offsets( const void* a, - const void* b ) - { - WOFF_Table table1 = *(WOFF_Table*)a; - WOFF_Table table2 = *(WOFF_Table*)b; - - FT_ULong offset1 = table1->Offset; - FT_ULong offset2 = table2->Offset; - - - if ( offset1 > offset2 ) - return 1; - else if ( offset1 < offset2 ) - return -1; - else - return 0; - } - - - /* Replace `face->root.stream' with a stream containing the extracted */ - /* SFNT of a WOFF font. */ - - static FT_Error - woff_open_font( FT_Stream stream, - TT_Face face ) - { - FT_Memory memory = stream->memory; - FT_Error error = FT_Err_Ok; - - WOFF_HeaderRec woff; - WOFF_Table tables = NULL; - WOFF_Table* indices = NULL; - - FT_ULong woff_offset; - - FT_Byte* sfnt = NULL; - FT_Stream sfnt_stream = NULL; - - FT_Byte* sfnt_header; - FT_ULong sfnt_offset; - - FT_Int nn; - FT_ULong old_tag = 0; - - static const FT_Frame_Field woff_header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE WOFF_HeaderRec - - FT_FRAME_START( 44 ), - FT_FRAME_ULONG ( signature ), - FT_FRAME_ULONG ( flavor ), - FT_FRAME_ULONG ( length ), - FT_FRAME_USHORT( num_tables ), - FT_FRAME_USHORT( reserved ), - FT_FRAME_ULONG ( totalSfntSize ), - FT_FRAME_USHORT( majorVersion ), - FT_FRAME_USHORT( minorVersion ), - FT_FRAME_ULONG ( metaOffset ), - FT_FRAME_ULONG ( metaLength ), - FT_FRAME_ULONG ( metaOrigLength ), - FT_FRAME_ULONG ( privOffset ), - FT_FRAME_ULONG ( privLength ), - FT_FRAME_END - }; - - - FT_ASSERT( stream == face->root.stream ); - FT_ASSERT( FT_STREAM_POS() == 0 ); - - if ( FT_STREAM_READ_FIELDS( woff_header_fields, &woff ) ) - return error; - - /* Make sure we don't recurse back here or hit TTC code. */ - if ( woff.flavor == TTAG_wOFF || woff.flavor == TTAG_ttcf ) - return FT_THROW( Invalid_Table ); - - /* Miscellaneous checks. */ - if ( woff.length != stream->size || - woff.num_tables == 0 || - 44 + woff.num_tables * 20UL >= woff.length || - 12 + woff.num_tables * 16UL >= woff.totalSfntSize || - ( woff.totalSfntSize & 3 ) != 0 || - ( woff.metaOffset == 0 && ( woff.metaLength != 0 || - woff.metaOrigLength != 0 ) ) || - ( woff.metaLength != 0 && woff.metaOrigLength == 0 ) || - ( woff.privOffset == 0 && woff.privLength != 0 ) ) - return FT_THROW( Invalid_Table ); - - if ( FT_ALLOC( sfnt, woff.totalSfntSize ) || - FT_NEW( sfnt_stream ) ) - goto Exit; - - sfnt_header = sfnt; - - /* Write sfnt header. */ - { - FT_UInt searchRange, entrySelector, rangeShift, x; - - - x = woff.num_tables; - entrySelector = 0; - while ( x ) - { - x >>= 1; - entrySelector += 1; - } - entrySelector--; - - searchRange = ( 1 << entrySelector ) * 16; - rangeShift = woff.num_tables * 16 - searchRange; - - WRITE_ULONG ( sfnt_header, woff.flavor ); - WRITE_USHORT( sfnt_header, woff.num_tables ); - WRITE_USHORT( sfnt_header, searchRange ); - WRITE_USHORT( sfnt_header, entrySelector ); - WRITE_USHORT( sfnt_header, rangeShift ); - } - - /* While the entries in the sfnt header must be sorted by the */ - /* tag value, the tables themselves are not. We thus have to */ - /* sort them by offset and check that they don't overlap. */ - - if ( FT_NEW_ARRAY( tables, woff.num_tables ) || - FT_NEW_ARRAY( indices, woff.num_tables ) ) - goto Exit; - - FT_TRACE2(( "\n" - " tag offset compLen origLen checksum\n" - " -------------------------------------------\n" )); - - if ( FT_FRAME_ENTER( 20L * woff.num_tables ) ) - goto Exit; - - for ( nn = 0; nn < woff.num_tables; nn++ ) - { - WOFF_Table table = tables + nn; - - table->Tag = FT_GET_TAG4(); - table->Offset = FT_GET_ULONG(); - table->CompLength = FT_GET_ULONG(); - table->OrigLength = FT_GET_ULONG(); - table->CheckSum = FT_GET_ULONG(); - - FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx %08lx\n", - (FT_Char)( table->Tag >> 24 ), - (FT_Char)( table->Tag >> 16 ), - (FT_Char)( table->Tag >> 8 ), - (FT_Char)( table->Tag ), - table->Offset, - table->CompLength, - table->OrigLength, - table->CheckSum )); - - if ( table->Tag <= old_tag ) - { - FT_FRAME_EXIT(); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - old_tag = table->Tag; - indices[nn] = table; - } - - FT_FRAME_EXIT(); - - /* Sort by offset. */ - - ft_qsort( indices, - woff.num_tables, - sizeof ( WOFF_Table ), - compare_offsets ); - - /* Check offsets and lengths. */ - - woff_offset = 44 + woff.num_tables * 20L; - sfnt_offset = 12 + woff.num_tables * 16L; - - for ( nn = 0; nn < woff.num_tables; nn++ ) - { - WOFF_Table table = indices[nn]; - - - if ( table->Offset != woff_offset || - table->CompLength > woff.length || - table->Offset > woff.length - table->CompLength || - table->OrigLength > woff.totalSfntSize || - sfnt_offset > woff.totalSfntSize - table->OrigLength || - table->CompLength > table->OrigLength ) - { - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - table->OrigOffset = sfnt_offset; - - /* The offsets must be multiples of 4. */ - woff_offset += ( table->CompLength + 3 ) & ~3U; - sfnt_offset += ( table->OrigLength + 3 ) & ~3U; - } - - /* - * Final checks! - * - * We don't decode and check the metadata block. - * We don't check table checksums either. - * But other than those, I think we implement all - * `MUST' checks from the spec. - */ - - if ( woff.metaOffset ) - { - if ( woff.metaOffset != woff_offset || - woff.metaOffset + woff.metaLength > woff.length ) - { - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - /* We have padding only ... */ - woff_offset += woff.metaLength; - } - - if ( woff.privOffset ) - { - /* ... if it isn't the last block. */ - woff_offset = ( woff_offset + 3 ) & ~3U; - - if ( woff.privOffset != woff_offset || - woff.privOffset + woff.privLength > woff.length ) - { - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - /* No padding for the last block. */ - woff_offset += woff.privLength; - } - - if ( sfnt_offset != woff.totalSfntSize || - woff_offset != woff.length ) - { - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - /* Write the tables. */ - - for ( nn = 0; nn < woff.num_tables; nn++ ) - { - WOFF_Table table = tables + nn; - - - /* Write SFNT table entry. */ - WRITE_ULONG( sfnt_header, table->Tag ); - WRITE_ULONG( sfnt_header, table->CheckSum ); - WRITE_ULONG( sfnt_header, table->OrigOffset ); - WRITE_ULONG( sfnt_header, table->OrigLength ); - - /* Write table data. */ - if ( FT_STREAM_SEEK( table->Offset ) || - FT_FRAME_ENTER( table->CompLength ) ) - goto Exit; - - if ( table->CompLength == table->OrigLength ) - { - /* Uncompressed data; just copy. */ - ft_memcpy( sfnt + table->OrigOffset, - stream->cursor, - table->OrigLength ); - } - else - { -#ifdef FT_CONFIG_OPTION_USE_ZLIB - - /* Uncompress with zlib. */ - FT_ULong output_len = table->OrigLength; - - - error = FT_Gzip_Uncompress( memory, - sfnt + table->OrigOffset, &output_len, - stream->cursor, table->CompLength ); - if ( error ) - goto Exit; - if ( output_len != table->OrigLength ) - { - error = FT_THROW( Invalid_Table ); - goto Exit; - } - -#else /* !FT_CONFIG_OPTION_USE_ZLIB */ - - error = FT_THROW( Unimplemented_Feature ); - goto Exit; - -#endif /* !FT_CONFIG_OPTION_USE_ZLIB */ - } - - FT_FRAME_EXIT(); - - /* We don't check whether the padding bytes in the WOFF file are */ - /* actually '\0'. For the output, however, we do set them properly. */ - sfnt_offset = table->OrigOffset + table->OrigLength; - while ( sfnt_offset & 3 ) - { - sfnt[sfnt_offset] = '\0'; - sfnt_offset++; - } - } - - /* Ok! Finally ready. Swap out stream and return. */ - FT_Stream_OpenMemory( sfnt_stream, sfnt, woff.totalSfntSize ); - sfnt_stream->memory = stream->memory; - sfnt_stream->close = sfnt_stream_close; - - FT_Stream_Free( - face->root.stream, - ( face->root.face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); - - face->root.stream = sfnt_stream; - - face->root.face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; - - Exit: - FT_FREE( tables ); - FT_FREE( indices ); - - if ( error ) - { - FT_FREE( sfnt ); - FT_Stream_Close( sfnt_stream ); - FT_FREE( sfnt_stream ); - } - - return error; - } - - -#undef WRITE_USHORT -#undef WRITE_ULONG - - - /* Fill in face->ttc_header. If the font is not a TTC, it is */ - /* synthesized into a TTC with one offset table. */ - static FT_Error - sfnt_open_font( FT_Stream stream, - TT_Face face ) - { - FT_Memory memory = stream->memory; - FT_Error error; - FT_ULong tag, offset; - - static const FT_Frame_Field ttc_header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TTC_HeaderRec - - FT_FRAME_START( 8 ), - FT_FRAME_LONG( version ), - FT_FRAME_LONG( count ), /* this is ULong in the specs */ - FT_FRAME_END - }; - - - face->ttc_header.tag = 0; - face->ttc_header.version = 0; - face->ttc_header.count = 0; - - retry: - offset = FT_STREAM_POS(); - - if ( FT_READ_ULONG( tag ) ) - return error; - - if ( tag == TTAG_wOFF ) - { - FT_TRACE2(( "sfnt_open_font: file is a WOFF; synthesizing SFNT\n" )); - - if ( FT_STREAM_SEEK( offset ) ) - return error; - - error = woff_open_font( stream, face ); - if ( error ) - return error; - - /* Swap out stream and retry! */ - stream = face->root.stream; - goto retry; - } - - if ( tag != 0x00010000UL && - tag != TTAG_ttcf && - tag != TTAG_OTTO && - tag != TTAG_true && - tag != TTAG_typ1 && - tag != 0x00020000UL ) - { - FT_TRACE2(( " not a font using the SFNT container format\n" )); - return FT_THROW( Unknown_File_Format ); - } - - face->ttc_header.tag = TTAG_ttcf; - - if ( tag == TTAG_ttcf ) - { - FT_Int n; - - - FT_TRACE3(( "sfnt_open_font: file is a collection\n" )); - - if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) ) - return error; - - if ( face->ttc_header.count == 0 ) - return FT_THROW( Invalid_Table ); - - /* a rough size estimate: let's conservatively assume that there */ - /* is just a single table info in each subfont header (12 + 16*1 = */ - /* 28 bytes), thus we have (at least) `12 + 4*count' bytes for the */ - /* size of the TTC header plus `28*count' bytes for all subfont */ - /* headers */ - if ( (FT_ULong)face->ttc_header.count > stream->size / ( 28 + 4 ) ) - return FT_THROW( Array_Too_Large ); - - /* now read the offsets of each font in the file */ - if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) ) - return error; - - if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) ) - return error; - - for ( n = 0; n < face->ttc_header.count; n++ ) - face->ttc_header.offsets[n] = FT_GET_ULONG(); - - FT_FRAME_EXIT(); - } - else - { - FT_TRACE3(( "sfnt_open_font: synthesize TTC\n" )); - - face->ttc_header.version = 1 << 16; - face->ttc_header.count = 1; - - if ( FT_NEW( face->ttc_header.offsets ) ) - return error; - - face->ttc_header.offsets[0] = offset; - } - - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - sfnt_init_face( FT_Stream stream, - TT_Face face, - FT_Int face_instance_index, - FT_Int num_params, - FT_Parameter* params ) - { - FT_Error error; - FT_Library library = face->root.driver->root.library; - SFNT_Service sfnt; - FT_Int face_index; - - - /* for now, parameters are unused */ - FT_UNUSED( num_params ); - FT_UNUSED( params ); - - - sfnt = (SFNT_Service)face->sfnt; - if ( !sfnt ) - { - sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); - if ( !sfnt ) - { - FT_ERROR(( "sfnt_init_face: cannot access `sfnt' module\n" )); - return FT_THROW( Missing_Module ); - } - - face->sfnt = sfnt; - face->goto_table = sfnt->goto_table; - } - - FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS ); - - FT_TRACE2(( "SFNT driver\n" )); - - error = sfnt_open_font( stream, face ); - if ( error ) - return error; - - /* Stream may have changed in sfnt_open_font. */ - stream = face->root.stream; - - FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_instance_index )); - - face_index = FT_ABS( face_instance_index ) & 0xFFFF; - - if ( face_index >= face->ttc_header.count ) - { - if ( face_instance_index >= 0 ) - return FT_THROW( Invalid_Argument ); - else - face_index = 0; - } - - if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) ) - return error; - - /* check whether we have a valid TrueType file */ - error = sfnt->load_font_dir( face, stream ); - if ( error ) - return error; - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - { - FT_ULong fvar_len; - FT_UShort num_instances; - FT_Int instance_index; - - - instance_index = FT_ABS( face_instance_index ) >> 16; - - /* test whether current face is a GX font with named instances */ - if ( face->goto_table( face, TTAG_fvar, stream, &fvar_len ) || - fvar_len < 20 || - FT_STREAM_SKIP( 12 ) || - FT_READ_USHORT( num_instances ) ) - num_instances = 0; - - /* we support at most 2^15 - 1 instances */ - if ( num_instances >= ( 1U << 15 ) - 1 ) - { - if ( face_instance_index >= 0 ) - return FT_THROW( Invalid_Argument ); - else - num_instances = 0; - } - - /* instance indices in `face_instance_index' start with index 1, */ - /* thus `>' and not `>=' */ - if ( instance_index > num_instances ) - { - if ( face_instance_index >= 0 ) - return FT_THROW( Invalid_Argument ); - else - num_instances = 0; - } - - face->root.style_flags = (FT_Long)num_instances << 16; - } -#endif - - face->root.num_faces = face->ttc_header.count; - face->root.face_index = face_index; - - return error; - } - - -#define LOAD_( x ) \ - do \ - { \ - FT_TRACE2(( "`" #x "' " )); \ - FT_TRACE3(( "-->\n" )); \ - \ - error = sfnt->load_ ## x( face, stream ); \ - \ - FT_TRACE2(( "%s\n", ( !error ) \ - ? "loaded" \ - : FT_ERR_EQ( error, Table_Missing ) \ - ? "missing" \ - : "failed to load" )); \ - FT_TRACE3(( "\n" )); \ - } while ( 0 ) - -#define LOADM_( x, vertical ) \ - do \ - { \ - FT_TRACE2(( "`%s" #x "' ", \ - vertical ? "vertical " : "" )); \ - FT_TRACE3(( "-->\n" )); \ - \ - error = sfnt->load_ ## x( face, stream, vertical ); \ - \ - FT_TRACE2(( "%s\n", ( !error ) \ - ? "loaded" \ - : FT_ERR_EQ( error, Table_Missing ) \ - ? "missing" \ - : "failed to load" )); \ - FT_TRACE3(( "\n" )); \ - } while ( 0 ) - -#define GET_NAME( id, field ) \ - do \ - { \ - error = tt_face_get_name( face, TT_NAME_ID_ ## id, field ); \ - if ( error ) \ - goto Exit; \ - } while ( 0 ) - - - FT_LOCAL_DEF( FT_Error ) - sfnt_load_face( FT_Stream stream, - TT_Face face, - FT_Int face_instance_index, - FT_Int num_params, - FT_Parameter* params ) - { - FT_Error error; -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES - FT_Error psnames_error; -#endif - FT_Bool has_outline; - FT_Bool is_apple_sbit; - FT_Bool is_apple_sbix; - FT_Bool ignore_preferred_family = FALSE; - FT_Bool ignore_preferred_subfamily = FALSE; - - SFNT_Service sfnt = (SFNT_Service)face->sfnt; - - FT_UNUSED( face_instance_index ); - - - /* Check parameters */ - - { - FT_Int i; - - - for ( i = 0; i < num_params; i++ ) - { - if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY ) - ignore_preferred_family = TRUE; - else if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY ) - ignore_preferred_subfamily = TRUE; - } - } - - /* Load tables */ - - /* We now support two SFNT-based bitmapped font formats. They */ - /* are recognized easily as they do not include a `glyf' */ - /* table. */ - /* */ - /* The first format comes from Apple, and uses a table named */ - /* `bhed' instead of `head' to store the font header (using */ - /* the same format). It also doesn't include horizontal and */ - /* vertical metrics tables (i.e. `hhea' and `vhea' tables are */ - /* missing). */ - /* */ - /* The other format comes from Microsoft, and is used with */ - /* WinCE/PocketPC. It looks like a standard TTF, except that */ - /* it doesn't contain outlines. */ - /* */ - - FT_TRACE2(( "sfnt_load_face: %08p\n\n", face )); - - /* do we have outlines in there? */ -#ifdef FT_CONFIG_OPTION_INCREMENTAL - has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 || - tt_face_lookup_table( face, TTAG_glyf ) != 0 || - tt_face_lookup_table( face, TTAG_CFF ) != 0 ); -#else - has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 || - tt_face_lookup_table( face, TTAG_CFF ) != 0 ); -#endif - - is_apple_sbit = 0; - is_apple_sbix = !face->goto_table( face, TTAG_sbix, stream, 0 ); - - /* Apple 'sbix' color bitmaps are rendered scaled and then the 'glyf' - * outline rendered on top. We don't support that yet, so just ignore - * the 'glyf' outline and advertise it as a bitmap-only font. */ - if ( is_apple_sbix ) - has_outline = FALSE; - - /* if this font doesn't contain outlines, we try to load */ - /* a `bhed' table */ - if ( !has_outline && sfnt->load_bhed ) - { - LOAD_( bhed ); - is_apple_sbit = FT_BOOL( !error ); - } - - /* load the font header (`head' table) if this isn't an Apple */ - /* sbit font file */ - if ( !is_apple_sbit || is_apple_sbix ) - { - LOAD_( head ); - if ( error ) - goto Exit; - } - - if ( face->header.Units_Per_EM == 0 ) - { - error = FT_THROW( Invalid_Table ); - - goto Exit; - } - - /* the following tables are often not present in embedded TrueType */ - /* fonts within PDF documents, so don't check for them. */ - LOAD_( maxp ); - LOAD_( cmap ); - - /* the following tables are optional in PCL fonts -- */ - /* don't check for errors */ - LOAD_( name ); - LOAD_( post ); - -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES - psnames_error = error; -#endif - - /* do not load the metrics headers and tables if this is an Apple */ - /* sbit font file */ - if ( !is_apple_sbit ) - { - /* load the `hhea' and `hmtx' tables */ - LOADM_( hhea, 0 ); - if ( !error ) - { - LOADM_( hmtx, 0 ); - if ( FT_ERR_EQ( error, Table_Missing ) ) - { - error = FT_THROW( Hmtx_Table_Missing ); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* If this is an incrementally loaded font and there are */ - /* overriding metrics, tolerate a missing `hmtx' table. */ - if ( face->root.internal->incremental_interface && - face->root.internal->incremental_interface->funcs-> - get_glyph_metrics ) - { - face->horizontal.number_Of_HMetrics = 0; - error = FT_Err_Ok; - } -#endif - } - } - else if ( FT_ERR_EQ( error, Table_Missing ) ) - { - /* No `hhea' table necessary for SFNT Mac fonts. */ - if ( face->format_tag == TTAG_true ) - { - FT_TRACE2(( "This is an SFNT Mac font.\n" )); - - has_outline = 0; - error = FT_Err_Ok; - } - else - { - error = FT_THROW( Horiz_Header_Missing ); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* If this is an incrementally loaded font and there are */ - /* overriding metrics, tolerate a missing `hhea' table. */ - if ( face->root.internal->incremental_interface && - face->root.internal->incremental_interface->funcs-> - get_glyph_metrics ) - { - face->horizontal.number_Of_HMetrics = 0; - error = FT_Err_Ok; - } -#endif - - } - } - - if ( error ) - goto Exit; - - /* try to load the `vhea' and `vmtx' tables */ - LOADM_( hhea, 1 ); - if ( !error ) - { - LOADM_( hmtx, 1 ); - if ( !error ) - face->vertical_info = 1; - } - - if ( error && FT_ERR_NEQ( error, Table_Missing ) ) - goto Exit; - - LOAD_( os2 ); - if ( error ) - { - /* we treat the table as missing if there are any errors */ - face->os2.version = 0xFFFFU; - } - } - - /* the optional tables */ - - /* embedded bitmap support */ - if ( sfnt->load_eblc ) - { - LOAD_( eblc ); - if ( error ) - { - /* a font which contains neither bitmaps nor outlines is */ - /* still valid (although rather useless in most cases); */ - /* however, you can find such stripped fonts in PDFs */ - if ( FT_ERR_EQ( error, Table_Missing ) ) - error = FT_Err_Ok; - else - goto Exit; - } - } - - LOAD_( pclt ); - if ( error ) - { - if ( FT_ERR_NEQ( error, Table_Missing ) ) - goto Exit; - - face->pclt.Version = 0; - } - - /* consider the kerning and gasp tables as optional */ - LOAD_( gasp ); - LOAD_( kern ); - - face->root.num_glyphs = face->max_profile.numGlyphs; - - /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes */ - /* a WWS-only font face. `WWS' stands for `weight', width', and */ - /* `slope', a term used by Microsoft's Windows Presentation */ - /* Foundation (WPF). This flag has been introduced in version */ - /* 1.5 of the OpenType specification (May 2008). */ - - face->root.family_name = NULL; - face->root.style_name = NULL; - if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 ) - { - if ( !ignore_preferred_family ) - GET_NAME( PREFERRED_FAMILY, &face->root.family_name ); - if ( !face->root.family_name ) - GET_NAME( FONT_FAMILY, &face->root.family_name ); - - if ( !ignore_preferred_subfamily ) - GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name ); - if ( !face->root.style_name ) - GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); - } - else - { - GET_NAME( WWS_FAMILY, &face->root.family_name ); - if ( !face->root.family_name && !ignore_preferred_family ) - GET_NAME( PREFERRED_FAMILY, &face->root.family_name ); - if ( !face->root.family_name ) - GET_NAME( FONT_FAMILY, &face->root.family_name ); - - GET_NAME( WWS_SUBFAMILY, &face->root.style_name ); - if ( !face->root.style_name && !ignore_preferred_subfamily ) - GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name ); - if ( !face->root.style_name ) - GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); - } - - /* now set up root fields */ - { - FT_Face root = &face->root; - FT_Long flags = root->face_flags; - - - /*********************************************************************/ - /* */ - /* Compute face flags. */ - /* */ - if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_CBLC || - face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX ) - flags |= FT_FACE_FLAG_COLOR; /* color glyphs */ - - if ( has_outline == TRUE ) - flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */ - - /* The sfnt driver only supports bitmap fonts natively, thus we */ - /* don't set FT_FACE_FLAG_HINTER. */ - flags |= FT_FACE_FLAG_SFNT | /* SFNT file format */ - FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ - -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES - if ( !psnames_error && - face->postscript.FormatType != 0x00030000L ) - flags |= FT_FACE_FLAG_GLYPH_NAMES; -#endif - - /* fixed width font? */ - if ( face->postscript.isFixedPitch ) - flags |= FT_FACE_FLAG_FIXED_WIDTH; - - /* vertical information? */ - if ( face->vertical_info ) - flags |= FT_FACE_FLAG_VERTICAL; - - /* kerning available ? */ - if ( TT_FACE_HAS_KERNING( face ) ) - flags |= FT_FACE_FLAG_KERNING; - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - /* Don't bother to load the tables unless somebody asks for them. */ - /* No need to do work which will (probably) not be used. */ - if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 && - tt_face_lookup_table( face, TTAG_fvar ) != 0 && - tt_face_lookup_table( face, TTAG_gvar ) != 0 ) - flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; -#endif - - root->face_flags = flags; - - /*********************************************************************/ - /* */ - /* Compute style flags. */ - /* */ - - flags = 0; - if ( has_outline == TRUE && face->os2.version != 0xFFFFU ) - { - /* We have an OS/2 table; use the `fsSelection' field. Bit 9 */ - /* indicates an oblique font face. This flag has been */ - /* introduced in version 1.5 of the OpenType specification. */ - - if ( face->os2.fsSelection & 512 ) /* bit 9 */ - flags |= FT_STYLE_FLAG_ITALIC; - else if ( face->os2.fsSelection & 1 ) /* bit 0 */ - flags |= FT_STYLE_FLAG_ITALIC; - - if ( face->os2.fsSelection & 32 ) /* bit 5 */ - flags |= FT_STYLE_FLAG_BOLD; - } - else - { - /* this is an old Mac font, use the header field */ - - if ( face->header.Mac_Style & 1 ) - flags |= FT_STYLE_FLAG_BOLD; - - if ( face->header.Mac_Style & 2 ) - flags |= FT_STYLE_FLAG_ITALIC; - } - - root->style_flags |= flags; - - /*********************************************************************/ - /* */ - /* Polish the charmaps. */ - /* */ - /* Try to set the charmap encoding according to the platform & */ - /* encoding ID of each charmap. */ - /* */ - - tt_face_build_cmaps( face ); /* ignore errors */ - - - /* set the encoding fields */ - { - FT_Int m; - - - for ( m = 0; m < root->num_charmaps; m++ ) - { - FT_CharMap charmap = root->charmaps[m]; - - - charmap->encoding = sfnt_find_encoding( charmap->platform_id, - charmap->encoding_id ); - -#if 0 - if ( root->charmap == NULL && - charmap->encoding == FT_ENCODING_UNICODE ) - { - /* set 'root->charmap' to the first Unicode encoding we find */ - root->charmap = charmap; - } -#endif - } - } - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - /* - * Now allocate the root array of FT_Bitmap_Size records and - * populate them. Unfortunately, it isn't possible to indicate bit - * depths in the FT_Bitmap_Size record. This is a design error. - */ - { - FT_UInt i, count; - - - count = face->sbit_num_strikes; - - if ( count > 0 ) - { - FT_Memory memory = face->root.stream->memory; - FT_UShort em_size = face->header.Units_Per_EM; - FT_Short avgwidth = face->os2.xAvgCharWidth; - FT_Size_Metrics metrics; - - - if ( em_size == 0 || face->os2.version == 0xFFFFU ) - { - avgwidth = 1; - em_size = 1; - } - - if ( FT_NEW_ARRAY( root->available_sizes, count ) ) - goto Exit; - - for ( i = 0; i < count; i++ ) - { - FT_Bitmap_Size* bsize = root->available_sizes + i; - - - error = sfnt->load_strike_metrics( face, i, &metrics ); - if ( error ) - goto Exit; - - bsize->height = (FT_Short)( metrics.height >> 6 ); - bsize->width = (FT_Short)( - ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size ); - - bsize->x_ppem = metrics.x_ppem << 6; - bsize->y_ppem = metrics.y_ppem << 6; - - /* assume 72dpi */ - bsize->size = metrics.y_ppem << 6; - } - - root->face_flags |= FT_FACE_FLAG_FIXED_SIZES; - root->num_fixed_sizes = (FT_Int)count; - } - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - /* a font with no bitmaps and no outlines is scalable; */ - /* it has only empty glyphs then */ - if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) ) - root->face_flags |= FT_FACE_FLAG_SCALABLE; - - - /*********************************************************************/ - /* */ - /* Set up metrics. */ - /* */ - if ( FT_IS_SCALABLE( root ) ) - { - /* XXX What about if outline header is missing */ - /* (e.g. sfnt wrapped bitmap)? */ - root->bbox.xMin = face->header.xMin; - root->bbox.yMin = face->header.yMin; - root->bbox.xMax = face->header.xMax; - root->bbox.yMax = face->header.yMax; - root->units_per_EM = face->header.Units_Per_EM; - - - /* XXX: Computing the ascender/descender/height is very different */ - /* from what the specification tells you. Apparently, we */ - /* must be careful because */ - /* */ - /* - not all fonts have an OS/2 table; in this case, we take */ - /* the values in the horizontal header. However, these */ - /* values very often are not reliable. */ - /* */ - /* - otherwise, the correct typographic values are in the */ - /* sTypoAscender, sTypoDescender & sTypoLineGap fields. */ - /* */ - /* However, certain fonts have these fields set to 0. */ - /* Rather, they have usWinAscent & usWinDescent correctly */ - /* set (but with different values). */ - /* */ - /* As an example, Arial Narrow is implemented through four */ - /* files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */ - /* */ - /* Strangely, all fonts have the same values in their */ - /* sTypoXXX fields, except ARIALNB which sets them to 0. */ - /* */ - /* On the other hand, they all have different */ - /* usWinAscent/Descent values -- as a conclusion, the OS/2 */ - /* table cannot be used to compute the text height reliably! */ - /* */ - - /* The ascender and descender are taken from the `hhea' table. */ - /* If zero, they are taken from the `OS/2' table. */ - - root->ascender = face->horizontal.Ascender; - root->descender = face->horizontal.Descender; - - root->height = root->ascender - root->descender + - face->horizontal.Line_Gap; - - if ( !( root->ascender || root->descender ) ) - { - if ( face->os2.version != 0xFFFFU ) - { - if ( face->os2.sTypoAscender || face->os2.sTypoDescender ) - { - root->ascender = face->os2.sTypoAscender; - root->descender = face->os2.sTypoDescender; - - root->height = root->ascender - root->descender + - face->os2.sTypoLineGap; - } - else - { - root->ascender = (FT_Short)face->os2.usWinAscent; - root->descender = -(FT_Short)face->os2.usWinDescent; - - root->height = root->ascender - root->descender; - } - } - } - - root->max_advance_width = - (FT_Short)face->horizontal.advance_Width_Max; - root->max_advance_height = - (FT_Short)( face->vertical_info ? face->vertical.advance_Height_Max - : root->height ); - - /* See http://www.microsoft.com/OpenType/OTSpec/post.htm -- */ - /* Adjust underline position from top edge to centre of */ - /* stroke to convert TrueType meaning to FreeType meaning. */ - root->underline_position = face->postscript.underlinePosition - - face->postscript.underlineThickness / 2; - root->underline_thickness = face->postscript.underlineThickness; - } - - } - - Exit: - FT_TRACE2(( "sfnt_load_face: done\n" )); - - return error; - } - - -#undef LOAD_ -#undef LOADM_ -#undef GET_NAME - - - FT_LOCAL_DEF( void ) - sfnt_done_face( TT_Face face ) - { - FT_Memory memory; - SFNT_Service sfnt; - - - if ( !face ) - return; - - memory = face->root.memory; - sfnt = (SFNT_Service)face->sfnt; - - if ( sfnt ) - { - /* destroy the postscript names table if it is loaded */ - if ( sfnt->free_psnames ) - sfnt->free_psnames( face ); - - /* destroy the embedded bitmaps table if it is loaded */ - if ( sfnt->free_eblc ) - sfnt->free_eblc( face ); - } - -#ifdef TT_CONFIG_OPTION_BDF - /* freeing the embedded BDF properties */ - tt_face_free_bdf_props( face ); -#endif - - /* freeing the kerning table */ - tt_face_done_kern( face ); - - /* freeing the collection table */ - FT_FREE( face->ttc_header.offsets ); - face->ttc_header.count = 0; - - /* freeing table directory */ - FT_FREE( face->dir_tables ); - face->num_tables = 0; - - { - FT_Stream stream = FT_FACE_STREAM( face ); - - - /* simply release the 'cmap' table frame */ - FT_FRAME_RELEASE( face->cmap_table ); - face->cmap_size = 0; - } - - /* freeing the horizontal metrics */ - { - FT_Stream stream = FT_FACE_STREAM( face ); - - - FT_FRAME_RELEASE( face->horz_metrics ); - FT_FRAME_RELEASE( face->vert_metrics ); - face->horz_metrics_size = 0; - face->vert_metrics_size = 0; - } - - /* freeing the vertical ones, if any */ - if ( face->vertical_info ) - { - FT_FREE( face->vertical.long_metrics ); - FT_FREE( face->vertical.short_metrics ); - face->vertical_info = 0; - } - - /* freeing the gasp table */ - FT_FREE( face->gasp.gaspRanges ); - face->gasp.numRanges = 0; - - /* freeing the name table */ - if ( sfnt ) - sfnt->free_name( face ); - - /* freeing family and style name */ - FT_FREE( face->root.family_name ); - FT_FREE( face->root.style_name ); - - /* freeing sbit size table */ - FT_FREE( face->root.available_sizes ); - face->root.num_fixed_sizes = 0; - - FT_FREE( face->postscript_name ); - - face->sfnt = NULL; - } - - -/* END */ diff --git a/3party/freetype/src/sfnt/sfobjs.h b/3party/freetype/src/sfnt/sfobjs.h deleted file mode 100644 index 455f86772f..0000000000 --- a/3party/freetype/src/sfnt/sfobjs.h +++ /dev/null @@ -1,59 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfobjs.h */ -/* */ -/* SFNT object management (specification). */ -/* */ -/* Copyright 1996-2015 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 __SFOBJS_H__ -#define __SFOBJS_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_OBJECTS_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - sfnt_init_face( FT_Stream stream, - TT_Face face, - FT_Int face_instance_index, - FT_Int num_params, - FT_Parameter* params ); - - FT_LOCAL( FT_Error ) - sfnt_load_face( FT_Stream stream, - TT_Face face, - FT_Int face_instance_index, - FT_Int num_params, - FT_Parameter* params ); - - FT_LOCAL( void ) - sfnt_done_face( TT_Face face ); - - FT_LOCAL( FT_Error ) - tt_face_get_name( TT_Face face, - FT_UShort nameid, - FT_String** name ); - - -FT_END_HEADER - -#endif /* __SFDRIVER_H__ */ - - -/* END */ diff --git a/3party/freetype/src/sfnt/ttbdf.c b/3party/freetype/src/sfnt/ttbdf.c deleted file mode 100644 index 098b781a14..0000000000 --- a/3party/freetype/src/sfnt/ttbdf.c +++ /dev/null @@ -1,250 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttbdf.c */ -/* */ -/* TrueType and OpenType embedded BDF properties (body). */ -/* */ -/* Copyright 2005-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include "ttbdf.h" - -#include "sferrors.h" - - -#ifdef TT_CONFIG_OPTION_BDF - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttbdf - - - FT_LOCAL_DEF( void ) - tt_face_free_bdf_props( TT_Face face ) - { - TT_BDF bdf = &face->bdf; - - - if ( bdf->loaded ) - { - FT_Stream stream = FT_FACE(face)->stream; - - - if ( bdf->table != NULL ) - FT_FRAME_RELEASE( bdf->table ); - - bdf->table_end = NULL; - bdf->strings = NULL; - bdf->strings_size = 0; - } - } - - - static FT_Error - tt_face_load_bdf_props( TT_Face face, - FT_Stream stream ) - { - TT_BDF bdf = &face->bdf; - FT_ULong length; - FT_Error error; - - - FT_ZERO( bdf ); - - error = tt_face_goto_table( face, TTAG_BDF, stream, &length ); - if ( error || - length < 8 || - FT_FRAME_EXTRACT( length, bdf->table ) ) - { - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - bdf->table_end = bdf->table + length; - - { - FT_Byte* p = bdf->table; - FT_UInt version = FT_NEXT_USHORT( p ); - FT_UInt num_strikes = FT_NEXT_USHORT( p ); - FT_ULong strings = FT_NEXT_ULONG ( p ); - FT_UInt count; - FT_Byte* strike; - - - if ( version != 0x0001 || - strings < 8 || - ( strings - 8 ) / 4 < num_strikes || - strings + 1 > length ) - { - goto BadTable; - } - - bdf->num_strikes = num_strikes; - bdf->strings = bdf->table + strings; - bdf->strings_size = length - strings; - - count = bdf->num_strikes; - p = bdf->table + 8; - strike = p + count * 4; - - - for ( ; count > 0; count-- ) - { - FT_UInt num_items = FT_PEEK_USHORT( p + 2 ); - - /* - * We don't need to check the value sets themselves, since this - * is done later. - */ - strike += 10 * num_items; - - p += 4; - } - - if ( strike > bdf->strings ) - goto BadTable; - } - - bdf->loaded = 1; - - Exit: - return error; - - BadTable: - FT_FRAME_RELEASE( bdf->table ); - FT_ZERO( bdf ); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - - FT_LOCAL_DEF( FT_Error ) - tt_face_find_bdf_prop( TT_Face face, - const char* property_name, - BDF_PropertyRec *aprop ) - { - TT_BDF bdf = &face->bdf; - FT_Size size = FT_FACE(face)->size; - FT_Error error = FT_Err_Ok; - FT_Byte* p; - FT_UInt count; - FT_Byte* strike; - FT_Offset property_len; - - - aprop->type = BDF_PROPERTY_TYPE_NONE; - - if ( bdf->loaded == 0 ) - { - error = tt_face_load_bdf_props( face, FT_FACE( face )->stream ); - if ( error ) - goto Exit; - } - - count = bdf->num_strikes; - p = bdf->table + 8; - strike = p + 4 * count; - - error = FT_ERR( Invalid_Argument ); - - if ( size == NULL || property_name == NULL ) - goto Exit; - - property_len = ft_strlen( property_name ); - if ( property_len == 0 ) - goto Exit; - - for ( ; count > 0; count-- ) - { - FT_UInt _ppem = FT_NEXT_USHORT( p ); - FT_UInt _count = FT_NEXT_USHORT( p ); - - if ( _ppem == size->metrics.y_ppem ) - { - count = _count; - goto FoundStrike; - } - - strike += 10 * _count; - } - goto Exit; - - FoundStrike: - p = strike; - for ( ; count > 0; count-- ) - { - FT_UInt type = FT_PEEK_USHORT( p + 4 ); - - if ( ( type & 0x10 ) != 0 ) - { - FT_UInt32 name_offset = FT_PEEK_ULONG( p ); - FT_UInt32 value = FT_PEEK_ULONG( p + 6 ); - - /* be a bit paranoid for invalid entries here */ - if ( name_offset < bdf->strings_size && - property_len < bdf->strings_size - name_offset && - ft_strncmp( property_name, - (const char*)bdf->strings + name_offset, - bdf->strings_size - name_offset ) == 0 ) - { - switch ( type & 0x0F ) - { - case 0x00: /* string */ - case 0x01: /* atoms */ - /* check that the content is really 0-terminated */ - if ( value < bdf->strings_size && - ft_memchr( bdf->strings + value, 0, bdf->strings_size ) ) - { - aprop->type = BDF_PROPERTY_TYPE_ATOM; - aprop->u.atom = (const char*)bdf->strings + value; - error = FT_Err_Ok; - goto Exit; - } - break; - - case 0x02: - aprop->type = BDF_PROPERTY_TYPE_INTEGER; - aprop->u.integer = (FT_Int32)value; - error = FT_Err_Ok; - goto Exit; - - case 0x03: - aprop->type = BDF_PROPERTY_TYPE_CARDINAL; - aprop->u.cardinal = value; - error = FT_Err_Ok; - goto Exit; - - default: - ; - } - } - } - p += 10; - } - - Exit: - return error; - } - -#endif /* TT_CONFIG_OPTION_BDF */ - - -/* END */ diff --git a/3party/freetype/src/sfnt/ttbdf.h b/3party/freetype/src/sfnt/ttbdf.h deleted file mode 100644 index fe4ba489e8..0000000000 --- a/3party/freetype/src/sfnt/ttbdf.h +++ /dev/null @@ -1,46 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttbdf.h */ -/* */ -/* TrueType and OpenType embedded BDF properties (specification). */ -/* */ -/* Copyright 2005-2015 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 __TTBDF_H__ -#define __TTBDF_H__ - - -#include <ft2build.h> -#include "ttload.h" -#include FT_BDF_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( void ) - tt_face_free_bdf_props( TT_Face face ); - - - FT_LOCAL( FT_Error ) - tt_face_find_bdf_prop( TT_Face face, - const char* property_name, - BDF_PropertyRec *aprop ); - - -FT_END_HEADER - -#endif /* __TTBDF_H__ */ - - -/* END */ diff --git a/3party/freetype/src/sfnt/ttcmap.c b/3party/freetype/src/sfnt/ttcmap.c deleted file mode 100644 index 815ee7c4e2..0000000000 --- a/3party/freetype/src/sfnt/ttcmap.c +++ /dev/null @@ -1,3595 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttcmap.c */ -/* */ -/* TrueType character mapping table (cmap) support (body). */ -/* */ -/* Copyright 2002-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H - -#include "sferrors.h" /* must come before FT_INTERNAL_VALIDATE_H */ - -#include FT_INTERNAL_VALIDATE_H -#include FT_INTERNAL_STREAM_H -#include "ttload.h" -#include "ttcmap.h" -#include "sfntpic.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttcmap - - -#define TT_PEEK_SHORT FT_PEEK_SHORT -#define TT_PEEK_USHORT FT_PEEK_USHORT -#define TT_PEEK_UINT24 FT_PEEK_UOFF3 -#define TT_PEEK_LONG FT_PEEK_LONG -#define TT_PEEK_ULONG FT_PEEK_ULONG - -#define TT_NEXT_SHORT FT_NEXT_SHORT -#define TT_NEXT_USHORT FT_NEXT_USHORT -#define TT_NEXT_UINT24 FT_NEXT_UOFF3 -#define TT_NEXT_LONG FT_NEXT_LONG -#define TT_NEXT_ULONG FT_NEXT_ULONG - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap_init( TT_CMap cmap, - FT_Byte* table ) - { - cmap->data = table; - return FT_Err_Ok; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 0 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 0 */ - /* length 2 USHORT table length in bytes */ - /* language 4 USHORT Mac language code */ - /* glyph_ids 6 BYTE[256] array of glyph indices */ - /* 262 */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_0 - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap0_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p; - FT_UInt length; - - - if ( table + 2 + 2 > valid->limit ) - FT_INVALID_TOO_SHORT; - - p = table + 2; /* skip format */ - length = TT_NEXT_USHORT( p ); - - if ( table + length > valid->limit || length < 262 ) - FT_INVALID_TOO_SHORT; - - /* check glyph indices whenever necessary */ - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - FT_UInt n, idx; - - - p = table + 6; - for ( n = 0; n < 256; n++ ) - { - idx = *p++; - if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - } - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap0_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - FT_Byte* table = cmap->data; - - - return char_code < 256 ? table[6 + char_code] : 0; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap0_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_Byte* table = cmap->data; - FT_UInt32 charcode = *pchar_code; - FT_UInt32 result = 0; - FT_UInt gindex = 0; - - - table += 6; /* go to glyph IDs */ - while ( ++charcode < 256 ) - { - gindex = table[charcode]; - if ( gindex != 0 ) - { - result = charcode; - break; - } - } - - *pchar_code = result; - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap0_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 4; - - - cmap_info->format = 0; - cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); - - return FT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP( - tt_cmap0_class_rec, - sizeof ( TT_CMapRec ), - - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap0_char_index, - (FT_CMap_CharNextFunc) tt_cmap0_char_next, - - NULL, - NULL, - NULL, - NULL, - NULL, - - 0, - (TT_CMap_ValidateFunc)tt_cmap0_validate, - (TT_CMap_Info_GetFunc)tt_cmap0_get_info ) - -#endif /* TT_CONFIG_CMAP_FORMAT_0 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 2 *****/ - /***** *****/ - /***** This is used for certain CJK encodings that encode text in a *****/ - /***** mixed 8/16 bits encoding along the following lines: *****/ - /***** *****/ - /***** * Certain byte values correspond to an 8-bit character code *****/ - /***** (typically in the range 0..127 for ASCII compatibility). *****/ - /***** *****/ - /***** * Certain byte values signal the first byte of a 2-byte *****/ - /***** character code (but these values are also valid as the *****/ - /***** second byte of a 2-byte character). *****/ - /***** *****/ - /***** The following charmap lookup and iteration functions all *****/ - /***** assume that the value "charcode" correspond to following: *****/ - /***** *****/ - /***** - For one byte characters, "charcode" is simply the *****/ - /***** character code. *****/ - /***** *****/ - /***** - For two byte characters, "charcode" is the 2-byte *****/ - /***** character code in big endian format. More exactly: *****/ - /***** *****/ - /***** (charcode >> 8) is the first byte value *****/ - /***** (charcode & 0xFF) is the second byte value *****/ - /***** *****/ - /***** Note that not all values of "charcode" are valid according *****/ - /***** to these rules, and the function moderately check the *****/ - /***** arguments. *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 2 */ - /* length 2 USHORT table length in bytes */ - /* language 4 USHORT Mac language code */ - /* keys 6 USHORT[256] sub-header keys */ - /* subs 518 SUBHEAD[NSUBS] sub-headers array */ - /* glyph_ids 518+NSUB*8 USHORT[] glyph ID array */ - /* */ - /* The `keys' table is used to map charcode high-bytes to sub-headers. */ - /* The value of `NSUBS' is the number of sub-headers defined in the */ - /* table and is computed by finding the maximum of the `keys' table. */ - /* */ - /* Note that for any n, `keys[n]' is a byte offset within the `subs' */ - /* table, i.e., it is the corresponding sub-header index multiplied */ - /* by 8. */ - /* */ - /* Each sub-header has the following format: */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* first 0 USHORT first valid low-byte */ - /* count 2 USHORT number of valid low-bytes */ - /* delta 4 SHORT see below */ - /* offset 6 USHORT see below */ - /* */ - /* A sub-header defines, for each high-byte, the range of valid */ - /* low-bytes within the charmap. Note that the range defined by `first' */ - /* and `count' must be completely included in the interval [0..255] */ - /* according to the specification. */ - /* */ - /* If a character code is contained within a given sub-header, then */ - /* mapping it to a glyph index is done as follows: */ - /* */ - /* * The value of `offset' is read. This is a _byte_ distance from the */ - /* location of the `offset' field itself into a slice of the */ - /* `glyph_ids' table. Let's call it `slice' (it is a USHORT[] too). */ - /* */ - /* * The value `slice[char.lo - first]' is read. If it is 0, there is */ - /* no glyph for the charcode. Otherwise, the value of `delta' is */ - /* added to it (modulo 65536) to form a new glyph index. */ - /* */ - /* It is up to the validation routine to check that all offsets fall */ - /* within the glyph IDs table (and not within the `subs' table itself or */ - /* outside of the CMap). */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_2 - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap2_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p; - FT_UInt length; - - FT_UInt n, max_subs; - FT_Byte* keys; /* keys table */ - FT_Byte* subs; /* sub-headers */ - FT_Byte* glyph_ids; /* glyph ID array */ - - - if ( table + 2 + 2 > valid->limit ) - FT_INVALID_TOO_SHORT; - - p = table + 2; /* skip format */ - length = TT_NEXT_USHORT( p ); - - if ( table + length > valid->limit || length < 6 + 512 ) - FT_INVALID_TOO_SHORT; - - keys = table + 6; - - /* parse keys to compute sub-headers count */ - p = keys; - max_subs = 0; - for ( n = 0; n < 256; n++ ) - { - FT_UInt idx = TT_NEXT_USHORT( p ); - - - /* value must be multiple of 8 */ - if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 ) - FT_INVALID_DATA; - - idx >>= 3; - - if ( idx > max_subs ) - max_subs = idx; - } - - FT_ASSERT( p == table + 518 ); - - subs = p; - glyph_ids = subs + (max_subs + 1) * 8; - if ( glyph_ids > valid->limit ) - FT_INVALID_TOO_SHORT; - - /* parse sub-headers */ - for ( n = 0; n <= max_subs; n++ ) - { - FT_UInt first_code, code_count, offset; - FT_Int delta; - - - first_code = TT_NEXT_USHORT( p ); - code_count = TT_NEXT_USHORT( p ); - delta = TT_NEXT_SHORT( p ); - offset = TT_NEXT_USHORT( p ); - - /* many Dynalab fonts have empty sub-headers */ - if ( code_count == 0 ) - continue; - - /* check range within 0..255 */ - if ( valid->level >= FT_VALIDATE_PARANOID ) - { - if ( first_code >= 256 || first_code + code_count > 256 ) - FT_INVALID_DATA; - } - - /* check offset */ - if ( offset != 0 ) - { - FT_Byte* ids; - - - ids = p - 2 + offset; - if ( ids < glyph_ids || ids + code_count * 2 > table + length ) - FT_INVALID_OFFSET; - - /* check glyph IDs */ - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - FT_Byte* limit = p + code_count * 2; - FT_UInt idx; - - - for ( ; p < limit; ) - { - idx = TT_NEXT_USHORT( p ); - if ( idx != 0 ) - { - idx = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU; - if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - } - } - } - } - - return FT_Err_Ok; - } - - - /* return sub header corresponding to a given character code */ - /* NULL on invalid charcode */ - static FT_Byte* - tt_cmap2_get_subheader( FT_Byte* table, - FT_UInt32 char_code ) - { - FT_Byte* result = NULL; - - - if ( char_code < 0x10000UL ) - { - FT_UInt char_lo = (FT_UInt)( char_code & 0xFF ); - FT_UInt char_hi = (FT_UInt)( char_code >> 8 ); - FT_Byte* p = table + 6; /* keys table */ - FT_Byte* subs = table + 518; /* subheaders table */ - FT_Byte* sub; - - - if ( char_hi == 0 ) - { - /* an 8-bit character code -- we use subHeader 0 in this case */ - /* to test whether the character code is in the charmap */ - /* */ - sub = subs; /* jump to first sub-header */ - - /* check that the sub-header for this byte is 0, which */ - /* indicates that it is really a valid one-byte value */ - /* Otherwise, return 0 */ - /* */ - p += char_lo * 2; - if ( TT_PEEK_USHORT( p ) != 0 ) - goto Exit; - } - else - { - /* a 16-bit character code */ - - /* jump to key entry */ - p += char_hi * 2; - /* jump to sub-header */ - sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) ); - - /* check that the high byte isn't a valid one-byte value */ - if ( sub == subs ) - goto Exit; - } - result = sub; - } - Exit: - return result; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap2_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - FT_Byte* table = cmap->data; - FT_UInt result = 0; - FT_Byte* subheader; - - - subheader = tt_cmap2_get_subheader( table, char_code ); - if ( subheader ) - { - FT_Byte* p = subheader; - FT_UInt idx = (FT_UInt)(char_code & 0xFF); - FT_UInt start, count; - FT_Int delta; - FT_UInt offset; - - - start = TT_NEXT_USHORT( p ); - count = TT_NEXT_USHORT( p ); - delta = TT_NEXT_SHORT ( p ); - offset = TT_PEEK_USHORT( p ); - - idx -= start; - if ( idx < count && offset != 0 ) - { - p += offset + 2 * idx; - idx = TT_PEEK_USHORT( p ); - - if ( idx != 0 ) - result = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU; - } - } - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap2_char_next( TT_CMap cmap, - FT_UInt32 *pcharcode ) - { - FT_Byte* table = cmap->data; - FT_UInt gindex = 0; - FT_UInt32 result = 0; - FT_UInt32 charcode = *pcharcode + 1; - FT_Byte* subheader; - - - while ( charcode < 0x10000UL ) - { - subheader = tt_cmap2_get_subheader( table, charcode ); - if ( subheader ) - { - FT_Byte* p = subheader; - FT_UInt start = TT_NEXT_USHORT( p ); - FT_UInt count = TT_NEXT_USHORT( p ); - FT_Int delta = TT_NEXT_SHORT ( p ); - FT_UInt offset = TT_PEEK_USHORT( p ); - FT_UInt char_lo = (FT_UInt)( charcode & 0xFF ); - FT_UInt pos, idx; - - - if ( offset == 0 ) - goto Next_SubHeader; - - if ( char_lo < start ) - { - char_lo = start; - pos = 0; - } - else - pos = (FT_UInt)( char_lo - start ); - - p += offset + pos * 2; - charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo; - - for ( ; pos < count; pos++, charcode++ ) - { - idx = TT_NEXT_USHORT( p ); - - if ( idx != 0 ) - { - gindex = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU; - if ( gindex != 0 ) - { - result = charcode; - goto Exit; - } - } - } - } - - /* jump to next sub-header, i.e. higher byte value */ - Next_SubHeader: - charcode = FT_PAD_FLOOR( charcode, 256 ) + 256; - } - - Exit: - *pcharcode = result; - - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap2_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 4; - - - cmap_info->format = 2; - cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); - - return FT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP( - tt_cmap2_class_rec, - sizeof ( TT_CMapRec ), - - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap2_char_index, - (FT_CMap_CharNextFunc) tt_cmap2_char_next, - - NULL, - NULL, - NULL, - NULL, - NULL, - - 2, - (TT_CMap_ValidateFunc)tt_cmap2_validate, - (TT_CMap_Info_GetFunc)tt_cmap2_get_info ) - -#endif /* TT_CONFIG_CMAP_FORMAT_2 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 4 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 4 */ - /* length 2 USHORT table length */ - /* in bytes */ - /* language 4 USHORT Mac language code */ - /* */ - /* segCountX2 6 USHORT 2*NUM_SEGS */ - /* searchRange 8 USHORT 2*(1 << LOG_SEGS) */ - /* entrySelector 10 USHORT LOG_SEGS */ - /* rangeShift 12 USHORT segCountX2 - */ - /* searchRange */ - /* */ - /* endCount 14 USHORT[NUM_SEGS] end charcode for */ - /* each segment; last */ - /* is 0xFFFF */ - /* */ - /* pad 14+NUM_SEGS*2 USHORT padding */ - /* */ - /* startCount 16+NUM_SEGS*2 USHORT[NUM_SEGS] first charcode for */ - /* each segment */ - /* */ - /* idDelta 16+NUM_SEGS*4 SHORT[NUM_SEGS] delta for each */ - /* segment */ - /* idOffset 16+NUM_SEGS*6 SHORT[NUM_SEGS] range offset for */ - /* each segment; can be */ - /* zero */ - /* */ - /* glyphIds 16+NUM_SEGS*8 USHORT[] array of glyph ID */ - /* ranges */ - /* */ - /* Character codes are modelled by a series of ordered (increasing) */ - /* intervals called segments. Each segment has start and end codes, */ - /* provided by the `startCount' and `endCount' arrays. Segments must */ - /* not overlap, and the last segment should always contain the value */ - /* 0xFFFF for `endCount'. */ - /* */ - /* The fields `searchRange', `entrySelector' and `rangeShift' are better */ - /* ignored (they are traces of over-engineering in the TrueType */ - /* specification). */ - /* */ - /* Each segment also has a signed `delta', as well as an optional offset */ - /* within the `glyphIds' table. */ - /* */ - /* If a segment's idOffset is 0, the glyph index corresponding to any */ - /* charcode within the segment is obtained by adding the value of */ - /* `idDelta' directly to the charcode, modulo 65536. */ - /* */ - /* Otherwise, a glyph index is taken from the glyph IDs sub-array for */ - /* the segment, and the value of `idDelta' is added to it. */ - /* */ - /* */ - /* Finally, note that a lot of fonts contain an invalid last segment, */ - /* where `start' and `end' are correctly set to 0xFFFF but both `delta' */ - /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with */ - /* OpenOffice.org). We need special code to deal with them correctly. */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_4 - - typedef struct TT_CMap4Rec_ - { - TT_CMapRec cmap; - FT_UInt32 cur_charcode; /* current charcode */ - FT_UInt cur_gindex; /* current glyph index */ - - FT_UInt num_ranges; - FT_UInt cur_range; - FT_UInt cur_start; - FT_UInt cur_end; - FT_Int cur_delta; - FT_Byte* cur_values; - - } TT_CMap4Rec, *TT_CMap4; - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap4_init( TT_CMap4 cmap, - FT_Byte* table ) - { - FT_Byte* p; - - - cmap->cmap.data = table; - - p = table + 6; - cmap->num_ranges = FT_PEEK_USHORT( p ) >> 1; - cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; - cmap->cur_gindex = 0; - - return FT_Err_Ok; - } - - - static FT_Int - tt_cmap4_set_range( TT_CMap4 cmap, - FT_UInt range_index ) - { - FT_Byte* table = cmap->cmap.data; - FT_Byte* p; - FT_UInt num_ranges = cmap->num_ranges; - - - while ( range_index < num_ranges ) - { - FT_UInt offset; - - - p = table + 14 + range_index * 2; - cmap->cur_end = FT_PEEK_USHORT( p ); - - p += 2 + num_ranges * 2; - cmap->cur_start = FT_PEEK_USHORT( p ); - - p += num_ranges * 2; - cmap->cur_delta = FT_PEEK_SHORT( p ); - - p += num_ranges * 2; - offset = FT_PEEK_USHORT( p ); - - /* some fonts have an incorrect last segment; */ - /* we have to catch it */ - if ( range_index >= num_ranges - 1 && - cmap->cur_start == 0xFFFFU && - cmap->cur_end == 0xFFFFU ) - { - TT_Face face = (TT_Face)cmap->cmap.cmap.charmap.face; - FT_Byte* limit = face->cmap_table + face->cmap_size; - - - if ( offset && p + offset + 2 > limit ) - { - cmap->cur_delta = 1; - offset = 0; - } - } - - if ( offset != 0xFFFFU ) - { - cmap->cur_values = offset ? p + offset : NULL; - cmap->cur_range = range_index; - return 0; - } - - /* we skip empty segments */ - range_index++; - } - - return -1; - } - - - /* search the index of the charcode next to cmap->cur_charcode; */ - /* caller should call tt_cmap4_set_range with proper range */ - /* before calling this function */ - /* */ - static void - tt_cmap4_next( TT_CMap4 cmap ) - { - FT_UInt charcode; - - - if ( cmap->cur_charcode >= 0xFFFFUL ) - goto Fail; - - charcode = (FT_UInt)cmap->cur_charcode + 1; - - if ( charcode < cmap->cur_start ) - charcode = cmap->cur_start; - - for ( ;; ) - { - FT_Byte* values = cmap->cur_values; - FT_UInt end = cmap->cur_end; - FT_Int delta = cmap->cur_delta; - - - if ( charcode <= end ) - { - if ( values ) - { - FT_Byte* p = values + 2 * ( charcode - cmap->cur_start ); - - - do - { - FT_UInt gindex = FT_NEXT_USHORT( p ); - - - if ( gindex != 0 ) - { - gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU; - if ( gindex != 0 ) - { - cmap->cur_charcode = charcode; - cmap->cur_gindex = gindex; - return; - } - } - } while ( ++charcode <= end ); - } - else - { - do - { - FT_UInt gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU; - - - if ( gindex != 0 ) - { - cmap->cur_charcode = charcode; - cmap->cur_gindex = gindex; - return; - } - } while ( ++charcode <= end ); - } - } - - /* we need to find another range */ - if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 ) - break; - - if ( charcode < cmap->cur_start ) - charcode = cmap->cur_start; - } - - Fail: - cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; - cmap->cur_gindex = 0; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap4_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p; - FT_UInt length; - - FT_Byte *ends, *starts, *offsets, *deltas, *glyph_ids; - FT_UInt num_segs; - FT_Error error = FT_Err_Ok; - - - if ( table + 2 + 2 > valid->limit ) - FT_INVALID_TOO_SHORT; - - p = table + 2; /* skip format */ - length = TT_NEXT_USHORT( p ); - - /* in certain fonts, the `length' field is invalid and goes */ - /* out of bound. We try to correct this here... */ - if ( table + length > valid->limit ) - { - if ( valid->level >= FT_VALIDATE_TIGHT ) - FT_INVALID_TOO_SHORT; - - length = (FT_UInt)( valid->limit - table ); - } - - if ( length < 16 ) - FT_INVALID_TOO_SHORT; - - p = table + 6; - num_segs = TT_NEXT_USHORT( p ); /* read segCountX2 */ - - if ( valid->level >= FT_VALIDATE_PARANOID ) - { - /* check that we have an even value here */ - if ( num_segs & 1 ) - FT_INVALID_DATA; - } - - num_segs /= 2; - - if ( length < 16 + num_segs * 2 * 4 ) - FT_INVALID_TOO_SHORT; - - /* check the search parameters - even though we never use them */ - /* */ - if ( valid->level >= FT_VALIDATE_PARANOID ) - { - /* check the values of `searchRange', `entrySelector', `rangeShift' */ - FT_UInt search_range = TT_NEXT_USHORT( p ); - FT_UInt entry_selector = TT_NEXT_USHORT( p ); - FT_UInt range_shift = TT_NEXT_USHORT( p ); - - - if ( ( search_range | range_shift ) & 1 ) /* must be even values */ - FT_INVALID_DATA; - - search_range /= 2; - range_shift /= 2; - - /* `search range' is the greatest power of 2 that is <= num_segs */ - - if ( search_range > num_segs || - search_range * 2 < num_segs || - search_range + range_shift != num_segs || - search_range != ( 1U << entry_selector ) ) - FT_INVALID_DATA; - } - - ends = table + 14; - starts = table + 16 + num_segs * 2; - deltas = starts + num_segs * 2; - offsets = deltas + num_segs * 2; - glyph_ids = offsets + num_segs * 2; - - /* check last segment; its end count value must be 0xFFFF */ - if ( valid->level >= FT_VALIDATE_PARANOID ) - { - p = ends + ( num_segs - 1 ) * 2; - if ( TT_PEEK_USHORT( p ) != 0xFFFFU ) - FT_INVALID_DATA; - } - - { - FT_UInt start, end, offset, n; - FT_UInt last_start = 0, last_end = 0; - FT_Int delta; - FT_Byte* p_start = starts; - FT_Byte* p_end = ends; - FT_Byte* p_delta = deltas; - FT_Byte* p_offset = offsets; - - - for ( n = 0; n < num_segs; n++ ) - { - p = p_offset; - start = TT_NEXT_USHORT( p_start ); - end = TT_NEXT_USHORT( p_end ); - delta = TT_NEXT_SHORT( p_delta ); - offset = TT_NEXT_USHORT( p_offset ); - - if ( start > end ) - FT_INVALID_DATA; - - /* this test should be performed at default validation level; */ - /* unfortunately, some popular Asian fonts have overlapping */ - /* ranges in their charmaps */ - /* */ - if ( start <= last_end && n > 0 ) - { - if ( valid->level >= FT_VALIDATE_TIGHT ) - FT_INVALID_DATA; - else - { - /* allow overlapping segments, provided their start points */ - /* and end points, respectively, are in ascending order */ - /* */ - if ( last_start > start || last_end > end ) - error |= TT_CMAP_FLAG_UNSORTED; - else - error |= TT_CMAP_FLAG_OVERLAPPING; - } - } - - if ( offset && offset != 0xFFFFU ) - { - p += offset; /* start of glyph ID array */ - - /* check that we point within the glyph IDs table only */ - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - if ( p < glyph_ids || - p + ( end - start + 1 ) * 2 > table + length ) - FT_INVALID_DATA; - } - /* Some fonts handle the last segment incorrectly. In */ - /* theory, 0xFFFF might point to an ordinary glyph -- */ - /* a cmap 4 is versatile and could be used for any */ - /* encoding, not only Unicode. However, reality shows */ - /* that far too many fonts are sloppy and incorrectly */ - /* set all fields but `start' and `end' for the last */ - /* segment if it contains only a single character. */ - /* */ - /* We thus omit the test here, delaying it to the */ - /* routines which actually access the cmap. */ - else if ( n != num_segs - 1 || - !( start == 0xFFFFU && end == 0xFFFFU ) ) - { - if ( p < glyph_ids || - p + ( end - start + 1 ) * 2 > valid->limit ) - FT_INVALID_DATA; - } - - /* check glyph indices within the segment range */ - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - FT_UInt i, idx; - - - for ( i = start; i < end; i++ ) - { - idx = FT_NEXT_USHORT( p ); - if ( idx != 0 ) - { - idx = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU; - - if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - } - } - } - else if ( offset == 0xFFFFU ) - { - /* some fonts (erroneously?) use a range offset of 0xFFFF */ - /* to mean missing glyph in cmap table */ - /* */ - if ( valid->level >= FT_VALIDATE_PARANOID || - n != num_segs - 1 || - !( start == 0xFFFFU && end == 0xFFFFU ) ) - FT_INVALID_DATA; - } - - last_start = start; - last_end = end; - } - } - - return error; - } - - - static FT_UInt - tt_cmap4_char_map_linear( TT_CMap cmap, - FT_UInt32* pcharcode, - FT_Bool next ) - { - FT_UInt num_segs2, start, end, offset; - FT_Int delta; - FT_UInt i, num_segs; - FT_UInt32 charcode = *pcharcode; - FT_UInt gindex = 0; - FT_Byte* p; - - - p = cmap->data + 6; - num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); - - num_segs = num_segs2 >> 1; - - if ( !num_segs ) - return 0; - - if ( next ) - charcode++; - - /* linear search */ - for ( ; charcode <= 0xFFFFU; charcode++ ) - { - FT_Byte* q; - - - p = cmap->data + 14; /* ends table */ - q = cmap->data + 16 + num_segs2; /* starts table */ - - for ( i = 0; i < num_segs; i++ ) - { - end = TT_NEXT_USHORT( p ); - start = TT_NEXT_USHORT( q ); - - if ( charcode >= start && charcode <= end ) - { - p = q - 2 + num_segs2; - delta = TT_PEEK_SHORT( p ); - p += num_segs2; - offset = TT_PEEK_USHORT( p ); - - /* some fonts have an incorrect last segment; */ - /* we have to catch it */ - if ( i >= num_segs - 1 && - start == 0xFFFFU && end == 0xFFFFU ) - { - TT_Face face = (TT_Face)cmap->cmap.charmap.face; - FT_Byte* limit = face->cmap_table + face->cmap_size; - - - if ( offset && p + offset + 2 > limit ) - { - delta = 1; - offset = 0; - } - } - - if ( offset == 0xFFFFU ) - continue; - - if ( offset ) - { - p += offset + ( charcode - start ) * 2; - gindex = TT_PEEK_USHORT( p ); - if ( gindex != 0 ) - gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU; - } - else - gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU; - - break; - } - } - - if ( !next || gindex ) - break; - } - - if ( next && gindex ) - *pcharcode = charcode; - - return gindex; - } - - - static FT_UInt - tt_cmap4_char_map_binary( TT_CMap cmap, - FT_UInt32* pcharcode, - FT_Bool next ) - { - FT_UInt num_segs2, start, end, offset; - FT_Int delta; - FT_UInt max, min, mid, num_segs; - FT_UInt charcode = (FT_UInt)*pcharcode; - FT_UInt gindex = 0; - FT_Byte* p; - - - p = cmap->data + 6; - num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); - - if ( !num_segs2 ) - return 0; - - num_segs = num_segs2 >> 1; - - /* make compiler happy */ - mid = num_segs; - end = 0xFFFFU; - - if ( next ) - charcode++; - - min = 0; - max = num_segs; - - /* binary search */ - while ( min < max ) - { - mid = ( min + max ) >> 1; - p = cmap->data + 14 + mid * 2; - end = TT_PEEK_USHORT( p ); - p += 2 + num_segs2; - start = TT_PEEK_USHORT( p ); - - if ( charcode < start ) - max = mid; - else if ( charcode > end ) - min = mid + 1; - else - { - p += num_segs2; - delta = TT_PEEK_SHORT( p ); - p += num_segs2; - offset = TT_PEEK_USHORT( p ); - - /* some fonts have an incorrect last segment; */ - /* we have to catch it */ - if ( mid >= num_segs - 1 && - start == 0xFFFFU && end == 0xFFFFU ) - { - TT_Face face = (TT_Face)cmap->cmap.charmap.face; - FT_Byte* limit = face->cmap_table + face->cmap_size; - - - if ( offset && p + offset + 2 > limit ) - { - delta = 1; - offset = 0; - } - } - - /* search the first segment containing `charcode' */ - if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING ) - { - FT_UInt i; - - - /* call the current segment `max' */ - max = mid; - - if ( offset == 0xFFFFU ) - mid = max + 1; - - /* search in segments before the current segment */ - for ( i = max ; i > 0; i-- ) - { - FT_UInt prev_end; - FT_Byte* old_p; - - - old_p = p; - p = cmap->data + 14 + ( i - 1 ) * 2; - prev_end = TT_PEEK_USHORT( p ); - - if ( charcode > prev_end ) - { - p = old_p; - break; - } - - end = prev_end; - p += 2 + num_segs2; - start = TT_PEEK_USHORT( p ); - p += num_segs2; - delta = TT_PEEK_SHORT( p ); - p += num_segs2; - offset = TT_PEEK_USHORT( p ); - - if ( offset != 0xFFFFU ) - mid = i - 1; - } - - /* no luck */ - if ( mid == max + 1 ) - { - if ( i != max ) - { - p = cmap->data + 14 + max * 2; - end = TT_PEEK_USHORT( p ); - p += 2 + num_segs2; - start = TT_PEEK_USHORT( p ); - p += num_segs2; - delta = TT_PEEK_SHORT( p ); - p += num_segs2; - offset = TT_PEEK_USHORT( p ); - } - - mid = max; - - /* search in segments after the current segment */ - for ( i = max + 1; i < num_segs; i++ ) - { - FT_UInt next_end, next_start; - - - p = cmap->data + 14 + i * 2; - next_end = TT_PEEK_USHORT( p ); - p += 2 + num_segs2; - next_start = TT_PEEK_USHORT( p ); - - if ( charcode < next_start ) - break; - - end = next_end; - start = next_start; - p += num_segs2; - delta = TT_PEEK_SHORT( p ); - p += num_segs2; - offset = TT_PEEK_USHORT( p ); - - if ( offset != 0xFFFFU ) - mid = i; - } - i--; - - /* still no luck */ - if ( mid == max ) - { - mid = i; - - break; - } - } - - /* end, start, delta, and offset are for the i'th segment */ - if ( mid != i ) - { - p = cmap->data + 14 + mid * 2; - end = TT_PEEK_USHORT( p ); - p += 2 + num_segs2; - start = TT_PEEK_USHORT( p ); - p += num_segs2; - delta = TT_PEEK_SHORT( p ); - p += num_segs2; - offset = TT_PEEK_USHORT( p ); - } - } - else - { - if ( offset == 0xFFFFU ) - break; - } - - if ( offset ) - { - p += offset + ( charcode - start ) * 2; - gindex = TT_PEEK_USHORT( p ); - if ( gindex != 0 ) - gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU; - } - else - gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU; - - break; - } - } - - if ( next ) - { - TT_CMap4 cmap4 = (TT_CMap4)cmap; - - - /* if `charcode' is not in any segment, then `mid' is */ - /* the segment nearest to `charcode' */ - /* */ - - if ( charcode > end ) - { - mid++; - if ( mid == num_segs ) - return 0; - } - - if ( tt_cmap4_set_range( cmap4, mid ) ) - { - if ( gindex ) - *pcharcode = charcode; - } - else - { - cmap4->cur_charcode = charcode; - - if ( gindex ) - cmap4->cur_gindex = gindex; - else - { - cmap4->cur_charcode = charcode; - tt_cmap4_next( cmap4 ); - gindex = cmap4->cur_gindex; - } - - if ( gindex ) - *pcharcode = cmap4->cur_charcode; - } - } - - return gindex; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap4_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - if ( char_code >= 0x10000UL ) - return 0; - - if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) - return tt_cmap4_char_map_linear( cmap, &char_code, 0 ); - else - return tt_cmap4_char_map_binary( cmap, &char_code, 0 ); - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap4_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_UInt gindex; - - - if ( *pchar_code >= 0xFFFFU ) - return 0; - - if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) - gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 ); - else - { - TT_CMap4 cmap4 = (TT_CMap4)cmap; - - - /* no need to search */ - if ( *pchar_code == cmap4->cur_charcode ) - { - tt_cmap4_next( cmap4 ); - gindex = cmap4->cur_gindex; - if ( gindex ) - *pchar_code = cmap4->cur_charcode; - } - else - gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 ); - } - - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap4_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 4; - - - cmap_info->format = 4; - cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); - - return FT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP( - tt_cmap4_class_rec, - sizeof ( TT_CMap4Rec ), - (FT_CMap_InitFunc) tt_cmap4_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap4_char_index, - (FT_CMap_CharNextFunc) tt_cmap4_char_next, - - NULL, - NULL, - NULL, - NULL, - NULL, - - 4, - (TT_CMap_ValidateFunc)tt_cmap4_validate, - (TT_CMap_Info_GetFunc)tt_cmap4_get_info ) - -#endif /* TT_CONFIG_CMAP_FORMAT_4 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 6 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 4 */ - /* length 2 USHORT table length in bytes */ - /* language 4 USHORT Mac language code */ - /* */ - /* first 6 USHORT first segment code */ - /* count 8 USHORT segment size in chars */ - /* glyphIds 10 USHORT[count] glyph IDs */ - /* */ - /* A very simplified segment mapping. */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_6 - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap6_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p; - FT_UInt length, count; - - - if ( table + 10 > valid->limit ) - FT_INVALID_TOO_SHORT; - - p = table + 2; - length = TT_NEXT_USHORT( p ); - - p = table + 8; /* skip language and start index */ - count = TT_NEXT_USHORT( p ); - - if ( table + length > valid->limit || length < 10 + count * 2 ) - FT_INVALID_TOO_SHORT; - - /* check glyph indices */ - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - FT_UInt gindex; - - - for ( ; count > 0; count-- ) - { - gindex = TT_NEXT_USHORT( p ); - if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - } - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap6_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - FT_Byte* table = cmap->data; - FT_UInt result = 0; - FT_Byte* p = table + 6; - FT_UInt start = TT_NEXT_USHORT( p ); - FT_UInt count = TT_NEXT_USHORT( p ); - FT_UInt idx = (FT_UInt)( char_code - start ); - - - if ( idx < count ) - { - p += 2 * idx; - result = TT_PEEK_USHORT( p ); - } - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap6_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_Byte* table = cmap->data; - FT_UInt32 result = 0; - FT_UInt32 char_code = *pchar_code + 1; - FT_UInt gindex = 0; - - FT_Byte* p = table + 6; - FT_UInt start = TT_NEXT_USHORT( p ); - FT_UInt count = TT_NEXT_USHORT( p ); - FT_UInt idx; - - - if ( char_code >= 0x10000UL ) - goto Exit; - - if ( char_code < start ) - char_code = start; - - idx = (FT_UInt)( char_code - start ); - p += 2 * idx; - - for ( ; idx < count; idx++ ) - { - gindex = TT_NEXT_USHORT( p ); - if ( gindex != 0 ) - { - result = char_code; - break; - } - char_code++; - } - - Exit: - *pchar_code = result; - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap6_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 4; - - - cmap_info->format = 6; - cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); - - return FT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP( - tt_cmap6_class_rec, - sizeof ( TT_CMapRec ), - - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap6_char_index, - (FT_CMap_CharNextFunc) tt_cmap6_char_next, - - NULL, - NULL, - NULL, - NULL, - NULL, - - 6, - (TT_CMap_ValidateFunc)tt_cmap6_validate, - (TT_CMap_Info_GetFunc)tt_cmap6_get_info ) - -#endif /* TT_CONFIG_CMAP_FORMAT_6 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 8 *****/ - /***** *****/ - /***** It is hard to completely understand what the OpenType spec *****/ - /***** says about this format, but here is my conclusion. *****/ - /***** *****/ - /***** The purpose of this format is to easily map UTF-16 text to *****/ - /***** glyph indices. Basically, the `char_code' must be in one of *****/ - /***** the following formats: *****/ - /***** *****/ - /***** - A 16-bit value that isn't part of the Unicode Surrogates *****/ - /***** Area (i.e. U+D800-U+DFFF). *****/ - /***** *****/ - /***** - A 32-bit value, made of two surrogate values, i.e.. if *****/ - /***** `char_code = (char_hi << 16) | char_lo', then both *****/ - /***** `char_hi' and `char_lo' must be in the Surrogates Area. *****/ - /***** Area. *****/ - /***** *****/ - /***** The `is32' table embedded in the charmap indicates whether a *****/ - /***** given 16-bit value is in the surrogates area or not. *****/ - /***** *****/ - /***** So, for any given `char_code', we can assert the following: *****/ - /***** *****/ - /***** If `char_hi == 0' then we must have `is32[char_lo] == 0'. *****/ - /***** *****/ - /***** If `char_hi != 0' then we must have both *****/ - /***** `is32[char_hi] != 0' and `is32[char_lo] != 0'. *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 8 */ - /* reserved 2 USHORT reserved */ - /* length 4 ULONG length in bytes */ - /* language 8 ULONG Mac language code */ - /* is32 12 BYTE[8192] 32-bitness bitmap */ - /* count 8204 ULONG number of groups */ - /* */ - /* This header is followed by `count' groups of the following format: */ - /* */ - /* start 0 ULONG first charcode */ - /* end 4 ULONG last charcode */ - /* startId 8 ULONG start glyph ID for the group */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_8 - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap8_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p = table + 4; - FT_Byte* is32; - FT_UInt32 length; - FT_UInt32 num_groups; - - - if ( table + 16 + 8192 > valid->limit ) - FT_INVALID_TOO_SHORT; - - length = TT_NEXT_ULONG( p ); - if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 ) - FT_INVALID_TOO_SHORT; - - is32 = table + 12; - p = is32 + 8192; /* skip `is32' array */ - num_groups = TT_NEXT_ULONG( p ); - - /* p + num_groups * 12 > valid->limit ? */ - if ( num_groups > (FT_UInt32)( valid->limit - p ) / 12 ) - FT_INVALID_TOO_SHORT; - - /* check groups, they must be in increasing order */ - { - FT_UInt32 n, start, end, start_id, count, last = 0; - - - for ( n = 0; n < num_groups; n++ ) - { - FT_UInt hi, lo; - - - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - start_id = TT_NEXT_ULONG( p ); - - if ( start > end ) - FT_INVALID_DATA; - - if ( n > 0 && start <= last ) - FT_INVALID_DATA; - - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - FT_UInt32 d = end - start; - - - /* start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ? */ - if ( d > TT_VALID_GLYPH_COUNT( valid ) || - start_id >= TT_VALID_GLYPH_COUNT( valid ) - d ) - FT_INVALID_GLYPH_ID; - - count = (FT_UInt32)( end - start + 1 ); - - if ( start & ~0xFFFFU ) - { - /* start_hi != 0; check that is32[i] is 1 for each i in */ - /* the `hi' and `lo' of the range [start..end] */ - for ( ; count > 0; count--, start++ ) - { - hi = (FT_UInt)( start >> 16 ); - lo = (FT_UInt)( start & 0xFFFFU ); - - if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 ) - FT_INVALID_DATA; - - if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 ) - FT_INVALID_DATA; - } - } - else - { - /* start_hi == 0; check that is32[i] is 0 for each i in */ - /* the range [start..end] */ - - /* end_hi cannot be != 0! */ - if ( end & ~0xFFFFU ) - FT_INVALID_DATA; - - for ( ; count > 0; count--, start++ ) - { - lo = (FT_UInt)( start & 0xFFFFU ); - - if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 ) - FT_INVALID_DATA; - } - } - } - - last = end; - } - } - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap8_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - FT_Byte* table = cmap->data; - FT_UInt result = 0; - FT_Byte* p = table + 8204; - FT_UInt32 num_groups = TT_NEXT_ULONG( p ); - FT_UInt32 start, end, start_id; - - - for ( ; num_groups > 0; num_groups-- ) - { - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - start_id = TT_NEXT_ULONG( p ); - - if ( char_code < start ) - break; - - if ( char_code <= end ) - { - result = (FT_UInt)( start_id + char_code - start ); - break; - } - } - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap8_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_UInt32 result = 0; - FT_UInt32 char_code = *pchar_code + 1; - FT_UInt gindex = 0; - FT_Byte* table = cmap->data; - FT_Byte* p = table + 8204; - FT_UInt32 num_groups = TT_NEXT_ULONG( p ); - FT_UInt32 start, end, start_id; - - - p = table + 8208; - - for ( ; num_groups > 0; num_groups-- ) - { - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - start_id = TT_NEXT_ULONG( p ); - - if ( char_code < start ) - char_code = start; - - if ( char_code <= end ) - { - gindex = (FT_UInt)( char_code - start + start_id ); - if ( gindex != 0 ) - { - result = char_code; - goto Exit; - } - } - } - - Exit: - *pchar_code = result; - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap8_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 8; - - - cmap_info->format = 8; - cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); - - return FT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP( - tt_cmap8_class_rec, - sizeof ( TT_CMapRec ), - - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap8_char_index, - (FT_CMap_CharNextFunc) tt_cmap8_char_next, - - NULL, - NULL, - NULL, - NULL, - NULL, - - 8, - (TT_CMap_ValidateFunc)tt_cmap8_validate, - (TT_CMap_Info_GetFunc)tt_cmap8_get_info ) - -#endif /* TT_CONFIG_CMAP_FORMAT_8 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 10 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 10 */ - /* reserved 2 USHORT reserved */ - /* length 4 ULONG length in bytes */ - /* language 8 ULONG Mac language code */ - /* */ - /* start 12 ULONG first char in range */ - /* count 16 ULONG number of chars in range */ - /* glyphIds 20 USHORT[count] glyph indices covered */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_10 - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap10_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p = table + 4; - FT_ULong length, count; - - - if ( table + 20 > valid->limit ) - FT_INVALID_TOO_SHORT; - - length = TT_NEXT_ULONG( p ); - p = table + 16; - count = TT_NEXT_ULONG( p ); - - if ( length > (FT_ULong)( valid->limit - table ) || - /* length < 20 + count * 2 ? */ - length < 20 || - ( length - 20 ) / 2 < count ) - FT_INVALID_TOO_SHORT; - - /* check glyph indices */ - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - FT_UInt gindex; - - - for ( ; count > 0; count-- ) - { - gindex = TT_NEXT_USHORT( p ); - if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - } - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap10_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - FT_Byte* table = cmap->data; - FT_UInt result = 0; - FT_Byte* p = table + 12; - FT_UInt32 start = TT_NEXT_ULONG( p ); - FT_UInt32 count = TT_NEXT_ULONG( p ); - FT_UInt32 idx = (FT_ULong)( char_code - start ); - - - if ( idx < count ) - { - p += 2 * idx; - result = TT_PEEK_USHORT( p ); - } - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap10_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_Byte* table = cmap->data; - FT_UInt32 char_code = *pchar_code + 1; - FT_UInt gindex = 0; - FT_Byte* p = table + 12; - FT_UInt32 start = TT_NEXT_ULONG( p ); - FT_UInt32 count = TT_NEXT_ULONG( p ); - FT_UInt32 idx; - - - if ( char_code < start ) - char_code = start; - - idx = (FT_UInt32)( char_code - start ); - p += 2 * idx; - - for ( ; idx < count; idx++ ) - { - gindex = TT_NEXT_USHORT( p ); - if ( gindex != 0 ) - break; - char_code++; - } - - *pchar_code = char_code; - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap10_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 8; - - - cmap_info->format = 10; - cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); - - return FT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP( - tt_cmap10_class_rec, - sizeof ( TT_CMapRec ), - - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap10_char_index, - (FT_CMap_CharNextFunc) tt_cmap10_char_next, - - NULL, - NULL, - NULL, - NULL, - NULL, - - 10, - (TT_CMap_ValidateFunc)tt_cmap10_validate, - (TT_CMap_Info_GetFunc)tt_cmap10_get_info ) - -#endif /* TT_CONFIG_CMAP_FORMAT_10 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 12 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 12 */ - /* reserved 2 USHORT reserved */ - /* length 4 ULONG length in bytes */ - /* language 8 ULONG Mac language code */ - /* count 12 ULONG number of groups */ - /* 16 */ - /* */ - /* This header is followed by `count' groups of the following format: */ - /* */ - /* start 0 ULONG first charcode */ - /* end 4 ULONG last charcode */ - /* startId 8 ULONG start glyph ID for the group */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_12 - - typedef struct TT_CMap12Rec_ - { - TT_CMapRec cmap; - FT_Bool valid; - FT_ULong cur_charcode; - FT_UInt cur_gindex; - FT_ULong cur_group; - FT_ULong num_groups; - - } TT_CMap12Rec, *TT_CMap12; - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap12_init( TT_CMap12 cmap, - FT_Byte* table ) - { - cmap->cmap.data = table; - - table += 12; - cmap->num_groups = FT_PEEK_ULONG( table ); - - cmap->valid = 0; - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap12_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p; - FT_ULong length; - FT_ULong num_groups; - - - if ( table + 16 > valid->limit ) - FT_INVALID_TOO_SHORT; - - p = table + 4; - length = TT_NEXT_ULONG( p ); - - p = table + 12; - num_groups = TT_NEXT_ULONG( p ); - - if ( length > (FT_ULong)( valid->limit - table ) || - /* length < 16 + 12 * num_groups ? */ - length < 16 || - ( length - 16 ) / 12 < num_groups ) - FT_INVALID_TOO_SHORT; - - /* check groups, they must be in increasing order */ - { - FT_ULong n, start, end, start_id, last = 0; - - - for ( n = 0; n < num_groups; n++ ) - { - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - start_id = TT_NEXT_ULONG( p ); - - if ( start > end ) - FT_INVALID_DATA; - - if ( n > 0 && start <= last ) - FT_INVALID_DATA; - - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - FT_UInt32 d = end - start; - - - /* start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ? */ - if ( d > TT_VALID_GLYPH_COUNT( valid ) || - start_id >= TT_VALID_GLYPH_COUNT( valid ) - d ) - FT_INVALID_GLYPH_ID; - } - - last = end; - } - } - - return FT_Err_Ok; - } - - - /* search the index of the charcode next to cmap->cur_charcode */ - /* cmap->cur_group should be set up properly by caller */ - /* */ - static void - tt_cmap12_next( TT_CMap12 cmap ) - { - FT_Byte* p; - FT_ULong start, end, start_id, char_code; - FT_ULong n; - FT_UInt gindex; - - - if ( cmap->cur_charcode >= 0xFFFFFFFFUL ) - goto Fail; - - char_code = cmap->cur_charcode + 1; - - for ( n = cmap->cur_group; n < cmap->num_groups; n++ ) - { - p = cmap->cmap.data + 16 + 12 * n; - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - start_id = TT_PEEK_ULONG( p ); - - if ( char_code < start ) - char_code = start; - - for ( ; char_code <= end; char_code++ ) - { - gindex = (FT_UInt)( start_id + char_code - start ); - - if ( gindex ) - { - cmap->cur_charcode = char_code;; - cmap->cur_gindex = gindex; - cmap->cur_group = n; - - return; - } - } - } - - Fail: - cmap->valid = 0; - } - - - static FT_UInt - tt_cmap12_char_map_binary( TT_CMap cmap, - FT_UInt32* pchar_code, - FT_Bool next ) - { - FT_UInt gindex = 0; - FT_Byte* p = cmap->data + 12; - FT_UInt32 num_groups = TT_PEEK_ULONG( p ); - FT_UInt32 char_code = *pchar_code; - FT_UInt32 start, end, start_id; - FT_UInt32 max, min, mid; - - - if ( !num_groups ) - return 0; - - /* make compiler happy */ - mid = num_groups; - end = 0xFFFFFFFFUL; - - if ( next ) - char_code++; - - min = 0; - max = num_groups; - - /* binary search */ - while ( min < max ) - { - mid = ( min + max ) >> 1; - p = cmap->data + 16 + 12 * mid; - - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - - if ( char_code < start ) - max = mid; - else if ( char_code > end ) - min = mid + 1; - else - { - start_id = TT_PEEK_ULONG( p ); - gindex = (FT_UInt)( start_id + char_code - start ); - - break; - } - } - - if ( next ) - { - TT_CMap12 cmap12 = (TT_CMap12)cmap; - - - /* if `char_code' is not in any group, then `mid' is */ - /* the group nearest to `char_code' */ - /* */ - - if ( char_code > end ) - { - mid++; - if ( mid == num_groups ) - return 0; - } - - cmap12->valid = 1; - cmap12->cur_charcode = char_code; - cmap12->cur_group = mid; - - if ( !gindex ) - { - tt_cmap12_next( cmap12 ); - - if ( cmap12->valid ) - gindex = cmap12->cur_gindex; - } - else - cmap12->cur_gindex = gindex; - - if ( gindex ) - *pchar_code = cmap12->cur_charcode; - } - - return gindex; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap12_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - return tt_cmap12_char_map_binary( cmap, &char_code, 0 ); - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap12_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - TT_CMap12 cmap12 = (TT_CMap12)cmap; - FT_ULong gindex; - - - if ( cmap12->cur_charcode >= 0xFFFFFFFFUL ) - return 0; - - /* no need to search */ - if ( cmap12->valid && cmap12->cur_charcode == *pchar_code ) - { - tt_cmap12_next( cmap12 ); - if ( cmap12->valid ) - { - gindex = cmap12->cur_gindex; - - /* XXX: check cur_charcode overflow is expected */ - if ( gindex ) - *pchar_code = (FT_UInt32)cmap12->cur_charcode; - } - else - gindex = 0; - } - else - gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 ); - - /* XXX: check gindex overflow is expected */ - return (FT_UInt32)gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap12_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 8; - - - cmap_info->format = 12; - cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); - - return FT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP( - tt_cmap12_class_rec, - sizeof ( TT_CMap12Rec ), - - (FT_CMap_InitFunc) tt_cmap12_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap12_char_index, - (FT_CMap_CharNextFunc) tt_cmap12_char_next, - - NULL, - NULL, - NULL, - NULL, - NULL, - - 12, - (TT_CMap_ValidateFunc)tt_cmap12_validate, - (TT_CMap_Info_GetFunc)tt_cmap12_get_info ) - -#endif /* TT_CONFIG_CMAP_FORMAT_12 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 13 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 13 */ - /* reserved 2 USHORT reserved */ - /* length 4 ULONG length in bytes */ - /* language 8 ULONG Mac language code */ - /* count 12 ULONG number of groups */ - /* 16 */ - /* */ - /* This header is followed by `count' groups of the following format: */ - /* */ - /* start 0 ULONG first charcode */ - /* end 4 ULONG last charcode */ - /* glyphId 8 ULONG glyph ID for the whole group */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_13 - - typedef struct TT_CMap13Rec_ - { - TT_CMapRec cmap; - FT_Bool valid; - FT_ULong cur_charcode; - FT_UInt cur_gindex; - FT_ULong cur_group; - FT_ULong num_groups; - - } TT_CMap13Rec, *TT_CMap13; - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap13_init( TT_CMap13 cmap, - FT_Byte* table ) - { - cmap->cmap.data = table; - - table += 12; - cmap->num_groups = FT_PEEK_ULONG( table ); - - cmap->valid = 0; - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap13_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p; - FT_ULong length; - FT_ULong num_groups; - - - if ( table + 16 > valid->limit ) - FT_INVALID_TOO_SHORT; - - p = table + 4; - length = TT_NEXT_ULONG( p ); - - p = table + 12; - num_groups = TT_NEXT_ULONG( p ); - - if ( length > (FT_ULong)( valid->limit - table ) || - /* length < 16 + 12 * num_groups ? */ - length < 16 || - ( length - 16 ) / 12 < num_groups ) - FT_INVALID_TOO_SHORT; - - /* check groups, they must be in increasing order */ - { - FT_ULong n, start, end, glyph_id, last = 0; - - - for ( n = 0; n < num_groups; n++ ) - { - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - glyph_id = TT_NEXT_ULONG( p ); - - if ( start > end ) - FT_INVALID_DATA; - - if ( n > 0 && start <= last ) - FT_INVALID_DATA; - - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - - last = end; - } - } - - return FT_Err_Ok; - } - - - /* search the index of the charcode next to cmap->cur_charcode */ - /* cmap->cur_group should be set up properly by caller */ - /* */ - static void - tt_cmap13_next( TT_CMap13 cmap ) - { - FT_Byte* p; - FT_ULong start, end, glyph_id, char_code; - FT_ULong n; - FT_UInt gindex; - - - if ( cmap->cur_charcode >= 0xFFFFFFFFUL ) - goto Fail; - - char_code = cmap->cur_charcode + 1; - - for ( n = cmap->cur_group; n < cmap->num_groups; n++ ) - { - p = cmap->cmap.data + 16 + 12 * n; - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - glyph_id = TT_PEEK_ULONG( p ); - - if ( char_code < start ) - char_code = start; - - if ( char_code <= end ) - { - gindex = (FT_UInt)glyph_id; - - if ( gindex ) - { - cmap->cur_charcode = char_code;; - cmap->cur_gindex = gindex; - cmap->cur_group = n; - - return; - } - } - } - - Fail: - cmap->valid = 0; - } - - - static FT_UInt - tt_cmap13_char_map_binary( TT_CMap cmap, - FT_UInt32* pchar_code, - FT_Bool next ) - { - FT_UInt gindex = 0; - FT_Byte* p = cmap->data + 12; - FT_UInt32 num_groups = TT_PEEK_ULONG( p ); - FT_UInt32 char_code = *pchar_code; - FT_UInt32 start, end; - FT_UInt32 max, min, mid; - - - if ( !num_groups ) - return 0; - - /* make compiler happy */ - mid = num_groups; - end = 0xFFFFFFFFUL; - - if ( next ) - char_code++; - - min = 0; - max = num_groups; - - /* binary search */ - while ( min < max ) - { - mid = ( min + max ) >> 1; - p = cmap->data + 16 + 12 * mid; - - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - - if ( char_code < start ) - max = mid; - else if ( char_code > end ) - min = mid + 1; - else - { - gindex = (FT_UInt)TT_PEEK_ULONG( p ); - - break; - } - } - - if ( next ) - { - TT_CMap13 cmap13 = (TT_CMap13)cmap; - - - /* if `char_code' is not in any group, then `mid' is */ - /* the group nearest to `char_code' */ - - if ( char_code > end ) - { - mid++; - if ( mid == num_groups ) - return 0; - } - - cmap13->valid = 1; - cmap13->cur_charcode = char_code; - cmap13->cur_group = mid; - - if ( !gindex ) - { - tt_cmap13_next( cmap13 ); - - if ( cmap13->valid ) - gindex = cmap13->cur_gindex; - } - else - cmap13->cur_gindex = gindex; - - if ( gindex ) - *pchar_code = cmap13->cur_charcode; - } - - return gindex; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap13_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - return tt_cmap13_char_map_binary( cmap, &char_code, 0 ); - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap13_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - TT_CMap13 cmap13 = (TT_CMap13)cmap; - FT_UInt gindex; - - - if ( cmap13->cur_charcode >= 0xFFFFFFFFUL ) - return 0; - - /* no need to search */ - if ( cmap13->valid && cmap13->cur_charcode == *pchar_code ) - { - tt_cmap13_next( cmap13 ); - if ( cmap13->valid ) - { - gindex = cmap13->cur_gindex; - if ( gindex ) - *pchar_code = cmap13->cur_charcode; - } - else - gindex = 0; - } - else - gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 ); - - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap13_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 8; - - - cmap_info->format = 13; - cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); - - return FT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP( - tt_cmap13_class_rec, - sizeof ( TT_CMap13Rec ), - - (FT_CMap_InitFunc) tt_cmap13_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap13_char_index, - (FT_CMap_CharNextFunc) tt_cmap13_char_next, - - NULL, - NULL, - NULL, - NULL, - NULL, - - 13, - (TT_CMap_ValidateFunc)tt_cmap13_validate, - (TT_CMap_Info_GetFunc)tt_cmap13_get_info ) - -#endif /* TT_CONFIG_CMAP_FORMAT_13 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 14 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 14 */ - /* length 2 ULONG table length in bytes */ - /* numSelector 6 ULONG number of variation sel. records */ - /* */ - /* Followed by numSelector records, each of which looks like */ - /* */ - /* varSelector 0 UINT24 Unicode codepoint of sel. */ - /* defaultOff 3 ULONG offset to a default UVS table */ - /* describing any variants to be found in */ - /* the normal Unicode subtable. */ - /* nonDefOff 7 ULONG offset to a non-default UVS table */ - /* describing any variants not in the */ - /* standard cmap, with GIDs here */ - /* (either offset may be 0 NULL) */ - /* */ - /* Selectors are sorted by code point. */ - /* */ - /* A default Unicode Variation Selector (UVS) subtable is just a list of */ - /* ranges of code points which are to be found in the standard cmap. No */ - /* glyph IDs (GIDs) here. */ - /* */ - /* numRanges 0 ULONG number of ranges following */ - /* */ - /* A range looks like */ - /* */ - /* uniStart 0 UINT24 code point of the first character in */ - /* this range */ - /* additionalCnt 3 UBYTE count of additional characters in this */ - /* range (zero means a range of a single */ - /* character) */ - /* */ - /* Ranges are sorted by `uniStart'. */ - /* */ - /* A non-default Unicode Variation Selector (UVS) subtable is a list of */ - /* mappings from codepoint to GID. */ - /* */ - /* numMappings 0 ULONG number of mappings */ - /* */ - /* A range looks like */ - /* */ - /* uniStart 0 UINT24 code point of the first character in */ - /* this range */ - /* GID 3 USHORT and its GID */ - /* */ - /* Ranges are sorted by `uniStart'. */ - -#ifdef TT_CONFIG_CMAP_FORMAT_14 - - typedef struct TT_CMap14Rec_ - { - TT_CMapRec cmap; - FT_ULong num_selectors; - - /* This array is used to store the results of various - * cmap 14 query functions. The data is overwritten - * on each call to these functions. - */ - FT_UInt32 max_results; - FT_UInt32* results; - FT_Memory memory; - - } TT_CMap14Rec, *TT_CMap14; - - - FT_CALLBACK_DEF( void ) - tt_cmap14_done( TT_CMap14 cmap ) - { - FT_Memory memory = cmap->memory; - - - cmap->max_results = 0; - if ( memory != NULL && cmap->results != NULL ) - FT_FREE( cmap->results ); - } - - - static FT_Error - tt_cmap14_ensure( TT_CMap14 cmap, - FT_UInt32 num_results, - FT_Memory memory ) - { - FT_UInt32 old_max = cmap->max_results; - FT_Error error = FT_Err_Ok; - - - if ( num_results > cmap->max_results ) - { - cmap->memory = memory; - - if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) ) - return error; - - cmap->max_results = num_results; - } - - return error; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap14_init( TT_CMap14 cmap, - FT_Byte* table ) - { - cmap->cmap.data = table; - - table += 6; - cmap->num_selectors = FT_PEEK_ULONG( table ); - cmap->max_results = 0; - cmap->results = NULL; - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap14_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p; - FT_ULong length; - FT_ULong num_selectors; - - - if ( table + 2 + 4 + 4 > valid->limit ) - FT_INVALID_TOO_SHORT; - - p = table + 2; - length = TT_NEXT_ULONG( p ); - num_selectors = TT_NEXT_ULONG( p ); - - if ( length > (FT_ULong)( valid->limit - table ) || - /* length < 10 + 11 * num_selectors ? */ - length < 10 || - ( length - 10 ) / 11 < num_selectors ) - FT_INVALID_TOO_SHORT; - - /* check selectors, they must be in increasing order */ - { - /* we start lastVarSel at 1 because a variant selector value of 0 - * isn't valid. - */ - FT_ULong n, lastVarSel = 1; - - - for ( n = 0; n < num_selectors; n++ ) - { - FT_ULong varSel = TT_NEXT_UINT24( p ); - FT_ULong defOff = TT_NEXT_ULONG( p ); - FT_ULong nondefOff = TT_NEXT_ULONG( p ); - - - if ( defOff >= length || nondefOff >= length ) - FT_INVALID_TOO_SHORT; - - if ( varSel < lastVarSel ) - FT_INVALID_DATA; - - lastVarSel = varSel + 1; - - /* check the default table (these glyphs should be reached */ - /* through the normal Unicode cmap, no GIDs, just check order) */ - if ( defOff != 0 ) - { - FT_Byte* defp = table + defOff; - FT_ULong numRanges = TT_NEXT_ULONG( defp ); - FT_ULong i; - FT_ULong lastBase = 0; - - - /* defp + numRanges * 4 > valid->limit ? */ - if ( numRanges > (FT_ULong)( valid->limit - defp ) / 4 ) - FT_INVALID_TOO_SHORT; - - for ( i = 0; i < numRanges; ++i ) - { - FT_ULong base = TT_NEXT_UINT24( defp ); - FT_ULong cnt = FT_NEXT_BYTE( defp ); - - - if ( base + cnt >= 0x110000UL ) /* end of Unicode */ - FT_INVALID_DATA; - - if ( base < lastBase ) - FT_INVALID_DATA; - - lastBase = base + cnt + 1U; - } - } - - /* and the non-default table (these glyphs are specified here) */ - if ( nondefOff != 0 ) - { - FT_Byte* ndp = table + nondefOff; - FT_ULong numMappings = TT_NEXT_ULONG( ndp ); - FT_ULong i, lastUni = 0; - - - /* numMappings * 4 > (FT_ULong)( valid->limit - ndp ) ? */ - if ( numMappings > ( (FT_ULong)( valid->limit - ndp ) ) / 4 ) - FT_INVALID_TOO_SHORT; - - for ( i = 0; i < numMappings; ++i ) - { - FT_ULong uni = TT_NEXT_UINT24( ndp ); - FT_ULong gid = TT_NEXT_USHORT( ndp ); - - - if ( uni >= 0x110000UL ) /* end of Unicode */ - FT_INVALID_DATA; - - if ( uni < lastUni ) - FT_INVALID_DATA; - - lastUni = uni + 1U; - - if ( valid->level >= FT_VALIDATE_TIGHT && - gid >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - } - } - } - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap14_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - FT_UNUSED( cmap ); - FT_UNUSED( char_code ); - - /* This can't happen */ - return 0; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap14_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_UNUSED( cmap ); - - /* This can't happen */ - *pchar_code = 0; - return 0; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap14_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_UNUSED( cmap ); - - cmap_info->format = 14; - /* subtable 14 does not define a language field */ - cmap_info->language = 0xFFFFFFFFUL; - - return FT_Err_Ok; - } - - - static FT_UInt - tt_cmap14_char_map_def_binary( FT_Byte *base, - FT_UInt32 char_code ) - { - FT_UInt32 numRanges = TT_PEEK_ULONG( base ); - FT_UInt32 max, min; - - - min = 0; - max = numRanges; - - base += 4; - - /* binary search */ - while ( min < max ) - { - FT_UInt32 mid = ( min + max ) >> 1; - FT_Byte* p = base + 4 * mid; - FT_ULong start = TT_NEXT_UINT24( p ); - FT_UInt cnt = FT_NEXT_BYTE( p ); - - - if ( char_code < start ) - max = mid; - else if ( char_code > start+cnt ) - min = mid + 1; - else - return TRUE; - } - - return FALSE; - } - - - static FT_UInt - tt_cmap14_char_map_nondef_binary( FT_Byte *base, - FT_UInt32 char_code ) - { - FT_UInt32 numMappings = TT_PEEK_ULONG( base ); - FT_UInt32 max, min; - - - min = 0; - max = numMappings; - - base += 4; - - /* binary search */ - while ( min < max ) - { - FT_UInt32 mid = ( min + max ) >> 1; - FT_Byte* p = base + 5 * mid; - FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p ); - - - if ( char_code < uni ) - max = mid; - else if ( char_code > uni ) - min = mid + 1; - else - return TT_PEEK_USHORT( p ); - } - - return 0; - } - - - static FT_Byte* - tt_cmap14_find_variant( FT_Byte *base, - FT_UInt32 variantCode ) - { - FT_UInt32 numVar = TT_PEEK_ULONG( base ); - FT_UInt32 max, min; - - - min = 0; - max = numVar; - - base += 4; - - /* binary search */ - while ( min < max ) - { - FT_UInt32 mid = ( min + max ) >> 1; - FT_Byte* p = base + 11 * mid; - FT_ULong varSel = TT_NEXT_UINT24( p ); - - - if ( variantCode < varSel ) - max = mid; - else if ( variantCode > varSel ) - min = mid + 1; - else - return p; - } - - return NULL; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap14_char_var_index( TT_CMap cmap, - TT_CMap ucmap, - FT_UInt32 charcode, - FT_UInt32 variantSelector ) - { - FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); - FT_ULong defOff; - FT_ULong nondefOff; - - - if ( !p ) - return 0; - - defOff = TT_NEXT_ULONG( p ); - nondefOff = TT_PEEK_ULONG( p ); - - if ( defOff != 0 && - tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) - { - /* This is the default variant of this charcode. GID not stored */ - /* here; stored in the normal Unicode charmap instead. */ - return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode ); - } - - if ( nondefOff != 0 ) - return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, - charcode ); - - return 0; - } - - - FT_CALLBACK_DEF( FT_Int ) - tt_cmap14_char_var_isdefault( TT_CMap cmap, - FT_UInt32 charcode, - FT_UInt32 variantSelector ) - { - FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); - FT_ULong defOff; - FT_ULong nondefOff; - - - if ( !p ) - return -1; - - defOff = TT_NEXT_ULONG( p ); - nondefOff = TT_NEXT_ULONG( p ); - - if ( defOff != 0 && - tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) - return 1; - - if ( nondefOff != 0 && - tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, - charcode ) != 0 ) - return 0; - - return -1; - } - - - FT_CALLBACK_DEF( FT_UInt32* ) - tt_cmap14_variants( TT_CMap cmap, - FT_Memory memory ) - { - TT_CMap14 cmap14 = (TT_CMap14)cmap; - FT_UInt32 count = cmap14->num_selectors; - FT_Byte* p = cmap->data + 10; - FT_UInt32* result; - FT_UInt32 i; - - - if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) - return NULL; - - result = cmap14->results; - for ( i = 0; i < count; ++i ) - { - result[i] = (FT_UInt32)TT_NEXT_UINT24( p ); - p += 8; - } - result[i] = 0; - - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 * ) - tt_cmap14_char_variants( TT_CMap cmap, - FT_Memory memory, - FT_UInt32 charCode ) - { - TT_CMap14 cmap14 = (TT_CMap14) cmap; - FT_UInt32 count = cmap14->num_selectors; - FT_Byte* p = cmap->data + 10; - FT_UInt32* q; - - - if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) - return NULL; - - for ( q = cmap14->results; count > 0; --count ) - { - FT_UInt32 varSel = TT_NEXT_UINT24( p ); - FT_ULong defOff = TT_NEXT_ULONG( p ); - FT_ULong nondefOff = TT_NEXT_ULONG( p ); - - - if ( ( defOff != 0 && - tt_cmap14_char_map_def_binary( cmap->data + defOff, - charCode ) ) || - ( nondefOff != 0 && - tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, - charCode ) != 0 ) ) - { - q[0] = varSel; - q++; - } - } - q[0] = 0; - - return cmap14->results; - } - - - static FT_UInt - tt_cmap14_def_char_count( FT_Byte *p ) - { - FT_UInt32 numRanges = (FT_UInt32)TT_NEXT_ULONG( p ); - FT_UInt tot = 0; - - - p += 3; /* point to the first `cnt' field */ - for ( ; numRanges > 0; numRanges-- ) - { - tot += 1 + p[0]; - p += 4; - } - - return tot; - } - - - static FT_UInt32* - tt_cmap14_get_def_chars( TT_CMap cmap, - FT_Byte* p, - FT_Memory memory ) - { - TT_CMap14 cmap14 = (TT_CMap14) cmap; - FT_UInt32 numRanges; - FT_UInt cnt; - FT_UInt32* q; - - - cnt = tt_cmap14_def_char_count( p ); - numRanges = (FT_UInt32)TT_NEXT_ULONG( p ); - - if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) ) - return NULL; - - for ( q = cmap14->results; numRanges > 0; --numRanges ) - { - FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p ); - - - cnt = FT_NEXT_BYTE( p ) + 1; - do - { - q[0] = uni; - uni += 1; - q += 1; - - } while ( --cnt != 0 ); - } - q[0] = 0; - - return cmap14->results; - } - - - static FT_UInt32* - tt_cmap14_get_nondef_chars( TT_CMap cmap, - FT_Byte *p, - FT_Memory memory ) - { - TT_CMap14 cmap14 = (TT_CMap14) cmap; - FT_UInt32 numMappings; - FT_UInt i; - FT_UInt32 *ret; - - - numMappings = (FT_UInt32)TT_NEXT_ULONG( p ); - - if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) ) - return NULL; - - ret = cmap14->results; - for ( i = 0; i < numMappings; ++i ) - { - ret[i] = (FT_UInt32)TT_NEXT_UINT24( p ); - p += 2; - } - ret[i] = 0; - - return ret; - } - - - FT_CALLBACK_DEF( FT_UInt32 * ) - tt_cmap14_variant_chars( TT_CMap cmap, - FT_Memory memory, - FT_UInt32 variantSelector ) - { - FT_Byte *p = tt_cmap14_find_variant( cmap->data + 6, - variantSelector ); - FT_Int i; - FT_ULong defOff; - FT_ULong nondefOff; - - - if ( !p ) - return NULL; - - defOff = TT_NEXT_ULONG( p ); - nondefOff = TT_NEXT_ULONG( p ); - - if ( defOff == 0 && nondefOff == 0 ) - return NULL; - - if ( defOff == 0 ) - return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, - memory ); - else if ( nondefOff == 0 ) - return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, - memory ); - else - { - /* Both a default and a non-default glyph set? That's probably not */ - /* good font design, but the spec allows for it... */ - TT_CMap14 cmap14 = (TT_CMap14) cmap; - FT_UInt32 numRanges; - FT_UInt32 numMappings; - FT_UInt32 duni; - FT_UInt32 dcnt; - FT_UInt32 nuni; - FT_Byte* dp; - FT_UInt di, ni, k; - - FT_UInt32 *ret; - - - p = cmap->data + nondefOff; - dp = cmap->data + defOff; - - numMappings = (FT_UInt32)TT_NEXT_ULONG( p ); - dcnt = tt_cmap14_def_char_count( dp ); - numRanges = (FT_UInt32)TT_NEXT_ULONG( dp ); - - if ( numMappings == 0 ) - return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, - memory ); - if ( dcnt == 0 ) - return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, - memory ); - - if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) ) - return NULL; - - ret = cmap14->results; - duni = (FT_UInt32)TT_NEXT_UINT24( dp ); - dcnt = FT_NEXT_BYTE( dp ); - di = 1; - nuni = (FT_UInt32)TT_NEXT_UINT24( p ); - p += 2; - ni = 1; - i = 0; - - for ( ;; ) - { - if ( nuni > duni + dcnt ) - { - for ( k = 0; k <= dcnt; ++k ) - ret[i++] = duni + k; - - ++di; - - if ( di > numRanges ) - break; - - duni = (FT_UInt32)TT_NEXT_UINT24( dp ); - dcnt = FT_NEXT_BYTE( dp ); - } - else - { - if ( nuni < duni ) - ret[i++] = nuni; - /* If it is within the default range then ignore it -- */ - /* that should not have happened */ - ++ni; - if ( ni > numMappings ) - break; - - nuni = (FT_UInt32)TT_NEXT_UINT24( p ); - p += 2; - } - } - - if ( ni <= numMappings ) - { - /* If we get here then we have run out of all default ranges. */ - /* We have read one non-default mapping which we haven't stored */ - /* and there may be others that need to be read. */ - ret[i++] = nuni; - while ( ni < numMappings ) - { - ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p ); - p += 2; - ++ni; - } - } - else if ( di <= numRanges ) - { - /* If we get here then we have run out of all non-default */ - /* mappings. We have read one default range which we haven't */ - /* stored and there may be others that need to be read. */ - for ( k = 0; k <= dcnt; ++k ) - ret[i++] = duni + k; - - while ( di < numRanges ) - { - duni = (FT_UInt32)TT_NEXT_UINT24( dp ); - dcnt = FT_NEXT_BYTE( dp ); - - for ( k = 0; k <= dcnt; ++k ) - ret[i++] = duni + k; - ++di; - } - } - - ret[i] = 0; - - return ret; - } - } - - - FT_DEFINE_TT_CMAP( - tt_cmap14_class_rec, - sizeof ( TT_CMap14Rec ), - - (FT_CMap_InitFunc) tt_cmap14_init, - (FT_CMap_DoneFunc) tt_cmap14_done, - (FT_CMap_CharIndexFunc)tt_cmap14_char_index, - (FT_CMap_CharNextFunc) tt_cmap14_char_next, - - /* Format 14 extension functions */ - (FT_CMap_CharVarIndexFunc) tt_cmap14_char_var_index, - (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault, - (FT_CMap_VariantListFunc) tt_cmap14_variants, - (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants, - (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars, - - 14, - (TT_CMap_ValidateFunc)tt_cmap14_validate, - (TT_CMap_Info_GetFunc)tt_cmap14_get_info ) - -#endif /* TT_CONFIG_CMAP_FORMAT_14 */ - - -#ifndef FT_CONFIG_OPTION_PIC - - static const TT_CMap_Class tt_cmap_classes[] = - { -#define TTCMAPCITEM( a ) &a, -#include "ttcmapc.h" - NULL, - }; - -#else /*FT_CONFIG_OPTION_PIC*/ - - void - FT_Destroy_Class_tt_cmap_classes( FT_Library library, - TT_CMap_Class* clazz ) - { - FT_Memory memory = library->memory; - - - if ( clazz ) - FT_FREE( clazz ); - } - - - FT_Error - FT_Create_Class_tt_cmap_classes( FT_Library library, - TT_CMap_Class** output_class ) - { - TT_CMap_Class* clazz = NULL; - TT_CMap_ClassRec* recs; - FT_Error error; - FT_Memory memory = library->memory; - - int i = 0; - - -#define TTCMAPCITEM( a ) i++; -#include "ttcmapc.h" - - /* allocate enough space for both the pointers */ - /* plus terminator and the class instances */ - if ( FT_ALLOC( clazz, sizeof ( *clazz ) * ( i + 1 ) + - sizeof ( TT_CMap_ClassRec ) * i ) ) - return error; - - /* the location of the class instances follows the array of pointers */ - recs = (TT_CMap_ClassRec*)( (char*)clazz + - sizeof ( *clazz ) * ( i + 1 ) ); - i = 0; - -#undef TTCMAPCITEM -#define TTCMAPCITEM( a ) \ - FT_Init_Class_ ## a( &recs[i] ); \ - clazz[i] = &recs[i]; \ - i++; -#include "ttcmapc.h" - - clazz[i] = NULL; - - *output_class = clazz; - return FT_Err_Ok; - } - -#endif /*FT_CONFIG_OPTION_PIC*/ - - - /* parse the `cmap' table and build the corresponding TT_CMap objects */ - /* in the current face */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_build_cmaps( TT_Face face ) - { - FT_Byte* table = face->cmap_table; - FT_Byte* limit = table + face->cmap_size; - FT_UInt volatile num_cmaps; - FT_Byte* volatile p = table; - FT_Library library = FT_FACE_LIBRARY( face ); - - FT_UNUSED( library ); - - - if ( !p || p + 4 > limit ) - return FT_THROW( Invalid_Table ); - - /* only recognize format 0 */ - if ( TT_NEXT_USHORT( p ) != 0 ) - { - FT_ERROR(( "tt_face_build_cmaps:" - " unsupported `cmap' table format = %d\n", - TT_PEEK_USHORT( p - 2 ) )); - return FT_THROW( Invalid_Table ); - } - - num_cmaps = TT_NEXT_USHORT( p ); - - for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- ) - { - FT_CharMapRec charmap; - FT_UInt32 offset; - - - charmap.platform_id = TT_NEXT_USHORT( p ); - charmap.encoding_id = TT_NEXT_USHORT( p ); - charmap.face = FT_FACE( face ); - charmap.encoding = FT_ENCODING_NONE; /* will be filled later */ - offset = TT_NEXT_ULONG( p ); - - if ( offset && offset <= face->cmap_size - 2 ) - { - FT_Byte* volatile cmap = table + offset; - volatile FT_UInt format = TT_PEEK_USHORT( cmap ); - const TT_CMap_Class* volatile pclazz = TT_CMAP_CLASSES_GET; - TT_CMap_Class volatile clazz; - - - for ( ; *pclazz; pclazz++ ) - { - clazz = *pclazz; - if ( clazz->format == format ) - { - volatile TT_ValidatorRec valid; - volatile FT_Error error = FT_Err_Ok; - - - ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit, - FT_VALIDATE_DEFAULT ); - - valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs; - - if ( ft_setjmp( FT_VALIDATOR( &valid )->jump_buffer) == 0 ) - { - /* validate this cmap sub-table */ - error = clazz->validate( cmap, FT_VALIDATOR( &valid ) ); - } - - if ( valid.validator.error == 0 ) - { - FT_CMap ttcmap; - - - /* It might make sense to store the single variation */ - /* selector cmap somewhere special. But it would have to be */ - /* in the public FT_FaceRec, and we can't change that. */ - - if ( !FT_CMap_New( (FT_CMap_Class)clazz, - cmap, &charmap, &ttcmap ) ) - { - /* it is simpler to directly set `flags' than adding */ - /* a parameter to FT_CMap_New */ - ((TT_CMap)ttcmap)->flags = (FT_Int)error; - } - } - else - { - FT_TRACE0(( "tt_face_build_cmaps:" - " broken cmap sub-table ignored\n" )); - } - break; - } - } - - if ( *pclazz == NULL ) - { - FT_TRACE0(( "tt_face_build_cmaps:" - " unsupported cmap sub-table ignored\n" )); - } - } - } - - return FT_Err_Ok; - } - - - FT_LOCAL( FT_Error ) - tt_get_cmap_info( FT_CharMap charmap, - TT_CMapInfo *cmap_info ) - { - FT_CMap cmap = (FT_CMap)charmap; - TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz; - - - return clazz->get_cmap_info( charmap, cmap_info ); - } - - -/* END */ diff --git a/3party/freetype/src/sfnt/ttcmap.h b/3party/freetype/src/sfnt/ttcmap.h deleted file mode 100644 index b7ea8ee377..0000000000 --- a/3party/freetype/src/sfnt/ttcmap.h +++ /dev/null @@ -1,158 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttcmap.h */ -/* */ -/* TrueType character mapping table (cmap) support (specification). */ -/* */ -/* Copyright 2002-2015 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 __TTCMAP_H__ -#define __TTCMAP_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_INTERNAL_VALIDATE_H -#include FT_SERVICE_TT_CMAP_H - -FT_BEGIN_HEADER - - -#define TT_CMAP_FLAG_UNSORTED 1 -#define TT_CMAP_FLAG_OVERLAPPING 2 - - typedef struct TT_CMapRec_ - { - FT_CMapRec cmap; - FT_Byte* data; /* pointer to in-memory cmap table */ - FT_Int flags; /* for format 4 only */ - - } TT_CMapRec, *TT_CMap; - - typedef const struct TT_CMap_ClassRec_* TT_CMap_Class; - - - typedef FT_Error - (*TT_CMap_ValidateFunc)( FT_Byte* data, - FT_Validator valid ); - - typedef struct TT_CMap_ClassRec_ - { - FT_CMap_ClassRec clazz; - FT_UInt format; - TT_CMap_ValidateFunc validate; - TT_CMap_Info_GetFunc get_cmap_info; - - } TT_CMap_ClassRec; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_TT_CMAP( class_, \ - size_, \ - init_, \ - done_, \ - char_index_, \ - char_next_, \ - char_var_index_, \ - char_var_default_, \ - variant_list_, \ - charvariant_list_, \ - variantchar_list_, \ - format_, \ - validate_, \ - get_cmap_info_ ) \ - FT_CALLBACK_TABLE_DEF \ - const TT_CMap_ClassRec class_ = \ - { \ - { size_, \ - init_, \ - done_, \ - char_index_, \ - char_next_, \ - char_var_index_, \ - char_var_default_, \ - variant_list_, \ - charvariant_list_, \ - variantchar_list_ \ - }, \ - \ - format_, \ - validate_, \ - get_cmap_info_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_TT_CMAP( class_, \ - size_, \ - init_, \ - done_, \ - char_index_, \ - char_next_, \ - char_var_index_, \ - char_var_default_, \ - variant_list_, \ - charvariant_list_, \ - variantchar_list_, \ - format_, \ - validate_, \ - get_cmap_info_ ) \ - void \ - FT_Init_Class_ ## class_( TT_CMap_ClassRec* clazz ) \ - { \ - clazz->clazz.size = size_; \ - clazz->clazz.init = init_; \ - clazz->clazz.done = done_; \ - clazz->clazz.char_index = char_index_; \ - clazz->clazz.char_next = char_next_; \ - clazz->clazz.char_var_index = char_var_index_; \ - clazz->clazz.char_var_default = char_var_default_; \ - clazz->clazz.variant_list = variant_list_; \ - clazz->clazz.charvariant_list = charvariant_list_; \ - clazz->clazz.variantchar_list = variantchar_list_; \ - clazz->format = format_; \ - clazz->validate = validate_; \ - clazz->get_cmap_info = get_cmap_info_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - - typedef struct TT_ValidatorRec_ - { - FT_ValidatorRec validator; - FT_UInt num_glyphs; - - } TT_ValidatorRec, *TT_Validator; - - -#define TT_VALIDATOR( x ) ( (TT_Validator)( x ) ) -#define TT_VALID_GLYPH_COUNT( x ) TT_VALIDATOR( x )->num_glyphs - - - FT_LOCAL( FT_Error ) - tt_face_build_cmaps( TT_Face face ); - - /* used in tt-cmaps service */ - FT_LOCAL( FT_Error ) - tt_get_cmap_info( FT_CharMap charmap, - TT_CMapInfo *cmap_info ); - - -FT_END_HEADER - -#endif /* __TTCMAP_H__ */ - - -/* END */ diff --git a/3party/freetype/src/sfnt/ttcmapc.h b/3party/freetype/src/sfnt/ttcmapc.h deleted file mode 100644 index 4a489402cf..0000000000 --- a/3party/freetype/src/sfnt/ttcmapc.h +++ /dev/null @@ -1,56 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttcmapc.h */ -/* */ -/* TT CMAP classes definitions (specification only). */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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. */ -/* */ -/***************************************************************************/ - - -#ifdef TT_CONFIG_CMAP_FORMAT_0 - TTCMAPCITEM( tt_cmap0_class_rec ) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_2 - TTCMAPCITEM( tt_cmap2_class_rec ) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_4 - TTCMAPCITEM( tt_cmap4_class_rec ) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_6 - TTCMAPCITEM( tt_cmap6_class_rec ) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_8 - TTCMAPCITEM( tt_cmap8_class_rec ) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_10 - TTCMAPCITEM( tt_cmap10_class_rec ) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_12 - TTCMAPCITEM( tt_cmap12_class_rec ) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_13 - TTCMAPCITEM( tt_cmap13_class_rec ) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_14 - TTCMAPCITEM( tt_cmap14_class_rec ) -#endif - - - /* END */ diff --git a/3party/freetype/src/sfnt/ttkern.c b/3party/freetype/src/sfnt/ttkern.c deleted file mode 100644 index 4fccc535ce..0000000000 --- a/3party/freetype/src/sfnt/ttkern.c +++ /dev/null @@ -1,306 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttkern.c */ -/* */ -/* Load the basic TrueType kerning table. This doesn't handle */ -/* kerning data within the GPOS table at the moment. */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include "ttkern.h" - -#include "sferrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttkern - - -#undef TT_KERN_INDEX -#define TT_KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) ) - - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_kern( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - FT_ULong table_size; - FT_Byte* p; - FT_Byte* p_limit; - FT_UInt nn, num_tables; - FT_UInt32 avail = 0, ordered = 0; - - - /* the kern table is optional; exit silently if it is missing */ - error = face->goto_table( face, TTAG_kern, stream, &table_size ); - if ( error ) - goto Exit; - - if ( table_size < 4 ) /* the case of a malformed table */ - { - FT_ERROR(( "tt_face_load_kern:" - " kerning table is too small - ignored\n" )); - error = FT_THROW( Table_Missing ); - goto Exit; - } - - if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) ) - { - FT_ERROR(( "tt_face_load_kern:" - " could not extract kerning table\n" )); - goto Exit; - } - - face->kern_table_size = table_size; - - p = face->kern_table; - p_limit = p + table_size; - - p += 2; /* skip version */ - num_tables = FT_NEXT_USHORT( p ); - - if ( num_tables > 32 ) /* we only support up to 32 sub-tables */ - num_tables = 32; - - for ( nn = 0; nn < num_tables; nn++ ) - { - FT_UInt num_pairs, length, coverage; - FT_Byte* p_next; - FT_UInt32 mask = (FT_UInt32)1UL << nn; - - - if ( p + 6 > p_limit ) - break; - - p_next = p; - - p += 2; /* skip version */ - length = FT_NEXT_USHORT( p ); - coverage = FT_NEXT_USHORT( p ); - - if ( length <= 6 + 8 ) - break; - - p_next += length; - - if ( p_next > p_limit ) /* handle broken table */ - p_next = p_limit; - - /* only use horizontal kerning tables */ - if ( ( coverage & ~8U ) != 0x0001 || - p + 8 > p_limit ) - goto NextTable; - - num_pairs = FT_NEXT_USHORT( p ); - p += 6; - - if ( ( p_next - p ) < 6 * (int)num_pairs ) /* handle broken count */ - num_pairs = (FT_UInt)( ( p_next - p ) / 6 ); - - avail |= mask; - - /* - * Now check whether the pairs in this table are ordered. - * We then can use binary search. - */ - if ( num_pairs > 0 ) - { - FT_ULong count; - FT_ULong old_pair; - - - old_pair = FT_NEXT_ULONG( p ); - p += 2; - - for ( count = num_pairs - 1; count > 0; count-- ) - { - FT_UInt32 cur_pair; - - - cur_pair = FT_NEXT_ULONG( p ); - if ( cur_pair <= old_pair ) - break; - - p += 2; - old_pair = cur_pair; - } - - if ( count == 0 ) - ordered |= mask; - } - - NextTable: - p = p_next; - } - - face->num_kern_tables = nn; - face->kern_avail_bits = avail; - face->kern_order_bits = ordered; - - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - tt_face_done_kern( TT_Face face ) - { - FT_Stream stream = face->root.stream; - - - FT_FRAME_RELEASE( face->kern_table ); - face->kern_table_size = 0; - face->num_kern_tables = 0; - face->kern_avail_bits = 0; - face->kern_order_bits = 0; - } - - - FT_LOCAL_DEF( FT_Int ) - tt_face_get_kerning( TT_Face face, - FT_UInt left_glyph, - FT_UInt right_glyph ) - { - FT_Int result = 0; - FT_UInt count, mask; - FT_Byte* p = face->kern_table; - FT_Byte* p_limit = p + face->kern_table_size; - - - p += 4; - mask = 0x0001; - - for ( count = face->num_kern_tables; - count > 0 && p + 6 <= p_limit; - count--, mask <<= 1 ) - { - FT_Byte* base = p; - FT_Byte* next; - FT_UInt version = FT_NEXT_USHORT( p ); - FT_UInt length = FT_NEXT_USHORT( p ); - FT_UInt coverage = FT_NEXT_USHORT( p ); - FT_UInt num_pairs; - FT_Int value = 0; - - FT_UNUSED( version ); - - - next = base + length; - - if ( next > p_limit ) /* handle broken table */ - next = p_limit; - - if ( ( face->kern_avail_bits & mask ) == 0 ) - goto NextTable; - - if ( p + 8 > next ) - goto NextTable; - - num_pairs = FT_NEXT_USHORT( p ); - p += 6; - - if ( ( next - p ) < 6 * (int)num_pairs ) /* handle broken count */ - num_pairs = (FT_UInt)( ( next - p ) / 6 ); - - switch ( coverage >> 8 ) - { - case 0: - { - FT_ULong key0 = TT_KERN_INDEX( left_glyph, right_glyph ); - - - if ( face->kern_order_bits & mask ) /* binary search */ - { - FT_UInt min = 0; - FT_UInt max = num_pairs; - - - while ( min < max ) - { - FT_UInt mid = ( min + max ) >> 1; - FT_Byte* q = p + 6 * mid; - FT_ULong key; - - - key = FT_NEXT_ULONG( q ); - - if ( key == key0 ) - { - value = FT_PEEK_SHORT( q ); - goto Found; - } - if ( key < key0 ) - min = mid + 1; - else - max = mid; - } - } - else /* linear search */ - { - FT_UInt count2; - - - for ( count2 = num_pairs; count2 > 0; count2-- ) - { - FT_ULong key = FT_NEXT_ULONG( p ); - - - if ( key == key0 ) - { - value = FT_PEEK_SHORT( p ); - goto Found; - } - p += 2; - } - } - } - break; - - /* - * We don't support format 2 because we haven't seen a single font - * using it in real life... - */ - - default: - ; - } - - goto NextTable; - - Found: - if ( coverage & 8 ) /* override or add */ - result = value; - else - result += value; - - NextTable: - p = next; - } - - return result; - } - -#undef TT_KERN_INDEX - -/* END */ diff --git a/3party/freetype/src/sfnt/ttkern.h b/3party/freetype/src/sfnt/ttkern.h deleted file mode 100644 index 89cb24f07c..0000000000 --- a/3party/freetype/src/sfnt/ttkern.h +++ /dev/null @@ -1,52 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttkern.h */ -/* */ -/* Load the basic TrueType kerning table. This doesn't handle */ -/* kerning data within the GPOS table at the moment. */ -/* */ -/* Copyright 1996-2015 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 __TTKERN_H__ -#define __TTKERN_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - tt_face_load_kern( TT_Face face, - FT_Stream stream ); - - FT_LOCAL( void ) - tt_face_done_kern( TT_Face face ); - - FT_LOCAL( FT_Int ) - tt_face_get_kerning( TT_Face face, - FT_UInt left_glyph, - FT_UInt right_glyph ); - -#define TT_FACE_HAS_KERNING( face ) ( (face)->kern_avail_bits != 0 ) - - -FT_END_HEADER - -#endif /* __TTKERN_H__ */ - - -/* END */ diff --git a/3party/freetype/src/sfnt/ttload.c b/3party/freetype/src/sfnt/ttload.c deleted file mode 100644 index ad2975de09..0000000000 --- a/3party/freetype/src/sfnt/ttload.c +++ /dev/null @@ -1,1330 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttload.c */ -/* */ -/* Load the basic TrueType tables, i.e., tables that can be either in */ -/* TTF or OTF fonts (body). */ -/* */ -/* Copyright 1996-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include "ttload.h" - -#include "sferrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttload - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_lookup_table */ - /* */ - /* <Description> */ - /* Looks for a TrueType table by name. */ - /* */ - /* <Input> */ - /* face :: A face object handle. */ - /* */ - /* tag :: The searched tag. */ - /* */ - /* <Return> */ - /* A pointer to the table directory entry. 0 if not found. */ - /* */ - FT_LOCAL_DEF( TT_Table ) - tt_face_lookup_table( TT_Face face, - FT_ULong tag ) - { - TT_Table entry; - TT_Table limit; -#ifdef FT_DEBUG_LEVEL_TRACE - FT_Bool zero_length = FALSE; -#endif - - - FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ", - face, - (FT_Char)( tag >> 24 ), - (FT_Char)( tag >> 16 ), - (FT_Char)( tag >> 8 ), - (FT_Char)( tag ) )); - - entry = face->dir_tables; - limit = entry + face->num_tables; - - for ( ; entry < limit; entry++ ) - { - /* For compatibility with Windows, we consider */ - /* zero-length tables the same as missing tables. */ - if ( entry->Tag == tag ) - { - if ( entry->Length != 0 ) - { - FT_TRACE4(( "found table.\n" )); - return entry; - } -#ifdef FT_DEBUG_LEVEL_TRACE - zero_length = TRUE; -#endif - } - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( zero_length ) - FT_TRACE4(( "ignoring empty table\n" )); - else - FT_TRACE4(( "could not find table\n" )); -#endif - - return NULL; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_goto_table */ - /* */ - /* <Description> */ - /* Looks for a TrueType table by name, then seek a stream to it. */ - /* */ - /* <Input> */ - /* face :: A face object handle. */ - /* */ - /* tag :: The searched tag. */ - /* */ - /* stream :: The stream to seek when the table is found. */ - /* */ - /* <Output> */ - /* length :: The length of the table if found, undefined otherwise. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_goto_table( TT_Face face, - FT_ULong tag, - FT_Stream stream, - FT_ULong* length ) - { - TT_Table table; - FT_Error error; - - - table = tt_face_lookup_table( face, tag ); - if ( table ) - { - if ( length ) - *length = table->Length; - - if ( FT_STREAM_SEEK( table->Offset ) ) - goto Exit; - } - else - error = FT_THROW( Table_Missing ); - - Exit: - return error; - } - - - /* Here, we */ - /* */ - /* - check that `num_tables' is valid (and adjust it if necessary) */ - /* */ - /* - look for a `head' table, check its size, and parse it to check */ - /* whether its `magic' field is correctly set */ - /* */ - /* - errors (except errors returned by stream handling) */ - /* */ - /* SFNT_Err_Unknown_File_Format: */ - /* no table is defined in directory, it is not sfnt-wrapped */ - /* data */ - /* SFNT_Err_Table_Missing: */ - /* table directory is valid, but essential tables */ - /* (head/bhed/SING) are missing */ - /* */ - static FT_Error - check_table_dir( SFNT_Header sfnt, - FT_Stream stream ) - { - FT_Error error; - FT_UShort nn, valid_entries = 0; - FT_UInt has_head = 0, has_sing = 0, has_meta = 0; - FT_ULong offset = sfnt->offset + 12; - - static const FT_Frame_Field table_dir_entry_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_TableRec - - FT_FRAME_START( 16 ), - FT_FRAME_ULONG( Tag ), - FT_FRAME_ULONG( CheckSum ), - FT_FRAME_ULONG( Offset ), - FT_FRAME_ULONG( Length ), - FT_FRAME_END - }; - - - if ( FT_STREAM_SEEK( offset ) ) - goto Exit; - - for ( nn = 0; nn < sfnt->num_tables; nn++ ) - { - TT_TableRec table; - - - if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) ) - { - nn--; - FT_TRACE2(( "check_table_dir:" - " can read only %d table%s in font (instead of %d)\n", - nn, nn == 1 ? "" : "s", sfnt->num_tables )); - sfnt->num_tables = nn; - break; - } - - /* we ignore invalid tables */ - - if ( table.Offset > stream->size ) - continue; - else if ( table.Length > stream->size - table.Offset ) - { - /* Some tables have such a simple structure that clipping its */ - /* contents is harmless. This also makes FreeType less sensitive */ - /* to invalid table lengths (which programs like Acroread seem to */ - /* ignore in general). */ - - if ( table.Tag == TTAG_hmtx || - table.Tag == TTAG_vmtx ) - valid_entries++; - else - { - FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn )); - continue; - } - } - else - valid_entries++; - - if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed ) - { - FT_UInt32 magic; - - -#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - if ( table.Tag == TTAG_head ) -#endif - has_head = 1; - - /* - * The table length should be 0x36, but certain font tools make it - * 0x38, so we will just check that it is greater. - * - * Note that according to the specification, the table must be - * padded to 32-bit lengths, but this doesn't apply to the value of - * its `Length' field! - * - */ - if ( table.Length < 0x36 ) - { - FT_TRACE2(( "check_table_dir:" - " `head' or `bhed' table too small\n" )); - error = FT_THROW( Table_Missing ); - goto Exit; - } - - if ( FT_STREAM_SEEK( table.Offset + 12 ) || - FT_READ_ULONG( magic ) ) - goto Exit; - - if ( magic != 0x5F0F3CF5UL ) - FT_TRACE2(( "check_table_dir:" - " invalid magic number in `head' or `bhed' table\n")); - - if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) ) - goto Exit; - } - else if ( table.Tag == TTAG_SING ) - has_sing = 1; - else if ( table.Tag == TTAG_META ) - has_meta = 1; - } - - sfnt->num_tables = valid_entries; - - if ( sfnt->num_tables == 0 ) - { - FT_TRACE2(( "check_table_dir: no tables found\n" )); - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - /* if `sing' and `meta' tables are present, there is no `head' table */ - if ( has_head || ( has_sing && has_meta ) ) - { - error = FT_Err_Ok; - goto Exit; - } - else - { - FT_TRACE2(( "check_table_dir:" )); -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - FT_TRACE2(( " neither `head', `bhed', nor `sing' table found\n" )); -#else - FT_TRACE2(( " neither `head' nor `sing' table found\n" )); -#endif - error = FT_THROW( Table_Missing ); - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_font_dir */ - /* */ - /* <Description> */ - /* Loads the header of a SFNT font file. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Output> */ - /* sfnt :: The SFNT header. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The stream cursor must be at the beginning of the font directory. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_font_dir( TT_Face face, - FT_Stream stream ) - { - SFNT_HeaderRec sfnt; - FT_Error error; - FT_Memory memory = stream->memory; - TT_TableRec* entry; - FT_Int nn; - - static const FT_Frame_Field offset_table_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE SFNT_HeaderRec - - FT_FRAME_START( 8 ), - FT_FRAME_USHORT( num_tables ), - FT_FRAME_USHORT( search_range ), - FT_FRAME_USHORT( entry_selector ), - FT_FRAME_USHORT( range_shift ), - FT_FRAME_END - }; - - - FT_TRACE2(( "tt_face_load_font_dir: %08p\n", face )); - - /* read the offset table */ - - sfnt.offset = FT_STREAM_POS(); - - if ( FT_READ_ULONG( sfnt.format_tag ) || - FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) ) - goto Exit; - - /* many fonts don't have these fields set correctly */ -#if 0 - if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 ) || - sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 ) - return FT_THROW( Unknown_File_Format ); -#endif - - /* load the table directory */ - - FT_TRACE2(( "-- Number of tables: %10u\n", sfnt.num_tables )); - FT_TRACE2(( "-- Format version: 0x%08lx\n", sfnt.format_tag )); - - if ( sfnt.format_tag != TTAG_OTTO ) - { - /* check first */ - error = check_table_dir( &sfnt, stream ); - if ( error ) - { - FT_TRACE2(( "tt_face_load_font_dir:" - " invalid table directory for TrueType\n" )); - - goto Exit; - } - } - - face->num_tables = sfnt.num_tables; - face->format_tag = sfnt.format_tag; - - if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) ) - goto Exit; - - if ( FT_STREAM_SEEK( sfnt.offset + 12 ) || - FT_FRAME_ENTER( face->num_tables * 16L ) ) - goto Exit; - - entry = face->dir_tables; - - FT_TRACE2(( "\n" - " tag offset length checksum\n" - " ----------------------------------\n" )); - - for ( nn = 0; nn < sfnt.num_tables; nn++ ) - { - entry->Tag = FT_GET_TAG4(); - entry->CheckSum = FT_GET_ULONG(); - entry->Offset = FT_GET_ULONG(); - entry->Length = FT_GET_ULONG(); - - /* ignore invalid tables that can't be sanitized */ - - if ( entry->Offset > stream->size ) - continue; - else if ( entry->Length > stream->size - entry->Offset ) - { - if ( entry->Tag == TTAG_hmtx || - entry->Tag == TTAG_vmtx ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_ULong old_length = entry->Length; -#endif - - - /* make metrics table length a multiple of 4 */ - entry->Length = ( stream->size - entry->Offset ) & ~3U; - - FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx" - " (sanitized; original length %08lx)\n", - (FT_Char)( entry->Tag >> 24 ), - (FT_Char)( entry->Tag >> 16 ), - (FT_Char)( entry->Tag >> 8 ), - (FT_Char)( entry->Tag ), - entry->Offset, - entry->Length, - entry->CheckSum, - old_length )); - entry++; - } - else - continue; - } - else - { - FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx\n", - (FT_Char)( entry->Tag >> 24 ), - (FT_Char)( entry->Tag >> 16 ), - (FT_Char)( entry->Tag >> 8 ), - (FT_Char)( entry->Tag ), - entry->Offset, - entry->Length, - entry->CheckSum )); - entry++; - } - } - - FT_FRAME_EXIT(); - - FT_TRACE2(( "table directory loaded\n\n" )); - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_any */ - /* */ - /* <Description> */ - /* Loads any font table into client memory. */ - /* */ - /* <Input> */ - /* face :: The face object to look for. */ - /* */ - /* tag :: The tag of table to load. Use the value 0 if you want */ - /* to access the whole font file, else set this parameter */ - /* to a valid TrueType table tag that you can forge with */ - /* the MAKE_TT_TAG macro. */ - /* */ - /* offset :: The starting offset in the table (or the file if */ - /* tag == 0). */ - /* */ - /* length :: The address of the decision variable: */ - /* */ - /* If length == NULL: */ - /* Loads the whole table. Returns an error if */ - /* `offset' == 0! */ - /* */ - /* If *length == 0: */ - /* Exits immediately; returning the length of the given */ - /* table or of the font file, depending on the value of */ - /* `tag'. */ - /* */ - /* If *length != 0: */ - /* Loads the next `length' bytes of table or font, */ - /* starting at offset `offset' (in table or font too). */ - /* */ - /* <Output> */ - /* buffer :: The address of target buffer. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_any( TT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte* buffer, - FT_ULong* length ) - { - FT_Error error; - FT_Stream stream; - TT_Table table; - FT_ULong size; - - - if ( tag != 0 ) - { - /* look for tag in font directory */ - table = tt_face_lookup_table( face, tag ); - if ( !table ) - { - error = FT_THROW( Table_Missing ); - goto Exit; - } - - offset += table->Offset; - size = table->Length; - } - else - /* tag == 0 -- the user wants to access the font file directly */ - size = face->root.stream->size; - - if ( length && *length == 0 ) - { - *length = size; - - return FT_Err_Ok; - } - - if ( length ) - size = *length; - - stream = face->root.stream; - /* the `if' is syntactic sugar for picky compilers */ - if ( FT_STREAM_READ_AT( offset, buffer, size ) ) - goto Exit; - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_generic_header */ - /* */ - /* <Description> */ - /* Loads the TrueType table `head' or `bhed'. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - tt_face_load_generic_header( TT_Face face, - FT_Stream stream, - FT_ULong tag ) - { - FT_Error error; - TT_Header* header; - - static const FT_Frame_Field header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_Header - - FT_FRAME_START( 54 ), - FT_FRAME_ULONG ( Table_Version ), - FT_FRAME_ULONG ( Font_Revision ), - FT_FRAME_LONG ( CheckSum_Adjust ), - FT_FRAME_LONG ( Magic_Number ), - FT_FRAME_USHORT( Flags ), - FT_FRAME_USHORT( Units_Per_EM ), - FT_FRAME_LONG ( Created[0] ), - FT_FRAME_LONG ( Created[1] ), - FT_FRAME_LONG ( Modified[0] ), - FT_FRAME_LONG ( Modified[1] ), - FT_FRAME_SHORT ( xMin ), - FT_FRAME_SHORT ( yMin ), - FT_FRAME_SHORT ( xMax ), - FT_FRAME_SHORT ( yMax ), - FT_FRAME_USHORT( Mac_Style ), - FT_FRAME_USHORT( Lowest_Rec_PPEM ), - FT_FRAME_SHORT ( Font_Direction ), - FT_FRAME_SHORT ( Index_To_Loc_Format ), - FT_FRAME_SHORT ( Glyph_Data_Format ), - FT_FRAME_END - }; - - - error = face->goto_table( face, tag, stream, 0 ); - if ( error ) - goto Exit; - - header = &face->header; - - if ( FT_STREAM_READ_FIELDS( header_fields, header ) ) - goto Exit; - - FT_TRACE3(( "Units per EM: %4u\n", header->Units_Per_EM )); - FT_TRACE3(( "IndexToLoc: %4d\n", header->Index_To_Loc_Format )); - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_head( TT_Face face, - FT_Stream stream ) - { - return tt_face_load_generic_header( face, stream, TTAG_head ); - } - - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_bhed( TT_Face face, - FT_Stream stream ) - { - return tt_face_load_generic_header( face, stream, TTAG_bhed ); - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_max_profile */ - /* */ - /* <Description> */ - /* Loads the maximum profile into a face object. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_maxp( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - TT_MaxProfile* maxProfile = &face->max_profile; - - static const FT_Frame_Field maxp_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_MaxProfile - - FT_FRAME_START( 6 ), - FT_FRAME_LONG ( version ), - FT_FRAME_USHORT( numGlyphs ), - FT_FRAME_END - }; - - static const FT_Frame_Field maxp_fields_extra[] = - { - FT_FRAME_START( 26 ), - FT_FRAME_USHORT( maxPoints ), - FT_FRAME_USHORT( maxContours ), - FT_FRAME_USHORT( maxCompositePoints ), - FT_FRAME_USHORT( maxCompositeContours ), - FT_FRAME_USHORT( maxZones ), - FT_FRAME_USHORT( maxTwilightPoints ), - FT_FRAME_USHORT( maxStorage ), - FT_FRAME_USHORT( maxFunctionDefs ), - FT_FRAME_USHORT( maxInstructionDefs ), - FT_FRAME_USHORT( maxStackElements ), - FT_FRAME_USHORT( maxSizeOfInstructions ), - FT_FRAME_USHORT( maxComponentElements ), - FT_FRAME_USHORT( maxComponentDepth ), - FT_FRAME_END - }; - - - error = face->goto_table( face, TTAG_maxp, stream, 0 ); - if ( error ) - goto Exit; - - if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) ) - goto Exit; - - maxProfile->maxPoints = 0; - maxProfile->maxContours = 0; - maxProfile->maxCompositePoints = 0; - maxProfile->maxCompositeContours = 0; - maxProfile->maxZones = 0; - maxProfile->maxTwilightPoints = 0; - maxProfile->maxStorage = 0; - maxProfile->maxFunctionDefs = 0; - maxProfile->maxInstructionDefs = 0; - maxProfile->maxStackElements = 0; - maxProfile->maxSizeOfInstructions = 0; - maxProfile->maxComponentElements = 0; - maxProfile->maxComponentDepth = 0; - - if ( maxProfile->version >= 0x10000L ) - { - if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) ) - goto Exit; - - /* XXX: an adjustment that is necessary to load certain */ - /* broken fonts like `Keystrokes MT' :-( */ - /* */ - /* We allocate 64 function entries by default when */ - /* the maxFunctionDefs value is smaller. */ - - if ( maxProfile->maxFunctionDefs < 64 ) - maxProfile->maxFunctionDefs = 64; - - /* we add 4 phantom points later */ - if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) ) - { - FT_TRACE0(( "tt_face_load_maxp:" - " too much twilight points in `maxp' table;\n" - " " - " some glyphs might be rendered incorrectly\n" )); - - maxProfile->maxTwilightPoints = 0xFFFFU - 4; - } - - /* we arbitrarily limit recursion to avoid stack exhaustion */ - if ( maxProfile->maxComponentDepth > 100 ) - { - FT_TRACE0(( "tt_face_load_maxp:" - " abnormally large component depth (%d) set to 100\n", - maxProfile->maxComponentDepth )); - maxProfile->maxComponentDepth = 100; - } - } - - FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs )); - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_name */ - /* */ - /* <Description> */ - /* Loads the name records. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_name( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - FT_Memory memory = stream->memory; - FT_ULong table_pos, table_len; - FT_ULong storage_start, storage_limit; - FT_UInt count; - TT_NameTable table; - - static const FT_Frame_Field name_table_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_NameTableRec - - FT_FRAME_START( 6 ), - FT_FRAME_USHORT( format ), - FT_FRAME_USHORT( numNameRecords ), - FT_FRAME_USHORT( storageOffset ), - FT_FRAME_END - }; - - static const FT_Frame_Field name_record_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_NameEntryRec - - /* no FT_FRAME_START */ - FT_FRAME_USHORT( platformID ), - FT_FRAME_USHORT( encodingID ), - FT_FRAME_USHORT( languageID ), - FT_FRAME_USHORT( nameID ), - FT_FRAME_USHORT( stringLength ), - FT_FRAME_USHORT( stringOffset ), - FT_FRAME_END - }; - - - table = &face->name_table; - table->stream = stream; - - error = face->goto_table( face, TTAG_name, stream, &table_len ); - if ( error ) - goto Exit; - - table_pos = FT_STREAM_POS(); - - - if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) ) - goto Exit; - - /* Some popular Asian fonts have an invalid `storageOffset' value */ - /* (it should be at least "6 + 12*num_names"). However, the string */ - /* offsets, computed as "storageOffset + entry->stringOffset", are */ - /* valid pointers within the name table... */ - /* */ - /* We thus can't check `storageOffset' right now. */ - /* */ - storage_start = table_pos + 6 + 12*table->numNameRecords; - storage_limit = table_pos + table_len; - - if ( storage_start > storage_limit ) - { - FT_ERROR(( "tt_face_load_name: invalid `name' table\n" )); - error = FT_THROW( Name_Table_Missing ); - goto Exit; - } - - /* Allocate the array of name records. */ - count = table->numNameRecords; - table->numNameRecords = 0; - - if ( FT_NEW_ARRAY( table->names, count ) || - FT_FRAME_ENTER( count * 12 ) ) - goto Exit; - - /* Load the name records and determine how much storage is needed */ - /* to hold the strings themselves. */ - { - TT_NameEntryRec* entry = table->names; - - - for ( ; count > 0; count-- ) - { - if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) ) - continue; - - /* check that the name is not empty */ - if ( entry->stringLength == 0 ) - continue; - - /* check that the name string is within the table */ - entry->stringOffset += table_pos + table->storageOffset; - if ( entry->stringOffset < storage_start || - entry->stringOffset + entry->stringLength > storage_limit ) - { - /* invalid entry - ignore it */ - entry->stringOffset = 0; - entry->stringLength = 0; - continue; - } - - entry++; - } - - table->numNameRecords = (FT_UInt)( entry - table->names ); - } - - FT_FRAME_EXIT(); - - /* everything went well, update face->num_names */ - face->num_names = (FT_UShort) table->numNameRecords; - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_free_names */ - /* */ - /* <Description> */ - /* Frees the name records. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - FT_LOCAL_DEF( void ) - tt_face_free_name( TT_Face face ) - { - FT_Memory memory = face->root.driver->root.memory; - TT_NameTable table = &face->name_table; - TT_NameEntry entry = table->names; - FT_UInt count = table->numNameRecords; - - - if ( table->names ) - { - for ( ; count > 0; count--, entry++ ) - { - FT_FREE( entry->string ); - entry->stringLength = 0; - } - - /* free strings table */ - FT_FREE( table->names ); - } - - table->numNameRecords = 0; - table->format = 0; - table->storageOffset = 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_cmap */ - /* */ - /* <Description> */ - /* Loads the cmap directory in a face object. The cmaps themselves */ - /* are loaded on demand in the `ttcmap.c' module. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_cmap( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - - - error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size ); - if ( error ) - goto Exit; - - if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) ) - face->cmap_size = 0; - - Exit: - return error; - } - - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_os2 */ - /* */ - /* <Description> */ - /* Loads the OS2 table. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_os2( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - TT_OS2* os2; - - static const FT_Frame_Field os2_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_OS2 - - FT_FRAME_START( 78 ), - FT_FRAME_USHORT( version ), - FT_FRAME_SHORT ( xAvgCharWidth ), - FT_FRAME_USHORT( usWeightClass ), - FT_FRAME_USHORT( usWidthClass ), - FT_FRAME_SHORT ( fsType ), - FT_FRAME_SHORT ( ySubscriptXSize ), - FT_FRAME_SHORT ( ySubscriptYSize ), - FT_FRAME_SHORT ( ySubscriptXOffset ), - FT_FRAME_SHORT ( ySubscriptYOffset ), - FT_FRAME_SHORT ( ySuperscriptXSize ), - FT_FRAME_SHORT ( ySuperscriptYSize ), - FT_FRAME_SHORT ( ySuperscriptXOffset ), - FT_FRAME_SHORT ( ySuperscriptYOffset ), - FT_FRAME_SHORT ( yStrikeoutSize ), - FT_FRAME_SHORT ( yStrikeoutPosition ), - FT_FRAME_SHORT ( sFamilyClass ), - FT_FRAME_BYTE ( panose[0] ), - FT_FRAME_BYTE ( panose[1] ), - FT_FRAME_BYTE ( panose[2] ), - FT_FRAME_BYTE ( panose[3] ), - FT_FRAME_BYTE ( panose[4] ), - FT_FRAME_BYTE ( panose[5] ), - FT_FRAME_BYTE ( panose[6] ), - FT_FRAME_BYTE ( panose[7] ), - FT_FRAME_BYTE ( panose[8] ), - FT_FRAME_BYTE ( panose[9] ), - FT_FRAME_ULONG ( ulUnicodeRange1 ), - FT_FRAME_ULONG ( ulUnicodeRange2 ), - FT_FRAME_ULONG ( ulUnicodeRange3 ), - FT_FRAME_ULONG ( ulUnicodeRange4 ), - FT_FRAME_BYTE ( achVendID[0] ), - FT_FRAME_BYTE ( achVendID[1] ), - FT_FRAME_BYTE ( achVendID[2] ), - FT_FRAME_BYTE ( achVendID[3] ), - - FT_FRAME_USHORT( fsSelection ), - FT_FRAME_USHORT( usFirstCharIndex ), - FT_FRAME_USHORT( usLastCharIndex ), - FT_FRAME_SHORT ( sTypoAscender ), - FT_FRAME_SHORT ( sTypoDescender ), - FT_FRAME_SHORT ( sTypoLineGap ), - FT_FRAME_USHORT( usWinAscent ), - FT_FRAME_USHORT( usWinDescent ), - FT_FRAME_END - }; - - /* `OS/2' version 1 and newer */ - static const FT_Frame_Field os2_fields_extra1[] = - { - FT_FRAME_START( 8 ), - FT_FRAME_ULONG( ulCodePageRange1 ), - FT_FRAME_ULONG( ulCodePageRange2 ), - FT_FRAME_END - }; - - /* `OS/2' version 2 and newer */ - static const FT_Frame_Field os2_fields_extra2[] = - { - FT_FRAME_START( 10 ), - FT_FRAME_SHORT ( sxHeight ), - FT_FRAME_SHORT ( sCapHeight ), - FT_FRAME_USHORT( usDefaultChar ), - FT_FRAME_USHORT( usBreakChar ), - FT_FRAME_USHORT( usMaxContext ), - FT_FRAME_END - }; - - /* `OS/2' version 5 and newer */ - static const FT_Frame_Field os2_fields_extra5[] = - { - FT_FRAME_START( 4 ), - FT_FRAME_USHORT( usLowerOpticalPointSize ), - FT_FRAME_USHORT( usUpperOpticalPointSize ), - FT_FRAME_END - }; - - - /* We now support old Mac fonts where the OS/2 table doesn't */ - /* exist. Simply put, we set the `version' field to 0xFFFF */ - /* and test this value each time we need to access the table. */ - error = face->goto_table( face, TTAG_OS2, stream, 0 ); - if ( error ) - goto Exit; - - os2 = &face->os2; - - if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) ) - goto Exit; - - os2->ulCodePageRange1 = 0; - os2->ulCodePageRange2 = 0; - os2->sxHeight = 0; - os2->sCapHeight = 0; - os2->usDefaultChar = 0; - os2->usBreakChar = 0; - os2->usMaxContext = 0; - os2->usLowerOpticalPointSize = 0; - os2->usUpperOpticalPointSize = 0xFFFF; - - if ( os2->version >= 0x0001 ) - { - /* only version 1 tables */ - if ( FT_STREAM_READ_FIELDS( os2_fields_extra1, os2 ) ) - goto Exit; - - if ( os2->version >= 0x0002 ) - { - /* only version 2 tables */ - if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) ) - goto Exit; - - if ( os2->version >= 0x0005 ) - { - /* only version 5 tables */ - if ( FT_STREAM_READ_FIELDS( os2_fields_extra5, os2 ) ) - goto Exit; - } - } - } - - FT_TRACE3(( "sTypoAscender: %4d\n", os2->sTypoAscender )); - FT_TRACE3(( "sTypoDescender: %4d\n", os2->sTypoDescender )); - FT_TRACE3(( "usWinAscent: %4u\n", os2->usWinAscent )); - FT_TRACE3(( "usWinDescent: %4u\n", os2->usWinDescent )); - FT_TRACE3(( "fsSelection: 0x%2x\n", os2->fsSelection )); - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_postscript */ - /* */ - /* <Description> */ - /* Loads the Postscript table. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_post( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - TT_Postscript* post = &face->postscript; - - static const FT_Frame_Field post_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_Postscript - - FT_FRAME_START( 32 ), - FT_FRAME_ULONG( FormatType ), - FT_FRAME_ULONG( italicAngle ), - FT_FRAME_SHORT( underlinePosition ), - FT_FRAME_SHORT( underlineThickness ), - FT_FRAME_ULONG( isFixedPitch ), - FT_FRAME_ULONG( minMemType42 ), - FT_FRAME_ULONG( maxMemType42 ), - FT_FRAME_ULONG( minMemType1 ), - FT_FRAME_ULONG( maxMemType1 ), - FT_FRAME_END - }; - - - error = face->goto_table( face, TTAG_post, stream, 0 ); - if ( error ) - return error; - - if ( FT_STREAM_READ_FIELDS( post_fields, post ) ) - return error; - - /* we don't load the glyph names, we do that in another */ - /* module (ttpost). */ - - FT_TRACE3(( "FormatType: 0x%x\n", post->FormatType )); - FT_TRACE3(( "isFixedPitch: %s\n", post->isFixedPitch - ? " yes" : " no" )); - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_pclt */ - /* */ - /* <Description> */ - /* Loads the PCL 5 Table. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_pclt( TT_Face face, - FT_Stream stream ) - { - static const FT_Frame_Field pclt_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_PCLT - - FT_FRAME_START( 54 ), - FT_FRAME_ULONG ( Version ), - FT_FRAME_ULONG ( FontNumber ), - FT_FRAME_USHORT( Pitch ), - FT_FRAME_USHORT( xHeight ), - FT_FRAME_USHORT( Style ), - FT_FRAME_USHORT( TypeFamily ), - FT_FRAME_USHORT( CapHeight ), - FT_FRAME_USHORT( SymbolSet ), - FT_FRAME_BYTES ( TypeFace, 16 ), - FT_FRAME_BYTES ( CharacterComplement, 8 ), - FT_FRAME_BYTES ( FileName, 6 ), - FT_FRAME_CHAR ( StrokeWeight ), - FT_FRAME_CHAR ( WidthType ), - FT_FRAME_BYTE ( SerifStyle ), - FT_FRAME_BYTE ( Reserved ), - FT_FRAME_END - }; - - FT_Error error; - TT_PCLT* pclt = &face->pclt; - - - /* optional table */ - error = face->goto_table( face, TTAG_PCLT, stream, 0 ); - if ( error ) - goto Exit; - - if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) ) - goto Exit; - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_gasp */ - /* */ - /* <Description> */ - /* Loads the `gasp' table into a face object. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_gasp( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - FT_Memory memory = stream->memory; - - FT_UInt j,num_ranges; - TT_GaspRange gaspranges = NULL; - - - /* the gasp table is optional */ - error = face->goto_table( face, TTAG_gasp, stream, 0 ); - if ( error ) - goto Exit; - - if ( FT_FRAME_ENTER( 4L ) ) - goto Exit; - - face->gasp.version = FT_GET_USHORT(); - face->gasp.numRanges = FT_GET_USHORT(); - - FT_FRAME_EXIT(); - - /* only support versions 0 and 1 of the table */ - if ( face->gasp.version >= 2 ) - { - face->gasp.numRanges = 0; - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - num_ranges = face->gasp.numRanges; - FT_TRACE3(( "numRanges: %u\n", num_ranges )); - - if ( FT_QNEW_ARRAY( face->gasp.gaspRanges, num_ranges ) || - FT_FRAME_ENTER( num_ranges * 4L ) ) - goto Exit; - - gaspranges = face->gasp.gaspRanges; - - for ( j = 0; j < num_ranges; j++ ) - { - gaspranges[j].maxPPEM = FT_GET_USHORT(); - gaspranges[j].gaspFlag = FT_GET_USHORT(); - - FT_TRACE3(( "gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\n", - j, - gaspranges[j].maxPPEM, - gaspranges[j].gaspFlag )); - } - - FT_FRAME_EXIT(); - - Exit: - return error; - } - - -/* END */ diff --git a/3party/freetype/src/sfnt/ttload.h b/3party/freetype/src/sfnt/ttload.h deleted file mode 100644 index a6d91c5b70..0000000000 --- a/3party/freetype/src/sfnt/ttload.h +++ /dev/null @@ -1,112 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttload.h */ -/* */ -/* Load the basic TrueType tables, i.e., tables that can be either in */ -/* TTF or OTF fonts (specification). */ -/* */ -/* Copyright 1996-2015 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 __TTLOAD_H__ -#define __TTLOAD_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( TT_Table ) - tt_face_lookup_table( TT_Face face, - FT_ULong tag ); - - FT_LOCAL( FT_Error ) - tt_face_goto_table( TT_Face face, - FT_ULong tag, - FT_Stream stream, - FT_ULong* length ); - - - FT_LOCAL( FT_Error ) - tt_face_load_font_dir( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_any( TT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte* buffer, - FT_ULong* length ); - - - FT_LOCAL( FT_Error ) - tt_face_load_head( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_cmap( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_maxp( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_name( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_os2( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_post( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_pclt( TT_Face face, - FT_Stream stream ); - - FT_LOCAL( void ) - tt_face_free_name( TT_Face face ); - - - FT_LOCAL( FT_Error ) - tt_face_load_gasp( TT_Face face, - FT_Stream stream ); - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - FT_LOCAL( FT_Error ) - tt_face_load_bhed( TT_Face face, - FT_Stream stream ); - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - -FT_END_HEADER - -#endif /* __TTLOAD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/sfnt/ttmtx.c b/3party/freetype/src/sfnt/ttmtx.c deleted file mode 100644 index 58309aa496..0000000000 --- a/3party/freetype/src/sfnt/ttmtx.c +++ /dev/null @@ -1,280 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttmtx.c */ -/* */ -/* Load the metrics tables common to TTF and OTF fonts (body). */ -/* */ -/* Copyright 2006-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include "ttmtx.h" - -#include "sferrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttmtx - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_hmtx */ - /* */ - /* <Description> */ - /* Load the `hmtx' or `vmtx' table into a face object. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* vertical :: A boolean flag. If set, load `vmtx'. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_hmtx( TT_Face face, - FT_Stream stream, - FT_Bool vertical ) - { - FT_Error error; - FT_ULong tag, table_size; - FT_ULong* ptable_offset; - FT_ULong* ptable_size; - - - if ( vertical ) - { - tag = TTAG_vmtx; - ptable_offset = &face->vert_metrics_offset; - ptable_size = &face->vert_metrics_size; - } - else - { - tag = TTAG_hmtx; - ptable_offset = &face->horz_metrics_offset; - ptable_size = &face->horz_metrics_size; - } - - error = face->goto_table( face, tag, stream, &table_size ); - if ( error ) - goto Fail; - - *ptable_size = table_size; - *ptable_offset = FT_STREAM_POS(); - - Fail: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_hhea */ - /* */ - /* <Description> */ - /* Load the `hhea' or 'vhea' table into a face object. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* vertical :: A boolean flag. If set, load `vhea'. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_hhea( TT_Face face, - FT_Stream stream, - FT_Bool vertical ) - { - FT_Error error; - TT_HoriHeader* header; - - static const FT_Frame_Field metrics_header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_HoriHeader - - FT_FRAME_START( 36 ), - FT_FRAME_ULONG ( Version ), - FT_FRAME_SHORT ( Ascender ), - FT_FRAME_SHORT ( Descender ), - FT_FRAME_SHORT ( Line_Gap ), - FT_FRAME_USHORT( advance_Width_Max ), - FT_FRAME_SHORT ( min_Left_Side_Bearing ), - FT_FRAME_SHORT ( min_Right_Side_Bearing ), - FT_FRAME_SHORT ( xMax_Extent ), - FT_FRAME_SHORT ( caret_Slope_Rise ), - FT_FRAME_SHORT ( caret_Slope_Run ), - FT_FRAME_SHORT ( caret_Offset ), - FT_FRAME_SHORT ( Reserved[0] ), - FT_FRAME_SHORT ( Reserved[1] ), - FT_FRAME_SHORT ( Reserved[2] ), - FT_FRAME_SHORT ( Reserved[3] ), - FT_FRAME_SHORT ( metric_Data_Format ), - FT_FRAME_USHORT( number_Of_HMetrics ), - FT_FRAME_END - }; - - - if ( vertical ) - { - void *v = &face->vertical; - - - error = face->goto_table( face, TTAG_vhea, stream, 0 ); - if ( error ) - goto Fail; - - header = (TT_HoriHeader*)v; - } - else - { - error = face->goto_table( face, TTAG_hhea, stream, 0 ); - if ( error ) - goto Fail; - - header = &face->horizontal; - } - - if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) ) - goto Fail; - - FT_TRACE3(( "Ascender: %5d\n", header->Ascender )); - FT_TRACE3(( "Descender: %5d\n", header->Descender )); - FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics )); - - header->long_metrics = NULL; - header->short_metrics = NULL; - - Fail: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_get_metrics */ - /* */ - /* <Description> */ - /* Return the horizontal or vertical metrics in font units for a */ - /* given glyph. The values are the left side bearing (top side */ - /* bearing for vertical metrics) and advance width (advance height */ - /* for vertical metrics). */ - /* */ - /* <Input> */ - /* face :: A pointer to the TrueType face structure. */ - /* */ - /* vertical :: If set to TRUE, get vertical metrics. */ - /* */ - /* gindex :: The glyph index. */ - /* */ - /* <Output> */ - /* abearing :: The bearing, either left side or top side. */ - /* */ - /* aadvance :: The advance width or advance height, depending on */ - /* the `vertical' flag. */ - /* */ - FT_LOCAL_DEF( void ) - tt_face_get_metrics( TT_Face face, - FT_Bool vertical, - FT_UInt gindex, - FT_Short *abearing, - FT_UShort *aadvance ) - { - FT_Error error; - FT_Stream stream = face->root.stream; - TT_HoriHeader* header; - FT_ULong table_pos, table_size, table_end; - FT_UShort k; - - - if ( vertical ) - { - void* v = &face->vertical; - - - header = (TT_HoriHeader*)v; - table_pos = face->vert_metrics_offset; - table_size = face->vert_metrics_size; - } - else - { - header = &face->horizontal; - table_pos = face->horz_metrics_offset; - table_size = face->horz_metrics_size; - } - - table_end = table_pos + table_size; - - k = header->number_Of_HMetrics; - - if ( k > 0 ) - { - if ( gindex < (FT_UInt)k ) - { - table_pos += 4 * gindex; - if ( table_pos + 4 > table_end ) - goto NoData; - - if ( FT_STREAM_SEEK( table_pos ) || - FT_READ_USHORT( *aadvance ) || - FT_READ_SHORT( *abearing ) ) - goto NoData; - } - else - { - table_pos += 4 * ( k - 1 ); - if ( table_pos + 4 > table_end ) - goto NoData; - - if ( FT_STREAM_SEEK( table_pos ) || - FT_READ_USHORT( *aadvance ) ) - goto NoData; - - table_pos += 4 + 2 * ( gindex - k ); - if ( table_pos + 2 > table_end ) - *abearing = 0; - else - { - if ( !FT_STREAM_SEEK( table_pos ) ) - (void)FT_READ_SHORT( *abearing ); - } - } - } - else - { - NoData: - *abearing = 0; - *aadvance = 0; - } - } - - -/* END */ diff --git a/3party/freetype/src/sfnt/ttmtx.h b/3party/freetype/src/sfnt/ttmtx.h deleted file mode 100644 index 096ee062cf..0000000000 --- a/3party/freetype/src/sfnt/ttmtx.h +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttmtx.h */ -/* */ -/* Load the metrics tables common to TTF and OTF fonts (specification). */ -/* */ -/* Copyright 2006-2015 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 __TTMTX_H__ -#define __TTMTX_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - tt_face_load_hhea( TT_Face face, - FT_Stream stream, - FT_Bool vertical ); - - - FT_LOCAL( FT_Error ) - tt_face_load_hmtx( TT_Face face, - FT_Stream stream, - FT_Bool vertical ); - - - FT_LOCAL( void ) - tt_face_get_metrics( TT_Face face, - FT_Bool vertical, - FT_UInt gindex, - FT_Short* abearing, - FT_UShort* aadvance ); - -FT_END_HEADER - -#endif /* __TTMTX_H__ */ - - -/* END */ diff --git a/3party/freetype/src/sfnt/ttpost.c b/3party/freetype/src/sfnt/ttpost.c deleted file mode 100644 index 8d29d1e9f6..0000000000 --- a/3party/freetype/src/sfnt/ttpost.c +++ /dev/null @@ -1,563 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpost.c */ -/* */ -/* Postcript name table processing for TrueType and OpenType fonts */ -/* (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* The post table is not completely loaded by the core engine. This */ - /* file loads the missing PS glyph names and implements an API to access */ - /* them. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include "ttpost.h" - -#include "sferrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttpost - - - /* If this configuration macro is defined, we rely on the `PSNames' */ - /* module to grab the glyph names. */ - -#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES - - -#include FT_SERVICE_POSTSCRIPT_CMAPS_H - -#define MAC_NAME( x ) (FT_String*)psnames->macintosh_name( (FT_UInt)(x) ) - - -#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ - - - /* Otherwise, we ignore the `PSNames' module, and provide our own */ - /* table of Mac names. Thus, it is possible to build a version of */ - /* FreeType without the Type 1 driver & PSNames module. */ - -#define MAC_NAME( x ) (FT_String*)tt_post_default_names[x] - - /* the 258 default Mac PS glyph names; see file `tools/glnames.py' */ - - static const FT_String* const tt_post_default_names[258] = - { - /* 0 */ - ".notdef", ".null", "nonmarkingreturn", "space", "exclam", - "quotedbl", "numbersign", "dollar", "percent", "ampersand", - /* 10 */ - "quotesingle", "parenleft", "parenright", "asterisk", "plus", - "comma", "hyphen", "period", "slash", "zero", - /* 20 */ - "one", "two", "three", "four", "five", - "six", "seven", "eight", "nine", "colon", - /* 30 */ - "semicolon", "less", "equal", "greater", "question", - "at", "A", "B", "C", "D", - /* 40 */ - "E", "F", "G", "H", "I", - "J", "K", "L", "M", "N", - /* 50 */ - "O", "P", "Q", "R", "S", - "T", "U", "V", "W", "X", - /* 60 */ - "Y", "Z", "bracketleft", "backslash", "bracketright", - "asciicircum", "underscore", "grave", "a", "b", - /* 70 */ - "c", "d", "e", "f", "g", - "h", "i", "j", "k", "l", - /* 80 */ - "m", "n", "o", "p", "q", - "r", "s", "t", "u", "v", - /* 90 */ - "w", "x", "y", "z", "braceleft", - "bar", "braceright", "asciitilde", "Adieresis", "Aring", - /* 100 */ - "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", - "aacute", "agrave", "acircumflex", "adieresis", "atilde", - /* 110 */ - "aring", "ccedilla", "eacute", "egrave", "ecircumflex", - "edieresis", "iacute", "igrave", "icircumflex", "idieresis", - /* 120 */ - "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", - "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", - /* 130 */ - "dagger", "degree", "cent", "sterling", "section", - "bullet", "paragraph", "germandbls", "registered", "copyright", - /* 140 */ - "trademark", "acute", "dieresis", "notequal", "AE", - "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", - /* 150 */ - "yen", "mu", "partialdiff", "summation", "product", - "pi", "integral", "ordfeminine", "ordmasculine", "Omega", - /* 160 */ - "ae", "oslash", "questiondown", "exclamdown", "logicalnot", - "radical", "florin", "approxequal", "Delta", "guillemotleft", - /* 170 */ - "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", - "Otilde", "OE", "oe", "endash", "emdash", - /* 180 */ - "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", - "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", - /* 190 */ - "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", - "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", - /* 200 */ - "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", - "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", - /* 210 */ - "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", - "dotlessi", "circumflex", "tilde", "macron", "breve", - /* 220 */ - "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", - "caron", "Lslash", "lslash", "Scaron", "scaron", - /* 230 */ - "Zcaron", "zcaron", "brokenbar", "Eth", "eth", - "Yacute", "yacute", "Thorn", "thorn", "minus", - /* 240 */ - "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", - "onequarter", "threequarters", "franc", "Gbreve", "gbreve", - /* 250 */ - "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute", - "Ccaron", "ccaron", "dcroat", - }; - - -#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ - - - static FT_Error - load_format_20( TT_Face face, - FT_Stream stream, - FT_ULong post_limit ) - { - FT_Memory memory = stream->memory; - FT_Error error; - - FT_Int num_glyphs; - FT_UShort num_names; - - FT_UShort* glyph_indices = NULL; - FT_Char** name_strings = NULL; - - - if ( FT_READ_USHORT( num_glyphs ) ) - goto Exit; - - /* UNDOCUMENTED! The number of glyphs in this table can be smaller */ - /* than the value in the maxp table (cf. cyberbit.ttf). */ - - /* There already exist fonts which have more than 32768 glyph names */ - /* in this table, so the test for this threshold has been dropped. */ - - if ( num_glyphs > face->max_profile.numGlyphs ) - { - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* load the indices */ - { - FT_Int n; - - - if ( FT_NEW_ARRAY ( glyph_indices, num_glyphs ) || - FT_FRAME_ENTER( num_glyphs * 2L ) ) - goto Fail; - - for ( n = 0; n < num_glyphs; n++ ) - glyph_indices[n] = FT_GET_USHORT(); - - FT_FRAME_EXIT(); - } - - /* compute number of names stored in table */ - { - FT_Int n; - - - num_names = 0; - - for ( n = 0; n < num_glyphs; n++ ) - { - FT_Int idx; - - - idx = glyph_indices[n]; - if ( idx >= 258 ) - { - idx -= 257; - if ( idx > num_names ) - num_names = (FT_UShort)idx; - } - } - } - - /* now load the name strings */ - { - FT_UShort n; - - - if ( FT_NEW_ARRAY( name_strings, num_names ) ) - goto Fail; - - for ( n = 0; n < num_names; n++ ) - { - FT_UInt len; - - - if ( FT_STREAM_POS() >= post_limit ) - break; - else - { - FT_TRACE6(( "load_format_20: %d byte left in post table\n", - post_limit - FT_STREAM_POS() )); - - if ( FT_READ_BYTE( len ) ) - goto Fail1; - } - - if ( len > post_limit || - FT_STREAM_POS() > post_limit - len ) - { - FT_Int d = (FT_Int)post_limit - (FT_Int)FT_STREAM_POS(); - - - FT_ERROR(( "load_format_20:" - " exceeding string length (%d)," - " truncating at end of post table (%d byte left)\n", - len, d )); - len = (FT_UInt)FT_MAX( 0, d ); - } - - if ( FT_NEW_ARRAY( name_strings[n], len + 1 ) || - FT_STREAM_READ( name_strings[n], len ) ) - goto Fail1; - - name_strings[n][len] = '\0'; - } - - if ( n < num_names ) - { - FT_ERROR(( "load_format_20:" - " all entries in post table are already parsed," - " using NULL names for gid %d - %d\n", - n, num_names - 1 )); - for ( ; n < num_names; n++ ) - if ( FT_NEW_ARRAY( name_strings[n], 1 ) ) - goto Fail1; - else - name_strings[n][0] = '\0'; - } - } - - /* all right, set table fields and exit successfully */ - { - TT_Post_20 table = &face->postscript_names.names.format_20; - - - table->num_glyphs = (FT_UShort)num_glyphs; - table->num_names = (FT_UShort)num_names; - table->glyph_indices = glyph_indices; - table->glyph_names = name_strings; - } - return FT_Err_Ok; - - Fail1: - { - FT_UShort n; - - - for ( n = 0; n < num_names; n++ ) - FT_FREE( name_strings[n] ); - } - - Fail: - FT_FREE( name_strings ); - FT_FREE( glyph_indices ); - - Exit: - return error; - } - - - static FT_Error - load_format_25( TT_Face face, - FT_Stream stream, - FT_ULong post_limit ) - { - FT_Memory memory = stream->memory; - FT_Error error; - - FT_Int num_glyphs; - FT_Char* offset_table = NULL; - - FT_UNUSED( post_limit ); - - - /* UNDOCUMENTED! This value appears only in the Apple TT specs. */ - if ( FT_READ_USHORT( num_glyphs ) ) - goto Exit; - - /* check the number of glyphs */ - if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 ) - { - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - if ( FT_NEW_ARRAY( offset_table, num_glyphs ) || - FT_STREAM_READ( offset_table, num_glyphs ) ) - goto Fail; - - /* now check the offset table */ - { - FT_Int n; - - - for ( n = 0; n < num_glyphs; n++ ) - { - FT_Long idx = (FT_Long)n + offset_table[n]; - - - if ( idx < 0 || idx > num_glyphs ) - { - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - } - } - - /* OK, set table fields and exit successfully */ - { - TT_Post_25 table = &face->postscript_names.names.format_25; - - - table->num_glyphs = (FT_UShort)num_glyphs; - table->offsets = offset_table; - } - - return FT_Err_Ok; - - Fail: - FT_FREE( offset_table ); - - Exit: - return error; - } - - - static FT_Error - load_post_names( TT_Face face ) - { - FT_Stream stream; - FT_Error error; - FT_Fixed format; - FT_ULong post_len; - FT_ULong post_limit; - - - /* get a stream for the face's resource */ - stream = face->root.stream; - - /* seek to the beginning of the PS names table */ - error = face->goto_table( face, TTAG_post, stream, &post_len ); - if ( error ) - goto Exit; - - post_limit = FT_STREAM_POS() + post_len; - - format = face->postscript.FormatType; - - /* go to beginning of subtable */ - if ( FT_STREAM_SKIP( 32 ) ) - goto Exit; - - /* now read postscript table */ - if ( format == 0x00020000L ) - error = load_format_20( face, stream, post_limit ); - else if ( format == 0x00028000L ) - error = load_format_25( face, stream, post_limit ); - else - error = FT_THROW( Invalid_File_Format ); - - face->postscript_names.loaded = 1; - - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - tt_face_free_ps_names( TT_Face face ) - { - FT_Memory memory = face->root.memory; - TT_Post_Names names = &face->postscript_names; - FT_Fixed format; - - - if ( names->loaded ) - { - format = face->postscript.FormatType; - - if ( format == 0x00020000L ) - { - TT_Post_20 table = &names->names.format_20; - FT_UShort n; - - - FT_FREE( table->glyph_indices ); - table->num_glyphs = 0; - - for ( n = 0; n < table->num_names; n++ ) - FT_FREE( table->glyph_names[n] ); - - FT_FREE( table->glyph_names ); - table->num_names = 0; - } - else if ( format == 0x00028000L ) - { - TT_Post_25 table = &names->names.format_25; - - - FT_FREE( table->offsets ); - table->num_glyphs = 0; - } - } - names->loaded = 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_get_ps_name */ - /* */ - /* <Description> */ - /* Get the PostScript glyph name of a glyph. */ - /* */ - /* <Input> */ - /* face :: A handle to the parent face. */ - /* */ - /* idx :: The glyph index. */ - /* */ - /* <InOut> */ - /* PSname :: The address of a string pointer. Will be NULL in case */ - /* of error, otherwise it is a pointer to the glyph name. */ - /* */ - /* You must not modify the returned string! */ - /* */ - /* <Output> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_get_ps_name( TT_Face face, - FT_UInt idx, - FT_String** PSname ) - { - FT_Error error; - TT_Post_Names names; - FT_Fixed format; - -#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES - FT_Service_PsCMaps psnames; -#endif - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - if ( idx >= (FT_UInt)face->max_profile.numGlyphs ) - return FT_THROW( Invalid_Glyph_Index ); - -#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES - psnames = (FT_Service_PsCMaps)face->psnames; - if ( !psnames ) - return FT_THROW( Unimplemented_Feature ); -#endif - - names = &face->postscript_names; - - /* `.notdef' by default */ - *PSname = MAC_NAME( 0 ); - - format = face->postscript.FormatType; - - if ( format == 0x00010000L ) - { - if ( idx < 258 ) /* paranoid checking */ - *PSname = MAC_NAME( idx ); - } - else if ( format == 0x00020000L ) - { - TT_Post_20 table = &names->names.format_20; - - - if ( !names->loaded ) - { - error = load_post_names( face ); - if ( error ) - goto End; - } - - if ( idx < (FT_UInt)table->num_glyphs ) - { - FT_UShort name_index = table->glyph_indices[idx]; - - - if ( name_index < 258 ) - *PSname = MAC_NAME( name_index ); - else - *PSname = (FT_String*)table->glyph_names[name_index - 258]; - } - } - else if ( format == 0x00028000L ) - { - TT_Post_25 table = &names->names.format_25; - - - if ( !names->loaded ) - { - error = load_post_names( face ); - if ( error ) - goto End; - } - - if ( idx < (FT_UInt)table->num_glyphs ) /* paranoid checking */ - *PSname = MAC_NAME( (FT_Int)idx + table->offsets[idx] ); - } - - /* nothing to do for format == 0x00030000L */ - - End: - return FT_Err_Ok; - } - - -/* END */ diff --git a/3party/freetype/src/sfnt/ttpost.h b/3party/freetype/src/sfnt/ttpost.h deleted file mode 100644 index e3eca02c62..0000000000 --- a/3party/freetype/src/sfnt/ttpost.h +++ /dev/null @@ -1,46 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpost.h */ -/* */ -/* Postcript name table processing for TrueType and OpenType fonts */ -/* (specification). */ -/* */ -/* Copyright 1996-2015 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 __TTPOST_H__ -#define __TTPOST_H__ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - tt_face_get_ps_name( TT_Face face, - FT_UInt idx, - FT_String** PSname ); - - FT_LOCAL( void ) - tt_face_free_ps_names( TT_Face face ); - - -FT_END_HEADER - -#endif /* __TTPOST_H__ */ - - -/* END */ diff --git a/3party/freetype/src/sfnt/ttsbit.c b/3party/freetype/src/sfnt/ttsbit.c deleted file mode 100644 index 3b351ecfce..0000000000 --- a/3party/freetype/src/sfnt/ttsbit.c +++ /dev/null @@ -1,1472 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttsbit.c */ -/* */ -/* TrueType and OpenType embedded bitmap support (body). */ -/* */ -/* Copyright 2005-2015 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* Copyright 2013 by Google, Inc. */ -/* Google Author(s): Behdad Esfahbod. */ -/* */ -/* 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include FT_BITMAP_H -#include "ttsbit.h" - -#include "sferrors.h" - -#include "ttmtx.h" -#include "pngshim.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttsbit - - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_sbit( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - FT_ULong table_size; - - - face->sbit_table = NULL; - face->sbit_table_size = 0; - face->sbit_table_type = TT_SBIT_TABLE_TYPE_NONE; - face->sbit_num_strikes = 0; - - error = face->goto_table( face, TTAG_CBLC, stream, &table_size ); - if ( !error ) - face->sbit_table_type = TT_SBIT_TABLE_TYPE_CBLC; - else - { - error = face->goto_table( face, TTAG_EBLC, stream, &table_size ); - if ( error ) - error = face->goto_table( face, TTAG_bloc, stream, &table_size ); - if ( !error ) - face->sbit_table_type = TT_SBIT_TABLE_TYPE_EBLC; - } - - if ( error ) - { - error = face->goto_table( face, TTAG_sbix, stream, &table_size ); - if ( !error ) - face->sbit_table_type = TT_SBIT_TABLE_TYPE_SBIX; - } - if ( error ) - goto Exit; - - if ( table_size < 8 ) - { - FT_ERROR(( "tt_face_load_sbit_strikes: table too short\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - switch ( (FT_UInt)face->sbit_table_type ) - { - case TT_SBIT_TABLE_TYPE_EBLC: - case TT_SBIT_TABLE_TYPE_CBLC: - { - FT_Byte* p; - FT_Fixed version; - FT_ULong num_strikes; - FT_UInt count; - - - if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) ) - goto Exit; - - face->sbit_table_size = table_size; - - p = face->sbit_table; - - version = FT_NEXT_LONG( p ); - num_strikes = FT_NEXT_ULONG( p ); - - if ( ( (FT_ULong)version & 0xFFFF0000UL ) != 0x00020000UL ) - { - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - if ( num_strikes >= 0x10000UL ) - { - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* - * Count the number of strikes available in the table. We are a bit - * paranoid there and don't trust the data. - */ - count = (FT_UInt)num_strikes; - if ( 8 + 48UL * count > table_size ) - count = (FT_UInt)( ( table_size - 8 ) / 48 ); - - face->sbit_num_strikes = count; - } - break; - - case TT_SBIT_TABLE_TYPE_SBIX: - { - FT_UShort version; - FT_UShort flags; - FT_ULong num_strikes; - FT_UInt count; - - - if ( FT_FRAME_ENTER( 8 ) ) - goto Exit; - - version = FT_GET_USHORT(); - flags = FT_GET_USHORT(); - num_strikes = FT_GET_ULONG(); - - FT_FRAME_EXIT(); - - if ( version < 1 ) - { - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - /* Bit 0 must always be `1'. */ - /* Bit 1 controls the overlay of bitmaps with outlines. */ - /* All other bits should be zero. */ - if ( !( flags == 1 || flags == 3 ) || - num_strikes >= 0x10000UL ) - { - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* we currently don't support bit 1; however, it is better to */ - /* draw at least something... */ - if ( flags == 3 ) - FT_TRACE1(( "tt_face_load_sbit_strikes:" - " sbix overlay not supported yet\n" - " " - " expect bad rendering results\n" )); - - /* - * Count the number of strikes available in the table. We are a bit - * paranoid there and don't trust the data. - */ - count = (FT_UInt)num_strikes; - if ( 8 + 4UL * count > table_size ) - count = (FT_UInt)( ( table_size - 8 ) / 4 ); - - if ( FT_STREAM_SEEK( FT_STREAM_POS() - 8 ) ) - goto Exit; - - face->sbit_table_size = 8 + count * 4; - if ( FT_FRAME_EXTRACT( face->sbit_table_size, face->sbit_table ) ) - goto Exit; - - face->sbit_num_strikes = count; - } - break; - - default: - error = FT_THROW( Unknown_File_Format ); - break; - } - - if ( !error ) - FT_TRACE3(( "sbit_num_strikes: %u\n", face->sbit_num_strikes )); - - return FT_Err_Ok; - - Exit: - if ( error ) - { - if ( face->sbit_table ) - FT_FRAME_RELEASE( face->sbit_table ); - face->sbit_table_size = 0; - face->sbit_table_type = TT_SBIT_TABLE_TYPE_NONE; - } - - return error; - } - - - FT_LOCAL_DEF( void ) - tt_face_free_sbit( TT_Face face ) - { - FT_Stream stream = face->root.stream; - - - FT_FRAME_RELEASE( face->sbit_table ); - face->sbit_table_size = 0; - face->sbit_table_type = TT_SBIT_TABLE_TYPE_NONE; - face->sbit_num_strikes = 0; - } - - - FT_LOCAL_DEF( FT_Error ) - tt_face_set_sbit_strike( TT_Face face, - FT_Size_Request req, - FT_ULong* astrike_index ) - { - return FT_Match_Size( (FT_Face)face, req, 0, astrike_index ); - } - - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_strike_metrics( TT_Face face, - FT_ULong strike_index, - FT_Size_Metrics* metrics ) - { - if ( strike_index >= (FT_ULong)face->sbit_num_strikes ) - return FT_THROW( Invalid_Argument ); - - switch ( (FT_UInt)face->sbit_table_type ) - { - case TT_SBIT_TABLE_TYPE_EBLC: - case TT_SBIT_TABLE_TYPE_CBLC: - { - FT_Byte* strike; - - - strike = face->sbit_table + 8 + strike_index * 48; - - metrics->x_ppem = (FT_UShort)strike[44]; - metrics->y_ppem = (FT_UShort)strike[45]; - - metrics->ascender = (FT_Char)strike[16] * 64; /* hori.ascender */ - metrics->descender = (FT_Char)strike[17] * 64; /* hori.descender */ - metrics->height = metrics->ascender - metrics->descender; - - /* Is this correct? */ - metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB */ - strike[18] + /* max_width */ - (FT_Char)strike[23] /* min_advance_SB */ - ) * 64; - return FT_Err_Ok; - } - - case TT_SBIT_TABLE_TYPE_SBIX: - { - FT_Stream stream = face->root.stream; - FT_UInt offset, upem; - FT_UShort ppem, resolution; - TT_HoriHeader *hori; - FT_ULong table_size; - FT_Pos ppem_, upem_; /* to reduce casts */ - - FT_Error error; - FT_Byte* p; - - - p = face->sbit_table + 8 + 4 * strike_index; - offset = FT_NEXT_ULONG( p ); - - error = face->goto_table( face, TTAG_sbix, stream, &table_size ); - if ( error ) - return error; - - if ( offset + 4 > table_size ) - return FT_THROW( Invalid_File_Format ); - - if ( FT_STREAM_SEEK( FT_STREAM_POS() + offset ) || - FT_FRAME_ENTER( 4 ) ) - return error; - - ppem = FT_GET_USHORT(); - resolution = FT_GET_USHORT(); - - FT_UNUSED( resolution ); /* What to do with this? */ - - FT_FRAME_EXIT(); - - upem = face->header.Units_Per_EM; - hori = &face->horizontal; - - metrics->x_ppem = ppem; - metrics->y_ppem = ppem; - - ppem_ = (FT_Pos)ppem; - upem_ = (FT_Pos)upem; - - metrics->ascender = ppem_ * hori->Ascender * 64 / upem_; - metrics->descender = ppem_ * hori->Descender * 64 / upem_; - metrics->height = ppem_ * ( hori->Ascender - - hori->Descender + - hori->Line_Gap ) * 64 / upem_; - metrics->max_advance = ppem_ * hori->advance_Width_Max * 64 / upem_; - - return error; - } - - default: - return FT_THROW( Unknown_File_Format ); - } - } - - - typedef struct TT_SBitDecoderRec_ - { - TT_Face face; - FT_Stream stream; - FT_Bitmap* bitmap; - TT_SBit_Metrics metrics; - FT_Bool metrics_loaded; - FT_Bool bitmap_allocated; - FT_Byte bit_depth; - - FT_ULong ebdt_start; - FT_ULong ebdt_size; - - FT_ULong strike_index_array; - FT_ULong strike_index_count; - FT_Byte* eblc_base; - FT_Byte* eblc_limit; - - } TT_SBitDecoderRec, *TT_SBitDecoder; - - - static FT_Error - tt_sbit_decoder_init( TT_SBitDecoder decoder, - TT_Face face, - FT_ULong strike_index, - TT_SBit_MetricsRec* metrics ) - { - FT_Error error; - FT_Stream stream = face->root.stream; - FT_ULong ebdt_size; - - - error = face->goto_table( face, TTAG_CBDT, stream, &ebdt_size ); - if ( error ) - error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size ); - if ( error ) - error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size ); - if ( error ) - goto Exit; - - decoder->face = face; - decoder->stream = stream; - decoder->bitmap = &face->root.glyph->bitmap; - decoder->metrics = metrics; - - decoder->metrics_loaded = 0; - decoder->bitmap_allocated = 0; - - decoder->ebdt_start = FT_STREAM_POS(); - decoder->ebdt_size = ebdt_size; - - decoder->eblc_base = face->sbit_table; - decoder->eblc_limit = face->sbit_table + face->sbit_table_size; - - /* now find the strike corresponding to the index */ - { - FT_Byte* p; - - - if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size ) - { - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - p = decoder->eblc_base + 8 + 48 * strike_index; - - decoder->strike_index_array = FT_NEXT_ULONG( p ); - p += 4; - decoder->strike_index_count = FT_NEXT_ULONG( p ); - p += 34; - decoder->bit_depth = *p; - - /* decoder->strike_index_array + */ - /* 8 * decoder->strike_index_count > face->sbit_table_size ? */ - if ( decoder->strike_index_array > face->sbit_table_size || - decoder->strike_index_count > - ( face->sbit_table_size - decoder->strike_index_array ) / 8 ) - error = FT_THROW( Invalid_File_Format ); - } - - Exit: - return error; - } - - - static void - tt_sbit_decoder_done( TT_SBitDecoder decoder ) - { - FT_UNUSED( decoder ); - } - - - static FT_Error - tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder decoder ) - { - FT_Error error = FT_Err_Ok; - FT_UInt width, height; - FT_Bitmap* map = decoder->bitmap; - FT_ULong size; - - - if ( !decoder->metrics_loaded ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - width = decoder->metrics->width; - height = decoder->metrics->height; - - map->width = width; - map->rows = height; - - switch ( decoder->bit_depth ) - { - case 1: - map->pixel_mode = FT_PIXEL_MODE_MONO; - map->pitch = (int)( ( map->width + 7 ) >> 3 ); - map->num_grays = 2; - break; - - case 2: - map->pixel_mode = FT_PIXEL_MODE_GRAY2; - map->pitch = (int)( ( map->width + 3 ) >> 2 ); - map->num_grays = 4; - break; - - case 4: - map->pixel_mode = FT_PIXEL_MODE_GRAY4; - map->pitch = (int)( ( map->width + 1 ) >> 1 ); - map->num_grays = 16; - break; - - case 8: - map->pixel_mode = FT_PIXEL_MODE_GRAY; - map->pitch = (int)( map->width ); - map->num_grays = 256; - break; - - case 32: - map->pixel_mode = FT_PIXEL_MODE_BGRA; - map->pitch = (int)( map->width * 4 ); - map->num_grays = 256; - break; - - default: - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - size = map->rows * (FT_ULong)map->pitch; - - /* check that there is no empty image */ - if ( size == 0 ) - goto Exit; /* exit successfully! */ - - error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size ); - if ( error ) - goto Exit; - - decoder->bitmap_allocated = 1; - - Exit: - return error; - } - - - static FT_Error - tt_sbit_decoder_load_metrics( TT_SBitDecoder decoder, - FT_Byte* *pp, - FT_Byte* limit, - FT_Bool big ) - { - FT_Byte* p = *pp; - TT_SBit_Metrics metrics = decoder->metrics; - - - if ( p + 5 > limit ) - goto Fail; - - metrics->height = p[0]; - metrics->width = p[1]; - metrics->horiBearingX = (FT_Char)p[2]; - metrics->horiBearingY = (FT_Char)p[3]; - metrics->horiAdvance = p[4]; - - p += 5; - if ( big ) - { - if ( p + 3 > limit ) - goto Fail; - - metrics->vertBearingX = (FT_Char)p[0]; - metrics->vertBearingY = (FT_Char)p[1]; - metrics->vertAdvance = p[2]; - - p += 3; - } - else - { - /* avoid uninitialized data in case there is no vertical info -- */ - metrics->vertBearingX = 0; - metrics->vertBearingY = 0; - metrics->vertAdvance = 0; - } - - decoder->metrics_loaded = 1; - *pp = p; - return FT_Err_Ok; - - Fail: - FT_TRACE1(( "tt_sbit_decoder_load_metrics: broken table\n" )); - return FT_THROW( Invalid_Argument ); - } - - - /* forward declaration */ - static FT_Error - tt_sbit_decoder_load_image( TT_SBitDecoder decoder, - FT_UInt glyph_index, - FT_Int x_pos, - FT_Int y_pos ); - - typedef FT_Error (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder decoder, - FT_Byte* p, - FT_Byte* plimit, - FT_Int x_pos, - FT_Int y_pos ); - - - static FT_Error - tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder decoder, - FT_Byte* p, - FT_Byte* limit, - FT_Int x_pos, - FT_Int y_pos ) - { - FT_Error error = FT_Err_Ok; - FT_Byte* line; - FT_Int pitch, width, height, line_bits, h; - FT_UInt bit_height, bit_width; - FT_Bitmap* bitmap; - - - /* check that we can write the glyph into the bitmap */ - bitmap = decoder->bitmap; - bit_width = bitmap->width; - bit_height = bitmap->rows; - pitch = bitmap->pitch; - line = bitmap->buffer; - - width = decoder->metrics->width; - height = decoder->metrics->height; - - line_bits = width * decoder->bit_depth; - - if ( x_pos < 0 || (FT_UInt)( x_pos + width ) > bit_width || - y_pos < 0 || (FT_UInt)( y_pos + height ) > bit_height ) - { - FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned:" - " invalid bitmap dimensions\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - if ( p + ( ( line_bits + 7 ) >> 3 ) * height > limit ) - { - FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned: broken bitmap\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* now do the blit */ - line += y_pos * pitch + ( x_pos >> 3 ); - x_pos &= 7; - - if ( x_pos == 0 ) /* the easy one */ - { - for ( h = height; h > 0; h--, line += pitch ) - { - FT_Byte* pwrite = line; - FT_Int w; - - - for ( w = line_bits; w >= 8; w -= 8 ) - { - pwrite[0] = (FT_Byte)( pwrite[0] | *p++ ); - pwrite += 1; - } - - if ( w > 0 ) - pwrite[0] = (FT_Byte)( pwrite[0] | ( *p++ & ( 0xFF00U >> w ) ) ); - } - } - else /* x_pos > 0 */ - { - for ( h = height; h > 0; h--, line += pitch ) - { - FT_Byte* pwrite = line; - FT_Int w; - FT_UInt wval = 0; - - - for ( w = line_bits; w >= 8; w -= 8 ) - { - wval = (FT_UInt)( wval | *p++ ); - pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) ); - pwrite += 1; - wval <<= 8; - } - - if ( w > 0 ) - wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) ); - - /* all bits read and there are `x_pos + w' bits to be written */ - - pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) ); - - if ( x_pos + w > 8 ) - { - pwrite++; - wval <<= 8; - pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) ); - } - } - } - - Exit: - if ( !error ) - FT_TRACE3(( "tt_sbit_decoder_load_byte_aligned: loaded\n" )); - return error; - } - - - /* - * Load a bit-aligned bitmap (with pointer `p') into a line-aligned bitmap - * (with pointer `pwrite'). In the example below, the width is 3 pixel, - * and `x_pos' is 1 pixel. - * - * p p+1 - * | | | - * | 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |... - * | | | - * +-------+ +-------+ +-------+ ... - * . . . - * . . . - * v . . - * +-------+ . . - * | | . - * | 7 6 5 4 3 2 1 0 | . - * | | . - * pwrite . . - * . . - * v . - * +-------+ . - * | | - * | 7 6 5 4 3 2 1 0 | - * | | - * pwrite+1 . - * . - * v - * +-------+ - * | | - * | 7 6 5 4 3 2 1 0 | - * | | - * pwrite+2 - * - */ - - static FT_Error - tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder decoder, - FT_Byte* p, - FT_Byte* limit, - FT_Int x_pos, - FT_Int y_pos ) - { - FT_Error error = FT_Err_Ok; - FT_Byte* line; - FT_Int pitch, width, height, line_bits, h, nbits; - FT_UInt bit_height, bit_width; - FT_Bitmap* bitmap; - FT_UShort rval; - - - /* check that we can write the glyph into the bitmap */ - bitmap = decoder->bitmap; - bit_width = bitmap->width; - bit_height = bitmap->rows; - pitch = bitmap->pitch; - line = bitmap->buffer; - - width = decoder->metrics->width; - height = decoder->metrics->height; - - line_bits = width * decoder->bit_depth; - - if ( x_pos < 0 || (FT_UInt)( x_pos + width ) > bit_width || - y_pos < 0 || (FT_UInt)( y_pos + height ) > bit_height ) - { - FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned:" - " invalid bitmap dimensions\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - if ( p + ( ( line_bits * height + 7 ) >> 3 ) > limit ) - { - FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned: broken bitmap\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* now do the blit */ - - /* adjust `line' to point to the first byte of the bitmap */ - line += y_pos * pitch + ( x_pos >> 3 ); - x_pos &= 7; - - /* the higher byte of `rval' is used as a buffer */ - rval = 0; - nbits = 0; - - for ( h = height; h > 0; h--, line += pitch ) - { - FT_Byte* pwrite = line; - FT_Int w = line_bits; - - - /* handle initial byte (in target bitmap) specially if necessary */ - if ( x_pos ) - { - w = ( line_bits < 8 - x_pos ) ? line_bits : 8 - x_pos; - - if ( h == height ) - { - rval = *p++; - nbits = x_pos; - } - else if ( nbits < w ) - { - if ( p < limit ) - rval |= *p++; - nbits += 8 - w; - } - else - { - rval >>= 8; - nbits -= w; - } - - *pwrite++ |= ( ( rval >> nbits ) & 0xFF ) & - ( ~( 0xFF << w ) << ( 8 - w - x_pos ) ); - rval <<= 8; - - w = line_bits - w; - } - - /* handle medial bytes */ - for ( ; w >= 8; w -= 8 ) - { - rval |= *p++; - *pwrite++ |= ( rval >> nbits ) & 0xFF; - - rval <<= 8; - } - - /* handle final byte if necessary */ - if ( w > 0 ) - { - if ( nbits < w ) - { - if ( p < limit ) - rval |= *p++; - *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); - nbits += 8 - w; - - rval <<= 8; - } - else - { - *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); - nbits -= w; - } - } - } - - Exit: - if ( !error ) - FT_TRACE3(( "tt_sbit_decoder_load_bit_aligned: loaded\n" )); - return error; - } - - - static FT_Error - tt_sbit_decoder_load_compound( TT_SBitDecoder decoder, - FT_Byte* p, - FT_Byte* limit, - FT_Int x_pos, - FT_Int y_pos ) - { - FT_Error error = FT_Err_Ok; - FT_UInt num_components, nn; - - FT_Char horiBearingX = (FT_Char)decoder->metrics->horiBearingX; - FT_Char horiBearingY = (FT_Char)decoder->metrics->horiBearingY; - FT_Byte horiAdvance = (FT_Byte)decoder->metrics->horiAdvance; - FT_Char vertBearingX = (FT_Char)decoder->metrics->vertBearingX; - FT_Char vertBearingY = (FT_Char)decoder->metrics->vertBearingY; - FT_Byte vertAdvance = (FT_Byte)decoder->metrics->vertAdvance; - - - if ( p + 2 > limit ) - goto Fail; - - num_components = FT_NEXT_USHORT( p ); - if ( p + 4 * num_components > limit ) - { - FT_TRACE1(( "tt_sbit_decoder_load_compound: broken table\n" )); - goto Fail; - } - - FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %d components\n", - num_components )); - - for ( nn = 0; nn < num_components; nn++ ) - { - FT_UInt gindex = FT_NEXT_USHORT( p ); - FT_Byte dx = FT_NEXT_BYTE( p ); - FT_Byte dy = FT_NEXT_BYTE( p ); - - - /* NB: a recursive call */ - error = tt_sbit_decoder_load_image( decoder, gindex, - x_pos + dx, y_pos + dy ); - if ( error ) - break; - } - - FT_TRACE3(( "tt_sbit_decoder_load_compound: done\n" )); - - decoder->metrics->horiBearingX = horiBearingX; - decoder->metrics->horiBearingY = horiBearingY; - decoder->metrics->horiAdvance = horiAdvance; - decoder->metrics->vertBearingX = vertBearingX; - decoder->metrics->vertBearingY = vertBearingY; - decoder->metrics->vertAdvance = vertAdvance; - decoder->metrics->width = (FT_Byte)decoder->bitmap->width; - decoder->metrics->height = (FT_Byte)decoder->bitmap->rows; - - Exit: - return error; - - Fail: - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - -#ifdef FT_CONFIG_OPTION_USE_PNG - - static FT_Error - tt_sbit_decoder_load_png( TT_SBitDecoder decoder, - FT_Byte* p, - FT_Byte* limit, - FT_Int x_pos, - FT_Int y_pos ) - { - FT_Error error = FT_Err_Ok; - FT_ULong png_len; - - - if ( limit - p < 4 ) - { - FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - png_len = FT_NEXT_ULONG( p ); - if ( (FT_ULong)( limit - p ) < png_len ) - { - FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - error = Load_SBit_Png( decoder->face->root.glyph, - x_pos, - y_pos, - decoder->bit_depth, - decoder->metrics, - decoder->stream->memory, - p, - png_len, - FALSE ); - - Exit: - if ( !error ) - FT_TRACE3(( "tt_sbit_decoder_load_png: loaded\n" )); - return error; - } - -#endif /* FT_CONFIG_OPTION_USE_PNG */ - - - static FT_Error - tt_sbit_decoder_load_bitmap( TT_SBitDecoder decoder, - FT_UInt glyph_format, - FT_ULong glyph_start, - FT_ULong glyph_size, - FT_Int x_pos, - FT_Int y_pos ) - { - FT_Error error; - FT_Stream stream = decoder->stream; - FT_Byte* p; - FT_Byte* p_limit; - FT_Byte* data; - - - /* seek into the EBDT table now */ - if ( glyph_start + glyph_size > decoder->ebdt_size ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) || - FT_FRAME_EXTRACT( glyph_size, data ) ) - goto Exit; - - p = data; - p_limit = p + glyph_size; - - /* read the data, depending on the glyph format */ - switch ( glyph_format ) - { - case 1: - case 2: - case 8: - case 17: - error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 ); - break; - - case 6: - case 7: - case 9: - case 18: - error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ); - break; - - default: - error = FT_Err_Ok; - } - - if ( error ) - goto Fail; - - { - TT_SBitDecoder_LoadFunc loader; - - - switch ( glyph_format ) - { - case 1: - case 6: - loader = tt_sbit_decoder_load_byte_aligned; - break; - - case 2: - case 7: - { - /* Don't trust `glyph_format'. For example, Apple's main Korean */ - /* system font, `AppleMyungJo.ttf' (version 7.0d2e6), uses glyph */ - /* format 7, but the data is format 6. We check whether we have */ - /* an excessive number of bytes in the image: If it is equal to */ - /* the value for a byte-aligned glyph, use the other loading */ - /* routine. */ - /* */ - /* Note that for some (width,height) combinations, where the */ - /* width is not a multiple of 8, the sizes for bit- and */ - /* byte-aligned data are equal, for example (7,7) or (15,6). We */ - /* then prefer what `glyph_format' specifies. */ - - FT_UInt width = decoder->metrics->width; - FT_UInt height = decoder->metrics->height; - - FT_UInt bit_size = ( width * height + 7 ) >> 3; - FT_UInt byte_size = height * ( ( width + 7 ) >> 3 ); - - - if ( bit_size < byte_size && - byte_size == (FT_UInt)( p_limit - p ) ) - loader = tt_sbit_decoder_load_byte_aligned; - else - loader = tt_sbit_decoder_load_bit_aligned; - } - break; - - case 5: - loader = tt_sbit_decoder_load_bit_aligned; - break; - - case 8: - if ( p + 1 > p_limit ) - goto Fail; - - p += 1; /* skip padding */ - /* fall-through */ - - case 9: - loader = tt_sbit_decoder_load_compound; - break; - - case 17: /* small metrics, PNG image data */ - case 18: /* big metrics, PNG image data */ - case 19: /* metrics in EBLC, PNG image data */ -#ifdef FT_CONFIG_OPTION_USE_PNG - loader = tt_sbit_decoder_load_png; - break; -#else - error = FT_THROW( Unimplemented_Feature ); - goto Fail; -#endif /* FT_CONFIG_OPTION_USE_PNG */ - - default: - error = FT_THROW( Invalid_Table ); - goto Fail; - } - - if ( !decoder->bitmap_allocated ) - { - error = tt_sbit_decoder_alloc_bitmap( decoder ); - if ( error ) - goto Fail; - } - - error = loader( decoder, p, p_limit, x_pos, y_pos ); - } - - Fail: - FT_FRAME_RELEASE( data ); - - Exit: - return error; - } - - - static FT_Error - tt_sbit_decoder_load_image( TT_SBitDecoder decoder, - FT_UInt glyph_index, - FT_Int x_pos, - FT_Int y_pos ) - { - /* - * First, we find the correct strike range that applies to this - * glyph index. - */ - - FT_Byte* p = decoder->eblc_base + decoder->strike_index_array; - FT_Byte* p_limit = decoder->eblc_limit; - FT_ULong num_ranges = decoder->strike_index_count; - FT_UInt start, end, index_format, image_format; - FT_ULong image_start = 0, image_end = 0, image_offset; - - - for ( ; num_ranges > 0; num_ranges-- ) - { - start = FT_NEXT_USHORT( p ); - end = FT_NEXT_USHORT( p ); - - if ( glyph_index >= start && glyph_index <= end ) - goto FoundRange; - - p += 4; /* ignore index offset */ - } - goto NoBitmap; - - FoundRange: - image_offset = FT_NEXT_ULONG( p ); - - /* overflow check */ - p = decoder->eblc_base + decoder->strike_index_array; - if ( image_offset > (FT_ULong)( p_limit - p ) ) - goto Failure; - - p += image_offset; - if ( p + 8 > p_limit ) - goto NoBitmap; - - /* now find the glyph's location and extend within the ebdt table */ - index_format = FT_NEXT_USHORT( p ); - image_format = FT_NEXT_USHORT( p ); - image_offset = FT_NEXT_ULONG ( p ); - - switch ( index_format ) - { - case 1: /* 4-byte offsets relative to `image_offset' */ - p += 4 * ( glyph_index - start ); - if ( p + 8 > p_limit ) - goto NoBitmap; - - image_start = FT_NEXT_ULONG( p ); - image_end = FT_NEXT_ULONG( p ); - - if ( image_start == image_end ) /* missing glyph */ - goto NoBitmap; - break; - - case 2: /* big metrics, constant image size */ - { - FT_ULong image_size; - - - if ( p + 12 > p_limit ) - goto NoBitmap; - - image_size = FT_NEXT_ULONG( p ); - - if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) - goto NoBitmap; - - image_start = image_size * ( glyph_index - start ); - image_end = image_start + image_size; - } - break; - - case 3: /* 2-byte offsets relative to 'image_offset' */ - p += 2 * ( glyph_index - start ); - if ( p + 4 > p_limit ) - goto NoBitmap; - - image_start = FT_NEXT_USHORT( p ); - image_end = FT_NEXT_USHORT( p ); - - if ( image_start == image_end ) /* missing glyph */ - goto NoBitmap; - break; - - case 4: /* sparse glyph array with (glyph,offset) pairs */ - { - FT_ULong mm, num_glyphs; - - - if ( p + 4 > p_limit ) - goto NoBitmap; - - num_glyphs = FT_NEXT_ULONG( p ); - - /* overflow check for p + ( num_glyphs + 1 ) * 4 */ - if ( p + 4 > p_limit || - num_glyphs > (FT_ULong)( ( ( p_limit - p ) >> 2 ) - 1 ) ) - goto NoBitmap; - - for ( mm = 0; mm < num_glyphs; mm++ ) - { - FT_UInt gindex = FT_NEXT_USHORT( p ); - - - if ( gindex == glyph_index ) - { - image_start = FT_NEXT_USHORT( p ); - p += 2; - image_end = FT_PEEK_USHORT( p ); - break; - } - p += 2; - } - - if ( mm >= num_glyphs ) - goto NoBitmap; - } - break; - - case 5: /* constant metrics with sparse glyph codes */ - case 19: - { - FT_ULong image_size, mm, num_glyphs; - - - if ( p + 16 > p_limit ) - goto NoBitmap; - - image_size = FT_NEXT_ULONG( p ); - - if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) - goto NoBitmap; - - num_glyphs = FT_NEXT_ULONG( p ); - - /* overflow check for p + 2 * num_glyphs */ - if ( num_glyphs > (FT_ULong)( ( p_limit - p ) >> 1 ) ) - goto NoBitmap; - - for ( mm = 0; mm < num_glyphs; mm++ ) - { - FT_UInt gindex = FT_NEXT_USHORT( p ); - - - if ( gindex == glyph_index ) - break; - } - - if ( mm >= num_glyphs ) - goto NoBitmap; - - image_start = image_size * mm; - image_end = image_start + image_size; - } - break; - - default: - goto NoBitmap; - } - - if ( image_start > image_end ) - goto NoBitmap; - - image_end -= image_start; - image_start = image_offset + image_start; - - FT_TRACE3(( "tt_sbit_decoder_load_image:" - " found sbit (format %d) for glyph index %d\n", - image_format, glyph_index )); - - return tt_sbit_decoder_load_bitmap( decoder, - image_format, - image_start, - image_end, - x_pos, - y_pos ); - - Failure: - return FT_THROW( Invalid_Table ); - - NoBitmap: - FT_TRACE4(( "tt_sbit_decoder_load_image:" - " no sbit found for glyph index %d\n", glyph_index )); - - return FT_THROW( Invalid_Argument ); - } - - - static FT_Error - tt_face_load_sbix_image( TT_Face face, - FT_ULong strike_index, - FT_UInt glyph_index, - FT_Stream stream, - FT_Bitmap *map, - TT_SBit_MetricsRec *metrics ) - { - FT_UInt sbix_pos, strike_offset, glyph_start, glyph_end; - FT_ULong table_size; - FT_Int originOffsetX, originOffsetY; - FT_Tag graphicType; - FT_Int recurse_depth = 0; - - FT_Error error; - FT_Byte* p; - - FT_UNUSED( map ); - - - metrics->width = 0; - metrics->height = 0; - - p = face->sbit_table + 8 + 4 * strike_index; - strike_offset = FT_NEXT_ULONG( p ); - - error = face->goto_table( face, TTAG_sbix, stream, &table_size ); - if ( error ) - return error; - sbix_pos = FT_STREAM_POS(); - - retry: - if ( glyph_index > (FT_UInt)face->root.num_glyphs ) - return FT_THROW( Invalid_Argument ); - - if ( strike_offset >= table_size || - table_size - strike_offset < 4 + glyph_index * 4 + 8 ) - return FT_THROW( Invalid_File_Format ); - - if ( FT_STREAM_SEEK( sbix_pos + strike_offset + 4 + glyph_index * 4 ) || - FT_FRAME_ENTER( 8 ) ) - return error; - - glyph_start = FT_GET_ULONG(); - glyph_end = FT_GET_ULONG(); - - FT_FRAME_EXIT(); - - if ( glyph_start == glyph_end ) - return FT_THROW( Invalid_Argument ); - if ( glyph_start > glyph_end || - glyph_end - glyph_start < 8 || - table_size - strike_offset < glyph_end ) - return FT_THROW( Invalid_File_Format ); - - if ( FT_STREAM_SEEK( sbix_pos + strike_offset + glyph_start ) || - FT_FRAME_ENTER( glyph_end - glyph_start ) ) - return error; - - originOffsetX = FT_GET_SHORT(); - originOffsetY = FT_GET_SHORT(); - - graphicType = FT_GET_TAG4(); - - switch ( graphicType ) - { - case FT_MAKE_TAG( 'd', 'u', 'p', 'e' ): - if ( recurse_depth < 4 ) - { - glyph_index = FT_GET_USHORT(); - FT_FRAME_EXIT(); - recurse_depth++; - goto retry; - } - error = FT_THROW( Invalid_File_Format ); - break; - - case FT_MAKE_TAG( 'p', 'n', 'g', ' ' ): -#ifdef FT_CONFIG_OPTION_USE_PNG - error = Load_SBit_Png( face->root.glyph, - 0, - 0, - 32, - metrics, - stream->memory, - stream->cursor, - glyph_end - glyph_start - 8, - TRUE ); -#else - error = FT_THROW( Unimplemented_Feature ); -#endif - break; - - case FT_MAKE_TAG( 'j', 'p', 'g', ' ' ): - case FT_MAKE_TAG( 't', 'i', 'f', 'f' ): - case FT_MAKE_TAG( 'r', 'g', 'b', 'l' ): /* used on iOS 7.1 */ - error = FT_THROW( Unknown_File_Format ); - break; - - default: - error = FT_THROW( Unimplemented_Feature ); - break; - } - - FT_FRAME_EXIT(); - - if ( !error ) - { - FT_Short abearing; - FT_UShort aadvance; - - - tt_face_get_metrics( face, FALSE, glyph_index, &abearing, &aadvance ); - - metrics->horiBearingX = (FT_Short)originOffsetX; - metrics->horiBearingY = (FT_Short)( -originOffsetY + metrics->height ); - metrics->horiAdvance = (FT_UShort)( aadvance * - face->root.size->metrics.x_ppem / - face->header.Units_Per_EM ); - } - - return error; - } - - FT_LOCAL( FT_Error ) - tt_face_load_sbit_image( TT_Face face, - FT_ULong strike_index, - FT_UInt glyph_index, - FT_UInt load_flags, - FT_Stream stream, - FT_Bitmap *map, - TT_SBit_MetricsRec *metrics ) - { - FT_Error error = FT_Err_Ok; - - - switch ( (FT_UInt)face->sbit_table_type ) - { - case TT_SBIT_TABLE_TYPE_EBLC: - case TT_SBIT_TABLE_TYPE_CBLC: - { - TT_SBitDecoderRec decoder[1]; - - - error = tt_sbit_decoder_init( decoder, face, strike_index, metrics ); - if ( !error ) - { - error = tt_sbit_decoder_load_image( decoder, - glyph_index, - 0, - 0 ); - tt_sbit_decoder_done( decoder ); - } - } - break; - - case TT_SBIT_TABLE_TYPE_SBIX: - error = tt_face_load_sbix_image( face, - strike_index, - glyph_index, - stream, - map, - metrics ); - break; - - default: - error = FT_THROW( Unknown_File_Format ); - break; - } - - /* Flatten color bitmaps if color was not requested. */ - if ( !error && - !( load_flags & FT_LOAD_COLOR ) && - map->pixel_mode == FT_PIXEL_MODE_BGRA ) - { - FT_Bitmap new_map; - FT_Library library = face->root.glyph->library; - - - FT_Bitmap_Init( &new_map ); - - /* Convert to 8bit grayscale. */ - error = FT_Bitmap_Convert( library, map, &new_map, 1 ); - if ( error ) - FT_Bitmap_Done( library, &new_map ); - else - { - map->pixel_mode = new_map.pixel_mode; - map->pitch = new_map.pitch; - map->num_grays = new_map.num_grays; - - ft_glyphslot_set_bitmap( face->root.glyph, new_map.buffer ); - face->root.glyph->internal->flags |= FT_GLYPH_OWN_BITMAP; - } - } - - return error; - } - - -/* EOF */ diff --git a/3party/freetype/src/sfnt/ttsbit.h b/3party/freetype/src/sfnt/ttsbit.h deleted file mode 100644 index d4e13aefb8..0000000000 --- a/3party/freetype/src/sfnt/ttsbit.h +++ /dev/null @@ -1,63 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttsbit.h */ -/* */ -/* TrueType and OpenType embedded bitmap support (specification). */ -/* */ -/* Copyright 1996-2015 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 __TTSBIT_H__ -#define __TTSBIT_H__ - - -#include <ft2build.h> -#include "ttload.h" - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - tt_face_load_sbit( TT_Face face, - FT_Stream stream ); - - FT_LOCAL( void ) - tt_face_free_sbit( TT_Face face ); - - - FT_LOCAL( FT_Error ) - tt_face_set_sbit_strike( TT_Face face, - FT_Size_Request req, - FT_ULong* astrike_index ); - - FT_LOCAL( FT_Error ) - tt_face_load_strike_metrics( TT_Face face, - FT_ULong strike_index, - FT_Size_Metrics* metrics ); - - FT_LOCAL( FT_Error ) - tt_face_load_sbit_image( TT_Face face, - FT_ULong strike_index, - FT_UInt glyph_index, - FT_UInt load_flags, - FT_Stream stream, - FT_Bitmap *map, - TT_SBit_MetricsRec *metrics ); - - -FT_END_HEADER - -#endif /* __TTSBIT_H__ */ - - -/* END */ diff --git a/3party/freetype/src/smooth/Jamfile b/3party/freetype/src/smooth/Jamfile deleted file mode 100644 index b1887c2c6e..0000000000 --- a/3party/freetype/src/smooth/Jamfile +++ /dev/null @@ -1,32 +0,0 @@ -# FreeType 2 src/smooth Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) smooth ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = ftgrays - ftsmooth - ftspic - ; - } - else - { - _sources = smooth ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/smooth Jamfile diff --git a/3party/freetype/src/smooth/ftgrays.c b/3party/freetype/src/smooth/ftgrays.c deleted file mode 100644 index a9317e914a..0000000000 --- a/3party/freetype/src/smooth/ftgrays.c +++ /dev/null @@ -1,2133 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgrays.c */ -/* */ -/* A new `perfect' anti-aliasing renderer (body). */ -/* */ -/* Copyright 2000-2015 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. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* This file can be compiled without the rest of the FreeType engine, by */ - /* defining the _STANDALONE_ macro when compiling it. You also need to */ - /* put the files `ftgrays.h' and `ftimage.h' into the current */ - /* compilation directory. Typically, you could do something like */ - /* */ - /* - copy `src/smooth/ftgrays.c' (this file) to your current directory */ - /* */ - /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */ - /* same directory */ - /* */ - /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in */ - /* */ - /* cc -c -D_STANDALONE_ ftgrays.c */ - /* */ - /* The renderer can be initialized with a call to */ - /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated */ - /* with a call to `ft_gray_raster.raster_render'. */ - /* */ - /* See the comments and documentation in the file `ftimage.h' for more */ - /* details on how the raster works. */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* This is a new anti-aliasing scan-converter for FreeType 2. The */ - /* algorithm used here is _very_ different from the one in the standard */ - /* `ftraster' module. Actually, `ftgrays' computes the _exact_ */ - /* coverage of the outline on each pixel cell. */ - /* */ - /* It is based on ideas that I initially found in Raph Levien's */ - /* excellent LibArt graphics library (see http://www.levien.com/libart */ - /* for more information, though the web pages do not tell anything */ - /* about the renderer; you'll have to dive into the source code to */ - /* understand how it works). */ - /* */ - /* Note, however, that this is a _very_ different implementation */ - /* compared to Raph's. Coverage information is stored in a very */ - /* different way, and I don't use sorted vector paths. Also, it doesn't */ - /* use floating point values. */ - /* */ - /* This renderer has the following advantages: */ - /* */ - /* - It doesn't need an intermediate bitmap. Instead, one can supply a */ - /* callback function that will be called by the renderer to draw gray */ - /* spans on any target surface. You can thus do direct composition on */ - /* any kind of bitmap, provided that you give the renderer the right */ - /* callback. */ - /* */ - /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on */ - /* each pixel cell. */ - /* */ - /* - It performs a single pass on the outline (the `standard' FT2 */ - /* renderer makes two passes). */ - /* */ - /* - It can easily be modified to render to _any_ number of gray levels */ - /* cheaply. */ - /* */ - /* - For small (< 20) pixel sizes, it is faster than the standard */ - /* renderer. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_smooth - - -#ifdef _STANDALONE_ - - - /* The size in bytes of the render pool used by the scan-line converter */ - /* to do all of its work. */ -#define FT_RENDER_POOL_SIZE 16384L - - - /* Auxiliary macros for token concatenation. */ -#define FT_ERR_XCAT( x, y ) x ## y -#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) - -#define FT_BEGIN_STMNT do { -#define FT_END_STMNT } while ( 0 ) - -#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) -#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) - - - /* - * Approximate sqrt(x*x+y*y) using the `alpha max plus beta min' - * algorithm. We use alpha = 1, beta = 3/8, giving us results with a - * largest error less than 7% compared to the exact value. - */ -#define FT_HYPOT( x, y ) \ - ( x = FT_ABS( x ), \ - y = FT_ABS( y ), \ - x > y ? x + ( 3 * y >> 3 ) \ - : y + ( 3 * x >> 3 ) ) - - - /* define this to dump debugging information */ -/* #define FT_DEBUG_LEVEL_TRACE */ - - -#ifdef FT_DEBUG_LEVEL_TRACE -#include <stdio.h> -#include <stdarg.h> -#endif - -#include <stddef.h> -#include <string.h> -#include <setjmp.h> -#include <limits.h> -#define FT_UINT_MAX UINT_MAX -#define FT_INT_MAX INT_MAX - -#define ft_memset memset - -#define ft_setjmp setjmp -#define ft_longjmp longjmp -#define ft_jmp_buf jmp_buf - -typedef ptrdiff_t FT_PtrDist; - - -#define ErrRaster_Invalid_Mode -2 -#define ErrRaster_Invalid_Outline -1 -#define ErrRaster_Invalid_Argument -3 -#define ErrRaster_Memory_Overflow -4 - -#define FT_BEGIN_HEADER -#define FT_END_HEADER - -#include "ftimage.h" -#include "ftgrays.h" - - - /* This macro is used to indicate that a function parameter is unused. */ - /* Its purpose is simply to reduce compiler warnings. Note also that */ - /* simply defining it as `(void)x' doesn't avoid warnings with certain */ - /* ANSI compilers (e.g. LCC). */ -#define FT_UNUSED( x ) (x) = (x) - - - /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */ - -#ifdef FT_DEBUG_LEVEL_TRACE - - void - FT_Message( const char* fmt, - ... ) - { - va_list ap; - - - va_start( ap, fmt ); - vfprintf( stderr, fmt, ap ); - va_end( ap ); - } - - - /* empty function useful for setting a breakpoint to catch errors */ - int - FT_Throw( int error, - int line, - const char* file ) - { - FT_UNUSED( error ); - FT_UNUSED( line ); - FT_UNUSED( file ); - - return 0; - } - - - /* we don't handle tracing levels in stand-alone mode; */ -#ifndef FT_TRACE5 -#define FT_TRACE5( varformat ) FT_Message varformat -#endif -#ifndef FT_TRACE7 -#define FT_TRACE7( varformat ) FT_Message varformat -#endif -#ifndef FT_ERROR -#define FT_ERROR( varformat ) FT_Message varformat -#endif - -#define FT_THROW( e ) \ - ( FT_Throw( FT_ERR_CAT( ErrRaster, e ), \ - __LINE__, \ - __FILE__ ) | \ - FT_ERR_CAT( ErrRaster, e ) ) - -#else /* !FT_DEBUG_LEVEL_TRACE */ - -#define FT_TRACE5( x ) do { } while ( 0 ) /* nothing */ -#define FT_TRACE7( x ) do { } while ( 0 ) /* nothing */ -#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ -#define FT_THROW( e ) FT_ERR_CAT( ErrRaster_, e ) - - -#endif /* !FT_DEBUG_LEVEL_TRACE */ - - -#define FT_DEFINE_OUTLINE_FUNCS( class_, \ - move_to_, line_to_, \ - conic_to_, cubic_to_, \ - shift_, delta_ ) \ - static const FT_Outline_Funcs class_ = \ - { \ - move_to_, \ - line_to_, \ - conic_to_, \ - cubic_to_, \ - shift_, \ - delta_ \ - }; - -#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, \ - raster_new_, raster_reset_, \ - raster_set_mode_, raster_render_, \ - raster_done_ ) \ - const FT_Raster_Funcs class_ = \ - { \ - glyph_format_, \ - raster_new_, \ - raster_reset_, \ - raster_set_mode_, \ - raster_render_, \ - raster_done_ \ - }; - - -#else /* !_STANDALONE_ */ - - -#include <ft2build.h> -#include "ftgrays.h" -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_OUTLINE_H - -#include "ftsmerrs.h" - -#include "ftspic.h" - -#define Smooth_Err_Invalid_Mode Smooth_Err_Cannot_Render_Glyph -#define Smooth_Err_Memory_Overflow Smooth_Err_Out_Of_Memory -#define ErrRaster_Memory_Overflow Smooth_Err_Out_Of_Memory - - -#endif /* !_STANDALONE_ */ - - -#ifndef FT_MEM_SET -#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) -#endif - -#ifndef FT_MEM_ZERO -#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) -#endif - - /* as usual, for the speed hungry :-) */ - -#undef RAS_ARG -#undef RAS_ARG_ -#undef RAS_VAR -#undef RAS_VAR_ - -#ifndef FT_STATIC_RASTER - -#define RAS_ARG gray_PWorker worker -#define RAS_ARG_ gray_PWorker worker, - -#define RAS_VAR worker -#define RAS_VAR_ worker, - -#else /* FT_STATIC_RASTER */ - -#define RAS_ARG /* empty */ -#define RAS_ARG_ /* empty */ -#define RAS_VAR /* empty */ -#define RAS_VAR_ /* empty */ - -#endif /* FT_STATIC_RASTER */ - - - /* must be at least 6 bits! */ -#define PIXEL_BITS 8 - -#undef FLOOR -#undef CEILING -#undef TRUNC -#undef SCALED - -#define ONE_PIXEL ( 1L << PIXEL_BITS ) -#define PIXEL_MASK ( -1L << PIXEL_BITS ) -#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) ) -#define SUBPIXELS( x ) ( (TPos)(x) << PIXEL_BITS ) -#define FLOOR( x ) ( (x) & -ONE_PIXEL ) -#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL ) -#define ROUND( x ) ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL ) - -#if PIXEL_BITS >= 6 -#define UPSCALE( x ) ( (x) << ( PIXEL_BITS - 6 ) ) -#define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) ) -#else -#define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) ) -#define DOWNSCALE( x ) ( (x) << ( 6 - PIXEL_BITS ) ) -#endif - - - /* Compute `dividend / divisor' and return both its quotient and */ - /* remainder, cast to a specific type. This macro also ensures that */ - /* the remainder is always positive. */ -#define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \ - FT_BEGIN_STMNT \ - (quotient) = (type)( (dividend) / (divisor) ); \ - (remainder) = (type)( (dividend) % (divisor) ); \ - if ( (remainder) < 0 ) \ - { \ - (quotient)--; \ - (remainder) += (type)(divisor); \ - } \ - FT_END_STMNT - -#ifdef __arm__ - /* Work around a bug specific to GCC which make the compiler fail to */ - /* optimize a division and modulo operation on the same parameters */ - /* into a single call to `__aeabi_idivmod'. See */ - /* */ - /* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43721 */ -#undef FT_DIV_MOD -#define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \ - FT_BEGIN_STMNT \ - (quotient) = (type)( (dividend) / (divisor) ); \ - (remainder) = (type)( (dividend) - (quotient) * (divisor) ); \ - if ( (remainder) < 0 ) \ - { \ - (quotient)--; \ - (remainder) += (type)(divisor); \ - } \ - FT_END_STMNT -#endif /* __arm__ */ - - - /*************************************************************************/ - /* */ - /* TYPE DEFINITIONS */ - /* */ - - /* don't change the following types to FT_Int or FT_Pos, since we might */ - /* need to define them to "float" or "double" when experimenting with */ - /* new algorithms */ - - typedef long TCoord; /* integer scanline/pixel coordinate */ - typedef long TPos; /* sub-pixel coordinate */ - - /* determine the type used to store cell areas. This normally takes at */ - /* least PIXEL_BITS*2 + 1 bits. On 16-bit systems, we need to use */ - /* `long' instead of `int', otherwise bad things happen */ - -#if PIXEL_BITS <= 7 - - typedef int TArea; - -#else /* PIXEL_BITS >= 8 */ - - /* approximately determine the size of integers using an ANSI-C header */ -#if FT_UINT_MAX == 0xFFFFU - typedef long TArea; -#else - typedef int TArea; -#endif - -#endif /* PIXEL_BITS >= 8 */ - - - /* maximum number of gray spans in a call to the span callback */ -#define FT_MAX_GRAY_SPANS 32 - - - typedef struct TCell_* PCell; - - typedef struct TCell_ - { - TPos x; /* same with gray_TWorker.ex */ - TCoord cover; /* same with gray_TWorker.cover */ - TArea area; - PCell next; - - } TCell; - - -#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ - /* We disable the warning `structure was padded due to */ - /* __declspec(align())' in order to compile cleanly with */ - /* the maximum level of warnings. */ -#pragma warning( push ) -#pragma warning( disable : 4324 ) -#endif /* _MSC_VER */ - - typedef struct gray_TWorker_ - { - ft_jmp_buf jump_buffer; - - TCoord ex, ey; - TPos min_ex, max_ex; - TPos min_ey, max_ey; - TPos count_ex, count_ey; - - TArea area; - TCoord cover; - int invalid; - - PCell cells; - FT_PtrDist max_cells; - FT_PtrDist num_cells; - - TCoord cx, cy; - TPos x, y; - - TPos last_ey; - - FT_Vector bez_stack[32 * 3 + 1]; - int lev_stack[32]; - - FT_Outline outline; - FT_Bitmap target; - FT_BBox clip_box; - - FT_Span gray_spans[FT_MAX_GRAY_SPANS]; - int num_gray_spans; - - FT_Raster_Span_Func render_span; - void* render_span_data; - int span_y; - - int band_size; - int band_shoot; - - void* buffer; - long buffer_size; - - PCell* ycells; - TPos ycount; - - } gray_TWorker, *gray_PWorker; - -#if defined( _MSC_VER ) -#pragma warning( pop ) -#endif - - -#ifndef FT_STATIC_RASTER -#define ras (*worker) -#else - static gray_TWorker ras; -#endif - - - typedef struct gray_TRaster_ - { - void* memory; - - } gray_TRaster, *gray_PRaster; - - - - /*************************************************************************/ - /* */ - /* Initialize the cells table. */ - /* */ - static void - gray_init_cells( RAS_ARG_ void* buffer, - long byte_size ) - { - ras.buffer = buffer; - ras.buffer_size = byte_size; - - ras.ycells = (PCell*) buffer; - ras.cells = NULL; - ras.max_cells = 0; - ras.num_cells = 0; - ras.area = 0; - ras.cover = 0; - ras.invalid = 1; - } - - - /*************************************************************************/ - /* */ - /* Compute the outline bounding box. */ - /* */ - static void - gray_compute_cbox( RAS_ARG ) - { - FT_Outline* outline = &ras.outline; - FT_Vector* vec = outline->points; - FT_Vector* limit = vec + outline->n_points; - - - if ( outline->n_points <= 0 ) - { - ras.min_ex = ras.max_ex = 0; - ras.min_ey = ras.max_ey = 0; - return; - } - - ras.min_ex = ras.max_ex = vec->x; - ras.min_ey = ras.max_ey = vec->y; - - vec++; - - for ( ; vec < limit; vec++ ) - { - TPos x = vec->x; - TPos y = vec->y; - - - if ( x < ras.min_ex ) ras.min_ex = x; - if ( x > ras.max_ex ) ras.max_ex = x; - if ( y < ras.min_ey ) ras.min_ey = y; - if ( y > ras.max_ey ) ras.max_ey = y; - } - - /* truncate the bounding box to integer pixels */ - ras.min_ex = ras.min_ex >> 6; - ras.min_ey = ras.min_ey >> 6; - ras.max_ex = ( ras.max_ex + 63 ) >> 6; - ras.max_ey = ( ras.max_ey + 63 ) >> 6; - } - - - /*************************************************************************/ - /* */ - /* Record the current cell in the table. */ - /* */ - static PCell - gray_find_cell( RAS_ARG ) - { - PCell *pcell, cell; - TPos x = ras.ex; - - - if ( x > ras.count_ex ) - x = ras.count_ex; - - pcell = &ras.ycells[ras.ey]; - for (;;) - { - cell = *pcell; - if ( cell == NULL || cell->x > x ) - break; - - if ( cell->x == x ) - goto Exit; - - pcell = &cell->next; - } - - if ( ras.num_cells >= ras.max_cells ) - ft_longjmp( ras.jump_buffer, 1 ); - - cell = ras.cells + ras.num_cells++; - cell->x = x; - cell->area = 0; - cell->cover = 0; - - cell->next = *pcell; - *pcell = cell; - - Exit: - return cell; - } - - - static void - gray_record_cell( RAS_ARG ) - { - if ( ras.area | ras.cover ) - { - PCell cell = gray_find_cell( RAS_VAR ); - - - cell->area += ras.area; - cell->cover += ras.cover; - } - } - - - /*************************************************************************/ - /* */ - /* Set the current cell to a new position. */ - /* */ - static void - gray_set_cell( RAS_ARG_ TCoord ex, - TCoord ey ) - { - /* Move the cell pointer to a new position. We set the `invalid' */ - /* flag to indicate that the cell isn't part of those we're interested */ - /* in during the render phase. This means that: */ - /* */ - /* . the new vertical position must be within min_ey..max_ey-1. */ - /* . the new horizontal position must be strictly less than max_ex */ - /* */ - /* Note that if a cell is to the left of the clipping region, it is */ - /* actually set to the (min_ex-1) horizontal position. */ - - /* All cells that are on the left of the clipping region go to the */ - /* min_ex - 1 horizontal position. */ - ey -= ras.min_ey; - - if ( ex > ras.max_ex ) - ex = ras.max_ex; - - ex -= ras.min_ex; - if ( ex < 0 ) - ex = -1; - - /* are we moving to a different cell ? */ - if ( ex != ras.ex || ey != ras.ey ) - { - /* record the current one if it is valid */ - if ( !ras.invalid ) - gray_record_cell( RAS_VAR ); - - ras.area = 0; - ras.cover = 0; - ras.ex = ex; - ras.ey = ey; - } - - ras.invalid = ( (unsigned int)ey >= (unsigned int)ras.count_ey || - ex >= ras.count_ex ); - } - - - /*************************************************************************/ - /* */ - /* Start a new contour at a given cell. */ - /* */ - static void - gray_start_cell( RAS_ARG_ TCoord ex, - TCoord ey ) - { - if ( ex > ras.max_ex ) - ex = (TCoord)( ras.max_ex ); - - if ( ex < ras.min_ex ) - ex = (TCoord)( ras.min_ex - 1 ); - - ras.area = 0; - ras.cover = 0; - ras.ex = ex - ras.min_ex; - ras.ey = ey - ras.min_ey; - ras.last_ey = SUBPIXELS( ey ); - ras.invalid = 0; - - gray_set_cell( RAS_VAR_ ex, ey ); - } - - - /*************************************************************************/ - /* */ - /* Render a scanline as one or more cells. */ - /* */ - static void - gray_render_scanline( RAS_ARG_ TCoord ey, - TPos x1, - TCoord y1, - TPos x2, - TCoord y2 ) - { - TCoord ex1, ex2, fx1, fx2, delta, mod; - long p, first, dx; - int incr; - - - dx = x2 - x1; - - ex1 = TRUNC( x1 ); - ex2 = TRUNC( x2 ); - fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) ); - fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) ); - - /* trivial case. Happens often */ - if ( y1 == y2 ) - { - gray_set_cell( RAS_VAR_ ex2, ey ); - return; - } - - /* everything is located in a single cell. That is easy! */ - /* */ - if ( ex1 == ex2 ) - { - delta = y2 - y1; - ras.area += (TArea)(( fx1 + fx2 ) * delta); - ras.cover += delta; - return; - } - - /* ok, we'll have to render a run of adjacent cells on the same */ - /* scanline... */ - /* */ - p = ( ONE_PIXEL - fx1 ) * ( y2 - y1 ); - first = ONE_PIXEL; - incr = 1; - - if ( dx < 0 ) - { - p = fx1 * ( y2 - y1 ); - first = 0; - incr = -1; - dx = -dx; - } - - FT_DIV_MOD( TCoord, p, dx, delta, mod ); - - ras.area += (TArea)(( fx1 + first ) * delta); - ras.cover += delta; - - ex1 += incr; - gray_set_cell( RAS_VAR_ ex1, ey ); - y1 += delta; - - if ( ex1 != ex2 ) - { - TCoord lift, rem; - - - p = ONE_PIXEL * ( y2 - y1 + delta ); - FT_DIV_MOD( TCoord, p, dx, lift, rem ); - - mod -= (int)dx; - - while ( ex1 != ex2 ) - { - delta = lift; - mod += rem; - if ( mod >= 0 ) - { - mod -= (TCoord)dx; - delta++; - } - - ras.area += (TArea)(ONE_PIXEL * delta); - ras.cover += delta; - y1 += delta; - ex1 += incr; - gray_set_cell( RAS_VAR_ ex1, ey ); - } - } - - delta = y2 - y1; - ras.area += (TArea)(( fx2 + ONE_PIXEL - first ) * delta); - ras.cover += delta; - } - - - /*************************************************************************/ - /* */ - /* Render a given line as a series of scanlines. */ - /* */ - static void - gray_render_line( RAS_ARG_ TPos to_x, - TPos to_y ) - { - TCoord ey1, ey2, fy1, fy2, mod; - TPos dx, dy, x, x2; - long p, first; - int delta, rem, lift, incr; - - - ey1 = TRUNC( ras.last_ey ); - ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */ - fy1 = (TCoord)( ras.y - ras.last_ey ); - fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) ); - - dx = to_x - ras.x; - dy = to_y - ras.y; - - /* perform vertical clipping */ - { - TCoord min, max; - - - min = ey1; - max = ey2; - if ( ey1 > ey2 ) - { - min = ey2; - max = ey1; - } - if ( min >= ras.max_ey || max < ras.min_ey ) - goto End; - } - - /* everything is on a single scanline */ - if ( ey1 == ey2 ) - { - gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 ); - goto End; - } - - /* vertical line - avoid calling gray_render_scanline */ - incr = 1; - - if ( dx == 0 ) - { - TCoord ex = TRUNC( ras.x ); - TCoord two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 ); - TArea area; - - - first = ONE_PIXEL; - if ( dy < 0 ) - { - first = 0; - incr = -1; - } - - delta = (int)( first - fy1 ); - ras.area += (TArea)two_fx * delta; - ras.cover += delta; - ey1 += incr; - - gray_set_cell( RAS_VAR_ ex, ey1 ); - - delta = (int)( first + first - ONE_PIXEL ); - area = (TArea)two_fx * delta; - while ( ey1 != ey2 ) - { - ras.area += area; - ras.cover += delta; - ey1 += incr; - - gray_set_cell( RAS_VAR_ ex, ey1 ); - } - - delta = (int)( fy2 - ONE_PIXEL + first ); - ras.area += (TArea)two_fx * delta; - ras.cover += delta; - - goto End; - } - - /* ok, we have to render several scanlines */ - p = ( ONE_PIXEL - fy1 ) * dx; - first = ONE_PIXEL; - incr = 1; - - if ( dy < 0 ) - { - p = fy1 * dx; - first = 0; - incr = -1; - dy = -dy; - } - - FT_DIV_MOD( int, p, dy, delta, mod ); - - x = ras.x + delta; - gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first ); - - ey1 += incr; - gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); - - if ( ey1 != ey2 ) - { - p = ONE_PIXEL * dx; - FT_DIV_MOD( int, p, dy, lift, rem ); - mod -= (int)dy; - - while ( ey1 != ey2 ) - { - delta = lift; - mod += rem; - if ( mod >= 0 ) - { - mod -= (int)dy; - delta++; - } - - x2 = x + delta; - gray_render_scanline( RAS_VAR_ ey1, x, - (TCoord)( ONE_PIXEL - first ), x2, - (TCoord)first ); - x = x2; - - ey1 += incr; - gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); - } - } - - gray_render_scanline( RAS_VAR_ ey1, x, - (TCoord)( ONE_PIXEL - first ), to_x, - fy2 ); - - End: - ras.x = to_x; - ras.y = to_y; - ras.last_ey = SUBPIXELS( ey2 ); - } - - - static void - gray_split_conic( FT_Vector* base ) - { - TPos a, b; - - - base[4].x = base[2].x; - b = base[1].x; - a = base[3].x = ( base[2].x + b ) / 2; - b = base[1].x = ( base[0].x + b ) / 2; - base[2].x = ( a + b ) / 2; - - base[4].y = base[2].y; - b = base[1].y; - a = base[3].y = ( base[2].y + b ) / 2; - b = base[1].y = ( base[0].y + b ) / 2; - base[2].y = ( a + b ) / 2; - } - - - static void - gray_render_conic( RAS_ARG_ const FT_Vector* control, - const FT_Vector* to ) - { - TPos dx, dy; - TPos min, max, y; - int top, level; - int* levels; - FT_Vector* arc; - - - levels = ras.lev_stack; - - arc = ras.bez_stack; - arc[0].x = UPSCALE( to->x ); - arc[0].y = UPSCALE( to->y ); - arc[1].x = UPSCALE( control->x ); - arc[1].y = UPSCALE( control->y ); - arc[2].x = ras.x; - arc[2].y = ras.y; - top = 0; - - dx = FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x ); - dy = FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y ); - if ( dx < dy ) - dx = dy; - - if ( dx < ONE_PIXEL / 4 ) - goto Draw; - - /* short-cut the arc that crosses the current band */ - min = max = arc[0].y; - - y = arc[1].y; - if ( y < min ) min = y; - if ( y > max ) max = y; - - y = arc[2].y; - if ( y < min ) min = y; - if ( y > max ) max = y; - - if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey ) - goto Draw; - - level = 0; - do - { - dx >>= 2; - level++; - } while ( dx > ONE_PIXEL / 4 ); - - levels[0] = level; - - do - { - level = levels[top]; - if ( level > 0 ) - { - gray_split_conic( arc ); - arc += 2; - top++; - levels[top] = levels[top - 1] = level - 1; - continue; - } - - Draw: - gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); - top--; - arc -= 2; - - } while ( top >= 0 ); - } - - - static void - gray_split_cubic( FT_Vector* base ) - { - TPos a, b, c, d; - - - base[6].x = base[3].x; - c = base[1].x; - d = base[2].x; - base[1].x = a = ( base[0].x + c ) / 2; - base[5].x = b = ( base[3].x + d ) / 2; - c = ( c + d ) / 2; - base[2].x = a = ( a + c ) / 2; - base[4].x = b = ( b + c ) / 2; - base[3].x = ( a + b ) / 2; - - base[6].y = base[3].y; - c = base[1].y; - d = base[2].y; - base[1].y = a = ( base[0].y + c ) / 2; - base[5].y = b = ( base[3].y + d ) / 2; - c = ( c + d ) / 2; - base[2].y = a = ( a + c ) / 2; - base[4].y = b = ( b + c ) / 2; - base[3].y = ( a + b ) / 2; - } - - - static void - gray_render_cubic( RAS_ARG_ const FT_Vector* control1, - const FT_Vector* control2, - const FT_Vector* to ) - { - FT_Vector* arc; - TPos min, max, y; - - - arc = ras.bez_stack; - arc[0].x = UPSCALE( to->x ); - arc[0].y = UPSCALE( to->y ); - arc[1].x = UPSCALE( control2->x ); - arc[1].y = UPSCALE( control2->y ); - arc[2].x = UPSCALE( control1->x ); - arc[2].y = UPSCALE( control1->y ); - arc[3].x = ras.x; - arc[3].y = ras.y; - - /* Short-cut the arc that crosses the current band. */ - min = max = arc[0].y; - - y = arc[1].y; - if ( y < min ) - min = y; - if ( y > max ) - max = y; - - y = arc[2].y; - if ( y < min ) - min = y; - if ( y > max ) - max = y; - - y = arc[3].y; - if ( y < min ) - min = y; - if ( y > max ) - max = y; - - if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey ) - goto Draw; - - for (;;) - { - /* Decide whether to split or draw. See `Rapid Termination */ - /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */ - /* F. Hain, at */ - /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */ - - { - TPos dx, dy, dx_, dy_; - TPos dx1, dy1, dx2, dy2; - TPos L, s, s_limit; - - - /* dx and dy are x and y components of the P0-P3 chord vector. */ - dx = dx_ = arc[3].x - arc[0].x; - dy = dy_ = arc[3].y - arc[0].y; - - L = FT_HYPOT( dx_, dy_ ); - - /* Avoid possible arithmetic overflow below by splitting. */ - if ( L > 32767 ) - goto Split; - - /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */ - s_limit = L * (TPos)( ONE_PIXEL / 6 ); - - /* s is L * the perpendicular distance from P1 to the line P0-P3. */ - dx1 = arc[1].x - arc[0].x; - dy1 = arc[1].y - arc[0].y; - s = FT_ABS( dy * dx1 - dx * dy1 ); - - if ( s > s_limit ) - goto Split; - - /* s is L * the perpendicular distance from P2 to the line P0-P3. */ - dx2 = arc[2].x - arc[0].x; - dy2 = arc[2].y - arc[0].y; - s = FT_ABS( dy * dx2 - dx * dy2 ); - - if ( s > s_limit ) - goto Split; - - /* Split super curvy segments where the off points are so far - from the chord that the angles P0-P1-P3 or P0-P2-P3 become - acute as detected by appropriate dot products. */ - if ( dx1 * ( dx1 - dx ) + dy1 * ( dy1 - dy ) > 0 || - dx2 * ( dx2 - dx ) + dy2 * ( dy2 - dy ) > 0 ) - goto Split; - - /* No reason to split. */ - goto Draw; - } - - Split: - gray_split_cubic( arc ); - arc += 3; - continue; - - Draw: - gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); - - if ( arc == ras.bez_stack ) - return; - - arc -= 3; - } - } - - - static int - gray_move_to( const FT_Vector* to, - gray_PWorker worker ) - { - TPos x, y; - - - /* record current cell, if any */ - if ( !ras.invalid ) - gray_record_cell( RAS_VAR ); - - /* start to a new position */ - x = UPSCALE( to->x ); - y = UPSCALE( to->y ); - - gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) ); - - worker->x = x; - worker->y = y; - return 0; - } - - - static int - gray_line_to( const FT_Vector* to, - gray_PWorker worker ) - { - gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) ); - return 0; - } - - - static int - gray_conic_to( const FT_Vector* control, - const FT_Vector* to, - gray_PWorker worker ) - { - gray_render_conic( RAS_VAR_ control, to ); - return 0; - } - - - static int - gray_cubic_to( const FT_Vector* control1, - const FT_Vector* control2, - const FT_Vector* to, - gray_PWorker worker ) - { - gray_render_cubic( RAS_VAR_ control1, control2, to ); - return 0; - } - - - static void - gray_render_span( int y, - int count, - const FT_Span* spans, - gray_PWorker worker ) - { - unsigned char* p; - FT_Bitmap* map = &worker->target; - - - /* first of all, compute the scanline offset */ - p = (unsigned char*)map->buffer - y * map->pitch; - if ( map->pitch >= 0 ) - p += ( map->rows - 1 ) * (unsigned int)map->pitch; - - for ( ; count > 0; count--, spans++ ) - { - unsigned char coverage = spans->coverage; - - - if ( coverage ) - { - /* For small-spans it is faster to do it by ourselves than - * calling `memset'. This is mainly due to the cost of the - * function call. - */ - if ( spans->len >= 8 ) - FT_MEM_SET( p + spans->x, (unsigned char)coverage, spans->len ); - else - { - unsigned char* q = p + spans->x; - - - switch ( spans->len ) - { - case 7: *q++ = (unsigned char)coverage; - case 6: *q++ = (unsigned char)coverage; - case 5: *q++ = (unsigned char)coverage; - case 4: *q++ = (unsigned char)coverage; - case 3: *q++ = (unsigned char)coverage; - case 2: *q++ = (unsigned char)coverage; - case 1: *q = (unsigned char)coverage; - default: - ; - } - } - } - } - } - - - static void - gray_hline( RAS_ARG_ TCoord x, - TCoord y, - TPos area, - TCoord acount ) - { - int coverage; - - - /* compute the coverage line's coverage, depending on the */ - /* outline fill rule */ - /* */ - /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */ - /* */ - coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) ); - /* use range 0..256 */ - if ( coverage < 0 ) - coverage = -coverage; - - if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL ) - { - coverage &= 511; - - if ( coverage > 256 ) - coverage = 512 - coverage; - else if ( coverage == 256 ) - coverage = 255; - } - else - { - /* normal non-zero winding rule */ - if ( coverage >= 256 ) - coverage = 255; - } - - y += (TCoord)ras.min_ey; - x += (TCoord)ras.min_ex; - - /* FT_Span.x is a 16-bit short, so limit our coordinates appropriately */ - if ( x >= 32767 ) - x = 32767; - - /* FT_Span.y is an integer, so limit our coordinates appropriately */ - if ( y >= FT_INT_MAX ) - y = FT_INT_MAX; - - if ( coverage ) - { - FT_Span* span; - int count; - - - /* see whether we can add this span to the current list */ - count = ras.num_gray_spans; - span = ras.gray_spans + count - 1; - if ( count > 0 && - ras.span_y == y && - (int)span->x + span->len == (int)x && - span->coverage == coverage ) - { - span->len = (unsigned short)( span->len + acount ); - return; - } - - if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS ) - { - if ( ras.render_span && count > 0 ) - ras.render_span( ras.span_y, count, ras.gray_spans, - ras.render_span_data ); - -#ifdef FT_DEBUG_LEVEL_TRACE - - if ( count > 0 ) - { - int n; - - - FT_TRACE7(( "y = %3d ", ras.span_y )); - span = ras.gray_spans; - for ( n = 0; n < count; n++, span++ ) - FT_TRACE7(( "[%d..%d]:%02x ", - span->x, span->x + span->len - 1, span->coverage )); - FT_TRACE7(( "\n" )); - } - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - ras.num_gray_spans = 0; - ras.span_y = (int)y; - - span = ras.gray_spans; - } - else - span++; - - /* add a gray span to the current list */ - span->x = (short)x; - span->len = (unsigned short)acount; - span->coverage = (unsigned char)coverage; - - ras.num_gray_spans++; - } - } - - -#ifdef FT_DEBUG_LEVEL_TRACE - - /* to be called while in the debugger -- */ - /* this function causes a compiler warning since it is unused otherwise */ - static void - gray_dump_cells( RAS_ARG ) - { - int yindex; - - - for ( yindex = 0; yindex < ras.ycount; yindex++ ) - { - PCell cell; - - - printf( "%3d:", yindex ); - - for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next ) - printf( " (%3ld, c:%4ld, a:%6d)", cell->x, cell->cover, cell->area ); - printf( "\n" ); - } - } - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - - static void - gray_sweep( RAS_ARG_ const FT_Bitmap* target ) - { - int yindex; - - FT_UNUSED( target ); - - - if ( ras.num_cells == 0 ) - return; - - ras.num_gray_spans = 0; - - FT_TRACE7(( "gray_sweep: start\n" )); - - for ( yindex = 0; yindex < ras.ycount; yindex++ ) - { - PCell cell = ras.ycells[yindex]; - TCoord cover = 0; - TCoord x = 0; - - - for ( ; cell != NULL; cell = cell->next ) - { - TPos area; - - - if ( cell->x > x && cover != 0 ) - gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), - cell->x - x ); - - cover += cell->cover; - area = cover * ( ONE_PIXEL * 2 ) - cell->area; - - if ( area != 0 && cell->x >= 0 ) - gray_hline( RAS_VAR_ cell->x, yindex, area, 1 ); - - x = cell->x + 1; - } - - if ( cover != 0 ) - gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), - ras.count_ex - x ); - } - - if ( ras.render_span && ras.num_gray_spans > 0 ) - ras.render_span( ras.span_y, ras.num_gray_spans, - ras.gray_spans, ras.render_span_data ); - -#ifdef FT_DEBUG_LEVEL_TRACE - - if ( ras.num_gray_spans > 0 ) - { - FT_Span* span; - int n; - - - FT_TRACE7(( "y = %3d ", ras.span_y )); - span = ras.gray_spans; - for ( n = 0; n < ras.num_gray_spans; n++, span++ ) - FT_TRACE7(( "[%d..%d]:%02x ", - span->x, span->x + span->len - 1, span->coverage )); - FT_TRACE7(( "\n" )); - } - - FT_TRACE7(( "gray_sweep: end\n" )); - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - } - - -#ifdef _STANDALONE_ - - /*************************************************************************/ - /* */ - /* The following function should only compile in stand-alone mode, */ - /* i.e., when building this component without the rest of FreeType. */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Decompose */ - /* */ - /* <Description> */ - /* Walk over an outline's structure to decompose it into individual */ - /* segments and Bézier arcs. This function is also able to emit */ - /* `move to' and `close to' operations to indicate the start and end */ - /* of new contours in the outline. */ - /* */ - /* <Input> */ - /* outline :: A pointer to the source target. */ - /* */ - /* func_interface :: A table of `emitters', i.e., function pointers */ - /* called during decomposition to indicate path */ - /* operations. */ - /* */ - /* <InOut> */ - /* user :: A typeless pointer which is passed to each */ - /* emitter during the decomposition. It can be */ - /* used to store the state during the */ - /* decomposition. */ - /* */ - /* <Return> */ - /* Error code. 0 means success. */ - /* */ - static int - FT_Outline_Decompose( const FT_Outline* outline, - const FT_Outline_Funcs* func_interface, - void* user ) - { -#undef SCALED -#define SCALED( x ) ( ( (x) << shift ) - delta ) - - FT_Vector v_last; - FT_Vector v_control; - FT_Vector v_start; - - FT_Vector* point; - FT_Vector* limit; - char* tags; - - int error; - - int n; /* index of contour in outline */ - int first; /* index of first point in contour */ - char tag; /* current point's state */ - - int shift; - TPos delta; - - - if ( !outline ) - return FT_THROW( Invalid_Outline ); - - if ( !func_interface ) - return FT_THROW( Invalid_Argument ); - - shift = func_interface->shift; - delta = func_interface->delta; - first = 0; - - for ( n = 0; n < outline->n_contours; n++ ) - { - int last; /* index of last point in contour */ - - - FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); - - last = outline->contours[n]; - if ( last < 0 ) - goto Invalid_Outline; - limit = outline->points + last; - - v_start = outline->points[first]; - v_start.x = SCALED( v_start.x ); - v_start.y = SCALED( v_start.y ); - - v_last = outline->points[last]; - v_last.x = SCALED( v_last.x ); - v_last.y = SCALED( v_last.y ); - - v_control = v_start; - - point = outline->points + first; - tags = outline->tags + first; - tag = FT_CURVE_TAG( tags[0] ); - - /* A contour cannot start with a cubic control point! */ - if ( tag == FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - /* check first point to determine origin */ - if ( tag == FT_CURVE_TAG_CONIC ) - { - /* first point is conic control. Yes, this happens. */ - if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) - { - /* start at last point if it is on the curve */ - v_start = v_last; - limit--; - } - else - { - /* if both first and last points are conic, */ - /* start at their middle and record its position */ - /* for closure */ - v_start.x = ( v_start.x + v_last.x ) / 2; - v_start.y = ( v_start.y + v_last.y ) / 2; - - v_last = v_start; - } - point--; - tags--; - } - - FT_TRACE5(( " move to (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0 )); - error = func_interface->move_to( &v_start, user ); - if ( error ) - goto Exit; - - while ( point < limit ) - { - point++; - tags++; - - tag = FT_CURVE_TAG( tags[0] ); - switch ( tag ) - { - case FT_CURVE_TAG_ON: /* emit a single line_to */ - { - FT_Vector vec; - - - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - FT_TRACE5(( " line to (%.2f, %.2f)\n", - vec.x / 64.0, vec.y / 64.0 )); - error = func_interface->line_to( &vec, user ); - if ( error ) - goto Exit; - continue; - } - - case FT_CURVE_TAG_CONIC: /* consume conic arcs */ - v_control.x = SCALED( point->x ); - v_control.y = SCALED( point->y ); - - Do_Conic: - if ( point < limit ) - { - FT_Vector vec; - FT_Vector v_middle; - - - point++; - tags++; - tag = FT_CURVE_TAG( tags[0] ); - - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - if ( tag == FT_CURVE_TAG_ON ) - { - FT_TRACE5(( " conic to (%.2f, %.2f)" - " with control (%.2f, %.2f)\n", - vec.x / 64.0, vec.y / 64.0, - v_control.x / 64.0, v_control.y / 64.0 )); - error = func_interface->conic_to( &v_control, &vec, user ); - if ( error ) - goto Exit; - continue; - } - - if ( tag != FT_CURVE_TAG_CONIC ) - goto Invalid_Outline; - - v_middle.x = ( v_control.x + vec.x ) / 2; - v_middle.y = ( v_control.y + vec.y ) / 2; - - FT_TRACE5(( " conic to (%.2f, %.2f)" - " with control (%.2f, %.2f)\n", - v_middle.x / 64.0, v_middle.y / 64.0, - v_control.x / 64.0, v_control.y / 64.0 )); - error = func_interface->conic_to( &v_control, &v_middle, user ); - if ( error ) - goto Exit; - - v_control = vec; - goto Do_Conic; - } - - FT_TRACE5(( " conic to (%.2f, %.2f)" - " with control (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0, - v_control.x / 64.0, v_control.y / 64.0 )); - error = func_interface->conic_to( &v_control, &v_start, user ); - goto Close; - - default: /* FT_CURVE_TAG_CUBIC */ - { - FT_Vector vec1, vec2; - - - if ( point + 1 > limit || - FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - point += 2; - tags += 2; - - vec1.x = SCALED( point[-2].x ); - vec1.y = SCALED( point[-2].y ); - - vec2.x = SCALED( point[-1].x ); - vec2.y = SCALED( point[-1].y ); - - if ( point <= limit ) - { - FT_Vector vec; - - - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - FT_TRACE5(( " cubic to (%.2f, %.2f)" - " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", - vec.x / 64.0, vec.y / 64.0, - vec1.x / 64.0, vec1.y / 64.0, - vec2.x / 64.0, vec2.y / 64.0 )); - error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); - if ( error ) - goto Exit; - continue; - } - - FT_TRACE5(( " cubic to (%.2f, %.2f)" - " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0, - vec1.x / 64.0, vec1.y / 64.0, - vec2.x / 64.0, vec2.y / 64.0 )); - error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); - goto Close; - } - } - } - - /* close the contour with a line segment */ - FT_TRACE5(( " line to (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0 )); - error = func_interface->line_to( &v_start, user ); - - Close: - if ( error ) - goto Exit; - - first = last + 1; - } - - FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); - return 0; - - Exit: - FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error )); - return error; - - Invalid_Outline: - return FT_THROW( Invalid_Outline ); - } - -#endif /* _STANDALONE_ */ - - - typedef struct gray_TBand_ - { - TPos min, max; - - } gray_TBand; - - - FT_DEFINE_OUTLINE_FUNCS( - func_interface, - - (FT_Outline_MoveTo_Func) gray_move_to, - (FT_Outline_LineTo_Func) gray_line_to, - (FT_Outline_ConicTo_Func)gray_conic_to, - (FT_Outline_CubicTo_Func)gray_cubic_to, - 0, - 0 ) - - - static int - gray_convert_glyph_inner( RAS_ARG ) - { - - volatile int error = 0; - -#ifdef FT_CONFIG_OPTION_PIC - FT_Outline_Funcs func_interface; - Init_Class_func_interface(&func_interface); -#endif - - if ( ft_setjmp( ras.jump_buffer ) == 0 ) - { - error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras ); - if ( !ras.invalid ) - gray_record_cell( RAS_VAR ); - } - else - error = FT_THROW( Memory_Overflow ); - - return error; - } - - - static int - gray_convert_glyph( RAS_ARG ) - { - gray_TBand bands[40]; - gray_TBand* volatile band; - int volatile n, num_bands; - TPos volatile min, max, max_y; - FT_BBox* clip; - - - /* Set up state in the raster object */ - gray_compute_cbox( RAS_VAR ); - - /* clip to target bitmap, exit if nothing to do */ - clip = &ras.clip_box; - - if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax || - ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax ) - return 0; - - if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin; - if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin; - - if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax; - if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax; - - ras.count_ex = ras.max_ex - ras.min_ex; - ras.count_ey = ras.max_ey - ras.min_ey; - - /* set up vertical bands */ - num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size ); - if ( num_bands == 0 ) - num_bands = 1; - if ( num_bands >= 39 ) - num_bands = 39; - - ras.band_shoot = 0; - - min = ras.min_ey; - max_y = ras.max_ey; - - for ( n = 0; n < num_bands; n++, min = max ) - { - max = min + ras.band_size; - if ( n == num_bands - 1 || max > max_y ) - max = max_y; - - bands[0].min = min; - bands[0].max = max; - band = bands; - - while ( band >= bands ) - { - TPos bottom, top, middle; - int error; - - { - PCell cells_max; - int yindex; - long cell_start, cell_end, cell_mod; - - - ras.ycells = (PCell*)ras.buffer; - ras.ycount = band->max - band->min; - - cell_start = (long)sizeof ( PCell ) * ras.ycount; - cell_mod = cell_start % (long)sizeof ( TCell ); - if ( cell_mod > 0 ) - cell_start += (long)sizeof ( TCell ) - cell_mod; - - cell_end = ras.buffer_size; - cell_end -= cell_end % (long)sizeof ( TCell ); - - cells_max = (PCell)( (char*)ras.buffer + cell_end ); - ras.cells = (PCell)( (char*)ras.buffer + cell_start ); - if ( ras.cells >= cells_max ) - goto ReduceBands; - - ras.max_cells = cells_max - ras.cells; - if ( ras.max_cells < 2 ) - goto ReduceBands; - - for ( yindex = 0; yindex < ras.ycount; yindex++ ) - ras.ycells[yindex] = NULL; - } - - ras.num_cells = 0; - ras.invalid = 1; - ras.min_ey = band->min; - ras.max_ey = band->max; - ras.count_ey = band->max - band->min; - - error = gray_convert_glyph_inner( RAS_VAR ); - - if ( !error ) - { - gray_sweep( RAS_VAR_ &ras.target ); - band--; - continue; - } - else if ( error != ErrRaster_Memory_Overflow ) - return 1; - - ReduceBands: - /* render pool overflow; we will reduce the render band by half */ - bottom = band->min; - top = band->max; - middle = bottom + ( ( top - bottom ) >> 1 ); - - /* This is too complex for a single scanline; there must */ - /* be some problems. */ - if ( middle == bottom ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" )); -#endif - return 1; - } - - if ( bottom-top >= ras.band_size ) - ras.band_shoot++; - - band[1].min = bottom; - band[1].max = middle; - band[0].min = middle; - band[0].max = top; - band++; - } - } - - if ( ras.band_shoot > 8 && ras.band_size > 16 ) - ras.band_size = ras.band_size / 2; - - return 0; - } - - - static int - gray_raster_render( gray_PRaster raster, - const FT_Raster_Params* params ) - { - const FT_Outline* outline = (const FT_Outline*)params->source; - const FT_Bitmap* target_map = params->target; - - gray_TWorker worker[1]; - - TCell buffer[FT_MAX( FT_RENDER_POOL_SIZE, 2048 ) / sizeof ( TCell )]; - long buffer_size = sizeof ( buffer ); - int band_size = (int)( buffer_size / - (long)( sizeof ( TCell ) * 8 ) ); - - - if ( !raster ) - return FT_THROW( Invalid_Argument ); - - if ( !outline ) - return FT_THROW( Invalid_Outline ); - - /* return immediately if the outline is empty */ - if ( outline->n_points == 0 || outline->n_contours <= 0 ) - return 0; - - if ( !outline->contours || !outline->points ) - return FT_THROW( Invalid_Outline ); - - if ( outline->n_points != - outline->contours[outline->n_contours - 1] + 1 ) - return FT_THROW( Invalid_Outline ); - - /* if direct mode is not set, we must have a target bitmap */ - if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) ) - { - if ( !target_map ) - return FT_THROW( Invalid_Argument ); - - /* nothing to do */ - if ( !target_map->width || !target_map->rows ) - return 0; - - if ( !target_map->buffer ) - return FT_THROW( Invalid_Argument ); - } - - /* this version does not support monochrome rendering */ - if ( !( params->flags & FT_RASTER_FLAG_AA ) ) - return FT_THROW( Invalid_Mode ); - - /* compute clipping box */ - if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) ) - { - /* compute clip box from target pixmap */ - ras.clip_box.xMin = 0; - ras.clip_box.yMin = 0; - ras.clip_box.xMax = (FT_Pos)target_map->width; - ras.clip_box.yMax = (FT_Pos)target_map->rows; - } - else if ( params->flags & FT_RASTER_FLAG_CLIP ) - ras.clip_box = params->clip_box; - else - { - ras.clip_box.xMin = -32768L; - ras.clip_box.yMin = -32768L; - ras.clip_box.xMax = 32767L; - ras.clip_box.yMax = 32767L; - } - - gray_init_cells( RAS_VAR_ buffer, buffer_size ); - - ras.outline = *outline; - ras.num_cells = 0; - ras.invalid = 1; - ras.band_size = band_size; - ras.num_gray_spans = 0; - ras.span_y = 0; - - if ( params->flags & FT_RASTER_FLAG_DIRECT ) - { - ras.render_span = (FT_Raster_Span_Func)params->gray_spans; - ras.render_span_data = params->user; - } - else - { - ras.target = *target_map; - ras.render_span = (FT_Raster_Span_Func)gray_render_span; - ras.render_span_data = &ras; - } - - return gray_convert_glyph( RAS_VAR ); - } - - - /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/ - /**** a static object. *****/ - -#ifdef _STANDALONE_ - - static int - gray_raster_new( void* memory, - FT_Raster* araster ) - { - static gray_TRaster the_raster; - - FT_UNUSED( memory ); - - - *araster = (FT_Raster)&the_raster; - FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); - - return 0; - } - - - static void - gray_raster_done( FT_Raster raster ) - { - /* nothing */ - FT_UNUSED( raster ); - } - -#else /* !_STANDALONE_ */ - - static int - gray_raster_new( FT_Memory memory, - FT_Raster* araster ) - { - FT_Error error; - gray_PRaster raster = NULL; - - - *araster = 0; - if ( !FT_ALLOC( raster, sizeof ( gray_TRaster ) ) ) - { - raster->memory = memory; - *araster = (FT_Raster)raster; - } - - return error; - } - - - static void - gray_raster_done( FT_Raster raster ) - { - FT_Memory memory = (FT_Memory)((gray_PRaster)raster)->memory; - - - FT_FREE( raster ); - } - -#endif /* !_STANDALONE_ */ - - - static void - gray_raster_reset( FT_Raster raster, - char* pool_base, - long pool_size ) - { - FT_UNUSED( raster ); - FT_UNUSED( pool_base ); - FT_UNUSED( pool_size ); - } - - - static int - gray_raster_set_mode( FT_Raster raster, - unsigned long mode, - void* args ) - { - FT_UNUSED( raster ); - FT_UNUSED( mode ); - FT_UNUSED( args ); - - - return 0; /* nothing to do */ - } - - - FT_DEFINE_RASTER_FUNCS( - ft_grays_raster, - - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Raster_New_Func) gray_raster_new, - (FT_Raster_Reset_Func) gray_raster_reset, - (FT_Raster_Set_Mode_Func)gray_raster_set_mode, - (FT_Raster_Render_Func) gray_raster_render, - (FT_Raster_Done_Func) gray_raster_done ) - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/3party/freetype/src/smooth/ftgrays.h b/3party/freetype/src/smooth/ftgrays.h deleted file mode 100644 index 1b5760330c..0000000000 --- a/3party/freetype/src/smooth/ftgrays.h +++ /dev/null @@ -1,58 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgrays.h */ -/* */ -/* FreeType smooth renderer declaration */ -/* */ -/* Copyright 1996-2015 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 __FTGRAYS_H__ -#define __FTGRAYS_H__ - -#ifdef __cplusplus - extern "C" { -#endif - - -#ifdef _STANDALONE_ -#include "ftimage.h" -#else -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H /* for FT_CONFIG_OPTION_PIC */ -#include FT_IMAGE_H -#endif - - - /*************************************************************************/ - /* */ - /* To make ftgrays.h independent from configuration files we check */ - /* whether FT_EXPORT_VAR has been defined already. */ - /* */ - /* On some systems and compilers (Win32 mostly), an extra keyword is */ - /* necessary to compile the library as a DLL. */ - /* */ -#ifndef FT_EXPORT_VAR -#define FT_EXPORT_VAR( x ) extern x -#endif - - FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_grays_raster; - - -#ifdef __cplusplus - } -#endif - -#endif /* __FTGRAYS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/smooth/ftsmerrs.h b/3party/freetype/src/smooth/ftsmerrs.h deleted file mode 100644 index cc38aa1996..0000000000 --- a/3party/freetype/src/smooth/ftsmerrs.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsmerrs.h */ -/* */ -/* smooth renderer error codes (specification only). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the smooth renderer error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __FTSMERRS_H__ -#define __FTSMERRS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX Smooth_Err_ -#define FT_ERR_BASE FT_Mod_Err_Smooth - -#include FT_ERRORS_H - -#endif /* __FTSMERRS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/smooth/ftsmooth.c b/3party/freetype/src/smooth/ftsmooth.c deleted file mode 100644 index 3620550534..0000000000 --- a/3party/freetype/src/smooth/ftsmooth.c +++ /dev/null @@ -1,511 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsmooth.c */ -/* */ -/* Anti-aliasing renderer interface (body). */ -/* */ -/* Copyright 2000-2015 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 <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_OUTLINE_H -#include "ftsmooth.h" -#include "ftgrays.h" -#include "ftspic.h" - -#include "ftsmerrs.h" - - - /* initialize renderer -- init its raster */ - static FT_Error - ft_smooth_init( FT_Renderer render ) - { - FT_Library library = FT_MODULE_LIBRARY( render ); - - - render->clazz->raster_class->raster_reset( render->raster, - library->raster_pool, - library->raster_pool_size ); - - return 0; - } - - - /* sets render-specific mode */ - static FT_Error - ft_smooth_set_mode( FT_Renderer render, - FT_ULong mode_tag, - FT_Pointer data ) - { - /* we simply pass it to the raster */ - return render->clazz->raster_class->raster_set_mode( render->raster, - mode_tag, - data ); - } - - /* transform a given glyph image */ - static FT_Error - ft_smooth_transform( FT_Renderer render, - FT_GlyphSlot slot, - const FT_Matrix* matrix, - const FT_Vector* delta ) - { - FT_Error error = FT_Err_Ok; - - - if ( slot->format != render->glyph_format ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - if ( matrix ) - FT_Outline_Transform( &slot->outline, matrix ); - - if ( delta ) - FT_Outline_Translate( &slot->outline, delta->x, delta->y ); - - Exit: - return error; - } - - - /* return the glyph's control box */ - static void - ft_smooth_get_cbox( FT_Renderer render, - FT_GlyphSlot slot, - FT_BBox* cbox ) - { - FT_MEM_ZERO( cbox, sizeof ( *cbox ) ); - - if ( slot->format == render->glyph_format ) - FT_Outline_Get_CBox( &slot->outline, cbox ); - } - - - /* convert a slot's glyph image into a bitmap */ - static FT_Error - ft_smooth_render_generic( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin, - FT_Render_Mode required_mode ) - { - FT_Error error; - FT_Outline* outline = &slot->outline; - FT_Bitmap* bitmap = &slot->bitmap; - FT_Memory memory = render->root.memory; - FT_BBox cbox; - FT_Pos x_shift = 0; - FT_Pos y_shift = 0; - FT_Pos x_left, y_top; - FT_Pos width, height, pitch; -#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - FT_Pos height_org, width_org; -#endif - FT_Int hmul = mode == FT_RENDER_MODE_LCD; - FT_Int vmul = mode == FT_RENDER_MODE_LCD_V; - - FT_Raster_Params params; - - FT_Bool have_outline_shifted = FALSE; - FT_Bool have_buffer = FALSE; - - - /* check glyph image format */ - if ( slot->format != render->glyph_format ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* check mode */ - if ( mode != required_mode ) - { - error = FT_THROW( Cannot_Render_Glyph ); - goto Exit; - } - - if ( origin ) - { - x_shift = origin->x; - y_shift = origin->y; - } - - /* compute the control box, and grid fit it */ - /* taking into account the origin shift */ - FT_Outline_Get_CBox( outline, &cbox ); - - cbox.xMin = FT_PIX_FLOOR( cbox.xMin + x_shift ); - cbox.yMin = FT_PIX_FLOOR( cbox.yMin + y_shift ); - cbox.xMax = FT_PIX_CEIL( cbox.xMax + x_shift ); - cbox.yMax = FT_PIX_CEIL( cbox.yMax + y_shift ); - - x_shift -= cbox.xMin; - y_shift -= cbox.yMin; - - x_left = cbox.xMin >> 6; - y_top = cbox.yMax >> 6; - - width = (FT_ULong)( cbox.xMax - cbox.xMin ) >> 6; - height = (FT_ULong)( cbox.yMax - cbox.yMin ) >> 6; - -#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - width_org = width; - height_org = height; -#endif - - pitch = width; - if ( hmul ) - { - width *= 3; - pitch = FT_PAD_CEIL( width, 4 ); - } - - if ( vmul ) - height *= 3; - -#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - - if ( slot->library->lcd_filter_func ) - { - FT_Int extra = slot->library->lcd_extra; - - - if ( hmul ) - { - x_shift += 64 * ( extra >> 1 ); - x_left -= extra >> 1; - width += 3 * extra; - pitch = FT_PAD_CEIL( width, 4 ); - } - - if ( vmul ) - { - y_shift += 64 * ( extra >> 1 ); - y_top += extra >> 1; - height += 3 * extra; - } - } - -#endif - - /* - * XXX: on 16bit system, we return an error for huge bitmap - * to prevent an overflow. - */ - if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX || - x_left < FT_INT_MIN || y_top < FT_INT_MIN ) - { - error = FT_THROW( Invalid_Pixel_Size ); - goto Exit; - } - - /* Required check is (pitch * height < FT_ULONG_MAX), */ - /* but we care realistic cases only. Always pitch <= width. */ - if ( width > 0x7FFF || height > 0x7FFF ) - { - FT_ERROR(( "ft_smooth_render_generic: glyph too large: %u x %u\n", - width, height )); - error = FT_THROW( Raster_Overflow ); - goto Exit; - } - - /* release old bitmap buffer */ - if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) - { - FT_FREE( bitmap->buffer ); - slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; - } - - /* allocate new one */ - if ( FT_ALLOC( bitmap->buffer, (FT_ULong)( pitch * height ) ) ) - goto Exit; - else - have_buffer = TRUE; - - slot->internal->flags |= FT_GLYPH_OWN_BITMAP; - - slot->format = FT_GLYPH_FORMAT_BITMAP; - slot->bitmap_left = (FT_Int)x_left; - slot->bitmap_top = (FT_Int)y_top; - - bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; - bitmap->num_grays = 256; - bitmap->width = (unsigned int)width; - bitmap->rows = (unsigned int)height; - bitmap->pitch = pitch; - - /* translate outline to render it into the bitmap */ - if ( x_shift || y_shift ) - { - FT_Outline_Translate( outline, x_shift, y_shift ); - have_outline_shifted = TRUE; - } - - /* set up parameters */ - params.target = bitmap; - params.source = outline; - params.flags = FT_RASTER_FLAG_AA; - -#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - - /* implode outline if needed */ - { - FT_Vector* points = outline->points; - FT_Vector* points_end = points + outline->n_points; - FT_Vector* vec; - - - if ( hmul ) - for ( vec = points; vec < points_end; vec++ ) - vec->x *= 3; - - if ( vmul ) - for ( vec = points; vec < points_end; vec++ ) - vec->y *= 3; - } - - /* render outline into the bitmap */ - error = render->raster_render( render->raster, ¶ms ); - - /* deflate outline if needed */ - { - FT_Vector* points = outline->points; - FT_Vector* points_end = points + outline->n_points; - FT_Vector* vec; - - - if ( hmul ) - for ( vec = points; vec < points_end; vec++ ) - vec->x /= 3; - - if ( vmul ) - for ( vec = points; vec < points_end; vec++ ) - vec->y /= 3; - } - - if ( error ) - goto Exit; - - if ( slot->library->lcd_filter_func ) - slot->library->lcd_filter_func( bitmap, mode, slot->library ); - -#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ - - /* render outline into bitmap */ - error = render->raster_render( render->raster, ¶ms ); - if ( error ) - goto Exit; - - /* expand it horizontally */ - if ( hmul ) - { - FT_Byte* line = bitmap->buffer; - FT_UInt hh; - - - for ( hh = height_org; hh > 0; hh--, line += pitch ) - { - FT_UInt xx; - FT_Byte* end = line + width; - - - for ( xx = width_org; xx > 0; xx-- ) - { - FT_UInt pixel = line[xx-1]; - - - end[-3] = (FT_Byte)pixel; - end[-2] = (FT_Byte)pixel; - end[-1] = (FT_Byte)pixel; - end -= 3; - } - } - } - - /* expand it vertically */ - if ( vmul ) - { - FT_Byte* read = bitmap->buffer + ( height - height_org ) * pitch; - FT_Byte* write = bitmap->buffer; - FT_UInt hh; - - - for ( hh = height_org; hh > 0; hh-- ) - { - ft_memcpy( write, read, pitch ); - write += pitch; - - ft_memcpy( write, read, pitch ); - write += pitch; - - ft_memcpy( write, read, pitch ); - write += pitch; - read += pitch; - } - } - -#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ - - /* everything is fine; don't deallocate buffer */ - have_buffer = FALSE; - - error = FT_Err_Ok; - - Exit: - if ( have_outline_shifted ) - FT_Outline_Translate( outline, -x_shift, -y_shift ); - if ( have_buffer ) - { - FT_FREE( bitmap->buffer ); - slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; - } - - return error; - } - - - /* convert a slot's glyph image into a bitmap */ - static FT_Error - ft_smooth_render( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin ) - { - if ( mode == FT_RENDER_MODE_LIGHT ) - mode = FT_RENDER_MODE_NORMAL; - - return ft_smooth_render_generic( render, slot, mode, origin, - FT_RENDER_MODE_NORMAL ); - } - - - /* convert a slot's glyph image into a horizontal LCD bitmap */ - static FT_Error - ft_smooth_render_lcd( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin ) - { - FT_Error error; - - error = ft_smooth_render_generic( render, slot, mode, origin, - FT_RENDER_MODE_LCD ); - if ( !error ) - slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD; - - return error; - } - - - /* convert a slot's glyph image into a vertical LCD bitmap */ - static FT_Error - ft_smooth_render_lcd_v( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin ) - { - FT_Error error; - - error = ft_smooth_render_generic( render, slot, mode, origin, - FT_RENDER_MODE_LCD_V ); - if ( !error ) - slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V; - - return error; - } - - - FT_DEFINE_RENDERER( ft_smooth_renderer_class, - - FT_MODULE_RENDERER, - sizeof ( FT_RendererRec ), - - "smooth", - 0x10000L, - 0x20000L, - - 0, /* module specific interface */ - - (FT_Module_Constructor)ft_smooth_init, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - , - - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Renderer_RenderFunc) ft_smooth_render, - (FT_Renderer_TransformFunc)ft_smooth_transform, - (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, - (FT_Renderer_SetModeFunc) ft_smooth_set_mode, - - (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET - ) - - - FT_DEFINE_RENDERER( ft_smooth_lcd_renderer_class, - - FT_MODULE_RENDERER, - sizeof ( FT_RendererRec ), - - "smooth-lcd", - 0x10000L, - 0x20000L, - - 0, /* module specific interface */ - - (FT_Module_Constructor)ft_smooth_init, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - , - - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Renderer_RenderFunc) ft_smooth_render_lcd, - (FT_Renderer_TransformFunc)ft_smooth_transform, - (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, - (FT_Renderer_SetModeFunc) ft_smooth_set_mode, - - (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET - ) - - FT_DEFINE_RENDERER( ft_smooth_lcdv_renderer_class, - - FT_MODULE_RENDERER, - sizeof ( FT_RendererRec ), - - "smooth-lcdv", - 0x10000L, - 0x20000L, - - 0, /* module specific interface */ - - (FT_Module_Constructor)ft_smooth_init, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - , - - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Renderer_RenderFunc) ft_smooth_render_lcd_v, - (FT_Renderer_TransformFunc)ft_smooth_transform, - (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, - (FT_Renderer_SetModeFunc) ft_smooth_set_mode, - - (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET - ) - - -/* END */ diff --git a/3party/freetype/src/smooth/ftsmooth.h b/3party/freetype/src/smooth/ftsmooth.h deleted file mode 100644 index 765018c239..0000000000 --- a/3party/freetype/src/smooth/ftsmooth.h +++ /dev/null @@ -1,49 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsmooth.h */ -/* */ -/* Anti-aliasing renderer interface (specification). */ -/* */ -/* Copyright 1996-2015 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 __FTSMOOTH_H__ -#define __FTSMOOTH_H__ - - -#include <ft2build.h> -#include FT_RENDER_H - - -FT_BEGIN_HEADER - - -#ifndef FT_CONFIG_OPTION_NO_STD_RASTER - FT_DECLARE_RENDERER( ft_std_renderer_class ) -#endif - -#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER - FT_DECLARE_RENDERER( ft_smooth_renderer_class ) - - FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class ) - - FT_DECLARE_RENDERER( ft_smooth_lcd_v_renderer_class ) -#endif - - - -FT_END_HEADER - -#endif /* __FTSMOOTH_H__ */ - - -/* END */ diff --git a/3party/freetype/src/smooth/ftspic.c b/3party/freetype/src/smooth/ftspic.c deleted file mode 100644 index 8e6ed57eec..0000000000 --- a/3party/freetype/src/smooth/ftspic.c +++ /dev/null @@ -1,118 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftspic.c */ -/* */ -/* The FreeType position independent code services for smooth module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "ftspic.h" -#include "ftsmerrs.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from ftgrays.c */ - void - FT_Init_Class_ft_grays_raster( FT_Raster_Funcs* funcs ); - - - void - ft_smooth_renderer_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->smooth ) - { - SmoothPIC* container = (SmoothPIC*)pic_container->smooth; - - - if ( --container->ref_count ) - return; - - FT_FREE( container ); - pic_container->smooth = NULL; - } - } - - - FT_Error - ft_smooth_renderer_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - SmoothPIC* container = NULL; - FT_Memory memory = library->memory; - - - /* since this function also serve smooth_lcd and smooth_lcdv renderers, - it implements reference counting */ - if ( pic_container->smooth ) - { - ((SmoothPIC*)pic_container->smooth)->ref_count++; - return error; - } - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->smooth = container; - - container->ref_count = 1; - - /* initialize pointer table - */ - /* this is how the module usually expects this data */ - FT_Init_Class_ft_grays_raster( &container->ft_grays_raster ); - - return error; - } - - - /* re-route these init and free functions to the above functions */ - FT_Error - ft_smooth_lcd_renderer_class_pic_init( FT_Library library ) - { - return ft_smooth_renderer_class_pic_init( library ); - } - - - void - ft_smooth_lcd_renderer_class_pic_free( FT_Library library ) - { - ft_smooth_renderer_class_pic_free( library ); - } - - - FT_Error - ft_smooth_lcdv_renderer_class_pic_init( FT_Library library ) - { - return ft_smooth_renderer_class_pic_init( library ); - } - - - void - ft_smooth_lcdv_renderer_class_pic_free( FT_Library library ) - { - ft_smooth_renderer_class_pic_free( library ); - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/3party/freetype/src/smooth/ftspic.h b/3party/freetype/src/smooth/ftspic.h deleted file mode 100644 index 071afcff20..0000000000 --- a/3party/freetype/src/smooth/ftspic.h +++ /dev/null @@ -1,75 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftspic.h */ -/* */ -/* The FreeType position independent code services for smooth module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 __FTSPIC_H__ -#define __FTSPIC_H__ - - -#include FT_INTERNAL_PIC_H - - -FT_BEGIN_HEADER - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_GRAYS_RASTER_GET ft_grays_raster - -#else /* FT_CONFIG_OPTION_PIC */ - - typedef struct SmoothPIC_ - { - int ref_count; - FT_Raster_Funcs ft_grays_raster; - - } SmoothPIC; - - -#define GET_PIC( lib ) \ - ( (SmoothPIC*)( (lib)->pic_container.smooth ) ) -#define FT_GRAYS_RASTER_GET ( GET_PIC( library )->ft_grays_raster ) - - - /* see ftspic.c for the implementation */ - void - ft_smooth_renderer_class_pic_free( FT_Library library ); - - void - ft_smooth_lcd_renderer_class_pic_free( FT_Library library ); - - void - ft_smooth_lcdv_renderer_class_pic_free( FT_Library library ); - - FT_Error - ft_smooth_renderer_class_pic_init( FT_Library library ); - - FT_Error - ft_smooth_lcd_renderer_class_pic_init( FT_Library library ); - - FT_Error - ft_smooth_lcdv_renderer_class_pic_init( FT_Library library ); - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* __FTSPIC_H__ */ - - -/* END */ diff --git a/3party/freetype/src/smooth/module.mk b/3party/freetype/src/smooth/module.mk deleted file mode 100644 index 740936f5b1..0000000000 --- a/3party/freetype/src/smooth/module.mk +++ /dev/null @@ -1,27 +0,0 @@ -# -# FreeType 2 smooth renderer module definition -# - - -# Copyright 1996-2015 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. - - -FTMODULE_H_COMMANDS += SMOOTH_RENDERER - -define SMOOTH_RENDERER -$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_renderer_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer$(ECHO_DRIVER_DONE) -$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcd_renderer_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for LCDs$(ECHO_DRIVER_DONE) -$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcdv_renderer_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for vertical LCDs$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/smooth/rules.mk b/3party/freetype/src/smooth/rules.mk deleted file mode 100644 index f00ebd5f15..0000000000 --- a/3party/freetype/src/smooth/rules.mk +++ /dev/null @@ -1,74 +0,0 @@ -# -# FreeType 2 smooth renderer module build rules -# - - -# Copyright 1996-2015 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. - - -# smooth driver directory -# -SMOOTH_DIR := $(SRC_DIR)/smooth - - -# compilation flags for the driver -# -SMOOTH_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(SMOOTH_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# smooth driver sources (i.e., C files) -# -SMOOTH_DRV_SRC := $(SMOOTH_DIR)/ftgrays.c \ - $(SMOOTH_DIR)/ftsmooth.c \ - $(SMOOTH_DIR)/ftspic.c - - -# smooth driver headers -# -SMOOTH_DRV_H := $(SMOOTH_DRV_SRC:%c=%h) \ - $(SMOOTH_DIR)/ftsmerrs.h - - -# smooth driver object(s) -# -# SMOOTH_DRV_OBJ_M is used during `multi' builds. -# SMOOTH_DRV_OBJ_S is used during `single' builds. -# -SMOOTH_DRV_OBJ_M := $(SMOOTH_DRV_SRC:$(SMOOTH_DIR)/%.c=$(OBJ_DIR)/%.$O) -SMOOTH_DRV_OBJ_S := $(OBJ_DIR)/smooth.$O - -# smooth driver source file for single build -# -SMOOTH_DRV_SRC_S := $(SMOOTH_DIR)/smooth.c - - -# smooth driver - single object -# -$(SMOOTH_DRV_OBJ_S): $(SMOOTH_DRV_SRC_S) $(SMOOTH_DRV_SRC) \ - $(FREETYPE_H) $(SMOOTH_DRV_H) - $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SMOOTH_DRV_SRC_S)) - - -# smooth driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(SMOOTH_DIR)/%.c $(FREETYPE_H) $(SMOOTH_DRV_H) - $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(SMOOTH_DRV_OBJ_S) -DRV_OBJS_M += $(SMOOTH_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/smooth/smooth.c b/3party/freetype/src/smooth/smooth.c deleted file mode 100644 index 4ca4344c89..0000000000 --- a/3party/freetype/src/smooth/smooth.c +++ /dev/null @@ -1,27 +0,0 @@ -/***************************************************************************/ -/* */ -/* smooth.c */ -/* */ -/* FreeType anti-aliasing rasterer module component (body only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "ftspic.c" -#include "ftgrays.c" -#include "ftsmooth.c" - - -/* END */ diff --git a/3party/freetype/src/tools/Jamfile b/3party/freetype/src/tools/Jamfile deleted file mode 100644 index 475161e07f..0000000000 --- a/3party/freetype/src/tools/Jamfile +++ /dev/null @@ -1,5 +0,0 @@ -# Jamfile for src/tools -# -SubDir FT2_TOP src tools ; - -Main apinames : apinames.c ; diff --git a/3party/freetype/src/tools/afblue.pl b/3party/freetype/src/tools/afblue.pl deleted file mode 100644 index 56b6452348..0000000000 --- a/3party/freetype/src/tools/afblue.pl +++ /dev/null @@ -1,548 +0,0 @@ -#! /usr/bin/perl -w -# -*- Perl -*- -# -# afblue.pl -# -# Process a blue zone character data file. -# -# Copyright 2013-2015 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. - -use strict; -use warnings; -use English '-no_match_vars'; -use open ':std', ':encoding(UTF-8)'; - - -my $prog = $PROGRAM_NAME; -$prog =~ s| .* / ||x; # Remove path. - -die "usage: $prog datafile < infile > outfile\n" if $#ARGV != 0; - - -my $datafile = $ARGV[0]; - -my %diversions; # The extracted and massaged data from `datafile'. -my @else_stack; # Booleans to track else-clauses. -my @name_stack; # Stack of integers used for names of aux. variables. - -my $curr_enum; # Name of the current enumeration. -my $curr_array; # Name of the current array. -my $curr_max; # Name of the current maximum value. - -my $curr_enum_element; # Name of the current enumeration element. -my $curr_offset; # The offset relative to current aux. variable. -my $curr_elem_size; # The size of the current string or block. - -my $have_sections = 0; # Boolean; set if start of a section has been seen. -my $have_strings; # Boolean; set if current section contains strings. -my $have_blocks; # Boolean; set if current section contains blocks. - -my $have_enum_element; # Boolean; set if we have an enumeration element. -my $in_string; # Boolean; set if a string has been parsed. - -my $num_sections = 0; # Number of sections seen so far. - -my $last_aux; # Name of last auxiliary variable. - - -# Regular expressions. - -# [<ws>] <enum_name> <ws> <array_name> <ws> <max_name> [<ws>] ':' [<ws>] '\n' -my $section_re = qr/ ^ \s* (\S+) \s+ (\S+) \s+ (\S+) \s* : \s* $ /x; - -# [<ws>] <enum_element_name> [<ws>] '\n' -my $enum_element_re = qr/ ^ \s* ( [A-Za-z0-9_]+ ) \s* $ /x; - -# '#' <preprocessor directive> '\n' -my $preprocessor_re = qr/ ^ \# /x; - -# [<ws>] '/' '/' <comment> '\n' -my $comment_re = qr| ^ \s* // |x; - -# empty line -my $whitespace_only_re = qr/ ^ \s* $ /x; - -# [<ws>] '"' <string> '"' [<ws>] '\n' (<string> doesn't contain newlines) -my $string_re = qr/ ^ \s* - " ( (?> (?: (?> [^"\\]+ ) | \\. )* ) ) " - \s* $ /x; - -# [<ws>] '{' <block> '}' [<ws>] '\n' (<block> can contain newlines) -my $block_start_re = qr/ ^ \s* \{ /x; - -# We need the capturing group for `split' to make it return the separator -# tokens (i.e., the opening and closing brace) also. -my $brace_re = qr/ ( [{}] ) /x; - - -sub Warn -{ - my $message = shift; - warn "$datafile:$INPUT_LINE_NUMBER: warning: $message\n"; -} - - -sub Die -{ - my $message = shift; - die "$datafile:$INPUT_LINE_NUMBER: error: $message\n"; -} - - -my $warned_before = 0; - -sub warn_before -{ - Warn("data before first section gets ignored") unless $warned_before; - $warned_before = 1; -} - - -sub strip_newline -{ - chomp; - s/ \x0D $ //x; -} - - -sub end_curr_string -{ - # Append final null byte to string. - if ($have_strings) - { - push @{$diversions{$curr_array}}, " '\\0',\n" if $in_string; - - $curr_offset++; - $in_string = 0; - } -} - - -sub update_max_elem_size -{ - if ($curr_elem_size) - { - my $max = pop @{$diversions{$curr_max}}; - $max = $curr_elem_size if $curr_elem_size > $max; - push @{$diversions{$curr_max}}, $max; - } -} - - -sub convert_non_ascii_char -{ - # A UTF-8 character outside of the printable ASCII range, with possibly a - # leading backslash character. - my $s = shift; - - # Here we count characters, not bytes. - $curr_elem_size += length $s; - - utf8::encode($s); - $s = uc unpack 'H*', $s; - - $curr_offset += $s =~ s/\G(..)/'\\x$1', /sg; - - return $s; -} - - -sub convert_ascii_chars -{ - # A series of ASCII characters in the printable range. - my $s = shift; - - # We ignore spaces. - $s =~ s/ //g; - - my $count = $s =~ s/\G(.)/'$1', /g; - $curr_offset += $count; - $curr_elem_size += $count; - - return $s; -} - - -sub convert_literal -{ - my $s = shift; - my $orig = $s; - - # ASCII printables and space - my $safe_re = '\x20-\x7E'; - # ASCII printables and space, no backslash - my $safe_no_backslash_re = '\x20-\x5B\x5D-\x7E'; - - $s =~ s{ - (?: \\? ( [^$safe_re] ) - | ( (?: [$safe_no_backslash_re] - | \\ [$safe_re] )+ ) ) - } - { - defined($1) ? convert_non_ascii_char($1) - : convert_ascii_chars($2) - }egx; - - # We assume that `$orig' doesn't contain `*/' - return $s . " /* $orig */"; -} - - -sub aux_name -{ - return "af_blue_" . $num_sections. "_" . join('_', @name_stack); -} - - -sub aux_name_next -{ - $name_stack[$#name_stack]++; - my $name = aux_name(); - $name_stack[$#name_stack]--; - - return $name; -} - - -sub enum_val_string -{ - # Build string that holds code to save the current offset in an - # enumeration element. - my $aux = shift; - - my $add = ($last_aux eq "af_blue_" . $num_sections . "_0" ) - ? "" - : "$last_aux + "; - - return " $aux = $add$curr_offset,\n"; -} - - - -# Process data file. - -open(DATA, $datafile) || die "$prog: can't open \`$datafile': $OS_ERROR\n"; - -while (<DATA>) -{ - strip_newline(); - - next if /$comment_re/; - next if /$whitespace_only_re/; - - if (/$section_re/) - { - Warn("previous section is empty") if ($have_sections - && !$have_strings - && !$have_blocks); - - end_curr_string(); - update_max_elem_size(); - - # Save captured groups from `section_re'. - $curr_enum = $1; - $curr_array = $2; - $curr_max = $3; - - $curr_enum_element = ""; - $curr_offset = 0; - - Warn("overwriting already defined enumeration \`$curr_enum'") - if exists($diversions{$curr_enum}); - Warn("overwriting already defined array \`$curr_array'") - if exists($diversions{$curr_array}); - Warn("overwriting already defined maximum value \`$curr_max'") - if exists($diversions{$curr_max}); - - $diversions{$curr_enum} = []; - $diversions{$curr_array} = []; - $diversions{$curr_max} = []; - - push @{$diversions{$curr_max}}, 0; - - @name_stack = (); - push @name_stack, 0; - - $have_sections = 1; - $have_strings = 0; - $have_blocks = 0; - - $have_enum_element = 0; - $in_string = 0; - - $num_sections++; - $curr_elem_size = 0; - - $last_aux = aux_name(); - - next; - } - - if (/$preprocessor_re/) - { - if ($have_sections) - { - # Having preprocessor conditionals complicates the computation of - # correct offset values. We have to introduce auxiliary enumeration - # elements with the name `af_blue_<s>_<n1>_<n2>_...' that store - # offsets to be used in conditional clauses. `<s>' is the number of - # sections seen so far, `<n1>' is the number of `#if' and `#endif' - # conditionals seen so far in the topmost level, `<n2>' the number of - # `#if' and `#endif' conditionals seen so far one level deeper, etc. - # As a consequence, uneven values are used within a clause, and even - # values after a clause, since the C standard doesn't allow the - # redefinition of an enumeration value. For example, the name - # `af_blue_5_1_6' is used to construct enumeration values in the fifth - # section after the third (second-level) if-clause within the first - # (top-level) if-clause. After the first top-level clause has - # finished, `af_blue_5_2' is used. The current offset is then - # relative to the value stored in the current auxiliary element. - - if (/ ^ \# \s* if /x) - { - push @else_stack, 0; - - $name_stack[$#name_stack]++; - - push @{$diversions{$curr_enum}}, enum_val_string(aux_name()); - $last_aux = aux_name(); - - push @name_stack, 0; - - $curr_offset = 0; - } - elsif (/ ^ \# \s* elif /x) - { - Die("unbalanced #elif") unless @else_stack; - - pop @name_stack; - - push @{$diversions{$curr_enum}}, enum_val_string(aux_name_next()); - $last_aux = aux_name(); - - push @name_stack, 0; - - $curr_offset = 0; - } - elsif (/ ^ \# \s* else /x) - { - my $prev_else = pop @else_stack; - Die("unbalanced #else") unless defined($prev_else); - Die("#else already seen") if $prev_else; - push @else_stack, 1; - - pop @name_stack; - - push @{$diversions{$curr_enum}}, enum_val_string(aux_name_next()); - $last_aux = aux_name(); - - push @name_stack, 0; - - $curr_offset = 0; - } - elsif (/ ^ (\# \s*) endif /x) - { - my $prev_else = pop @else_stack; - Die("unbalanced #endif") unless defined($prev_else); - - pop @name_stack; - - # If there is no else-clause for an if-clause, we add one. This is - # necessary to have correct offsets. - if (!$prev_else) - { - # Use amount of whitespace from `endif'. - push @{$diversions{$curr_enum}}, enum_val_string(aux_name_next()) - . $1 . "else\n"; - $last_aux = aux_name(); - - $curr_offset = 0; - } - - $name_stack[$#name_stack]++; - - push @{$diversions{$curr_enum}}, enum_val_string(aux_name()); - $last_aux = aux_name(); - - $curr_offset = 0; - } - - # Handle (probably continued) preprocessor lines. - CONTINUED_LOOP: - { - do - { - strip_newline(); - - push @{$diversions{$curr_enum}}, $ARG . "\n"; - push @{$diversions{$curr_array}}, $ARG . "\n"; - - last CONTINUED_LOOP unless / \\ $ /x; - - } while (<DATA>); - } - } - else - { - warn_before(); - } - - next; - } - - if (/$enum_element_re/) - { - end_curr_string(); - update_max_elem_size(); - - $curr_enum_element = $1; - $have_enum_element = 1; - $curr_elem_size = 0; - - next; - } - - if (/$string_re/) - { - if ($have_sections) - { - Die("strings and blocks can't be mixed in a section") if $have_blocks; - - # Save captured group from `string_re'. - my $string = $1; - - if ($have_enum_element) - { - push @{$diversions{$curr_enum}}, enum_val_string($curr_enum_element); - $have_enum_element = 0; - } - - $string = convert_literal($string); - - push @{$diversions{$curr_array}}, " $string\n"; - - $have_strings = 1; - $in_string = 1; - } - else - { - warn_before(); - } - - next; - } - - if (/$block_start_re/) - { - if ($have_sections) - { - Die("strings and blocks can't be mixed in a section") if $have_strings; - - my $depth = 0; - my $block = ""; - my $block_end = 0; - - # Count braces while getting the block. - BRACE_LOOP: - { - do - { - strip_newline(); - - foreach my $substring (split(/$brace_re/)) - { - if ($block_end) - { - Die("invalid data after last matching closing brace") - if $substring !~ /$whitespace_only_re/; - } - - $block .= $substring; - - if ($substring eq '{') - { - $depth++; - } - elsif ($substring eq '}') - { - $depth--; - - $block_end = 1 if $depth == 0; - } - } - - # If we are here, we have run out of substrings, so get next line - # or exit. - last BRACE_LOOP if $block_end; - - $block .= "\n"; - - } while (<DATA>); - } - - if ($have_enum_element) - { - push @{$diversions{$curr_enum}}, enum_val_string($curr_enum_element); - $have_enum_element = 0; - } - - push @{$diversions{$curr_array}}, $block . ",\n"; - - $curr_offset++; - $curr_elem_size++; - - $have_blocks = 1; - } - else - { - warn_before(); - } - - next; - } - - # Garbage. We weren't able to parse the data. - Die("syntax error"); -} - -# Finalize data. -end_curr_string(); -update_max_elem_size(); - - -# Filter stdin to stdout, replacing `@...@' templates. - -sub emit_diversion -{ - my $diversion_name = shift; - return (exists($diversions{$1})) ? "@{$diversions{$1}}" - : "@" . $diversion_name . "@"; -} - - -$LIST_SEPARATOR = ''; - -my $s1 = "This file has been generated by the Perl script \`$prog',"; -my $s1len = length $s1; -my $s2 = "using data from file \`$datafile'."; -my $s2len = length $s2; -my $slen = ($s1len > $s2len) ? $s1len : $s2len; - -print "/* " . $s1 . " " x ($slen - $s1len) . " */\n" - . "/* " . $s2 . " " x ($slen - $s2len) . " */\n" - . "\n"; - -while (<STDIN>) -{ - s/ @ ( [A-Za-z0-9_]+? ) @ / emit_diversion($1) /egx; - print; -} - -# EOF diff --git a/3party/freetype/src/tools/apinames.c b/3party/freetype/src/tools/apinames.c deleted file mode 100644 index 9f81b1a6c7..0000000000 --- a/3party/freetype/src/tools/apinames.c +++ /dev/null @@ -1,466 +0,0 @@ -/* - * This little program is used to parse the FreeType headers and - * find the declaration of all public APIs. This is easy, because - * they all look like the following: - * - * FT_EXPORT( return_type ) - * function_name( function arguments ); - * - * You must pass the list of header files as arguments. Wildcards are - * accepted if you are using GCC for compilation (and probably by - * other compilers too). - * - * Author: David Turner, 2005, 2006, 2008-2013, 2015 - * - * This code is explicitly placed into the public domain. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> - -#define PROGRAM_NAME "apinames" -#define PROGRAM_VERSION "0.2" - -#define LINEBUFF_SIZE 1024 - -typedef enum OutputFormat_ -{ - OUTPUT_LIST = 0, /* output the list of names, one per line */ - OUTPUT_WINDOWS_DEF, /* output a Windows .DEF file for Visual C++ or Mingw */ - OUTPUT_BORLAND_DEF, /* output a Windows .DEF file for Borland C++ */ - OUTPUT_WATCOM_LBC, /* output a Watcom Linker Command File */ - OUTPUT_NETWARE_IMP /* output a NetWare ImportFile */ - -} OutputFormat; - - -static void -panic( const char* message ) -{ - fprintf( stderr, "PANIC: %s\n", message ); - exit(2); -} - - -typedef struct NameRec_ -{ - char* name; - unsigned int hash; - -} NameRec, *Name; - -static Name the_names; -static int num_names; -static int max_names; - -static void -names_add( const char* name, - const char* end ) -{ - unsigned int h; - int nn, len; - Name nm; - - if ( end <= name ) - return; - - /* compute hash value */ - len = (int)(end - name); - h = 0; - for ( nn = 0; nn < len; nn++ ) - h = h*33 + name[nn]; - - /* check for an pre-existing name */ - for ( nn = 0; nn < num_names; nn++ ) - { - nm = the_names + nn; - - if ( (int)nm->hash == h && - memcmp( name, nm->name, len ) == 0 && - nm->name[len] == 0 ) - return; - } - - /* add new name */ - if ( num_names >= max_names ) - { - max_names += (max_names >> 1) + 4; - the_names = (NameRec*)realloc( the_names, - sizeof ( the_names[0] ) * max_names ); - if ( the_names == NULL ) - panic( "not enough memory" ); - } - nm = &the_names[num_names++]; - - nm->hash = h; - nm->name = (char*)malloc( len+1 ); - if ( nm->name == NULL ) - panic( "not enough memory" ); - - memcpy( nm->name, name, len ); - nm->name[len] = 0; -} - - -static int -name_compare( const void* name1, - const void* name2 ) -{ - Name n1 = (Name)name1; - Name n2 = (Name)name2; - - return strcmp( n1->name, n2->name ); -} - -static void -names_sort( void ) -{ - qsort( the_names, (size_t)num_names, - sizeof ( the_names[0] ), name_compare ); -} - - -static void -names_dump( FILE* out, - OutputFormat format, - const char* dll_name ) -{ - int nn; - - - switch ( format ) - { - case OUTPUT_WINDOWS_DEF: - if ( dll_name ) - fprintf( out, "LIBRARY %s\n", dll_name ); - - fprintf( out, "DESCRIPTION FreeType 2 DLL\n" ); - fprintf( out, "EXPORTS\n" ); - for ( nn = 0; nn < num_names; nn++ ) - fprintf( out, " %s\n", the_names[nn].name ); - break; - - case OUTPUT_BORLAND_DEF: - if ( dll_name ) - fprintf( out, "LIBRARY %s\n", dll_name ); - - fprintf( out, "DESCRIPTION FreeType 2 DLL\n" ); - fprintf( out, "EXPORTS\n" ); - for ( nn = 0; nn < num_names; nn++ ) - fprintf( out, " _%s\n", the_names[nn].name ); - break; - - case OUTPUT_WATCOM_LBC: - { - const char* dot; - char temp[512]; - - - if ( dll_name == NULL ) - { - fprintf( stderr, - "you must provide a DLL name with the -d option!\n" ); - exit( 4 ); - } - - /* we must omit the .dll suffix from the library name */ - dot = strchr( dll_name, '.' ); - if ( dot != NULL ) - { - int len = dot - dll_name; - - - if ( len > (int)( sizeof ( temp ) - 1 ) ) - len = sizeof ( temp ) - 1; - - memcpy( temp, dll_name, len ); - temp[len] = 0; - - dll_name = (const char*)temp; - } - - for ( nn = 0; nn < num_names; nn++ ) - fprintf( out, "++_%s.%s.%s\n", the_names[nn].name, dll_name, - the_names[nn].name ); - } - break; - - case OUTPUT_NETWARE_IMP: - { - if ( dll_name != NULL ) - fprintf( out, " (%s)\n", dll_name ); - for ( nn = 0; nn < num_names - 1; nn++ ) - fprintf( out, " %s,\n", the_names[nn].name ); - fprintf( out, " %s\n", the_names[num_names - 1].name ); - } - break; - - default: /* LIST */ - for ( nn = 0; nn < num_names; nn++ ) - fprintf( out, "%s\n", the_names[nn].name ); - } -} - - - - -/* states of the line parser */ - -typedef enum State_ -{ - STATE_START = 0, /* waiting for FT_EXPORT keyword and return type */ - STATE_TYPE /* type was read, waiting for function name */ - -} State; - -static int -read_header_file( FILE* file, int verbose ) -{ - static char buff[LINEBUFF_SIZE + 1]; - State state = STATE_START; - - while ( !feof( file ) ) - { - char* p; - - if ( !fgets( buff, LINEBUFF_SIZE, file ) ) - break; - - p = buff; - - while ( *p && (*p == ' ' || *p == '\\') ) /* skip leading whitespace */ - p++; - - if ( *p == '\n' || *p == '\r' ) /* skip empty lines */ - continue; - - switch ( state ) - { - case STATE_START: - { - if ( memcmp( p, "FT_EXPORT(", 10 ) != 0 ) - break; - - p += 10; - for (;;) - { - if ( *p == 0 || *p == '\n' || *p == '\r' ) - goto NextLine; - - if ( *p == ')' ) - { - p++; - break; - } - - p++; - } - - state = STATE_TYPE; - - /* sometimes, the name is just after the FT_EXPORT(...), so - * skip whitespace, and fall-through if we find an alphanumeric - * character - */ - while ( *p == ' ' || *p == '\t' ) - p++; - - if ( !isalpha(*p) ) - break; - } - /* fall-through */ - - case STATE_TYPE: - { - char* name = p; - - while ( isalnum(*p) || *p == '_' ) - p++; - - if ( p > name ) - { - if ( verbose ) - fprintf( stderr, ">>> %.*s\n", (int)(p - name), name ); - - names_add( name, p ); - } - - state = STATE_START; - } - break; - - default: - ; - } - - NextLine: - ; - } - - return 0; -} - - -static void -usage( void ) -{ - static const char* const format = - "%s %s: extract FreeType API names from header files\n\n" - "this program is used to extract the list of public FreeType API\n" - "functions. It receives the list of header files as argument and\n" - "generates a sorted list of unique identifiers\n\n" - - "usage: %s header1 [options] [header2 ...]\n\n" - - "options: - : parse the content of stdin, ignore arguments\n" - " -v : verbose mode, output sent to standard error\n" - " -oFILE : write output to FILE instead of standard output\n" - " -dNAME : indicate DLL file name, 'freetype.dll' by default\n" - " -w : output .DEF file for Visual C++ and Mingw\n" - " -wB : output .DEF file for Borland C++\n" - " -wW : output Watcom Linker Response File\n" - " -wN : output NetWare Import File\n" - "\n"; - - fprintf( stderr, - format, - PROGRAM_NAME, - PROGRAM_VERSION, - PROGRAM_NAME - ); - exit(1); -} - - -int main( int argc, const char* const* argv ) -{ - int from_stdin = 0; - int verbose = 0; - OutputFormat format = OUTPUT_LIST; /* the default */ - FILE* out = stdout; - const char* library_name = NULL; - - if ( argc < 2 ) - usage(); - - /* '-' used as a single argument means read source file from stdin */ - while ( argc > 1 && argv[1][0] == '-' ) - { - const char* arg = argv[1]; - - switch ( arg[1] ) - { - case 'v': - verbose = 1; - break; - - case 'o': - if ( arg[2] == 0 ) - { - if ( argc < 2 ) - usage(); - - arg = argv[2]; - argv++; - argc--; - } - else - arg += 2; - - out = fopen( arg, "wt" ); - if ( out == NULL ) - { - fprintf( stderr, "could not open '%s' for writing\n", argv[2] ); - exit(3); - } - break; - - case 'd': - if ( arg[2] == 0 ) - { - if ( argc < 2 ) - usage(); - - arg = argv[2]; - argv++; - argc--; - } - else - arg += 2; - - library_name = arg; - break; - - case 'w': - format = OUTPUT_WINDOWS_DEF; - switch ( arg[2] ) - { - case 'B': - format = OUTPUT_BORLAND_DEF; - break; - - case 'W': - format = OUTPUT_WATCOM_LBC; - break; - - case 'N': - format = OUTPUT_NETWARE_IMP; - break; - - case 0: - break; - - default: - usage(); - } - break; - - case 0: - from_stdin = 1; - break; - - default: - usage(); - } - - argc--; - argv++; - } - - if ( from_stdin ) - { - read_header_file( stdin, verbose ); - } - else - { - for ( --argc, argv++; argc > 0; argc--, argv++ ) - { - FILE* file = fopen( argv[0], "rb" ); - - if ( file == NULL ) - fprintf( stderr, "unable to open '%s'\n", argv[0] ); - else - { - if ( verbose ) - fprintf( stderr, "opening '%s'\n", argv[0] ); - - read_header_file( file, verbose ); - fclose( file ); - } - } - } - - if ( num_names == 0 ) - panic( "could not find exported functions !!\n" ); - - names_sort(); - names_dump( out, format, library_name ); - - if ( out != stdout ) - fclose( out ); - - return 0; -} diff --git a/3party/freetype/src/tools/chktrcmp.py b/3party/freetype/src/tools/chktrcmp.py deleted file mode 100755 index 4c40bdafdb..0000000000 --- a/3party/freetype/src/tools/chktrcmp.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python -# -# Check trace components in FreeType 2 source. -# Author: suzuki toshiya, 2009, 2013 -# -# This code is explicitly into the public domain. - - -import sys -import os -import re - -SRC_FILE_LIST = [] -USED_COMPONENT = {} -KNOWN_COMPONENT = {} - -SRC_FILE_DIRS = [ "src" ] -TRACE_DEF_FILES = [ "include/freetype/internal/fttrace.h" ] - - -# -------------------------------------------------------------- -# Parse command line options -# - -for i in range( 1, len( sys.argv ) ): - if sys.argv[i].startswith( "--help" ): - print "Usage: %s [option]" % sys.argv[0] - print "Search used-but-defined and defined-but-not-used trace_XXX macros" - print "" - print " --help:" - print " Show this help" - print "" - print " --src-dirs=dir1:dir2:..." - print " Specify the directories of C source files to be checked" - print " Default is %s" % ":".join( SRC_FILE_DIRS ) - print "" - print " --def-files=file1:file2:..." - print " Specify the header files including FT_TRACE_DEF()" - print " Default is %s" % ":".join( TRACE_DEF_FILES ) - print "" - exit(0) - if sys.argv[i].startswith( "--src-dirs=" ): - SRC_FILE_DIRS = sys.argv[i].replace( "--src-dirs=", "", 1 ).split( ":" ) - elif sys.argv[i].startswith( "--def-files=" ): - TRACE_DEF_FILES = sys.argv[i].replace( "--def-files=", "", 1 ).split( ":" ) - - -# -------------------------------------------------------------- -# Scan C source and header files using trace macros. -# - -c_pathname_pat = re.compile( '^.*\.[ch]$', re.IGNORECASE ) -trace_use_pat = re.compile( '^[ \t]*#define[ \t]+FT_COMPONENT[ \t]+trace_' ) - -for d in SRC_FILE_DIRS: - for ( p, dlst, flst ) in os.walk( d ): - for f in flst: - if c_pathname_pat.match( f ) != None: - src_pathname = os.path.join( p, f ) - - line_num = 0 - for src_line in open( src_pathname, 'r' ): - line_num = line_num + 1 - src_line = src_line.strip() - if trace_use_pat.match( src_line ) != None: - component_name = trace_use_pat.sub( '', src_line ) - if component_name in USED_COMPONENT: - USED_COMPONENT[component_name].append( "%s:%d" % ( src_pathname, line_num ) ) - else: - USED_COMPONENT[component_name] = [ "%s:%d" % ( src_pathname, line_num ) ] - - -# -------------------------------------------------------------- -# Scan header file(s) defining trace macros. -# - -trace_def_pat_opn = re.compile( '^.*FT_TRACE_DEF[ \t]*\([ \t]*' ) -trace_def_pat_cls = re.compile( '[ \t\)].*$' ) - -for f in TRACE_DEF_FILES: - line_num = 0 - for hdr_line in open( f, 'r' ): - line_num = line_num + 1 - hdr_line = hdr_line.strip() - if trace_def_pat_opn.match( hdr_line ) != None: - component_name = trace_def_pat_opn.sub( '', hdr_line ) - component_name = trace_def_pat_cls.sub( '', component_name ) - if component_name in KNOWN_COMPONENT: - print "trace component %s is defined twice, see %s and fttrace.h:%d" % \ - ( component_name, KNOWN_COMPONENT[component_name], line_num ) - else: - KNOWN_COMPONENT[component_name] = "%s:%d" % \ - ( os.path.basename( f ), line_num ) - - -# -------------------------------------------------------------- -# Compare the used and defined trace macros. -# - -print "# Trace component used in the implementations but not defined in fttrace.h." -cmpnt = USED_COMPONENT.keys() -cmpnt.sort() -for c in cmpnt: - if c not in KNOWN_COMPONENT: - print "Trace component %s (used in %s) is not defined." % ( c, ", ".join( USED_COMPONENT[c] ) ) - -print "# Trace component is defined but not used in the implementations." -cmpnt = KNOWN_COMPONENT.keys() -cmpnt.sort() -for c in cmpnt: - if c not in USED_COMPONENT: - if c != "any": - print "Trace component %s (defined in %s) is not used." % ( c, KNOWN_COMPONENT[c] ) - diff --git a/3party/freetype/src/tools/cordic.py b/3party/freetype/src/tools/cordic.py deleted file mode 100644 index 6742c90dfe..0000000000 --- a/3party/freetype/src/tools/cordic.py +++ /dev/null @@ -1,33 +0,0 @@ -# compute arctangent table for CORDIC computations in fttrigon.c -import sys, math - -#units = 64*65536.0 # don't change !! -units = 180 * 2**16 -scale = units/math.pi -shrink = 1.0 -comma = "" - -print "" -print "table of arctan( 1/2^n ) for PI = " + repr(units/65536.0) + " units" - -for n in range(1,32): - - x = 0.5**n # tangent value - - angle = math.atan(x) # arctangent - angle2 = round(angle*scale) # arctangent in FT_Angle units - - if angle2 <= 0: - break - - sys.stdout.write( comma + repr( int(angle2) ) ) - comma = ", " - - shrink /= math.sqrt( 1 + x*x ) - -print -print "shrink factor = " + repr( shrink ) -print "shrink factor 2 = " + repr( int( shrink * (2**32) ) ) -print "expansion factor = " + repr( 1/shrink ) -print "" - diff --git a/3party/freetype/src/tools/docmaker/content.py b/3party/freetype/src/tools/docmaker/content.py deleted file mode 100644 index 1961878a7d..0000000000 --- a/3party/freetype/src/tools/docmaker/content.py +++ /dev/null @@ -1,638 +0,0 @@ -# -# content.py -# -# Parse comment blocks to build content blocks (library file). -# -# Copyright 2002-2015 by -# David Turner. -# -# 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. - -# -# This file contains routines to parse documentation comment blocks, -# building more structured objects out of them. -# - - -from sources import * -from utils import * - -import string, re - - -# -# Regular expressions to detect code sequences. `Code sequences' are simply -# code fragments embedded in '{' and '}', as demonstrated in the following -# example. -# -# { -# x = y + z; -# if ( zookoo == 2 ) -# { -# foobar(); -# } -# } -# -# Note that the indentation of the first opening brace and the last closing -# brace must be exactly the same. The code sequence itself should have a -# larger indentation than the surrounding braces. -# -re_code_start = re.compile( r"(\s*){\s*$" ) -re_code_end = re.compile( r"(\s*)}\s*$" ) - - -# -# A regular expression to isolate identifiers from other text. -# -re_identifier = re.compile( r'((?:\w|-)*)' ) - - -# -# We collect macro names ending in `_H' (group 1), as defined in -# `freetype/config/ftheader.h'. While outputting the object data, we use -# this info together with the object's file location (group 2) to emit the -# appropriate header file macro and its associated file name before the -# object itself. -# -# Example: -# -# #define FT_FREETYPE_H <freetype.h> -# -re_header_macro = re.compile( r'^#define\s{1,}(\w{1,}_H)\s{1,}<(.*)>' ) - - -################################################################ -## -## DOC CODE CLASS -## -## The `DocCode' class is used to store source code lines. -## -## `self.lines' contains a set of source code lines that will be dumped as -## HTML in a <PRE> tag. -## -## The object is filled line by line by the parser; it strips the leading -## `margin' space from each input line before storing it in `self.lines'. -## -class DocCode: - - def __init__( self, margin, lines ): - self.lines = [] - self.words = None - - # remove margin spaces - for l in lines: - if string.strip( l[:margin] ) == "": - l = l[margin:] - self.lines.append( l ) - - def dump( self, prefix = "", width = 60 ): - lines = self.dump_lines( 0, width ) - for l in lines: - print prefix + l - - def dump_lines( self, margin = 0, width = 60 ): - result = [] - for l in self.lines: - result.append( " " * margin + l ) - return result - - - -################################################################ -## -## DOC PARA CLASS -## -## `Normal' text paragraphs are stored in the `DocPara' class. -## -## `self.words' contains the list of words that make up the paragraph. -## -class DocPara: - - def __init__( self, lines ): - self.lines = None - self.words = [] - for l in lines: - l = string.strip( l ) - self.words.extend( string.split( l ) ) - - def dump( self, prefix = "", width = 60 ): - lines = self.dump_lines( 0, width ) - for l in lines: - print prefix + l - - def dump_lines( self, margin = 0, width = 60 ): - cur = "" # current line - col = 0 # current width - result = [] - - for word in self.words: - ln = len( word ) - if col > 0: - ln = ln + 1 - - if col + ln > width: - result.append( " " * margin + cur ) - cur = word - col = len( word ) - else: - if col > 0: - cur = cur + " " - cur = cur + word - col = col + ln - - if col > 0: - result.append( " " * margin + cur ) - - return result - - -################################################################ -## -## DOC FIELD CLASS -## -## The `DocField' class stores a list containing either `DocPara' or -## `DocCode' objects. Each DocField object also has an optional `name' -## that is used when the object corresponds to a field or value definition. -## -class DocField: - - def __init__( self, name, lines ): - self.name = name # can be `None' for normal paragraphs/sources - self.items = [] # list of items - - mode_none = 0 # start parsing mode - mode_code = 1 # parsing code sequences - mode_para = 3 # parsing normal paragraph - - margin = -1 # current code sequence indentation - cur_lines = [] - - # analyze the markup lines to check whether they contain paragraphs, - # code sequences, or fields definitions - # - start = 0 - mode = mode_none - - for l in lines: - # are we parsing a code sequence? - if mode == mode_code: - m = re_code_end.match( l ) - if m and len( m.group( 1 ) ) <= margin: - # that's it, we finished the code sequence - code = DocCode( 0, cur_lines ) - self.items.append( code ) - margin = -1 - cur_lines = [] - mode = mode_none - else: - # otherwise continue the code sequence - cur_lines.append( l[margin:] ) - else: - # start of code sequence? - m = re_code_start.match( l ) - if m: - # save current lines - if cur_lines: - para = DocPara( cur_lines ) - self.items.append( para ) - cur_lines = [] - - # switch to code extraction mode - margin = len( m.group( 1 ) ) - mode = mode_code - else: - if not string.split( l ) and cur_lines: - # if the line is empty, we end the current paragraph, - # if any - para = DocPara( cur_lines ) - self.items.append( para ) - cur_lines = [] - else: - # otherwise, simply add the line to the current - # paragraph - cur_lines.append( l ) - - if mode == mode_code: - # unexpected end of code sequence - code = DocCode( margin, cur_lines ) - self.items.append( code ) - elif cur_lines: - para = DocPara( cur_lines ) - self.items.append( para ) - - def dump( self, prefix = "" ): - if self.field: - print prefix + self.field + " ::" - prefix = prefix + "----" - - first = 1 - for p in self.items: - if not first: - print "" - p.dump( prefix ) - first = 0 - - def dump_lines( self, margin = 0, width = 60 ): - result = [] - nl = None - - for p in self.items: - if nl: - result.append( "" ) - - result.extend( p.dump_lines( margin, width ) ) - nl = 1 - - return result - - -# -# A regular expression to detect field definitions. -# -# Examples: -# -# foo :: -# foo.bar :: -# -re_field = re.compile( r""" - \s* - ( - \w* - | - \w (\w | \.)* \w - ) - \s* :: - """, re.VERBOSE ) - - -################################################################ -## -## DOC MARKUP CLASS -## -class DocMarkup: - - def __init__( self, tag, lines ): - self.tag = string.lower( tag ) - self.fields = [] - - cur_lines = [] - field = None - mode = 0 - - for l in lines: - m = re_field.match( l ) - if m: - # We detected the start of a new field definition. - - # first, save the current one - if cur_lines: - f = DocField( field, cur_lines ) - self.fields.append( f ) - cur_lines = [] - field = None - - field = m.group( 1 ) # record field name - ln = len( m.group( 0 ) ) - l = " " * ln + l[ln:] - cur_lines = [l] - else: - cur_lines.append( l ) - - if field or cur_lines: - f = DocField( field, cur_lines ) - self.fields.append( f ) - - def get_name( self ): - try: - return self.fields[0].items[0].words[0] - except: - return None - - def dump( self, margin ): - print " " * margin + "<" + self.tag + ">" - for f in self.fields: - f.dump( " " ) - print " " * margin + "</" + self.tag + ">" - - -################################################################ -## -## DOC CHAPTER CLASS -## -class DocChapter: - - def __init__( self, block ): - self.block = block - self.sections = [] - if block: - self.name = block.name - self.title = block.get_markup_words( "title" ) - self.order = block.get_markup_words( "sections" ) - else: - self.name = "Other" - self.title = string.split( "Miscellaneous" ) - self.order = [] - - -################################################################ -## -## DOC SECTION CLASS -## -class DocSection: - - def __init__( self, name = "Other" ): - self.name = name - self.blocks = {} - self.block_names = [] # ordered block names in section - self.defs = [] - self.abstract = "" - self.description = "" - self.order = [] - self.title = "ERROR" - self.chapter = None - - def add_def( self, block ): - self.defs.append( block ) - - def add_block( self, block ): - self.block_names.append( block.name ) - self.blocks[block.name] = block - - def process( self ): - # look up one block that contains a valid section description - for block in self.defs: - title = block.get_markup_text( "title" ) - if title: - self.title = title - self.abstract = block.get_markup_words( "abstract" ) - self.description = block.get_markup_items( "description" ) - self.order = block.get_markup_words_all( "order" ) - return - - def reorder( self ): - self.block_names = sort_order_list( self.block_names, self.order ) - - -################################################################ -## -## CONTENT PROCESSOR CLASS -## -class ContentProcessor: - - def __init__( self ): - """Initialize a block content processor.""" - self.reset() - - self.sections = {} # dictionary of documentation sections - self.section = None # current documentation section - - self.chapters = [] # list of chapters - - self.headers = {} # dictionary of header macros - - def set_section( self, section_name ): - """Set current section during parsing.""" - if not section_name in self.sections: - section = DocSection( section_name ) - self.sections[section_name] = section - self.section = section - else: - self.section = self.sections[section_name] - - def add_chapter( self, block ): - chapter = DocChapter( block ) - self.chapters.append( chapter ) - - def reset( self ): - """Reset the content processor for a new block.""" - self.markups = [] - self.markup = None - self.markup_lines = [] - - def add_markup( self ): - """Add a new markup section.""" - if self.markup and self.markup_lines: - - # get rid of last line of markup if it's empty - marks = self.markup_lines - if len( marks ) > 0 and not string.strip( marks[-1] ): - self.markup_lines = marks[:-1] - - m = DocMarkup( self.markup, self.markup_lines ) - - self.markups.append( m ) - - self.markup = None - self.markup_lines = [] - - def process_content( self, content ): - """Process a block content and return a list of DocMarkup objects - corresponding to it.""" - markup = None - markup_lines = [] - first = 1 - - for line in content: - found = None - for t in re_markup_tags: - m = t.match( line ) - if m: - found = string.lower( m.group( 1 ) ) - prefix = len( m.group( 0 ) ) - line = " " * prefix + line[prefix:] # remove markup from line - break - - # is it the start of a new markup section ? - if found: - first = 0 - self.add_markup() # add current markup content - self.markup = found - if len( string.strip( line ) ) > 0: - self.markup_lines.append( line ) - elif first == 0: - self.markup_lines.append( line ) - - self.add_markup() - - return self.markups - - def parse_sources( self, source_processor ): - blocks = source_processor.blocks - count = len( blocks ) - - for n in range( count ): - source = blocks[n] - if source.content: - # this is a documentation comment, we need to catch - # all following normal blocks in the "follow" list - # - follow = [] - m = n + 1 - while m < count and not blocks[m].content: - follow.append( blocks[m] ) - m = m + 1 - - doc_block = DocBlock( source, follow, self ) - - def finish( self ): - # process all sections to extract their abstract, description - # and ordered list of items - # - for sec in self.sections.values(): - sec.process() - - # process chapters to check that all sections are correctly - # listed there - for chap in self.chapters: - for sec in chap.order: - if sec in self.sections: - section = self.sections[sec] - section.chapter = chap - section.reorder() - chap.sections.append( section ) - else: - sys.stderr.write( "WARNING: chapter '" + \ - chap.name + "' in " + chap.block.location() + \ - " lists unknown section '" + sec + "'\n" ) - - # check that all sections are in a chapter - # - others = [] - for sec in self.sections.values(): - if not sec.chapter: - sec.reorder() - others.append( sec ) - - # create a new special chapter for all remaining sections - # when necessary - # - if others: - chap = DocChapter( None ) - chap.sections = others - self.chapters.append( chap ) - - -################################################################ -## -## DOC BLOCK CLASS -## -class DocBlock: - - def __init__( self, source, follow, processor ): - processor.reset() - - self.source = source - self.code = [] - self.type = "ERRTYPE" - self.name = "ERRNAME" - self.section = processor.section - self.markups = processor.process_content( source.content ) - - # compute block type from first markup tag - try: - self.type = self.markups[0].tag - except: - pass - - # compute block name from first markup paragraph - try: - markup = self.markups[0] - para = markup.fields[0].items[0] - name = para.words[0] - m = re_identifier.match( name ) - if m: - name = m.group( 1 ) - self.name = name - except: - pass - - if self.type == "section": - # detect new section starts - processor.set_section( self.name ) - processor.section.add_def( self ) - elif self.type == "chapter": - # detect new chapter - processor.add_chapter( self ) - else: - processor.section.add_block( self ) - - # now, compute the source lines relevant to this documentation - # block. We keep normal comments in for obvious reasons (??) - source = [] - for b in follow: - if b.format: - break - for l in b.lines: - # collect header macro definitions - m = re_header_macro.match( l ) - if m: - processor.headers[m.group( 2 )] = m.group( 1 ); - - # we use "/* */" as a separator - if re_source_sep.match( l ): - break - source.append( l ) - - # now strip the leading and trailing empty lines from the sources - start = 0 - end = len( source ) - 1 - - while start < end and not string.strip( source[start] ): - start = start + 1 - - while start < end and not string.strip( source[end] ): - end = end - 1 - - if start == end and not string.strip( source[start] ): - self.code = [] - else: - self.code = source[start:end + 1] - - def location( self ): - return self.source.location() - - def get_markup( self, tag_name ): - """Return the DocMarkup corresponding to a given tag in a block.""" - for m in self.markups: - if m.tag == string.lower( tag_name ): - return m - return None - - def get_markup_words( self, tag_name ): - try: - m = self.get_markup( tag_name ) - return m.fields[0].items[0].words - except: - return [] - - def get_markup_words_all( self, tag_name ): - try: - m = self.get_markup( tag_name ) - words = [] - for item in m.fields[0].items: - # We honour empty lines in an `<Order>' section element by - # adding the sentinel `/empty/'. The formatter should then - # convert it to an appropriate representation in the - # `section_enter' function. - words += item.words - words.append( "/empty/" ) - return words - except: - return [] - - def get_markup_text( self, tag_name ): - result = self.get_markup_words( tag_name ) - return string.join( result ) - - def get_markup_items( self, tag_name ): - try: - m = self.get_markup( tag_name ) - return m.fields[0].items - except: - return None - -# eof diff --git a/3party/freetype/src/tools/docmaker/docbeauty.py b/3party/freetype/src/tools/docmaker/docbeauty.py deleted file mode 100644 index 3ddf4a94a1..0000000000 --- a/3party/freetype/src/tools/docmaker/docbeauty.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env python -# -# DocBeauty (c) 2003, 2004, 2008 David Turner <david@freetype.org> -# -# This program is used to beautify the documentation comments used -# in the FreeType 2 public headers. -# - -from sources import * -from content import * -from utils import * - -import utils - -import sys, os, time, string, getopt - - -content_processor = ContentProcessor() - - -def beautify_block( block ): - if block.content: - content_processor.reset() - - markups = content_processor.process_content( block.content ) - text = [] - first = 1 - - for markup in markups: - text.extend( markup.beautify( first ) ) - first = 0 - - # now beautify the documentation "borders" themselves - lines = [" /*************************************************************************"] - for l in text: - lines.append( " *" + l ) - lines.append( " */" ) - - block.lines = lines - - -def usage(): - print "\nDocBeauty 0.1 Usage information\n" - print " docbeauty [options] file1 [file2 ...]\n" - print "using the following options:\n" - print " -h : print this page" - print " -b : backup original files with the 'orig' extension" - print "" - print " --backup : same as -b" - - -def main( argv ): - """main program loop""" - - global output_dir - - try: - opts, args = getopt.getopt( sys.argv[1:], \ - "hb", \ - ["help", "backup"] ) - except getopt.GetoptError: - usage() - sys.exit( 2 ) - - if args == []: - usage() - sys.exit( 1 ) - - # process options - # - output_dir = None - do_backup = None - - for opt in opts: - if opt[0] in ( "-h", "--help" ): - usage() - sys.exit( 0 ) - - if opt[0] in ( "-b", "--backup" ): - do_backup = 1 - - # create context and processor - source_processor = SourceProcessor() - - # retrieve the list of files to process - file_list = make_file_list( args ) - for filename in file_list: - source_processor.parse_file( filename ) - - for block in source_processor.blocks: - beautify_block( block ) - - new_name = filename + ".new" - ok = None - - try: - file = open( new_name, "wt" ) - for block in source_processor.blocks: - for line in block.lines: - file.write( line ) - file.write( "\n" ) - file.close() - except: - ok = 0 - - -# if called from the command line -# -if __name__ == '__main__': - main( sys.argv ) - - -# eof diff --git a/3party/freetype/src/tools/docmaker/docmaker.py b/3party/freetype/src/tools/docmaker/docmaker.py deleted file mode 100644 index de82d930f5..0000000000 --- a/3party/freetype/src/tools/docmaker/docmaker.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python -# -# docmaker.py -# -# Convert source code markup to HTML documentation. -# -# Copyright 2002-2015 by -# David Turner. -# -# 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. - -# -# This program is a re-write of the original DocMaker tool used to generate -# the API Reference of the FreeType font rendering engine by converting -# in-source comments into structured HTML. -# -# This new version is capable of outputting XML data as well as accepting -# more liberal formatting options. It also uses regular expression matching -# and substitution to speed up operation significantly. -# - -from sources import * -from content import * -from utils import * -from formatter import * -from tohtml import * - -import utils - -import sys, os, time, string, glob, getopt - - -def usage(): - print "\nDocMaker Usage information\n" - print " docmaker [options] file1 [file2 ...]\n" - print "using the following options:\n" - print " -h : print this page" - print " -t : set project title, as in '-t \"My Project\"'" - print " -o : set output directory, as in '-o mydir'" - print " -p : set documentation prefix, as in '-p ft2'" - print "" - print " --title : same as -t, as in '--title=\"My Project\"'" - print " --output : same as -o, as in '--output=mydir'" - print " --prefix : same as -p, as in '--prefix=ft2'" - - -def main( argv ): - """Main program loop.""" - - global output_dir - - try: - opts, args = getopt.getopt( sys.argv[1:], - "ht:o:p:", - ["help", "title=", "output=", "prefix="] ) - except getopt.GetoptError: - usage() - sys.exit( 2 ) - - if args == []: - usage() - sys.exit( 1 ) - - # process options - project_title = "Project" - project_prefix = None - output_dir = None - - for opt in opts: - if opt[0] in ( "-h", "--help" ): - usage() - sys.exit( 0 ) - - if opt[0] in ( "-t", "--title" ): - project_title = opt[1] - - if opt[0] in ( "-o", "--output" ): - utils.output_dir = opt[1] - - if opt[0] in ( "-p", "--prefix" ): - project_prefix = opt[1] - - check_output() - - # create context and processor - source_processor = SourceProcessor() - content_processor = ContentProcessor() - - # retrieve the list of files to process - file_list = make_file_list( args ) - for filename in file_list: - source_processor.parse_file( filename ) - content_processor.parse_sources( source_processor ) - - # process sections - content_processor.finish() - - formatter = HtmlFormatter( content_processor, - project_title, - project_prefix ) - - formatter.toc_dump() - formatter.index_dump() - formatter.section_dump_all() - - -# if called from the command line -if __name__ == '__main__': - main( sys.argv ) - -# eof diff --git a/3party/freetype/src/tools/docmaker/formatter.py b/3party/freetype/src/tools/docmaker/formatter.py deleted file mode 100644 index f0a8808c47..0000000000 --- a/3party/freetype/src/tools/docmaker/formatter.py +++ /dev/null @@ -1,223 +0,0 @@ -# -# formatter.py -# -# Convert parsed content blocks to a structured document (library file). -# -# Copyright 2002-2015 by -# David Turner. -# -# 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. - -# -# This is the base Formatter class. Its purpose is to convert a content -# processor's data into specific documents (i.e., table of contents, global -# index, and individual API reference indices). -# -# You need to sub-class it to output anything sensible. For example, the -# file `tohtml.py' contains the definition of the `HtmlFormatter' sub-class -# to output HTML. -# - - -from sources import * -from content import * -from utils import * - - -################################################################ -## -## FORMATTER CLASS -## -class Formatter: - - def __init__( self, processor ): - self.processor = processor - self.identifiers = {} - self.chapters = processor.chapters - self.sections = processor.sections.values() - self.block_index = [] - - # store all blocks in a dictionary - self.blocks = [] - for section in self.sections: - for block in section.blocks.values(): - self.add_identifier( block.name, block ) - - # add enumeration values to the index, since this is useful - for markup in block.markups: - if markup.tag == 'values': - for field in markup.fields: - self.add_identifier( field.name, block ) - - self.block_index = self.identifiers.keys() - self.block_index.sort( key = index_key ) - - def add_identifier( self, name, block ): - if name in self.identifiers: - # duplicate name! - sys.stderr.write( "WARNING: duplicate definition for" - + " '" + name + "' " - + "in " + block.location() + ", " - + "previous definition in " - + self.identifiers[name].location() - + "\n" ) - else: - self.identifiers[name] = block - - # - # formatting the table of contents - # - def toc_enter( self ): - pass - - def toc_chapter_enter( self, chapter ): - pass - - def toc_section_enter( self, section ): - pass - - def toc_section_exit( self, section ): - pass - - def toc_chapter_exit( self, chapter ): - pass - - def toc_index( self, index_filename ): - pass - - def toc_exit( self ): - pass - - def toc_dump( self, toc_filename = None, index_filename = None ): - output = None - if toc_filename: - output = open_output( toc_filename ) - - self.toc_enter() - - for chap in self.processor.chapters: - - self.toc_chapter_enter( chap ) - - for section in chap.sections: - self.toc_section_enter( section ) - self.toc_section_exit( section ) - - self.toc_chapter_exit( chap ) - - self.toc_index( index_filename ) - - self.toc_exit() - - if output: - close_output( output ) - - # - # formatting the index - # - def index_enter( self ): - pass - - def index_name_enter( self, name ): - pass - - def index_name_exit( self, name ): - pass - - def index_exit( self ): - pass - - def index_dump( self, index_filename = None ): - output = None - if index_filename: - output = open_output( index_filename ) - - self.index_enter() - - for name in self.block_index: - self.index_name_enter( name ) - self.index_name_exit( name ) - - self.index_exit() - - if output: - close_output( output ) - - # - # formatting a section - # - def section_enter( self, section ): - pass - - def block_enter( self, block ): - pass - - def markup_enter( self, markup, block = None ): - pass - - def field_enter( self, field, markup = None, block = None ): - pass - - def field_exit( self, field, markup = None, block = None ): - pass - - def markup_exit( self, markup, block = None ): - pass - - def block_exit( self, block ): - pass - - def section_exit( self, section ): - pass - - def section_dump( self, section, section_filename = None ): - output = None - if section_filename: - output = open_output( section_filename ) - - self.section_enter( section ) - - for name in section.block_names: - skip_entry = 0 - try: - block = self.identifiers[name] - # `block_names' can contain field names also, - # which we filter out - for markup in block.markups: - if markup.tag == 'values': - for field in markup.fields: - if field.name == name: - skip_entry = 1 - except: - skip_entry = 1 # this happens e.g. for `/empty/' entries - - if skip_entry: - continue - - self.block_enter( block ) - - for markup in block.markups[1:]: # always ignore first markup! - self.markup_enter( markup, block ) - - for field in markup.fields: - self.field_enter( field, markup, block ) - self.field_exit( field, markup, block ) - - self.markup_exit( markup, block ) - - self.block_exit( block ) - - self.section_exit( section ) - - if output: - close_output( output ) - - def section_dump_all( self ): - for section in self.sections: - self.section_dump( section ) - -# eof diff --git a/3party/freetype/src/tools/docmaker/sources.py b/3party/freetype/src/tools/docmaker/sources.py deleted file mode 100644 index 0cf21ce03f..0000000000 --- a/3party/freetype/src/tools/docmaker/sources.py +++ /dev/null @@ -1,397 +0,0 @@ -# -# sources.py -# -# Convert source code comments to multi-line blocks (library file). -# -# Copyright 2002-2015 by -# David Turner. -# -# 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. - -# -# This library file contains definitions of classes needed to decompose C -# source code files into a series of multi-line `blocks'. There are two -# kinds of blocks. -# -# - Normal blocks, which contain source code or ordinary comments. -# -# - Documentation blocks, which have restricted formatting, and whose text -# always start with a documentation markup tag like `<Function>', -# `<Type>', etc. -# -# The routines to process the content of documentation blocks are contained -# in file `content.py'; the classes and methods found here only deal with -# text parsing and basic documentation block extraction. -# - - -import fileinput, re, sys, os, string - - -################################################################ -## -## SOURCE BLOCK FORMAT CLASS -## -## A simple class containing compiled regular expressions to detect -## potential documentation format block comments within C source code. -## -## The `column' pattern must contain a group to `unbox' the content of -## documentation comment blocks. -## -## Later on, paragraphs are converted to long lines, which simplifies the -## regular expressions that act upon the text. -## -class SourceBlockFormat: - - def __init__( self, id, start, column, end ): - """Create a block pattern, used to recognize special documentation - blocks.""" - self.id = id - self.start = re.compile( start, re.VERBOSE ) - self.column = re.compile( column, re.VERBOSE ) - self.end = re.compile( end, re.VERBOSE ) - - -# -# Format 1 documentation comment blocks. -# -# /************************************/ (at least 2 asterisks) -# /* */ -# /* */ -# /* */ -# /************************************/ (at least 2 asterisks) -# -start = r''' - \s* # any number of whitespace - /\*{2,}/ # followed by '/' and at least two asterisks then '/' - \s*$ # probably followed by whitespace -''' - -column = r''' - \s* # any number of whitespace - /\*{1} # followed by '/' and precisely one asterisk - ([^*].*) # followed by anything (group 1) - \*{1}/ # followed by one asterisk and a '/' - \s*$ # probably followed by whitespace -''' - -re_source_block_format1 = SourceBlockFormat( 1, start, column, start ) - - -# -# Format 2 documentation comment blocks. -# -# /************************************ (at least 2 asterisks) -# * -# * (1 asterisk) -# * -# */ (1 or more asterisks) -# -start = r''' - \s* # any number of whitespace - /\*{2,} # followed by '/' and at least two asterisks - \s*$ # probably followed by whitespace -''' - -column = r''' - \s* # any number of whitespace - \*{1}(?![*/]) # followed by precisely one asterisk not followed by `/' - (.*) # then anything (group1) -''' - -end = r''' - \s* # any number of whitespace - \*+/ # followed by at least one asterisk, then '/' -''' - -re_source_block_format2 = SourceBlockFormat( 2, start, column, end ) - - -# -# The list of supported documentation block formats. We could add new ones -# quite easily. -# -re_source_block_formats = [re_source_block_format1, re_source_block_format2] - - -# -# The following regular expressions correspond to markup tags within the -# documentation comment blocks. They are equivalent despite their different -# syntax. -# -# A markup tag consists of letters or character `-', to be found in group 1. -# -# Notice that a markup tag _must_ begin a new paragraph. -# -re_markup_tag1 = re.compile( r'''\s*<((?:\w|-)*)>''' ) # <xxxx> format -re_markup_tag2 = re.compile( r'''\s*@((?:\w|-)*):''' ) # @xxxx: format - -# -# The list of supported markup tags. We could add new ones quite easily. -# -re_markup_tags = [re_markup_tag1, re_markup_tag2] - - -# -# A regular expression to detect a cross reference, after markup tags have -# been stripped off. Group 1 is the reference, group 2 the rest of the -# line. -# -# A cross reference consists of letters, digits, or characters `-' and `_'. -# -re_crossref = re.compile( r'@((?:\w|-)*)(.*)' ) # @foo - -# -# Two regular expressions to detect italic and bold markup, respectively. -# Group 1 is the markup, group 2 the rest of the line. -# -# Note that the markup is limited to words consisting of letters, digits, -# the character `_', or an apostrophe (but not as the first character). -# -re_italic = re.compile( r"_(\w(?:\w|')*)_(.*)" ) # _italic_ -re_bold = re.compile( r"\*(\w(?:\w|')*)\*(.*)" ) # *bold* - -# -# This regular expression code to identify an URL has been taken from -# -# http://mail.python.org/pipermail/tutor/2002-September/017228.html -# -# (with slight modifications). -# -urls = r'(?:https?|telnet|gopher|file|wais|ftp)' -ltrs = r'\w' -gunk = r'/#~:.?+=&%@!\-' -punc = r'.:?\-' -any = "%(ltrs)s%(gunk)s%(punc)s" % { 'ltrs' : ltrs, - 'gunk' : gunk, - 'punc' : punc } -url = r""" - ( - \b # start at word boundary - %(urls)s : # need resource and a colon - [%(any)s] +? # followed by one or more of any valid - # character, but be conservative and - # take only what you need to... - (?= # [look-ahead non-consumptive assertion] - [%(punc)s]* # either 0 or more punctuation - (?: # [non-grouping parentheses] - [^%(any)s] | $ # followed by a non-url char - # or end of the string - ) - ) - ) - """ % {'urls' : urls, - 'any' : any, - 'punc' : punc } - -re_url = re.compile( url, re.VERBOSE | re.MULTILINE ) - -# -# A regular expression that stops collection of comments for the current -# block. -# -re_source_sep = re.compile( r'\s*/\*\s*\*/' ) # /* */ - -# -# A regular expression to find possible C identifiers while outputting -# source code verbatim, covering things like `*foo' or `(bar'. Group 1 is -# the prefix, group 2 the identifier -- since we scan lines from left to -# right, sequentially splitting the source code into prefix and identifier -# is fully sufficient for our purposes. -# -re_source_crossref = re.compile( r'(\W*)(\w*)' ) - -# -# A regular expression that matches a list of reserved C source keywords. -# -re_source_keywords = re.compile( '''\\b ( typedef | - struct | - enum | - union | - const | - char | - int | - short | - long | - void | - signed | - unsigned | - \#include | - \#define | - \#undef | - \#if | - \#ifdef | - \#ifndef | - \#else | - \#endif ) \\b''', re.VERBOSE ) - - -################################################################ -## -## SOURCE BLOCK CLASS -## -## There are two important fields in a `SourceBlock' object. -## -## self.lines -## A list of text lines for the corresponding block. -## -## self.content -## For documentation comment blocks only, this is the block content -## that has been `unboxed' from its decoration. This is `None' for all -## other blocks (i.e., sources or ordinary comments with no starting -## markup tag) -## -class SourceBlock: - - def __init__( self, processor, filename, lineno, lines ): - self.processor = processor - self.filename = filename - self.lineno = lineno - self.lines = lines[:] - self.format = processor.format - self.content = [] - - if self.format == None: - return - - words = [] - - # extract comment lines - lines = [] - - for line0 in self.lines: - m = self.format.column.match( line0 ) - if m: - lines.append( m.group( 1 ) ) - - # now, look for a markup tag - for l in lines: - l = string.strip( l ) - if len( l ) > 0: - for tag in re_markup_tags: - if tag.match( l ): - self.content = lines - return - - def location( self ): - return "(" + self.filename + ":" + repr( self.lineno ) + ")" - - # debugging only -- not used in normal operations - def dump( self ): - if self.content: - print "{{{content start---" - for l in self.content: - print l - print "---content end}}}" - return - - fmt = "" - if self.format: - fmt = repr( self.format.id ) + " " - - for line in self.lines: - print line - - -################################################################ -## -## SOURCE PROCESSOR CLASS -## -## The `SourceProcessor' is in charge of reading a C source file and -## decomposing it into a series of different `SourceBlock' objects. -## -## A SourceBlock object consists of the following data. -## -## - A documentation comment block using one of the layouts above. Its -## exact format will be discussed later. -## -## - Normal sources lines, including comments. -## -## -class SourceProcessor: - - def __init__( self ): - """Initialize a source processor.""" - self.blocks = [] - self.filename = None - self.format = None - self.lines = [] - - def reset( self ): - """Reset a block processor and clean up all its blocks.""" - self.blocks = [] - self.format = None - - def parse_file( self, filename ): - """Parse a C source file and add its blocks to the processor's - list.""" - self.reset() - - self.filename = filename - - fileinput.close() - self.format = None - self.lineno = 0 - self.lines = [] - - for line in fileinput.input( filename ): - # strip trailing newlines, important on Windows machines! - if line[-1] == '\012': - line = line[0:-1] - - if self.format == None: - self.process_normal_line( line ) - else: - if self.format.end.match( line ): - # A normal block end. Add it to `lines' and create a - # new block - self.lines.append( line ) - self.add_block_lines() - elif self.format.column.match( line ): - # A normal column line. Add it to `lines'. - self.lines.append( line ) - else: - # An unexpected block end. Create a new block, but - # don't process the line. - self.add_block_lines() - - # we need to process the line again - self.process_normal_line( line ) - - # record the last lines - self.add_block_lines() - - def process_normal_line( self, line ): - """Process a normal line and check whether it is the start of a new - block.""" - for f in re_source_block_formats: - if f.start.match( line ): - self.add_block_lines() - self.format = f - self.lineno = fileinput.filelineno() - - self.lines.append( line ) - - def add_block_lines( self ): - """Add the current accumulated lines and create a new block.""" - if self.lines != []: - block = SourceBlock( self, - self.filename, - self.lineno, - self.lines ) - - self.blocks.append( block ) - self.format = None - self.lines = [] - - # debugging only, not used in normal operations - def dump( self ): - """Print all blocks in a processor.""" - for b in self.blocks: - b.dump() - -# eof diff --git a/3party/freetype/src/tools/docmaker/tohtml.py b/3party/freetype/src/tools/docmaker/tohtml.py deleted file mode 100644 index bc6bcf0511..0000000000 --- a/3party/freetype/src/tools/docmaker/tohtml.py +++ /dev/null @@ -1,675 +0,0 @@ -# -# tohtml.py -# -# A sub-class container of the `Formatter' class to produce HTML. -# -# Copyright 2002-2015 by -# David Turner. -# -# 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. - -# The parent class is contained in file `formatter.py'. - - -from sources import * -from content import * -from formatter import * - -import time - - -# The following strings define the HTML header used by all generated pages. -html_header_1 = """\ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" -"http://www.w3.org/TR/html4/loose.dtd"> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<title>\ -""" - -html_header_2 = """\ - API Reference - - - -""" - -html_header_3l = """ - -

    \ -""" - -html_header_5i = """\ -">Index]

    -

    \ -""" - -html_header_6 = """\ - API Reference

    -""" - - -# The HTML footer used by all generated pages. -html_footer = """\ - -\ -""" - -# The header and footer used for each section. -section_title_header = "

    " -section_title_footer = "

    " - -# The header and footer used for code segments. -code_header = '
    '
    -code_footer = '
    ' - -# Paragraph header and footer. -para_header = "

    " -para_footer = "

    " - -# Block header and footer. -block_header = '
    ' -block_footer_start = """\ -
    -\ -\ -
    -""" - -# Description header/footer. -description_header = "" -description_footer = "" - -# Marker header/inter/footer combination. -marker_header = "

    " -marker_inter = "

    " -marker_footer = "" - -# Header location header/footer. -header_location_header = "

    " -header_location_footer = "

    " - -# Source code extracts header/footer. -source_header = "
    "
    -source_footer = "
    " - -# Chapter header/inter/footer. -chapter_header = """\ -
    -

    \ -""" -chapter_inter = '

    ' -chapter_footer = '
    ' - -# Index footer. -index_footer_start = """\ -
    - -""" - -# TOC footer. -toc_footer_start = """\ -
    - -""" - - -# Source language keyword coloration and styling. -keyword_prefix = '' -keyword_suffix = '' - -section_synopsis_header = '

    Synopsis

    ' -section_synopsis_footer = '' - - -# Translate a single line of source to HTML. This converts `<', `>', and -# `&' into `<',`>', and `&'. -# -def html_quote( line ): - result = string.replace( line, "&", "&" ) - result = string.replace( result, "<", "<" ) - result = string.replace( result, ">", ">" ) - return result - - -################################################################ -## -## HTML FORMATTER CLASS -## -class HtmlFormatter( Formatter ): - - def __init__( self, processor, project_title, file_prefix ): - Formatter.__init__( self, processor ) - - global html_header_1 - global html_header_2 - global html_header_3l, html_header_3r - global html_header_4 - global html_header_5t, html_header_5i - global html_header_6 - global html_footer - - if file_prefix: - file_prefix = file_prefix + "-" - else: - file_prefix = "" - - self.headers = processor.headers - self.project_title = project_title - self.file_prefix = file_prefix - self.html_header = ( - html_header_1 + project_title - + html_header_2 - + html_header_3l + file_prefix + "index.html" - + html_header_4 + file_prefix + "toc.html" - + html_header_5t + project_title - + html_header_6 ) - self.html_index_header = ( - html_header_1 + project_title - + html_header_2 - + html_header_3r + file_prefix + "toc.html" - + html_header_5t + project_title - + html_header_6 ) - self.html_toc_header = ( - html_header_1 + project_title - + html_header_2 - + html_header_3l + file_prefix + "index.html" - + html_header_5i + project_title - + html_header_6 ) - self.html_footer = ( - '
    generated on ' - + time.asctime( time.localtime( time.time() ) ) - + "
    " + html_footer ) - - self.columns = 3 - - def make_section_url( self, section ): - return self.file_prefix + section.name + ".html" - - def make_block_url( self, block, name = None ): - if name == None: - name = block.name - return self.make_section_url( block.section ) + "#" + name - - def make_html_word( self, word ): - """Analyze a simple word to detect cross-references and markup.""" - # handle cross-references - m = re_crossref.match( word ) - if m: - try: - name = m.group( 1 ) - rest = m.group( 2 ) - block = self.identifiers[name] - url = self.make_block_url( block ) - return '' + name + '' + rest - except: - # we detected a cross-reference to an unknown item - sys.stderr.write( "WARNING: undefined cross reference" - + " '" + name + "'.\n" ) - return '?' + name + '?' + rest - - # handle markup for italic and bold - m = re_italic.match( word ) - if m: - name = m.group( 1 ) - rest = m.group( 2 ) - return '' + name + '' + rest - - m = re_bold.match( word ) - if m: - name = m.group( 1 ) - rest = m.group( 2 ) - return '' + name + '' + rest - - return html_quote( word ) - - def make_html_para( self, words ): - """Convert words of a paragraph into tagged HTML text. Also handle - cross references.""" - line = "" - if words: - line = self.make_html_word( words[0] ) - for word in words[1:]: - line = line + " " + self.make_html_word( word ) - # handle hyperlinks - line = re_url.sub( r'\1', line ) - # convert `...' quotations into real left and right single quotes - line = re.sub( r"(^|\W)`(.*?)'(\W|$)", - r'\1‘\2’\3', - line ) - # convert tilde into non-breakable space - line = string.replace( line, "~", " " ) - - return para_header + line + para_footer - - def make_html_code( self, lines ): - """Convert a code sequence to HTML.""" - line = code_header + '\n' - for l in lines: - line = line + html_quote( l ) + '\n' - - return line + code_footer - - def make_html_items( self, items ): - """Convert a field's content into HTML.""" - lines = [] - for item in items: - if item.lines: - lines.append( self.make_html_code( item.lines ) ) - else: - lines.append( self.make_html_para( item.words ) ) - - return string.join( lines, '\n' ) - - def print_html_items( self, items ): - print self.make_html_items( items ) - - def print_html_field( self, field ): - if field.name: - print( '
    ' - + field.name - + "" ) - - print self.make_html_items( field.items ) - - if field.name: - print "
    " - - def html_source_quote( self, line, block_name = None ): - result = "" - while line: - m = re_source_crossref.match( line ) - if m: - name = m.group( 2 ) - prefix = html_quote( m.group( 1 ) ) - length = len( m.group( 0 ) ) - - if name == block_name: - # this is the current block name, if any - result = result + prefix + '' + name + '' - elif re_source_keywords.match( name ): - # this is a C keyword - result = ( result + prefix - + keyword_prefix + name + keyword_suffix ) - elif name in self.identifiers: - # this is a known identifier - block = self.identifiers[name] - id = block.name - - # link to a field ID if possible - for markup in block.markups: - if markup.tag == 'values': - for field in markup.fields: - if field.name: - id = name - - result = ( result + prefix - + '' + name + '' ) - else: - result = result + html_quote( line[:length] ) - - line = line[length:] - else: - result = result + html_quote( line ) - line = [] - - return result - - def print_html_field_list( self, fields ): - print '' - for field in fields: - print ( '" - print "
    ' - + field.name - + '' ) - self.print_html_items( field.items ) - print "
    " - - def print_html_markup( self, markup ): - table_fields = [] - for field in markup.fields: - if field.name: - # We begin a new series of field or value definitions. We - # record them in the `table_fields' list before outputting - # all of them as a single table. - table_fields.append( field ) - else: - if table_fields: - self.print_html_field_list( table_fields ) - table_fields = [] - - self.print_html_items( field.items ) - - if table_fields: - self.print_html_field_list( table_fields ) - - # - # formatting the index - # - def index_enter( self ): - print self.html_index_header - self.index_items = {} - - def index_name_enter( self, name ): - block = self.identifiers[name] - url = self.make_block_url( block ) - self.index_items[name] = url - - def index_exit( self ): - # `block_index' already contains the sorted list of index names - count = len( self.block_index ) - rows = ( count + self.columns - 1 ) // self.columns - - print '' - for r in range( rows ): - line = "" - for c in range( self.columns ): - i = r + c * rows - if i < count: - bname = self.block_index[r + c * rows] - url = self.index_items[bname] - line = ( line + '' ) - else: - line = line + '' - line = line + "" - print line - - print "
    ' - + bname + '
    " - - print( index_footer_start - + self.file_prefix + "toc.html" - + index_footer_end ) - - print self.html_footer - - self.index_items = {} - - def index_dump( self, index_filename = None ): - if index_filename == None: - index_filename = self.file_prefix + "index.html" - - Formatter.index_dump( self, index_filename ) - - # - # formatting the table of contents - # - def toc_enter( self ): - print self.html_toc_header - print "

    Table of Contents

    " - - def toc_chapter_enter( self, chapter ): - print chapter_header + string.join( chapter.title ) + chapter_inter - print '' - - def toc_section_enter( self, section ): - print ( '" - - def toc_chapter_exit( self, chapter ): - print "
    ' ) - print self.make_html_para( section.abstract ) - - def toc_section_exit( self, section ): - print "
    " - print chapter_footer - - def toc_index( self, index_filename ): - print( chapter_header - + 'Global Index' - + chapter_inter + chapter_footer ) - - def toc_exit( self ): - print( toc_footer_start - + self.file_prefix + "index.html" - + toc_footer_end ) - - print self.html_footer - - def toc_dump( self, toc_filename = None, index_filename = None ): - if toc_filename == None: - toc_filename = self.file_prefix + "toc.html" - - if index_filename == None: - index_filename = self.file_prefix + "index.html" - - Formatter.toc_dump( self, toc_filename, index_filename ) - - # - # formatting sections - # - def section_enter( self, section ): - print self.html_header - - print section_title_header + section.title + section_title_footer - - maxwidth = 0 - for b in section.blocks.values(): - if len( b.name ) > maxwidth: - maxwidth = len( b.name ) - - width = 70 # XXX magic number - if maxwidth > 0: - # print section synopsis - print section_synopsis_header - print '' - - columns = width // maxwidth - if columns < 1: - columns = 1 - - count = len( section.block_names ) - # don't handle last entry if it is empty - if section.block_names[-1] == "/empty/": - count -= 1 - rows = ( count + columns - 1 ) // columns - - for r in range( rows ): - line = "" - for c in range( columns ): - i = r + c * rows - line = line + '' - line = line + "" - print line - - print "
    ' - if i < count: - name = section.block_names[i] - if name == "/empty/": - # it can happen that a complete row is empty, and - # without a proper `filler' the browser might - # collapse the row to a much smaller height (or - # even omit it completely) - line = line + " " - else: - line = ( line + '' - + name + '' ) - - line = line + '
    " - print section_synopsis_footer - - print description_header - print self.make_html_items( section.description ) - print description_footer - - def block_enter( self, block ): - print block_header - - # place html anchor if needed - if block.name: - print( '

    ' + block.name + '

    ' ) - - # dump the block C source lines now - if block.code: - header = '' - for f in self.headers.keys(): - if block.source.filename.find( f ) >= 0: - header = self.headers[f] + ' (' + f + ')' - break - -# if not header: -# sys.stderr.write( -# "WARNING: No header macro for" -# + " '" + block.source.filename + "'.\n" ) - - if header: - print ( header_location_header - + 'Defined in ' + header + '.' - + header_location_footer ) - - print source_header - for l in block.code: - print self.html_source_quote( l, block.name ) - print source_footer - - def markup_enter( self, markup, block ): - if markup.tag == "description": - print description_header - else: - print marker_header + markup.tag + marker_inter - - self.print_html_markup( markup ) - - def markup_exit( self, markup, block ): - if markup.tag == "description": - print description_footer - else: - print marker_footer - - def block_exit( self, block ): - print( block_footer_start + self.file_prefix + "index.html" - + block_footer_middle + self.file_prefix + "toc.html" - + block_footer_end ) - - def section_exit( self, section ): - print html_footer - - def section_dump_all( self ): - for section in self.sections: - self.section_dump( section, - self.file_prefix + section.name + '.html' ) - -# eof diff --git a/3party/freetype/src/tools/docmaker/utils.py b/3party/freetype/src/tools/docmaker/utils.py deleted file mode 100644 index 254083e92e..0000000000 --- a/3party/freetype/src/tools/docmaker/utils.py +++ /dev/null @@ -1,127 +0,0 @@ -# -# utils.py -# -# Auxiliary functions for the `docmaker' tool (library file). -# -# Copyright 2002-2015 by -# David Turner. -# -# 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. - - -import string, sys, os, glob, itertools - - -# current output directory -# -output_dir = None - - -# A function that generates a sorting key. We want lexicographical order -# (primary key) except that capital letters are sorted before lowercase -# ones (secondary key). -# -# The primary key is implemented by lowercasing the input. The secondary -# key is simply the original data appended, character by character. For -# example, the sort key for `FT_x' is `fFtT__xx', while the sort key for -# `ft_X' is `fftt__xX'. Since ASCII codes of uppercase letters are -# numerically smaller than the codes of lowercase letters, `fFtT__xx' gets -# sorted before `fftt__xX'. -# -def index_key( s ): - return string.join( itertools.chain( *zip( s.lower(), s ) ) ) - - -# Sort `input_list', placing the elements of `order_list' in front. -# -def sort_order_list( input_list, order_list ): - new_list = order_list[:] - for id in input_list: - if not id in order_list: - new_list.append( id ) - return new_list - - -# Divert standard output to a given project documentation file. Use -# `output_dir' to determine the filename location if necessary and save the -# old stdout handle in a tuple that is returned by this function. -# -def open_output( filename ): - global output_dir - - if output_dir and output_dir != "": - filename = output_dir + os.sep + filename - - old_stdout = sys.stdout - new_file = open( filename, "w" ) - sys.stdout = new_file - - return ( new_file, old_stdout ) - - -# Close the output that was returned by `open_output'. -# -def close_output( output ): - output[0].close() - sys.stdout = output[1] - - -# Check output directory. -# -def check_output(): - global output_dir - if output_dir: - if output_dir != "": - if not os.path.isdir( output_dir ): - sys.stderr.write( "argument" - + " '" + output_dir + "' " - + "is not a valid directory\n" ) - sys.exit( 2 ) - else: - output_dir = None - - -def file_exists( pathname ): - """Check that a given file exists.""" - result = 1 - try: - file = open( pathname, "r" ) - file.close() - except: - result = None - sys.stderr.write( pathname + " couldn't be accessed\n" ) - - return result - - -def make_file_list( args = None ): - """Build a list of input files from command-line arguments.""" - file_list = [] - # sys.stderr.write( repr( sys.argv[1 :] ) + '\n' ) - - if not args: - args = sys.argv[1:] - - for pathname in args: - if string.find( pathname, '*' ) >= 0: - newpath = glob.glob( pathname ) - newpath.sort() # sort files -- this is important because - # of the order of files - else: - newpath = [pathname] - - file_list.extend( newpath ) - - if len( file_list ) == 0: - file_list = None - else: - # now filter the file list to remove non-existing ones - file_list = filter( file_exists, file_list ) - - return file_list - -# eof diff --git a/3party/freetype/src/tools/ftrandom/README b/3party/freetype/src/tools/ftrandom/README deleted file mode 100644 index 71bf05323d..0000000000 --- a/3party/freetype/src/tools/ftrandom/README +++ /dev/null @@ -1,48 +0,0 @@ -ftrandom --------- - -This program expects a set of directories containing good fonts, and a set -of extensions of fonts to be tested. It will randomly pick a font, copy it, -introduce and error and then test it. - -The FreeType tests are quite basic: - - For each erroneous font it - forks off a new tester; - initializes the library; - opens each font in the file; - loads each glyph; - (optionally reviewing the contours of the glyph) - (optionally rasterizing) - closes the face. - -If the tester exits with a signal, or takes longer than 20 seconds then -ftrandom saves the erroneous font and continues. If the tester exits -normally or with an error, then the superstructure removes the test font and -continues. - -Arguments are: - - --all Test every font in the directory(ies) no matter - what its extension (some CID-keyed fonts have no - extension). - --check-outlines Call FT_Outline_Decompose on each glyph. - --dir Append to the list of directories to search - for good fonts. - --error-count Introduce single-byte errors into the - erroneous fonts. - --error-fraction Multiply the file size of the font by and - introduce that many errors into the erroneous - font file. - --ext Add to the set of font types tested. Known - extensions are `ttf', `otf', `ttc', `cid', `pfb', - `pfa', `bdf', `pcf', `pfr', `fon', `otb', and - `cff'. - --help Print out this list of options. - --nohints Specify FT_LOAD_NO_HINTING when loading glyphs. - --rasterize Call FT_Render_Glyph as well as loading it. - --result This is the directory in which test files are - placed. - --test Run a single test on a pre-generated testcase. - Done in the current process so it can be debugged - more easily. diff --git a/3party/freetype/src/tools/ftrandom/ftrandom.c b/3party/freetype/src/tools/ftrandom/ftrandom.c deleted file mode 100644 index 9a5b632673..0000000000 --- a/3party/freetype/src/tools/ftrandom/ftrandom.c +++ /dev/null @@ -1,673 +0,0 @@ -/* Copyright (C) 2005, 2007, 2008, 2013 by George Williams */ -/* - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - - * The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* modified by Werner Lemberg */ -/* This file is now part of the FreeType library */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include FT_FREETYPE_H -#include FT_OUTLINE_H - -#define true 1 -#define false 0 -#define forever for (;;) - - - static int check_outlines = false; - static int nohints = false; - static int rasterize = false; - static char* results_dir = "results"; - -#define GOOD_FONTS_DIR "/home/wl/freetype-testfonts" - - static char* default_dir_list[] = - { - GOOD_FONTS_DIR, - NULL - }; - - static char* default_ext_list[] = - { - "ttf", - "otf", - "ttc", - "cid", - "pfb", - "pfa", - "bdf", - "pcf", - "pfr", - "fon", - "otb", - "cff", - NULL - }; - - static int error_count = 1; - static int error_fraction = 0; - - static FT_F26Dot6 font_size = 12 * 64; - - static struct fontlist - { - char* name; - int len; - unsigned int isbinary: 1; - unsigned int isascii: 1; - unsigned int ishex: 1; - - } *fontlist; - - static int fcnt; - - - static int - FT_MoveTo( const FT_Vector *to, - void *user ) - { - return 0; - } - - - static int - FT_LineTo( const FT_Vector *to, - void *user ) - { - return 0; - } - - - static int - FT_ConicTo( const FT_Vector *_cp, - const FT_Vector *to, - void *user ) - { - return 0; - } - - - static int - FT_CubicTo( const FT_Vector *cp1, - const FT_Vector *cp2, - const FT_Vector *to, - void *user ) - { - return 0; - } - - - static FT_Outline_Funcs outlinefuncs = - { - FT_MoveTo, - FT_LineTo, - FT_ConicTo, - FT_CubicTo, - 0, 0 /* No shift, no delta */ - }; - - - static void - TestFace( FT_Face face ) - { - int gid; - int load_flags = FT_LOAD_DEFAULT; - - - if ( check_outlines && - FT_IS_SCALABLE( face ) ) - load_flags = FT_LOAD_NO_BITMAP; - - if ( nohints ) - load_flags |= FT_LOAD_NO_HINTING; - - FT_Set_Char_Size( face, 0, font_size, 72, 72 ); - - for ( gid = 0; gid < face->num_glyphs; ++gid ) - { - if ( check_outlines && - FT_IS_SCALABLE( face ) ) - { - if ( !FT_Load_Glyph( face, gid, load_flags ) ) - FT_Outline_Decompose( &face->glyph->outline, &outlinefuncs, NULL ); - } - else - FT_Load_Glyph( face, gid, load_flags ); - - if ( rasterize ) - FT_Render_Glyph( face->glyph, ft_render_mode_normal ); - } - - FT_Done_Face( face ); - } - - - static void - ExecuteTest( char* testfont ) - { - FT_Library context; - FT_Face face; - - - if ( FT_Init_FreeType( &context ) ) - { - fprintf( stderr, "Can't initialize FreeType.\n" ); - exit( 1 ); - } - - if ( FT_New_Face( context, testfont, 0, &face ) ) - { - /* The font is erroneous, so if this fails that's ok. */ - exit( 0 ); - } - - if ( face->num_faces == 1 ) - TestFace( face ); - else - { - int i, num; - - - num = face->num_faces; - FT_Done_Face( face ); - - for ( i = 0; i < num; ++i ) - { - if ( !FT_New_Face( context, testfont, i, &face ) ) - TestFace( face ); - } - } - - exit( 0 ); - } - - - static int - extmatch( char* filename, - char** extensions ) - { - int i; - char* pt; - - - if ( extensions == NULL ) - return true; - - pt = strrchr( filename, '.' ); - if ( pt == NULL ) - return false; - if ( pt < strrchr( filename, '/' ) ) - return false; - - for ( i = 0; extensions[i] != NULL; ++i ) - if ( strcasecmp( pt + 1, extensions[i] ) == 0 || - strcasecmp( pt, extensions[i] ) == 0 ) - return true; - - return false; - } - - - static void - figurefiletype( struct fontlist* item ) - { - FILE* foo; - - - item->isbinary = item->isascii = item->ishex = false; - - foo = fopen( item->name, "rb" ); - if ( foo != NULL ) - { - /* Try to guess the file type from the first few characters... */ - int ch1 = getc( foo ); - int ch2 = getc( foo ); - int ch3 = getc( foo ); - int ch4 = getc( foo ); - - - fclose( foo ); - - if ( ( ch1 == 0 && ch2 == 1 && ch3 == 0 && ch4 == 0 ) || - ( ch1 == 'O' && ch2 == 'T' && ch3 == 'T' && ch4 == 'O' ) || - ( ch1 == 't' && ch2 == 'r' && ch3 == 'u' && ch4 == 'e' ) || - ( ch1 == 't' && ch2 == 't' && ch3 == 'c' && ch4 == 'f' ) ) - { - /* ttf, otf, ttc files */ - item->isbinary = true; - } - else if ( ch1 == 0x80 && ch2 == '\01' ) - { - /* PFB header */ - item->isbinary = true; - } - else if ( ch1 == '%' && ch2 == '!' ) - { - /* Random PostScript */ - if ( strstr( item->name, ".pfa" ) != NULL || - strstr( item->name, ".PFA" ) != NULL ) - item->ishex = true; - else - item->isascii = true; - } - else if ( ch1 == 1 && ch2 == 0 && ch3 == 4 ) - { - /* Bare CFF */ - item->isbinary = true; - } - else if ( ch1 == 'S' && ch2 == 'T' && ch3 == 'A' && ch4 == 'R' ) - { - /* BDF */ - item->ishex = true; - } - else if ( ch1 == 'P' && ch2 == 'F' && ch3 == 'R' && ch4 == '0' ) - { - /* PFR */ - item->isbinary = true; - } - else if ( ( ch1 == '\1' && ch2 == 'f' && ch3 == 'c' && ch4 == 'p' ) || - ( ch1 == 'M' && ch2 == 'Z' ) ) - { - /* Windows FON */ - item->isbinary = true; - } - else - { - fprintf( stderr, - "Can't recognize file type of `%s', assuming binary\n", - item->name ); - item->isbinary = true; - } - } - else - { - fprintf( stderr, "Can't open `%s' for typing the file.\n", - item->name ); - item->isbinary = true; - } - } - - - static void - FindFonts( char** fontdirs, - char** extensions ) - { - int i, max; - char buffer[1025]; - struct stat statb; - - - max = 0; - fcnt = 0; - - for ( i = 0; fontdirs[i] != NULL; ++i ) - { - DIR* examples; - struct dirent* ent; - - - examples = opendir( fontdirs[i] ); - if ( examples == NULL ) - { - fprintf( stderr, - "Can't open example font directory `%s'\n", - fontdirs[i] ); - exit( 1 ); - } - - while ( ( ent = readdir( examples ) ) != NULL ) - { - snprintf( buffer, sizeof ( buffer ), - "%s/%s", fontdirs[i], ent->d_name ); - if ( stat( buffer, &statb ) == -1 || S_ISDIR( statb.st_mode ) ) - continue; - if ( extensions == NULL || extmatch( buffer, extensions ) ) - { - if ( fcnt >= max ) - { - max += 100; - fontlist = realloc( fontlist, max * sizeof ( struct fontlist ) ); - if ( fontlist == NULL ) - { - fprintf( stderr, "Can't allocate memory\n" ); - exit( 1 ); - } - } - - fontlist[fcnt].name = strdup( buffer ); - fontlist[fcnt].len = statb.st_size; - - figurefiletype( &fontlist[fcnt] ); - ++fcnt; - } - } - - closedir( examples ); - } - - if ( fcnt == 0 ) - { - fprintf( stderr, "Can't find matching font files.\n" ); - exit( 1 ); - } - - fontlist[fcnt].name = NULL; - } - - - static int - getErrorCnt( struct fontlist* item ) - { - if ( error_count == 0 && error_fraction == 0 ) - return 0; - - return error_count + ceil( error_fraction * item->len ); - } - - - static int - getRandom( int low, - int high ) - { - if ( low - high < 0x10000L ) - return low + ( ( random() >> 8 ) % ( high + 1 - low ) ); - - return low + ( random() % ( high + 1 - low ) ); - } - - - static int - copyfont( struct fontlist* item, - char* newfont ) - { - static char buffer[8096]; - FILE *good, *new; - int len; - int i, err_cnt; - - - good = fopen( item->name, "r" ); - if ( good == NULL ) - { - fprintf( stderr, "Can't open `%s'\n", item->name ); - return false; - } - - new = fopen( newfont, "w+" ); - if ( new == NULL ) - { - fprintf( stderr, "Can't create temporary output file `%s'\n", - newfont ); - exit( 1 ); - } - - while ( ( len = fread( buffer, 1, sizeof ( buffer ), good ) ) > 0 ) - fwrite( buffer, 1, len, new ); - - fclose( good ); - - err_cnt = getErrorCnt( item ); - for ( i = 0; i < err_cnt; ++i ) - { - fseek( new, getRandom( 0, item->len - 1 ), SEEK_SET ); - - if ( item->isbinary ) - putc( getRandom( 0, 0xFF ), new ); - else if ( item->isascii ) - putc( getRandom( 0x20, 0x7E ), new ); - else - { - int hex = getRandom( 0, 15 ); - - - if ( hex < 10 ) - hex += '0'; - else - hex += 'A' - 10; - - putc( hex, new ); - } - } - - if ( ferror( new ) ) - { - fclose( new ); - unlink( newfont ); - return false; - } - - fclose( new ); - - return true; - } - - - static int child_pid; - - static void - abort_test( int sig ) - { - /* If a time-out happens, then kill the child */ - kill( child_pid, SIGFPE ); - write( 2, "Timeout... ", 11 ); - } - - - static void - do_test( void ) - { - int i = getRandom( 0, fcnt - 1 ); - static int test_num = 0; - char buffer[1024]; - - - sprintf( buffer, "%s/test%d", results_dir, test_num++ ); - - if ( copyfont ( &fontlist[i], buffer ) ) - { - signal( SIGALRM, abort_test ); - /* Anything that takes more than 20 seconds */ - /* to parse and/or rasterize is an error. */ - alarm( 20 ); - if ( ( child_pid = fork() ) == 0 ) - ExecuteTest( buffer ); - else if ( child_pid != -1 ) - { - int status; - - - waitpid( child_pid, &status, 0 ); - alarm( 0 ); - if ( WIFSIGNALED ( status ) ) - printf( "Error found in file `%s'\n", buffer ); - else - unlink( buffer ); - } - else - { - fprintf( stderr, "Can't fork test case.\n" ); - exit( 1 ); - } - alarm( 0 ); - } - } - - - static void - usage( FILE* out, - char* name ) - { - fprintf( out, "%s [options] -- Generate random erroneous fonts\n" - " and attempt to parse them with FreeType.\n\n", name ); - - fprintf( out, " --all All non-directory files are assumed to be fonts.\n" ); - fprintf( out, " --check-outlines Make sure we can parse the outlines of each glyph.\n" ); - fprintf( out, " --dir Append to list of font search directories.\n" ); - fprintf( out, " --error-count Introduce single byte errors into each font.\n" ); - fprintf( out, " --error-fraction Introduce *filesize single byte errors\n" - " into each font.\n" ); - fprintf( out, " --ext Add to list of extensions indicating fonts.\n" ); - fprintf( out, " --help Print this.\n" ); - fprintf( out, " --nohints Turn off hinting.\n" ); - fprintf( out, " --rasterize Attempt to rasterize each glyph.\n" ); - fprintf( out, " --results Directory in which to place the test fonts.\n" ); - fprintf( out, " --size Use the given font size for the tests.\n" ); - fprintf( out, " --test Run a single test on an already existing file.\n" ); - } - - - int - main( int argc, - char** argv ) - { - char **dirs, **exts; - int dcnt = 0, ecnt = 0, rset = false, allexts = false; - int i; - time_t now; - char* testfile = NULL; - - - dirs = calloc( argc + 1, sizeof ( char ** ) ); - exts = calloc( argc + 1, sizeof ( char ** ) ); - - for ( i = 1; i < argc; ++i ) - { - char* pt = argv[i]; - char* end; - - - if ( pt[0] == '-' && pt[1] == '-' ) - ++pt; - - if ( strcmp( pt, "-all" ) == 0 ) - allexts = true; - else if ( strcmp( pt, "-check-outlines" ) == 0 ) - check_outlines = true; - else if ( strcmp( pt, "-dir" ) == 0 ) - dirs[dcnt++] = argv[++i]; - else if ( strcmp( pt, "-error-count" ) == 0 ) - { - if ( !rset ) - error_fraction = 0; - rset = true; - error_count = strtol( argv[++i], &end, 10 ); - if ( *end != '\0' ) - { - fprintf( stderr, "Bad value for error-count: %s\n", argv[i] ); - exit( 1 ); - } - } - else if ( strcmp( pt, "-error-fraction" ) == 0 ) - { - if ( !rset ) - error_count = 0; - rset = true; - error_fraction = strtod( argv[++i], &end ); - if ( *end != '\0' ) - { - fprintf( stderr, "Bad value for error-fraction: %s\n", argv[i] ); - exit( 1 ); - } - } - else if ( strcmp( pt, "-ext" ) == 0 ) - exts[ecnt++] = argv[++i]; - else if ( strcmp( pt, "-help" ) == 0 ) - { - usage( stdout, argv[0] ); - exit( 0 ); - } - else if ( strcmp( pt, "-nohints" ) == 0 ) - nohints = true; - else if ( strcmp( pt, "-rasterize" ) == 0 ) - rasterize = true; - else if ( strcmp( pt, "-results" ) == 0 ) - results_dir = argv[++i]; - else if ( strcmp( pt, "-size" ) == 0 ) - { - font_size = (FT_F26Dot6)( strtod( argv[++i], &end ) * 64 ); - if ( *end != '\0' || font_size < 64 ) - { - fprintf( stderr, "Bad value for size: %s\n", argv[i] ); - exit( 1 ); - } - } - else if ( strcmp( pt, "-test" ) == 0 ) - testfile = argv[++i]; - else - { - usage( stderr, argv[0] ); - exit( 1 ); - } - } - - if ( allexts ) - { - free( exts ); - exts = NULL; - } - else if ( ecnt == 0 ) - { - free( exts ); - exts = default_ext_list; - } - - if ( dcnt == 0 ) - { - free( dirs ); - dirs = default_dir_list; - } - - if ( testfile != NULL ) - ExecuteTest( testfile ); /* This should never return */ - - time( &now ); - srandom( now ); - - FindFonts( dirs, exts ); - mkdir( results_dir, 0755 ); - - forever - do_test(); - - return 0; - } - - -/* EOF */ diff --git a/3party/freetype/src/tools/glnames.py b/3party/freetype/src/tools/glnames.py deleted file mode 100644 index 0ad554c72d..0000000000 --- a/3party/freetype/src/tools/glnames.py +++ /dev/null @@ -1,5487 +0,0 @@ -#!/usr/bin/env python -# - -# -# FreeType 2 glyph name builder -# - - -# Copyright 1996-2015 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. - - -"""\ - -usage: %s - - This python script generates the glyph names tables defined in the - `psnames' module. - - Its single argument is the name of the header file to be created. -""" - - -import sys, string, struct, re, os.path - - -# This table lists the glyphs according to the Macintosh specification. -# It is used by the TrueType Postscript names table. -# -# See -# -# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6post.html -# -# for the official list. -# -mac_standard_names = \ -[ - # 0 - ".notdef", ".null", "nonmarkingreturn", "space", "exclam", - "quotedbl", "numbersign", "dollar", "percent", "ampersand", - - # 10 - "quotesingle", "parenleft", "parenright", "asterisk", "plus", - "comma", "hyphen", "period", "slash", "zero", - - # 20 - "one", "two", "three", "four", "five", - "six", "seven", "eight", "nine", "colon", - - # 30 - "semicolon", "less", "equal", "greater", "question", - "at", "A", "B", "C", "D", - - # 40 - "E", "F", "G", "H", "I", - "J", "K", "L", "M", "N", - - # 50 - "O", "P", "Q", "R", "S", - "T", "U", "V", "W", "X", - - # 60 - "Y", "Z", "bracketleft", "backslash", "bracketright", - "asciicircum", "underscore", "grave", "a", "b", - - # 70 - "c", "d", "e", "f", "g", - "h", "i", "j", "k", "l", - - # 80 - "m", "n", "o", "p", "q", - "r", "s", "t", "u", "v", - - # 90 - "w", "x", "y", "z", "braceleft", - "bar", "braceright", "asciitilde", "Adieresis", "Aring", - - # 100 - "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", - "aacute", "agrave", "acircumflex", "adieresis", "atilde", - - # 110 - "aring", "ccedilla", "eacute", "egrave", "ecircumflex", - "edieresis", "iacute", "igrave", "icircumflex", "idieresis", - - # 120 - "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", - "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", - - # 130 - "dagger", "degree", "cent", "sterling", "section", - "bullet", "paragraph", "germandbls", "registered", "copyright", - - # 140 - "trademark", "acute", "dieresis", "notequal", "AE", - "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", - - # 150 - "yen", "mu", "partialdiff", "summation", "product", - "pi", "integral", "ordfeminine", "ordmasculine", "Omega", - - # 160 - "ae", "oslash", "questiondown", "exclamdown", "logicalnot", - "radical", "florin", "approxequal", "Delta", "guillemotleft", - - # 170 - "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", - "Otilde", "OE", "oe", "endash", "emdash", - - # 180 - "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", - "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", - - # 190 - "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", - "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", - "Acircumflex", - - # 200 - "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", - "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", - - # 210 - "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", - "dotlessi", "circumflex", "tilde", "macron", "breve", - - # 220 - "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", - "caron", "Lslash", "lslash", "Scaron", "scaron", - - # 230 - "Zcaron", "zcaron", "brokenbar", "Eth", "eth", - "Yacute", "yacute", "Thorn", "thorn", "minus", - - # 240 - "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", - "onequarter", "threequarters", "franc", "Gbreve", "gbreve", - - # 250 - "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute", - "Ccaron", "ccaron", "dcroat" -] - - -# The list of standard `SID' glyph names. For the official list, -# see Annex A of document at -# -# http://partners.adobe.com/public/developer/en/font/5176.CFF.pdf . -# -sid_standard_names = \ -[ - # 0 - ".notdef", "space", "exclam", "quotedbl", "numbersign", - "dollar", "percent", "ampersand", "quoteright", "parenleft", - - # 10 - "parenright", "asterisk", "plus", "comma", "hyphen", - "period", "slash", "zero", "one", "two", - - # 20 - "three", "four", "five", "six", "seven", - "eight", "nine", "colon", "semicolon", "less", - - # 30 - "equal", "greater", "question", "at", "A", - "B", "C", "D", "E", "F", - - # 40 - "G", "H", "I", "J", "K", - "L", "M", "N", "O", "P", - - # 50 - "Q", "R", "S", "T", "U", - "V", "W", "X", "Y", "Z", - - # 60 - "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", - "quoteleft", "a", "b", "c", "d", - - # 70 - "e", "f", "g", "h", "i", - "j", "k", "l", "m", "n", - - # 80 - "o", "p", "q", "r", "s", - "t", "u", "v", "w", "x", - - # 90 - "y", "z", "braceleft", "bar", "braceright", - "asciitilde", "exclamdown", "cent", "sterling", "fraction", - - # 100 - "yen", "florin", "section", "currency", "quotesingle", - "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", - - # 110 - "fl", "endash", "dagger", "daggerdbl", "periodcentered", - "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", - - # 120 - "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", - "acute", "circumflex", "tilde", "macron", "breve", - - # 130 - "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", - "ogonek", "caron", "emdash", "AE", "ordfeminine", - - # 140 - "Lslash", "Oslash", "OE", "ordmasculine", "ae", - "dotlessi", "lslash", "oslash", "oe", "germandbls", - - # 150 - "onesuperior", "logicalnot", "mu", "trademark", "Eth", - "onehalf", "plusminus", "Thorn", "onequarter", "divide", - - # 160 - "brokenbar", "degree", "thorn", "threequarters", "twosuperior", - "registered", "minus", "eth", "multiply", "threesuperior", - - # 170 - "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", - "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", - - # 180 - "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", - "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", - - # 190 - "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", - "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", - - # 200 - "aacute", "acircumflex", "adieresis", "agrave", "aring", - "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", - - # 210 - "egrave", "iacute", "icircumflex", "idieresis", "igrave", - "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", - - # 220 - "otilde", "scaron", "uacute", "ucircumflex", "udieresis", - "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", - - # 230 - "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", - "Acutesmall", - "parenleftsuperior", "parenrightsuperior", "twodotenleader", - "onedotenleader", "zerooldstyle", - - # 240 - "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", - "fiveoldstyle", - "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", - "commasuperior", - - # 250 - "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", - "bsuperior", - "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", - - # 260 - "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", - "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", - - # 270 - "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", - "Asmall", - "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", - - # 280 - "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", - "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", - - # 290 - "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", - "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", - - # 300 - "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", - "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", - "Dieresissmall", - - # 310 - "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", - "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", - "questiondownsmall", - - # 320 - "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", - "twothirds", "zerosuperior", "foursuperior", "fivesuperior", - "sixsuperior", - - # 330 - "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", - "oneinferior", - "twoinferior", "threeinferior", "fourinferior", "fiveinferior", - "sixinferior", - - # 340 - "seveninferior", "eightinferior", "nineinferior", "centinferior", - "dollarinferior", - "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", - "Acircumflexsmall", - - # 350 - "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", - "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", - "Igravesmall", - - # 360 - "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", - "Ntildesmall", - "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", - "Odieresissmall", - - # 370 - "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", - "Ucircumflexsmall", - "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", - "001.000", - - # 380 - "001.001", "001.002", "001.003", "Black", "Bold", - "Book", "Light", "Medium", "Regular", "Roman", - - # 390 - "Semibold" -] - - -# This table maps character codes of the Adobe Standard Type 1 -# encoding to glyph indices in the sid_standard_names table. -# -t1_standard_encoding = \ -[ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, - 114, 0, 115, 116, 117, 118, 119, 120, 121, 122, - 0, 123, 0, 124, 125, 126, 127, 128, 129, 130, - - 131, 0, 132, 133, 0, 134, 135, 136, 137, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 138, 0, 139, 0, 0, - 0, 0, 140, 141, 142, 143, 0, 0, 0, 0, - 0, 144, 0, 0, 0, 145, 0, 0, 146, 147, - - 148, 149, 0, 0, 0, 0 -] - - -# This table maps character codes of the Adobe Expert Type 1 -# encoding to glyph indices in the sid_standard_names table. -# -t1_expert_encoding = \ -[ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 229, 230, 0, 231, 232, 233, 234, - 235, 236, 237, 238, 13, 14, 15, 99, 239, 240, - - 241, 242, 243, 244, 245, 246, 247, 248, 27, 28, - 249, 250, 251, 252, 0, 253, 254, 255, 256, 257, - 0, 0, 0, 258, 0, 0, 259, 260, 261, 262, - 0, 0, 263, 264, 265, 0, 266, 109, 110, 267, - 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, - - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 304, 305, 306, 0, 0, 307, 308, 309, 310, - 311, 0, 312, 0, 0, 313, 0, 0, 314, 315, - 0, 0, 316, 317, 318, 0, 0, 0, 158, 155, - 163, 319, 320, 321, 322, 323, 324, 325, 0, 0, - - 326, 150, 164, 169, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - - 373, 374, 375, 376, 377, 378 -] - - -# This data has been taken literally from the files `glyphlist.txt' -# and `zapfdingbats.txt' version 2.0, Sept 2002. It is available from -# -# http://sourceforge.net/adobe/aglfn/ -# -adobe_glyph_list = """\ -A;0041 -AE;00C6 -AEacute;01FC -AEmacron;01E2 -AEsmall;F7E6 -Aacute;00C1 -Aacutesmall;F7E1 -Abreve;0102 -Abreveacute;1EAE -Abrevecyrillic;04D0 -Abrevedotbelow;1EB6 -Abrevegrave;1EB0 -Abrevehookabove;1EB2 -Abrevetilde;1EB4 -Acaron;01CD -Acircle;24B6 -Acircumflex;00C2 -Acircumflexacute;1EA4 -Acircumflexdotbelow;1EAC -Acircumflexgrave;1EA6 -Acircumflexhookabove;1EA8 -Acircumflexsmall;F7E2 -Acircumflextilde;1EAA -Acute;F6C9 -Acutesmall;F7B4 -Acyrillic;0410 -Adblgrave;0200 -Adieresis;00C4 -Adieresiscyrillic;04D2 -Adieresismacron;01DE -Adieresissmall;F7E4 -Adotbelow;1EA0 -Adotmacron;01E0 -Agrave;00C0 -Agravesmall;F7E0 -Ahookabove;1EA2 -Aiecyrillic;04D4 -Ainvertedbreve;0202 -Alpha;0391 -Alphatonos;0386 -Amacron;0100 -Amonospace;FF21 -Aogonek;0104 -Aring;00C5 -Aringacute;01FA -Aringbelow;1E00 -Aringsmall;F7E5 -Asmall;F761 -Atilde;00C3 -Atildesmall;F7E3 -Aybarmenian;0531 -B;0042 -Bcircle;24B7 -Bdotaccent;1E02 -Bdotbelow;1E04 -Becyrillic;0411 -Benarmenian;0532 -Beta;0392 -Bhook;0181 -Blinebelow;1E06 -Bmonospace;FF22 -Brevesmall;F6F4 -Bsmall;F762 -Btopbar;0182 -C;0043 -Caarmenian;053E -Cacute;0106 -Caron;F6CA -Caronsmall;F6F5 -Ccaron;010C -Ccedilla;00C7 -Ccedillaacute;1E08 -Ccedillasmall;F7E7 -Ccircle;24B8 -Ccircumflex;0108 -Cdot;010A -Cdotaccent;010A -Cedillasmall;F7B8 -Chaarmenian;0549 -Cheabkhasiancyrillic;04BC -Checyrillic;0427 -Chedescenderabkhasiancyrillic;04BE -Chedescendercyrillic;04B6 -Chedieresiscyrillic;04F4 -Cheharmenian;0543 -Chekhakassiancyrillic;04CB -Cheverticalstrokecyrillic;04B8 -Chi;03A7 -Chook;0187 -Circumflexsmall;F6F6 -Cmonospace;FF23 -Coarmenian;0551 -Csmall;F763 -D;0044 -DZ;01F1 -DZcaron;01C4 -Daarmenian;0534 -Dafrican;0189 -Dcaron;010E -Dcedilla;1E10 -Dcircle;24B9 -Dcircumflexbelow;1E12 -Dcroat;0110 -Ddotaccent;1E0A -Ddotbelow;1E0C -Decyrillic;0414 -Deicoptic;03EE -Delta;2206 -Deltagreek;0394 -Dhook;018A -Dieresis;F6CB -DieresisAcute;F6CC -DieresisGrave;F6CD -Dieresissmall;F7A8 -Digammagreek;03DC -Djecyrillic;0402 -Dlinebelow;1E0E -Dmonospace;FF24 -Dotaccentsmall;F6F7 -Dslash;0110 -Dsmall;F764 -Dtopbar;018B -Dz;01F2 -Dzcaron;01C5 -Dzeabkhasiancyrillic;04E0 -Dzecyrillic;0405 -Dzhecyrillic;040F -E;0045 -Eacute;00C9 -Eacutesmall;F7E9 -Ebreve;0114 -Ecaron;011A -Ecedillabreve;1E1C -Echarmenian;0535 -Ecircle;24BA -Ecircumflex;00CA -Ecircumflexacute;1EBE -Ecircumflexbelow;1E18 -Ecircumflexdotbelow;1EC6 -Ecircumflexgrave;1EC0 -Ecircumflexhookabove;1EC2 -Ecircumflexsmall;F7EA -Ecircumflextilde;1EC4 -Ecyrillic;0404 -Edblgrave;0204 -Edieresis;00CB -Edieresissmall;F7EB -Edot;0116 -Edotaccent;0116 -Edotbelow;1EB8 -Efcyrillic;0424 -Egrave;00C8 -Egravesmall;F7E8 -Eharmenian;0537 -Ehookabove;1EBA -Eightroman;2167 -Einvertedbreve;0206 -Eiotifiedcyrillic;0464 -Elcyrillic;041B -Elevenroman;216A -Emacron;0112 -Emacronacute;1E16 -Emacrongrave;1E14 -Emcyrillic;041C -Emonospace;FF25 -Encyrillic;041D -Endescendercyrillic;04A2 -Eng;014A -Enghecyrillic;04A4 -Enhookcyrillic;04C7 -Eogonek;0118 -Eopen;0190 -Epsilon;0395 -Epsilontonos;0388 -Ercyrillic;0420 -Ereversed;018E -Ereversedcyrillic;042D -Escyrillic;0421 -Esdescendercyrillic;04AA -Esh;01A9 -Esmall;F765 -Eta;0397 -Etarmenian;0538 -Etatonos;0389 -Eth;00D0 -Ethsmall;F7F0 -Etilde;1EBC -Etildebelow;1E1A -Euro;20AC -Ezh;01B7 -Ezhcaron;01EE -Ezhreversed;01B8 -F;0046 -Fcircle;24BB -Fdotaccent;1E1E -Feharmenian;0556 -Feicoptic;03E4 -Fhook;0191 -Fitacyrillic;0472 -Fiveroman;2164 -Fmonospace;FF26 -Fourroman;2163 -Fsmall;F766 -G;0047 -GBsquare;3387 -Gacute;01F4 -Gamma;0393 -Gammaafrican;0194 -Gangiacoptic;03EA -Gbreve;011E -Gcaron;01E6 -Gcedilla;0122 -Gcircle;24BC -Gcircumflex;011C -Gcommaaccent;0122 -Gdot;0120 -Gdotaccent;0120 -Gecyrillic;0413 -Ghadarmenian;0542 -Ghemiddlehookcyrillic;0494 -Ghestrokecyrillic;0492 -Gheupturncyrillic;0490 -Ghook;0193 -Gimarmenian;0533 -Gjecyrillic;0403 -Gmacron;1E20 -Gmonospace;FF27 -Grave;F6CE -Gravesmall;F760 -Gsmall;F767 -Gsmallhook;029B -Gstroke;01E4 -H;0048 -H18533;25CF -H18543;25AA -H18551;25AB -H22073;25A1 -HPsquare;33CB -Haabkhasiancyrillic;04A8 -Hadescendercyrillic;04B2 -Hardsigncyrillic;042A -Hbar;0126 -Hbrevebelow;1E2A -Hcedilla;1E28 -Hcircle;24BD -Hcircumflex;0124 -Hdieresis;1E26 -Hdotaccent;1E22 -Hdotbelow;1E24 -Hmonospace;FF28 -Hoarmenian;0540 -Horicoptic;03E8 -Hsmall;F768 -Hungarumlaut;F6CF -Hungarumlautsmall;F6F8 -Hzsquare;3390 -I;0049 -IAcyrillic;042F -IJ;0132 -IUcyrillic;042E -Iacute;00CD -Iacutesmall;F7ED -Ibreve;012C -Icaron;01CF -Icircle;24BE -Icircumflex;00CE -Icircumflexsmall;F7EE -Icyrillic;0406 -Idblgrave;0208 -Idieresis;00CF -Idieresisacute;1E2E -Idieresiscyrillic;04E4 -Idieresissmall;F7EF -Idot;0130 -Idotaccent;0130 -Idotbelow;1ECA -Iebrevecyrillic;04D6 -Iecyrillic;0415 -Ifraktur;2111 -Igrave;00CC -Igravesmall;F7EC -Ihookabove;1EC8 -Iicyrillic;0418 -Iinvertedbreve;020A -Iishortcyrillic;0419 -Imacron;012A -Imacroncyrillic;04E2 -Imonospace;FF29 -Iniarmenian;053B -Iocyrillic;0401 -Iogonek;012E -Iota;0399 -Iotaafrican;0196 -Iotadieresis;03AA -Iotatonos;038A -Ismall;F769 -Istroke;0197 -Itilde;0128 -Itildebelow;1E2C -Izhitsacyrillic;0474 -Izhitsadblgravecyrillic;0476 -J;004A -Jaarmenian;0541 -Jcircle;24BF -Jcircumflex;0134 -Jecyrillic;0408 -Jheharmenian;054B -Jmonospace;FF2A -Jsmall;F76A -K;004B -KBsquare;3385 -KKsquare;33CD -Kabashkircyrillic;04A0 -Kacute;1E30 -Kacyrillic;041A -Kadescendercyrillic;049A -Kahookcyrillic;04C3 -Kappa;039A -Kastrokecyrillic;049E -Kaverticalstrokecyrillic;049C -Kcaron;01E8 -Kcedilla;0136 -Kcircle;24C0 -Kcommaaccent;0136 -Kdotbelow;1E32 -Keharmenian;0554 -Kenarmenian;053F -Khacyrillic;0425 -Kheicoptic;03E6 -Khook;0198 -Kjecyrillic;040C -Klinebelow;1E34 -Kmonospace;FF2B -Koppacyrillic;0480 -Koppagreek;03DE -Ksicyrillic;046E -Ksmall;F76B -L;004C -LJ;01C7 -LL;F6BF -Lacute;0139 -Lambda;039B -Lcaron;013D -Lcedilla;013B -Lcircle;24C1 -Lcircumflexbelow;1E3C -Lcommaaccent;013B -Ldot;013F -Ldotaccent;013F -Ldotbelow;1E36 -Ldotbelowmacron;1E38 -Liwnarmenian;053C -Lj;01C8 -Ljecyrillic;0409 -Llinebelow;1E3A -Lmonospace;FF2C -Lslash;0141 -Lslashsmall;F6F9 -Lsmall;F76C -M;004D -MBsquare;3386 -Macron;F6D0 -Macronsmall;F7AF -Macute;1E3E -Mcircle;24C2 -Mdotaccent;1E40 -Mdotbelow;1E42 -Menarmenian;0544 -Mmonospace;FF2D -Msmall;F76D -Mturned;019C -Mu;039C -N;004E -NJ;01CA -Nacute;0143 -Ncaron;0147 -Ncedilla;0145 -Ncircle;24C3 -Ncircumflexbelow;1E4A -Ncommaaccent;0145 -Ndotaccent;1E44 -Ndotbelow;1E46 -Nhookleft;019D -Nineroman;2168 -Nj;01CB -Njecyrillic;040A -Nlinebelow;1E48 -Nmonospace;FF2E -Nowarmenian;0546 -Nsmall;F76E -Ntilde;00D1 -Ntildesmall;F7F1 -Nu;039D -O;004F -OE;0152 -OEsmall;F6FA -Oacute;00D3 -Oacutesmall;F7F3 -Obarredcyrillic;04E8 -Obarreddieresiscyrillic;04EA -Obreve;014E -Ocaron;01D1 -Ocenteredtilde;019F -Ocircle;24C4 -Ocircumflex;00D4 -Ocircumflexacute;1ED0 -Ocircumflexdotbelow;1ED8 -Ocircumflexgrave;1ED2 -Ocircumflexhookabove;1ED4 -Ocircumflexsmall;F7F4 -Ocircumflextilde;1ED6 -Ocyrillic;041E -Odblacute;0150 -Odblgrave;020C -Odieresis;00D6 -Odieresiscyrillic;04E6 -Odieresissmall;F7F6 -Odotbelow;1ECC -Ogoneksmall;F6FB -Ograve;00D2 -Ogravesmall;F7F2 -Oharmenian;0555 -Ohm;2126 -Ohookabove;1ECE -Ohorn;01A0 -Ohornacute;1EDA -Ohorndotbelow;1EE2 -Ohorngrave;1EDC -Ohornhookabove;1EDE -Ohorntilde;1EE0 -Ohungarumlaut;0150 -Oi;01A2 -Oinvertedbreve;020E -Omacron;014C -Omacronacute;1E52 -Omacrongrave;1E50 -Omega;2126 -Omegacyrillic;0460 -Omegagreek;03A9 -Omegaroundcyrillic;047A -Omegatitlocyrillic;047C -Omegatonos;038F -Omicron;039F -Omicrontonos;038C -Omonospace;FF2F -Oneroman;2160 -Oogonek;01EA -Oogonekmacron;01EC -Oopen;0186 -Oslash;00D8 -Oslashacute;01FE -Oslashsmall;F7F8 -Osmall;F76F -Ostrokeacute;01FE -Otcyrillic;047E -Otilde;00D5 -Otildeacute;1E4C -Otildedieresis;1E4E -Otildesmall;F7F5 -P;0050 -Pacute;1E54 -Pcircle;24C5 -Pdotaccent;1E56 -Pecyrillic;041F -Peharmenian;054A -Pemiddlehookcyrillic;04A6 -Phi;03A6 -Phook;01A4 -Pi;03A0 -Piwrarmenian;0553 -Pmonospace;FF30 -Psi;03A8 -Psicyrillic;0470 -Psmall;F770 -Q;0051 -Qcircle;24C6 -Qmonospace;FF31 -Qsmall;F771 -R;0052 -Raarmenian;054C -Racute;0154 -Rcaron;0158 -Rcedilla;0156 -Rcircle;24C7 -Rcommaaccent;0156 -Rdblgrave;0210 -Rdotaccent;1E58 -Rdotbelow;1E5A -Rdotbelowmacron;1E5C -Reharmenian;0550 -Rfraktur;211C -Rho;03A1 -Ringsmall;F6FC -Rinvertedbreve;0212 -Rlinebelow;1E5E -Rmonospace;FF32 -Rsmall;F772 -Rsmallinverted;0281 -Rsmallinvertedsuperior;02B6 -S;0053 -SF010000;250C -SF020000;2514 -SF030000;2510 -SF040000;2518 -SF050000;253C -SF060000;252C -SF070000;2534 -SF080000;251C -SF090000;2524 -SF100000;2500 -SF110000;2502 -SF190000;2561 -SF200000;2562 -SF210000;2556 -SF220000;2555 -SF230000;2563 -SF240000;2551 -SF250000;2557 -SF260000;255D -SF270000;255C -SF280000;255B -SF360000;255E -SF370000;255F -SF380000;255A -SF390000;2554 -SF400000;2569 -SF410000;2566 -SF420000;2560 -SF430000;2550 -SF440000;256C -SF450000;2567 -SF460000;2568 -SF470000;2564 -SF480000;2565 -SF490000;2559 -SF500000;2558 -SF510000;2552 -SF520000;2553 -SF530000;256B -SF540000;256A -Sacute;015A -Sacutedotaccent;1E64 -Sampigreek;03E0 -Scaron;0160 -Scarondotaccent;1E66 -Scaronsmall;F6FD -Scedilla;015E -Schwa;018F -Schwacyrillic;04D8 -Schwadieresiscyrillic;04DA -Scircle;24C8 -Scircumflex;015C -Scommaaccent;0218 -Sdotaccent;1E60 -Sdotbelow;1E62 -Sdotbelowdotaccent;1E68 -Seharmenian;054D -Sevenroman;2166 -Shaarmenian;0547 -Shacyrillic;0428 -Shchacyrillic;0429 -Sheicoptic;03E2 -Shhacyrillic;04BA -Shimacoptic;03EC -Sigma;03A3 -Sixroman;2165 -Smonospace;FF33 -Softsigncyrillic;042C -Ssmall;F773 -Stigmagreek;03DA -T;0054 -Tau;03A4 -Tbar;0166 -Tcaron;0164 -Tcedilla;0162 -Tcircle;24C9 -Tcircumflexbelow;1E70 -Tcommaaccent;0162 -Tdotaccent;1E6A -Tdotbelow;1E6C -Tecyrillic;0422 -Tedescendercyrillic;04AC -Tenroman;2169 -Tetsecyrillic;04B4 -Theta;0398 -Thook;01AC -Thorn;00DE -Thornsmall;F7FE -Threeroman;2162 -Tildesmall;F6FE -Tiwnarmenian;054F -Tlinebelow;1E6E -Tmonospace;FF34 -Toarmenian;0539 -Tonefive;01BC -Tonesix;0184 -Tonetwo;01A7 -Tretroflexhook;01AE -Tsecyrillic;0426 -Tshecyrillic;040B -Tsmall;F774 -Twelveroman;216B -Tworoman;2161 -U;0055 -Uacute;00DA -Uacutesmall;F7FA -Ubreve;016C -Ucaron;01D3 -Ucircle;24CA -Ucircumflex;00DB -Ucircumflexbelow;1E76 -Ucircumflexsmall;F7FB -Ucyrillic;0423 -Udblacute;0170 -Udblgrave;0214 -Udieresis;00DC -Udieresisacute;01D7 -Udieresisbelow;1E72 -Udieresiscaron;01D9 -Udieresiscyrillic;04F0 -Udieresisgrave;01DB -Udieresismacron;01D5 -Udieresissmall;F7FC -Udotbelow;1EE4 -Ugrave;00D9 -Ugravesmall;F7F9 -Uhookabove;1EE6 -Uhorn;01AF -Uhornacute;1EE8 -Uhorndotbelow;1EF0 -Uhorngrave;1EEA -Uhornhookabove;1EEC -Uhorntilde;1EEE -Uhungarumlaut;0170 -Uhungarumlautcyrillic;04F2 -Uinvertedbreve;0216 -Ukcyrillic;0478 -Umacron;016A -Umacroncyrillic;04EE -Umacrondieresis;1E7A -Umonospace;FF35 -Uogonek;0172 -Upsilon;03A5 -Upsilon1;03D2 -Upsilonacutehooksymbolgreek;03D3 -Upsilonafrican;01B1 -Upsilondieresis;03AB -Upsilondieresishooksymbolgreek;03D4 -Upsilonhooksymbol;03D2 -Upsilontonos;038E -Uring;016E -Ushortcyrillic;040E -Usmall;F775 -Ustraightcyrillic;04AE -Ustraightstrokecyrillic;04B0 -Utilde;0168 -Utildeacute;1E78 -Utildebelow;1E74 -V;0056 -Vcircle;24CB -Vdotbelow;1E7E -Vecyrillic;0412 -Vewarmenian;054E -Vhook;01B2 -Vmonospace;FF36 -Voarmenian;0548 -Vsmall;F776 -Vtilde;1E7C -W;0057 -Wacute;1E82 -Wcircle;24CC -Wcircumflex;0174 -Wdieresis;1E84 -Wdotaccent;1E86 -Wdotbelow;1E88 -Wgrave;1E80 -Wmonospace;FF37 -Wsmall;F777 -X;0058 -Xcircle;24CD -Xdieresis;1E8C -Xdotaccent;1E8A -Xeharmenian;053D -Xi;039E -Xmonospace;FF38 -Xsmall;F778 -Y;0059 -Yacute;00DD -Yacutesmall;F7FD -Yatcyrillic;0462 -Ycircle;24CE -Ycircumflex;0176 -Ydieresis;0178 -Ydieresissmall;F7FF -Ydotaccent;1E8E -Ydotbelow;1EF4 -Yericyrillic;042B -Yerudieresiscyrillic;04F8 -Ygrave;1EF2 -Yhook;01B3 -Yhookabove;1EF6 -Yiarmenian;0545 -Yicyrillic;0407 -Yiwnarmenian;0552 -Ymonospace;FF39 -Ysmall;F779 -Ytilde;1EF8 -Yusbigcyrillic;046A -Yusbigiotifiedcyrillic;046C -Yuslittlecyrillic;0466 -Yuslittleiotifiedcyrillic;0468 -Z;005A -Zaarmenian;0536 -Zacute;0179 -Zcaron;017D -Zcaronsmall;F6FF -Zcircle;24CF -Zcircumflex;1E90 -Zdot;017B -Zdotaccent;017B -Zdotbelow;1E92 -Zecyrillic;0417 -Zedescendercyrillic;0498 -Zedieresiscyrillic;04DE -Zeta;0396 -Zhearmenian;053A -Zhebrevecyrillic;04C1 -Zhecyrillic;0416 -Zhedescendercyrillic;0496 -Zhedieresiscyrillic;04DC -Zlinebelow;1E94 -Zmonospace;FF3A -Zsmall;F77A -Zstroke;01B5 -a;0061 -aabengali;0986 -aacute;00E1 -aadeva;0906 -aagujarati;0A86 -aagurmukhi;0A06 -aamatragurmukhi;0A3E -aarusquare;3303 -aavowelsignbengali;09BE -aavowelsigndeva;093E -aavowelsigngujarati;0ABE -abbreviationmarkarmenian;055F -abbreviationsigndeva;0970 -abengali;0985 -abopomofo;311A -abreve;0103 -abreveacute;1EAF -abrevecyrillic;04D1 -abrevedotbelow;1EB7 -abrevegrave;1EB1 -abrevehookabove;1EB3 -abrevetilde;1EB5 -acaron;01CE -acircle;24D0 -acircumflex;00E2 -acircumflexacute;1EA5 -acircumflexdotbelow;1EAD -acircumflexgrave;1EA7 -acircumflexhookabove;1EA9 -acircumflextilde;1EAB -acute;00B4 -acutebelowcmb;0317 -acutecmb;0301 -acutecomb;0301 -acutedeva;0954 -acutelowmod;02CF -acutetonecmb;0341 -acyrillic;0430 -adblgrave;0201 -addakgurmukhi;0A71 -adeva;0905 -adieresis;00E4 -adieresiscyrillic;04D3 -adieresismacron;01DF -adotbelow;1EA1 -adotmacron;01E1 -ae;00E6 -aeacute;01FD -aekorean;3150 -aemacron;01E3 -afii00208;2015 -afii08941;20A4 -afii10017;0410 -afii10018;0411 -afii10019;0412 -afii10020;0413 -afii10021;0414 -afii10022;0415 -afii10023;0401 -afii10024;0416 -afii10025;0417 -afii10026;0418 -afii10027;0419 -afii10028;041A -afii10029;041B -afii10030;041C -afii10031;041D -afii10032;041E -afii10033;041F -afii10034;0420 -afii10035;0421 -afii10036;0422 -afii10037;0423 -afii10038;0424 -afii10039;0425 -afii10040;0426 -afii10041;0427 -afii10042;0428 -afii10043;0429 -afii10044;042A -afii10045;042B -afii10046;042C -afii10047;042D -afii10048;042E -afii10049;042F -afii10050;0490 -afii10051;0402 -afii10052;0403 -afii10053;0404 -afii10054;0405 -afii10055;0406 -afii10056;0407 -afii10057;0408 -afii10058;0409 -afii10059;040A -afii10060;040B -afii10061;040C -afii10062;040E -afii10063;F6C4 -afii10064;F6C5 -afii10065;0430 -afii10066;0431 -afii10067;0432 -afii10068;0433 -afii10069;0434 -afii10070;0435 -afii10071;0451 -afii10072;0436 -afii10073;0437 -afii10074;0438 -afii10075;0439 -afii10076;043A -afii10077;043B -afii10078;043C -afii10079;043D -afii10080;043E -afii10081;043F -afii10082;0440 -afii10083;0441 -afii10084;0442 -afii10085;0443 -afii10086;0444 -afii10087;0445 -afii10088;0446 -afii10089;0447 -afii10090;0448 -afii10091;0449 -afii10092;044A -afii10093;044B -afii10094;044C -afii10095;044D -afii10096;044E -afii10097;044F -afii10098;0491 -afii10099;0452 -afii10100;0453 -afii10101;0454 -afii10102;0455 -afii10103;0456 -afii10104;0457 -afii10105;0458 -afii10106;0459 -afii10107;045A -afii10108;045B -afii10109;045C -afii10110;045E -afii10145;040F -afii10146;0462 -afii10147;0472 -afii10148;0474 -afii10192;F6C6 -afii10193;045F -afii10194;0463 -afii10195;0473 -afii10196;0475 -afii10831;F6C7 -afii10832;F6C8 -afii10846;04D9 -afii299;200E -afii300;200F -afii301;200D -afii57381;066A -afii57388;060C -afii57392;0660 -afii57393;0661 -afii57394;0662 -afii57395;0663 -afii57396;0664 -afii57397;0665 -afii57398;0666 -afii57399;0667 -afii57400;0668 -afii57401;0669 -afii57403;061B -afii57407;061F -afii57409;0621 -afii57410;0622 -afii57411;0623 -afii57412;0624 -afii57413;0625 -afii57414;0626 -afii57415;0627 -afii57416;0628 -afii57417;0629 -afii57418;062A -afii57419;062B -afii57420;062C -afii57421;062D -afii57422;062E -afii57423;062F -afii57424;0630 -afii57425;0631 -afii57426;0632 -afii57427;0633 -afii57428;0634 -afii57429;0635 -afii57430;0636 -afii57431;0637 -afii57432;0638 -afii57433;0639 -afii57434;063A -afii57440;0640 -afii57441;0641 -afii57442;0642 -afii57443;0643 -afii57444;0644 -afii57445;0645 -afii57446;0646 -afii57448;0648 -afii57449;0649 -afii57450;064A -afii57451;064B -afii57452;064C -afii57453;064D -afii57454;064E -afii57455;064F -afii57456;0650 -afii57457;0651 -afii57458;0652 -afii57470;0647 -afii57505;06A4 -afii57506;067E -afii57507;0686 -afii57508;0698 -afii57509;06AF -afii57511;0679 -afii57512;0688 -afii57513;0691 -afii57514;06BA -afii57519;06D2 -afii57534;06D5 -afii57636;20AA -afii57645;05BE -afii57658;05C3 -afii57664;05D0 -afii57665;05D1 -afii57666;05D2 -afii57667;05D3 -afii57668;05D4 -afii57669;05D5 -afii57670;05D6 -afii57671;05D7 -afii57672;05D8 -afii57673;05D9 -afii57674;05DA -afii57675;05DB -afii57676;05DC -afii57677;05DD -afii57678;05DE -afii57679;05DF -afii57680;05E0 -afii57681;05E1 -afii57682;05E2 -afii57683;05E3 -afii57684;05E4 -afii57685;05E5 -afii57686;05E6 -afii57687;05E7 -afii57688;05E8 -afii57689;05E9 -afii57690;05EA -afii57694;FB2A -afii57695;FB2B -afii57700;FB4B -afii57705;FB1F -afii57716;05F0 -afii57717;05F1 -afii57718;05F2 -afii57723;FB35 -afii57793;05B4 -afii57794;05B5 -afii57795;05B6 -afii57796;05BB -afii57797;05B8 -afii57798;05B7 -afii57799;05B0 -afii57800;05B2 -afii57801;05B1 -afii57802;05B3 -afii57803;05C2 -afii57804;05C1 -afii57806;05B9 -afii57807;05BC -afii57839;05BD -afii57841;05BF -afii57842;05C0 -afii57929;02BC -afii61248;2105 -afii61289;2113 -afii61352;2116 -afii61573;202C -afii61574;202D -afii61575;202E -afii61664;200C -afii63167;066D -afii64937;02BD -agrave;00E0 -agujarati;0A85 -agurmukhi;0A05 -ahiragana;3042 -ahookabove;1EA3 -aibengali;0990 -aibopomofo;311E -aideva;0910 -aiecyrillic;04D5 -aigujarati;0A90 -aigurmukhi;0A10 -aimatragurmukhi;0A48 -ainarabic;0639 -ainfinalarabic;FECA -aininitialarabic;FECB -ainmedialarabic;FECC -ainvertedbreve;0203 -aivowelsignbengali;09C8 -aivowelsigndeva;0948 -aivowelsigngujarati;0AC8 -akatakana;30A2 -akatakanahalfwidth;FF71 -akorean;314F -alef;05D0 -alefarabic;0627 -alefdageshhebrew;FB30 -aleffinalarabic;FE8E -alefhamzaabovearabic;0623 -alefhamzaabovefinalarabic;FE84 -alefhamzabelowarabic;0625 -alefhamzabelowfinalarabic;FE88 -alefhebrew;05D0 -aleflamedhebrew;FB4F -alefmaddaabovearabic;0622 -alefmaddaabovefinalarabic;FE82 -alefmaksuraarabic;0649 -alefmaksurafinalarabic;FEF0 -alefmaksurainitialarabic;FEF3 -alefmaksuramedialarabic;FEF4 -alefpatahhebrew;FB2E -alefqamatshebrew;FB2F -aleph;2135 -allequal;224C -alpha;03B1 -alphatonos;03AC -amacron;0101 -amonospace;FF41 -ampersand;0026 -ampersandmonospace;FF06 -ampersandsmall;F726 -amsquare;33C2 -anbopomofo;3122 -angbopomofo;3124 -angkhankhuthai;0E5A -angle;2220 -anglebracketleft;3008 -anglebracketleftvertical;FE3F -anglebracketright;3009 -anglebracketrightvertical;FE40 -angleleft;2329 -angleright;232A -angstrom;212B -anoteleia;0387 -anudattadeva;0952 -anusvarabengali;0982 -anusvaradeva;0902 -anusvaragujarati;0A82 -aogonek;0105 -apaatosquare;3300 -aparen;249C -apostrophearmenian;055A -apostrophemod;02BC -apple;F8FF -approaches;2250 -approxequal;2248 -approxequalorimage;2252 -approximatelyequal;2245 -araeaekorean;318E -araeakorean;318D -arc;2312 -arighthalfring;1E9A -aring;00E5 -aringacute;01FB -aringbelow;1E01 -arrowboth;2194 -arrowdashdown;21E3 -arrowdashleft;21E0 -arrowdashright;21E2 -arrowdashup;21E1 -arrowdblboth;21D4 -arrowdbldown;21D3 -arrowdblleft;21D0 -arrowdblright;21D2 -arrowdblup;21D1 -arrowdown;2193 -arrowdownleft;2199 -arrowdownright;2198 -arrowdownwhite;21E9 -arrowheaddownmod;02C5 -arrowheadleftmod;02C2 -arrowheadrightmod;02C3 -arrowheadupmod;02C4 -arrowhorizex;F8E7 -arrowleft;2190 -arrowleftdbl;21D0 -arrowleftdblstroke;21CD -arrowleftoverright;21C6 -arrowleftwhite;21E6 -arrowright;2192 -arrowrightdblstroke;21CF -arrowrightheavy;279E -arrowrightoverleft;21C4 -arrowrightwhite;21E8 -arrowtableft;21E4 -arrowtabright;21E5 -arrowup;2191 -arrowupdn;2195 -arrowupdnbse;21A8 -arrowupdownbase;21A8 -arrowupleft;2196 -arrowupleftofdown;21C5 -arrowupright;2197 -arrowupwhite;21E7 -arrowvertex;F8E6 -asciicircum;005E -asciicircummonospace;FF3E -asciitilde;007E -asciitildemonospace;FF5E -ascript;0251 -ascriptturned;0252 -asmallhiragana;3041 -asmallkatakana;30A1 -asmallkatakanahalfwidth;FF67 -asterisk;002A -asteriskaltonearabic;066D -asteriskarabic;066D -asteriskmath;2217 -asteriskmonospace;FF0A -asterisksmall;FE61 -asterism;2042 -asuperior;F6E9 -asymptoticallyequal;2243 -at;0040 -atilde;00E3 -atmonospace;FF20 -atsmall;FE6B -aturned;0250 -aubengali;0994 -aubopomofo;3120 -audeva;0914 -augujarati;0A94 -augurmukhi;0A14 -aulengthmarkbengali;09D7 -aumatragurmukhi;0A4C -auvowelsignbengali;09CC -auvowelsigndeva;094C -auvowelsigngujarati;0ACC -avagrahadeva;093D -aybarmenian;0561 -ayin;05E2 -ayinaltonehebrew;FB20 -ayinhebrew;05E2 -b;0062 -babengali;09AC -backslash;005C -backslashmonospace;FF3C -badeva;092C -bagujarati;0AAC -bagurmukhi;0A2C -bahiragana;3070 -bahtthai;0E3F -bakatakana;30D0 -bar;007C -barmonospace;FF5C -bbopomofo;3105 -bcircle;24D1 -bdotaccent;1E03 -bdotbelow;1E05 -beamedsixteenthnotes;266C -because;2235 -becyrillic;0431 -beharabic;0628 -behfinalarabic;FE90 -behinitialarabic;FE91 -behiragana;3079 -behmedialarabic;FE92 -behmeeminitialarabic;FC9F -behmeemisolatedarabic;FC08 -behnoonfinalarabic;FC6D -bekatakana;30D9 -benarmenian;0562 -bet;05D1 -beta;03B2 -betasymbolgreek;03D0 -betdagesh;FB31 -betdageshhebrew;FB31 -bethebrew;05D1 -betrafehebrew;FB4C -bhabengali;09AD -bhadeva;092D -bhagujarati;0AAD -bhagurmukhi;0A2D -bhook;0253 -bihiragana;3073 -bikatakana;30D3 -bilabialclick;0298 -bindigurmukhi;0A02 -birusquare;3331 -blackcircle;25CF -blackdiamond;25C6 -blackdownpointingtriangle;25BC -blackleftpointingpointer;25C4 -blackleftpointingtriangle;25C0 -blacklenticularbracketleft;3010 -blacklenticularbracketleftvertical;FE3B -blacklenticularbracketright;3011 -blacklenticularbracketrightvertical;FE3C -blacklowerlefttriangle;25E3 -blacklowerrighttriangle;25E2 -blackrectangle;25AC -blackrightpointingpointer;25BA -blackrightpointingtriangle;25B6 -blacksmallsquare;25AA -blacksmilingface;263B -blacksquare;25A0 -blackstar;2605 -blackupperlefttriangle;25E4 -blackupperrighttriangle;25E5 -blackuppointingsmalltriangle;25B4 -blackuppointingtriangle;25B2 -blank;2423 -blinebelow;1E07 -block;2588 -bmonospace;FF42 -bobaimaithai;0E1A -bohiragana;307C -bokatakana;30DC -bparen;249D -bqsquare;33C3 -braceex;F8F4 -braceleft;007B -braceleftbt;F8F3 -braceleftmid;F8F2 -braceleftmonospace;FF5B -braceleftsmall;FE5B -bracelefttp;F8F1 -braceleftvertical;FE37 -braceright;007D -bracerightbt;F8FE -bracerightmid;F8FD -bracerightmonospace;FF5D -bracerightsmall;FE5C -bracerighttp;F8FC -bracerightvertical;FE38 -bracketleft;005B -bracketleftbt;F8F0 -bracketleftex;F8EF -bracketleftmonospace;FF3B -bracketlefttp;F8EE -bracketright;005D -bracketrightbt;F8FB -bracketrightex;F8FA -bracketrightmonospace;FF3D -bracketrighttp;F8F9 -breve;02D8 -brevebelowcmb;032E -brevecmb;0306 -breveinvertedbelowcmb;032F -breveinvertedcmb;0311 -breveinverteddoublecmb;0361 -bridgebelowcmb;032A -bridgeinvertedbelowcmb;033A -brokenbar;00A6 -bstroke;0180 -bsuperior;F6EA -btopbar;0183 -buhiragana;3076 -bukatakana;30D6 -bullet;2022 -bulletinverse;25D8 -bulletoperator;2219 -bullseye;25CE -c;0063 -caarmenian;056E -cabengali;099A -cacute;0107 -cadeva;091A -cagujarati;0A9A -cagurmukhi;0A1A -calsquare;3388 -candrabindubengali;0981 -candrabinducmb;0310 -candrabindudeva;0901 -candrabindugujarati;0A81 -capslock;21EA -careof;2105 -caron;02C7 -caronbelowcmb;032C -caroncmb;030C -carriagereturn;21B5 -cbopomofo;3118 -ccaron;010D -ccedilla;00E7 -ccedillaacute;1E09 -ccircle;24D2 -ccircumflex;0109 -ccurl;0255 -cdot;010B -cdotaccent;010B -cdsquare;33C5 -cedilla;00B8 -cedillacmb;0327 -cent;00A2 -centigrade;2103 -centinferior;F6DF -centmonospace;FFE0 -centoldstyle;F7A2 -centsuperior;F6E0 -chaarmenian;0579 -chabengali;099B -chadeva;091B -chagujarati;0A9B -chagurmukhi;0A1B -chbopomofo;3114 -cheabkhasiancyrillic;04BD -checkmark;2713 -checyrillic;0447 -chedescenderabkhasiancyrillic;04BF -chedescendercyrillic;04B7 -chedieresiscyrillic;04F5 -cheharmenian;0573 -chekhakassiancyrillic;04CC -cheverticalstrokecyrillic;04B9 -chi;03C7 -chieuchacirclekorean;3277 -chieuchaparenkorean;3217 -chieuchcirclekorean;3269 -chieuchkorean;314A -chieuchparenkorean;3209 -chochangthai;0E0A -chochanthai;0E08 -chochingthai;0E09 -chochoethai;0E0C -chook;0188 -cieucacirclekorean;3276 -cieucaparenkorean;3216 -cieuccirclekorean;3268 -cieuckorean;3148 -cieucparenkorean;3208 -cieucuparenkorean;321C -circle;25CB -circlemultiply;2297 -circleot;2299 -circleplus;2295 -circlepostalmark;3036 -circlewithlefthalfblack;25D0 -circlewithrighthalfblack;25D1 -circumflex;02C6 -circumflexbelowcmb;032D -circumflexcmb;0302 -clear;2327 -clickalveolar;01C2 -clickdental;01C0 -clicklateral;01C1 -clickretroflex;01C3 -club;2663 -clubsuitblack;2663 -clubsuitwhite;2667 -cmcubedsquare;33A4 -cmonospace;FF43 -cmsquaredsquare;33A0 -coarmenian;0581 -colon;003A -colonmonetary;20A1 -colonmonospace;FF1A -colonsign;20A1 -colonsmall;FE55 -colontriangularhalfmod;02D1 -colontriangularmod;02D0 -comma;002C -commaabovecmb;0313 -commaaboverightcmb;0315 -commaaccent;F6C3 -commaarabic;060C -commaarmenian;055D -commainferior;F6E1 -commamonospace;FF0C -commareversedabovecmb;0314 -commareversedmod;02BD -commasmall;FE50 -commasuperior;F6E2 -commaturnedabovecmb;0312 -commaturnedmod;02BB -compass;263C -congruent;2245 -contourintegral;222E -control;2303 -controlACK;0006 -controlBEL;0007 -controlBS;0008 -controlCAN;0018 -controlCR;000D -controlDC1;0011 -controlDC2;0012 -controlDC3;0013 -controlDC4;0014 -controlDEL;007F -controlDLE;0010 -controlEM;0019 -controlENQ;0005 -controlEOT;0004 -controlESC;001B -controlETB;0017 -controlETX;0003 -controlFF;000C -controlFS;001C -controlGS;001D -controlHT;0009 -controlLF;000A -controlNAK;0015 -controlRS;001E -controlSI;000F -controlSO;000E -controlSOT;0002 -controlSTX;0001 -controlSUB;001A -controlSYN;0016 -controlUS;001F -controlVT;000B -copyright;00A9 -copyrightsans;F8E9 -copyrightserif;F6D9 -cornerbracketleft;300C -cornerbracketlefthalfwidth;FF62 -cornerbracketleftvertical;FE41 -cornerbracketright;300D -cornerbracketrighthalfwidth;FF63 -cornerbracketrightvertical;FE42 -corporationsquare;337F -cosquare;33C7 -coverkgsquare;33C6 -cparen;249E -cruzeiro;20A2 -cstretched;0297 -curlyand;22CF -curlyor;22CE -currency;00A4 -cyrBreve;F6D1 -cyrFlex;F6D2 -cyrbreve;F6D4 -cyrflex;F6D5 -d;0064 -daarmenian;0564 -dabengali;09A6 -dadarabic;0636 -dadeva;0926 -dadfinalarabic;FEBE -dadinitialarabic;FEBF -dadmedialarabic;FEC0 -dagesh;05BC -dageshhebrew;05BC -dagger;2020 -daggerdbl;2021 -dagujarati;0AA6 -dagurmukhi;0A26 -dahiragana;3060 -dakatakana;30C0 -dalarabic;062F -dalet;05D3 -daletdagesh;FB33 -daletdageshhebrew;FB33 -dalethatafpatah;05D3 05B2 -dalethatafpatahhebrew;05D3 05B2 -dalethatafsegol;05D3 05B1 -dalethatafsegolhebrew;05D3 05B1 -dalethebrew;05D3 -dalethiriq;05D3 05B4 -dalethiriqhebrew;05D3 05B4 -daletholam;05D3 05B9 -daletholamhebrew;05D3 05B9 -daletpatah;05D3 05B7 -daletpatahhebrew;05D3 05B7 -daletqamats;05D3 05B8 -daletqamatshebrew;05D3 05B8 -daletqubuts;05D3 05BB -daletqubutshebrew;05D3 05BB -daletsegol;05D3 05B6 -daletsegolhebrew;05D3 05B6 -daletsheva;05D3 05B0 -daletshevahebrew;05D3 05B0 -dalettsere;05D3 05B5 -dalettserehebrew;05D3 05B5 -dalfinalarabic;FEAA -dammaarabic;064F -dammalowarabic;064F -dammatanaltonearabic;064C -dammatanarabic;064C -danda;0964 -dargahebrew;05A7 -dargalefthebrew;05A7 -dasiapneumatacyrilliccmb;0485 -dblGrave;F6D3 -dblanglebracketleft;300A -dblanglebracketleftvertical;FE3D -dblanglebracketright;300B -dblanglebracketrightvertical;FE3E -dblarchinvertedbelowcmb;032B -dblarrowleft;21D4 -dblarrowright;21D2 -dbldanda;0965 -dblgrave;F6D6 -dblgravecmb;030F -dblintegral;222C -dbllowline;2017 -dbllowlinecmb;0333 -dbloverlinecmb;033F -dblprimemod;02BA -dblverticalbar;2016 -dblverticallineabovecmb;030E -dbopomofo;3109 -dbsquare;33C8 -dcaron;010F -dcedilla;1E11 -dcircle;24D3 -dcircumflexbelow;1E13 -dcroat;0111 -ddabengali;09A1 -ddadeva;0921 -ddagujarati;0AA1 -ddagurmukhi;0A21 -ddalarabic;0688 -ddalfinalarabic;FB89 -dddhadeva;095C -ddhabengali;09A2 -ddhadeva;0922 -ddhagujarati;0AA2 -ddhagurmukhi;0A22 -ddotaccent;1E0B -ddotbelow;1E0D -decimalseparatorarabic;066B -decimalseparatorpersian;066B -decyrillic;0434 -degree;00B0 -dehihebrew;05AD -dehiragana;3067 -deicoptic;03EF -dekatakana;30C7 -deleteleft;232B -deleteright;2326 -delta;03B4 -deltaturned;018D -denominatorminusonenumeratorbengali;09F8 -dezh;02A4 -dhabengali;09A7 -dhadeva;0927 -dhagujarati;0AA7 -dhagurmukhi;0A27 -dhook;0257 -dialytikatonos;0385 -dialytikatonoscmb;0344 -diamond;2666 -diamondsuitwhite;2662 -dieresis;00A8 -dieresisacute;F6D7 -dieresisbelowcmb;0324 -dieresiscmb;0308 -dieresisgrave;F6D8 -dieresistonos;0385 -dihiragana;3062 -dikatakana;30C2 -dittomark;3003 -divide;00F7 -divides;2223 -divisionslash;2215 -djecyrillic;0452 -dkshade;2593 -dlinebelow;1E0F -dlsquare;3397 -dmacron;0111 -dmonospace;FF44 -dnblock;2584 -dochadathai;0E0E -dodekthai;0E14 -dohiragana;3069 -dokatakana;30C9 -dollar;0024 -dollarinferior;F6E3 -dollarmonospace;FF04 -dollaroldstyle;F724 -dollarsmall;FE69 -dollarsuperior;F6E4 -dong;20AB -dorusquare;3326 -dotaccent;02D9 -dotaccentcmb;0307 -dotbelowcmb;0323 -dotbelowcomb;0323 -dotkatakana;30FB -dotlessi;0131 -dotlessj;F6BE -dotlessjstrokehook;0284 -dotmath;22C5 -dottedcircle;25CC -doubleyodpatah;FB1F -doubleyodpatahhebrew;FB1F -downtackbelowcmb;031E -downtackmod;02D5 -dparen;249F -dsuperior;F6EB -dtail;0256 -dtopbar;018C -duhiragana;3065 -dukatakana;30C5 -dz;01F3 -dzaltone;02A3 -dzcaron;01C6 -dzcurl;02A5 -dzeabkhasiancyrillic;04E1 -dzecyrillic;0455 -dzhecyrillic;045F -e;0065 -eacute;00E9 -earth;2641 -ebengali;098F -ebopomofo;311C -ebreve;0115 -ecandradeva;090D -ecandragujarati;0A8D -ecandravowelsigndeva;0945 -ecandravowelsigngujarati;0AC5 -ecaron;011B -ecedillabreve;1E1D -echarmenian;0565 -echyiwnarmenian;0587 -ecircle;24D4 -ecircumflex;00EA -ecircumflexacute;1EBF -ecircumflexbelow;1E19 -ecircumflexdotbelow;1EC7 -ecircumflexgrave;1EC1 -ecircumflexhookabove;1EC3 -ecircumflextilde;1EC5 -ecyrillic;0454 -edblgrave;0205 -edeva;090F -edieresis;00EB -edot;0117 -edotaccent;0117 -edotbelow;1EB9 -eegurmukhi;0A0F -eematragurmukhi;0A47 -efcyrillic;0444 -egrave;00E8 -egujarati;0A8F -eharmenian;0567 -ehbopomofo;311D -ehiragana;3048 -ehookabove;1EBB -eibopomofo;311F -eight;0038 -eightarabic;0668 -eightbengali;09EE -eightcircle;2467 -eightcircleinversesansserif;2791 -eightdeva;096E -eighteencircle;2471 -eighteenparen;2485 -eighteenperiod;2499 -eightgujarati;0AEE -eightgurmukhi;0A6E -eighthackarabic;0668 -eighthangzhou;3028 -eighthnotebeamed;266B -eightideographicparen;3227 -eightinferior;2088 -eightmonospace;FF18 -eightoldstyle;F738 -eightparen;247B -eightperiod;248F -eightpersian;06F8 -eightroman;2177 -eightsuperior;2078 -eightthai;0E58 -einvertedbreve;0207 -eiotifiedcyrillic;0465 -ekatakana;30A8 -ekatakanahalfwidth;FF74 -ekonkargurmukhi;0A74 -ekorean;3154 -elcyrillic;043B -element;2208 -elevencircle;246A -elevenparen;247E -elevenperiod;2492 -elevenroman;217A -ellipsis;2026 -ellipsisvertical;22EE -emacron;0113 -emacronacute;1E17 -emacrongrave;1E15 -emcyrillic;043C -emdash;2014 -emdashvertical;FE31 -emonospace;FF45 -emphasismarkarmenian;055B -emptyset;2205 -enbopomofo;3123 -encyrillic;043D -endash;2013 -endashvertical;FE32 -endescendercyrillic;04A3 -eng;014B -engbopomofo;3125 -enghecyrillic;04A5 -enhookcyrillic;04C8 -enspace;2002 -eogonek;0119 -eokorean;3153 -eopen;025B -eopenclosed;029A -eopenreversed;025C -eopenreversedclosed;025E -eopenreversedhook;025D -eparen;24A0 -epsilon;03B5 -epsilontonos;03AD -equal;003D -equalmonospace;FF1D -equalsmall;FE66 -equalsuperior;207C -equivalence;2261 -erbopomofo;3126 -ercyrillic;0440 -ereversed;0258 -ereversedcyrillic;044D -escyrillic;0441 -esdescendercyrillic;04AB -esh;0283 -eshcurl;0286 -eshortdeva;090E -eshortvowelsigndeva;0946 -eshreversedloop;01AA -eshsquatreversed;0285 -esmallhiragana;3047 -esmallkatakana;30A7 -esmallkatakanahalfwidth;FF6A -estimated;212E -esuperior;F6EC -eta;03B7 -etarmenian;0568 -etatonos;03AE -eth;00F0 -etilde;1EBD -etildebelow;1E1B -etnahtafoukhhebrew;0591 -etnahtafoukhlefthebrew;0591 -etnahtahebrew;0591 -etnahtalefthebrew;0591 -eturned;01DD -eukorean;3161 -euro;20AC -evowelsignbengali;09C7 -evowelsigndeva;0947 -evowelsigngujarati;0AC7 -exclam;0021 -exclamarmenian;055C -exclamdbl;203C -exclamdown;00A1 -exclamdownsmall;F7A1 -exclammonospace;FF01 -exclamsmall;F721 -existential;2203 -ezh;0292 -ezhcaron;01EF -ezhcurl;0293 -ezhreversed;01B9 -ezhtail;01BA -f;0066 -fadeva;095E -fagurmukhi;0A5E -fahrenheit;2109 -fathaarabic;064E -fathalowarabic;064E -fathatanarabic;064B -fbopomofo;3108 -fcircle;24D5 -fdotaccent;1E1F -feharabic;0641 -feharmenian;0586 -fehfinalarabic;FED2 -fehinitialarabic;FED3 -fehmedialarabic;FED4 -feicoptic;03E5 -female;2640 -ff;FB00 -ffi;FB03 -ffl;FB04 -fi;FB01 -fifteencircle;246E -fifteenparen;2482 -fifteenperiod;2496 -figuredash;2012 -filledbox;25A0 -filledrect;25AC -finalkaf;05DA -finalkafdagesh;FB3A -finalkafdageshhebrew;FB3A -finalkafhebrew;05DA -finalkafqamats;05DA 05B8 -finalkafqamatshebrew;05DA 05B8 -finalkafsheva;05DA 05B0 -finalkafshevahebrew;05DA 05B0 -finalmem;05DD -finalmemhebrew;05DD -finalnun;05DF -finalnunhebrew;05DF -finalpe;05E3 -finalpehebrew;05E3 -finaltsadi;05E5 -finaltsadihebrew;05E5 -firsttonechinese;02C9 -fisheye;25C9 -fitacyrillic;0473 -five;0035 -fivearabic;0665 -fivebengali;09EB -fivecircle;2464 -fivecircleinversesansserif;278E -fivedeva;096B -fiveeighths;215D -fivegujarati;0AEB -fivegurmukhi;0A6B -fivehackarabic;0665 -fivehangzhou;3025 -fiveideographicparen;3224 -fiveinferior;2085 -fivemonospace;FF15 -fiveoldstyle;F735 -fiveparen;2478 -fiveperiod;248C -fivepersian;06F5 -fiveroman;2174 -fivesuperior;2075 -fivethai;0E55 -fl;FB02 -florin;0192 -fmonospace;FF46 -fmsquare;3399 -fofanthai;0E1F -fofathai;0E1D -fongmanthai;0E4F -forall;2200 -four;0034 -fourarabic;0664 -fourbengali;09EA -fourcircle;2463 -fourcircleinversesansserif;278D -fourdeva;096A -fourgujarati;0AEA -fourgurmukhi;0A6A -fourhackarabic;0664 -fourhangzhou;3024 -fourideographicparen;3223 -fourinferior;2084 -fourmonospace;FF14 -fournumeratorbengali;09F7 -fouroldstyle;F734 -fourparen;2477 -fourperiod;248B -fourpersian;06F4 -fourroman;2173 -foursuperior;2074 -fourteencircle;246D -fourteenparen;2481 -fourteenperiod;2495 -fourthai;0E54 -fourthtonechinese;02CB -fparen;24A1 -fraction;2044 -franc;20A3 -g;0067 -gabengali;0997 -gacute;01F5 -gadeva;0917 -gafarabic;06AF -gaffinalarabic;FB93 -gafinitialarabic;FB94 -gafmedialarabic;FB95 -gagujarati;0A97 -gagurmukhi;0A17 -gahiragana;304C -gakatakana;30AC -gamma;03B3 -gammalatinsmall;0263 -gammasuperior;02E0 -gangiacoptic;03EB -gbopomofo;310D -gbreve;011F -gcaron;01E7 -gcedilla;0123 -gcircle;24D6 -gcircumflex;011D -gcommaaccent;0123 -gdot;0121 -gdotaccent;0121 -gecyrillic;0433 -gehiragana;3052 -gekatakana;30B2 -geometricallyequal;2251 -gereshaccenthebrew;059C -gereshhebrew;05F3 -gereshmuqdamhebrew;059D -germandbls;00DF -gershayimaccenthebrew;059E -gershayimhebrew;05F4 -getamark;3013 -ghabengali;0998 -ghadarmenian;0572 -ghadeva;0918 -ghagujarati;0A98 -ghagurmukhi;0A18 -ghainarabic;063A -ghainfinalarabic;FECE -ghaininitialarabic;FECF -ghainmedialarabic;FED0 -ghemiddlehookcyrillic;0495 -ghestrokecyrillic;0493 -gheupturncyrillic;0491 -ghhadeva;095A -ghhagurmukhi;0A5A -ghook;0260 -ghzsquare;3393 -gihiragana;304E -gikatakana;30AE -gimarmenian;0563 -gimel;05D2 -gimeldagesh;FB32 -gimeldageshhebrew;FB32 -gimelhebrew;05D2 -gjecyrillic;0453 -glottalinvertedstroke;01BE -glottalstop;0294 -glottalstopinverted;0296 -glottalstopmod;02C0 -glottalstopreversed;0295 -glottalstopreversedmod;02C1 -glottalstopreversedsuperior;02E4 -glottalstopstroke;02A1 -glottalstopstrokereversed;02A2 -gmacron;1E21 -gmonospace;FF47 -gohiragana;3054 -gokatakana;30B4 -gparen;24A2 -gpasquare;33AC -gradient;2207 -grave;0060 -gravebelowcmb;0316 -gravecmb;0300 -gravecomb;0300 -gravedeva;0953 -gravelowmod;02CE -gravemonospace;FF40 -gravetonecmb;0340 -greater;003E -greaterequal;2265 -greaterequalorless;22DB -greatermonospace;FF1E -greaterorequivalent;2273 -greaterorless;2277 -greateroverequal;2267 -greatersmall;FE65 -gscript;0261 -gstroke;01E5 -guhiragana;3050 -guillemotleft;00AB -guillemotright;00BB -guilsinglleft;2039 -guilsinglright;203A -gukatakana;30B0 -guramusquare;3318 -gysquare;33C9 -h;0068 -haabkhasiancyrillic;04A9 -haaltonearabic;06C1 -habengali;09B9 -hadescendercyrillic;04B3 -hadeva;0939 -hagujarati;0AB9 -hagurmukhi;0A39 -haharabic;062D -hahfinalarabic;FEA2 -hahinitialarabic;FEA3 -hahiragana;306F -hahmedialarabic;FEA4 -haitusquare;332A -hakatakana;30CF -hakatakanahalfwidth;FF8A -halantgurmukhi;0A4D -hamzaarabic;0621 -hamzadammaarabic;0621 064F -hamzadammatanarabic;0621 064C -hamzafathaarabic;0621 064E -hamzafathatanarabic;0621 064B -hamzalowarabic;0621 -hamzalowkasraarabic;0621 0650 -hamzalowkasratanarabic;0621 064D -hamzasukunarabic;0621 0652 -hangulfiller;3164 -hardsigncyrillic;044A -harpoonleftbarbup;21BC -harpoonrightbarbup;21C0 -hasquare;33CA -hatafpatah;05B2 -hatafpatah16;05B2 -hatafpatah23;05B2 -hatafpatah2f;05B2 -hatafpatahhebrew;05B2 -hatafpatahnarrowhebrew;05B2 -hatafpatahquarterhebrew;05B2 -hatafpatahwidehebrew;05B2 -hatafqamats;05B3 -hatafqamats1b;05B3 -hatafqamats28;05B3 -hatafqamats34;05B3 -hatafqamatshebrew;05B3 -hatafqamatsnarrowhebrew;05B3 -hatafqamatsquarterhebrew;05B3 -hatafqamatswidehebrew;05B3 -hatafsegol;05B1 -hatafsegol17;05B1 -hatafsegol24;05B1 -hatafsegol30;05B1 -hatafsegolhebrew;05B1 -hatafsegolnarrowhebrew;05B1 -hatafsegolquarterhebrew;05B1 -hatafsegolwidehebrew;05B1 -hbar;0127 -hbopomofo;310F -hbrevebelow;1E2B -hcedilla;1E29 -hcircle;24D7 -hcircumflex;0125 -hdieresis;1E27 -hdotaccent;1E23 -hdotbelow;1E25 -he;05D4 -heart;2665 -heartsuitblack;2665 -heartsuitwhite;2661 -hedagesh;FB34 -hedageshhebrew;FB34 -hehaltonearabic;06C1 -heharabic;0647 -hehebrew;05D4 -hehfinalaltonearabic;FBA7 -hehfinalalttwoarabic;FEEA -hehfinalarabic;FEEA -hehhamzaabovefinalarabic;FBA5 -hehhamzaaboveisolatedarabic;FBA4 -hehinitialaltonearabic;FBA8 -hehinitialarabic;FEEB -hehiragana;3078 -hehmedialaltonearabic;FBA9 -hehmedialarabic;FEEC -heiseierasquare;337B -hekatakana;30D8 -hekatakanahalfwidth;FF8D -hekutaarusquare;3336 -henghook;0267 -herutusquare;3339 -het;05D7 -hethebrew;05D7 -hhook;0266 -hhooksuperior;02B1 -hieuhacirclekorean;327B -hieuhaparenkorean;321B -hieuhcirclekorean;326D -hieuhkorean;314E -hieuhparenkorean;320D -hihiragana;3072 -hikatakana;30D2 -hikatakanahalfwidth;FF8B -hiriq;05B4 -hiriq14;05B4 -hiriq21;05B4 -hiriq2d;05B4 -hiriqhebrew;05B4 -hiriqnarrowhebrew;05B4 -hiriqquarterhebrew;05B4 -hiriqwidehebrew;05B4 -hlinebelow;1E96 -hmonospace;FF48 -hoarmenian;0570 -hohipthai;0E2B -hohiragana;307B -hokatakana;30DB -hokatakanahalfwidth;FF8E -holam;05B9 -holam19;05B9 -holam26;05B9 -holam32;05B9 -holamhebrew;05B9 -holamnarrowhebrew;05B9 -holamquarterhebrew;05B9 -holamwidehebrew;05B9 -honokhukthai;0E2E -hookabovecomb;0309 -hookcmb;0309 -hookpalatalizedbelowcmb;0321 -hookretroflexbelowcmb;0322 -hoonsquare;3342 -horicoptic;03E9 -horizontalbar;2015 -horncmb;031B -hotsprings;2668 -house;2302 -hparen;24A3 -hsuperior;02B0 -hturned;0265 -huhiragana;3075 -huiitosquare;3333 -hukatakana;30D5 -hukatakanahalfwidth;FF8C -hungarumlaut;02DD -hungarumlautcmb;030B -hv;0195 -hyphen;002D -hypheninferior;F6E5 -hyphenmonospace;FF0D -hyphensmall;FE63 -hyphensuperior;F6E6 -hyphentwo;2010 -i;0069 -iacute;00ED -iacyrillic;044F -ibengali;0987 -ibopomofo;3127 -ibreve;012D -icaron;01D0 -icircle;24D8 -icircumflex;00EE -icyrillic;0456 -idblgrave;0209 -ideographearthcircle;328F -ideographfirecircle;328B -ideographicallianceparen;323F -ideographiccallparen;323A -ideographiccentrecircle;32A5 -ideographicclose;3006 -ideographiccomma;3001 -ideographiccommaleft;FF64 -ideographiccongratulationparen;3237 -ideographiccorrectcircle;32A3 -ideographicearthparen;322F -ideographicenterpriseparen;323D -ideographicexcellentcircle;329D -ideographicfestivalparen;3240 -ideographicfinancialcircle;3296 -ideographicfinancialparen;3236 -ideographicfireparen;322B -ideographichaveparen;3232 -ideographichighcircle;32A4 -ideographiciterationmark;3005 -ideographiclaborcircle;3298 -ideographiclaborparen;3238 -ideographicleftcircle;32A7 -ideographiclowcircle;32A6 -ideographicmedicinecircle;32A9 -ideographicmetalparen;322E -ideographicmoonparen;322A -ideographicnameparen;3234 -ideographicperiod;3002 -ideographicprintcircle;329E -ideographicreachparen;3243 -ideographicrepresentparen;3239 -ideographicresourceparen;323E -ideographicrightcircle;32A8 -ideographicsecretcircle;3299 -ideographicselfparen;3242 -ideographicsocietyparen;3233 -ideographicspace;3000 -ideographicspecialparen;3235 -ideographicstockparen;3231 -ideographicstudyparen;323B -ideographicsunparen;3230 -ideographicsuperviseparen;323C -ideographicwaterparen;322C -ideographicwoodparen;322D -ideographiczero;3007 -ideographmetalcircle;328E -ideographmooncircle;328A -ideographnamecircle;3294 -ideographsuncircle;3290 -ideographwatercircle;328C -ideographwoodcircle;328D -ideva;0907 -idieresis;00EF -idieresisacute;1E2F -idieresiscyrillic;04E5 -idotbelow;1ECB -iebrevecyrillic;04D7 -iecyrillic;0435 -ieungacirclekorean;3275 -ieungaparenkorean;3215 -ieungcirclekorean;3267 -ieungkorean;3147 -ieungparenkorean;3207 -igrave;00EC -igujarati;0A87 -igurmukhi;0A07 -ihiragana;3044 -ihookabove;1EC9 -iibengali;0988 -iicyrillic;0438 -iideva;0908 -iigujarati;0A88 -iigurmukhi;0A08 -iimatragurmukhi;0A40 -iinvertedbreve;020B -iishortcyrillic;0439 -iivowelsignbengali;09C0 -iivowelsigndeva;0940 -iivowelsigngujarati;0AC0 -ij;0133 -ikatakana;30A4 -ikatakanahalfwidth;FF72 -ikorean;3163 -ilde;02DC -iluyhebrew;05AC -imacron;012B -imacroncyrillic;04E3 -imageorapproximatelyequal;2253 -imatragurmukhi;0A3F -imonospace;FF49 -increment;2206 -infinity;221E -iniarmenian;056B -integral;222B -integralbottom;2321 -integralbt;2321 -integralex;F8F5 -integraltop;2320 -integraltp;2320 -intersection;2229 -intisquare;3305 -invbullet;25D8 -invcircle;25D9 -invsmileface;263B -iocyrillic;0451 -iogonek;012F -iota;03B9 -iotadieresis;03CA -iotadieresistonos;0390 -iotalatin;0269 -iotatonos;03AF -iparen;24A4 -irigurmukhi;0A72 -ismallhiragana;3043 -ismallkatakana;30A3 -ismallkatakanahalfwidth;FF68 -issharbengali;09FA -istroke;0268 -isuperior;F6ED -iterationhiragana;309D -iterationkatakana;30FD -itilde;0129 -itildebelow;1E2D -iubopomofo;3129 -iucyrillic;044E -ivowelsignbengali;09BF -ivowelsigndeva;093F -ivowelsigngujarati;0ABF -izhitsacyrillic;0475 -izhitsadblgravecyrillic;0477 -j;006A -jaarmenian;0571 -jabengali;099C -jadeva;091C -jagujarati;0A9C -jagurmukhi;0A1C -jbopomofo;3110 -jcaron;01F0 -jcircle;24D9 -jcircumflex;0135 -jcrossedtail;029D -jdotlessstroke;025F -jecyrillic;0458 -jeemarabic;062C -jeemfinalarabic;FE9E -jeeminitialarabic;FE9F -jeemmedialarabic;FEA0 -jeharabic;0698 -jehfinalarabic;FB8B -jhabengali;099D -jhadeva;091D -jhagujarati;0A9D -jhagurmukhi;0A1D -jheharmenian;057B -jis;3004 -jmonospace;FF4A -jparen;24A5 -jsuperior;02B2 -k;006B -kabashkircyrillic;04A1 -kabengali;0995 -kacute;1E31 -kacyrillic;043A -kadescendercyrillic;049B -kadeva;0915 -kaf;05DB -kafarabic;0643 -kafdagesh;FB3B -kafdageshhebrew;FB3B -kaffinalarabic;FEDA -kafhebrew;05DB -kafinitialarabic;FEDB -kafmedialarabic;FEDC -kafrafehebrew;FB4D -kagujarati;0A95 -kagurmukhi;0A15 -kahiragana;304B -kahookcyrillic;04C4 -kakatakana;30AB -kakatakanahalfwidth;FF76 -kappa;03BA -kappasymbolgreek;03F0 -kapyeounmieumkorean;3171 -kapyeounphieuphkorean;3184 -kapyeounpieupkorean;3178 -kapyeounssangpieupkorean;3179 -karoriisquare;330D -kashidaautoarabic;0640 -kashidaautonosidebearingarabic;0640 -kasmallkatakana;30F5 -kasquare;3384 -kasraarabic;0650 -kasratanarabic;064D -kastrokecyrillic;049F -katahiraprolongmarkhalfwidth;FF70 -kaverticalstrokecyrillic;049D -kbopomofo;310E -kcalsquare;3389 -kcaron;01E9 -kcedilla;0137 -kcircle;24DA -kcommaaccent;0137 -kdotbelow;1E33 -keharmenian;0584 -kehiragana;3051 -kekatakana;30B1 -kekatakanahalfwidth;FF79 -kenarmenian;056F -kesmallkatakana;30F6 -kgreenlandic;0138 -khabengali;0996 -khacyrillic;0445 -khadeva;0916 -khagujarati;0A96 -khagurmukhi;0A16 -khaharabic;062E -khahfinalarabic;FEA6 -khahinitialarabic;FEA7 -khahmedialarabic;FEA8 -kheicoptic;03E7 -khhadeva;0959 -khhagurmukhi;0A59 -khieukhacirclekorean;3278 -khieukhaparenkorean;3218 -khieukhcirclekorean;326A -khieukhkorean;314B -khieukhparenkorean;320A -khokhaithai;0E02 -khokhonthai;0E05 -khokhuatthai;0E03 -khokhwaithai;0E04 -khomutthai;0E5B -khook;0199 -khorakhangthai;0E06 -khzsquare;3391 -kihiragana;304D -kikatakana;30AD -kikatakanahalfwidth;FF77 -kiroguramusquare;3315 -kiromeetorusquare;3316 -kirosquare;3314 -kiyeokacirclekorean;326E -kiyeokaparenkorean;320E -kiyeokcirclekorean;3260 -kiyeokkorean;3131 -kiyeokparenkorean;3200 -kiyeoksioskorean;3133 -kjecyrillic;045C -klinebelow;1E35 -klsquare;3398 -kmcubedsquare;33A6 -kmonospace;FF4B -kmsquaredsquare;33A2 -kohiragana;3053 -kohmsquare;33C0 -kokaithai;0E01 -kokatakana;30B3 -kokatakanahalfwidth;FF7A -kooposquare;331E -koppacyrillic;0481 -koreanstandardsymbol;327F -koroniscmb;0343 -kparen;24A6 -kpasquare;33AA -ksicyrillic;046F -ktsquare;33CF -kturned;029E -kuhiragana;304F -kukatakana;30AF -kukatakanahalfwidth;FF78 -kvsquare;33B8 -kwsquare;33BE -l;006C -labengali;09B2 -lacute;013A -ladeva;0932 -lagujarati;0AB2 -lagurmukhi;0A32 -lakkhangyaothai;0E45 -lamaleffinalarabic;FEFC -lamalefhamzaabovefinalarabic;FEF8 -lamalefhamzaaboveisolatedarabic;FEF7 -lamalefhamzabelowfinalarabic;FEFA -lamalefhamzabelowisolatedarabic;FEF9 -lamalefisolatedarabic;FEFB -lamalefmaddaabovefinalarabic;FEF6 -lamalefmaddaaboveisolatedarabic;FEF5 -lamarabic;0644 -lambda;03BB -lambdastroke;019B -lamed;05DC -lameddagesh;FB3C -lameddageshhebrew;FB3C -lamedhebrew;05DC -lamedholam;05DC 05B9 -lamedholamdagesh;05DC 05B9 05BC -lamedholamdageshhebrew;05DC 05B9 05BC -lamedholamhebrew;05DC 05B9 -lamfinalarabic;FEDE -lamhahinitialarabic;FCCA -laminitialarabic;FEDF -lamjeeminitialarabic;FCC9 -lamkhahinitialarabic;FCCB -lamlamhehisolatedarabic;FDF2 -lammedialarabic;FEE0 -lammeemhahinitialarabic;FD88 -lammeeminitialarabic;FCCC -lammeemjeeminitialarabic;FEDF FEE4 FEA0 -lammeemkhahinitialarabic;FEDF FEE4 FEA8 -largecircle;25EF -lbar;019A -lbelt;026C -lbopomofo;310C -lcaron;013E -lcedilla;013C -lcircle;24DB -lcircumflexbelow;1E3D -lcommaaccent;013C -ldot;0140 -ldotaccent;0140 -ldotbelow;1E37 -ldotbelowmacron;1E39 -leftangleabovecmb;031A -lefttackbelowcmb;0318 -less;003C -lessequal;2264 -lessequalorgreater;22DA -lessmonospace;FF1C -lessorequivalent;2272 -lessorgreater;2276 -lessoverequal;2266 -lesssmall;FE64 -lezh;026E -lfblock;258C -lhookretroflex;026D -lira;20A4 -liwnarmenian;056C -lj;01C9 -ljecyrillic;0459 -ll;F6C0 -lladeva;0933 -llagujarati;0AB3 -llinebelow;1E3B -llladeva;0934 -llvocalicbengali;09E1 -llvocalicdeva;0961 -llvocalicvowelsignbengali;09E3 -llvocalicvowelsigndeva;0963 -lmiddletilde;026B -lmonospace;FF4C -lmsquare;33D0 -lochulathai;0E2C -logicaland;2227 -logicalnot;00AC -logicalnotreversed;2310 -logicalor;2228 -lolingthai;0E25 -longs;017F -lowlinecenterline;FE4E -lowlinecmb;0332 -lowlinedashed;FE4D -lozenge;25CA -lparen;24A7 -lslash;0142 -lsquare;2113 -lsuperior;F6EE -ltshade;2591 -luthai;0E26 -lvocalicbengali;098C -lvocalicdeva;090C -lvocalicvowelsignbengali;09E2 -lvocalicvowelsigndeva;0962 -lxsquare;33D3 -m;006D -mabengali;09AE -macron;00AF -macronbelowcmb;0331 -macroncmb;0304 -macronlowmod;02CD -macronmonospace;FFE3 -macute;1E3F -madeva;092E -magujarati;0AAE -magurmukhi;0A2E -mahapakhhebrew;05A4 -mahapakhlefthebrew;05A4 -mahiragana;307E -maichattawalowleftthai;F895 -maichattawalowrightthai;F894 -maichattawathai;0E4B -maichattawaupperleftthai;F893 -maieklowleftthai;F88C -maieklowrightthai;F88B -maiekthai;0E48 -maiekupperleftthai;F88A -maihanakatleftthai;F884 -maihanakatthai;0E31 -maitaikhuleftthai;F889 -maitaikhuthai;0E47 -maitholowleftthai;F88F -maitholowrightthai;F88E -maithothai;0E49 -maithoupperleftthai;F88D -maitrilowleftthai;F892 -maitrilowrightthai;F891 -maitrithai;0E4A -maitriupperleftthai;F890 -maiyamokthai;0E46 -makatakana;30DE -makatakanahalfwidth;FF8F -male;2642 -mansyonsquare;3347 -maqafhebrew;05BE -mars;2642 -masoracirclehebrew;05AF -masquare;3383 -mbopomofo;3107 -mbsquare;33D4 -mcircle;24DC -mcubedsquare;33A5 -mdotaccent;1E41 -mdotbelow;1E43 -meemarabic;0645 -meemfinalarabic;FEE2 -meeminitialarabic;FEE3 -meemmedialarabic;FEE4 -meemmeeminitialarabic;FCD1 -meemmeemisolatedarabic;FC48 -meetorusquare;334D -mehiragana;3081 -meizierasquare;337E -mekatakana;30E1 -mekatakanahalfwidth;FF92 -mem;05DE -memdagesh;FB3E -memdageshhebrew;FB3E -memhebrew;05DE -menarmenian;0574 -merkhahebrew;05A5 -merkhakefulahebrew;05A6 -merkhakefulalefthebrew;05A6 -merkhalefthebrew;05A5 -mhook;0271 -mhzsquare;3392 -middledotkatakanahalfwidth;FF65 -middot;00B7 -mieumacirclekorean;3272 -mieumaparenkorean;3212 -mieumcirclekorean;3264 -mieumkorean;3141 -mieumpansioskorean;3170 -mieumparenkorean;3204 -mieumpieupkorean;316E -mieumsioskorean;316F -mihiragana;307F -mikatakana;30DF -mikatakanahalfwidth;FF90 -minus;2212 -minusbelowcmb;0320 -minuscircle;2296 -minusmod;02D7 -minusplus;2213 -minute;2032 -miribaarusquare;334A -mirisquare;3349 -mlonglegturned;0270 -mlsquare;3396 -mmcubedsquare;33A3 -mmonospace;FF4D -mmsquaredsquare;339F -mohiragana;3082 -mohmsquare;33C1 -mokatakana;30E2 -mokatakanahalfwidth;FF93 -molsquare;33D6 -momathai;0E21 -moverssquare;33A7 -moverssquaredsquare;33A8 -mparen;24A8 -mpasquare;33AB -mssquare;33B3 -msuperior;F6EF -mturned;026F -mu;00B5 -mu1;00B5 -muasquare;3382 -muchgreater;226B -muchless;226A -mufsquare;338C -mugreek;03BC -mugsquare;338D -muhiragana;3080 -mukatakana;30E0 -mukatakanahalfwidth;FF91 -mulsquare;3395 -multiply;00D7 -mumsquare;339B -munahhebrew;05A3 -munahlefthebrew;05A3 -musicalnote;266A -musicalnotedbl;266B -musicflatsign;266D -musicsharpsign;266F -mussquare;33B2 -muvsquare;33B6 -muwsquare;33BC -mvmegasquare;33B9 -mvsquare;33B7 -mwmegasquare;33BF -mwsquare;33BD -n;006E -nabengali;09A8 -nabla;2207 -nacute;0144 -nadeva;0928 -nagujarati;0AA8 -nagurmukhi;0A28 -nahiragana;306A -nakatakana;30CA -nakatakanahalfwidth;FF85 -napostrophe;0149 -nasquare;3381 -nbopomofo;310B -nbspace;00A0 -ncaron;0148 -ncedilla;0146 -ncircle;24DD -ncircumflexbelow;1E4B -ncommaaccent;0146 -ndotaccent;1E45 -ndotbelow;1E47 -nehiragana;306D -nekatakana;30CD -nekatakanahalfwidth;FF88 -newsheqelsign;20AA -nfsquare;338B -ngabengali;0999 -ngadeva;0919 -ngagujarati;0A99 -ngagurmukhi;0A19 -ngonguthai;0E07 -nhiragana;3093 -nhookleft;0272 -nhookretroflex;0273 -nieunacirclekorean;326F -nieunaparenkorean;320F -nieuncieuckorean;3135 -nieuncirclekorean;3261 -nieunhieuhkorean;3136 -nieunkorean;3134 -nieunpansioskorean;3168 -nieunparenkorean;3201 -nieunsioskorean;3167 -nieuntikeutkorean;3166 -nihiragana;306B -nikatakana;30CB -nikatakanahalfwidth;FF86 -nikhahitleftthai;F899 -nikhahitthai;0E4D -nine;0039 -ninearabic;0669 -ninebengali;09EF -ninecircle;2468 -ninecircleinversesansserif;2792 -ninedeva;096F -ninegujarati;0AEF -ninegurmukhi;0A6F -ninehackarabic;0669 -ninehangzhou;3029 -nineideographicparen;3228 -nineinferior;2089 -ninemonospace;FF19 -nineoldstyle;F739 -nineparen;247C -nineperiod;2490 -ninepersian;06F9 -nineroman;2178 -ninesuperior;2079 -nineteencircle;2472 -nineteenparen;2486 -nineteenperiod;249A -ninethai;0E59 -nj;01CC -njecyrillic;045A -nkatakana;30F3 -nkatakanahalfwidth;FF9D -nlegrightlong;019E -nlinebelow;1E49 -nmonospace;FF4E -nmsquare;339A -nnabengali;09A3 -nnadeva;0923 -nnagujarati;0AA3 -nnagurmukhi;0A23 -nnnadeva;0929 -nohiragana;306E -nokatakana;30CE -nokatakanahalfwidth;FF89 -nonbreakingspace;00A0 -nonenthai;0E13 -nonuthai;0E19 -noonarabic;0646 -noonfinalarabic;FEE6 -noonghunnaarabic;06BA -noonghunnafinalarabic;FB9F -noonhehinitialarabic;FEE7 FEEC -nooninitialarabic;FEE7 -noonjeeminitialarabic;FCD2 -noonjeemisolatedarabic;FC4B -noonmedialarabic;FEE8 -noonmeeminitialarabic;FCD5 -noonmeemisolatedarabic;FC4E -noonnoonfinalarabic;FC8D -notcontains;220C -notelement;2209 -notelementof;2209 -notequal;2260 -notgreater;226F -notgreaternorequal;2271 -notgreaternorless;2279 -notidentical;2262 -notless;226E -notlessnorequal;2270 -notparallel;2226 -notprecedes;2280 -notsubset;2284 -notsucceeds;2281 -notsuperset;2285 -nowarmenian;0576 -nparen;24A9 -nssquare;33B1 -nsuperior;207F -ntilde;00F1 -nu;03BD -nuhiragana;306C -nukatakana;30CC -nukatakanahalfwidth;FF87 -nuktabengali;09BC -nuktadeva;093C -nuktagujarati;0ABC -nuktagurmukhi;0A3C -numbersign;0023 -numbersignmonospace;FF03 -numbersignsmall;FE5F -numeralsigngreek;0374 -numeralsignlowergreek;0375 -numero;2116 -nun;05E0 -nundagesh;FB40 -nundageshhebrew;FB40 -nunhebrew;05E0 -nvsquare;33B5 -nwsquare;33BB -nyabengali;099E -nyadeva;091E -nyagujarati;0A9E -nyagurmukhi;0A1E -o;006F -oacute;00F3 -oangthai;0E2D -obarred;0275 -obarredcyrillic;04E9 -obarreddieresiscyrillic;04EB -obengali;0993 -obopomofo;311B -obreve;014F -ocandradeva;0911 -ocandragujarati;0A91 -ocandravowelsigndeva;0949 -ocandravowelsigngujarati;0AC9 -ocaron;01D2 -ocircle;24DE -ocircumflex;00F4 -ocircumflexacute;1ED1 -ocircumflexdotbelow;1ED9 -ocircumflexgrave;1ED3 -ocircumflexhookabove;1ED5 -ocircumflextilde;1ED7 -ocyrillic;043E -odblacute;0151 -odblgrave;020D -odeva;0913 -odieresis;00F6 -odieresiscyrillic;04E7 -odotbelow;1ECD -oe;0153 -oekorean;315A -ogonek;02DB -ogonekcmb;0328 -ograve;00F2 -ogujarati;0A93 -oharmenian;0585 -ohiragana;304A -ohookabove;1ECF -ohorn;01A1 -ohornacute;1EDB -ohorndotbelow;1EE3 -ohorngrave;1EDD -ohornhookabove;1EDF -ohorntilde;1EE1 -ohungarumlaut;0151 -oi;01A3 -oinvertedbreve;020F -okatakana;30AA -okatakanahalfwidth;FF75 -okorean;3157 -olehebrew;05AB -omacron;014D -omacronacute;1E53 -omacrongrave;1E51 -omdeva;0950 -omega;03C9 -omega1;03D6 -omegacyrillic;0461 -omegalatinclosed;0277 -omegaroundcyrillic;047B -omegatitlocyrillic;047D -omegatonos;03CE -omgujarati;0AD0 -omicron;03BF -omicrontonos;03CC -omonospace;FF4F -one;0031 -onearabic;0661 -onebengali;09E7 -onecircle;2460 -onecircleinversesansserif;278A -onedeva;0967 -onedotenleader;2024 -oneeighth;215B -onefitted;F6DC -onegujarati;0AE7 -onegurmukhi;0A67 -onehackarabic;0661 -onehalf;00BD -onehangzhou;3021 -oneideographicparen;3220 -oneinferior;2081 -onemonospace;FF11 -onenumeratorbengali;09F4 -oneoldstyle;F731 -oneparen;2474 -oneperiod;2488 -onepersian;06F1 -onequarter;00BC -oneroman;2170 -onesuperior;00B9 -onethai;0E51 -onethird;2153 -oogonek;01EB -oogonekmacron;01ED -oogurmukhi;0A13 -oomatragurmukhi;0A4B -oopen;0254 -oparen;24AA -openbullet;25E6 -option;2325 -ordfeminine;00AA -ordmasculine;00BA -orthogonal;221F -oshortdeva;0912 -oshortvowelsigndeva;094A -oslash;00F8 -oslashacute;01FF -osmallhiragana;3049 -osmallkatakana;30A9 -osmallkatakanahalfwidth;FF6B -ostrokeacute;01FF -osuperior;F6F0 -otcyrillic;047F -otilde;00F5 -otildeacute;1E4D -otildedieresis;1E4F -oubopomofo;3121 -overline;203E -overlinecenterline;FE4A -overlinecmb;0305 -overlinedashed;FE49 -overlinedblwavy;FE4C -overlinewavy;FE4B -overscore;00AF -ovowelsignbengali;09CB -ovowelsigndeva;094B -ovowelsigngujarati;0ACB -p;0070 -paampssquare;3380 -paasentosquare;332B -pabengali;09AA -pacute;1E55 -padeva;092A -pagedown;21DF -pageup;21DE -pagujarati;0AAA -pagurmukhi;0A2A -pahiragana;3071 -paiyannoithai;0E2F -pakatakana;30D1 -palatalizationcyrilliccmb;0484 -palochkacyrillic;04C0 -pansioskorean;317F -paragraph;00B6 -parallel;2225 -parenleft;0028 -parenleftaltonearabic;FD3E -parenleftbt;F8ED -parenleftex;F8EC -parenleftinferior;208D -parenleftmonospace;FF08 -parenleftsmall;FE59 -parenleftsuperior;207D -parenlefttp;F8EB -parenleftvertical;FE35 -parenright;0029 -parenrightaltonearabic;FD3F -parenrightbt;F8F8 -parenrightex;F8F7 -parenrightinferior;208E -parenrightmonospace;FF09 -parenrightsmall;FE5A -parenrightsuperior;207E -parenrighttp;F8F6 -parenrightvertical;FE36 -partialdiff;2202 -paseqhebrew;05C0 -pashtahebrew;0599 -pasquare;33A9 -patah;05B7 -patah11;05B7 -patah1d;05B7 -patah2a;05B7 -patahhebrew;05B7 -patahnarrowhebrew;05B7 -patahquarterhebrew;05B7 -patahwidehebrew;05B7 -pazerhebrew;05A1 -pbopomofo;3106 -pcircle;24DF -pdotaccent;1E57 -pe;05E4 -pecyrillic;043F -pedagesh;FB44 -pedageshhebrew;FB44 -peezisquare;333B -pefinaldageshhebrew;FB43 -peharabic;067E -peharmenian;057A -pehebrew;05E4 -pehfinalarabic;FB57 -pehinitialarabic;FB58 -pehiragana;307A -pehmedialarabic;FB59 -pekatakana;30DA -pemiddlehookcyrillic;04A7 -perafehebrew;FB4E -percent;0025 -percentarabic;066A -percentmonospace;FF05 -percentsmall;FE6A -period;002E -periodarmenian;0589 -periodcentered;00B7 -periodhalfwidth;FF61 -periodinferior;F6E7 -periodmonospace;FF0E -periodsmall;FE52 -periodsuperior;F6E8 -perispomenigreekcmb;0342 -perpendicular;22A5 -perthousand;2030 -peseta;20A7 -pfsquare;338A -phabengali;09AB -phadeva;092B -phagujarati;0AAB -phagurmukhi;0A2B -phi;03C6 -phi1;03D5 -phieuphacirclekorean;327A -phieuphaparenkorean;321A -phieuphcirclekorean;326C -phieuphkorean;314D -phieuphparenkorean;320C -philatin;0278 -phinthuthai;0E3A -phisymbolgreek;03D5 -phook;01A5 -phophanthai;0E1E -phophungthai;0E1C -phosamphaothai;0E20 -pi;03C0 -pieupacirclekorean;3273 -pieupaparenkorean;3213 -pieupcieuckorean;3176 -pieupcirclekorean;3265 -pieupkiyeokkorean;3172 -pieupkorean;3142 -pieupparenkorean;3205 -pieupsioskiyeokkorean;3174 -pieupsioskorean;3144 -pieupsiostikeutkorean;3175 -pieupthieuthkorean;3177 -pieuptikeutkorean;3173 -pihiragana;3074 -pikatakana;30D4 -pisymbolgreek;03D6 -piwrarmenian;0583 -plus;002B -plusbelowcmb;031F -pluscircle;2295 -plusminus;00B1 -plusmod;02D6 -plusmonospace;FF0B -plussmall;FE62 -plussuperior;207A -pmonospace;FF50 -pmsquare;33D8 -pohiragana;307D -pointingindexdownwhite;261F -pointingindexleftwhite;261C -pointingindexrightwhite;261E -pointingindexupwhite;261D -pokatakana;30DD -poplathai;0E1B -postalmark;3012 -postalmarkface;3020 -pparen;24AB -precedes;227A -prescription;211E -primemod;02B9 -primereversed;2035 -product;220F -projective;2305 -prolongedkana;30FC -propellor;2318 -propersubset;2282 -propersuperset;2283 -proportion;2237 -proportional;221D -psi;03C8 -psicyrillic;0471 -psilipneumatacyrilliccmb;0486 -pssquare;33B0 -puhiragana;3077 -pukatakana;30D7 -pvsquare;33B4 -pwsquare;33BA -q;0071 -qadeva;0958 -qadmahebrew;05A8 -qafarabic;0642 -qaffinalarabic;FED6 -qafinitialarabic;FED7 -qafmedialarabic;FED8 -qamats;05B8 -qamats10;05B8 -qamats1a;05B8 -qamats1c;05B8 -qamats27;05B8 -qamats29;05B8 -qamats33;05B8 -qamatsde;05B8 -qamatshebrew;05B8 -qamatsnarrowhebrew;05B8 -qamatsqatanhebrew;05B8 -qamatsqatannarrowhebrew;05B8 -qamatsqatanquarterhebrew;05B8 -qamatsqatanwidehebrew;05B8 -qamatsquarterhebrew;05B8 -qamatswidehebrew;05B8 -qarneyparahebrew;059F -qbopomofo;3111 -qcircle;24E0 -qhook;02A0 -qmonospace;FF51 -qof;05E7 -qofdagesh;FB47 -qofdageshhebrew;FB47 -qofhatafpatah;05E7 05B2 -qofhatafpatahhebrew;05E7 05B2 -qofhatafsegol;05E7 05B1 -qofhatafsegolhebrew;05E7 05B1 -qofhebrew;05E7 -qofhiriq;05E7 05B4 -qofhiriqhebrew;05E7 05B4 -qofholam;05E7 05B9 -qofholamhebrew;05E7 05B9 -qofpatah;05E7 05B7 -qofpatahhebrew;05E7 05B7 -qofqamats;05E7 05B8 -qofqamatshebrew;05E7 05B8 -qofqubuts;05E7 05BB -qofqubutshebrew;05E7 05BB -qofsegol;05E7 05B6 -qofsegolhebrew;05E7 05B6 -qofsheva;05E7 05B0 -qofshevahebrew;05E7 05B0 -qoftsere;05E7 05B5 -qoftserehebrew;05E7 05B5 -qparen;24AC -quarternote;2669 -qubuts;05BB -qubuts18;05BB -qubuts25;05BB -qubuts31;05BB -qubutshebrew;05BB -qubutsnarrowhebrew;05BB -qubutsquarterhebrew;05BB -qubutswidehebrew;05BB -question;003F -questionarabic;061F -questionarmenian;055E -questiondown;00BF -questiondownsmall;F7BF -questiongreek;037E -questionmonospace;FF1F -questionsmall;F73F -quotedbl;0022 -quotedblbase;201E -quotedblleft;201C -quotedblmonospace;FF02 -quotedblprime;301E -quotedblprimereversed;301D -quotedblright;201D -quoteleft;2018 -quoteleftreversed;201B -quotereversed;201B -quoteright;2019 -quoterightn;0149 -quotesinglbase;201A -quotesingle;0027 -quotesinglemonospace;FF07 -r;0072 -raarmenian;057C -rabengali;09B0 -racute;0155 -radeva;0930 -radical;221A -radicalex;F8E5 -radoverssquare;33AE -radoverssquaredsquare;33AF -radsquare;33AD -rafe;05BF -rafehebrew;05BF -ragujarati;0AB0 -ragurmukhi;0A30 -rahiragana;3089 -rakatakana;30E9 -rakatakanahalfwidth;FF97 -ralowerdiagonalbengali;09F1 -ramiddlediagonalbengali;09F0 -ramshorn;0264 -ratio;2236 -rbopomofo;3116 -rcaron;0159 -rcedilla;0157 -rcircle;24E1 -rcommaaccent;0157 -rdblgrave;0211 -rdotaccent;1E59 -rdotbelow;1E5B -rdotbelowmacron;1E5D -referencemark;203B -reflexsubset;2286 -reflexsuperset;2287 -registered;00AE -registersans;F8E8 -registerserif;F6DA -reharabic;0631 -reharmenian;0580 -rehfinalarabic;FEAE -rehiragana;308C -rehyehaleflamarabic;0631 FEF3 FE8E 0644 -rekatakana;30EC -rekatakanahalfwidth;FF9A -resh;05E8 -reshdageshhebrew;FB48 -reshhatafpatah;05E8 05B2 -reshhatafpatahhebrew;05E8 05B2 -reshhatafsegol;05E8 05B1 -reshhatafsegolhebrew;05E8 05B1 -reshhebrew;05E8 -reshhiriq;05E8 05B4 -reshhiriqhebrew;05E8 05B4 -reshholam;05E8 05B9 -reshholamhebrew;05E8 05B9 -reshpatah;05E8 05B7 -reshpatahhebrew;05E8 05B7 -reshqamats;05E8 05B8 -reshqamatshebrew;05E8 05B8 -reshqubuts;05E8 05BB -reshqubutshebrew;05E8 05BB -reshsegol;05E8 05B6 -reshsegolhebrew;05E8 05B6 -reshsheva;05E8 05B0 -reshshevahebrew;05E8 05B0 -reshtsere;05E8 05B5 -reshtserehebrew;05E8 05B5 -reversedtilde;223D -reviahebrew;0597 -reviamugrashhebrew;0597 -revlogicalnot;2310 -rfishhook;027E -rfishhookreversed;027F -rhabengali;09DD -rhadeva;095D -rho;03C1 -rhook;027D -rhookturned;027B -rhookturnedsuperior;02B5 -rhosymbolgreek;03F1 -rhotichookmod;02DE -rieulacirclekorean;3271 -rieulaparenkorean;3211 -rieulcirclekorean;3263 -rieulhieuhkorean;3140 -rieulkiyeokkorean;313A -rieulkiyeoksioskorean;3169 -rieulkorean;3139 -rieulmieumkorean;313B -rieulpansioskorean;316C -rieulparenkorean;3203 -rieulphieuphkorean;313F -rieulpieupkorean;313C -rieulpieupsioskorean;316B -rieulsioskorean;313D -rieulthieuthkorean;313E -rieultikeutkorean;316A -rieulyeorinhieuhkorean;316D -rightangle;221F -righttackbelowcmb;0319 -righttriangle;22BF -rihiragana;308A -rikatakana;30EA -rikatakanahalfwidth;FF98 -ring;02DA -ringbelowcmb;0325 -ringcmb;030A -ringhalfleft;02BF -ringhalfleftarmenian;0559 -ringhalfleftbelowcmb;031C -ringhalfleftcentered;02D3 -ringhalfright;02BE -ringhalfrightbelowcmb;0339 -ringhalfrightcentered;02D2 -rinvertedbreve;0213 -rittorusquare;3351 -rlinebelow;1E5F -rlongleg;027C -rlonglegturned;027A -rmonospace;FF52 -rohiragana;308D -rokatakana;30ED -rokatakanahalfwidth;FF9B -roruathai;0E23 -rparen;24AD -rrabengali;09DC -rradeva;0931 -rragurmukhi;0A5C -rreharabic;0691 -rrehfinalarabic;FB8D -rrvocalicbengali;09E0 -rrvocalicdeva;0960 -rrvocalicgujarati;0AE0 -rrvocalicvowelsignbengali;09C4 -rrvocalicvowelsigndeva;0944 -rrvocalicvowelsigngujarati;0AC4 -rsuperior;F6F1 -rtblock;2590 -rturned;0279 -rturnedsuperior;02B4 -ruhiragana;308B -rukatakana;30EB -rukatakanahalfwidth;FF99 -rupeemarkbengali;09F2 -rupeesignbengali;09F3 -rupiah;F6DD -ruthai;0E24 -rvocalicbengali;098B -rvocalicdeva;090B -rvocalicgujarati;0A8B -rvocalicvowelsignbengali;09C3 -rvocalicvowelsigndeva;0943 -rvocalicvowelsigngujarati;0AC3 -s;0073 -sabengali;09B8 -sacute;015B -sacutedotaccent;1E65 -sadarabic;0635 -sadeva;0938 -sadfinalarabic;FEBA -sadinitialarabic;FEBB -sadmedialarabic;FEBC -sagujarati;0AB8 -sagurmukhi;0A38 -sahiragana;3055 -sakatakana;30B5 -sakatakanahalfwidth;FF7B -sallallahoualayhewasallamarabic;FDFA -samekh;05E1 -samekhdagesh;FB41 -samekhdageshhebrew;FB41 -samekhhebrew;05E1 -saraaathai;0E32 -saraaethai;0E41 -saraaimaimalaithai;0E44 -saraaimaimuanthai;0E43 -saraamthai;0E33 -saraathai;0E30 -saraethai;0E40 -saraiileftthai;F886 -saraiithai;0E35 -saraileftthai;F885 -saraithai;0E34 -saraothai;0E42 -saraueeleftthai;F888 -saraueethai;0E37 -saraueleftthai;F887 -sarauethai;0E36 -sarauthai;0E38 -sarauuthai;0E39 -sbopomofo;3119 -scaron;0161 -scarondotaccent;1E67 -scedilla;015F -schwa;0259 -schwacyrillic;04D9 -schwadieresiscyrillic;04DB -schwahook;025A -scircle;24E2 -scircumflex;015D -scommaaccent;0219 -sdotaccent;1E61 -sdotbelow;1E63 -sdotbelowdotaccent;1E69 -seagullbelowcmb;033C -second;2033 -secondtonechinese;02CA -section;00A7 -seenarabic;0633 -seenfinalarabic;FEB2 -seeninitialarabic;FEB3 -seenmedialarabic;FEB4 -segol;05B6 -segol13;05B6 -segol1f;05B6 -segol2c;05B6 -segolhebrew;05B6 -segolnarrowhebrew;05B6 -segolquarterhebrew;05B6 -segoltahebrew;0592 -segolwidehebrew;05B6 -seharmenian;057D -sehiragana;305B -sekatakana;30BB -sekatakanahalfwidth;FF7E -semicolon;003B -semicolonarabic;061B -semicolonmonospace;FF1B -semicolonsmall;FE54 -semivoicedmarkkana;309C -semivoicedmarkkanahalfwidth;FF9F -sentisquare;3322 -sentosquare;3323 -seven;0037 -sevenarabic;0667 -sevenbengali;09ED -sevencircle;2466 -sevencircleinversesansserif;2790 -sevendeva;096D -seveneighths;215E -sevengujarati;0AED -sevengurmukhi;0A6D -sevenhackarabic;0667 -sevenhangzhou;3027 -sevenideographicparen;3226 -seveninferior;2087 -sevenmonospace;FF17 -sevenoldstyle;F737 -sevenparen;247A -sevenperiod;248E -sevenpersian;06F7 -sevenroman;2176 -sevensuperior;2077 -seventeencircle;2470 -seventeenparen;2484 -seventeenperiod;2498 -seventhai;0E57 -sfthyphen;00AD -shaarmenian;0577 -shabengali;09B6 -shacyrillic;0448 -shaddaarabic;0651 -shaddadammaarabic;FC61 -shaddadammatanarabic;FC5E -shaddafathaarabic;FC60 -shaddafathatanarabic;0651 064B -shaddakasraarabic;FC62 -shaddakasratanarabic;FC5F -shade;2592 -shadedark;2593 -shadelight;2591 -shademedium;2592 -shadeva;0936 -shagujarati;0AB6 -shagurmukhi;0A36 -shalshelethebrew;0593 -shbopomofo;3115 -shchacyrillic;0449 -sheenarabic;0634 -sheenfinalarabic;FEB6 -sheeninitialarabic;FEB7 -sheenmedialarabic;FEB8 -sheicoptic;03E3 -sheqel;20AA -sheqelhebrew;20AA -sheva;05B0 -sheva115;05B0 -sheva15;05B0 -sheva22;05B0 -sheva2e;05B0 -shevahebrew;05B0 -shevanarrowhebrew;05B0 -shevaquarterhebrew;05B0 -shevawidehebrew;05B0 -shhacyrillic;04BB -shimacoptic;03ED -shin;05E9 -shindagesh;FB49 -shindageshhebrew;FB49 -shindageshshindot;FB2C -shindageshshindothebrew;FB2C -shindageshsindot;FB2D -shindageshsindothebrew;FB2D -shindothebrew;05C1 -shinhebrew;05E9 -shinshindot;FB2A -shinshindothebrew;FB2A -shinsindot;FB2B -shinsindothebrew;FB2B -shook;0282 -sigma;03C3 -sigma1;03C2 -sigmafinal;03C2 -sigmalunatesymbolgreek;03F2 -sihiragana;3057 -sikatakana;30B7 -sikatakanahalfwidth;FF7C -siluqhebrew;05BD -siluqlefthebrew;05BD -similar;223C -sindothebrew;05C2 -siosacirclekorean;3274 -siosaparenkorean;3214 -sioscieuckorean;317E -sioscirclekorean;3266 -sioskiyeokkorean;317A -sioskorean;3145 -siosnieunkorean;317B -siosparenkorean;3206 -siospieupkorean;317D -siostikeutkorean;317C -six;0036 -sixarabic;0666 -sixbengali;09EC -sixcircle;2465 -sixcircleinversesansserif;278F -sixdeva;096C -sixgujarati;0AEC -sixgurmukhi;0A6C -sixhackarabic;0666 -sixhangzhou;3026 -sixideographicparen;3225 -sixinferior;2086 -sixmonospace;FF16 -sixoldstyle;F736 -sixparen;2479 -sixperiod;248D -sixpersian;06F6 -sixroman;2175 -sixsuperior;2076 -sixteencircle;246F -sixteencurrencydenominatorbengali;09F9 -sixteenparen;2483 -sixteenperiod;2497 -sixthai;0E56 -slash;002F -slashmonospace;FF0F -slong;017F -slongdotaccent;1E9B -smileface;263A -smonospace;FF53 -sofpasuqhebrew;05C3 -softhyphen;00AD -softsigncyrillic;044C -sohiragana;305D -sokatakana;30BD -sokatakanahalfwidth;FF7F -soliduslongoverlaycmb;0338 -solidusshortoverlaycmb;0337 -sorusithai;0E29 -sosalathai;0E28 -sosothai;0E0B -sosuathai;0E2A -space;0020 -spacehackarabic;0020 -spade;2660 -spadesuitblack;2660 -spadesuitwhite;2664 -sparen;24AE -squarebelowcmb;033B -squarecc;33C4 -squarecm;339D -squarediagonalcrosshatchfill;25A9 -squarehorizontalfill;25A4 -squarekg;338F -squarekm;339E -squarekmcapital;33CE -squareln;33D1 -squarelog;33D2 -squaremg;338E -squaremil;33D5 -squaremm;339C -squaremsquared;33A1 -squareorthogonalcrosshatchfill;25A6 -squareupperlefttolowerrightfill;25A7 -squareupperrighttolowerleftfill;25A8 -squareverticalfill;25A5 -squarewhitewithsmallblack;25A3 -srsquare;33DB -ssabengali;09B7 -ssadeva;0937 -ssagujarati;0AB7 -ssangcieuckorean;3149 -ssanghieuhkorean;3185 -ssangieungkorean;3180 -ssangkiyeokkorean;3132 -ssangnieunkorean;3165 -ssangpieupkorean;3143 -ssangsioskorean;3146 -ssangtikeutkorean;3138 -ssuperior;F6F2 -sterling;00A3 -sterlingmonospace;FFE1 -strokelongoverlaycmb;0336 -strokeshortoverlaycmb;0335 -subset;2282 -subsetnotequal;228A -subsetorequal;2286 -succeeds;227B -suchthat;220B -suhiragana;3059 -sukatakana;30B9 -sukatakanahalfwidth;FF7D -sukunarabic;0652 -summation;2211 -sun;263C -superset;2283 -supersetnotequal;228B -supersetorequal;2287 -svsquare;33DC -syouwaerasquare;337C -t;0074 -tabengali;09A4 -tackdown;22A4 -tackleft;22A3 -tadeva;0924 -tagujarati;0AA4 -tagurmukhi;0A24 -taharabic;0637 -tahfinalarabic;FEC2 -tahinitialarabic;FEC3 -tahiragana;305F -tahmedialarabic;FEC4 -taisyouerasquare;337D -takatakana;30BF -takatakanahalfwidth;FF80 -tatweelarabic;0640 -tau;03C4 -tav;05EA -tavdages;FB4A -tavdagesh;FB4A -tavdageshhebrew;FB4A -tavhebrew;05EA -tbar;0167 -tbopomofo;310A -tcaron;0165 -tccurl;02A8 -tcedilla;0163 -tcheharabic;0686 -tchehfinalarabic;FB7B -tchehinitialarabic;FB7C -tchehmedialarabic;FB7D -tchehmeeminitialarabic;FB7C FEE4 -tcircle;24E3 -tcircumflexbelow;1E71 -tcommaaccent;0163 -tdieresis;1E97 -tdotaccent;1E6B -tdotbelow;1E6D -tecyrillic;0442 -tedescendercyrillic;04AD -teharabic;062A -tehfinalarabic;FE96 -tehhahinitialarabic;FCA2 -tehhahisolatedarabic;FC0C -tehinitialarabic;FE97 -tehiragana;3066 -tehjeeminitialarabic;FCA1 -tehjeemisolatedarabic;FC0B -tehmarbutaarabic;0629 -tehmarbutafinalarabic;FE94 -tehmedialarabic;FE98 -tehmeeminitialarabic;FCA4 -tehmeemisolatedarabic;FC0E -tehnoonfinalarabic;FC73 -tekatakana;30C6 -tekatakanahalfwidth;FF83 -telephone;2121 -telephoneblack;260E -telishagedolahebrew;05A0 -telishaqetanahebrew;05A9 -tencircle;2469 -tenideographicparen;3229 -tenparen;247D -tenperiod;2491 -tenroman;2179 -tesh;02A7 -tet;05D8 -tetdagesh;FB38 -tetdageshhebrew;FB38 -tethebrew;05D8 -tetsecyrillic;04B5 -tevirhebrew;059B -tevirlefthebrew;059B -thabengali;09A5 -thadeva;0925 -thagujarati;0AA5 -thagurmukhi;0A25 -thalarabic;0630 -thalfinalarabic;FEAC -thanthakhatlowleftthai;F898 -thanthakhatlowrightthai;F897 -thanthakhatthai;0E4C -thanthakhatupperleftthai;F896 -theharabic;062B -thehfinalarabic;FE9A -thehinitialarabic;FE9B -thehmedialarabic;FE9C -thereexists;2203 -therefore;2234 -theta;03B8 -theta1;03D1 -thetasymbolgreek;03D1 -thieuthacirclekorean;3279 -thieuthaparenkorean;3219 -thieuthcirclekorean;326B -thieuthkorean;314C -thieuthparenkorean;320B -thirteencircle;246C -thirteenparen;2480 -thirteenperiod;2494 -thonangmonthothai;0E11 -thook;01AD -thophuthaothai;0E12 -thorn;00FE -thothahanthai;0E17 -thothanthai;0E10 -thothongthai;0E18 -thothungthai;0E16 -thousandcyrillic;0482 -thousandsseparatorarabic;066C -thousandsseparatorpersian;066C -three;0033 -threearabic;0663 -threebengali;09E9 -threecircle;2462 -threecircleinversesansserif;278C -threedeva;0969 -threeeighths;215C -threegujarati;0AE9 -threegurmukhi;0A69 -threehackarabic;0663 -threehangzhou;3023 -threeideographicparen;3222 -threeinferior;2083 -threemonospace;FF13 -threenumeratorbengali;09F6 -threeoldstyle;F733 -threeparen;2476 -threeperiod;248A -threepersian;06F3 -threequarters;00BE -threequartersemdash;F6DE -threeroman;2172 -threesuperior;00B3 -threethai;0E53 -thzsquare;3394 -tihiragana;3061 -tikatakana;30C1 -tikatakanahalfwidth;FF81 -tikeutacirclekorean;3270 -tikeutaparenkorean;3210 -tikeutcirclekorean;3262 -tikeutkorean;3137 -tikeutparenkorean;3202 -tilde;02DC -tildebelowcmb;0330 -tildecmb;0303 -tildecomb;0303 -tildedoublecmb;0360 -tildeoperator;223C -tildeoverlaycmb;0334 -tildeverticalcmb;033E -timescircle;2297 -tipehahebrew;0596 -tipehalefthebrew;0596 -tippigurmukhi;0A70 -titlocyrilliccmb;0483 -tiwnarmenian;057F -tlinebelow;1E6F -tmonospace;FF54 -toarmenian;0569 -tohiragana;3068 -tokatakana;30C8 -tokatakanahalfwidth;FF84 -tonebarextrahighmod;02E5 -tonebarextralowmod;02E9 -tonebarhighmod;02E6 -tonebarlowmod;02E8 -tonebarmidmod;02E7 -tonefive;01BD -tonesix;0185 -tonetwo;01A8 -tonos;0384 -tonsquare;3327 -topatakthai;0E0F -tortoiseshellbracketleft;3014 -tortoiseshellbracketleftsmall;FE5D -tortoiseshellbracketleftvertical;FE39 -tortoiseshellbracketright;3015 -tortoiseshellbracketrightsmall;FE5E -tortoiseshellbracketrightvertical;FE3A -totaothai;0E15 -tpalatalhook;01AB -tparen;24AF -trademark;2122 -trademarksans;F8EA -trademarkserif;F6DB -tretroflexhook;0288 -triagdn;25BC -triaglf;25C4 -triagrt;25BA -triagup;25B2 -ts;02A6 -tsadi;05E6 -tsadidagesh;FB46 -tsadidageshhebrew;FB46 -tsadihebrew;05E6 -tsecyrillic;0446 -tsere;05B5 -tsere12;05B5 -tsere1e;05B5 -tsere2b;05B5 -tserehebrew;05B5 -tserenarrowhebrew;05B5 -tserequarterhebrew;05B5 -tserewidehebrew;05B5 -tshecyrillic;045B -tsuperior;F6F3 -ttabengali;099F -ttadeva;091F -ttagujarati;0A9F -ttagurmukhi;0A1F -tteharabic;0679 -ttehfinalarabic;FB67 -ttehinitialarabic;FB68 -ttehmedialarabic;FB69 -tthabengali;09A0 -tthadeva;0920 -tthagujarati;0AA0 -tthagurmukhi;0A20 -tturned;0287 -tuhiragana;3064 -tukatakana;30C4 -tukatakanahalfwidth;FF82 -tusmallhiragana;3063 -tusmallkatakana;30C3 -tusmallkatakanahalfwidth;FF6F -twelvecircle;246B -twelveparen;247F -twelveperiod;2493 -twelveroman;217B -twentycircle;2473 -twentyhangzhou;5344 -twentyparen;2487 -twentyperiod;249B -two;0032 -twoarabic;0662 -twobengali;09E8 -twocircle;2461 -twocircleinversesansserif;278B -twodeva;0968 -twodotenleader;2025 -twodotleader;2025 -twodotleadervertical;FE30 -twogujarati;0AE8 -twogurmukhi;0A68 -twohackarabic;0662 -twohangzhou;3022 -twoideographicparen;3221 -twoinferior;2082 -twomonospace;FF12 -twonumeratorbengali;09F5 -twooldstyle;F732 -twoparen;2475 -twoperiod;2489 -twopersian;06F2 -tworoman;2171 -twostroke;01BB -twosuperior;00B2 -twothai;0E52 -twothirds;2154 -u;0075 -uacute;00FA -ubar;0289 -ubengali;0989 -ubopomofo;3128 -ubreve;016D -ucaron;01D4 -ucircle;24E4 -ucircumflex;00FB -ucircumflexbelow;1E77 -ucyrillic;0443 -udattadeva;0951 -udblacute;0171 -udblgrave;0215 -udeva;0909 -udieresis;00FC -udieresisacute;01D8 -udieresisbelow;1E73 -udieresiscaron;01DA -udieresiscyrillic;04F1 -udieresisgrave;01DC -udieresismacron;01D6 -udotbelow;1EE5 -ugrave;00F9 -ugujarati;0A89 -ugurmukhi;0A09 -uhiragana;3046 -uhookabove;1EE7 -uhorn;01B0 -uhornacute;1EE9 -uhorndotbelow;1EF1 -uhorngrave;1EEB -uhornhookabove;1EED -uhorntilde;1EEF -uhungarumlaut;0171 -uhungarumlautcyrillic;04F3 -uinvertedbreve;0217 -ukatakana;30A6 -ukatakanahalfwidth;FF73 -ukcyrillic;0479 -ukorean;315C -umacron;016B -umacroncyrillic;04EF -umacrondieresis;1E7B -umatragurmukhi;0A41 -umonospace;FF55 -underscore;005F -underscoredbl;2017 -underscoremonospace;FF3F -underscorevertical;FE33 -underscorewavy;FE4F -union;222A -universal;2200 -uogonek;0173 -uparen;24B0 -upblock;2580 -upperdothebrew;05C4 -upsilon;03C5 -upsilondieresis;03CB -upsilondieresistonos;03B0 -upsilonlatin;028A -upsilontonos;03CD -uptackbelowcmb;031D -uptackmod;02D4 -uragurmukhi;0A73 -uring;016F -ushortcyrillic;045E -usmallhiragana;3045 -usmallkatakana;30A5 -usmallkatakanahalfwidth;FF69 -ustraightcyrillic;04AF -ustraightstrokecyrillic;04B1 -utilde;0169 -utildeacute;1E79 -utildebelow;1E75 -uubengali;098A -uudeva;090A -uugujarati;0A8A -uugurmukhi;0A0A -uumatragurmukhi;0A42 -uuvowelsignbengali;09C2 -uuvowelsigndeva;0942 -uuvowelsigngujarati;0AC2 -uvowelsignbengali;09C1 -uvowelsigndeva;0941 -uvowelsigngujarati;0AC1 -v;0076 -vadeva;0935 -vagujarati;0AB5 -vagurmukhi;0A35 -vakatakana;30F7 -vav;05D5 -vavdagesh;FB35 -vavdagesh65;FB35 -vavdageshhebrew;FB35 -vavhebrew;05D5 -vavholam;FB4B -vavholamhebrew;FB4B -vavvavhebrew;05F0 -vavyodhebrew;05F1 -vcircle;24E5 -vdotbelow;1E7F -vecyrillic;0432 -veharabic;06A4 -vehfinalarabic;FB6B -vehinitialarabic;FB6C -vehmedialarabic;FB6D -vekatakana;30F9 -venus;2640 -verticalbar;007C -verticallineabovecmb;030D -verticallinebelowcmb;0329 -verticallinelowmod;02CC -verticallinemod;02C8 -vewarmenian;057E -vhook;028B -vikatakana;30F8 -viramabengali;09CD -viramadeva;094D -viramagujarati;0ACD -visargabengali;0983 -visargadeva;0903 -visargagujarati;0A83 -vmonospace;FF56 -voarmenian;0578 -voicediterationhiragana;309E -voicediterationkatakana;30FE -voicedmarkkana;309B -voicedmarkkanahalfwidth;FF9E -vokatakana;30FA -vparen;24B1 -vtilde;1E7D -vturned;028C -vuhiragana;3094 -vukatakana;30F4 -w;0077 -wacute;1E83 -waekorean;3159 -wahiragana;308F -wakatakana;30EF -wakatakanahalfwidth;FF9C -wakorean;3158 -wasmallhiragana;308E -wasmallkatakana;30EE -wattosquare;3357 -wavedash;301C -wavyunderscorevertical;FE34 -wawarabic;0648 -wawfinalarabic;FEEE -wawhamzaabovearabic;0624 -wawhamzaabovefinalarabic;FE86 -wbsquare;33DD -wcircle;24E6 -wcircumflex;0175 -wdieresis;1E85 -wdotaccent;1E87 -wdotbelow;1E89 -wehiragana;3091 -weierstrass;2118 -wekatakana;30F1 -wekorean;315E -weokorean;315D -wgrave;1E81 -whitebullet;25E6 -whitecircle;25CB -whitecircleinverse;25D9 -whitecornerbracketleft;300E -whitecornerbracketleftvertical;FE43 -whitecornerbracketright;300F -whitecornerbracketrightvertical;FE44 -whitediamond;25C7 -whitediamondcontainingblacksmalldiamond;25C8 -whitedownpointingsmalltriangle;25BF -whitedownpointingtriangle;25BD -whiteleftpointingsmalltriangle;25C3 -whiteleftpointingtriangle;25C1 -whitelenticularbracketleft;3016 -whitelenticularbracketright;3017 -whiterightpointingsmalltriangle;25B9 -whiterightpointingtriangle;25B7 -whitesmallsquare;25AB -whitesmilingface;263A -whitesquare;25A1 -whitestar;2606 -whitetelephone;260F -whitetortoiseshellbracketleft;3018 -whitetortoiseshellbracketright;3019 -whiteuppointingsmalltriangle;25B5 -whiteuppointingtriangle;25B3 -wihiragana;3090 -wikatakana;30F0 -wikorean;315F -wmonospace;FF57 -wohiragana;3092 -wokatakana;30F2 -wokatakanahalfwidth;FF66 -won;20A9 -wonmonospace;FFE6 -wowaenthai;0E27 -wparen;24B2 -wring;1E98 -wsuperior;02B7 -wturned;028D -wynn;01BF -x;0078 -xabovecmb;033D -xbopomofo;3112 -xcircle;24E7 -xdieresis;1E8D -xdotaccent;1E8B -xeharmenian;056D -xi;03BE -xmonospace;FF58 -xparen;24B3 -xsuperior;02E3 -y;0079 -yaadosquare;334E -yabengali;09AF -yacute;00FD -yadeva;092F -yaekorean;3152 -yagujarati;0AAF -yagurmukhi;0A2F -yahiragana;3084 -yakatakana;30E4 -yakatakanahalfwidth;FF94 -yakorean;3151 -yamakkanthai;0E4E -yasmallhiragana;3083 -yasmallkatakana;30E3 -yasmallkatakanahalfwidth;FF6C -yatcyrillic;0463 -ycircle;24E8 -ycircumflex;0177 -ydieresis;00FF -ydotaccent;1E8F -ydotbelow;1EF5 -yeharabic;064A -yehbarreearabic;06D2 -yehbarreefinalarabic;FBAF -yehfinalarabic;FEF2 -yehhamzaabovearabic;0626 -yehhamzaabovefinalarabic;FE8A -yehhamzaaboveinitialarabic;FE8B -yehhamzaabovemedialarabic;FE8C -yehinitialarabic;FEF3 -yehmedialarabic;FEF4 -yehmeeminitialarabic;FCDD -yehmeemisolatedarabic;FC58 -yehnoonfinalarabic;FC94 -yehthreedotsbelowarabic;06D1 -yekorean;3156 -yen;00A5 -yenmonospace;FFE5 -yeokorean;3155 -yeorinhieuhkorean;3186 -yerahbenyomohebrew;05AA -yerahbenyomolefthebrew;05AA -yericyrillic;044B -yerudieresiscyrillic;04F9 -yesieungkorean;3181 -yesieungpansioskorean;3183 -yesieungsioskorean;3182 -yetivhebrew;059A -ygrave;1EF3 -yhook;01B4 -yhookabove;1EF7 -yiarmenian;0575 -yicyrillic;0457 -yikorean;3162 -yinyang;262F -yiwnarmenian;0582 -ymonospace;FF59 -yod;05D9 -yoddagesh;FB39 -yoddageshhebrew;FB39 -yodhebrew;05D9 -yodyodhebrew;05F2 -yodyodpatahhebrew;FB1F -yohiragana;3088 -yoikorean;3189 -yokatakana;30E8 -yokatakanahalfwidth;FF96 -yokorean;315B -yosmallhiragana;3087 -yosmallkatakana;30E7 -yosmallkatakanahalfwidth;FF6E -yotgreek;03F3 -yoyaekorean;3188 -yoyakorean;3187 -yoyakthai;0E22 -yoyingthai;0E0D -yparen;24B4 -ypogegrammeni;037A -ypogegrammenigreekcmb;0345 -yr;01A6 -yring;1E99 -ysuperior;02B8 -ytilde;1EF9 -yturned;028E -yuhiragana;3086 -yuikorean;318C -yukatakana;30E6 -yukatakanahalfwidth;FF95 -yukorean;3160 -yusbigcyrillic;046B -yusbigiotifiedcyrillic;046D -yuslittlecyrillic;0467 -yuslittleiotifiedcyrillic;0469 -yusmallhiragana;3085 -yusmallkatakana;30E5 -yusmallkatakanahalfwidth;FF6D -yuyekorean;318B -yuyeokorean;318A -yyabengali;09DF -yyadeva;095F -z;007A -zaarmenian;0566 -zacute;017A -zadeva;095B -zagurmukhi;0A5B -zaharabic;0638 -zahfinalarabic;FEC6 -zahinitialarabic;FEC7 -zahiragana;3056 -zahmedialarabic;FEC8 -zainarabic;0632 -zainfinalarabic;FEB0 -zakatakana;30B6 -zaqefgadolhebrew;0595 -zaqefqatanhebrew;0594 -zarqahebrew;0598 -zayin;05D6 -zayindagesh;FB36 -zayindageshhebrew;FB36 -zayinhebrew;05D6 -zbopomofo;3117 -zcaron;017E -zcircle;24E9 -zcircumflex;1E91 -zcurl;0291 -zdot;017C -zdotaccent;017C -zdotbelow;1E93 -zecyrillic;0437 -zedescendercyrillic;0499 -zedieresiscyrillic;04DF -zehiragana;305C -zekatakana;30BC -zero;0030 -zeroarabic;0660 -zerobengali;09E6 -zerodeva;0966 -zerogujarati;0AE6 -zerogurmukhi;0A66 -zerohackarabic;0660 -zeroinferior;2080 -zeromonospace;FF10 -zerooldstyle;F730 -zeropersian;06F0 -zerosuperior;2070 -zerothai;0E50 -zerowidthjoiner;FEFF -zerowidthnonjoiner;200C -zerowidthspace;200B -zeta;03B6 -zhbopomofo;3113 -zhearmenian;056A -zhebrevecyrillic;04C2 -zhecyrillic;0436 -zhedescendercyrillic;0497 -zhedieresiscyrillic;04DD -zihiragana;3058 -zikatakana;30B8 -zinorhebrew;05AE -zlinebelow;1E95 -zmonospace;FF5A -zohiragana;305E -zokatakana;30BE -zparen;24B5 -zretroflexhook;0290 -zstroke;01B6 -zuhiragana;305A -zukatakana;30BA -a100;275E -a101;2761 -a102;2762 -a103;2763 -a104;2764 -a105;2710 -a106;2765 -a107;2766 -a108;2767 -a109;2660 -a10;2721 -a110;2665 -a111;2666 -a112;2663 -a117;2709 -a118;2708 -a119;2707 -a11;261B -a120;2460 -a121;2461 -a122;2462 -a123;2463 -a124;2464 -a125;2465 -a126;2466 -a127;2467 -a128;2468 -a129;2469 -a12;261E -a130;2776 -a131;2777 -a132;2778 -a133;2779 -a134;277A -a135;277B -a136;277C -a137;277D -a138;277E -a139;277F -a13;270C -a140;2780 -a141;2781 -a142;2782 -a143;2783 -a144;2784 -a145;2785 -a146;2786 -a147;2787 -a148;2788 -a149;2789 -a14;270D -a150;278A -a151;278B -a152;278C -a153;278D -a154;278E -a155;278F -a156;2790 -a157;2791 -a158;2792 -a159;2793 -a15;270E -a160;2794 -a161;2192 -a162;27A3 -a163;2194 -a164;2195 -a165;2799 -a166;279B -a167;279C -a168;279D -a169;279E -a16;270F -a170;279F -a171;27A0 -a172;27A1 -a173;27A2 -a174;27A4 -a175;27A5 -a176;27A6 -a177;27A7 -a178;27A8 -a179;27A9 -a17;2711 -a180;27AB -a181;27AD -a182;27AF -a183;27B2 -a184;27B3 -a185;27B5 -a186;27B8 -a187;27BA -a188;27BB -a189;27BC -a18;2712 -a190;27BD -a191;27BE -a192;279A -a193;27AA -a194;27B6 -a195;27B9 -a196;2798 -a197;27B4 -a198;27B7 -a199;27AC -a19;2713 -a1;2701 -a200;27AE -a201;27B1 -a202;2703 -a203;2750 -a204;2752 -a205;276E -a206;2770 -a20;2714 -a21;2715 -a22;2716 -a23;2717 -a24;2718 -a25;2719 -a26;271A -a27;271B -a28;271C -a29;2722 -a2;2702 -a30;2723 -a31;2724 -a32;2725 -a33;2726 -a34;2727 -a35;2605 -a36;2729 -a37;272A -a38;272B -a39;272C -a3;2704 -a40;272D -a41;272E -a42;272F -a43;2730 -a44;2731 -a45;2732 -a46;2733 -a47;2734 -a48;2735 -a49;2736 -a4;260E -a50;2737 -a51;2738 -a52;2739 -a53;273A -a54;273B -a55;273C -a56;273D -a57;273E -a58;273F -a59;2740 -a5;2706 -a60;2741 -a61;2742 -a62;2743 -a63;2744 -a64;2745 -a65;2746 -a66;2747 -a67;2748 -a68;2749 -a69;274A -a6;271D -a70;274B -a71;25CF -a72;274D -a73;25A0 -a74;274F -a75;2751 -a76;25B2 -a77;25BC -a78;25C6 -a79;2756 -a7;271E -a81;25D7 -a82;2758 -a83;2759 -a84;275A -a85;276F -a86;2771 -a87;2772 -a88;2773 -a89;2768 -a8;271F -a90;2769 -a91;276C -a92;276D -a93;276A -a94;276B -a95;2774 -a96;2775 -a97;275B -a98;275C -a99;275D -a9;2720 -""" - - -# string table management -# -class StringTable: - def __init__( self, name_list, master_table_name ): - self.names = name_list - self.master_table = master_table_name - self.indices = {} - index = 0 - - for name in name_list: - self.indices[name] = index - index += len( name ) + 1 - - self.total = index - - def dump( self, file ): - write = file.write - write( " static const char " + self.master_table + - "[" + repr( self.total ) + "] =\n" ) - write( " {\n" ) - - line = "" - for name in self.names: - line += " '" - line += string.join( ( re.findall( ".", name ) ), "','" ) - line += "', 0,\n" - - write( line + " };\n\n\n" ) - - def dump_sublist( self, file, table_name, macro_name, sublist ): - write = file.write - write( "#define " + macro_name + " " + repr( len( sublist ) ) + "\n\n" ) - - write( " /* Values are offsets into the `" + - self.master_table + "' table */\n\n" ) - write( " static const short " + table_name + - "[" + macro_name + "] =\n" ) - write( " {\n" ) - - line = " " - comma = "" - col = 0 - - for name in sublist: - line += comma - line += "%4d" % self.indices[name] - col += 1 - comma = "," - if col == 14: - col = 0 - comma = ",\n " - - write( line + "\n };\n\n\n" ) - - -# We now store the Adobe Glyph List in compressed form. The list is put -# into a data structure called `trie' (because it has a tree-like -# appearance). Consider, for example, that you want to store the -# following name mapping: -# -# A => 1 -# Aacute => 6 -# Abalon => 2 -# Abstract => 4 -# -# It is possible to store the entries as follows. -# -# A => 1 -# | -# +-acute => 6 -# | -# +-b -# | -# +-alon => 2 -# | -# +-stract => 4 -# -# We see that each node in the trie has: -# -# - one or more `letters' -# - an optional value -# - zero or more child nodes -# -# The first step is to call -# -# root = StringNode( "", 0 ) -# for word in map.values(): -# root.add( word, map[word] ) -# -# which creates a large trie where each node has only one children. -# -# Executing -# -# root = root.optimize() -# -# optimizes the trie by merging the letters of successive nodes whenever -# possible. -# -# Each node of the trie is stored as follows. -# -# - First the node's letter, according to the following scheme. We -# use the fact that in the AGL no name contains character codes > 127. -# -# name bitsize description -# ---------------------------------------------------------------- -# notlast 1 Set to 1 if this is not the last letter -# in the word. -# ascii 7 The letter's ASCII value. -# -# - The letter is followed by a children count and the value of the -# current key (if any). Again we can do some optimization because all -# AGL entries are from the BMP; this means that 16 bits are sufficient -# to store its Unicode values. Additionally, no node has more than -# 127 children. -# -# name bitsize description -# ----------------------------------------- -# hasvalue 1 Set to 1 if a 16-bit Unicode value follows. -# num_children 7 Number of children. Can be 0 only if -# `hasvalue' is set to 1. -# value 16 Optional Unicode value. -# -# - A node is finished by a list of 16bit absolute offsets to the -# children, which must be sorted in increasing order of their first -# letter. -# -# For simplicity, all 16bit quantities are stored in big-endian order. -# -# The root node has first letter = 0, and no value. -# -class StringNode: - def __init__( self, letter, value ): - self.letter = letter - self.value = value - self.children = {} - - def __cmp__( self, other ): - return ord( self.letter[0] ) - ord( other.letter[0] ) - - def add( self, word, value ): - if len( word ) == 0: - self.value = value - return - - letter = word[0] - word = word[1:] - - if self.children.has_key( letter ): - child = self.children[letter] - else: - child = StringNode( letter, 0 ) - self.children[letter] = child - - child.add( word, value ) - - def optimize( self ): - # optimize all children first - children = self.children.values() - self.children = {} - - for child in children: - self.children[child.letter[0]] = child.optimize() - - # don't optimize if there's a value, - # if we don't have any child or if we - # have more than one child - if ( self.value != 0 ) or ( not children ) or len( children ) > 1: - return self - - child = children[0] - - self.letter += child.letter - self.value = child.value - self.children = child.children - - return self - - def dump_debug( self, write, margin ): - # this is used during debugging - line = margin + "+-" - if len( self.letter ) == 0: - line += "" - else: - line += self.letter - - if self.value: - line += " => " + repr( self.value ) - - write( line + "\n" ) - - if self.children: - margin += "| " - for child in self.children.values(): - child.dump_debug( write, margin ) - - def locate( self, index ): - self.index = index - if len( self.letter ) > 0: - index += len( self.letter ) + 1 - else: - index += 2 - - if self.value != 0: - index += 2 - - children = self.children.values() - children.sort() - - index += 2 * len( children ) - for child in children: - index = child.locate( index ) - - return index - - def store( self, storage ): - # write the letters - l = len( self.letter ) - if l == 0: - storage += struct.pack( "B", 0 ) - else: - for n in range( l ): - val = ord( self.letter[n] ) - if n < l - 1: - val += 128 - storage += struct.pack( "B", val ) - - # write the count - children = self.children.values() - children.sort() - - count = len( children ) - - if self.value != 0: - storage += struct.pack( "!BH", count + 128, self.value ) - else: - storage += struct.pack( "B", count ) - - for child in children: - storage += struct.pack( "!H", child.index ) - - for child in children: - storage = child.store( storage ) - - return storage - - -def adobe_glyph_values(): - """return the list of glyph names and their unicode values""" - - lines = string.split( adobe_glyph_list, '\n' ) - glyphs = [] - values = [] - - for line in lines: - if line: - fields = string.split( line, ';' ) -# print fields[1] + ' - ' + fields[0] - subfields = string.split( fields[1], ' ' ) - if len( subfields ) == 1: - glyphs.append( fields[0] ) - values.append( fields[1] ) - - return glyphs, values - - -def filter_glyph_names( alist, filter ): - """filter `alist' by taking _out_ all glyph names that are in `filter'""" - - count = 0 - extras = [] - - for name in alist: - try: - filtered_index = filter.index( name ) - except: - extras.append( name ) - - return extras - - -def dump_encoding( file, encoding_name, encoding_list ): - """dump a given encoding""" - - write = file.write - write( " /* the following are indices into the SID name table */\n" ) - write( " static const unsigned short " + encoding_name + - "[" + repr( len( encoding_list ) ) + "] =\n" ) - write( " {\n" ) - - line = " " - comma = "" - col = 0 - for value in encoding_list: - line += comma - line += "%3d" % value - comma = "," - col += 1 - if col == 16: - col = 0 - comma = ",\n " - - write( line + "\n };\n\n\n" ) - - -def dump_array( the_array, write, array_name ): - """dumps a given encoding""" - - write( " static const unsigned char " + array_name + - "[" + repr( len( the_array ) ) + "L] =\n" ) - write( " {\n" ) - - line = "" - comma = " " - col = 0 - - for value in the_array: - line += comma - line += "%3d" % ord( value ) - comma = "," - col += 1 - - if col == 16: - col = 0 - comma = ",\n " - - if len( line ) > 1024: - write( line ) - line = "" - - write( line + "\n };\n\n\n" ) - - -def main(): - """main program body""" - - if len( sys.argv ) != 2: - print __doc__ % sys.argv[0] - sys.exit( 1 ) - - file = open( sys.argv[1], "w\n" ) - write = file.write - - count_sid = len( sid_standard_names ) - - # `mac_extras' contains the list of glyph names in the Macintosh standard - # encoding which are not in the SID Standard Names. - # - mac_extras = filter_glyph_names( mac_standard_names, sid_standard_names ) - - # `base_list' contains the names of our final glyph names table. - # It consists of the `mac_extras' glyph names, followed by the SID - # standard names. - # - mac_extras_count = len( mac_extras ) - base_list = mac_extras + sid_standard_names - - write( "/***************************************************************************/\n" ) - write( "/* */\n" ) - - write( "/* %-71s*/\n" % os.path.basename( sys.argv[1] ) ) - - write( "/* */\n" ) - write( "/* PostScript glyph names. */\n" ) - write( "/* */\n" ) - write( "/* Copyright 2005-2015 by */\n" ) - write( "/* David Turner, Robert Wilhelm, and Werner Lemberg. */\n" ) - write( "/* */\n" ) - write( "/* This file is part of the FreeType project, and may only be used, */\n" ) - write( "/* modified, and distributed under the terms of the FreeType project */\n" ) - write( "/* license, LICENSE.TXT. By continuing to use, modify, or distribute */\n" ) - write( "/* this file you indicate that you have read the license and */\n" ) - write( "/* understand and accept it fully. */\n" ) - write( "/* */\n" ) - write( "/***************************************************************************/\n" ) - write( "\n" ) - write( "\n" ) - write( " /* This file has been generated automatically -- do not edit! */\n" ) - write( "\n" ) - write( "\n" ) - - # dump final glyph list (mac extras + sid standard names) - # - st = StringTable( base_list, "ft_standard_glyph_names" ) - - st.dump( file ) - st.dump_sublist( file, "ft_mac_names", - "FT_NUM_MAC_NAMES", mac_standard_names ) - st.dump_sublist( file, "ft_sid_names", - "FT_NUM_SID_NAMES", sid_standard_names ) - - dump_encoding( file, "t1_standard_encoding", t1_standard_encoding ) - dump_encoding( file, "t1_expert_encoding", t1_expert_encoding ) - - # dump the AGL in its compressed form - # - agl_glyphs, agl_values = adobe_glyph_values() - dict = StringNode( "", 0 ) - - for g in range( len( agl_glyphs ) ): - dict.add( agl_glyphs[g], eval( "0x" + agl_values[g] ) ) - - dict = dict.optimize() - dict_len = dict.locate( 0 ) - dict_array = dict.store( "" ) - - write( """\ - /* - * This table is a compressed version of the Adobe Glyph List (AGL), - * optimized for efficient searching. It has been generated by the - * `glnames.py' python script located in the `src/tools' directory. - * - * The lookup function to get the Unicode value for a given string - * is defined below the table. - */ - -#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - -""" ) - - dump_array( dict_array, write, "ft_adobe_glyph_list" ) - - # write the lookup routine now - # - write( """\ - /* - * This function searches the compressed table efficiently. - */ - static unsigned long - ft_get_adobe_glyph_index( const char* name, - const char* limit ) - { - int c = 0; - int count, min, max; - const unsigned char* p = ft_adobe_glyph_list; - - - if ( name == 0 || name >= limit ) - goto NotFound; - - c = *name++; - count = p[1]; - p += 2; - - min = 0; - max = count; - - while ( min < max ) - { - int mid = ( min + max ) >> 1; - const unsigned char* q = p + mid * 2; - int c2; - - - q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] ); - - c2 = q[0] & 127; - if ( c2 == c ) - { - p = q; - goto Found; - } - if ( c2 < c ) - min = mid + 1; - else - max = mid; - } - goto NotFound; - - Found: - for (;;) - { - /* assert (*p & 127) == c */ - - if ( name >= limit ) - { - if ( (p[0] & 128) == 0 && - (p[1] & 128) != 0 ) - return (unsigned long)( ( (int)p[2] << 8 ) | p[3] ); - - goto NotFound; - } - c = *name++; - if ( p[0] & 128 ) - { - p++; - if ( c != (p[0] & 127) ) - goto NotFound; - - continue; - } - - p++; - count = p[0] & 127; - if ( p[0] & 128 ) - p += 2; - - p++; - - for ( ; count > 0; count--, p += 2 ) - { - int offset = ( (int)p[0] << 8 ) | p[1]; - const unsigned char* q = ft_adobe_glyph_list + offset; - - if ( c == ( q[0] & 127 ) ) - { - p = q; - goto NextIter; - } - } - goto NotFound; - - NextIter: - ; - } - - NotFound: - return 0; - } - -#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ - -""" ) - - if 0: # generate unit test, or don't - # - # now write the unit test to check that everything works OK - # - write( "#ifdef TEST\n\n" ) - - write( "static const char* const the_names[] = {\n" ) - for name in agl_glyphs: - write( ' "' + name + '",\n' ) - write( " 0\n};\n" ) - - write( "static const unsigned long the_values[] = {\n" ) - for val in agl_values: - write( ' 0x' + val + ',\n' ) - write( " 0\n};\n" ) - - write( """ -#include -#include - - int - main( void ) - { - int result = 0; - const char* const* names = the_names; - const unsigned long* values = the_values; - - - for ( ; *names; names++, values++ ) - { - const char* name = *names; - unsigned long reference = *values; - unsigned long value; - - - value = ft_get_adobe_glyph_index( name, name + strlen( name ) ); - if ( value != reference ) - { - result = 1; - fprintf( stderr, "name '%s' => %04x instead of %04x\\n", - name, value, reference ); - } - } - - return result; - } -""" ) - - write( "#endif /* TEST */\n" ) - - write("\n/* END */\n") - - -# Now run the main routine -# -main() - - -# END diff --git a/3party/freetype/src/tools/no-copyright b/3party/freetype/src/tools/no-copyright deleted file mode 100644 index 5011e3fb62..0000000000 --- a/3party/freetype/src/tools/no-copyright +++ /dev/null @@ -1,61 +0,0 @@ -# Files that don't get a copyright, or which are taken from elsewhere. -# -# All lines in this file are patterns, including the comment lines; this -# means that e.g. `FTL.TXT' matches all files that have this string in -# the file name (including the path relative to the current directory, -# always starting with `./'). -# -# Don't put empty lines into this file! -# -.gitignore -# -builds/unix/pkg.m4 -# -docs/FTL.TXT -docs/GPLv2.TXT -# -src/base/md5.c -src/base/md5.h -# -src/bdf/bdf.c -src/bdf/bdf.h -src/bdf/bdfdrivr.c -src/bdf/bdfdrivr.h -src/bdf/bdferror.h -src/bdf/bdflib.c -src/bdf/module.mk -src/bdf/README -src/bdf/rules.mk -# -src/pcf/module.mk -src/pcf/pcf.c -src/pcf/pcf.h -src/pcf/pcfdrivr.c -src/pcf/pcfdrivr.h -src/pcf/pcferror.h -src/pcf/pcfread.c -src/pcf/pcfread.h -src/pcf/pcfutil.c -src/pcf/pcfutil.h -src/pcf/README -src/pcf/rules.mk -# -src/gzip/adler32.c -src/gzip/infblock.c -src/gzip/infblock.h -src/gzip/infcodes.c -src/gzip/infcodes.h -src/gzip/inffixed.h -src/gzip/inflate.c -src/gzip/inftrees.c -src/gzip/inftrees.h -src/gzip/infutil.c -src/gzip/infutil.h -src/gzip/zconf.h -src/gzip/zlib.h -src/gzip/zutil.c -src/gzip/zutil.h -# -src/tools/ftrandom/ftrandom.c -# -# EOF diff --git a/3party/freetype/src/tools/test_afm.c b/3party/freetype/src/tools/test_afm.c deleted file mode 100644 index 8de619bb03..0000000000 --- a/3party/freetype/src/tools/test_afm.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - * gcc -DFT2_BUILD_LIBRARY -I../../include -o test_afm test_afm.c \ - * -L../../objs/.libs -lfreetype -lz -static - */ -#include -#include FT_FREETYPE_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H - - void dump_fontinfo( AFM_FontInfo fi ) - { - FT_UInt i; - - - printf( "This AFM is for %sCID font.\n\n", - ( fi->IsCIDFont ) ? "" : "non-" ); - - printf( "FontBBox: %.2f %.2f %.2f %.2f\n", fi->FontBBox.xMin / 65536., - fi->FontBBox.yMin / 65536., - fi->FontBBox.xMax / 65536., - fi->FontBBox.yMax / 65536. ); - printf( "Ascender: %.2f\n", fi->Ascender / 65536. ); - printf( "Descender: %.2f\n\n", fi->Descender / 65536. ); - - if ( fi->NumTrackKern ) - printf( "There are %d sets of track kernings:\n", - fi->NumTrackKern ); - else - printf( "There is no track kerning.\n" ); - - for ( i = 0; i < fi->NumTrackKern; i++ ) - { - AFM_TrackKern tk = fi->TrackKerns + i; - - - printf( "\t%2d: %5.2f %5.2f %5.2f %5.2f\n", tk->degree, - tk->min_ptsize / 65536., - tk->min_kern / 65536., - tk->max_ptsize / 65536., - tk->max_kern / 65536. ); - } - - printf( "\n" ); - - if ( fi->NumKernPair ) - printf( "There are %d kerning pairs:\n", - fi->NumKernPair ); - else - printf( "There is no kerning pair.\n" ); - - for ( i = 0; i < fi->NumKernPair; i++ ) - { - AFM_KernPair kp = fi->KernPairs + i; - - - printf( "\t%3d + %3d => (%4d, %4d)\n", kp->index1, - kp->index2, - kp->x, - kp->y ); - } - - } - - int - dummy_get_index( const char* name, - FT_Offset len, - void* user_data ) - { - if ( len ) - return name[0]; - else - return 0; - } - - FT_Error - parse_afm( FT_Library library, - FT_Stream stream, - AFM_FontInfo fi ) - { - PSAux_Service psaux; - AFM_ParserRec parser; - FT_Error error = FT_Err_Ok; - - - psaux = (PSAux_Service)FT_Get_Module_Interface( library, "psaux" ); - if ( !psaux || !psaux->afm_parser_funcs ) - return -1; - - error = FT_Stream_EnterFrame( stream, stream->size ); - if ( error ) - return error; - - error = psaux->afm_parser_funcs->init( &parser, - library->memory, - stream->cursor, - stream->limit ); - if ( error ) - return error; - - parser.FontInfo = fi; - parser.get_index = dummy_get_index; - - error = psaux->afm_parser_funcs->parse( &parser ); - - psaux->afm_parser_funcs->done( &parser ); - - return error; - } - - - int main( int argc, - char** argv ) - { - FT_Library library; - FT_StreamRec stream; - FT_Error error = FT_Err_Ok; - AFM_FontInfoRec fi; - - - if ( argc < 2 ) - return FT_ERR( Invalid_Argument ); - - error = FT_Init_FreeType( &library ); - if ( error ) - return error; - - FT_ZERO( &stream ); - error = FT_Stream_Open( &stream, argv[1] ); - if ( error ) - goto Exit; - stream.memory = library->memory; - - FT_ZERO( &fi ); - error = parse_afm( library, &stream, &fi ); - - if ( !error ) - { - FT_Memory memory = library->memory; - - - dump_fontinfo( &fi ); - - if ( fi.KernPairs ) - FT_FREE( fi.KernPairs ); - if ( fi.TrackKerns ) - FT_FREE( fi.TrackKerns ); - } - else - printf( "parse error\n" ); - - FT_Stream_Close( &stream ); - - Exit: - FT_Done_FreeType( library ); - - return error; - } diff --git a/3party/freetype/src/tools/test_bbox.c b/3party/freetype/src/tools/test_bbox.c deleted file mode 100644 index 64b82c384b..0000000000 --- a/3party/freetype/src/tools/test_bbox.c +++ /dev/null @@ -1,188 +0,0 @@ -#include -#include FT_FREETYPE_H -#include FT_BBOX_H - - -#include /* for clock() */ - -/* SunOS 4.1.* does not define CLOCKS_PER_SEC, so include */ -/* to get the HZ macro which is the equivalent. */ -#if defined(__sun__) && !defined(SVR4) && !defined(__SVR4) -#include -#define CLOCKS_PER_SEC HZ -#endif - - static long - get_time( void ) - { - return clock() * 10000L / CLOCKS_PER_SEC; - } - - - - - /* test bbox computations */ - -#define XSCALE 65536 -#define XX(x) ((FT_Pos)(x*XSCALE)) -#define XVEC(x,y) { XX(x), XX(y) } -#define XVAL(x) ((x)/(1.0*XSCALE)) - - /* dummy outline #1 */ - static FT_Vector dummy_vec_1[4] = - { -#if 1 - XVEC( 408.9111, 535.3164 ), - XVEC( 455.8887, 634.396 ), - XVEC( -37.8765, 786.2207 ), - XVEC( 164.6074, 535.3164 ) -#else - { (FT_Int32)0x0198E93DL , (FT_Int32)0x021750FFL }, /* 408.9111, 535.3164 */ - { (FT_Int32)0x01C7E312L , (FT_Int32)0x027A6560L }, /* 455.8887, 634.3960 */ - { (FT_Int32)0xFFDA1F9EL , (FT_Int32)0x0312387FL }, /* -37.8765, 786.2207 */ - { (FT_Int32)0x00A49B7EL , (FT_Int32)0x021750FFL } /* 164.6074, 535.3164 */ -#endif - }; - - static char dummy_tag_1[4] = - { - FT_CURVE_TAG_ON, - FT_CURVE_TAG_CUBIC, - FT_CURVE_TAG_CUBIC, - FT_CURVE_TAG_ON - }; - - static short dummy_contour_1[1] = - { - 3 - }; - - static FT_Outline dummy_outline_1 = - { - 1, - 4, - dummy_vec_1, - dummy_tag_1, - dummy_contour_1, - 0 - }; - - - /* dummy outline #2 */ - static FT_Vector dummy_vec_2[4] = - { - XVEC( 100.0, 100.0 ), - XVEC( 100.0, 200.0 ), - XVEC( 200.0, 200.0 ), - XVEC( 200.0, 133.0 ) - }; - - static FT_Outline dummy_outline_2 = - { - 1, - 4, - dummy_vec_2, - dummy_tag_1, - dummy_contour_1, - 0 - }; - - - /* dummy outline #3 with bbox of [0 100 128 128] precisely */ - static FT_Vector dummy_vec_3[4] = - { - XVEC( 100.0, 127.0 ), - XVEC( 200.0, 127.0 ), - XVEC( 0.0, 136.0 ), - XVEC( 0.0, 100.0 ) - }; - - static FT_Outline dummy_outline_3 = - { - 1, - 4, - dummy_vec_3, - dummy_tag_1, - dummy_contour_1, - 0 - }; - - - static void - dump_outline( FT_Outline* outline ) - { - FT_BBox bbox; - - /* compute and display cbox */ - FT_Outline_Get_CBox( outline, &bbox ); - printf( "cbox = [%.2f %.2f %.2f %.2f]\n", - XVAL( bbox.xMin ), - XVAL( bbox.yMin ), - XVAL( bbox.xMax ), - XVAL( bbox.yMax ) ); - - /* compute and display bbox */ - FT_Outline_Get_BBox( outline, &bbox ); - printf( "bbox = [%.2f %.2f %.2f %.2f]\n", - XVAL( bbox.xMin ), - XVAL( bbox.yMin ), - XVAL( bbox.xMax ), - XVAL( bbox.yMax ) ); - } - - - - static void - profile_outline( FT_Outline* outline, - long repeat ) - { - FT_BBox bbox; - long count; - long time0; - - time0 = get_time(); - for ( count = repeat; count > 0; count-- ) - FT_Outline_Get_CBox( outline, &bbox ); - - time0 = get_time() - time0; - printf( "time = %6.3f cbox = [%8.4f %8.4f %8.4f %8.4f]\n", - ((double)time0/10000.0), - XVAL( bbox.xMin ), - XVAL( bbox.yMin ), - XVAL( bbox.xMax ), - XVAL( bbox.yMax ) ); - printf( "cbox_hex = [%08X %08X %08X %08X]\n", - bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax ); - - - time0 = get_time(); - for ( count = repeat; count > 0; count-- ) - FT_Outline_Get_BBox( outline, &bbox ); - - time0 = get_time() - time0; - printf( "time = %6.3f bbox = [%8.4f %8.4f %8.4f %8.4f]\n", - ((double)time0/10000.0), - XVAL( bbox.xMin ), - XVAL( bbox.yMin ), - XVAL( bbox.xMax ), - XVAL( bbox.yMax ) ); - printf( "bbox_hex = [%08X %08X %08X %08X]\n", - bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax ); - } - -#define REPEAT 1000000L - - int main( int argc, char** argv ) - { - printf( "outline #1\n" ); - profile_outline( &dummy_outline_1, REPEAT ); - - printf( "outline #2\n" ); - profile_outline( &dummy_outline_2, REPEAT ); - - printf( "outline #3\n" ); - profile_outline( &dummy_outline_3, REPEAT ); - - return 0; - } - diff --git a/3party/freetype/src/tools/test_trig.c b/3party/freetype/src/tools/test_trig.c deleted file mode 100644 index 99ac1cf174..0000000000 --- a/3party/freetype/src/tools/test_trig.c +++ /dev/null @@ -1,258 +0,0 @@ -#include -#include FT_FREETYPE_H -#include FT_TRIGONOMETRY_H - -#include -#include - -#define PI 3.14159265358979323846 -#define SPI (PI/FT_ANGLE_PI) - -/* the precision in 16.16 fixed-point checks. Expect between 2 and 5 */ -/* noise LSB bits during operations, due to rounding errors.. */ -#define THRESHOLD 64 - - static error = 0; - - static void - test_cos( void ) - { - int i; - - - for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L ) - { - FT_Fixed f1, f2; - double d2; - - - f1 = FT_Cos(i); - d2 = cos( i*SPI ); - f2 = (FT_Fixed)(d2*65536.0); - - if ( abs( f2-f1 ) > THRESHOLD ) - { - error = 1; - printf( "FT_Cos[%3d] = %.7f cos[%3d] = %.7f\n", - (i >> 16), f1/65536.0, (i >> 16), d2 ); - } - } - } - - - static void - test_sin( void ) - { - int i; - - - for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L ) - { - FT_Fixed f1, f2; - double d2; - - - f1 = FT_Sin(i); - d2 = sin( i*SPI ); - f2 = (FT_Fixed)(d2*65536.0); - - if ( abs( f2-f1 ) > THRESHOLD ) - { - error = 1; - printf( "FT_Sin[%3d] = %.7f sin[%3d] = %.7f\n", - (i >> 16), f1/65536.0, (i >> 16), d2 ); - } - } - } - - - static void - test_tan( void ) - { - int i; - - - for ( i = 0; i < FT_ANGLE_PI2 - 0x2000000L; i += 0x10000L ) - { - FT_Fixed f1, f2; - double d2; - - - f1 = FT_Tan(i); - d2 = tan( i*SPI ); - f2 = (FT_Fixed)(d2*65536.0); - - if ( abs( f2-f1 ) > THRESHOLD ) - { - error = 1; - printf( "FT_Tan[%3d] = %.7f tan[%3d] = %.7f\n", - (i >> 16), f1/65536.0, (i >> 16), d2 ); - } - } - } - - - static void - test_atan2( void ) - { - int i; - - - for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L ) - { - FT_Fixed c2, s2; - double l, a, c1, s1; - int j; - - - l = 5.0; - a = i*SPI; - - c1 = l * cos(a); - s1 = l * sin(a); - - c2 = (FT_Fixed)(c1*65536.0); - s2 = (FT_Fixed)(s1*65536.0); - - j = FT_Atan2( c2, s2 ); - if ( j < 0 ) - j += FT_ANGLE_2PI; - - if ( abs( i - j ) > 1 ) - { - printf( "FT_Atan2( %.7f, %.7f ) = %.5f, atan = %.5f\n", - c2/65536.0, s2/65536.0, j/65536.0, i/65536.0 ); - } - } - } - - - static void - test_unit( void ) - { - int i; - - - for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L ) - { - FT_Vector v; - double a, c1, s1; - FT_Fixed c2, s2; - - - FT_Vector_Unit( &v, i ); - a = ( i*SPI ); - c1 = cos(a); - s1 = sin(a); - c2 = (FT_Fixed)(c1*65536.0); - s2 = (FT_Fixed)(s1*65536.0); - - if ( abs( v.x-c2 ) > THRESHOLD || - abs( v.y-s2 ) > THRESHOLD ) - { - error = 1; - printf( "FT_Vector_Unit[%3d] = ( %.7f, %.7f ) vec = ( %.7f, %.7f )\n", - (i >> 16), - v.x/65536.0, v.y/65536.0, - c1, s1 ); - } - } - } - - - static void - test_length( void ) - { - int i; - - - for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L ) - { - FT_Vector v; - FT_Fixed l, l2; - - - l = (FT_Fixed)(500.0*65536.0); - v.x = (FT_Fixed)( l * cos( i*SPI ) ); - v.y = (FT_Fixed)( l * sin( i*SPI ) ); - l2 = FT_Vector_Length( &v ); - - if ( abs( l2-l ) > THRESHOLD ) - { - error = 1; - printf( "FT_Length( %.7f, %.7f ) = %.5f, length = %.5f\n", - v.x/65536.0, v.y/65536.0, l2/65536.0, l/65536.0 ); - } - } - } - - - static void - test_rotate( void ) - { - int rotate; - - - for ( rotate = 0; rotate < FT_ANGLE_2PI; rotate += 0x10000L ) - { - double ra, cra, sra; - int i; - - - ra = rotate*SPI; - cra = cos( ra ); - sra = sin( ra ); - - for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L ) - { - FT_Fixed c2, s2, c4, s4; - FT_Vector v; - double l, a, c1, s1, c3, s3; - - - l = 500.0; - a = i*SPI; - - c1 = l * cos(a); - s1 = l * sin(a); - - v.x = c2 = (FT_Fixed)(c1*65536.0); - v.y = s2 = (FT_Fixed)(s1*65536.0); - - FT_Vector_Rotate( &v, rotate ); - - c3 = c1 * cra - s1 * sra; - s3 = c1 * sra + s1 * cra; - - c4 = (FT_Fixed)(c3*65536.0); - s4 = (FT_Fixed)(s3*65536.0); - - if ( abs( c4 - v.x ) > THRESHOLD || - abs( s4 - v.y ) > THRESHOLD ) - { - error = 1; - printf( "FT_Rotate( (%.7f,%.7f), %.5f ) = ( %.7f, %.7f ), rot = ( %.7f, %.7f )\n", - c1, s1, ra, - c2/65536.0, s2/65536.0, - c4/65536.0, s4/65536.0 ); - } - } - } - } - - - int main( void ) - { - test_cos(); - test_sin(); - test_tan(); - test_atan2(); - test_unit(); - test_length(); - test_rotate(); - - if (!error) - printf( "trigonometry test ok !\n" ); - - return !error; - } diff --git a/3party/freetype/src/tools/update-copyright b/3party/freetype/src/tools/update-copyright deleted file mode 100755 index 4a8bf9b0ea..0000000000 --- a/3party/freetype/src/tools/update-copyright +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -# Run the `update-copyright-year' script on all files in the git repository, -# taking care of exceptions stored in file `no-copyright'. - -topdir=`git rev-parse --show-toplevel` -toolsdir=$topdir/src/tools - -git ls-files --full-name $topdir \ -| sed 's|^|../../|' \ -| grep -vFf $toolsdir/no-copyright \ -| xargs $toolsdir/update-copyright-year - -# EOF diff --git a/3party/freetype/src/tools/update-copyright-year b/3party/freetype/src/tools/update-copyright-year deleted file mode 100755 index 107754183d..0000000000 --- a/3party/freetype/src/tools/update-copyright-year +++ /dev/null @@ -1,135 +0,0 @@ -eval '(exit $?0)' && eval 'exec perl -wS -i "$0" ${1+"$@"}' - & eval 'exec perl -wS -i "$0" $argv:q' - if 0; - -# Copyright 2015 by -# 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. - -# [Note: This script is expected to be called by the shell, which in turn -# calls perl automatically. The nifty start-up code above is based on -# gnulib's `update-copyright' script; it is a more portable replacement for -# the shebang, using the first `perl' program in the shell's path instead.] - -# Usage: -# -# update-copyright-year file1 [file2 ...] - - -# This script handles copyright entries like -# -# Copyright 2000 by -# foobar -# -# or -# -# /* Copyright 2000, 2001, 2004-2007 by */ -# /* foobar */ -# -# and replaces them uniformly with -# -# Copyright 2000-2015 -# foobar -# -# and -# -# /* Copyright 2000-2015 by */ -# /* foobar */ -# -# (assuming that the current year is 2015). As can be seen, the line length -# is retained if there is non-whitespace after the word `by' on the same -# line. - -use strict; - - -my (undef, undef, undef, - undef, undef, $year, - undef, undef, undef) = localtime(time); -$year += 1900; - -my $replaced = 0; - - -# Loop over all input files; option `-i' (issued at the very beginning of -# this script) makes perl edit them in-place. -while (<>) -{ - # Only handle the first copyright notice in a file. - if (!$replaced) - { - # First try: Search multiple copyright years. - s { - (?.*) - Copyright - (?\ +) - (?[12][0-9][0-9][0-9]) - (?.+) - (?[12][0-9][0-9][0-9]) - (?\ +) - by - (?\ *) - (?.*) - } - { - # Fill line to the same length (if appropriate); we skip the middle - # part but insert two spaces and `-'. - my $space = length($+{space1}) - 1 - + length($+{middle}) - 1 - + length($+{space2}) - 1 - + length($+{space3}); - - print "$+{begin}"; - print "Copyright\ $+{first}-$year\ by"; - print ' ' x $space if length($+{end}); - print "$+{end}\n"; - $replaced = 1; - }ex - || - # Second try: Search a single copyright year. - s { - (?.*) - Copyright - (?\ +) - (?[12][0-9][0-9][0-9]) - (?\ +) - by - (?\ *) - (?.*) - } - { - # Fill line to the same length (if appropriate); we insert two - # spaces, a `-', and the current year. - my $space = length($+{space1}) - 1 - + length($+{space2}) - 1 - + length($+{space3}) - - (length($year) + 1); - - print "$+{begin}"; - print "Copyright $+{first}-$year by"; - # If $space is negative this inserts nothing. - print ' ' x $space if length($+{end}); - print "$+{end}\n"; - $replaced = 1; - }ex - || - # Otherwise print line unaltered. - print; - } - else - { - print; - } -} -continue -{ - # Reset $replaced before processing the next file. - $replaced = 0 if eof; -} - -# EOF diff --git a/3party/freetype/src/truetype/Jamfile b/3party/freetype/src/truetype/Jamfile deleted file mode 100644 index 88cc26f2b1..0000000000 --- a/3party/freetype/src/truetype/Jamfile +++ /dev/null @@ -1,37 +0,0 @@ -# FreeType 2 src/truetype Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) truetype ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = ttdriver - ttgload - ttgxvar - ttinterp - ttobjs - ttpic - ttpload - ttsubpix - ; - } - else - { - _sources = truetype ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/truetype Jamfile diff --git a/3party/freetype/src/truetype/module.mk b/3party/freetype/src/truetype/module.mk deleted file mode 100644 index c6dc6fa6e7..0000000000 --- a/3party/freetype/src/truetype/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 TrueType module definition -# - - -# Copyright 1996-2015 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. - - -FTMODULE_H_COMMANDS += TRUETYPE_DRIVER - -define TRUETYPE_DRIVER -$(OPEN_DRIVER) FT_Driver_ClassRec, tt_driver_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)truetype $(ECHO_DRIVER_DESC)Windows/Mac font files with extension *.ttf or *.ttc$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/truetype/rules.mk b/3party/freetype/src/truetype/rules.mk deleted file mode 100644 index 1db16ba35f..0000000000 --- a/3party/freetype/src/truetype/rules.mk +++ /dev/null @@ -1,77 +0,0 @@ -# -# FreeType 2 TrueType driver configuration rules -# - - -# Copyright 1996-2015 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. - - -# TrueType driver directory -# -TT_DIR := $(SRC_DIR)/truetype - - -# compilation flags for the driver -# -TT_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(TT_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# TrueType driver sources (i.e., C files) -# -TT_DRV_SRC := $(TT_DIR)/ttdriver.c \ - $(TT_DIR)/ttgload.c \ - $(TT_DIR)/ttgxvar.c \ - $(TT_DIR)/ttinterp.c \ - $(TT_DIR)/ttobjs.c \ - $(TT_DIR)/ttpic.c \ - $(TT_DIR)/ttpload.c \ - $(TT_DIR)/ttsubpix.c - -# TrueType driver headers -# -TT_DRV_H := $(TT_DRV_SRC:%.c=%.h) \ - $(TT_DIR)/tterrors.h - - -# TrueType driver object(s) -# -# TT_DRV_OBJ_M is used during `multi' builds -# TT_DRV_OBJ_S is used during `single' builds -# -TT_DRV_OBJ_M := $(TT_DRV_SRC:$(TT_DIR)/%.c=$(OBJ_DIR)/%.$O) -TT_DRV_OBJ_S := $(OBJ_DIR)/truetype.$O - -# TrueType driver source file for single build -# -TT_DRV_SRC_S := $(TT_DIR)/truetype.c - - -# TrueType driver - single object -# -$(TT_DRV_OBJ_S): $(TT_DRV_SRC_S) $(TT_DRV_SRC) $(FREETYPE_H) $(TT_DRV_H) - $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(TT_DRV_SRC_S)) - - -# driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(TT_DIR)/%.c $(FREETYPE_H) $(TT_DRV_H) - $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(TT_DRV_OBJ_S) -DRV_OBJS_M += $(TT_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/truetype/truetype.c b/3party/freetype/src/truetype/truetype.c deleted file mode 100644 index f929437dc1..0000000000 --- a/3party/freetype/src/truetype/truetype.c +++ /dev/null @@ -1,38 +0,0 @@ -/***************************************************************************/ -/* */ -/* truetype.c */ -/* */ -/* FreeType TrueType driver component (body only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include -#include "ttpic.c" -#include "ttdriver.c" /* driver interface */ -#include "ttpload.c" /* tables loader */ -#include "ttgload.c" /* glyph loader */ -#include "ttobjs.c" /* object manager */ - -#ifdef TT_USE_BYTECODE_INTERPRETER -#include "ttinterp.c" -#include "ttsubpix.c" -#endif - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include "ttgxvar.c" /* gx distortable font */ -#endif - - -/* END */ diff --git a/3party/freetype/src/truetype/ttdriver.c b/3party/freetype/src/truetype/ttdriver.c deleted file mode 100644 index 08b30c95ad..0000000000 --- a/3party/freetype/src/truetype/ttdriver.c +++ /dev/null @@ -1,565 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttdriver.c */ -/* */ -/* TrueType font driver implementation (body). */ -/* */ -/* Copyright 1996-2015 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 FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_SERVICE_FONT_FORMAT_H - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include FT_MULTIPLE_MASTERS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H -#endif - -#include FT_SERVICE_TRUETYPE_ENGINE_H -#include FT_SERVICE_TRUETYPE_GLYF_H -#include FT_SERVICE_PROPERTIES_H -#include FT_TRUETYPE_DRIVER_H - -#include "ttdriver.h" -#include "ttgload.h" -#include "ttpload.h" - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include "ttgxvar.h" -#endif - -#include "tterrors.h" - -#include "ttpic.h" - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttdriver - - - /* - * PROPERTY SERVICE - * - */ - static FT_Error - tt_property_set( FT_Module module, /* TT_Driver */ - const char* property_name, - const void* value ) - { - FT_Error error = FT_Err_Ok; - TT_Driver driver = (TT_Driver)module; - - - if ( !ft_strcmp( property_name, "interpreter-version" ) ) - { - FT_UInt* interpreter_version = (FT_UInt*)value; - - -#ifndef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( *interpreter_version != TT_INTERPRETER_VERSION_35 ) - error = FT_ERR( Unimplemented_Feature ); - else -#endif - driver->interpreter_version = *interpreter_version; - - return error; - } - - FT_TRACE0(( "tt_property_set: missing property `%s'\n", - property_name )); - return FT_THROW( Missing_Property ); - } - - - static FT_Error - tt_property_get( FT_Module module, /* TT_Driver */ - const char* property_name, - const void* value ) - { - FT_Error error = FT_Err_Ok; - TT_Driver driver = (TT_Driver)module; - - FT_UInt interpreter_version = driver->interpreter_version; - - - if ( !ft_strcmp( property_name, "interpreter-version" ) ) - { - FT_UInt* val = (FT_UInt*)value; - - - *val = interpreter_version; - - return error; - } - - FT_TRACE0(( "tt_property_get: missing property `%s'\n", - property_name )); - return FT_THROW( Missing_Property ); - } - - - FT_DEFINE_SERVICE_PROPERTIESREC( - tt_service_properties, - (FT_Properties_SetFunc)tt_property_set, - (FT_Properties_GetFunc)tt_property_get ) - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** F A C E S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* tt_get_kerning */ - /* */ - /* */ - /* A driver method used to return the kerning vector between two */ - /* glyphs of the same face. */ - /* */ - /* */ - /* face :: A handle to the source face object. */ - /* */ - /* left_glyph :: The index of the left glyph in the kern pair. */ - /* */ - /* right_glyph :: The index of the right glyph in the kern pair. */ - /* */ - /* */ - /* kerning :: The kerning vector. This is in font units for */ - /* scalable formats, and in pixels for fixed-sizes */ - /* formats. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* */ - /* Only horizontal layouts (left-to-right & right-to-left) are */ - /* supported by this function. Other layouts, or more sophisticated */ - /* kernings, are out of scope of this method (the basic driver */ - /* interface is meant to be simple). */ - /* */ - /* They can be implemented by format-specific interfaces. */ - /* */ - static FT_Error - tt_get_kerning( FT_Face ttface, /* TT_Face */ - FT_UInt left_glyph, - FT_UInt right_glyph, - FT_Vector* kerning ) - { - TT_Face face = (TT_Face)ttface; - SFNT_Service sfnt = (SFNT_Service)face->sfnt; - - - kerning->x = 0; - kerning->y = 0; - - if ( sfnt ) - kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); - - return 0; - } - - - static FT_Error - tt_get_advances( FT_Face ttface, - FT_UInt start, - FT_UInt count, - FT_Int32 flags, - FT_Fixed *advances ) - { - FT_UInt nn; - TT_Face face = (TT_Face) ttface; - - - /* XXX: TODO: check for sbits */ - - if ( flags & FT_LOAD_VERTICAL_LAYOUT ) - { - for ( nn = 0; nn < count; nn++ ) - { - FT_Short tsb; - FT_UShort ah; - - - /* since we don't need `tsb', we use zero for `yMax' parameter */ - TT_Get_VMetrics( face, start + nn, 0, &tsb, &ah ); - advances[nn] = ah; - } - } - else - { - for ( nn = 0; nn < count; nn++ ) - { - FT_Short lsb; - FT_UShort aw; - - - TT_Get_HMetrics( face, start + nn, &lsb, &aw ); - advances[nn] = aw; - } - } - - return FT_Err_Ok; - } - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** S I Z E S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - static FT_Error - tt_size_select( FT_Size size, - FT_ULong strike_index ) - { - TT_Face ttface = (TT_Face)size->face; - TT_Size ttsize = (TT_Size)size; - FT_Error error = FT_Err_Ok; - - - ttsize->strike_index = strike_index; - - if ( FT_IS_SCALABLE( size->face ) ) - { - /* use the scaled metrics, even when tt_size_reset fails */ - FT_Select_Metrics( size->face, strike_index ); - - tt_size_reset( ttsize ); /* ignore return value */ - } - else - { - SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; - FT_Size_Metrics* metrics = &size->metrics; - - - error = sfnt->load_strike_metrics( ttface, strike_index, metrics ); - if ( error ) - ttsize->strike_index = 0xFFFFFFFFUL; - } - - return error; - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - - static FT_Error - tt_size_request( FT_Size size, - FT_Size_Request req ) - { - TT_Size ttsize = (TT_Size)size; - FT_Error error = FT_Err_Ok; - - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - if ( FT_HAS_FIXED_SIZES( size->face ) ) - { - TT_Face ttface = (TT_Face)size->face; - SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; - FT_ULong strike_index; - - - error = sfnt->set_sbit_strike( ttface, req, &strike_index ); - - if ( error ) - ttsize->strike_index = 0xFFFFFFFFUL; - else - return tt_size_select( size, strike_index ); - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - FT_Request_Metrics( size->face, req ); - - if ( FT_IS_SCALABLE( size->face ) ) - { - error = tt_size_reset( ttsize ); - ttsize->root.metrics = ttsize->metrics; - } - - return error; - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_glyph_load */ - /* */ - /* */ - /* A driver method used to load a glyph within a given glyph slot. */ - /* */ - /* */ - /* slot :: A handle to the target slot object where the glyph */ - /* will be loaded. */ - /* */ - /* size :: A handle to the source face size at which the glyph */ - /* must be scaled, loaded, etc. */ - /* */ - /* glyph_index :: The index of the glyph in the font file. */ - /* */ - /* load_flags :: A flag indicating what to load for this glyph. The */ - /* FT_LOAD_XXX constants can be used to control the */ - /* glyph loading process (e.g., whether the outline */ - /* should be scaled, whether to load bitmaps or not, */ - /* whether to hint the outline, etc). */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - tt_glyph_load( FT_GlyphSlot ttslot, /* TT_GlyphSlot */ - FT_Size ttsize, /* TT_Size */ - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - TT_GlyphSlot slot = (TT_GlyphSlot)ttslot; - TT_Size size = (TT_Size)ttsize; - FT_Face face = ttslot->face; - FT_Error error; - - - if ( !slot ) - return FT_THROW( Invalid_Slot_Handle ); - - if ( !size ) - return FT_THROW( Invalid_Size_Handle ); - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - if ( glyph_index >= (FT_UInt)face->num_glyphs && - !face->internal->incremental_interface ) -#else - if ( glyph_index >= (FT_UInt)face->num_glyphs ) -#endif - return FT_THROW( Invalid_Argument ); - - if ( load_flags & FT_LOAD_NO_HINTING ) - { - /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT */ - /* are necessary to disable hinting for tricky fonts */ - - if ( FT_IS_TRICKY( face ) ) - load_flags &= ~FT_LOAD_NO_HINTING; - - if ( load_flags & FT_LOAD_NO_AUTOHINT ) - load_flags |= FT_LOAD_NO_HINTING; - } - - if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) ) - { - load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE; - - if ( !FT_IS_TRICKY( face ) ) - load_flags |= FT_LOAD_NO_HINTING; - } - - /* now load the glyph outline if necessary */ - error = TT_Load_Glyph( size, slot, glyph_index, load_flags ); - - /* force drop-out mode to 2 - irrelevant now */ - /* slot->outline.dropout_mode = 2; */ - - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** D R I V E R I N T E R F A C E ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_DEFINE_SERVICE_MULTIMASTERSREC( - tt_service_gx_multi_masters, - (FT_Get_MM_Func) NULL, - (FT_Set_MM_Design_Func) NULL, - (FT_Set_MM_Blend_Func) TT_Set_MM_Blend, - (FT_Get_MM_Var_Func) TT_Get_MM_Var, - (FT_Set_Var_Design_Func)TT_Set_Var_Design ) -#endif - - static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine = - { -#ifdef TT_USE_BYTECODE_INTERPRETER - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - FT_TRUETYPE_ENGINE_TYPE_UNPATENTED -#else - FT_TRUETYPE_ENGINE_TYPE_PATENTED -#endif - -#else /* !TT_USE_BYTECODE_INTERPRETER */ - - FT_TRUETYPE_ENGINE_TYPE_NONE - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - }; - - FT_DEFINE_SERVICE_TTGLYFREC( - tt_service_truetype_glyf, - (TT_Glyf_GetLocationFunc)tt_face_get_location ) - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_DEFINE_SERVICEDESCREC5( - tt_services, - FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TRUETYPE, - FT_SERVICE_ID_MULTI_MASTERS, &TT_SERVICE_GX_MULTI_MASTERS_GET, - FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, - FT_SERVICE_ID_TT_GLYF, &TT_SERVICE_TRUETYPE_GLYF_GET, - FT_SERVICE_ID_PROPERTIES, &TT_SERVICE_PROPERTIES_GET ) -#else - FT_DEFINE_SERVICEDESCREC4( - tt_services, - FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TRUETYPE, - FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, - FT_SERVICE_ID_TT_GLYF, &TT_SERVICE_TRUETYPE_GLYF_GET, - FT_SERVICE_ID_PROPERTIES, &TT_SERVICE_PROPERTIES_GET ) -#endif - - - FT_CALLBACK_DEF( FT_Module_Interface ) - tt_get_interface( FT_Module driver, /* TT_Driver */ - const char* tt_interface ) - { - FT_Library library; - FT_Module_Interface result; - FT_Module sfntd; - SFNT_Service sfnt; - - - /* TT_SERVICES_GET dereferences `library' in PIC mode */ -#ifdef FT_CONFIG_OPTION_PIC - if ( !driver ) - return NULL; - library = driver->library; - if ( !library ) - return NULL; -#endif - - result = ft_service_list_lookup( TT_SERVICES_GET, tt_interface ); - if ( result != NULL ) - return result; - -#ifndef FT_CONFIG_OPTION_PIC - if ( !driver ) - return NULL; - library = driver->library; - if ( !library ) - return NULL; -#endif - - /* only return the default interface from the SFNT module */ - sfntd = FT_Get_Module( library, "sfnt" ); - if ( sfntd ) - { - sfnt = (SFNT_Service)( sfntd->clazz->module_interface ); - if ( sfnt ) - return sfnt->get_interface( driver, tt_interface ); - } - - return 0; - } - - - /* The FT_DriverInterface structure is defined in ftdriver.h. */ - -#ifdef TT_USE_BYTECODE_INTERPRETER -#define TT_HINTER_FLAG FT_MODULE_DRIVER_HAS_HINTER -#else -#define TT_HINTER_FLAG 0 -#endif - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS -#define TT_SIZE_SELECT tt_size_select -#else -#define TT_SIZE_SELECT 0 -#endif - - FT_DEFINE_DRIVER( - tt_driver_class, - - FT_MODULE_FONT_DRIVER | - FT_MODULE_DRIVER_SCALABLE | - TT_HINTER_FLAG, - - sizeof ( TT_DriverRec ), - - "truetype", /* driver name */ - 0x10000L, /* driver version == 1.0 */ - 0x20000L, /* driver requires FreeType 2.0 or above */ - - (void*)0, /* driver specific interface */ - - tt_driver_init, - tt_driver_done, - tt_get_interface, - - sizeof ( TT_FaceRec ), - sizeof ( TT_SizeRec ), - sizeof ( FT_GlyphSlotRec ), - - tt_face_init, - tt_face_done, - tt_size_init, - tt_size_done, - tt_slot_init, - 0, /* FT_Slot_DoneFunc */ - - tt_glyph_load, - - tt_get_kerning, - 0, /* FT_Face_AttachFunc */ - tt_get_advances, - - tt_size_request, - TT_SIZE_SELECT - ) - - -/* END */ diff --git a/3party/freetype/src/truetype/ttdriver.h b/3party/freetype/src/truetype/ttdriver.h deleted file mode 100644 index 6cacd60966..0000000000 --- a/3party/freetype/src/truetype/ttdriver.h +++ /dev/null @@ -1,38 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttdriver.h */ -/* */ -/* High-level TrueType driver interface (specification). */ -/* */ -/* Copyright 1996-2015 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 __TTDRIVER_H__ -#define __TTDRIVER_H__ - - -#include -#include FT_INTERNAL_DRIVER_H - - -FT_BEGIN_HEADER - - - FT_DECLARE_DRIVER( tt_driver_class ) - - -FT_END_HEADER - -#endif /* __TTDRIVER_H__ */ - - -/* END */ diff --git a/3party/freetype/src/truetype/tterrors.h b/3party/freetype/src/truetype/tterrors.h deleted file mode 100644 index ba32cf744c..0000000000 --- a/3party/freetype/src/truetype/tterrors.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* tterrors.h */ -/* */ -/* TrueType error codes (specification only). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the TrueType error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __TTERRORS_H__ -#define __TTERRORS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX TT_Err_ -#define FT_ERR_BASE FT_Mod_Err_TrueType - -#include FT_ERRORS_H - -#endif /* __TTERRORS_H__ */ - -/* END */ diff --git a/3party/freetype/src/truetype/ttgload.c b/3party/freetype/src/truetype/ttgload.c deleted file mode 100644 index 61951b4d25..0000000000 --- a/3party/freetype/src/truetype/ttgload.c +++ /dev/null @@ -1,2559 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttgload.c */ -/* */ -/* TrueType Glyph Loader (body). */ -/* */ -/* Copyright 1996-2015 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 FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_TRUETYPE_TAGS_H -#include FT_OUTLINE_H -#include FT_TRUETYPE_DRIVER_H - -#include "ttgload.h" -#include "ttpload.h" - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include "ttgxvar.h" -#endif - -#include "tterrors.h" -#include "ttsubpix.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttgload - - - /*************************************************************************/ - /* */ - /* Composite glyph flags. */ - /* */ -#define ARGS_ARE_WORDS 0x0001 -#define ARGS_ARE_XY_VALUES 0x0002 -#define ROUND_XY_TO_GRID 0x0004 -#define WE_HAVE_A_SCALE 0x0008 -/* reserved 0x0010 */ -#define MORE_COMPONENTS 0x0020 -#define WE_HAVE_AN_XY_SCALE 0x0040 -#define WE_HAVE_A_2X2 0x0080 -#define WE_HAVE_INSTR 0x0100 -#define USE_MY_METRICS 0x0200 -#define OVERLAP_COMPOUND 0x0400 -#define SCALED_COMPONENT_OFFSET 0x0800 -#define UNSCALED_COMPONENT_OFFSET 0x1000 - - - /*************************************************************************/ - /* */ - /* Return the horizontal metrics in font units for a given glyph. */ - /* */ - FT_LOCAL_DEF( void ) - TT_Get_HMetrics( TT_Face face, - FT_UInt idx, - FT_Short* lsb, - FT_UShort* aw ) - { - ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw ); - - FT_TRACE5(( " advance width (font units): %d\n", *aw )); - FT_TRACE5(( " left side bearing (font units): %d\n", *lsb )); - } - - - /*************************************************************************/ - /* */ - /* Return the vertical metrics in font units for a given glyph. */ - /* See macro `TT_LOADER_SET_PP' below for explanations. */ - /* */ - FT_LOCAL_DEF( void ) - TT_Get_VMetrics( TT_Face face, - FT_UInt idx, - FT_Pos yMax, - FT_Short* tsb, - FT_UShort* ah ) - { - if ( face->vertical_info ) - ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah ); - - else if ( face->os2.version != 0xFFFFU ) - { - *tsb = (FT_Short)( face->os2.sTypoAscender - yMax ); - *ah = (FT_UShort)FT_ABS( face->os2.sTypoAscender - - face->os2.sTypoDescender ); - } - - else - { - *tsb = (FT_Short)( face->horizontal.Ascender - yMax ); - *ah = (FT_UShort)FT_ABS( face->horizontal.Ascender - - face->horizontal.Descender ); - } - - FT_TRACE5(( " advance height (font units): %d\n", *ah )); - FT_TRACE5(( " top side bearing (font units): %d\n", *tsb )); - } - - - static FT_Error - tt_get_metrics( TT_Loader loader, - FT_UInt glyph_index ) - { - TT_Face face = loader->face; -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); -#endif - - FT_Error error; - FT_Stream stream = loader->stream; - - FT_Short left_bearing = 0, top_bearing = 0; - FT_UShort advance_width = 0, advance_height = 0; - - /* we must preserve the stream position */ - /* (which gets altered by the metrics functions) */ - FT_ULong pos = FT_STREAM_POS(); - - - TT_Get_HMetrics( face, glyph_index, - &left_bearing, - &advance_width ); - TT_Get_VMetrics( face, glyph_index, - loader->bbox.yMax, - &top_bearing, - &advance_height ); - - if ( FT_STREAM_SEEK( pos ) ) - return error; - - loader->left_bearing = left_bearing; - loader->advance = advance_width; - loader->top_bearing = top_bearing; - loader->vadvance = advance_height; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - 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 */ - /* backwards compatibility mode on and off. */ - sph_set_tweaks( loader, glyph_index ); - } -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - if ( !loader->linear_def ) - { - loader->linear_def = 1; - loader->linear = advance_width; - } - - return FT_Err_Ok; - } - - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - static void - tt_get_metrics_incr_overrides( TT_Loader loader, - FT_UInt glyph_index ) - { - TT_Face face = loader->face; - - FT_Short left_bearing = 0, top_bearing = 0; - FT_UShort advance_width = 0, advance_height = 0; - - - /* If this is an incrementally loaded font check whether there are */ - /* overriding metrics for this glyph. */ - if ( face->root.internal->incremental_interface && - face->root.internal->incremental_interface->funcs->get_glyph_metrics ) - { - FT_Incremental_MetricsRec metrics; - FT_Error error; - - - metrics.bearing_x = loader->left_bearing; - metrics.bearing_y = 0; - metrics.advance = loader->advance; - metrics.advance_v = 0; - - error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( - face->root.internal->incremental_interface->object, - glyph_index, FALSE, &metrics ); - if ( error ) - goto Exit; - - left_bearing = (FT_Short)metrics.bearing_x; - advance_width = (FT_UShort)metrics.advance; - -#if 0 - - /* GWW: Do I do the same for vertical metrics? */ - metrics.bearing_x = 0; - metrics.bearing_y = loader->top_bearing; - metrics.advance = loader->vadvance; - - error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( - face->root.internal->incremental_interface->object, - glyph_index, TRUE, &metrics ); - if ( error ) - goto Exit; - - top_bearing = (FT_Short)metrics.bearing_y; - advance_height = (FT_UShort)metrics.advance; - -#endif /* 0 */ - - loader->left_bearing = left_bearing; - loader->advance = advance_width; - loader->top_bearing = top_bearing; - loader->vadvance = advance_height; - - if ( !loader->linear_def ) - { - loader->linear_def = 1; - loader->linear = advance_width; - } - } - - Exit: - return; - } - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - - /*************************************************************************/ - /* */ - /* The following functions are used by default with TrueType fonts. */ - /* However, they can be replaced by alternatives if we need to support */ - /* TrueType-compressed formats (like MicroType) in the future. */ - /* */ - /*************************************************************************/ - - FT_CALLBACK_DEF( FT_Error ) - TT_Access_Glyph_Frame( TT_Loader loader, - FT_UInt glyph_index, - FT_ULong offset, - FT_UInt byte_count ) - { - FT_Error error; - FT_Stream stream = loader->stream; - - /* for non-debug mode */ - FT_UNUSED( glyph_index ); - - - FT_TRACE4(( "Glyph %ld\n", glyph_index )); - - /* the following line sets the `error' variable through macros! */ - if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) ) - return error; - - loader->cursor = stream->cursor; - loader->limit = stream->limit; - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( void ) - TT_Forget_Glyph_Frame( TT_Loader loader ) - { - FT_Stream stream = loader->stream; - - - FT_FRAME_EXIT(); - } - - - FT_CALLBACK_DEF( FT_Error ) - TT_Load_Glyph_Header( TT_Loader loader ) - { - FT_Byte* p = loader->cursor; - FT_Byte* limit = loader->limit; - - - if ( p + 10 > limit ) - return FT_THROW( Invalid_Outline ); - - loader->n_contours = FT_NEXT_SHORT( p ); - - loader->bbox.xMin = FT_NEXT_SHORT( p ); - loader->bbox.yMin = FT_NEXT_SHORT( p ); - loader->bbox.xMax = FT_NEXT_SHORT( p ); - loader->bbox.yMax = FT_NEXT_SHORT( p ); - - FT_TRACE5(( " # of contours: %d\n", loader->n_contours )); - FT_TRACE5(( " xMin: %4d xMax: %4d\n", loader->bbox.xMin, - loader->bbox.xMax )); - FT_TRACE5(( " yMin: %4d yMax: %4d\n", loader->bbox.yMin, - loader->bbox.yMax )); - loader->cursor = p; - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_Error ) - TT_Load_Simple_Glyph( TT_Loader load ) - { - FT_Error error; - FT_Byte* p = load->cursor; - FT_Byte* limit = load->limit; - FT_GlyphLoader gloader = load->gloader; - FT_Int n_contours = load->n_contours; - FT_Outline* outline; - FT_UShort n_ins; - FT_Int n_points; - FT_ULong tmp; - - FT_Byte *flag, *flag_limit; - FT_Byte c, count; - FT_Vector *vec, *vec_limit; - FT_Pos x; - FT_Short *cont, *cont_limit, prev_cont; - FT_Int xy_size = 0; - - - /* check that we can add the contours to the glyph */ - error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours ); - if ( error ) - goto Fail; - - /* reading the contours' endpoints & number of points */ - cont = gloader->current.outline.contours; - cont_limit = cont + n_contours; - - /* check space for contours array + instructions count */ - if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit ) - goto Invalid_Outline; - - prev_cont = FT_NEXT_SHORT( p ); - - if ( n_contours > 0 ) - cont[0] = prev_cont; - - if ( prev_cont < 0 ) - goto Invalid_Outline; - - for ( cont++; cont < cont_limit; cont++ ) - { - cont[0] = FT_NEXT_SHORT( p ); - if ( cont[0] <= prev_cont ) - { - /* unordered contours: this is invalid */ - goto Invalid_Outline; - } - prev_cont = cont[0]; - } - - n_points = 0; - if ( n_contours > 0 ) - { - n_points = cont[-1] + 1; - if ( n_points < 0 ) - goto Invalid_Outline; - } - - /* note that we will add four phantom points later */ - error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 ); - if ( error ) - goto Fail; - - /* reading the bytecode instructions */ - load->glyph->control_len = 0; - load->glyph->control_data = NULL; - - if ( p + 2 > limit ) - goto Invalid_Outline; - - n_ins = FT_NEXT_USHORT( p ); - - FT_TRACE5(( " Instructions size: %u\n", n_ins )); - - /* check it */ - if ( ( limit - p ) < n_ins ) - { - FT_TRACE0(( "TT_Load_Simple_Glyph: instruction count mismatch\n" )); - error = FT_THROW( Too_Many_Hints ); - goto Fail; - } - -#ifdef TT_USE_BYTECODE_INTERPRETER - - if ( IS_HINTED( load->load_flags ) ) - { - /* we don't trust `maxSizeOfInstructions' in the `maxp' table */ - /* and thus update the bytecode array size by ourselves */ - - tmp = load->exec->glyphSize; - error = Update_Max( load->exec->memory, - &tmp, - sizeof ( FT_Byte ), - (void*)&load->exec->glyphIns, - n_ins ); - - load->exec->glyphSize = (FT_UShort)tmp; - if ( error ) - return error; - - load->glyph->control_len = n_ins; - load->glyph->control_data = load->exec->glyphIns; - - FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins ); - } - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - p += n_ins; - - outline = &gloader->current.outline; - - /* reading the point tags */ - flag = (FT_Byte*)outline->tags; - flag_limit = flag + n_points; - - FT_ASSERT( flag != NULL ); - - while ( flag < flag_limit ) - { - if ( p + 1 > limit ) - goto Invalid_Outline; - - *flag++ = c = FT_NEXT_BYTE( p ); - if ( c & 8 ) - { - if ( p + 1 > limit ) - goto Invalid_Outline; - - count = FT_NEXT_BYTE( p ); - if ( flag + (FT_Int)count > flag_limit ) - goto Invalid_Outline; - - for ( ; count > 0; count-- ) - *flag++ = c; - } - } - - /* reading the X coordinates */ - - vec = outline->points; - vec_limit = vec + n_points; - flag = (FT_Byte*)outline->tags; - x = 0; - - if ( p + xy_size > limit ) - goto Invalid_Outline; - - for ( ; vec < vec_limit; vec++, flag++ ) - { - FT_Pos y = 0; - FT_Byte f = *flag; - - - if ( f & 2 ) - { - if ( p + 1 > limit ) - goto Invalid_Outline; - - y = (FT_Pos)FT_NEXT_BYTE( p ); - if ( ( f & 16 ) == 0 ) - y = -y; - } - else if ( ( f & 16 ) == 0 ) - { - if ( p + 2 > limit ) - goto Invalid_Outline; - - y = (FT_Pos)FT_NEXT_SHORT( p ); - } - - x += y; - vec->x = x; - /* the cast is for stupid compilers */ - *flag = (FT_Byte)( f & ~( 2 | 16 ) ); - } - - /* reading the Y coordinates */ - - vec = gloader->current.outline.points; - vec_limit = vec + n_points; - flag = (FT_Byte*)outline->tags; - x = 0; - - for ( ; vec < vec_limit; vec++, flag++ ) - { - FT_Pos y = 0; - FT_Byte f = *flag; - - - if ( f & 4 ) - { - if ( p + 1 > limit ) - goto Invalid_Outline; - - y = (FT_Pos)FT_NEXT_BYTE( p ); - if ( ( f & 32 ) == 0 ) - y = -y; - } - else if ( ( f & 32 ) == 0 ) - { - if ( p + 2 > limit ) - goto Invalid_Outline; - - y = (FT_Pos)FT_NEXT_SHORT( p ); - } - - x += y; - vec->y = x; - /* the cast is for stupid compilers */ - *flag = (FT_Byte)( f & FT_CURVE_TAG_ON ); - } - - outline->n_points = (FT_Short)n_points; - outline->n_contours = (FT_Short)n_contours; - - load->cursor = p; - - Fail: - return error; - - Invalid_Outline: - error = FT_THROW( Invalid_Outline ); - goto Fail; - } - - - FT_CALLBACK_DEF( FT_Error ) - TT_Load_Composite_Glyph( TT_Loader loader ) - { - FT_Error error; - FT_Byte* p = loader->cursor; - FT_Byte* limit = loader->limit; - FT_GlyphLoader gloader = loader->gloader; - FT_SubGlyph subglyph; - FT_UInt num_subglyphs; - - - num_subglyphs = 0; - - do - { - FT_Fixed xx, xy, yy, yx; - FT_UInt count; - - - /* check that we can load a new subglyph */ - error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 ); - if ( error ) - goto Fail; - - /* check space */ - if ( p + 4 > limit ) - goto Invalid_Composite; - - subglyph = gloader->current.subglyphs + num_subglyphs; - - subglyph->arg1 = subglyph->arg2 = 0; - - subglyph->flags = FT_NEXT_USHORT( p ); - subglyph->index = FT_NEXT_USHORT( p ); - - /* check space */ - count = 2; - if ( subglyph->flags & ARGS_ARE_WORDS ) - count += 2; - if ( subglyph->flags & WE_HAVE_A_SCALE ) - count += 2; - else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) - count += 4; - else if ( subglyph->flags & WE_HAVE_A_2X2 ) - count += 8; - - if ( p + count > limit ) - goto Invalid_Composite; - - /* read arguments */ - if ( subglyph->flags & ARGS_ARE_XY_VALUES ) - { - if ( subglyph->flags & ARGS_ARE_WORDS ) - { - subglyph->arg1 = FT_NEXT_SHORT( p ); - subglyph->arg2 = FT_NEXT_SHORT( p ); - } - else - { - subglyph->arg1 = FT_NEXT_CHAR( p ); - subglyph->arg2 = FT_NEXT_CHAR( p ); - } - } - else - { - if ( subglyph->flags & ARGS_ARE_WORDS ) - { - subglyph->arg1 = (FT_Int)FT_NEXT_USHORT( p ); - subglyph->arg2 = (FT_Int)FT_NEXT_USHORT( p ); - } - else - { - subglyph->arg1 = (FT_Int)FT_NEXT_BYTE( p ); - subglyph->arg2 = (FT_Int)FT_NEXT_BYTE( p ); - } - } - - /* read transform */ - xx = yy = 0x10000L; - xy = yx = 0; - - if ( subglyph->flags & WE_HAVE_A_SCALE ) - { - xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; - yy = xx; - } - else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) - { - xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; - yy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; - } - else if ( subglyph->flags & WE_HAVE_A_2X2 ) - { - xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; - yx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; - xy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; - yy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; - } - - subglyph->transform.xx = xx; - subglyph->transform.xy = xy; - subglyph->transform.yx = yx; - subglyph->transform.yy = yy; - - num_subglyphs++; - - } while ( subglyph->flags & MORE_COMPONENTS ); - - gloader->current.num_subglyphs = num_subglyphs; - -#ifdef TT_USE_BYTECODE_INTERPRETER - - { - FT_Stream stream = loader->stream; - - - /* we must undo the FT_FRAME_ENTER in order to point */ - /* to the composite instructions, if we find some. */ - /* We will process them later. */ - /* */ - loader->ins_pos = (FT_ULong)( FT_STREAM_POS() + - p - limit ); - } - -#endif - - loader->cursor = p; - - Fail: - return error; - - Invalid_Composite: - error = FT_THROW( Invalid_Composite ); - goto Fail; - } - - - FT_LOCAL_DEF( void ) - TT_Init_Glyph_Loading( TT_Face face ) - { - face->access_glyph_frame = TT_Access_Glyph_Frame; - face->read_glyph_header = TT_Load_Glyph_Header; - face->read_simple_glyph = TT_Load_Simple_Glyph; - face->read_composite_glyph = TT_Load_Composite_Glyph; - face->forget_glyph_frame = TT_Forget_Glyph_Frame; - } - - - static void - tt_prepare_zone( TT_GlyphZone zone, - FT_GlyphLoad load, - FT_UInt start_point, - FT_UInt start_contour ) - { - zone->n_points = (FT_UShort)load->outline.n_points - - (FT_UShort)start_point; - zone->n_contours = load->outline.n_contours - - (FT_Short)start_contour; - zone->org = load->extra_points + start_point; - zone->cur = load->outline.points + start_point; - zone->orus = load->extra_points2 + start_point; - zone->tags = (FT_Byte*)load->outline.tags + start_point; - zone->contours = (FT_UShort*)load->outline.contours + start_contour; - zone->first_point = (FT_UShort)start_point; - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Hint_Glyph */ - /* */ - /* */ - /* Hint the glyph using the zone prepared by the caller. Note that */ - /* the zone is supposed to include four phantom points. */ - /* */ - static FT_Error - TT_Hint_Glyph( TT_Loader loader, - FT_Bool is_composite ) - { -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - TT_Face face = loader->face; - TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); -#endif - - TT_GlyphZone zone = &loader->zone; - -#ifdef TT_USE_BYTECODE_INTERPRETER - FT_Long n_ins; -#else - FT_UNUSED( is_composite ); -#endif - - -#ifdef TT_USE_BYTECODE_INTERPRETER - if ( loader->glyph->control_len > 0xFFFFL ) - { - FT_TRACE1(( "TT_Hint_Glyph: too long instructions" )); - FT_TRACE1(( " (0x%lx byte) is truncated\n", - loader->glyph->control_len )); - } - n_ins = loader->glyph->control_len; - - /* save original point position in org */ - if ( n_ins > 0 ) - FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points ); - - /* Reset graphics state. */ - loader->exec->GS = loader->size->GS; - - /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */ - /* completely refer to the (already) hinted subglyphs. */ - if ( is_composite ) - { - loader->exec->metrics.x_scale = 1 << 16; - loader->exec->metrics.y_scale = 1 << 16; - - FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points ); - } - else - { - loader->exec->metrics.x_scale = loader->size->metrics.x_scale; - loader->exec->metrics.y_scale = loader->size->metrics.y_scale; - } -#endif - - /* round phantom points */ - zone->cur[zone->n_points - 4].x = - FT_PIX_ROUND( zone->cur[zone->n_points - 4].x ); - zone->cur[zone->n_points - 3].x = - FT_PIX_ROUND( zone->cur[zone->n_points - 3].x ); - zone->cur[zone->n_points - 2].y = - FT_PIX_ROUND( zone->cur[zone->n_points - 2].y ); - zone->cur[zone->n_points - 1].y = - FT_PIX_ROUND( zone->cur[zone->n_points - 1].y ); - -#ifdef TT_USE_BYTECODE_INTERPRETER - - if ( n_ins > 0 ) - { - FT_Error error; - - FT_GlyphLoader gloader = loader->gloader; - FT_Outline current_outline = gloader->current.outline; - - - TT_Set_CodeRange( loader->exec, tt_coderange_glyph, - loader->exec->glyphIns, n_ins ); - - loader->exec->is_composite = is_composite; - loader->exec->pts = *zone; - - error = TT_Run_Context( loader->exec ); - if ( error && loader->exec->pedantic_hinting ) - return error; - - /* store drop-out mode in bits 5-7; set bit 2 also as a marker */ - current_outline.tags[0] |= - ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE; - } - -#endif - - /* save glyph phantom points */ - 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_CONFIG_OPTION_SUBPIXEL_HINTING - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) - { - if ( loader->exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN ) - FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 ); - - else if ( loader->exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN ) - FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 ); - } -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Process_Simple_Glyph */ - /* */ - /* */ - /* Once a simple glyph has been loaded, it needs to be processed. */ - /* Usually, this means scaling and hinting through bytecode */ - /* interpretation. */ - /* */ - static FT_Error - TT_Process_Simple_Glyph( TT_Loader loader ) - { - FT_GlyphLoader gloader = loader->gloader; - FT_Error error = FT_Err_Ok; - FT_Outline* outline; - FT_Int n_points; - - - outline = &gloader->current.outline; - n_points = outline->n_points; - - /* set phantom points */ - - outline->points[n_points ] = loader->pp1; - outline->points[n_points + 1] = loader->pp2; - outline->points[n_points + 2] = loader->pp3; - outline->points[n_points + 3] = loader->pp4; - - outline->tags[n_points ] = 0; - outline->tags[n_points + 1] = 0; - outline->tags[n_points + 2] = 0; - outline->tags[n_points + 3] = 0; - - n_points += 4; - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - - if ( loader->face->doblend ) - { - /* Deltas apply to the unscaled data. */ - error = TT_Vary_Apply_Glyph_Deltas( loader->face, - loader->glyph_index, - outline, - (FT_UInt)n_points ); - if ( error ) - return error; - } - -#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ - - if ( IS_HINTED( loader->load_flags ) ) - { - tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 ); - - FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur, - loader->zone.n_points + 4 ); - } - - { -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - 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; - - FT_Fixed x_scale = 0; /* pacify compiler */ - FT_Fixed y_scale = 0; - - FT_Bool do_scale = FALSE; - - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - - 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 ) - FT_Outline_EmboldenXY( outline, - FT_MulFix( 1280 * ppem, - 1000 - x_scale_factor ), - 0 ); - do_scale = TRUE; - } - } - else - -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - { - /* scale the glyph */ - if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) - { - x_scale = loader->size->metrics.x_scale; - y_scale = loader->size->metrics.y_scale; - - do_scale = TRUE; - } - } - - if ( do_scale ) - { - for ( ; vec < limit; vec++ ) - { - vec->x = FT_MulFix( vec->x, x_scale ); - vec->y = FT_MulFix( vec->y, y_scale ); - } - - loader->pp1 = outline->points[n_points - 4]; - loader->pp2 = outline->points[n_points - 3]; - loader->pp3 = outline->points[n_points - 2]; - loader->pp4 = outline->points[n_points - 1]; - } - } - - if ( IS_HINTED( loader->load_flags ) ) - { - loader->zone.n_points += 4; - - error = TT_Hint_Glyph( loader, 0 ); - } - - return error; - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Process_Composite_Component */ - /* */ - /* */ - /* Once a composite component has been loaded, it needs to be */ - /* processed. Usually, this means transforming and translating. */ - /* */ - static FT_Error - TT_Process_Composite_Component( TT_Loader loader, - FT_SubGlyph subglyph, - FT_UInt start_point, - FT_UInt num_base_points ) - { - FT_GlyphLoader gloader = loader->gloader; - FT_Outline current; - FT_Bool have_scale; - FT_Pos x, y; - - - current.points = gloader->base.outline.points + num_base_points; - current.n_points = gloader->base.outline.n_points - num_base_points; - - have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE | - WE_HAVE_AN_XY_SCALE | - WE_HAVE_A_2X2 ) ); - - /* perform the transform required for this subglyph */ - if ( have_scale ) - FT_Outline_Transform( ¤t, &subglyph->transform ); - - /* get offset */ - if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) ) - { - FT_UInt num_points = (FT_UInt)gloader->base.outline.n_points; - FT_UInt k = (FT_UInt)subglyph->arg1; - FT_UInt l = (FT_UInt)subglyph->arg2; - FT_Vector* p1; - FT_Vector* p2; - - - /* match l-th point of the newly loaded component to the k-th point */ - /* of the previously loaded components. */ - - /* change to the point numbers used by our outline */ - k += start_point; - l += num_base_points; - if ( k >= num_base_points || - l >= num_points ) - return FT_THROW( Invalid_Composite ); - - p1 = gloader->base.outline.points + k; - p2 = gloader->base.outline.points + l; - - x = p1->x - p2->x; - y = p1->y - p2->y; - } - else - { - x = subglyph->arg1; - y = subglyph->arg2; - - if ( !x && !y ) - return FT_Err_Ok; - - /* Use a default value dependent on */ - /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED. This is useful for old */ - /* TT fonts which don't set the xxx_COMPONENT_OFFSET bit. */ - - if ( have_scale && -#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED - !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) ) -#else - ( subglyph->flags & SCALED_COMPONENT_OFFSET ) ) -#endif - { - -#if 0 - - /*******************************************************************/ - /* */ - /* This algorithm is what Apple documents. But it doesn't work. */ - /* */ - int a = subglyph->transform.xx > 0 ? subglyph->transform.xx - : -subglyph->transform.xx; - int b = subglyph->transform.yx > 0 ? subglyph->transform.yx - : -subglyph->transform.yx; - int c = subglyph->transform.xy > 0 ? subglyph->transform.xy - : -subglyph->transform.xy; - int d = subglyph->transform.yy > 0 ? subglyph->transform.yy - : -subglyph->transform.yy; - int m = a > b ? a : b; - int n = c > d ? c : d; - - - if ( a - b <= 33 && a - b >= -33 ) - m *= 2; - if ( c - d <= 33 && c - d >= -33 ) - n *= 2; - x = FT_MulFix( x, m ); - y = FT_MulFix( y, n ); - -#else /* 1 */ - - /*******************************************************************/ - /* */ - /* This algorithm is a guess and works much better than the above. */ - /* */ - FT_Fixed mac_xscale = FT_Hypot( subglyph->transform.xx, - subglyph->transform.xy ); - FT_Fixed mac_yscale = FT_Hypot( subglyph->transform.yy, - subglyph->transform.yx ); - - - x = FT_MulFix( x, mac_xscale ); - y = FT_MulFix( y, mac_yscale ); - -#endif /* 1 */ - - } - - if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) - { - FT_Fixed x_scale = loader->size->metrics.x_scale; - FT_Fixed y_scale = loader->size->metrics.y_scale; - - - x = FT_MulFix( x, x_scale ); - y = FT_MulFix( y, y_scale ); - - if ( subglyph->flags & ROUND_XY_TO_GRID ) - { - x = FT_PIX_ROUND( x ); - y = FT_PIX_ROUND( y ); - } - } - } - - if ( x || y ) - FT_Outline_Translate( ¤t, x, y ); - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Process_Composite_Glyph */ - /* */ - /* */ - /* This is slightly different from TT_Process_Simple_Glyph, in that */ - /* its sole purpose is to hint the glyph. Thus this function is */ - /* only available when bytecode interpreter is enabled. */ - /* */ - static FT_Error - TT_Process_Composite_Glyph( TT_Loader loader, - FT_UInt start_point, - FT_UInt start_contour ) - { - FT_Error error; - FT_Outline* outline; - FT_UInt i; - - - outline = &loader->gloader->base.outline; - - /* make room for phantom points */ - error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader, - outline->n_points + 4, - 0 ); - if ( error ) - return error; - - outline->points[outline->n_points ] = loader->pp1; - outline->points[outline->n_points + 1] = loader->pp2; - outline->points[outline->n_points + 2] = loader->pp3; - outline->points[outline->n_points + 3] = loader->pp4; - - outline->tags[outline->n_points ] = 0; - outline->tags[outline->n_points + 1] = 0; - outline->tags[outline->n_points + 2] = 0; - outline->tags[outline->n_points + 3] = 0; - -#ifdef TT_USE_BYTECODE_INTERPRETER - - { - FT_Stream stream = loader->stream; - FT_UShort n_ins, max_ins; - FT_ULong tmp; - - - /* TT_Load_Composite_Glyph only gives us the offset of instructions */ - /* so we read them here */ - if ( FT_STREAM_SEEK( loader->ins_pos ) || - FT_READ_USHORT( n_ins ) ) - return error; - - FT_TRACE5(( " Instructions size = %d\n", n_ins )); - - /* check it */ - max_ins = loader->face->max_profile.maxSizeOfInstructions; - if ( n_ins > max_ins ) - { - /* don't trust `maxSizeOfInstructions'; */ - /* only do a rough safety check */ - if ( (FT_Int)n_ins > loader->byte_len ) - { - FT_TRACE1(( "TT_Process_Composite_Glyph:" - " too many instructions (%d) for glyph with length %d\n", - n_ins, loader->byte_len )); - return FT_THROW( Too_Many_Hints ); - } - - tmp = loader->exec->glyphSize; - error = Update_Max( loader->exec->memory, - &tmp, - sizeof ( FT_Byte ), - (void*)&loader->exec->glyphIns, - n_ins ); - - loader->exec->glyphSize = (FT_UShort)tmp; - if ( error ) - return error; - } - else if ( n_ins == 0 ) - return FT_Err_Ok; - - if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) ) - return error; - - loader->glyph->control_data = loader->exec->glyphIns; - loader->glyph->control_len = n_ins; - } - -#endif - - tt_prepare_zone( &loader->zone, &loader->gloader->base, - start_point, start_contour ); - - /* Some points are likely touched during execution of */ - /* instructions on components. So let's untouch them. */ - for ( i = 0; i < loader->zone.n_points; i++ ) - loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH; - - loader->zone.n_points += 4; - - return TT_Hint_Glyph( loader, 1 ); - } - - - /* - * Calculate the phantom points - * - * Defining the right side bearing (rsb) as - * - * rsb = aw - (lsb + xmax - xmin) - * - * (with `aw' the advance width, `lsb' the left side bearing, and `xmin' - * and `xmax' the glyph's minimum and maximum x value), the OpenType - * specification defines the initial position of horizontal phantom points - * as - * - * pp1 = (round(xmin - lsb), 0) , - * pp2 = (round(pp1 + aw), 0) . - * - * Note that the rounding to the grid (in the device space) is not - * documented currently in the specification. - * - * However, the specification lacks the precise definition of vertical - * phantom points. Greg Hitchcock provided the following explanation. - * - * - a `vmtx' table is present - * - * For any glyph, the minimum and maximum y values (`ymin' and `ymax') - * are given in the `glyf' table, the top side bearing (tsb) and advance - * height (ah) are given in the `vmtx' table. The bottom side bearing - * (bsb) is then calculated as - * - * bsb = ah - (tsb + ymax - ymin) , - * - * and the initial position of vertical phantom points is - * - * pp3 = (x, round(ymax + tsb)) , - * pp4 = (x, round(pp3 - ah)) . - * - * See below for value `x'. - * - * - no `vmtx' table in the font - * - * If there is an `OS/2' table, we set - * - * DefaultAscender = sTypoAscender , - * DefaultDescender = sTypoDescender , - * - * otherwise we use data from the `hhea' table: - * - * DefaultAscender = Ascender , - * DefaultDescender = Descender . - * - * With these two variables we can now set - * - * ah = DefaultAscender - sDefaultDescender , - * tsb = DefaultAscender - yMax , - * - * and proceed as if a `vmtx' table was present. - * - * Usually we have - * - * x = aw / 2 , (1) - * - * but there is one compatibility case where it can be set to - * - * x = -DefaultDescender - - * ((DefaultAscender - DefaultDescender - aw) / 2) . (2) - * - * and another one with - * - * x = 0 . (3) - * - * In Windows, the history of those values is quite complicated, - * depending on the hinting engine (that is, the graphics framework). - * - * framework from to formula - * ---------------------------------------------------------- - * GDI Windows 98 current (1) - * (Windows 2000 for NT) - * GDI+ Windows XP Windows 7 (2) - * GDI+ Windows 8 current (3) - * DWrite Windows 7 current (3) - * - * For simplicity, FreeType uses (1) for grayscale subpixel hinting and - * (3) for everything else. - * - */ -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - -#define TT_LOADER_SET_PP( loader ) \ - do \ - { \ - FT_Bool subpixel_hinting_ = loader->exec \ - ? loader->exec->subpixel_hinting \ - : 0; \ - FT_Bool grayscale_ = loader->exec \ - ? loader->exec->grayscale \ - : 0; \ - FT_Bool 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.y = (loader)->bbox.yMax + (loader)->top_bearing; \ - (loader)->pp4.x = use_aw_2_ ? (loader)->advance / 2 : 0; \ - (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance; \ - } while ( 0 ) - -#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - -#define TT_LOADER_SET_PP( loader ) \ - do \ - { \ - (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 = 0; \ - (loader)->pp3.y = (loader)->bbox.yMax + (loader)->top_bearing; \ - (loader)->pp4.x = 0; \ - (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance; \ - } while ( 0 ) - -#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - - /*************************************************************************/ - /* */ - /* */ - /* load_truetype_glyph */ - /* */ - /* */ - /* Loads a given truetype glyph. Handles composites and uses a */ - /* TT_Loader object. */ - /* */ - static FT_Error - load_truetype_glyph( TT_Loader loader, - FT_UInt glyph_index, - FT_UInt recurse_count, - FT_Bool header_only ) - { - FT_Error error = FT_Err_Ok; - FT_Fixed x_scale, y_scale; - FT_ULong offset; - TT_Face face = loader->face; - FT_GlyphLoader gloader = loader->gloader; - FT_Bool opened_frame = 0; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - FT_StreamRec inc_stream; - FT_Data glyph_data; - FT_Bool glyph_data_loaded = 0; -#endif - - - /* some fonts have an incorrect value of `maxComponentDepth', */ - /* thus we allow depth 1 to catch the majority of them */ - if ( recurse_count > 1 && - recurse_count > face->max_profile.maxComponentDepth ) - { - error = FT_THROW( Invalid_Composite ); - goto Exit; - } - -#ifndef FT_CONFIG_OPTION_INCREMENTAL - /* check glyph index */ - if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) - { - error = FT_THROW( Invalid_Glyph_Index ); - goto Exit; - } -#endif - - loader->glyph_index = glyph_index; - - if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) - { - x_scale = loader->size->metrics.x_scale; - y_scale = loader->size->metrics.y_scale; - } - else - { - x_scale = 0x10000L; - y_scale = 0x10000L; - } - - /* Set `offset' to the start of the glyph relative to the start of */ - /* the `glyf' table, and `byte_len' to the length of the glyph in */ - /* bytes. */ - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - /* If we are loading glyph data via the incremental interface, set */ - /* the loader stream to a memory stream reading the data returned */ - /* by the interface. */ - if ( face->root.internal->incremental_interface ) - { - error = face->root.internal->incremental_interface->funcs->get_glyph_data( - face->root.internal->incremental_interface->object, - glyph_index, &glyph_data ); - if ( error ) - goto Exit; - - glyph_data_loaded = 1; - offset = 0; - loader->byte_len = glyph_data.length; - - FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) ); - FT_Stream_OpenMemory( &inc_stream, - glyph_data.pointer, - (FT_ULong)glyph_data.length ); - - loader->stream = &inc_stream; - } - else - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - offset = tt_face_get_location( face, glyph_index, - (FT_UInt*)&loader->byte_len ); - - if ( loader->byte_len > 0 ) - { -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* for the incremental interface, `glyf_offset' is always zero */ - if ( !loader->glyf_offset && - !face->root.internal->incremental_interface ) -#else - if ( !loader->glyf_offset ) -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - { - FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - error = face->access_glyph_frame( loader, glyph_index, - loader->glyf_offset + offset, - (FT_UInt)loader->byte_len ); - if ( error ) - goto Exit; - - opened_frame = 1; - - /* read glyph header first */ - error = face->read_glyph_header( loader ); - if ( error ) - goto Exit; - - /* the metrics must be computed after loading the glyph header */ - /* since we need the glyph's `yMax' value in case the vertical */ - /* metrics must be emulated */ - error = tt_get_metrics( loader, glyph_index ); - if ( error ) - goto Exit; - - if ( header_only ) - goto Exit; - } - - if ( loader->byte_len == 0 || loader->n_contours == 0 ) - { - loader->bbox.xMin = 0; - loader->bbox.xMax = 0; - loader->bbox.yMin = 0; - loader->bbox.yMax = 0; - - error = tt_get_metrics( loader, glyph_index ); - if ( error ) - goto Exit; - - if ( header_only ) - goto Exit; - - /* must initialize points before (possibly) overriding */ - /* glyph metrics from the incremental interface */ - TT_LOADER_SET_PP( loader ); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - tt_get_metrics_incr_overrides( loader, glyph_index ); -#endif - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - - if ( loader->face->doblend ) - { - /* a small outline structure with four elements for */ - /* communication with `TT_Vary_Apply_Glyph_Deltas' */ - FT_Vector points[4]; - char tags[4] = { 1, 1, 1, 1 }; - short contours[4] = { 0, 1, 2, 3 }; - FT_Outline outline; - - - points[0].x = loader->pp1.x; - points[0].y = loader->pp1.y; - points[1].x = loader->pp2.x; - points[1].y = loader->pp2.y; - - points[2].x = loader->pp3.x; - points[2].y = loader->pp3.y; - points[3].x = loader->pp4.x; - points[3].y = loader->pp4.y; - - outline.n_points = 4; - outline.n_contours = 4; - outline.points = points; - outline.tags = tags; - outline.contours = contours; - - /* this must be done before scaling */ - error = TT_Vary_Apply_Glyph_Deltas( loader->face, - glyph_index, - &outline, - (FT_UInt)outline.n_points ); - if ( error ) - goto Exit; - - loader->pp1.x = points[0].x; - loader->pp1.y = points[0].y; - loader->pp2.x = points[1].x; - loader->pp2.y = points[1].y; - - loader->pp3.x = points[2].x; - loader->pp3.y = points[2].y; - loader->pp4.x = points[3].x; - loader->pp4.y = points[3].y; - } - -#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ - - /* scale phantom points, if necessary; */ - /* they get rounded in `TT_Hint_Glyph' */ - if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) - { - loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); - loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); - /* pp1.y and pp2.y are always zero */ - - loader->pp3.x = FT_MulFix( loader->pp3.x, x_scale ); - loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); - loader->pp4.x = FT_MulFix( loader->pp4.x, x_scale ); - loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); - } - - error = FT_Err_Ok; - goto Exit; - } - - /* must initialize phantom points before (possibly) overriding */ - /* glyph metrics from the incremental interface */ - TT_LOADER_SET_PP( loader ); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - tt_get_metrics_incr_overrides( loader, glyph_index ); -#endif - - /***********************************************************************/ - /***********************************************************************/ - /***********************************************************************/ - - /* if it is a simple glyph, load it */ - - if ( loader->n_contours > 0 ) - { - error = face->read_simple_glyph( loader ); - if ( error ) - goto Exit; - - /* all data have been read */ - face->forget_glyph_frame( loader ); - opened_frame = 0; - - error = TT_Process_Simple_Glyph( loader ); - if ( error ) - goto Exit; - - FT_GlyphLoader_Add( gloader ); - } - - /***********************************************************************/ - /***********************************************************************/ - /***********************************************************************/ - - /* otherwise, load a composite! */ - else if ( loader->n_contours == -1 ) - { - FT_UInt start_point; - FT_UInt start_contour; - FT_ULong ins_pos; /* position of composite instructions, if any */ - - - start_point = (FT_UInt)gloader->base.outline.n_points; - start_contour = (FT_UInt)gloader->base.outline.n_contours; - - /* for each subglyph, read composite header */ - error = face->read_composite_glyph( loader ); - if ( error ) - goto Exit; - - /* store the offset of instructions */ - ins_pos = loader->ins_pos; - - /* all data we need are read */ - face->forget_glyph_frame( loader ); - opened_frame = 0; - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - - if ( face->doblend ) - { - short i, limit; - FT_SubGlyph subglyph; - - FT_Outline outline; - FT_Vector* points = NULL; - char* tags = NULL; - short* contours = NULL; - - FT_Memory memory = face->root.memory; - - - limit = (short)gloader->current.num_subglyphs; - - /* construct an outline structure for */ - /* communication with `TT_Vary_Apply_Glyph_Deltas' */ - outline.n_points = (short)( gloader->current.num_subglyphs + 4 ); - outline.n_contours = outline.n_points; - - if ( FT_NEW_ARRAY( points, outline.n_points ) || - FT_NEW_ARRAY( tags, outline.n_points ) || - FT_NEW_ARRAY( contours, outline.n_points ) ) - goto Exit1; - - subglyph = gloader->current.subglyphs; - - for ( i = 0; i < limit; i++, subglyph++ ) - { - /* applying deltas for anchor points doesn't make sense, */ - /* but we don't have to specially check this since */ - /* unused delta values are zero anyways */ - points[i].x = subglyph->arg1; - points[i].y = subglyph->arg2; - tags[i] = 1; - contours[i] = i; - } - - points[i].x = loader->pp1.x; - points[i].y = loader->pp1.y; - tags[i] = 1; - contours[i] = i; - - i++; - points[i].x = loader->pp2.x; - points[i].y = loader->pp2.y; - tags[i] = 1; - contours[i] = i; - - i++; - points[i].x = loader->pp3.x; - points[i].y = loader->pp3.y; - tags[i] = 1; - contours[i] = i; - - i++; - points[i].x = loader->pp4.x; - points[i].y = loader->pp4.y; - tags[i] = 1; - contours[i] = i; - - outline.points = points; - outline.tags = tags; - outline.contours = contours; - - /* this call provides additional offsets */ - /* for each component's translation */ - if ( ( error = TT_Vary_Apply_Glyph_Deltas( - face, - glyph_index, - &outline, - (FT_UInt)outline.n_points ) ) != 0 ) - goto Exit1; - - subglyph = gloader->current.subglyphs; - - for ( i = 0; i < limit; i++, subglyph++ ) - { - /* XXX: overflow check for subglyph->{arg1,arg2}. */ - /* Deltas must be within signed 16-bit, */ - /* but the restriction of summed deltas is not clear */ - subglyph->arg1 = (FT_Int16)points[i].x; - subglyph->arg2 = (FT_Int16)points[i].y; - } - - loader->pp1.x = points[i + 0].x; - loader->pp1.y = points[i + 0].y; - loader->pp2.x = points[i + 1].x; - loader->pp2.y = points[i + 1].y; - - loader->pp3.x = points[i + 2].x; - loader->pp3.y = points[i + 2].y; - loader->pp4.x = points[i + 3].x; - loader->pp4.y = points[i + 3].y; - - Exit1: - FT_FREE( outline.points ); - FT_FREE( outline.tags ); - FT_FREE( outline.contours ); - - if ( error ) - goto Exit; - } - -#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ - - /* scale phantom points, if necessary; */ - /* they get rounded in `TT_Hint_Glyph' */ - if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) - { - loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); - loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); - /* pp1.y and pp2.y are always zero */ - - loader->pp3.x = FT_MulFix( loader->pp3.x, x_scale ); - loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); - loader->pp4.x = FT_MulFix( loader->pp4.x, x_scale ); - loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); - } - - /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */ - /* `as is' in the glyph slot (the client application will be */ - /* responsible for interpreting these data)... */ - if ( loader->load_flags & FT_LOAD_NO_RECURSE ) - { - FT_GlyphLoader_Add( gloader ); - loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE; - - goto Exit; - } - - /*********************************************************************/ - /*********************************************************************/ - /*********************************************************************/ - - { - FT_UInt n, num_base_points; - FT_SubGlyph subglyph = NULL; - - FT_UInt num_points = start_point; - FT_UInt num_subglyphs = gloader->current.num_subglyphs; - FT_UInt num_base_subgs = gloader->base.num_subglyphs; - - FT_Stream old_stream = loader->stream; - FT_Int old_byte_len = loader->byte_len; - - - FT_GlyphLoader_Add( gloader ); - - /* read each subglyph independently */ - for ( n = 0; n < num_subglyphs; n++ ) - { - FT_Vector pp[4]; - - - /* Each time we call load_truetype_glyph in this loop, the */ - /* value of `gloader.base.subglyphs' can change due to table */ - /* reallocations. We thus need to recompute the subglyph */ - /* pointer on each iteration. */ - subglyph = gloader->base.subglyphs + num_base_subgs + n; - - pp[0] = loader->pp1; - pp[1] = loader->pp2; - pp[2] = loader->pp3; - pp[3] = loader->pp4; - - num_base_points = (FT_UInt)gloader->base.outline.n_points; - - error = load_truetype_glyph( loader, - (FT_UInt)subglyph->index, - recurse_count + 1, - FALSE ); - if ( error ) - goto Exit; - - /* restore subglyph pointer */ - subglyph = gloader->base.subglyphs + num_base_subgs + n; - - /* restore phantom points if necessary */ - if ( !( subglyph->flags & USE_MY_METRICS ) ) - { - loader->pp1 = pp[0]; - loader->pp2 = pp[1]; - loader->pp3 = pp[2]; - loader->pp4 = pp[3]; - } - - num_points = (FT_UInt)gloader->base.outline.n_points; - - if ( num_points == num_base_points ) - continue; - - /* gloader->base.outline consists of three parts: */ - /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */ - /* */ - /* (1): exists from the beginning */ - /* (2): components that have been loaded so far */ - /* (3): the newly loaded component */ - error = TT_Process_Composite_Component( loader, - subglyph, - start_point, - num_base_points ); - if ( error ) - goto Exit; - } - - loader->stream = old_stream; - loader->byte_len = old_byte_len; - - /* process the glyph */ - loader->ins_pos = ins_pos; - if ( IS_HINTED( loader->load_flags ) && -#ifdef TT_USE_BYTECODE_INTERPRETER - subglyph->flags & WE_HAVE_INSTR && -#endif - num_points > start_point ) - { - error = TT_Process_Composite_Glyph( loader, - start_point, - start_contour ); - if ( error ) - goto Exit; - } - } - } - else - { - /* invalid composite count (negative but not -1) */ - error = FT_THROW( Invalid_Outline ); - goto Exit; - } - - /***********************************************************************/ - /***********************************************************************/ - /***********************************************************************/ - - Exit: - - if ( opened_frame ) - face->forget_glyph_frame( loader ); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - if ( glyph_data_loaded ) - face->root.internal->incremental_interface->funcs->free_glyph_data( - face->root.internal->incremental_interface->object, - &glyph_data ); - -#endif - - return error; - } - - - static FT_Error - compute_glyph_metrics( TT_Loader loader, - FT_UInt glyph_index ) - { - TT_Face face = loader->face; -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); -#endif - - FT_BBox bbox; - FT_Fixed y_scale; - TT_GlyphSlot glyph = loader->glyph; - TT_Size size = loader->size; - - - y_scale = 0x10000L; - if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) - y_scale = size->root.metrics.y_scale; - - if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE ) - FT_Outline_Get_CBox( &glyph->outline, &bbox ); - else - bbox = loader->bbox; - - /* get the device-independent horizontal advance; it is scaled later */ - /* by the base layer. */ - glyph->linearHoriAdvance = loader->linear; - - glyph->metrics.horiBearingX = bbox.xMin; - glyph->metrics.horiBearingY = bbox.yMax; - glyph->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; - - /* adjust advance width to the value contained in the hdmx table */ - if ( !face->postscript.isFixedPitch && - IS_HINTED( loader->load_flags ) ) - { - FT_Byte* widthp; - - - widthp = tt_face_get_device_metrics( face, - size->root.metrics.x_ppem, - glyph_index ); - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) - { - FT_Bool ignore_x_mode; - - - ignore_x_mode = FT_BOOL( FT_LOAD_TARGET_MODE( loader->load_flags ) != - FT_RENDER_MODE_MONO ); - - if ( widthp && - ( ( ignore_x_mode && loader->exec->compatible_widths ) || - !ignore_x_mode || - SPH_OPTION_BITMAP_WIDTHS ) ) - glyph->metrics.horiAdvance = *widthp * 64; - } - else - -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - { - if ( widthp ) - glyph->metrics.horiAdvance = *widthp * 64; - } - } - - /* set glyph dimensions */ - glyph->metrics.width = bbox.xMax - bbox.xMin; - glyph->metrics.height = bbox.yMax - bbox.yMin; - - /* Now take care of vertical metrics. In the case where there is */ - /* no vertical information within the font (relatively common), */ - /* create some metrics manually */ - { - FT_Pos top; /* scaled vertical top side bearing */ - FT_Pos advance; /* scaled vertical advance height */ - - - /* Get the unscaled top bearing and advance height. */ - if ( face->vertical_info && - face->vertical.number_Of_VMetrics > 0 ) - { - top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax, - y_scale ); - - if ( loader->pp3.y <= loader->pp4.y ) - advance = 0; - else - advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y, - y_scale ); - } - else - { - FT_Pos height; - - - /* XXX Compute top side bearing and advance height in */ - /* Get_VMetrics instead of here. */ - - /* NOTE: The OS/2 values are the only `portable' ones, */ - /* which is why we use them, if there is an OS/2 */ - /* table in the font. Otherwise, we use the */ - /* values defined in the horizontal header. */ - - height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin, - y_scale ); - if ( face->os2.version != 0xFFFFU ) - advance = (FT_Pos)( face->os2.sTypoAscender - - face->os2.sTypoDescender ); - else - advance = (FT_Pos)( face->horizontal.Ascender - - face->horizontal.Descender ); - - top = ( advance - height ) / 2; - } - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - { - FT_Incremental_InterfaceRec* incr; - FT_Incremental_MetricsRec metrics; - FT_Error error; - - - incr = face->root.internal->incremental_interface; - - /* If this is an incrementally loaded font see if there are */ - /* overriding metrics for this glyph. */ - if ( incr && incr->funcs->get_glyph_metrics ) - { - metrics.bearing_x = 0; - metrics.bearing_y = top; - metrics.advance = advance; - - error = incr->funcs->get_glyph_metrics( incr->object, - glyph_index, - TRUE, - &metrics ); - if ( error ) - return error; - - top = metrics.bearing_y; - advance = metrics.advance; - } - } - - /* GWW: Do vertical metrics get loaded incrementally too? */ - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - glyph->linearVertAdvance = advance; - - /* scale the metrics */ - if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) - { - top = FT_MulFix( top, y_scale ); - advance = FT_MulFix( advance, y_scale ); - } - - /* XXX: for now, we have no better algorithm for the lsb, but it */ - /* should work fine. */ - /* */ - glyph->metrics.vertBearingX = glyph->metrics.horiBearingX - - glyph->metrics.horiAdvance / 2; - glyph->metrics.vertBearingY = top; - glyph->metrics.vertAdvance = advance; - } - - return 0; - } - - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - static FT_Error - load_sbit_image( TT_Size size, - TT_GlyphSlot glyph, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - TT_Face face; - SFNT_Service sfnt; - FT_Stream stream; - FT_Error error; - TT_SBit_MetricsRec metrics; - - - face = (TT_Face)glyph->face; - sfnt = (SFNT_Service)face->sfnt; - stream = face->root.stream; - - error = sfnt->load_sbit_image( face, - size->strike_index, - glyph_index, - (FT_UInt)load_flags, - stream, - &glyph->bitmap, - &metrics ); - if ( !error ) - { - glyph->outline.n_points = 0; - glyph->outline.n_contours = 0; - - glyph->metrics.width = (FT_Pos)metrics.width * 64; - glyph->metrics.height = (FT_Pos)metrics.height * 64; - - glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX * 64; - glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY * 64; - glyph->metrics.horiAdvance = (FT_Pos)metrics.horiAdvance * 64; - - glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX * 64; - glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY * 64; - glyph->metrics.vertAdvance = (FT_Pos)metrics.vertAdvance * 64; - - glyph->format = FT_GLYPH_FORMAT_BITMAP; - - if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) - { - glyph->bitmap_left = metrics.vertBearingX; - glyph->bitmap_top = metrics.vertBearingY; - } - else - { - glyph->bitmap_left = metrics.horiBearingX; - glyph->bitmap_top = metrics.horiBearingY; - } - } - - return error; - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - - static FT_Error - tt_loader_init( TT_Loader loader, - TT_Size size, - TT_GlyphSlot glyph, - FT_Int32 load_flags, - FT_Bool glyf_table_only ) - { - FT_Error error; - - TT_Face face; - FT_Stream stream; -#ifdef TT_USE_BYTECODE_INTERPRETER - FT_Bool pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); -#endif - - - face = (TT_Face)glyph->face; - stream = face->root.stream; - - FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) ); - -#ifdef TT_USE_BYTECODE_INTERPRETER - - /* load execution context */ - if ( IS_HINTED( load_flags ) && !glyf_table_only ) - { - TT_ExecContext exec; - FT_Bool grayscale; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); - - 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - FT_Bool reexecute = FALSE; - - - if ( size->bytecode_ready < 0 || size->cvt_ready < 0 ) - { - error = tt_size_ready_bytecode( size, pedantic ); - if ( error ) - return error; - } - else if ( size->bytecode_ready ) - return size->bytecode_ready; - else if ( size->cvt_ready ) - return size->cvt_ready; - - /* query new execution context */ - exec = size->context; - if ( !exec ) - return FT_THROW( Could_Not_Find_Context ); - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - - 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - { - 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_CONFIG_OPTION_SUBPIXEL_HINTING - - 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - { - /* 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; - } - } - - if ( reexecute ) - { - FT_UInt i; - - - for ( i = 0; i < size->cvt_size; i++ ) - size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); - error = tt_size_run_prep( size, pedantic ); - if ( error ) - return error; - } - - /* check whether the cvt program has disabled hinting */ - if ( exec->GS.instruct_control & 1 ) - load_flags |= FT_LOAD_NO_HINTING; - - /* load default graphics state -- if needed */ - if ( exec->GS.instruct_control & 2 ) - exec->GS = tt_default_graphics_state; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - /* check whether we have a font hinted for ClearType -- */ - /* note that this flag can also be modified in a glyph's bytecode */ - if ( exec->GS.instruct_control & 4 ) - exec->ignore_x_mode = 0; -#endif - - exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); - loader->exec = exec; - loader->instructions = exec->glyphIns; - } - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - /* seek to the beginning of the glyph table -- for Type 42 fonts */ - /* the table might be accessed from a Postscript stream or something */ - /* else... */ - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - if ( face->root.internal->incremental_interface ) - loader->glyf_offset = 0; - else - -#endif - - { - error = face->goto_table( face, TTAG_glyf, stream, 0 ); - - if ( FT_ERR_EQ( error, Table_Missing ) ) - loader->glyf_offset = 0; - else if ( error ) - { - FT_ERROR(( "tt_loader_init: could not access glyph table\n" )); - return error; - } - else - loader->glyf_offset = FT_STREAM_POS(); - } - - /* get face's glyph loader */ - if ( !glyf_table_only ) - { - FT_GlyphLoader gloader = glyph->internal->loader; - - - FT_GlyphLoader_Rewind( gloader ); - loader->gloader = gloader; - } - - loader->load_flags = (FT_ULong)load_flags; - - loader->face = face; - loader->size = size; - loader->glyph = (FT_GlyphSlot)glyph; - loader->stream = stream; - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Load_Glyph */ - /* */ - /* */ - /* A function used to load a single glyph within a given glyph slot, */ - /* for a given size. */ - /* */ - /* */ - /* glyph :: A handle to a target slot object where the glyph */ - /* will be loaded. */ - /* */ - /* size :: A handle to the source face size at which the glyph */ - /* must be scaled/loaded. */ - /* */ - /* glyph_index :: The index of the glyph in the font file. */ - /* */ - /* load_flags :: A flag indicating what to load for this glyph. The */ - /* FT_LOAD_XXX constants can be used to control the */ - /* glyph loading process (e.g., whether the outline */ - /* should be scaled, whether to load bitmaps or not, */ - /* whether to hint the outline, etc). */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Load_Glyph( TT_Size size, - TT_GlyphSlot glyph, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FT_Error error; - TT_LoaderRec loader; - - - FT_TRACE1(( "TT_Load_Glyph: glyph index %d\n", glyph_index )); - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - /* try to load embedded bitmap if any */ - /* */ - /* XXX: The convention should be emphasized in */ - /* the documents because it can be confusing. */ - if ( size->strike_index != 0xFFFFFFFFUL && - ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) - { - error = load_sbit_image( size, glyph, glyph_index, load_flags ); - if ( !error ) - { - if ( FT_IS_SCALABLE( glyph->face ) ) - { - /* for the bbox we need the header only */ - (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE ); - (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE ); - glyph->linearHoriAdvance = loader.linear; - glyph->linearVertAdvance = loader.vadvance; - - /* sanity checks: if `xxxAdvance' in the sbit metric */ - /* structure isn't set, use `linearXXXAdvance' */ - if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance ) - glyph->metrics.horiAdvance = - FT_MulFix( glyph->linearHoriAdvance, - size->root.metrics.x_scale ); - if ( !glyph->metrics.vertAdvance && glyph->linearVertAdvance ) - glyph->metrics.vertAdvance = - FT_MulFix( glyph->linearVertAdvance, - size->root.metrics.y_scale ); - } - - return FT_Err_Ok; - } - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */ - if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid ) - return FT_THROW( Invalid_Size_Handle ); - - if ( load_flags & FT_LOAD_SBITS_ONLY ) - return FT_THROW( Invalid_Argument ); - - error = tt_loader_init( &loader, size, glyph, load_flags, FALSE ); - if ( error ) - return error; - - glyph->format = FT_GLYPH_FORMAT_OUTLINE; - glyph->num_subglyphs = 0; - glyph->outline.flags = 0; - - /* main loading loop */ - error = load_truetype_glyph( &loader, glyph_index, 0, FALSE ); - if ( !error ) - { - if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE ) - { - glyph->num_subglyphs = loader.gloader->base.num_subglyphs; - glyph->subglyphs = loader.gloader->base.subglyphs; - } - else - { - glyph->outline = loader.gloader->base.outline; - glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS; - - /* Translate array so that (0,0) is the glyph's origin. Note */ - /* that this behaviour is independent on the value of bit 1 of */ - /* the `flags' field in the `head' table -- at least major */ - /* applications like Acroread indicate that. */ - if ( loader.pp1.x ) - FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 ); - } - -#ifdef TT_USE_BYTECODE_INTERPRETER - - if ( IS_HINTED( load_flags ) ) - { - if ( loader.exec->GS.scan_control ) - { - /* convert scan conversion mode to FT_OUTLINE_XXX flags */ - switch ( loader.exec->GS.scan_type ) - { - case 0: /* simple drop-outs including stubs */ - glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS; - break; - case 1: /* simple drop-outs excluding stubs */ - /* nothing; it's the default rendering mode */ - break; - case 4: /* smart drop-outs including stubs */ - glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS | - FT_OUTLINE_INCLUDE_STUBS; - break; - case 5: /* smart drop-outs excluding stubs */ - glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS; - break; - - default: /* no drop-out control */ - glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; - break; - } - } - else - glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; - } - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - error = compute_glyph_metrics( &loader, glyph_index ); - } - - /* Set the `high precision' bit flag. */ - /* This is _critical_ to get correct output for monochrome */ - /* TrueType glyphs at all sizes using the bytecode interpreter. */ - /* */ - if ( !( load_flags & FT_LOAD_NO_SCALE ) && - size->root.metrics.y_ppem < 24 ) - glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/truetype/ttgload.h b/3party/freetype/src/truetype/ttgload.h deleted file mode 100644 index 8e3255e106..0000000000 --- a/3party/freetype/src/truetype/ttgload.h +++ /dev/null @@ -1,62 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttgload.h */ -/* */ -/* TrueType Glyph Loader (specification). */ -/* */ -/* Copyright 1996-2015 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 __TTGLOAD_H__ -#define __TTGLOAD_H__ - - -#include -#include "ttobjs.h" - -#ifdef TT_USE_BYTECODE_INTERPRETER -#include "ttinterp.h" -#endif - - -FT_BEGIN_HEADER - - - FT_LOCAL( void ) - TT_Init_Glyph_Loading( TT_Face face ); - - FT_LOCAL( void ) - TT_Get_HMetrics( TT_Face face, - FT_UInt idx, - FT_Short* lsb, - FT_UShort* aw ); - - FT_LOCAL( void ) - TT_Get_VMetrics( TT_Face face, - FT_UInt idx, - FT_Pos yMax, - FT_Short* tsb, - FT_UShort* ah ); - - FT_LOCAL( FT_Error ) - TT_Load_Glyph( TT_Size size, - TT_GlyphSlot glyph, - FT_UInt glyph_index, - FT_Int32 load_flags ); - - -FT_END_HEADER - -#endif /* __TTGLOAD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/truetype/ttgxvar.c b/3party/freetype/src/truetype/ttgxvar.c deleted file mode 100644 index dd9e250c94..0000000000 --- a/3party/freetype/src/truetype/ttgxvar.c +++ /dev/null @@ -1,2074 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttgxvar.c */ -/* */ -/* TrueType GX Font Variation loader */ -/* */ -/* Copyright 2004-2015 by */ -/* David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. */ -/* */ -/* 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Apple documents the `fvar', `gvar', `cvar', and `avar' tables at */ - /* */ - /* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6[fgca]var.html */ - /* */ - /* The documentation for `fvar' is inconsistent. At one point it says */ - /* that `countSizePairs' should be 3, at another point 2. It should */ - /* be 2. */ - /* */ - /* The documentation for `gvar' is not intelligible; `cvar' refers you */ - /* to `gvar' and is thus also incomprehensible. */ - /* */ - /* The documentation for `avar' appears correct, but Apple has no fonts */ - /* with an `avar' table, so it is hard to test. */ - /* */ - /* Many thanks to John Jenkins (at Apple) in figuring this out. */ - /* */ - /* */ - /* Apple's `kern' table has some references to tuple indices, but as */ - /* there is no indication where these indices are defined, nor how to */ - /* interpolate the kerning values (different tuples have different */ - /* classes) this issue is ignored. */ - /* */ - /*************************************************************************/ - - -#include -#include FT_INTERNAL_DEBUG_H -#include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_TRUETYPE_TAGS_H -#include FT_MULTIPLE_MASTERS_H - -#include "ttpload.h" -#include "ttgxvar.h" - -#include "tterrors.h" - - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - - -#define FT_Stream_FTell( stream ) \ - (FT_ULong)( (stream)->cursor - (stream)->base ) -#define FT_Stream_SeekSet( stream, off ) \ - ( (stream)->cursor = (stream)->base + (off) ) - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttgxvar - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Internal Routines *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* The macro ALL_POINTS is used in `ft_var_readpackedpoints'. It */ - /* indicates that there is a delta for every point without needing to */ - /* enumerate all of them. */ - /* */ - - /* ensure that value `0' has the same width as a pointer */ -#define ALL_POINTS (FT_UShort*)~(FT_PtrDist)0 - - -#define GX_PT_POINTS_ARE_WORDS 0x80U -#define GX_PT_POINT_RUN_COUNT_MASK 0x7FU - - - /*************************************************************************/ - /* */ - /* */ - /* ft_var_readpackedpoints */ - /* */ - /* */ - /* Read a set of points to which the following deltas will apply. */ - /* Points are packed with a run length encoding. */ - /* */ - /* */ - /* stream :: The data stream. */ - /* */ - /* */ - /* point_cnt :: The number of points read. A zero value means that */ - /* all points in the glyph will be affected, without */ - /* enumerating them individually. */ - /* */ - /* */ - /* An array of FT_UShort containing the affected points or the */ - /* special value ALL_POINTS. */ - /* */ - static FT_UShort* - ft_var_readpackedpoints( FT_Stream stream, - FT_UInt *point_cnt ) - { - FT_UShort *points = NULL; - FT_UInt n; - FT_UInt runcnt; - FT_UInt i, j; - FT_UShort first; - FT_Memory memory = stream->memory; - FT_Error error = FT_Err_Ok; - - FT_UNUSED( error ); - - - *point_cnt = 0; - - n = FT_GET_BYTE(); - if ( n == 0 ) - return ALL_POINTS; - - if ( n & GX_PT_POINTS_ARE_WORDS ) - { - n &= GX_PT_POINT_RUN_COUNT_MASK; - n <<= 8; - n |= FT_GET_BYTE(); - } - - if ( FT_NEW_ARRAY( points, n ) ) - return NULL; - - *point_cnt = n; - - i = 0; - while ( i < n ) - { - runcnt = FT_GET_BYTE(); - if ( runcnt & GX_PT_POINTS_ARE_WORDS ) - { - runcnt &= GX_PT_POINT_RUN_COUNT_MASK; - first = FT_GET_USHORT(); - points[i++] = first; - - if ( runcnt < 1 || i + runcnt > n ) - goto Exit; - - /* first point not included in run count */ - for ( j = 0; j < runcnt; j++ ) - { - first += FT_GET_USHORT(); - points[i++] = first; - } - } - else - { - first = FT_GET_BYTE(); - points[i++] = first; - - if ( runcnt < 1 || i + runcnt > n ) - goto Exit; - - for ( j = 0; j < runcnt; j++ ) - { - first += FT_GET_BYTE(); - points[i++] = first; - } - } - } - - Exit: - return points; - } - - -#define GX_DT_DELTAS_ARE_ZERO 0x80U -#define GX_DT_DELTAS_ARE_WORDS 0x40U -#define GX_DT_DELTA_RUN_COUNT_MASK 0x3FU - - - /*************************************************************************/ - /* */ - /* */ - /* ft_var_readpackeddeltas */ - /* */ - /* */ - /* Read a set of deltas. These are packed slightly differently than */ - /* points. In particular there is no overall count. */ - /* */ - /* */ - /* stream :: The data stream. */ - /* */ - /* delta_cnt :: The number of deltas to be read. */ - /* */ - /* */ - /* An array of FT_Short containing the deltas for the affected */ - /* points. (This only gets the deltas for one dimension. It will */ - /* generally be called twice, once for x, once for y. When used in */ - /* cvt table, it will only be called once.) */ - /* */ - static FT_Short* - ft_var_readpackeddeltas( FT_Stream stream, - FT_UInt delta_cnt ) - { - FT_Short *deltas = NULL; - FT_UInt runcnt, cnt; - FT_UInt i, j; - FT_Memory memory = stream->memory; - FT_Error error = FT_Err_Ok; - - FT_UNUSED( error ); - - - if ( FT_NEW_ARRAY( deltas, delta_cnt ) ) - return NULL; - - i = 0; - while ( i < delta_cnt ) - { - runcnt = FT_GET_BYTE(); - cnt = runcnt & GX_DT_DELTA_RUN_COUNT_MASK; - - if ( runcnt & GX_DT_DELTAS_ARE_ZERO ) - { - /* `runcnt' zeroes get added */ - for ( j = 0; j <= cnt && i < delta_cnt; j++ ) - deltas[i++] = 0; - } - else if ( runcnt & GX_DT_DELTAS_ARE_WORDS ) - { - /* `runcnt' shorts from the stack */ - for ( j = 0; j <= cnt && i < delta_cnt; j++ ) - deltas[i++] = FT_GET_SHORT(); - } - else - { - /* `runcnt' signed bytes from the stack */ - for ( j = 0; j <= cnt && i < delta_cnt; j++ ) - deltas[i++] = FT_GET_CHAR(); - } - - if ( j <= cnt ) - { - /* bad format */ - FT_FREE( deltas ); - return NULL; - } - } - - return deltas; - } - - - /*************************************************************************/ - /* */ - /* */ - /* ft_var_load_avar */ - /* */ - /* */ - /* Parse the `avar' table if present. It need not be, so we return */ - /* nothing. */ - /* */ - /* */ - /* face :: The font face. */ - /* */ - static void - ft_var_load_avar( TT_Face face ) - { - FT_Stream stream = FT_FACE_STREAM( face ); - FT_Memory memory = stream->memory; - GX_Blend blend = face->blend; - GX_AVarSegment segment; - FT_Error error = FT_Err_Ok; - FT_Long version; - FT_Long axisCount; - FT_Int i, j; - FT_ULong table_len; - - FT_UNUSED( error ); - - - FT_TRACE2(( "AVAR " )); - - blend->avar_checked = TRUE; - error = face->goto_table( face, TTAG_avar, stream, &table_len ); - if ( error ) - { - FT_TRACE2(( "is missing\n" )); - return; - } - - if ( FT_FRAME_ENTER( table_len ) ) - return; - - version = FT_GET_LONG(); - axisCount = FT_GET_LONG(); - - if ( version != 0x00010000L ) - { - FT_TRACE2(( "bad table version\n" )); - goto Exit; - } - - FT_TRACE2(( "loaded\n" )); - - if ( axisCount != (FT_Long)blend->mmvar->num_axis ) - { - FT_TRACE2(( "ft_var_load_avar: number of axes in `avar' and `cvar'\n" - " table are different\n" )); - goto Exit; - } - - if ( FT_NEW_ARRAY( blend->avar_segment, axisCount ) ) - goto Exit; - - segment = &blend->avar_segment[0]; - for ( i = 0; i < axisCount; i++, segment++ ) - { - FT_TRACE5(( " axis %d:\n", i )); - - segment->pairCount = FT_GET_USHORT(); - if ( FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) ) - { - /* Failure. Free everything we have done so far. We must do */ - /* it right now since loading the `avar' table is optional. */ - - for ( j = i - 1; j >= 0; j-- ) - FT_FREE( blend->avar_segment[j].correspondence ); - - FT_FREE( blend->avar_segment ); - blend->avar_segment = NULL; - goto Exit; - } - - for ( j = 0; j < segment->pairCount; j++ ) - { - /* convert to Fixed */ - segment->correspondence[j].fromCoord = FT_GET_SHORT() * 4; - segment->correspondence[j].toCoord = FT_GET_SHORT() * 4; - - FT_TRACE5(( " mapping %.4f to %.4f\n", - segment->correspondence[j].fromCoord / 65536.0, - segment->correspondence[j].toCoord / 65536.0 )); - } - - FT_TRACE5(( "\n" )); - } - - Exit: - FT_FRAME_EXIT(); - } - - - typedef struct GX_GVar_Head_ - { - FT_Long version; - FT_UShort axisCount; - FT_UShort globalCoordCount; - FT_ULong offsetToCoord; - FT_UShort glyphCount; - FT_UShort flags; - FT_ULong offsetToData; - - } GX_GVar_Head; - - - /*************************************************************************/ - /* */ - /* */ - /* ft_var_load_gvar */ - /* */ - /* */ - /* Parse the `gvar' table if present. If `fvar' is there, `gvar' had */ - /* better be there too. */ - /* */ - /* */ - /* face :: The font face. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - ft_var_load_gvar( TT_Face face ) - { - FT_Stream stream = FT_FACE_STREAM( face ); - FT_Memory memory = stream->memory; - GX_Blend blend = face->blend; - FT_Error error; - FT_UInt i, j; - FT_ULong table_len; - FT_ULong gvar_start; - FT_ULong offsetToData; - GX_GVar_Head gvar_head; - - static const FT_Frame_Field gvar_fields[] = - { - -#undef FT_STRUCTURE -#define FT_STRUCTURE GX_GVar_Head - - FT_FRAME_START( 20 ), - FT_FRAME_LONG ( version ), - FT_FRAME_USHORT( axisCount ), - FT_FRAME_USHORT( globalCoordCount ), - FT_FRAME_ULONG ( offsetToCoord ), - FT_FRAME_USHORT( glyphCount ), - FT_FRAME_USHORT( flags ), - FT_FRAME_ULONG ( offsetToData ), - FT_FRAME_END - }; - - - FT_TRACE2(( "GVAR " )); - - if ( ( error = face->goto_table( face, - TTAG_gvar, - stream, - &table_len ) ) != 0 ) - { - FT_TRACE2(( "is missing\n" )); - goto Exit; - } - - gvar_start = FT_STREAM_POS( ); - if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) ) - goto Exit; - - blend->tuplecount = gvar_head.globalCoordCount; - blend->gv_glyphcnt = gvar_head.glyphCount; - offsetToData = gvar_start + gvar_head.offsetToData; - - if ( gvar_head.version != 0x00010000L ) - { - FT_TRACE1(( "bad table version\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - FT_TRACE2(( "loaded\n" )); - - if ( gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis ) - { - FT_TRACE1(( "ft_var_load_gvar: number of axes in `gvar' and `cvar'\n" - " table are different\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - FT_TRACE5(( "gvar: there are %d shared coordinates:\n", - blend->tuplecount )); - - if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) ) - goto Exit; - - if ( gvar_head.flags & 1 ) - { - /* long offsets (one more offset than glyphs, to mark size of last) */ - if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) ) - goto Exit; - - for ( i = 0; i <= blend->gv_glyphcnt; i++ ) - blend->glyphoffsets[i] = offsetToData + FT_GET_ULONG(); - - FT_FRAME_EXIT(); - } - else - { - /* short offsets (one more offset than glyphs, to mark size of last) */ - if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) ) - goto Exit; - - for ( i = 0; i <= blend->gv_glyphcnt; i++ ) - blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2; - /* XXX: Undocumented: `*2'! */ - - FT_FRAME_EXIT(); - } - - if ( blend->tuplecount != 0 ) - { - if ( FT_NEW_ARRAY( blend->tuplecoords, - gvar_head.axisCount * blend->tuplecount ) ) - goto Exit; - - if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord ) || - FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L ) ) - goto Exit; - - for ( i = 0; i < blend->tuplecount; i++ ) - { - FT_TRACE5(( " [ " )); - for ( j = 0 ; j < (FT_UInt)gvar_head.axisCount; j++ ) - { - blend->tuplecoords[i * gvar_head.axisCount + j] = - FT_GET_SHORT() * 4; /* convert to FT_Fixed */ - FT_TRACE5(( "%.4f ", - blend->tuplecoords[i * gvar_head.axisCount + j] / 65536.0 )); - } - FT_TRACE5(( "]\n" )); - } - - FT_TRACE5(( "\n" )); - - FT_FRAME_EXIT(); - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* */ - /* ft_var_apply_tuple */ - /* */ - /* */ - /* Figure out whether a given tuple (design) applies to the current */ - /* blend, and if so, what is the scaling factor. */ - /* */ - /* */ - /* blend :: The current blend of the font. */ - /* */ - /* tupleIndex :: A flag saying whether this is an intermediate */ - /* tuple or not. */ - /* */ - /* tuple_coords :: The coordinates of the tuple in normalized axis */ - /* units. */ - /* */ - /* im_start_coords :: The initial coordinates where this tuple starts */ - /* to apply (for intermediate coordinates). */ - /* */ - /* im_end_coords :: The final coordinates after which this tuple no */ - /* longer applies (for intermediate coordinates). */ - /* */ - /* */ - /* An FT_Fixed value containing the scaling factor. */ - /* */ - static FT_Fixed - ft_var_apply_tuple( GX_Blend blend, - FT_UShort tupleIndex, - FT_Fixed* tuple_coords, - FT_Fixed* im_start_coords, - FT_Fixed* im_end_coords ) - { - FT_UInt i; - FT_Fixed apply = 0x10000L; - - - for ( i = 0; i < blend->num_axis; i++ ) - { - FT_TRACE6(( " axis coordinate %d (%.4f):\n", - i, blend->normalizedcoords[i] / 65536.0 )); - - /* It's not clear why (for intermediate tuples) we don't need */ - /* to check against start/end -- the documentation says we don't. */ - /* Similarly, it's unclear why we don't need to scale along the */ - /* axis. */ - - if ( tuple_coords[i] == 0 ) - { - FT_TRACE6(( " tuple coordinate is zero, ignored\n", i )); - continue; - } - - else if ( blend->normalizedcoords[i] == 0 ) - { - FT_TRACE6(( " axis coordinate is zero, stop\n" )); - apply = 0; - break; - } - - else if ( ( blend->normalizedcoords[i] < 0 && tuple_coords[i] > 0 ) || - ( blend->normalizedcoords[i] > 0 && tuple_coords[i] < 0 ) ) - { - FT_TRACE6(( " tuple coordinate value %.4f is exceeded, stop\n", - tuple_coords[i] / 65536.0 )); - apply = 0; - break; - } - - else if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) ) - { - FT_TRACE6(( " tuple coordinate value %.4f fits\n", - tuple_coords[i] / 65536.0 )); - /* not an intermediate tuple */ - apply = FT_MulFix( apply, - blend->normalizedcoords[i] > 0 - ? blend->normalizedcoords[i] - : -blend->normalizedcoords[i] ); - } - - else if ( blend->normalizedcoords[i] < im_start_coords[i] || - blend->normalizedcoords[i] > im_end_coords[i] ) - { - FT_TRACE6(( " intermediate tuple range [%.4f;%.4f] is exceeded," - " stop\n", - im_start_coords[i] / 65536.0, - im_end_coords[i] / 65536.0 )); - apply = 0; - break; - } - - else if ( blend->normalizedcoords[i] < tuple_coords[i] ) - { - FT_TRACE6(( " intermediate tuple range [%.4f;%.4f] fits\n", - im_start_coords[i] / 65536.0, - im_end_coords[i] / 65536.0 )); - apply = FT_MulDiv( apply, - blend->normalizedcoords[i] - im_start_coords[i], - tuple_coords[i] - im_start_coords[i] ); - } - - else - { - FT_TRACE6(( " intermediate tuple range [%.4f;%.4f] fits\n", - im_start_coords[i] / 65536.0, - im_end_coords[i] / 65536.0 )); - apply = FT_MulDiv( apply, - im_end_coords[i] - blend->normalizedcoords[i], - im_end_coords[i] - tuple_coords[i] ); - } - } - - FT_TRACE6(( " apply factor is %.4f\n", apply / 65536.0 )); - - return apply; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** MULTIPLE MASTERS SERVICE FUNCTIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - typedef struct GX_FVar_Head_ - { - FT_Long version; - FT_UShort offsetToData; - FT_UShort countSizePairs; - FT_UShort axisCount; - FT_UShort axisSize; - FT_UShort instanceCount; - FT_UShort instanceSize; - - } GX_FVar_Head; - - - typedef struct fvar_axis_ - { - FT_ULong axisTag; - FT_Fixed minValue; - FT_Fixed defaultValue; - FT_Fixed maxValue; - FT_UShort flags; - FT_UShort nameID; - - } GX_FVar_Axis; - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Get_MM_Var */ - /* */ - /* */ - /* Check that the font's `fvar' table is valid, parse it, and return */ - /* those data. */ - /* */ - /* */ - /* face :: The font face. */ - /* TT_Get_MM_Var initializes the blend structure. */ - /* */ - /* */ - /* master :: The `fvar' data (must be freed by caller). Can be NULL, */ - /* which makes this function simply load MM support. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Get_MM_Var( TT_Face face, - FT_MM_Var* *master ) - { - FT_Stream stream = face->root.stream; - FT_Memory memory = face->root.memory; - FT_ULong table_len; - FT_Error error = FT_Err_Ok; - FT_ULong fvar_start; - FT_Int i, j; - FT_MM_Var* mmvar = NULL; - FT_Fixed* next_coords; - FT_String* next_name; - FT_Var_Axis* a; - FT_Var_Named_Style* ns; - GX_FVar_Head fvar_head; - - static const FT_Frame_Field fvar_fields[] = - { - -#undef FT_STRUCTURE -#define FT_STRUCTURE GX_FVar_Head - - FT_FRAME_START( 16 ), - FT_FRAME_LONG ( version ), - FT_FRAME_USHORT( offsetToData ), - FT_FRAME_USHORT( countSizePairs ), - FT_FRAME_USHORT( axisCount ), - FT_FRAME_USHORT( axisSize ), - FT_FRAME_USHORT( instanceCount ), - FT_FRAME_USHORT( instanceSize ), - FT_FRAME_END - }; - - static const FT_Frame_Field fvaraxis_fields[] = - { - -#undef FT_STRUCTURE -#define FT_STRUCTURE GX_FVar_Axis - - FT_FRAME_START( 20 ), - FT_FRAME_ULONG ( axisTag ), - FT_FRAME_LONG ( minValue ), - FT_FRAME_LONG ( defaultValue ), - FT_FRAME_LONG ( maxValue ), - FT_FRAME_USHORT( flags ), - FT_FRAME_USHORT( nameID ), - FT_FRAME_END - }; - - - /* read the font data and set up the internal representation */ - /* if not already done */ - - if ( face->blend == NULL ) - { - FT_TRACE2(( "FVAR " )); - - /* both `fvar' and `gvar' must be present */ - if ( ( error = face->goto_table( face, TTAG_gvar, - stream, &table_len ) ) != 0 ) - { - FT_TRACE1(( "\n" - "TT_Get_MM_Var: `gvar' table is missing\n" )); - goto Exit; - } - - if ( ( error = face->goto_table( face, TTAG_fvar, - stream, &table_len ) ) != 0 ) - { - FT_TRACE1(( "is missing\n" )); - goto Exit; - } - - fvar_start = FT_STREAM_POS( ); - - if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) ) - goto Exit; - - if ( fvar_head.version != (FT_Long)0x00010000L || -#if 0 - /* fonts like `JamRegular.ttf' have an incorrect value for */ - /* `countSizePairs'; since value 2 is hard-coded in `fvar' */ - /* version 1.0, we simply ignore it */ - fvar_head.countSizePairs != 2 || -#endif - fvar_head.axisSize != 20 || - /* axisCount limit implied by 16-bit instanceSize */ - fvar_head.axisCount > 0x3FFE || - fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount || - /* instanceCount limit implied by limited range of name IDs */ - fvar_head.instanceCount > 0x7EFF || - fvar_head.offsetToData + fvar_head.axisCount * 20U + - fvar_head.instanceCount * fvar_head.instanceSize > table_len ) - { - FT_TRACE1(( "\n" - "TT_Get_MM_Var: invalid `fvar' header\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - FT_TRACE2(( "loaded\n" )); - - FT_TRACE5(( "number of GX style axes: %d\n", fvar_head.axisCount )); - - if ( FT_NEW( face->blend ) ) - goto Exit; - - /* cannot overflow 32-bit arithmetic because of limits above */ - face->blend->mmvar_len = - sizeof ( FT_MM_Var ) + - fvar_head.axisCount * sizeof ( FT_Var_Axis ) + - fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) + - fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) + - 5 * fvar_head.axisCount; - - if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) - goto Exit; - face->blend->mmvar = mmvar; - - /* set up pointers and offsets into the `mmvar' array; */ - /* the data gets filled in later on */ - - mmvar->num_axis = - fvar_head.axisCount; - mmvar->num_designs = - ~0U; /* meaningless in this context; each glyph */ - /* may have a different number of designs */ - /* (or tuples, as called by Apple) */ - mmvar->num_namedstyles = - fvar_head.instanceCount; - mmvar->axis = - (FT_Var_Axis*)&( mmvar[1] ); - mmvar->namedstyle = - (FT_Var_Named_Style*)&( mmvar->axis[fvar_head.axisCount] ); - - next_coords = - (FT_Fixed*)&( mmvar->namedstyle[fvar_head.instanceCount] ); - for ( i = 0; i < fvar_head.instanceCount; i++ ) - { - mmvar->namedstyle[i].coords = next_coords; - next_coords += fvar_head.axisCount; - } - - next_name = (FT_String*)next_coords; - for ( i = 0; i < fvar_head.axisCount; i++ ) - { - mmvar->axis[i].name = next_name; - next_name += 5; - } - - /* now fill in the data */ - - if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) ) - goto Exit; - - a = mmvar->axis; - for ( i = 0; i < fvar_head.axisCount; i++ ) - { - GX_FVar_Axis axis_rec; - - - if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) ) - goto Exit; - a->tag = axis_rec.axisTag; - a->minimum = axis_rec.minValue; - a->def = axis_rec.defaultValue; - a->maximum = axis_rec.maxValue; - a->strid = axis_rec.nameID; - - a->name[0] = (FT_String)( a->tag >> 24 ); - a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF ); - a->name[2] = (FT_String)( ( a->tag >> 8 ) & 0xFF ); - a->name[3] = (FT_String)( ( a->tag ) & 0xFF ); - a->name[4] = '\0'; - - FT_TRACE5(( " \"%s\": minimum=%.4f, default=%.4f, maximum=%.4f\n", - a->name, - a->minimum / 65536.0, - a->def / 65536.0, - a->maximum / 65536.0 )); - - a++; - } - - FT_TRACE5(( "\n" )); - - ns = mmvar->namedstyle; - for ( i = 0; i < fvar_head.instanceCount; i++, ns++ ) - { - if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) ) - goto Exit; - - ns->strid = FT_GET_USHORT(); - (void) /* flags = */ FT_GET_USHORT(); - - for ( j = 0; j < fvar_head.axisCount; j++ ) - ns->coords[j] = FT_GET_LONG(); - - FT_FRAME_EXIT(); - } - } - - /* fill the output array if requested */ - - if ( master != NULL ) - { - FT_UInt n; - - - if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) - goto Exit; - FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len ); - - mmvar->axis = - (FT_Var_Axis*)&( mmvar[1] ); - mmvar->namedstyle = - (FT_Var_Named_Style*)&( mmvar->axis[mmvar->num_axis] ); - next_coords = - (FT_Fixed*)&( mmvar->namedstyle[mmvar->num_namedstyles] ); - - for ( n = 0; n < mmvar->num_namedstyles; n++ ) - { - mmvar->namedstyle[n].coords = next_coords; - next_coords += mmvar->num_axis; - } - - a = mmvar->axis; - next_name = (FT_String*)next_coords; - for ( n = 0; n < mmvar->num_axis; n++ ) - { - a->name = next_name; - - /* standard PostScript names for some standard apple tags */ - if ( a->tag == TTAG_wght ) - a->name = (char*)"Weight"; - else if ( a->tag == TTAG_wdth ) - a->name = (char*)"Width"; - else if ( a->tag == TTAG_opsz ) - a->name = (char*)"OpticalSize"; - else if ( a->tag == TTAG_slnt ) - a->name = (char*)"Slant"; - - next_name += 5; - a++; - } - - *master = mmvar; - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Set_MM_Blend */ - /* */ - /* */ - /* Set the blend (normalized) coordinates for this instance of the */ - /* font. Check that the `gvar' table is reasonable and does some */ - /* initial preparation. */ - /* */ - /* */ - /* face :: The font. */ - /* Initialize the blend structure with `gvar' data. */ - /* */ - /* */ - /* num_coords :: The number of available coordinates. If it is */ - /* larger than the number of axes, ignore the excess */ - /* values. If it is smaller than the number of axes, */ - /* use the default value (0) for the remaining axes. */ - /* */ - /* coords :: An array of `num_coords', each between [-1,1]. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Set_MM_Blend( TT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ) - { - FT_Error error = FT_Err_Ok; - GX_Blend blend; - FT_MM_Var* mmvar; - FT_UInt i; - FT_Memory memory = face->root.memory; - - enum - { - mcvt_retain, - mcvt_modify, - mcvt_load - - } manageCvt; - - - face->doblend = FALSE; - - if ( face->blend == NULL ) - { - if ( ( error = TT_Get_MM_Var( face, NULL ) ) != 0 ) - goto Exit; - } - - blend = face->blend; - mmvar = blend->mmvar; - - if ( num_coords > mmvar->num_axis ) - { - FT_TRACE2(( "TT_Set_MM_Blend: only using first %d of %d coordinates\n", - mmvar->num_axis, num_coords )); - num_coords = mmvar->num_axis; - } - - FT_TRACE5(( "normalized design coordinates:\n" )); - - for ( i = 0; i < num_coords; i++ ) - { - FT_TRACE5(( " %.4f\n", coords[i] / 65536.0 )); - if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L ) - { - FT_TRACE1(( "TT_Set_MM_Blend: normalized design coordinate %.4f\n" - " is out of range [-1;1]\n", - coords[i] / 65536.0 )); - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - } - - FT_TRACE5(( "\n" )); - - if ( blend->glyphoffsets == NULL ) - if ( ( error = ft_var_load_gvar( face ) ) != 0 ) - goto Exit; - - if ( blend->normalizedcoords == NULL ) - { - if ( FT_NEW_ARRAY( blend->normalizedcoords, mmvar->num_axis ) ) - goto Exit; - - manageCvt = mcvt_modify; - - /* If we have not set the blend coordinates before this, then the */ - /* cvt table will still be what we read from the `cvt ' table and */ - /* we don't need to reload it. We may need to change it though... */ - } - else - { - manageCvt = mcvt_retain; - - for ( i = 0; i < num_coords; i++ ) - { - if ( blend->normalizedcoords[i] != coords[i] ) - { - manageCvt = mcvt_load; - break; - } - } - - for ( ; i < mmvar->num_axis; i++ ) - { - if ( blend->normalizedcoords[i] != 0 ) - { - manageCvt = mcvt_load; - break; - } - } - - /* If we don't change the blend coords then we don't need to do */ - /* anything to the cvt table. It will be correct. Otherwise we */ - /* no longer have the original cvt (it was modified when we set */ - /* the blend last time), so we must reload and then modify it. */ - } - - blend->num_axis = mmvar->num_axis; - FT_MEM_COPY( blend->normalizedcoords, - coords, - num_coords * sizeof ( FT_Fixed ) ); - - face->doblend = TRUE; - - if ( face->cvt != NULL ) - { - switch ( manageCvt ) - { - case mcvt_load: - /* The cvt table has been loaded already; every time we change the */ - /* blend we may need to reload and remodify the cvt table. */ - FT_FREE( face->cvt ); - face->cvt = NULL; - - error = tt_face_load_cvt( face, face->root.stream ); - break; - - case mcvt_modify: - /* The original cvt table is in memory. All we need to do is */ - /* apply the `cvar' table (if any). */ - error = tt_face_vary_cvt( face, face->root.stream ); - break; - - case mcvt_retain: - /* The cvt table is correct for this set of coordinates. */ - break; - } - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Set_Var_Design */ - /* */ - /* */ - /* Set the coordinates for the instance, measured in the user */ - /* coordinate system. Parse the `avar' table (if present) to convert */ - /* from user to normalized coordinates. */ - /* */ - /* */ - /* face :: The font face. */ - /* Initialize the blend struct with `gvar' data. */ - /* */ - /* */ - /* num_coords :: The number of available coordinates. If it is */ - /* larger than the number of axes, ignore the excess */ - /* values. If it is smaller than the number of axes, */ - /* use the default values for the remaining axes. */ - /* */ - /* coords :: A coordinate array with `num_coords' elements. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Set_Var_Design( TT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ) - { - FT_Error error = FT_Err_Ok; - FT_Fixed* normalized = NULL; - GX_Blend blend; - FT_MM_Var* mmvar; - FT_UInt i, j; - FT_Var_Axis* a; - GX_AVarSegment av; - FT_Memory memory = face->root.memory; - - - if ( face->blend == NULL ) - { - if ( ( error = TT_Get_MM_Var( face, NULL ) ) != 0 ) - goto Exit; - } - - blend = face->blend; - mmvar = blend->mmvar; - - if ( num_coords > mmvar->num_axis ) - { - FT_TRACE2(( "TT_Set_Var_Design:" - " only using first %d of %d coordinates\n", - mmvar->num_axis, num_coords )); - num_coords = mmvar->num_axis; - } - - /* Axis normalization is a two stage process. First we normalize */ - /* based on the [min,def,max] values for the axis to be [-1,0,1]. */ - /* Then, if there's an `avar' table, we renormalize this range. */ - - if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) ) - goto Exit; - - FT_TRACE5(( "design coordinates:\n" )); - - a = mmvar->axis; - for ( i = 0; i < num_coords; i++, a++ ) - { - FT_TRACE5(( " %.4f\n", coords[i] / 65536.0 )); - if ( coords[i] > a->maximum || coords[i] < a->minimum ) - { - FT_TRACE1(( "TT_Set_Var_Design: normalized design coordinate %.4f\n" - " is out of range [%.4f;%.4f]\n", - coords[i] / 65536.0, - a->minimum / 65536.0, - a->maximum / 65536.0 )); - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - if ( coords[i] < a->def ) - normalized[i] = -FT_DivFix( coords[i] - a->def, - a->minimum - a->def ); - else if ( a->maximum == a->def ) - normalized[i] = 0; - else - normalized[i] = FT_DivFix( coords[i] - a->def, - a->maximum - a->def ); - } - - FT_TRACE5(( "\n" )); - - for ( ; i < mmvar->num_axis; i++ ) - normalized[i] = 0; - - if ( !blend->avar_checked ) - ft_var_load_avar( face ); - - if ( blend->avar_segment != NULL ) - { - FT_TRACE5(( "normalized design coordinates" - " before applying `avar' data:\n" )); - - av = blend->avar_segment; - for ( i = 0; i < mmvar->num_axis; i++, av++ ) - { - for ( j = 1; j < (FT_UInt)av->pairCount; j++ ) - { - FT_TRACE5(( " %.4f\n", normalized[i] / 65536.0 )); - if ( normalized[i] < av->correspondence[j].fromCoord ) - { - normalized[i] = - FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord, - av->correspondence[j].toCoord - - av->correspondence[j - 1].toCoord, - av->correspondence[j].fromCoord - - av->correspondence[j - 1].fromCoord ) + - av->correspondence[j - 1].toCoord; - break; - } - } - } - } - - error = TT_Set_MM_Blend( face, mmvar->num_axis, normalized ); - - Exit: - FT_FREE( normalized ); - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GX VAR PARSING ROUTINES *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* tt_face_vary_cvt */ - /* */ - /* */ - /* Modify the loaded cvt table according to the `cvar' table and the */ - /* font's blend. */ - /* */ - /* */ - /* face :: A handle to the target face object. */ - /* */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* Most errors are ignored. It is perfectly valid not to have a */ - /* `cvar' table even if there is a `gvar' and `fvar' table. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_vary_cvt( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - FT_Memory memory = stream->memory; - FT_ULong table_start; - FT_ULong table_len; - FT_UInt tupleCount; - FT_ULong offsetToData; - FT_ULong here; - FT_UInt i, j; - FT_Fixed* tuple_coords = NULL; - FT_Fixed* im_start_coords = NULL; - FT_Fixed* im_end_coords = NULL; - GX_Blend blend = face->blend; - FT_UInt point_count; - FT_UShort* localpoints; - FT_Short* deltas; - - - FT_TRACE2(( "CVAR " )); - - if ( blend == NULL ) - { - FT_TRACE2(( "\n" - "tt_face_vary_cvt: no blend specified\n" )); - error = FT_Err_Ok; - goto Exit; - } - - if ( face->cvt == NULL ) - { - FT_TRACE2(( "\n" - "tt_face_vary_cvt: no `cvt ' table\n" )); - error = FT_Err_Ok; - goto Exit; - } - - error = face->goto_table( face, TTAG_cvar, stream, &table_len ); - if ( error ) - { - FT_TRACE2(( "is missing\n" )); - - error = FT_Err_Ok; - goto Exit; - } - - if ( FT_FRAME_ENTER( table_len ) ) - { - error = FT_Err_Ok; - goto Exit; - } - - table_start = FT_Stream_FTell( stream ); - if ( FT_GET_LONG() != 0x00010000L ) - { - FT_TRACE2(( "bad table version\n" )); - - error = FT_Err_Ok; - goto FExit; - } - - FT_TRACE2(( "loaded\n" )); - - if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || - FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || - FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) - goto FExit; - - tupleCount = FT_GET_USHORT(); - offsetToData = table_start + FT_GET_USHORT(); - - /* The documentation implies there are flags packed into the */ - /* tuplecount, but John Jenkins says that shared points don't apply */ - /* to `cvar', and no other flags are defined. */ - - FT_TRACE5(( "cvar: there are %d tuples:\n", tupleCount )); - - for ( i = 0; i < ( tupleCount & 0xFFF ); i++ ) - { - FT_UInt tupleDataSize; - FT_UInt tupleIndex; - FT_Fixed apply; - - - FT_TRACE6(( " tuple %d:\n", i )); - - tupleDataSize = FT_GET_USHORT(); - tupleIndex = FT_GET_USHORT(); - - /* There is no provision here for a global tuple coordinate section, */ - /* so John says. There are no tuple indices, just embedded tuples. */ - - if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) - { - for ( j = 0; j < blend->num_axis; j++ ) - tuple_coords[j] = FT_GET_SHORT() * 4; /* convert from */ - /* short frac to fixed */ - } - else - { - /* skip this tuple; it makes no sense */ - - if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) - for ( j = 0; j < 2 * blend->num_axis; j++ ) - (void)FT_GET_SHORT(); - - offsetToData += tupleDataSize; - continue; - } - - if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) - { - for ( j = 0; j < blend->num_axis; j++ ) - im_start_coords[j] = FT_GET_SHORT() * 4; - for ( j = 0; j < blend->num_axis; j++ ) - im_end_coords[j] = FT_GET_SHORT() * 4; - } - - apply = ft_var_apply_tuple( blend, - (FT_UShort)tupleIndex, - tuple_coords, - im_start_coords, - im_end_coords ); - if ( /* tuple isn't active for our blend */ - apply == 0 || - /* global points not allowed, */ - /* if they aren't local, makes no sense */ - !( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) ) - { - offsetToData += tupleDataSize; - continue; - } - - here = FT_Stream_FTell( stream ); - - FT_Stream_SeekSet( stream, offsetToData ); - - localpoints = ft_var_readpackedpoints( stream, &point_count ); - deltas = ft_var_readpackeddeltas( stream, - point_count == 0 ? face->cvt_size - : point_count ); - if ( localpoints == NULL || deltas == NULL ) - ; /* failure, ignore it */ - - else if ( localpoints == ALL_POINTS ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - int count = 0; -#endif - - - FT_TRACE7(( " CVT deltas:\n" )); - - /* this means that there are deltas for every entry in cvt */ - for ( j = 0; j < face->cvt_size; j++ ) - { - FT_Long orig_cvt = face->cvt[j]; - - - face->cvt[j] = (FT_Short)( orig_cvt + - FT_MulFix( deltas[j], apply ) ); - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( orig_cvt != face->cvt[j] ) - { - FT_TRACE7(( " %d: %d -> %d\n", - j, orig_cvt, face->cvt[j] )); - count++; - } -#endif - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !count ) - FT_TRACE7(( " none\n" )); -#endif - } - - else - { -#ifdef FT_DEBUG_LEVEL_TRACE - int count = 0; -#endif - - - FT_TRACE7(( " CVT deltas:\n" )); - - for ( j = 0; j < point_count; j++ ) - { - int pindex = localpoints[j]; - FT_Long orig_cvt = face->cvt[pindex]; - - - face->cvt[pindex] = (FT_Short)( orig_cvt + - FT_MulFix( deltas[j], apply ) ); - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( orig_cvt != face->cvt[pindex] ) - { - FT_TRACE7(( " %d: %d -> %d\n", - pindex, orig_cvt, face->cvt[pindex] )); - count++; - } -#endif - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !count ) - FT_TRACE7(( " none\n" )); -#endif - } - - if ( localpoints != ALL_POINTS ) - FT_FREE( localpoints ); - FT_FREE( deltas ); - - offsetToData += tupleDataSize; - - FT_Stream_SeekSet( stream, here ); - } - - FT_TRACE5(( "\n" )); - - FExit: - FT_FRAME_EXIT(); - - Exit: - FT_FREE( tuple_coords ); - FT_FREE( im_start_coords ); - FT_FREE( im_end_coords ); - - return error; - } - - - /* Shift the original coordinates of all points between indices `p1' */ - /* and `p2', using the same difference as given by index `ref'. */ - - /* modeled after `af_iup_shift' */ - - static void - tt_delta_shift( int p1, - int p2, - int ref, - FT_Vector* in_points, - FT_Vector* out_points ) - { - int p; - FT_Vector delta; - - - delta.x = out_points[ref].x - in_points[ref].x; - delta.y = out_points[ref].y - in_points[ref].y; - - if ( delta.x == 0 && delta.y == 0 ) - return; - - for ( p = p1; p < ref; p++ ) - { - out_points[p].x += delta.x; - out_points[p].y += delta.y; - } - - for ( p = ref + 1; p <= p2; p++ ) - { - out_points[p].x += delta.x; - out_points[p].y += delta.y; - } - } - - - /* Interpolate the original coordinates of all points with indices */ - /* between `p1' and `p2', using `ref1' and `ref2' as the reference */ - /* point indices. */ - - /* modeled after `af_iup_interp', `_iup_worker_interpolate', and */ - /* `Ins_IUP' */ - - static void - tt_delta_interpolate( int p1, - int p2, - int ref1, - int ref2, - FT_Vector* in_points, - FT_Vector* out_points ) - { - int p, i; - - FT_Pos out, in1, in2, out1, out2, d1, d2; - - - if ( p1 > p2 ) - return; - - /* handle both horizontal and vertical coordinates */ - for ( i = 0; i <= 1; i++ ) - { - /* shift array pointers so that we can access `foo.y' as `foo.x' */ - in_points = (FT_Vector*)( (FT_Pos*)in_points + i ); - out_points = (FT_Vector*)( (FT_Pos*)out_points + i ); - - if ( in_points[ref1].x > in_points[ref2].x ) - { - p = ref1; - ref1 = ref2; - ref2 = p; - } - - in1 = in_points[ref1].x; - in2 = in_points[ref2].x; - out1 = out_points[ref1].x; - out2 = out_points[ref2].x; - d1 = out1 - in1; - d2 = out2 - in2; - - if ( out1 == out2 || in1 == in2 ) - { - for ( p = p1; p <= p2; p++ ) - { - out = in_points[p].x; - - if ( out <= in1 ) - out += d1; - else if ( out >= in2 ) - out += d2; - else - out = out1; - - out_points[p].x = out; - } - } - else - { - FT_Fixed scale = FT_DivFix( out2 - out1, in2 - in1 ); - - - for ( p = p1; p <= p2; p++ ) - { - out = in_points[p].x; - - if ( out <= in1 ) - out += d1; - else if ( out >= in2 ) - out += d2; - else - out = out1 + FT_MulFix( out - in1, scale ); - - out_points[p].x = out; - } - } - } - } - - - /* Interpolate points without delta values, similar to */ - /* the `IUP' hinting instruction. */ - - /* modeled after `Ins_IUP */ - - static void - tt_handle_deltas( FT_Outline* outline, - FT_Vector* in_points, - FT_Bool* has_delta ) - { - FT_Vector* out_points; - - FT_Int first_point; - FT_Int end_point; - - FT_Int first_delta; - FT_Int cur_delta; - - FT_Int point; - FT_Short contour; - - - /* ignore empty outlines */ - if ( !outline->n_contours ) - return; - - out_points = outline->points; - - contour = 0; - point = 0; - - do - { - end_point = outline->contours[contour]; - first_point = point; - - /* search first point that has a delta */ - while ( point <= end_point && !has_delta[point] ) - point++; - - if ( point <= end_point ) - { - first_delta = point; - cur_delta = point; - - point++; - - while ( point <= end_point ) - { - /* search next point that has a delta */ - /* and interpolate intermediate points */ - if ( has_delta[point] ) - { - tt_delta_interpolate( cur_delta + 1, - point - 1, - cur_delta, - point, - in_points, - out_points ); - cur_delta = point; - } - - point++; - } - - /* shift contour if we only have a single delta */ - if ( cur_delta == first_delta ) - tt_delta_shift( first_point, - end_point, - cur_delta, - in_points, - out_points ); - else - { - /* otherwise handle remaining points */ - /* at the end and beginning of the contour */ - tt_delta_interpolate( cur_delta + 1, - end_point, - cur_delta, - first_delta, - in_points, - out_points ); - - if ( first_delta > 0 ) - tt_delta_interpolate( first_point, - first_delta - 1, - cur_delta, - first_delta, - in_points, - out_points ); - } - } - contour++; - - } while ( contour < outline->n_contours ); - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Vary_Apply_Glyph_Deltas */ - /* */ - /* */ - /* Apply the appropriate deltas to the current glyph. */ - /* */ - /* */ - /* face :: A handle to the target face object. */ - /* */ - /* glyph_index :: The index of the glyph being modified. */ - /* */ - /* n_points :: The number of the points in the glyph, including */ - /* phantom points. */ - /* */ - /* */ - /* outline :: The outline to change. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Vary_Apply_Glyph_Deltas( TT_Face face, - FT_UInt glyph_index, - FT_Outline* outline, - FT_UInt n_points ) - { - FT_Stream stream = face->root.stream; - FT_Memory memory = stream->memory; - GX_Blend blend = face->blend; - - FT_Vector* points_org = NULL; - FT_Bool* has_delta = NULL; - - FT_Error error; - FT_ULong glyph_start; - FT_UInt tupleCount; - FT_ULong offsetToData; - FT_ULong here; - FT_UInt i, j; - FT_Fixed* tuple_coords = NULL; - FT_Fixed* im_start_coords = NULL; - FT_Fixed* im_end_coords = NULL; - FT_UInt point_count, spoint_count = 0; - FT_UShort* sharedpoints = NULL; - FT_UShort* localpoints = NULL; - FT_UShort* points; - FT_Short *deltas_x, *deltas_y; - - - if ( !face->doblend || blend == NULL ) - return FT_THROW( Invalid_Argument ); - - if ( glyph_index >= blend->gv_glyphcnt || - blend->glyphoffsets[glyph_index] == - blend->glyphoffsets[glyph_index + 1] ) - { - FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:" - " no variation data for this glyph\n" )); - return FT_Err_Ok; - } - - if ( FT_NEW_ARRAY( points_org, n_points ) || - FT_NEW_ARRAY( has_delta, n_points ) ) - goto Fail1; - - if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] ) || - FT_FRAME_ENTER( blend->glyphoffsets[glyph_index + 1] - - blend->glyphoffsets[glyph_index] ) ) - goto Fail1; - - glyph_start = FT_Stream_FTell( stream ); - - /* each set of glyph variation data is formatted similarly to `cvar' */ - /* (except we get shared points and global tuples) */ - - if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || - FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || - FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) - goto Fail2; - - tupleCount = FT_GET_USHORT(); - offsetToData = glyph_start + FT_GET_USHORT(); - - if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS ) - { - here = FT_Stream_FTell( stream ); - - FT_Stream_SeekSet( stream, offsetToData ); - - sharedpoints = ft_var_readpackedpoints( stream, &spoint_count ); - offsetToData = FT_Stream_FTell( stream ); - - FT_Stream_SeekSet( stream, here ); - } - - FT_TRACE5(( "gvar: there are %d tuples:\n", tupleCount )); - - for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); i++ ) - { - FT_UInt tupleDataSize; - FT_UInt tupleIndex; - FT_Fixed apply; - - - FT_TRACE6(( " tuple %d:\n", i )); - - tupleDataSize = FT_GET_USHORT(); - tupleIndex = FT_GET_USHORT(); - - if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) - { - for ( j = 0; j < blend->num_axis; j++ ) - tuple_coords[j] = FT_GET_SHORT() * 4; /* convert from */ - /* short frac to fixed */ - } - else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount ) - { - error = FT_THROW( Invalid_Table ); - goto Fail2; - } - else - FT_MEM_COPY( - tuple_coords, - &blend->tuplecoords[( tupleIndex & 0xFFF ) * blend->num_axis], - blend->num_axis * sizeof ( FT_Fixed ) ); - - if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) - { - for ( j = 0; j < blend->num_axis; j++ ) - im_start_coords[j] = FT_GET_SHORT() * 4; - for ( j = 0; j < blend->num_axis; j++ ) - im_end_coords[j] = FT_GET_SHORT() * 4; - } - - apply = ft_var_apply_tuple( blend, - (FT_UShort)tupleIndex, - tuple_coords, - im_start_coords, - im_end_coords ); - - if ( apply == 0 ) /* tuple isn't active for our blend */ - { - offsetToData += tupleDataSize; - continue; - } - - here = FT_Stream_FTell( stream ); - - if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) - { - FT_Stream_SeekSet( stream, offsetToData ); - - localpoints = ft_var_readpackedpoints( stream, &point_count ); - points = localpoints; - } - else - { - points = sharedpoints; - point_count = spoint_count; - } - - deltas_x = ft_var_readpackeddeltas( stream, - point_count == 0 ? n_points - : point_count ); - deltas_y = ft_var_readpackeddeltas( stream, - point_count == 0 ? n_points - : point_count ); - - if ( points == NULL || deltas_y == NULL || deltas_x == NULL ) - ; /* failure, ignore it */ - - else if ( points == ALL_POINTS ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - int count = 0; -#endif - - - FT_TRACE7(( " point deltas:\n" )); - - /* this means that there are deltas for every point in the glyph */ - for ( j = 0; j < n_points; j++ ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_Vector point_org = outline->points[j]; -#endif - - - outline->points[j].x += FT_MulFix( deltas_x[j], apply ); - outline->points[j].y += FT_MulFix( deltas_y[j], apply ); - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( ( point_org.x != outline->points[j].x ) || - ( point_org.y != outline->points[j].y ) ) - { - FT_TRACE7(( " %d: (%d, %d) -> (%d, %d)\n", - j, - point_org.x, - point_org.y, - outline->points[j].x, - outline->points[j].y )); - count++; - } -#endif - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !count ) - FT_TRACE7(( " none\n" )); -#endif - } - - else - { -#ifdef FT_DEBUG_LEVEL_TRACE - int count = 0; -#endif - - - /* we have to interpolate the missing deltas similar to the */ - /* IUP bytecode instruction */ - for ( j = 0; j < n_points; j++ ) - { - points_org[j] = outline->points[j]; - has_delta[j] = FALSE; - } - - for ( j = 0; j < point_count; j++ ) - { - FT_UShort idx = localpoints[j]; - - - if ( idx >= n_points ) - continue; - - has_delta[idx] = TRUE; - - outline->points[idx].x += FT_MulFix( deltas_x[j], apply ); - outline->points[idx].y += FT_MulFix( deltas_y[j], apply ); - } - - /* no need to handle phantom points here, */ - /* since solitary points can't be interpolated */ - tt_handle_deltas( outline, - points_org, - has_delta ); - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE7(( " point deltas:\n" )); - - for ( j = 0; j < n_points; j++) - { - if ( ( points_org[j].x != outline->points[j].x ) || - ( points_org[j].y != outline->points[j].y ) ) - { - FT_TRACE7(( " %d: (%d, %d) -> (%d, %d)\n", - j, - points_org[j].x, - points_org[j].y, - outline->points[j].x, - outline->points[j].y )); - count++; - } - } - - if ( !count ) - FT_TRACE7(( " none\n" )); -#endif - } - - if ( localpoints != ALL_POINTS ) - FT_FREE( localpoints ); - FT_FREE( deltas_x ); - FT_FREE( deltas_y ); - - offsetToData += tupleDataSize; - - FT_Stream_SeekSet( stream, here ); - } - - FT_TRACE5(( "\n" )); - - Fail2: - FT_FREE( tuple_coords ); - FT_FREE( im_start_coords ); - FT_FREE( im_end_coords ); - - FT_FRAME_EXIT(); - - Fail1: - FT_FREE( points_org ); - FT_FREE( has_delta ); - - return error; - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_done_blend */ - /* */ - /* */ - /* Free the blend internal data structure. */ - /* */ - FT_LOCAL_DEF( void ) - tt_done_blend( FT_Memory memory, - GX_Blend blend ) - { - if ( blend != NULL ) - { - FT_UInt i; - - - FT_FREE( blend->normalizedcoords ); - FT_FREE( blend->mmvar ); - - if ( blend->avar_segment != NULL ) - { - for ( i = 0; i < blend->num_axis; i++ ) - FT_FREE( blend->avar_segment[i].correspondence ); - FT_FREE( blend->avar_segment ); - } - - FT_FREE( blend->tuplecoords ); - FT_FREE( blend->glyphoffsets ); - FT_FREE( blend ); - } - } - -#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ - - -/* END */ diff --git a/3party/freetype/src/truetype/ttgxvar.h b/3party/freetype/src/truetype/ttgxvar.h deleted file mode 100644 index 060d4d60ea..0000000000 --- a/3party/freetype/src/truetype/ttgxvar.h +++ /dev/null @@ -1,182 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttgxvar.h */ -/* */ -/* TrueType GX Font Variation loader (specification) */ -/* */ -/* Copyright 2004-2015 by */ -/* David Turner, Robert Wilhelm, Werner Lemberg and George Williams. */ -/* */ -/* 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 __TTGXVAR_H__ -#define __TTGXVAR_H__ - - -#include -#include "ttobjs.h" - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* */ - /* GX_AVarCorrespondenceRec */ - /* */ - /* */ - /* A data structure representing `shortFracCorrespondence' in `avar' */ - /* table according to the specifications from Apple. */ - /* */ - typedef struct GX_AVarCorrespondenceRec_ - { - FT_Fixed fromCoord; - FT_Fixed toCoord; - - } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence; - - - /*************************************************************************/ - /* */ - /* */ - /* GX_AVarRec */ - /* */ - /* */ - /* Data from the segment field of `avar' table. */ - /* There is one of these for each axis. */ - /* */ - typedef struct GX_AVarSegmentRec_ - { - FT_UShort pairCount; - GX_AVarCorrespondence correspondence; /* array with pairCount entries */ - - } GX_AVarSegmentRec, *GX_AVarSegment; - - - /*************************************************************************/ - /* */ - /* */ - /* GX_BlendRec */ - /* */ - /* */ - /* Data for interpolating a font from a distortable font specified */ - /* by the GX *var tables ([fgca]var). */ - /* */ - /* */ - /* num_axis :: The number of axes along which interpolation */ - /* may happen */ - /* */ - /* normalizedcoords :: A normalized value (between [-1,1]) indicating */ - /* the contribution along each axis to the final */ - /* interpolated font. */ - /* */ - typedef struct GX_BlendRec_ - { - FT_UInt num_axis; - FT_Fixed* normalizedcoords; - - FT_MM_Var* mmvar; - FT_Offset mmvar_len; - - FT_Bool avar_checked; - GX_AVarSegment avar_segment; - - FT_UInt tuplecount; /* shared tuples in `gvar' */ - FT_Fixed* tuplecoords; /* tuplecoords[tuplecount][num_axis] */ - - FT_UInt gv_glyphcnt; - FT_ULong* glyphoffsets; - - } GX_BlendRec; - - - /*************************************************************************/ - /* */ - /* */ - /* GX_TupleCountFlags */ - /* */ - /* */ - /* Flags used within the `TupleCount' field of the `gvar' table. */ - /* */ - typedef enum GX_TupleCountFlags_ - { - GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000, - GX_TC_RESERVED_TUPLE_FLAGS = 0x7000, - GX_TC_TUPLE_COUNT_MASK = 0x0FFF - - } GX_TupleCountFlags; - - - /*************************************************************************/ - /* */ - /* */ - /* GX_TupleIndexFlags */ - /* */ - /* */ - /* Flags used within the `TupleIndex' field of the `gvar' and `cvar' */ - /* tables. */ - /* */ - typedef enum GX_TupleIndexFlags_ - { - GX_TI_EMBEDDED_TUPLE_COORD = 0x8000, - GX_TI_INTERMEDIATE_TUPLE = 0x4000, - GX_TI_PRIVATE_POINT_NUMBERS = 0x2000, - GX_TI_RESERVED_TUPLE_FLAG = 0x1000, - GX_TI_TUPLE_INDEX_MASK = 0x0FFF - - } GX_TupleIndexFlags; - - -#define TTAG_wght FT_MAKE_TAG( 'w', 'g', 'h', 't' ) -#define TTAG_wdth FT_MAKE_TAG( 'w', 'd', 't', 'h' ) -#define TTAG_opsz FT_MAKE_TAG( 'o', 'p', 's', 'z' ) -#define TTAG_slnt FT_MAKE_TAG( 's', 'l', 'n', 't' ) - - - FT_LOCAL( FT_Error ) - TT_Set_MM_Blend( TT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - FT_LOCAL( FT_Error ) - TT_Set_Var_Design( TT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - FT_LOCAL( FT_Error ) - TT_Get_MM_Var( TT_Face face, - FT_MM_Var* *master ); - - - FT_LOCAL( FT_Error ) - tt_face_vary_cvt( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - TT_Vary_Apply_Glyph_Deltas( TT_Face face, - FT_UInt glyph_index, - FT_Outline* outline, - FT_UInt n_points ); - - - FT_LOCAL( void ) - tt_done_blend( FT_Memory memory, - GX_Blend blend ); - - -FT_END_HEADER - - -#endif /* __TTGXVAR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/truetype/ttinterp.c b/3party/freetype/src/truetype/ttinterp.c deleted file mode 100644 index d00a0f88ca..0000000000 --- a/3party/freetype/src/truetype/ttinterp.c +++ /dev/null @@ -1,8275 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttinterp.c */ -/* */ -/* TrueType bytecode interpreter (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - -/* Greg Hitchcock from Microsoft has helped a lot in resolving unclear */ -/* issues; many thanks! */ - - -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_TRIGONOMETRY_H -#include FT_SYSTEM_H -#include FT_TRUETYPE_DRIVER_H - -#include "ttinterp.h" -#include "tterrors.h" -#include "ttsubpix.h" - - -#ifdef TT_USE_BYTECODE_INTERPRETER - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttinterp - - - /*************************************************************************/ - /* */ - /* In order to detect infinite loops in the code, we set up a counter */ - /* within the run loop. A single stroke of interpretation is now */ - /* limited to a maximum number of opcodes defined below. */ - /* */ -#define MAX_RUNNABLE_OPCODES 1000000L - - -#define SUBPIXEL_HINTING \ - ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \ - TT_INTERPRETER_VERSION_38 ) - - -#define PROJECT( v1, v2 ) \ - exc->func_project( exc, (v1)->x - (v2)->x, (v1)->y - (v2)->y ) - -#define DUALPROJ( v1, v2 ) \ - exc->func_dualproj( exc, (v1)->x - (v2)->x, (v1)->y - (v2)->y ) - -#define FAST_PROJECT( v ) \ - exc->func_project( exc, (v)->x, (v)->y ) - -#define FAST_DUALPROJ( v ) \ - exc->func_dualproj( exc, (v)->x, (v)->y ) - - - /*************************************************************************/ - /* */ - /* Instruction dispatch function, as used by the interpreter. */ - /* */ - typedef void (*TInstruction_Function)( TT_ExecContext exc, - FT_Long* args ); - - - /*************************************************************************/ - /* */ - /* Two simple bounds-checking macros. */ - /* */ -#define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) ) -#define BOUNDSL( x, n ) ( (FT_ULong)(x) >= (FT_ULong)(n) ) - - -#undef SUCCESS -#define SUCCESS 0 - -#undef FAILURE -#define FAILURE 1 - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING -#define GUESS_VECTOR( V ) \ - do \ - { \ - if ( exc->face->unpatented_hinting ) \ - { \ - exc->GS.V.x = (FT_F2Dot14)( exc->GS.both_x_axis ? 0x4000 : 0 ); \ - exc->GS.V.y = (FT_F2Dot14)( exc->GS.both_x_axis ? 0 : 0x4000 ); \ - } \ - } while (0) -#else -#define GUESS_VECTOR( V ) do { } while (0) -#endif - - - /*************************************************************************/ - /* */ - /* CODERANGE FUNCTIONS */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Goto_CodeRange */ - /* */ - /* */ - /* Switches to a new code range (updates the code related elements in */ - /* `exec', and `IP'). */ - /* */ - /* */ - /* range :: The new execution code range. */ - /* */ - /* IP :: The new IP in the new code range. */ - /* */ - /* */ - /* exec :: The target execution context. */ - /* */ - FT_LOCAL_DEF( void ) - TT_Goto_CodeRange( TT_ExecContext exec, - FT_Int range, - FT_Long IP ) - { - TT_CodeRange* coderange; - - - FT_ASSERT( range >= 1 && range <= 3 ); - - coderange = &exec->codeRangeTable[range - 1]; - - FT_ASSERT( coderange->base != NULL ); - - /* NOTE: Because the last instruction of a program may be a CALL */ - /* which will return to the first byte *after* the code */ - /* range, we test for IP <= Size instead of IP < Size. */ - /* */ - FT_ASSERT( IP <= coderange->size ); - - exec->code = coderange->base; - exec->codeSize = coderange->size; - exec->IP = IP; - exec->curRange = range; - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Set_CodeRange */ - /* */ - /* */ - /* Sets a code range. */ - /* */ - /* */ - /* range :: The code range index. */ - /* */ - /* base :: The new code base. */ - /* */ - /* length :: The range size in bytes. */ - /* */ - /* */ - /* exec :: The target execution context. */ - /* */ - FT_LOCAL_DEF( void ) - TT_Set_CodeRange( TT_ExecContext exec, - FT_Int range, - void* base, - FT_Long length ) - { - FT_ASSERT( range >= 1 && range <= 3 ); - - exec->codeRangeTable[range - 1].base = (FT_Byte*)base; - exec->codeRangeTable[range - 1].size = length; - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Clear_CodeRange */ - /* */ - /* */ - /* Clears a code range. */ - /* */ - /* */ - /* range :: The code range index. */ - /* */ - /* */ - /* exec :: The target execution context. */ - /* */ - FT_LOCAL_DEF( void ) - TT_Clear_CodeRange( TT_ExecContext exec, - FT_Int range ) - { - FT_ASSERT( range >= 1 && range <= 3 ); - - exec->codeRangeTable[range - 1].base = NULL; - exec->codeRangeTable[range - 1].size = 0; - } - - - /*************************************************************************/ - /* */ - /* EXECUTION CONTEXT ROUTINES */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Done_Context */ - /* */ - /* */ - /* Destroys a given context. */ - /* */ - /* */ - /* exec :: A handle to the target execution context. */ - /* */ - /* memory :: A handle to the parent memory object. */ - /* */ - /* */ - /* Only the glyph loader and debugger should call this function. */ - /* */ - FT_LOCAL_DEF( void ) - TT_Done_Context( TT_ExecContext exec ) - { - FT_Memory memory = exec->memory; - - - /* points zone */ - exec->maxPoints = 0; - exec->maxContours = 0; - - /* free stack */ - FT_FREE( exec->stack ); - exec->stackSize = 0; - - /* free call stack */ - FT_FREE( exec->callStack ); - exec->callSize = 0; - exec->callTop = 0; - - /* free glyph code range */ - FT_FREE( exec->glyphIns ); - exec->glyphSize = 0; - - exec->size = NULL; - exec->face = NULL; - - FT_FREE( exec ); - } - - - /*************************************************************************/ - /* */ - /* */ - /* Init_Context */ - /* */ - /* */ - /* Initializes a context object. */ - /* */ - /* */ - /* memory :: A handle to the parent memory object. */ - /* */ - /* */ - /* exec :: A handle to the target execution context. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - Init_Context( TT_ExecContext exec, - FT_Memory memory ) - { - FT_Error error; - - - FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec )); - - exec->memory = memory; - exec->callSize = 32; - - if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) ) - goto Fail_Memory; - - /* all values in the context are set to 0 already, but this is */ - /* here as a remainder */ - exec->maxPoints = 0; - exec->maxContours = 0; - - exec->stackSize = 0; - exec->glyphSize = 0; - - exec->stack = NULL; - exec->glyphIns = NULL; - - exec->face = NULL; - exec->size = NULL; - - return FT_Err_Ok; - - Fail_Memory: - FT_ERROR(( "Init_Context: not enough memory for %p\n", exec )); - TT_Done_Context( exec ); - - return error; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Update_Max */ - /* */ - /* */ - /* Checks the size of a buffer and reallocates it if necessary. */ - /* */ - /* */ - /* memory :: A handle to the parent memory object. */ - /* */ - /* multiplier :: The size in bytes of each element in the buffer. */ - /* */ - /* new_max :: The new capacity (size) of the buffer. */ - /* */ - /* */ - /* size :: The address of the buffer's current size expressed */ - /* in elements. */ - /* */ - /* buff :: The address of the buffer base pointer. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - Update_Max( FT_Memory memory, - FT_ULong* size, - FT_ULong multiplier, - void* _pbuff, - FT_ULong new_max ) - { - FT_Error error; - void** pbuff = (void**)_pbuff; - - - if ( *size < new_max ) - { - if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) ) - return error; - *size = new_max; - } - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Load_Context */ - /* */ - /* */ - /* Prepare an execution context for glyph hinting. */ - /* */ - /* */ - /* face :: A handle to the source face object. */ - /* */ - /* size :: A handle to the source size object. */ - /* */ - /* */ - /* exec :: A handle to the target execution context. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* */ - /* Only the glyph loader and debugger should call this function. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Load_Context( TT_ExecContext exec, - TT_Face face, - TT_Size size ) - { - FT_Int i; - FT_ULong tmp; - TT_MaxProfile* maxp; - FT_Error error; - - - exec->face = face; - maxp = &face->max_profile; - exec->size = size; - - if ( size ) - { - exec->numFDefs = size->num_function_defs; - exec->maxFDefs = size->max_function_defs; - exec->numIDefs = size->num_instruction_defs; - exec->maxIDefs = size->max_instruction_defs; - exec->FDefs = size->function_defs; - exec->IDefs = size->instruction_defs; - exec->tt_metrics = size->ttmetrics; - exec->metrics = size->metrics; - - exec->maxFunc = size->max_func; - exec->maxIns = size->max_ins; - - for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) - exec->codeRangeTable[i] = size->codeRangeTable[i]; - - /* set graphics state */ - exec->GS = size->GS; - - exec->cvtSize = size->cvt_size; - exec->cvt = size->cvt; - - exec->storeSize = size->storage_size; - exec->storage = size->storage; - - exec->twilight = size->twilight; - - /* In case of multi-threading it can happen that the old size object */ - /* no longer exists, thus we must clear all glyph zone references. */ - ft_memset( &exec->zp0, 0, sizeof ( exec->zp0 ) ); - exec->zp1 = exec->zp0; - exec->zp2 = exec->zp0; - } - - /* XXX: We reserve a little more elements on the stack to deal safely */ - /* with broken fonts like arialbs, courbs, timesbs, etc. */ - tmp = (FT_ULong)exec->stackSize; - error = Update_Max( exec->memory, - &tmp, - sizeof ( FT_F26Dot6 ), - (void*)&exec->stack, - maxp->maxStackElements + 32 ); - exec->stackSize = (FT_Long)tmp; - if ( error ) - return error; - - tmp = exec->glyphSize; - error = Update_Max( exec->memory, - &tmp, - sizeof ( FT_Byte ), - (void*)&exec->glyphIns, - maxp->maxSizeOfInstructions ); - exec->glyphSize = (FT_UShort)tmp; - if ( error ) - return error; - - exec->pts.n_points = 0; - exec->pts.n_contours = 0; - - exec->zp1 = exec->pts; - exec->zp2 = exec->pts; - exec->zp0 = exec->pts; - - exec->instruction_trap = FALSE; - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Save_Context */ - /* */ - /* */ - /* Saves the code ranges in a `size' object. */ - /* */ - /* */ - /* exec :: A handle to the source execution context. */ - /* */ - /* */ - /* size :: A handle to the target size object. */ - /* */ - /* */ - /* Only the glyph loader and debugger should call this function. */ - /* */ - FT_LOCAL_DEF( void ) - TT_Save_Context( TT_ExecContext exec, - TT_Size size ) - { - FT_Int i; - - - /* XXX: Will probably disappear soon with all the code range */ - /* management, which is now rather obsolete. */ - /* */ - size->num_function_defs = exec->numFDefs; - size->num_instruction_defs = exec->numIDefs; - - size->max_func = exec->maxFunc; - size->max_ins = exec->maxIns; - - for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) - size->codeRangeTable[i] = exec->codeRangeTable[i]; - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Run_Context */ - /* */ - /* */ - /* Executes one or more instructions in the execution context. */ - /* */ - /* */ - /* debug :: A Boolean flag. If set, the function sets some internal */ - /* variables and returns immediately, otherwise TT_RunIns() */ - /* is called. */ - /* */ - /* This is commented out currently. */ - /* */ - /* */ - /* exec :: A handle to the target execution context. */ - /* */ - /* */ - /* TrueType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Run_Context( TT_ExecContext exec ) - { - TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ); - - exec->zp0 = exec->pts; - exec->zp1 = exec->pts; - exec->zp2 = exec->pts; - - exec->GS.gep0 = 1; - exec->GS.gep1 = 1; - exec->GS.gep2 = 1; - - exec->GS.projVector.x = 0x4000; - exec->GS.projVector.y = 0x0000; - - exec->GS.freeVector = exec->GS.projVector; - exec->GS.dualVector = exec->GS.projVector; - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - exec->GS.both_x_axis = TRUE; -#endif - - exec->GS.round_state = 1; - exec->GS.loop = 1; - - /* some glyphs leave something on the stack. so we clean it */ - /* before a new execution. */ - exec->top = 0; - exec->callTop = 0; - - return exec->face->interpreter( exec ); - } - - - /* The default value for `scan_control' is documented as FALSE in the */ - /* TrueType specification. This is confusing since it implies a */ - /* Boolean value. However, this is not the case, thus both the */ - /* default values of our `scan_type' and `scan_control' fields (which */ - /* the documentation's `scan_control' variable is split into) are */ - /* zero. */ - - const TT_GraphicsState tt_default_graphics_state = - { - 0, 0, 0, - { 0x4000, 0 }, - { 0x4000, 0 }, - { 0x4000, 0 }, - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - TRUE, -#endif - - 1, 64, 1, - TRUE, 68, 0, 0, 9, 3, - 0, FALSE, 0, 1, 1, 1 - }; - - - /* documentation is in ttinterp.h */ - - FT_EXPORT_DEF( TT_ExecContext ) - TT_New_Context( TT_Driver driver ) - { - FT_Memory memory; - FT_Error error; - - TT_ExecContext exec = NULL; - - - if ( !driver ) - goto Fail; - - memory = driver->root.root.memory; - - /* allocate object */ - if ( FT_NEW( exec ) ) - goto Fail; - - /* initialize it; in case of error this deallocates `exec' too */ - error = Init_Context( exec, memory ); - if ( error ) - goto Fail; - - return exec; - - Fail: - return NULL; - } - - - /*************************************************************************/ - /* */ - /* Before an opcode is executed, the interpreter verifies that there are */ - /* enough arguments on the stack, with the help of the `Pop_Push_Count' */ - /* table. */ - /* */ - /* For each opcode, the first column gives the number of arguments that */ - /* are popped from the stack; the second one gives the number of those */ - /* that are pushed in result. */ - /* */ - /* Opcodes which have a varying number of parameters in the data stream */ - /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */ - /* the `opcode_length' table, and the value in `Pop_Push_Count' is set */ - /* to zero. */ - /* */ - /*************************************************************************/ - - -#undef PACK -#define PACK( x, y ) ( ( x << 4 ) | y ) - - - static - const FT_Byte Pop_Push_Count[256] = - { - /* opcodes are gathered in groups of 16 */ - /* please keep the spaces as they are */ - - /* SVTCA y */ PACK( 0, 0 ), - /* SVTCA x */ PACK( 0, 0 ), - /* SPvTCA y */ PACK( 0, 0 ), - /* SPvTCA x */ PACK( 0, 0 ), - /* SFvTCA y */ PACK( 0, 0 ), - /* SFvTCA x */ PACK( 0, 0 ), - /* SPvTL // */ PACK( 2, 0 ), - /* SPvTL + */ PACK( 2, 0 ), - /* SFvTL // */ PACK( 2, 0 ), - /* SFvTL + */ PACK( 2, 0 ), - /* SPvFS */ PACK( 2, 0 ), - /* SFvFS */ PACK( 2, 0 ), - /* GPv */ PACK( 0, 2 ), - /* GFv */ PACK( 0, 2 ), - /* SFvTPv */ PACK( 0, 0 ), - /* ISECT */ PACK( 5, 0 ), - - /* SRP0 */ PACK( 1, 0 ), - /* SRP1 */ PACK( 1, 0 ), - /* SRP2 */ PACK( 1, 0 ), - /* SZP0 */ PACK( 1, 0 ), - /* SZP1 */ PACK( 1, 0 ), - /* SZP2 */ PACK( 1, 0 ), - /* SZPS */ PACK( 1, 0 ), - /* SLOOP */ PACK( 1, 0 ), - /* RTG */ PACK( 0, 0 ), - /* RTHG */ PACK( 0, 0 ), - /* SMD */ PACK( 1, 0 ), - /* ELSE */ PACK( 0, 0 ), - /* JMPR */ PACK( 1, 0 ), - /* SCvTCi */ PACK( 1, 0 ), - /* SSwCi */ PACK( 1, 0 ), - /* SSW */ PACK( 1, 0 ), - - /* DUP */ PACK( 1, 2 ), - /* POP */ PACK( 1, 0 ), - /* CLEAR */ PACK( 0, 0 ), - /* SWAP */ PACK( 2, 2 ), - /* DEPTH */ PACK( 0, 1 ), - /* CINDEX */ PACK( 1, 1 ), - /* MINDEX */ PACK( 1, 0 ), - /* AlignPTS */ PACK( 2, 0 ), - /* INS_$28 */ PACK( 0, 0 ), - /* UTP */ PACK( 1, 0 ), - /* LOOPCALL */ PACK( 2, 0 ), - /* CALL */ PACK( 1, 0 ), - /* FDEF */ PACK( 1, 0 ), - /* ENDF */ PACK( 0, 0 ), - /* MDAP[0] */ PACK( 1, 0 ), - /* MDAP[1] */ PACK( 1, 0 ), - - /* IUP[0] */ PACK( 0, 0 ), - /* IUP[1] */ PACK( 0, 0 ), - /* SHP[0] */ PACK( 0, 0 ), - /* SHP[1] */ PACK( 0, 0 ), - /* SHC[0] */ PACK( 1, 0 ), - /* SHC[1] */ PACK( 1, 0 ), - /* SHZ[0] */ PACK( 1, 0 ), - /* SHZ[1] */ PACK( 1, 0 ), - /* SHPIX */ PACK( 1, 0 ), - /* IP */ PACK( 0, 0 ), - /* MSIRP[0] */ PACK( 2, 0 ), - /* MSIRP[1] */ PACK( 2, 0 ), - /* AlignRP */ PACK( 0, 0 ), - /* RTDG */ PACK( 0, 0 ), - /* MIAP[0] */ PACK( 2, 0 ), - /* MIAP[1] */ PACK( 2, 0 ), - - /* NPushB */ PACK( 0, 0 ), - /* NPushW */ PACK( 0, 0 ), - /* WS */ PACK( 2, 0 ), - /* RS */ PACK( 1, 1 ), - /* WCvtP */ PACK( 2, 0 ), - /* RCvt */ PACK( 1, 1 ), - /* GC[0] */ PACK( 1, 1 ), - /* GC[1] */ PACK( 1, 1 ), - /* SCFS */ PACK( 2, 0 ), - /* MD[0] */ PACK( 2, 1 ), - /* MD[1] */ PACK( 2, 1 ), - /* MPPEM */ PACK( 0, 1 ), - /* MPS */ PACK( 0, 1 ), - /* FlipON */ PACK( 0, 0 ), - /* FlipOFF */ PACK( 0, 0 ), - /* DEBUG */ PACK( 1, 0 ), - - /* LT */ PACK( 2, 1 ), - /* LTEQ */ PACK( 2, 1 ), - /* GT */ PACK( 2, 1 ), - /* GTEQ */ PACK( 2, 1 ), - /* EQ */ PACK( 2, 1 ), - /* NEQ */ PACK( 2, 1 ), - /* ODD */ PACK( 1, 1 ), - /* EVEN */ PACK( 1, 1 ), - /* IF */ PACK( 1, 0 ), - /* EIF */ PACK( 0, 0 ), - /* AND */ PACK( 2, 1 ), - /* OR */ PACK( 2, 1 ), - /* NOT */ PACK( 1, 1 ), - /* DeltaP1 */ PACK( 1, 0 ), - /* SDB */ PACK( 1, 0 ), - /* SDS */ PACK( 1, 0 ), - - /* ADD */ PACK( 2, 1 ), - /* SUB */ PACK( 2, 1 ), - /* DIV */ PACK( 2, 1 ), - /* MUL */ PACK( 2, 1 ), - /* ABS */ PACK( 1, 1 ), - /* NEG */ PACK( 1, 1 ), - /* FLOOR */ PACK( 1, 1 ), - /* CEILING */ PACK( 1, 1 ), - /* ROUND[0] */ PACK( 1, 1 ), - /* ROUND[1] */ PACK( 1, 1 ), - /* ROUND[2] */ PACK( 1, 1 ), - /* ROUND[3] */ PACK( 1, 1 ), - /* NROUND[0] */ PACK( 1, 1 ), - /* NROUND[1] */ PACK( 1, 1 ), - /* NROUND[2] */ PACK( 1, 1 ), - /* NROUND[3] */ PACK( 1, 1 ), - - /* WCvtF */ PACK( 2, 0 ), - /* DeltaP2 */ PACK( 1, 0 ), - /* DeltaP3 */ PACK( 1, 0 ), - /* DeltaCn[0] */ PACK( 1, 0 ), - /* DeltaCn[1] */ PACK( 1, 0 ), - /* DeltaCn[2] */ PACK( 1, 0 ), - /* SROUND */ PACK( 1, 0 ), - /* S45Round */ PACK( 1, 0 ), - /* JROT */ PACK( 2, 0 ), - /* JROF */ PACK( 2, 0 ), - /* ROFF */ PACK( 0, 0 ), - /* INS_$7B */ PACK( 0, 0 ), - /* RUTG */ PACK( 0, 0 ), - /* RDTG */ PACK( 0, 0 ), - /* SANGW */ PACK( 1, 0 ), - /* AA */ PACK( 1, 0 ), - - /* FlipPT */ PACK( 0, 0 ), - /* FlipRgON */ PACK( 2, 0 ), - /* FlipRgOFF */ PACK( 2, 0 ), - /* INS_$83 */ PACK( 0, 0 ), - /* INS_$84 */ PACK( 0, 0 ), - /* ScanCTRL */ PACK( 1, 0 ), - /* SDPvTL[0] */ PACK( 2, 0 ), - /* SDPvTL[1] */ PACK( 2, 0 ), - /* GetINFO */ PACK( 1, 1 ), - /* IDEF */ PACK( 1, 0 ), - /* ROLL */ PACK( 3, 3 ), - /* MAX */ PACK( 2, 1 ), - /* MIN */ PACK( 2, 1 ), - /* ScanTYPE */ PACK( 1, 0 ), - /* InstCTRL */ PACK( 2, 0 ), - /* INS_$8F */ PACK( 0, 0 ), - - /* INS_$90 */ PACK( 0, 0 ), - /* INS_$91 */ PACK( 0, 0 ), - /* INS_$92 */ PACK( 0, 0 ), - /* INS_$93 */ PACK( 0, 0 ), - /* INS_$94 */ PACK( 0, 0 ), - /* INS_$95 */ PACK( 0, 0 ), - /* INS_$96 */ PACK( 0, 0 ), - /* INS_$97 */ PACK( 0, 0 ), - /* INS_$98 */ PACK( 0, 0 ), - /* INS_$99 */ PACK( 0, 0 ), - /* INS_$9A */ PACK( 0, 0 ), - /* INS_$9B */ PACK( 0, 0 ), - /* INS_$9C */ PACK( 0, 0 ), - /* INS_$9D */ PACK( 0, 0 ), - /* INS_$9E */ PACK( 0, 0 ), - /* INS_$9F */ PACK( 0, 0 ), - - /* INS_$A0 */ PACK( 0, 0 ), - /* INS_$A1 */ PACK( 0, 0 ), - /* INS_$A2 */ PACK( 0, 0 ), - /* INS_$A3 */ PACK( 0, 0 ), - /* INS_$A4 */ PACK( 0, 0 ), - /* INS_$A5 */ PACK( 0, 0 ), - /* INS_$A6 */ PACK( 0, 0 ), - /* INS_$A7 */ PACK( 0, 0 ), - /* INS_$A8 */ PACK( 0, 0 ), - /* INS_$A9 */ PACK( 0, 0 ), - /* INS_$AA */ PACK( 0, 0 ), - /* INS_$AB */ PACK( 0, 0 ), - /* INS_$AC */ PACK( 0, 0 ), - /* INS_$AD */ PACK( 0, 0 ), - /* INS_$AE */ PACK( 0, 0 ), - /* INS_$AF */ PACK( 0, 0 ), - - /* PushB[0] */ PACK( 0, 1 ), - /* PushB[1] */ PACK( 0, 2 ), - /* PushB[2] */ PACK( 0, 3 ), - /* PushB[3] */ PACK( 0, 4 ), - /* PushB[4] */ PACK( 0, 5 ), - /* PushB[5] */ PACK( 0, 6 ), - /* PushB[6] */ PACK( 0, 7 ), - /* PushB[7] */ PACK( 0, 8 ), - /* PushW[0] */ PACK( 0, 1 ), - /* PushW[1] */ PACK( 0, 2 ), - /* PushW[2] */ PACK( 0, 3 ), - /* PushW[3] */ PACK( 0, 4 ), - /* PushW[4] */ PACK( 0, 5 ), - /* PushW[5] */ PACK( 0, 6 ), - /* PushW[6] */ PACK( 0, 7 ), - /* PushW[7] */ PACK( 0, 8 ), - - /* MDRP[00] */ PACK( 1, 0 ), - /* MDRP[01] */ PACK( 1, 0 ), - /* MDRP[02] */ PACK( 1, 0 ), - /* MDRP[03] */ PACK( 1, 0 ), - /* MDRP[04] */ PACK( 1, 0 ), - /* MDRP[05] */ PACK( 1, 0 ), - /* MDRP[06] */ PACK( 1, 0 ), - /* MDRP[07] */ PACK( 1, 0 ), - /* MDRP[08] */ PACK( 1, 0 ), - /* MDRP[09] */ PACK( 1, 0 ), - /* MDRP[10] */ PACK( 1, 0 ), - /* MDRP[11] */ PACK( 1, 0 ), - /* MDRP[12] */ PACK( 1, 0 ), - /* MDRP[13] */ PACK( 1, 0 ), - /* MDRP[14] */ PACK( 1, 0 ), - /* MDRP[15] */ PACK( 1, 0 ), - - /* MDRP[16] */ PACK( 1, 0 ), - /* MDRP[17] */ PACK( 1, 0 ), - /* MDRP[18] */ PACK( 1, 0 ), - /* MDRP[19] */ PACK( 1, 0 ), - /* MDRP[20] */ PACK( 1, 0 ), - /* MDRP[21] */ PACK( 1, 0 ), - /* MDRP[22] */ PACK( 1, 0 ), - /* MDRP[23] */ PACK( 1, 0 ), - /* MDRP[24] */ PACK( 1, 0 ), - /* MDRP[25] */ PACK( 1, 0 ), - /* MDRP[26] */ PACK( 1, 0 ), - /* MDRP[27] */ PACK( 1, 0 ), - /* MDRP[28] */ PACK( 1, 0 ), - /* MDRP[29] */ PACK( 1, 0 ), - /* MDRP[30] */ PACK( 1, 0 ), - /* MDRP[31] */ PACK( 1, 0 ), - - /* MIRP[00] */ PACK( 2, 0 ), - /* MIRP[01] */ PACK( 2, 0 ), - /* MIRP[02] */ PACK( 2, 0 ), - /* MIRP[03] */ PACK( 2, 0 ), - /* MIRP[04] */ PACK( 2, 0 ), - /* MIRP[05] */ PACK( 2, 0 ), - /* MIRP[06] */ PACK( 2, 0 ), - /* MIRP[07] */ PACK( 2, 0 ), - /* MIRP[08] */ PACK( 2, 0 ), - /* MIRP[09] */ PACK( 2, 0 ), - /* MIRP[10] */ PACK( 2, 0 ), - /* MIRP[11] */ PACK( 2, 0 ), - /* MIRP[12] */ PACK( 2, 0 ), - /* MIRP[13] */ PACK( 2, 0 ), - /* MIRP[14] */ PACK( 2, 0 ), - /* MIRP[15] */ PACK( 2, 0 ), - - /* MIRP[16] */ PACK( 2, 0 ), - /* MIRP[17] */ PACK( 2, 0 ), - /* MIRP[18] */ PACK( 2, 0 ), - /* MIRP[19] */ PACK( 2, 0 ), - /* MIRP[20] */ PACK( 2, 0 ), - /* MIRP[21] */ PACK( 2, 0 ), - /* MIRP[22] */ PACK( 2, 0 ), - /* MIRP[23] */ PACK( 2, 0 ), - /* MIRP[24] */ PACK( 2, 0 ), - /* MIRP[25] */ PACK( 2, 0 ), - /* MIRP[26] */ PACK( 2, 0 ), - /* MIRP[27] */ PACK( 2, 0 ), - /* MIRP[28] */ PACK( 2, 0 ), - /* MIRP[29] */ PACK( 2, 0 ), - /* MIRP[30] */ PACK( 2, 0 ), - /* MIRP[31] */ PACK( 2, 0 ) - }; - - -#ifdef FT_DEBUG_LEVEL_TRACE - - /* the first hex digit gives the length of the opcode name; the space */ - /* after the digit is here just to increase readability of the source */ - /* code */ - - static - const char* const opcode_name[256] = - { - "7 SVTCA y", - "7 SVTCA x", - "8 SPvTCA y", - "8 SPvTCA x", - "8 SFvTCA y", - "8 SFvTCA x", - "8 SPvTL ||", - "7 SPvTL +", - "8 SFvTL ||", - "7 SFvTL +", - "5 SPvFS", - "5 SFvFS", - "3 GPv", - "3 GFv", - "6 SFvTPv", - "5 ISECT", - - "4 SRP0", - "4 SRP1", - "4 SRP2", - "4 SZP0", - "4 SZP1", - "4 SZP2", - "4 SZPS", - "5 SLOOP", - "3 RTG", - "4 RTHG", - "3 SMD", - "4 ELSE", - "4 JMPR", - "6 SCvTCi", - "5 SSwCi", - "3 SSW", - - "3 DUP", - "3 POP", - "5 CLEAR", - "4 SWAP", - "5 DEPTH", - "6 CINDEX", - "6 MINDEX", - "8 AlignPTS", - "7 INS_$28", - "3 UTP", - "8 LOOPCALL", - "4 CALL", - "4 FDEF", - "4 ENDF", - "7 MDAP[0]", - "7 MDAP[1]", - - "6 IUP[0]", - "6 IUP[1]", - "6 SHP[0]", - "6 SHP[1]", - "6 SHC[0]", - "6 SHC[1]", - "6 SHZ[0]", - "6 SHZ[1]", - "5 SHPIX", - "2 IP", - "8 MSIRP[0]", - "8 MSIRP[1]", - "7 AlignRP", - "4 RTDG", - "7 MIAP[0]", - "7 MIAP[1]", - - "6 NPushB", - "6 NPushW", - "2 WS", - "2 RS", - "5 WCvtP", - "4 RCvt", - "5 GC[0]", - "5 GC[1]", - "4 SCFS", - "5 MD[0]", - "5 MD[1]", - "5 MPPEM", - "3 MPS", - "6 FlipON", - "7 FlipOFF", - "5 DEBUG", - - "2 LT", - "4 LTEQ", - "2 GT", - "4 GTEQ", - "2 EQ", - "3 NEQ", - "3 ODD", - "4 EVEN", - "2 IF", - "3 EIF", - "3 AND", - "2 OR", - "3 NOT", - "7 DeltaP1", - "3 SDB", - "3 SDS", - - "3 ADD", - "3 SUB", - "3 DIV", - "3 MUL", - "3 ABS", - "3 NEG", - "5 FLOOR", - "7 CEILING", - "8 ROUND[0]", - "8 ROUND[1]", - "8 ROUND[2]", - "8 ROUND[3]", - "9 NROUND[0]", - "9 NROUND[1]", - "9 NROUND[2]", - "9 NROUND[3]", - - "5 WCvtF", - "7 DeltaP2", - "7 DeltaP3", - "A DeltaCn[0]", - "A DeltaCn[1]", - "A DeltaCn[2]", - "6 SROUND", - "8 S45Round", - "4 JROT", - "4 JROF", - "4 ROFF", - "7 INS_$7B", - "4 RUTG", - "4 RDTG", - "5 SANGW", - "2 AA", - - "6 FlipPT", - "8 FlipRgON", - "9 FlipRgOFF", - "7 INS_$83", - "7 INS_$84", - "8 ScanCTRL", - "9 SDPvTL[0]", - "9 SDPvTL[1]", - "7 GetINFO", - "4 IDEF", - "4 ROLL", - "3 MAX", - "3 MIN", - "8 ScanTYPE", - "8 InstCTRL", - "7 INS_$8F", - - "7 INS_$90", - "7 INS_$91", - "7 INS_$92", - "7 INS_$93", - "7 INS_$94", - "7 INS_$95", - "7 INS_$96", - "7 INS_$97", - "7 INS_$98", - "7 INS_$99", - "7 INS_$9A", - "7 INS_$9B", - "7 INS_$9C", - "7 INS_$9D", - "7 INS_$9E", - "7 INS_$9F", - - "7 INS_$A0", - "7 INS_$A1", - "7 INS_$A2", - "7 INS_$A3", - "7 INS_$A4", - "7 INS_$A5", - "7 INS_$A6", - "7 INS_$A7", - "7 INS_$A8", - "7 INS_$A9", - "7 INS_$AA", - "7 INS_$AB", - "7 INS_$AC", - "7 INS_$AD", - "7 INS_$AE", - "7 INS_$AF", - - "8 PushB[0]", - "8 PushB[1]", - "8 PushB[2]", - "8 PushB[3]", - "8 PushB[4]", - "8 PushB[5]", - "8 PushB[6]", - "8 PushB[7]", - "8 PushW[0]", - "8 PushW[1]", - "8 PushW[2]", - "8 PushW[3]", - "8 PushW[4]", - "8 PushW[5]", - "8 PushW[6]", - "8 PushW[7]", - - "8 MDRP[00]", - "8 MDRP[01]", - "8 MDRP[02]", - "8 MDRP[03]", - "8 MDRP[04]", - "8 MDRP[05]", - "8 MDRP[06]", - "8 MDRP[07]", - "8 MDRP[08]", - "8 MDRP[09]", - "8 MDRP[10]", - "8 MDRP[11]", - "8 MDRP[12]", - "8 MDRP[13]", - "8 MDRP[14]", - "8 MDRP[15]", - - "8 MDRP[16]", - "8 MDRP[17]", - "8 MDRP[18]", - "8 MDRP[19]", - "8 MDRP[20]", - "8 MDRP[21]", - "8 MDRP[22]", - "8 MDRP[23]", - "8 MDRP[24]", - "8 MDRP[25]", - "8 MDRP[26]", - "8 MDRP[27]", - "8 MDRP[28]", - "8 MDRP[29]", - "8 MDRP[30]", - "8 MDRP[31]", - - "8 MIRP[00]", - "8 MIRP[01]", - "8 MIRP[02]", - "8 MIRP[03]", - "8 MIRP[04]", - "8 MIRP[05]", - "8 MIRP[06]", - "8 MIRP[07]", - "8 MIRP[08]", - "8 MIRP[09]", - "8 MIRP[10]", - "8 MIRP[11]", - "8 MIRP[12]", - "8 MIRP[13]", - "8 MIRP[14]", - "8 MIRP[15]", - - "8 MIRP[16]", - "8 MIRP[17]", - "8 MIRP[18]", - "8 MIRP[19]", - "8 MIRP[20]", - "8 MIRP[21]", - "8 MIRP[22]", - "8 MIRP[23]", - "8 MIRP[24]", - "8 MIRP[25]", - "8 MIRP[26]", - "8 MIRP[27]", - "8 MIRP[28]", - "8 MIRP[29]", - "8 MIRP[30]", - "8 MIRP[31]" - }; - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - - static - const FT_Char opcode_length[256] = - { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - -1,-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 3, 4, 5, 6, 7, 8, 9, 3, 5, 7, 9, 11,13,15,17, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - }; - -#undef PACK - - -#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER - -#if defined( __arm__ ) && \ - ( defined( __thumb2__ ) || !defined( __thumb__ ) ) - -#define TT_MulFix14 TT_MulFix14_arm - - static FT_Int32 - TT_MulFix14_arm( FT_Int32 a, - FT_Int b ) - { - FT_Int32 t, t2; - - -#if defined( __CC_ARM ) || defined( __ARMCC__ ) - - __asm - { - smull t2, t, b, a /* (lo=t2,hi=t) = a*b */ - mov a, t, asr #31 /* a = (hi >> 31) */ - add a, a, #0x2000 /* a += 0x2000 */ - adds t2, t2, a /* t2 += a */ - adc t, t, #0 /* t += carry */ - mov a, t2, lsr #14 /* a = t2 >> 14 */ - orr a, a, t, lsl #18 /* a |= t << 18 */ - } - -#elif defined( __GNUC__ ) - - __asm__ __volatile__ ( - "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ - "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ -#if defined( __clang__ ) && defined( __thumb2__ ) - "add.w %0, %0, #0x2000\n\t" /* %0 += 0x2000 */ -#else - "add %0, %0, #0x2000\n\t" /* %0 += 0x2000 */ -#endif - "adds %1, %1, %0\n\t" /* %1 += %0 */ - "adc %2, %2, #0\n\t" /* %2 += carry */ - "mov %0, %1, lsr #14\n\t" /* %0 = %1 >> 16 */ - "orr %0, %0, %2, lsl #18\n\t" /* %0 |= %2 << 16 */ - : "=r"(a), "=&r"(t2), "=&r"(t) - : "r"(a), "r"(b) - : "cc" ); - -#endif - - return a; - } - -#endif /* __arm__ && ( __thumb2__ || !__thumb__ ) */ - -#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ - - -#if defined( __GNUC__ ) && \ - ( defined( __i386__ ) || defined( __x86_64__ ) ) - -#define TT_MulFix14 TT_MulFix14_long_long - - /* Temporarily disable the warning that C90 doesn't support `long long'. */ -#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406 -#pragma GCC diagnostic push -#endif -#pragma GCC diagnostic ignored "-Wlong-long" - - /* This is declared `noinline' because inlining the function results */ - /* in slower code. The `pure' attribute indicates that the result */ - /* only depends on the parameters. */ - static __attribute__(( noinline )) - __attribute__(( pure )) FT_Int32 - TT_MulFix14_long_long( FT_Int32 a, - FT_Int b ) - { - - long long ret = (long long)a * b; - - /* The following line assumes that right shifting of signed values */ - /* will actually preserve the sign bit. The exact behaviour is */ - /* undefined, but this is true on x86 and x86_64. */ - long long tmp = ret >> 63; - - - ret += 0x2000 + tmp; - - return (FT_Int32)( ret >> 14 ); - } - -#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406 -#pragma GCC diagnostic pop -#endif - -#endif /* __GNUC__ && ( __i386__ || __x86_64__ ) */ - - -#ifndef TT_MulFix14 - - /* Compute (a*b)/2^14 with maximum accuracy and rounding. */ - /* This is optimized to be faster than calling FT_MulFix() */ - /* for platforms where sizeof(int) == 2. */ - static FT_Int32 - TT_MulFix14( FT_Int32 a, - FT_Int b ) - { - FT_Int32 sign; - FT_UInt32 ah, al, mid, lo, hi; - - - sign = a ^ b; - - if ( a < 0 ) - a = -a; - if ( b < 0 ) - b = -b; - - ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU ); - al = (FT_UInt32)( a & 0xFFFFU ); - - lo = al * b; - mid = ah * b; - hi = mid >> 16; - mid = ( mid << 16 ) + ( 1 << 13 ); /* rounding */ - lo += mid; - if ( lo < mid ) - hi += 1; - - mid = ( lo >> 14 ) | ( hi << 18 ); - - return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid; - } - -#endif /* !TT_MulFix14 */ - - -#if defined( __GNUC__ ) && \ - ( defined( __i386__ ) || \ - defined( __x86_64__ ) || \ - defined( __arm__ ) ) - -#define TT_DotFix14 TT_DotFix14_long_long - -#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406 -#pragma GCC diagnostic push -#endif -#pragma GCC diagnostic ignored "-Wlong-long" - - static __attribute__(( pure )) FT_Int32 - TT_DotFix14_long_long( FT_Int32 ax, - FT_Int32 ay, - FT_Int bx, - FT_Int by ) - { - /* Temporarily disable the warning that C90 doesn't support */ - /* `long long'. */ - - long long temp1 = (long long)ax * bx; - long long temp2 = (long long)ay * by; - - - temp1 += temp2; - temp2 = temp1 >> 63; - temp1 += 0x2000 + temp2; - - return (FT_Int32)( temp1 >> 14 ); - - } - -#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406 -#pragma GCC diagnostic pop -#endif - -#endif /* __GNUC__ && (__arm__ || __i386__ || __x86_64__) */ - - -#ifndef TT_DotFix14 - - /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */ - static FT_Int32 - TT_DotFix14( FT_Int32 ax, - FT_Int32 ay, - FT_Int bx, - FT_Int by ) - { - FT_Int32 m, s, hi1, hi2, hi; - FT_UInt32 l, lo1, lo2, lo; - - - /* compute ax*bx as 64-bit value */ - l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx ); - m = ( ax >> 16 ) * bx; - - lo1 = l + ( (FT_UInt32)m << 16 ); - hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l ); - - /* compute ay*by as 64-bit value */ - l = (FT_UInt32)( ( ay & 0xFFFFU ) * by ); - m = ( ay >> 16 ) * by; - - lo2 = l + ( (FT_UInt32)m << 16 ); - hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l ); - - /* add them */ - lo = lo1 + lo2; - hi = hi1 + hi2 + ( lo < lo1 ); - - /* divide the result by 2^14 with rounding */ - s = hi >> 31; - l = lo + (FT_UInt32)s; - hi += s + ( l < lo ); - lo = l; - - l = lo + 0x2000U; - hi += ( l < lo ); - - return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) ); - } - -#endif /* TT_DotFix14 */ - - - /*************************************************************************/ - /* */ - /* */ - /* Current_Ratio */ - /* */ - /* */ - /* Returns the current aspect ratio scaling factor depending on the */ - /* projection vector's state and device resolutions. */ - /* */ - /* */ - /* The aspect ratio in 16.16 format, always <= 1.0 . */ - /* */ - static FT_Long - Current_Ratio( TT_ExecContext exc ) - { - if ( !exc->tt_metrics.ratio ) - { -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - if ( exc->face->unpatented_hinting ) - { - if ( exc->GS.both_x_axis ) - exc->tt_metrics.ratio = exc->tt_metrics.x_ratio; - else - exc->tt_metrics.ratio = exc->tt_metrics.y_ratio; - } - else -#endif - { - if ( exc->GS.projVector.y == 0 ) - exc->tt_metrics.ratio = exc->tt_metrics.x_ratio; - - else if ( exc->GS.projVector.x == 0 ) - exc->tt_metrics.ratio = exc->tt_metrics.y_ratio; - - else - { - FT_F26Dot6 x, y; - - - x = TT_MulFix14( exc->tt_metrics.x_ratio, - exc->GS.projVector.x ); - y = TT_MulFix14( exc->tt_metrics.y_ratio, - exc->GS.projVector.y ); - exc->tt_metrics.ratio = FT_Hypot( x, y ); - } - } - } - return exc->tt_metrics.ratio; - } - - - FT_CALLBACK_DEF( FT_Long ) - Current_Ppem( TT_ExecContext exc ) - { - return exc->tt_metrics.ppem; - } - - - FT_CALLBACK_DEF( FT_Long ) - Current_Ppem_Stretched( TT_ExecContext exc ) - { - return FT_MulFix( exc->tt_metrics.ppem, Current_Ratio( exc ) ); - } - - - /*************************************************************************/ - /* */ - /* Functions related to the control value table (CVT). */ - /* */ - /*************************************************************************/ - - - FT_CALLBACK_DEF( FT_F26Dot6 ) - Read_CVT( TT_ExecContext exc, - FT_ULong idx ) - { - return exc->cvt[idx]; - } - - - FT_CALLBACK_DEF( FT_F26Dot6 ) - Read_CVT_Stretched( TT_ExecContext exc, - FT_ULong idx ) - { - return FT_MulFix( exc->cvt[idx], Current_Ratio( exc ) ); - } - - - FT_CALLBACK_DEF( void ) - Write_CVT( TT_ExecContext exc, - FT_ULong idx, - FT_F26Dot6 value ) - { - exc->cvt[idx] = value; - } - - - FT_CALLBACK_DEF( void ) - Write_CVT_Stretched( TT_ExecContext exc, - FT_ULong idx, - FT_F26Dot6 value ) - { - exc->cvt[idx] = FT_DivFix( value, Current_Ratio( exc ) ); - } - - - FT_CALLBACK_DEF( void ) - Move_CVT( TT_ExecContext exc, - FT_ULong idx, - FT_F26Dot6 value ) - { - exc->cvt[idx] += value; - } - - - FT_CALLBACK_DEF( void ) - Move_CVT_Stretched( TT_ExecContext exc, - FT_ULong idx, - FT_F26Dot6 value ) - { - exc->cvt[idx] += FT_DivFix( value, Current_Ratio( exc ) ); - } - - - /*************************************************************************/ - /* */ - /* */ - /* GetShortIns */ - /* */ - /* */ - /* Returns a short integer taken from the instruction stream at */ - /* address IP. */ - /* */ - /* */ - /* Short read at code[IP]. */ - /* */ - /* */ - /* This one could become a macro. */ - /* */ - static FT_Short - GetShortIns( TT_ExecContext exc ) - { - /* Reading a byte stream so there is no endianess (DaveP) */ - exc->IP += 2; - return (FT_Short)( ( exc->code[exc->IP - 2] << 8 ) + - exc->code[exc->IP - 1] ); - } - - - /*************************************************************************/ - /* */ - /* */ - /* Ins_Goto_CodeRange */ - /* */ - /* */ - /* Goes to a certain code range in the instruction stream. */ - /* */ - /* */ - /* aRange :: The index of the code range. */ - /* */ - /* aIP :: The new IP address in the code range. */ - /* */ - /* */ - /* SUCCESS or FAILURE. */ - /* */ - static FT_Bool - Ins_Goto_CodeRange( TT_ExecContext exc, - FT_Int aRange, - FT_Long aIP ) - { - TT_CodeRange* range; - - - if ( aRange < 1 || aRange > 3 ) - { - exc->error = FT_THROW( Bad_Argument ); - return FAILURE; - } - - range = &exc->codeRangeTable[aRange - 1]; - - if ( range->base == NULL ) /* invalid coderange */ - { - exc->error = FT_THROW( Invalid_CodeRange ); - return FAILURE; - } - - /* NOTE: Because the last instruction of a program may be a CALL */ - /* which will return to the first byte *after* the code */ - /* range, we test for aIP <= Size, instead of aIP < Size. */ - - if ( aIP > range->size ) - { - exc->error = FT_THROW( Code_Overflow ); - return FAILURE; - } - - exc->code = range->base; - exc->codeSize = range->size; - exc->IP = aIP; - exc->curRange = aRange; - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Direct_Move */ - /* */ - /* */ - /* Moves a point by a given distance along the freedom vector. The */ - /* point will be `touched'. */ - /* */ - /* */ - /* point :: The index of the point to move. */ - /* */ - /* distance :: The distance to apply. */ - /* */ - /* */ - /* zone :: The affected glyph zone. */ - /* */ - static void - Direct_Move( TT_ExecContext exc, - TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_F26Dot6 v; - - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - FT_ASSERT( !exc->face->unpatented_hinting ); -#endif - - v = exc->GS.freeVector.x; - - if ( v != 0 ) - { -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( !SUBPIXEL_HINTING || - ( !exc->ignore_x_mode || - ( exc->sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) ) -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - zone->cur[point].x += FT_MulDiv( distance, v, exc->F_dot_P ); - - zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; - } - - v = exc->GS.freeVector.y; - - if ( v != 0 ) - { - zone->cur[point].y += FT_MulDiv( distance, v, exc->F_dot_P ); - - zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; - } - } - - - /*************************************************************************/ - /* */ - /* */ - /* Direct_Move_Orig */ - /* */ - /* */ - /* Moves the *original* position of a point by a given distance along */ - /* the freedom vector. Obviously, the point will not be `touched'. */ - /* */ - /* */ - /* point :: The index of the point to move. */ - /* */ - /* distance :: The distance to apply. */ - /* */ - /* */ - /* zone :: The affected glyph zone. */ - /* */ - static void - Direct_Move_Orig( TT_ExecContext exc, - TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_F26Dot6 v; - - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - FT_ASSERT( !exc->face->unpatented_hinting ); -#endif - - v = exc->GS.freeVector.x; - - if ( v != 0 ) - zone->org[point].x += FT_MulDiv( distance, v, exc->F_dot_P ); - - v = exc->GS.freeVector.y; - - if ( v != 0 ) - zone->org[point].y += FT_MulDiv( distance, v, exc->F_dot_P ); - } - - - /*************************************************************************/ - /* */ - /* Special versions of Direct_Move() */ - /* */ - /* The following versions are used whenever both vectors are both */ - /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ - /* */ - /*************************************************************************/ - - - static void - Direct_Move_X( TT_ExecContext exc, - TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_UNUSED( exc ); - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( !SUBPIXEL_HINTING || - !exc->ignore_x_mode ) -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - zone->cur[point].x += distance; - - zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; - } - - - static void - Direct_Move_Y( TT_ExecContext exc, - TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_UNUSED( exc ); - - zone->cur[point].y += distance; - zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; - } - - - /*************************************************************************/ - /* */ - /* Special versions of Direct_Move_Orig() */ - /* */ - /* The following versions are used whenever both vectors are both */ - /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ - /* */ - /*************************************************************************/ - - - static void - Direct_Move_Orig_X( TT_ExecContext exc, - TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_UNUSED( exc ); - - zone->org[point].x += distance; - } - - - static void - Direct_Move_Orig_Y( TT_ExecContext exc, - TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_UNUSED( exc ); - - zone->org[point].y += distance; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Round_None */ - /* */ - /* */ - /* Does not round, but adds engine compensation. */ - /* */ - /* */ - /* distance :: The distance (not) to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* */ - /* The compensated distance. */ - /* */ - /* */ - /* The TrueType specification says very few about the relationship */ - /* between rounding and engine compensation. However, it seems from */ - /* the description of super round that we should add the compensation */ - /* before rounding. */ - /* */ - static FT_F26Dot6 - Round_None( TT_ExecContext exc, - FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - FT_UNUSED( exc ); - - - if ( distance >= 0 ) - { - val = distance + compensation; - if ( val < 0 ) - val = 0; - } - else - { - val = distance - compensation; - if ( val > 0 ) - val = 0; - } - return val; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Round_To_Grid */ - /* */ - /* */ - /* Rounds value to grid after adding engine compensation. */ - /* */ - /* */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* */ - /* Rounded distance. */ - /* */ - static FT_F26Dot6 - Round_To_Grid( TT_ExecContext exc, - FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - FT_UNUSED( exc ); - - - if ( distance >= 0 ) - { - val = FT_PIX_ROUND( distance + compensation ); - if ( val < 0 ) - val = 0; - } - else - { - val = -FT_PIX_ROUND( compensation - distance ); - if ( val > 0 ) - val = 0; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Round_To_Half_Grid */ - /* */ - /* */ - /* Rounds value to half grid after adding engine compensation. */ - /* */ - /* */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* */ - /* Rounded distance. */ - /* */ - static FT_F26Dot6 - Round_To_Half_Grid( TT_ExecContext exc, - FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - FT_UNUSED( exc ); - - - if ( distance >= 0 ) - { - val = FT_PIX_FLOOR( distance + compensation ) + 32; - if ( val < 0 ) - val = 32; - } - else - { - val = -( FT_PIX_FLOOR( compensation - distance ) + 32 ); - if ( val > 0 ) - val = -32; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Round_Down_To_Grid */ - /* */ - /* */ - /* Rounds value down to grid after adding engine compensation. */ - /* */ - /* */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* */ - /* Rounded distance. */ - /* */ - static FT_F26Dot6 - Round_Down_To_Grid( TT_ExecContext exc, - FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - FT_UNUSED( exc ); - - - if ( distance >= 0 ) - { - val = FT_PIX_FLOOR( distance + compensation ); - if ( val < 0 ) - val = 0; - } - else - { - val = -FT_PIX_FLOOR( compensation - distance ); - if ( val > 0 ) - val = 0; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Round_Up_To_Grid */ - /* */ - /* */ - /* Rounds value up to grid after adding engine compensation. */ - /* */ - /* */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* */ - /* Rounded distance. */ - /* */ - static FT_F26Dot6 - Round_Up_To_Grid( TT_ExecContext exc, - FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - FT_UNUSED( exc ); - - - if ( distance >= 0 ) - { - val = FT_PIX_CEIL( distance + compensation ); - if ( val < 0 ) - val = 0; - } - else - { - val = -FT_PIX_CEIL( compensation - distance ); - if ( val > 0 ) - val = 0; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Round_To_Double_Grid */ - /* */ - /* */ - /* Rounds value to double grid after adding engine compensation. */ - /* */ - /* */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* */ - /* Rounded distance. */ - /* */ - static FT_F26Dot6 - Round_To_Double_Grid( TT_ExecContext exc, - FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - FT_UNUSED( exc ); - - - if ( distance >= 0 ) - { - val = FT_PAD_ROUND( distance + compensation, 32 ); - if ( val < 0 ) - val = 0; - } - else - { - val = -FT_PAD_ROUND( compensation - distance, 32 ); - if ( val > 0 ) - val = 0; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Round_Super */ - /* */ - /* */ - /* Super-rounds value to grid after adding engine compensation. */ - /* */ - /* */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* */ - /* Rounded distance. */ - /* */ - /* */ - /* The TrueType specification says very few about the relationship */ - /* between rounding and engine compensation. However, it seems from */ - /* the description of super round that we should add the compensation */ - /* before rounding. */ - /* */ - static FT_F26Dot6 - Round_Super( TT_ExecContext exc, - FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - - if ( distance >= 0 ) - { - val = ( distance - exc->phase + exc->threshold + compensation ) & - -exc->period; - val += exc->phase; - if ( val < 0 ) - val = exc->phase; - } - else - { - val = -( ( exc->threshold - exc->phase - distance + compensation ) & - -exc->period ); - val -= exc->phase; - if ( val > 0 ) - val = -exc->phase; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Round_Super_45 */ - /* */ - /* */ - /* Super-rounds value to grid after adding engine compensation. */ - /* */ - /* */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* */ - /* Rounded distance. */ - /* */ - /* */ - /* There is a separate function for Round_Super_45() as we may need */ - /* greater precision. */ - /* */ - static FT_F26Dot6 - Round_Super_45( TT_ExecContext exc, - FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - - if ( distance >= 0 ) - { - val = ( ( distance - exc->phase + exc->threshold + compensation ) / - exc->period ) * exc->period; - val += exc->phase; - if ( val < 0 ) - val = exc->phase; - } - else - { - val = -( ( ( exc->threshold - exc->phase - distance + compensation ) / - exc->period ) * exc->period ); - val -= exc->phase; - if ( val > 0 ) - val = -exc->phase; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Compute_Round */ - /* */ - /* */ - /* Sets the rounding mode. */ - /* */ - /* */ - /* round_mode :: The rounding mode to be used. */ - /* */ - static void - Compute_Round( TT_ExecContext exc, - FT_Byte round_mode ) - { - switch ( round_mode ) - { - case TT_Round_Off: - exc->func_round = (TT_Round_Func)Round_None; - break; - - case TT_Round_To_Grid: - exc->func_round = (TT_Round_Func)Round_To_Grid; - break; - - case TT_Round_Up_To_Grid: - exc->func_round = (TT_Round_Func)Round_Up_To_Grid; - break; - - case TT_Round_Down_To_Grid: - exc->func_round = (TT_Round_Func)Round_Down_To_Grid; - break; - - case TT_Round_To_Half_Grid: - exc->func_round = (TT_Round_Func)Round_To_Half_Grid; - break; - - case TT_Round_To_Double_Grid: - exc->func_round = (TT_Round_Func)Round_To_Double_Grid; - break; - - case TT_Round_Super: - exc->func_round = (TT_Round_Func)Round_Super; - break; - - case TT_Round_Super_45: - exc->func_round = (TT_Round_Func)Round_Super_45; - break; - } - } - - - /*************************************************************************/ - /* */ - /* */ - /* SetSuperRound */ - /* */ - /* */ - /* Sets Super Round parameters. */ - /* */ - /* */ - /* GridPeriod :: The grid period. */ - /* */ - /* selector :: The SROUND opcode. */ - /* */ - static void - SetSuperRound( TT_ExecContext exc, - FT_F2Dot14 GridPeriod, - FT_Long selector ) - { - switch ( (FT_Int)( selector & 0xC0 ) ) - { - case 0: - exc->period = GridPeriod / 2; - break; - - case 0x40: - exc->period = GridPeriod; - break; - - case 0x80: - exc->period = GridPeriod * 2; - break; - - /* This opcode is reserved, but... */ - case 0xC0: - exc->period = GridPeriod; - break; - } - - switch ( (FT_Int)( selector & 0x30 ) ) - { - case 0: - exc->phase = 0; - break; - - case 0x10: - exc->phase = exc->period / 4; - break; - - case 0x20: - exc->phase = exc->period / 2; - break; - - case 0x30: - exc->phase = exc->period * 3 / 4; - break; - } - - if ( ( selector & 0x0F ) == 0 ) - exc->threshold = exc->period - 1; - else - exc->threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * exc->period / 8; - - /* convert to F26Dot6 format */ - exc->period >>= 8; - exc->phase >>= 8; - exc->threshold >>= 8; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Project */ - /* */ - /* */ - /* Computes the projection of vector given by (v2-v1) along the */ - /* current projection vector. */ - /* */ - /* */ - /* v1 :: First input vector. */ - /* v2 :: Second input vector. */ - /* */ - /* */ - /* The distance in F26dot6 format. */ - /* */ - static FT_F26Dot6 - Project( TT_ExecContext exc, - FT_Pos dx, - FT_Pos dy ) - { -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - FT_ASSERT( !exc->face->unpatented_hinting ); -#endif - - return TT_DotFix14( dx, dy, - exc->GS.projVector.x, - exc->GS.projVector.y ); - } - - - /*************************************************************************/ - /* */ - /* */ - /* Dual_Project */ - /* */ - /* */ - /* Computes the projection of the vector given by (v2-v1) along the */ - /* current dual vector. */ - /* */ - /* */ - /* v1 :: First input vector. */ - /* v2 :: Second input vector. */ - /* */ - /* */ - /* The distance in F26dot6 format. */ - /* */ - static FT_F26Dot6 - Dual_Project( TT_ExecContext exc, - FT_Pos dx, - FT_Pos dy ) - { - return TT_DotFix14( dx, dy, - exc->GS.dualVector.x, - exc->GS.dualVector.y ); - } - - - /*************************************************************************/ - /* */ - /* */ - /* Project_x */ - /* */ - /* */ - /* Computes the projection of the vector given by (v2-v1) along the */ - /* horizontal axis. */ - /* */ - /* */ - /* v1 :: First input vector. */ - /* v2 :: Second input vector. */ - /* */ - /* */ - /* The distance in F26dot6 format. */ - /* */ - static FT_F26Dot6 - Project_x( TT_ExecContext exc, - FT_Pos dx, - FT_Pos dy ) - { - FT_UNUSED( exc ); - FT_UNUSED( dy ); - - return dx; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Project_y */ - /* */ - /* */ - /* Computes the projection of the vector given by (v2-v1) along the */ - /* vertical axis. */ - /* */ - /* */ - /* v1 :: First input vector. */ - /* v2 :: Second input vector. */ - /* */ - /* */ - /* The distance in F26dot6 format. */ - /* */ - static FT_F26Dot6 - Project_y( TT_ExecContext exc, - FT_Pos dx, - FT_Pos dy ) - { - FT_UNUSED( exc ); - FT_UNUSED( dx ); - - return dy; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Compute_Funcs */ - /* */ - /* */ - /* Computes the projection and movement function pointers according */ - /* to the current graphics state. */ - /* */ - static void - Compute_Funcs( TT_ExecContext exc ) - { -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - if ( exc->face->unpatented_hinting ) - { - /* If both vectors point rightwards along the x axis, set */ - /* `both-x-axis' true, otherwise set it false. The x values only */ - /* need be tested because the vector has been normalised to a unit */ - /* vector of length 0x4000 = unity. */ - exc->GS.both_x_axis = (FT_Bool)( exc->GS.projVector.x == 0x4000 && - exc->GS.freeVector.x == 0x4000 ); - - /* Throw away projection and freedom vector information */ - /* because the patents don't allow them to be stored. */ - /* The relevant US Patents are 5155805 and 5325479. */ - exc->GS.projVector.x = 0; - exc->GS.projVector.y = 0; - exc->GS.freeVector.x = 0; - exc->GS.freeVector.y = 0; - - if ( exc->GS.both_x_axis ) - { - exc->func_project = Project_x; - exc->func_move = Direct_Move_X; - exc->func_move_orig = Direct_Move_Orig_X; - } - else - { - exc->func_project = Project_y; - exc->func_move = Direct_Move_Y; - exc->func_move_orig = Direct_Move_Orig_Y; - } - - if ( exc->GS.dualVector.x == 0x4000 ) - exc->func_dualproj = Project_x; - else if ( exc->GS.dualVector.y == 0x4000 ) - exc->func_dualproj = Project_y; - else - exc->func_dualproj = Dual_Project; - - /* Force recalculation of cached aspect ratio */ - exc->tt_metrics.ratio = 0; - - return; - } -#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */ - - if ( exc->GS.freeVector.x == 0x4000 ) - exc->F_dot_P = exc->GS.projVector.x; - else if ( exc->GS.freeVector.y == 0x4000 ) - exc->F_dot_P = exc->GS.projVector.y; - else - exc->F_dot_P = - ( (FT_Long)exc->GS.projVector.x * exc->GS.freeVector.x + - (FT_Long)exc->GS.projVector.y * exc->GS.freeVector.y ) >> 14; - - if ( exc->GS.projVector.x == 0x4000 ) - exc->func_project = (TT_Project_Func)Project_x; - else if ( exc->GS.projVector.y == 0x4000 ) - exc->func_project = (TT_Project_Func)Project_y; - else - exc->func_project = (TT_Project_Func)Project; - - if ( exc->GS.dualVector.x == 0x4000 ) - exc->func_dualproj = (TT_Project_Func)Project_x; - else if ( exc->GS.dualVector.y == 0x4000 ) - exc->func_dualproj = (TT_Project_Func)Project_y; - else - exc->func_dualproj = (TT_Project_Func)Dual_Project; - - exc->func_move = (TT_Move_Func)Direct_Move; - exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig; - - if ( exc->F_dot_P == 0x4000L ) - { - if ( exc->GS.freeVector.x == 0x4000 ) - { - exc->func_move = (TT_Move_Func)Direct_Move_X; - exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_X; - } - else if ( exc->GS.freeVector.y == 0x4000 ) - { - exc->func_move = (TT_Move_Func)Direct_Move_Y; - exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y; - } - } - - /* at small sizes, F_dot_P can become too small, resulting */ - /* in overflows and `spikes' in a number of glyphs like `w'. */ - - if ( FT_ABS( exc->F_dot_P ) < 0x400L ) - exc->F_dot_P = 0x4000L; - - /* Disable cached aspect ratio */ - exc->tt_metrics.ratio = 0; - } - - - /*************************************************************************/ - /* */ - /* */ - /* Normalize */ - /* */ - /* */ - /* Norms a vector. */ - /* */ - /* */ - /* Vx :: The horizontal input vector coordinate. */ - /* Vy :: The vertical input vector coordinate. */ - /* */ - /* */ - /* R :: The normed unit vector. */ - /* */ - /* */ - /* Returns FAILURE if a vector parameter is zero. */ - /* */ - /* */ - /* In case Vx and Vy are both zero, `Normalize' returns SUCCESS, and */ - /* R is undefined. */ - /* */ - static FT_Bool - Normalize( FT_F26Dot6 Vx, - FT_F26Dot6 Vy, - FT_UnitVector* R ) - { - FT_Vector V; - - - if ( Vx == 0 && Vy == 0 ) - { - /* XXX: UNDOCUMENTED! It seems that it is possible to try */ - /* to normalize the vector (0,0). Return immediately. */ - return SUCCESS; - } - - V.x = Vx; - V.y = Vy; - - FT_Vector_NormLen( &V ); - - R->x = (FT_F2Dot14)( V.x / 4 ); - R->y = (FT_F2Dot14)( V.y / 4 ); - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* Here we start with the implementation of the various opcodes. */ - /* */ - /*************************************************************************/ - - -#define ARRAY_BOUND_ERROR \ - do \ - { \ - exc->error = FT_THROW( Invalid_Reference ); \ - return; \ - } while (0) - - - /*************************************************************************/ - /* */ - /* MPPEM[]: Measure Pixel Per EM */ - /* Opcode range: 0x4B */ - /* Stack: --> Euint16 */ - /* */ - static void - Ins_MPPEM( TT_ExecContext exc, - FT_Long* args ) - { - args[0] = exc->func_cur_ppem( exc ); - } - - - /*************************************************************************/ - /* */ - /* MPS[]: Measure Point Size */ - /* Opcode range: 0x4C */ - /* Stack: --> Euint16 */ - /* */ - static void - Ins_MPS( TT_ExecContext exc, - FT_Long* args ) - { - /* Note: The point size should be irrelevant in a given font program; */ - /* we thus decide to return only the PPEM value. */ -#if 0 - args[0] = exc->metrics.pointSize; -#else - args[0] = exc->func_cur_ppem( exc ); -#endif - } - - - /*************************************************************************/ - /* */ - /* DUP[]: DUPlicate the stack's top element */ - /* Opcode range: 0x20 */ - /* Stack: StkElt --> StkElt StkElt */ - /* */ - static void - Ins_DUP( FT_Long* args ) - { - args[1] = args[0]; - } - - - /*************************************************************************/ - /* */ - /* POP[]: POP the stack's top element */ - /* Opcode range: 0x21 */ - /* Stack: StkElt --> */ - /* */ - static void - Ins_POP( void ) - { - /* nothing to do */ - } - - - /*************************************************************************/ - /* */ - /* CLEAR[]: CLEAR the entire stack */ - /* Opcode range: 0x22 */ - /* Stack: StkElt... --> */ - /* */ - static void - Ins_CLEAR( TT_ExecContext exc ) - { - exc->new_top = 0; - } - - - /*************************************************************************/ - /* */ - /* SWAP[]: SWAP the stack's top two elements */ - /* Opcode range: 0x23 */ - /* Stack: 2 * StkElt --> 2 * StkElt */ - /* */ - static void - Ins_SWAP( FT_Long* args ) - { - FT_Long L; - - - L = args[0]; - args[0] = args[1]; - args[1] = L; - } - - - /*************************************************************************/ - /* */ - /* DEPTH[]: return the stack DEPTH */ - /* Opcode range: 0x24 */ - /* Stack: --> uint32 */ - /* */ - static void - Ins_DEPTH( TT_ExecContext exc, - FT_Long* args ) - { - args[0] = exc->top; - } - - - /*************************************************************************/ - /* */ - /* LT[]: Less Than */ - /* Opcode range: 0x50 */ - /* Stack: int32? int32? --> bool */ - /* */ - static void - Ins_LT( FT_Long* args ) - { - args[0] = ( args[0] < args[1] ); - } - - - /*************************************************************************/ - /* */ - /* LTEQ[]: Less Than or EQual */ - /* Opcode range: 0x51 */ - /* Stack: int32? int32? --> bool */ - /* */ - static void - Ins_LTEQ( FT_Long* args ) - { - args[0] = ( args[0] <= args[1] ); - } - - - /*************************************************************************/ - /* */ - /* GT[]: Greater Than */ - /* Opcode range: 0x52 */ - /* Stack: int32? int32? --> bool */ - /* */ - static void - Ins_GT( FT_Long* args ) - { - args[0] = ( args[0] > args[1] ); - } - - - /*************************************************************************/ - /* */ - /* GTEQ[]: Greater Than or EQual */ - /* Opcode range: 0x53 */ - /* Stack: int32? int32? --> bool */ - /* */ - static void - Ins_GTEQ( FT_Long* args ) - { - args[0] = ( args[0] >= args[1] ); - } - - - /*************************************************************************/ - /* */ - /* EQ[]: EQual */ - /* Opcode range: 0x54 */ - /* Stack: StkElt StkElt --> bool */ - /* */ - static void - Ins_EQ( FT_Long* args ) - { - args[0] = ( args[0] == args[1] ); - } - - - /*************************************************************************/ - /* */ - /* NEQ[]: Not EQual */ - /* Opcode range: 0x55 */ - /* Stack: StkElt StkElt --> bool */ - /* */ - static void - Ins_NEQ( FT_Long* args ) - { - args[0] = ( args[0] != args[1] ); - } - - - /*************************************************************************/ - /* */ - /* ODD[]: Is ODD */ - /* Opcode range: 0x56 */ - /* Stack: f26.6 --> bool */ - /* */ - static void - Ins_ODD( TT_ExecContext exc, - FT_Long* args ) - { - args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 127 ) == 64 ); - } - - - /*************************************************************************/ - /* */ - /* EVEN[]: Is EVEN */ - /* Opcode range: 0x57 */ - /* Stack: f26.6 --> bool */ - /* */ - static void - Ins_EVEN( TT_ExecContext exc, - FT_Long* args ) - { - args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 127 ) == 0 ); - } - - - /*************************************************************************/ - /* */ - /* AND[]: logical AND */ - /* Opcode range: 0x5A */ - /* Stack: uint32 uint32 --> uint32 */ - /* */ - static void - Ins_AND( FT_Long* args ) - { - args[0] = ( args[0] && args[1] ); - } - - - /*************************************************************************/ - /* */ - /* OR[]: logical OR */ - /* Opcode range: 0x5B */ - /* Stack: uint32 uint32 --> uint32 */ - /* */ - static void - Ins_OR( FT_Long* args ) - { - args[0] = ( args[0] || args[1] ); - } - - - /*************************************************************************/ - /* */ - /* NOT[]: logical NOT */ - /* Opcode range: 0x5C */ - /* Stack: StkElt --> uint32 */ - /* */ - static void - Ins_NOT( FT_Long* args ) - { - args[0] = !args[0]; - } - - - /*************************************************************************/ - /* */ - /* ADD[]: ADD */ - /* Opcode range: 0x60 */ - /* Stack: f26.6 f26.6 --> f26.6 */ - /* */ - static void - Ins_ADD( FT_Long* args ) - { - args[0] += args[1]; - } - - - /*************************************************************************/ - /* */ - /* SUB[]: SUBtract */ - /* Opcode range: 0x61 */ - /* Stack: f26.6 f26.6 --> f26.6 */ - /* */ - static void - Ins_SUB( FT_Long* args ) - { - args[0] -= args[1]; - } - - - /*************************************************************************/ - /* */ - /* DIV[]: DIVide */ - /* Opcode range: 0x62 */ - /* Stack: f26.6 f26.6 --> f26.6 */ - /* */ - static void - Ins_DIV( TT_ExecContext exc, - FT_Long* args ) - { - if ( args[1] == 0 ) - exc->error = FT_THROW( Divide_By_Zero ); - else - args[0] = FT_MulDiv_No_Round( args[0], 64L, args[1] ); - } - - - /*************************************************************************/ - /* */ - /* MUL[]: MULtiply */ - /* Opcode range: 0x63 */ - /* Stack: f26.6 f26.6 --> f26.6 */ - /* */ - static void - Ins_MUL( FT_Long* args ) - { - args[0] = FT_MulDiv( args[0], args[1], 64L ); - } - - - /*************************************************************************/ - /* */ - /* ABS[]: ABSolute value */ - /* Opcode range: 0x64 */ - /* Stack: f26.6 --> f26.6 */ - /* */ - static void - Ins_ABS( FT_Long* args ) - { - args[0] = FT_ABS( args[0] ); - } - - - /*************************************************************************/ - /* */ - /* NEG[]: NEGate */ - /* Opcode range: 0x65 */ - /* Stack: f26.6 --> f26.6 */ - /* */ - static void - Ins_NEG( FT_Long* args ) - { - args[0] = -args[0]; - } - - - /*************************************************************************/ - /* */ - /* FLOOR[]: FLOOR */ - /* Opcode range: 0x66 */ - /* Stack: f26.6 --> f26.6 */ - /* */ - static void - Ins_FLOOR( FT_Long* args ) - { - args[0] = FT_PIX_FLOOR( args[0] ); - } - - - /*************************************************************************/ - /* */ - /* CEILING[]: CEILING */ - /* Opcode range: 0x67 */ - /* Stack: f26.6 --> f26.6 */ - /* */ - static void - Ins_CEILING( FT_Long* args ) - { - args[0] = FT_PIX_CEIL( args[0] ); - } - - - /*************************************************************************/ - /* */ - /* RS[]: Read Store */ - /* Opcode range: 0x43 */ - /* Stack: uint32 --> uint32 */ - /* */ - static void - Ins_RS( TT_ExecContext exc, - FT_Long* args ) - { -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - - FT_ULong I = (FT_ULong)args[0]; - - - if ( BOUNDSL( I, exc->storeSize ) ) - { - if ( exc->pedantic_hinting ) - ARRAY_BOUND_ERROR; - else - args[0] = 0; - } - else - { - /* subpixel hinting - avoid Typeman Dstroke and */ - /* IStroke and Vacuform rounds */ - if ( SUBPIXEL_HINTING && - 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 - args[0] = exc->storage[I]; - } - -#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - FT_ULong I = (FT_ULong)args[0]; - - - if ( BOUNDSL( I, exc->storeSize ) ) - { - if ( exc->pedantic_hinting ) - ARRAY_BOUND_ERROR; - else - args[0] = 0; - } - else - args[0] = exc->storage[I]; - -#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - } - - - /*************************************************************************/ - /* */ - /* WS[]: Write Store */ - /* Opcode range: 0x42 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_WS( TT_ExecContext exc, - FT_Long* args ) - { - FT_ULong I = (FT_ULong)args[0]; - - - if ( BOUNDSL( I, exc->storeSize ) ) - { - if ( exc->pedantic_hinting ) - ARRAY_BOUND_ERROR; - } - else - exc->storage[I] = args[1]; - } - - - /*************************************************************************/ - /* */ - /* WCVTP[]: Write CVT in Pixel units */ - /* Opcode range: 0x44 */ - /* Stack: f26.6 uint32 --> */ - /* */ - static void - Ins_WCVTP( TT_ExecContext exc, - FT_Long* args ) - { - FT_ULong I = (FT_ULong)args[0]; - - - if ( BOUNDSL( I, exc->cvtSize ) ) - { - if ( exc->pedantic_hinting ) - ARRAY_BOUND_ERROR; - } - else - exc->func_write_cvt( exc, I, args[1] ); - } - - - /*************************************************************************/ - /* */ - /* WCVTF[]: Write CVT in Funits */ - /* Opcode range: 0x70 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_WCVTF( TT_ExecContext exc, - FT_Long* args ) - { - FT_ULong I = (FT_ULong)args[0]; - - - if ( BOUNDSL( I, exc->cvtSize ) ) - { - if ( exc->pedantic_hinting ) - ARRAY_BOUND_ERROR; - } - else - exc->cvt[I] = FT_MulFix( args[1], exc->tt_metrics.scale ); - } - - - /*************************************************************************/ - /* */ - /* RCVT[]: Read CVT */ - /* Opcode range: 0x45 */ - /* Stack: uint32 --> f26.6 */ - /* */ - static void - Ins_RCVT( TT_ExecContext exc, - FT_Long* args ) - { - FT_ULong I = (FT_ULong)args[0]; - - - if ( BOUNDSL( I, exc->cvtSize ) ) - { - if ( exc->pedantic_hinting ) - ARRAY_BOUND_ERROR; - else - args[0] = 0; - } - else - args[0] = exc->func_read_cvt( exc, I ); - } - - - /*************************************************************************/ - /* */ - /* AA[]: Adjust Angle */ - /* Opcode range: 0x7F */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_AA( void ) - { - /* intentionally no longer supported */ - } - - - /*************************************************************************/ - /* */ - /* DEBUG[]: DEBUG. Unsupported. */ - /* Opcode range: 0x4F */ - /* Stack: uint32 --> */ - /* */ - /* Note: The original instruction pops a value from the stack. */ - /* */ - static void - Ins_DEBUG( TT_ExecContext exc ) - { - exc->error = FT_THROW( Debug_OpCode ); - } - - - /*************************************************************************/ - /* */ - /* ROUND[ab]: ROUND value */ - /* Opcode range: 0x68-0x6B */ - /* Stack: f26.6 --> f26.6 */ - /* */ - static void - Ins_ROUND( TT_ExecContext exc, - FT_Long* args ) - { - args[0] = exc->func_round( - exc, - args[0], - exc->tt_metrics.compensations[exc->opcode - 0x68] ); - } - - - /*************************************************************************/ - /* */ - /* NROUND[ab]: No ROUNDing of value */ - /* Opcode range: 0x6C-0x6F */ - /* Stack: f26.6 --> f26.6 */ - /* */ - static void - Ins_NROUND( TT_ExecContext exc, - FT_Long* args ) - { - args[0] = Round_None( - exc, - args[0], - exc->tt_metrics.compensations[exc->opcode - 0x6C] ); - } - - - /*************************************************************************/ - /* */ - /* MAX[]: MAXimum */ - /* Opcode range: 0x68 */ - /* Stack: int32? int32? --> int32 */ - /* */ - static void - Ins_MAX( FT_Long* args ) - { - if ( args[1] > args[0] ) - args[0] = args[1]; - } - - - /*************************************************************************/ - /* */ - /* MIN[]: MINimum */ - /* Opcode range: 0x69 */ - /* Stack: int32? int32? --> int32 */ - /* */ - static void - Ins_MIN( FT_Long* args ) - { - if ( args[1] < args[0] ) - args[0] = args[1]; - } - - - /*************************************************************************/ - /* */ - /* MINDEX[]: Move INDEXed element */ - /* Opcode range: 0x26 */ - /* Stack: int32? --> StkElt */ - /* */ - static void - Ins_MINDEX( TT_ExecContext exc, - FT_Long* args ) - { - FT_Long L, K; - - - L = args[0]; - - if ( L <= 0 || L > exc->args ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - } - else - { - K = exc->stack[exc->args - L]; - - FT_ARRAY_MOVE( &exc->stack[exc->args - L ], - &exc->stack[exc->args - L + 1], - ( L - 1 ) ); - - exc->stack[exc->args - 1] = K; - } - } - - - /*************************************************************************/ - /* */ - /* CINDEX[]: Copy INDEXed element */ - /* Opcode range: 0x25 */ - /* Stack: int32 --> StkElt */ - /* */ - static void - Ins_CINDEX( TT_ExecContext exc, - FT_Long* args ) - { - FT_Long L; - - - L = args[0]; - - if ( L <= 0 || L > exc->args ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - args[0] = 0; - } - else - args[0] = exc->stack[exc->args - L]; - } - - - /*************************************************************************/ - /* */ - /* ROLL[]: ROLL top three elements */ - /* Opcode range: 0x8A */ - /* Stack: 3 * StkElt --> 3 * StkElt */ - /* */ - static void - Ins_ROLL( FT_Long* args ) - { - FT_Long A, B, C; - - - A = args[2]; - B = args[1]; - C = args[0]; - - args[2] = C; - args[1] = A; - args[0] = B; - } - - - /*************************************************************************/ - /* */ - /* MANAGING THE FLOW OF CONTROL */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* SLOOP[]: Set LOOP variable */ - /* Opcode range: 0x17 */ - /* Stack: int32? --> */ - /* */ - static void - Ins_SLOOP( TT_ExecContext exc, - FT_Long* args ) - { - if ( args[0] < 0 ) - exc->error = FT_THROW( Bad_Argument ); - else - exc->GS.loop = args[0]; - } - - - static FT_Bool - SkipCode( TT_ExecContext exc ) - { - exc->IP += exc->length; - - if ( exc->IP < exc->codeSize ) - { - exc->opcode = exc->code[exc->IP]; - - exc->length = opcode_length[exc->opcode]; - if ( exc->length < 0 ) - { - if ( exc->IP + 1 >= exc->codeSize ) - goto Fail_Overflow; - exc->length = 2 - exc->length * exc->code[exc->IP + 1]; - } - - if ( exc->IP + exc->length <= exc->codeSize ) - return SUCCESS; - } - - Fail_Overflow: - exc->error = FT_THROW( Code_Overflow ); - return FAILURE; - } - - - /*************************************************************************/ - /* */ - /* IF[]: IF test */ - /* Opcode range: 0x58 */ - /* Stack: StkElt --> */ - /* */ - static void - Ins_IF( TT_ExecContext exc, - FT_Long* args ) - { - FT_Int nIfs; - FT_Bool Out; - - - if ( args[0] != 0 ) - return; - - nIfs = 1; - Out = 0; - - do - { - if ( SkipCode( exc ) == FAILURE ) - return; - - switch ( exc->opcode ) - { - case 0x58: /* IF */ - nIfs++; - break; - - case 0x1B: /* ELSE */ - Out = FT_BOOL( nIfs == 1 ); - break; - - case 0x59: /* EIF */ - nIfs--; - Out = FT_BOOL( nIfs == 0 ); - break; - } - } while ( Out == 0 ); - } - - - /*************************************************************************/ - /* */ - /* ELSE[]: ELSE */ - /* Opcode range: 0x1B */ - /* Stack: --> */ - /* */ - static void - Ins_ELSE( TT_ExecContext exc ) - { - FT_Int nIfs; - - - nIfs = 1; - - do - { - if ( SkipCode( exc ) == FAILURE ) - return; - - switch ( exc->opcode ) - { - case 0x58: /* IF */ - nIfs++; - break; - - case 0x59: /* EIF */ - nIfs--; - break; - } - } while ( nIfs != 0 ); - } - - - /*************************************************************************/ - /* */ - /* EIF[]: End IF */ - /* Opcode range: 0x59 */ - /* Stack: --> */ - /* */ - static void - Ins_EIF( void ) - { - /* nothing to do */ - } - - - /*************************************************************************/ - /* */ - /* JMPR[]: JuMP Relative */ - /* Opcode range: 0x1C */ - /* Stack: int32 --> */ - /* */ - static void - Ins_JMPR( TT_ExecContext exc, - FT_Long* args ) - { - if ( args[0] == 0 && exc->args == 0 ) - exc->error = FT_THROW( Bad_Argument ); - exc->IP += args[0]; - if ( exc->IP < 0 || - ( exc->callTop > 0 && - exc->IP > exc->callStack[exc->callTop - 1].Def->end ) ) - exc->error = FT_THROW( Bad_Argument ); - exc->step_ins = FALSE; - } - - - /*************************************************************************/ - /* */ - /* JROT[]: Jump Relative On True */ - /* Opcode range: 0x78 */ - /* Stack: StkElt int32 --> */ - /* */ - static void - Ins_JROT( TT_ExecContext exc, - FT_Long* args ) - { - if ( args[1] != 0 ) - Ins_JMPR( exc, args ); - } - - - /*************************************************************************/ - /* */ - /* JROF[]: Jump Relative On False */ - /* Opcode range: 0x79 */ - /* Stack: StkElt int32 --> */ - /* */ - static void - Ins_JROF( TT_ExecContext exc, - FT_Long* args ) - { - if ( args[1] == 0 ) - Ins_JMPR( exc, args ); - } - - - /*************************************************************************/ - /* */ - /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* FDEF[]: Function DEFinition */ - /* Opcode range: 0x2C */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_FDEF( TT_ExecContext exc, - FT_Long* args ) - { - FT_ULong n; - TT_DefRecord* rec; - TT_DefRecord* limit; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - /* 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - - /* some font programs are broken enough to redefine functions! */ - /* We will then parse the current table. */ - - rec = exc->FDefs; - limit = rec + exc->numFDefs; - n = (FT_ULong)args[0]; - - for ( ; rec < limit; rec++ ) - { - if ( rec->opc == n ) - break; - } - - if ( rec == limit ) - { - /* check that there is enough room for new functions */ - if ( exc->numFDefs >= exc->maxFDefs ) - { - exc->error = FT_THROW( Too_Many_Function_Defs ); - return; - } - exc->numFDefs++; - } - - /* Although FDEF takes unsigned 32-bit integer, */ - /* func # must be within unsigned 16-bit integer */ - if ( n > 0xFFFFU ) - { - exc->error = FT_THROW( Too_Many_Function_Defs ); - return; - } - - rec->range = exc->curRange; - 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; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - /* 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_CONFIG_OPTION_SUBPIXEL_HINTING - - if ( SUBPIXEL_HINTING ) - { - 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: %d, %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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - switch ( exc->opcode ) - { - case 0x89: /* IDEF */ - case 0x2C: /* FDEF */ - exc->error = FT_THROW( Nested_DEFS ); - return; - - case 0x2D: /* ENDF */ - rec->end = exc->IP; - return; - } - } - } - - - /*************************************************************************/ - /* */ - /* ENDF[]: END Function definition */ - /* Opcode range: 0x2D */ - /* Stack: --> */ - /* */ - static void - Ins_ENDF( TT_ExecContext exc ) - { - TT_CallRec* pRec; - - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - exc->sph_in_func_flags = 0x0000; -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - if ( exc->callTop <= 0 ) /* We encountered an ENDF without a call */ - { - exc->error = FT_THROW( ENDF_In_Exec_Stream ); - return; - } - - exc->callTop--; - - pRec = &exc->callStack[exc->callTop]; - - pRec->Cur_Count--; - - exc->step_ins = FALSE; - - if ( pRec->Cur_Count > 0 ) - { - exc->callTop++; - exc->IP = pRec->Def->start; - } - else - /* Loop through the current function */ - Ins_Goto_CodeRange( exc, pRec->Caller_Range, pRec->Caller_IP ); - - /* Exit the current call frame. */ - - /* NOTE: If the last instruction of a program is a */ - /* CALL or LOOPCALL, the return address is */ - /* always out of the code range. This is a */ - /* valid address, and it is why we do not test */ - /* the result of Ins_Goto_CodeRange() here! */ - } - - - /*************************************************************************/ - /* */ - /* CALL[]: CALL function */ - /* Opcode range: 0x2B */ - /* Stack: uint32? --> */ - /* */ - static void - Ins_CALL( TT_ExecContext exc, - FT_Long* args ) - { - FT_ULong F; - TT_CallRec* pCrec; - TT_DefRecord* def; - - - /* first of all, check the index */ - - F = (FT_ULong)args[0]; - if ( BOUNDSL( F, exc->maxFunc + 1 ) ) - goto Fail; - - /* Except for some old Apple fonts, all functions in a TrueType */ - /* font are defined in increasing order, starting from 0. This */ - /* means that we normally have */ - /* */ - /* exc->maxFunc+1 == exc->numFDefs */ - /* exc->FDefs[n].opc == n for n in 0..exc->maxFunc */ - /* */ - /* If this isn't true, we need to look up the function table. */ - - def = exc->FDefs + F; - if ( exc->maxFunc + 1 != exc->numFDefs || def->opc != F ) - { - /* look up the FDefs table */ - TT_DefRecord* limit; - - - def = exc->FDefs; - limit = def + exc->numFDefs; - - while ( def < limit && def->opc != F ) - def++; - - if ( def == limit ) - goto Fail; - } - - /* check that the function is active */ - if ( !def->active ) - goto Fail; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING && - 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - /* check the call stack */ - if ( exc->callTop >= exc->callSize ) - { - exc->error = FT_THROW( Stack_Overflow ); - return; - } - - pCrec = exc->callStack + exc->callTop; - - pCrec->Caller_Range = exc->curRange; - pCrec->Caller_IP = exc->IP + 1; - pCrec->Cur_Count = 1; - pCrec->Def = def; - - exc->callTop++; - - Ins_Goto_CodeRange( exc, def->range, def->start ); - - exc->step_ins = FALSE; - - return; - - Fail: - exc->error = FT_THROW( Invalid_Reference ); - } - - - /*************************************************************************/ - /* */ - /* LOOPCALL[]: LOOP and CALL function */ - /* Opcode range: 0x2A */ - /* Stack: uint32? Eint16? --> */ - /* */ - static void - Ins_LOOPCALL( TT_ExecContext exc, - FT_Long* args ) - { - FT_ULong F; - TT_CallRec* pCrec; - TT_DefRecord* def; - - - /* first of all, check the index */ - F = (FT_ULong)args[1]; - if ( BOUNDSL( F, exc->maxFunc + 1 ) ) - goto Fail; - - /* Except for some old Apple fonts, all functions in a TrueType */ - /* font are defined in increasing order, starting from 0. This */ - /* means that we normally have */ - /* */ - /* exc->maxFunc+1 == exc->numFDefs */ - /* exc->FDefs[n].opc == n for n in 0..exc->maxFunc */ - /* */ - /* If this isn't true, we need to look up the function table. */ - - def = exc->FDefs + F; - if ( exc->maxFunc + 1 != exc->numFDefs || def->opc != F ) - { - /* look up the FDefs table */ - TT_DefRecord* limit; - - - def = exc->FDefs; - limit = def + exc->numFDefs; - - while ( def < limit && def->opc != F ) - def++; - - if ( def == limit ) - goto Fail; - } - - /* check that the function is active */ - if ( !def->active ) - goto Fail; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING && - 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - /* check stack */ - if ( exc->callTop >= exc->callSize ) - { - exc->error = FT_THROW( Stack_Overflow ); - return; - } - - if ( args[0] > 0 ) - { - pCrec = exc->callStack + exc->callTop; - - pCrec->Caller_Range = exc->curRange; - pCrec->Caller_IP = exc->IP + 1; - pCrec->Cur_Count = (FT_Int)args[0]; - pCrec->Def = def; - - exc->callTop++; - - Ins_Goto_CodeRange( exc, def->range, def->start ); - - exc->step_ins = FALSE; - } - - return; - - Fail: - exc->error = FT_THROW( Invalid_Reference ); - } - - - /*************************************************************************/ - /* */ - /* IDEF[]: Instruction DEFinition */ - /* Opcode range: 0x89 */ - /* Stack: Eint8 --> */ - /* */ - static void - Ins_IDEF( TT_ExecContext exc, - FT_Long* args ) - { - TT_DefRecord* def; - TT_DefRecord* limit; - - - /* First of all, look for the same function in our table */ - - def = exc->IDefs; - limit = def + exc->numIDefs; - - for ( ; def < limit; def++ ) - if ( def->opc == (FT_ULong)args[0] ) - break; - - if ( def == limit ) - { - /* check that there is enough room for a new instruction */ - if ( exc->numIDefs >= exc->maxIDefs ) - { - exc->error = FT_THROW( Too_Many_Instruction_Defs ); - return; - } - exc->numIDefs++; - } - - /* opcode must be unsigned 8-bit integer */ - if ( 0 > args[0] || args[0] > 0x00FF ) - { - exc->error = FT_THROW( Too_Many_Instruction_Defs ); - return; - } - - def->opc = (FT_Byte)args[0]; - def->start = exc->IP + 1; - def->range = exc->curRange; - def->active = TRUE; - - if ( (FT_ULong)args[0] > exc->maxIns ) - exc->maxIns = (FT_Byte)args[0]; - - /* Now skip the whole function definition. */ - /* We don't allow nested IDEFs & FDEFs. */ - - while ( SkipCode( exc ) == SUCCESS ) - { - switch ( exc->opcode ) - { - case 0x89: /* IDEF */ - case 0x2C: /* FDEF */ - exc->error = FT_THROW( Nested_DEFS ); - return; - case 0x2D: /* ENDF */ - return; - } - } - } - - - /*************************************************************************/ - /* */ - /* PUSHING DATA ONTO THE INTERPRETER STACK */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* NPUSHB[]: PUSH N Bytes */ - /* Opcode range: 0x40 */ - /* Stack: --> uint32... */ - /* */ - static void - Ins_NPUSHB( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort L, K; - - - L = (FT_UShort)exc->code[exc->IP + 1]; - - if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) ) - { - exc->error = FT_THROW( Stack_Overflow ); - return; - } - - for ( K = 1; K <= L; K++ ) - args[K - 1] = exc->code[exc->IP + K + 1]; - - exc->new_top += L; - } - - - /*************************************************************************/ - /* */ - /* NPUSHW[]: PUSH N Words */ - /* Opcode range: 0x41 */ - /* Stack: --> int32... */ - /* */ - static void - Ins_NPUSHW( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort L, K; - - - L = (FT_UShort)exc->code[exc->IP + 1]; - - if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) ) - { - exc->error = FT_THROW( Stack_Overflow ); - return; - } - - exc->IP += 2; - - for ( K = 0; K < L; K++ ) - args[K] = GetShortIns( exc ); - - exc->step_ins = FALSE; - exc->new_top += L; - } - - - /*************************************************************************/ - /* */ - /* PUSHB[abc]: PUSH Bytes */ - /* Opcode range: 0xB0-0xB7 */ - /* Stack: --> uint32... */ - /* */ - static void - Ins_PUSHB( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort L, K; - - - L = (FT_UShort)( exc->opcode - 0xB0 + 1 ); - - if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) ) - { - exc->error = FT_THROW( Stack_Overflow ); - return; - } - - for ( K = 1; K <= L; K++ ) - args[K - 1] = exc->code[exc->IP + K]; - } - - - /*************************************************************************/ - /* */ - /* PUSHW[abc]: PUSH Words */ - /* Opcode range: 0xB8-0xBF */ - /* Stack: --> int32... */ - /* */ - static void - Ins_PUSHW( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort L, K; - - - L = (FT_UShort)( exc->opcode - 0xB8 + 1 ); - - if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) ) - { - exc->error = FT_THROW( Stack_Overflow ); - return; - } - - exc->IP++; - - for ( K = 0; K < L; K++ ) - args[K] = GetShortIns( exc ); - - exc->step_ins = FALSE; - } - - - /*************************************************************************/ - /* */ - /* MANAGING THE GRAPHICS STATE */ - /* */ - /*************************************************************************/ - - - static FT_Bool - Ins_SxVTL( TT_ExecContext exc, - FT_UShort aIdx1, - FT_UShort aIdx2, - FT_UnitVector* Vec ) - { - FT_Long A, B, C; - FT_Vector* p1; - FT_Vector* p2; - - FT_Byte opcode = exc->opcode; - - - if ( BOUNDS( aIdx1, exc->zp2.n_points ) || - BOUNDS( aIdx2, exc->zp1.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return FAILURE; - } - - p1 = exc->zp1.cur + aIdx2; - p2 = exc->zp2.cur + aIdx1; - - A = p1->x - p2->x; - B = p1->y - p2->y; - - /* If p1 == p2, SPvTL and SFvTL behave the same as */ - /* SPvTCA[X] and SFvTCA[X], respectively. */ - /* */ - /* Confirmed by Greg Hitchcock. */ - - if ( A == 0 && B == 0 ) - { - A = 0x4000; - opcode = 0; - } - - if ( ( opcode & 1 ) != 0 ) - { - C = B; /* counter clockwise rotation */ - B = A; - A = -C; - } - - Normalize( A, B, Vec ); - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* SVTCA[a]: Set (F and P) Vectors to Coordinate Axis */ - /* Opcode range: 0x00-0x01 */ - /* Stack: --> */ - /* */ - /* SPvTCA[a]: Set PVector to Coordinate Axis */ - /* Opcode range: 0x02-0x03 */ - /* Stack: --> */ - /* */ - /* SFvTCA[a]: Set FVector to Coordinate Axis */ - /* Opcode range: 0x04-0x05 */ - /* Stack: --> */ - /* */ - static void - Ins_SxyTCA( TT_ExecContext exc ) - { - FT_Short AA, BB; - - FT_Byte opcode = exc->opcode; - - - AA = (FT_Short)( ( opcode & 1 ) << 14 ); - BB = (FT_Short)( AA ^ 0x4000 ); - - if ( opcode < 4 ) - { - exc->GS.projVector.x = AA; - exc->GS.projVector.y = BB; - - exc->GS.dualVector.x = AA; - exc->GS.dualVector.y = BB; - } - else - GUESS_VECTOR( projVector ); - - if ( ( opcode & 2 ) == 0 ) - { - exc->GS.freeVector.x = AA; - exc->GS.freeVector.y = BB; - } - else - GUESS_VECTOR( freeVector ); - - Compute_Funcs( exc ); - } - - - /*************************************************************************/ - /* */ - /* SPvTL[a]: Set PVector To Line */ - /* Opcode range: 0x06-0x07 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_SPVTL( TT_ExecContext exc, - FT_Long* args ) - { - if ( Ins_SxVTL( exc, - (FT_UShort)args[1], - (FT_UShort)args[0], - &exc->GS.projVector ) == SUCCESS ) - { - exc->GS.dualVector = exc->GS.projVector; - GUESS_VECTOR( freeVector ); - Compute_Funcs( exc ); - } - } - - - /*************************************************************************/ - /* */ - /* SFvTL[a]: Set FVector To Line */ - /* Opcode range: 0x08-0x09 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_SFVTL( TT_ExecContext exc, - FT_Long* args ) - { - if ( Ins_SxVTL( exc, - (FT_UShort)args[1], - (FT_UShort)args[0], - &exc->GS.freeVector ) == SUCCESS ) - { - GUESS_VECTOR( projVector ); - Compute_Funcs( exc ); - } - } - - - /*************************************************************************/ - /* */ - /* SFvTPv[]: Set FVector To PVector */ - /* Opcode range: 0x0E */ - /* Stack: --> */ - /* */ - static void - Ins_SFVTPV( TT_ExecContext exc ) - { - GUESS_VECTOR( projVector ); - exc->GS.freeVector = exc->GS.projVector; - Compute_Funcs( exc ); - } - - - /*************************************************************************/ - /* */ - /* SPvFS[]: Set PVector From Stack */ - /* Opcode range: 0x0A */ - /* Stack: f2.14 f2.14 --> */ - /* */ - static void - Ins_SPVFS( TT_ExecContext exc, - FT_Long* args ) - { - FT_Short S; - FT_Long X, Y; - - - /* Only use low 16bits, then sign extend */ - S = (FT_Short)args[1]; - Y = (FT_Long)S; - S = (FT_Short)args[0]; - X = (FT_Long)S; - - Normalize( X, Y, &exc->GS.projVector ); - - exc->GS.dualVector = exc->GS.projVector; - GUESS_VECTOR( freeVector ); - Compute_Funcs( exc ); - } - - - /*************************************************************************/ - /* */ - /* SFvFS[]: Set FVector From Stack */ - /* Opcode range: 0x0B */ - /* Stack: f2.14 f2.14 --> */ - /* */ - static void - Ins_SFVFS( TT_ExecContext exc, - FT_Long* args ) - { - FT_Short S; - FT_Long X, Y; - - - /* Only use low 16bits, then sign extend */ - S = (FT_Short)args[1]; - Y = (FT_Long)S; - S = (FT_Short)args[0]; - X = S; - - Normalize( X, Y, &exc->GS.freeVector ); - GUESS_VECTOR( projVector ); - Compute_Funcs( exc ); - } - - - /*************************************************************************/ - /* */ - /* GPv[]: Get Projection Vector */ - /* Opcode range: 0x0C */ - /* Stack: ef2.14 --> ef2.14 */ - /* */ - static void - Ins_GPV( TT_ExecContext exc, - FT_Long* args ) - { -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - if ( exc->face->unpatented_hinting ) - { - args[0] = exc->GS.both_x_axis ? 0x4000 : 0; - args[1] = exc->GS.both_x_axis ? 0 : 0x4000; - } - else - { - args[0] = exc->GS.projVector.x; - args[1] = exc->GS.projVector.y; - } -#else - args[0] = exc->GS.projVector.x; - args[1] = exc->GS.projVector.y; -#endif - } - - - /*************************************************************************/ - /* */ - /* GFv[]: Get Freedom Vector */ - /* Opcode range: 0x0D */ - /* Stack: ef2.14 --> ef2.14 */ - /* */ - static void - Ins_GFV( TT_ExecContext exc, - FT_Long* args ) - { -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - if ( exc->face->unpatented_hinting ) - { - args[0] = exc->GS.both_x_axis ? 0x4000 : 0; - args[1] = exc->GS.both_x_axis ? 0 : 0x4000; - } - else - { - args[0] = exc->GS.freeVector.x; - args[1] = exc->GS.freeVector.y; - } -#else - args[0] = exc->GS.freeVector.x; - args[1] = exc->GS.freeVector.y; -#endif - } - - - /*************************************************************************/ - /* */ - /* SRP0[]: Set Reference Point 0 */ - /* Opcode range: 0x10 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SRP0( TT_ExecContext exc, - FT_Long* args ) - { - exc->GS.rp0 = (FT_UShort)args[0]; - } - - - /*************************************************************************/ - /* */ - /* SRP1[]: Set Reference Point 1 */ - /* Opcode range: 0x11 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SRP1( TT_ExecContext exc, - FT_Long* args ) - { - exc->GS.rp1 = (FT_UShort)args[0]; - } - - - /*************************************************************************/ - /* */ - /* SRP2[]: Set Reference Point 2 */ - /* Opcode range: 0x12 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SRP2( TT_ExecContext exc, - FT_Long* args ) - { - exc->GS.rp2 = (FT_UShort)args[0]; - } - - - /*************************************************************************/ - /* */ - /* SMD[]: Set Minimum Distance */ - /* Opcode range: 0x1A */ - /* Stack: f26.6 --> */ - /* */ - static void - Ins_SMD( TT_ExecContext exc, - FT_Long* args ) - { - exc->GS.minimum_distance = args[0]; - } - - - /*************************************************************************/ - /* */ - /* SCVTCI[]: Set Control Value Table Cut In */ - /* Opcode range: 0x1D */ - /* Stack: f26.6 --> */ - /* */ - static void - Ins_SCVTCI( TT_ExecContext exc, - FT_Long* args ) - { - exc->GS.control_value_cutin = (FT_F26Dot6)args[0]; - } - - - /*************************************************************************/ - /* */ - /* SSWCI[]: Set Single Width Cut In */ - /* Opcode range: 0x1E */ - /* Stack: f26.6 --> */ - /* */ - static void - Ins_SSWCI( TT_ExecContext exc, - FT_Long* args ) - { - exc->GS.single_width_cutin = (FT_F26Dot6)args[0]; - } - - - /*************************************************************************/ - /* */ - /* SSW[]: Set Single Width */ - /* Opcode range: 0x1F */ - /* Stack: int32? --> */ - /* */ - static void - Ins_SSW( TT_ExecContext exc, - FT_Long* args ) - { - exc->GS.single_width_value = FT_MulFix( args[0], - exc->tt_metrics.scale ); - } - - - /*************************************************************************/ - /* */ - /* FLIPON[]: Set auto-FLIP to ON */ - /* Opcode range: 0x4D */ - /* Stack: --> */ - /* */ - static void - Ins_FLIPON( TT_ExecContext exc ) - { - exc->GS.auto_flip = TRUE; - } - - - /*************************************************************************/ - /* */ - /* FLIPOFF[]: Set auto-FLIP to OFF */ - /* Opcode range: 0x4E */ - /* Stack: --> */ - /* */ - static void - Ins_FLIPOFF( TT_ExecContext exc ) - { - exc->GS.auto_flip = FALSE; - } - - - /*************************************************************************/ - /* */ - /* SANGW[]: Set ANGle Weight */ - /* Opcode range: 0x7E */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SANGW( void ) - { - /* instruction not supported anymore */ - } - - - /*************************************************************************/ - /* */ - /* SDB[]: Set Delta Base */ - /* Opcode range: 0x5E */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SDB( TT_ExecContext exc, - FT_Long* args ) - { - exc->GS.delta_base = (FT_UShort)args[0]; - } - - - /*************************************************************************/ - /* */ - /* SDS[]: Set Delta Shift */ - /* Opcode range: 0x5F */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SDS( TT_ExecContext exc, - FT_Long* args ) - { - if ( (FT_ULong)args[0] > 6UL ) - exc->error = FT_THROW( Bad_Argument ); - else - exc->GS.delta_shift = (FT_UShort)args[0]; - } - - - /*************************************************************************/ - /* */ - /* RTHG[]: Round To Half Grid */ - /* Opcode range: 0x19 */ - /* Stack: --> */ - /* */ - static void - Ins_RTHG( TT_ExecContext exc ) - { - exc->GS.round_state = TT_Round_To_Half_Grid; - exc->func_round = (TT_Round_Func)Round_To_Half_Grid; - } - - - /*************************************************************************/ - /* */ - /* RTG[]: Round To Grid */ - /* Opcode range: 0x18 */ - /* Stack: --> */ - /* */ - static void - Ins_RTG( TT_ExecContext exc ) - { - exc->GS.round_state = TT_Round_To_Grid; - exc->func_round = (TT_Round_Func)Round_To_Grid; - } - - - /*************************************************************************/ - /* RTDG[]: Round To Double Grid */ - /* Opcode range: 0x3D */ - /* Stack: --> */ - /* */ - static void - Ins_RTDG( TT_ExecContext exc ) - { - exc->GS.round_state = TT_Round_To_Double_Grid; - exc->func_round = (TT_Round_Func)Round_To_Double_Grid; - } - - - /*************************************************************************/ - /* RUTG[]: Round Up To Grid */ - /* Opcode range: 0x7C */ - /* Stack: --> */ - /* */ - static void - Ins_RUTG( TT_ExecContext exc ) - { - exc->GS.round_state = TT_Round_Up_To_Grid; - exc->func_round = (TT_Round_Func)Round_Up_To_Grid; - } - - - /*************************************************************************/ - /* */ - /* RDTG[]: Round Down To Grid */ - /* Opcode range: 0x7D */ - /* Stack: --> */ - /* */ - static void - Ins_RDTG( TT_ExecContext exc ) - { - exc->GS.round_state = TT_Round_Down_To_Grid; - exc->func_round = (TT_Round_Func)Round_Down_To_Grid; - } - - - /*************************************************************************/ - /* */ - /* ROFF[]: Round OFF */ - /* Opcode range: 0x7A */ - /* Stack: --> */ - /* */ - static void - Ins_ROFF( TT_ExecContext exc ) - { - exc->GS.round_state = TT_Round_Off; - exc->func_round = (TT_Round_Func)Round_None; - } - - - /*************************************************************************/ - /* */ - /* SROUND[]: Super ROUND */ - /* Opcode range: 0x76 */ - /* Stack: Eint8 --> */ - /* */ - static void - Ins_SROUND( TT_ExecContext exc, - FT_Long* args ) - { - SetSuperRound( exc, 0x4000, args[0] ); - - exc->GS.round_state = TT_Round_Super; - exc->func_round = (TT_Round_Func)Round_Super; - } - - - /*************************************************************************/ - /* */ - /* S45ROUND[]: Super ROUND 45 degrees */ - /* Opcode range: 0x77 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_S45ROUND( TT_ExecContext exc, - FT_Long* args ) - { - SetSuperRound( exc, 0x2D41, args[0] ); - - exc->GS.round_state = TT_Round_Super_45; - exc->func_round = (TT_Round_Func)Round_Super_45; - } - - - /*************************************************************************/ - /* */ - /* GC[a]: Get Coordinate projected onto */ - /* Opcode range: 0x46-0x47 */ - /* Stack: uint32 --> f26.6 */ - /* */ - /* XXX: UNDOCUMENTED: Measures from the original glyph must be taken */ - /* along the dual projection vector! */ - /* */ - static void - Ins_GC( TT_ExecContext exc, - FT_Long* args ) - { - FT_ULong L; - FT_F26Dot6 R; - - - L = (FT_ULong)args[0]; - - if ( BOUNDSL( L, exc->zp2.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - R = 0; - } - else - { - if ( exc->opcode & 1 ) - R = FAST_DUALPROJ( &exc->zp2.org[L] ); - else - R = FAST_PROJECT( &exc->zp2.cur[L] ); - } - - args[0] = R; - } - - - /*************************************************************************/ - /* */ - /* SCFS[]: Set Coordinate From Stack */ - /* Opcode range: 0x48 */ - /* Stack: f26.6 uint32 --> */ - /* */ - /* Formula: */ - /* */ - /* OA := OA + ( value - OA.p )/( f.p ) * f */ - /* */ - static void - Ins_SCFS( TT_ExecContext exc, - FT_Long* args ) - { - FT_Long K; - FT_UShort L; - - - L = (FT_UShort)args[0]; - - if ( BOUNDS( L, exc->zp2.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - K = FAST_PROJECT( &exc->zp2.cur[L] ); - - exc->func_move( exc, &exc->zp2, L, args[1] - K ); - - /* UNDOCUMENTED! The MS rasterizer does that with */ - /* twilight points (confirmed by Greg Hitchcock) */ - if ( exc->GS.gep2 == 0 ) - exc->zp2.org[L] = exc->zp2.cur[L]; - } - - - /*************************************************************************/ - /* */ - /* MD[a]: Measure Distance */ - /* Opcode range: 0x49-0x4A */ - /* Stack: uint32 uint32 --> f26.6 */ - /* */ - /* XXX: UNDOCUMENTED: Measure taken in the original glyph must be along */ - /* the dual projection vector. */ - /* */ - /* XXX: UNDOCUMENTED: Flag attributes are inverted! */ - /* 0 => measure distance in original outline */ - /* 1 => measure distance in grid-fitted outline */ - /* */ - /* XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1! */ - /* */ - static void - Ins_MD( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort K, L; - FT_F26Dot6 D; - - - K = (FT_UShort)args[1]; - L = (FT_UShort)args[0]; - - if ( BOUNDS( L, exc->zp0.n_points ) || - BOUNDS( K, exc->zp1.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - D = 0; - } - else - { - if ( exc->opcode & 1 ) - D = PROJECT( exc->zp0.cur + L, exc->zp1.cur + K ); - else - { - /* XXX: UNDOCUMENTED: twilight zone special case */ - - if ( exc->GS.gep0 == 0 || exc->GS.gep1 == 0 ) - { - FT_Vector* vec1 = exc->zp0.org + L; - FT_Vector* vec2 = exc->zp1.org + K; - - - D = DUALPROJ( vec1, vec2 ); - } - else - { - FT_Vector* vec1 = exc->zp0.orus + L; - FT_Vector* vec2 = exc->zp1.orus + K; - - - if ( exc->metrics.x_scale == exc->metrics.y_scale ) - { - /* this should be faster */ - D = DUALPROJ( vec1, vec2 ); - D = FT_MulFix( D, exc->metrics.x_scale ); - } - else - { - FT_Vector vec; - - - vec.x = FT_MulFix( vec1->x - vec2->x, exc->metrics.x_scale ); - vec.y = FT_MulFix( vec1->y - vec2->y, exc->metrics.y_scale ); - - D = FAST_DUALPROJ( &vec ); - } - } - } - } - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */ - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode && - FT_ABS( D ) == 64 ) - D += 1; -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - args[0] = D; - } - - - /*************************************************************************/ - /* */ - /* SDPvTL[a]: Set Dual PVector to Line */ - /* Opcode range: 0x86-0x87 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_SDPVTL( TT_ExecContext exc, - FT_Long* args ) - { - FT_Long A, B, C; - FT_UShort p1, p2; /* was FT_Int in pas type ERROR */ - - FT_Byte opcode = exc->opcode; - - - p1 = (FT_UShort)args[1]; - p2 = (FT_UShort)args[0]; - - if ( BOUNDS( p2, exc->zp1.n_points ) || - BOUNDS( p1, exc->zp2.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - { - FT_Vector* v1 = exc->zp1.org + p2; - FT_Vector* v2 = exc->zp2.org + p1; - - - A = v1->x - v2->x; - B = v1->y - v2->y; - - /* If v1 == v2, SDPvTL behaves the same as */ - /* SVTCA[X], respectively. */ - /* */ - /* Confirmed by Greg Hitchcock. */ - - if ( A == 0 && B == 0 ) - { - A = 0x4000; - opcode = 0; - } - } - - if ( ( opcode & 1 ) != 0 ) - { - C = B; /* counter clockwise rotation */ - B = A; - A = -C; - } - - Normalize( A, B, &exc->GS.dualVector ); - - { - FT_Vector* v1 = exc->zp1.cur + p2; - FT_Vector* v2 = exc->zp2.cur + p1; - - - A = v1->x - v2->x; - B = v1->y - v2->y; - - if ( A == 0 && B == 0 ) - { - A = 0x4000; - opcode = 0; - } - } - - if ( ( opcode & 1 ) != 0 ) - { - C = B; /* counter clockwise rotation */ - B = A; - A = -C; - } - - Normalize( A, B, &exc->GS.projVector ); - GUESS_VECTOR( freeVector ); - Compute_Funcs( exc ); - } - - - /*************************************************************************/ - /* */ - /* SZP0[]: Set Zone Pointer 0 */ - /* Opcode range: 0x13 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SZP0( TT_ExecContext exc, - FT_Long* args ) - { - switch ( (FT_Int)args[0] ) - { - case 0: - exc->zp0 = exc->twilight; - break; - - case 1: - exc->zp0 = exc->pts; - break; - - default: - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - exc->GS.gep0 = (FT_UShort)args[0]; - } - - - /*************************************************************************/ - /* */ - /* SZP1[]: Set Zone Pointer 1 */ - /* Opcode range: 0x14 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SZP1( TT_ExecContext exc, - FT_Long* args ) - { - switch ( (FT_Int)args[0] ) - { - case 0: - exc->zp1 = exc->twilight; - break; - - case 1: - exc->zp1 = exc->pts; - break; - - default: - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - exc->GS.gep1 = (FT_UShort)args[0]; - } - - - /*************************************************************************/ - /* */ - /* SZP2[]: Set Zone Pointer 2 */ - /* Opcode range: 0x15 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SZP2( TT_ExecContext exc, - FT_Long* args ) - { - switch ( (FT_Int)args[0] ) - { - case 0: - exc->zp2 = exc->twilight; - break; - - case 1: - exc->zp2 = exc->pts; - break; - - default: - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - exc->GS.gep2 = (FT_UShort)args[0]; - } - - - /*************************************************************************/ - /* */ - /* SZPS[]: Set Zone PointerS */ - /* Opcode range: 0x16 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SZPS( TT_ExecContext exc, - FT_Long* args ) - { - switch ( (FT_Int)args[0] ) - { - case 0: - exc->zp0 = exc->twilight; - break; - - case 1: - exc->zp0 = exc->pts; - break; - - default: - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - exc->zp1 = exc->zp0; - exc->zp2 = exc->zp0; - - exc->GS.gep0 = (FT_UShort)args[0]; - exc->GS.gep1 = (FT_UShort)args[0]; - exc->GS.gep2 = (FT_UShort)args[0]; - } - - - /*************************************************************************/ - /* */ - /* INSTCTRL[]: INSTruction ConTRoL */ - /* Opcode range: 0x8E */ - /* Stack: int32 int32 --> */ - /* */ - static void - Ins_INSTCTRL( TT_ExecContext exc, - FT_Long* args ) - { - FT_ULong K, L, Kf; - - - K = (FT_ULong)args[1]; - L = (FT_ULong)args[0]; - - /* selector values cannot be `OR'ed; */ - /* they are indices starting with index 1, not flags */ - if ( K < 1 || K > 3 ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - /* convert index to flag value */ - Kf = 1 << ( K - 1 ); - - if ( L != 0 ) - { - /* arguments to selectors look like flag values */ - if ( L != Kf ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - } - - exc->GS.instruct_control &= ~(FT_Byte)Kf; - exc->GS.instruct_control |= (FT_Byte)L; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - /* INSTCTRL modifying flag 3 also has an effect */ - /* outside of the CVT program */ - if ( K == 3 ) - exc->ignore_x_mode = FT_BOOL( L == 4 ); -#endif - } - - - /*************************************************************************/ - /* */ - /* SCANCTRL[]: SCAN ConTRoL */ - /* Opcode range: 0x85 */ - /* Stack: uint32? --> */ - /* */ - static void - Ins_SCANCTRL( TT_ExecContext exc, - FT_Long* args ) - { - FT_Int A; - - - /* Get Threshold */ - A = (FT_Int)( args[0] & 0xFF ); - - if ( A == 0xFF ) - { - exc->GS.scan_control = TRUE; - return; - } - else if ( A == 0 ) - { - exc->GS.scan_control = FALSE; - return; - } - - if ( ( args[0] & 0x100 ) != 0 && exc->tt_metrics.ppem <= A ) - exc->GS.scan_control = TRUE; - - if ( ( args[0] & 0x200 ) != 0 && exc->tt_metrics.rotated ) - exc->GS.scan_control = TRUE; - - if ( ( args[0] & 0x400 ) != 0 && exc->tt_metrics.stretched ) - exc->GS.scan_control = TRUE; - - if ( ( args[0] & 0x800 ) != 0 && exc->tt_metrics.ppem > A ) - exc->GS.scan_control = FALSE; - - if ( ( args[0] & 0x1000 ) != 0 && exc->tt_metrics.rotated ) - exc->GS.scan_control = FALSE; - - if ( ( args[0] & 0x2000 ) != 0 && exc->tt_metrics.stretched ) - exc->GS.scan_control = FALSE; - } - - - /*************************************************************************/ - /* */ - /* SCANTYPE[]: SCAN TYPE */ - /* Opcode range: 0x8D */ - /* Stack: uint32? --> */ - /* */ - static void - Ins_SCANTYPE( TT_ExecContext exc, - FT_Long* args ) - { - if ( args[0] >= 0 ) - exc->GS.scan_type = (FT_Int)args[0]; - } - - - /*************************************************************************/ - /* */ - /* MANAGING OUTLINES */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* FLIPPT[]: FLIP PoinT */ - /* Opcode range: 0x80 */ - /* Stack: uint32... --> */ - /* */ - static void - Ins_FLIPPT( TT_ExecContext exc ) - { - FT_UShort point; - - - if ( exc->top < exc->GS.loop ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Too_Few_Arguments ); - goto Fail; - } - - while ( exc->GS.loop > 0 ) - { - exc->args--; - - point = (FT_UShort)exc->stack[exc->args]; - - if ( BOUNDS( point, exc->pts.n_points ) ) - { - if ( exc->pedantic_hinting ) - { - exc->error = FT_THROW( Invalid_Reference ); - return; - } - } - else - exc->pts.tags[point] ^= FT_CURVE_TAG_ON; - - exc->GS.loop--; - } - - Fail: - exc->GS.loop = 1; - exc->new_top = exc->args; - } - - - /*************************************************************************/ - /* */ - /* FLIPRGON[]: FLIP RanGe ON */ - /* Opcode range: 0x81 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_FLIPRGON( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort I, K, L; - - - K = (FT_UShort)args[1]; - L = (FT_UShort)args[0]; - - if ( BOUNDS( K, exc->pts.n_points ) || - BOUNDS( L, exc->pts.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - for ( I = L; I <= K; I++ ) - exc->pts.tags[I] |= FT_CURVE_TAG_ON; - } - - - /*************************************************************************/ - /* */ - /* FLIPRGOFF: FLIP RanGe OFF */ - /* Opcode range: 0x82 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_FLIPRGOFF( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort I, K, L; - - - K = (FT_UShort)args[1]; - L = (FT_UShort)args[0]; - - if ( BOUNDS( K, exc->pts.n_points ) || - BOUNDS( L, exc->pts.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - for ( I = L; I <= K; I++ ) - exc->pts.tags[I] &= ~FT_CURVE_TAG_ON; - } - - - static FT_Bool - Compute_Point_Displacement( TT_ExecContext exc, - FT_F26Dot6* x, - FT_F26Dot6* y, - TT_GlyphZone zone, - FT_UShort* refp ) - { - TT_GlyphZoneRec zp; - FT_UShort p; - FT_F26Dot6 d; - - - if ( exc->opcode & 1 ) - { - zp = exc->zp0; - p = exc->GS.rp1; - } - else - { - zp = exc->zp1; - p = exc->GS.rp2; - } - - if ( BOUNDS( p, zp.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - *refp = 0; - return FAILURE; - } - - *zone = zp; - *refp = p; - - d = PROJECT( zp.cur + p, zp.org + p ); - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - if ( exc->face->unpatented_hinting ) - { - if ( exc->GS.both_x_axis ) - { - *x = d; - *y = 0; - } - else - { - *x = 0; - *y = d; - } - } - else -#endif - { - *x = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.x, exc->F_dot_P ); - *y = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.y, exc->F_dot_P ); - } - - return SUCCESS; - } - - - static void - Move_Zp2_Point( TT_ExecContext exc, - FT_UShort point, - FT_F26Dot6 dx, - FT_F26Dot6 dy, - FT_Bool touch ) - { -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - if ( exc->face->unpatented_hinting ) - { - if ( exc->GS.both_x_axis ) - { - exc->zp2.cur[point].x += dx; - if ( touch ) - exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; - } - else - { - exc->zp2.cur[point].y += dy; - if ( touch ) - exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; - } - return; - } -#endif - - if ( exc->GS.freeVector.x != 0 ) - { - exc->zp2.cur[point].x += dx; - if ( touch ) - exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; - } - - if ( exc->GS.freeVector.y != 0 ) - { - exc->zp2.cur[point].y += dy; - if ( touch ) - exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; - } - } - - - /*************************************************************************/ - /* */ - /* SHP[a]: SHift Point by the last point */ - /* Opcode range: 0x32-0x33 */ - /* Stack: uint32... --> */ - /* */ - static void - Ins_SHP( TT_ExecContext exc ) - { - TT_GlyphZoneRec zp; - FT_UShort refp; - - FT_F26Dot6 dx, dy; - FT_UShort point; - - - if ( exc->top < exc->GS.loop ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - goto Fail; - } - - if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) ) - return; - - while ( exc->GS.loop > 0 ) - { - exc->args--; - point = (FT_UShort)exc->stack[exc->args]; - - if ( BOUNDS( point, exc->zp2.n_points ) ) - { - if ( exc->pedantic_hinting ) - { - exc->error = FT_THROW( Invalid_Reference ); - return; - } - } - else -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - /* doesn't follow Cleartype spec but produces better result */ - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode ) - Move_Zp2_Point( exc, point, 0, dy, TRUE ); - else -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - Move_Zp2_Point( exc, point, dx, dy, TRUE ); - - exc->GS.loop--; - } - - Fail: - exc->GS.loop = 1; - exc->new_top = exc->args; - } - - - /*************************************************************************/ - /* */ - /* SHC[a]: SHift Contour */ - /* Opcode range: 0x34-35 */ - /* Stack: uint32 --> */ - /* */ - /* UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual) */ - /* contour in the twilight zone, namely contour number */ - /* zero which includes all points of it. */ - /* */ - static void - Ins_SHC( TT_ExecContext exc, - FT_Long* args ) - { - TT_GlyphZoneRec zp; - FT_UShort refp; - FT_F26Dot6 dx, dy; - - FT_Short contour, bounds; - FT_UShort start, limit, i; - - - contour = (FT_Short)args[0]; - bounds = ( exc->GS.gep2 == 0 ) ? 1 : exc->zp2.n_contours; - - if ( BOUNDS( contour, bounds ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) ) - return; - - if ( contour == 0 ) - start = 0; - else - start = (FT_UShort)( exc->zp2.contours[contour - 1] + 1 - - exc->zp2.first_point ); - - /* we use the number of points if in the twilight zone */ - if ( exc->GS.gep2 == 0 ) - limit = exc->zp2.n_points; - else - limit = (FT_UShort)( exc->zp2.contours[contour] - - exc->zp2.first_point + 1 ); - - for ( i = start; i < limit; i++ ) - { - if ( zp.cur != exc->zp2.cur || refp != i ) - Move_Zp2_Point( exc, i, dx, dy, TRUE ); - } - } - - - /*************************************************************************/ - /* */ - /* SHZ[a]: SHift Zone */ - /* Opcode range: 0x36-37 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SHZ( TT_ExecContext exc, - FT_Long* args ) - { - TT_GlyphZoneRec zp; - FT_UShort refp; - FT_F26Dot6 dx, - dy; - - FT_UShort limit, i; - - - if ( BOUNDS( args[0], 2 ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) ) - return; - - /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points. */ - /* Twilight zone has no real contours, so use `n_points'. */ - /* Normal zone's `n_points' includes phantoms, so must */ - /* use end of last contour. */ - if ( exc->GS.gep2 == 0 ) - limit = (FT_UShort)exc->zp2.n_points; - else if ( exc->GS.gep2 == 1 && exc->zp2.n_contours > 0 ) - limit = (FT_UShort)( exc->zp2.contours[exc->zp2.n_contours - 1] + 1 ); - else - limit = 0; - - /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */ - for ( i = 0; i < limit; i++ ) - { - if ( zp.cur != exc->zp2.cur || refp != i ) - Move_Zp2_Point( exc, i, dx, dy, FALSE ); - } - } - - - /*************************************************************************/ - /* */ - /* SHPIX[]: SHift points by a PIXel amount */ - /* Opcode range: 0x38 */ - /* Stack: f26.6 uint32... --> */ - /* */ - static void - Ins_SHPIX( TT_ExecContext exc, - FT_Long* args ) - { - FT_F26Dot6 dx, dy; - FT_UShort point; -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - FT_Int B1, B2; -#endif - - - if ( exc->top < exc->GS.loop + 1 ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - goto Fail; - } - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - if ( exc->face->unpatented_hinting ) - { - if ( exc->GS.both_x_axis ) - { - dx = (FT_UInt32)args[0]; - dy = 0; - } - else - { - dx = 0; - dy = (FT_UInt32)args[0]; - } - } - else -#endif - { - dx = TT_MulFix14( args[0], exc->GS.freeVector.x ); - dy = TT_MulFix14( args[0], exc->GS.freeVector.y ); - } - - while ( exc->GS.loop > 0 ) - { - exc->args--; - - point = (FT_UShort)exc->stack[exc->args]; - - if ( BOUNDS( point, exc->zp2.n_points ) ) - { - if ( exc->pedantic_hinting ) - { - exc->error = FT_THROW( Invalid_Reference ); - return; - } - } - else -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - { - /* 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 */ - - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode ) - { - /* save point for later comparison */ - if ( exc->GS.freeVector.y != 0 ) - B1 = exc->zp2.cur[point].y; - else - B1 = exc->zp2.cur[point].x; - - if ( !exc->face->sph_compatibility_mode && - exc->GS.freeVector.y != 0 ) - { - Move_Zp2_Point( exc, point, dx, dy, TRUE ); - - /* save new point */ - if ( exc->GS.freeVector.y != 0 ) - { - 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, -dx, -dy, TRUE ); - } - } - else if ( exc->face->sph_compatibility_mode ) - { - if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) - { - dx = FT_PIX_ROUND( B1 + dx ) - B1; - 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, -dy, TRUE ); - } - } - else if ( exc->sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL ) - Move_Zp2_Point( exc, point, dx, dy, TRUE ); - } - else - Move_Zp2_Point( exc, point, dx, dy, TRUE ); - } - - Skip: - -#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - Move_Zp2_Point( exc, point, dx, dy, TRUE ); - -#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - exc->GS.loop--; - } - - Fail: - exc->GS.loop = 1; - exc->new_top = exc->args; - } - - - /*************************************************************************/ - /* */ - /* MSIRP[a]: Move Stack Indirect Relative Position */ - /* Opcode range: 0x3A-0x3B */ - /* Stack: f26.6 uint32 --> */ - /* */ - static void - Ins_MSIRP( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort point; - FT_F26Dot6 distance; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - FT_F26Dot6 control_value_cutin = 0; /* pacify compiler */ - - - if ( SUBPIXEL_HINTING ) - { - control_value_cutin = exc->GS.control_value_cutin; - - if ( exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - control_value_cutin = 0; - } - -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - point = (FT_UShort)args[0]; - - if ( BOUNDS( point, exc->zp1.n_points ) || - BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - /* UNDOCUMENTED! The MS rasterizer does that with */ - /* twilight points (confirmed by Greg Hitchcock) */ - if ( exc->GS.gep1 == 0 ) - { - exc->zp1.org[point] = exc->zp0.org[exc->GS.rp0]; - exc->func_move_orig( exc, &exc->zp1, point, args[1] ); - exc->zp1.cur[point] = exc->zp1.org[point]; - } - - distance = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 ); - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - /* subpixel hinting - make MSIRP respect CVT cut-in; */ - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - FT_ABS( distance - args[1] ) >= control_value_cutin ) - distance = args[1]; -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - exc->func_move( exc, &exc->zp1, point, args[1] - distance ); - - exc->GS.rp1 = exc->GS.rp0; - exc->GS.rp2 = point; - - if ( ( exc->opcode & 1 ) != 0 ) - exc->GS.rp0 = point; - } - - - /*************************************************************************/ - /* */ - /* MDAP[a]: Move Direct Absolute Point */ - /* Opcode range: 0x2E-0x2F */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_MDAP( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort point; - FT_F26Dot6 cur_dist; - FT_F26Dot6 distance; - - - point = (FT_UShort)args[0]; - - if ( BOUNDS( point, exc->zp0.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - if ( ( exc->opcode & 1 ) != 0 ) - { - cur_dist = FAST_PROJECT( &exc->zp0.cur[point] ); -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 ) - distance = Round_None( - exc, - cur_dist, - exc->tt_metrics.compensations[0] ) - cur_dist; - else -#endif - distance = exc->func_round( - exc, - cur_dist, - exc->tt_metrics.compensations[0] ) - cur_dist; - } - else - distance = 0; - - exc->func_move( exc, &exc->zp0, point, distance ); - - exc->GS.rp0 = point; - exc->GS.rp1 = point; - } - - - /*************************************************************************/ - /* */ - /* MIAP[a]: Move Indirect Absolute Point */ - /* Opcode range: 0x3E-0x3F */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_MIAP( TT_ExecContext exc, - FT_Long* args ) - { - FT_ULong cvtEntry; - FT_UShort point; - FT_F26Dot6 distance; - FT_F26Dot6 org_dist; - FT_F26Dot6 control_value_cutin; - - - control_value_cutin = exc->GS.control_value_cutin; - cvtEntry = (FT_ULong)args[1]; - point = (FT_UShort)args[0]; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING && - 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - if ( BOUNDS( point, exc->zp0.n_points ) || - BOUNDSL( cvtEntry, exc->cvtSize ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - goto Fail; - } - - /* UNDOCUMENTED! */ - /* */ - /* The behaviour of an MIAP instruction is quite different when used */ - /* in the twilight zone. */ - /* */ - /* First, no control value cut-in test is performed as it would fail */ - /* anyway. Second, the original point, i.e. (org_x,org_y) of */ - /* zp0.point, is set to the absolute, unrounded distance found in the */ - /* CVT. */ - /* */ - /* This is used in the CVT programs of the Microsoft fonts Arial, */ - /* Times, etc., in order to re-adjust some key font heights. It */ - /* allows the use of the IP instruction in the twilight zone, which */ - /* otherwise would be invalid according to the specification. */ - /* */ - /* We implement it with a special sequence for the twilight zone. */ - /* This is a bad hack, but it seems to work. */ - /* */ - /* Confirmed by Greg Hitchcock. */ - - distance = exc->func_read_cvt( exc, cvtEntry ); - - if ( exc->GS.gep0 == 0 ) /* If in twilight zone */ - { -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */ - /* Determined via experimentation and may be incorrect... */ - if ( !SUBPIXEL_HINTING || - ( !exc->ignore_x_mode || - !exc->face->sph_compatibility_mode ) ) -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - 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_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode && - ( exc->sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) && - distance > 0 && - exc->GS.freeVector.y != 0 ) - distance = 0; -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - org_dist = FAST_PROJECT( &exc->zp0.cur[point] ); - - if ( ( exc->opcode & 1 ) != 0 ) /* rounding and control cut-in flag */ - { - if ( FT_ABS( distance - org_dist ) > control_value_cutin ) - distance = org_dist; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 ) - distance = Round_None( exc, - distance, - exc->tt_metrics.compensations[0] ); - else -#endif - distance = exc->func_round( exc, - distance, - exc->tt_metrics.compensations[0] ); - } - - exc->func_move( exc, &exc->zp0, point, distance - org_dist ); - - Fail: - exc->GS.rp0 = point; - exc->GS.rp1 = point; - } - - - /*************************************************************************/ - /* */ - /* MDRP[abcde]: Move Direct Relative Point */ - /* Opcode range: 0xC0-0xDF */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_MDRP( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort point; - FT_F26Dot6 org_dist, distance, minimum_distance; - - - minimum_distance = exc->GS.minimum_distance; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - minimum_distance = 0; -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - point = (FT_UShort)args[0]; - - if ( BOUNDS( point, exc->zp1.n_points ) || - BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - goto Fail; - } - - /* XXX: Is there some undocumented feature while in the */ - /* twilight zone? */ - - /* XXX: UNDOCUMENTED: twilight zone special case */ - - if ( exc->GS.gep0 == 0 || exc->GS.gep1 == 0 ) - { - FT_Vector* vec1 = &exc->zp1.org[point]; - FT_Vector* vec2 = &exc->zp0.org[exc->GS.rp0]; - - - org_dist = DUALPROJ( vec1, vec2 ); - } - else - { - FT_Vector* vec1 = &exc->zp1.orus[point]; - FT_Vector* vec2 = &exc->zp0.orus[exc->GS.rp0]; - - - if ( exc->metrics.x_scale == exc->metrics.y_scale ) - { - /* this should be faster */ - org_dist = DUALPROJ( vec1, vec2 ); - org_dist = FT_MulFix( org_dist, exc->metrics.x_scale ); - } - else - { - FT_Vector vec; - - - vec.x = FT_MulFix( vec1->x - vec2->x, exc->metrics.x_scale ); - vec.y = FT_MulFix( vec1->y - vec2->y, exc->metrics.y_scale ); - - org_dist = FAST_DUALPROJ( &vec ); - } - } - - /* single width cut-in test */ - - if ( FT_ABS( org_dist - exc->GS.single_width_value ) < - exc->GS.single_width_cutin ) - { - if ( org_dist >= 0 ) - org_dist = exc->GS.single_width_value; - else - org_dist = -exc->GS.single_width_value; - } - - /* round flag */ - - if ( ( exc->opcode & 4 ) != 0 ) - { -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 ) - distance = Round_None( - exc, - org_dist, - exc->tt_metrics.compensations[exc->opcode & 3] ); - else -#endif - distance = exc->func_round( - exc, - org_dist, - exc->tt_metrics.compensations[exc->opcode & 3] ); - } - else - distance = Round_None( - exc, - org_dist, - exc->tt_metrics.compensations[exc->opcode & 3] ); - - /* minimum distance flag */ - - if ( ( exc->opcode & 8 ) != 0 ) - { - if ( org_dist >= 0 ) - { - if ( distance < minimum_distance ) - distance = minimum_distance; - } - else - { - if ( distance > -minimum_distance ) - distance = -minimum_distance; - } - } - - /* now move the point */ - - org_dist = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 ); - - exc->func_move( exc, &exc->zp1, point, distance - org_dist ); - - Fail: - exc->GS.rp1 = exc->GS.rp0; - exc->GS.rp2 = point; - - if ( ( exc->opcode & 16 ) != 0 ) - exc->GS.rp0 = point; - } - - - /*************************************************************************/ - /* */ - /* MIRP[abcde]: Move Indirect Relative Point */ - /* Opcode range: 0xE0-0xFF */ - /* Stack: int32? uint32 --> */ - /* */ - static void - Ins_MIRP( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort point; - FT_ULong cvtEntry; - - FT_F26Dot6 cvt_dist, - distance, - cur_dist, - org_dist, - control_value_cutin, - minimum_distance; -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - FT_Int B1 = 0; /* pacify compiler */ - FT_Int B2 = 0; - FT_Bool reverse_move = FALSE; -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - - minimum_distance = exc->GS.minimum_distance; - control_value_cutin = exc->GS.control_value_cutin; - point = (FT_UShort)args[0]; - cvtEntry = (FT_ULong)( args[1] + 1 ); - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - control_value_cutin = minimum_distance = 0; -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */ - - if ( BOUNDS( point, exc->zp1.n_points ) || - BOUNDSL( cvtEntry, exc->cvtSize + 1 ) || - BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - goto Fail; - } - - if ( !cvtEntry ) - cvt_dist = 0; - else - cvt_dist = exc->func_read_cvt( exc, cvtEntry - 1 ); - - /* single width test */ - - if ( FT_ABS( cvt_dist - exc->GS.single_width_value ) < - exc->GS.single_width_cutin ) - { - if ( cvt_dist >= 0 ) - cvt_dist = exc->GS.single_width_value; - else - cvt_dist = -exc->GS.single_width_value; - } - - /* UNDOCUMENTED! The MS rasterizer does that with */ - /* twilight points (confirmed by Greg Hitchcock) */ - if ( exc->GS.gep1 == 0 ) - { - exc->zp1.org[point].x = exc->zp0.org[exc->GS.rp0].x + - TT_MulFix14( cvt_dist, - exc->GS.freeVector.x ); - exc->zp1.org[point].y = exc->zp0.org[exc->GS.rp0].y + - TT_MulFix14( cvt_dist, - exc->GS.freeVector.y ); - exc->zp1.cur[point] = exc->zp1.org[point]; - } - - org_dist = DUALPROJ( &exc->zp1.org[point], &exc->zp0.org[exc->GS.rp0] ); - cur_dist = PROJECT ( &exc->zp1.cur[point], &exc->zp0.cur[exc->GS.rp0] ); - - /* auto-flip test */ - - if ( exc->GS.auto_flip ) - { - if ( ( org_dist ^ cvt_dist ) < 0 ) - cvt_dist = -cvt_dist; - } - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode && - 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; - } -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - /* control value cut-in and round */ - - if ( ( exc->opcode & 4 ) != 0 ) - { - /* XXX: UNDOCUMENTED! Only perform cut-in test when both points */ - /* refer to the same zone. */ - - if ( exc->GS.gep0 == exc->GS.gep1 ) - { - /* XXX: According to Greg Hitchcock, the following wording is */ - /* the right one: */ - /* */ - /* When the absolute difference between the value in */ - /* the table [CVT] and the measurement directly from */ - /* the outline is _greater_ than the cut_in value, the */ - /* outline measurement is used. */ - /* */ - /* This is from `instgly.doc'. The description in */ - /* `ttinst2.doc', version 1.66, is thus incorrect since */ - /* it implies `>=' instead of `>'. */ - - if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin ) - cvt_dist = org_dist; - } - - distance = exc->func_round( - exc, - cvt_dist, - exc->tt_metrics.compensations[exc->opcode & 3] ); - } - else - { - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - /* do cvt cut-in always in MIRP for sph */ - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode && - exc->GS.gep0 == exc->GS.gep1 ) - { - if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin ) - cvt_dist = org_dist; - } -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - distance = Round_None( - exc, - cvt_dist, - exc->tt_metrics.compensations[exc->opcode & 3] ); - } - - /* minimum distance test */ - - if ( ( exc->opcode & 8 ) != 0 ) - { - if ( org_dist >= 0 ) - { - if ( distance < minimum_distance ) - distance = minimum_distance; - } - else - { - if ( distance > -minimum_distance ) - distance = -minimum_distance; - } - } - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING ) - { - B1 = exc->zp1.cur[point].y; - - /* Round moves if necessary */ - if ( exc->ignore_x_mode && - exc->GS.freeVector.y != 0 && - ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) ) - distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist; - - if ( exc->ignore_x_mode && - exc->GS.freeVector.y != 0 && - ( exc->opcode & 16 ) == 0 && - ( exc->opcode & 8 ) == 0 && - ( exc->sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) ) - distance += 64; - } -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - exc->func_move( exc, &exc->zp1, point, distance - cur_dist ); - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING ) - { - B2 = exc->zp1.cur[point].y; - - /* Reverse move if necessary */ - if ( exc->ignore_x_mode ) - { - if ( exc->face->sph_compatibility_mode && - exc->GS.freeVector.y != 0 && - ( B1 & 63 ) == 0 && - ( B2 & 63 ) != 0 ) - reverse_move = TRUE; - - if ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) && - exc->GS.freeVector.y != 0 && - ( B2 & 63 ) != 0 && - ( B1 & 63 ) != 0 ) - reverse_move = TRUE; - } - - if ( reverse_move ) - exc->func_move( exc, &exc->zp1, point, -( distance - cur_dist ) ); - } - -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - Fail: - exc->GS.rp1 = exc->GS.rp0; - - if ( ( exc->opcode & 16 ) != 0 ) - exc->GS.rp0 = point; - - exc->GS.rp2 = point; - } - - - /*************************************************************************/ - /* */ - /* ALIGNRP[]: ALIGN Relative Point */ - /* Opcode range: 0x3C */ - /* Stack: uint32 uint32... --> */ - /* */ - static void - Ins_ALIGNRP( TT_ExecContext exc ) - { - FT_UShort point; - FT_F26Dot6 distance; - - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING && - 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - if ( exc->top < exc->GS.loop || - BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - goto Fail; - } - - while ( exc->GS.loop > 0 ) - { - exc->args--; - - point = (FT_UShort)exc->stack[exc->args]; - - if ( BOUNDS( point, exc->zp1.n_points ) ) - { - if ( exc->pedantic_hinting ) - { - exc->error = FT_THROW( Invalid_Reference ); - return; - } - } - else - { - distance = PROJECT( exc->zp1.cur + point, - exc->zp0.cur + exc->GS.rp0 ); - - exc->func_move( exc, &exc->zp1, point, -distance ); - } - - exc->GS.loop--; - } - - Fail: - exc->GS.loop = 1; - exc->new_top = exc->args; - } - - - /*************************************************************************/ - /* */ - /* ISECT[]: moves point to InterSECTion */ - /* Opcode range: 0x0F */ - /* Stack: 5 * uint32 --> */ - /* */ - static void - Ins_ISECT( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort point, - a0, a1, - b0, b1; - - FT_F26Dot6 discriminant, dotproduct; - - FT_F26Dot6 dx, dy, - dax, day, - dbx, dby; - - FT_F26Dot6 val; - - FT_Vector R; - - - point = (FT_UShort)args[0]; - - a0 = (FT_UShort)args[1]; - a1 = (FT_UShort)args[2]; - b0 = (FT_UShort)args[3]; - b1 = (FT_UShort)args[4]; - - if ( BOUNDS( b0, exc->zp0.n_points ) || - BOUNDS( b1, exc->zp0.n_points ) || - BOUNDS( a0, exc->zp1.n_points ) || - BOUNDS( a1, exc->zp1.n_points ) || - BOUNDS( point, exc->zp2.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - /* Cramer's rule */ - - dbx = exc->zp0.cur[b1].x - exc->zp0.cur[b0].x; - dby = exc->zp0.cur[b1].y - exc->zp0.cur[b0].y; - - dax = exc->zp1.cur[a1].x - exc->zp1.cur[a0].x; - day = exc->zp1.cur[a1].y - exc->zp1.cur[a0].y; - - dx = exc->zp0.cur[b0].x - exc->zp1.cur[a0].x; - dy = exc->zp0.cur[b0].y - exc->zp1.cur[a0].y; - - exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH; - - discriminant = FT_MulDiv( dax, -dby, 0x40 ) + - FT_MulDiv( day, dbx, 0x40 ); - dotproduct = FT_MulDiv( dax, dbx, 0x40 ) + - FT_MulDiv( day, dby, 0x40 ); - - /* The discriminant above is actually a cross product of vectors */ - /* da and db. Together with the dot product, they can be used as */ - /* surrogates for sine and cosine of the angle between the vectors. */ - /* Indeed, */ - /* dotproduct = |da||db|cos(angle) */ - /* discriminant = |da||db|sin(angle) . */ - /* We use these equations to reject grazing intersections by */ - /* thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. */ - if ( 19 * FT_ABS( discriminant ) > FT_ABS( dotproduct ) ) - { - val = FT_MulDiv( dx, -dby, 0x40 ) + FT_MulDiv( dy, dbx, 0x40 ); - - R.x = FT_MulDiv( val, dax, discriminant ); - R.y = FT_MulDiv( val, day, discriminant ); - - exc->zp2.cur[point].x = exc->zp1.cur[a0].x + R.x; - exc->zp2.cur[point].y = exc->zp1.cur[a0].y + R.y; - } - else - { - /* else, take the middle of the middles of A and B */ - - exc->zp2.cur[point].x = ( exc->zp1.cur[a0].x + - exc->zp1.cur[a1].x + - exc->zp0.cur[b0].x + - exc->zp0.cur[b1].x ) / 4; - exc->zp2.cur[point].y = ( exc->zp1.cur[a0].y + - exc->zp1.cur[a1].y + - exc->zp0.cur[b0].y + - exc->zp0.cur[b1].y ) / 4; - } - } - - - /*************************************************************************/ - /* */ - /* ALIGNPTS[]: ALIGN PoinTS */ - /* Opcode range: 0x27 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_ALIGNPTS( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort p1, p2; - FT_F26Dot6 distance; - - - p1 = (FT_UShort)args[0]; - p2 = (FT_UShort)args[1]; - - if ( BOUNDS( p1, exc->zp1.n_points ) || - BOUNDS( p2, exc->zp0.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - distance = PROJECT( exc->zp0.cur + p2, exc->zp1.cur + p1 ) / 2; - - exc->func_move( exc, &exc->zp1, p1, distance ); - exc->func_move( exc, &exc->zp0, p2, -distance ); - } - - - /*************************************************************************/ - /* */ - /* IP[]: Interpolate Point */ - /* Opcode range: 0x39 */ - /* Stack: uint32... --> */ - /* */ - - /* SOMETIMES, DUMBER CODE IS BETTER CODE */ - - static void - Ins_IP( TT_ExecContext exc ) - { - FT_F26Dot6 old_range, cur_range; - FT_Vector* orus_base; - FT_Vector* cur_base; - FT_Int twilight; - - - if ( exc->top < exc->GS.loop ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - goto Fail; - } - - /* - * We need to deal in a special way with the twilight zone. - * Otherwise, by definition, the value of exc->twilight.orus[n] is (0,0), - * for every n. - */ - twilight = exc->GS.gep0 == 0 || exc->GS.gep1 == 0 || exc->GS.gep2 == 0; - - if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - goto Fail; - } - - if ( twilight ) - orus_base = &exc->zp0.org[exc->GS.rp1]; - else - orus_base = &exc->zp0.orus[exc->GS.rp1]; - - cur_base = &exc->zp0.cur[exc->GS.rp1]; - - /* XXX: There are some glyphs in some braindead but popular */ - /* fonts out there (e.g. [aeu]grave in monotype.ttf) */ - /* calling IP[] with bad values of rp[12]. */ - /* Do something sane when this odd thing happens. */ - if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) || - BOUNDS( exc->GS.rp2, exc->zp1.n_points ) ) - { - old_range = 0; - cur_range = 0; - } - else - { - if ( twilight ) - old_range = DUALPROJ( &exc->zp1.org[exc->GS.rp2], orus_base ); - else if ( exc->metrics.x_scale == exc->metrics.y_scale ) - old_range = DUALPROJ( &exc->zp1.orus[exc->GS.rp2], orus_base ); - else - { - FT_Vector vec; - - - vec.x = FT_MulFix( exc->zp1.orus[exc->GS.rp2].x - orus_base->x, - exc->metrics.x_scale ); - vec.y = FT_MulFix( exc->zp1.orus[exc->GS.rp2].y - orus_base->y, - exc->metrics.y_scale ); - - old_range = FAST_DUALPROJ( &vec ); - } - - cur_range = PROJECT( &exc->zp1.cur[exc->GS.rp2], cur_base ); - } - - for ( ; exc->GS.loop > 0; --exc->GS.loop ) - { - FT_UInt point = (FT_UInt)exc->stack[--exc->args]; - FT_F26Dot6 org_dist, cur_dist, new_dist; - - - /* check point bounds */ - if ( BOUNDS( point, exc->zp2.n_points ) ) - { - if ( exc->pedantic_hinting ) - { - exc->error = FT_THROW( Invalid_Reference ); - return; - } - continue; - } - - if ( twilight ) - org_dist = DUALPROJ( &exc->zp2.org[point], orus_base ); - else if ( exc->metrics.x_scale == exc->metrics.y_scale ) - org_dist = DUALPROJ( &exc->zp2.orus[point], orus_base ); - else - { - FT_Vector vec; - - - vec.x = FT_MulFix( exc->zp2.orus[point].x - orus_base->x, - exc->metrics.x_scale ); - vec.y = FT_MulFix( exc->zp2.orus[point].y - orus_base->y, - exc->metrics.y_scale ); - - org_dist = FAST_DUALPROJ( &vec ); - } - - cur_dist = PROJECT( &exc->zp2.cur[point], cur_base ); - - if ( org_dist ) - { - if ( old_range ) - new_dist = FT_MulDiv( org_dist, cur_range, old_range ); - else - { - /* This is the same as what MS does for the invalid case: */ - /* */ - /* delta = (Original_Pt - Original_RP1) - */ - /* (Current_Pt - Current_RP1) ; */ - /* */ - /* In FreeType speak: */ - /* */ - /* delta = org_dist - cur_dist . */ - /* */ - /* We move `point' by `new_dist - cur_dist' after leaving */ - /* this block, thus we have */ - /* */ - /* new_dist - cur_dist = delta , */ - /* new_dist - cur_dist = org_dist - cur_dist , */ - /* new_dist = org_dist . */ - - new_dist = org_dist; - } - } - else - new_dist = 0; - - exc->func_move( exc, - &exc->zp2, - (FT_UShort)point, - new_dist - cur_dist ); - } - - Fail: - exc->GS.loop = 1; - exc->new_top = exc->args; - } - - - /*************************************************************************/ - /* */ - /* UTP[a]: UnTouch Point */ - /* Opcode range: 0x29 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_UTP( TT_ExecContext exc, - FT_Long* args ) - { - FT_UShort point; - FT_Byte mask; - - - point = (FT_UShort)args[0]; - - if ( BOUNDS( point, exc->zp0.n_points ) ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - return; - } - - mask = 0xFF; - - if ( exc->GS.freeVector.x != 0 ) - mask &= ~FT_CURVE_TAG_TOUCH_X; - - if ( exc->GS.freeVector.y != 0 ) - mask &= ~FT_CURVE_TAG_TOUCH_Y; - - exc->zp0.tags[point] &= mask; - } - - - /* Local variables for Ins_IUP: */ - typedef struct IUP_WorkerRec_ - { - FT_Vector* orgs; /* original and current coordinate */ - FT_Vector* curs; /* arrays */ - FT_Vector* orus; - FT_UInt max_points; - - } IUP_WorkerRec, *IUP_Worker; - - - static void - _iup_worker_shift( IUP_Worker worker, - FT_UInt p1, - FT_UInt p2, - FT_UInt p ) - { - FT_UInt i; - FT_F26Dot6 dx; - - - dx = worker->curs[p].x - worker->orgs[p].x; - if ( dx != 0 ) - { - for ( i = p1; i < p; i++ ) - worker->curs[i].x += dx; - - for ( i = p + 1; i <= p2; i++ ) - worker->curs[i].x += dx; - } - } - - - static void - _iup_worker_interpolate( IUP_Worker worker, - FT_UInt p1, - FT_UInt p2, - FT_UInt ref1, - FT_UInt ref2 ) - { - FT_UInt i; - FT_F26Dot6 orus1, orus2, org1, org2, cur1, cur2, delta1, delta2; - - - if ( p1 > p2 ) - return; - - if ( BOUNDS( ref1, worker->max_points ) || - BOUNDS( ref2, worker->max_points ) ) - return; - - orus1 = worker->orus[ref1].x; - orus2 = worker->orus[ref2].x; - - if ( orus1 > orus2 ) - { - FT_F26Dot6 tmp_o; - FT_UInt tmp_r; - - - tmp_o = orus1; - orus1 = orus2; - orus2 = tmp_o; - - tmp_r = ref1; - ref1 = ref2; - ref2 = tmp_r; - } - - org1 = worker->orgs[ref1].x; - org2 = worker->orgs[ref2].x; - cur1 = worker->curs[ref1].x; - cur2 = worker->curs[ref2].x; - delta1 = cur1 - org1; - delta2 = cur2 - org2; - - if ( cur1 == cur2 || orus1 == orus2 ) - { - - /* trivial snap or shift of untouched points */ - for ( i = p1; i <= p2; i++ ) - { - FT_F26Dot6 x = worker->orgs[i].x; - - - if ( x <= org1 ) - x += delta1; - - else if ( x >= org2 ) - x += delta2; - - else - x = cur1; - - worker->curs[i].x = x; - } - } - else - { - FT_Fixed scale = 0; - FT_Bool scale_valid = 0; - - - /* interpolation */ - for ( i = p1; i <= p2; i++ ) - { - FT_F26Dot6 x = worker->orgs[i].x; - - - if ( x <= org1 ) - x += delta1; - - else if ( x >= org2 ) - x += delta2; - - else - { - if ( !scale_valid ) - { - scale_valid = 1; - scale = FT_DivFix( cur2 - cur1, orus2 - orus1 ); - } - - x = cur1 + FT_MulFix( worker->orus[i].x - orus1, scale ); - } - worker->curs[i].x = x; - } - } - } - - - /*************************************************************************/ - /* */ - /* IUP[a]: Interpolate Untouched Points */ - /* Opcode range: 0x30-0x31 */ - /* Stack: --> */ - /* */ - static void - Ins_IUP( TT_ExecContext exc ) - { - IUP_WorkerRec V; - FT_Byte mask; - - FT_UInt first_point; /* first point of contour */ - FT_UInt end_point; /* end point (last+1) of contour */ - - FT_UInt first_touched; /* first touched point in contour */ - FT_UInt cur_touched; /* current touched point in contour */ - - FT_UInt point; /* current point */ - FT_Short contour; /* current contour */ - - - /* ignore empty outlines */ - if ( exc->pts.n_contours == 0 ) - return; - - if ( exc->opcode & 1 ) - { - mask = FT_CURVE_TAG_TOUCH_X; - V.orgs = exc->pts.org; - V.curs = exc->pts.cur; - V.orus = exc->pts.orus; - } - else - { - mask = FT_CURVE_TAG_TOUCH_Y; - V.orgs = (FT_Vector*)( (FT_Pos*)exc->pts.org + 1 ); - V.curs = (FT_Vector*)( (FT_Pos*)exc->pts.cur + 1 ); - V.orus = (FT_Vector*)( (FT_Pos*)exc->pts.orus + 1 ); - } - V.max_points = exc->pts.n_points; - - contour = 0; - point = 0; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode ) - { - exc->iup_called = TRUE; - if ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_IUP ) - return; - } -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - do - { - end_point = exc->pts.contours[contour] - exc->pts.first_point; - first_point = point; - - if ( BOUNDS( end_point, exc->pts.n_points ) ) - end_point = exc->pts.n_points - 1; - - while ( point <= end_point && ( exc->pts.tags[point] & mask ) == 0 ) - point++; - - if ( point <= end_point ) - { - first_touched = point; - cur_touched = point; - - point++; - - while ( point <= end_point ) - { - if ( ( exc->pts.tags[point] & mask ) != 0 ) - { - _iup_worker_interpolate( &V, - cur_touched + 1, - point - 1, - cur_touched, - point ); - cur_touched = point; - } - - point++; - } - - if ( cur_touched == first_touched ) - _iup_worker_shift( &V, first_point, end_point, cur_touched ); - else - { - _iup_worker_interpolate( &V, - (FT_UShort)( cur_touched + 1 ), - end_point, - cur_touched, - first_touched ); - - if ( first_touched > 0 ) - _iup_worker_interpolate( &V, - first_point, - first_touched - 1, - cur_touched, - first_touched ); - } - } - contour++; - } while ( contour < exc->pts.n_contours ); - } - - - /*************************************************************************/ - /* */ - /* DELTAPn[]: DELTA exceptions P1, P2, P3 */ - /* Opcode range: 0x5D,0x71,0x72 */ - /* Stack: uint32 (2 * uint32)... --> */ - /* */ - static void - Ins_DELTAP( TT_ExecContext exc, - FT_Long* args ) - { - FT_ULong nump, k; - FT_UShort A; - FT_ULong C, P; - FT_Long B; -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - FT_UShort B1, B2; - - - if ( SUBPIXEL_HINTING && - exc->ignore_x_mode && - exc->iup_called && - ( exc->sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) ) - goto Fail; -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - /* Delta hinting is covered by US Patent 5159668. */ - if ( exc->face->unpatented_hinting ) - { - FT_Long n = args[0] * 2; - - - if ( exc->args < n ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Too_Few_Arguments ); - n = exc->args; - } - - exc->args -= n; - exc->new_top = exc->args; - return; - } -#endif - - 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 */ - - for ( k = 1; k <= nump; k++ ) - { - if ( exc->args < 2 ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Too_Few_Arguments ); - exc->args = 0; - goto Fail; - } - - exc->args -= 2; - - A = (FT_UShort)exc->stack[exc->args + 1]; - B = exc->stack[exc->args]; - - /* XXX: Because some popular fonts contain some invalid DeltaP */ - /* instructions, we simply ignore them when the stacked */ - /* point reference is off limit, rather than returning an */ - /* error. As a delta instruction doesn't change a glyph */ - /* in great ways, this shouldn't be a problem. */ - - if ( !BOUNDS( A, exc->zp0.n_points ) ) - { - C = ( (FT_ULong)B & 0xF0 ) >> 4; - - switch ( exc->opcode ) - { - case 0x5D: - break; - - case 0x71: - C += 16; - break; - - case 0x72: - C += 32; - break; - } - - C += exc->GS.delta_base; - - if ( P == C ) - { - B = ( (FT_ULong)B & 0xF ) - 8; - if ( B >= 0 ) - B++; - B *= 1L << ( 6 - exc->GS.delta_shift ); - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - - if ( SUBPIXEL_HINTING ) - { - /* - * 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 ) ) - 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 ) - { - /* 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, -B ); - } - } - else -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - exc->func_move( exc, &exc->zp0, A, B ); - } - } - else - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Invalid_Reference ); - } - - Fail: - exc->new_top = exc->args; - } - - - /*************************************************************************/ - /* */ - /* DELTACn[]: DELTA exceptions C1, C2, C3 */ - /* Opcode range: 0x73,0x74,0x75 */ - /* Stack: uint32 (2 * uint32)... --> */ - /* */ - static void - Ins_DELTAC( TT_ExecContext exc, - FT_Long* args ) - { - FT_ULong nump, k; - FT_ULong A, C, P; - FT_Long B; - - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - /* Delta hinting is covered by US Patent 5159668. */ - if ( exc->face->unpatented_hinting ) - { - FT_Long n = args[0] * 2; - - - if ( exc->args < n ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Too_Few_Arguments ); - n = exc->args; - } - - exc->args -= n; - exc->new_top = exc->args; - return; - } -#endif - - P = (FT_ULong)exc->func_cur_ppem( exc ); - nump = (FT_ULong)args[0]; - - for ( k = 1; k <= nump; k++ ) - { - if ( exc->args < 2 ) - { - if ( exc->pedantic_hinting ) - exc->error = FT_THROW( Too_Few_Arguments ); - exc->args = 0; - goto Fail; - } - - exc->args -= 2; - - A = (FT_ULong)exc->stack[exc->args + 1]; - B = exc->stack[exc->args]; - - if ( BOUNDSL( A, exc->cvtSize ) ) - { - if ( exc->pedantic_hinting ) - { - exc->error = FT_THROW( Invalid_Reference ); - return; - } - } - else - { - C = ( (FT_ULong)B & 0xF0 ) >> 4; - - switch ( exc->opcode ) - { - case 0x73: - break; - - case 0x74: - C += 16; - break; - - case 0x75: - C += 32; - break; - } - - C += exc->GS.delta_base; - - if ( P == C ) - { - B = ( (FT_ULong)B & 0xF ) - 8; - if ( B >= 0 ) - B++; - B *= 1L << ( 6 - exc->GS.delta_shift ); - - exc->func_move_cvt( exc, A, B ); - } - } - } - - Fail: - exc->new_top = exc->args; - } - - - /*************************************************************************/ - /* */ - /* MISC. INSTRUCTIONS */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* GETINFO[]: GET INFOrmation */ - /* Opcode range: 0x88 */ - /* Stack: uint32 --> uint32 */ - /* */ - /* XXX: UNDOCUMENTED: Selector bits higher than 9 are currently (May */ - /* 2015) not documented in the OpenType specification. */ - /* */ - /* Selector bit 11 is incorrectly described as bit 8, while the */ - /* real meaning of bit 8 (vertical LCD subpixels) stays */ - /* undocumented. The same mistake can be found in Greg Hitchcock's */ - /* whitepaper. */ - /* */ - static void - Ins_GETINFO( TT_ExecContext exc, - FT_Long* args ) - { - FT_Long K; - - - K = 0; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - /********************************/ - /* RASTERIZER VERSION */ - /* Selector Bit: 0 */ - /* Return Bit(s): 0-7 */ - /* */ - if ( SUBPIXEL_HINTING && - ( args[0] & 1 ) != 0 && - exc->subpixel_hinting ) - { - if ( exc->ignore_x_mode ) - { - /* if in ClearType backwards 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - if ( ( args[0] & 1 ) != 0 ) - K = TT_INTERPRETER_VERSION_35; - - /********************************/ - /* GLYPH ROTATED */ - /* Selector Bit: 1 */ - /* Return Bit(s): 8 */ - /* */ - if ( ( args[0] & 2 ) != 0 && exc->tt_metrics.rotated ) - K |= 0x80; - - /********************************/ - /* GLYPH STRETCHED */ - /* Selector Bit: 2 */ - /* Return Bit(s): 9 */ - /* */ - if ( ( args[0] & 4 ) != 0 && exc->tt_metrics.stretched ) - K |= 1 << 8; - - /********************************/ - /* HINTING FOR GRAYSCALE */ - /* Selector Bit: 5 */ - /* Return Bit(s): 12 */ - /* */ - if ( ( args[0] & 32 ) != 0 && exc->grayscale ) - K |= 1 << 12; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - - if ( SUBPIXEL_HINTING && - 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - args[0] = K; - } - - - static void - Ins_UNKNOWN( TT_ExecContext exc ) - { - TT_DefRecord* def = exc->IDefs; - TT_DefRecord* limit = def + exc->numIDefs; - - - for ( ; def < limit; def++ ) - { - if ( (FT_Byte)def->opc == exc->opcode && def->active ) - { - TT_CallRec* call; - - - if ( exc->callTop >= exc->callSize ) - { - exc->error = FT_THROW( Stack_Overflow ); - return; - } - - call = exc->callStack + exc->callTop++; - - call->Caller_Range = exc->curRange; - call->Caller_IP = exc->IP + 1; - call->Cur_Count = 1; - call->Def = def; - - Ins_Goto_CodeRange( exc, def->range, def->start ); - - exc->step_ins = FALSE; - return; - } - } - - exc->error = FT_THROW( Invalid_Opcode ); - } - - - /*************************************************************************/ - /* */ - /* RUN */ - /* */ - /* This function executes a run of opcodes. It will exit in the */ - /* following cases: */ - /* */ - /* - Errors (in which case it returns FALSE). */ - /* */ - /* - Reaching the end of the main code range (returns TRUE). */ - /* Reaching the end of a code range within a function call is an */ - /* error. */ - /* */ - /* - After executing one single opcode, if the flag `Instruction_Trap' */ - /* is set to TRUE (returns TRUE). */ - /* */ - /* On exit with TRUE, test IP < CodeSize to know whether it comes from */ - /* an instruction trap or a normal termination. */ - /* */ - /* */ - /* Note: The documented DEBUG opcode pops a value from the stack. This */ - /* behaviour is unsupported; here a DEBUG opcode is always an */ - /* error. */ - /* */ - /* */ - /* THIS IS THE INTERPRETER'S MAIN LOOP. */ - /* */ - /*************************************************************************/ - - - /* documentation is in ttinterp.h */ - - FT_EXPORT_DEF( FT_Error ) - TT_RunIns( TT_ExecContext exc ) - { - FT_Long ins_counter = 0; /* executed instructions counter */ - FT_UShort i; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - exc->iup_called = FALSE; -#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - /* set PPEM and CVT functions */ - exc->tt_metrics.ratio = 0; - if ( exc->metrics.x_ppem != exc->metrics.y_ppem ) - { - /* non-square pixels, use the stretched routines */ - exc->func_cur_ppem = Current_Ppem_Stretched; - exc->func_read_cvt = Read_CVT_Stretched; - exc->func_write_cvt = Write_CVT_Stretched; - exc->func_move_cvt = Move_CVT_Stretched; - } - else - { - /* square pixels, use normal routines */ - exc->func_cur_ppem = Current_Ppem; - exc->func_read_cvt = Read_CVT; - exc->func_write_cvt = Write_CVT; - exc->func_move_cvt = Move_CVT; - } - - Compute_Funcs( exc ); - Compute_Round( exc, (FT_Byte)exc->GS.round_state ); - - do - { - exc->opcode = exc->code[exc->IP]; - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_Long cnt = FT_MIN( 8, exc->top ); - FT_Long n; - - - /* if tracing level is 7, show current code position */ - /* and the first few stack elements also */ - FT_TRACE6(( " " )); - FT_TRACE7(( "%06d ", exc->IP )); - FT_TRACE6(( opcode_name[exc->opcode] + 2 )); - FT_TRACE7(( "%*s", *opcode_name[exc->opcode] == 'A' - ? 2 - : 12 - ( *opcode_name[exc->opcode] - '0' ), - "#" )); - for ( n = 0; n < cnt; n++ ) - FT_TRACE7(( " %d", exc->stack[exc->top - n] )); - FT_TRACE6(( "\n" )); - } -#endif /* FT_DEBUG_LEVEL_TRACE */ - - if ( ( exc->length = opcode_length[exc->opcode] ) < 0 ) - { - if ( exc->IP + 1 >= exc->codeSize ) - goto LErrorCodeOverflow_; - - exc->length = 2 - exc->length * exc->code[exc->IP + 1]; - } - - if ( exc->IP + exc->length > exc->codeSize ) - goto LErrorCodeOverflow_; - - /* First, let's check for empty stack and overflow */ - exc->args = exc->top - ( Pop_Push_Count[exc->opcode] >> 4 ); - - /* `args' is the top of the stack once arguments have been popped. */ - /* One can also interpret it as the index of the last argument. */ - if ( exc->args < 0 ) - { - if ( exc->pedantic_hinting ) - { - exc->error = FT_THROW( Too_Few_Arguments ); - goto LErrorLabel_; - } - - /* push zeroes onto the stack */ - for ( i = 0; i < Pop_Push_Count[exc->opcode] >> 4; i++ ) - exc->stack[i] = 0; - exc->args = 0; - } - - exc->new_top = exc->args + ( Pop_Push_Count[exc->opcode] & 15 ); - - /* `new_top' is the new top of the stack, after the instruction's */ - /* execution. `top' will be set to `new_top' after the `switch' */ - /* statement. */ - if ( exc->new_top > exc->stackSize ) - { - exc->error = FT_THROW( Stack_Overflow ); - goto LErrorLabel_; - } - - exc->step_ins = TRUE; - exc->error = FT_Err_Ok; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - - if ( SUBPIXEL_HINTING ) - { - 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - { - FT_Long* args = exc->stack + exc->args; - FT_Byte opcode = exc->opcode; - - - switch ( opcode ) - { - case 0x00: /* SVTCA y */ - case 0x01: /* SVTCA x */ - case 0x02: /* SPvTCA y */ - case 0x03: /* SPvTCA x */ - case 0x04: /* SFvTCA y */ - case 0x05: /* SFvTCA x */ - Ins_SxyTCA( exc ); - break; - - case 0x06: /* SPvTL // */ - case 0x07: /* SPvTL + */ - Ins_SPVTL( exc, args ); - break; - - case 0x08: /* SFvTL // */ - case 0x09: /* SFvTL + */ - Ins_SFVTL( exc, args ); - break; - - case 0x0A: /* SPvFS */ - Ins_SPVFS( exc, args ); - break; - - case 0x0B: /* SFvFS */ - Ins_SFVFS( exc, args ); - break; - - case 0x0C: /* GPv */ - Ins_GPV( exc, args ); - break; - - case 0x0D: /* GFv */ - Ins_GFV( exc, args ); - break; - - case 0x0E: /* SFvTPv */ - Ins_SFVTPV( exc ); - break; - - case 0x0F: /* ISECT */ - Ins_ISECT( exc, args ); - break; - - case 0x10: /* SRP0 */ - Ins_SRP0( exc, args ); - break; - - case 0x11: /* SRP1 */ - Ins_SRP1( exc, args ); - break; - - case 0x12: /* SRP2 */ - Ins_SRP2( exc, args ); - break; - - case 0x13: /* SZP0 */ - Ins_SZP0( exc, args ); - break; - - case 0x14: /* SZP1 */ - Ins_SZP1( exc, args ); - break; - - case 0x15: /* SZP2 */ - Ins_SZP2( exc, args ); - break; - - case 0x16: /* SZPS */ - Ins_SZPS( exc, args ); - break; - - case 0x17: /* SLOOP */ - Ins_SLOOP( exc, args ); - break; - - case 0x18: /* RTG */ - Ins_RTG( exc ); - break; - - case 0x19: /* RTHG */ - Ins_RTHG( exc ); - break; - - case 0x1A: /* SMD */ - Ins_SMD( exc, args ); - break; - - case 0x1B: /* ELSE */ - Ins_ELSE( exc ); - break; - - case 0x1C: /* JMPR */ - Ins_JMPR( exc, args ); - break; - - case 0x1D: /* SCVTCI */ - Ins_SCVTCI( exc, args ); - break; - - case 0x1E: /* SSWCI */ - Ins_SSWCI( exc, args ); - break; - - case 0x1F: /* SSW */ - Ins_SSW( exc, args ); - break; - - case 0x20: /* DUP */ - Ins_DUP( args ); - break; - - case 0x21: /* POP */ - Ins_POP(); - break; - - case 0x22: /* CLEAR */ - Ins_CLEAR( exc ); - break; - - case 0x23: /* SWAP */ - Ins_SWAP( args ); - break; - - case 0x24: /* DEPTH */ - Ins_DEPTH( exc, args ); - break; - - case 0x25: /* CINDEX */ - Ins_CINDEX( exc, args ); - break; - - case 0x26: /* MINDEX */ - Ins_MINDEX( exc, args ); - break; - - case 0x27: /* ALIGNPTS */ - Ins_ALIGNPTS( exc, args ); - break; - - case 0x28: /* ???? */ - Ins_UNKNOWN( exc ); - break; - - case 0x29: /* UTP */ - Ins_UTP( exc, args ); - break; - - case 0x2A: /* LOOPCALL */ - Ins_LOOPCALL( exc, args ); - break; - - case 0x2B: /* CALL */ - Ins_CALL( exc, args ); - break; - - case 0x2C: /* FDEF */ - Ins_FDEF( exc, args ); - break; - - case 0x2D: /* ENDF */ - Ins_ENDF( exc ); - break; - - case 0x2E: /* MDAP */ - case 0x2F: /* MDAP */ - Ins_MDAP( exc, args ); - break; - - case 0x30: /* IUP */ - case 0x31: /* IUP */ - Ins_IUP( exc ); - break; - - case 0x32: /* SHP */ - case 0x33: /* SHP */ - Ins_SHP( exc ); - break; - - case 0x34: /* SHC */ - case 0x35: /* SHC */ - Ins_SHC( exc, args ); - break; - - case 0x36: /* SHZ */ - case 0x37: /* SHZ */ - Ins_SHZ( exc, args ); - break; - - case 0x38: /* SHPIX */ - Ins_SHPIX( exc, args ); - break; - - case 0x39: /* IP */ - Ins_IP( exc ); - break; - - case 0x3A: /* MSIRP */ - case 0x3B: /* MSIRP */ - Ins_MSIRP( exc, args ); - break; - - case 0x3C: /* AlignRP */ - Ins_ALIGNRP( exc ); - break; - - case 0x3D: /* RTDG */ - Ins_RTDG( exc ); - break; - - case 0x3E: /* MIAP */ - case 0x3F: /* MIAP */ - Ins_MIAP( exc, args ); - break; - - case 0x40: /* NPUSHB */ - Ins_NPUSHB( exc, args ); - break; - - case 0x41: /* NPUSHW */ - Ins_NPUSHW( exc, args ); - break; - - case 0x42: /* WS */ - Ins_WS( exc, args ); - break; - - case 0x43: /* RS */ - Ins_RS( exc, args ); - break; - - case 0x44: /* WCVTP */ - Ins_WCVTP( exc, args ); - break; - - case 0x45: /* RCVT */ - Ins_RCVT( exc, args ); - break; - - case 0x46: /* GC */ - case 0x47: /* GC */ - Ins_GC( exc, args ); - break; - - case 0x48: /* SCFS */ - Ins_SCFS( exc, args ); - break; - - case 0x49: /* MD */ - case 0x4A: /* MD */ - Ins_MD( exc, args ); - break; - - case 0x4B: /* MPPEM */ - Ins_MPPEM( exc, args ); - break; - - case 0x4C: /* MPS */ - Ins_MPS( exc, args ); - break; - - case 0x4D: /* FLIPON */ - Ins_FLIPON( exc ); - break; - - case 0x4E: /* FLIPOFF */ - Ins_FLIPOFF( exc ); - break; - - case 0x4F: /* DEBUG */ - Ins_DEBUG( exc ); - break; - - case 0x50: /* LT */ - Ins_LT( args ); - break; - - case 0x51: /* LTEQ */ - Ins_LTEQ( args ); - break; - - case 0x52: /* GT */ - Ins_GT( args ); - break; - - case 0x53: /* GTEQ */ - Ins_GTEQ( args ); - break; - - case 0x54: /* EQ */ - Ins_EQ( args ); - break; - - case 0x55: /* NEQ */ - Ins_NEQ( args ); - break; - - case 0x56: /* ODD */ - Ins_ODD( exc, args ); - break; - - case 0x57: /* EVEN */ - Ins_EVEN( exc, args ); - break; - - case 0x58: /* IF */ - Ins_IF( exc, args ); - break; - - case 0x59: /* EIF */ - Ins_EIF(); - break; - - case 0x5A: /* AND */ - Ins_AND( args ); - break; - - case 0x5B: /* OR */ - Ins_OR( args ); - break; - - case 0x5C: /* NOT */ - Ins_NOT( args ); - break; - - case 0x5D: /* DELTAP1 */ - Ins_DELTAP( exc, args ); - break; - - case 0x5E: /* SDB */ - Ins_SDB( exc, args ); - break; - - case 0x5F: /* SDS */ - Ins_SDS( exc, args ); - break; - - case 0x60: /* ADD */ - Ins_ADD( args ); - break; - - case 0x61: /* SUB */ - Ins_SUB( args ); - break; - - case 0x62: /* DIV */ - Ins_DIV( exc, args ); - break; - - case 0x63: /* MUL */ - Ins_MUL( args ); - break; - - case 0x64: /* ABS */ - Ins_ABS( args ); - break; - - case 0x65: /* NEG */ - Ins_NEG( args ); - break; - - case 0x66: /* FLOOR */ - Ins_FLOOR( args ); - break; - - case 0x67: /* CEILING */ - Ins_CEILING( args ); - break; - - case 0x68: /* ROUND */ - case 0x69: /* ROUND */ - case 0x6A: /* ROUND */ - case 0x6B: /* ROUND */ - Ins_ROUND( exc, args ); - break; - - case 0x6C: /* NROUND */ - case 0x6D: /* NROUND */ - case 0x6E: /* NRRUND */ - case 0x6F: /* NROUND */ - Ins_NROUND( exc, args ); - break; - - case 0x70: /* WCVTF */ - Ins_WCVTF( exc, args ); - break; - - case 0x71: /* DELTAP2 */ - case 0x72: /* DELTAP3 */ - Ins_DELTAP( exc, args ); - break; - - case 0x73: /* DELTAC0 */ - case 0x74: /* DELTAC1 */ - case 0x75: /* DELTAC2 */ - Ins_DELTAC( exc, args ); - break; - - case 0x76: /* SROUND */ - Ins_SROUND( exc, args ); - break; - - case 0x77: /* S45Round */ - Ins_S45ROUND( exc, args ); - break; - - case 0x78: /* JROT */ - Ins_JROT( exc, args ); - break; - - case 0x79: /* JROF */ - Ins_JROF( exc, args ); - break; - - case 0x7A: /* ROFF */ - Ins_ROFF( exc ); - break; - - case 0x7B: /* ???? */ - Ins_UNKNOWN( exc ); - break; - - case 0x7C: /* RUTG */ - Ins_RUTG( exc ); - break; - - case 0x7D: /* RDTG */ - Ins_RDTG( exc ); - break; - - case 0x7E: /* SANGW */ - Ins_SANGW(); - break; - - case 0x7F: /* AA */ - Ins_AA(); - break; - - case 0x80: /* FLIPPT */ - Ins_FLIPPT( exc ); - break; - - case 0x81: /* FLIPRGON */ - Ins_FLIPRGON( exc, args ); - break; - - case 0x82: /* FLIPRGOFF */ - Ins_FLIPRGOFF( exc, args ); - break; - - case 0x83: /* UNKNOWN */ - case 0x84: /* UNKNOWN */ - Ins_UNKNOWN( exc ); - break; - - case 0x85: /* SCANCTRL */ - Ins_SCANCTRL( exc, args ); - break; - - case 0x86: /* SDPvTL */ - case 0x87: /* SDPvTL */ - Ins_SDPVTL( exc, args ); - break; - - case 0x88: /* GETINFO */ - Ins_GETINFO( exc, args ); - break; - - case 0x89: /* IDEF */ - Ins_IDEF( exc, args ); - break; - - case 0x8A: /* ROLL */ - Ins_ROLL( args ); - break; - - case 0x8B: /* MAX */ - Ins_MAX( args ); - break; - - case 0x8C: /* MIN */ - Ins_MIN( args ); - break; - - case 0x8D: /* SCANTYPE */ - Ins_SCANTYPE( exc, args ); - break; - - case 0x8E: /* INSTCTRL */ - Ins_INSTCTRL( exc, args ); - break; - - case 0x8F: - Ins_UNKNOWN( exc ); - break; - - default: - if ( opcode >= 0xE0 ) - Ins_MIRP( exc, args ); - else if ( opcode >= 0xC0 ) - Ins_MDRP( exc, args ); - else if ( opcode >= 0xB8 ) - Ins_PUSHW( exc, args ); - else if ( opcode >= 0xB0 ) - Ins_PUSHB( exc, args ); - else - Ins_UNKNOWN( exc ); - } - } - - if ( exc->error ) - { - switch ( exc->error ) - { - /* looking for redefined instructions */ - case FT_ERR( Invalid_Opcode ): - { - TT_DefRecord* def = exc->IDefs; - TT_DefRecord* limit = def + exc->numIDefs; - - - for ( ; def < limit; def++ ) - { - if ( def->active && exc->opcode == (FT_Byte)def->opc ) - { - TT_CallRec* callrec; - - - if ( exc->callTop >= exc->callSize ) - { - exc->error = FT_THROW( Invalid_Reference ); - goto LErrorLabel_; - } - - callrec = &exc->callStack[exc->callTop]; - - callrec->Caller_Range = exc->curRange; - callrec->Caller_IP = exc->IP + 1; - callrec->Cur_Count = 1; - callrec->Def = def; - - if ( Ins_Goto_CodeRange( exc, - def->range, - def->start ) == FAILURE ) - goto LErrorLabel_; - - goto LSuiteLabel_; - } - } - } - - exc->error = FT_THROW( Invalid_Opcode ); - goto LErrorLabel_; - -#if 0 - break; /* Unreachable code warning suppression. */ - /* Leave to remind in case a later change the editor */ - /* to consider break; */ -#endif - - default: - goto LErrorLabel_; - -#if 0 - break; -#endif - } - } - - exc->top = exc->new_top; - - if ( exc->step_ins ) - exc->IP += exc->length; - - /* increment instruction counter and check if we didn't */ - /* run this program for too long (e.g. infinite loops). */ - if ( ++ins_counter > MAX_RUNNABLE_OPCODES ) - return FT_THROW( Execution_Too_Long ); - - LSuiteLabel_: - if ( exc->IP >= exc->codeSize ) - { - if ( exc->callTop > 0 ) - { - exc->error = FT_THROW( Code_Overflow ); - goto LErrorLabel_; - } - else - goto LNo_Error_; - } - } while ( !exc->instruction_trap ); - - LNo_Error_: - return FT_Err_Ok; - - LErrorCodeOverflow_: - exc->error = FT_THROW( Code_Overflow ); - - LErrorLabel_: - /* If any errors have occurred, function tables may be broken. */ - /* Force a re-execution of `prep' and `fpgm' tables if no */ - /* bytecode debugger is run. */ - if ( exc->error && - !exc->instruction_trap && - exc->curRange == tt_coderange_glyph ) - { - FT_TRACE1(( " The interpreter returned error 0x%x\n", exc->error )); - exc->size->bytecode_ready = -1; - exc->size->cvt_ready = -1; - } - - return exc->error; - } - - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - -/* END */ diff --git a/3party/freetype/src/truetype/ttinterp.h b/3party/freetype/src/truetype/ttinterp.h deleted file mode 100644 index 32706d0760..0000000000 --- a/3party/freetype/src/truetype/ttinterp.h +++ /dev/null @@ -1,388 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttinterp.h */ -/* */ -/* TrueType bytecode interpreter (specification). */ -/* */ -/* Copyright 1996-2015 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 __TTINTERP_H__ -#define __TTINTERP_H__ - -#include -#include "ttobjs.h" - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* Rounding mode constants. */ - /* */ -#define TT_Round_Off 5 -#define TT_Round_To_Half_Grid 0 -#define TT_Round_To_Grid 1 -#define TT_Round_To_Double_Grid 2 -#define TT_Round_Up_To_Grid 4 -#define TT_Round_Down_To_Grid 3 -#define TT_Round_Super 6 -#define TT_Round_Super_45 7 - - - /*************************************************************************/ - /* */ - /* Function types used by the interpreter, depending on various modes */ - /* (e.g. the rounding mode, whether to render a vertical or horizontal */ - /* line etc). */ - /* */ - /*************************************************************************/ - - /* Rounding function */ - typedef FT_F26Dot6 - (*TT_Round_Func)( TT_ExecContext exc, - FT_F26Dot6 distance, - FT_F26Dot6 compensation ); - - /* Point displacement along the freedom vector routine */ - typedef void - (*TT_Move_Func)( TT_ExecContext exc, - TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ); - - /* Distance projection along one of the projection vectors */ - typedef FT_F26Dot6 - (*TT_Project_Func)( TT_ExecContext exc, - FT_Pos dx, - FT_Pos dy ); - - /* getting current ppem. Take care of non-square pixels if necessary */ - typedef FT_Long - (*TT_Cur_Ppem_Func)( TT_ExecContext exc ); - - /* reading a cvt value. Take care of non-square pixels if necessary */ - typedef FT_F26Dot6 - (*TT_Get_CVT_Func)( TT_ExecContext exc, - FT_ULong idx ); - - /* setting or moving a cvt value. Take care of non-square pixels */ - /* if necessary */ - typedef void - (*TT_Set_CVT_Func)( TT_ExecContext exc, - FT_ULong idx, - FT_F26Dot6 value ); - - - /*************************************************************************/ - /* */ - /* This structure defines a call record, used to manage function calls. */ - /* */ - typedef struct TT_CallRec_ - { - FT_Int Caller_Range; - FT_Long Caller_IP; - FT_Long Cur_Count; - - TT_DefRecord *Def; /* either FDEF or IDEF */ - - } TT_CallRec, *TT_CallStack; - - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - - /*************************************************************************/ - /* */ - /* 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - - /*************************************************************************/ - /* */ - /* The main structure for the interpreter which collects all necessary */ - /* variables and states. */ - /* */ - typedef struct TT_ExecContextRec_ - { - TT_Face face; - TT_Size size; - FT_Memory memory; - - /* instructions state */ - - FT_Error error; /* last execution error */ - - FT_Long top; /* top of exec. stack */ - - FT_Long stackSize; /* size of exec. stack */ - FT_Long* stack; /* current exec. stack */ - - FT_Long args; - FT_Long new_top; /* new top after exec. */ - - TT_GlyphZoneRec zp0, /* zone records */ - zp1, - zp2, - pts, - twilight; - - FT_Size_Metrics metrics; - TT_Size_Metrics tt_metrics; /* size metrics */ - - TT_GraphicsState GS; /* current graphics state */ - - FT_Int curRange; /* current code range number */ - FT_Byte* code; /* current code range */ - FT_Long IP; /* current instruction pointer */ - FT_Long codeSize; /* size of current range */ - - FT_Byte opcode; /* current opcode */ - FT_Int length; /* length of current opcode */ - - FT_Bool step_ins; /* true if the interpreter must */ - /* increment IP after ins. exec */ - FT_ULong cvtSize; - FT_Long* cvt; - - FT_UInt glyphSize; /* glyph instructions buffer size */ - FT_Byte* glyphIns; /* glyph instructions buffer */ - - FT_UInt numFDefs; /* number of function defs */ - FT_UInt maxFDefs; /* maximum number of function defs */ - TT_DefArray FDefs; /* table of FDefs entries */ - - FT_UInt numIDefs; /* number of instruction defs */ - FT_UInt maxIDefs; /* maximum number of ins defs */ - TT_DefArray IDefs; /* table of IDefs entries */ - - FT_UInt maxFunc; /* maximum function index */ - FT_UInt maxIns; /* maximum instruction index */ - - FT_Int callTop, /* top of call stack during execution */ - callSize; /* size of call stack */ - TT_CallStack callStack; /* call stack */ - - FT_UShort maxPoints; /* capacity of this context's `pts' */ - FT_Short maxContours; /* record, expressed in points and */ - /* contours. */ - - TT_CodeRangeTable codeRangeTable; /* table of valid code ranges */ - /* useful for the debugger */ - - FT_UShort storeSize; /* size of current storage */ - FT_Long* storage; /* storage area */ - - FT_F26Dot6 period; /* values used for the */ - FT_F26Dot6 phase; /* `SuperRounding' */ - FT_F26Dot6 threshold; - - FT_Bool instruction_trap; /* If `True', the interpreter will */ - /* exit after each instruction */ - - TT_GraphicsState default_GS; /* graphics state resulting from */ - /* the prep program */ - FT_Bool is_composite; /* true if the glyph is composite */ - FT_Bool pedantic_hinting; /* true if pedantic interpretation */ - - /* latest interpreter additions */ - - FT_Long F_dot_P; /* dot product of freedom and projection */ - /* vectors */ - TT_Round_Func func_round; /* current rounding function */ - - TT_Project_Func func_project, /* current projection function */ - func_dualproj, /* current dual proj. function */ - func_freeProj; /* current freedom proj. func */ - - TT_Move_Func func_move; /* current point move function */ - TT_Move_Func func_move_orig; /* move original position function */ - - TT_Cur_Ppem_Func func_cur_ppem; /* get current proj. ppem value */ - - TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */ - TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */ - TT_Set_CVT_Func func_move_cvt; /* incr a cvt entry (in pixels) */ - - FT_Bool grayscale; /* are we hinting for grayscale? */ - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - } TT_ExecContextRec; - - - extern const TT_GraphicsState tt_default_graphics_state; - - -#ifdef TT_USE_BYTECODE_INTERPRETER - FT_LOCAL( void ) - TT_Goto_CodeRange( TT_ExecContext exec, - FT_Int range, - FT_Long IP ); - - FT_LOCAL( void ) - TT_Set_CodeRange( TT_ExecContext exec, - FT_Int range, - void* base, - FT_Long length ); - - FT_LOCAL( void ) - TT_Clear_CodeRange( TT_ExecContext exec, - FT_Int range ); - - - FT_LOCAL( FT_Error ) - Update_Max( FT_Memory memory, - FT_ULong* size, - FT_ULong multiplier, - void* _pbuff, - FT_ULong new_max ); -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - - /*************************************************************************/ - /* */ - /* */ - /* TT_New_Context */ - /* */ - /* */ - /* Queries the face context for a given font. Note that there is */ - /* now a _single_ execution context in the TrueType driver which is */ - /* shared among faces. */ - /* */ - /* */ - /* face :: A handle to the source face object. */ - /* */ - /* */ - /* A handle to the execution context. Initialized for `face'. */ - /* */ - /* */ - /* Only the glyph loader and debugger should call this function. */ - /* (And right now only the glyph loader uses it.) */ - /* */ - FT_EXPORT( TT_ExecContext ) - TT_New_Context( TT_Driver driver ); - - -#ifdef TT_USE_BYTECODE_INTERPRETER - FT_LOCAL( void ) - TT_Done_Context( TT_ExecContext exec ); - - FT_LOCAL( FT_Error ) - TT_Load_Context( TT_ExecContext exec, - TT_Face face, - TT_Size size ); - - FT_LOCAL( void ) - TT_Save_Context( TT_ExecContext exec, - TT_Size ins ); - - FT_LOCAL( FT_Error ) - TT_Run_Context( TT_ExecContext exec ); -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - - /*************************************************************************/ - /* */ - /* */ - /* TT_RunIns */ - /* */ - /* */ - /* Executes one or more instruction in the execution context. This */ - /* is the main function of the TrueType opcode interpreter. */ - /* */ - /* */ - /* exec :: A handle to the target execution context. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* */ - /* Only the object manager and debugger should call this function. */ - /* */ - /* This function is publicly exported because it is directly */ - /* invoked by the TrueType debugger. */ - /* */ - FT_EXPORT( FT_Error ) - TT_RunIns( TT_ExecContext exec ); - - -FT_END_HEADER - -#endif /* __TTINTERP_H__ */ - - -/* END */ diff --git a/3party/freetype/src/truetype/ttobjs.c b/3party/freetype/src/truetype/ttobjs.c deleted file mode 100644 index af44259458..0000000000 --- a/3party/freetype/src/truetype/ttobjs.c +++ /dev/null @@ -1,1359 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttobjs.c */ -/* */ -/* Objects manager (body). */ -/* */ -/* Copyright 1996-2015 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 FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include FT_INTERNAL_SFNT_H -#include FT_TRUETYPE_DRIVER_H - -#include "ttgload.h" -#include "ttpload.h" - -#include "tterrors.h" - -#ifdef TT_USE_BYTECODE_INTERPRETER -#include "ttinterp.h" -#endif - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING -#include FT_TRUETYPE_UNPATENTED_H -#endif - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include "ttgxvar.h" -#endif - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttobjs - - -#ifdef TT_USE_BYTECODE_INTERPRETER - - /*************************************************************************/ - /* */ - /* GLYPH ZONE FUNCTIONS */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* tt_glyphzone_done */ - /* */ - /* */ - /* Deallocate a glyph zone. */ - /* */ - /* */ - /* zone :: A pointer to the target glyph zone. */ - /* */ - FT_LOCAL_DEF( void ) - tt_glyphzone_done( TT_GlyphZone zone ) - { - FT_Memory memory = zone->memory; - - - if ( memory ) - { - FT_FREE( zone->contours ); - FT_FREE( zone->tags ); - FT_FREE( zone->cur ); - FT_FREE( zone->org ); - FT_FREE( zone->orus ); - - zone->max_points = zone->n_points = 0; - zone->max_contours = zone->n_contours = 0; - zone->memory = NULL; - } - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_glyphzone_new */ - /* */ - /* */ - /* Allocate a new glyph zone. */ - /* */ - /* */ - /* memory :: A handle to the current memory object. */ - /* */ - /* maxPoints :: The capacity of glyph zone in points. */ - /* */ - /* maxContours :: The capacity of glyph zone in contours. */ - /* */ - /* */ - /* zone :: A pointer to the target glyph zone record. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_glyphzone_new( FT_Memory memory, - FT_UShort maxPoints, - FT_Short maxContours, - TT_GlyphZone zone ) - { - FT_Error error; - - - FT_MEM_ZERO( zone, sizeof ( *zone ) ); - zone->memory = memory; - - if ( FT_NEW_ARRAY( zone->org, maxPoints ) || - FT_NEW_ARRAY( zone->cur, maxPoints ) || - FT_NEW_ARRAY( zone->orus, maxPoints ) || - FT_NEW_ARRAY( zone->tags, maxPoints ) || - FT_NEW_ARRAY( zone->contours, maxContours ) ) - { - tt_glyphzone_done( zone ); - } - else - { - zone->max_points = maxPoints; - zone->max_contours = maxContours; - } - - return error; - } -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - - /* Compare the face with a list of well-known `tricky' fonts. */ - /* This list shall be expanded as we find more of them. */ - - static FT_Bool - tt_check_trickyness_family( FT_String* name ) - { - -#define TRICK_NAMES_MAX_CHARACTERS 19 -#define TRICK_NAMES_COUNT 9 - - static const char trick_names[TRICK_NAMES_COUNT] - [TRICK_NAMES_MAX_CHARACTERS + 1] = - { - "DFKaiSho-SB", /* dfkaisb.ttf */ - "DFKaiShu", - "DFKai-SB", /* kaiu.ttf */ - "HuaTianKaiTi?", /* htkt2.ttf */ - "HuaTianSongTi?", /* htst3.ttf */ - "Ming(for ISO10646)", /* hkscsiic.ttf & iicore.ttf */ - "MingLiU", /* mingliu.ttf & mingliu.ttc */ - "PMingLiU", /* mingliu.ttc */ - "MingLi43", /* mingli.ttf */ - }; - - int nn; - - - for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ ) - if ( ft_strstr( name, trick_names[nn] ) ) - return TRUE; - - return FALSE; - } - - - /* XXX: This function should be in the `sfnt' module. */ - - /* Some PDF generators clear the checksums in the TrueType header table. */ - /* For example, Quartz ContextPDF clears all entries, or Bullzip PDF */ - /* Printer clears the entries for subsetted subtables. We thus have to */ - /* recalculate the checksums where necessary. */ - - static FT_UInt32 - tt_synth_sfnt_checksum( FT_Stream stream, - FT_ULong length ) - { - FT_Error error; - FT_UInt32 checksum = 0; - int i; - - - if ( FT_FRAME_ENTER( length ) ) - return 0; - - for ( ; length > 3; length -= 4 ) - checksum += (FT_UInt32)FT_GET_ULONG(); - - for ( i = 3; length > 0; length --, i-- ) - checksum += (FT_UInt32)( FT_GET_BYTE() << ( i * 8 ) ); - - FT_FRAME_EXIT(); - - return checksum; - } - - - /* XXX: This function should be in the `sfnt' module. */ - - static FT_ULong - tt_get_sfnt_checksum( TT_Face face, - FT_UShort i ) - { -#if 0 /* if we believe the written value, use following part. */ - if ( face->dir_tables[i].CheckSum ) - return face->dir_tables[i].CheckSum; -#endif - - if ( !face->goto_table ) - return 0; - - if ( face->goto_table( face, - face->dir_tables[i].Tag, - face->root.stream, - NULL ) ) - return 0; - - return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream, - face->dir_tables[i].Length ); - } - - - typedef struct tt_sfnt_id_rec_ - { - FT_ULong CheckSum; - FT_ULong Length; - - } tt_sfnt_id_rec; - - - static FT_Bool - tt_check_trickyness_sfnt_ids( TT_Face face ) - { -#define TRICK_SFNT_IDS_PER_FACE 3 -#define TRICK_SFNT_IDS_NUM_FACES 17 - - static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES] - [TRICK_SFNT_IDS_PER_FACE] = { - -#define TRICK_SFNT_ID_cvt 0 -#define TRICK_SFNT_ID_fpgm 1 -#define TRICK_SFNT_ID_prep 2 - - { /* MingLiU 1995 */ - { 0x05BCF058UL, 0x000002E4UL }, /* cvt */ - { 0x28233BF1UL, 0x000087C4UL }, /* fpgm */ - { 0xA344A1EAUL, 0x000001E1UL } /* prep */ - }, - { /* MingLiU 1996- */ - { 0x05BCF058UL, 0x000002E4UL }, /* cvt */ - { 0x28233BF1UL, 0x000087C4UL }, /* fpgm */ - { 0xA344A1EBUL, 0x000001E1UL } /* prep */ - }, - { /* DFKaiShu */ - { 0x11E5EAD4UL, 0x00000350UL }, /* cvt */ - { 0x5A30CA3BUL, 0x00009063UL }, /* fpgm */ - { 0x13A42602UL, 0x0000007EUL } /* prep */ - }, - { /* HuaTianKaiTi */ - { 0xFFFBFFFCUL, 0x00000008UL }, /* cvt */ - { 0x9C9E48B8UL, 0x0000BEA2UL }, /* fpgm */ - { 0x70020112UL, 0x00000008UL } /* prep */ - }, - { /* HuaTianSongTi */ - { 0xFFFBFFFCUL, 0x00000008UL }, /* cvt */ - { 0x0A5A0483UL, 0x00017C39UL }, /* fpgm */ - { 0x70020112UL, 0x00000008UL } /* prep */ - }, - { /* NEC fadpop7.ttf */ - { 0x00000000UL, 0x00000000UL }, /* cvt */ - { 0x40C92555UL, 0x000000E5UL }, /* fpgm */ - { 0xA39B58E3UL, 0x0000117CUL } /* prep */ - }, - { /* NEC fadrei5.ttf */ - { 0x00000000UL, 0x00000000UL }, /* cvt */ - { 0x33C41652UL, 0x000000E5UL }, /* fpgm */ - { 0x26D6C52AUL, 0x00000F6AUL } /* prep */ - }, - { /* NEC fangot7.ttf */ - { 0x00000000UL, 0x00000000UL }, /* cvt */ - { 0x6DB1651DUL, 0x0000019DUL }, /* fpgm */ - { 0x6C6E4B03UL, 0x00002492UL } /* prep */ - }, - { /* NEC fangyo5.ttf */ - { 0x00000000UL, 0x00000000UL }, /* cvt */ - { 0x40C92555UL, 0x000000E5UL }, /* fpgm */ - { 0xDE51FAD0UL, 0x0000117CUL } /* prep */ - }, - { /* NEC fankyo5.ttf */ - { 0x00000000UL, 0x00000000UL }, /* cvt */ - { 0x85E47664UL, 0x000000E5UL }, /* fpgm */ - { 0xA6C62831UL, 0x00001CAAUL } /* prep */ - }, - { /* NEC fanrgo5.ttf */ - { 0x00000000UL, 0x00000000UL }, /* cvt */ - { 0x2D891CFDUL, 0x0000019DUL }, /* fpgm */ - { 0xA0604633UL, 0x00001DE8UL } /* prep */ - }, - { /* NEC fangot5.ttc */ - { 0x00000000UL, 0x00000000UL }, /* cvt */ - { 0x40AA774CUL, 0x000001CBUL }, /* fpgm */ - { 0x9B5CAA96UL, 0x00001F9AUL } /* prep */ - }, - { /* NEC fanmin3.ttc */ - { 0x00000000UL, 0x00000000UL }, /* cvt */ - { 0x0D3DE9CBUL, 0x00000141UL }, /* fpgm */ - { 0xD4127766UL, 0x00002280UL } /* prep */ - }, - { /* NEC FA-Gothic, 1996 */ - { 0x00000000UL, 0x00000000UL }, /* cvt */ - { 0x4A692698UL, 0x000001F0UL }, /* fpgm */ - { 0x340D4346UL, 0x00001FCAUL } /* prep */ - }, - { /* NEC FA-Minchou, 1996 */ - { 0x00000000UL, 0x00000000UL }, /* cvt */ - { 0xCD34C604UL, 0x00000166UL }, /* fpgm */ - { 0x6CF31046UL, 0x000022B0UL } /* prep */ - }, - { /* NEC FA-RoundGothicB, 1996 */ - { 0x00000000UL, 0x00000000UL }, /* cvt */ - { 0x5DA75315UL, 0x0000019DUL }, /* fpgm */ - { 0x40745A5FUL, 0x000022E0UL } /* prep */ - }, - { /* NEC FA-RoundGothicM, 1996 */ - { 0x00000000UL, 0x00000000UL }, /* cvt */ - { 0xF055FC48UL, 0x000001C2UL }, /* fpgm */ - { 0x3900DED3UL, 0x00001E18UL } /* prep */ - } - }; - - FT_ULong checksum; - int num_matched_ids[TRICK_SFNT_IDS_NUM_FACES]; - FT_Bool has_cvt, has_fpgm, has_prep; - FT_UShort i; - int j, k; - - - FT_MEM_SET( num_matched_ids, 0, - sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES ); - has_cvt = FALSE; - has_fpgm = FALSE; - has_prep = FALSE; - - for ( i = 0; i < face->num_tables; i++ ) - { - checksum = 0; - - switch( face->dir_tables[i].Tag ) - { - case TTAG_cvt: - k = TRICK_SFNT_ID_cvt; - has_cvt = TRUE; - break; - - case TTAG_fpgm: - k = TRICK_SFNT_ID_fpgm; - has_fpgm = TRUE; - break; - - case TTAG_prep: - k = TRICK_SFNT_ID_prep; - has_prep = TRUE; - break; - - default: - continue; - } - - for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ ) - if ( face->dir_tables[i].Length == sfnt_id[j][k].Length ) - { - if ( !checksum ) - checksum = tt_get_sfnt_checksum( face, i ); - - if ( sfnt_id[j][k].CheckSum == checksum ) - num_matched_ids[j]++; - - if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE ) - return TRUE; - } - } - - for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ ) - { - if ( !has_cvt && !sfnt_id[j][TRICK_SFNT_ID_cvt].Length ) - num_matched_ids[j] ++; - if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length ) - num_matched_ids[j] ++; - if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length ) - num_matched_ids[j] ++; - if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE ) - return TRUE; - } - - return FALSE; - } - - - static FT_Bool - tt_check_trickyness( FT_Face face ) - { - if ( !face ) - return FALSE; - - /* For first, check the face name for quick check. */ - if ( face->family_name && - tt_check_trickyness_family( face->family_name ) ) - return TRUE; - - /* Type42 fonts may lack `name' tables, we thus try to identify */ - /* tricky fonts by checking the checksums of Type42-persistent */ - /* sfnt tables (`cvt', `fpgm', and `prep'). */ - if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) ) - return TRUE; - - return FALSE; - } - - - /* Check whether `.notdef' is the only glyph in the `loca' table. */ - static FT_Bool - tt_check_single_notdef( FT_Face ttface ) - { - FT_Bool result = FALSE; - - TT_Face face = (TT_Face)ttface; - FT_UInt asize; - FT_ULong i; - FT_ULong glyph_index = 0; - FT_UInt count = 0; - - - for( i = 0; i < face->num_locations; i++ ) - { - tt_face_get_location( face, i, &asize ); - if ( asize > 0 ) - { - count += 1; - if ( count > 1 ) - break; - glyph_index = i; - } - } - - /* Only have a single outline. */ - if ( count == 1 ) - { - if ( glyph_index == 0 ) - result = TRUE; - else - { - /* FIXME: Need to test glyphname == .notdef ? */ - FT_Error error; - char buf[8]; - - - error = FT_Get_Glyph_Name( ttface, glyph_index, buf, 8 ); - if ( !error && - buf[0] == '.' && !ft_strncmp( buf, ".notdef", 8 ) ) - result = TRUE; - } - } - - return result; - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_face_init */ - /* */ - /* */ - /* Initialize a given TrueType face object. */ - /* */ - /* */ - /* stream :: The source font stream. */ - /* */ - /* face_index :: The index of the TrueType font, if we are opening a */ - /* collection, in bits 0-15. The numbered instance */ - /* index~+~1 of a GX (sub)font, if applicable, in bits */ - /* 16-30. */ - /* */ - /* num_params :: Number of additional generic parameters. Ignored. */ - /* */ - /* params :: Additional generic parameters. Ignored. */ - /* */ - /* */ - /* face :: The newly built face object. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_init( FT_Stream stream, - FT_Face ttface, /* TT_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ) - { - FT_Error error; - FT_Library library; - SFNT_Service sfnt; - TT_Face face = (TT_Face)ttface; - - - FT_TRACE2(( "TTF driver\n" )); - - library = ttface->driver->root.library; - - sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); - if ( !sfnt ) - { - FT_ERROR(( "tt_face_init: cannot access `sfnt' module\n" )); - error = FT_THROW( Missing_Module ); - goto Exit; - } - - /* create input stream from resource */ - if ( FT_STREAM_SEEK( 0 ) ) - goto Exit; - - /* check that we have a valid TrueType file */ - error = sfnt->init_face( stream, face, face_index, num_params, params ); - - /* Stream may have changed. */ - stream = face->root.stream; - - if ( error ) - goto Exit; - - /* We must also be able to accept Mac/GX fonts, as well as OT ones. */ - /* The 0x00020000 tag is completely undocumented; some fonts from */ - /* Arphic made for Chinese Windows 3.1 have this. */ - if ( face->format_tag != 0x00010000L && /* MS fonts */ - face->format_tag != 0x00020000L && /* CJK fonts for Win 3.1 */ - face->format_tag != TTAG_true ) /* Mac fonts */ - { - FT_TRACE2(( " not a TTF font\n" )); - goto Bad_Format; - } - -#ifdef TT_USE_BYTECODE_INTERPRETER - ttface->face_flags |= FT_FACE_FLAG_HINTER; -#endif - - /* If we are performing a simple font format check, exit immediately. */ - if ( face_index < 0 ) - return FT_Err_Ok; - - /* Load font directory */ - error = sfnt->load_face( stream, face, face_index, num_params, params ); - if ( error ) - goto Exit; - - if ( tt_check_trickyness( ttface ) ) - ttface->face_flags |= FT_FACE_FLAG_TRICKY; - - error = tt_face_load_hdmx( face, stream ); - if ( error ) - goto Exit; - - if ( FT_IS_SCALABLE( ttface ) ) - { - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - if ( !ttface->internal->incremental_interface ) - error = tt_face_load_loca( face, stream ); - if ( !error ) - error = tt_face_load_cvt( face, stream ); - if ( !error ) - error = tt_face_load_fpgm( face, stream ); - if ( !error ) - error = tt_face_load_prep( face, stream ); - - /* Check the scalable flag based on `loca'. */ - if ( !ttface->internal->incremental_interface && - ttface->num_fixed_sizes && - face->glyph_locations && - tt_check_single_notdef( ttface ) ) - { - FT_TRACE5(( "tt_face_init:" - " Only the `.notdef' glyph has an outline.\n" - " " - " Resetting scalable flag to FALSE.\n" )); - - ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE; - } - -#else /* !FT_CONFIG_OPTION_INCREMENTAL */ - - if ( !error ) - error = tt_face_load_loca( face, stream ); - if ( !error ) - error = tt_face_load_cvt( face, stream ); - if ( !error ) - error = tt_face_load_fpgm( face, stream ); - if ( !error ) - error = tt_face_load_prep( face, stream ); - - /* Check the scalable flag based on `loca'. */ - if ( ttface->num_fixed_sizes && - face->glyph_locations && - tt_check_single_notdef( ttface ) ) - { - FT_TRACE5(( "tt_face_init:" - " Only the `.notdef' glyph has an outline.\n" - " " - " Resetting scalable flag to FALSE.\n" )); - - ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE; - } - -#endif /* !FT_CONFIG_OPTION_INCREMENTAL */ - - } - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - - { - FT_Int instance_index = face_index >> 16; - - - if ( FT_HAS_MULTIPLE_MASTERS( ttface ) && - instance_index > 0 ) - { - error = TT_Get_MM_Var( face, NULL ); - if ( error ) - goto Exit; - - if ( face->blend->mmvar->namedstyle ) - { - FT_Memory memory = ttface->memory; - - FT_Var_Named_Style* named_style; - FT_String* style_name; - - - /* in `face_index', the instance index starts with value 1 */ - named_style = face->blend->mmvar->namedstyle + instance_index - 1; - error = sfnt->get_name( face, - (FT_UShort)named_style->strid, - &style_name ); - if ( error ) - goto Exit; - - /* set style name; if already set, replace it */ - if ( face->root.style_name ) - FT_FREE( face->root.style_name ); - face->root.style_name = style_name; - - /* finally, select the named instance */ - error = TT_Set_Var_Design( face, - face->blend->mmvar->num_axis, - named_style->coords ); - if ( error ) - goto Exit; - } - } - } - -#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ - -#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \ - !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER ) - - { - FT_Bool unpatented_hinting; - int i; - - - /* Determine whether unpatented hinting is to be used for this face. */ - unpatented_hinting = FT_BOOL - ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL ); - - for ( i = 0; i < num_params && !face->unpatented_hinting; i++ ) - if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING ) - unpatented_hinting = TRUE; - - if ( !unpatented_hinting ) - ttface->internal->ignore_unpatented_hinter = TRUE; - } - -#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING && - !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ - - /* initialize standard glyph loading routines */ - TT_Init_Glyph_Loading( face ); - - Exit: - return error; - - Bad_Format: - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_face_done */ - /* */ - /* */ - /* Finalize a given face object. */ - /* */ - /* */ - /* face :: A pointer to the face object to destroy. */ - /* */ - FT_LOCAL_DEF( void ) - tt_face_done( FT_Face ttface ) /* TT_Face */ - { - TT_Face face = (TT_Face)ttface; - FT_Memory memory; - FT_Stream stream; - SFNT_Service sfnt; - - - if ( !face ) - return; - - memory = ttface->memory; - stream = ttface->stream; - sfnt = (SFNT_Service)face->sfnt; - - /* for `extended TrueType formats' (i.e. compressed versions) */ - if ( face->extra.finalizer ) - face->extra.finalizer( face->extra.data ); - - if ( sfnt ) - sfnt->done_face( face ); - - /* freeing the locations table */ - tt_face_done_loca( face ); - - tt_face_free_hdmx( face ); - - /* freeing the CVT */ - FT_FREE( face->cvt ); - face->cvt_size = 0; - - /* freeing the programs */ - FT_FRAME_RELEASE( face->font_program ); - FT_FRAME_RELEASE( face->cvt_program ); - face->font_program_size = 0; - face->cvt_program_size = 0; - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - tt_done_blend( memory, face->blend ); - face->blend = NULL; -#endif - } - - - /*************************************************************************/ - /* */ - /* SIZE FUNCTIONS */ - /* */ - /*************************************************************************/ - -#ifdef TT_USE_BYTECODE_INTERPRETER - - /*************************************************************************/ - /* */ - /* */ - /* tt_size_run_fpgm */ - /* */ - /* */ - /* Run the font program. */ - /* */ - /* */ - /* size :: A handle to the size object. */ - /* */ - /* pedantic :: Set if bytecode execution should be pedantic. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_size_run_fpgm( TT_Size size, - FT_Bool pedantic ) - { - TT_Face face = (TT_Face)size->root.face; - TT_ExecContext exec; - FT_Error error; - - - exec = size->context; - - error = TT_Load_Context( exec, face, size ); - if ( error ) - return error; - - exec->callTop = 0; - exec->top = 0; - - exec->period = 64; - exec->phase = 0; - exec->threshold = 0; - - exec->instruction_trap = FALSE; - exec->F_dot_P = 0x4000L; - - exec->pedantic_hinting = pedantic; - - { - FT_Size_Metrics* metrics = &exec->metrics; - TT_Size_Metrics* tt_metrics = &exec->tt_metrics; - - - metrics->x_ppem = 0; - metrics->y_ppem = 0; - metrics->x_scale = 0; - metrics->y_scale = 0; - - tt_metrics->ppem = 0; - tt_metrics->scale = 0; - tt_metrics->ratio = 0x10000L; - } - - /* allow font program execution */ - TT_Set_CodeRange( exec, - tt_coderange_font, - face->font_program, - (FT_Long)face->font_program_size ); - - /* disable CVT and glyph programs coderange */ - TT_Clear_CodeRange( exec, tt_coderange_cvt ); - TT_Clear_CodeRange( exec, tt_coderange_glyph ); - - if ( face->font_program_size > 0 ) - { - TT_Goto_CodeRange( exec, tt_coderange_font, 0 ); - - FT_TRACE4(( "Executing `fpgm' table.\n" )); - error = face->interpreter( exec ); - } - else - error = FT_Err_Ok; - - size->bytecode_ready = error; - - if ( !error ) - TT_Save_Context( exec, size ); - - return error; - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_size_run_prep */ - /* */ - /* */ - /* Run the control value program. */ - /* */ - /* */ - /* size :: A handle to the size object. */ - /* */ - /* pedantic :: Set if bytecode execution should be pedantic. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_size_run_prep( TT_Size size, - FT_Bool pedantic ) - { - TT_Face face = (TT_Face)size->root.face; - TT_ExecContext exec; - FT_Error error; - - - exec = size->context; - - error = TT_Load_Context( exec, face, size ); - if ( error ) - return error; - - exec->callTop = 0; - exec->top = 0; - - exec->instruction_trap = FALSE; - - exec->pedantic_hinting = pedantic; - - TT_Set_CodeRange( exec, - tt_coderange_cvt, - face->cvt_program, - (FT_Long)face->cvt_program_size ); - - TT_Clear_CodeRange( exec, tt_coderange_glyph ); - - if ( face->cvt_program_size > 0 ) - { - TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 ); - - FT_TRACE4(( "Executing `prep' table.\n" )); - - error = face->interpreter( exec ); - } - else - error = FT_Err_Ok; - - size->cvt_ready = error; - - /* UNDOCUMENTED! The MS rasterizer doesn't allow the following */ - /* graphics state variables to be modified by the CVT program. */ - - exec->GS.dualVector.x = 0x4000; - exec->GS.dualVector.y = 0; - exec->GS.projVector.x = 0x4000; - exec->GS.projVector.y = 0x0; - exec->GS.freeVector.x = 0x4000; - exec->GS.freeVector.y = 0x0; - - exec->GS.rp0 = 0; - exec->GS.rp1 = 0; - exec->GS.rp2 = 0; - - exec->GS.gep0 = 1; - exec->GS.gep1 = 1; - exec->GS.gep2 = 1; - - exec->GS.loop = 1; - - /* save as default graphics state */ - size->GS = exec->GS; - - TT_Save_Context( exec, size ); - - return error; - } - - - static void - tt_size_done_bytecode( FT_Size ftsize ) - { - TT_Size size = (TT_Size)ftsize; - TT_Face face = (TT_Face)ftsize->face; - FT_Memory memory = face->root.memory; - - if ( size->context ) - { - TT_Done_Context( size->context ); - size->context = NULL; - } - - FT_FREE( size->cvt ); - size->cvt_size = 0; - - /* free storage area */ - FT_FREE( size->storage ); - size->storage_size = 0; - - /* twilight zone */ - tt_glyphzone_done( &size->twilight ); - - FT_FREE( size->function_defs ); - FT_FREE( size->instruction_defs ); - - size->num_function_defs = 0; - size->max_function_defs = 0; - size->num_instruction_defs = 0; - size->max_instruction_defs = 0; - - size->max_func = 0; - size->max_ins = 0; - - size->bytecode_ready = -1; - size->cvt_ready = -1; - } - - - /* Initialize bytecode-related fields in the size object. */ - /* We do this only if bytecode interpretation is really needed. */ - static FT_Error - tt_size_init_bytecode( FT_Size ftsize, - FT_Bool pedantic ) - { - FT_Error error; - TT_Size size = (TT_Size)ftsize; - TT_Face face = (TT_Face)ftsize->face; - FT_Memory memory = face->root.memory; - - FT_UShort n_twilight; - TT_MaxProfile* maxp = &face->max_profile; - - - /* clean up bytecode related data */ - FT_FREE( size->function_defs ); - FT_FREE( size->instruction_defs ); - FT_FREE( size->cvt ); - FT_FREE( size->storage ); - - if ( size->context ) - TT_Done_Context( size->context ); - tt_glyphzone_done( &size->twilight ); - - size->bytecode_ready = -1; - size->cvt_ready = -1; - - size->context = TT_New_Context( (TT_Driver)face->root.driver ); - - size->max_function_defs = maxp->maxFunctionDefs; - size->max_instruction_defs = maxp->maxInstructionDefs; - - size->num_function_defs = 0; - size->num_instruction_defs = 0; - - size->max_func = 0; - size->max_ins = 0; - - size->cvt_size = face->cvt_size; - size->storage_size = maxp->maxStorage; - - /* Set default metrics */ - { - TT_Size_Metrics* metrics = &size->ttmetrics; - - - metrics->rotated = FALSE; - metrics->stretched = FALSE; - - /* set default engine compensation */ - metrics->compensations[0] = 0; /* gray */ - metrics->compensations[1] = 0; /* black */ - metrics->compensations[2] = 0; /* white */ - metrics->compensations[3] = 0; /* reserved */ - } - - /* allocate function defs, instruction defs, cvt, and storage area */ - if ( FT_NEW_ARRAY( size->function_defs, size->max_function_defs ) || - FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) || - FT_NEW_ARRAY( size->cvt, size->cvt_size ) || - FT_NEW_ARRAY( size->storage, size->storage_size ) ) - goto Exit; - - /* reserve twilight zone */ - n_twilight = maxp->maxTwilightPoints; - - /* there are 4 phantom points (do we need this?) */ - n_twilight += 4; - - error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight ); - if ( error ) - goto Exit; - - size->twilight.n_points = n_twilight; - - size->GS = tt_default_graphics_state; - - /* set `face->interpreter' according to the debug hook present */ - { - FT_Library library = face->root.driver->root.library; - - - face->interpreter = (TT_Interpreter) - library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE]; - if ( !face->interpreter ) - face->interpreter = (TT_Interpreter)TT_RunIns; - } - - /* Fine, now run the font program! */ - error = tt_size_run_fpgm( size, pedantic ); - - Exit: - if ( error ) - tt_size_done_bytecode( ftsize ); - - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - tt_size_ready_bytecode( TT_Size size, - FT_Bool pedantic ) - { - FT_Error error = FT_Err_Ok; - - - if ( size->bytecode_ready < 0 ) - error = tt_size_init_bytecode( (FT_Size)size, pedantic ); - - if ( error || size->bytecode_ready ) - goto Exit; - - /* rescale CVT when needed */ - if ( size->cvt_ready < 0 ) - { - FT_UInt i; - TT_Face face = (TT_Face)size->root.face; - - - /* Scale the cvt values to the new ppem. */ - /* We use by default the y ppem to scale the CVT. */ - for ( i = 0; i < size->cvt_size; i++ ) - size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); - - /* all twilight points are originally zero */ - for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ ) - { - size->twilight.org[i].x = 0; - size->twilight.org[i].y = 0; - size->twilight.cur[i].x = 0; - size->twilight.cur[i].y = 0; - } - - /* clear storage area */ - for ( i = 0; i < (FT_UInt)size->storage_size; i++ ) - size->storage[i] = 0; - - size->GS = tt_default_graphics_state; - - error = tt_size_run_prep( size, pedantic ); - } - - Exit: - return error; - } - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - - /*************************************************************************/ - /* */ - /* */ - /* tt_size_init */ - /* */ - /* */ - /* Initialize a new TrueType size object. */ - /* */ - /* */ - /* size :: A handle to the size object. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_size_init( FT_Size ttsize ) /* TT_Size */ - { - TT_Size size = (TT_Size)ttsize; - FT_Error error = FT_Err_Ok; - - -#ifdef TT_USE_BYTECODE_INTERPRETER - size->bytecode_ready = -1; - size->cvt_ready = -1; -#endif - - size->ttmetrics.valid = FALSE; - size->strike_index = 0xFFFFFFFFUL; - - return error; - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_size_done */ - /* */ - /* */ - /* The TrueType size object finalizer. */ - /* */ - /* */ - /* size :: A handle to the target size object. */ - /* */ - FT_LOCAL_DEF( void ) - tt_size_done( FT_Size ttsize ) /* TT_Size */ - { - TT_Size size = (TT_Size)ttsize; - - -#ifdef TT_USE_BYTECODE_INTERPRETER - tt_size_done_bytecode( ttsize ); -#endif - - size->ttmetrics.valid = FALSE; - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_size_reset */ - /* */ - /* */ - /* Reset a TrueType size when resolutions and character dimensions */ - /* have been changed. */ - /* */ - /* */ - /* size :: A handle to the target size object. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_size_reset( TT_Size size ) - { - TT_Face face; - FT_Error error = FT_Err_Ok; - FT_Size_Metrics* metrics; - - - size->ttmetrics.valid = FALSE; - - face = (TT_Face)size->root.face; - - metrics = &size->metrics; - - /* copy the result from base layer */ - *metrics = size->root.metrics; - - if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 ) - return FT_THROW( Invalid_PPem ); - - /* This bit flag, if set, indicates that the ppems must be */ - /* rounded to integers. Nearly all TrueType fonts have this bit */ - /* set, as hinting won't work really well otherwise. */ - /* */ - if ( face->header.Flags & 8 ) - { - metrics->x_scale = FT_DivFix( metrics->x_ppem << 6, - face->root.units_per_EM ); - metrics->y_scale = FT_DivFix( metrics->y_ppem << 6, - face->root.units_per_EM ); - - metrics->ascender = - FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) ); - metrics->descender = - FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) ); - metrics->height = - FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) ); - metrics->max_advance = - FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width, - metrics->x_scale ) ); - } - - /* compute new transformation */ - if ( metrics->x_ppem >= metrics->y_ppem ) - { - size->ttmetrics.scale = metrics->x_scale; - size->ttmetrics.ppem = metrics->x_ppem; - size->ttmetrics.x_ratio = 0x10000L; - size->ttmetrics.y_ratio = FT_DivFix( metrics->y_ppem, - metrics->x_ppem ); - } - else - { - size->ttmetrics.scale = metrics->y_scale; - size->ttmetrics.ppem = metrics->y_ppem; - size->ttmetrics.x_ratio = FT_DivFix( metrics->x_ppem, - metrics->y_ppem ); - size->ttmetrics.y_ratio = 0x10000L; - } - -#ifdef TT_USE_BYTECODE_INTERPRETER - size->cvt_ready = -1; -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - if ( !error ) - size->ttmetrics.valid = TRUE; - - return error; - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_driver_init */ - /* */ - /* */ - /* Initialize a given TrueType driver object. */ - /* */ - /* */ - /* driver :: A handle to the target driver object. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_driver_init( FT_Module ttdriver ) /* TT_Driver */ - { - -#ifdef TT_USE_BYTECODE_INTERPRETER - - TT_Driver driver = (TT_Driver)ttdriver; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - driver->interpreter_version = TT_INTERPRETER_VERSION_38; -#else - driver->interpreter_version = TT_INTERPRETER_VERSION_35; -#endif - -#else /* !TT_USE_BYTECODE_INTERPRETER */ - - FT_UNUSED( ttdriver ); - -#endif /* !TT_USE_BYTECODE_INTERPRETER */ - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_driver_done */ - /* */ - /* */ - /* Finalize a given TrueType driver. */ - /* */ - /* */ - /* driver :: A handle to the target TrueType driver. */ - /* */ - FT_LOCAL_DEF( void ) - tt_driver_done( FT_Module ttdriver ) /* TT_Driver */ - { - FT_UNUSED( ttdriver ); - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_slot_init */ - /* */ - /* */ - /* Initialize a new slot object. */ - /* */ - /* */ - /* slot :: A handle to the slot object. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_slot_init( FT_GlyphSlot slot ) - { - return FT_GlyphLoader_CreateExtra( slot->internal->loader ); - } - - -/* END */ diff --git a/3party/freetype/src/truetype/ttobjs.h b/3party/freetype/src/truetype/ttobjs.h deleted file mode 100644 index 9396089a99..0000000000 --- a/3party/freetype/src/truetype/ttobjs.h +++ /dev/null @@ -1,425 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttobjs.h */ -/* */ -/* Objects manager (specification). */ -/* */ -/* Copyright 1996-2015 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 __TTOBJS_H__ -#define __TTOBJS_H__ - - -#include -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Driver */ - /* */ - /* */ - /* A handle to a TrueType driver object. */ - /* */ - typedef struct TT_DriverRec_* TT_Driver; - - - /*************************************************************************/ - /* */ - /* */ - /* TT_GlyphSlot */ - /* */ - /* */ - /* A handle to a TrueType glyph slot object. */ - /* */ - /* */ - /* This is a direct typedef of FT_GlyphSlot, as there is nothing */ - /* specific about the TrueType glyph slot. */ - /* */ - typedef FT_GlyphSlot TT_GlyphSlot; - - - /*************************************************************************/ - /* */ - /* */ - /* TT_GraphicsState */ - /* */ - /* */ - /* The TrueType graphics state used during bytecode interpretation. */ - /* */ - typedef struct TT_GraphicsState_ - { - FT_UShort rp0; - FT_UShort rp1; - FT_UShort rp2; - - FT_UnitVector dualVector; - FT_UnitVector projVector; - FT_UnitVector freeVector; - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - FT_Bool both_x_axis; -#endif - - FT_Long loop; - FT_F26Dot6 minimum_distance; - FT_Int round_state; - - FT_Bool auto_flip; - FT_F26Dot6 control_value_cutin; - FT_F26Dot6 single_width_cutin; - FT_F26Dot6 single_width_value; - FT_UShort delta_base; - FT_UShort delta_shift; - - FT_Byte instruct_control; - /* According to Greg Hitchcock from Microsoft, the `scan_control' */ - /* variable as documented in the TrueType specification is a 32-bit */ - /* integer; the high-word part holds the SCANTYPE value, the low-word */ - /* part the SCANCTRL value. We separate it into two fields. */ - FT_Bool scan_control; - FT_Int scan_type; - - FT_UShort gep0; - FT_UShort gep1; - FT_UShort gep2; - - } TT_GraphicsState; - - -#ifdef TT_USE_BYTECODE_INTERPRETER - - FT_LOCAL( void ) - tt_glyphzone_done( TT_GlyphZone zone ); - - FT_LOCAL( FT_Error ) - tt_glyphzone_new( FT_Memory memory, - FT_UShort maxPoints, - FT_Short maxContours, - TT_GlyphZone zone ); - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - - - /*************************************************************************/ - /* */ - /* EXECUTION SUBTABLES */ - /* */ - /* These sub-tables relate to instruction execution. */ - /* */ - /*************************************************************************/ - - -#define TT_MAX_CODE_RANGES 3 - - - /*************************************************************************/ - /* */ - /* There can only be 3 active code ranges at once: */ - /* - the Font Program */ - /* - the CVT Program */ - /* - a glyph's instructions set */ - /* */ - typedef enum TT_CodeRange_Tag_ - { - tt_coderange_none = 0, - tt_coderange_font, - tt_coderange_cvt, - tt_coderange_glyph - - } TT_CodeRange_Tag; - - - typedef struct TT_CodeRange_ - { - FT_Byte* base; - FT_Long size; - - } TT_CodeRange; - - typedef TT_CodeRange TT_CodeRangeTable[TT_MAX_CODE_RANGES]; - - - /*************************************************************************/ - /* */ - /* Defines a function/instruction definition record. */ - /* */ - typedef struct TT_DefRecord_ - { - FT_Int range; /* in which code range is it located? */ - FT_Long start; /* where does it start? */ - 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; - - - /*************************************************************************/ - /* */ - /* Subglyph transformation record. */ - /* */ - typedef struct TT_Transform_ - { - FT_Fixed xx, xy; /* transformation matrix coefficients */ - FT_Fixed yx, yy; - FT_F26Dot6 ox, oy; /* offsets */ - - } TT_Transform; - - - /*************************************************************************/ - /* */ - /* A note regarding non-squared pixels: */ - /* */ - /* (This text will probably go into some docs at some time; for now, it */ - /* is kept here to explain some definitions in the TT_Size_Metrics */ - /* record). */ - /* */ - /* The CVT is a one-dimensional array containing values that control */ - /* certain important characteristics in a font, like the height of all */ - /* capitals, all lowercase letter, default spacing or stem width/height. */ - /* */ - /* These values are found in FUnits in the font file, and must be scaled */ - /* to pixel coordinates before being used by the CVT and glyph programs. */ - /* Unfortunately, when using distinct x and y resolutions (or distinct x */ - /* and y pointsizes), there are two possible scalings. */ - /* */ - /* A first try was to implement a `lazy' scheme where all values were */ - /* scaled when first used. However, while some values are always used */ - /* in the same direction, some others are used under many different */ - /* circumstances and orientations. */ - /* */ - /* I have found a simpler way to do the same, and it even seems to work */ - /* in most of the cases: */ - /* */ - /* - All CVT values are scaled to the maximum ppem size. */ - /* */ - /* - When performing a read or write in the CVT, a ratio factor is used */ - /* to perform adequate scaling. Example: */ - /* */ - /* x_ppem = 14 */ - /* y_ppem = 10 */ - /* */ - /* We choose ppem = x_ppem = 14 as the CVT scaling size. All cvt */ - /* entries are scaled to it. */ - /* */ - /* x_ratio = 1.0 */ - /* y_ratio = y_ppem/ppem (< 1.0) */ - /* */ - /* We compute the current ratio like: */ - /* */ - /* - If projVector is horizontal, */ - /* ratio = x_ratio = 1.0 */ - /* */ - /* - if projVector is vertical, */ - /* ratio = y_ratio */ - /* */ - /* - else, */ - /* ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */ - /* */ - /* Reading a cvt value returns */ - /* ratio * cvt[index] */ - /* */ - /* Writing a cvt value in pixels: */ - /* cvt[index] / ratio */ - /* */ - /* The current ppem is simply */ - /* ratio * ppem */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Metrics used by the TrueType size and context objects. */ - /* */ - typedef struct TT_Size_Metrics_ - { - /* for non-square pixels */ - FT_Long x_ratio; - FT_Long y_ratio; - - FT_UShort ppem; /* maximum ppem size */ - FT_Long ratio; /* current ratio */ - FT_Fixed scale; - - FT_F26Dot6 compensations[4]; /* device-specific compensations */ - - FT_Bool valid; - - FT_Bool rotated; /* `is the glyph rotated?'-flag */ - FT_Bool stretched; /* `is the glyph stretched?'-flag */ - - } TT_Size_Metrics; - - - /*************************************************************************/ - /* */ - /* TrueType size class. */ - /* */ - typedef struct TT_SizeRec_ - { - FT_SizeRec root; - - /* we have our own copy of metrics so that we can modify */ - /* it without affecting auto-hinting (when used) */ - FT_Size_Metrics metrics; - - TT_Size_Metrics ttmetrics; - - FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ - -#ifdef TT_USE_BYTECODE_INTERPRETER - - FT_UInt num_function_defs; /* number of function definitions */ - FT_UInt max_function_defs; - TT_DefArray function_defs; /* table of function definitions */ - - FT_UInt num_instruction_defs; /* number of ins. definitions */ - FT_UInt max_instruction_defs; - TT_DefArray instruction_defs; /* table of ins. definitions */ - - FT_UInt max_func; - FT_UInt max_ins; - - TT_CodeRangeTable codeRangeTable; - - TT_GraphicsState GS; - - FT_ULong cvt_size; /* the scaled control value table */ - FT_Long* cvt; - - FT_UShort storage_size; /* The storage area is now part of */ - FT_Long* storage; /* the instance */ - - TT_GlyphZoneRec twilight; /* The instance's twilight zone */ - - TT_ExecContext context; - - /* if negative, `fpgm' (resp. `prep'), wasn't executed yet; */ - /* otherwise it is the returned error code */ - FT_Error bytecode_ready; - FT_Error cvt_ready; - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - } TT_SizeRec; - - - /*************************************************************************/ - /* */ - /* TrueType driver class. */ - /* */ - typedef struct TT_DriverRec_ - { - FT_DriverRec root; - - TT_GlyphZoneRec zone; /* glyph loader points zone */ - - FT_UInt interpreter_version; - - } TT_DriverRec; - - - /* Note: All of the functions below (except tt_size_reset()) are used */ - /* as function pointers in a FT_Driver_ClassRec. Therefore their */ - /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face, */ - /* TT_Size, etc., so that the compiler can confirm that the types and */ - /* number of parameters are correct. In all cases the FT_xxx types are */ - /* cast to their TT_xxx counterparts inside the functions since FreeType */ - /* will always use the TT driver to create them. */ - - - /*************************************************************************/ - /* */ - /* Face functions */ - /* */ - FT_LOCAL( FT_Error ) - tt_face_init( FT_Stream stream, - FT_Face ttface, /* TT_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - FT_LOCAL( void ) - tt_face_done( FT_Face ttface ); /* TT_Face */ - - - /*************************************************************************/ - /* */ - /* Size functions */ - /* */ - FT_LOCAL( FT_Error ) - tt_size_init( FT_Size ttsize ); /* TT_Size */ - - FT_LOCAL( void ) - tt_size_done( FT_Size ttsize ); /* TT_Size */ - -#ifdef TT_USE_BYTECODE_INTERPRETER - - FT_LOCAL( FT_Error ) - tt_size_run_fpgm( TT_Size size, - FT_Bool pedantic ); - - FT_LOCAL( FT_Error ) - tt_size_run_prep( TT_Size size, - FT_Bool pedantic ); - - FT_LOCAL( FT_Error ) - tt_size_ready_bytecode( TT_Size size, - FT_Bool pedantic ); - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - FT_LOCAL( FT_Error ) - tt_size_reset( TT_Size size ); - - - /*************************************************************************/ - /* */ - /* Driver functions */ - /* */ - FT_LOCAL( FT_Error ) - tt_driver_init( FT_Module ttdriver ); /* TT_Driver */ - - FT_LOCAL( void ) - tt_driver_done( FT_Module ttdriver ); /* TT_Driver */ - - - /*************************************************************************/ - /* */ - /* Slot functions */ - /* */ - FT_LOCAL( FT_Error ) - tt_slot_init( FT_GlyphSlot slot ); - - - /* auxiliary */ -#define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 ) - - -FT_END_HEADER - -#endif /* __TTOBJS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/truetype/ttpic.c b/3party/freetype/src/truetype/ttpic.c deleted file mode 100644 index 242a6b76dd..0000000000 --- a/3party/freetype/src/truetype/ttpic.c +++ /dev/null @@ -1,101 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpic.c */ -/* */ -/* The FreeType position independent code services for truetype module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "ttpic.h" -#include "tterrors.h" - - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from ttdriver.c */ - FT_Error - FT_Create_Class_tt_services( FT_Library library, - FT_ServiceDescRec** output_class ); - void - FT_Destroy_Class_tt_services( FT_Library library, - FT_ServiceDescRec* clazz ); - void - FT_Init_Class_tt_service_gx_multi_masters( - FT_Service_MultiMastersRec* sv_mm ); - void - FT_Init_Class_tt_service_truetype_glyf( - FT_Service_TTGlyfRec* sv_ttglyf ); - - - void - tt_driver_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - - - if ( pic_container->truetype ) - { - TTModulePIC* container = (TTModulePIC*)pic_container->truetype; - - - if ( container->tt_services ) - FT_Destroy_Class_tt_services( library, container->tt_services ); - container->tt_services = NULL; - FT_FREE( container ); - pic_container->truetype = NULL; - } - } - - - FT_Error - tt_driver_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - TTModulePIC* container = NULL; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->truetype = container; - - /* initialize pointer table - this is how the module usually */ - /* expects this data */ - error = FT_Create_Class_tt_services( library, - &container->tt_services ); - if ( error ) - goto Exit; -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_Init_Class_tt_service_gx_multi_masters( - &container->tt_service_gx_multi_masters ); -#endif - FT_Init_Class_tt_service_truetype_glyf( - &container->tt_service_truetype_glyf ); - - Exit: - if ( error ) - tt_driver_class_pic_free( library ); - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/3party/freetype/src/truetype/ttpic.h b/3party/freetype/src/truetype/ttpic.h deleted file mode 100644 index 076ae56efa..0000000000 --- a/3party/freetype/src/truetype/ttpic.h +++ /dev/null @@ -1,83 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpic.h */ -/* */ -/* The FreeType position independent code services for truetype module. */ -/* */ -/* Copyright 2009-2015 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* 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 __TTPIC_H__ -#define __TTPIC_H__ - - -#include FT_INTERNAL_PIC_H - - -#ifndef FT_CONFIG_OPTION_PIC - -#define TT_SERVICES_GET tt_services -#define TT_SERVICE_GX_MULTI_MASTERS_GET tt_service_gx_multi_masters -#define TT_SERVICE_TRUETYPE_GLYF_GET tt_service_truetype_glyf -#define TT_SERVICE_PROPERTIES_GET tt_service_properties - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_MULTIPLE_MASTERS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H -#include FT_SERVICE_TRUETYPE_GLYF_H -#include FT_SERVICE_PROPERTIES_H - - -FT_BEGIN_HEADER - - typedef struct TTModulePIC_ - { - FT_ServiceDescRec* tt_services; -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_Service_MultiMastersRec tt_service_gx_multi_masters; -#endif - FT_Service_TTGlyfRec tt_service_truetype_glyf; - FT_Service_PropertiesRec tt_service_properties; - - } TTModulePIC; - - -#define GET_PIC( lib ) \ - ( (TTModulePIC*)((lib)->pic_container.truetype) ) -#define TT_SERVICES_GET \ - ( GET_PIC( library )->tt_services ) -#define TT_SERVICE_GX_MULTI_MASTERS_GET \ - ( GET_PIC( library )->tt_service_gx_multi_masters ) -#define TT_SERVICE_TRUETYPE_GLYF_GET \ - ( GET_PIC( library )->tt_service_truetype_glyf ) -#define TT_SERVICE_PROPERTIES_GET \ - ( GET_PIC( library )->tt_service_properties ) - - - /* see ttpic.c for the implementation */ - void - tt_driver_class_pic_free( FT_Library library ); - - FT_Error - tt_driver_class_pic_init( FT_Library library ); - -FT_END_HEADER - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -#endif /* __TTPIC_H__ */ - - -/* END */ diff --git a/3party/freetype/src/truetype/ttpload.c b/3party/freetype/src/truetype/ttpload.c deleted file mode 100644 index fb338bde3c..0000000000 --- a/3party/freetype/src/truetype/ttpload.c +++ /dev/null @@ -1,601 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpload.c */ -/* */ -/* TrueType-specific tables loader (body). */ -/* */ -/* Copyright 1996-2015 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 FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H - -#include "ttpload.h" - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include "ttgxvar.h" -#endif - -#include "tterrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttpload - - - /*************************************************************************/ - /* */ - /* */ - /* tt_face_load_loca */ - /* */ - /* */ - /* Load the locations table. */ - /* */ - /* */ - /* face :: A handle to the target face object. */ - /* */ - /* */ - /* stream :: The input stream. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_loca( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - FT_ULong table_len; - FT_Int shift; - - - /* we need the size of the `glyf' table for malformed `loca' tables */ - error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len ); - - /* it is possible that a font doesn't have a glyf table at all */ - /* or its size is zero */ - if ( FT_ERR_EQ( error, Table_Missing ) ) - face->glyf_len = 0; - else if ( error ) - goto Exit; - - FT_TRACE2(( "Locations " )); - error = face->goto_table( face, TTAG_loca, stream, &table_len ); - if ( error ) - { - error = FT_THROW( Locations_Missing ); - goto Exit; - } - - if ( face->header.Index_To_Loc_Format != 0 ) - { - shift = 2; - - if ( table_len >= 0x40000L ) - { - FT_TRACE2(( "table too large\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - face->num_locations = table_len >> shift; - } - else - { - shift = 1; - - if ( table_len >= 0x20000L ) - { - FT_TRACE2(( "table too large\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - face->num_locations = table_len >> shift; - } - - if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 ) - { - FT_TRACE2(( "glyph count mismatch! loca: %d, maxp: %d\n", - face->num_locations - 1, face->root.num_glyphs )); - - /* we only handle the case where `maxp' gives a larger value */ - if ( face->num_locations <= (FT_ULong)face->root.num_glyphs ) - { - FT_ULong new_loca_len = - ( (FT_ULong)face->root.num_glyphs + 1 ) << shift; - - TT_Table entry = face->dir_tables; - TT_Table limit = entry + face->num_tables; - - FT_Long pos = (FT_Long)FT_STREAM_POS(); - FT_Long dist = 0x7FFFFFFFL; - - - /* compute the distance to next table in font file */ - for ( ; entry < limit; entry++ ) - { - FT_Long diff = (FT_Long)entry->Offset - pos; - - - if ( diff > 0 && diff < dist ) - dist = diff; - } - - if ( entry == limit ) - { - /* `loca' is the last table */ - dist = (FT_Long)stream->size - pos; - } - - if ( new_loca_len <= (FT_ULong)dist ) - { - face->num_locations = (FT_ULong)face->root.num_glyphs + 1; - table_len = new_loca_len; - - FT_TRACE2(( "adjusting num_locations to %d\n", - face->num_locations )); - } - } - } - - /* - * Extract the frame. We don't need to decompress it since - * we are able to parse it directly. - */ - if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) ) - goto Exit; - - FT_TRACE2(( "loaded\n" )); - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_ULong ) - tt_face_get_location( TT_Face face, - FT_UInt gindex, - FT_UInt *asize ) - { - FT_ULong pos1, pos2; - FT_Byte* p; - FT_Byte* p_limit; - - - pos1 = pos2 = 0; - - if ( gindex < face->num_locations ) - { - if ( face->header.Index_To_Loc_Format != 0 ) - { - p = face->glyph_locations + gindex * 4; - p_limit = face->glyph_locations + face->num_locations * 4; - - pos1 = FT_NEXT_ULONG( p ); - pos2 = pos1; - - if ( p + 4 <= p_limit ) - pos2 = FT_NEXT_ULONG( p ); - } - else - { - p = face->glyph_locations + gindex * 2; - p_limit = face->glyph_locations + face->num_locations * 2; - - pos1 = FT_NEXT_USHORT( p ); - pos2 = pos1; - - if ( p + 2 <= p_limit ) - pos2 = FT_NEXT_USHORT( p ); - - pos1 <<= 1; - pos2 <<= 1; - } - } - - /* Check broken location data */ - if ( pos1 > face->glyf_len ) - { - FT_TRACE1(( "tt_face_get_location:" - " too large offset=0x%08lx found for gid=0x%04lx," - " exceeding the end of glyf table (0x%08lx)\n", - pos1, gindex, face->glyf_len )); - *asize = 0; - return 0; - } - - if ( pos2 > face->glyf_len ) - { - FT_TRACE1(( "tt_face_get_location:" - " too large offset=0x%08lx found for gid=0x%04lx," - " truncate at the end of glyf table (0x%08lx)\n", - pos2, gindex + 1, face->glyf_len )); - pos2 = face->glyf_len; - } - - /* The `loca' table must be ordered; it refers to the length of */ - /* an entry as the difference between the current and the next */ - /* position. However, there do exist (malformed) fonts which */ - /* don't obey this rule, so we are only able to provide an */ - /* upper bound for the size. */ - /* */ - /* We get (intentionally) a wrong, non-zero result in case the */ - /* `glyf' table is missing. */ - if ( pos2 >= pos1 ) - *asize = (FT_UInt)( pos2 - pos1 ); - else - *asize = (FT_UInt)( face->glyf_len - pos1 ); - - return pos1; - } - - - FT_LOCAL_DEF( void ) - tt_face_done_loca( TT_Face face ) - { - FT_Stream stream = face->root.stream; - - - FT_FRAME_RELEASE( face->glyph_locations ); - face->num_locations = 0; - } - - - - /*************************************************************************/ - /* */ - /* */ - /* tt_face_load_cvt */ - /* */ - /* */ - /* Load the control value table into a face object. */ - /* */ - /* */ - /* face :: A handle to the target face object. */ - /* */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_cvt( TT_Face face, - FT_Stream stream ) - { -#ifdef TT_USE_BYTECODE_INTERPRETER - - FT_Error error; - FT_Memory memory = stream->memory; - FT_ULong table_len; - - - FT_TRACE2(( "CVT " )); - - error = face->goto_table( face, TTAG_cvt, stream, &table_len ); - if ( error ) - { - FT_TRACE2(( "is missing\n" )); - - face->cvt_size = 0; - face->cvt = NULL; - error = FT_Err_Ok; - - goto Exit; - } - - face->cvt_size = table_len / 2; - - if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) ) - goto Exit; - - if ( FT_FRAME_ENTER( face->cvt_size * 2L ) ) - goto Exit; - - { - FT_Short* cur = face->cvt; - FT_Short* limit = cur + face->cvt_size; - - - for ( ; cur < limit; cur++ ) - *cur = FT_GET_SHORT(); - } - - FT_FRAME_EXIT(); - FT_TRACE2(( "loaded\n" )); - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - if ( face->doblend ) - error = tt_face_vary_cvt( face, stream ); -#endif - - Exit: - return error; - -#else /* !TT_USE_BYTECODE_INTERPRETER */ - - FT_UNUSED( face ); - FT_UNUSED( stream ); - - return FT_Err_Ok; - -#endif - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_face_load_fpgm */ - /* */ - /* */ - /* Load the font program. */ - /* */ - /* */ - /* face :: A handle to the target face object. */ - /* */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_fpgm( TT_Face face, - FT_Stream stream ) - { -#ifdef TT_USE_BYTECODE_INTERPRETER - - FT_Error error; - FT_ULong table_len; - - - FT_TRACE2(( "Font program " )); - - /* The font program is optional */ - error = face->goto_table( face, TTAG_fpgm, stream, &table_len ); - if ( error ) - { - face->font_program = NULL; - face->font_program_size = 0; - error = FT_Err_Ok; - - FT_TRACE2(( "is missing\n" )); - } - else - { - face->font_program_size = table_len; - if ( FT_FRAME_EXTRACT( table_len, face->font_program ) ) - goto Exit; - - FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size )); - } - - Exit: - return error; - -#else /* !TT_USE_BYTECODE_INTERPRETER */ - - FT_UNUSED( face ); - FT_UNUSED( stream ); - - return FT_Err_Ok; - -#endif - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_face_load_prep */ - /* */ - /* */ - /* Load the cvt program. */ - /* */ - /* */ - /* face :: A handle to the target face object. */ - /* */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_prep( TT_Face face, - FT_Stream stream ) - { -#ifdef TT_USE_BYTECODE_INTERPRETER - - FT_Error error; - FT_ULong table_len; - - - FT_TRACE2(( "Prep program " )); - - error = face->goto_table( face, TTAG_prep, stream, &table_len ); - if ( error ) - { - face->cvt_program = NULL; - face->cvt_program_size = 0; - error = FT_Err_Ok; - - FT_TRACE2(( "is missing\n" )); - } - else - { - face->cvt_program_size = table_len; - if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) ) - goto Exit; - - FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size )); - } - - Exit: - return error; - -#else /* !TT_USE_BYTECODE_INTERPRETER */ - - FT_UNUSED( face ); - FT_UNUSED( stream ); - - return FT_Err_Ok; - -#endif - } - - - /*************************************************************************/ - /* */ - /* */ - /* tt_face_load_hdmx */ - /* */ - /* */ - /* Load the `hdmx' table into the face object. */ - /* */ - /* */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_hdmx( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - FT_Memory memory = stream->memory; - FT_UInt version, nn, num_records; - FT_ULong table_size, record_size; - FT_Byte* p; - FT_Byte* limit; - - - /* this table is optional */ - error = face->goto_table( face, TTAG_hdmx, stream, &table_size ); - if ( error || table_size < 8 ) - return FT_Err_Ok; - - if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) ) - goto Exit; - - p = face->hdmx_table; - limit = p + table_size; - - version = FT_NEXT_USHORT( p ); - num_records = FT_NEXT_USHORT( p ); - record_size = FT_NEXT_ULONG( p ); - - /* The maximum number of bytes in an hdmx device record is the */ - /* maximum number of glyphs + 2; this is 0xFFFF + 2, thus */ - /* explaining why `record_size' is a long (which we read as */ - /* unsigned long for convenience). In practice, two bytes are */ - /* sufficient to hold the size value. */ - /* */ - /* There are at least two fonts, HANNOM-A and HANNOM-B version */ - /* 2.0 (2005), which get this wrong: The upper two bytes of */ - /* the size value are set to 0xFF instead of 0x00. We catch */ - /* and fix this. */ - - if ( record_size >= 0xFFFF0000UL ) - record_size &= 0xFFFFU; - - /* The limit for `num_records' is a heuristic value. */ - if ( version != 0 || - num_records > 255 || - record_size > 0x10001L || - record_size < 4 ) - { - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) ) - goto Fail; - - for ( nn = 0; nn < num_records; nn++ ) - { - if ( p + record_size > limit ) - break; - - face->hdmx_record_sizes[nn] = p[0]; - p += record_size; - } - - face->hdmx_record_count = nn; - face->hdmx_table_size = table_size; - face->hdmx_record_size = record_size; - - Exit: - return error; - - Fail: - FT_FRAME_RELEASE( face->hdmx_table ); - face->hdmx_table_size = 0; - goto Exit; - } - - - FT_LOCAL_DEF( void ) - tt_face_free_hdmx( TT_Face face ) - { - FT_Stream stream = face->root.stream; - FT_Memory memory = stream->memory; - - - FT_FREE( face->hdmx_record_sizes ); - FT_FRAME_RELEASE( face->hdmx_table ); - } - - - /*************************************************************************/ - /* */ - /* Return the advance width table for a given pixel size if it is found */ - /* in the font's `hdmx' table (if any). */ - /* */ - FT_LOCAL_DEF( FT_Byte* ) - tt_face_get_device_metrics( TT_Face face, - FT_UInt ppem, - FT_UInt gindex ) - { - FT_UInt nn; - FT_Byte* result = NULL; - FT_ULong record_size = face->hdmx_record_size; - FT_Byte* record = face->hdmx_table + 8; - - - for ( nn = 0; nn < face->hdmx_record_count; nn++ ) - if ( face->hdmx_record_sizes[nn] == ppem ) - { - gindex += 2; - if ( gindex < record_size ) - result = record + nn * record_size + gindex; - break; - } - - return result; - } - - -/* END */ diff --git a/3party/freetype/src/truetype/ttpload.h b/3party/freetype/src/truetype/ttpload.h deleted file mode 100644 index bc92369827..0000000000 --- a/3party/freetype/src/truetype/ttpload.h +++ /dev/null @@ -1,75 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpload.h */ -/* */ -/* TrueType-specific tables loader (specification). */ -/* */ -/* Copyright 1996-2015 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 __TTPLOAD_H__ -#define __TTPLOAD_H__ - - -#include -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - tt_face_load_loca( TT_Face face, - FT_Stream stream ); - - FT_LOCAL( FT_ULong ) - tt_face_get_location( TT_Face face, - FT_UInt gindex, - FT_UInt *asize ); - - FT_LOCAL( void ) - tt_face_done_loca( TT_Face face ); - - FT_LOCAL( FT_Error ) - tt_face_load_cvt( TT_Face face, - FT_Stream stream ); - - FT_LOCAL( FT_Error ) - tt_face_load_fpgm( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_prep( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_hdmx( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( void ) - tt_face_free_hdmx( TT_Face face ); - - - FT_LOCAL( FT_Byte* ) - tt_face_get_device_metrics( TT_Face face, - FT_UInt ppem, - FT_UInt gindex ); - -FT_END_HEADER - -#endif /* __TTPLOAD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/truetype/ttsubpix.c b/3party/freetype/src/truetype/ttsubpix.c deleted file mode 100644 index 0d391e95a0..0000000000 --- a/3party/freetype/src/truetype/ttsubpix.c +++ /dev/null @@ -1,1011 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttsubpix.c */ -/* */ -/* TrueType Subpixel Hinting. */ -/* */ -/* Copyright 2010-2015 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 FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_TRUETYPE_TAGS_H -#include FT_OUTLINE_H -#include FT_TRUETYPE_DRIVER_H - -#include "ttsubpix.h" - - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - - /*************************************************************************/ - /* */ - /* 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 ( strcmp( detected_font_name, rule_font_name ) == 0 ) - return TRUE; - - /* Is font name a wildcard ""? */ - if ( 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 ( strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 ) - { - for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ ) - { - if ( strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 ) - continue; - if ( 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 ( strcmp( detected_font_style, rule_font_style ) == 0 ) - return TRUE; - - /* Is font style a wildcard ""? */ - if ( 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 ( strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 ) - { - for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ ) - { - if ( strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 ) - continue; - if ( 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - /* ANSI C doesn't like empty source files */ - typedef int _tt_subpix_dummy; - -#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */ - - -/* END */ diff --git a/3party/freetype/src/truetype/ttsubpix.h b/3party/freetype/src/truetype/ttsubpix.h deleted file mode 100644 index 9151aa3250..0000000000 --- a/3party/freetype/src/truetype/ttsubpix.h +++ /dev/null @@ -1,110 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttsubpix.h */ -/* */ -/* TrueType Subpixel Hinting. */ -/* */ -/* Copyright 2010-2015 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 -#include "ttobjs.h" -#include "ttinterp.h" - - -FT_BEGIN_HEADER - - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - - /*************************************************************************/ - /* */ - /* 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_CONFIG_OPTION_SUBPIXEL_HINTING */ - - -FT_END_HEADER - -#endif /* __TTSUBPIX_H__ */ - -/* END */ diff --git a/3party/freetype/src/type1/Jamfile b/3party/freetype/src/type1/Jamfile deleted file mode 100644 index d1a3af57e9..0000000000 --- a/3party/freetype/src/type1/Jamfile +++ /dev/null @@ -1,35 +0,0 @@ -# FreeType 2 src/type1 Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) type1 ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = t1afm - t1driver - t1gload - t1load - t1objs - t1parse - ; - } - else - { - _sources = type1 ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/type1 Jamfile diff --git a/3party/freetype/src/type1/module.mk b/3party/freetype/src/type1/module.mk deleted file mode 100644 index feb3459d87..0000000000 --- a/3party/freetype/src/type1/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 Type1 module definition -# - - -# Copyright 1996-2015 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. - - -FTMODULE_H_COMMANDS += TYPE1_DRIVER - -define TYPE1_DRIVER -$(OPEN_DRIVER) FT_Driver_ClassRec, t1_driver_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)type1 $(ECHO_DRIVER_DESC)Postscript font files with extension *.pfa or *.pfb$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/type1/rules.mk b/3party/freetype/src/type1/rules.mk deleted file mode 100644 index fbd0543531..0000000000 --- a/3party/freetype/src/type1/rules.mk +++ /dev/null @@ -1,76 +0,0 @@ -# -# FreeType 2 Type1 driver configuration rules -# - - -# Copyright 1996-2015 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. - - -# Type1 driver directory -# -T1_DIR := $(SRC_DIR)/type1 - - -# compilation flags for the driver -# -T1_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(T1_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# Type1 driver sources (i.e., C files) -# -T1_DRV_SRC := $(T1_DIR)/t1parse.c \ - $(T1_DIR)/t1load.c \ - $(T1_DIR)/t1driver.c \ - $(T1_DIR)/t1afm.c \ - $(T1_DIR)/t1gload.c \ - $(T1_DIR)/t1objs.c - -# Type1 driver headers -# -T1_DRV_H := $(T1_DRV_SRC:%.c=%.h) \ - $(T1_DIR)/t1tokens.h \ - $(T1_DIR)/t1errors.h - - -# Type1 driver object(s) -# -# T1_DRV_OBJ_M is used during `multi' builds -# T1_DRV_OBJ_S is used during `single' builds -# -T1_DRV_OBJ_M := $(T1_DRV_SRC:$(T1_DIR)/%.c=$(OBJ_DIR)/%.$O) -T1_DRV_OBJ_S := $(OBJ_DIR)/type1.$O - -# Type1 driver source file for single build -# -T1_DRV_SRC_S := $(T1_DIR)/type1.c - - -# Type1 driver - single object -# -$(T1_DRV_OBJ_S): $(T1_DRV_SRC_S) $(T1_DRV_SRC) $(FREETYPE_H) $(T1_DRV_H) - $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T1_DRV_SRC_S)) - - -# Type1 driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(T1_DIR)/%.c $(FREETYPE_H) $(T1_DRV_H) - $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(T1_DRV_OBJ_S) -DRV_OBJS_M += $(T1_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/type1/t1afm.c b/3party/freetype/src/type1/t1afm.c deleted file mode 100644 index 7f32059f85..0000000000 --- a/3party/freetype/src/type1/t1afm.c +++ /dev/null @@ -1,396 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1afm.c */ -/* */ -/* AFM support for Type 1 fonts (body). */ -/* */ -/* Copyright 1996-2015 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 "t1afm.h" -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include "t1errors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_t1afm - - - FT_LOCAL_DEF( void ) - T1_Done_Metrics( FT_Memory memory, - AFM_FontInfo fi ) - { - FT_FREE( fi->KernPairs ); - fi->NumKernPair = 0; - - FT_FREE( fi->TrackKerns ); - fi->NumTrackKern = 0; - - FT_FREE( fi ); - } - - - /* read a glyph name and return the equivalent glyph index */ - static FT_Int - t1_get_index( const char* name, - FT_Offset len, - void* user_data ) - { - T1_Font type1 = (T1_Font)user_data; - FT_Int n; - - - /* PS string/name length must be < 16-bit */ - if ( len > 0xFFFFU ) - return 0; - - for ( n = 0; n < type1->num_glyphs; n++ ) - { - char* gname = (char*)type1->glyph_names[n]; - - - if ( gname && gname[0] == name[0] && - ft_strlen( gname ) == len && - ft_strncmp( gname, name, len ) == 0 ) - return n; - } - - return 0; - } - - -#undef KERN_INDEX -#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) ) - - - /* compare two kerning pairs */ - FT_CALLBACK_DEF( int ) - compare_kern_pairs( const void* a, - const void* b ) - { - AFM_KernPair pair1 = (AFM_KernPair)a; - AFM_KernPair pair2 = (AFM_KernPair)b; - - FT_ULong index1 = KERN_INDEX( pair1->index1, pair1->index2 ); - FT_ULong index2 = KERN_INDEX( pair2->index1, pair2->index2 ); - - - if ( index1 > index2 ) - return 1; - else if ( index1 < index2 ) - return -1; - else - return 0; - } - - - /* parse a PFM file -- for now, only read the kerning pairs */ - static FT_Error - T1_Read_PFM( FT_Face t1_face, - FT_Stream stream, - AFM_FontInfo fi ) - { - FT_Error error = FT_Err_Ok; - FT_Memory memory = stream->memory; - FT_Byte* start; - FT_Byte* limit; - FT_Byte* p; - AFM_KernPair kp; - FT_Int width_table_length; - FT_CharMap oldcharmap; - FT_CharMap charmap; - FT_Int n; - - - start = (FT_Byte*)stream->cursor; - limit = (FT_Byte*)stream->limit; - - /* Figure out how long the width table is. */ - /* This info is a little-endian short at offset 99. */ - p = start + 99; - if ( p + 2 > limit ) - { - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - width_table_length = FT_PEEK_USHORT_LE( p ); - - p += 18 + width_table_length; - if ( p + 0x12 > limit || FT_PEEK_USHORT_LE( p ) < 0x12 ) - /* extension table is probably optional */ - goto Exit; - - /* Kerning offset is 14 bytes from start of extensions table. */ - p += 14; - p = start + FT_PEEK_ULONG_LE( p ); - - if ( p == start ) - /* zero offset means no table */ - goto Exit; - - if ( p + 2 > limit ) - { - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - fi->NumKernPair = FT_PEEK_USHORT_LE( p ); - p += 2; - if ( p + 4 * fi->NumKernPair > limit ) - { - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - /* Actually, kerning pairs are simply optional! */ - if ( fi->NumKernPair == 0 ) - goto Exit; - - /* allocate the pairs */ - if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) ) - goto Exit; - - /* now, read each kern pair */ - kp = fi->KernPairs; - limit = p + 4 * fi->NumKernPair; - - /* PFM kerning data are stored by encoding rather than glyph index, */ - /* so find the PostScript charmap of this font and install it */ - /* temporarily. If we find no PostScript charmap, then just use */ - /* the default and hope it is the right one. */ - oldcharmap = t1_face->charmap; - charmap = NULL; - - for ( n = 0; n < t1_face->num_charmaps; n++ ) - { - charmap = t1_face->charmaps[n]; - /* check against PostScript pseudo platform */ - if ( charmap->platform_id == 7 ) - { - error = FT_Set_Charmap( t1_face, charmap ); - if ( error ) - goto Exit; - break; - } - } - - /* Kerning info is stored as: */ - /* */ - /* encoding of first glyph (1 byte) */ - /* encoding of second glyph (1 byte) */ - /* offset (little-endian short) */ - for ( ; p < limit ; p += 4 ) - { - kp->index1 = FT_Get_Char_Index( t1_face, p[0] ); - kp->index2 = FT_Get_Char_Index( t1_face, p[1] ); - - kp->x = (FT_Int)FT_PEEK_SHORT_LE(p + 2); - kp->y = 0; - - kp++; - } - - if ( oldcharmap != NULL ) - error = FT_Set_Charmap( t1_face, oldcharmap ); - if ( error ) - goto Exit; - - /* now, sort the kern pairs according to their glyph indices */ - ft_qsort( fi->KernPairs, fi->NumKernPair, sizeof ( AFM_KernPairRec ), - compare_kern_pairs ); - - Exit: - if ( error ) - { - FT_FREE( fi->KernPairs ); - fi->NumKernPair = 0; - } - - return error; - } - - - /* parse a metrics file -- either AFM or PFM depending on what */ - /* it turns out to be */ - FT_LOCAL_DEF( FT_Error ) - T1_Read_Metrics( FT_Face t1_face, - FT_Stream stream ) - { - PSAux_Service psaux; - FT_Memory memory = stream->memory; - AFM_ParserRec parser; - AFM_FontInfo fi = NULL; - FT_Error error = FT_ERR( Unknown_File_Format ); - T1_Font t1_font = &( (T1_Face)t1_face )->type1; - - - if ( FT_NEW( fi ) || - FT_FRAME_ENTER( stream->size ) ) - goto Exit; - - fi->FontBBox = t1_font->font_bbox; - fi->Ascender = t1_font->font_bbox.yMax; - fi->Descender = t1_font->font_bbox.yMin; - - psaux = (PSAux_Service)( (T1_Face)t1_face )->psaux; - if ( psaux->afm_parser_funcs ) - { - error = psaux->afm_parser_funcs->init( &parser, - stream->memory, - stream->cursor, - stream->limit ); - - if ( !error ) - { - parser.FontInfo = fi; - parser.get_index = t1_get_index; - parser.user_data = t1_font; - - error = psaux->afm_parser_funcs->parse( &parser ); - psaux->afm_parser_funcs->done( &parser ); - } - } - - if ( FT_ERR_EQ( error, Unknown_File_Format ) ) - { - FT_Byte* start = stream->cursor; - - - /* MS Windows allows versions up to 0x3FF without complaining */ - if ( stream->size > 6 && - start[1] < 4 && - FT_PEEK_ULONG_LE( start + 2 ) == stream->size ) - error = T1_Read_PFM( t1_face, stream, fi ); - } - - if ( !error ) - { - t1_font->font_bbox = fi->FontBBox; - - t1_face->bbox.xMin = fi->FontBBox.xMin >> 16; - t1_face->bbox.yMin = fi->FontBBox.yMin >> 16; - /* no `U' suffix here to 0xFFFF! */ - t1_face->bbox.xMax = ( fi->FontBBox.xMax + 0xFFFF ) >> 16; - t1_face->bbox.yMax = ( fi->FontBBox.yMax + 0xFFFF ) >> 16; - - /* no `U' suffix here to 0x8000! */ - t1_face->ascender = (FT_Short)( ( fi->Ascender + 0x8000 ) >> 16 ); - t1_face->descender = (FT_Short)( ( fi->Descender + 0x8000 ) >> 16 ); - - if ( fi->NumKernPair ) - { - t1_face->face_flags |= FT_FACE_FLAG_KERNING; - ( (T1_Face)t1_face )->afm_data = fi; - fi = NULL; - } - } - - FT_FRAME_EXIT(); - - Exit: - if ( fi != NULL ) - T1_Done_Metrics( memory, fi ); - - return error; - } - - - /* find the kerning for a given glyph pair */ - FT_LOCAL_DEF( void ) - T1_Get_Kerning( AFM_FontInfo fi, - FT_UInt glyph1, - FT_UInt glyph2, - FT_Vector* kerning ) - { - AFM_KernPair min, mid, max; - FT_ULong idx = KERN_INDEX( glyph1, glyph2 ); - - - /* simple binary search */ - min = fi->KernPairs; - max = min + fi->NumKernPair - 1; - - while ( min <= max ) - { - FT_ULong midi; - - - mid = min + ( max - min ) / 2; - midi = KERN_INDEX( mid->index1, mid->index2 ); - - if ( midi == idx ) - { - kerning->x = mid->x; - kerning->y = mid->y; - - return; - } - - if ( midi < idx ) - min = mid + 1; - else - max = mid - 1; - } - - kerning->x = 0; - kerning->y = 0; - } - - - FT_LOCAL_DEF( FT_Error ) - T1_Get_Track_Kerning( FT_Face face, - FT_Fixed ptsize, - FT_Int degree, - FT_Fixed* kerning ) - { - AFM_FontInfo fi = (AFM_FontInfo)( (T1_Face)face )->afm_data; - FT_UInt i; - - - if ( !fi ) - return FT_THROW( Invalid_Argument ); - - for ( i = 0; i < fi->NumTrackKern; i++ ) - { - AFM_TrackKern tk = fi->TrackKerns + i; - - - if ( tk->degree != degree ) - continue; - - if ( ptsize < tk->min_ptsize ) - *kerning = tk->min_kern; - else if ( ptsize > tk->max_ptsize ) - *kerning = tk->max_kern; - else - { - *kerning = FT_MulDiv( ptsize - tk->min_ptsize, - tk->max_kern - tk->min_kern, - tk->max_ptsize - tk->min_ptsize ) + - tk->min_kern; - } - } - - return FT_Err_Ok; - } - - -/* END */ diff --git a/3party/freetype/src/type1/t1afm.h b/3party/freetype/src/type1/t1afm.h deleted file mode 100644 index 0f42f3e3a8..0000000000 --- a/3party/freetype/src/type1/t1afm.h +++ /dev/null @@ -1,54 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1afm.h */ -/* */ -/* AFM support for Type 1 fonts (specification). */ -/* */ -/* Copyright 1996-2015 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 __T1AFM_H__ -#define __T1AFM_H__ - -#include -#include "t1objs.h" -#include FT_INTERNAL_TYPE1_TYPES_H - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - T1_Read_Metrics( FT_Face face, - FT_Stream stream ); - - FT_LOCAL( void ) - T1_Done_Metrics( FT_Memory memory, - AFM_FontInfo fi ); - - FT_LOCAL( void ) - T1_Get_Kerning( AFM_FontInfo fi, - FT_UInt glyph1, - FT_UInt glyph2, - FT_Vector* kerning ); - - FT_LOCAL( FT_Error ) - T1_Get_Track_Kerning( FT_Face face, - FT_Fixed ptsize, - FT_Int degree, - FT_Fixed* kerning ); - -FT_END_HEADER - -#endif /* __T1AFM_H__ */ - - -/* END */ diff --git a/3party/freetype/src/type1/t1driver.c b/3party/freetype/src/type1/t1driver.c deleted file mode 100644 index 571f2d2f8c..0000000000 --- a/3party/freetype/src/type1/t1driver.c +++ /dev/null @@ -1,725 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1driver.c */ -/* */ -/* Type 1 driver interface (body). */ -/* */ -/* Copyright 1996-2015 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 "t1driver.h" -#include "t1gload.h" -#include "t1load.h" - -#include "t1errors.h" - -#ifndef T1_CONFIG_OPTION_NO_AFM -#include "t1afm.h" -#endif - -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H - -#include FT_SERVICE_MULTIPLE_MASTERS_H -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_FONT_FORMAT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_SERVICE_POSTSCRIPT_INFO_H -#include FT_SERVICE_KERNING_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_t1driver - - /* - * GLYPH DICT SERVICE - * - */ - - static FT_Error - t1_get_glyph_name( T1_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ) - { - FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max ); - - return FT_Err_Ok; - } - - - static FT_UInt - t1_get_name_index( T1_Face face, - FT_String* glyph_name ) - { - FT_Int i; - - - for ( i = 0; i < face->type1.num_glyphs; i++ ) - { - FT_String* gname = face->type1.glyph_names[i]; - - - if ( !ft_strcmp( glyph_name, gname ) ) - return (FT_UInt)i; - } - - return 0; - } - - - static const FT_Service_GlyphDictRec t1_service_glyph_dict = - { - (FT_GlyphDict_GetNameFunc) t1_get_glyph_name, - (FT_GlyphDict_NameIndexFunc)t1_get_name_index - }; - - - /* - * POSTSCRIPT NAME SERVICE - * - */ - - static const char* - t1_get_ps_name( T1_Face face ) - { - return (const char*) face->type1.font_name; - } - - - static const FT_Service_PsFontNameRec t1_service_ps_name = - { - (FT_PsName_GetFunc)t1_get_ps_name - }; - - - /* - * MULTIPLE MASTERS SERVICE - * - */ - -#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT - static const FT_Service_MultiMastersRec t1_service_multi_masters = - { - (FT_Get_MM_Func) T1_Get_Multi_Master, - (FT_Set_MM_Design_Func) T1_Set_MM_Design, - (FT_Set_MM_Blend_Func) T1_Set_MM_Blend, - (FT_Get_MM_Var_Func) T1_Get_MM_Var, - (FT_Set_Var_Design_Func)T1_Set_Var_Design - }; -#endif - - - /* - * POSTSCRIPT INFO SERVICE - * - */ - - static FT_Error - t1_ps_get_font_info( FT_Face face, - PS_FontInfoRec* afont_info ) - { - *afont_info = ((T1_Face)face)->type1.font_info; - - return FT_Err_Ok; - } - - - static FT_Error - t1_ps_get_font_extra( FT_Face face, - PS_FontExtraRec* afont_extra ) - { - *afont_extra = ((T1_Face)face)->type1.font_extra; - - return FT_Err_Ok; - } - - - static FT_Int - t1_ps_has_glyph_names( FT_Face face ) - { - FT_UNUSED( face ); - - return 1; - } - - - static FT_Error - t1_ps_get_font_private( FT_Face face, - PS_PrivateRec* afont_private ) - { - *afont_private = ((T1_Face)face)->type1.private_dict; - - return FT_Err_Ok; - } - - - static FT_Long - t1_ps_get_font_value( FT_Face face, - PS_Dict_Keys key, - FT_UInt idx, - void *value, - FT_Long value_len_ ) - { - FT_ULong retval = 0; /* always >= 1 if valid */ - FT_ULong value_len = value_len_ < 0 ? 0 : (FT_ULong)value_len_; - - T1_Face t1face = (T1_Face)face; - T1_Font type1 = &t1face->type1; - - - switch ( key ) - { - case PS_DICT_FONT_TYPE: - retval = sizeof ( type1->font_type ); - if ( value && value_len >= retval ) - *((FT_Byte *)value) = type1->font_type; - break; - - case PS_DICT_FONT_MATRIX: - if ( idx < sizeof ( type1->font_matrix ) / - sizeof ( type1->font_matrix.xx ) ) - { - FT_Fixed val = 0; - - - retval = sizeof ( val ); - if ( value && value_len >= retval ) - { - switch ( idx ) - { - case 0: - val = type1->font_matrix.xx; - break; - case 1: - val = type1->font_matrix.xy; - break; - case 2: - val = type1->font_matrix.yx; - break; - case 3: - val = type1->font_matrix.yy; - break; - } - *((FT_Fixed *)value) = val; - } - } - break; - - case PS_DICT_FONT_BBOX: - if ( idx < sizeof ( type1->font_bbox ) / - sizeof ( type1->font_bbox.xMin ) ) - { - FT_Fixed val = 0; - - - retval = sizeof ( val ); - if ( value && value_len >= retval ) - { - switch ( idx ) - { - case 0: - val = type1->font_bbox.xMin; - break; - case 1: - val = type1->font_bbox.yMin; - break; - case 2: - val = type1->font_bbox.xMax; - break; - case 3: - val = type1->font_bbox.yMax; - break; - } - *((FT_Fixed *)value) = val; - } - } - break; - - case PS_DICT_PAINT_TYPE: - retval = sizeof ( type1->paint_type ); - if ( value && value_len >= retval ) - *((FT_Byte *)value) = type1->paint_type; - break; - - case PS_DICT_FONT_NAME: - retval = ft_strlen( type1->font_name ) + 1; - if ( value && value_len >= retval ) - ft_memcpy( value, (void *)( type1->font_name ), retval ); - break; - - case PS_DICT_UNIQUE_ID: - retval = sizeof ( type1->private_dict.unique_id ); - if ( value && value_len >= retval ) - *((FT_Int *)value) = type1->private_dict.unique_id; - break; - - case PS_DICT_NUM_CHAR_STRINGS: - retval = sizeof ( type1->num_glyphs ); - if ( value && value_len >= retval ) - *((FT_Int *)value) = type1->num_glyphs; - break; - - case PS_DICT_CHAR_STRING_KEY: - if ( idx < (FT_UInt)type1->num_glyphs ) - { - retval = ft_strlen( type1->glyph_names[idx] ) + 1; - if ( value && value_len >= retval ) - { - ft_memcpy( value, (void *)( type1->glyph_names[idx] ), retval ); - ((FT_Char *)value)[retval - 1] = (FT_Char)'\0'; - } - } - break; - - case PS_DICT_CHAR_STRING: - if ( idx < (FT_UInt)type1->num_glyphs ) - { - retval = type1->charstrings_len[idx] + 1; - if ( value && value_len >= retval ) - { - ft_memcpy( value, (void *)( type1->charstrings[idx] ), - retval - 1 ); - ((FT_Char *)value)[retval - 1] = (FT_Char)'\0'; - } - } - break; - - case PS_DICT_ENCODING_TYPE: - retval = sizeof ( type1->encoding_type ); - if ( value && value_len >= retval ) - *((T1_EncodingType *)value) = type1->encoding_type; - break; - - case PS_DICT_ENCODING_ENTRY: - if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY && - idx < (FT_UInt)type1->encoding.num_chars ) - { - retval = ft_strlen( type1->encoding.char_name[idx] ) + 1; - if ( value && value_len >= retval ) - { - ft_memcpy( value, (void *)( type1->encoding.char_name[idx] ), - retval - 1 ); - ((FT_Char *)value)[retval - 1] = (FT_Char)'\0'; - } - } - break; - - case PS_DICT_NUM_SUBRS: - retval = sizeof ( type1->num_subrs ); - if ( value && value_len >= retval ) - *((FT_Int *)value) = type1->num_subrs; - break; - - case PS_DICT_SUBR: - if ( idx < (FT_UInt)type1->num_subrs ) - { - retval = type1->subrs_len[idx] + 1; - if ( value && value_len >= retval ) - { - ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 ); - ((FT_Char *)value)[retval - 1] = (FT_Char)'\0'; - } - } - break; - - case PS_DICT_STD_HW: - retval = sizeof ( type1->private_dict.standard_width[0] ); - if ( value && value_len >= retval ) - *((FT_UShort *)value) = type1->private_dict.standard_width[0]; - break; - - case PS_DICT_STD_VW: - retval = sizeof ( type1->private_dict.standard_height[0] ); - if ( value && value_len >= retval ) - *((FT_UShort *)value) = type1->private_dict.standard_height[0]; - break; - - case PS_DICT_NUM_BLUE_VALUES: - retval = sizeof ( type1->private_dict.num_blue_values ); - if ( value && value_len >= retval ) - *((FT_Byte *)value) = type1->private_dict.num_blue_values; - break; - - case PS_DICT_BLUE_VALUE: - if ( idx < type1->private_dict.num_blue_values ) - { - retval = sizeof ( type1->private_dict.blue_values[idx] ); - if ( value && value_len >= retval ) - *((FT_Short *)value) = type1->private_dict.blue_values[idx]; - } - break; - - case PS_DICT_BLUE_SCALE: - retval = sizeof ( type1->private_dict.blue_scale ); - if ( value && value_len >= retval ) - *((FT_Fixed *)value) = type1->private_dict.blue_scale; - break; - - case PS_DICT_BLUE_FUZZ: - retval = sizeof ( type1->private_dict.blue_fuzz ); - if ( value && value_len >= retval ) - *((FT_Int *)value) = type1->private_dict.blue_fuzz; - break; - - case PS_DICT_BLUE_SHIFT: - retval = sizeof ( type1->private_dict.blue_shift ); - if ( value && value_len >= retval ) - *((FT_Int *)value) = type1->private_dict.blue_shift; - break; - - case PS_DICT_NUM_OTHER_BLUES: - retval = sizeof ( type1->private_dict.num_other_blues ); - if ( value && value_len >= retval ) - *((FT_Byte *)value) = type1->private_dict.num_other_blues; - break; - - case PS_DICT_OTHER_BLUE: - if ( idx < type1->private_dict.num_other_blues ) - { - retval = sizeof ( type1->private_dict.other_blues[idx] ); - if ( value && value_len >= retval ) - *((FT_Short *)value) = type1->private_dict.other_blues[idx]; - } - break; - - case PS_DICT_NUM_FAMILY_BLUES: - retval = sizeof ( type1->private_dict.num_family_blues ); - if ( value && value_len >= retval ) - *((FT_Byte *)value) = type1->private_dict.num_family_blues; - break; - - case PS_DICT_FAMILY_BLUE: - if ( idx < type1->private_dict.num_family_blues ) - { - retval = sizeof ( type1->private_dict.family_blues[idx] ); - if ( value && value_len >= retval ) - *((FT_Short *)value) = type1->private_dict.family_blues[idx]; - } - break; - - case PS_DICT_NUM_FAMILY_OTHER_BLUES: - retval = sizeof ( type1->private_dict.num_family_other_blues ); - if ( value && value_len >= retval ) - *((FT_Byte *)value) = type1->private_dict.num_family_other_blues; - break; - - case PS_DICT_FAMILY_OTHER_BLUE: - if ( idx < type1->private_dict.num_family_other_blues ) - { - retval = sizeof ( type1->private_dict.family_other_blues[idx] ); - if ( value && value_len >= retval ) - *((FT_Short *)value) = type1->private_dict.family_other_blues[idx]; - } - break; - - case PS_DICT_NUM_STEM_SNAP_H: - retval = sizeof ( type1->private_dict.num_snap_widths ); - if ( value && value_len >= retval ) - *((FT_Byte *)value) = type1->private_dict.num_snap_widths; - break; - - case PS_DICT_STEM_SNAP_H: - if ( idx < type1->private_dict.num_snap_widths ) - { - retval = sizeof ( type1->private_dict.snap_widths[idx] ); - if ( value && value_len >= retval ) - *((FT_Short *)value) = type1->private_dict.snap_widths[idx]; - } - break; - - case PS_DICT_NUM_STEM_SNAP_V: - retval = sizeof ( type1->private_dict.num_snap_heights ); - if ( value && value_len >= retval ) - *((FT_Byte *)value) = type1->private_dict.num_snap_heights; - break; - - case PS_DICT_STEM_SNAP_V: - if ( idx < type1->private_dict.num_snap_heights ) - { - retval = sizeof ( type1->private_dict.snap_heights[idx] ); - if ( value && value_len >= retval ) - *((FT_Short *)value) = type1->private_dict.snap_heights[idx]; - } - break; - - case PS_DICT_RND_STEM_UP: - retval = sizeof ( type1->private_dict.round_stem_up ); - if ( value && value_len >= retval ) - *((FT_Bool *)value) = type1->private_dict.round_stem_up; - break; - - case PS_DICT_FORCE_BOLD: - retval = sizeof ( type1->private_dict.force_bold ); - if ( value && value_len >= retval ) - *((FT_Bool *)value) = type1->private_dict.force_bold; - break; - - case PS_DICT_MIN_FEATURE: - if ( idx < sizeof ( type1->private_dict.min_feature ) / - sizeof ( type1->private_dict.min_feature[0] ) ) - { - retval = sizeof ( type1->private_dict.min_feature[idx] ); - if ( value && value_len >= retval ) - *((FT_Short *)value) = type1->private_dict.min_feature[idx]; - } - break; - - case PS_DICT_LEN_IV: - retval = sizeof ( type1->private_dict.lenIV ); - if ( value && value_len >= retval ) - *((FT_Int *)value) = type1->private_dict.lenIV; - break; - - case PS_DICT_PASSWORD: - retval = sizeof ( type1->private_dict.password ); - if ( value && value_len >= retval ) - *((FT_Long *)value) = type1->private_dict.password; - break; - - case PS_DICT_LANGUAGE_GROUP: - retval = sizeof ( type1->private_dict.language_group ); - if ( value && value_len >= retval ) - *((FT_Long *)value) = type1->private_dict.language_group; - break; - - case PS_DICT_IS_FIXED_PITCH: - retval = sizeof ( type1->font_info.is_fixed_pitch ); - if ( value && value_len >= retval ) - *((FT_Bool *)value) = type1->font_info.is_fixed_pitch; - break; - - case PS_DICT_UNDERLINE_POSITION: - retval = sizeof ( type1->font_info.underline_position ); - if ( value && value_len >= retval ) - *((FT_Short *)value) = type1->font_info.underline_position; - break; - - case PS_DICT_UNDERLINE_THICKNESS: - retval = sizeof ( type1->font_info.underline_thickness ); - if ( value && value_len >= retval ) - *((FT_UShort *)value) = type1->font_info.underline_thickness; - break; - - case PS_DICT_FS_TYPE: - retval = sizeof ( type1->font_extra.fs_type ); - if ( value && value_len >= retval ) - *((FT_UShort *)value) = type1->font_extra.fs_type; - break; - - case PS_DICT_VERSION: - retval = ft_strlen( type1->font_info.version ) + 1; - if ( value && value_len >= retval ) - ft_memcpy( value, (void *)( type1->font_info.version ), retval ); - break; - - case PS_DICT_NOTICE: - retval = ft_strlen( type1->font_info.notice ) + 1; - if ( value && value_len >= retval ) - ft_memcpy( value, (void *)( type1->font_info.notice ), retval ); - break; - - case PS_DICT_FULL_NAME: - retval = ft_strlen( type1->font_info.full_name ) + 1; - if ( value && value_len >= retval ) - ft_memcpy( value, (void *)( type1->font_info.full_name ), retval ); - break; - - case PS_DICT_FAMILY_NAME: - retval = ft_strlen( type1->font_info.family_name ) + 1; - if ( value && value_len >= retval ) - ft_memcpy( value, (void *)( type1->font_info.family_name ), retval ); - break; - - case PS_DICT_WEIGHT: - retval = ft_strlen( type1->font_info.weight ) + 1; - if ( value && value_len >= retval ) - ft_memcpy( value, (void *)( type1->font_info.weight ), retval ); - break; - - case PS_DICT_ITALIC_ANGLE: - retval = sizeof ( type1->font_info.italic_angle ); - if ( value && value_len >= retval ) - *((FT_Long *)value) = type1->font_info.italic_angle; - break; - } - - return retval == 0 ? -1 : (FT_Long)retval; - } - - - static const FT_Service_PsInfoRec t1_service_ps_info = - { - (PS_GetFontInfoFunc) t1_ps_get_font_info, - (PS_GetFontExtraFunc) t1_ps_get_font_extra, - (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names, - (PS_GetFontPrivateFunc)t1_ps_get_font_private, - (PS_GetFontValueFunc) t1_ps_get_font_value, - }; - - -#ifndef T1_CONFIG_OPTION_NO_AFM - static const FT_Service_KerningRec t1_service_kerning = - { - T1_Get_Track_Kerning, - }; -#endif - - - /* - * SERVICE LIST - * - */ - - static const FT_ServiceDescRec t1_services[] = - { - { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name }, - { FT_SERVICE_ID_GLYPH_DICT, &t1_service_glyph_dict }, - { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TYPE_1 }, - { FT_SERVICE_ID_POSTSCRIPT_INFO, &t1_service_ps_info }, - -#ifndef T1_CONFIG_OPTION_NO_AFM - { FT_SERVICE_ID_KERNING, &t1_service_kerning }, -#endif - -#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT - { FT_SERVICE_ID_MULTI_MASTERS, &t1_service_multi_masters }, -#endif - { NULL, NULL } - }; - - - FT_CALLBACK_DEF( FT_Module_Interface ) - Get_Interface( FT_Module module, - const FT_String* t1_interface ) - { - FT_UNUSED( module ); - - return ft_service_list_lookup( t1_services, t1_interface ); - } - - -#ifndef T1_CONFIG_OPTION_NO_AFM - - /*************************************************************************/ - /* */ - /* */ - /* Get_Kerning */ - /* */ - /* */ - /* A driver method used to return the kerning vector between two */ - /* glyphs of the same face. */ - /* */ - /* */ - /* face :: A handle to the source face object. */ - /* */ - /* left_glyph :: The index of the left glyph in the kern pair. */ - /* */ - /* right_glyph :: The index of the right glyph in the kern pair. */ - /* */ - /* */ - /* kerning :: The kerning vector. This is in font units for */ - /* scalable formats, and in pixels for fixed-sizes */ - /* formats. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* */ - /* Only horizontal layouts (left-to-right & right-to-left) are */ - /* supported by this function. Other layouts, or more sophisticated */ - /* kernings are out of scope of this method (the basic driver */ - /* interface is meant to be simple). */ - /* */ - /* They can be implemented by format-specific interfaces. */ - /* */ - static FT_Error - Get_Kerning( FT_Face t1face, /* T1_Face */ - FT_UInt left_glyph, - FT_UInt right_glyph, - FT_Vector* kerning ) - { - T1_Face face = (T1_Face)t1face; - - - kerning->x = 0; - kerning->y = 0; - - if ( face->afm_data ) - T1_Get_Kerning( (AFM_FontInfo)face->afm_data, - left_glyph, - right_glyph, - kerning ); - - return FT_Err_Ok; - } - - -#endif /* T1_CONFIG_OPTION_NO_AFM */ - - - FT_CALLBACK_TABLE_DEF - const FT_Driver_ClassRec t1_driver_class = - { - { - FT_MODULE_FONT_DRIVER | - FT_MODULE_DRIVER_SCALABLE | - FT_MODULE_DRIVER_HAS_HINTER, - - sizeof ( FT_DriverRec ), - - "type1", - 0x10000L, - 0x20000L, - - 0, /* format interface */ - - T1_Driver_Init, - T1_Driver_Done, - Get_Interface, - }, - - sizeof ( T1_FaceRec ), - sizeof ( T1_SizeRec ), - sizeof ( T1_GlyphSlotRec ), - - T1_Face_Init, - T1_Face_Done, - T1_Size_Init, - T1_Size_Done, - T1_GlyphSlot_Init, - T1_GlyphSlot_Done, - - T1_Load_Glyph, - -#ifdef T1_CONFIG_OPTION_NO_AFM - 0, /* FT_Face_GetKerningFunc */ - 0, /* FT_Face_AttachFunc */ -#else - Get_Kerning, - T1_Read_Metrics, -#endif - T1_Get_Advances, - T1_Size_Request, - 0 /* FT_Size_SelectFunc */ - }; - - -/* END */ diff --git a/3party/freetype/src/type1/t1driver.h b/3party/freetype/src/type1/t1driver.h deleted file mode 100644 index 34bcf81ccf..0000000000 --- a/3party/freetype/src/type1/t1driver.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1driver.h */ -/* */ -/* High-level Type 1 driver interface (specification). */ -/* */ -/* Copyright 1996-2015 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 __T1DRIVER_H__ -#define __T1DRIVER_H__ - - -#include -#include FT_INTERNAL_DRIVER_H - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC -#error "this module does not support PIC yet" -#endif - - - FT_EXPORT_VAR( const FT_Driver_ClassRec ) t1_driver_class; - - -FT_END_HEADER - -#endif /* __T1DRIVER_H__ */ - - -/* END */ diff --git a/3party/freetype/src/type1/t1errors.h b/3party/freetype/src/type1/t1errors.h deleted file mode 100644 index fc7a9bd64e..0000000000 --- a/3party/freetype/src/type1/t1errors.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1errors.h */ -/* */ -/* Type 1 error codes (specification only). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the Type 1 error enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __T1ERRORS_H__ -#define __T1ERRORS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX T1_Err_ -#define FT_ERR_BASE FT_Mod_Err_Type1 - -#include FT_ERRORS_H - -#endif /* __T1ERRORS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/type1/t1gload.c b/3party/freetype/src/type1/t1gload.c deleted file mode 100644 index 85ada2ea6a..0000000000 --- a/3party/freetype/src/type1/t1gload.c +++ /dev/null @@ -1,521 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1gload.c */ -/* */ -/* Type 1 Glyph Loader (body). */ -/* */ -/* Copyright 1996-2015 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 "t1gload.h" -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_OUTLINE_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H - -#include "t1errors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_t1gload - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /********** *********/ - /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ - /********** *********/ - /********** The following code is in charge of computing *********/ - /********** the maximum advance width of the font. It *********/ - /********** quickly processes each glyph charstring to *********/ - /********** extract the value from either a `sbw' or `seac' *********/ - /********** operator. *********/ - /********** *********/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - static FT_Error - T1_Parse_Glyph_And_Get_Char_String( T1_Decoder decoder, - FT_UInt glyph_index, - FT_Data* char_string ) - { - T1_Face face = (T1_Face)decoder->builder.face; - T1_Font type1 = &face->type1; - FT_Error error = FT_Err_Ok; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - FT_Incremental_InterfaceRec *inc = - face->root.internal->incremental_interface; -#endif - - - decoder->font_matrix = type1->font_matrix; - decoder->font_offset = type1->font_offset; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - /* For incremental fonts get the character data using the */ - /* callback function. */ - if ( inc ) - error = inc->funcs->get_glyph_data( inc->object, - glyph_index, char_string ); - else - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - /* For ordinary fonts get the character data stored in the face record. */ - { - char_string->pointer = type1->charstrings[glyph_index]; - char_string->length = (FT_Int)type1->charstrings_len[glyph_index]; - } - - if ( !error ) - error = decoder->funcs.parse_charstrings( - decoder, (FT_Byte*)char_string->pointer, - (FT_UInt)char_string->length ); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - /* Incremental fonts can optionally override the metrics. */ - if ( !error && inc && inc->funcs->get_glyph_metrics ) - { - FT_Incremental_MetricsRec metrics; - - - metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x ); - metrics.bearing_y = 0; - metrics.advance = FIXED_TO_INT( decoder->builder.advance.x ); - metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y ); - - error = inc->funcs->get_glyph_metrics( inc->object, - glyph_index, FALSE, &metrics ); - - decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x ); - decoder->builder.advance.x = INT_TO_FIXED( metrics.advance ); - decoder->builder.advance.y = INT_TO_FIXED( metrics.advance_v ); - } - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - return error; - } - - - FT_CALLBACK_DEF( FT_Error ) - T1_Parse_Glyph( T1_Decoder decoder, - FT_UInt glyph_index ) - { - FT_Data glyph_data; - FT_Error error = T1_Parse_Glyph_And_Get_Char_String( - decoder, glyph_index, &glyph_data ); - - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - if ( !error ) - { - T1_Face face = (T1_Face)decoder->builder.face; - - - if ( face->root.internal->incremental_interface ) - face->root.internal->incremental_interface->funcs->free_glyph_data( - face->root.internal->incremental_interface->object, - &glyph_data ); - } - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - T1_Compute_Max_Advance( T1_Face face, - FT_Pos* max_advance ) - { - FT_Error error; - T1_DecoderRec decoder; - FT_Int glyph_index; - T1_Font type1 = &face->type1; - PSAux_Service psaux = (PSAux_Service)face->psaux; - - - FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); - - *max_advance = 0; - - /* initialize load decoder */ - error = psaux->t1_decoder_funcs->init( &decoder, - (FT_Face)face, - 0, /* size */ - 0, /* glyph slot */ - (FT_Byte**)type1->glyph_names, - face->blend, - 0, - FT_RENDER_MODE_NORMAL, - T1_Parse_Glyph ); - if ( error ) - return error; - - decoder.builder.metrics_only = 1; - decoder.builder.load_points = 0; - - decoder.num_subrs = type1->num_subrs; - decoder.subrs = type1->subrs; - decoder.subrs_len = type1->subrs_len; - - decoder.buildchar = face->buildchar; - decoder.len_buildchar = face->len_buildchar; - - *max_advance = 0; - - /* for each glyph, parse the glyph charstring and extract */ - /* the advance width */ - for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ ) - { - /* now get load the unscaled outline */ - (void)T1_Parse_Glyph( &decoder, (FT_UInt)glyph_index ); - if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance ) - *max_advance = decoder.builder.advance.x; - - /* ignore the error if one occurred - skip to next glyph */ - } - - psaux->t1_decoder_funcs->done( &decoder ); - - return FT_Err_Ok; - } - - - FT_LOCAL_DEF( FT_Error ) - T1_Get_Advances( FT_Face t1face, /* T1_Face */ - FT_UInt first, - FT_UInt count, - FT_Int32 load_flags, - FT_Fixed* advances ) - { - T1_Face face = (T1_Face)t1face; - T1_DecoderRec decoder; - T1_Font type1 = &face->type1; - PSAux_Service psaux = (PSAux_Service)face->psaux; - FT_UInt nn; - FT_Error error; - - - if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) - { - for ( nn = 0; nn < count; nn++ ) - advances[nn] = 0; - - return FT_Err_Ok; - } - - error = psaux->t1_decoder_funcs->init( &decoder, - (FT_Face)face, - 0, /* size */ - 0, /* glyph slot */ - (FT_Byte**)type1->glyph_names, - face->blend, - 0, - FT_RENDER_MODE_NORMAL, - T1_Parse_Glyph ); - if ( error ) - return error; - - decoder.builder.metrics_only = 1; - decoder.builder.load_points = 0; - - decoder.num_subrs = type1->num_subrs; - decoder.subrs = type1->subrs; - decoder.subrs_len = type1->subrs_len; - - decoder.buildchar = face->buildchar; - decoder.len_buildchar = face->len_buildchar; - - for ( nn = 0; nn < count; nn++ ) - { - error = T1_Parse_Glyph( &decoder, first + nn ); - if ( !error ) - advances[nn] = FIXED_TO_INT( decoder.builder.advance.x ); - else - advances[nn] = 0; - } - - return FT_Err_Ok; - } - - - FT_LOCAL_DEF( FT_Error ) - T1_Load_Glyph( FT_GlyphSlot t1glyph, /* T1_GlyphSlot */ - FT_Size t1size, /* T1_Size */ - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - T1_GlyphSlot glyph = (T1_GlyphSlot)t1glyph; - FT_Error error; - T1_DecoderRec decoder; - T1_Face face = (T1_Face)t1glyph->face; - FT_Bool hinting; - T1_Font type1 = &face->type1; - PSAux_Service psaux = (PSAux_Service)face->psaux; - const T1_Decoder_Funcs decoder_funcs = psaux->t1_decoder_funcs; - - FT_Matrix font_matrix; - FT_Vector font_offset; - FT_Data glyph_data; - FT_Bool must_finish_decoder = FALSE; -#ifdef FT_CONFIG_OPTION_INCREMENTAL - FT_Bool glyph_data_loaded = 0; -#endif - - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - if ( glyph_index >= (FT_UInt)face->root.num_glyphs && - !face->root.internal->incremental_interface ) -#else - if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - FT_TRACE1(( "T1_Load_Glyph: glyph index %d\n", glyph_index )); - - FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); - - if ( load_flags & FT_LOAD_NO_RECURSE ) - load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; - - if ( t1size ) - { - glyph->x_scale = t1size->metrics.x_scale; - glyph->y_scale = t1size->metrics.y_scale; - } - else - { - glyph->x_scale = 0x10000L; - glyph->y_scale = 0x10000L; - } - - t1glyph->outline.n_points = 0; - t1glyph->outline.n_contours = 0; - - hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 && - ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); - - t1glyph->format = FT_GLYPH_FORMAT_OUTLINE; - - error = decoder_funcs->init( &decoder, - t1glyph->face, - t1size, - t1glyph, - (FT_Byte**)type1->glyph_names, - face->blend, - FT_BOOL( hinting ), - FT_LOAD_TARGET_MODE( load_flags ), - T1_Parse_Glyph ); - if ( error ) - goto Exit; - - must_finish_decoder = TRUE; - - decoder.builder.no_recurse = FT_BOOL( - ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ); - - decoder.num_subrs = type1->num_subrs; - decoder.subrs = type1->subrs; - decoder.subrs_len = type1->subrs_len; - - decoder.buildchar = face->buildchar; - decoder.len_buildchar = face->len_buildchar; - - /* now load the unscaled outline */ - error = T1_Parse_Glyph_And_Get_Char_String( &decoder, glyph_index, - &glyph_data ); - if ( error ) - goto Exit; -#ifdef FT_CONFIG_OPTION_INCREMENTAL - glyph_data_loaded = 1; -#endif - - font_matrix = decoder.font_matrix; - font_offset = decoder.font_offset; - - /* save new glyph tables */ - decoder_funcs->done( &decoder ); - - must_finish_decoder = FALSE; - - /* now, set the metrics -- this is rather simple, as */ - /* the left side bearing is the xMin, and the top side */ - /* bearing the yMax */ - if ( !error ) - { - t1glyph->outline.flags &= FT_OUTLINE_OWNER; - t1glyph->outline.flags |= FT_OUTLINE_REVERSE_FILL; - - /* for composite glyphs, return only left side bearing and */ - /* advance width */ - if ( load_flags & FT_LOAD_NO_RECURSE ) - { - FT_Slot_Internal internal = t1glyph->internal; - - - t1glyph->metrics.horiBearingX = - FIXED_TO_INT( decoder.builder.left_bearing.x ); - t1glyph->metrics.horiAdvance = - FIXED_TO_INT( decoder.builder.advance.x ); - - internal->glyph_matrix = font_matrix; - internal->glyph_delta = font_offset; - internal->glyph_transformed = 1; - } - else - { - FT_BBox cbox; - FT_Glyph_Metrics* metrics = &t1glyph->metrics; - - - /* copy the _unscaled_ advance width */ - metrics->horiAdvance = - FIXED_TO_INT( decoder.builder.advance.x ); - t1glyph->linearHoriAdvance = - FIXED_TO_INT( decoder.builder.advance.x ); - t1glyph->internal->glyph_transformed = 0; - - if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) - { - /* make up vertical ones */ - metrics->vertAdvance = ( face->type1.font_bbox.yMax - - face->type1.font_bbox.yMin ) >> 16; - t1glyph->linearVertAdvance = metrics->vertAdvance; - } - else - { - metrics->vertAdvance = - FIXED_TO_INT( decoder.builder.advance.y ); - t1glyph->linearVertAdvance = - FIXED_TO_INT( decoder.builder.advance.y ); - } - - t1glyph->format = FT_GLYPH_FORMAT_OUTLINE; - - if ( t1size && t1size->metrics.y_ppem < 24 ) - t1glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; - -#if 1 - /* apply the font matrix, if any */ - if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L || - font_matrix.xy != 0 || font_matrix.yx != 0 ) - { - FT_Outline_Transform( &t1glyph->outline, &font_matrix ); - - metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, - font_matrix.xx ); - metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, - font_matrix.yy ); - } - - if ( font_offset.x || font_offset.y ) - { - FT_Outline_Translate( &t1glyph->outline, - font_offset.x, - font_offset.y ); - - metrics->horiAdvance += font_offset.x; - metrics->vertAdvance += font_offset.y; - } -#endif - - if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ) - { - /* scale the outline and the metrics */ - FT_Int n; - FT_Outline* cur = decoder.builder.base; - FT_Vector* vec = cur->points; - FT_Fixed x_scale = glyph->x_scale; - FT_Fixed y_scale = glyph->y_scale; - - - /* First of all, scale the points, if we are not hinting */ - if ( !hinting || ! decoder.builder.hints_funcs ) - for ( n = cur->n_points; n > 0; n--, vec++ ) - { - vec->x = FT_MulFix( vec->x, x_scale ); - vec->y = FT_MulFix( vec->y, y_scale ); - } - - /* Then scale the metrics */ - metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); - metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); - } - - /* compute the other metrics */ - FT_Outline_Get_CBox( &t1glyph->outline, &cbox ); - - metrics->width = cbox.xMax - cbox.xMin; - metrics->height = cbox.yMax - cbox.yMin; - - metrics->horiBearingX = cbox.xMin; - metrics->horiBearingY = cbox.yMax; - - if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) - { - /* make up vertical ones */ - ft_synthesize_vertical_metrics( metrics, - metrics->vertAdvance ); - } - } - - /* Set control data to the glyph charstrings. Note that this is */ - /* _not_ zero-terminated. */ - t1glyph->control_data = (FT_Byte*)glyph_data.pointer; - t1glyph->control_len = glyph_data.length; - } - - - Exit: - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - if ( glyph_data_loaded && face->root.internal->incremental_interface ) - { - face->root.internal->incremental_interface->funcs->free_glyph_data( - face->root.internal->incremental_interface->object, - &glyph_data ); - - /* Set the control data to null - it is no longer available if */ - /* loaded incrementally. */ - t1glyph->control_data = NULL; - t1glyph->control_len = 0; - } -#endif - - if ( must_finish_decoder ) - decoder_funcs->done( &decoder ); - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/type1/t1gload.h b/3party/freetype/src/type1/t1gload.h deleted file mode 100644 index 05f60d586a..0000000000 --- a/3party/freetype/src/type1/t1gload.h +++ /dev/null @@ -1,53 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1gload.h */ -/* */ -/* Type 1 Glyph Loader (specification). */ -/* */ -/* Copyright 1996-2015 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 __T1GLOAD_H__ -#define __T1GLOAD_H__ - - -#include -#include "t1objs.h" - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - T1_Compute_Max_Advance( T1_Face face, - FT_Pos* max_advance ); - - FT_LOCAL( FT_Error ) - T1_Get_Advances( FT_Face face, - FT_UInt first, - FT_UInt count, - FT_Int32 load_flags, - FT_Fixed* advances ); - - FT_LOCAL( FT_Error ) - T1_Load_Glyph( FT_GlyphSlot glyph, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ); - - -FT_END_HEADER - -#endif /* __T1GLOAD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/type1/t1load.c b/3party/freetype/src/type1/t1load.c deleted file mode 100644 index 630f057ec0..0000000000 --- a/3party/freetype/src/type1/t1load.c +++ /dev/null @@ -1,2278 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1load.c */ -/* */ -/* Type 1 font loader (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This is the new and improved Type 1 data loader for FreeType 2. The */ - /* old loader has several problems: it is slow, complex, difficult to */ - /* maintain, and contains incredible hacks to make it accept some */ - /* ill-formed Type 1 fonts without hiccup-ing. Moreover, about 5% of */ - /* the Type 1 fonts on my machine still aren't loaded correctly by it. */ - /* */ - /* This version is much simpler, much faster and also easier to read and */ - /* maintain by a great order of magnitude. The idea behind it is to */ - /* _not_ try to read the Type 1 token stream with a state machine (i.e. */ - /* a Postscript-like interpreter) but rather to perform simple pattern */ - /* matching. */ - /* */ - /* Indeed, nearly all data definitions follow a simple pattern like */ - /* */ - /* ... /Field ... */ - /* */ - /* where can be a number, a boolean, a string, or an array of */ - /* numbers. There are a few exceptions, namely the encoding, font name, */ - /* charstrings, and subrs; they are handled with a special pattern */ - /* matching routine. */ - /* */ - /* All other common cases are handled very simply. The matching rules */ - /* are defined in the file `t1tokens.h' through the use of several */ - /* macros calls PARSE_XXX. This file is included twice here; the first */ - /* time to generate parsing callback functions, the second time to */ - /* generate a table of keywords (with pointers to the associated */ - /* callback functions). */ - /* */ - /* The function `parse_dict' simply scans *linearly* a given dictionary */ - /* (either the top-level or private one) and calls the appropriate */ - /* callback when it encounters an immediate keyword. */ - /* */ - /* This is by far the fastest way one can find to parse and read all */ - /* data. */ - /* */ - /* This led to tremendous code size reduction. Note that later, the */ - /* glyph loader will also be _greatly_ simplified, and the automatic */ - /* hinter will replace the clumsy `t1hinter'. */ - /* */ - /*************************************************************************/ - - -#include -#include FT_INTERNAL_DEBUG_H -#include FT_CONFIG_CONFIG_H -#include FT_MULTIPLE_MASTERS_H -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_CALC_H - -#include "t1load.h" -#include "t1errors.h" - - -#ifdef FT_CONFIG_OPTION_INCREMENTAL -#define IS_INCREMENTAL (FT_Bool)( face->root.internal->incremental_interface != 0 ) -#else -#define IS_INCREMENTAL 0 -#endif - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_t1load - - -#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** MULTIPLE MASTERS SUPPORT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static FT_Error - t1_allocate_blend( T1_Face face, - FT_UInt num_designs, - FT_UInt num_axis ) - { - PS_Blend blend; - FT_Memory memory = face->root.memory; - FT_Error error = FT_Err_Ok; - - - blend = face->blend; - if ( !blend ) - { - if ( FT_NEW( blend ) ) - goto Exit; - - blend->num_default_design_vector = 0; - - face->blend = blend; - } - - /* allocate design data if needed */ - if ( num_designs > 0 ) - { - if ( blend->num_designs == 0 ) - { - FT_UInt nn; - - - /* allocate the blend `private' and `font_info' dictionaries */ - if ( FT_NEW_ARRAY( blend->font_infos[1], num_designs ) || - FT_NEW_ARRAY( blend->privates [1], num_designs ) || - FT_NEW_ARRAY( blend->bboxes [1], num_designs ) || - FT_NEW_ARRAY( blend->weight_vector, num_designs * 2 ) ) - goto Exit; - - blend->default_weight_vector = blend->weight_vector + num_designs; - - blend->font_infos[0] = &face->type1.font_info; - blend->privates [0] = &face->type1.private_dict; - blend->bboxes [0] = &face->type1.font_bbox; - - for ( nn = 2; nn <= num_designs; nn++ ) - { - blend->font_infos[nn] = blend->font_infos[nn - 1] + 1; - blend->privates [nn] = blend->privates [nn - 1] + 1; - blend->bboxes [nn] = blend->bboxes [nn - 1] + 1; - } - - blend->num_designs = num_designs; - } - else if ( blend->num_designs != num_designs ) - goto Fail; - } - - /* allocate axis data if needed */ - if ( num_axis > 0 ) - { - if ( blend->num_axis != 0 && blend->num_axis != num_axis ) - goto Fail; - - blend->num_axis = num_axis; - } - - /* allocate the blend design pos table if needed */ - num_designs = blend->num_designs; - num_axis = blend->num_axis; - if ( num_designs && num_axis && blend->design_pos[0] == 0 ) - { - FT_UInt n; - - - if ( FT_NEW_ARRAY( blend->design_pos[0], num_designs * num_axis ) ) - goto Exit; - - for ( n = 1; n < num_designs; n++ ) - blend->design_pos[n] = blend->design_pos[0] + num_axis * n; - } - - Exit: - return error; - - Fail: - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - - FT_LOCAL_DEF( FT_Error ) - T1_Get_Multi_Master( T1_Face face, - FT_Multi_Master* master ) - { - PS_Blend blend = face->blend; - FT_UInt n; - FT_Error error; - - - error = FT_THROW( Invalid_Argument ); - - if ( blend ) - { - master->num_axis = blend->num_axis; - master->num_designs = blend->num_designs; - - for ( n = 0; n < blend->num_axis; n++ ) - { - FT_MM_Axis* axis = master->axis + n; - PS_DesignMap map = blend->design_map + n; - - - axis->name = blend->axis_names[n]; - axis->minimum = map->design_points[0]; - axis->maximum = map->design_points[map->num_points - 1]; - } - - error = FT_Err_Ok; - } - - return error; - } - - - /*************************************************************************/ - /* */ - /* Given a normalized (blend) coordinate, figure out the design */ - /* coordinate appropriate for that value. */ - /* */ - static FT_Fixed - mm_axis_unmap( PS_DesignMap axismap, - FT_Fixed ncv ) - { - int j; - - - if ( ncv <= axismap->blend_points[0] ) - return INT_TO_FIXED( axismap->design_points[0] ); - - for ( j = 1; j < axismap->num_points; ++j ) - { - if ( ncv <= axismap->blend_points[j] ) - return INT_TO_FIXED( axismap->design_points[j - 1] ) + - ( axismap->design_points[j] - axismap->design_points[j - 1] ) * - FT_DivFix( ncv - axismap->blend_points[j - 1], - axismap->blend_points[j] - - axismap->blend_points[j - 1] ); - } - - return INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] ); - } - - - /*************************************************************************/ - /* */ - /* Given a vector of weights, one for each design, figure out the */ - /* normalized axis coordinates which gave rise to those weights. */ - /* */ - static void - mm_weights_unmap( FT_Fixed* weights, - FT_Fixed* axiscoords, - FT_UInt axis_count ) - { - FT_ASSERT( axis_count <= T1_MAX_MM_AXIS ); - - if ( axis_count == 1 ) - axiscoords[0] = weights[1]; - - else if ( axis_count == 2 ) - { - axiscoords[0] = weights[3] + weights[1]; - axiscoords[1] = weights[3] + weights[2]; - } - - else if ( axis_count == 3 ) - { - axiscoords[0] = weights[7] + weights[5] + weights[3] + weights[1]; - axiscoords[1] = weights[7] + weights[6] + weights[3] + weights[2]; - axiscoords[2] = weights[7] + weights[6] + weights[5] + weights[4]; - } - - else - { - axiscoords[0] = weights[15] + weights[13] + weights[11] + weights[9] + - weights[7] + weights[5] + weights[3] + weights[1]; - axiscoords[1] = weights[15] + weights[14] + weights[11] + weights[10] + - weights[7] + weights[6] + weights[3] + weights[2]; - axiscoords[2] = weights[15] + weights[14] + weights[13] + weights[12] + - weights[7] + weights[6] + weights[5] + weights[4]; - axiscoords[3] = weights[15] + weights[14] + weights[13] + weights[12] + - weights[11] + weights[10] + weights[9] + weights[8]; - } - } - - - /*************************************************************************/ - /* */ - /* Just a wrapper around T1_Get_Multi_Master to support the different */ - /* arguments needed by the GX var distortable fonts. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - T1_Get_MM_Var( T1_Face face, - FT_MM_Var* *master ) - { - FT_Memory memory = face->root.memory; - FT_MM_Var *mmvar = NULL; - FT_Multi_Master mmaster; - FT_Error error; - FT_UInt i; - FT_Fixed axiscoords[T1_MAX_MM_AXIS]; - PS_Blend blend = face->blend; - - - error = T1_Get_Multi_Master( face, &mmaster ); - if ( error ) - goto Exit; - if ( FT_ALLOC( mmvar, - sizeof ( FT_MM_Var ) + - mmaster.num_axis * sizeof ( FT_Var_Axis ) ) ) - goto Exit; - - mmvar->num_axis = mmaster.num_axis; - mmvar->num_designs = mmaster.num_designs; - mmvar->num_namedstyles = ~0U; /* Does not apply */ - mmvar->axis = (FT_Var_Axis*)&mmvar[1]; - /* Point to axes after MM_Var struct */ - mmvar->namedstyle = NULL; - - for ( i = 0 ; i < mmaster.num_axis; ++i ) - { - mmvar->axis[i].name = mmaster.axis[i].name; - mmvar->axis[i].minimum = INT_TO_FIXED( mmaster.axis[i].minimum); - mmvar->axis[i].maximum = INT_TO_FIXED( mmaster.axis[i].maximum); - mmvar->axis[i].def = ( mmvar->axis[i].minimum + - mmvar->axis[i].maximum ) / 2; - /* Does not apply. But this value is in range */ - mmvar->axis[i].strid = ~0U; /* Does not apply */ - mmvar->axis[i].tag = ~0U; /* Does not apply */ - - if ( ft_strcmp( mmvar->axis[i].name, "Weight" ) == 0 ) - mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'g', 'h', 't' ); - else if ( ft_strcmp( mmvar->axis[i].name, "Width" ) == 0 ) - mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'd', 't', 'h' ); - else if ( ft_strcmp( mmvar->axis[i].name, "OpticalSize" ) == 0 ) - mmvar->axis[i].tag = FT_MAKE_TAG( 'o', 'p', 's', 'z' ); - } - - if ( blend->num_designs == ( 1U << blend->num_axis ) ) - { - mm_weights_unmap( blend->default_weight_vector, - axiscoords, - blend->num_axis ); - - for ( i = 0; i < mmaster.num_axis; ++i ) - mmvar->axis[i].def = mm_axis_unmap( &blend->design_map[i], - axiscoords[i] ); - } - - *master = mmvar; - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - T1_Set_MM_Blend( T1_Face face, - FT_UInt num_coords, - FT_Fixed* coords ) - { - PS_Blend blend = face->blend; - FT_UInt n, m; - - - if ( !blend ) - return FT_THROW( Invalid_Argument ); - - if ( num_coords > blend->num_axis ) - num_coords = blend->num_axis; - - /* recompute the weight vector from the blend coordinates */ - for ( n = 0; n < blend->num_designs; n++ ) - { - FT_Fixed result = 0x10000L; /* 1.0 fixed */ - - - for ( m = 0; m < blend->num_axis; m++ ) - { - FT_Fixed factor; - - - /* get current blend axis position; */ - /* use a default value if we don't have a coordinate */ - factor = m < num_coords ? coords[m] : 0x8000; - if ( factor < 0 ) - factor = 0; - if ( factor > 0x10000L ) - factor = 0x10000L; - - if ( ( n & ( 1 << m ) ) == 0 ) - factor = 0x10000L - factor; - - result = FT_MulFix( result, factor ); - } - blend->weight_vector[n] = result; - } - - return FT_Err_Ok; - } - - - FT_LOCAL_DEF( FT_Error ) - T1_Set_MM_Design( T1_Face face, - FT_UInt num_coords, - FT_Long* coords ) - { - PS_Blend blend = face->blend; - FT_UInt n, p; - FT_Fixed final_blends[T1_MAX_MM_DESIGNS]; - - - if ( !blend ) - return FT_THROW( Invalid_Argument ); - - if ( num_coords > blend->num_axis ) - num_coords = blend->num_axis; - - /* compute the blend coordinates through the blend design map */ - - for ( n = 0; n < blend->num_axis; n++ ) - { - FT_Long design; - FT_Fixed the_blend; - PS_DesignMap map = blend->design_map + n; - FT_Long* designs = map->design_points; - FT_Fixed* blends = map->blend_points; - FT_Int before = -1, after = -1; - - - /* use a default value if we don't have a coordinate */ - if ( n < num_coords ) - design = coords[n]; - else - design = ( designs[map->num_points - 1] - designs[0] ) / 2; - - for ( p = 0; p < (FT_UInt)map->num_points; p++ ) - { - FT_Long p_design = designs[p]; - - - /* exact match? */ - if ( design == p_design ) - { - the_blend = blends[p]; - goto Found; - } - - if ( design < p_design ) - { - after = (FT_Int)p; - break; - } - - before = (FT_Int)p; - } - - /* now interpolate if necessary */ - if ( before < 0 ) - the_blend = blends[0]; - - else if ( after < 0 ) - the_blend = blends[map->num_points - 1]; - - else - the_blend = FT_MulDiv( design - designs[before], - blends [after] - blends [before], - designs[after] - designs[before] ); - - Found: - final_blends[n] = the_blend; - } - - return T1_Set_MM_Blend( face, blend->num_axis, final_blends ); - } - - - /*************************************************************************/ - /* */ - /* Just a wrapper around T1_Set_MM_Design to support the different */ - /* arguments needed by the GX var distortable fonts. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - T1_Set_Var_Design( T1_Face face, - FT_UInt num_coords, - FT_Fixed* coords ) - { - FT_Long lcoords[T1_MAX_MM_AXIS]; - FT_UInt i; - - - if ( num_coords > T1_MAX_MM_AXIS ) - num_coords = T1_MAX_MM_AXIS; - - for ( i = 0; i < num_coords; ++i ) - lcoords[i] = FIXED_TO_INT( coords[i] ); - - return T1_Set_MM_Design( face, num_coords, lcoords ); - } - - - FT_LOCAL_DEF( void ) - T1_Done_Blend( T1_Face face ) - { - FT_Memory memory = face->root.memory; - PS_Blend blend = face->blend; - - - if ( blend ) - { - FT_UInt num_designs = blend->num_designs; - FT_UInt num_axis = blend->num_axis; - FT_UInt n; - - - /* release design pos table */ - FT_FREE( blend->design_pos[0] ); - for ( n = 1; n < num_designs; n++ ) - blend->design_pos[n] = NULL; - - /* release blend `private' and `font info' dictionaries */ - FT_FREE( blend->privates[1] ); - FT_FREE( blend->font_infos[1] ); - FT_FREE( blend->bboxes[1] ); - - for ( n = 0; n < num_designs; n++ ) - { - blend->privates [n] = NULL; - blend->font_infos[n] = NULL; - blend->bboxes [n] = NULL; - } - - /* release weight vectors */ - FT_FREE( blend->weight_vector ); - blend->default_weight_vector = NULL; - - /* release axis names */ - for ( n = 0; n < num_axis; n++ ) - FT_FREE( blend->axis_names[n] ); - - /* release design map */ - for ( n = 0; n < num_axis; n++ ) - { - PS_DesignMap dmap = blend->design_map + n; - - - FT_FREE( dmap->design_points ); - dmap->num_points = 0; - } - - FT_FREE( face->blend ); - } - } - - - static void - parse_blend_axis_types( T1_Face face, - T1_Loader loader ) - { - T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; - FT_Int n, num_axis; - FT_Error error = FT_Err_Ok; - PS_Blend blend; - FT_Memory memory; - - - /* take an array of objects */ - T1_ToTokenArray( &loader->parser, axis_tokens, - T1_MAX_MM_AXIS, &num_axis ); - if ( num_axis < 0 ) - { - error = FT_ERR( Ignore ); - goto Exit; - } - if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS ) - { - FT_ERROR(( "parse_blend_axis_types: incorrect number of axes: %d\n", - num_axis )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* allocate blend if necessary */ - error = t1_allocate_blend( face, 0, (FT_UInt)num_axis ); - if ( error ) - goto Exit; - - blend = face->blend; - memory = face->root.memory; - - /* each token is an immediate containing the name of the axis */ - for ( n = 0; n < num_axis; n++ ) - { - T1_Token token = axis_tokens + n; - FT_Byte* name; - FT_UInt len; - - - /* skip first slash, if any */ - if ( token->start[0] == '/' ) - token->start++; - - len = (FT_UInt)( token->limit - token->start ); - if ( len == 0 ) - { - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - if ( FT_ALLOC( blend->axis_names[n], len + 1 ) ) - goto Exit; - - name = (FT_Byte*)blend->axis_names[n]; - FT_MEM_COPY( name, token->start, len ); - name[len] = '\0'; - } - - Exit: - loader->parser.root.error = error; - } - - - static void - parse_blend_design_positions( T1_Face face, - T1_Loader loader ) - { - T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS]; - FT_Int num_designs; - FT_Int num_axis; - T1_Parser parser = &loader->parser; - - FT_Error error = FT_Err_Ok; - PS_Blend blend; - - - /* get the array of design tokens -- compute number of designs */ - T1_ToTokenArray( parser, design_tokens, - T1_MAX_MM_DESIGNS, &num_designs ); - if ( num_designs < 0 ) - { - error = FT_ERR( Ignore ); - goto Exit; - } - if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS ) - { - FT_ERROR(( "parse_blend_design_positions:" - " incorrect number of designs: %d\n", - num_designs )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - { - FT_Byte* old_cursor = parser->root.cursor; - FT_Byte* old_limit = parser->root.limit; - FT_Int n; - - - blend = face->blend; - num_axis = 0; /* make compiler happy */ - - for ( n = 0; n < num_designs; n++ ) - { - T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; - T1_Token token; - FT_Int axis, n_axis; - - - /* read axis/coordinates tokens */ - token = design_tokens + n; - parser->root.cursor = token->start; - parser->root.limit = token->limit; - T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &n_axis ); - - if ( n == 0 ) - { - if ( n_axis <= 0 || n_axis > T1_MAX_MM_AXIS ) - { - FT_ERROR(( "parse_blend_design_positions:" - " invalid number of axes: %d\n", - n_axis )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - num_axis = n_axis; - error = t1_allocate_blend( face, - (FT_UInt)num_designs, - (FT_UInt)num_axis ); - if ( error ) - goto Exit; - blend = face->blend; - } - else if ( n_axis != num_axis ) - { - FT_ERROR(( "parse_blend_design_positions: incorrect table\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* now read each axis token into the design position */ - for ( axis = 0; axis < n_axis; axis++ ) - { - T1_Token token2 = axis_tokens + axis; - - - parser->root.cursor = token2->start; - parser->root.limit = token2->limit; - blend->design_pos[n][axis] = T1_ToFixed( parser, 0 ); - } - } - - loader->parser.root.cursor = old_cursor; - loader->parser.root.limit = old_limit; - } - - Exit: - loader->parser.root.error = error; - } - - - static void - parse_blend_design_map( T1_Face face, - T1_Loader loader ) - { - FT_Error error = FT_Err_Ok; - T1_Parser parser = &loader->parser; - PS_Blend blend; - T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; - FT_Int n, num_axis; - FT_Byte* old_cursor; - FT_Byte* old_limit; - FT_Memory memory = face->root.memory; - - - T1_ToTokenArray( parser, axis_tokens, - T1_MAX_MM_AXIS, &num_axis ); - if ( num_axis < 0 ) - { - error = FT_ERR( Ignore ); - goto Exit; - } - if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS ) - { - FT_ERROR(( "parse_blend_design_map: incorrect number of axes: %d\n", - num_axis )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - old_cursor = parser->root.cursor; - old_limit = parser->root.limit; - - error = t1_allocate_blend( face, 0, (FT_UInt)num_axis ); - if ( error ) - goto Exit; - blend = face->blend; - - /* now read each axis design map */ - for ( n = 0; n < num_axis; n++ ) - { - PS_DesignMap map = blend->design_map + n; - T1_Token axis_token; - T1_TokenRec point_tokens[T1_MAX_MM_MAP_POINTS]; - FT_Int p, num_points; - - - axis_token = axis_tokens + n; - - parser->root.cursor = axis_token->start; - parser->root.limit = axis_token->limit; - T1_ToTokenArray( parser, point_tokens, - T1_MAX_MM_MAP_POINTS, &num_points ); - - if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS ) - { - FT_ERROR(( "parse_blend_design_map: incorrect table\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* allocate design map data */ - if ( FT_NEW_ARRAY( map->design_points, num_points * 2 ) ) - goto Exit; - map->blend_points = map->design_points + num_points; - map->num_points = (FT_Byte)num_points; - - for ( p = 0; p < num_points; p++ ) - { - T1_Token point_token; - - - point_token = point_tokens + p; - - /* don't include delimiting brackets */ - parser->root.cursor = point_token->start + 1; - parser->root.limit = point_token->limit - 1; - - map->design_points[p] = T1_ToInt( parser ); - map->blend_points [p] = T1_ToFixed( parser, 0 ); - } - } - - parser->root.cursor = old_cursor; - parser->root.limit = old_limit; - - Exit: - parser->root.error = error; - } - - - static void - parse_weight_vector( T1_Face face, - T1_Loader loader ) - { - T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS]; - FT_Int num_designs; - FT_Error error = FT_Err_Ok; - T1_Parser parser = &loader->parser; - PS_Blend blend = face->blend; - T1_Token token; - FT_Int n; - FT_Byte* old_cursor; - FT_Byte* old_limit; - - - T1_ToTokenArray( parser, design_tokens, - T1_MAX_MM_DESIGNS, &num_designs ); - if ( num_designs < 0 ) - { - error = FT_ERR( Ignore ); - goto Exit; - } - if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS ) - { - FT_ERROR(( "parse_weight_vector:" - " incorrect number of designs: %d\n", - num_designs )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - if ( !blend || !blend->num_designs ) - { - error = t1_allocate_blend( face, (FT_UInt)num_designs, 0 ); - if ( error ) - goto Exit; - blend = face->blend; - } - else if ( blend->num_designs != (FT_UInt)num_designs ) - { - FT_ERROR(( "parse_weight_vector:" - " /BlendDesignPosition and /WeightVector have\n" - " " - " different number of elements\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - old_cursor = parser->root.cursor; - old_limit = parser->root.limit; - - for ( n = 0; n < num_designs; n++ ) - { - token = design_tokens + n; - parser->root.cursor = token->start; - parser->root.limit = token->limit; - - blend->default_weight_vector[n] = - blend->weight_vector[n] = T1_ToFixed( parser, 0 ); - } - - parser->root.cursor = old_cursor; - parser->root.limit = old_limit; - - Exit: - parser->root.error = error; - } - - - /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def */ - /* we're only interested in the number of array elements */ - static void - parse_buildchar( T1_Face face, - T1_Loader loader ) - { - face->len_buildchar = (FT_UInt)T1_ToFixedArray( &loader->parser, - 0, NULL, 0 ); - return; - } - - -#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */ - - - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE 1 SYMBOL PARSING *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static FT_Error - t1_load_keyword( T1_Face face, - T1_Loader loader, - const T1_Field field ) - { - FT_Error error; - void* dummy_object; - void** objects; - FT_UInt max_objects; - PS_Blend blend = face->blend; - - - if ( blend && blend->num_designs == 0 ) - blend = NULL; - - /* if the keyword has a dedicated callback, call it */ - if ( field->type == T1_FIELD_TYPE_CALLBACK ) - { - field->reader( (FT_Face)face, loader ); - error = loader->parser.root.error; - goto Exit; - } - - /* now, the keyword is either a simple field, or a table of fields; */ - /* we are now going to take care of it */ - switch ( field->location ) - { - case T1_FIELD_LOCATION_FONT_INFO: - dummy_object = &face->type1.font_info; - objects = &dummy_object; - max_objects = 0; - - if ( blend ) - { - objects = (void**)blend->font_infos; - max_objects = blend->num_designs; - } - break; - - case T1_FIELD_LOCATION_FONT_EXTRA: - dummy_object = &face->type1.font_extra; - objects = &dummy_object; - max_objects = 0; - break; - - case T1_FIELD_LOCATION_PRIVATE: - dummy_object = &face->type1.private_dict; - objects = &dummy_object; - max_objects = 0; - - if ( blend ) - { - objects = (void**)blend->privates; - max_objects = blend->num_designs; - } - break; - - case T1_FIELD_LOCATION_BBOX: - dummy_object = &face->type1.font_bbox; - objects = &dummy_object; - max_objects = 0; - - if ( blend ) - { - objects = (void**)blend->bboxes; - max_objects = blend->num_designs; - } - break; - - case T1_FIELD_LOCATION_LOADER: - dummy_object = loader; - objects = &dummy_object; - max_objects = 0; - break; - - case T1_FIELD_LOCATION_FACE: - dummy_object = face; - objects = &dummy_object; - max_objects = 0; - break; - -#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT - case T1_FIELD_LOCATION_BLEND: - dummy_object = face->blend; - objects = &dummy_object; - max_objects = 0; - break; -#endif - - default: - dummy_object = &face->type1; - objects = &dummy_object; - max_objects = 0; - } - - if ( *objects ) - { - if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY || - field->type == T1_FIELD_TYPE_FIXED_ARRAY ) - error = T1_Load_Field_Table( &loader->parser, field, - objects, max_objects, 0 ); - else - error = T1_Load_Field( &loader->parser, field, - objects, max_objects, 0 ); - } - else - { - FT_TRACE1(( "t1_load_keyword: ignoring keyword `%s'" - " which is not valid at this point\n" - " (probably due to missing keywords)\n", - field->ident )); - error = FT_Err_Ok; - } - - Exit: - return error; - } - - - static void - parse_private( T1_Face face, - T1_Loader loader ) - { - FT_UNUSED( face ); - - loader->keywords_encountered |= T1_PRIVATE; - } - - - /* return 1 in case of success */ - - static int - read_binary_data( T1_Parser parser, - FT_ULong* size, - FT_Byte** base, - FT_Bool incremental ) - { - FT_Byte* cur; - FT_Byte* limit = parser->root.limit; - - - /* the binary data has one of the following formats */ - /* */ - /* `size' [white*] RD white ....... ND */ - /* `size' [white*] -| white ....... |- */ - /* */ - - T1_Skip_Spaces( parser ); - - cur = parser->root.cursor; - - if ( cur < limit && ft_isdigit( *cur ) ) - { - FT_Long s = T1_ToInt( parser ); - - - T1_Skip_PS_Token( parser ); /* `RD' or `-|' or something else */ - - /* there is only one whitespace char after the */ - /* `RD' or `-|' token */ - *base = parser->root.cursor + 1; - - if ( s >= 0 && s < limit - *base ) - { - parser->root.cursor += s + 1; - *size = (FT_ULong)s; - return !parser->root.error; - } - } - - if( !incremental ) - { - FT_ERROR(( "read_binary_data: invalid size field\n" )); - parser->root.error = FT_THROW( Invalid_File_Format ); - } - - return 0; - } - - - /* We now define the routines to handle the `/Encoding', `/Subrs', */ - /* and `/CharStrings' dictionaries. */ - - static void - t1_parse_font_matrix( T1_Face face, - T1_Loader loader ) - { - T1_Parser parser = &loader->parser; - FT_Matrix* matrix = &face->type1.font_matrix; - FT_Vector* offset = &face->type1.font_offset; - FT_Face root = (FT_Face)&face->root; - FT_Fixed temp[6]; - FT_Fixed temp_scale; - FT_Int result; - - - /* input is scaled by 1000 to accommodate default FontMatrix */ - result = T1_ToFixedArray( parser, 6, temp, 3 ); - - if ( result < 6 ) - { - parser->root.error = FT_THROW( Invalid_File_Format ); - return; - } - - temp_scale = FT_ABS( temp[3] ); - - if ( temp_scale == 0 ) - { - FT_ERROR(( "t1_parse_font_matrix: invalid font matrix\n" )); - parser->root.error = FT_THROW( Invalid_File_Format ); - return; - } - - /* atypical case */ - if ( temp_scale != 0x10000L ) - { - /* set units per EM based on FontMatrix values */ - root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale ); - - temp[0] = FT_DivFix( temp[0], temp_scale ); - temp[1] = FT_DivFix( temp[1], temp_scale ); - temp[2] = FT_DivFix( temp[2], temp_scale ); - temp[4] = FT_DivFix( temp[4], temp_scale ); - temp[5] = FT_DivFix( temp[5], temp_scale ); - temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L; - } - - matrix->xx = temp[0]; - matrix->yx = temp[1]; - matrix->xy = temp[2]; - matrix->yy = temp[3]; - - /* note that the offsets must be expressed in integer font units */ - offset->x = temp[4] >> 16; - offset->y = temp[5] >> 16; - } - - - static void - parse_encoding( T1_Face face, - T1_Loader loader ) - { - T1_Parser parser = &loader->parser; - FT_Byte* cur; - FT_Byte* limit = parser->root.limit; - - PSAux_Service psaux = (PSAux_Service)face->psaux; - - - T1_Skip_Spaces( parser ); - cur = parser->root.cursor; - if ( cur >= limit ) - { - FT_ERROR(( "parse_encoding: out of bounds\n" )); - parser->root.error = FT_THROW( Invalid_File_Format ); - return; - } - - /* if we have a number or `[', the encoding is an array, */ - /* and we must load it now */ - if ( ft_isdigit( *cur ) || *cur == '[' ) - { - T1_Encoding encode = &face->type1.encoding; - FT_Int count, n; - PS_Table char_table = &loader->encoding_table; - FT_Memory memory = parser->root.memory; - FT_Error error; - FT_Bool only_immediates = 0; - - - /* read the number of entries in the encoding; should be 256 */ - if ( *cur == '[' ) - { - count = 256; - only_immediates = 1; - parser->root.cursor++; - } - else - count = (FT_Int)T1_ToInt( parser ); - - T1_Skip_Spaces( parser ); - if ( parser->root.cursor >= limit ) - return; - - /* we use a T1_Table to store our charnames */ - loader->num_chars = encode->num_chars = count; - if ( FT_NEW_ARRAY( encode->char_index, count ) || - FT_NEW_ARRAY( encode->char_name, count ) || - FT_SET_ERROR( psaux->ps_table_funcs->init( - char_table, count, memory ) ) ) - { - parser->root.error = error; - return; - } - - /* We need to `zero' out encoding_table.elements */ - for ( n = 0; n < count; n++ ) - { - char* notdef = (char *)".notdef"; - - - (void)T1_Add_Table( char_table, n, notdef, 8 ); - } - - /* Now we need to read records of the form */ - /* */ - /* ... charcode /charname ... */ - /* */ - /* for each entry in our table. */ - /* */ - /* We simply look for a number followed by an immediate */ - /* name. Note that this ignores correctly the sequence */ - /* that is often seen in type1 fonts: */ - /* */ - /* 0 1 255 { 1 index exch /.notdef put } for dup */ - /* */ - /* used to clean the encoding array before anything else. */ - /* */ - /* Alternatively, if the array is directly given as */ - /* */ - /* /Encoding [ ... ] */ - /* */ - /* we only read immediates. */ - - n = 0; - T1_Skip_Spaces( parser ); - - while ( parser->root.cursor < limit ) - { - cur = parser->root.cursor; - - /* we stop when we encounter a `def' or `]' */ - if ( *cur == 'd' && cur + 3 < limit ) - { - if ( cur[1] == 'e' && - cur[2] == 'f' && - IS_PS_DELIM( cur[3] ) ) - { - FT_TRACE6(( "encoding end\n" )); - cur += 3; - break; - } - } - if ( *cur == ']' ) - { - FT_TRACE6(( "encoding end\n" )); - cur++; - break; - } - - /* check whether we've found an entry */ - if ( ft_isdigit( *cur ) || only_immediates ) - { - FT_Int charcode; - - - if ( only_immediates ) - charcode = n; - else - { - charcode = (FT_Int)T1_ToInt( parser ); - T1_Skip_Spaces( parser ); - - /* protect against invalid charcode */ - if ( cur == parser->root.cursor ) - { - parser->root.error = FT_THROW( Unknown_File_Format ); - return; - } - } - - cur = parser->root.cursor; - - if ( cur + 2 < limit && *cur == '/' && n < count ) - { - FT_UInt len; - - - cur++; - - parser->root.cursor = cur; - T1_Skip_PS_Token( parser ); - if ( parser->root.cursor >= limit ) - return; - if ( parser->root.error ) - return; - - len = (FT_UInt)( parser->root.cursor - cur ); - - parser->root.error = T1_Add_Table( char_table, charcode, - cur, len + 1 ); - if ( parser->root.error ) - return; - char_table->elements[charcode][len] = '\0'; - - n++; - } - else if ( only_immediates ) - { - /* Since the current position is not updated for */ - /* immediates-only mode we would get an infinite loop if */ - /* we don't do anything here. */ - /* */ - /* This encoding array is not valid according to the type1 */ - /* specification (it might be an encoding for a CID type1 */ - /* font, however), so we conclude that this font is NOT a */ - /* type1 font. */ - parser->root.error = FT_THROW( Unknown_File_Format ); - return; - } - } - else - { - T1_Skip_PS_Token( parser ); - if ( parser->root.error ) - return; - } - - T1_Skip_Spaces( parser ); - } - - face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; - parser->root.cursor = cur; - } - - /* Otherwise, we should have either `StandardEncoding', */ - /* `ExpertEncoding', or `ISOLatin1Encoding' */ - else - { - if ( cur + 17 < limit && - ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 ) - face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD; - - else if ( cur + 15 < limit && - ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 ) - face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT; - - else if ( cur + 18 < limit && - ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 ) - face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; - - else - parser->root.error = FT_ERR( Ignore ); - } - } - - - static void - parse_subrs( T1_Face face, - T1_Loader loader ) - { - T1_Parser parser = &loader->parser; - PS_Table table = &loader->subrs; - FT_Memory memory = parser->root.memory; - FT_Error error; - FT_Int num_subrs; - - PSAux_Service psaux = (PSAux_Service)face->psaux; - - - T1_Skip_Spaces( parser ); - - /* test for empty array */ - if ( parser->root.cursor < parser->root.limit && - *parser->root.cursor == '[' ) - { - T1_Skip_PS_Token( parser ); - T1_Skip_Spaces ( parser ); - if ( parser->root.cursor >= parser->root.limit || - *parser->root.cursor != ']' ) - parser->root.error = FT_THROW( Invalid_File_Format ); - return; - } - - num_subrs = (FT_Int)T1_ToInt( parser ); - - /* position the parser right before the `dup' of the first subr */ - T1_Skip_PS_Token( parser ); /* `array' */ - if ( parser->root.error ) - return; - T1_Skip_Spaces( parser ); - - /* initialize subrs array -- with synthetic fonts it is possible */ - /* we get here twice */ - if ( !loader->num_subrs ) - { - error = psaux->ps_table_funcs->init( table, num_subrs, memory ); - if ( error ) - goto Fail; - } - - /* the format is simple: */ - /* */ - /* `index' + binary data */ - /* */ - for (;;) - { - FT_Long idx; - FT_ULong size; - FT_Byte* base; - - - /* If we are out of data, or if the next token isn't `dup', */ - /* we are done. */ - if ( parser->root.cursor + 4 >= parser->root.limit || - ft_strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 ) - break; - - T1_Skip_PS_Token( parser ); /* `dup' */ - - idx = T1_ToInt( parser ); - - if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) ) - return; - - /* The binary string is followed by one token, e.g. `NP' */ - /* (bound to `noaccess put') or by two separate tokens: */ - /* `noaccess' & `put'. We position the parser right */ - /* before the next `dup', if any. */ - T1_Skip_PS_Token( parser ); /* `NP' or `|' or `noaccess' */ - if ( parser->root.error ) - return; - T1_Skip_Spaces ( parser ); - - if ( parser->root.cursor + 4 < parser->root.limit && - ft_strncmp( (char*)parser->root.cursor, "put", 3 ) == 0 ) - { - T1_Skip_PS_Token( parser ); /* skip `put' */ - T1_Skip_Spaces ( parser ); - } - - /* with synthetic fonts it is possible we get here twice */ - if ( loader->num_subrs ) - continue; - - /* some fonts use a value of -1 for lenIV to indicate that */ - /* the charstrings are unencoded */ - /* */ - /* thanks to Tom Kacvinsky for pointing this out */ - /* */ - if ( face->type1.private_dict.lenIV >= 0 ) - { - FT_Byte* temp; - - - /* some fonts define empty subr records -- this is not totally */ - /* compliant to the specification (which says they should at */ - /* least contain a `return'), but we support them anyway */ - if ( size < (FT_ULong)face->type1.private_dict.lenIV ) - { - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - /* t1_decrypt() shouldn't write to base -- make temporary copy */ - if ( FT_ALLOC( temp, size ) ) - goto Fail; - FT_MEM_COPY( temp, base, size ); - psaux->t1_decrypt( temp, size, 4330 ); - size -= (FT_ULong)face->type1.private_dict.lenIV; - error = T1_Add_Table( table, (FT_Int)idx, - temp + face->type1.private_dict.lenIV, size ); - FT_FREE( temp ); - } - else - error = T1_Add_Table( table, (FT_Int)idx, base, size ); - if ( error ) - goto Fail; - } - - if ( !loader->num_subrs ) - loader->num_subrs = num_subrs; - - return; - - Fail: - parser->root.error = error; - } - - -#define TABLE_EXTEND 5 - - - static void - parse_charstrings( T1_Face face, - T1_Loader loader ) - { - T1_Parser parser = &loader->parser; - PS_Table code_table = &loader->charstrings; - PS_Table name_table = &loader->glyph_names; - PS_Table swap_table = &loader->swap_table; - FT_Memory memory = parser->root.memory; - FT_Error error; - - PSAux_Service psaux = (PSAux_Service)face->psaux; - - FT_Byte* cur; - FT_Byte* limit = parser->root.limit; - FT_Int n, num_glyphs; - FT_Int notdef_index = 0; - FT_Byte notdef_found = 0; - - - num_glyphs = (FT_Int)T1_ToInt( parser ); - if ( num_glyphs < 0 ) - { - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - /* some fonts like Optima-Oblique not only define the /CharStrings */ - /* array but access it also */ - if ( num_glyphs == 0 || parser->root.error ) - return; - - /* initialize tables, leaving space for addition of .notdef, */ - /* if necessary, and a few other glyphs to handle buggy */ - /* fonts which have more glyphs than specified. */ - - /* for some non-standard fonts like `Optima' which provides */ - /* different outlines depending on the resolution it is */ - /* possible to get here twice */ - if ( !loader->num_glyphs ) - { - error = psaux->ps_table_funcs->init( - code_table, num_glyphs + 1 + TABLE_EXTEND, memory ); - if ( error ) - goto Fail; - - error = psaux->ps_table_funcs->init( - name_table, num_glyphs + 1 + TABLE_EXTEND, memory ); - if ( error ) - goto Fail; - - /* Initialize table for swapping index notdef_index and */ - /* index 0 names and codes (if necessary). */ - - error = psaux->ps_table_funcs->init( swap_table, 4, memory ); - if ( error ) - goto Fail; - } - - n = 0; - - for (;;) - { - FT_ULong size; - FT_Byte* base; - - - /* the format is simple: */ - /* `/glyphname' + binary data */ - - T1_Skip_Spaces( parser ); - - cur = parser->root.cursor; - if ( cur >= limit ) - break; - - /* we stop when we find a `def' or `end' keyword */ - if ( cur + 3 < limit && IS_PS_DELIM( cur[3] ) ) - { - if ( cur[0] == 'd' && - cur[1] == 'e' && - cur[2] == 'f' ) - { - /* There are fonts which have this: */ - /* */ - /* /CharStrings 118 dict def */ - /* Private begin */ - /* CharStrings begin */ - /* ... */ - /* */ - /* To catch this we ignore `def' if */ - /* no charstring has actually been */ - /* seen. */ - if ( n ) - break; - } - - if ( cur[0] == 'e' && - cur[1] == 'n' && - cur[2] == 'd' ) - break; - } - - T1_Skip_PS_Token( parser ); - if ( parser->root.cursor >= limit ) - { - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - if ( parser->root.error ) - return; - - if ( *cur == '/' ) - { - FT_UInt len; - - - if ( cur + 2 >= limit ) - { - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - cur++; /* skip `/' */ - len = (FT_UInt)( parser->root.cursor - cur ); - - if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) ) - return; - - /* for some non-standard fonts like `Optima' which provides */ - /* different outlines depending on the resolution it is */ - /* possible to get here twice */ - if ( loader->num_glyphs ) - continue; - - error = T1_Add_Table( name_table, n, cur, len + 1 ); - if ( error ) - goto Fail; - - /* add a trailing zero to the name table */ - name_table->elements[n][len] = '\0'; - - /* record index of /.notdef */ - if ( *cur == '.' && - ft_strcmp( ".notdef", - (const char*)(name_table->elements[n]) ) == 0 ) - { - notdef_index = n; - notdef_found = 1; - } - - if ( face->type1.private_dict.lenIV >= 0 && - n < num_glyphs + TABLE_EXTEND ) - { - FT_Byte* temp; - - - if ( size <= (FT_ULong)face->type1.private_dict.lenIV ) - { - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - /* t1_decrypt() shouldn't write to base -- make temporary copy */ - if ( FT_ALLOC( temp, size ) ) - goto Fail; - FT_MEM_COPY( temp, base, size ); - psaux->t1_decrypt( temp, size, 4330 ); - size -= (FT_ULong)face->type1.private_dict.lenIV; - error = T1_Add_Table( code_table, n, - temp + face->type1.private_dict.lenIV, size ); - FT_FREE( temp ); - } - else - error = T1_Add_Table( code_table, n, base, size ); - if ( error ) - goto Fail; - - n++; - } - } - - loader->num_glyphs = n; - - /* if /.notdef is found but does not occupy index 0, do our magic. */ - if ( notdef_found && - ft_strcmp( ".notdef", (const char*)name_table->elements[0] ) ) - { - /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ - /* name and code entries to swap_table. Then place notdef_index */ - /* name and code entries into swap_table. Then swap name and code */ - /* entries at indices notdef_index and 0 using values stored in */ - /* swap_table. */ - - /* Index 0 name */ - error = T1_Add_Table( swap_table, 0, - name_table->elements[0], - name_table->lengths [0] ); - if ( error ) - goto Fail; - - /* Index 0 code */ - error = T1_Add_Table( swap_table, 1, - code_table->elements[0], - code_table->lengths [0] ); - if ( error ) - goto Fail; - - /* Index notdef_index name */ - error = T1_Add_Table( swap_table, 2, - name_table->elements[notdef_index], - name_table->lengths [notdef_index] ); - if ( error ) - goto Fail; - - /* Index notdef_index code */ - error = T1_Add_Table( swap_table, 3, - code_table->elements[notdef_index], - code_table->lengths [notdef_index] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( name_table, notdef_index, - swap_table->elements[0], - swap_table->lengths [0] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( code_table, notdef_index, - swap_table->elements[1], - swap_table->lengths [1] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( name_table, 0, - swap_table->elements[2], - swap_table->lengths [2] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( code_table, 0, - swap_table->elements[3], - swap_table->lengths [3] ); - if ( error ) - goto Fail; - - } - else if ( !notdef_found ) - { - /* notdef_index is already 0, or /.notdef is undefined in */ - /* charstrings dictionary. Worry about /.notdef undefined. */ - /* We take index 0 and add it to the end of the table(s) */ - /* and add our own /.notdef glyph to index 0. */ - - /* 0 333 hsbw endchar */ - FT_Byte notdef_glyph[] = { 0x8B, 0xF7, 0xE1, 0x0D, 0x0E }; - char* notdef_name = (char *)".notdef"; - - - error = T1_Add_Table( swap_table, 0, - name_table->elements[0], - name_table->lengths [0] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( swap_table, 1, - code_table->elements[0], - code_table->lengths [0] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( name_table, 0, notdef_name, 8 ); - if ( error ) - goto Fail; - - error = T1_Add_Table( code_table, 0, notdef_glyph, 5 ); - - if ( error ) - goto Fail; - - error = T1_Add_Table( name_table, n, - swap_table->elements[0], - swap_table->lengths [0] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( code_table, n, - swap_table->elements[1], - swap_table->lengths [1] ); - if ( error ) - goto Fail; - - /* we added a glyph. */ - loader->num_glyphs += 1; - } - - return; - - Fail: - parser->root.error = error; - } - - - /*************************************************************************/ - /* */ - /* Define the token field static variables. This is a set of */ - /* T1_FieldRec variables. */ - /* */ - /*************************************************************************/ - - - static - const T1_FieldRec t1_keywords[] = - { - -#include "t1tokens.h" - - /* now add the special functions... */ - T1_FIELD_CALLBACK( "FontMatrix", t1_parse_font_matrix, - T1_FIELD_DICT_FONTDICT ) - T1_FIELD_CALLBACK( "Encoding", parse_encoding, - T1_FIELD_DICT_FONTDICT ) - T1_FIELD_CALLBACK( "Subrs", parse_subrs, - T1_FIELD_DICT_PRIVATE ) - T1_FIELD_CALLBACK( "CharStrings", parse_charstrings, - T1_FIELD_DICT_PRIVATE ) - T1_FIELD_CALLBACK( "Private", parse_private, - T1_FIELD_DICT_FONTDICT ) - -#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT - T1_FIELD_CALLBACK( "BlendDesignPositions", parse_blend_design_positions, - T1_FIELD_DICT_FONTDICT ) - T1_FIELD_CALLBACK( "BlendDesignMap", parse_blend_design_map, - T1_FIELD_DICT_FONTDICT ) - T1_FIELD_CALLBACK( "BlendAxisTypes", parse_blend_axis_types, - T1_FIELD_DICT_FONTDICT ) - T1_FIELD_CALLBACK( "WeightVector", parse_weight_vector, - T1_FIELD_DICT_FONTDICT ) - T1_FIELD_CALLBACK( "BuildCharArray", parse_buildchar, - T1_FIELD_DICT_PRIVATE ) -#endif - - { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 } - }; - - - static FT_Error - parse_dict( T1_Face face, - T1_Loader loader, - FT_Byte* base, - FT_ULong size ) - { - T1_Parser parser = &loader->parser; - FT_Byte *limit, *start_binary = NULL; - FT_Bool have_integer = 0; - - - parser->root.cursor = base; - parser->root.limit = base + size; - parser->root.error = FT_Err_Ok; - - limit = parser->root.limit; - - T1_Skip_Spaces( parser ); - - while ( parser->root.cursor < limit ) - { - FT_Byte* cur; - - - cur = parser->root.cursor; - - /* look for `eexec' */ - if ( IS_PS_TOKEN( cur, limit, "eexec" ) ) - break; - - /* look for `closefile' which ends the eexec section */ - else if ( IS_PS_TOKEN( cur, limit, "closefile" ) ) - break; - - /* in a synthetic font the base font starts after a */ - /* `FontDictionary' token that is placed after a Private dict */ - else if ( IS_PS_TOKEN( cur, limit, "FontDirectory" ) ) - { - if ( loader->keywords_encountered & T1_PRIVATE ) - loader->keywords_encountered |= - T1_FONTDIR_AFTER_PRIVATE; - parser->root.cursor += 13; - } - - /* check whether we have an integer */ - else if ( ft_isdigit( *cur ) ) - { - start_binary = cur; - T1_Skip_PS_Token( parser ); - if ( parser->root.error ) - goto Exit; - have_integer = 1; - } - - /* in valid Type 1 fonts we don't see `RD' or `-|' directly */ - /* since those tokens are handled by parse_subrs and */ - /* parse_charstrings */ - else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' && - have_integer ) - { - FT_ULong s; - FT_Byte* b; - - - parser->root.cursor = start_binary; - if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) ) - return FT_THROW( Invalid_File_Format ); - have_integer = 0; - } - - else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' && - have_integer ) - { - FT_ULong s; - FT_Byte* b; - - - parser->root.cursor = start_binary; - if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) ) - return FT_THROW( Invalid_File_Format ); - have_integer = 0; - } - - /* look for immediates */ - else if ( *cur == '/' && cur + 2 < limit ) - { - FT_UInt len; - - - cur++; - - parser->root.cursor = cur; - T1_Skip_PS_Token( parser ); - if ( parser->root.error ) - goto Exit; - - len = (FT_UInt)( parser->root.cursor - cur ); - - if ( len > 0 && len < 22 && parser->root.cursor < limit ) - { - /* now compare the immediate name to the keyword table */ - T1_Field keyword = (T1_Field)t1_keywords; - - - for (;;) - { - FT_Byte* name; - - - name = (FT_Byte*)keyword->ident; - if ( !name ) - break; - - if ( cur[0] == name[0] && - len == ft_strlen( (const char *)name ) && - ft_memcmp( cur, name, len ) == 0 ) - { - /* We found it -- run the parsing callback! */ - /* We record every instance of every field */ - /* (until we reach the base font of a */ - /* synthetic font) to deal adequately with */ - /* multiple master fonts; this is also */ - /* necessary because later PostScript */ - /* definitions override earlier ones. */ - - /* Once we encounter `FontDirectory' after */ - /* `/Private', we know that this is a synthetic */ - /* font; except for `/CharStrings' we are not */ - /* interested in anything that follows this */ - /* `FontDirectory'. */ - - /* MM fonts have more than one /Private token at */ - /* the top level; let's hope that all the junk */ - /* that follows the first /Private token is not */ - /* interesting to us. */ - - /* According to Adobe Tech Note #5175 (CID-Keyed */ - /* Font Installation for ATM Software) a `begin' */ - /* must be followed by exactly one `end', and */ - /* `begin' -- `end' pairs must be accurately */ - /* paired. We could use this to distinguish */ - /* between the global Private and the Private */ - /* dict that is a member of the Blend dict. */ - - const FT_UInt dict = - ( loader->keywords_encountered & T1_PRIVATE ) - ? T1_FIELD_DICT_PRIVATE - : T1_FIELD_DICT_FONTDICT; - - if ( !( dict & keyword->dict ) ) - { - FT_TRACE1(( "parse_dict: found `%s' but ignoring it" - " since it is in the wrong dictionary\n", - keyword->ident )); - break; - } - - if ( !( loader->keywords_encountered & - T1_FONTDIR_AFTER_PRIVATE ) || - ft_strcmp( (const char*)name, "CharStrings" ) == 0 ) - { - parser->root.error = t1_load_keyword( face, - loader, - keyword ); - if ( parser->root.error != FT_Err_Ok ) - { - if ( FT_ERR_EQ( parser->root.error, Ignore ) ) - parser->root.error = FT_Err_Ok; - else - return parser->root.error; - } - } - break; - } - - keyword++; - } - } - - have_integer = 0; - } - else - { - T1_Skip_PS_Token( parser ); - if ( parser->root.error ) - goto Exit; - have_integer = 0; - } - - T1_Skip_Spaces( parser ); - } - - Exit: - return parser->root.error; - } - - - static void - t1_init_loader( T1_Loader loader, - T1_Face face ) - { - FT_UNUSED( face ); - - FT_MEM_ZERO( loader, sizeof ( *loader ) ); - loader->num_glyphs = 0; - loader->num_chars = 0; - - /* initialize the tables -- simply set their `init' field to 0 */ - loader->encoding_table.init = 0; - loader->charstrings.init = 0; - loader->glyph_names.init = 0; - loader->subrs.init = 0; - loader->swap_table.init = 0; - loader->fontdata = 0; - loader->keywords_encountered = 0; - } - - - static void - t1_done_loader( T1_Loader loader ) - { - T1_Parser parser = &loader->parser; - - - /* finalize tables */ - T1_Release_Table( &loader->encoding_table ); - T1_Release_Table( &loader->charstrings ); - T1_Release_Table( &loader->glyph_names ); - T1_Release_Table( &loader->swap_table ); - T1_Release_Table( &loader->subrs ); - - /* finalize parser */ - T1_Finalize_Parser( parser ); - } - - - FT_LOCAL_DEF( FT_Error ) - T1_Open_Face( T1_Face face ) - { - T1_LoaderRec loader; - T1_Parser parser; - T1_Font type1 = &face->type1; - PS_Private priv = &type1->private_dict; - FT_Error error; - - PSAux_Service psaux = (PSAux_Service)face->psaux; - - - t1_init_loader( &loader, face ); - - /* default values */ - face->ndv_idx = -1; - face->cdv_idx = -1; - face->len_buildchar = 0; - - priv->blue_shift = 7; - priv->blue_fuzz = 1; - priv->lenIV = 4; - priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); - priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); - - parser = &loader.parser; - error = T1_New_Parser( parser, - face->root.stream, - face->root.memory, - psaux ); - if ( error ) - goto Exit; - - error = parse_dict( face, &loader, - parser->base_dict, parser->base_len ); - if ( error ) - goto Exit; - - error = T1_Get_Private_Dict( parser, psaux ); - if ( error ) - goto Exit; - - error = parse_dict( face, &loader, - parser->private_dict, parser->private_len ); - if ( error ) - goto Exit; - - /* ensure even-ness of `num_blue_values' */ - priv->num_blue_values &= ~1; - -#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT - - if ( face->blend && - face->blend->num_default_design_vector != 0 && - face->blend->num_default_design_vector != face->blend->num_axis ) - { - /* we don't use it currently so just warn, reset, and ignore */ - FT_ERROR(( "T1_Open_Face(): /DesignVector contains %u entries " - "while there are %u axes.\n", - face->blend->num_default_design_vector, - face->blend->num_axis )); - - face->blend->num_default_design_vector = 0; - } - - /* the following can happen for MM instances; we then treat the */ - /* font as a normal PS font */ - if ( face->blend && - ( !face->blend->num_designs || !face->blend->num_axis ) ) - T1_Done_Blend( face ); - - /* another safety check */ - if ( face->blend ) - { - FT_UInt i; - - - for ( i = 0; i < face->blend->num_axis; i++ ) - if ( !face->blend->design_map[i].num_points ) - { - T1_Done_Blend( face ); - break; - } - } - - if ( face->blend ) - { - if ( face->len_buildchar > 0 ) - { - FT_Memory memory = face->root.memory; - - - if ( FT_NEW_ARRAY( face->buildchar, face->len_buildchar ) ) - { - FT_ERROR(( "T1_Open_Face: cannot allocate BuildCharArray\n" )); - face->len_buildchar = 0; - goto Exit; - } - } - } - else - face->len_buildchar = 0; - -#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */ - - /* now, propagate the subrs, charstrings, and glyphnames tables */ - /* to the Type1 data */ - type1->num_glyphs = loader.num_glyphs; - - if ( loader.subrs.init ) - { - loader.subrs.init = 0; - type1->num_subrs = loader.num_subrs; - type1->subrs_block = loader.subrs.block; - type1->subrs = loader.subrs.elements; - type1->subrs_len = loader.subrs.lengths; - } - - if ( !IS_INCREMENTAL ) - if ( !loader.charstrings.init ) - { - FT_ERROR(( "T1_Open_Face: no `/CharStrings' array in face\n" )); - error = FT_THROW( Invalid_File_Format ); - } - - loader.charstrings.init = 0; - type1->charstrings_block = loader.charstrings.block; - type1->charstrings = loader.charstrings.elements; - type1->charstrings_len = loader.charstrings.lengths; - - /* we copy the glyph names `block' and `elements' fields; */ - /* the `lengths' field must be released later */ - type1->glyph_names_block = loader.glyph_names.block; - type1->glyph_names = (FT_String**)loader.glyph_names.elements; - loader.glyph_names.block = NULL; - loader.glyph_names.elements = NULL; - - /* we must now build type1.encoding when we have a custom array */ - if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY ) - { - FT_Int charcode, idx, min_char, max_char; - FT_Byte* glyph_name; - - - /* OK, we do the following: for each element in the encoding */ - /* table, look up the index of the glyph having the same name */ - /* the index is then stored in type1.encoding.char_index, and */ - /* the name to type1.encoding.char_name */ - - min_char = 0; - max_char = 0; - - charcode = 0; - for ( ; charcode < loader.encoding_table.max_elems; charcode++ ) - { - FT_Byte* char_name; - - - type1->encoding.char_index[charcode] = 0; - type1->encoding.char_name [charcode] = (char *)".notdef"; - - char_name = loader.encoding_table.elements[charcode]; - if ( char_name ) - for ( idx = 0; idx < type1->num_glyphs; idx++ ) - { - glyph_name = (FT_Byte*)type1->glyph_names[idx]; - if ( ft_strcmp( (const char*)char_name, - (const char*)glyph_name ) == 0 ) - { - type1->encoding.char_index[charcode] = (FT_UShort)idx; - type1->encoding.char_name [charcode] = (char*)glyph_name; - - /* Change min/max encoded char only if glyph name is */ - /* not /.notdef */ - if ( ft_strcmp( (const char*)".notdef", - (const char*)glyph_name ) != 0 ) - { - if ( charcode < min_char ) - min_char = charcode; - if ( charcode >= max_char ) - max_char = charcode + 1; - } - break; - } - } - } - - type1->encoding.code_first = min_char; - type1->encoding.code_last = max_char; - type1->encoding.num_chars = loader.num_chars; - } - - Exit: - t1_done_loader( &loader ); - return error; - } - - -/* END */ diff --git a/3party/freetype/src/type1/t1load.h b/3party/freetype/src/type1/t1load.h deleted file mode 100644 index de422e7ecd..0000000000 --- a/3party/freetype/src/type1/t1load.h +++ /dev/null @@ -1,102 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1load.h */ -/* */ -/* Type 1 font loader (specification). */ -/* */ -/* Copyright 1996-2015 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 __T1LOAD_H__ -#define __T1LOAD_H__ - - -#include -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_MULTIPLE_MASTERS_H - -#include "t1parse.h" - - -FT_BEGIN_HEADER - - - typedef struct T1_Loader_ - { - T1_ParserRec parser; /* parser used to read the stream */ - - FT_Int num_chars; /* number of characters in encoding */ - PS_TableRec encoding_table; /* PS_Table used to store the */ - /* encoding character names */ - - FT_Int num_glyphs; - PS_TableRec glyph_names; - PS_TableRec charstrings; - PS_TableRec swap_table; /* For moving .notdef glyph to index 0. */ - - FT_Int num_subrs; - PS_TableRec subrs; - FT_Bool fontdata; - - FT_UInt keywords_encountered; /* T1_LOADER_ENCOUNTERED_XXX */ - - } T1_LoaderRec, *T1_Loader; - - - /* treatment of some keywords differs depending on whether */ - /* they precede or follow certain other keywords */ - -#define T1_PRIVATE ( 1 << 0 ) -#define T1_FONTDIR_AFTER_PRIVATE ( 1 << 1 ) - - - FT_LOCAL( FT_Error ) - T1_Open_Face( T1_Face face ); - -#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT - - FT_LOCAL( FT_Error ) - T1_Get_Multi_Master( T1_Face face, - FT_Multi_Master* master ); - - FT_LOCAL_DEF( FT_Error ) - T1_Get_MM_Var( T1_Face face, - FT_MM_Var* *master ); - - FT_LOCAL( FT_Error ) - T1_Set_MM_Blend( T1_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - FT_LOCAL( FT_Error ) - T1_Set_MM_Design( T1_Face face, - FT_UInt num_coords, - FT_Long* coords ); - - FT_LOCAL_DEF( FT_Error ) - T1_Set_Var_Design( T1_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - FT_LOCAL( void ) - T1_Done_Blend( T1_Face face ); - -#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */ - - -FT_END_HEADER - -#endif /* __T1LOAD_H__ */ - - -/* END */ diff --git a/3party/freetype/src/type1/t1objs.c b/3party/freetype/src/type1/t1objs.c deleted file mode 100644 index 3506e4e3e1..0000000000 --- a/3party/freetype/src/type1/t1objs.c +++ /dev/null @@ -1,616 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1objs.c */ -/* */ -/* Type 1 objects manager (body). */ -/* */ -/* Copyright 1996-2015 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 FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_IDS_H - -#include "t1gload.h" -#include "t1load.h" - -#include "t1errors.h" - -#ifndef T1_CONFIG_OPTION_NO_AFM -#include "t1afm.h" -#endif - -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_t1objs - - - /*************************************************************************/ - /* */ - /* SIZE FUNCTIONS */ - /* */ - /* note that we store the global hints in the size's "internal" root */ - /* field */ - /* */ - /*************************************************************************/ - - - static PSH_Globals_Funcs - T1_Size_Get_Globals_Funcs( T1_Size size ) - { - T1_Face face = (T1_Face)size->root.face; - PSHinter_Service pshinter = (PSHinter_Service)face->pshinter; - FT_Module module; - - - module = FT_Get_Module( size->root.face->driver->root.library, - "pshinter" ); - return ( module && pshinter && pshinter->get_globals_funcs ) - ? pshinter->get_globals_funcs( module ) - : 0 ; - } - - - FT_LOCAL_DEF( void ) - T1_Size_Done( FT_Size t1size ) /* T1_Size */ - { - T1_Size size = (T1_Size)t1size; - - - if ( size->root.internal ) - { - PSH_Globals_Funcs funcs; - - - funcs = T1_Size_Get_Globals_Funcs( size ); - if ( funcs ) - funcs->destroy( (PSH_Globals)size->root.internal ); - - size->root.internal = NULL; - } - } - - - FT_LOCAL_DEF( FT_Error ) - T1_Size_Init( FT_Size t1size ) /* T1_Size */ - { - T1_Size size = (T1_Size)t1size; - FT_Error error = FT_Err_Ok; - PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); - - - if ( funcs ) - { - PSH_Globals globals; - T1_Face face = (T1_Face)size->root.face; - - - error = funcs->create( size->root.face->memory, - &face->type1.private_dict, &globals ); - if ( !error ) - size->root.internal = (FT_Size_Internal)(void*)globals; - } - - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - T1_Size_Request( FT_Size t1size, /* T1_Size */ - FT_Size_Request req ) - { - T1_Size size = (T1_Size)t1size; - PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); - - - FT_Request_Metrics( size->root.face, req ); - - if ( funcs ) - funcs->set_scale( (PSH_Globals)size->root.internal, - size->root.metrics.x_scale, - size->root.metrics.y_scale, - 0, 0 ); - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* SLOT FUNCTIONS */ - /* */ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - T1_GlyphSlot_Done( FT_GlyphSlot slot ) - { - slot->internal->glyph_hints = NULL; - } - - - FT_LOCAL_DEF( FT_Error ) - T1_GlyphSlot_Init( FT_GlyphSlot slot ) - { - T1_Face face; - PSHinter_Service pshinter; - - - face = (T1_Face)slot->face; - pshinter = (PSHinter_Service)face->pshinter; - - if ( pshinter ) - { - FT_Module module; - - - module = FT_Get_Module( slot->face->driver->root.library, - "pshinter" ); - if ( module ) - { - T1_Hints_Funcs funcs; - - - funcs = pshinter->get_t1_funcs( module ); - slot->internal->glyph_hints = (void*)funcs; - } - } - - return 0; - } - - - /*************************************************************************/ - /* */ - /* FACE FUNCTIONS */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* T1_Face_Done */ - /* */ - /* */ - /* The face object destructor. */ - /* */ - /* */ - /* face :: A typeless pointer to the face object to destroy. */ - /* */ - FT_LOCAL_DEF( void ) - T1_Face_Done( FT_Face t1face ) /* T1_Face */ - { - T1_Face face = (T1_Face)t1face; - FT_Memory memory; - T1_Font type1; - - - if ( !face ) - return; - - memory = face->root.memory; - type1 = &face->type1; - -#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT - /* release multiple masters information */ - FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); - - if ( face->buildchar ) - { - FT_FREE( face->buildchar ); - - face->buildchar = NULL; - face->len_buildchar = 0; - } - - T1_Done_Blend( face ); - face->blend = NULL; -#endif - - /* release font info strings */ - { - PS_FontInfo info = &type1->font_info; - - - FT_FREE( info->version ); - FT_FREE( info->notice ); - FT_FREE( info->full_name ); - FT_FREE( info->family_name ); - FT_FREE( info->weight ); - } - - /* release top dictionary */ - FT_FREE( type1->charstrings_len ); - FT_FREE( type1->charstrings ); - FT_FREE( type1->glyph_names ); - - FT_FREE( type1->subrs ); - FT_FREE( type1->subrs_len ); - - FT_FREE( type1->subrs_block ); - FT_FREE( type1->charstrings_block ); - FT_FREE( type1->glyph_names_block ); - - FT_FREE( type1->encoding.char_index ); - FT_FREE( type1->encoding.char_name ); - FT_FREE( type1->font_name ); - -#ifndef T1_CONFIG_OPTION_NO_AFM - /* release afm data if present */ - if ( face->afm_data ) - T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data ); -#endif - - /* release unicode map, if any */ -#if 0 - FT_FREE( face->unicode_map_rec.maps ); - face->unicode_map_rec.num_maps = 0; - face->unicode_map = NULL; -#endif - - face->root.family_name = NULL; - face->root.style_name = NULL; - } - - - /*************************************************************************/ - /* */ - /* */ - /* T1_Face_Init */ - /* */ - /* */ - /* The face object constructor. */ - /* */ - /* */ - /* stream :: input stream where to load font data. */ - /* */ - /* face_index :: The index of the font face in the resource. */ - /* */ - /* num_params :: Number of additional generic parameters. Ignored. */ - /* */ - /* params :: Additional generic parameters. Ignored. */ - /* */ - /* */ - /* face :: The face record to build. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - T1_Face_Init( FT_Stream stream, - FT_Face t1face, /* T1_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ) - { - T1_Face face = (T1_Face)t1face; - FT_Error error; - FT_Service_PsCMaps psnames; - PSAux_Service psaux; - T1_Font type1 = &face->type1; - PS_FontInfo info = &type1->font_info; - - FT_UNUSED( num_params ); - FT_UNUSED( params ); - FT_UNUSED( stream ); - - - face->root.num_faces = 1; - - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); - face->psnames = psnames; - - face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), - "psaux" ); - psaux = (PSAux_Service)face->psaux; - if ( !psaux ) - { - FT_ERROR(( "T1_Face_Init: cannot access `psaux' module\n" )); - error = FT_THROW( Missing_Module ); - goto Exit; - } - - face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), - "pshinter" ); - - FT_TRACE2(( "Type 1 driver\n" )); - - /* open the tokenizer; this will also check the font format */ - error = T1_Open_Face( face ); - if ( error ) - goto Exit; - - /* if we just wanted to check the format, leave successfully now */ - if ( face_index < 0 ) - goto Exit; - - /* check the face index */ - if ( ( face_index & 0xFFFF ) > 0 ) - { - FT_ERROR(( "T1_Face_Init: invalid face index\n" )); - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* now load the font program into the face object */ - - /* initialize the face object fields */ - - /* set up root face fields */ - { - FT_Face root = (FT_Face)&face->root; - - - root->num_glyphs = type1->num_glyphs; - root->face_index = 0; - - root->face_flags |= FT_FACE_FLAG_SCALABLE | - FT_FACE_FLAG_HORIZONTAL | - FT_FACE_FLAG_GLYPH_NAMES | - FT_FACE_FLAG_HINTER; - - if ( info->is_fixed_pitch ) - root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; - - if ( face->blend ) - root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; - - /* XXX: TODO -- add kerning with .afm support */ - - - /* The following code to extract the family and the style is very */ - /* simplistic and might get some things wrong. For a full-featured */ - /* algorithm you might have a look at the whitepaper given at */ - /* */ - /* http://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */ - - /* get style name -- be careful, some broken fonts only */ - /* have a `/FontName' dictionary entry! */ - root->family_name = info->family_name; - root->style_name = NULL; - - if ( root->family_name ) - { - char* full = info->full_name; - char* family = root->family_name; - - - if ( full ) - { - FT_Bool the_same = TRUE; - - - while ( *full ) - { - if ( *full == *family ) - { - family++; - full++; - } - else - { - if ( *full == ' ' || *full == '-' ) - full++; - else if ( *family == ' ' || *family == '-' ) - family++; - else - { - the_same = FALSE; - - if ( !*family ) - root->style_name = full; - break; - } - } - } - - if ( the_same ) - root->style_name = (char *)"Regular"; - } - } - else - { - /* do we have a `/FontName'? */ - if ( type1->font_name ) - root->family_name = type1->font_name; - } - - if ( !root->style_name ) - { - if ( info->weight ) - root->style_name = info->weight; - else - /* assume `Regular' style because we don't know better */ - root->style_name = (char *)"Regular"; - } - - /* compute style flags */ - root->style_flags = 0; - if ( info->italic_angle ) - root->style_flags |= FT_STYLE_FLAG_ITALIC; - if ( info->weight ) - { - if ( !ft_strcmp( info->weight, "Bold" ) || - !ft_strcmp( info->weight, "Black" ) ) - root->style_flags |= FT_STYLE_FLAG_BOLD; - } - - /* no embedded bitmap support */ - root->num_fixed_sizes = 0; - root->available_sizes = NULL; - - root->bbox.xMin = type1->font_bbox.xMin >> 16; - root->bbox.yMin = type1->font_bbox.yMin >> 16; - /* no `U' suffix here to 0xFFFF! */ - root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFF ) >> 16; - root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFF ) >> 16; - - /* Set units_per_EM if we didn't set it in t1_parse_font_matrix. */ - if ( !root->units_per_EM ) - root->units_per_EM = 1000; - - root->ascender = (FT_Short)( root->bbox.yMax ); - root->descender = (FT_Short)( root->bbox.yMin ); - - root->height = (FT_Short)( ( root->units_per_EM * 12 ) / 10 ); - if ( root->height < root->ascender - root->descender ) - root->height = (FT_Short)( root->ascender - root->descender ); - - /* now compute the maximum advance width */ - root->max_advance_width = - (FT_Short)( root->bbox.xMax ); - { - FT_Pos max_advance; - - - error = T1_Compute_Max_Advance( face, &max_advance ); - - /* in case of error, keep the standard width */ - if ( !error ) - root->max_advance_width = (FT_Short)FIXED_TO_INT( max_advance ); - else - error = FT_Err_Ok; /* clear error */ - } - - root->max_advance_height = root->height; - - root->underline_position = (FT_Short)info->underline_position; - root->underline_thickness = (FT_Short)info->underline_thickness; - } - - { - FT_Face root = &face->root; - - - if ( psnames ) - { - FT_CharMapRec charmap; - T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes; - FT_CMap_Class clazz; - - - charmap.face = root; - - /* first of all, try to synthesize a Unicode charmap */ - charmap.platform_id = TT_PLATFORM_MICROSOFT; - charmap.encoding_id = TT_MS_ID_UNICODE_CS; - charmap.encoding = FT_ENCODING_UNICODE; - - error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL ); - if ( error && - FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) ) - goto Exit; - error = FT_Err_Ok; - - /* now, generate an Adobe Standard encoding when appropriate */ - charmap.platform_id = TT_PLATFORM_ADOBE; - clazz = NULL; - - switch ( type1->encoding_type ) - { - case T1_ENCODING_TYPE_STANDARD: - charmap.encoding = FT_ENCODING_ADOBE_STANDARD; - charmap.encoding_id = TT_ADOBE_ID_STANDARD; - clazz = cmap_classes->standard; - break; - - case T1_ENCODING_TYPE_EXPERT: - charmap.encoding = FT_ENCODING_ADOBE_EXPERT; - charmap.encoding_id = TT_ADOBE_ID_EXPERT; - clazz = cmap_classes->expert; - break; - - case T1_ENCODING_TYPE_ARRAY: - charmap.encoding = FT_ENCODING_ADOBE_CUSTOM; - charmap.encoding_id = TT_ADOBE_ID_CUSTOM; - clazz = cmap_classes->custom; - break; - - case T1_ENCODING_TYPE_ISOLATIN1: - charmap.encoding = FT_ENCODING_ADOBE_LATIN_1; - charmap.encoding_id = TT_ADOBE_ID_LATIN_1; - clazz = cmap_classes->unicode; - break; - - default: - ; - } - - if ( clazz ) - error = FT_CMap_New( clazz, NULL, &charmap, NULL ); - -#if 0 - /* Select default charmap */ - if (root->num_charmaps) - root->charmap = root->charmaps[0]; -#endif - } - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* */ - /* T1_Driver_Init */ - /* */ - /* */ - /* Initializes a given Type 1 driver object. */ - /* */ - /* */ - /* driver :: A handle to the target driver object. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - T1_Driver_Init( FT_Module driver ) - { - FT_UNUSED( driver ); - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* */ - /* T1_Driver_Done */ - /* */ - /* */ - /* Finalizes a given Type 1 driver. */ - /* */ - /* */ - /* driver :: A handle to the target Type 1 driver. */ - /* */ - FT_LOCAL_DEF( void ) - T1_Driver_Done( FT_Module driver ) - { - FT_UNUSED( driver ); - } - - -/* END */ diff --git a/3party/freetype/src/type1/t1objs.h b/3party/freetype/src/type1/t1objs.h deleted file mode 100644 index 6b4f3cb56d..0000000000 --- a/3party/freetype/src/type1/t1objs.h +++ /dev/null @@ -1,160 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1objs.h */ -/* */ -/* Type 1 objects manager (specification). */ -/* */ -/* Copyright 1996-2015 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 __T1OBJS_H__ -#define __T1OBJS_H__ - - -#include -#include FT_INTERNAL_OBJECTS_H -#include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_TYPE1_TYPES_H - - -FT_BEGIN_HEADER - - - /* The following structures must be defined by the hinter */ - typedef struct T1_Size_Hints_ T1_Size_Hints; - typedef struct T1_Glyph_Hints_ T1_Glyph_Hints; - - - /*************************************************************************/ - /* */ - /* */ - /* T1_Size */ - /* */ - /* */ - /* A handle to a Type 1 size object. */ - /* */ - typedef struct T1_SizeRec_* T1_Size; - - - /*************************************************************************/ - /* */ - /* */ - /* T1_GlyphSlot */ - /* */ - /* */ - /* A handle to a Type 1 glyph slot object. */ - /* */ - typedef struct T1_GlyphSlotRec_* T1_GlyphSlot; - - - /*************************************************************************/ - /* */ - /* */ - /* T1_CharMap */ - /* */ - /* */ - /* A handle to a Type 1 character mapping object. */ - /* */ - /* */ - /* The Type 1 format doesn't use a charmap but an encoding table. */ - /* The driver is responsible for making up charmap objects */ - /* corresponding to these tables. */ - /* */ - typedef struct T1_CharMapRec_* T1_CharMap; - - - /*************************************************************************/ - /* */ - /* HERE BEGINS THE TYPE1 SPECIFIC STUFF */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* T1_SizeRec */ - /* */ - /* */ - /* Type 1 size record. */ - /* */ - typedef struct T1_SizeRec_ - { - FT_SizeRec root; - - } T1_SizeRec; - - - FT_LOCAL( void ) - T1_Size_Done( FT_Size size ); - - FT_LOCAL( FT_Error ) - T1_Size_Request( FT_Size size, - FT_Size_Request req ); - - FT_LOCAL( FT_Error ) - T1_Size_Init( FT_Size size ); - - - /*************************************************************************/ - /* */ - /* */ - /* T1_GlyphSlotRec */ - /* */ - /* */ - /* Type 1 glyph slot record. */ - /* */ - typedef struct T1_GlyphSlotRec_ - { - FT_GlyphSlotRec root; - - FT_Bool hint; - FT_Bool scaled; - - FT_Int max_points; - FT_Int max_contours; - - FT_Fixed x_scale; - FT_Fixed y_scale; - - } T1_GlyphSlotRec; - - - FT_LOCAL( FT_Error ) - T1_Face_Init( FT_Stream stream, - FT_Face face, - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - FT_LOCAL( void ) - T1_Face_Done( FT_Face face ); - - FT_LOCAL( FT_Error ) - T1_GlyphSlot_Init( FT_GlyphSlot slot ); - - FT_LOCAL( void ) - T1_GlyphSlot_Done( FT_GlyphSlot slot ); - - FT_LOCAL( FT_Error ) - T1_Driver_Init( FT_Module driver ); - - FT_LOCAL( void ) - T1_Driver_Done( FT_Module driver ); - - -FT_END_HEADER - -#endif /* __T1OBJS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/type1/t1parse.c b/3party/freetype/src/type1/t1parse.c deleted file mode 100644 index c73b2b25da..0000000000 --- a/3party/freetype/src/type1/t1parse.c +++ /dev/null @@ -1,510 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1parse.c */ -/* */ -/* Type 1 parser (body). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* The Type 1 parser is in charge of the following: */ - /* */ - /* - provide an implementation of a growing sequence of objects called */ - /* a `T1_Table' (used to build various tables needed by the loader). */ - /* */ - /* - opening .pfb and .pfa files to extract their top-level and private */ - /* dictionaries. */ - /* */ - /* - read numbers, arrays & strings from any dictionary. */ - /* */ - /* See `t1load.c' to see how data is loaded from the font file. */ - /* */ - /*************************************************************************/ - - -#include -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H - -#include "t1parse.h" - -#include "t1errors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_t1parse - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** INPUT STREAM PARSER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* see Adobe Technical Note 5040.Download_Fonts.pdf */ - - static FT_Error - read_pfb_tag( FT_Stream stream, - FT_UShort *atag, - FT_ULong *asize ) - { - FT_Error error; - FT_UShort tag; - FT_ULong size; - - - *atag = 0; - *asize = 0; - - if ( !FT_READ_USHORT( tag ) ) - { - if ( tag == 0x8001U || tag == 0x8002U ) - { - if ( !FT_READ_ULONG_LE( size ) ) - *asize = size; - } - - *atag = tag; - } - - return error; - } - - - static FT_Error - check_type1_format( FT_Stream stream, - const char* header_string, - size_t header_length ) - { - FT_Error error; - FT_UShort tag; - FT_ULong dummy; - - - if ( FT_STREAM_SEEK( 0 ) ) - goto Exit; - - error = read_pfb_tag( stream, &tag, &dummy ); - if ( error ) - goto Exit; - - /* We assume that the first segment in a PFB is always encoded as */ - /* text. This might be wrong (and the specification doesn't insist */ - /* on that), but we have never seen a counterexample. */ - if ( tag != 0x8001U && FT_STREAM_SEEK( 0 ) ) - goto Exit; - - if ( !FT_FRAME_ENTER( header_length ) ) - { - error = FT_Err_Ok; - - if ( ft_memcmp( stream->cursor, header_string, header_length ) != 0 ) - error = FT_THROW( Unknown_File_Format ); - - FT_FRAME_EXIT(); - } - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - T1_New_Parser( T1_Parser parser, - FT_Stream stream, - FT_Memory memory, - PSAux_Service psaux ) - { - FT_Error error; - FT_UShort tag; - FT_ULong size; - - - psaux->ps_parser_funcs->init( &parser->root, NULL, NULL, memory ); - - parser->stream = stream; - parser->base_len = 0; - parser->base_dict = NULL; - parser->private_len = 0; - parser->private_dict = NULL; - parser->in_pfb = 0; - parser->in_memory = 0; - parser->single_block = 0; - - /* check the header format */ - error = check_type1_format( stream, "%!PS-AdobeFont", 14 ); - if ( error ) - { - if ( FT_ERR_NEQ( error, Unknown_File_Format ) ) - goto Exit; - - error = check_type1_format( stream, "%!FontType", 10 ); - if ( error ) - { - FT_TRACE2(( " not a Type 1 font\n" )); - goto Exit; - } - } - - /******************************************************************/ - /* */ - /* Here a short summary of what is going on: */ - /* */ - /* When creating a new Type 1 parser, we try to locate and load */ - /* the base dictionary if this is possible (i.e., for PFB */ - /* files). Otherwise, we load the whole font into memory. */ - /* */ - /* When `loading' the base dictionary, we only setup pointers */ - /* in the case of a memory-based stream. Otherwise, we */ - /* allocate and load the base dictionary in it. */ - /* */ - /* parser->in_pfb is set if we are in a binary (`.pfb') font. */ - /* parser->in_memory is set if we have a memory stream. */ - /* */ - - /* try to compute the size of the base dictionary; */ - /* look for a Postscript binary file tag, i.e., 0x8001 */ - if ( FT_STREAM_SEEK( 0L ) ) - goto Exit; - - error = read_pfb_tag( stream, &tag, &size ); - if ( error ) - goto Exit; - - if ( tag != 0x8001U ) - { - /* assume that this is a PFA file for now; an error will */ - /* be produced later when more things are checked */ - if ( FT_STREAM_SEEK( 0L ) ) - goto Exit; - size = stream->size; - } - else - parser->in_pfb = 1; - - /* now, try to load `size' bytes of the `base' dictionary we */ - /* found previously */ - - /* if it is a memory-based resource, set up pointers */ - if ( !stream->read ) - { - parser->base_dict = (FT_Byte*)stream->base + stream->pos; - parser->base_len = size; - parser->in_memory = 1; - - /* check that the `size' field is valid */ - if ( FT_STREAM_SKIP( size ) ) - goto Exit; - } - else - { - /* read segment in memory -- this is clumsy, but so does the format */ - if ( FT_ALLOC( parser->base_dict, size ) || - FT_STREAM_READ( parser->base_dict, size ) ) - goto Exit; - parser->base_len = size; - } - - parser->root.base = parser->base_dict; - parser->root.cursor = parser->base_dict; - parser->root.limit = parser->root.cursor + parser->base_len; - - Exit: - if ( error && !parser->in_memory ) - FT_FREE( parser->base_dict ); - - return error; - } - - - FT_LOCAL_DEF( void ) - T1_Finalize_Parser( T1_Parser parser ) - { - FT_Memory memory = parser->root.memory; - - - /* always free the private dictionary */ - FT_FREE( parser->private_dict ); - - /* free the base dictionary only when we have a disk stream */ - if ( !parser->in_memory ) - FT_FREE( parser->base_dict ); - - parser->root.funcs.done( &parser->root ); - } - - - FT_LOCAL_DEF( FT_Error ) - T1_Get_Private_Dict( T1_Parser parser, - PSAux_Service psaux ) - { - FT_Stream stream = parser->stream; - FT_Memory memory = parser->root.memory; - FT_Error error = FT_Err_Ok; - FT_ULong size; - - - if ( parser->in_pfb ) - { - /* in the case of the PFB format, the private dictionary can be */ - /* made of several segments. We thus first read the number of */ - /* segments to compute the total size of the private dictionary */ - /* then re-read them into memory. */ - FT_ULong start_pos = FT_STREAM_POS(); - FT_UShort tag; - - - parser->private_len = 0; - for (;;) - { - error = read_pfb_tag( stream, &tag, &size ); - if ( error ) - goto Fail; - - if ( tag != 0x8002U ) - break; - - parser->private_len += size; - - if ( FT_STREAM_SKIP( size ) ) - goto Fail; - } - - /* Check that we have a private dictionary there */ - /* and allocate private dictionary buffer */ - if ( parser->private_len == 0 ) - { - FT_ERROR(( "T1_Get_Private_Dict:" - " invalid private dictionary section\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - if ( FT_STREAM_SEEK( start_pos ) || - FT_ALLOC( parser->private_dict, parser->private_len ) ) - goto Fail; - - parser->private_len = 0; - for (;;) - { - error = read_pfb_tag( stream, &tag, &size ); - if ( error || tag != 0x8002U ) - { - error = FT_Err_Ok; - break; - } - - if ( FT_STREAM_READ( parser->private_dict + parser->private_len, - size ) ) - goto Fail; - - parser->private_len += size; - } - } - else - { - /* We have already `loaded' the whole PFA font file into memory; */ - /* if this is a memory resource, allocate a new block to hold */ - /* the private dict. Otherwise, simply overwrite into the base */ - /* dictionary block in the heap. */ - - /* first of all, look at the `eexec' keyword */ - FT_Byte* cur = parser->base_dict; - FT_Byte* limit = cur + parser->base_len; - FT_Byte c; - FT_Pointer pos_lf; - FT_Bool test_cr; - - - Again: - for (;;) - { - c = cur[0]; - if ( c == 'e' && cur + 9 < limit ) /* 9 = 5 letters for `eexec' + */ - /* whitespace + 4 chars */ - { - if ( cur[1] == 'e' && - cur[2] == 'x' && - cur[3] == 'e' && - cur[4] == 'c' ) - break; - } - cur++; - if ( cur >= limit ) - { - FT_ERROR(( "T1_Get_Private_Dict:" - " could not find `eexec' keyword\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - } - - /* check whether `eexec' was real -- it could be in a comment */ - /* or string (as e.g. in u003043t.gsf from ghostscript) */ - - parser->root.cursor = parser->base_dict; - /* set limit to `eexec' + whitespace + 4 characters */ - parser->root.limit = cur + 10; - - cur = parser->root.cursor; - limit = parser->root.limit; - - while ( cur < limit ) - { - if ( *cur == 'e' && ft_strncmp( (char*)cur, "eexec", 5 ) == 0 ) - goto Found; - - T1_Skip_PS_Token( parser ); - if ( parser->root.error ) - break; - T1_Skip_Spaces ( parser ); - cur = parser->root.cursor; - } - - /* we haven't found the correct `eexec'; go back and continue */ - /* searching */ - - cur = limit; - limit = parser->base_dict + parser->base_len; - goto Again; - - /* now determine where to write the _encrypted_ binary private */ - /* dictionary. We overwrite the base dictionary for disk-based */ - /* resources and allocate a new block otherwise */ - - Found: - parser->root.limit = parser->base_dict + parser->base_len; - - T1_Skip_PS_Token( parser ); - cur = parser->root.cursor; - limit = parser->root.limit; - - /* According to the Type 1 spec, the first cipher byte must not be */ - /* an ASCII whitespace character code (blank, tab, carriage return */ - /* or line feed). We have seen Type 1 fonts with two line feed */ - /* characters... So skip now all whitespace character codes. */ - /* */ - /* On the other hand, Adobe's Type 1 parser handles fonts just */ - /* fine that are violating this limitation, so we add a heuristic */ - /* test to stop at \r only if it is not used for EOL. */ - - pos_lf = ft_memchr( cur, '\n', (size_t)( limit - cur ) ); - test_cr = FT_BOOL( !pos_lf || - pos_lf > ft_memchr( cur, - '\r', - (size_t)( limit - cur ) ) ); - - while ( cur < limit && - ( *cur == ' ' || - *cur == '\t' || - (test_cr && *cur == '\r' ) || - *cur == '\n' ) ) - ++cur; - if ( cur >= limit ) - { - FT_ERROR(( "T1_Get_Private_Dict:" - " `eexec' not properly terminated\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - size = parser->base_len - (FT_ULong)( cur - parser->base_dict ); - - if ( parser->in_memory ) - { - /* note that we allocate one more byte to put a terminating `0' */ - if ( FT_ALLOC( parser->private_dict, size + 1 ) ) - goto Fail; - parser->private_len = size; - } - else - { - parser->single_block = 1; - parser->private_dict = parser->base_dict; - parser->private_len = size; - parser->base_dict = NULL; - parser->base_len = 0; - } - - /* now determine whether the private dictionary is encoded in binary */ - /* or hexadecimal ASCII format -- decode it accordingly */ - - /* we need to access the next 4 bytes (after the final whitespace */ - /* following the `eexec' keyword); if they all are hexadecimal */ - /* digits, then we have a case of ASCII storage */ - - if ( cur + 3 < limit && - ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) && - ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) ) - { - /* ASCII hexadecimal encoding */ - FT_ULong len; - - - parser->root.cursor = cur; - (void)psaux->ps_parser_funcs->to_bytes( &parser->root, - parser->private_dict, - parser->private_len, - &len, - 0 ); - parser->private_len = len; - - /* put a safeguard */ - parser->private_dict[len] = '\0'; - } - else - /* binary encoding -- copy the private dict */ - FT_MEM_MOVE( parser->private_dict, cur, size ); - } - - /* we now decrypt the encoded binary private dictionary */ - psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U ); - - if ( parser->private_len < 4 ) - { - FT_ERROR(( "T1_Get_Private_Dict:" - " invalid private dictionary section\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - /* replace the four random bytes at the beginning with whitespace */ - parser->private_dict[0] = ' '; - parser->private_dict[1] = ' '; - parser->private_dict[2] = ' '; - parser->private_dict[3] = ' '; - - parser->root.base = parser->private_dict; - parser->root.cursor = parser->private_dict; - parser->root.limit = parser->root.cursor + parser->private_len; - - Fail: - Exit: - return error; - } - - -/* END */ diff --git a/3party/freetype/src/type1/t1parse.h b/3party/freetype/src/type1/t1parse.h deleted file mode 100644 index 93b02e3d31..0000000000 --- a/3party/freetype/src/type1/t1parse.h +++ /dev/null @@ -1,129 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1parse.h */ -/* */ -/* Type 1 parser (specification). */ -/* */ -/* Copyright 1996-2015 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 __T1PARSE_H__ -#define __T1PARSE_H__ - - -#include -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_STREAM_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* */ - /* T1_ParserRec */ - /* */ - /* */ - /* A PS_ParserRec is an object used to parse a Type 1 fonts very */ - /* quickly. */ - /* */ - /* */ - /* root :: The root parser. */ - /* */ - /* stream :: The current input stream. */ - /* */ - /* base_dict :: A pointer to the top-level dictionary. */ - /* */ - /* base_len :: The length in bytes of the top dictionary. */ - /* */ - /* private_dict :: A pointer to the private dictionary. */ - /* */ - /* private_len :: The length in bytes of the private dictionary. */ - /* */ - /* in_pfb :: A boolean. Indicates that we are handling a PFB */ - /* file. */ - /* */ - /* in_memory :: A boolean. Indicates a memory-based stream. */ - /* */ - /* single_block :: A boolean. Indicates that the private dictionary */ - /* is stored in lieu of the base dictionary. */ - /* */ - typedef struct T1_ParserRec_ - { - PS_ParserRec root; - FT_Stream stream; - - FT_Byte* base_dict; - FT_ULong base_len; - - FT_Byte* private_dict; - FT_ULong private_len; - - FT_Bool in_pfb; - FT_Bool in_memory; - FT_Bool single_block; - - } T1_ParserRec, *T1_Parser; - - -#define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l ) -#define T1_Release_Table( p ) \ - do \ - { \ - if ( (p)->funcs.release ) \ - (p)->funcs.release( p ); \ - } while ( 0 ) - - -#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) -#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root ) - -#define T1_ToInt( p ) (p)->root.funcs.to_int( &(p)->root ) -#define T1_ToFixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) - -#define T1_ToCoordArray( p, m, c ) \ - (p)->root.funcs.to_coord_array( &(p)->root, m, c ) -#define T1_ToFixedArray( p, m, f, t ) \ - (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) -#define T1_ToToken( p, t ) \ - (p)->root.funcs.to_token( &(p)->root, t ) -#define T1_ToTokenArray( p, t, m, c ) \ - (p)->root.funcs.to_token_array( &(p)->root, t, m, c ) - -#define T1_Load_Field( p, f, o, m, pf ) \ - (p)->root.funcs.load_field( &(p)->root, f, o, m, pf ) - -#define T1_Load_Field_Table( p, f, o, m, pf ) \ - (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf ) - - - FT_LOCAL( FT_Error ) - T1_New_Parser( T1_Parser parser, - FT_Stream stream, - FT_Memory memory, - PSAux_Service psaux ); - - FT_LOCAL( FT_Error ) - T1_Get_Private_Dict( T1_Parser parser, - PSAux_Service psaux ); - - FT_LOCAL( void ) - T1_Finalize_Parser( T1_Parser parser ); - - -FT_END_HEADER - -#endif /* __T1PARSE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/type1/t1tokens.h b/3party/freetype/src/type1/t1tokens.h deleted file mode 100644 index 3992652435..0000000000 --- a/3party/freetype/src/type1/t1tokens.h +++ /dev/null @@ -1,143 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1tokens.h */ -/* */ -/* Type 1 tokenizer (specification). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - -#undef FT_STRUCTURE -#define FT_STRUCTURE PS_FontInfoRec -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_FONT_INFO - - T1_FIELD_STRING( "version", version, - T1_FIELD_DICT_FONTDICT ) - T1_FIELD_STRING( "Notice", notice, - T1_FIELD_DICT_FONTDICT ) - T1_FIELD_STRING( "FullName", full_name, - T1_FIELD_DICT_FONTDICT ) - T1_FIELD_STRING( "FamilyName", family_name, - T1_FIELD_DICT_FONTDICT ) - T1_FIELD_STRING( "Weight", weight, - T1_FIELD_DICT_FONTDICT ) - - /* we use pointers to detect modifications made by synthetic fonts */ - T1_FIELD_NUM ( "ItalicAngle", italic_angle, - T1_FIELD_DICT_FONTDICT ) - T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, - T1_FIELD_DICT_FONTDICT ) - T1_FIELD_NUM ( "UnderlinePosition", underline_position, - T1_FIELD_DICT_FONTDICT ) - T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, - T1_FIELD_DICT_FONTDICT ) - -#undef FT_STRUCTURE -#define FT_STRUCTURE PS_FontExtraRec -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA - - T1_FIELD_NUM ( "FSType", fs_type, - T1_FIELD_DICT_FONTDICT ) - -#undef FT_STRUCTURE -#define FT_STRUCTURE PS_PrivateRec -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_PRIVATE - - T1_FIELD_NUM ( "UniqueID", unique_id, - T1_FIELD_DICT_FONTDICT | T1_FIELD_DICT_PRIVATE ) - T1_FIELD_NUM ( "lenIV", lenIV, - T1_FIELD_DICT_PRIVATE ) - T1_FIELD_NUM ( "LanguageGroup", language_group, - T1_FIELD_DICT_PRIVATE ) - T1_FIELD_NUM ( "password", password, - T1_FIELD_DICT_PRIVATE ) - - T1_FIELD_FIXED_1000( "BlueScale", blue_scale, - T1_FIELD_DICT_PRIVATE ) - T1_FIELD_NUM ( "BlueShift", blue_shift, - T1_FIELD_DICT_PRIVATE ) - T1_FIELD_NUM ( "BlueFuzz", blue_fuzz, - T1_FIELD_DICT_PRIVATE ) - - T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14, - T1_FIELD_DICT_PRIVATE ) - T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10, - T1_FIELD_DICT_PRIVATE ) - T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14, - T1_FIELD_DICT_PRIVATE ) - T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, - T1_FIELD_DICT_PRIVATE ) - - T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1, - T1_FIELD_DICT_PRIVATE ) - T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1, - T1_FIELD_DICT_PRIVATE ) - T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2, - T1_FIELD_DICT_PRIVATE ) - - T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12, - T1_FIELD_DICT_PRIVATE ) - T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12, - T1_FIELD_DICT_PRIVATE ) - - T1_FIELD_FIXED ( "ExpansionFactor", expansion_factor, - T1_FIELD_DICT_PRIVATE ) - T1_FIELD_BOOL ( "ForceBold", force_bold, - T1_FIELD_DICT_PRIVATE ) - - -#undef FT_STRUCTURE -#define FT_STRUCTURE T1_FontRec -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_FONT_DICT - - T1_FIELD_KEY ( "FontName", font_name, T1_FIELD_DICT_FONTDICT ) - T1_FIELD_NUM ( "PaintType", paint_type, T1_FIELD_DICT_FONTDICT ) - T1_FIELD_NUM ( "FontType", font_type, T1_FIELD_DICT_FONTDICT ) - T1_FIELD_FIXED( "StrokeWidth", stroke_width, T1_FIELD_DICT_FONTDICT ) - - -#undef FT_STRUCTURE -#define FT_STRUCTURE FT_BBox -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_BBOX - - T1_FIELD_BBOX( "FontBBox", xMin, T1_FIELD_DICT_FONTDICT ) - - -#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT - -#undef FT_STRUCTURE -#define FT_STRUCTURE T1_FaceRec -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_FACE - - T1_FIELD_NUM( "NDV", ndv_idx, T1_FIELD_DICT_PRIVATE ) - T1_FIELD_NUM( "CDV", cdv_idx, T1_FIELD_DICT_PRIVATE ) - - -#undef FT_STRUCTURE -#define FT_STRUCTURE PS_BlendRec -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_BLEND - - T1_FIELD_NUM_TABLE( "DesignVector", default_design_vector, - T1_MAX_MM_DESIGNS, T1_FIELD_DICT_FONTDICT ) - - -#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ - - -/* END */ diff --git a/3party/freetype/src/type1/type1.c b/3party/freetype/src/type1/type1.c deleted file mode 100644 index 4c70ea7630..0000000000 --- a/3party/freetype/src/type1/type1.c +++ /dev/null @@ -1,33 +0,0 @@ -/***************************************************************************/ -/* */ -/* type1.c */ -/* */ -/* FreeType Type 1 driver component (body only). */ -/* */ -/* Copyright 1996-2015 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. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include -#include "t1parse.c" -#include "t1load.c" -#include "t1objs.c" -#include "t1driver.c" -#include "t1gload.c" - -#ifndef T1_CONFIG_OPTION_NO_AFM -#include "t1afm.c" -#endif - - -/* END */ diff --git a/3party/freetype/src/type42/Jamfile b/3party/freetype/src/type42/Jamfile deleted file mode 100644 index 722953d37f..0000000000 --- a/3party/freetype/src/type42/Jamfile +++ /dev/null @@ -1,32 +0,0 @@ -# FreeType 2 src/type42 Jamfile -# -# Copyright 2002-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) type42 ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = t42drivr - t42objs - t42parse - ; - } - else - { - _sources = type42 ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/type42 Jamfile diff --git a/3party/freetype/src/type42/module.mk b/3party/freetype/src/type42/module.mk deleted file mode 100644 index af7e651d95..0000000000 --- a/3party/freetype/src/type42/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 Type42 module definition -# - - -# Copyright 2002-2015 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. - - -FTMODULE_H_COMMANDS += TYPE42_DRIVER - -define TYPE42_DRIVER -$(OPEN_DRIVER) FT_Driver_ClassRec, t42_driver_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)type42 $(ECHO_DRIVER_DESC)Type 42 font files with no known extension$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/type42/rules.mk b/3party/freetype/src/type42/rules.mk deleted file mode 100644 index 4a8efca507..0000000000 --- a/3party/freetype/src/type42/rules.mk +++ /dev/null @@ -1,73 +0,0 @@ -# -# FreeType 2 Type42 driver configuration rules -# - - -# Copyright 2002-2015 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. - - -# Type42 driver directory -# -T42_DIR := $(SRC_DIR)/type42 - - -# compilation flags for the driver -# -T42_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(T42_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# Type42 driver source -# -T42_DRV_SRC := $(T42_DIR)/t42objs.c \ - $(T42_DIR)/t42parse.c \ - $(T42_DIR)/t42drivr.c - -# Type42 driver headers -# -T42_DRV_H := $(T42_DRV_SRC:%.c=%.h) \ - $(T42_DIR)/t42error.h \ - $(T42_DIR)/t42types.h - - -# Type42 driver object(s) -# -# T42_DRV_OBJ_M is used during `multi' builds -# T42_DRV_OBJ_S is used during `single' builds -# -T42_DRV_OBJ_M := $(T42_DRV_SRC:$(T42_DIR)/%.c=$(OBJ_DIR)/%.$O) -T42_DRV_OBJ_S := $(OBJ_DIR)/type42.$O - -# Type42 driver source file for single build -# -T42_DRV_SRC_S := $(T42_DIR)/type42.c - - -# Type42 driver - single object -# -$(T42_DRV_OBJ_S): $(T42_DRV_SRC_S) $(T42_DRV_SRC) $(FREETYPE_H) $(T42_DRV_H) - $(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T42_DRV_SRC_S)) - - -# Type42 driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(T42_DIR)/%.c $(FREETYPE_H) $(T42_DRV_H) - $(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(T42_DRV_OBJ_S) -DRV_OBJS_M += $(T42_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/type42/t42drivr.c b/3party/freetype/src/type42/t42drivr.c deleted file mode 100644 index 2907096c9f..0000000000 --- a/3party/freetype/src/type42/t42drivr.c +++ /dev/null @@ -1,244 +0,0 @@ -/***************************************************************************/ -/* */ -/* t42drivr.c */ -/* */ -/* High-level Type 42 driver interface (body). */ -/* */ -/* Copyright 2002-2015 by */ -/* Roberto Alameda. */ -/* */ -/* 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This driver implements Type42 fonts as described in the */ - /* Technical Note #5012 from Adobe, with these limitations: */ - /* */ - /* 1) CID Fonts are not currently supported. */ - /* 2) Incremental fonts making use of the GlyphDirectory keyword */ - /* will be loaded, but the rendering will be using the TrueType */ - /* tables. */ - /* 3) As for Type1 fonts, CDevProc is not supported. */ - /* 4) The Metrics dictionary is not supported. */ - /* 5) AFM metrics are not supported. */ - /* */ - /* In other words, this driver supports Type42 fonts derived from */ - /* TrueType fonts in a non-CID manner, as done by usual conversion */ - /* programs. */ - /* */ - /*************************************************************************/ - - -#include "t42drivr.h" -#include "t42objs.h" -#include "t42error.h" -#include FT_INTERNAL_DEBUG_H - -#include FT_SERVICE_FONT_FORMAT_H -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_POSTSCRIPT_INFO_H - -#undef FT_COMPONENT -#define FT_COMPONENT trace_t42 - - - /* - * - * GLYPH DICT SERVICE - * - */ - - static FT_Error - t42_get_glyph_name( T42_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ) - { - FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max ); - - return FT_Err_Ok; - } - - - static FT_UInt - t42_get_name_index( T42_Face face, - FT_String* glyph_name ) - { - FT_Int i; - - - for ( i = 0; i < face->type1.num_glyphs; i++ ) - { - FT_String* gname = face->type1.glyph_names[i]; - - - if ( glyph_name[0] == gname[0] && !ft_strcmp( glyph_name, gname ) ) - return (FT_UInt)ft_atol( (const char *)face->type1.charstrings[i] ); - } - - return 0; - } - - - static const FT_Service_GlyphDictRec t42_service_glyph_dict = - { - (FT_GlyphDict_GetNameFunc) t42_get_glyph_name, - (FT_GlyphDict_NameIndexFunc)t42_get_name_index - }; - - - /* - * - * POSTSCRIPT NAME SERVICE - * - */ - - static const char* - t42_get_ps_font_name( T42_Face face ) - { - return (const char*)face->type1.font_name; - } - - - static const FT_Service_PsFontNameRec t42_service_ps_font_name = - { - (FT_PsName_GetFunc)t42_get_ps_font_name - }; - - - /* - * - * POSTSCRIPT INFO SERVICE - * - */ - - static FT_Error - t42_ps_get_font_info( FT_Face face, - PS_FontInfoRec* afont_info ) - { - *afont_info = ((T42_Face)face)->type1.font_info; - - return FT_Err_Ok; - } - - - static FT_Error - t42_ps_get_font_extra( FT_Face face, - PS_FontExtraRec* afont_extra ) - { - *afont_extra = ((T42_Face)face)->type1.font_extra; - - return FT_Err_Ok; - } - - - static FT_Int - t42_ps_has_glyph_names( FT_Face face ) - { - FT_UNUSED( face ); - - return 1; - } - - - static FT_Error - t42_ps_get_font_private( FT_Face face, - PS_PrivateRec* afont_private ) - { - *afont_private = ((T42_Face)face)->type1.private_dict; - - return FT_Err_Ok; - } - - - static const FT_Service_PsInfoRec t42_service_ps_info = - { - (PS_GetFontInfoFunc) t42_ps_get_font_info, - (PS_GetFontExtraFunc) t42_ps_get_font_extra, - (PS_HasGlyphNamesFunc) t42_ps_has_glyph_names, - (PS_GetFontPrivateFunc)t42_ps_get_font_private, - (PS_GetFontValueFunc) NULL /* not implemented */ - }; - - - /* - * - * SERVICE LIST - * - */ - - static const FT_ServiceDescRec t42_services[] = - { - { FT_SERVICE_ID_GLYPH_DICT, &t42_service_glyph_dict }, - { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t42_service_ps_font_name }, - { FT_SERVICE_ID_POSTSCRIPT_INFO, &t42_service_ps_info }, - { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TYPE_42 }, - { NULL, NULL } - }; - - - FT_CALLBACK_DEF( FT_Module_Interface ) - T42_Get_Interface( FT_Module module, - const FT_String* t42_interface ) - { - FT_UNUSED( module ); - - return ft_service_list_lookup( t42_services, t42_interface ); - } - - - const FT_Driver_ClassRec t42_driver_class = - { - { - FT_MODULE_FONT_DRIVER | - FT_MODULE_DRIVER_SCALABLE | -#ifdef TT_USE_BYTECODE_INTERPRETER - FT_MODULE_DRIVER_HAS_HINTER, -#else - 0, -#endif - - sizeof ( T42_DriverRec ), - - "type42", - 0x10000L, - 0x20000L, - - 0, /* format interface */ - - T42_Driver_Init, - T42_Driver_Done, - T42_Get_Interface, - }, - - sizeof ( T42_FaceRec ), - sizeof ( T42_SizeRec ), - sizeof ( T42_GlyphSlotRec ), - - T42_Face_Init, - T42_Face_Done, - T42_Size_Init, - T42_Size_Done, - T42_GlyphSlot_Init, - T42_GlyphSlot_Done, - - T42_GlyphSlot_Load, - - 0, /* FT_Face_GetKerningFunc */ - 0, /* FT_Face_AttachFunc */ - - 0, /* FT_Face_GetAdvancesFunc */ - T42_Size_Request, - T42_Size_Select - }; - - -/* END */ diff --git a/3party/freetype/src/type42/t42drivr.h b/3party/freetype/src/type42/t42drivr.h deleted file mode 100644 index b4d1753a23..0000000000 --- a/3party/freetype/src/type42/t42drivr.h +++ /dev/null @@ -1,43 +0,0 @@ -/***************************************************************************/ -/* */ -/* t42drivr.h */ -/* */ -/* High-level Type 42 driver interface (specification). */ -/* */ -/* Copyright 2002-2015 by */ -/* Roberto Alameda. */ -/* */ -/* 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 __T42DRIVR_H__ -#define __T42DRIVR_H__ - - -#include -#include FT_INTERNAL_DRIVER_H - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC -#error "this module does not support PIC yet" -#endif - - - FT_EXPORT_VAR( const FT_Driver_ClassRec ) t42_driver_class; - - -FT_END_HEADER - - -#endif /* __T42DRIVR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/type42/t42error.h b/3party/freetype/src/type42/t42error.h deleted file mode 100644 index cddaf9e9ca..0000000000 --- a/3party/freetype/src/type42/t42error.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* t42error.h */ -/* */ -/* Type 42 error codes (specification only). */ -/* */ -/* Copyright 2002-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the Type 42 error enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __T42ERROR_H__ -#define __T42ERROR_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX T42_Err_ -#define FT_ERR_BASE FT_Mod_Err_Type42 - -#include FT_ERRORS_H - -#endif /* __T42ERROR_H__ */ - - -/* END */ diff --git a/3party/freetype/src/type42/t42objs.c b/3party/freetype/src/type42/t42objs.c deleted file mode 100644 index 430871aced..0000000000 --- a/3party/freetype/src/type42/t42objs.c +++ /dev/null @@ -1,696 +0,0 @@ -/***************************************************************************/ -/* */ -/* t42objs.c */ -/* */ -/* Type 42 objects manager (body). */ -/* */ -/* Copyright 2002-2015 by */ -/* Roberto Alameda. */ -/* */ -/* 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 "t42objs.h" -#include "t42parse.h" -#include "t42error.h" -#include FT_INTERNAL_DEBUG_H -#include FT_LIST_H -#include FT_TRUETYPE_IDS_H - - -#undef FT_COMPONENT -#define FT_COMPONENT trace_t42 - - - static FT_Error - T42_Open_Face( T42_Face face ) - { - T42_LoaderRec loader; - T42_Parser parser; - T1_Font type1 = &face->type1; - FT_Memory memory = face->root.memory; - FT_Error error; - - PSAux_Service psaux = (PSAux_Service)face->psaux; - - - t42_loader_init( &loader, face ); - - parser = &loader.parser; - - if ( FT_ALLOC( face->ttf_data, 12 ) ) - goto Exit; - - /* while parsing the font we always update `face->ttf_size' so that */ - /* even in case of buggy data (which might lead to premature end of */ - /* scanning without causing an error) the call to `FT_Open_Face' in */ - /* `T42_Face_Init' passes the correct size */ - face->ttf_size = 12; - - error = t42_parser_init( parser, - face->root.stream, - memory, - psaux); - if ( error ) - goto Exit; - - error = t42_parse_dict( face, &loader, - parser->base_dict, parser->base_len ); - if ( error ) - goto Exit; - - if ( type1->font_type != 42 ) - { - FT_ERROR(( "T42_Open_Face: cannot handle FontType %d\n", - type1->font_type )); - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - /* now, propagate the charstrings and glyphnames tables */ - /* to the Type1 data */ - type1->num_glyphs = loader.num_glyphs; - - if ( !loader.charstrings.init ) - { - FT_ERROR(( "T42_Open_Face: no charstrings array in face\n" )); - error = FT_THROW( Invalid_File_Format ); - } - - loader.charstrings.init = 0; - type1->charstrings_block = loader.charstrings.block; - type1->charstrings = loader.charstrings.elements; - type1->charstrings_len = loader.charstrings.lengths; - - /* we copy the glyph names `block' and `elements' fields; */ - /* the `lengths' field must be released later */ - type1->glyph_names_block = loader.glyph_names.block; - type1->glyph_names = (FT_String**)loader.glyph_names.elements; - loader.glyph_names.block = NULL; - loader.glyph_names.elements = NULL; - - /* we must now build type1.encoding when we have a custom array */ - if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY ) - { - FT_Int charcode, idx, min_char, max_char; - FT_Byte* glyph_name; - - - /* OK, we do the following: for each element in the encoding */ - /* table, look up the index of the glyph having the same name */ - /* as defined in the CharStrings array. */ - /* The index is then stored in type1.encoding.char_index, and */ - /* the name in type1.encoding.char_name */ - - min_char = 0; - max_char = 0; - - charcode = 0; - for ( ; charcode < loader.encoding_table.max_elems; charcode++ ) - { - FT_Byte* char_name; - - - type1->encoding.char_index[charcode] = 0; - type1->encoding.char_name [charcode] = (char *)".notdef"; - - char_name = loader.encoding_table.elements[charcode]; - if ( char_name ) - for ( idx = 0; idx < type1->num_glyphs; idx++ ) - { - glyph_name = (FT_Byte*)type1->glyph_names[idx]; - if ( ft_strcmp( (const char*)char_name, - (const char*)glyph_name ) == 0 ) - { - type1->encoding.char_index[charcode] = (FT_UShort)idx; - type1->encoding.char_name [charcode] = (char*)glyph_name; - - /* Change min/max encoded char only if glyph name is */ - /* not /.notdef */ - if ( ft_strcmp( (const char*)".notdef", - (const char*)glyph_name ) != 0 ) - { - if ( charcode < min_char ) - min_char = charcode; - if ( charcode >= max_char ) - max_char = charcode + 1; - } - break; - } - } - } - - type1->encoding.code_first = min_char; - type1->encoding.code_last = max_char; - type1->encoding.num_chars = loader.num_chars; - } - - Exit: - t42_loader_done( &loader ); - return error; - } - - - /***************** Driver Functions *************/ - - - FT_LOCAL_DEF( FT_Error ) - T42_Face_Init( FT_Stream stream, - FT_Face t42face, /* T42_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ) - { - T42_Face face = (T42_Face)t42face; - FT_Error error; - FT_Service_PsCMaps psnames; - PSAux_Service psaux; - FT_Face root = (FT_Face)&face->root; - T1_Font type1 = &face->type1; - PS_FontInfo info = &type1->font_info; - - FT_UNUSED( num_params ); - FT_UNUSED( params ); - FT_UNUSED( stream ); - - - face->ttf_face = NULL; - face->root.num_faces = 1; - - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); - face->psnames = psnames; - - face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), - "psaux" ); - psaux = (PSAux_Service)face->psaux; - if ( !psaux ) - { - FT_ERROR(( "T42_Face_Init: cannot access `psaux' module\n" )); - error = FT_THROW( Missing_Module ); - goto Exit; - } - - FT_TRACE2(( "Type 42 driver\n" )); - - /* open the tokenizer, this will also check the font format */ - error = T42_Open_Face( face ); - if ( error ) - goto Exit; - - /* if we just wanted to check the format, leave successfully now */ - if ( face_index < 0 ) - goto Exit; - - /* check the face index */ - if ( ( face_index & 0xFFFF ) > 0 ) - { - FT_ERROR(( "T42_Face_Init: invalid face index\n" )); - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* Now load the font program into the face object */ - - /* Init the face object fields */ - /* Now set up root face fields */ - - root->num_glyphs = type1->num_glyphs; - root->num_charmaps = 0; - root->face_index = 0; - - root->face_flags |= FT_FACE_FLAG_SCALABLE | - FT_FACE_FLAG_HORIZONTAL | - FT_FACE_FLAG_GLYPH_NAMES; - - if ( info->is_fixed_pitch ) - root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; - - /* We only set this flag if we have the patented bytecode interpreter. */ - /* There are no known `tricky' Type42 fonts that could be loaded with */ - /* the unpatented interpreter. */ -#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER - root->face_flags |= FT_FACE_FLAG_HINTER; -#endif - - /* XXX: TODO -- add kerning with .afm support */ - - /* get style name -- be careful, some broken fonts only */ - /* have a `/FontName' dictionary entry! */ - root->family_name = info->family_name; - /* assume "Regular" style if we don't know better */ - root->style_name = (char *)"Regular"; - if ( root->family_name ) - { - char* full = info->full_name; - char* family = root->family_name; - - - if ( full ) - { - while ( *full ) - { - if ( *full == *family ) - { - family++; - full++; - } - else - { - if ( *full == ' ' || *full == '-' ) - full++; - else if ( *family == ' ' || *family == '-' ) - family++; - else - { - if ( !*family ) - root->style_name = full; - break; - } - } - } - } - } - else - { - /* do we have a `/FontName'? */ - if ( type1->font_name ) - root->family_name = type1->font_name; - } - - /* no embedded bitmap support */ - root->num_fixed_sizes = 0; - root->available_sizes = NULL; - - /* Load the TTF font embedded in the T42 font */ - { - FT_Open_Args args; - - - args.flags = FT_OPEN_MEMORY | FT_OPEN_DRIVER; - args.driver = FT_Get_Module( FT_FACE_LIBRARY( face ), - "truetype" ); - args.memory_base = face->ttf_data; - args.memory_size = face->ttf_size; - - if ( num_params ) - { - args.flags |= FT_OPEN_PARAMS; - args.num_params = num_params; - args.params = params; - } - - error = FT_Open_Face( FT_FACE_LIBRARY( face ), - &args, 0, &face->ttf_face ); - } - - if ( error ) - goto Exit; - - FT_Done_Size( face->ttf_face->size ); - - /* Ignore info in FontInfo dictionary and use the info from the */ - /* loaded TTF font. The PostScript interpreter also ignores it. */ - root->bbox = face->ttf_face->bbox; - root->units_per_EM = face->ttf_face->units_per_EM; - - root->ascender = face->ttf_face->ascender; - root->descender = face->ttf_face->descender; - root->height = face->ttf_face->height; - - root->max_advance_width = face->ttf_face->max_advance_width; - root->max_advance_height = face->ttf_face->max_advance_height; - - root->underline_position = (FT_Short)info->underline_position; - root->underline_thickness = (FT_Short)info->underline_thickness; - - /* compute style flags */ - root->style_flags = 0; - if ( info->italic_angle ) - root->style_flags |= FT_STYLE_FLAG_ITALIC; - - if ( face->ttf_face->style_flags & FT_STYLE_FLAG_BOLD ) - root->style_flags |= FT_STYLE_FLAG_BOLD; - - if ( face->ttf_face->face_flags & FT_FACE_FLAG_VERTICAL ) - root->face_flags |= FT_FACE_FLAG_VERTICAL; - - { - if ( psnames ) - { - FT_CharMapRec charmap; - T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes; - FT_CMap_Class clazz; - - - charmap.face = root; - - /* first of all, try to synthesize a Unicode charmap */ - charmap.platform_id = TT_PLATFORM_MICROSOFT; - charmap.encoding_id = TT_MS_ID_UNICODE_CS; - charmap.encoding = FT_ENCODING_UNICODE; - - error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL ); - if ( error && - FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) ) - goto Exit; - error = FT_Err_Ok; - - /* now, generate an Adobe Standard encoding when appropriate */ - charmap.platform_id = TT_PLATFORM_ADOBE; - clazz = NULL; - - switch ( type1->encoding_type ) - { - case T1_ENCODING_TYPE_STANDARD: - charmap.encoding = FT_ENCODING_ADOBE_STANDARD; - charmap.encoding_id = TT_ADOBE_ID_STANDARD; - clazz = cmap_classes->standard; - break; - - case T1_ENCODING_TYPE_EXPERT: - charmap.encoding = FT_ENCODING_ADOBE_EXPERT; - charmap.encoding_id = TT_ADOBE_ID_EXPERT; - clazz = cmap_classes->expert; - break; - - case T1_ENCODING_TYPE_ARRAY: - charmap.encoding = FT_ENCODING_ADOBE_CUSTOM; - charmap.encoding_id = TT_ADOBE_ID_CUSTOM; - clazz = cmap_classes->custom; - break; - - case T1_ENCODING_TYPE_ISOLATIN1: - charmap.encoding = FT_ENCODING_ADOBE_LATIN_1; - charmap.encoding_id = TT_ADOBE_ID_LATIN_1; - clazz = cmap_classes->unicode; - break; - - default: - ; - } - - if ( clazz ) - error = FT_CMap_New( clazz, NULL, &charmap, NULL ); - -#if 0 - /* Select default charmap */ - if ( root->num_charmaps ) - root->charmap = root->charmaps[0]; -#endif - } - } - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - T42_Face_Done( FT_Face t42face ) - { - T42_Face face = (T42_Face)t42face; - T1_Font type1; - PS_FontInfo info; - FT_Memory memory; - - - if ( !face ) - return; - - type1 = &face->type1; - info = &type1->font_info; - memory = face->root.memory; - - /* delete internal ttf face prior to freeing face->ttf_data */ - if ( face->ttf_face ) - FT_Done_Face( face->ttf_face ); - - /* release font info strings */ - FT_FREE( info->version ); - FT_FREE( info->notice ); - FT_FREE( info->full_name ); - FT_FREE( info->family_name ); - FT_FREE( info->weight ); - - /* release top dictionary */ - FT_FREE( type1->charstrings_len ); - FT_FREE( type1->charstrings ); - FT_FREE( type1->glyph_names ); - - FT_FREE( type1->charstrings_block ); - FT_FREE( type1->glyph_names_block ); - - FT_FREE( type1->encoding.char_index ); - FT_FREE( type1->encoding.char_name ); - FT_FREE( type1->font_name ); - - FT_FREE( face->ttf_data ); - -#if 0 - /* release afm data if present */ - if ( face->afm_data ) - T1_Done_AFM( memory, (T1_AFM*)face->afm_data ); -#endif - - /* release unicode map, if any */ - FT_FREE( face->unicode_map.maps ); - face->unicode_map.num_maps = 0; - - face->root.family_name = NULL; - face->root.style_name = NULL; - } - - - /*************************************************************************/ - /* */ - /* */ - /* T42_Driver_Init */ - /* */ - /* */ - /* Initializes a given Type 42 driver object. */ - /* */ - /* */ - /* driver :: A handle to the target driver object. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - T42_Driver_Init( FT_Module module ) /* T42_Driver */ - { - T42_Driver driver = (T42_Driver)module; - FT_Module ttmodule; - - - ttmodule = FT_Get_Module( module->library, "truetype" ); - if ( !ttmodule ) - { - FT_ERROR(( "T42_Driver_Init: cannot access `truetype' module\n" )); - return FT_THROW( Missing_Module ); - } - - driver->ttclazz = (FT_Driver_Class)ttmodule->clazz; - - return FT_Err_Ok; - } - - - FT_LOCAL_DEF( void ) - T42_Driver_Done( FT_Module module ) - { - FT_UNUSED( module ); - } - - - FT_LOCAL_DEF( FT_Error ) - T42_Size_Init( FT_Size size ) /* T42_Size */ - { - T42_Size t42size = (T42_Size)size; - FT_Face face = size->face; - T42_Face t42face = (T42_Face)face; - FT_Size ttsize; - FT_Error error; - - - error = FT_New_Size( t42face->ttf_face, &ttsize ); - t42size->ttsize = ttsize; - - FT_Activate_Size( ttsize ); - - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - T42_Size_Request( FT_Size t42size, /* T42_Size */ - FT_Size_Request req ) - { - T42_Size size = (T42_Size)t42size; - T42_Face face = (T42_Face)t42size->face; - FT_Error error; - - - FT_Activate_Size( size->ttsize ); - - error = FT_Request_Size( face->ttf_face, req ); - if ( !error ) - t42size->metrics = face->ttf_face->size->metrics; - - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - T42_Size_Select( FT_Size t42size, /* T42_Size */ - FT_ULong strike_index ) - { - T42_Size size = (T42_Size)t42size; - T42_Face face = (T42_Face)t42size->face; - FT_Error error; - - - FT_Activate_Size( size->ttsize ); - - error = FT_Select_Size( face->ttf_face, (FT_Int)strike_index ); - if ( !error ) - t42size->metrics = face->ttf_face->size->metrics; - - return error; - - } - - - FT_LOCAL_DEF( void ) - T42_Size_Done( FT_Size t42size ) /* T42_Size */ - { - T42_Size size = (T42_Size)t42size; - FT_Face face = t42size->face; - T42_Face t42face = (T42_Face)face; - FT_ListNode node; - - - node = FT_List_Find( &t42face->ttf_face->sizes_list, size->ttsize ); - if ( node ) - { - FT_Done_Size( size->ttsize ); - size->ttsize = NULL; - } - } - - - FT_LOCAL_DEF( FT_Error ) - T42_GlyphSlot_Init( FT_GlyphSlot t42slot ) /* T42_GlyphSlot */ - { - T42_GlyphSlot slot = (T42_GlyphSlot)t42slot; - FT_Face face = t42slot->face; - T42_Face t42face = (T42_Face)face; - FT_GlyphSlot ttslot; - FT_Error error = FT_Err_Ok; - - - if ( face->glyph == NULL ) - { - /* First glyph slot for this face */ - slot->ttslot = t42face->ttf_face->glyph; - } - else - { - error = FT_New_GlyphSlot( t42face->ttf_face, &ttslot ); - slot->ttslot = ttslot; - } - - return error; - } - - - FT_LOCAL_DEF( void ) - T42_GlyphSlot_Done( FT_GlyphSlot t42slot ) /* T42_GlyphSlot */ - { - T42_GlyphSlot slot = (T42_GlyphSlot)t42slot; - - - FT_Done_GlyphSlot( slot->ttslot ); - } - - - static void - t42_glyphslot_clear( FT_GlyphSlot slot ) - { - /* free bitmap if needed */ - ft_glyphslot_free_bitmap( slot ); - - /* clear all public fields in the glyph slot */ - FT_ZERO( &slot->metrics ); - FT_ZERO( &slot->outline ); - FT_ZERO( &slot->bitmap ); - - slot->bitmap_left = 0; - slot->bitmap_top = 0; - slot->num_subglyphs = 0; - slot->subglyphs = NULL; - slot->control_data = NULL; - slot->control_len = 0; - slot->other = NULL; - slot->format = FT_GLYPH_FORMAT_NONE; - - slot->linearHoriAdvance = 0; - slot->linearVertAdvance = 0; - } - - - FT_LOCAL_DEF( FT_Error ) - T42_GlyphSlot_Load( FT_GlyphSlot glyph, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FT_Error error; - T42_GlyphSlot t42slot = (T42_GlyphSlot)glyph; - T42_Size t42size = (T42_Size)size; - T42_Face t42face = (T42_Face)size->face; - FT_Driver_Class ttclazz = ((T42_Driver)glyph->face->driver)->ttclazz; - - - FT_TRACE1(( "T42_GlyphSlot_Load: glyph index %d\n", glyph_index )); - - /* map T42 glyph index to embedded TTF's glyph index */ - glyph_index = (FT_UInt)ft_atol( - (const char *)t42face->type1.charstrings[glyph_index] ); - - t42_glyphslot_clear( t42slot->ttslot ); - error = ttclazz->load_glyph( t42slot->ttslot, - t42size->ttsize, - glyph_index, - load_flags | FT_LOAD_NO_BITMAP ); - - if ( !error ) - { - glyph->metrics = t42slot->ttslot->metrics; - - glyph->linearHoriAdvance = t42slot->ttslot->linearHoriAdvance; - glyph->linearVertAdvance = t42slot->ttslot->linearVertAdvance; - - glyph->format = t42slot->ttslot->format; - glyph->outline = t42slot->ttslot->outline; - - glyph->bitmap = t42slot->ttslot->bitmap; - glyph->bitmap_left = t42slot->ttslot->bitmap_left; - glyph->bitmap_top = t42slot->ttslot->bitmap_top; - - glyph->num_subglyphs = t42slot->ttslot->num_subglyphs; - glyph->subglyphs = t42slot->ttslot->subglyphs; - - glyph->control_data = t42slot->ttslot->control_data; - glyph->control_len = t42slot->ttslot->control_len; - } - - return error; - } - - -/* END */ diff --git a/3party/freetype/src/type42/t42objs.h b/3party/freetype/src/type42/t42objs.h deleted file mode 100644 index 3722c670f0..0000000000 --- a/3party/freetype/src/type42/t42objs.h +++ /dev/null @@ -1,124 +0,0 @@ -/***************************************************************************/ -/* */ -/* t42objs.h */ -/* */ -/* Type 42 objects manager (specification). */ -/* */ -/* Copyright 2002-2015 by */ -/* Roberto Alameda. */ -/* */ -/* 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 __T42OBJS_H__ -#define __T42OBJS_H__ - -#include -#include FT_FREETYPE_H -#include FT_TYPE1_TABLES_H -#include FT_INTERNAL_TYPE1_TYPES_H -#include "t42types.h" -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DRIVER_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - - -FT_BEGIN_HEADER - - - /* Type42 size */ - typedef struct T42_SizeRec_ - { - FT_SizeRec root; - FT_Size ttsize; - - } T42_SizeRec, *T42_Size; - - - /* Type42 slot */ - typedef struct T42_GlyphSlotRec_ - { - FT_GlyphSlotRec root; - FT_GlyphSlot ttslot; - - } T42_GlyphSlotRec, *T42_GlyphSlot; - - - /* Type 42 driver */ - typedef struct T42_DriverRec_ - { - FT_DriverRec root; - FT_Driver_Class ttclazz; - - } T42_DriverRec, *T42_Driver; - - - /* */ - - - FT_LOCAL( FT_Error ) - T42_Face_Init( FT_Stream stream, - FT_Face face, - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - - FT_LOCAL( void ) - T42_Face_Done( FT_Face face ); - - - FT_LOCAL( FT_Error ) - T42_Size_Init( FT_Size size ); - - - FT_LOCAL( FT_Error ) - T42_Size_Request( FT_Size size, - FT_Size_Request req ); - - - FT_LOCAL( FT_Error ) - T42_Size_Select( FT_Size size, - FT_ULong strike_index ); - - - FT_LOCAL( void ) - T42_Size_Done( FT_Size size ); - - - FT_LOCAL( FT_Error ) - T42_GlyphSlot_Init( FT_GlyphSlot slot ); - - - FT_LOCAL( FT_Error ) - T42_GlyphSlot_Load( FT_GlyphSlot glyph, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ); - - FT_LOCAL( void ) - T42_GlyphSlot_Done( FT_GlyphSlot slot ); - - - FT_LOCAL( FT_Error ) - T42_Driver_Init( FT_Module module ); - - FT_LOCAL( void ) - T42_Driver_Done( FT_Module module ); - - /* */ - -FT_END_HEADER - - -#endif /* __T42OBJS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/type42/t42parse.c b/3party/freetype/src/type42/t42parse.c deleted file mode 100644 index fadbf21ab6..0000000000 --- a/3party/freetype/src/type42/t42parse.c +++ /dev/null @@ -1,1229 +0,0 @@ -/***************************************************************************/ -/* */ -/* t42parse.c */ -/* */ -/* Type 42 font parser (body). */ -/* */ -/* Copyright 2002-2015 by */ -/* Roberto Alameda. */ -/* */ -/* 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 "t42parse.h" -#include "t42error.h" -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_t42 - - - static void - t42_parse_font_matrix( T42_Face face, - T42_Loader loader ); - static void - t42_parse_encoding( T42_Face face, - T42_Loader loader ); - - static void - t42_parse_charstrings( T42_Face face, - T42_Loader loader ); - - static void - t42_parse_sfnts( T42_Face face, - T42_Loader loader ); - - - /* as Type42 fonts have no Private dict, */ - /* we set the last argument of T1_FIELD_XXX to 0 */ - static const - T1_FieldRec t42_keywords[] = - { - -#undef FT_STRUCTURE -#define FT_STRUCTURE T1_FontInfo -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_FONT_INFO - - T1_FIELD_STRING( "version", version, 0 ) - T1_FIELD_STRING( "Notice", notice, 0 ) - T1_FIELD_STRING( "FullName", full_name, 0 ) - T1_FIELD_STRING( "FamilyName", family_name, 0 ) - T1_FIELD_STRING( "Weight", weight, 0 ) - T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 ) - T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 ) - T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 ) - T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 ) - -#undef FT_STRUCTURE -#define FT_STRUCTURE PS_FontExtraRec -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA - - T1_FIELD_NUM ( "FSType", fs_type, 0 ) - -#undef FT_STRUCTURE -#define FT_STRUCTURE T1_FontRec -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_FONT_DICT - - T1_FIELD_KEY ( "FontName", font_name, 0 ) - T1_FIELD_NUM ( "PaintType", paint_type, 0 ) - T1_FIELD_NUM ( "FontType", font_type, 0 ) - T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 ) - -#undef FT_STRUCTURE -#define FT_STRUCTURE FT_BBox -#undef T1CODE -#define T1CODE T1_FIELD_LOCATION_BBOX - - T1_FIELD_BBOX("FontBBox", xMin, 0 ) - - T1_FIELD_CALLBACK( "FontMatrix", t42_parse_font_matrix, 0 ) - T1_FIELD_CALLBACK( "Encoding", t42_parse_encoding, 0 ) - T1_FIELD_CALLBACK( "CharStrings", t42_parse_charstrings, 0 ) - T1_FIELD_CALLBACK( "sfnts", t42_parse_sfnts, 0 ) - - { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 } - }; - - -#define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l ) -#define T1_Release_Table( p ) \ - do \ - { \ - if ( (p)->funcs.release ) \ - (p)->funcs.release( p ); \ - } while ( 0 ) - -#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) -#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root ) - -#define T1_ToInt( p ) \ - (p)->root.funcs.to_int( &(p)->root ) -#define T1_ToBytes( p, b, m, n, d ) \ - (p)->root.funcs.to_bytes( &(p)->root, b, m, n, d ) - -#define T1_ToFixedArray( p, m, f, t ) \ - (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) -#define T1_ToToken( p, t ) \ - (p)->root.funcs.to_token( &(p)->root, t ) - -#define T1_Load_Field( p, f, o, m, pf ) \ - (p)->root.funcs.load_field( &(p)->root, f, o, m, pf ) -#define T1_Load_Field_Table( p, f, o, m, pf ) \ - (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf ) - - - /********************* Parsing Functions ******************/ - - FT_LOCAL_DEF( FT_Error ) - t42_parser_init( T42_Parser parser, - FT_Stream stream, - FT_Memory memory, - PSAux_Service psaux ) - { - FT_Error error = FT_Err_Ok; - FT_Long size; - - - psaux->ps_parser_funcs->init( &parser->root, NULL, NULL, memory ); - - parser->stream = stream; - parser->base_len = 0; - parser->base_dict = NULL; - parser->in_memory = 0; - - /*******************************************************************/ - /* */ - /* Here a short summary of what is going on: */ - /* */ - /* When creating a new Type 42 parser, we try to locate and load */ - /* the base dictionary, loading the whole font into memory. */ - /* */ - /* When `loading' the base dictionary, we only set up pointers */ - /* in the case of a memory-based stream. Otherwise, we allocate */ - /* and load the base dictionary in it. */ - /* */ - /* parser->in_memory is set if we have a memory stream. */ - /* */ - - if ( FT_STREAM_SEEK( 0L ) || - FT_FRAME_ENTER( 17 ) ) - goto Exit; - - if ( ft_memcmp( stream->cursor, "%!PS-TrueTypeFont", 17 ) != 0 ) - { - FT_TRACE2(( " not a Type42 font\n" )); - error = FT_THROW( Unknown_File_Format ); - } - - FT_FRAME_EXIT(); - - if ( error || FT_STREAM_SEEK( 0 ) ) - goto Exit; - - size = (FT_Long)stream->size; - - /* now, try to load `size' bytes of the `base' dictionary we */ - /* found previously */ - - /* if it is a memory-based resource, set up pointers */ - if ( !stream->read ) - { - parser->base_dict = (FT_Byte*)stream->base + stream->pos; - parser->base_len = size; - parser->in_memory = 1; - - /* check that the `size' field is valid */ - if ( FT_STREAM_SKIP( size ) ) - goto Exit; - } - else - { - /* read segment in memory */ - if ( FT_ALLOC( parser->base_dict, size ) || - FT_STREAM_READ( parser->base_dict, size ) ) - goto Exit; - - parser->base_len = size; - } - - parser->root.base = parser->base_dict; - parser->root.cursor = parser->base_dict; - parser->root.limit = parser->root.cursor + parser->base_len; - - Exit: - if ( error && !parser->in_memory ) - FT_FREE( parser->base_dict ); - - return error; - } - - - FT_LOCAL_DEF( void ) - t42_parser_done( T42_Parser parser ) - { - FT_Memory memory = parser->root.memory; - - - /* free the base dictionary only when we have a disk stream */ - if ( !parser->in_memory ) - FT_FREE( parser->base_dict ); - - parser->root.funcs.done( &parser->root ); - } - - - static int - t42_is_space( FT_Byte c ) - { - return ( c == ' ' || c == '\t' || - c == '\r' || c == '\n' || c == '\f' || - c == '\0' ); - } - - - static void - t42_parse_font_matrix( T42_Face face, - T42_Loader loader ) - { - T42_Parser parser = &loader->parser; - FT_Matrix* matrix = &face->type1.font_matrix; - FT_Vector* offset = &face->type1.font_offset; - FT_Fixed temp[6]; - FT_Fixed temp_scale; - FT_Int result; - - - result = T1_ToFixedArray( parser, 6, temp, 0 ); - - if ( result < 6 ) - { - parser->root.error = FT_THROW( Invalid_File_Format ); - return; - } - - temp_scale = FT_ABS( temp[3] ); - - if ( temp_scale == 0 ) - { - FT_ERROR(( "t42_parse_font_matrix: invalid font matrix\n" )); - parser->root.error = FT_THROW( Invalid_File_Format ); - return; - } - - /* atypical case */ - if ( temp_scale != 0x10000L ) - { - temp[0] = FT_DivFix( temp[0], temp_scale ); - temp[1] = FT_DivFix( temp[1], temp_scale ); - temp[2] = FT_DivFix( temp[2], temp_scale ); - temp[4] = FT_DivFix( temp[4], temp_scale ); - temp[5] = FT_DivFix( temp[5], temp_scale ); - temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L; - } - - matrix->xx = temp[0]; - matrix->yx = temp[1]; - matrix->xy = temp[2]; - matrix->yy = temp[3]; - - /* note that the offsets must be expressed in integer font units */ - offset->x = temp[4] >> 16; - offset->y = temp[5] >> 16; - } - - - static void - t42_parse_encoding( T42_Face face, - T42_Loader loader ) - { - T42_Parser parser = &loader->parser; - FT_Byte* cur; - FT_Byte* limit = parser->root.limit; - - PSAux_Service psaux = (PSAux_Service)face->psaux; - - - T1_Skip_Spaces( parser ); - cur = parser->root.cursor; - if ( cur >= limit ) - { - FT_ERROR(( "t42_parse_encoding: out of bounds\n" )); - parser->root.error = FT_THROW( Invalid_File_Format ); - return; - } - - /* if we have a number or `[', the encoding is an array, */ - /* and we must load it now */ - if ( ft_isdigit( *cur ) || *cur == '[' ) - { - T1_Encoding encode = &face->type1.encoding; - FT_Int count, n; - PS_Table char_table = &loader->encoding_table; - FT_Memory memory = parser->root.memory; - FT_Error error; - FT_Bool only_immediates = 0; - - - /* read the number of entries in the encoding; should be 256 */ - if ( *cur == '[' ) - { - count = 256; - only_immediates = 1; - parser->root.cursor++; - } - else - count = (FT_Int)T1_ToInt( parser ); - - T1_Skip_Spaces( parser ); - if ( parser->root.cursor >= limit ) - return; - - /* we use a T1_Table to store our charnames */ - loader->num_chars = encode->num_chars = count; - if ( FT_NEW_ARRAY( encode->char_index, count ) || - FT_NEW_ARRAY( encode->char_name, count ) || - FT_SET_ERROR( psaux->ps_table_funcs->init( - char_table, count, memory ) ) ) - { - parser->root.error = error; - return; - } - - /* We need to `zero' out encoding_table.elements */ - for ( n = 0; n < count; n++ ) - { - char* notdef = (char *)".notdef"; - - - (void)T1_Add_Table( char_table, n, notdef, 8 ); - } - - /* Now we need to read records of the form */ - /* */ - /* ... charcode /charname ... */ - /* */ - /* for each entry in our table. */ - /* */ - /* We simply look for a number followed by an immediate */ - /* name. Note that this ignores correctly the sequence */ - /* that is often seen in type42 fonts: */ - /* */ - /* 0 1 255 { 1 index exch /.notdef put } for dup */ - /* */ - /* used to clean the encoding array before anything else. */ - /* */ - /* Alternatively, if the array is directly given as */ - /* */ - /* /Encoding [ ... ] */ - /* */ - /* we only read immediates. */ - - n = 0; - T1_Skip_Spaces( parser ); - - while ( parser->root.cursor < limit ) - { - cur = parser->root.cursor; - - /* we stop when we encounter `def' or `]' */ - if ( *cur == 'd' && cur + 3 < limit ) - { - if ( cur[1] == 'e' && - cur[2] == 'f' && - t42_is_space( cur[3] ) ) - { - FT_TRACE6(( "encoding end\n" )); - cur += 3; - break; - } - } - if ( *cur == ']' ) - { - FT_TRACE6(( "encoding end\n" )); - cur++; - break; - } - - /* check whether we have found an entry */ - if ( ft_isdigit( *cur ) || only_immediates ) - { - FT_Int charcode; - - - if ( only_immediates ) - charcode = n; - else - { - charcode = (FT_Int)T1_ToInt( parser ); - T1_Skip_Spaces( parser ); - } - - cur = parser->root.cursor; - - if ( cur + 2 < limit && *cur == '/' && n < count ) - { - FT_UInt len; - - - cur++; - - parser->root.cursor = cur; - T1_Skip_PS_Token( parser ); - if ( parser->root.cursor >= limit ) - return; - if ( parser->root.error ) - return; - - len = (FT_UInt)( parser->root.cursor - cur ); - - parser->root.error = T1_Add_Table( char_table, charcode, - cur, len + 1 ); - if ( parser->root.error ) - return; - char_table->elements[charcode][len] = '\0'; - - n++; - } - else if ( only_immediates ) - { - /* Since the current position is not updated for */ - /* immediates-only mode we would get an infinite loop if */ - /* we don't do anything here. */ - /* */ - /* This encoding array is not valid according to the type1 */ - /* specification (it might be an encoding for a CID type1 */ - /* font, however), so we conclude that this font is NOT a */ - /* type1 font. */ - parser->root.error = FT_THROW( Unknown_File_Format ); - return; - } - } - else - { - T1_Skip_PS_Token( parser ); - if ( parser->root.error ) - return; - } - - T1_Skip_Spaces( parser ); - } - - face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; - parser->root.cursor = cur; - } - - /* Otherwise, we should have either `StandardEncoding', */ - /* `ExpertEncoding', or `ISOLatin1Encoding' */ - else - { - if ( cur + 17 < limit && - ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 ) - face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD; - - else if ( cur + 15 < limit && - ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 ) - face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT; - - else if ( cur + 18 < limit && - ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 ) - face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; - - else - parser->root.error = FT_THROW( Ignore ); - } - } - - - typedef enum T42_Load_Status_ - { - BEFORE_START, - BEFORE_TABLE_DIR, - OTHER_TABLES - - } T42_Load_Status; - - - static void - t42_parse_sfnts( T42_Face face, - T42_Loader loader ) - { - T42_Parser parser = &loader->parser; - FT_Memory memory = parser->root.memory; - FT_Byte* cur; - FT_Byte* limit = parser->root.limit; - FT_Error error; - FT_Int num_tables = 0; - FT_Long count; - - FT_ULong n, string_size, old_string_size, real_size; - FT_Byte* string_buf = NULL; - FT_Bool allocated = 0; - - T42_Load_Status status; - - - /* The format is */ - /* */ - /* /sfnts [ ... ] def */ - /* */ - /* or */ - /* */ - /* /sfnts [ */ - /* RD */ - /* RD */ - /* ... */ - /* ] def */ - /* */ - /* with exactly one space after the `RD' token. */ - - T1_Skip_Spaces( parser ); - - if ( parser->root.cursor >= limit || *parser->root.cursor++ != '[' ) - { - FT_ERROR(( "t42_parse_sfnts: can't find begin of sfnts vector\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - T1_Skip_Spaces( parser ); - status = BEFORE_START; - string_size = 0; - old_string_size = 0; - count = 0; - - while ( parser->root.cursor < limit ) - { - cur = parser->root.cursor; - - if ( *cur == ']' ) - { - parser->root.cursor++; - goto Exit; - } - - else if ( *cur == '<' ) - { - T1_Skip_PS_Token( parser ); - if ( parser->root.error ) - goto Exit; - - /* don't include delimiters */ - string_size = (FT_ULong)( ( parser->root.cursor - cur - 2 + 1 ) / 2 ); - if ( !string_size ) - { - FT_ERROR(( "t42_parse_sfnts: invalid data in sfnts array\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - if ( FT_REALLOC( string_buf, old_string_size, string_size ) ) - goto Fail; - - allocated = 1; - - parser->root.cursor = cur; - (void)T1_ToBytes( parser, string_buf, string_size, &real_size, 1 ); - old_string_size = string_size; - string_size = real_size; - } - - else if ( ft_isdigit( *cur ) ) - { - FT_Long tmp; - - - if ( allocated ) - { - FT_ERROR(( "t42_parse_sfnts: " - "can't handle mixed binary and hex strings\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - tmp = T1_ToInt( parser ); - if ( tmp < 0 ) - { - FT_ERROR(( "t42_parse_sfnts: invalid string size\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - else - string_size = (FT_ULong)tmp; - - T1_Skip_PS_Token( parser ); /* `RD' */ - if ( parser->root.error ) - return; - - string_buf = parser->root.cursor + 1; /* one space after `RD' */ - - if ( (FT_ULong)( limit - parser->root.cursor ) < string_size ) - { - FT_ERROR(( "t42_parse_sfnts: too much binary data\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - else - parser->root.cursor += string_size + 1; - } - - if ( !string_buf ) - { - FT_ERROR(( "t42_parse_sfnts: invalid data in sfnts array\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - /* A string can have a trailing zero (odd) byte for padding. */ - /* Ignore it. */ - if ( ( string_size & 1 ) && string_buf[string_size - 1] == 0 ) - string_size--; - - if ( !string_size ) - { - FT_ERROR(( "t42_parse_sfnts: invalid string\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - for ( n = 0; n < string_size; n++ ) - { - switch ( status ) - { - case BEFORE_START: - /* load offset table, 12 bytes */ - if ( count < 12 ) - { - face->ttf_data[count++] = string_buf[n]; - continue; - } - else - { - num_tables = 16 * face->ttf_data[4] + face->ttf_data[5]; - status = BEFORE_TABLE_DIR; - face->ttf_size = 12 + 16 * num_tables; - - if ( (FT_Long)( limit - parser->root.cursor ) < face->ttf_size ) - { - FT_ERROR(( "t42_parse_sfnts: invalid data in sfnts array\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - if ( FT_REALLOC( face->ttf_data, 12, face->ttf_size ) ) - goto Fail; - } - /* fall through */ - - case BEFORE_TABLE_DIR: - /* the offset table is read; read the table directory */ - if ( count < face->ttf_size ) - { - face->ttf_data[count++] = string_buf[n]; - continue; - } - else - { - int i; - FT_ULong len; - - - for ( i = 0; i < num_tables; i++ ) - { - FT_Byte* p = face->ttf_data + 12 + 16 * i + 12; - - - len = FT_PEEK_ULONG( p ); - - /* Pad to a 4-byte boundary length */ - face->ttf_size += (FT_Long)( ( len + 3 ) & ~3U ); - } - - status = OTHER_TABLES; - - /* there are no more than 256 tables, so no size check here */ - if ( FT_REALLOC( face->ttf_data, 12 + 16 * num_tables, - face->ttf_size + 1 ) ) - goto Fail; - } - /* fall through */ - - case OTHER_TABLES: - /* all other tables are just copied */ - if ( count >= face->ttf_size ) - { - FT_ERROR(( "t42_parse_sfnts: too much binary data\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - face->ttf_data[count++] = string_buf[n]; - } - } - - T1_Skip_Spaces( parser ); - } - - /* if control reaches this point, the format was not valid */ - error = FT_THROW( Invalid_File_Format ); - - Fail: - parser->root.error = error; - - Exit: - if ( allocated ) - FT_FREE( string_buf ); - } - - - static void - t42_parse_charstrings( T42_Face face, - T42_Loader loader ) - { - T42_Parser parser = &loader->parser; - PS_Table code_table = &loader->charstrings; - PS_Table name_table = &loader->glyph_names; - PS_Table swap_table = &loader->swap_table; - FT_Memory memory = parser->root.memory; - FT_Error error; - - PSAux_Service psaux = (PSAux_Service)face->psaux; - - FT_Byte* cur; - FT_Byte* limit = parser->root.limit; - FT_Int n; - FT_Int notdef_index = 0; - FT_Byte notdef_found = 0; - - - T1_Skip_Spaces( parser ); - - if ( parser->root.cursor >= limit ) - { - FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - if ( ft_isdigit( *parser->root.cursor ) ) - { - loader->num_glyphs = T1_ToInt( parser ); - if ( parser->root.error ) - return; - if ( loader->num_glyphs < 0 ) - { - FT_ERROR(( "t42_parse_encoding: invalid number of glyphs\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - } - else if ( *parser->root.cursor == '<' ) - { - /* We have `<< ... >>'. Count the number of `/' in the dictionary */ - /* to get its size. */ - FT_Int count = 0; - - - T1_Skip_PS_Token( parser ); - if ( parser->root.error ) - return; - T1_Skip_Spaces( parser ); - cur = parser->root.cursor; - - while ( parser->root.cursor < limit ) - { - if ( *parser->root.cursor == '/' ) - count++; - else if ( *parser->root.cursor == '>' ) - { - loader->num_glyphs = count; - parser->root.cursor = cur; /* rewind */ - break; - } - T1_Skip_PS_Token( parser ); - if ( parser->root.error ) - return; - T1_Skip_Spaces( parser ); - } - } - else - { - FT_ERROR(( "t42_parse_charstrings: invalid token\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - if ( parser->root.cursor >= limit ) - { - FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - /* initialize tables */ - - error = psaux->ps_table_funcs->init( code_table, - loader->num_glyphs, - memory ); - if ( error ) - goto Fail; - - error = psaux->ps_table_funcs->init( name_table, - loader->num_glyphs, - memory ); - if ( error ) - goto Fail; - - /* Initialize table for swapping index notdef_index and */ - /* index 0 names and codes (if necessary). */ - - error = psaux->ps_table_funcs->init( swap_table, 4, memory ); - if ( error ) - goto Fail; - - n = 0; - - for (;;) - { - /* The format is simple: */ - /* `/glyphname' + index [+ def] */ - - T1_Skip_Spaces( parser ); - - cur = parser->root.cursor; - if ( cur >= limit ) - break; - - /* We stop when we find an `end' keyword or '>' */ - if ( *cur == 'e' && - cur + 3 < limit && - cur[1] == 'n' && - cur[2] == 'd' && - t42_is_space( cur[3] ) ) - break; - if ( *cur == '>' ) - break; - - T1_Skip_PS_Token( parser ); - if ( parser->root.cursor >= limit ) - { - FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - if ( parser->root.error ) - return; - - if ( *cur == '/' ) - { - FT_UInt len; - - - if ( cur + 2 >= limit ) - { - FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - cur++; /* skip `/' */ - len = (FT_UInt)( parser->root.cursor - cur ); - - error = T1_Add_Table( name_table, n, cur, len + 1 ); - if ( error ) - goto Fail; - - /* add a trailing zero to the name table */ - name_table->elements[n][len] = '\0'; - - /* record index of /.notdef */ - if ( *cur == '.' && - ft_strcmp( ".notdef", - (const char*)(name_table->elements[n]) ) == 0 ) - { - notdef_index = n; - notdef_found = 1; - } - - T1_Skip_Spaces( parser ); - - cur = parser->root.cursor; - - (void)T1_ToInt( parser ); - if ( parser->root.cursor >= limit ) - { - FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - len = (FT_UInt)( parser->root.cursor - cur ); - - error = T1_Add_Table( code_table, n, cur, len + 1 ); - if ( error ) - goto Fail; - - code_table->elements[n][len] = '\0'; - - n++; - if ( n >= loader->num_glyphs ) - break; - } - } - - loader->num_glyphs = n; - - if ( !notdef_found ) - { - FT_ERROR(( "t42_parse_charstrings: no /.notdef glyph\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - /* if /.notdef does not occupy index 0, do our magic. */ - if ( ft_strcmp( (const char*)".notdef", - (const char*)name_table->elements[0] ) ) - { - /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ - /* name and code entries to swap_table. Then place notdef_index */ - /* name and code entries into swap_table. Then swap name and code */ - /* entries at indices notdef_index and 0 using values stored in */ - /* swap_table. */ - - /* Index 0 name */ - error = T1_Add_Table( swap_table, 0, - name_table->elements[0], - name_table->lengths [0] ); - if ( error ) - goto Fail; - - /* Index 0 code */ - error = T1_Add_Table( swap_table, 1, - code_table->elements[0], - code_table->lengths [0] ); - if ( error ) - goto Fail; - - /* Index notdef_index name */ - error = T1_Add_Table( swap_table, 2, - name_table->elements[notdef_index], - name_table->lengths [notdef_index] ); - if ( error ) - goto Fail; - - /* Index notdef_index code */ - error = T1_Add_Table( swap_table, 3, - code_table->elements[notdef_index], - code_table->lengths [notdef_index] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( name_table, notdef_index, - swap_table->elements[0], - swap_table->lengths [0] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( code_table, notdef_index, - swap_table->elements[1], - swap_table->lengths [1] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( name_table, 0, - swap_table->elements[2], - swap_table->lengths [2] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( code_table, 0, - swap_table->elements[3], - swap_table->lengths [3] ); - if ( error ) - goto Fail; - - } - - return; - - Fail: - parser->root.error = error; - } - - - static FT_Error - t42_load_keyword( T42_Face face, - T42_Loader loader, - T1_Field field ) - { - FT_Error error; - void* dummy_object; - void** objects; - FT_UInt max_objects = 0; - - - /* if the keyword has a dedicated callback, call it */ - if ( field->type == T1_FIELD_TYPE_CALLBACK ) - { - field->reader( (FT_Face)face, loader ); - error = loader->parser.root.error; - goto Exit; - } - - /* now the keyword is either a simple field or a table of fields; */ - /* we are now going to take care of it */ - - switch ( field->location ) - { - case T1_FIELD_LOCATION_FONT_INFO: - dummy_object = &face->type1.font_info; - break; - - case T1_FIELD_LOCATION_FONT_EXTRA: - dummy_object = &face->type1.font_extra; - break; - - case T1_FIELD_LOCATION_BBOX: - dummy_object = &face->type1.font_bbox; - break; - - default: - dummy_object = &face->type1; - } - - objects = &dummy_object; - - if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY || - field->type == T1_FIELD_TYPE_FIXED_ARRAY ) - error = T1_Load_Field_Table( &loader->parser, field, - objects, max_objects, 0 ); - else - error = T1_Load_Field( &loader->parser, field, - objects, max_objects, 0 ); - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - t42_parse_dict( T42_Face face, - T42_Loader loader, - FT_Byte* base, - FT_Long size ) - { - T42_Parser parser = &loader->parser; - FT_Byte* limit; - FT_Int n_keywords = (FT_Int)( sizeof ( t42_keywords ) / - sizeof ( t42_keywords[0] ) ); - - - parser->root.cursor = base; - parser->root.limit = base + size; - parser->root.error = FT_Err_Ok; - - limit = parser->root.limit; - - T1_Skip_Spaces( parser ); - - while ( parser->root.cursor < limit ) - { - FT_Byte* cur; - - - cur = parser->root.cursor; - - /* look for `FontDirectory' which causes problems for some fonts */ - if ( *cur == 'F' && cur + 25 < limit && - ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 ) - { - FT_Byte* cur2; - - - /* skip the `FontDirectory' keyword */ - T1_Skip_PS_Token( parser ); - T1_Skip_Spaces ( parser ); - cur = cur2 = parser->root.cursor; - - /* look up the `known' keyword */ - while ( cur < limit ) - { - if ( *cur == 'k' && cur + 5 < limit && - ft_strncmp( (char*)cur, "known", 5 ) == 0 ) - break; - - T1_Skip_PS_Token( parser ); - if ( parser->root.error ) - goto Exit; - T1_Skip_Spaces ( parser ); - cur = parser->root.cursor; - } - - if ( cur < limit ) - { - T1_TokenRec token; - - - /* skip the `known' keyword and the token following it */ - T1_Skip_PS_Token( parser ); - T1_ToToken( parser, &token ); - - /* if the last token was an array, skip it! */ - if ( token.type == T1_TOKEN_TYPE_ARRAY ) - cur2 = parser->root.cursor; - } - parser->root.cursor = cur2; - } - - /* look for immediates */ - else if ( *cur == '/' && cur + 2 < limit ) - { - FT_UInt len; - - - cur++; - - parser->root.cursor = cur; - T1_Skip_PS_Token( parser ); - if ( parser->root.error ) - goto Exit; - - len = (FT_UInt)( parser->root.cursor - cur ); - - if ( len > 0 && len < 22 && parser->root.cursor < limit ) - { - int i; - - - /* now compare the immediate name to the keyword table */ - - /* loop through all known keywords */ - for ( i = 0; i < n_keywords; i++ ) - { - T1_Field keyword = (T1_Field)&t42_keywords[i]; - FT_Byte *name = (FT_Byte*)keyword->ident; - - - if ( !name ) - continue; - - if ( cur[0] == name[0] && - len == ft_strlen( (const char *)name ) && - ft_memcmp( cur, name, len ) == 0 ) - { - /* we found it -- run the parsing callback! */ - parser->root.error = t42_load_keyword( face, - loader, - keyword ); - if ( parser->root.error ) - return parser->root.error; - break; - } - } - } - } - else - { - T1_Skip_PS_Token( parser ); - if ( parser->root.error ) - goto Exit; - } - - T1_Skip_Spaces( parser ); - } - - Exit: - return parser->root.error; - } - - - FT_LOCAL_DEF( void ) - t42_loader_init( T42_Loader loader, - T42_Face face ) - { - FT_UNUSED( face ); - - FT_MEM_ZERO( loader, sizeof ( *loader ) ); - loader->num_glyphs = 0; - loader->num_chars = 0; - - /* initialize the tables -- simply set their `init' field to 0 */ - loader->encoding_table.init = 0; - loader->charstrings.init = 0; - loader->glyph_names.init = 0; - } - - - FT_LOCAL_DEF( void ) - t42_loader_done( T42_Loader loader ) - { - T42_Parser parser = &loader->parser; - - - /* finalize tables */ - T1_Release_Table( &loader->encoding_table ); - T1_Release_Table( &loader->charstrings ); - T1_Release_Table( &loader->glyph_names ); - T1_Release_Table( &loader->swap_table ); - - /* finalize parser */ - t42_parser_done( parser ); - } - - -/* END */ diff --git a/3party/freetype/src/type42/t42parse.h b/3party/freetype/src/type42/t42parse.h deleted file mode 100644 index 8ed2fde65d..0000000000 --- a/3party/freetype/src/type42/t42parse.h +++ /dev/null @@ -1,91 +0,0 @@ -/***************************************************************************/ -/* */ -/* t42parse.h */ -/* */ -/* Type 42 font parser (specification). */ -/* */ -/* Copyright 2002-2015 by */ -/* Roberto Alameda. */ -/* */ -/* 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 __T42PARSE_H__ -#define __T42PARSE_H__ - - -#include "t42objs.h" -#include FT_INTERNAL_POSTSCRIPT_AUX_H - - -FT_BEGIN_HEADER - - typedef struct T42_ParserRec_ - { - PS_ParserRec root; - FT_Stream stream; - - FT_Byte* base_dict; - FT_Long base_len; - - FT_Bool in_memory; - - } T42_ParserRec, *T42_Parser; - - - typedef struct T42_Loader_ - { - T42_ParserRec parser; /* parser used to read the stream */ - - FT_Int num_chars; /* number of characters in encoding */ - PS_TableRec encoding_table; /* PS_Table used to store the */ - /* encoding character names */ - - FT_Int num_glyphs; - PS_TableRec glyph_names; - PS_TableRec charstrings; - PS_TableRec swap_table; /* For moving .notdef glyph to index 0. */ - - } T42_LoaderRec, *T42_Loader; - - - FT_LOCAL( FT_Error ) - t42_parser_init( T42_Parser parser, - FT_Stream stream, - FT_Memory memory, - PSAux_Service psaux ); - - FT_LOCAL( void ) - t42_parser_done( T42_Parser parser ); - - - FT_LOCAL( FT_Error ) - t42_parse_dict( T42_Face face, - T42_Loader loader, - FT_Byte* base, - FT_Long size ); - - - FT_LOCAL( void ) - t42_loader_init( T42_Loader loader, - T42_Face face ); - - FT_LOCAL( void ) - t42_loader_done( T42_Loader loader ); - - - /* */ - -FT_END_HEADER - - -#endif /* __T42PARSE_H__ */ - - -/* END */ diff --git a/3party/freetype/src/type42/t42types.h b/3party/freetype/src/type42/t42types.h deleted file mode 100644 index 01286af827..0000000000 --- a/3party/freetype/src/type42/t42types.h +++ /dev/null @@ -1,57 +0,0 @@ -/***************************************************************************/ -/* */ -/* t42types.h */ -/* */ -/* Type 42 font data types (specification only). */ -/* */ -/* Copyright 2002-2015 by */ -/* Roberto Alameda. */ -/* */ -/* 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 __T42TYPES_H__ -#define __T42TYPES_H__ - - -#include -#include FT_FREETYPE_H -#include FT_TYPE1_TABLES_H -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - - -FT_BEGIN_HEADER - - - typedef struct T42_FaceRec_ - { - FT_FaceRec root; - T1_FontRec type1; - const void* psnames; - const void* psaux; -#if 0 - const void* afm_data; -#endif - FT_Byte* ttf_data; - FT_Long ttf_size; - FT_Face ttf_face; - FT_CharMapRec charmaprecs[2]; - FT_CharMap charmaps[2]; - PS_UnicodesRec unicode_map; - - } T42_FaceRec, *T42_Face; - - -FT_END_HEADER - -#endif /* __T42TYPES_H__ */ - - -/* END */ diff --git a/3party/freetype/src/type42/type42.c b/3party/freetype/src/type42/type42.c deleted file mode 100644 index 3332b7b7e6..0000000000 --- a/3party/freetype/src/type42/type42.c +++ /dev/null @@ -1,25 +0,0 @@ -/***************************************************************************/ -/* */ -/* type42.c */ -/* */ -/* FreeType Type 42 driver component. */ -/* */ -/* Copyright 2002-2015 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. */ -/* */ -/***************************************************************************/ - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include -#include "t42objs.c" -#include "t42parse.c" -#include "t42drivr.c" - -/* END */ diff --git a/3party/freetype/src/winfonts/Jamfile b/3party/freetype/src/winfonts/Jamfile deleted file mode 100644 index 86ee668196..0000000000 --- a/3party/freetype/src/winfonts/Jamfile +++ /dev/null @@ -1,16 +0,0 @@ -# FreeType 2 src/winfonts Jamfile -# -# Copyright 2001-2015 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. - -SubDir FT2_TOP $(FT2_SRC_DIR) winfonts ; - -Library $(FT2_LIB) : winfnt.c ; - -# end of src/winfonts Jamfile diff --git a/3party/freetype/src/winfonts/fnterrs.h b/3party/freetype/src/winfonts/fnterrs.h deleted file mode 100644 index 0bf4d0986d..0000000000 --- a/3party/freetype/src/winfonts/fnterrs.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************/ -/* */ -/* fnterrs.h */ -/* */ -/* Win FNT/FON error codes (specification only). */ -/* */ -/* Copyright 2001-2015 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. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the Windows FNT/FON error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __FNTERRS_H__ -#define __FNTERRS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX FNT_Err_ -#define FT_ERR_BASE FT_Mod_Err_Winfonts - -#include FT_ERRORS_H - -#endif /* __FNTERRS_H__ */ - - -/* END */ diff --git a/3party/freetype/src/winfonts/module.mk b/3party/freetype/src/winfonts/module.mk deleted file mode 100644 index 8ba6d7584f..0000000000 --- a/3party/freetype/src/winfonts/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 Windows FNT/FON module definition -# - - -# Copyright 1996-2015 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. - - -FTMODULE_H_COMMANDS += WINDOWS_DRIVER - -define WINDOWS_DRIVER -$(OPEN_DRIVER) FT_Driver_ClassRec, winfnt_driver_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)winfnt $(ECHO_DRIVER_DESC)Windows bitmap fonts with extension *.fnt or *.fon$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/3party/freetype/src/winfonts/rules.mk b/3party/freetype/src/winfonts/rules.mk deleted file mode 100644 index 4535f54d42..0000000000 --- a/3party/freetype/src/winfonts/rules.mk +++ /dev/null @@ -1,68 +0,0 @@ -# -# FreeType 2 Windows FNT/FON driver configuration rules -# - - -# Copyright 1996-2015 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. - - -# Windows driver directory -# -FNT_DIR := $(SRC_DIR)/winfonts - - -FNT_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(FNT_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# Windows driver sources (i.e., C files) -# -FNT_DRV_SRC := $(FNT_DIR)/winfnt.c - -# Windows driver headers -# -FNT_DRV_H := $(FNT_DRV_SRC:%.c=%.h) \ - $(FNT_DIR)/fnterrs.h - - -# Windows driver object(s) -# -# FNT_DRV_OBJ_M is used during `multi' builds -# FNT_DRV_OBJ_S is used during `single' builds -# -FNT_DRV_OBJ_M := $(FNT_DRV_SRC:$(FNT_DIR)/%.c=$(OBJ_DIR)/%.$O) -FNT_DRV_OBJ_S := $(OBJ_DIR)/winfnt.$O - -# Windows driver source file for single build -# -FNT_DRV_SRC_S := $(FNT_DIR)/winfnt.c - - -# Windows driver - single object -# -$(FNT_DRV_OBJ_S): $(FNT_DRV_SRC_S) $(FNT_DRV_SRC) $(FREETYPE_H) $(FNT_DRV_H) - $(FNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(FNT_DRV_SRC_S)) - - -# Windows driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(FNT_DIR)/%.c $(FREETYPE_H) $(FNT_DRV_H) - $(FNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(FNT_DRV_OBJ_S) -DRV_OBJS_M += $(FNT_DRV_OBJ_M) - - -# EOF diff --git a/3party/freetype/src/winfonts/winfnt.c b/3party/freetype/src/winfonts/winfnt.c deleted file mode 100644 index 36e3eb0c21..0000000000 --- a/3party/freetype/src/winfonts/winfnt.c +++ /dev/null @@ -1,1178 +0,0 @@ -/***************************************************************************/ -/* */ -/* winfnt.c */ -/* */ -/* FreeType font driver for Windows FNT/FON files */ -/* */ -/* Copyright 1996-2015 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* Copyright 2003 Huw D M Davies for Codeweavers */ -/* Copyright 2007 Dmitry Timoshkov for Codeweavers */ -/* */ -/* 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 FT_WINFONTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_OBJECTS_H -#include FT_TRUETYPE_IDS_H - -#include "winfnt.h" -#include "fnterrs.h" -#include FT_SERVICE_WINFNT_H -#include FT_SERVICE_FONT_FORMAT_H - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_winfnt - - - static const FT_Frame_Field winmz_header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE WinMZ_HeaderRec - - FT_FRAME_START( 64 ), - FT_FRAME_USHORT_LE ( magic ), - FT_FRAME_SKIP_BYTES( 29 * 2 ), - FT_FRAME_ULONG_LE ( lfanew ), - FT_FRAME_END - }; - - static const FT_Frame_Field winne_header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE WinNE_HeaderRec - - FT_FRAME_START( 40 ), - FT_FRAME_USHORT_LE ( magic ), - FT_FRAME_SKIP_BYTES( 34 ), - FT_FRAME_USHORT_LE ( resource_tab_offset ), - FT_FRAME_USHORT_LE ( rname_tab_offset ), - FT_FRAME_END - }; - - static const FT_Frame_Field winpe32_header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE WinPE32_HeaderRec - - FT_FRAME_START( 248 ), - FT_FRAME_ULONG_LE ( magic ), /* PE00 */ - FT_FRAME_USHORT_LE ( machine ), /* 0x014C - i386 */ - FT_FRAME_USHORT_LE ( number_of_sections ), - FT_FRAME_SKIP_BYTES( 12 ), - FT_FRAME_USHORT_LE ( size_of_optional_header ), - FT_FRAME_SKIP_BYTES( 2 ), - FT_FRAME_USHORT_LE ( magic32 ), /* 0x10B */ - FT_FRAME_SKIP_BYTES( 110 ), - FT_FRAME_ULONG_LE ( rsrc_virtual_address ), - FT_FRAME_ULONG_LE ( rsrc_size ), - FT_FRAME_SKIP_BYTES( 104 ), - FT_FRAME_END - }; - - static const FT_Frame_Field winpe32_section_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE WinPE32_SectionRec - - FT_FRAME_START( 40 ), - FT_FRAME_BYTES ( name, 8 ), - FT_FRAME_SKIP_BYTES( 4 ), - FT_FRAME_ULONG_LE ( virtual_address ), - FT_FRAME_ULONG_LE ( size_of_raw_data ), - FT_FRAME_ULONG_LE ( pointer_to_raw_data ), - FT_FRAME_SKIP_BYTES( 16 ), - FT_FRAME_END - }; - - static const FT_Frame_Field winpe_rsrc_dir_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE WinPE_RsrcDirRec - - FT_FRAME_START( 16 ), - FT_FRAME_ULONG_LE ( characteristics ), - FT_FRAME_ULONG_LE ( time_date_stamp ), - FT_FRAME_USHORT_LE( major_version ), - FT_FRAME_USHORT_LE( minor_version ), - FT_FRAME_USHORT_LE( number_of_named_entries ), - FT_FRAME_USHORT_LE( number_of_id_entries ), - FT_FRAME_END - }; - - static const FT_Frame_Field winpe_rsrc_dir_entry_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE WinPE_RsrcDirEntryRec - - FT_FRAME_START( 8 ), - FT_FRAME_ULONG_LE( name ), - FT_FRAME_ULONG_LE( offset ), - FT_FRAME_END - }; - - static const FT_Frame_Field winpe_rsrc_data_entry_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE WinPE_RsrcDataEntryRec - - FT_FRAME_START( 16 ), - FT_FRAME_ULONG_LE( offset_to_data ), - FT_FRAME_ULONG_LE( size ), - FT_FRAME_ULONG_LE( code_page ), - FT_FRAME_ULONG_LE( reserved ), - FT_FRAME_END - }; - - static const FT_Frame_Field winfnt_header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE FT_WinFNT_HeaderRec - - FT_FRAME_START( 148 ), - FT_FRAME_USHORT_LE( version ), - FT_FRAME_ULONG_LE ( file_size ), - FT_FRAME_BYTES ( copyright, 60 ), - FT_FRAME_USHORT_LE( file_type ), - FT_FRAME_USHORT_LE( nominal_point_size ), - FT_FRAME_USHORT_LE( vertical_resolution ), - FT_FRAME_USHORT_LE( horizontal_resolution ), - FT_FRAME_USHORT_LE( ascent ), - FT_FRAME_USHORT_LE( internal_leading ), - FT_FRAME_USHORT_LE( external_leading ), - FT_FRAME_BYTE ( italic ), - FT_FRAME_BYTE ( underline ), - FT_FRAME_BYTE ( strike_out ), - FT_FRAME_USHORT_LE( weight ), - FT_FRAME_BYTE ( charset ), - FT_FRAME_USHORT_LE( pixel_width ), - FT_FRAME_USHORT_LE( pixel_height ), - FT_FRAME_BYTE ( pitch_and_family ), - FT_FRAME_USHORT_LE( avg_width ), - FT_FRAME_USHORT_LE( max_width ), - FT_FRAME_BYTE ( first_char ), - FT_FRAME_BYTE ( last_char ), - FT_FRAME_BYTE ( default_char ), - FT_FRAME_BYTE ( break_char ), - FT_FRAME_USHORT_LE( bytes_per_row ), - FT_FRAME_ULONG_LE ( device_offset ), - FT_FRAME_ULONG_LE ( face_name_offset ), - FT_FRAME_ULONG_LE ( bits_pointer ), - FT_FRAME_ULONG_LE ( bits_offset ), - FT_FRAME_BYTE ( reserved ), - FT_FRAME_ULONG_LE ( flags ), - FT_FRAME_USHORT_LE( A_space ), - FT_FRAME_USHORT_LE( B_space ), - FT_FRAME_USHORT_LE( C_space ), - FT_FRAME_ULONG_LE ( color_table_offset ), - FT_FRAME_BYTES ( reserved1, 16 ), - FT_FRAME_END - }; - - - static void - fnt_font_done( FNT_Face face ) - { - FT_Memory memory = FT_FACE( face )->memory; - FT_Stream stream = FT_FACE( face )->stream; - FNT_Font font = face->font; - - - if ( !font ) - return; - - if ( font->fnt_frame ) - FT_FRAME_RELEASE( font->fnt_frame ); - FT_FREE( font->family_name ); - - FT_FREE( font ); - face->font = NULL; - } - - - static FT_Error - fnt_font_load( FNT_Font font, - FT_Stream stream ) - { - FT_Error error; - FT_WinFNT_Header header = &font->header; - FT_Bool new_format; - FT_UInt size; - - - /* first of all, read the FNT header */ - if ( FT_STREAM_SEEK( font->offset ) || - FT_STREAM_READ_FIELDS( winfnt_header_fields, header ) ) - goto Exit; - - /* check header */ - if ( header->version != 0x200 && - header->version != 0x300 ) - { - FT_TRACE2(( " not a Windows FNT file\n" )); - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - new_format = FT_BOOL( font->header.version == 0x300 ); - size = new_format ? 148 : 118; - - if ( header->file_size < size ) - { - FT_TRACE2(( " not a Windows FNT file\n" )); - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - /* Version 2 doesn't have these fields */ - if ( header->version == 0x200 ) - { - header->flags = 0; - header->A_space = 0; - header->B_space = 0; - header->C_space = 0; - - header->color_table_offset = 0; - } - - if ( header->file_type & 1 ) - { - FT_TRACE2(( "[can't handle vector FNT fonts]\n" )); - error = FT_THROW( Unknown_File_Format ); - goto Exit; - } - - /* this is a FNT file/table; extract its frame */ - if ( FT_STREAM_SEEK( font->offset ) || - FT_FRAME_EXTRACT( header->file_size, font->fnt_frame ) ) - goto Exit; - - Exit: - return error; - } - - - static FT_Error - fnt_face_get_dll_font( FNT_Face face, - FT_Int face_instance_index ) - { - FT_Error error; - FT_Stream stream = FT_FACE( face )->stream; - FT_Memory memory = FT_FACE( face )->memory; - WinMZ_HeaderRec mz_header; - FT_Long face_index; - - - face->font = NULL; - - face_index = FT_ABS( face_instance_index ) & 0xFFFF; - - /* does it begin with an MZ header? */ - if ( FT_STREAM_SEEK( 0 ) || - FT_STREAM_READ_FIELDS( winmz_header_fields, &mz_header ) ) - goto Exit; - - error = FT_ERR( Unknown_File_Format ); - if ( mz_header.magic == WINFNT_MZ_MAGIC ) - { - /* yes, now look for an NE header in the file */ - WinNE_HeaderRec ne_header; - - - FT_TRACE2(( "MZ signature found\n" )); - - if ( FT_STREAM_SEEK( mz_header.lfanew ) || - FT_STREAM_READ_FIELDS( winne_header_fields, &ne_header ) ) - goto Exit; - - error = FT_ERR( Unknown_File_Format ); - if ( ne_header.magic == WINFNT_NE_MAGIC ) - { - /* good, now look into the resource table for each FNT resource */ - FT_ULong res_offset = mz_header.lfanew + - ne_header.resource_tab_offset; - FT_UShort size_shift; - FT_UShort font_count = 0; - FT_ULong font_offset = 0; - - - FT_TRACE2(( "NE signature found\n" )); - - if ( FT_STREAM_SEEK( res_offset ) || - FT_FRAME_ENTER( ne_header.rname_tab_offset - - ne_header.resource_tab_offset ) ) - goto Exit; - - size_shift = FT_GET_USHORT_LE(); - - for (;;) - { - FT_UShort type_id, count; - - - type_id = FT_GET_USHORT_LE(); - if ( !type_id ) - break; - - count = FT_GET_USHORT_LE(); - - if ( type_id == 0x8008U ) - { - font_count = count; - font_offset = FT_STREAM_POS() + 4 + - (FT_ULong)( stream->cursor - stream->limit ); - break; - } - - stream->cursor += 4 + count * 12; - } - - FT_FRAME_EXIT(); - - if ( !font_count || !font_offset ) - { - FT_TRACE2(( "this file doesn't contain any FNT resources\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* loading `winfnt_header_fields' needs at least 118 bytes; */ - /* use this as a rough measure to check the expected font size */ - if ( font_count * 118UL > stream->size ) - { - FT_TRACE2(( "invalid number of faces\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - face->root.num_faces = font_count; - - if ( face_instance_index < 0 ) - goto Exit; - - if ( face_index >= font_count ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - if ( FT_NEW( face->font ) ) - goto Exit; - - if ( FT_STREAM_SEEK( font_offset + (FT_ULong)face_index * 12 ) || - FT_FRAME_ENTER( 12 ) ) - goto Fail; - - face->font->offset = (FT_ULong)FT_GET_USHORT_LE() << size_shift; - face->font->fnt_size = (FT_ULong)FT_GET_USHORT_LE() << size_shift; - - stream->cursor += 8; - - FT_FRAME_EXIT(); - - error = fnt_font_load( face->font, stream ); - } - else if ( ne_header.magic == WINFNT_PE_MAGIC ) - { - WinPE32_HeaderRec pe32_header; - WinPE32_SectionRec pe32_section; - WinPE_RsrcDirRec root_dir, name_dir, lang_dir; - WinPE_RsrcDirEntryRec dir_entry1, dir_entry2, dir_entry3; - WinPE_RsrcDataEntryRec data_entry; - - FT_ULong root_dir_offset, name_dir_offset, lang_dir_offset; - FT_UShort i, j, k; - - - FT_TRACE2(( "PE signature found\n" )); - - if ( FT_STREAM_SEEK( mz_header.lfanew ) || - FT_STREAM_READ_FIELDS( winpe32_header_fields, &pe32_header ) ) - goto Exit; - - FT_TRACE2(( "magic %04lx, machine %02x, number_of_sections %u, " - "size_of_optional_header %02x\n" - "magic32 %02x, rsrc_virtual_address %04lx, " - "rsrc_size %04lx\n", - pe32_header.magic, pe32_header.machine, - pe32_header.number_of_sections, - pe32_header.size_of_optional_header, - pe32_header.magic32, pe32_header.rsrc_virtual_address, - pe32_header.rsrc_size )); - - if ( pe32_header.magic != WINFNT_PE_MAGIC /* check full signature */ || - pe32_header.machine != 0x014C /* i386 */ || - pe32_header.size_of_optional_header != 0xE0 /* FIXME */ || - pe32_header.magic32 != 0x10B ) - { - FT_TRACE2(( "this file has an invalid PE header\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - face->root.num_faces = 0; - - for ( i = 0; i < pe32_header.number_of_sections; i++ ) - { - if ( FT_STREAM_READ_FIELDS( winpe32_section_fields, - &pe32_section ) ) - goto Exit; - - FT_TRACE2(( "name %.8s, va %04lx, size %04lx, offset %04lx\n", - pe32_section.name, pe32_section.virtual_address, - pe32_section.size_of_raw_data, - pe32_section.pointer_to_raw_data )); - - if ( pe32_header.rsrc_virtual_address == - pe32_section.virtual_address ) - goto Found_rsrc_section; - } - - FT_TRACE2(( "this file doesn't contain any resources\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - - Found_rsrc_section: - FT_TRACE2(( "found resources section %.8s\n", pe32_section.name )); - - if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data ) || - FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &root_dir ) ) - goto Exit; - - root_dir_offset = pe32_section.pointer_to_raw_data; - - for ( i = 0; i < root_dir.number_of_named_entries + - root_dir.number_of_id_entries; i++ ) - { - if ( FT_STREAM_SEEK( root_dir_offset + 16 + i * 8 ) || - FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields, - &dir_entry1 ) ) - goto Exit; - - if ( !(dir_entry1.offset & 0x80000000UL ) /* DataIsDirectory */ ) - { - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - dir_entry1.offset &= ~0x80000000UL; - - name_dir_offset = pe32_section.pointer_to_raw_data + - dir_entry1.offset; - - if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data + - dir_entry1.offset ) || - FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &name_dir ) ) - goto Exit; - - for ( j = 0; j < name_dir.number_of_named_entries + - name_dir.number_of_id_entries; j++ ) - { - if ( FT_STREAM_SEEK( name_dir_offset + 16 + j * 8 ) || - FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields, - &dir_entry2 ) ) - goto Exit; - - if ( !(dir_entry2.offset & 0x80000000UL ) /* DataIsDirectory */ ) - { - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - dir_entry2.offset &= ~0x80000000UL; - - lang_dir_offset = pe32_section.pointer_to_raw_data + - dir_entry2.offset; - - if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data + - dir_entry2.offset ) || - FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &lang_dir ) ) - goto Exit; - - for ( k = 0; k < lang_dir.number_of_named_entries + - lang_dir.number_of_id_entries; k++ ) - { - if ( FT_STREAM_SEEK( lang_dir_offset + 16 + k * 8 ) || - FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields, - &dir_entry3 ) ) - goto Exit; - - if ( dir_entry2.offset & 0x80000000UL /* DataIsDirectory */ ) - { - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - if ( dir_entry1.name == 8 /* RT_FONT */ ) - { - if ( FT_STREAM_SEEK( root_dir_offset + dir_entry3.offset ) || - FT_STREAM_READ_FIELDS( winpe_rsrc_data_entry_fields, - &data_entry ) ) - goto Exit; - - FT_TRACE2(( "found font #%lu, offset %04lx, " - "size %04lx, cp %lu\n", - dir_entry2.name, - pe32_section.pointer_to_raw_data + - data_entry.offset_to_data - - pe32_section.virtual_address, - data_entry.size, data_entry.code_page )); - - if ( face_index == face->root.num_faces ) - { - if ( FT_NEW( face->font ) ) - goto Exit; - - face->font->offset = pe32_section.pointer_to_raw_data + - data_entry.offset_to_data - - pe32_section.virtual_address; - face->font->fnt_size = data_entry.size; - - error = fnt_font_load( face->font, stream ); - if ( error ) - { - FT_TRACE2(( "font #%lu load error %d\n", - dir_entry2.name, error )); - goto Fail; - } - else - FT_TRACE2(( "font #%lu successfully loaded\n", - dir_entry2.name )); - } - - face->root.num_faces++; - } - } - } - } - } - - if ( !face->root.num_faces ) - { - FT_TRACE2(( "this file doesn't contain any RT_FONT resources\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - if ( face_index >= face->root.num_faces ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - } - - Fail: - if ( error ) - fnt_font_done( face ); - - Exit: - return error; - } - - - typedef struct FNT_CMapRec_ - { - FT_CMapRec cmap; - FT_UInt32 first; - FT_UInt32 count; - - } FNT_CMapRec, *FNT_CMap; - - - static FT_Error - fnt_cmap_init( FNT_CMap cmap, - FT_Pointer pointer ) - { - FNT_Face face = (FNT_Face)FT_CMAP_FACE( cmap ); - FNT_Font font = face->font; - - FT_UNUSED( pointer ); - - - cmap->first = (FT_UInt32) font->header.first_char; - cmap->count = (FT_UInt32)( font->header.last_char - cmap->first + 1 ); - - return 0; - } - - - static FT_UInt - fnt_cmap_char_index( FNT_CMap cmap, - FT_UInt32 char_code ) - { - FT_UInt gindex = 0; - - - char_code -= cmap->first; - if ( char_code < cmap->count ) - /* we artificially increase the glyph index; */ - /* FNT_Load_Glyph reverts to the right one */ - gindex = (FT_UInt)( char_code + 1 ); - return gindex; - } - - - static FT_UInt32 - fnt_cmap_char_next( FNT_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_UInt gindex = 0; - FT_UInt32 result = 0; - FT_UInt32 char_code = *pchar_code + 1; - - - if ( char_code <= cmap->first ) - { - result = cmap->first; - gindex = 1; - } - else - { - char_code -= cmap->first; - if ( char_code < cmap->count ) - { - result = cmap->first + char_code; - gindex = (FT_UInt)( char_code + 1 ); - } - } - - *pchar_code = result; - return gindex; - } - - - static const FT_CMap_ClassRec fnt_cmap_class_rec = - { - sizeof ( FNT_CMapRec ), - - (FT_CMap_InitFunc) fnt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)fnt_cmap_char_index, - (FT_CMap_CharNextFunc) fnt_cmap_char_next, - - NULL, NULL, NULL, NULL, NULL - }; - - static FT_CMap_Class const fnt_cmap_class = &fnt_cmap_class_rec; - - - static void - FNT_Face_Done( FT_Face fntface ) /* FNT_Face */ - { - FNT_Face face = (FNT_Face)fntface; - FT_Memory memory; - - - if ( !face ) - return; - - memory = FT_FACE_MEMORY( face ); - - fnt_font_done( face ); - - FT_FREE( fntface->available_sizes ); - fntface->num_fixed_sizes = 0; - } - - - static FT_Error - FNT_Face_Init( FT_Stream stream, - FT_Face fntface, /* FNT_Face */ - FT_Int face_instance_index, - FT_Int num_params, - FT_Parameter* params ) - { - FNT_Face face = (FNT_Face)fntface; - FT_Error error; - FT_Memory memory = FT_FACE_MEMORY( face ); - FT_Int face_index; - - FT_UNUSED( num_params ); - FT_UNUSED( params ); - - - FT_TRACE2(( "Windows FNT driver\n" )); - - face_index = FT_ABS( face_instance_index ) & 0xFFFF; - - /* try to load font from a DLL */ - error = fnt_face_get_dll_font( face, face_instance_index ); - if ( !error && face_instance_index < 0 ) - goto Exit; - - if ( FT_ERR_EQ( error, Unknown_File_Format ) ) - { - /* this didn't work; try to load a single FNT font */ - FNT_Font font; - - if ( FT_NEW( face->font ) ) - goto Exit; - - fntface->num_faces = 1; - - font = face->font; - font->offset = 0; - font->fnt_size = stream->size; - - error = fnt_font_load( font, stream ); - - if ( !error ) - { - if ( face_instance_index < 0 ) - goto Exit; - - if ( face_index > 0 ) - error = FT_THROW( Invalid_Argument ); - } - } - - if ( error ) - goto Fail; - - /* we now need to fill the root FT_Face fields */ - /* with relevant information */ - { - FT_Face root = FT_FACE( face ); - FNT_Font font = face->font; - FT_ULong family_size; - - - root->face_index = face_index; - - root->face_flags |= FT_FACE_FLAG_FIXED_SIZES | - FT_FACE_FLAG_HORIZONTAL; - - if ( font->header.avg_width == font->header.max_width ) - root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; - - if ( font->header.italic ) - root->style_flags |= FT_STYLE_FLAG_ITALIC; - - if ( font->header.weight >= 800 ) - root->style_flags |= FT_STYLE_FLAG_BOLD; - - /* set up the `fixed_sizes' array */ - if ( FT_NEW_ARRAY( root->available_sizes, 1 ) ) - goto Fail; - - root->num_fixed_sizes = 1; - - { - FT_Bitmap_Size* bsize = root->available_sizes; - FT_UShort x_res, y_res; - - - bsize->width = (FT_Short)font->header.avg_width; - bsize->height = (FT_Short)( font->header.pixel_height + - font->header.external_leading ); - bsize->size = font->header.nominal_point_size << 6; - - x_res = font->header.horizontal_resolution; - if ( !x_res ) - x_res = 72; - - y_res = font->header.vertical_resolution; - if ( !y_res ) - y_res = 72; - - bsize->y_ppem = FT_MulDiv( bsize->size, y_res, 72 ); - bsize->y_ppem = FT_PIX_ROUND( bsize->y_ppem ); - - /* - * this reads: - * - * the nominal height is larger than the bbox's height - * - * => nominal_point_size contains incorrect value; - * use pixel_height as the nominal height - */ - if ( bsize->y_ppem > ( font->header.pixel_height << 6 ) ) - { - FT_TRACE2(( "use pixel_height as the nominal height\n" )); - - bsize->y_ppem = font->header.pixel_height << 6; - bsize->size = FT_MulDiv( bsize->y_ppem, 72, y_res ); - } - - bsize->x_ppem = FT_MulDiv( bsize->size, x_res, 72 ); - bsize->x_ppem = FT_PIX_ROUND( bsize->x_ppem ); - } - - { - FT_CharMapRec charmap; - - - charmap.encoding = FT_ENCODING_NONE; - /* initial platform/encoding should indicate unset status? */ - charmap.platform_id = TT_PLATFORM_APPLE_UNICODE; - charmap.encoding_id = TT_APPLE_ID_DEFAULT; - charmap.face = root; - - if ( font->header.charset == FT_WinFNT_ID_MAC ) - { - charmap.encoding = FT_ENCODING_APPLE_ROMAN; - charmap.platform_id = TT_PLATFORM_MACINTOSH; -/* charmap.encoding_id = TT_MAC_ID_ROMAN; */ - } - - error = FT_CMap_New( fnt_cmap_class, - NULL, - &charmap, - NULL ); - if ( error ) - goto Fail; - - /* Select default charmap */ - if ( root->num_charmaps ) - root->charmap = root->charmaps[0]; - } - - /* set up remaining flags */ - - if ( font->header.last_char < font->header.first_char ) - { - FT_TRACE2(( "invalid number of glyphs\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - - /* reserve one slot for the .notdef glyph at index 0 */ - root->num_glyphs = font->header.last_char - - font->header.first_char + 1 + 1; - - if ( font->header.face_name_offset >= font->header.file_size ) - { - FT_TRACE2(( "invalid family name offset\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - family_size = font->header.file_size - font->header.face_name_offset; - /* Some broken fonts don't delimit the face name with a final */ - /* NULL byte -- the frame is erroneously one byte too small. */ - /* We thus allocate one more byte, setting it explicitly to */ - /* zero. */ - if ( FT_ALLOC( font->family_name, family_size + 1 ) ) - goto Fail; - - FT_MEM_COPY( font->family_name, - font->fnt_frame + font->header.face_name_offset, - family_size ); - - font->family_name[family_size] = '\0'; - - if ( FT_REALLOC( font->family_name, - family_size, - ft_strlen( font->family_name ) + 1 ) ) - goto Fail; - - root->family_name = font->family_name; - root->style_name = (char *)"Regular"; - - if ( root->style_flags & FT_STYLE_FLAG_BOLD ) - { - if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) - root->style_name = (char *)"Bold Italic"; - else - root->style_name = (char *)"Bold"; - } - else if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) - root->style_name = (char *)"Italic"; - } - goto Exit; - - Fail: - FNT_Face_Done( fntface ); - - Exit: - return error; - } - - - static FT_Error - FNT_Size_Select( FT_Size size, - FT_ULong strike_index ) - { - FNT_Face face = (FNT_Face)size->face; - FT_WinFNT_Header header = &face->font->header; - - FT_UNUSED( strike_index ); - - - FT_Select_Metrics( size->face, 0 ); - - size->metrics.ascender = header->ascent * 64; - size->metrics.descender = -( header->pixel_height - - header->ascent ) * 64; - size->metrics.max_advance = header->max_width * 64; - - return FT_Err_Ok; - } - - - static FT_Error - FNT_Size_Request( FT_Size size, - FT_Size_Request req ) - { - FNT_Face face = (FNT_Face)size->face; - FT_WinFNT_Header header = &face->font->header; - FT_Bitmap_Size* bsize = size->face->available_sizes; - FT_Error error = FT_ERR( Invalid_Pixel_Size ); - FT_Long height; - - - height = FT_REQUEST_HEIGHT( req ); - height = ( height + 32 ) >> 6; - - switch ( req->type ) - { - case FT_SIZE_REQUEST_TYPE_NOMINAL: - if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) ) - error = FT_Err_Ok; - break; - - case FT_SIZE_REQUEST_TYPE_REAL_DIM: - if ( height == header->pixel_height ) - error = FT_Err_Ok; - break; - - default: - error = FT_THROW( Unimplemented_Feature ); - break; - } - - if ( error ) - return error; - else - return FNT_Size_Select( size, 0 ); - } - - - static FT_Error - FNT_Load_Glyph( FT_GlyphSlot slot, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FNT_Face face = (FNT_Face)FT_SIZE_FACE( size ); - FNT_Font font; - FT_Error error = FT_Err_Ok; - FT_Byte* p; - FT_UInt len; - FT_Bitmap* bitmap = &slot->bitmap; - FT_ULong offset; - FT_Bool new_format; - - FT_UNUSED( load_flags ); - - - if ( !face ) - { - error = FT_THROW( Invalid_Face_Handle ); - goto Exit; - } - - font = face->font; - - if ( !font || - glyph_index >= (FT_UInt)( FT_FACE( face )->num_glyphs ) ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - FT_TRACE1(( "FNT_Load_Glyph: glyph index %d\n", glyph_index )); - - if ( glyph_index > 0 ) - glyph_index--; /* revert to real index */ - else - glyph_index = font->header.default_char; /* the `.notdef' glyph */ - - new_format = FT_BOOL( font->header.version == 0x300 ); - len = new_format ? 6 : 4; - - /* get glyph width and offset */ - offset = ( new_format ? 148 : 118 ) + len * glyph_index; - - if ( offset >= font->header.file_size - 2 - ( new_format ? 4 : 2 ) ) - { - FT_TRACE2(( "invalid FNT offset\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - p = font->fnt_frame + offset; - - bitmap->width = FT_NEXT_USHORT_LE( p ); - - /* jump to glyph entry */ - if ( new_format ) - offset = FT_NEXT_ULONG_LE( p ); - else - offset = FT_NEXT_USHORT_LE( p ); - - if ( offset >= font->header.file_size ) - { - FT_TRACE2(( "invalid FNT offset\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* jump to glyph data */ - p = font->fnt_frame + /* font->header.bits_offset */ + offset; - - /* allocate and build bitmap */ - { - FT_Memory memory = FT_FACE_MEMORY( slot->face ); - FT_UInt pitch = ( bitmap->width + 7 ) >> 3; - FT_Byte* column; - FT_Byte* write; - - - bitmap->pitch = (int)pitch; - bitmap->rows = font->header.pixel_height; - bitmap->pixel_mode = FT_PIXEL_MODE_MONO; - - if ( offset + pitch * bitmap->rows > font->header.file_size ) - { - FT_TRACE2(( "invalid bitmap width\n" )); - error = FT_THROW( Invalid_File_Format ); - goto Exit; - } - - /* note: since glyphs are stored in columns and not in rows we */ - /* can't use ft_glyphslot_set_bitmap */ - if ( FT_ALLOC_MULT( bitmap->buffer, pitch, bitmap->rows ) ) - goto Exit; - - column = (FT_Byte*)bitmap->buffer; - - for ( ; pitch > 0; pitch--, column++ ) - { - FT_Byte* limit = p + bitmap->rows; - - - for ( write = column; p < limit; p++, write += bitmap->pitch ) - *write = *p; - } - } - - slot->internal->flags = FT_GLYPH_OWN_BITMAP; - slot->bitmap_left = 0; - slot->bitmap_top = font->header.ascent; - slot->format = FT_GLYPH_FORMAT_BITMAP; - - /* now set up metrics */ - slot->metrics.width = (FT_Pos)( bitmap->width << 6 ); - slot->metrics.height = (FT_Pos)( bitmap->rows << 6 ); - slot->metrics.horiAdvance = (FT_Pos)( bitmap->width << 6 ); - slot->metrics.horiBearingX = 0; - slot->metrics.horiBearingY = slot->bitmap_top << 6; - - ft_synthesize_vertical_metrics( &slot->metrics, - (FT_Pos)( bitmap->rows << 6 ) ); - - Exit: - return error; - } - - - static FT_Error - winfnt_get_header( FT_Face face, - FT_WinFNT_HeaderRec *aheader ) - { - FNT_Font font = ((FNT_Face)face)->font; - - - *aheader = font->header; - - return 0; - } - - - static const FT_Service_WinFntRec winfnt_service_rec = - { - winfnt_get_header - }; - - /* - * SERVICE LIST - * - */ - - static const FT_ServiceDescRec winfnt_services[] = - { - { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_WINFNT }, - { FT_SERVICE_ID_WINFNT, &winfnt_service_rec }, - { NULL, NULL } - }; - - - static FT_Module_Interface - winfnt_get_service( FT_Module module, - const FT_String* service_id ) - { - FT_UNUSED( module ); - - return ft_service_list_lookup( winfnt_services, service_id ); - } - - - - - FT_CALLBACK_TABLE_DEF - const FT_Driver_ClassRec winfnt_driver_class = - { - { - FT_MODULE_FONT_DRIVER | - FT_MODULE_DRIVER_NO_OUTLINES, - sizeof ( FT_DriverRec ), - - "winfonts", - 0x10000L, - 0x20000L, - - 0, - - 0, /* FT_Module_Constructor */ - 0, /* FT_Module_Destructor */ - winfnt_get_service - }, - - sizeof ( FNT_FaceRec ), - sizeof ( FT_SizeRec ), - sizeof ( FT_GlyphSlotRec ), - - FNT_Face_Init, - FNT_Face_Done, - 0, /* FT_Size_InitFunc */ - 0, /* FT_Size_DoneFunc */ - 0, /* FT_Slot_InitFunc */ - 0, /* FT_Slot_DoneFunc */ - - FNT_Load_Glyph, - - 0, /* FT_Face_GetKerningFunc */ - 0, /* FT_Face_AttachFunc */ - 0, /* FT_Face_GetAdvancesFunc */ - - FNT_Size_Request, - FNT_Size_Select - }; - - -/* END */ diff --git a/3party/freetype/src/winfonts/winfnt.h b/3party/freetype/src/winfonts/winfnt.h deleted file mode 100644 index a39d26f449..0000000000 --- a/3party/freetype/src/winfonts/winfnt.h +++ /dev/null @@ -1,171 +0,0 @@ -/***************************************************************************/ -/* */ -/* winfnt.h */ -/* */ -/* FreeType font driver for Windows FNT/FON files */ -/* */ -/* Copyright 1996-2015 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* Copyright 2007 Dmitry Timoshkov for Codeweavers */ -/* */ -/* 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 __WINFNT_H__ -#define __WINFNT_H__ - - -#include -#include FT_WINFONTS_H -#include FT_INTERNAL_DRIVER_H - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC -#error "this module does not support PIC yet" -#endif - - typedef struct WinMZ_HeaderRec_ - { - FT_UShort magic; - /* skipped content */ - FT_UShort lfanew; - - } WinMZ_HeaderRec; - - - typedef struct WinNE_HeaderRec_ - { - FT_UShort magic; - /* skipped content */ - FT_UShort resource_tab_offset; - FT_UShort rname_tab_offset; - - } WinNE_HeaderRec; - - - typedef struct WinPE32_HeaderRec_ - { - FT_ULong magic; - FT_UShort machine; - FT_UShort number_of_sections; - /* skipped content */ - FT_UShort size_of_optional_header; - /* skipped content */ - FT_UShort magic32; - /* skipped content */ - FT_ULong rsrc_virtual_address; - FT_ULong rsrc_size; - /* skipped content */ - - } WinPE32_HeaderRec; - - - typedef struct WinPE32_SectionRec_ - { - FT_Byte name[8]; - /* skipped content */ - FT_ULong virtual_address; - FT_ULong size_of_raw_data; - FT_ULong pointer_to_raw_data; - /* skipped content */ - - } WinPE32_SectionRec; - - - typedef struct WinPE_RsrcDirRec_ - { - FT_ULong characteristics; - FT_ULong time_date_stamp; - FT_UShort major_version; - FT_UShort minor_version; - FT_UShort number_of_named_entries; - FT_UShort number_of_id_entries; - - } WinPE_RsrcDirRec; - - - typedef struct WinPE_RsrcDirEntryRec_ - { - FT_ULong name; - FT_ULong offset; - - } WinPE_RsrcDirEntryRec; - - - typedef struct WinPE_RsrcDataEntryRec_ - { - FT_ULong offset_to_data; - FT_ULong size; - FT_ULong code_page; - FT_ULong reserved; - - } WinPE_RsrcDataEntryRec; - - - typedef struct WinNameInfoRec_ - { - FT_UShort offset; - FT_UShort length; - FT_UShort flags; - FT_UShort id; - FT_UShort handle; - FT_UShort usage; - - } WinNameInfoRec; - - - typedef struct WinResourceInfoRec_ - { - FT_UShort type_id; - FT_UShort count; - - } WinResourceInfoRec; - - -#define WINFNT_MZ_MAGIC 0x5A4D -#define WINFNT_NE_MAGIC 0x454E -#define WINFNT_PE_MAGIC 0x4550 - - - typedef struct FNT_FontRec_ - { - FT_ULong offset; - - FT_WinFNT_HeaderRec header; - - FT_Byte* fnt_frame; - FT_ULong fnt_size; - FT_String* family_name; - - } FNT_FontRec, *FNT_Font; - - - typedef struct FNT_FaceRec_ - { - FT_FaceRec root; - FNT_Font font; - - FT_CharMap charmap_handle; - FT_CharMapRec charmap; /* a single charmap per face */ - - } FNT_FaceRec, *FNT_Face; - - - FT_EXPORT_VAR( const FT_Driver_ClassRec ) winfnt_driver_class; - - -FT_END_HEADER - - -#endif /* __WINFNT_H__ */ - - -/* END */ diff --git a/3party/freetype/version.sed b/3party/freetype/version.sed deleted file mode 100644 index c281ff506b..0000000000 --- a/3party/freetype/version.sed +++ /dev/null @@ -1,5 +0,0 @@ -#! /usr/bin/sed -nf - -s/^#define *FREETYPE_MAJOR *\([^ ][^ ]*\).*$/freetype_major="\1" ;/p -s/^#define *FREETYPE_MINOR *\([^ ][^ ]*\).*$/freetype_minor=".\1" ;/p -s/^#define *FREETYPE_PATCH *\([^ ][^ ]*\).*$/freetype_patch=".\1" ;/p diff --git a/3party/freetype/vms_make.com b/3party/freetype/vms_make.com deleted file mode 100644 index 73522bf34f..0000000000 --- a/3party/freetype/vms_make.com +++ /dev/null @@ -1,1286 +0,0 @@ -$! make Freetype2 under OpenVMS -$! -$! Copyright 2003-2015 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. -$! -$! -$! External libraries (like Freetype, XPM, etc.) are supported via the -$! config file VMSLIB.DAT. Please check the sample file, which is part of this -$! distribution, for the information you need to provide -$! -$! This procedure currently does support the following commandline options -$! in arbitrary order -$! -$! * DEBUG - Compile modules with /noopt/debug and link shareable image -$! with /debug -$! * LOPTS - Options to be passed to the link command -$! * CCOPT - Options to be passed to the C compiler -$! -$! In case of problems with the install you might contact me at -$! zinser@zinser.no-ip.info (preferred) or -$! zinser@sysdev.deutsche-boerse.com (work) -$! -$! Make procedure history for Freetype2 -$! -$!------------------------------------------------------------------------------ -$! Version history -$! 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 -$ true = 1 -$ false = 0 -$ tmpnam = "temp_" + f$getjpi("","pid") -$ tt = tmpnam + ".txt" -$ tc = tmpnam + ".c" -$ th = tmpnam + ".h" -$ its_decc = false -$ its_vaxc = false -$ its_gnuc = false -$! -$! Setup variables holding "config" information -$! -$ Make = "" -$ ccopt = "/name=as_is/float=ieee" -$ lopts = "" -$ dnsrl = "" -$ aconf_in_file = "config.hin" -$ name = "Freetype2" -$ mapfile = name + ".map" -$ optfile = name + ".opt" -$ s_case = false -$ liblist = "" -$! -$ whoami = f$parse(f$environment("Procedure"),,,,"NO_CONCEAL") -$ mydef = F$parse(whoami,,,"DEVICE") -$ mydir = f$parse(whoami,,,"DIRECTORY") - "][" -$ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type") -$! -$! Check for MMK/MMS -$! -$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" -$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" -$! -$! Which command parameters were given -$! -$ gosub check_opts -$! -$! Create option file -$! -$ open/write optf 'optfile' -$! -$! Pull in external libraries -$! -$ create libs.opt -$ open/write libsf libs.opt -$ gosub check_create_vmslib -$! -$! Create objects -$! -$ if libdefs .nes. "" -$ then -$ ccopt = ccopt + "/define=(" + f$extract(0,f$length(libdefs)-1,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'") -$ purge/nolog [...]descrip.mms -$! -$! Add them to options -$! -$FLOOP: -$ file = f$edit(f$search("[...]*.obj"),"UPCASE") -$ if (file .nes. "") -$ then -$ if f$locate("DEMOS",file) .eqs. f$length(file) then write optf file -$ goto floop -$ endif -$! -$ close optf -$! -$! -$! Alpha gets a shareable image -$! -$ If f$getsyi("HW_MODEL") .gt. 1024 -$ Then -$ write sys$output "Creating freetype2shr.exe" -$ call anal_obj_axp 'optfile' _link.opt -$ open/append optf 'optfile' -$ if s_case then WRITE optf "case_sensitive=YES" -$ close optf -$ LINK_/NODEB/SHARE=[.lib]freetype2shr.exe - - 'optfile'/opt,libs.opt/opt,_link.opt/opt -$ endif -$! -$ exit -$! -$ -$ERR_LIB: -$ write sys$output "Error reading config file vmslib.dat" -$ goto err_exit -$FT2_ERR: -$ write sys$output "Could not locate Freetype 2 include files" -$ goto err_exit -$ERR_EXIT: -$ set message/facil/ident/sever/text -$ close/nolog optf -$ close/nolog out -$ close/nolog libdata -$ close/nolog in -$ close/nolog atmp -$ close/nolog xtmp -$ write sys$output "Exiting..." -$ exit 2 -$! -$!------------------------------------------------------------------------------ -$! -$! If MMS/MMK are available dump out the descrip.mms if required -$! -$CREA_MMS: -$ write sys$output "Creating descrip.mms files ..." -$ write sys$output "... Main directory" -$ create descrip.mms -$ open/append out descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 build system -- top-level Makefile for OpenVMS -# - - -# Copyright 2001 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. -$ EOD -$ write out "CFLAGS = ", ccopt -$ copy sys$input: out -$ deck - - -all : - define freetype [--.include] - define psaux [-.psaux] - define autofit [-.autofit] - define autohint [-.autohint] - define base [-.base] - define cache [-.cache] - define cff [-.cff] - define cid [-.cid] - define pcf [-.pcf] - define psnames [-.psnames] - define raster [-.raster] - define sfnt [-.sfnt] - define smooth [-.smooth] - define truetype [-.truetype] - define type1 [-.type1] - define winfonts [-.winfonts] - if f$search("lib.dir") .eqs. "" then create/directory [.lib] - set default [.builds.vms] - $(MMS)$(MMSQUALIFIERS) -# set default [--.src.autofit] -# $(MMS)$(MMSQUALIFIERS) - set default [--.src.autohint] - $(MMS)$(MMSQUALIFIERS) - set default [-.base] - $(MMS)$(MMSQUALIFIERS) - set default [-.bdf] - $(MMS)$(MMSQUALIFIERS) - set default [-.cache] - $(MMS)$(MMSQUALIFIERS) - set default [-.cff] - $(MMS)$(MMSQUALIFIERS) - set default [-.cid] - $(MMS)$(MMSQUALIFIERS) - set default [-.gzip] - $(MMS)$(MMSQUALIFIERS) - set default [-.lzw] - $(MMS)$(MMSQUALIFIERS) - set default [-.otvalid] - $(MMS)$(MMSQUALIFIERS) - set default [-.pcf] - $(MMS)$(MMSQUALIFIERS) - set default [-.pfr] - $(MMS)$(MMSQUALIFIERS) - set default [-.psaux] - $(MMS)$(MMSQUALIFIERS) - set default [-.pshinter] - $(MMS)$(MMSQUALIFIERS) - set default [-.psnames] - $(MMS)$(MMSQUALIFIERS) - set default [-.raster] - $(MMS)$(MMSQUALIFIERS) - set default [-.sfnt] - $(MMS)$(MMSQUALIFIERS) - set default [-.smooth] - $(MMS)$(MMSQUALIFIERS) - set default [-.truetype] - $(MMS)$(MMSQUALIFIERS) - set default [-.type1] - $(MMS)$(MMSQUALIFIERS) - set default [-.type42] - $(MMS)$(MMSQUALIFIERS) - set default [-.winfonts] - $(MMS)$(MMSQUALIFIERS) - set default [--] - -# EOF -$ eod -$ close out -$ write sys$output "... [.builds.vms] directory" -$ create [.builds.vms]descrip.mms -$ open/append out [.builds.vms]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 system rules for VMS -# - - -# Copyright 2001 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([],[--.include],[--.src.base]) - -OBJS=ftsystem.obj - -all : $(OBJS) - library/create [--.lib]freetype.olb $(OBJS) - -ftsystem.obj : ftsystem.c ftconfig.h - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.autofit] directory" -$ create [.src.autofit]descrip.mms -$ open/append out [.src.autofit]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 auto-fit module compilation rules for VMS -# - - -# Copyright 2002 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. - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.autofit]) - -OBJS=afangles.obj,afhints.obj,aflatin.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.autohint] directory" -$ create [.src.autohint]descrip.mms -$ open/append out [.src.autohint]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 auto-hinter module compilation rules for VMS -# - - -# Copyright 2001, 2002 Catharon Productions Inc. -# -# This file is part of the Catharon Typography Project and shall only -# be used, modified, and distributed under the terms of the Catharon -# Open Source License that should come with this file under the name -# `CatharonLicense.txt'. By continuing to use, modify, or distribute -# this file you indicate that you have read the license and -# understand and accept it fully. -# -# Note that this license is compatible with the FreeType license. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/incl=([--.include],[--.src.autohint]) - -OBJS=autohint.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.base] directory" -$ create [.src.base]descrip.mms -$ open/append out [.src.base]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 base layer compilation rules for VMS -# - - -# Copyright 2001, 2003 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.builds.vms],[--.include],[--.src.base]) - -OBJS=ftbase.obj,ftinit.obj,ftglyph.obj,ftdebug.obj,ftbdf.obj,ftmm.obj,\ - fttype1.obj,ftfntfmt.obj,ftpfr.obj,ftstroke.obj,ftwinfnt.obj,ftbbox.obj,\ - ftbitmap.obj,ftlcdfil.obj,ftgasp.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.bdf] directory" -$ create [.src.bdf]descrip.mms -$ open/append out [.src.bdf]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 BDF driver compilation rules for VMS -# - - -# Copyright 2002 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.bdf]) - -OBJS=bdf.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.cache] directory" -$ create [.src.cache]descrip.mms -$ open/append out [.src.cache]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 Cache compilation rules for VMS -# - - -# Copyright 2001, 2002, 2003, 2004 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cache]) - -OBJS=ftcache.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -ftcache.obj : ftcache.c ftcbasic.c ftccache.c ftccmap.c ftcglyph.c ftcimage.c \ - ftcmanag.c ftcmru.c ftcsbits.c - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.cff] directory" -$ create [.src.cff]descrip.mms -$ open/append out [.src.cff]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 OpenType/CFF driver compilation rules for VMS -# - - -# Copyright 2001, 2002 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cff]) - -OBJS=cff.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.cid] directory" -$ create [.src.cid]descrip.mms -$ open/append out [.src.cid]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 CID driver compilation rules for VMS -# - - -# Copyright 2001 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cid]) - -OBJS=type1cid.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.gzip] directory" -$ create [.src.gzip]descrip.mms -$ open/append out [.src.gzip]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 GZip support compilation rules for VMS -# - - -# Copyright 2002 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. -$EOD -$ if libincs .nes. "" then write out "LIBINCS = ", libincs - ",", "," -$ write out "COMP_FLAGS = ", ccopt -$ copy sys$input: out -$ deck - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=($(LIBINCS)[--.include],[--.src.gzip]) - -OBJS=ftgzip.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.lzw] directory" -$ create [.src.lzw]descrip.mms -$ open/append out [.src.lzw]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 LZW support compilation rules for VMS -# - - -# Copyright 2004 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. -$EOD -$ if libincs .nes. "" then write out "LIBINCS = ", libincs - ",", "," -$ write out "COMP_FLAGS = ", ccopt -$ copy sys$input: out -$ deck - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=($(LIBINCS)[--.include],[--.src.lzw]) - -OBJS=ftlzw.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.otlayout] directory" -$ create [.src.otlayout]descrip.mms -$ open/append out [.src.otlayout]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 OT layout compilation rules for VMS -# - - -# Copyright 2004 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.otlayout]) - -OBJS=otlbase.obj,otlcommn.obj,otlgdef.obj,otlgpos.obj,otlgsub.obj,\ - otljstf.obj,otlparse.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.otvalid] directory" -$ create [.src.otvalid]descrip.mms -$ open/append out [.src.otvalid]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 OpenType validation module compilation rules for VMS -# - - -# Copyright 2004 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.otvalid]) - -OBJS=otvalid.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.pcf] directory" -$ create [.src.pcf]descrip.mms -$ open/append out [.src.pcf]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 pcf driver compilation rules for VMS -# - - -# Copyright (C) 2001, 2002 by -# Francesco Zappa Nardelli -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.pcf]) - -OBJS=pcf.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.pfr] directory" -$ create [.src.pfr]descrip.mms -$ open/append out [.src.pfr]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 PFR driver compilation rules for VMS -# - - -# Copyright 2002 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.pfr]) - -OBJS=pfr.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.psaux] directory" -$ create [.src.psaux]descrip.mms -$ open/append out [.src.psaux]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 PSaux driver compilation rules for VMS -# - - -# Copyright 2001, 2002 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psaux]) - -OBJS=psaux.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.pshinter] directory" -$ create [.src.pshinter]descrip.mms -$ open/append out [.src.pshinter]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 PSHinter driver compilation rules for OpenVMS -# - - -# Copyright 2001, 2002 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psnames]) - -OBJS=pshinter.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.psnames] directory" -$ create [.src.psnames]descrip.mms -$ open/append out [.src.psnames]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 PSNames driver compilation rules for VMS -# - - -# Copyright 2001, 2002 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psnames]) - -OBJS=psnames.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.raster] directory" -$ create [.src.raster]descrip.mms -$ open/append out [.src.raster]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 renderer module compilation rules for VMS -# - - -# Copyright 2001 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.raster]) - -OBJS=raster.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.sfnt] directory" -$ create [.src.sfnt]descrip.mms -$ open/append out [.src.sfnt]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 SFNT driver compilation rules for VMS -# - - -# Copyright 2001, 2002 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.sfnt]) - -OBJS=sfnt.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.smooth] directory" -$ create [.src.smooth]descrip.mms -$ open/append out [.src.smooth]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 smooth renderer module compilation rules for VMS -# - - -# Copyright 2001 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.smooth]) - -OBJS=smooth.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.truetype] directory" -$ create [.src.truetype]descrip.mms -$ open/append out [.src.truetype]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 TrueType driver compilation rules for VMS -# - - -# Copyright 2001, 2002 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.truetype]) - -OBJS=truetype.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.type1] directory" -$ create [.src.type1]descrip.mms -$ open/append out [.src.type1]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 Type1 driver compilation rules for VMS -# - - -# Copyright 1996-2000, 2002 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type1]) - -OBJS=type1.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -type1.obj : type1.c t1parse.c t1load.c t1objs.c t1driver.c t1gload.c t1afm.c - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.type42] directory" -$ create [.src.type42]descrip.mms -$ open/append out [.src.type42]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 Type 42 driver compilation rules for VMS -# - - -# Copyright 2002 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type42]) - -OBJS=type42.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ write sys$output "... [.src.winfonts] directory" -$ create [.src.winfonts]descrip.mms -$ open/append out [.src.winfonts]descrip.mms -$ copy sys$input: out -$ deck -# -# FreeType 2 Windows FNT/FON driver compilation rules for VMS -# - - -# Copyright 2001, 2002 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. - - -CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.winfonts]) - -OBJS=winfnt.obj - -all : $(OBJS) - library [--.lib]freetype.olb $(OBJS) - -# EOF -$ eod -$ close out -$ return -$!------------------------------------------------------------------------------ -$! -$! Check command line options and set symbols accordingly -$! -$ CHECK_OPTS: -$ i = 1 -$ OPT_LOOP: -$ if i .lt. 9 -$ then -$ cparm = f$edit(p'i',"upcase") -$ if cparm .eqs. "DEBUG" -$ then -$ ccopt = ccopt + "/noopt/deb" -$ lopts = lopts + "/deb" -$ endif -$ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) -$ then -$ start = f$locate("=",cparm) + 1 -$ len = f$length(cparm) - start -$ ccopt = ccopt + f$extract(start,len,cparm) -$ endif -$ if cparm .eqs. "LINK" then linkonly = true -$ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) -$ then -$ start = f$locate("=",cparm) + 1 -$ len = f$length(cparm) - start -$ lopts = lopts + f$extract(start,len,cparm) -$ endif -$ if f$locate("CC=",cparm) .lt. f$length(cparm) -$ then -$ start = f$locate("=",cparm) + 1 -$ len = f$length(cparm) - start -$ cc_com = f$extract(start,len,cparm) - if (cc_com .nes. "DECC") .and. - - (cc_com .nes. "VAXC") .and. - - (cc_com .nes. "GNUC") -$ then -$ write sys$output "Unsupported compiler choice ''cc_com' ignored" -$ write sys$output "Use DECC, VAXC, or GNUC instead" -$ else -$ if cc_com .eqs. "DECC" then its_decc = true -$ if cc_com .eqs. "VAXC" then its_vaxc = true -$ if cc_com .eqs. "GNUC" then its_gnuc = true -$ endif -$ endif -$ if f$locate("MAKE=",cparm) .lt. f$length(cparm) -$ then -$ start = f$locate("=",cparm) + 1 -$ len = f$length(cparm) - start -$ mmks = f$extract(start,len,cparm) -$ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS") -$ then -$ make = mmks -$ else -$ write sys$output "Unsupported make choice ''mmks' ignored" -$ write sys$output "Use MMK or MMS instead" -$ endif -$ endif -$ i = i + 1 -$ goto opt_loop -$ endif -$ return -$!------------------------------------------------------------------------------ -$! -$! Take care of driver file with information about external libraries -$! -$! Version history -$! 0.01 20040220 First version to receive a number -$! 0.02 20040229 Echo current procedure name; use general error exit handler -$! Remove xpm hack -> Replaced by more general dnsrl handling -$CHECK_CREATE_VMSLIB: -$! -$ if f$search("VMSLIB.DAT") .eqs. "" -$ then -$ type/out=vmslib.dat sys$input -! -! This is a simple driver file with information used by vms_make.com to -! check if external libraries (like t1lib and freetype) are available on -! the system. -! -! Layout of the file: -! -! - Lines starting with ! are treated as comments -! - Elements in a data line are separated by # signs -! - The elements need to be listed in the following order -! 1.) Name of the Library (only used for informative messages -! from vms_make.com) -! 2.) Location where the object library can be found -! 3.) Location where the include files for the library can be found -! 4.) Include file used to verify library location -! 5.) CPP define to pass to the build to indicate availability of -! the library -! -! Example: The following lines show how definitions -! might look like. They are site specific and the locations of the -! library and include files need almost certainly to be changed. -! -! Location: All of the libaries can be found at the following addresses -! -! ZLIB: http://zinser.no-ip.info/vms/sw/zlib.htmlx -! -ZLIB # sys$library:libz.olb # sys$library: # zlib.h # FT_CONFIG_OPTION_SYSTEM_ZLIB -$ write sys$output "New driver file vmslib.dat created." -$ write sys$output "Please customize libary locations for your site" -$ write sys$output "and afterwards re-execute ''myproc'" -$ goto err_exit -$ endif -$! -$! Init symbols used to hold CPP definitions and include path -$! -$ libdefs = "" -$ libincs = "" -$! -$! Open data file with location of libraries -$! -$ open/read/end=end_lib/err=err_lib libdata VMSLIB.DAT -$LIB_LOOP: -$ read/end=end_lib libdata libline -$ libline = f$edit(libline, "UNCOMMENT,COLLAPSE") -$ if libline .eqs. "" then goto LIB_LOOP ! Comment line -$ libname = f$edit(f$element(0,"#",libline),"UPCASE") -$ write sys$output "Processing ''libname' setup ..." -$ libloc = f$element(1,"#",libline) -$ libsrc = f$element(2,"#",libline) -$ testinc = f$element(3,"#",libline) -$ cppdef = f$element(4,"#",libline) -$ old_cpp = f$locate("=1",cppdef) -$ if old_cpp.lt.f$length(cppdef) then cppdef = f$extract(0,old_cpp,cppdef) -$ if f$search("''libloc'").eqs. "" -$ then -$ write sys$output "Can not find library ''libloc' - Skipping ''libname'" -$ goto LIB_LOOP -$ endif -$ libsrc_elem = 0 -$ libsrc_found = false -$LIBSRC_LOOP: -$ libsrcdir = f$element(libsrc_elem,",",libsrc) -$ if (libsrcdir .eqs. ",") then goto END_LIBSRC -$ if f$search("''libsrcdir'''testinc'") .nes. "" then libsrc_found = true -$ libsrc_elem = libsrc_elem + 1 -$ goto LIBSRC_LOOP -$END_LIBSRC: -$ if .not. libsrc_found -$ then -$ write sys$output "Can not find includes at ''libsrc' - Skipping ''libname'" -$ goto LIB_LOOP -$ endif -$ if (cppdef .nes. "") then libdefs = libdefs + cppdef + "," -$ libincs = libincs + "," + libsrc -$ lqual = "/lib" -$ libtype = f$edit(f$parse(libloc,,,"TYPE"),"UPCASE") -$ if f$locate("EXE",libtype) .lt. f$length(libtype) then lqual = "/share" -$ write optf libloc , lqual -$ if (f$trnlnm("topt") .nes. "") then write topt libloc , lqual -$! -$! Nasty hack to get the freetype includes to work -$! -$ ft2def = false -$ if ((libname .eqs. "FREETYPE") .and. - - (f$locate("FREETYPE2",cppdef) .lt. f$length(cppdef))) -$ then -$ if ((f$search("freetype:freetype.h") .nes. "") .and. - - (f$search("freetype:[internal]ftobjs.h") .nes. "")) -$ then -$ write sys$output "Will use local definition of freetype logical" -$ else -$ ft2elem = 0 -$FT2_LOOP: -$ ft2srcdir = f$element(ft2elem,",",libsrc) -$ if f$search("''ft2srcdir'''testinc'") .nes. "" -$ then -$ if f$search("''ft2srcdir'internal.dir") .nes. "" -$ then -$ ft2dev = f$parse("''ft2srcdir'",,,"device","no_conceal") -$ ft2dir = f$parse("''ft2srcdir'",,,"directory","no_conceal") -$ ft2conc = f$locate("][",ft2dir) -$ ft2len = f$length(ft2dir) -$ if ft2conc .lt. ft2len -$ then -$ ft2dir = f$extract(0,ft2conc,ft2dir) + - - f$extract(ft2conc+2,ft2len-2,ft2dir) -$ endif -$ ft2dir = ft2dir - "]" + ".]" -$ define freetype 'ft2dev''ft2dir','ft2srcdir' -$ ft2def = true -$ else -$ goto ft2_err -$ endif -$ else -$ ft2elem = ft2elem + 1 -$ goto ft2_loop -$ endif -$ endif -$ endif -$ goto LIB_LOOP -$END_LIB: -$ close libdata -$ return -$!------------------------------------------------------------------------------ -$! -$! Analyze Object files for OpenVMS AXP to extract Procedure and Data -$! information to build a symbol vector for a shareable image -$! All the "brains" of this logic was suggested by Hartmut Becker -$! (Hartmut.Becker@compaq.com). All the bugs were introduced by me -$! (zinser@zinser.no-ip.info), so if you do have problem reports please do not -$! bother Hartmut/HP, but get in touch with me -$! -$! Version history -$! 0.01 20040006 Skip over shareable images in option file -$! -$ ANAL_OBJ_AXP: Subroutine -$ V = 'F$Verify(0) -$ SAY := "WRITE_ SYS$OUTPUT" -$ -$ IF F$SEARCH("''P1'") .EQS. "" -$ THEN -$ SAY "ANAL_OBJ_AXP-E-NOSUCHFILE: Error, inputfile ''p1' not available" -$ goto exit_aa -$ ENDIF -$ IF "''P2'" .EQS. "" -$ THEN -$ SAY "ANAL_OBJ_AXP: Error, no output file provided" -$ goto exit_aa -$ ENDIF -$ -$ open/read in 'p1 -$ create a.tmp -$ open/append atmp a.tmp -$ loop: -$ read/end=end_loop in line -$ if f$locate("/SHARE",f$edit(line,"upcase")) .lt. f$length(line) -$ then -$ write sys$output "ANAL_SKP_SHR-i-skipshare, ''line'" -$ goto loop -$ endif -$ if f$locate("/LIB",f$edit(line,"upcase")) .lt. f$length(line) -$ then -$ write libsf line -$ write sys$output "ANAL_SKP_LIB-i-skiplib, ''line'" -$ goto loop -$ endif -$ f= f$search(line) -$ if f .eqs. "" -$ then -$ write sys$output "ANAL_OBJ_AXP-w-nosuchfile, ''line'" -$ goto loop -$ endif -$ def/user sys$output nl: -$ def/user sys$error nl: -$ anal/obj/gsd 'f /out=x.tmp -$ open/read xtmp x.tmp -$ XLOOP: -$ read/end=end_xloop xtmp xline -$ xline = f$edit(xline,"compress") -$ write atmp xline -$ goto xloop -$ END_XLOOP: -$ close xtmp -$ goto loop -$ end_loop: -$ close in -$ close atmp -$ if f$search("a.tmp") .eqs. "" - - then $ exit -$ ! all global definitions -$ search a.tmp "symbol:","EGSY$V_DEF 1","EGSY$V_NORM 1"/out=b.tmp -$ ! all procedures -$ search b.tmp "EGSY$V_NORM 1"/wind=(0,1) /out=c.tmp -$ search c.tmp "symbol:"/out=d.tmp -$ def/user sys$output nl: -$ edito/edt/command=sys$input d.tmp -sub/symbol: "/symbol_vector=(/whole -sub/"/=PROCEDURE)/whole -exit -$ ! all data -$ search b.tmp "EGSY$V_DEF 1"/wind=(0,1) /out=e.tmp -$ search e.tmp "symbol:"/out=f.tmp -$ def/user sys$output nl: -$ edito/edt/command=sys$input f.tmp -sub/symbol: "/symbol_vector=(/whole -sub/"/=DATA)/whole -exit -$ sort/nodupl d.tmp,f.tmp 'p2' -$ delete a.tmp;*,b.tmp;*,c.tmp;*,d.tmp;*,e.tmp;*,f.tmp;* -$ if f$search("x.tmp") .nes. "" - - then $ delete x.tmp;* -$! -$ close libsf -$ EXIT_AA: -$ if V then set verify -$ endsubroutine