summaryrefslogtreecommitdiff
path: root/include/freetype/internal
diff options
context:
space:
mode:
authorDavid Boddie <david@boddie.org.uk>2024-02-28 01:52:58 +0100
committerDavid Boddie <david@boddie.org.uk>2024-02-28 01:52:58 +0100
commitcbd016cda002145743d87224f0a9f9068abbfc67 (patch)
treebcfcc9b11ea078a5fa42b16f7ea98a29d112d040 /include/freetype/internal
parent75323f4992b2b4e593bd2f548db9ac6897e894d3 (diff)
Removed libfreetype fork, replacing it with a submodule and some Inferno-specific files.
Retained the license documents and updated the header files.
Diffstat (limited to 'include/freetype/internal')
-rw-r--r--include/freetype/internal/autohint.h347
-rw-r--r--include/freetype/internal/bdftypes.h53
-rw-r--r--include/freetype/internal/cffotypes.h107
-rw-r--r--include/freetype/internal/cfftypes.h304
-rw-r--r--include/freetype/internal/compiler-macros.h343
-rw-r--r--include/freetype/internal/fnttypes.h155
-rw-r--r--include/freetype/internal/ftcalc.h611
-rw-r--r--include/freetype/internal/ftcore.h185
-rw-r--r--include/freetype/internal/ftdebug.h422
-rw-r--r--include/freetype/internal/ftdriver.h202
-rw-r--r--include/freetype/internal/ftdrv.h289
-rw-r--r--include/freetype/internal/ftexcept.h82
-rw-r--r--include/freetype/internal/ftgloadr.h132
-rw-r--r--include/freetype/internal/fthash.h595
-rw-r--r--include/freetype/internal/ftmemory.h522
-rw-r--r--include/freetype/internal/ftmmtypes.h91
-rw-r--r--include/freetype/internal/ftobject.h533
-rw-r--r--include/freetype/internal/ftobjs.h1358
-rw-r--r--include/freetype/internal/ftpsprop.h47
-rw-r--r--include/freetype/internal/ftrfork.h245
-rw-r--r--include/freetype/internal/ftserv.h495
-rw-r--r--include/freetype/internal/ftstream.h432
-rw-r--r--include/freetype/internal/fttrace.h165
-rw-r--r--include/freetype/internal/ftvalid.h160
-rw-r--r--include/freetype/internal/internal.h57
-rw-r--r--include/freetype/internal/pcftypes.h56
-rw-r--r--include/freetype/internal/pfr.h36
-rw-r--r--include/freetype/internal/psaux.h1198
-rw-r--r--include/freetype/internal/pshints.h985
-rw-r--r--include/freetype/internal/psnames.h241
-rw-r--r--include/freetype/internal/services/svbdf.h66
-rw-r--r--include/freetype/internal/services/svcfftl.h90
-rw-r--r--include/freetype/internal/services/svcid.h69
-rw-r--r--include/freetype/internal/services/svfntfmt.h55
-rw-r--r--include/freetype/internal/services/svgldict.h72
-rw-r--r--include/freetype/internal/services/svgxval.h72
-rw-r--r--include/freetype/internal/services/svkern.h51
-rw-r--r--include/freetype/internal/services/svmetric.h131
-rw-r--r--include/freetype/internal/services/svmm.h214
-rw-r--r--include/freetype/internal/services/svotval.h55
-rw-r--r--include/freetype/internal/services/svpfr.h65
-rw-r--r--include/freetype/internal/services/svpostnm.h65
-rw-r--r--include/freetype/internal/services/svprop.h66
-rw-r--r--include/freetype/internal/services/svpscmap.h145
-rw-r--r--include/freetype/internal/services/svpsinfo.h86
-rw-r--r--include/freetype/internal/services/svsfnt.h88
-rw-r--r--include/freetype/internal/services/svttcmap.h90
-rw-r--r--include/freetype/internal/services/svtteng.h53
-rw-r--r--include/freetype/internal/services/svttglyf.h56
-rw-r--r--include/freetype/internal/services/svwinfnt.h50
-rw-r--r--include/freetype/internal/sfnt.h1435
-rw-r--r--include/freetype/internal/svginterface.h46
-rw-r--r--include/freetype/internal/t1types.h216
-rw-r--r--include/freetype/internal/t42types.h55
-rw-r--r--include/freetype/internal/tttypes.h2516
-rw-r--r--include/freetype/internal/wofftypes.h312
56 files changed, 10770 insertions, 5897 deletions
diff --git a/include/freetype/internal/autohint.h b/include/freetype/internal/autohint.h
index 22340afc..8865d53b 100644
--- a/include/freetype/internal/autohint.h
+++ b/include/freetype/internal/autohint.h
@@ -1,77 +1,76 @@
-/***************************************************************************/
-/* */
-/* autohint.h */
-/* */
-/* High-level `autohint' module-specific interface (specification). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
-
-
- /*************************************************************************/
- /* */
- /* 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 */
- /* agressively 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
+/****************************************************************************
+ *
+ * autohint.h
+ *
+ * High-level 'autohint' module-specific interface (specification).
+ *
+ * Copyright (C) 1996-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/freetype.h>
FT_BEGIN_HEADER
@@ -80,27 +79,31 @@ FT_BEGIN_HEADER
typedef struct FT_AutoHinterRec_ *FT_AutoHinter;
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* FT_AutoHinter_GlobalGetFunc */
- /* */
- /* <Description> */
- /* Retrieves 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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,
@@ -108,69 +111,76 @@ FT_BEGIN_HEADER
long* global_len );
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* FT_AutoHinter_GlobalDoneFunc */
- /* */
- /* <Description> */
- /* Discards 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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. */
- /* */
+ /**************************************************************************
+ *
+ * @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. */
- /* */
+ /**************************************************************************
+ *
+ * @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,
@@ -179,27 +189,46 @@ FT_BEGIN_HEADER
FT_Int32 load_flags );
- /*************************************************************************/
- /* */
- /* <Struct> */
- /* FT_AutoHinter_ServiceRec */
- /* */
- /* <Description> */
- /* The auto-hinter module's interface. */
- /* */
- typedef struct FT_AutoHinter_ServiceRec_
+ /**************************************************************************
+ *
+ * @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_ServiceRec, *FT_AutoHinter_Service;
+ } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface;
+
+
+#define FT_DECLARE_AUTOHINTER_INTERFACE( class_ ) \
+ FT_CALLBACK_TABLE const FT_AutoHinter_InterfaceRec class_;
+
+#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_ \
+ };
FT_END_HEADER
-#endif /* __AUTOHINT_H__ */
+#endif /* AUTOHINT_H_ */
/* END */
diff --git a/include/freetype/internal/bdftypes.h b/include/freetype/internal/bdftypes.h
deleted file mode 100644
index cd4dcabd..00000000
--- a/include/freetype/internal/bdftypes.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* bdftypes.h
-
- FreeType font driver for bdf fonts
-
- 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.
-*/
-
-#ifndef __BDFTYPES_H__
-#define __BDFTYPES_H__
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-
-FT_BEGIN_HEADER
-
-
- typedef struct BDF_Public_FaceRec_
- {
- FT_FaceRec root;
-
- char* charset_encoding;
- char* charset_registry;
-
- } BDF_Public_FaceRec, *BDF_Public_Face;
-
-
-FT_END_HEADER
-
-
-#endif /* __BDFTYPES_H__ */
-
-
-/* END */
diff --git a/include/freetype/internal/cffotypes.h b/include/freetype/internal/cffotypes.h
new file mode 100644
index 00000000..36b0390a
--- /dev/null
+++ b/include/freetype/internal/cffotypes.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+ *
+ * cffotypes.h
+ *
+ * Basic OpenType/CFF object type definitions (specification).
+ *
+ * Copyright (C) 2017-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 CFFOTYPES_H_
+#define CFFOTYPES_H_
+
+#include <freetype/internal/ftobjs.h>
+#include <freetype/internal/cfftypes.h>
+#include <freetype/internal/tttypes.h>
+#include <freetype/internal/services/svpscmap.h>
+#include <freetype/internal/pshints.h>
+
+
+FT_BEGIN_HEADER
+
+
+ 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;
+
+
+FT_END_HEADER
+
+
+#endif /* CFFOTYPES_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/cfftypes.h b/include/freetype/internal/cfftypes.h
index 82e1e91b..ef2e8e75 100644
--- a/include/freetype/internal/cfftypes.h
+++ b/include/freetype/internal/cfftypes.h
@@ -1,61 +1,79 @@
-/***************************************************************************/
-/* */
-/* cfftypes.h */
-/* */
-/* Basic OpenType/CFF type definitions and interface (specification */
-/* only). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
-
-
-#ifndef __CFFTYPES_H__
-#define __CFFTYPES_H__
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
+/****************************************************************************
+ *
+ * cfftypes.h
+ *
+ * Basic OpenType/CFF type definitions and interface (specification
+ * only).
+ *
+ * Copyright (C) 1996-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/freetype.h>
+#include <freetype/t1tables.h>
+#include <freetype/internal/ftserv.h>
+#include <freetype/internal/services/svpscmap.h>
+#include <freetype/internal/pshints.h>
+#include <freetype/internal/t1types.h>
FT_BEGIN_HEADER
- /*************************************************************************/
- /* */
- /* <Struct> */
- /* CFF_IndexRec */
- /* */
- /* <Description> */
- /* A structure used to model a CFF Index table. */
- /* */
- /* <Fields> */
- /* stream :: The source 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. */
- /* */
- /* offsets :: A table of element offsets in the index. */
- /* */
- /* bytes :: If the index is loaded in memory, its bytes. */
- /* */
+ /**************************************************************************
+ *
+ * @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 hdr_size;
FT_UInt count;
FT_Byte off_size;
FT_ULong data_offset;
+ FT_ULong data_size;
FT_ULong* offsets;
FT_Byte* bytes;
@@ -82,10 +100,87 @@ FT_BEGIN_HEADER
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;
+ /* cf. similar fields in file `ttgxvar.h' from the `truetype' module */
+
+ typedef struct CFF_VarData_
+ {
+#if 0
+ FT_UInt itemCount; /* not used; always zero */
+ FT_UInt shortDeltaCount; /* not used; always zero */
+#endif
+
+ FT_UInt regionIdxCount; /* number of region indexes */
+ FT_UInt* regionIndices; /* array of `regionIdxCount' indices; */
+ /* these index `varRegionList' */
+ } CFF_VarData;
+
+
+ /* contribution of one axis to a region */
+ typedef struct CFF_AxisCoords_
+ {
+ FT_Fixed startCoord;
+ FT_Fixed peakCoord; /* zero peak means no effect (factor = 1) */
+ FT_Fixed endCoord;
+
+ } CFF_AxisCoords;
+
+
+ typedef struct CFF_VarRegion_
+ {
+ CFF_AxisCoords* axisList; /* array of axisCount records */
+
+ } CFF_VarRegion;
+
+
+ typedef struct CFF_VStoreRec_
+ {
+ FT_UInt dataCount;
+ CFF_VarData* varData; /* array of dataCount records */
+ /* vsindex indexes this array */
+ FT_UShort axisCount;
+ FT_UInt regionCount; /* total number of regions defined */
+ CFF_VarRegion* varRegionList;
+
+ } CFF_VStoreRec, *CFF_VStore;
+
+
+ /* forward reference */
+ typedef struct CFF_FontRec_* CFF_Font;
+
+
+ /* This object manages one cached blend vector. */
+ /* */
+ /* There is a BlendRec for Private DICT parsing in each subfont */
+ /* and a BlendRec for charstrings in CF2_Font instance data. */
+ /* A cached BV may be used across DICTs or Charstrings if inputs */
+ /* have not changed. */
+ /* */
+ /* `usedBV' is reset at the start of each parse or charstring. */
+ /* vsindex cannot be changed after a BV is used. */
+ /* */
+ /* Note: NDV is long (32/64 bit), while BV is 16.16 (FT_Int32). */
+ typedef struct CFF_BlendRec_
+ {
+ FT_Bool builtBV; /* blendV has been built */
+ FT_Bool usedBV; /* blendV has been used */
+ CFF_Font font; /* top level font struct */
+ FT_UInt lastVsindex; /* last vsindex used */
+ FT_UInt lenNDV; /* normDV length (aka numAxes) */
+ FT_Fixed* lastNDV; /* last NDV used */
+ FT_UInt lenBV; /* BlendV length (aka numMasters) */
+ FT_Int32* BV; /* current blendV (per DICT/glyph) */
+
+ } CFF_BlendRec, *CFF_Blend;
+
+
typedef struct CFF_FontRecDictRec_
{
FT_UInt version;
@@ -96,12 +191,13 @@ FT_BEGIN_HEADER
FT_UInt weight;
FT_Bool is_fixed_pitch;
FT_Fixed italic_angle;
- FT_Pos underline_position;
- FT_Pos underline_thickness;
+ FT_Fixed underline_position;
+ FT_Fixed underline_thickness;
FT_Int paint_type;
FT_Int charstring_type;
FT_Matrix font_matrix;
- FT_UShort units_per_em;
+ 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;
@@ -113,26 +209,38 @@ FT_BEGIN_HEADER
FT_ULong private_size;
FT_Long synthetic_base;
FT_UInt embedded_postscript;
- FT_UInt base_font_name;
- FT_UInt postscript;
/* these should only be used for the top-level font dictionary */
FT_UInt cid_registry;
FT_UInt cid_ordering;
- FT_ULong cid_supplement;
+ FT_Long cid_supplement;
FT_Long cid_font_version;
FT_Long cid_font_revision;
FT_Long cid_font_type;
- FT_Long cid_count;
+ 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;
+ /* the next fields come from the data of the deprecated */
+ /* `MultipleMaster' operator; they are needed to parse the (also */
+ /* deprecated) `blend' operator in Type 2 charstrings */
+ FT_UShort num_designs;
+ FT_UShort num_axes;
+
+ /* fields for CFF2 */
+ FT_ULong vstore_offset;
+ FT_UInt maxstack;
+
} CFF_FontRecDictRec, *CFF_FontRecDict;
+ /* forward reference */
+ typedef struct CFF_SubFontRec_* CFF_SubFont;
+
+
typedef struct CFF_PrivateRec_
{
FT_Byte num_blue_values;
@@ -140,10 +248,10 @@ FT_BEGIN_HEADER
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_values[14];
+ FT_Fixed other_blues[10];
+ FT_Fixed family_blues[14];
+ FT_Fixed family_other_blues[10];
FT_Fixed blue_scale;
FT_Pos blue_shift;
@@ -165,6 +273,10 @@ FT_BEGIN_HEADER
FT_Pos default_width;
FT_Pos nominal_width;
+ /* fields for CFF2 */
+ FT_UInt vsindex;
+ CFF_SubFont subfont;
+
} CFF_PrivateRec, *CFF_Private;
@@ -192,33 +304,55 @@ FT_BEGIN_HEADER
CFF_FontRecDictRec font_dict;
CFF_PrivateRec private_dict;
- CFF_IndexRec local_subrs_index;
- FT_UInt num_local_subrs;
- FT_Byte** local_subrs;
+ /* fields for CFF2 */
+ CFF_BlendRec blend; /* current blend vector */
+ FT_UInt lenNDV; /* current length NDV or zero */
+ FT_Fixed* NDV; /* ptr to current NDV or NULL */
+
+ /* `blend_stack' is a writable buffer to hold blend results. */
+ /* This buffer is to the side of the normal cff parser stack; */
+ /* `cff_parse_blend' and `cff_blend_doBlend' push blend results here. */
+ /* The normal stack then points to these values instead of the DICT */
+ /* because all other operators in Private DICT clear the stack. */
+ /* `blend_stack' could be cleared at each operator other than blend. */
+ /* Blended values are stored as 5-byte fixed-point values. */
+
+ FT_Byte* blend_stack; /* base of stack allocation */
+ FT_Byte* blend_top; /* first empty slot */
+ FT_UInt blend_used; /* number of bytes in use */
+ FT_UInt blend_alloc; /* number of bytes allocated */
+
+ CFF_IndexRec local_subrs_index;
+ FT_Byte** local_subrs; /* array of pointers */
+ /* into Local Subrs INDEX data */
- } CFF_SubFontRec, *CFF_SubFont;
+ FT_UInt32 random;
+ } CFF_SubFontRec;
- /* maximum number of sub-fonts in a CID-keyed file */
-#define CFF_MAX_CID_FONTS 16
+
+#define CFF_MAX_CID_FONTS 256
typedef struct CFF_FontRec_
{
+ FT_Library library;
FT_Stream stream;
- FT_Memory memory;
+ FT_Memory memory; /* TODO: take this from stream->memory? */
+ FT_ULong base_offset; /* offset to start of CFF */
FT_UInt num_faces;
FT_UInt num_glyphs;
FT_Byte version_major;
FT_Byte version_minor;
FT_Byte header_size;
- FT_Byte absolute_offsize;
+ FT_UInt top_dict_length; /* cff2 only */
+
+ FT_Bool cff2;
CFF_IndexRec name_index;
CFF_IndexRec top_dict_index;
- CFF_IndexRec string_index;
CFF_IndexRec global_subrs_index;
CFF_EncodingRec encoding;
@@ -230,9 +364,16 @@ FT_BEGIN_HEADER
CFF_IndexRec local_subrs_index;
FT_String* font_name;
- FT_UInt num_global_subrs;
+
+ /* 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;
+ FT_ULong string_pool_size;
+
CFF_SubFontRec top_font;
FT_UInt num_subfonts;
CFF_SubFont subfonts[CFF_MAX_CID_FONTS];
@@ -240,17 +381,36 @@ FT_BEGIN_HEADER
CFF_FDSelectRec fd_select;
/* interface to PostScript hinter */
- void* pshinter;
+ PSHinter_Service pshinter;
/* interface to Postscript Names service */
- void* psnames;
+ FT_Service_PsCMaps psnames;
+
+ /* interface to CFFLoad service */
+ const void* cffload;
+
+ /* 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;
+
+ /* since version 2.7.1 */
+ CFF_VStoreRec vstore; /* parsed vstore structure */
+
+ /* since version 2.9 */
+ PS_FontExtraRec* font_extra;
- } CFF_FontRec, *CFF_Font;
+ } CFF_FontRec;
FT_END_HEADER
-#endif /* __CFFTYPES_H__ */
+#endif /* CFFTYPES_H_ */
/* END */
diff --git a/include/freetype/internal/compiler-macros.h b/include/freetype/internal/compiler-macros.h
new file mode 100644
index 00000000..876f66e2
--- /dev/null
+++ b/include/freetype/internal/compiler-macros.h
@@ -0,0 +1,343 @@
+/****************************************************************************
+ *
+ * internal/compiler-macros.h
+ *
+ * Compiler-specific macro definitions used internally by FreeType.
+ *
+ * Copyright (C) 2020-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 INTERNAL_COMPILER_MACROS_H_
+#define INTERNAL_COMPILER_MACROS_H_
+
+#include <freetype/config/public-macros.h>
+
+FT_BEGIN_HEADER
+
+ /* Fix compiler warning with sgi compiler. */
+#if defined( __sgi ) && !defined( __GNUC__ )
+# if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 )
+# pragma set woff 3505
+# 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
+
+ /* Newer compilers warn for fall-through case statements. */
+#ifndef FALL_THROUGH
+# if ( defined( __STDC_VERSION__ ) && __STDC_VERSION__ > 201710L ) || \
+ ( defined( __cplusplus ) && __cplusplus > 201402L )
+# define FALL_THROUGH [[__fallthrough__]]
+# elif ( defined( __GNUC__ ) && __GNUC__ >= 7 ) || \
+ ( defined( __clang__ ) && \
+ ( defined( __apple_build_version__ ) \
+ ? __apple_build_version__ >= 12000000 \
+ : __clang_major__ >= 10 ) )
+# define FALL_THROUGH __attribute__(( __fallthrough__ ))
+# else
+# define FALL_THROUGH ( (void)0 )
+# endif
+#endif
+
+ /*
+ * When defining a macro that expands to a non-trivial C statement, use
+ * FT_BEGIN_STMNT and FT_END_STMNT to enclose the macro's body. This
+ * ensures there are no surprises when the macro is invoked in conditional
+ * branches.
+ *
+ * Example:
+ *
+ * #define LOG( ... ) \
+ * FT_BEGIN_STMNT \
+ * if ( logging_enabled ) \
+ * log( __VA_ARGS__ ); \
+ * FT_END_STMNT
+ */
+#define FT_BEGIN_STMNT do {
+#define FT_END_STMNT } while ( 0 )
+
+ /*
+ * FT_DUMMY_STMNT expands to an empty C statement. Useful for
+ * conditionally defined statement macros.
+ *
+ * Example:
+ *
+ * #ifdef BUILD_CONFIG_LOGGING
+ * #define LOG( ... ) \
+ * FT_BEGIN_STMNT \
+ * if ( logging_enabled ) \
+ * log( __VA_ARGS__ ); \
+ * FT_END_STMNT
+ * #else
+ * # define LOG( ... ) FT_DUMMY_STMNT
+ * #endif
+ */
+#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT
+
+#ifdef __UINTPTR_TYPE__
+ /*
+ * GCC and Clang both provide a `__UINTPTR_TYPE__` that can be used to
+ * avoid a dependency on `stdint.h`.
+ */
+# define FT_UINT_TO_POINTER( x ) (void *)(__UINTPTR_TYPE__)(x)
+#elif defined( _WIN64 )
+ /* only 64bit Windows uses the LLP64 data model, i.e., */
+ /* 32-bit integers, 64-bit pointers. */
+# define FT_UINT_TO_POINTER( x ) (void *)(unsigned __int64)(x)
+#else
+# define FT_UINT_TO_POINTER( x ) (void *)(unsigned long)(x)
+#endif
+
+ /*
+ * Use `FT_TYPEOF( type )` to cast a value to `type`. This is useful to
+ * suppress signedness compilation warnings in macros.
+ *
+ * Example:
+ *
+ * #define PAD_( x, n ) ( (x) & ~FT_TYPEOF( x )( (n) - 1 ) )
+ *
+ * (The `typeof` condition is taken from gnulib's `intprops.h` header
+ * file.)
+ */
+#if ( ( defined( __GNUC__ ) && __GNUC__ >= 2 ) || \
+ ( defined( __IBMC__ ) && __IBMC__ >= 1210 && \
+ defined( __IBM__TYPEOF__ ) ) || \
+ ( defined( __SUNPRO_C ) && __SUNPRO_C >= 0x5110 && !__STDC__ ) )
+#define FT_TYPEOF( type ) ( __typeof__ ( type ) )
+#else
+#define FT_TYPEOF( type ) /* empty */
+#endif
+
+ /*
+ * Mark a function declaration as internal to the library. This ensures
+ * that it will not be exposed by default to client code, and helps
+ * generate smaller and faster code on ELF-based platforms. Place this
+ * before a function declaration.
+ */
+
+ /* Visual C, mingw */
+#if defined( _WIN32 )
+#define FT_INTERNAL_FUNCTION_ATTRIBUTE /* empty */
+
+ /* gcc, clang */
+#elif ( defined( __GNUC__ ) && __GNUC__ >= 4 ) || defined( __clang__ )
+#define FT_INTERNAL_FUNCTION_ATTRIBUTE \
+ __attribute__(( visibility( "hidden" ) ))
+
+ /* Sun */
+#elif defined( __SUNPRO_C ) && __SUNPRO_C >= 0x550
+#define FT_INTERNAL_FUNCTION_ATTRIBUTE __hidden
+
+#else
+#define FT_INTERNAL_FUNCTION_ATTRIBUTE /* empty */
+#endif
+
+ /*
+ * FreeType supports compilation of its C sources with a C++ compiler (in
+ * C++ mode); this introduces a number of subtle issues.
+ *
+ * The main one is that a C++ function declaration and its definition must
+ * have the same 'linkage'. Because all FreeType headers declare their
+ * functions with C linkage (i.e., within an `extern "C" { ... }` block
+ * due to the magic of FT_BEGIN_HEADER and FT_END_HEADER), their
+ * definition in FreeType sources should also be prefixed with `extern
+ * "C"` when compiled in C++ mode.
+ *
+ * The `FT_FUNCTION_DECLARATION` and `FT_FUNCTION_DEFINITION` macros are
+ * provided to deal with this case, as well as `FT_CALLBACK_DEF` and its
+ * siblings below.
+ */
+
+ /*
+ * `FT_FUNCTION_DECLARATION( type )` can be used to write a C function
+ * declaration to ensure it will have C linkage when the library is built
+ * with a C++ compiler. The parameter is the function's return type, so a
+ * declaration would look like
+ *
+ * FT_FUNCTION_DECLARATION( int )
+ * foo( int x );
+ *
+ * NOTE: This requires that all uses are inside of `FT_BEGIN_HEADER ...
+ * FT_END_HEADER` blocks, which guarantees that the declarations have C
+ * linkage when the headers are included by C++ sources.
+ *
+ * NOTE: Do not use directly. Use `FT_LOCAL`, `FT_BASE`, and `FT_EXPORT`
+ * instead.
+ */
+#define FT_FUNCTION_DECLARATION( x ) extern x
+
+ /*
+ * Same as `FT_FUNCTION_DECLARATION`, but for function definitions instead.
+ *
+ * NOTE: Do not use directly. Use `FT_LOCAL_DEF`, `FT_BASE_DEF`, and
+ * `FT_EXPORT_DEF` instead.
+ */
+#ifdef __cplusplus
+#define FT_FUNCTION_DEFINITION( x ) extern "C" x
+#else
+#define FT_FUNCTION_DEFINITION( x ) x
+#endif
+
+ /*
+ * Use `FT_LOCAL` and `FT_LOCAL_DEF` to declare and define, respectively,
+ * an internal FreeType function that is only used by the sources of a
+ * single `src/module/` directory. This ensures that the functions are
+ * turned into static ones at build time, resulting in smaller and faster
+ * code.
+ */
+#ifdef FT_MAKE_OPTION_SINGLE_OBJECT
+
+#define FT_LOCAL( x ) static x
+#define FT_LOCAL_DEF( x ) static x
+
+#else
+
+#define FT_LOCAL( x ) FT_INTERNAL_FUNCTION_ATTRIBUTE \
+ FT_FUNCTION_DECLARATION( x )
+#define FT_LOCAL_DEF( x ) FT_FUNCTION_DEFINITION( x )
+
+#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
+
+ /*
+ * Use `FT_LOCAL_ARRAY` and `FT_LOCAL_ARRAY_DEF` to declare and define,
+ * respectively, a constant array that must be accessed from several
+ * sources in the same `src/module/` sub-directory, and which are internal
+ * to the library.
+ */
+#define FT_LOCAL_ARRAY( x ) FT_INTERNAL_FUNCTION_ATTRIBUTE \
+ extern const x
+#define FT_LOCAL_ARRAY_DEF( x ) FT_FUNCTION_DEFINITION( const x )
+
+ /*
+ * `Use FT_BASE` and `FT_BASE_DEF` to declare and define, respectively, an
+ * internal library function that is used by more than a single module.
+ */
+#define FT_BASE( x ) FT_INTERNAL_FUNCTION_ATTRIBUTE \
+ FT_FUNCTION_DECLARATION( x )
+#define FT_BASE_DEF( x ) FT_FUNCTION_DEFINITION( x )
+
+
+ /*
+ * NOTE: Conditionally define `FT_EXPORT_VAR` due to its definition in
+ * `src/smooth/ftgrays.h` to make the header more portable.
+ */
+#ifndef FT_EXPORT_VAR
+#define FT_EXPORT_VAR( x ) FT_FUNCTION_DECLARATION( x )
+#endif
+
+ /*
+ * When compiling FreeType as a DLL or DSO with hidden visibility,
+ * some systems/compilers need a special attribute 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.
+ *
+ * To export a variable, use `FT_EXPORT_VAR`.
+ */
+
+ /* See `freetype/config/public-macros.h` for the `FT_EXPORT` definition */
+#define FT_EXPORT_DEF( x ) FT_FUNCTION_DEFINITION( x )
+
+ /*
+ * 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,
+ * located in the same source code file as the structure that uses
+ * it. FT_COMPARE_DEF, in addition, ensures the `cdecl` calling
+ * convention on x86, required by the C library function `qsort`.
+ *
+ * FT_BASE_CALLBACK and FT_BASE_CALLBACK_DEF are used to declare
+ * and define a callback function, respectively, in a similar way
+ * as FT_BASE and FT_BASE_DEF work.
+ *
+ * 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.
+ */
+#ifdef __cplusplus
+#define FT_CALLBACK_DEF( x ) extern "C" x
+#else
+#define FT_CALLBACK_DEF( x ) static x
+#endif
+
+#if defined( __GNUC__ ) && defined( __i386__ )
+#define FT_COMPARE_DEF( x ) FT_CALLBACK_DEF( x ) __attribute__(( cdecl ))
+#elif defined( _MSC_VER ) && defined( _M_IX86 )
+#define FT_COMPARE_DEF( x ) FT_CALLBACK_DEF( x ) __cdecl
+#elif defined( __WATCOMC__ ) && __WATCOMC__ >= 1240
+#define FT_COMPARE_DEF( x ) FT_CALLBACK_DEF( x ) __watcall
+#else
+#define FT_COMPARE_DEF( x ) FT_CALLBACK_DEF( x )
+#endif
+
+#define FT_BASE_CALLBACK( x ) FT_FUNCTION_DECLARATION( x )
+#define FT_BASE_CALLBACK_DEF( x ) FT_FUNCTION_DEFINITION( x )
+
+#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 /* INTERNAL_COMPILER_MACROS_H_ */
diff --git a/include/freetype/internal/fnttypes.h b/include/freetype/internal/fnttypes.h
deleted file mode 100644
index 54e37ec4..00000000
--- a/include/freetype/internal/fnttypes.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/***************************************************************************/
-/* */
-/* fnttypes.h */
-/* */
-/* Basic Windows FNT/FON type definitions and interface (specification */
-/* only). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
-
-
-#ifndef __FNTTYPES_H__
-#define __FNTTYPES_H__
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-
-FT_BEGIN_HEADER
-
-
- 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 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
-
-
- typedef struct 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_Byte reserved2[4];
-
- } WinFNT_HeaderRec, *WinFNT_Header;
-
-
- typedef struct FNT_FontRec_
- {
- FT_ULong offset;
- FT_Int size_shift;
-
- WinFNT_HeaderRec header;
-
- FT_Byte* fnt_frame;
- FT_ULong fnt_size;
-
- } FNT_FontRec, *FNT_Font;
-
-
- typedef struct FNT_SizeRec_
- {
- FT_SizeRec root;
- FNT_Font font;
-
- } FNT_SizeRec, *FNT_Size;
-
-
- typedef struct FNT_FaceRec_
- {
- FT_FaceRec root;
-
- FT_UInt num_fonts;
- FNT_Font fonts;
-
- FT_CharMap charmap_handle;
- FT_CharMapRec charmap; /* a single charmap per face */
-
- } FNT_FaceRec, *FNT_Face;
-
-
-FT_END_HEADER
-
-#endif /* __FNTTYPES_H__ */
-
-
-/* END */
diff --git a/include/freetype/internal/ftcalc.h b/include/freetype/internal/ftcalc.h
index af1f6407..40634602 100644
--- a/include/freetype/internal/ftcalc.h
+++ b/include/freetype/internal/ftcalc.h
@@ -1,77 +1,584 @@
-/***************************************************************************/
-/* */
-/* ftcalc.h */
-/* */
-/* Arithmetic computations (specification). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
+/****************************************************************************
+ *
+ * ftcalc.h
+ *
+ * Arithmetic computations (specification).
+ *
+ * Copyright (C) 1996-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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__
+#ifndef FTCALC_H_
+#define FTCALC_H_
-#include <ft2build.h>
-#include FT_FREETYPE_H
+#include <freetype/freetype.h>
+#include "compiler-macros.h"
FT_BEGIN_HEADER
- FT_EXPORT( FT_Int32 ) FT_SqrtFixed( FT_Int32 x );
+ /**************************************************************************
+ *
+ * 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. */
-#define SQRT_32( x ) FT_Sqrt32( x )
+#if defined( __CC_ARM ) || defined( __ARMCC__ ) /* RVCT */
+#define FT_MULFIX_ASSEMBLER FT_MulFix_arm
- /*************************************************************************/
- /* */
- /* <Function> */
- /* FT_Sqrt32 */
- /* */
- /* <Description> */
- /* Computes the square root of an Int32 integer (which will be */
- /* handled as an unsigned long value). */
- /* */
- /* <Input> */
- /* x :: The value to compute the root for. */
- /* */
- /* <Return> */
- /* The result of `sqrt(x)'. */
- /* */
- FT_EXPORT( FT_Int32 )
- FT_Sqrt32( FT_Int32 x );
+ /* documentation is in freetype.h */
+ static __inline FT_Int32
+ FT_MulFix_arm( FT_Int32 a,
+ FT_Int32 b )
+ {
+ FT_Int32 t, t2;
- /*************************************************************************/
- /* */
- /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */
- /* */
- /*************************************************************************/
+ __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;
+ }
-#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 ) )
+#endif /* __CC_ARM || __ARMCC__ */
-#define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \
- : ( -( ( 32 - (x) ) & -64 ) ) )
+
+#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 )
+ {
+ 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 )
+ {
+ 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 )
+ {
+ 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 );
+
+
+ /**************************************************************************
+ *
+ * @function:
+ * FT_MulAddFix
+ *
+ * @description:
+ * Compute `(s[0] * f[0] + s[1] * f[1] + ...) / 0x10000`, where `s[n]` is
+ * usually a 16.16 scalar.
+ *
+ * @input:
+ * s ::
+ * The array of scalars.
+ * f ::
+ * The array of factors.
+ * count ::
+ * The number of entries in the array.
+ *
+ * @return:
+ * The result of `(s[0] * f[0] + s[1] * f[1] + ...) / 0x10000`.
+ *
+ * @note:
+ * This function is currently used for the scaled delta computation of
+ * variation stores. It internally uses 64-bit data types when
+ * available, otherwise it emulates 64-bit math by using 32-bit
+ * operations, which produce a correct result but most likely at a slower
+ * performance in comparison to the implementation base on `int64_t`.
+ *
+ */
+ FT_BASE( FT_Int32 )
+ FT_MulAddFix( FT_Fixed* s,
+ FT_Int32* f,
+ FT_UInt count );
+
+
+ /*
+ * 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 );
+
+
+ /*
+ * Check a matrix. If the transformation would lead to extreme shear or
+ * extreme scaling, for example, return 0. If everything is OK, return 1.
+ *
+ * Based on geometric considerations we use the following inequality to
+ * identify a degenerate matrix.
+ *
+ * 32 * abs(xx*yy - xy*yx) < xx^2 + xy^2 + yx^2 + yy^2
+ *
+ * Value 32 is heuristic.
+ */
+ FT_BASE( FT_Bool )
+ FT_Matrix_Check( const FT_Matrix* matrix );
+
+
+ /*
+ * 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( __clang__ ) || ( 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
+
+#elif defined( _MSC_VER ) && _MSC_VER >= 1400
+
+#if defined( _WIN32_WCE )
+
+#include <cmnintrin.h>
+#pragma intrinsic( _CountLeadingZeros )
+
+#define FT_MSB( x ) ( 31 - _CountLeadingZeros( x ) )
+
+#elif defined( _M_ARM64 ) || defined( _M_ARM )
+
+#include <intrin.h>
+#pragma intrinsic( _CountLeadingZeros )
+
+#define FT_MSB( x ) ( 31 - _CountLeadingZeros( x ) )
+
+#elif defined( _M_IX86 ) || defined( _M_AMD64 ) || defined( _M_IA64 )
+
+#include <intrin.h>
+#pragma intrinsic( _BitScanReverse )
+
+ static __inline FT_Int32
+ FT_MSB_i386( FT_UInt32 x )
+ {
+ unsigned long where;
+
+
+ _BitScanReverse( &where, x );
+
+ return (FT_Int32)where;
+ }
+
+#define FT_MSB( x ) FT_MSB_i386( x )
+
+#endif
+
+#elif defined( __WATCOMC__ ) && defined( __386__ )
+
+ extern __inline FT_Int32
+ FT_MSB_i386( FT_UInt32 x );
+
+#pragma aux FT_MSB_i386 = \
+ "bsr eax, eax" \
+ __parm [__eax] __nomemory \
+ __value [__eax] \
+ __modify __exact [__eax] __nomemory;
+
+#define FT_MSB( x ) FT_MSB_i386( x )
+
+#elif defined( __SunOS_5_11 )
+
+#include <string.h>
+
+#define FT_MSB( x ) ( fls( x ) - 1 )
+
+#elif defined( __DECC ) || defined( __DECCXX )
+
+#include <builtins.h>
+
+#define FT_MSB( x ) (FT_Int)( 63 - _leadz( x ) )
+
+#elif defined( _CRAYC )
+
+#include <intrinsics.h>
+
+#define FT_MSB( x ) (FT_Int)( 31 - _leadz32( x ) )
+
+#endif /* FT_MSB macro definitions */
+
+#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 );
+
+
+ /**************************************************************************
+ *
+ * @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 slow and should be avoided. Consider `FT_Hypot` or
+ * `FT_Vector_NormLen' instead.
+ */
+ FT_BASE( FT_UInt32 )
+ FT_SqrtFixed( FT_UInt32 x );
+
+
+#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) * 64 ) /* << 6 */
+#define INT_TO_F2DOT14( x ) ( (FT_Long)(x) * 16384 ) /* << 14 */
+#define INT_TO_FIXED( x ) ( (FT_Long)(x) * 65536 ) /* << 16 */
+#define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) * 4 ) /* << 2 */
+#define FIXED_TO_INT( x ) ( FT_RoundFix( x ) >> 16 )
+
+#define ROUND_F26DOT6( x ) ( ( (x) + 32 - ( x < 0 ) ) & -64 )
+
+ /*
+ * The following macros have two purposes.
+ *
+ * - Tag places where overflow is expected and harmless.
+ *
+ * - Avoid run-time sanitizer errors.
+ *
+ * Use with care!
+ */
+#define ADD_INT( a, b ) \
+ (FT_Int)( (FT_UInt)(a) + (FT_UInt)(b) )
+#define SUB_INT( a, b ) \
+ (FT_Int)( (FT_UInt)(a) - (FT_UInt)(b) )
+#define MUL_INT( a, b ) \
+ (FT_Int)( (FT_UInt)(a) * (FT_UInt)(b) )
+#define NEG_INT( a ) \
+ (FT_Int)( (FT_UInt)0 - (FT_UInt)(a) )
+
+#define ADD_LONG( a, b ) \
+ (FT_Long)( (FT_ULong)(a) + (FT_ULong)(b) )
+#define SUB_LONG( a, b ) \
+ (FT_Long)( (FT_ULong)(a) - (FT_ULong)(b) )
+#define MUL_LONG( a, b ) \
+ (FT_Long)( (FT_ULong)(a) * (FT_ULong)(b) )
+#define NEG_LONG( a ) \
+ (FT_Long)( (FT_ULong)0 - (FT_ULong)(a) )
+
+#define ADD_INT32( a, b ) \
+ (FT_Int32)( (FT_UInt32)(a) + (FT_UInt32)(b) )
+#define SUB_INT32( a, b ) \
+ (FT_Int32)( (FT_UInt32)(a) - (FT_UInt32)(b) )
+#define MUL_INT32( a, b ) \
+ (FT_Int32)( (FT_UInt32)(a) * (FT_UInt32)(b) )
+#define NEG_INT32( a ) \
+ (FT_Int32)( (FT_UInt32)0 - (FT_UInt32)(a) )
+
+#ifdef FT_INT64
+
+#define ADD_INT64( a, b ) \
+ (FT_Int64)( (FT_UInt64)(a) + (FT_UInt64)(b) )
+#define SUB_INT64( a, b ) \
+ (FT_Int64)( (FT_UInt64)(a) - (FT_UInt64)(b) )
+#define MUL_INT64( a, b ) \
+ (FT_Int64)( (FT_UInt64)(a) * (FT_UInt64)(b) )
+#define NEG_INT64( a ) \
+ (FT_Int64)( (FT_UInt64)0 - (FT_UInt64)(a) )
+
+#endif /* FT_INT64 */
FT_END_HEADER
-#endif /* __FTCALC_H__ */
+#endif /* FTCALC_H_ */
/* END */
diff --git a/include/freetype/internal/ftcore.h b/include/freetype/internal/ftcore.h
deleted file mode 100644
index 3c3c94ff..00000000
--- a/include/freetype/internal/ftcore.h
+++ /dev/null
@@ -1,185 +0,0 @@
-#ifndef __FT_CORE_H__
-#define __FT_CORE_H__
-
-#include <ft2build.h>
-#include FT_TYPES_H
-#include FT_SYSTEM_MEMORY_H
-
-FT_BEGIN_HEADER
-
- /**************************************************************************/
- /**************************************************************************/
- /***** *****/
- /***** C L E A N U P S T A C K *****/
- /***** *****/
- /**************************************************************************/
- /**************************************************************************/
-
-
- /************************************************************************
- *
- * @functype: FT_CleanupFunc
- *
- * @description:
- * a function used to cleanup a given item on the cleanup stack
- *
- * @input:
- * item :: target item pointer
- * item_data :: optional argument to cleanup routine
- */
- typedef void (*FT_CleanupFunc)( FT_Pointer item,
- FT_Pointer item_data );
-
-
-
- /************************************************************************
- *
- * @type: FT_XHandler
- *
- * @description:
- * handle to an exception-handler structure for the FreeType
- * exception sub-system
- *
- * @note:
- * exception handlers are allocated on the stack within a
- * @FT_XTRY macro. Do not try to access them directly.
- */
- typedef struct FT_XHandlerRec_* FT_XHandler;
-
-
-/* the size of a cleanup chunk in bytes is FT_CLEANUP_CHUNK_SIZE*12 + 4 */
-/* this must be a small power of 2 whenever possible.. */
-/* */
-/* with a value of 5, we have a byte size of 64 bytes per chunk.. */
-/* */
-#define FT_CLEANUP_CHUNK_SIZE 5
-
-
-
- typedef struct FT_CleanupItemRec_
- {
- FT_Pointer item;
- FT_CleanupFunc item_func;
- FT_Pointer item_data;
-
- } FT_CleanupItemRec;
-
-
- typedef struct FT_CleanupChunkRec_* FT_CleanupChunk;
-
- typedef struct FT_CleanupChunkRec_
- {
- FT_CleanupChunk link;
- FT_CleanupItemRec items[ FT_CLEANUP_CHUNK_SIZE ];
-
- } FT_CleanupChunkRec;
-
-
- typedef struct FT_CleanupStackRec_
- {
- FT_CleanupItem top;
- FT_CleanupItem limit;
- FT_CleanupChunk chunk;
- FT_CleanupChunkRec chunk_0; /* avoids stupid dynamic allocation */
- FT_Memory memory;
-
- } FT_CleanupStackRec, *FT_CleanupStack;
-
-
- FT_BASE( void )
- ft_cleanup_stack_push( FT_CleanupStack stack,
- FT_Pointer item,
- FT_CleanupFunc item_func,
- FT_Pointer item_data );
-
- FT_BASE( void )
- ft_cleanup_stack_pop( FT_CleanupStack stack,
- FT_Int destroy );
-
- FT_BASE( FT_CleanupItem )
- ft_cleanup_stack_peek( FT_CleanupStack stack );
-
- FT_BASE( void )
- ft_cleanup_throw( FT_CleanupStack stack,
- FT_Error error );
-
-
-
- /**************************************************************************/
- /**************************************************************************/
- /***** *****/
- /***** M E M O R Y M A N A G E R *****/
- /***** *****/
- /**************************************************************************/
- /**************************************************************************/
-
- typedef struct FT_MemoryRec_
- {
- FT_Memory_AllocFunc mem_alloc; /* shortcut to funcs->mem_alloc */
- FT_Memory_FreeFunc mem_free; /* shortcut to funcs->mem_free */
- FT_Pointer mem_data;
- const FT_Memory_Funcs mem_funcs;
-
- FT_CleanupStackRec cleanup_stack;
- FT_Pointer meta_class;
-
- } FT_MemoryRec;
-
-
-#define FT_MEMORY(x) ((FT_Memory)(x))
-#define FT_MEMORY__ALLOC(x) FT_MEMORY(x)->mem_alloc
-#define FT_MEMORY__FREE(x) FT_MEMORY(x)->mem_free
-#define FT_MEMORY__REALLOC(x) FT_MEMORY(x)->mem_funcs->mem_realloc
-#define FT_MEMORY__CLEANUP(x) (&FT_MEMORY(x)->cleanup_stack)
-#define FT_MEMORY__META_CLASS(x) ((FT_MetaClass)(FT_MEMORY(x)->meta_class))
-
-
- /**************************************************************************/
- /**************************************************************************/
- /***** *****/
- /***** E X C E P T I O N H A N D L I N G *****/
- /***** *****/
- /**************************************************************************/
- /**************************************************************************/
-
-
- /************************************************************************
- *
- * @struct: FT_XHandlerRec
- *
- * @description:
- * exception handler structure
- *
- * @fields:
- * previous :: previous handler in chain.
- * jum_buffer :: processor state used by setjmp/longjmp to implement
- * exception control transfer
- * error :: exception error code
- * mark :: top of cleanup stack when @FT_XTRY is used
- */
- typedef struct FT_XHandlerRec_
- {
- FT_XHandler previous;
- ft_jmp_buf jump_buffer;
- volatile FT_Error error;
- FT_Pointer mark;
-
- } FT_XHandlerRec;
-
- FT_BASE( void )
- ft_xhandler_enter( FT_XHandler xhandler,
- FT_Memory memory );
-
- FT_BASE( void )
- ft_xhandler_exit( FT_XHandler xhandler );
-
-
-
-
-
-
-
-
-FT_END_HEADER
-
-#endif /* __FT_CORE_H__ */
diff --git a/include/freetype/internal/ftdebug.h b/include/freetype/internal/ftdebug.h
index 129c91f6..d7fa8dc9 100644
--- a/include/freetype/internal/ftdebug.h
+++ b/include/freetype/internal/ftdebug.h
@@ -1,36 +1,54 @@
-/***************************************************************************/
-/* */
-/* ftdebug.h */
-/* */
-/* Debugging and logging component (specification). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/* */
-/* 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__
+/****************************************************************************
+ *
+ * ftdebug.h
+ *
+ * Debugging and logging component (specification).
+ *
+ * Copyright (C) 1996-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/freetype.h>
+
+#include "compiler-macros.h"
+
+#ifdef FT_DEBUG_LOGGING
+#define DLG_STATIC
+#include <dlg/output.h>
+#include <dlg/dlg.h>
+
+#include <freetype/ftlogging.h>
+#endif /* FT_DEBUG_LOGGING */
FT_BEGIN_HEADER
+ /* force the definition of FT_DEBUG_LEVEL_TRACE if FT_DEBUG_LOGGING is */
+ /* already defined. */
+ /* */
+#ifdef FT_DEBUG_LOGGING
+#undef FT_DEBUG_LEVEL_TRACE
+#define FT_DEBUG_LEVEL_TRACE
+#endif
/* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */
/* is already defined; this simplifies the following #ifdefs */
@@ -41,68 +59,191 @@ FT_BEGIN_HEADER
#endif
- /*************************************************************************/
- /* */
- /* Define the trace enums as well as the trace levels array when they */
- /* are needed. */
- /* */
- /*************************************************************************/
+ /**************************************************************************
+ *
+ * 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
+ typedef enum FT_Trace_
{
-#include FT_INTERNAL_TRACE_H
+#include <freetype/internal/fttrace.h>
trace_count
} FT_Trace;
- /* defining the array of trace levels, provided by `src/base/ftdebug.c' */
- extern int ft_trace_levels[trace_count];
+ /* a pointer to the array of trace levels, */
+ /* provided by `src/base/ftdebug.c' */
+ extern int* ft_trace_levels;
#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. */
- /* */
- /*************************************************************************/
+ /**************************************************************************
+ *
+ * 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.
+ *
+ * To get consistent logging output, there should be no newline character
+ * (i.e., '\n') or a single trailing one in the message string of
+ * `FT_TRACEx` and `FT_ERROR`.
+ */
+
+
+ /*************************************************************************
+ *
+ * If FT_DEBUG_LOGGING is enabled, tracing messages are sent to dlg's API.
+ * If FT_DEBUG_LOGGING is disabled, tracing messages are sent to
+ * `FT_Message` (defined in ftdebug.c).
+ */
+#ifdef FT_DEBUG_LOGGING
+
+ /* we need two macros to convert the names of `FT_COMPONENT` to a string */
+#define FT_LOGGING_TAG( x ) FT_LOGGING_TAG_( x )
+#define FT_LOGGING_TAG_( x ) #x
+
+ /* we need two macros to convert the component and the trace level */
+ /* to a string that combines them */
+#define FT_LOGGING_TAGX( x, y ) FT_LOGGING_TAGX_( x, y )
+#define FT_LOGGING_TAGX_( x, y ) #x ":" #y
+
+
+#define FT_LOG( level, varformat ) \
+ do \
+ { \
+ const char* dlg_tag = FT_LOGGING_TAGX( FT_COMPONENT, level ); \
+ \
+ \
+ ft_add_tag( dlg_tag ); \
+ if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] >= level ) \
+ { \
+ if ( custom_output_handler != NULL ) \
+ FT_Logging_Callback varformat; \
+ else \
+ dlg_trace varformat; \
+ } \
+ ft_remove_tag( dlg_tag ); \
+ } while( 0 )
+
+#else /* !FT_DEBUG_LOGGING */
+
+#define FT_LOG( level, varformat ) \
+ do \
+ { \
+ if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] >= level ) \
+ FT_Message varformat; \
+ } while ( 0 )
+
+#endif /* !FT_DEBUG_LOGGING */
+
#ifdef FT_DEBUG_LEVEL_TRACE
-#define FT_TRACE( level, varformat ) \
- do \
- { \
- if ( ft_trace_levels[FT_COMPONENT] >= level ) \
- FT_Message varformat; \
- } while ( 0 )
+ /* we need two macros here to make cpp expand `FT_COMPONENT' */
+#define FT_TRACE_COMP( x ) FT_TRACE_COMP_( x )
+#define FT_TRACE_COMP_( x ) trace_ ## x
+
+#define FT_TRACE( level, varformat ) FT_LOG( level, varformat )
#else /* !FT_DEBUG_LEVEL_TRACE */
-#define FT_TRACE( level, varformat ) do ; while ( 0 ) /* nothing */
+#define FT_TRACE( level, varformat ) do { } while ( 0 ) /* nothing */
#endif /* !FT_DEBUG_LEVEL_TRACE */
- /*************************************************************************/
- /* */
- /* You need two opening resp. closing parentheses! */
- /* */
- /* Example: FT_TRACE0(( "Value is %i", foo )) */
- /* */
- /*************************************************************************/
+ /**************************************************************************
+ *
+ * @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 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 is not
+ * built with FT_DEBUG_LEVEL_TRACE definition.
+ *
+ * @note:
+ * Use @FT_Trace_Get_Count to get the number of available trace
+ * components.
+ */
+ FT_BASE( const char* )
+ FT_Trace_Get_Name( FT_Int idx );
+
+
+ /**************************************************************************
+ *
+ * @function:
+ * FT_Trace_Disable
+ *
+ * @description:
+ * Switch off tracing temporarily. It can be activated again with
+ * @FT_Trace_Enable.
+ */
+ FT_BASE( void )
+ FT_Trace_Disable( void );
+
+
+ /**************************************************************************
+ *
+ * @function:
+ * FT_Trace_Enable
+ *
+ * @description:
+ * Activate tracing. Use it after tracing has been switched off with
+ * @FT_Trace_Disable.
+ */
+ FT_BASE( void )
+ FT_Trace_Enable( void );
+
+
+ /**************************************************************************
+ *
+ * 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 )
@@ -114,28 +255,56 @@ FT_BEGIN_HEADER
#define FT_TRACE7( varformat ) FT_TRACE( 7, varformat )
- /*************************************************************************/
- /* */
- /* Define the FT_ERROR macro */
- /* */
- /*************************************************************************/
+ /**************************************************************************
+ *
+ * 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
+ /**************************************************************************
+ *
+ * If FT_DEBUG_LOGGING is enabled, error messages are sent to dlg's API.
+ * If FT_DEBUG_LOGGING is disabled, error messages are sent to `FT_Message`
+ * (defined in ftdebug.c).
+ *
+ */
+#ifdef FT_DEBUG_LOGGING
+
+#define FT_ERROR( varformat ) \
+ do \
+ { \
+ const char* dlg_tag = FT_LOGGING_TAG( FT_COMPONENT ); \
+ \
+ \
+ ft_add_tag( dlg_tag ); \
+ dlg_trace varformat; \
+ ft_remove_tag( dlg_tag ); \
+ } while ( 0 )
+
+#else /* !FT_DEBUG_LOGGING */
+
+#define FT_ERROR( varformat ) FT_Message varformat
+
+#endif /* !FT_DEBUG_LOGGING */
+
#else /* !FT_DEBUG_LEVEL_ERROR */
-#define FT_ERROR( varformat ) do ; while ( 0 ) /* nothing */
+#define FT_ERROR( varformat ) do { } while ( 0 ) /* nothing */
#endif /* !FT_DEBUG_LEVEL_ERROR */
- /*************************************************************************/
- /* */
- /* Define the FT_ASSERT macro */
- /* */
- /*************************************************************************/
+ /**************************************************************************
+ *
+ * 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
@@ -147,30 +316,46 @@ FT_BEGIN_HEADER
__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_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 */
- /* */
- /*************************************************************************/
+ /**************************************************************************
+ *
+ * Define `FT_Message` and `FT_Panic` when needed.
+ *
+ */
#ifdef FT_DEBUG_LEVEL_ERROR
-#include "stdio.h" /* for vprintf() */
+#include "stdio.h" /* for vfprintf() */
/* print a message */
- FT_EXPORT( void )
- FT_Message( const char* fmt, ... );
+ FT_BASE( void )
+ FT_Message( const char* fmt,
+ ... );
/* print a message and exit */
- FT_EXPORT( void )
- FT_Panic( const char* fmt, ... );
+ 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 */
@@ -179,18 +364,79 @@ FT_BEGIN_HEADER
ft_debug_init( void );
-#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */
+#ifdef FT_DEBUG_LOGGING
- /* we disable the warning `conditional expression is constant' here */
- /* in order to compile cleanly with the maximum level of warnings */
-#pragma warning( disable : 4127 )
+ /**************************************************************************
+ *
+ * 'dlg' uses output handlers to control how and where log messages are
+ * printed. Therefore we need to define a default output handler for
+ * FreeType.
+ */
+ FT_BASE( void )
+ ft_log_handler( const struct dlg_origin* origin,
+ const char* string,
+ void* data );
+
+
+ /**************************************************************************
+ *
+ * 1. `ft_default_log_handler` stores the function pointer that is used
+ * internally by FreeType to print logs to a file.
+ *
+ * 2. `custom_output_handler` stores the function pointer to the callback
+ * function provided by the user.
+ *
+ * It is defined in `ftdebug.c`.
+ */
+ extern dlg_handler ft_default_log_handler;
+ extern FT_Custom_Log_Handler custom_output_handler;
+
+
+ /**************************************************************************
+ *
+ * If FT_DEBUG_LOGGING macro is enabled, FreeType needs to initialize and
+ * un-initialize `FILE*`.
+ *
+ * These functions are defined in `ftdebug.c`.
+ */
+ FT_BASE( void )
+ ft_logging_init( void );
+
+ FT_BASE( void )
+ ft_logging_deinit( void );
+
+
+ /**************************************************************************
+ *
+ * For printing the name of `FT_COMPONENT` along with the actual log we
+ * need to add a tag with the name of `FT_COMPONENT`.
+ *
+ * These functions are defined in `ftdebug.c`.
+ */
+ FT_BASE( void )
+ ft_add_tag( const char* tag );
+
+ FT_BASE( void )
+ ft_remove_tag( const char* tag );
+
+
+ /**************************************************************************
+ *
+ * A function to print log data using a custom callback logging function
+ * (which is set using `FT_Set_Log_Handler`).
+ *
+ * This function is defined in `ftdebug.c`.
+ */
+ FT_BASE( void )
+ FT_Logging_Callback( const char* fmt,
+ ... );
-#endif /* _MSC_VER */
+#endif /* FT_DEBUG_LOGGING */
FT_END_HEADER
-#endif /* __FTDEBUG_H__ */
+#endif /* FTDEBUG_H_ */
/* END */
diff --git a/include/freetype/internal/ftdriver.h b/include/freetype/internal/ftdriver.h
deleted file mode 100644
index 9323910b..00000000
--- a/include/freetype/internal/ftdriver.h
+++ /dev/null
@@ -1,202 +0,0 @@
-/***************************************************************************/
-/* */
-/* ftdriver.h */
-/* */
-/* FreeType font driver interface (specification). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
-
-
-#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_ResetPointsFunc)( FT_Size size,
- FT_F26Dot6 char_width,
- FT_F26Dot6 char_height,
- FT_UInt horz_resolution,
- FT_UInt vert_resolution );
-
- typedef FT_Error
- (*FT_Size_ResetPixelsFunc)( FT_Size size,
- FT_UInt pixel_width,
- FT_UInt pixel_height );
-
- 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_Bool vertical,
- FT_UShort* 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. */
- /* */
- /* set_char_sizes :: A handle to a function used to set the new */
- /* character size in points + resolution. Can be */
- /* set to 0 to indicate default behaviour. */
- /* */
- /* set_pixel_sizes :: A handle to a function used to set the new */
- /* character size in pixels. Can be set to 0 to */
- /* indicate default behaviour. */
- /* */
- /* load_glyph :: A function handle to load a given glyph image */
- /* in a slot. This field is mandatory! */
- /* */
- /* get_char_index :: A function handle to return the glyph index of */
- /* a given character for a given charmap. 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 the advances */
- /* of 'count' glyphs, starting at `index'. the */
- /* `vertical' flags must be set when vertical */
- /* advances are queried. The advances buffer is */
- /* caller-allocated. */
- /* */
- /* <Note> */
- /* Most function pointers, with the exception of `load_glyph' and */
- /* `get_char_index' can be set to 0 to indicate a default behaviour. */
- /* */
- typedef struct FT_Driver_ClassRec_
- {
- FT_Module_Class root;
-
- FT_Int face_object_size;
- FT_Int size_object_size;
- FT_Int 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_Size_ResetPointsFunc set_char_sizes;
- FT_Size_ResetPixelsFunc set_pixel_sizes;
-
- FT_Slot_LoadFunc load_glyph;
-
- FT_Face_GetKerningFunc get_kerning;
- FT_Face_AttachFunc attach_file;
- FT_Face_GetAdvancesFunc get_advances;
-
- } FT_Driver_ClassRec, *FT_Driver_Class;
-
-
-FT_END_HEADER
-
-#endif /* __FTDRIVER_H__ */
-
-
-/* END */
diff --git a/include/freetype/internal/ftdrv.h b/include/freetype/internal/ftdrv.h
new file mode 100644
index 00000000..5609b3ef
--- /dev/null
+++ b/include/freetype/internal/ftdrv.h
@@ -0,0 +1,289 @@
+/****************************************************************************
+ *
+ * ftdrv.h
+ *
+ * FreeType internal font driver interface (specification).
+ *
+ * Copyright (C) 1996-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 FTDRV_H_
+#define FTDRV_H_
+
+
+#include <freetype/ftmodapi.h>
+
+#include "compiler-macros.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_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.
+ *
+ * `ftinit.c` (ft_create_default_module_classes) already contains a
+ * mechanism to call these functions for the default modules described in
+ * `ftmodule.h`.
+ *
+ * The struct will be allocated in the global scope (or the scope where
+ * the macro is used).
+ */
+#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_ \
+ };
+
+
+FT_END_HEADER
+
+#endif /* FTDRV_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftexcept.h b/include/freetype/internal/ftexcept.h
deleted file mode 100644
index f5495e56..00000000
--- a/include/freetype/internal/ftexcept.h
+++ /dev/null
@@ -1,82 +0,0 @@
-#ifndef __FT_EXCEPT_H__
-#define __FT_EXCEPT_H__
-
-#include <ft2build.h>
-#include FT_INTERNAL_OBJECTS_H
-
-FT_BEGIN_HEADER
-
-
-
- /* I can't find a better place for this for now */
-
-<<<<<<< ftexcept.h
-=======
-
-/* the size of a cleanup chunk in bytes is FT_CLEANUP_CHUNK_SIZE*12 + 4 */
-/* this must be a small power of 2 whenever possible.. */
-/* */
-/* with a value of 5, we have a byte size of 64 bytes per chunk.. */
-/* */
-#define FT_CLEANUP_CHUNK_SIZE 5
-
-
-
- typedef struct FT_CleanupItemRec_
- {
- FT_Pointer item;
- FT_CleanupFunc item_func;
- FT_Pointer item_data;
-
- } FT_CleanupItemRec;
-
- typedef struct FT_CleanupChunkRec_* FT_CleanupChunk;
-
- typedef struct FT_CleanupChunkRec_
- {
- FT_CleanupChunk link;
- FT_CleanupItemRec items[ FT_CLEANUP_CHUNK_SIZE ];
-
- } FT_CleanupChunkRec;
-
-
- typedef struct FT_CleanupStackRec_
- {
- FT_CleanupItem top;
- FT_CleanupItem limit;
- FT_CleanupChunk chunk;
- FT_CleanupChunkRec chunk_0; /* avoids stupid dynamic allocation */
- FT_Memory memory;
-
- } FT_CleanupStackRec, *FT_CleanupStack;
-
-
- FT_BASE( void )
- ft_cleanup_stack_push( FT_CleanupStack stack,
- FT_Pointer item,
- FT_CleanupFunc item_func,
- FT_Pointer item_data );
-
- FT_BASE( void )
- ft_cleanup_stack_pop( FT_CleanupStack stack,
- FT_Int destroy );
-
- FT_BASE( FT_CleanupItem )
- ft_cleanup_stack_peek( FT_CleanupStack stack );
-
- FT_BASE( void )
- ft_xhandler_enter( FT_XHandler xhandler,
- FT_Memory memory );
-
- FT_BASE( void )
- ft_xhandler_exit( FT_XHandler xhandler );
-
-
- FT_BASE( void )
- ft_cleanup_throw( FT_CleanupStack stack,
- FT_Error error );
-
->>>>>>> 1.2
-FT_END_HEADER
-
-#endif /* __FT_EXCEPT_H__ */
diff --git a/include/freetype/internal/ftgloadr.h b/include/freetype/internal/ftgloadr.h
index d66d10b1..f1c155b1 100644
--- a/include/freetype/internal/ftgloadr.h
+++ b/include/freetype/internal/ftgloadr.h
@@ -1,63 +1,41 @@
-/***************************************************************************/
-/* */
-/* ftgloadr.h */
-/* */
-/* The FreeType glyph loader (specification). */
-/* */
-/* 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. */
-/* */
-/***************************************************************************/
+/****************************************************************************
+ *
+ * ftgloadr.h
+ *
+ * The FreeType glyph loader (specification).
+ *
+ * Copyright (C) 2002-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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__
+#ifndef FTGLOADR_H_
+#define FTGLOADR_H_
-#include <ft2build.h>
-#include FT_FREETYPE_H
+#include <freetype/freetype.h>
+#include "compiler-macros.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 ;
-
-
-#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
-
-
- enum
- {
- FT_GLYPH_OWN_BITMAP = 1
- };
-
-
+ /**************************************************************************
+ *
+ * @struct:
+ * FT_GlyphLoader
+ *
+ * @description:
+ * The glyph loader is an internal object used to load several glyphs
+ * together (for example, in the case of composites).
+ */
typedef struct FT_SubGlyphRec_
{
FT_Int index;
@@ -65,16 +43,17 @@ FT_BEGIN_HEADER
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_UInt num_subglyphs; /* number of subglyphs */
- FT_SubGlyph subglyphs; /* subglyphs */
+ 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;
@@ -92,7 +71,7 @@ FT_BEGIN_HEADER
void* other; /* for possible future extension? */
- } FT_GlyphLoaderRec;
+ } FT_GlyphLoaderRec, *FT_GlyphLoader;
/* create new empty glyph loader */
@@ -116,15 +95,37 @@ FT_BEGIN_HEADER
FT_BASE( void )
FT_GlyphLoader_Rewind( FT_GlyphLoader loader );
- /* check that there is enough room to add 'n_points' and 'n_contours' */
- /* to the glyph 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 );
- /* check that there is enough room to add 'n_subs' sub-glyphs to */
- /* a glyph loader */
+
+#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 );
@@ -137,17 +138,10 @@ FT_BEGIN_HEADER
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__ */
+#endif /* FTGLOADR_H_ */
/* END */
diff --git a/include/freetype/internal/fthash.h b/include/freetype/internal/fthash.h
index b95b6c92..622ec76b 100644
--- a/include/freetype/internal/fthash.h
+++ b/include/freetype/internal/fthash.h
@@ -1,502 +1,135 @@
-/******************************************************************
+/****************************************************************************
*
- * fthash.h - fast dynamic hash tables
+ * fthash.h
*
- * Copyright 2002 by
- * David Turner, Robert Wilhelm, and Werner Lemberg
+ * Hashing functions (specification).
*
- * This file is part of the FreeType project, and may only be used,
- * modified, and distributed under the terms of the FreeType project
- * license, LICENSE.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 is used to define dynamic hash tables as described
- * by the article "Main-Memory Linear Hashing - Some Enhancements
- * of Larson's Algorithm" by Mikael Petterson.
+ */
+
+/*
+ * Copyright 2000 Computing Research Labs, New Mexico State University
+ * Copyright 2001-2015
+ * Francesco Zappa Nardelli
*
- * Basically, linear hashing prevents big "stalls" during
- * resizes of the buckets array by only splitting one bucket
- * at a time. This ensures excellent response time even when
- * the table is frequently resized..
+ * 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.
*
- * Note that the use of the FT_Hash type is rather unusual in order
- * to be as generic and efficient as possible. See the comments in the
- * following definitions for more details.
+ * 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 __FT_HASH_H__
-#define __FT_HASH_H__
+ /**************************************************************************
+ *
+ * This file is based on code from bdf.c,v 1.22 2000/03/16 20:08:50
+ *
+ * taken from Mark Leisher's xmbdfed package
+ *
+ */
+
+
+#ifndef FTHASH_H_
+#define FTHASH_H_
+
+
+#include <freetype/freetype.h>
-#include <ft2build.h>
-#include FT_TYPES_H
FT_BEGIN_HEADER
- /***********************************************************
- *
- * @type: FT_Hash
- *
- * @description:
- * handle to a @FT_HashRec structure used to model a
- * dynamic hash table
- */
- typedef struct FT_HashRec_* FT_Hash;
-
-
- /***********************************************************
- *
- * @type: FT_HashNode
- *
- * @description:
- * handle to a @FT_HashNodeRec structure used to model a
- * single node of a hash table
- */
- typedef struct FT_HashNodeRec_* FT_HashNode;
-
-
- /***********************************************************
- *
- * @type: FT_HashLookup
- *
- * @description:
- * handle to a @FT_HashNode pointer. This is returned by
- * the @ft_hash_lookup function and can later be used by
- * @ft_hash_add or @ft_hash_remove
- */
- typedef FT_HashNode* FT_HashLookup;
-
-
- /***********************************************************
- *
- * @type: FT_Hash_EqualFunc
- *
- * @description:
- * a function used to compare two nodes of the hash table
- *
- * @input:
- * node1 :: handle to first node
- * node2 :: handle to second node
- *
- * @return:
- * 1 iff the 'keys' in 'node1' and 'node2' are identical.
- * 0 otherwise.
- */
- typedef FT_Int (*FT_Hash_EqualFunc)( FT_HashNode node1,
- FT_HashNode node2 );
-
-
- /***********************************************************
- *
- * @struct: FT_HashRec
- *
- * @description:
- * a structure used to model a dynamic hash table.
- *
- * @fields:
- * memory :: memory manager used to allocate
- * the buckets array and the hash nodes
- *
- * buckets :: array of hash buckets
- *
- * node_size :: size of node in bytes
- * node_compare :: a function used to compare two nodes
- * node_hash :: a function used to compute the hash
- * value of a given node
- * p ::
- * mask ::
- * slack ::
- *
- * @note:
- * 'p', 'mask' and 'slack' are control values managed by
- * the hash table. Do not try to interpret them directly.
- *
- * You can grab the hash table size by calling
- * '@ft_hash_get_size'.
- */
- typedef struct FT_HashRec_
+
+ typedef union FT_Hashkey_
{
- FT_HashNode* buckets;
- FT_UInt p;
- FT_UInt mask; /* really maxp-1 */
- FT_Long slack;
- FT_Hash_EqualFunc node_equal;
- FT_Memory memory;
+ FT_Int num;
+ const char* str;
- } FT_HashRec;
+ } FT_Hashkey;
+
+
+ typedef struct FT_HashnodeRec_
+ {
+ FT_Hashkey key;
+ size_t data;
+
+ } FT_HashnodeRec;
+
+ typedef struct FT_HashnodeRec_ *FT_Hashnode;
+
+
+ typedef FT_ULong
+ (*FT_Hash_LookupFunc)( FT_Hashkey* key );
+
+ typedef FT_Bool
+ (*FT_Hash_CompareFunc)( FT_Hashkey* a,
+ FT_Hashkey* b );
- /***********************************************************
- *
- * @struct: FT_HashNodeRec
- *
- * @description:
- * a structure used to model the root fields of a dynamic
- * hash table node.
- *
- * it's up to client applications to "sub-class" this
- * structure to add relevant (key,value) definitions
- *
- * @fields:
- * link :: pointer to next node in bucket's collision list
- * hash :: 32-bit hash value for this node
- *
- * @note:
- * it's up to client applications to "sub-class" this structure
- * to add relevant (key,value) type definitions. For example,
- * if we want to build a "string -> int" mapping, we could use
- * something like:
- *
- * {
- * typedef struct MyNodeRec_
- * {
- * FT_HashNodeRec hnode;
- * const char* key;
- * int value;
- *
- * } MyNodeRec, *MyNode;
- * }
- *
- */
- typedef struct FT_HashNodeRec_
+ typedef struct FT_HashRec_
{
- FT_HashNode link;
- FT_UInt32 hash;
-
- } FT_HashNodeRec;
-
-
- /****************************************************************
- *
- * @function: ft_hash_init
- *
- * @description:
- * initialize a dynamic hash table
- *
- * @input:
- * table :: handle to target hash table structure
- * node_equal :: node comparison function
- * memory :: memory manager handle used to allocate the
- * buckets array within the hash table
- *
- * @return:
- * error code. 0 means success
- *
- * @note:
- * the node comparison function should only compare node _keys_
- * and ignore values !! with good hashing computation (which the
- * user must perform itself), the comparison function should be
- * pretty seldom called.
- *
- * here is a simple example:
- *
- * {
- * static int my_equal( MyNode node1,
- * MyNode node2 )
- * {
- * // compare keys of 'node1' and 'node2'
- * return (strcmp( node1->key, node2->key ) == 0);
- * }
- *
- * ....
- *
- * ft_hash_init( &hash, (FT_Hash_EqualFunc) my_compare, memory );
- * ....
- * }
- */
- FT_BASE( FT_Error )
- ft_hash_init( FT_Hash table,
- FT_Hash_EqualFunc compare,
- FT_Memory memory );
-
-
- /****************************************************************
- *
- * @function: ft_hash_lookup
- *
- * @description:
- * search a hash table to find a node corresponding to a given
- * key.
- *
- * @input:
- * table :: handle to target hash table structure
- * keynode :: handle to a reference hash node that will be
- * only used for key comparisons with the table's
- * elements
- *
- * @return:
- * a pointer-to-hash-node value, which must be used as followed:
- *
- * - if '*result' is NULL, the key wasn't found in the hash
- * table. The value of 'result' can be used to add new elements
- * through @ft_hash_add however..
- *
- * - if '*result' is not NULL, it's a handle to the first table
- * node that corresponds to the search key. The value of 'result'
- * can be used to remove this element through @ft_hash_remove
- *
- * @note:
- * here is an example:
- *
- * {
- * // maps a string to an integer with a hash table
- * // returns -1 in case of failure
- * //
- * int my_lookup( FT_Hash table,
- * const char* key )
- * {
- * MyNode* pnode;
- * MyNodeRec noderec;
- *
- * // set-up key node. It's 'hash' and 'key' fields must
- * // be set correctly.. we ignore 'link' and 'value'
- * //
- * noderec.hnode.hash = strhash( key );
- * noderec.key = key;
- *
- * // perform search - return value
- * //
- * pnode = (MyNode) ft_hash_lookup( table, &noderec );
- * if ( *pnode )
- * {
- * // we found it
- * return (*pnode)->value;
- * }
- * return -1;
- * }
- * }
- */
- FT_BASE_DEF( FT_HashLookup )
- ft_hash_lookup( FT_Hash table,
- FT_HashNode keynode );
-
-
- /****************************************************************
- *
- * @function: ft_hash_add
- *
- * @description:
- * add a new node to a dynamic hash table. the user must
- * call @ft_hash_lookup and allocate a new node before calling
- * this function.
- *
- * @input:
- * table :: hash table handle
- * lookup :: pointer-to-hash-node value returned by @ft_hash_lookup
- * new_node :: handle to new hash node. All its fields must be correctly
- * set, including 'hash'.
- *
- * @return:
- * error code. 0 means success
- *
- * @note:
- * this function should always be used _after_ a call to @ft_hash_lookup
- * that returns a pointer to a NULL handle. Here's an example:
- *
- * {
- * // sets the value corresponding to a given string key
- * //
- * void my_set( FT_Hash table,
- * const char* key,
- * int value )
- * {
- * MyNode* pnode;
- * MyNodeRec noderec;
- * MyNode node;
- *
- * // set-up key node. It's 'hash' and 'key' fields must
- * // be set correctly..
- * noderec.hnode.hash = strhash( key );
- * noderec.key = key;
- *
- * // perform search - return value
- * pnode = (MyNode) ft_hash_lookup( table, &noderec );
- * if ( *pnode )
- * {
- * // we found it, simply replace the value in the node
- * (*pnode)->value = value;
- * return;
- * }
- *
- * // allocate a new node - and set it up
- * node = (MyNode) malloc( sizeof(*node) );
- * if ( node == NULL ) .....
- *
- * node->hnode.hash = noderec.hnode.hash;
- * node->key = key;
- * node->value = value;
- *
- * // add it to the hash table
- * error = ft_hash_add( table, pnode, node );
- * if (error) ....
- * }
- */
- FT_BASE( FT_Error )
- ft_hash_add( FT_Hash table,
- FT_HashLookup lookup,
- FT_HashNode new_node );
-
-
- /****************************************************************
- *
- * @function: ft_hash_remove
- *
- * @description:
- * try to remove the node corresponding to a given key from
- * a hash table. This must be called after @ft_hash_lookup
- *
- * @input:
- * table :: hash table handle
- * lookup :: pointer-to-hash-node value returned by @ft_hash_lookup
- *
- * @note:
- * this function doesn't free the node itself !! Here's an example:
- *
- * {
- * // sets the value corresponding to a given string key
- * //
- * void my_remove( FT_Hash table,
- * const char* key )
- * {
- * MyNodeRec noderec;
- * MyNode node;
- *
- * noderec.hnode.hash = strhash(key);
- * noderec.key = key;
- * node = &noderec;
- *
- * pnode = ft_hash_lookup( table, &noderec );
- * node = *pnode;
- * if ( node != NULL )
- * {
- * error = ft_hash_remove( table, pnode );
- * if ( !error )
- * free( node );
- * }
- * }
- * }
- */
- FT_BASE( FT_Error )
- ft_hash_remove( FT_Hash table,
- FT_HashLookup lookup );
-
-
-
- /****************************************************************
- *
- * @function: ft_hash_get_size
- *
- * @description:
- * return the number of elements in a given hash table
- *
- * @input:
- * table :: handle to target hash table structure
- *
- * @return:
- * number of elements. 0 if empty
- */
- FT_BASE( FT_UInt )
- ft_hash_get_size( FT_Hash table );
-
-
-
- /****************************************************************
- *
- * @functype: FT_Hash_ForeachFunc
- *
- * @description:
- * a function used to iterate over all elements of a given
- * hash table
- *
- * @input:
- * node :: handle to target @FT_HashNodeRec node structure
- * data :: optional argument to iteration routine
- *
- * @also: @ft_hash_foreach
- */
- typedef void (*FT_Hash_ForeachFunc)( const FT_HashNode node,
- const FT_Pointer data );
-
-
- /****************************************************************
- *
- * @function: ft_hash_foreach
- *
- * @description:
- * parse over all elements in a hash table
- *
- * @input:
- * table :: handle to target hash table structure
- * foreach_func :: iteration routine called for each element
- * foreach_data :: optional argument to the iteration routine
- *
- * @note:
- * this function is often used to release all elements from a
- * hash table. See the example given for @ft_hash_done
- */
- FT_BASE( void )
- ft_hash_foreach( FT_Hash table,
- FT_Hash_ForeachFunc foreach_func,
- const FT_Pointer foreach_data );
-
-
-
- /****************************************************************
- *
- * @function: ft_hash_done
- *
- * @description:
- * finalize a given hash table
- *
- * @input:
- * table :: handle to target hash table structure
- * node_func :: optional iteration function pointer. this
- * can be used to destroy all nodes explicitely
- * node_data :: optional argument to the node iterator
- *
- * @note:
- * this function simply frees the hash table's buckets.
- * you probably will need to call @ft_hash_foreach to
- * destroy all its elements before @ft_hash_done, as in
- * the following example:
- *
- * {
- * static void my_node_clear( const MyNode node )
- * {
- * free( node );
- * }
- *
- * static void my_done( FT_Hash table )
- * {
- * ft_hash_done( table, (FT_Hash_ForeachFunc) my_node_clear, NULL );
- * }
- * }
- */
- FT_BASE( void )
- ft_hash_done( FT_Hash table,
- FT_Hash_ForeachFunc item_func,
- const FT_Pointer item_data );
-
- /* */
-
- /* compute bucket index from hash value in a dynamic hash table */
- /* this is only used to break encapsulation to speed lookups in */
- /* the FreeType cache manager !! */
- /* */
-
-#define FT_HASH_COMPUTE_INDEX(_table,_hash,_index) \
- { \
- FT_UInt _mask = (_table)->mask; \
- FT_UInt _hash0 = (_hash); \
- \
- (_index) = (FT_UInt)( (_hash0) & _mask ) ); \
- if ( (_index) < (_table)->p ) \
- (_index) = (FT_uInt)( (_hash0) & ( 2*_mask+1 ) ); \
- }
+ FT_UInt limit;
+ FT_UInt size;
+ FT_UInt used;
+
+ FT_Hash_LookupFunc lookup;
+ FT_Hash_CompareFunc compare;
+
+ FT_Hashnode* table;
+
+ } FT_HashRec;
+
+ typedef struct FT_HashRec_ *FT_Hash;
+
+
+ FT_Error
+ ft_hash_str_init( FT_Hash hash,
+ FT_Memory memory );
+
+ FT_Error
+ ft_hash_num_init( FT_Hash hash,
+ FT_Memory memory );
+
+ void
+ ft_hash_str_free( FT_Hash hash,
+ FT_Memory memory );
+
+#define ft_hash_num_free ft_hash_str_free
+
+ FT_Error
+ ft_hash_str_insert( const char* key,
+ size_t data,
+ FT_Hash hash,
+ FT_Memory memory );
+
+ FT_Error
+ ft_hash_num_insert( FT_Int num,
+ size_t data,
+ FT_Hash hash,
+ FT_Memory memory );
+
+ size_t*
+ ft_hash_str_lookup( const char* key,
+ FT_Hash hash );
+
+ size_t*
+ ft_hash_num_lookup( FT_Int num,
+ FT_Hash hash );
FT_END_HEADER
-#endif /* __FT_HASH_H__ */
+
+#endif /* FTHASH_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftmemory.h b/include/freetype/internal/ftmemory.h
index cbe66d7f..202cd0a7 100644
--- a/include/freetype/internal/ftmemory.h
+++ b/include/freetype/internal/ftmemory.h
@@ -1,48 +1,50 @@
-/***************************************************************************/
-/* */
-/* ftmemory.h */
-/* */
-/* The FreeType memory management macros (specification). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
-
-
-#ifndef __FTMEMORY_H__
-#define __FTMEMORY_H__
+/****************************************************************************
+ *
+ * ftmemory.h
+ *
+ * The FreeType memory management macros (specification).
+ *
+ * Copyright (C) 1996-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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
+#include <freetype/fttypes.h>
+#include "compiler-macros.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. */
- /* */
+ /**************************************************************************
+ *
+ * @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 )
+
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
@@ -55,128 +57,188 @@ FT_BEGIN_HEADER
/*************************************************************************/
/*************************************************************************/
-#ifdef FT_DEBUG_MEMORY
- FT_BASE( FT_Error )
- FT_Alloc_Debug( FT_Memory memory,
- FT_Long size,
- void* *P,
- const char* file_name,
- FT_Long line_no );
-
- FT_BASE( FT_Error )
- FT_Realloc_Debug( FT_Memory memory,
- FT_Long current,
- FT_Long size,
- void* *P,
- const char* file_name,
- FT_Long line_no );
+ /* The calculation `NULL + n' is undefined in C. Even if the resulting */
+ /* pointer doesn't get dereferenced, this causes warnings with */
+ /* sanitizers. */
+ /* */
+ /* We thus provide a macro that should be used if `base' can be NULL. */
+#define FT_OFFSET( base, count ) ( (base) ? (base) + (count) : NULL )
- FT_BASE( void )
- FT_Free_Debug( FT_Memory memory,
- FT_Pointer block,
- const char* file_name,
- FT_Long line_no );
+
+ /*
+ * 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
- /*************************************************************************/
- /* */
- /* <Function> */
- /* FT_Alloc */
- /* */
- /* <Description> */
- /* Allocates a new block of memory. The returned area is always */
- /* zero-filled; this is a strong convention in many FreeType parts. */
- /* */
- /* <Input> */
- /* memory :: A handle to a given `memory object' which handles */
- /* allocation. */
- /* */
- /* size :: The size in bytes of the block to allocate. */
- /* */
- /* <Output> */
- /* P :: A pointer to the fresh new block. It should be set to */
- /* NULL if `size' is 0, or in case of error. */
- /* */
- /* <Return> */
- /* FreeType error code. 0 means success. */
- /* */
- FT_BASE( FT_Error )
- FT_Alloc( FT_Memory memory,
- FT_Long size,
- void* *P );
+#ifdef FT_DEBUG_MEMORY
- /*************************************************************************/
- /* */
- /* <Function> */
- /* FT_Realloc */
- /* */
- /* <Description> */
- /* Reallocates a block of memory pointed to by `*P' to `Size' bytes */
- /* from the heap, possibly changing `*P'. */
- /* */
- /* <Input> */
- /* memory :: A handle to a given `memory object' which handles */
- /* reallocation. */
- /* */
- /* current :: The current block size in bytes. */
- /* */
- /* size :: The new block size in bytes. */
- /* */
- /* <InOut> */
- /* P :: A pointer to the fresh new block. It should be set to */
- /* NULL if `size' is 0, or in case of error. */
- /* */
- /* <Return> */
- /* FreeType error code. 0 means success. */
- /* */
- /* <Note> */
- /* All callers of FT_Realloc() _must_ provide the current block size */
- /* as well as the new one. */
- /* */
- FT_BASE( FT_Error )
- FT_Realloc( FT_Memory memory,
- FT_Long current,
- FT_Long size,
- void** P );
+ 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) )
- /*************************************************************************/
- /* */
- /* <Function> */
- /* FT_Free */
- /* */
- /* <Description> */
- /* Releases a given block of memory allocated through FT_Alloc(). */
- /* */
- /* <Input> */
- /* memory :: A handle to a given `memory object' which handles */
- /* memory deallocation */
- /* */
- /* P :: This is the _address_ of a _pointer_ which points to the */
- /* allocated block. It is always set to NULL on exit. */
- /* */
- /* <Return> */
- /* FreeType error code. 0 means success. */
- /* */
- /* <Note> */
- /* If P or *P are NULL, this function should return successfully. */
- /* This is a strong convention within all of FreeType and its */
- /* drivers. */
- /* */
- FT_BASE( void )
- FT_Free( FT_Memory memory,
- void** P );
+#define FT_ASSIGNP_INNER( p, exp ) ( ft_debug_file_ = __FILE__, \
+ ft_debug_lineno_ = __LINE__, \
+ FT_ASSIGNP( p, exp ) )
+#else /* !FT_DEBUG_MEMORY */
-#define FT_MEM_SET( dest, byte, count ) ft_memset( dest, byte, count )
+#define FT_DEBUG_INNER( exp ) (exp)
+#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp )
+
+#endif /* !FT_DEBUG_MEMORY */
-#define FT_MEM_COPY( dest, source, count ) ft_memcpy( dest, source, count )
-#define FT_MEM_MOVE( dest, source, count ) ft_memmove( dest, source, count )
+ /*
+ * The allocation functions return a pointer, and the error code is written
+ * to through the `p_error' parameter.
+ */
+
+ /* The `q' variants of the functions below (`q' for `quick') don't fill */
+ /* the allocated or reallocated memory with zero bytes. */
+
+ 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 );
+
+
+ /* The `Q' variants of the macros below (`Q' for `quick') don't fill */
+ /* the allocated or reallocated memory with zero bytes. */
+
+#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_DEBUG_INNER( 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 )
@@ -184,113 +246,153 @@ FT_BEGIN_HEADER
#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) )
- /*************************************************************************/
- /* */
- /* We first define FT_MEM_ALLOC, FT_MEM_REALLOC, and FT_MEM_FREE. All */
- /* macros use an _implicit_ `memory' parameter to access the current */
- /* memory allocator. */
- /* */
+#define FT_ARRAY_ZERO( dest, count ) \
+ FT_MEM_ZERO( dest, \
+ (FT_Offset)(count) * sizeof ( *(dest) ) )
-#ifdef FT_DEBUG_MEMORY
+#define FT_ARRAY_COPY( dest, source, count ) \
+ FT_MEM_COPY( dest, \
+ source, \
+ (FT_Offset)(count) * sizeof ( *(dest) ) )
-#define FT_MEM_ALLOC( _pointer_, _size_ ) \
- FT_Alloc_Debug( memory, _size_, \
- (void**)&(_pointer_), __FILE__, __LINE__ )
+#define FT_ARRAY_MOVE( dest, source, count ) \
+ FT_MEM_MOVE( dest, \
+ source, \
+ (FT_Offset)(count) * sizeof ( *(dest) ) )
-#define FT_MEM_REALLOC( _pointer_, _current_, _size_ ) \
- FT_Realloc_Debug( memory, _current_, _size_, \
- (void**)&(_pointer_), __FILE__, __LINE__ )
-#define FT_MEM_FREE( _pointer_ ) \
- FT_Free_Debug( memory, (void**)&(_pointer_), __FILE__, __LINE__ )
+ /*
+ * 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 ) )
-#else /* !FT_DEBUG_MEMORY */
+ /**************************************************************************
+ *
+ * The following functions macros expect that their pointer argument is
+ * _typed_ in order to automatically compute array element sizes.
+ */
-#define FT_MEM_ALLOC( _pointer_, _size_ ) \
- FT_Alloc( memory, _size_, (void**)&(_pointer_) )
+#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_FREE( _pointer_ ) \
- FT_Free( memory, (void**)&(_pointer_) )
+#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_REALLOC( _pointer_, _current_, _size_ ) \
- FT_Realloc( memory, _current_, _size_, (void**)&(_pointer_) )
+#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 ) )
-#endif /* !FT_DEBUG_MEMORY */
+#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 ) )
- /*************************************************************************/
- /* */
- /* The following functions macros expect that their pointer argument is */
- /* _typed_ in order to automatically compute array element sizes. */
- /* */
+#define FT_ALLOC_MULT( ptr, count, item_size ) \
+ FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) )
-#define FT_MEM_NEW( _pointer_ ) \
- FT_MEM_ALLOC( _pointer_, sizeof ( *(_pointer_) ) )
+#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \
+ newcnt, itmsz ) )
-#define FT_MEM_NEW_ARRAY( _pointer_, _count_ ) \
- FT_MEM_ALLOC( _pointer_, (_count_) * sizeof ( *(_pointer_) ) )
+#define FT_QALLOC( ptr, size ) \
+ FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) )
-#define FT_MEM_RENEW_ARRAY( _pointer_, _old_, _new_ ) \
- FT_MEM_REALLOC( _pointer_, (_old_) * sizeof ( *(_pointer_) ), \
- (_new_) * sizeof ( *(_pointer_) ) )
+#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 ) )
- /*************************************************************************/
- /* */
- /* the following macros are obsolete but kept for compatibility reasons */
- /* */
+#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \
+ newcnt, itmsz ) )
-#define FT_MEM_ALLOC_ARRAY( _pointer_, _count_, _type_ ) \
- FT_MEM_ALLOC( _pointer_, (_count_) * sizeof ( _type_ ) )
+#define FT_FREE( ptr ) FT_MEM_FREE( ptr )
-#define FT_MEM_REALLOC_ARRAY( _pointer_, _old_, _new_, _type_ ) \
- FT_MEM_REALLOC( _pointer_, (_old_) * sizeof ( _type ), \
- (_new_) * sizeof ( _type_ ) )
+#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 ) )
- /*************************************************************************/
- /* */
- /* The following macros are variants of their FT_MEM_XXXX equivalents; */
- /* they are used to set an _implicit_ `error' variable and return TRUE */
- /* if an error occured (i.e. if 'error != 0'). */
- /* */
+#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_QNEW_ARRAY( ptr, count ) )
+
+#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \
+ FT_MEM_SET_ERROR( FT_MEM_QRENEW_ARRAY( ptr, curcnt, newcnt ) )
+
+
+ FT_BASE( FT_Pointer )
+ ft_mem_strdup( FT_Memory memory,
+ const char* str,
+ FT_Error *p_error );
-#define FT_ALLOC( _pointer_, _size_ ) \
- FT_SET_ERROR( FT_MEM_ALLOC( _pointer_, _size_ ) )
+ FT_BASE( FT_Pointer )
+ ft_mem_dup( FT_Memory memory,
+ const void* address,
+ FT_ULong size,
+ FT_Error *p_error );
-#define FT_REALLOC( _pointer_, _current_, _size_ ) \
- FT_SET_ERROR( FT_MEM_REALLOC( _pointer_, _current_, _size_ ) )
-#define FT_FREE( _pointer_ ) \
- FT_MEM_FREE( _pointer_ )
+#define FT_MEM_STRDUP( dst, str ) \
+ (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error )
-#define FT_NEW( _pointer_ ) \
- FT_SET_ERROR( FT_MEM_NEW( _pointer_ ) )
+#define FT_STRDUP( dst, str ) \
+ FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) )
-#define FT_NEW_ARRAY( _pointer_, _count_ ) \
- FT_SET_ERROR( FT_MEM_NEW_ARRAY( _pointer_, _count_ ) )
+#define FT_MEM_DUP( dst, address, size ) \
+ (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error )
-#define FT_RENEW_ARRAY( _pointer_, _old_, _new_ ) \
- FT_SET_ERROR( FT_MEM_RENEW_ARRAY( _pointer_, _old_, _new_ ) )
+#define FT_DUP( dst, address, size ) \
+ FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) )
-#define FT_ALLOC_ARRAY( _pointer_, _count_, _type_ ) \
- FT_SET_ERROR( FT_MEM_ALLOC( _pointer_, \
- (_count_) * sizeof ( _type_ ) ) )
-#define FT_REALLOC_ARRAY( _pointer_, _old_, _new_, _type_ ) \
- FT_SET_ERROR( FT_MEM_REALLOC( _pointer_, \
- (_old_) * sizeof ( _type_ ), \
- (_new_) * sizeof ( _type_ ) ) )
+ /* 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__ */
+#endif /* FTMEMORY_H_ */
/* END */
diff --git a/include/freetype/internal/ftmmtypes.h b/include/freetype/internal/ftmmtypes.h
new file mode 100644
index 00000000..8449e7a0
--- /dev/null
+++ b/include/freetype/internal/ftmmtypes.h
@@ -0,0 +1,91 @@
+/****************************************************************************
+ *
+ * ftmmtypes.h
+ *
+ * OpenType Variations type definitions for internal use
+ * with the multi-masters service (specification).
+ *
+ * Copyright (C) 2022-2024 by
+ * David Turner, Robert Wilhelm, Werner Lemberg, George Williams, and
+ * Dominik Röttsches.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 FTMMTYPES_H_
+#define FTMMTYPES_H_
+
+FT_BEGIN_HEADER
+
+
+ typedef FT_Int32 FT_ItemVarDelta;
+
+ typedef struct GX_ItemVarDataRec_
+ {
+ FT_UInt itemCount; /* Number of delta sets per item. */
+ FT_UInt regionIdxCount; /* Number of region indices. */
+ FT_UInt* regionIndices; /* Array of `regionCount` indices; */
+ /* these index `varRegionList`. */
+ FT_Byte* deltaSet; /* Array of `itemCount` deltas; */
+ /* use `innerIndex` for this array. */
+ FT_UShort wordDeltaCount; /* Number of the first 32-bit ints */
+ /* or 16-bit ints of `deltaSet` */
+ /* depending on `longWords`. */
+ FT_Bool longWords; /* If true, `deltaSet` is a 32-bit */
+ /* array followed by a 16-bit */
+ /* array, otherwise a 16-bit array */
+ /* followed by an 8-bit array. */
+ } GX_ItemVarDataRec, *GX_ItemVarData;
+
+
+ /* contribution of one axis to a region */
+ typedef struct GX_AxisCoordsRec_
+ {
+ FT_Fixed startCoord;
+ FT_Fixed peakCoord; /* zero means no effect (factor = 1) */
+ FT_Fixed endCoord;
+
+ } GX_AxisCoordsRec, *GX_AxisCoords;
+
+
+ typedef struct GX_VarRegionRec_
+ {
+ GX_AxisCoords axisList; /* array of axisCount records */
+
+ } GX_VarRegionRec, *GX_VarRegion;
+
+
+ /* item variation store */
+ typedef struct GX_ItemVarStoreRec_
+ {
+ FT_UInt dataCount;
+ GX_ItemVarData varData; /* array of dataCount records; */
+ /* use `outerIndex' for this array */
+ FT_UShort axisCount;
+ FT_UInt regionCount; /* total number of regions defined */
+ GX_VarRegion varRegionList;
+
+ } GX_ItemVarStoreRec, *GX_ItemVarStore;
+
+
+ typedef struct GX_DeltaSetIdxMapRec_
+ {
+ FT_ULong mapCount;
+ FT_UInt* outerIndex; /* indices to item var data */
+ FT_UInt* innerIndex; /* indices to delta set */
+
+ } GX_DeltaSetIdxMapRec, *GX_DeltaSetIdxMap;
+
+
+FT_END_HEADER
+
+#endif /* FTMMTYPES_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftobject.h b/include/freetype/internal/ftobject.h
deleted file mode 100644
index f285d9e2..00000000
--- a/include/freetype/internal/ftobject.h
+++ /dev/null
@@ -1,533 +0,0 @@
-#ifndef __FT_OBJECT_H__
-#define __FT_OBJECT_H__
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-FT_BEGIN_HEADER
-
- /**************************************************************
- *
- * @type: FT_Object
- *
- * @description:
- * handle to a FreeType Object. See @FT_ObjectRec
- */
- typedef struct FT_ObjectRec_* FT_Object;
-
-
- /**************************************************************
- *
- * @type: FT_Class
- *
- * @description:
- * handle to a constant class handle to a FreeType Object.
- *
- * Note that a class is itself a @FT_Object and are dynamically
- * allocated on the heap.
- *
- * @also:
- * @FT_ClassRec, @FT_Object, @FT_ObjectRec, @FT_Type, @FT_TypeRec
- */
- typedef const struct FT_ClassRec_* FT_Class;
-
-
- /**************************************************************
- *
- * @type: FT_Type
- *
- * @description:
- * handle to a constant structure (of type @FT_TypeRec) used
- * to describe a given @FT_Class type to the FreeType object
- * sub-system.
- */
- typedef const struct FT_TypeRec_* FT_Type;
-
-
-
- /**************************************************************
- *
- * @struct: FT_ObjectRec
- *
- * @description:
- * a structure describing the root fields of all @FT_Object
- * class instances in FreeType
- *
- * @fields:
- * clazz :: handle to the object's class
- * ref_count :: object's reference count. Starts at 1
- */
- typedef struct FT_ObjectRec_
- {
- FT_Class clazz;
- FT_Int ref_count;
-
- } FT_ObjectRec;
-
-
- /**************************************************************
- *
- * @macro: FT_OBJECT (x)
- *
- * @description:
- * a useful macro to type-cast anything to a @FT_Object
- * handle. No check performed..
- */
-#define FT_OBJECT(x) ((FT_Object)(x))
-
-
- /**************************************************************
- *
- * @macro: FT_OBJECT_P (x)
- *
- * @description:
- * a useful macro to type-cast anything to a pointer to
- * @FT_Object handle.
- */
-#define FT_OBJECT_P(x) ((FT_Object*)(x))
-
-
- /**************************************************************
- *
- * @macro: FT_OBJECT__CLASS (obj)
- *
- * @description:
- * a useful macro to return the class of any object
- */
-#define FT_OBJECT__CLASS(x) FT_OBJECT(x)->clazz
-
-
- /**************************************************************
- *
- * @macro: FT_OBJECT__REF_COUNT (obj)
- *
- * @description:
- * a useful macro to return the reference count of any object
- */
-#define FT_OBJECT__REF_COUNT(x) FT_OBJECT(x)->ref_count
-
-
- /**************************************************************
- *
- * @macro: FT_OBJECT__MEMORY (obj)
- *
- * @description:
- * a useful macro to return a handle to the memory manager
- * used to allocate a given object
- */
-#define FT_OBJECT__MEMORY(x) FT_CLASS__MEMORY(FT_OBJECT(x)->clazz)
-
-
- /**************************************************************
- *
- * @macro: FT_OBJECT__LIBRARY (obj)
- *
- * @description:
- * a useful macro to return a handle to the library handle
- * that owns the object
- */
-#define FT_OBJECT__LIBRARY(x) FT_CLASS__LIBRARY(FT_OBJECT(x)->clazz)
-
-
- /**************************************************************
- *
- * @functype: FT_Object_InitFunc
- *
- * @description:
- * a function used to initialize a new object
- *
- * @input:
- * object :: target object handle
- * init_data :: optional pointer to initialization data
- *
- * @return:
- * error code. 0 means success
- */
- typedef FT_Error (*FT_Object_InitFunc)( FT_Object object,
- FT_Pointer init_data );
-
- /**************************************************************
- *
- * @functype: FT_Object_DoneFunc
- *
- * @description:
- * a function used to finalize a given object
- *
- * @input:
- * object :: handle to target object
- */
- typedef void (*FT_Object_DoneFunc)( FT_Object object );
-
-
- /**************************************************************
- *
- * @struct: FT_ClassRec
- *
- * @description:
- * a structure used to describe a given object class within
- * FreeType
- *
- * @fields:
- * object :: root @FT_ObjectRec fields, since each class is
- * itself an object. (it's an instance of the
- * "metaclass", a special object of the FreeType
- * object sub-system.)
- *
- * magic :: a 32-bit magic number used for decoding
- * super :: pointer to super class
- * type :: the @FT_Type descriptor of this class
- * memory :: the current memory manager handle
- * library :: the current library handle
- * info :: an opaque pointer to class-specific information
- * managed by the FreeType object sub-system
- *
- * class_done :: the class destructor function
- *
- * obj_size :: size of class instances in bytes
- * obj_init :: class instance constructor
- * obj_done :: class instance destructor
- */
- typedef struct FT_ClassRec_
- {
- FT_ObjectRec object;
- FT_UInt32 magic;
- FT_Class super;
- FT_Type type;
- FT_Memory memory;
- FT_Library library;
- FT_Pointer info;
-
- FT_Object_DoneFunc class_done;
-
- FT_UInt obj_size;
- FT_Object_InitFunc obj_init;
- FT_Object_DoneFunc obj_done;
-
- } FT_ClassRec;
-
-
- /**************************************************************
- *
- * @macro: FT_CLASS (x)
- *
- * @description:
- * a useful macro to convert anything to a class handle
- * without checks
- */
-#define FT_CLASS(x) ((FT_Class)(x))
-
-
- /**************************************************************
- *
- * @macro: FT_CLASS_P (x)
- *
- * @description:
- * a useful macro to convert anything to a pointer to a class
- * handle without checks
- */
-#define FT_CLASS_P(x) ((FT_Class*)(x))
-
-
- /**************************************************************
- *
- * @macro: FT_CLASS__MEMORY (clazz)
- *
- * @description:
- * a useful macro to return the memory manager handle of a
- * given class
- */
-#define FT_CLASS__MEMORY(x) FT_CLASS(x)->memory
-
-
- /**************************************************************
- *
- * @macro: FT_CLASS__LIBRARY (clazz)
- *
- * @description:
- * a useful macro to return the library handle of a
- * given class
- */
-#define FT_CLASS__LIBRARY(x) FT_CLASS(x)->library
-
-
-
- /**************************************************************
- *
- * @macro: FT_CLASS__TYPE (clazz)
- *
- * @description:
- * a useful macro to return the type of a given class
- * given class
- */
-#define FT_CLASS__TYPE(x) FT_CLASS(x)->type
-
- /* */
-#define FT_CLASS__INFO(x) FT_CLASS(x)->info
-#define FT_CLASS__MAGIC(x) FT_CLASS(x)->magic
-
-
- /**************************************************************
- *
- * @struct: FT_TypeRec
- *
- * @description:
- * a structure used to describe a given class to the FreeType
- * object sub-system.
- *
- * @fields:
- * name :: class name. only used for debugging
- * super :: type of super-class. NULL if none
- *
- * class_size :: size of class structure in bytes
- * class_init :: class constructor
- * class_done :: class finalizer
- *
- * obj_size :: instance size in bytes
- * obj_init :: instance constructor. can be NULL
- * obj_done :: instance destructor. can be NULL
- *
- * @note:
- * if 'obj_init' is NULL, the class will use it's parent
- * constructor, if any
- *
- * if 'obj_done' is NULL, the class will use it's parent
- * finalizer, if any
- *
- * the object sub-system allocates a new class, copies
- * the content of its super-class into the new structure,
- * _then_ calls 'clazz_init'.
- *
- * 'class_init' and 'class_done' can be NULL, in which case
- * the parent's class constructor and destructor wil be used
- */
- typedef struct FT_TypeRec_
- {
- const char* name;
- FT_Type super;
-
- FT_UInt class_size;
- FT_Object_InitFunc class_init;
- FT_Object_DoneFunc class_done;
-
- FT_UInt obj_size;
- FT_Object_InitFunc obj_init;
- FT_Object_DoneFunc obj_done;
-
- } FT_TypeRec;
-
-
- /**************************************************************
- *
- * @macro: FT_TYPE (x)
- *
- * @description:
- * a useful macro to convert anything to a class type handle
- * without checks
- */
-#define FT_TYPE(x) ((FT_Type)(x))
-
-
- /**************************************************************
- *
- * @function: ft_object_check
- *
- * @description:
- * checks that a handle points to a valid @FT_Object
- *
- * @input:
- * obj :: handle/pointer
- *
- * @return:
- * 1 iff the handle points to a valid object. 0 otherwise
- */
- FT_BASE( FT_Int )
- ft_object_check( FT_Pointer obj );
-
-
- /**************************************************************
- *
- * @function: ft_object_is_a
- *
- * @description:
- * checks that a handle points to a valid @FT_Object that
- * is an instance of a given class (or of any of its sub-classes)
- *
- * @input:
- * obj :: handle/pointer
- * clazz :: class handle to check
- *
- * @return:
- * 1 iff the handle points to a valid 'clazz' instance. 0
- * otherwise.
- */
- FT_BASE( FT_Int )
- ft_object_is_a( FT_Pointer obj,
- FT_Class clazz );
-
-
- /**************************************************************
- *
- * @function: ft_object_create
- *
- * @description:
- * create a new object (class instance)
- *
- * @output:
- * aobject :: new object handle. NULL in case of error
- *
- * @input:
- * clazz :: object's class pointer
- * init_data :: optional pointer to initialization data
- *
- * @return:
- * error code. 0 means success
- */
- FT_BASE( FT_Error )
- ft_object_create( FT_Object *aobject,
- FT_Class clazz,
- FT_Pointer init_data );
-
-
- /**************************************************************
- *
- * @function: ft_object_create_from_type
- *
- * @description:
- * create a new object (class instance) from a @FT_Type
- *
- * @output:
- * aobject :: new object handle. NULL in case of error
- *
- * @input:
- * type :: object's type descriptor
- * init_data :: optional pointer to initialization data
- *
- * @return:
- * error code. 0 means success
- *
- * @note:
- * this function is slower than @ft_object_create
- *
- * this is equivalent to calling @ft_class_from_type followed by
- * @ft_object_create
- */
- FT_BASE( FT_Error )
- ft_object_create_from_type( FT_Object *aobject,
- FT_Type type,
- FT_Pointer init_data,
- FT_Library library );
-
-
-
- /**************************************************************
- *
- * @macro FT_OBJ_CREATE (object,class,init)
- *
- * @description:
- * a convenient macro used to create new objects. see
- * @ft_object_create for details
- */
-#define FT_OBJ_CREATE( _obj, _clazz, _init ) \
- ft_object_create( FT_OBJECT_P(&(_obj)), _clazz, _init )
-
-
- /**************************************************************
- *
- * @macro FT_CREATE (object,class,init)
- *
- * @description:
- * a convenient macro used to create new objects. It also
- * sets an _implicit_ local variable named "error" to the error
- * code returned by the object constructor.
- */
-#define FT_CREATE( _obj, _clazz, _init ) \
- FT_SET_ERROR( FT_OBJ_CREATE( _obj, _clazz, _init ) )
-
- /**************************************************************
- *
- * @macro FT_OBJ_CREATE_FROM_TYPE (object,type,init)
- *
- * @description:
- * a convenient macro used to create new objects. see
- * @ft_object_create_from_type for details
- */
-#define FT_OBJ_CREATE_FROM_TYPE( _obj, _type, _init, _lib ) \
- ft_object_create_from_type( FT_OBJECT_P(&(_obj)), _type, _init, _lib )
-
-
- /**************************************************************
- *
- * @macro FT_CREATE_FROM_TYPE (object,type,init)
- *
- * @description:
- * a convenient macro used to create new objects. It also
- * sets an _implicit_ local variable named "error" to the error
- * code returned by the object constructor.
- */
-#define FT_CREATE_FROM_TYPE( _obj, _type, _init, _lib ) \
- FT_SET_ERROR( FT_OBJ_CREATE_FROM_TYPE( _obj, _type, _init, _lib ) )
-
-
- /* */
-
- /**************************************************************
- *
- * @function: ft_class_from_type
- *
- * @description:
- * retrieves the class object corresponding to a given type
- * descriptor. The class is created when needed
- *
- * @output:
- * aclass :: handle to corresponding class object. NULL in
- * case of error
- *
- * @input:
- * type :: type descriptor handle
- * library :: library handle
- *
- * @return:
- * error code. 0 means success
- */
- FT_BASE( FT_Error )
- ft_class_from_type( FT_Class *aclass,
- FT_Type type,
- FT_Library library );
-
-
- /* */
-
-#include FT_INTERNAL_HASH_H
-
- typedef struct FT_ClassHNodeRec_* FT_ClassHNode;
-
- typedef struct FT_ClassHNodeRec_
- {
- FT_HashNodeRec hnode;
- FT_Type type;
- FT_Class clazz;
-
- } FT_ClassHNodeRec;
-
- typedef struct FT_MetaClassRec_
- {
- FT_ClassRec clazz; /* the meta-class is a class itself */
- FT_HashRec type_to_class; /* the type => class hash table */
-
- } FT_MetaClassRec, *FT_MetaClass;
-
-
- /* initialize meta class */
- FT_BASE( FT_Error )
- ft_metaclass_init( FT_MetaClass meta,
- FT_Library library );
-
- /* finalize meta class - destroy all registered class objects */
- FT_BASE( void )
- ft_metaclass_done( FT_MetaClass meta );
-
- /* */
-
-FT_END_HEADER
-
-#endif /* __FT_OBJECT_H__ */
diff --git a/include/freetype/internal/ftobjs.h b/include/freetype/internal/ftobjs.h
index 5ccd5dc0..e6333c2a 100644
--- a/include/freetype/internal/ftobjs.h
+++ b/include/freetype/internal/ftobjs.h
@@ -1,53 +1,54 @@
-/***************************************************************************/
-/* */
-/* ftobjs.h */
-/* */
-/* The FreeType private base classes (specification). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
-
-
- /*************************************************************************/
- /* */
- /* This file contains the definition of all internal FreeType classes. */
- /* */
- /*************************************************************************/
-
-
-#ifndef __FTOBJS_H__
-#define __FTOBJS_H__
-
-#include <ft2build.h>
-#include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_setjmp and ft_longjmp */
-#include FT_RENDER_H
-#include FT_SIZES_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_OBJECT_H
+/****************************************************************************
+ *
+ * ftobjs.h
+ *
+ * The FreeType private base classes (specification).
+ *
+ * Copyright (C) 1996-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/ftrender.h>
+#include <freetype/ftsizes.h>
+#include <freetype/ftlcdfil.h>
+#include <freetype/internal/ftmemory.h>
+#include <freetype/internal/ftgloadr.h>
+#include <freetype/internal/ftdrv.h>
+#include <freetype/internal/autohint.h>
+#include <freetype/internal/ftserv.h>
+#include <freetype/internal/ftcalc.h>
#ifdef FT_CONFIG_OPTION_INCREMENTAL
-#include FT_INCREMENTAL_H
+#include <freetype/ftincrem.h>
#endif
+#include "compiler-macros.h"
FT_BEGIN_HEADER
- /*************************************************************************/
- /* */
- /* Some generic definitions. */
- /* */
+ /**************************************************************************
+ *
+ * Some generic definitions.
+ */
#ifndef TRUE
#define TRUE 1
#endif
@@ -61,127 +62,69 @@ FT_BEGIN_HEADER
#endif
- /*************************************************************************/
- /* */
- /* The min and max functions missing in C. As usual, be careful not to */
- /* write things like MIN( a++, b++ ) to avoid side effects. */
- /* */
-#ifndef MIN
-#define MIN( a, b ) ( (a) < (b) ? (a) : (b) )
-#endif
-
-#ifndef MAX
-#define MAX( a, b ) ( (a) > (b) ? (a) : (b) )
-#endif
-
-#ifndef ABS
-#define ABS( a ) ( (a) < 0 ? -(a) : (a) )
-#endif
-
-
- /*************************************************************************/
- /*************************************************************************/
- /*************************************************************************/
- /**** ****/
- /**** ****/
- /**** V A L I D A T I O N ****/
- /**** ****/
- /**** ****/
- /*************************************************************************/
- /*************************************************************************/
- /*************************************************************************/
-
- /* handle to a validation object */
- typedef struct FT_ValidatorRec_* 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, 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 check that fields that must be a multiple of 2, 4, or 8 */
- /* dont' 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;
-
-
- /* validator structure */
- typedef struct FT_ValidatorRec_
- {
- 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_jmp_buf jump_buffer; /* used for exception handling */
-
- } FT_ValidatorRec;
-
-
-#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 );
-
- 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_validator_error( valid, _error )
-
- /* called when a broken table is detected */
-#define FT_INVALID_TOO_SHORT FT_INVALID( FT_Err_Invalid_Table )
-
- /* called when an invalid offset is detected */
-#define FT_INVALID_OFFSET FT_INVALID( FT_Err_Invalid_Offset )
-
- /* called when an invalid format/value is detected */
-#define FT_INVALID_FORMAT FT_INVALID( FT_Err_Invalid_Table )
-
- /* called when an invalid glyph index is detected */
-#define FT_INVALID_GLYPH_ID FT_INVALID( FT_Err_Invalid_Glyph_Index )
-
- /* called when an invalid field value is detected */
-#define FT_INVALID_DATA FT_INVALID( FT_Err_Invalid_Table )
+ /**************************************************************************
+ *
+ * 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 )
+
+ /* specialized versions (for signed values) */
+ /* that don't produce run-time errors due to integer overflow */
+#define FT_PAD_ROUND_LONG( x, n ) FT_PAD_FLOOR( ADD_LONG( (x), (n) / 2 ), \
+ n )
+#define FT_PAD_CEIL_LONG( x, n ) FT_PAD_FLOOR( ADD_LONG( (x), (n) - 1 ), \
+ n )
+#define FT_PIX_ROUND_LONG( x ) FT_PIX_FLOOR( ADD_LONG( (x), 32 ) )
+#define FT_PIX_CEIL_LONG( x ) FT_PIX_FLOOR( ADD_LONG( (x), 63 ) )
+
+#define FT_PAD_ROUND_INT32( x, n ) FT_PAD_FLOOR( ADD_INT32( (x), (n) / 2 ), \
+ n )
+#define FT_PAD_CEIL_INT32( x, n ) FT_PAD_FLOOR( ADD_INT32( (x), (n) - 1 ), \
+ n )
+#define FT_PIX_ROUND_INT32( x ) FT_PIX_FLOOR( ADD_INT32( (x), 32 ) )
+#define FT_PIX_CEIL_INT32( x ) FT_PIX_FLOOR( ADD_INT32( (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 ) )
/*************************************************************************/
@@ -210,8 +153,8 @@ FT_BEGIN_HEADER
} FT_CMapRec;
- /* typecase any pointer to a charmap handle */
-#define FT_CMAP( x ) ((FT_CMap)( x ))
+ /* typecast 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
@@ -236,18 +179,84 @@ FT_BEGIN_HEADER
(*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_Int
+ (*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_UInt size;
+ 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;
+#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_ \
+ };
+
+
/* create a new charmap and add it to charmap->face */
FT_BASE( FT_Error )
FT_CMap_New( FT_CMap_Class clazz,
@@ -255,119 +264,207 @@ FT_BEGIN_HEADER
FT_CharMap charmap,
FT_CMap *acmap );
- /* destroy a charmap (don't remove it from face's list though) */
+ /* 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 maximal 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 maximal 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. */
- /* */
- /* hint_flags :: Some flags used to change the hinters' */
- /* behaviour. Only used for debugging for now. */
- /* */
- /* postscript_name :: Postscript font name for this face. */
- /* */
- /* 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. */
- /* */
- typedef struct FT_Face_InternalRec_
- {
- FT_UShort max_points;
- FT_Short max_contours;
+ /* add LCD padding to CBox */
+ FT_BASE( void )
+ ft_lcd_padding( FT_BBox* cbox,
+ FT_GlyphSlot slot,
+ FT_Render_Mode mode );
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
- FT_Matrix transform_matrix;
- FT_Vector transform_delta;
- FT_Int transform_flags;
+ typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap,
+ FT_Byte* weights );
- FT_UInt32 hint_flags;
- const char* postscript_name;
+ /* This is the default LCD filter, an in-place, 5-tap FIR filter. */
+ FT_BASE( void )
+ ft_lcd_filter_fir( FT_Bitmap* bitmap,
+ FT_LcdFiveTapFilter weights );
+
+#endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+ /**************************************************************************
+ *
+ * @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.
+ *
+ * no_stem_darkening ::
+ * Overrides the module-level default, see @stem-darkening[cff], for
+ * example. FALSE and TRUE toggle stem darkening on and off,
+ * respectively, value~-1 means to use the module/driver default.
+ *
+ * random_seed ::
+ * If positive, override the seed value for the CFF 'random' operator.
+ * Value~0 means to use the font's value. Value~-1 means to use the
+ * CFF driver's default.
+ *
+ * lcd_weights ::
+ * lcd_filter_func ::
+ * These fields specify the LCD filtering weights and callback function
+ * for ClearType-style subpixel rendering.
+ *
+ * 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_Char no_stem_darkening;
+ FT_Int32 random_seed;
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+ FT_LcdFiveTapFilter lcd_weights; /* filter weights, if any */
+ FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */
+#endif
+
+ 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. */
- /* */
- /* 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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.
+ *
+ * load_flags ::
+ * The load flags passed as an argument to @FT_Load_Glyph while
+ * initializing the glyph slot.
+ */
+
+#define FT_GLYPH_OWN_BITMAP 0x1U
+#define FT_GLYPH_OWN_GZIP_SVG 0x2U
+
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_Int32 load_flags;
+
} FT_GlyphSlot_InternalRec;
+ /**************************************************************************
+ *
+ * @struct:
+ * FT_Size_InternalRec
+ *
+ * @description:
+ * This structure contains the internal fields of each FT_Size object.
+ *
+ * @fields:
+ * module_data ::
+ * Data specific to a driver module.
+ *
+ * autohint_mode ::
+ * The used auto-hinting mode.
+ *
+ * autohint_metrics ::
+ * Metrics used by the auto-hinter.
+ *
+ */
+
+ typedef struct FT_Size_InternalRec_
+ {
+ void* module_data;
+
+ FT_Render_Mode autohint_mode;
+ FT_Size_Metrics autohint_metrics;
+
+ } FT_Size_InternalRec;
+
+
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
@@ -381,94 +478,115 @@ FT_BEGIN_HEADER
/*************************************************************************/
- /*************************************************************************/
- /* */
- /* <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. */
- /* */
- /* generic :: A generic structure for user-level extensibility (?). */
- /* */
+ /**************************************************************************
+ *
+ * @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_Generic generic;
} FT_ModuleRec;
- /* typecast an object to a FT_Module */
-#define FT_MODULE( x ) ((FT_Module)( x ))
+ /* 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 )
+ FT_MODULE_FONT_DRIVER )
#define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
- ft_module_renderer )
+ FT_MODULE_RENDERER )
#define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
- ft_module_hinter )
+ FT_MODULE_HINTER )
#define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
- ft_module_styler )
+ FT_MODULE_STYLER )
#define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \
- ft_module_driver_scalable )
+ FT_MODULE_DRIVER_SCALABLE )
#define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \
- ft_module_driver_no_outlines )
+ 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_MODULE_DRIVER_HAS_HINTER )
+
+#define FT_DRIVER_HINTS_LIGHTLY( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_DRIVER_HINTS_LIGHTLY )
+
+
+ /**************************************************************************
+ *
+ * @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,
+ FT_Bool global );
+
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+ FT_BASE( FT_Error )
+ ft_property_string_set( FT_Library library,
+ const FT_String* module_name,
+ const FT_String* property_name,
+ FT_String* value );
+#endif
+
+ /* */
+
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
/**** ****/
/**** ****/
- /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/
+ /**** F A C E, S I Z E & G L Y P H S L O T O B J E C T S ****/
/**** ****/
/**** ****/
/*************************************************************************/
@@ -477,9 +595,9 @@ FT_BEGIN_HEADER
/* 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( 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
@@ -493,47 +611,114 @@ FT_BEGIN_HEADER
#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. */
- /* */
+ /**************************************************************************
+ *
+ * @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. */
- /* */
+ /**************************************************************************
+ *
+ * @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( FT_Error )
+ 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 );
+
+
+ /* Preset bitmap metrics of an outline glyphslot prior to rendering */
+ /* and check whether the truncated bbox is too large for rendering. */
+ FT_BASE( FT_Bool )
+ ft_glyphslot_preset_bitmap( FT_GlyphSlot slot,
+ FT_Render_Mode mode,
+ const FT_Vector* origin );
+
+ /* 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 );
+
/*************************************************************************/
/*************************************************************************/
@@ -548,10 +733,10 @@ FT_BEGIN_HEADER
/*************************************************************************/
-#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 ))
+#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_
@@ -582,47 +767,41 @@ FT_BEGIN_HEADER
/* typecast a module into a driver easily */
-#define FT_DRIVER( x ) ((FT_Driver)(x))
+#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. */
- /* */
- /* extensions :: A typeless pointer to the driver's extensions */
- /* registry, if they are supported through the */
- /* configuration macro FT_CONFIG_OPTION_EXTENSIONS. */
- /* */
- /* glyph_loader :: The glyph loader for all faces managed by this */
- /* driver. This object isn't defined for unscalable */
- /* formats. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
- void* extensions;
-
FT_GlyphLoader glyph_loader;
} FT_DriverRec;
@@ -641,60 +820,81 @@ FT_BEGIN_HEADER
/*************************************************************************/
-#define FT_DEBUG_HOOK_TRUETYPE 0
-#define FT_DEBUG_HOOK_TYPE1 1
-
-
- /*************************************************************************/
- /* */
- /* <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. */
- /* */
- /* generic :: Client data variable. Used to extend the */
- /* Library class by higher levels and clients. */
- /* */
- /* 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 */
- /* */
+ /**************************************************************************
+ *
+ * @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 ::
+ * The auto-hinter module interface.
+ *
+ * debug_hooks ::
+ * An array of four function pointers that allow debuggers to hook into
+ * a font format's interpreter. Currently, only the TrueType bytecode
+ * debugger uses this.
+ *
+ * lcd_weights ::
+ * The LCD filter weights for ClearType-style subpixel rendering.
+ *
+ * lcd_filter_func ::
+ * The LCD filtering callback function for for ClearType-style subpixel
+ * rendering.
+ *
+ * lcd_geometry ::
+ * This array specifies LCD subpixel geometry and controls Harmony LCD
+ * rendering technique, alternative to ClearType.
+ *
+ * pic_container ::
+ * Contains global structs and tables, instead of defining them
+ * globally.
+ *
+ * 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_Generic generic;
-
FT_Int version_major;
FT_Int version_minor;
FT_Int version_patch;
@@ -706,13 +906,16 @@ FT_BEGIN_HEADER
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];
- FT_MetaClassRec meta_class;
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+ FT_LcdFiveTapFilter lcd_weights; /* filter weights, if any */
+ FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */
+#else
+ FT_Vector lcd_geometry[3]; /* RGB subpixel positions */
+#endif
+
+ FT_Int refcount;
} FT_LibraryRec;
@@ -737,39 +940,40 @@ FT_BEGIN_HEADER
FT_UInt buffer_max );
typedef FT_UInt
- (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face,
- FT_String* glyph_name );
+ (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face,
+ const 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_EXPORT( FT_Memory )
+ /**************************************************************************
+ *
+ * @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_EXPORT( 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 */
@@ -786,9 +990,249 @@ FT_BEGIN_HEADER
#endif
+ /**************************************************************************
+ *
+ * @macro:
+ * FT_DEFINE_OUTLINE_FUNCS
+ *
+ * @description:
+ * Used to initialize an instance of FT_Outline_Funcs struct. The struct
+ * will be allocated in the global scope (or the scope where the macro is
+ * used).
+ */
+#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_ \
+ };
+
+
+ /**************************************************************************
+ *
+ * @macro:
+ * FT_DEFINE_RASTER_FUNCS
+ *
+ * @description:
+ * Used to initialize an instance of FT_Raster_Funcs struct. The struct
+ * will be allocated in the global scope (or the scope where the macro is
+ * used).
+ */
+#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_ \
+ };
+
+
+
+ /**************************************************************************
+ *
+ * @macro:
+ * FT_DEFINE_GLYPH
+ *
+ * @description:
+ * The struct will be allocated in the global scope (or the scope where
+ * the macro is used).
+ */
+#define FT_DECLARE_GLYPH( class_ ) \
+ FT_CALLBACK_TABLE const FT_Glyph_Class class_;
+
+#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_ \
+ };
+
+
+ /**************************************************************************
+ *
+ * @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.
+ *
+ * The struct will be allocated in the global scope (or the scope where
+ * the macro is used).
+ */
+#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_ \
+ };
+
+
+ /**************************************************************************
+ *
+ * @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.
+ *
+ * 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.
+ */
+#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_, \
+ };
+
+
FT_END_HEADER
-#endif /* __FTOBJS_H__ */
+#endif /* FTOBJS_H_ */
/* END */
diff --git a/include/freetype/internal/ftpsprop.h b/include/freetype/internal/ftpsprop.h
new file mode 100644
index 00000000..4f11aa16
--- /dev/null
+++ b/include/freetype/internal/ftpsprop.h
@@ -0,0 +1,47 @@
+/****************************************************************************
+ *
+ * ftpsprop.h
+ *
+ * Get and set properties of PostScript drivers (specification).
+ *
+ * Copyright (C) 2017-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 FTPSPROP_H_
+#define FTPSPROP_H_
+
+
+#include <freetype/freetype.h>
+
+
+FT_BEGIN_HEADER
+
+
+ FT_BASE_CALLBACK( FT_Error )
+ ps_property_set( FT_Module module, /* PS_Driver */
+ const char* property_name,
+ const void* value,
+ FT_Bool value_is_string );
+
+ FT_BASE_CALLBACK( FT_Error )
+ ps_property_get( FT_Module module, /* PS_Driver */
+ const char* property_name,
+ void* value );
+
+
+FT_END_HEADER
+
+
+#endif /* FTPSPROP_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftrfork.h b/include/freetype/internal/ftrfork.h
new file mode 100644
index 00000000..05c1d6c4
--- /dev/null
+++ b/include/freetype/internal/ftrfork.h
@@ -0,0 +1,245 @@
+/****************************************************************************
+ *
+ * ftrfork.h
+ *
+ * Embedded resource forks accessor (specification).
+ *
+ * Copyright (C) 2004-2024 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 <freetype/internal/ftobjs.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_Short 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;
+
+
+#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 },
+ /* this array is a storage, thus a final `;' is needed */
+#define CONST_FT_RFORK_RULE_ARRAY_END };
+
+#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 'sfnt' 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/include/freetype/internal/ftserv.h b/include/freetype/internal/ftserv.h
new file mode 100644
index 00000000..8c35dbd7
--- /dev/null
+++ b/include/freetype/internal/ftserv.h
@@ -0,0 +1,495 @@
+/****************************************************************************
+ *
+ * ftserv.h
+ *
+ * The FreeType services (specification only).
+ *
+ * Copyright (C) 2003-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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_
+
+#include "compiler-macros.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, 1 ); \
+ *_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, 1 ); \
+ 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
+ * FT_DEFINE_SERVICEDESCREC8
+ * FT_DEFINE_SERVICEDESCREC9
+ * FT_DEFINE_SERVICEDESCREC10
+ *
+ * @description:
+ * Used to initialize an array of FT_ServiceDescRec structures.
+ *
+ * The array will be allocated in the global scope (or the scope where
+ * the macro is used).
+ */
+#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 } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC8( 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, \
+ serv_id_8, serv_data_8 ) \
+ 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 }, \
+ { serv_id_8, serv_data_8 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC9( 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, \
+ serv_id_8, serv_data_8, \
+ serv_id_9, serv_data_9 ) \
+ 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 }, \
+ { serv_id_8, serv_data_8 }, \
+ { serv_id_9, serv_data_9 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC10( 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, \
+ serv_id_8, serv_data_8, \
+ serv_id_9, serv_data_9, \
+ serv_id_10, serv_data_10 ) \
+ 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 }, \
+ { serv_id_8, serv_data_8 }, \
+ { serv_id_9, serv_data_9 }, \
+ { serv_id_10, serv_data_10 }, \
+ { NULL, NULL } \
+ };
+
+
+ /*
+ * 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_METRICS_VARIATIONS;
+ 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 look up 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_
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* FTSERV_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftstream.h b/include/freetype/internal/ftstream.h
index 618f64aa..fd52f767 100644
--- a/include/freetype/internal/ftstream.h
+++ b/include/freetype/internal/ftstream.h
@@ -1,28 +1,28 @@
-/***************************************************************************/
-/* */
-/* ftstream.h */
-/* */
-/* Stream handling (specification). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
-
-
-#ifndef __FTSTREAM_H__
-#define __FTSTREAM_H__
+/****************************************************************************
+ *
+ * ftstream.h
+ *
+ * Stream handling (specification).
+ *
+ * Copyright (C) 1996-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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
+#include <freetype/ftsystem.h>
+#include <freetype/internal/ftobjs.h>
FT_BEGIN_HEADER
@@ -96,13 +96,13 @@ FT_BEGIN_HEADER
/* The structure type must be set in the FT_STRUCTURE macro before */
/* calling the FT_FRAME_START() macro. */
/* */
-#define FT_FIELD_SIZE( f ) \
+#define FT_FIELD_SIZE( f ) \
(FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f )
-#define FT_FIELD_SIZE_DELTA( f ) \
+#define FT_FIELD_SIZE_DELTA( f ) \
(FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] )
-#define FT_FIELD_OFFSET( f ) \
+#define FT_FIELD_OFFSET( f ) \
(FT_UShort)( offsetof( FT_STRUCTURE, f ) )
#define FT_FRAME_FIELD( frame_op, field ) \
@@ -147,174 +147,226 @@ FT_BEGIN_HEADER
#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). */
- /* */
+ /**************************************************************************
+ *
+ * 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_INT8_( p, i ) ( ((const FT_Char*)(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_I16( p, i, s ) ( FT_INT16( FT_BYTE_( p, i ) ) << (s) )
+
#define FT_BYTE_U16( p, i, s ) ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) )
-#define FT_BYTE_I32( p, i, s ) ( FT_INT32( FT_BYTE_( p, i ) ) << (s) )
#define FT_BYTE_U32( p, i, s ) ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) )
-#define FT_INT8_I16( p, i, s ) ( FT_INT16( FT_INT8_( p, i ) ) << (s) )
-#define FT_INT8_U16( p, i, s ) ( FT_UINT16( FT_INT8_( p, i ) ) << (s) )
-#define FT_INT8_I32( p, i, s ) ( FT_INT32( FT_INT8_( p, i ) ) << (s) )
-#define FT_INT8_U32( p, i, s ) ( FT_UINT32( FT_INT8_( p, i ) ) << (s) )
+ /*
+ * function acts on increases does range for emits
+ * pointer checking frames error
+ * -------------------------------------------------------------------
+ * FT_PEEK_XXX buffer pointer no no no no
+ * FT_NEXT_XXX buffer pointer yes no no no
+ * FT_GET_XXX stream->cursor yes yes yes no
+ * FT_READ_XXX stream->pos yes yes no yes
+ */
-#define FT_PEEK_SHORT( p ) FT_INT16( FT_INT8_I16( p, 0, 8) | \
- FT_BYTE_I16( p, 1, 0) )
+
+ /*
+ * `FT_PEEK_XXX' are generic macros to get data from a buffer position. No
+ * safety checks are performed.
+ */
+#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_INT8_I32( p, 0, 24 ) | \
- FT_BYTE_I32( p, 1, 16 ) | \
- FT_BYTE_I32( p, 2, 8 ) | \
- FT_BYTE_I32( p, 3, 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_INT8_I32( p, 0, 16 ) | \
- FT_BYTE_I32( p, 1, 8 ) | \
- FT_BYTE_I32( p, 2, 0 ) )
+#define FT_PEEK_OFF3( p ) ( FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \
+ FT_BYTE_U32( p, 1, 16 ) | \
+ FT_BYTE_U32( p, 2, 8 ) ) >> 8 )
#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_INT8_I16( p, 1, 8 ) | \
- FT_BYTE_I16( p, 0, 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_INT8_I32( p, 3, 24 ) | \
- FT_BYTE_I32( p, 2, 16 ) | \
- FT_BYTE_I32( p, 1, 8 ) | \
- FT_BYTE_I32( 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_INT8_I32( p, 2, 16 ) | \
- FT_BYTE_I32( p, 1, 8 ) | \
- FT_BYTE_I32( p, 0, 0 ) )
+#define FT_PEEK_OFF3_LE( p ) ( FT_INT32( FT_BYTE_U32( p, 2, 24 ) | \
+ FT_BYTE_U32( p, 1, 16 ) | \
+ FT_BYTE_U32( p, 0, 8 ) ) >> 8 )
#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 ) )
-
+ /*
+ * `FT_NEXT_XXX' are generic macros to get data from a buffer position
+ * which is then increased appropriately. No safety checks are performed.
+ */
#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_SHORT( buffer ) \
+ ( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) )
-#define FT_NEXT_USHORT( buffer ) \
- ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) )
+#define FT_NEXT_USHORT( buffer ) \
+ ( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) )
-#define FT_NEXT_OFF3( buffer ) \
- ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) )
+#define FT_NEXT_OFF3( buffer ) \
+ ( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) )
-#define FT_NEXT_UOFF3( buffer ) \
- ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) )
+#define FT_NEXT_UOFF3( buffer ) \
+ ( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) )
-#define FT_NEXT_LONG( buffer ) \
- ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) )
+#define FT_NEXT_LONG( buffer ) \
+ ( buffer += 4, FT_PEEK_LONG( buffer - 4 ) )
-#define FT_NEXT_ULONG( buffer ) \
- ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) )
+#define FT_NEXT_ULONG( buffer ) \
+ ( 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_SHORT_LE( buffer ) \
+ ( 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_USHORT_LE( buffer ) \
+ ( 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_OFF3_LE( buffer ) \
+ ( 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_UOFF3_LE( buffer ) \
+ ( 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_LONG_LE( buffer ) \
+ ( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) )
-#define FT_NEXT_ULONG_LE( buffer ) \
- ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) )
+#define FT_NEXT_ULONG_LE( buffer ) \
+ ( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) )
- /*************************************************************************/
- /* */
- /* Each GET_xxxx() macro uses an implicit `stream' variable. */
- /* */
+ /**************************************************************************
+ *
+ * The `FT_GET_XXX` macros use an implicit 'stream' variable.
+ *
+ * Note that a call to `FT_STREAM_SEEK` or `FT_STREAM_POS` has **no**
+ * effect on `FT_GET_XXX`! They operate on `stream->pos`, while
+ * `FT_GET_XXX` use `stream->cursor`.
+ */
+#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_GetShort, FT_Short )
-#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetShort, FT_UShort )
-#define FT_GET_OFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_Long )
-#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_ULong )
-#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetLong, FT_Long )
-#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong )
-#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong )
-
-#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_Short )
-#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_UShort )
-#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_Long )
-#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_ULong )
+#define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetByte, FT_Char )
+#define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetByte, FT_Byte )
+#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_Int16 )
+#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_UInt16 )
+#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_UInt32 )
+#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetULong, FT_Int32 )
+#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetULong, FT_UInt32 )
+#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetULong, FT_UInt32 )
+
+#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Int16 )
+#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UInt16 )
+#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_Int32 )
+#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_UInt32 )
+#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_ReadShort, FT_Short, var )
-#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadShort, FT_UShort, var )
-#define FT_READ_OFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_Long, var )
-#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_ULong, var )
-#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_Long, var )
-#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_ULong, var )
-
-#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_Short, var )
-#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_UShort, var )
-#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_Long, var )
-#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_ULong, var )
+ /*
+ * The `FT_READ_XXX' macros use implicit `stream' and `error' variables.
+ *
+ * `FT_READ_XXX' can be controlled with `FT_STREAM_SEEK' and
+ * `FT_STREAM_POS'. They use the full machinery to check whether a read is
+ * valid.
+ */
+#define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadByte, FT_Byte, var )
+#define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadByte, FT_Char, var )
+#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_Int16, var )
+#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_UInt16, var )
+#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_UInt32, var )
+#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_Int32, var )
+#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_UInt32, var )
+
+#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Int16, var )
+#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UInt16, var )
+#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Int32, var )
+#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_UInt32, var )
#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
/* initialize a stream for reading a regular system stream */
- FT_EXPORT( FT_Error )
+ 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,
@@ -337,7 +389,7 @@ FT_BEGIN_HEADER
FT_Long distance );
/* return current stream position */
- FT_BASE( FT_Long )
+ FT_BASE( FT_ULong )
FT_Stream_Pos( FT_Stream stream );
/* read bytes from a stream into a user-allocated buffer, returns an */
@@ -354,14 +406,23 @@ FT_BEGIN_HEADER
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 */
+ /* the `FT_Stream_GetXXX' functions to retrieve frame data without */
/* error checks. */
/* */
- /* You must _always_ call FT_Stream_ExitFrame() once you have entered */
+ /* You must _always_ call `FT_Stream_ExitFrame' once you have entered */
/* a stream frame! */
/* */
+ /* Nested frames are not permitted. */
+ /* */
FT_BASE( FT_Error )
FT_Stream_EnterFrame( FT_Stream stream,
FT_ULong count );
@@ -370,79 +431,83 @@ FT_BEGIN_HEADER
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. */
+ /* is memory-based, this function simply sets 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_Stream_GetXXX' functions can't be used. */
+ /* */
+ /* An extracted frame 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) */
+ /* 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 );
+ FT_BASE( FT_Byte )
+ FT_Stream_GetByte( FT_Stream stream );
- /* read a 16-bit big-endian integer from an entered frame */
- FT_BASE( FT_Short )
- FT_Stream_GetShort( FT_Stream stream );
+ /* read a 16-bit big-endian unsigned integer from an entered frame */
+ FT_BASE( FT_UInt16 )
+ FT_Stream_GetUShort( FT_Stream stream );
- /* read a 24-bit big-endian integer from an entered frame */
- FT_BASE( FT_Long )
- FT_Stream_GetOffset( FT_Stream stream );
+ /* read a 24-bit big-endian unsigned integer from an entered frame */
+ FT_BASE( FT_UInt32 )
+ FT_Stream_GetUOffset( FT_Stream stream );
- /* read a 32-bit big-endian integer from an entered frame */
- FT_BASE( FT_Long )
- FT_Stream_GetLong( FT_Stream stream );
+ /* read a 32-bit big-endian unsigned integer from an entered frame */
+ FT_BASE( FT_UInt32 )
+ FT_Stream_GetULong( FT_Stream stream );
- /* read a 16-bit little-endian integer from an entered frame */
- FT_BASE( FT_Short )
- FT_Stream_GetShortLE( FT_Stream stream );
+ /* read a 16-bit little-endian unsigned integer from an entered frame */
+ FT_BASE( FT_UInt16 )
+ FT_Stream_GetUShortLE( FT_Stream stream );
- /* read a 32-bit little-endian integer from an entered frame */
- FT_BASE( FT_Long )
- FT_Stream_GetLongLE( FT_Stream stream );
+ /* read a 32-bit little-endian unsigned integer from an entered frame */
+ FT_BASE( FT_UInt32 )
+ FT_Stream_GetULongLE( FT_Stream stream );
/* read a byte from a stream */
- FT_BASE( FT_Char )
- FT_Stream_ReadChar( FT_Stream stream,
+ FT_BASE( FT_Byte )
+ FT_Stream_ReadByte( FT_Stream stream,
FT_Error* error );
- /* read a 16-bit big-endian integer from a stream */
- FT_BASE( FT_Short )
- FT_Stream_ReadShort( FT_Stream stream,
- FT_Error* error );
-
- /* read a 24-bit big-endian integer from a stream */
- FT_BASE( FT_Long )
- FT_Stream_ReadOffset( FT_Stream stream,
+ /* read a 16-bit big-endian unsigned integer from a stream */
+ FT_BASE( FT_UInt16 )
+ 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_Long )
- FT_Stream_ReadLong( FT_Stream stream,
- FT_Error* error );
+ FT_BASE( FT_UInt32 )
+ FT_Stream_ReadULong( FT_Stream stream,
+ FT_Error* error );
- /* read a 16-bit little-endian integer from a stream */
- FT_BASE( FT_Short )
- FT_Stream_ReadShortLE( FT_Stream stream,
- FT_Error* error );
+ /* read a 16-bit little-endian unsigned integer from a stream */
+ FT_BASE( FT_UInt16 )
+ FT_Stream_ReadUShortLE( FT_Stream stream,
+ FT_Error* error );
- /* read a 32-bit little-endian integer from a stream */
- FT_BASE( FT_Long )
- FT_Stream_ReadLongLE( FT_Stream stream,
- FT_Error* error );
+ /* read a 32-bit little-endian unsigned integer from a stream */
+ FT_BASE( FT_UInt32 )
+ 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. */
@@ -455,44 +520,51 @@ FT_BEGIN_HEADER
#define FT_STREAM_POS() \
FT_Stream_Pos( stream )
-#define FT_STREAM_SEEK( position ) \
- FT_SET_ERROR( FT_Stream_Seek( stream, position ) )
+#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, distance ) )
+#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, \
- count ) )
+#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, \
- position, \
- (FT_Byte*)buffer, \
- 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_Stream_EnterFrame( stream, size ) )
+#define FT_FRAME_ENTER( size ) \
+ FT_SET_ERROR( \
+ FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, \
+ (FT_ULong)(size) ) ) )
-#define FT_FRAME_EXIT() \
- FT_Stream_ExitFrame( stream )
+#define FT_FRAME_EXIT() \
+ FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) )
-#define FT_FRAME_EXTRACT( size, bytes ) \
- FT_SET_ERROR( FT_Stream_ExtractFrame( stream, size, \
- (FT_Byte**)&(bytes) ) )
+#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_Stream_ReleaseFrame( stream, (FT_Byte**)&(bytes) )
+#define FT_FRAME_RELEASE( bytes ) \
+ FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream, \
+ (FT_Byte**)&(bytes) ) )
FT_END_HEADER
-#endif /* __FTSTREAM_H__ */
+#endif /* FTSTREAM_H_ */
/* END */
diff --git a/include/freetype/internal/fttrace.h b/include/freetype/internal/fttrace.h
index ffc0b141..42595a29 100644
--- a/include/freetype/internal/fttrace.h
+++ b/include/freetype/internal/fttrace.h
@@ -1,106 +1,173 @@
-/***************************************************************************/
-/* */
-/* fttrace.h */
-/* */
-/* Tracing handling (specification only). */
-/* */
-/* 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. */
-/* */
-/***************************************************************************/
-
-
-/* definitions of trace levels for FreeType 2 */
-
-/* the first level must always be `trace_any' */
+/****************************************************************************
+ *
+ * fttrace.h
+ *
+ * Tracing handling (specification only).
+ *
+ * Copyright (C) 2002-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 maximum string length (if the argument to `FT_TRACE_DEF` */
+ /* gets used as a string) plus one charachter for ':' plus */
+ /* another one for the trace level */
+#define FT_MAX_TRACE_LEVEL_LENGTH (9 + 1 + 1)
+
+ /* the first level must always be `trace_any' */
FT_TRACE_DEF( any )
-/* base components */
+ /* base components */
FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */
+FT_TRACE_DEF( gloader ) /* glyph loader (ftgloadr.c) */
+FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */
FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */
-FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */
+FT_TRACE_DEF( init ) /* initialization (ftinit.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( stream ) /* stream manager (ftstream.c) */
-FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */
-FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */
+FT_TRACE_DEF( bitmap ) /* bitmap manipulation (ftbitmap.c) */
+FT_TRACE_DEF( checksum ) /* bitmap checksum (ftobjs.c) */
FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */
+FT_TRACE_DEF( psprops ) /* PS driver properties (ftpsprop.c) */
+FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */
+FT_TRACE_DEF( synth ) /* bold/slant synthesizer (ftsynth.c) */
-/* Cache sub-system */
-FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc..) */
+ /* rasterizers */
+FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */
+FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */
-/* SFNT driver components */
-FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */
-FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */
-FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */
+ /* ot-svg module */
+FT_TRACE_DEF( otsvg ) /* OT-SVG renderer (ftsvg.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( sfwoff ) /* WOFF format handler (sfwoff.c) */
+FT_TRACE_DEF( sfwoff2 ) /* WOFF2 format handler (sfwoff2.c) */
+FT_TRACE_DEF( ttbdf ) /* TrueType embedded BDF (ttbdf.c) */
+FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */
+FT_TRACE_DEF( ttcolr ) /* glyph layer table (ttcolr.c) */
+FT_TRACE_DEF( ttcpal ) /* color palette table (ttcpal.c) */
+FT_TRACE_DEF( ttgpos ) /* GPOS handler (ttgpos.c) */
+FT_TRACE_DEF( ttsvg ) /* OpenType SVG table (ttsvg.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) */
-/* TrueType driver components */
+ /* TrueType driver components */
FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */
FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */
+FT_TRACE_DEF( ttgxvar ) /* TrueType GX var handler (ttgxvar.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) */
-/* Type 1 driver components */
+ /* 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 )
+ /* PostScript helper module `psaux' */
+FT_TRACE_DEF( afmparse )
+FT_TRACE_DEF( cffdecode )
+FT_TRACE_DEF( psconv )
FT_TRACE_DEF( psobjs )
+FT_TRACE_DEF( t1decode )
-/* PostScript hinting module `pshinter' */
+ /* PostScript hinting module `pshinter' */
+FT_TRACE_DEF( pshalgo )
FT_TRACE_DEF( pshrec )
-FT_TRACE_DEF( pshalgo1 )
-FT_TRACE_DEF( pshalgo2 )
-/* Type 2 driver components */
+ /* Type 2 driver components */
FT_TRACE_DEF( cffdriver )
FT_TRACE_DEF( cffgload )
FT_TRACE_DEF( cffload )
FT_TRACE_DEF( cffobjs )
FT_TRACE_DEF( cffparse )
-/* Type 42 driver component */
+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 )
+ /* CID driver components */
FT_TRACE_DEF( ciddriver )
FT_TRACE_DEF( cidgload )
FT_TRACE_DEF( cidload )
FT_TRACE_DEF( cidobjs )
FT_TRACE_DEF( cidparse )
-/* Windows fonts component */
+ /* Windows font component */
FT_TRACE_DEF( winfnt )
-/* PCF fonts components */
+ /* PCF font components */
FT_TRACE_DEF( pcfdriver )
FT_TRACE_DEF( pcfread )
-/* BDF fonts component */
+ /* BDF font components */
FT_TRACE_DEF( bdfdriver )
FT_TRACE_DEF( bdflib )
-/* PFR fonts component */
+ /* PFR font component */
FT_TRACE_DEF( pfr )
+ /* OpenType validation components */
+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 )
+FT_TRACE_DEF( otvmodule )
+
+ /* TrueTypeGX/AAT validation components */
+FT_TRACE_DEF( gxvbsln )
+FT_TRACE_DEF( gxvcommon )
+FT_TRACE_DEF( gxvfeat )
+FT_TRACE_DEF( gxvjust )
+FT_TRACE_DEF( gxvkern )
+FT_TRACE_DEF( gxvmodule )
+FT_TRACE_DEF( gxvmort )
+FT_TRACE_DEF( gxvmorx )
+FT_TRACE_DEF( gxvlcar )
+FT_TRACE_DEF( gxvopbd )
+FT_TRACE_DEF( gxvprop )
+FT_TRACE_DEF( gxvtrak )
+
+ /* autofit components */
+FT_TRACE_DEF( afcjk )
+FT_TRACE_DEF( afglobal )
+FT_TRACE_DEF( afhints )
+FT_TRACE_DEF( afmodule )
+FT_TRACE_DEF( aflatin )
+FT_TRACE_DEF( afshaper )
+
+ /* SDF components */
+FT_TRACE_DEF( sdf ) /* signed distance raster for outlines (ftsdf.c) */
+FT_TRACE_DEF( bsdf ) /* signed distance raster for bitmaps (ftbsdf.c) */
/* END */
diff --git a/include/freetype/internal/ftvalid.h b/include/freetype/internal/ftvalid.h
new file mode 100644
index 00000000..a1312f2a
--- /dev/null
+++ b/include/freetype/internal/ftvalid.h
@@ -0,0 +1,160 @@
+/****************************************************************************
+ *
+ * ftvalid.h
+ *
+ * FreeType validation support (specification).
+ *
+ * Copyright (C) 2004-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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_jmpbuf */
+
+#include "compiler-macros.h"
+
+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/include/freetype/internal/internal.h b/include/freetype/internal/internal.h
deleted file mode 100644
index 872f6ac7..00000000
--- a/include/freetype/internal/internal.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/***************************************************************************/
-/* */
-/* internal.h */
-/* */
-/* Internal header files (specification only). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
-
-
- /*************************************************************************/
- /* */
- /* 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_STREAM_H <freetype/internal/ftstream.h>
-#define FT_INTERNAL_MEMORY_H <freetype/internal/ftmemory.h>
-#define FT_INTERNAL_EXTENSION_H <freetype/internal/ftextend.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_EXTEND_H <freetype/internal/ftextend.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_HASH_H <freetype/internal/fthash.h>
-#define FT_INTERNAL_OBJECT_H <freetype/internal/ftobject.h>
-
-#define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h>
-#define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h>
-#define FT_INTERNAL_TYPE42_TYPES_H <freetype/internal/t42types.h>
-#define FT_INTERNAL_CFF_TYPES_H <freetype/internal/cfftypes.h>
-#define FT_INTERNAL_FNT_TYPES_H <freetype/internal/fnttypes.h>
-#define FT_INTERNAL_BDF_TYPES_H <freetype/internal/bdftypes.h>
-#define FT_INTERNAL_PFR_H <freetype/internal/pfr.h>
-
-#define FT_INTERNAL_POSTSCRIPT_NAMES_H <freetype/internal/psnames.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>
-
-
-/* END */
diff --git a/include/freetype/internal/pcftypes.h b/include/freetype/internal/pcftypes.h
deleted file mode 100644
index 2c924d7d..00000000
--- a/include/freetype/internal/pcftypes.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* pcftypes.h
-
- FreeType font driver for pcf fonts
-
- Copyright (C) 2000-2001 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 __PCFTYPES_H__
-#define __PCFTYPES_H__
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-
-FT_BEGIN_HEADER
-
-
- typedef struct PCF_Public_FaceRec_
- {
- FT_FaceRec root;
- FT_StreamRec gzip_stream;
- FT_Stream gzip_source;
-
- char* charset_encoding;
- char* charset_registry;
-
- } PCF_Public_FaceRec, *PCF_Public_Face;
-
-
-FT_END_HEADER
-
-#endif /* __PCFTYPES_H__ */
-
-
-/* END */
diff --git a/include/freetype/internal/pfr.h b/include/freetype/internal/pfr.h
deleted file mode 100644
index cead0781..00000000
--- a/include/freetype/internal/pfr.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef __FT_INTERNAL_PFR_H__
-#define __FT_INTERNAL_PFR_H__
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-FT_BEGIN_HEADER
-
- 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 );
-
- typedef struct FT_PFR_ServiceRec_
- {
- FT_PFR_GetMetricsFunc get_metrics;
- FT_PFR_GetKerningFunc get_kerning;
- FT_PFR_GetAdvanceFunc get_advance;
-
- } FT_PFR_ServiceRec, *FT_PFR_Service;
-
-#define FT_PFR_SERVICE_NAME "pfr"
-
-FT_END_HEADER
-
-#endif /* __FT_INTERNAL_PFR_H__ */
diff --git a/include/freetype/internal/psaux.h b/include/freetype/internal/psaux.h
index e79f83aa..41f481d5 100644
--- a/include/freetype/internal/psaux.h
+++ b/include/freetype/internal/psaux.h
@@ -1,34 +1,55 @@
-/***************************************************************************/
-/* */
-/* psaux.h */
-/* */
-/* Auxiliary functions and data structures related to PostScript fonts */
-/* (specification). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
-
-
-#ifndef __PSAUX_H__
-#define __PSAUX_H__
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_TYPE1_TYPES_H
+/****************************************************************************
+ *
+ * psaux.h
+ *
+ * Auxiliary functions and data structures related to PostScript fonts
+ * (specification).
+ *
+ * Copyright (C) 1996-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/internal/ftobjs.h>
+#include <freetype/internal/t1types.h>
+#include <freetype/internal/fthash.h>
+#include <freetype/internal/tttypes.h>
+#include <freetype/internal/services/svpscmap.h>
+#include <freetype/internal/cfftypes.h>
+#include <freetype/internal/cffotypes.h>
+
FT_BEGIN_HEADER
+ /**************************************************************************
+ *
+ * PostScript modules driver class.
+ */
+ typedef struct PS_DriverRec_
+ {
+ FT_DriverRec root;
+
+ FT_UInt hinting_engine;
+ FT_Bool no_stem_darkening;
+ FT_Int darken_params[8];
+ FT_Int32 random_seed;
+
+ } PS_DriverRec, *PS_Driver;
+
+
/*************************************************************************/
/*************************************************************************/
/***** *****/
@@ -42,23 +63,27 @@ FT_BEGIN_HEADER
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. */
- /* */
+ /**************************************************************************
+ *
+ * @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
@@ -70,10 +95,10 @@ FT_BEGIN_HEADER
(*done)( PS_Table table );
FT_Error
- (*add)( PS_Table table,
- FT_Int index,
- void* object,
- FT_Int length );
+ (*add)( PS_Table table,
+ FT_Int idx,
+ const void* object,
+ FT_UInt length );
void
(*release)( PS_Table table );
@@ -81,49 +106,54 @@ FT_BEGIN_HEADER
} 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. */
- /* */
- /* 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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.
+ *
+ * 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_Long init;
+ FT_ULong init;
FT_Int max_elems;
- FT_Int num_elems;
FT_Byte** elements; /* addresses of table elements */
- FT_Int* lengths; /* lengths of table elements */
+ FT_UInt* lengths; /* lengths of table elements */
FT_Memory memory;
PS_Table_FuncsRec funcs;
@@ -153,6 +183,7 @@ FT_BEGIN_HEADER
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
@@ -177,8 +208,11 @@ FT_BEGIN_HEADER
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,
@@ -193,9 +227,13 @@ FT_BEGIN_HEADER
{
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
@@ -211,90 +249,117 @@ FT_BEGIN_HEADER
/* structure type used to model object fields */
typedef struct T1_FieldRec_
{
+ FT_UInt len; /* field identifier length */
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; /* maximal number of elements for */
+ FT_UInt array_max; /* maximum number of elements for */
/* array */
FT_UInt count_offset; /* offset of element count for */
- /* arrays */
+ /* 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 ) \
- { \
- _ident, T1CODE, _type, \
- 0, \
- FT_FIELD_OFFSET( _fname ), \
- FT_FIELD_SIZE( _fname ), \
- 0, 0 \
+
+
+#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
+ { \
+ sizeof ( _ident ) - 1, \
+ _ident, T1CODE, _type, \
+ NULL, \
+ FT_FIELD_OFFSET( _fname ), \
+ FT_FIELD_SIZE( _fname ), \
+ 0, 0, \
+ _dict \
},
-#define T1_NEW_CALLBACK_FIELD( _ident, _reader ) \
- { \
- _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \
- (T1_Field_ParseFunc)_reader, \
- 0, 0, \
- 0, 0 \
+#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
+ { \
+ sizeof ( _ident ) - 1, \
+ _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \
+ (T1_Field_ParseFunc)_reader, \
+ 0, 0, \
+ 0, 0, \
+ _dict \
},
-#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max ) \
- { \
- _ident, T1CODE, _type, \
- 0, \
- FT_FIELD_OFFSET( _fname ), \
- FT_FIELD_SIZE_DELTA( _fname ), \
- _max, \
- FT_FIELD_OFFSET( num_ ## _fname ) \
+#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
+ { \
+ sizeof ( _ident ) - 1, \
+ _ident, T1CODE, _type, \
+ NULL, \
+ 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 ) \
- { \
- _ident, T1CODE, _type, \
- 0, \
- FT_FIELD_OFFSET( _fname ), \
- FT_FIELD_SIZE_DELTA( _fname ), \
- _max, 0 \
+#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
+ { \
+ sizeof ( _ident ) - 1, \
+ _ident, T1CODE, _type, \
+ NULL, \
+ FT_FIELD_OFFSET( _fname ), \
+ FT_FIELD_SIZE_DELTA( _fname ), \
+ _max, 0, \
+ _dict \
},
-#define T1_FIELD_TYPE_BOOL( _ident, _fname ) \
- T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname )
+#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_NUM( _ident, _fname ) \
- T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname )
+#define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
+ _dict )
-#define T1_FIELD_FIXED( _ident, _fname ) \
- T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname )
+#define T1_FIELD_STRING( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
-#define T1_FIELD_STRING( _ident, _fname ) \
- T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname )
+#define T1_FIELD_KEY( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
-#define T1_FIELD_BBOX( _ident, _fname ) \
- T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname )
+#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 ) \
+#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \
T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
- _fname, _fmax )
+ _fname, _fmax, _dict )
-#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax ) \
+#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \
T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
- _fname, _fmax )
+ _fname, _fmax, _dict )
-#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax ) \
+#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \
T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
- _fname, _fmax )
+ _fname, _fmax, _dict )
-#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax ) \
+#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \
T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
- _fname, _fmax )
+ _fname, _fmax, _dict )
-#define T1_FIELD_CALLBACK( _ident, _name ) \
- T1_NEW_CALLBACK_FIELD( _ident, _name )
+#define T1_FIELD_CALLBACK( _ident, _name, _dict ) \
+ T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
+
+#define T1_FIELD_ZERO { 0, NULL, 0, 0, NULL, 0, 0, 0, 0, 0 }
/*************************************************************************/
@@ -321,13 +386,21 @@ FT_BEGIN_HEADER
void
(*skip_spaces)( PS_Parser parser );
void
- (*skip_alpha)( PS_Parser parser );
+ (*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,
@@ -364,27 +437,33 @@ FT_BEGIN_HEADER
} 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
@@ -401,6 +480,218 @@ FT_BEGIN_HEADER
/*************************************************************************/
/*************************************************************************/
/***** *****/
+ /***** PS BUILDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ typedef struct PS_Builder_ PS_Builder;
+ typedef const struct PS_Builder_FuncsRec_* PS_Builder_Funcs;
+
+ typedef struct PS_Builder_FuncsRec_
+ {
+ void
+ (*init)( PS_Builder* ps_builder,
+ void* builder,
+ FT_Bool is_t1 );
+
+ void
+ (*done)( PS_Builder* builder );
+
+ } PS_Builder_FuncsRec;
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * PS_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 ::
+ * XXX
+ *
+ * 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.
+ *
+ * is_t1 ::
+ * Set if current font type is Type 1.
+ *
+ * funcs ::
+ * An array of function pointers for the builder.
+ */
+ struct PS_Builder_
+ {
+ FT_Memory memory;
+ FT_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;
+ FT_Bool is_t1;
+
+ PS_Builder_FuncsRec funcs;
+
+ };
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PS DECODER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#define PS_MAX_OPERANDS 48
+#define PS_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 */
+
+ /* execution context charstring zone */
+
+ typedef struct PS_Decoder_Zone_
+ {
+ FT_Byte* base;
+ FT_Byte* limit;
+ FT_Byte* cursor;
+
+ } PS_Decoder_Zone;
+
+
+ typedef FT_Error
+ (*CFF_Decoder_Get_Glyph_Callback)( TT_Face face,
+ FT_UInt glyph_index,
+ FT_Byte** pointer,
+ FT_ULong* length );
+
+ typedef void
+ (*CFF_Decoder_Free_Glyph_Callback)( TT_Face face,
+ FT_Byte** pointer,
+ FT_ULong length );
+
+
+ typedef struct PS_Decoder_
+ {
+ PS_Builder builder;
+
+ FT_Fixed stack[PS_MAX_OPERANDS + 1];
+ FT_Fixed* top;
+
+ PS_Decoder_Zone zones[PS_MAX_SUBRS_CALLS + 1];
+ PS_Decoder_Zone* zone;
+
+ FT_Int flex_state;
+ FT_Int num_flex_vectors;
+ FT_Vector flex_vectors[7];
+
+ CFF_Font cff;
+ CFF_SubFont current_subfont; /* for current glyph_index */
+ FT_Generic* cf2_instance;
+
+ FT_Pos* glyph_width;
+ FT_Bool width_only;
+ FT_Int num_hints;
+
+ 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_Decoder_Get_Glyph_Callback get_glyph_callback;
+ CFF_Decoder_Free_Glyph_Callback free_glyph_callback;
+
+ /* Type 1 stuff */
+ FT_Service_PsCMaps psnames; /* for seac */
+
+ FT_Int lenIV; /* internal for sub routine calls */
+ FT_UInt* locals_len; /* array of subrs length (optional) */
+ FT_Hash locals_hash; /* used if `num_subrs' was massaged */
+
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+
+ PS_Blend blend; /* for multiple master support */
+
+ FT_Long* buildchar;
+ FT_UInt len_buildchar;
+
+ } PS_Decoder;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
/***** T1 BUILDER *****/
/***** *****/
/*************************************************************************/
@@ -461,62 +752,81 @@ FT_BEGIN_HEADER
} T1_Builder_FuncsRec;
- /*************************************************************************/
- /* */
- /* <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 :: Maximal number of contours in builder outline. */
- /* */
- /* last :: The last point position. */
- /* */
- /* scale_x :: The horizontal scale (FUnits to sub-pixels). */
- /* */
- /* scale_y :: The vertical scale (FUnits to sub-pixels). */
- /* */
- /* 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. */
- /* */
- /* error :: An error code that is only used to report memory */
- /* allocation problems. */
- /* */
- /* 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. */
- /* */
+ /* 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;
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * 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;
@@ -526,11 +836,6 @@ FT_BEGIN_HEADER
FT_Outline* base;
FT_Outline* current;
- FT_Vector last;
-
- FT_Fixed scale_x;
- FT_Fixed scale_y;
-
FT_Pos pos_x;
FT_Pos pos_y;
@@ -538,12 +843,10 @@ FT_BEGIN_HEADER
FT_Vector advance;
FT_BBox bbox; /* bounding box */
- FT_Bool path_begun;
+ T1_ParseState parse_state;
FT_Bool load_points;
FT_Bool no_recurse;
- FT_Bool shift;
- FT_Error error; /* only used for memory errors */
FT_Bool metrics_only;
void* hints_funcs; /* hinter-specific */
@@ -564,19 +867,19 @@ FT_BEGIN_HEADER
#if 0
- /*************************************************************************/
- /* */
- /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */
- /* calls during glyph loading. */
- /* */
+ /**************************************************************************
+ *
+ * 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. */
- /* */
+ /**************************************************************************
+ *
+ * T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A
+ * minimum of 16 is required.
+ */
#define T1_MAX_CHARSTRINGS_OPERANDS 32
#endif /* 0 */
@@ -616,10 +919,23 @@ FT_BEGIN_HEADER
void
(*done)( T1_Decoder decoder );
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+ FT_Error
+ (*parse_charstrings_old)( T1_Decoder decoder,
+ FT_Byte* base,
+ FT_UInt len );
+#else
+ FT_Error
+ (*parse_metrics)( T1_Decoder decoder,
+ FT_Byte* base,
+ FT_UInt len );
+#endif
+
FT_Error
- (*parse_charstrings)( T1_Decoder decoder,
- FT_Byte* base,
- FT_UInt len );
+ (*parse_charstrings)( PS_Decoder* decoder,
+ FT_Byte* charstring_base,
+ FT_ULong charstring_len );
+
} T1_Decoder_FuncsRec;
@@ -634,14 +950,15 @@ FT_BEGIN_HEADER
T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1];
T1_Decoder_Zone zone;
- PSNames_Service psnames; /* for seac */
+ FT_Service_PsCMaps psnames; /* for seac */
FT_UInt num_glyphs;
FT_Byte** glyph_names;
FT_Int lenIV; /* internal for sub routine calls */
- FT_UInt num_subrs;
+ FT_Int num_subrs;
FT_Byte** subrs;
- FT_Int* subrs_len; /* array of subrs length (optional) */
+ FT_UInt* subrs_len; /* array of subrs length (optional) */
+ FT_Hash subrs_hash; /* used if `num_subrs' was massaged */
FT_Matrix font_matrix;
FT_Vector font_offset;
@@ -652,18 +969,356 @@ FT_BEGIN_HEADER
PS_Blend blend; /* for multiple master support */
- FT_UInt32 hint_flags;
FT_Render_Mode hint_mode;
T1_Decoder_Callback parse_callback;
T1_Decoder_FuncsRec funcs;
+ FT_Long* buildchar;
+ FT_UInt len_buildchar;
+
+ FT_Bool seac;
+
+ FT_Generic cf2_instance;
+
} T1_DecoderRec;
/*************************************************************************/
/*************************************************************************/
/***** *****/
+ /***** CFF BUILDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ typedef struct CFF_Builder_ CFF_Builder;
+
+
+ typedef FT_Error
+ (*CFF_Builder_Check_Points_Func)( CFF_Builder* builder,
+ FT_Int count );
+
+ typedef void
+ (*CFF_Builder_Add_Point_Func)( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y,
+ FT_Byte flag );
+ typedef FT_Error
+ (*CFF_Builder_Add_Point1_Func)( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y );
+ typedef FT_Error
+ (*CFF_Builder_Start_Point_Func)( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y );
+ typedef void
+ (*CFF_Builder_Close_Contour_Func)( CFF_Builder* builder );
+
+ typedef FT_Error
+ (*CFF_Builder_Add_Contour_Func)( CFF_Builder* builder );
+
+ typedef const struct CFF_Builder_FuncsRec_* CFF_Builder_Funcs;
+
+ typedef struct CFF_Builder_FuncsRec_
+ {
+ void
+ (*init)( CFF_Builder* builder,
+ TT_Face face,
+ CFF_Size size,
+ CFF_GlyphSlot glyph,
+ FT_Bool hinting );
+
+ void
+ (*done)( CFF_Builder* builder );
+
+ CFF_Builder_Check_Points_Func check_points;
+ CFF_Builder_Add_Point_Func add_point;
+ CFF_Builder_Add_Point1_Func add_point1;
+ CFF_Builder_Add_Contour_Func add_contour;
+ CFF_Builder_Start_Point_Func start_point;
+ CFF_Builder_Close_Contour_Func close_contour;
+
+ } CFF_Builder_FuncsRec;
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * 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.
+ *
+ * funcs ::
+ * A table of method pointers for this object.
+ */
+ 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_FuncsRec funcs;
+ };
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** CFF DECODER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#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
+
+ /* 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_Get_Glyph_Callback get_glyph_callback;
+ CFF_Decoder_Free_Glyph_Callback free_glyph_callback;
+
+ } CFF_Decoder;
+
+
+ typedef const struct CFF_Decoder_FuncsRec_* CFF_Decoder_Funcs;
+
+ typedef struct CFF_Decoder_FuncsRec_
+ {
+ void
+ (*init)( CFF_Decoder* decoder,
+ TT_Face face,
+ CFF_Size size,
+ CFF_GlyphSlot slot,
+ FT_Bool hinting,
+ FT_Render_Mode hint_mode,
+ CFF_Decoder_Get_Glyph_Callback get_callback,
+ CFF_Decoder_Free_Glyph_Callback free_callback );
+
+ FT_Error
+ (*prepare)( CFF_Decoder* decoder,
+ CFF_Size size,
+ FT_UInt glyph_index );
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+ FT_Error
+ (*parse_charstrings_old)( CFF_Decoder* decoder,
+ FT_Byte* charstring_base,
+ FT_ULong charstring_len,
+ FT_Bool in_dict );
+#endif
+
+ FT_Error
+ (*parse_charstrings)( PS_Decoder* decoder,
+ FT_Byte* charstring_base,
+ FT_ULong charstring_len );
+
+ } CFF_Decoder_FuncsRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** 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 *****/
/***** *****/
/*************************************************************************/
@@ -702,16 +1357,85 @@ FT_BEGIN_HEADER
FT_Offset length,
FT_UShort seed );
+ FT_UInt32
+ (*cff_random)( FT_UInt32 r );
+
+ void
+ (*ps_decoder_init)( PS_Decoder* ps_decoder,
+ void* decoder,
+ FT_Bool is_t1 );
+
+ void
+ (*t1_make_subfont)( FT_Face face,
+ PS_Private priv,
+ CFF_SubFont subfont );
+
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;
+
+ const CFF_Decoder_FuncsRec* cff_decoder_funcs;
+
} PSAux_ServiceRec, *PSAux_Service;
- /* backwards-compatible type definition */
+ /* backward 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__ */
+#endif /* PSAUX_H_ */
/* END */
diff --git a/include/freetype/internal/pshints.h b/include/freetype/internal/pshints.h
index 15571d9b..dba6c730 100644
--- a/include/freetype/internal/pshints.h
+++ b/include/freetype/internal/pshints.h
@@ -1,30 +1,29 @@
-/***************************************************************************/
-/* */
-/* 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, 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. */
-/* */
-/***************************************************************************/
-
-
-#ifndef __PSHINTS_H__
-#define __PSHINTS_H__
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_TYPE1_TABLES_H
+/****************************************************************************
+ *
+ * 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 (C) 2001-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/freetype.h>
+#include <freetype/t1tables.h>
FT_BEGIN_HEADER
@@ -45,7 +44,7 @@ FT_BEGIN_HEADER
T1_Private* private_dict,
PSH_Globals* aglobals );
- typedef FT_Error
+ typedef void
(*PSH_Globals_SetScaleFunc)( PSH_Globals globals,
FT_Fixed x_scale,
FT_Fixed y_scale,
@@ -73,212 +72,234 @@ FT_BEGIN_HEADER
/*************************************************************************/
/*************************************************************************/
- /*************************************************************************/
- /* */
- /* @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 will rewind 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 */
- /* will return 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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. */
- /* */
+ /**************************************************************************
+ *
+ * @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. */
- /* */
+ /**************************************************************************
+ *
+ * @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 integers, 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 will be interpreted as a "ghost" stem, according to */
- /* Type 1 specification. */
- /* */
- /* If the length is -21 (corresponding to a bottom ghost stem), then */
- /* the real stem position is "coords[0]+coords[1]". */
- /* */
+ /**************************************************************************
+ *
+ * @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_Long* 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 integers, 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). */
- /* */
+ (*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_Long* 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. */
- /* */
+ (*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 will be set to indicate that an error occured */
- /* during the recording session. */
- /* */
+ /**************************************************************************
+ *
+ * @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_flags :: Hinter bit flags. */
- /* */
- /* @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. */
- /* */
+ /**************************************************************************
+ *
+ * @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/64 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,
@@ -286,30 +307,37 @@ FT_BEGIN_HEADER
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. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
@@ -331,137 +359,150 @@ FT_BEGIN_HEADER
/*************************************************************************/
/*************************************************************************/
- /*************************************************************************/
- /* */
- /* @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 will rewind 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 */
- /* will return 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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. */
- /* */
+ /**************************************************************************
+ *
+ * @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. */
- /* */
+ /**************************************************************************
+ *
+ * @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. */
- /* */
- /* @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" aray. 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 will be interpreted as a "ghost" stem, according to the */
- /* Type 1 specification. */
- /* */
+ /**************************************************************************
+ *
+ * @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_UInt count,
+ 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/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. */
- /* */
+ /**************************************************************************
+ *
+ * @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,
@@ -469,97 +510,109 @@ FT_BEGIN_HEADER
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/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. */
- /* */
+ /**************************************************************************
+ *
+ * @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 will be set to indicate that an error occured */
- /* during the recording session. */
- /* */
+ /**************************************************************************
+ *
+ * @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_flags :: Hinter bit flags. */
- /* */
- /* @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. */
- /* */
+ /**************************************************************************
+ *
+ * @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/64 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,
@@ -567,30 +620,37 @@ FT_BEGIN_HEADER
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. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
@@ -618,9 +678,22 @@ FT_BEGIN_HEADER
typedef PSHinter_Interface* PSHinter_Service;
+#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_ \
+ };
+
+
FT_END_HEADER
-#endif /* __PSHINTS_H__ */
+#endif /* PSHINTS_H_ */
/* END */
diff --git a/include/freetype/internal/psnames.h b/include/freetype/internal/psnames.h
deleted file mode 100644
index 0f4ec86a..00000000
--- a/include/freetype/internal/psnames.h
+++ /dev/null
@@ -1,241 +0,0 @@
-/***************************************************************************/
-/* */
-/* psnames.h */
-/* */
-/* High-level interface for the `PSNames' module (in charge of */
-/* various functions related to Postscript glyph names conversion). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
-
-
-#ifndef __PSNAMES_H__
-#define __PSNAMES_H__
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-
-FT_BEGIN_HEADER
-
-
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* PS_Unicode_Value_Func */
- /* */
- /* <Description> */
- /* A function used to return the Unicode index corresponding to a */
- /* given glyph name. */
- /* */
- /* <Input> */
- /* glyph_name :: The glyph name. */
- /* */
- /* <Return> */
- /* The Unicode character index resp. the non-Unicode value 0xFFFF if */
- /* the glyph name has no known Unicode meaning. */
- /* */
- /* <Note> */
- /* This function is able to map several different glyph names to the */
- /* same Unicode value, according to the rules defined in the Adobe */
- /* Glyph List table. */
- /* */
- /* This function will not be compiled if the configuration macro */
- /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST is undefined. */
- /* */
- typedef FT_UInt32
- (*PS_Unicode_Value_Func)( const char* glyph_name );
-
-
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* PS_Unicode_Index_Func */
- /* */
- /* <Description> */
- /* A function used to return the glyph index corresponding to a given */
- /* Unicode value. */
- /* */
- /* <Input> */
- /* num_glyphs :: The number of glyphs in the face. */
- /* */
- /* glyph_names :: An array of glyph name pointers. */
- /* */
- /* unicode :: The Unicode value. */
- /* */
- /* <Return> */
- /* The glyph index resp. 0xFFFF if no glyph corresponds to this */
- /* Unicode value. */
- /* */
- /* <Note> */
- /* This function is able to recognize several glyph names per Unicode */
- /* value, according to the Adobe Glyph List. */
- /* */
- /* This function will not be compiled if the configuration macro */
- /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST is undefined. */
- /* */
- typedef FT_UInt
- (*PS_Unicode_Index_Func)( FT_UInt num_glyphs,
- const char** glyph_names,
- FT_ULong unicode );
-
-
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* PS_Macintosh_Name_Func */
- /* */
- /* <Description> */
- /* A function used to return the glyph name corresponding to an Apple */
- /* glyph name index. */
- /* */
- /* <Input> */
- /* name_index :: The index of the Mac name. */
- /* */
- /* <Return> */
- /* The glyph name, or 0 if the index is invalid. */
- /* */
- /* <Note> */
- /* This function will not be compiled if the configuration macro */
- /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES is undefined. */
- /* */
- typedef const char*
- (*PS_Macintosh_Name_Func)( FT_UInt name_index );
-
-
- typedef const char*
- (*PS_Adobe_Std_Strings_Func)( FT_UInt string_index );
-
-
- typedef struct PS_UniMap_
- {
- FT_UInt unicode;
- FT_UInt glyph_index;
-
- } PS_UniMap;
-
-
- /*************************************************************************/
- /* */
- /* <Struct> */
- /* PS_Unicodes */
- /* */
- /* <Description> */
- /* A simple table used to map Unicode values to glyph indices. It is */
- /* built by the PS_Build_Unicodes table according to the glyphs */
- /* present in a font file. */
- /* */
- /* <Fields> */
- /* num_codes :: The number of glyphs in the font that match a given */
- /* Unicode value. */
- /* */
- /* unicodes :: An array of unicode values, sorted in increasing */
- /* order. */
- /* */
- /* gindex :: An array of glyph indices, corresponding to each */
- /* Unicode value. */
- /* */
- /* <Note> */
- /* Use the function PS_Lookup_Unicode() to retrieve the glyph index */
- /* corresponding to a given Unicode character code. */
- /* */
- typedef struct PS_Unicodes_
- {
- FT_UInt num_maps;
- PS_UniMap* maps;
-
- } PS_Unicodes;
-
-
- typedef FT_Error
- (*PS_Build_Unicodes_Func)( FT_Memory memory,
- FT_UInt num_glyphs,
- const char** glyph_names,
- PS_Unicodes* unicodes );
-
- typedef FT_UInt
- (*PS_Lookup_Unicode_Func)( PS_Unicodes* unicodes,
- FT_UInt unicode );
-
- typedef FT_ULong
- (*PS_Next_Unicode_Func)( PS_Unicodes* unicodes,
- FT_ULong unicode );
-
-
- /*************************************************************************/
- /* */
- /* <Struct> */
- /* PSNames_Interface */
- /* */
- /* <Description> */
- /* This structure defines the PSNames interface. */
- /* */
- /* <Fields> */
- /* unicode_value :: A function used to convert a glyph name */
- /* into a Unicode character code. */
- /* */
- /* build_unicodes :: A function which builds up the Unicode */
- /* mapping table. */
- /* */
- /* lookup_unicode :: A function used to return the glyph index */
- /* corresponding to a given Unicode */
- /* character. */
- /* */
- /* macintosh_name :: A function used to return the standard */
- /* Apple glyph Postscript name corresponding */
- /* to a given string index (used by the */
- /* TrueType `post' table). */
- /* */
- /* adobe_std_strings :: A function that returns a pointer to a */
- /* Adobe Standard String for a given SID. */
- /* */
- /* adobe_std_encoding :: A table of 256 unsigned shorts that maps */
- /* character codes in the Adobe Standard */
- /* Encoding to SIDs. */
- /* */
- /* adobe_expert_encoding :: A table of 256 unsigned shorts that maps */
- /* character codes in the Adobe Expert */
- /* Encoding to SIDs. */
- /* */
- /* <Note> */
- /* `unicode_value' and `unicode_index' will be set to 0 if the */
- /* configuration macro FT_CONFIG_OPTION_ADOBE_GLYPH_LIST is */
- /* undefined. */
- /* */
- /* `macintosh_name' will be set to 0 if the configuration macro */
- /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES is undefined. */
- /* */
- typedef struct PSNames_Interface_
- {
- PS_Unicode_Value_Func unicode_value;
- PS_Build_Unicodes_Func build_unicodes;
- PS_Lookup_Unicode_Func lookup_unicode;
- PS_Macintosh_Name_Func macintosh_name;
-
- PS_Adobe_Std_Strings_Func adobe_std_strings;
- const unsigned short* adobe_std_encoding;
- const unsigned short* adobe_expert_encoding;
-
- PS_Next_Unicode_Func next_unicode;
-
- } PSNames_Interface;
-
-
- typedef PSNames_Interface* PSNames_Service;
-
-
-FT_END_HEADER
-
-#endif /* __PSNAMES_H__ */
-
-
-/* END */
diff --git a/include/freetype/internal/services/svbdf.h b/include/freetype/internal/services/svbdf.h
new file mode 100644
index 00000000..89e9c2e5
--- /dev/null
+++ b/include/freetype/internal/services/svbdf.h
@@ -0,0 +1,66 @@
+/****************************************************************************
+ *
+ * svbdf.h
+ *
+ * The FreeType BDF services (specification).
+ *
+ * Copyright (C) 2003-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/ftbdf.h>
+#include <freetype/internal/ftserv.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;
+ };
+
+
+#define FT_DEFINE_SERVICE_BDFRec( class_, \
+ get_charset_id_, \
+ get_property_ ) \
+ static const FT_Service_BDFRec class_ = \
+ { \
+ get_charset_id_, get_property_ \
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* SVBDF_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svcfftl.h b/include/freetype/internal/services/svcfftl.h
new file mode 100644
index 00000000..3cb483c3
--- /dev/null
+++ b/include/freetype/internal/services/svcfftl.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+ *
+ * svcfftl.h
+ *
+ * The FreeType CFF tables loader service (specification).
+ *
+ * Copyright (C) 2017-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 SVCFFTL_H_
+#define SVCFFTL_H_
+
+#include <freetype/internal/ftserv.h>
+#include <freetype/internal/cfftypes.h>
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_CFF_LOAD "cff-load"
+
+
+ typedef FT_UShort
+ (*FT_Get_Standard_Encoding_Func)( FT_UInt charcode );
+
+ typedef FT_Error
+ (*FT_Load_Private_Dict_Func)( CFF_Font font,
+ CFF_SubFont subfont,
+ FT_UInt lenNDV,
+ FT_Fixed* NDV );
+
+ typedef FT_Byte
+ (*FT_FD_Select_Get_Func)( CFF_FDSelect fdselect,
+ FT_UInt glyph_index );
+
+ typedef FT_Bool
+ (*FT_Blend_Check_Vector_Func)( CFF_Blend blend,
+ FT_UInt vsindex,
+ FT_UInt lenNDV,
+ FT_Fixed* NDV );
+
+ typedef FT_Error
+ (*FT_Blend_Build_Vector_Func)( CFF_Blend blend,
+ FT_UInt vsindex,
+ FT_UInt lenNDV,
+ FT_Fixed* NDV );
+
+
+ FT_DEFINE_SERVICE( CFFLoad )
+ {
+ FT_Get_Standard_Encoding_Func get_standard_encoding;
+ FT_Load_Private_Dict_Func load_private_dict;
+ FT_FD_Select_Get_Func fd_select_get;
+ FT_Blend_Check_Vector_Func blend_check_vector;
+ FT_Blend_Build_Vector_Func blend_build_vector;
+ };
+
+
+#define FT_DEFINE_SERVICE_CFFLOADREC( class_, \
+ get_standard_encoding_, \
+ load_private_dict_, \
+ fd_select_get_, \
+ blend_check_vector_, \
+ blend_build_vector_ ) \
+ static const FT_Service_CFFLoadRec class_ = \
+ { \
+ get_standard_encoding_, \
+ load_private_dict_, \
+ fd_select_get_, \
+ blend_check_vector_, \
+ blend_build_vector_ \
+ };
+
+
+FT_END_HEADER
+
+
+#endif
+
+
+/* END */
diff --git a/include/freetype/internal/services/svcid.h b/include/freetype/internal/services/svcid.h
new file mode 100644
index 00000000..8362cb87
--- /dev/null
+++ b/include/freetype/internal/services/svcid.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+ *
+ * svcid.h
+ *
+ * The FreeType CID font services (specification).
+ *
+ * Copyright (C) 2007-2024 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 <freetype/internal/ftserv.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;
+ };
+
+
+#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_ \
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* SVCID_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svfntfmt.h b/include/freetype/internal/services/svfntfmt.h
new file mode 100644
index 00000000..6b837e79
--- /dev/null
+++ b/include/freetype/internal/services/svfntfmt.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+ *
+ * svfntfmt.h
+ *
+ * The FreeType font format service (specification only).
+ *
+ * Copyright (C) 2003-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/internal/ftserv.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/include/freetype/internal/services/svgldict.h b/include/freetype/internal/services/svgldict.h
new file mode 100644
index 00000000..6126ec9a
--- /dev/null
+++ b/include/freetype/internal/services/svgldict.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+ *
+ * svgldict.h
+ *
+ * The FreeType glyph dictionary services (specification).
+ *
+ * Copyright (C) 2003-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/internal/ftserv.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,
+ const FT_String* glyph_name );
+
+
+ FT_DEFINE_SERVICE( GlyphDict )
+ {
+ FT_GlyphDict_GetNameFunc get_name;
+ FT_GlyphDict_NameIndexFunc name_index; /* optional */
+ };
+
+
+#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_, \
+ get_name_, \
+ name_index_ ) \
+ static const FT_Service_GlyphDictRec class_ = \
+ { \
+ get_name_, name_index_ \
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* SVGLDICT_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svgxval.h b/include/freetype/internal/services/svgxval.h
new file mode 100644
index 00000000..29cf5528
--- /dev/null
+++ b/include/freetype/internal/services/svgxval.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+ *
+ * svgxval.h
+ *
+ * FreeType API for validating TrueTypeGX/AAT tables (specification).
+ *
+ * Copyright (C) 2004-2024 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 <freetype/ftgxval.h>
+#include <freetype/internal/ftvalid.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/include/freetype/internal/services/svkern.h b/include/freetype/internal/services/svkern.h
new file mode 100644
index 00000000..ac1bc30c
--- /dev/null
+++ b/include/freetype/internal/services/svkern.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+ *
+ * svkern.h
+ *
+ * The FreeType Kerning service (specification).
+ *
+ * Copyright (C) 2006-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/internal/ftserv.h>
+#include <freetype/tttables.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/include/freetype/internal/services/svmetric.h b/include/freetype/internal/services/svmetric.h
new file mode 100644
index 00000000..8b3563b2
--- /dev/null
+++ b/include/freetype/internal/services/svmetric.h
@@ -0,0 +1,131 @@
+/****************************************************************************
+ *
+ * svmetric.h
+ *
+ * The FreeType services for metrics variations (specification).
+ *
+ * Copyright (C) 2016-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 SVMETRIC_H_
+#define SVMETRIC_H_
+
+#include <freetype/internal/ftserv.h>
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * A service to manage the `HVAR, `MVAR', and `VVAR' OpenType tables.
+ *
+ */
+
+#define FT_SERVICE_ID_METRICS_VARIATIONS "metrics-variations"
+
+
+ /* HVAR */
+
+ typedef FT_Error
+ (*FT_HAdvance_Adjust_Func)( FT_Face face,
+ FT_UInt gindex,
+ FT_Int *avalue );
+
+ typedef FT_Error
+ (*FT_LSB_Adjust_Func)( FT_Face face,
+ FT_UInt gindex,
+ FT_Int *avalue );
+
+ typedef FT_Error
+ (*FT_RSB_Adjust_Func)( FT_Face face,
+ FT_UInt gindex,
+ FT_Int *avalue );
+
+ /* VVAR */
+
+ typedef FT_Error
+ (*FT_VAdvance_Adjust_Func)( FT_Face face,
+ FT_UInt gindex,
+ FT_Int *avalue );
+
+ typedef FT_Error
+ (*FT_TSB_Adjust_Func)( FT_Face face,
+ FT_UInt gindex,
+ FT_Int *avalue );
+
+ typedef FT_Error
+ (*FT_BSB_Adjust_Func)( FT_Face face,
+ FT_UInt gindex,
+ FT_Int *avalue );
+
+ typedef FT_Error
+ (*FT_VOrg_Adjust_Func)( FT_Face face,
+ FT_UInt gindex,
+ FT_Int *avalue );
+
+ /* MVAR */
+
+ typedef void
+ (*FT_Metrics_Adjust_Func)( FT_Face face );
+
+ typedef FT_Error
+ (*FT_Size_Reset_Func)( FT_Size size );
+
+
+ FT_DEFINE_SERVICE( MetricsVariations )
+ {
+ FT_HAdvance_Adjust_Func hadvance_adjust;
+ FT_LSB_Adjust_Func lsb_adjust;
+ FT_RSB_Adjust_Func rsb_adjust;
+
+ FT_VAdvance_Adjust_Func vadvance_adjust;
+ FT_TSB_Adjust_Func tsb_adjust;
+ FT_BSB_Adjust_Func bsb_adjust;
+ FT_VOrg_Adjust_Func vorg_adjust;
+
+ FT_Metrics_Adjust_Func metrics_adjust;
+ FT_Size_Reset_Func size_reset;
+ };
+
+
+#define FT_DEFINE_SERVICE_METRICSVARIATIONSREC( class_, \
+ hadvance_adjust_, \
+ lsb_adjust_, \
+ rsb_adjust_, \
+ vadvance_adjust_, \
+ tsb_adjust_, \
+ bsb_adjust_, \
+ vorg_adjust_, \
+ metrics_adjust_, \
+ size_reset_ ) \
+ static const FT_Service_MetricsVariationsRec class_ = \
+ { \
+ hadvance_adjust_, \
+ lsb_adjust_, \
+ rsb_adjust_, \
+ vadvance_adjust_, \
+ tsb_adjust_, \
+ bsb_adjust_, \
+ vorg_adjust_, \
+ metrics_adjust_, \
+ size_reset_ \
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* SVMETRIC_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svmm.h b/include/freetype/internal/services/svmm.h
new file mode 100644
index 00000000..5288fadf
--- /dev/null
+++ b/include/freetype/internal/services/svmm.h
@@ -0,0 +1,214 @@
+/****************************************************************************
+ *
+ * svmm.h
+ *
+ * The FreeType Multiple Masters and GX var services (specification).
+ *
+ * Copyright (C) 2003-2024 by
+ * David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/ftmm.h>
+#include <freetype/internal/ftserv.h>
+#include <freetype/internal/ftmmtypes.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 );
+
+ /* use return value -1 to indicate that the new coordinates */
+ /* are equal to the current ones; no changes are thus needed */
+ typedef FT_Error
+ (*FT_Set_Var_Design_Func)( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ /* use return value -1 to indicate that the new coordinates */
+ /* are equal to the current ones; no changes are thus needed */
+ typedef FT_Error
+ (*FT_Set_MM_Blend_Func)( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ typedef FT_Error
+ (*FT_Get_Var_Design_Func)( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ typedef FT_Error
+ (*FT_Set_Named_Instance_Func)( FT_Face face,
+ FT_UInt instance_index );
+
+ typedef FT_Error
+ (*FT_Get_Default_Named_Instance_Func)( FT_Face face,
+ FT_UInt *instance_index );
+
+ typedef FT_Error
+ (*FT_Get_MM_Blend_Func)( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ typedef FT_Error
+ (*FT_Get_Var_Blend_Func)( FT_Face face,
+ FT_UInt *num_coords,
+ FT_Fixed* *coords,
+ FT_Fixed* *normalizedcoords,
+ FT_MM_Var* *mm_var );
+
+ typedef void
+ (*FT_Done_Blend_Func)( FT_Face face );
+
+ typedef FT_Error
+ (*FT_Set_MM_WeightVector_Func)( FT_Face face,
+ FT_UInt len,
+ FT_Fixed* weight_vector );
+
+ typedef FT_Error
+ (*FT_Get_MM_WeightVector_Func)( FT_Face face,
+ FT_UInt* len,
+ FT_Fixed* weight_vector );
+
+ typedef void
+ (*FT_Construct_PS_Name_Func)( FT_Face face );
+
+ typedef FT_Error
+ (*FT_Var_Load_Delta_Set_Idx_Map_Func)( FT_Face face,
+ FT_ULong offset,
+ GX_DeltaSetIdxMap map,
+ GX_ItemVarStore itemStore,
+ FT_ULong table_len );
+
+ typedef FT_Error
+ (*FT_Var_Load_Item_Var_Store_Func)( FT_Face face,
+ FT_ULong offset,
+ GX_ItemVarStore itemStore );
+
+ typedef FT_ItemVarDelta
+ (*FT_Var_Get_Item_Delta_Func)( FT_Face face,
+ GX_ItemVarStore itemStore,
+ FT_UInt outerIndex,
+ FT_UInt innerIndex );
+
+ typedef void
+ (*FT_Var_Done_Item_Var_Store_Func)( FT_Face face,
+ GX_ItemVarStore itemStore );
+
+ typedef void
+ (*FT_Var_Done_Delta_Set_Idx_Map_Func)( FT_Face face,
+ GX_DeltaSetIdxMap deltaSetIdxMap );
+
+
+ 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_Blend_Func get_mm_blend;
+ FT_Get_MM_Var_Func get_mm_var;
+ FT_Set_Var_Design_Func set_var_design;
+ FT_Get_Var_Design_Func get_var_design;
+ FT_Set_Named_Instance_Func set_named_instance;
+ FT_Get_Default_Named_Instance_Func get_default_named_instance;
+ FT_Set_MM_WeightVector_Func set_mm_weightvector;
+ FT_Get_MM_WeightVector_Func get_mm_weightvector;
+
+ /* for internal use; only needed for code sharing between modules */
+ FT_Construct_PS_Name_Func construct_ps_name;
+ FT_Var_Load_Delta_Set_Idx_Map_Func load_delta_set_idx_map;
+ FT_Var_Load_Item_Var_Store_Func load_item_var_store;
+ FT_Var_Get_Item_Delta_Func get_item_delta;
+ FT_Var_Done_Item_Var_Store_Func done_item_var_store;
+ FT_Var_Done_Delta_Set_Idx_Map_Func done_delta_set_idx_map;
+ FT_Get_Var_Blend_Func get_var_blend;
+ FT_Done_Blend_Func done_blend;
+ };
+
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \
+ get_mm_, \
+ set_mm_design_, \
+ set_mm_blend_, \
+ get_mm_blend_, \
+ get_mm_var_, \
+ set_var_design_, \
+ get_var_design_, \
+ set_named_instance_, \
+ get_default_named_instance_, \
+ set_mm_weightvector_, \
+ get_mm_weightvector_, \
+ \
+ construct_ps_name_, \
+ load_delta_set_idx_map_, \
+ load_item_var_store_, \
+ get_item_delta_, \
+ done_item_var_store_, \
+ done_delta_set_idx_map_, \
+ get_var_blend_, \
+ done_blend_ ) \
+ static const FT_Service_MultiMastersRec class_ = \
+ { \
+ get_mm_, \
+ set_mm_design_, \
+ set_mm_blend_, \
+ get_mm_blend_, \
+ get_mm_var_, \
+ set_var_design_, \
+ get_var_design_, \
+ set_named_instance_, \
+ get_default_named_instance_, \
+ set_mm_weightvector_, \
+ get_mm_weightvector_, \
+ \
+ construct_ps_name_, \
+ load_delta_set_idx_map_, \
+ load_item_var_store_, \
+ get_item_delta_, \
+ done_item_var_store_, \
+ done_delta_set_idx_map_, \
+ get_var_blend_, \
+ done_blend_ \
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* SVMM_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svotval.h b/include/freetype/internal/services/svotval.h
new file mode 100644
index 00000000..7aea7ec1
--- /dev/null
+++ b/include/freetype/internal/services/svotval.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+ *
+ * svotval.h
+ *
+ * The FreeType OpenType validation service (specification).
+ *
+ * Copyright (C) 2004-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/ftotval.h>
+#include <freetype/internal/ftvalid.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/include/freetype/internal/services/svpfr.h b/include/freetype/internal/services/svpfr.h
new file mode 100644
index 00000000..b2fac6d0
--- /dev/null
+++ b/include/freetype/internal/services/svpfr.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+ *
+ * svpfr.h
+ *
+ * Internal PFR service functions (specification).
+ *
+ * Copyright (C) 2003-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/ftpfr.h>
+#include <freetype/internal/ftserv.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/include/freetype/internal/services/svpostnm.h b/include/freetype/internal/services/svpostnm.h
new file mode 100644
index 00000000..d19f3adc
--- /dev/null
+++ b/include/freetype/internal/services/svpostnm.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+ *
+ * svpostnm.h
+ *
+ * The FreeType PostScript name services (specification).
+ *
+ * Copyright (C) 2003-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/internal/ftserv.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;
+ };
+
+
+#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
+ static const FT_Service_PsFontNameRec class_ = \
+ { \
+ get_ps_font_name_ \
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* SVPOSTNM_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svprop.h b/include/freetype/internal/services/svprop.h
new file mode 100644
index 00000000..ba39c0dd
--- /dev/null
+++ b/include/freetype/internal/services/svprop.h
@@ -0,0 +1,66 @@
+/****************************************************************************
+ *
+ * svprop.h
+ *
+ * The FreeType property service (specification).
+ *
+ * Copyright (C) 2012-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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,
+ FT_Bool value_is_string );
+
+ 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;
+ };
+
+
+#define FT_DEFINE_SERVICE_PROPERTIESREC( class_, \
+ set_property_, \
+ get_property_ ) \
+ static const FT_Service_PropertiesRec class_ = \
+ { \
+ set_property_, \
+ get_property_ \
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* SVPROP_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svpscmap.h b/include/freetype/internal/services/svpscmap.h
new file mode 100644
index 00000000..d4908ee4
--- /dev/null
+++ b/include/freetype/internal/services/svpscmap.h
@@ -0,0 +1,145 @@
+/****************************************************************************
+ *
+ * svpscmap.h
+ *
+ * The FreeType PostScript charmap service (specification).
+ *
+ * Copyright (C) 2003-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/internal/ftobjs.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_UInt
+ (*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;
+ };
+
+
+#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_ \
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* SVPSCMAP_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svpsinfo.h b/include/freetype/internal/services/svpsinfo.h
new file mode 100644
index 00000000..2aadcdd0
--- /dev/null
+++ b/include/freetype/internal/services/svpsinfo.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+ *
+ * svpsinfo.h
+ *
+ * The FreeType PostScript info service (specification).
+ *
+ * Copyright (C) 2003-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/internal/ftserv.h>
+#include <freetype/internal/t1types.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;
+ };
+
+
+#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_ \
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* SVPSINFO_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svsfnt.h b/include/freetype/internal/services/svsfnt.h
new file mode 100644
index 00000000..9e0f4ff2
--- /dev/null
+++ b/include/freetype/internal/services/svsfnt.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+ *
+ * svsfnt.h
+ *
+ * The FreeType SFNT table loading service (specification).
+ *
+ * Copyright (C) 2003-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/internal/ftserv.h>
+#include <freetype/tttables.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;
+ };
+
+
+#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \
+ static const FT_Service_SFNT_TableRec class_ = \
+ { \
+ load_, get_, info_ \
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* SVSFNT_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svttcmap.h b/include/freetype/internal/services/svttcmap.h
new file mode 100644
index 00000000..250886bc
--- /dev/null
+++ b/include/freetype/internal/services/svttcmap.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+ *
+ * svttcmap.h
+ *
+ * The FreeType TrueType/sfnt cmap extra information service.
+ *
+ * Copyright (C) 2003-2024 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 <freetype/internal/ftserv.h>
+#include <freetype/tttables.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.6 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), 13~(last
+ * resort font), 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;
+ };
+
+
+#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ ) \
+ static const FT_Service_TTCMapsRec class_ = \
+ { \
+ get_cmap_info_ \
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* SVTTCMAP_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svtteng.h b/include/freetype/internal/services/svtteng.h
new file mode 100644
index 00000000..14967529
--- /dev/null
+++ b/include/freetype/internal/services/svtteng.h
@@ -0,0 +1,53 @@
+/****************************************************************************
+ *
+ * svtteng.h
+ *
+ * The FreeType TrueType engine query service (specification).
+ *
+ * Copyright (C) 2006-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/internal/ftserv.h>
+#include <freetype/ftmodapi.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/include/freetype/internal/services/svttglyf.h b/include/freetype/internal/services/svttglyf.h
new file mode 100644
index 00000000..f190b398
--- /dev/null
+++ b/include/freetype/internal/services/svttglyf.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+ *
+ * svttglyf.h
+ *
+ * The FreeType TrueType glyph service.
+ *
+ * Copyright (C) 2007-2024 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 <freetype/internal/ftserv.h>
+#include <freetype/tttables.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;
+ };
+
+
+#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ ) \
+ static const FT_Service_TTGlyfRec class_ = \
+ { \
+ get_location_ \
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* SVTTGLYF_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svwinfnt.h b/include/freetype/internal/services/svwinfnt.h
new file mode 100644
index 00000000..49f3fb7f
--- /dev/null
+++ b/include/freetype/internal/services/svwinfnt.h
@@ -0,0 +1,50 @@
+/****************************************************************************
+ *
+ * svwinfnt.h
+ *
+ * The FreeType Windows FNT/FONT service (specification).
+ *
+ * Copyright (C) 2003-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/internal/ftserv.h>
+#include <freetype/ftwinfnt.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/include/freetype/internal/sfnt.h b/include/freetype/internal/sfnt.h
index 89e91909..35e4e73a 100644
--- a/include/freetype/internal/sfnt.h
+++ b/include/freetype/internal/sfnt.h
@@ -1,68 +1,73 @@
-/***************************************************************************/
-/* */
-/* sfnt.h */
-/* */
-/* High-level `sfnt' driver interface (specification). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
+/****************************************************************************
+ *
+ * sfnt.h
+ *
+ * High-level 'sfnt' driver interface (specification).
+ *
+ * Copyright (C) 1996-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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__
+#ifndef SFNT_H_
+#define SFNT_H_
-#include <ft2build.h>
-#include FT_INTERNAL_DRIVER_H
-#include FT_INTERNAL_TRUETYPE_TYPES_H
+#include <freetype/internal/ftdrv.h>
+#include <freetype/internal/tttypes.h>
+#include <freetype/internal/wofftypes.h>
FT_BEGIN_HEADER
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* TT_Init_Face_Func */
- /* */
- /* <Description> */
- /* First part of the SFNT face object initialization. This will find */
- /* 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. */
- /* */
- /* 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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,
@@ -71,34 +76,40 @@ FT_BEGIN_HEADER
FT_Parameter* params );
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* TT_Load_Face_Func */
- /* */
- /* <Description> */
- /* Second part of the SFNT face object initialization. This will */
- /* load 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. */
- /* */
- /* 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(). */
- /* */
+ /**************************************************************************
+ *
+ * @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,
@@ -107,136 +118,64 @@ FT_BEGIN_HEADER
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. */
- /* */
+ /**************************************************************************
+ *
+ * @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 );
- typedef FT_Module_Interface
- (*SFNT_Get_Interface_Func)( FT_Module module,
- const char* func_interface );
-
-
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* TT_Load_SFNT_HeaderRec_Func */
- /* */
- /* <Description> */
- /* Loads the header of a SFNT font file. Supports collections. */
- /* */
- /* <Input> */
- /* face :: A handle to the target face object. */
- /* */
- /* stream :: The input stream. */
- /* */
- /* face_index :: The index of the TrueType font, if we are opening a */
- /* collection. */
- /* */
- /* <Output> */
- /* sfnt :: The SFNT header. */
- /* */
- /* <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'. */
- /* */
- /* This function checks that the header is valid by looking at the */
- /* values of `search_range', `entry_selector', and `range_shift'. */
- /* */
- typedef FT_Error
- (*TT_Load_SFNT_HeaderRec_Func)( TT_Face face,
- FT_Stream stream,
- FT_Long face_index,
- SFNT_Header sfnt );
-
-
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* TT_Load_Directory_Func */
- /* */
- /* <Description> */
- /* Loads the table directory into a face object. */
- /* */
- /* <Input> */
- /* face :: A handle to the target face object. */
- /* */
- /* stream :: The input stream. */
- /* */
- /* sfnt :: The SFNT header. */
- /* */
- /* <Return> */
- /* FreeType error code. 0 means success. */
- /* */
- /* <Note> */
- /* The stream cursor must be on the first byte after the 4-byte font */
- /* format tag. This is the case just after a call to */
- /* TT_Load_Format_Tag(). */
- /* */
- typedef FT_Error
- (*TT_Load_Directory_Func)( TT_Face face,
- FT_Stream stream,
- SFNT_Header sfnt );
-
-
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* TT_Load_Any_Func */
- /* */
- /* <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> */
- /* TrueType error code. 0 means success. */
- /* */
+ /**************************************************************************
+ *
+ * @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,
@@ -245,38 +184,123 @@ FT_BEGIN_HEADER
FT_ULong* length );
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* TT_Load_SBit_Image_Func */
- /* */
- /* <Description> */
- /* Loads a given glyph sbit image from the font resource. This also */
- /* returns its metrics. */
- /* */
- /* <Input> */
- /* face :: The target face object. */
- /* */
- /* x_ppem :: The horizontal resolution in points per EM. */
- /* */
- /* y_ppem :: The vertical resolution in points per EM. */
- /* */
- /* glyph_index :: The current glyph index. */
- /* */
- /* 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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,
@@ -287,237 +311,675 @@ FT_BEGIN_HEADER
TT_SBit_MetricsRec *ametrics );
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* TT_Set_SBit_Strike_Func */
- /* */
- /* <Description> */
- /* Selects an sbit strike for given horizontal and vertical ppem */
- /* values. */
- /* */
- /* <Input> */
- /* face :: The target face object. */
- /* */
- /* x_ppem :: The horizontal resolution in points per EM. */
- /* */
- /* y_ppem :: The vertical resolution in points per EM. */
- /* */
- /* <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. */
- /* */
+ /**************************************************************************
+ *
+ * @functype:
+ * TT_Load_Svg_Doc_Func
+ *
+ * @description:
+ * Scan the SVG document list to find the document containing the glyph
+ * that has the ID 'glyph*XXX*', where *XXX* is the value of
+ * `glyph_index` as a decimal integer.
+ *
+ * @inout:
+ * glyph ::
+ * The glyph slot from which pointers to the SVG document list is to be
+ * grabbed. The results are stored back in the slot.
+ *
+ * @input:
+ * glyph_index ::
+ * The index of the glyph that is to be looked up.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ */
+ typedef FT_Error
+ (*TT_Load_Svg_Doc_Func)( FT_GlyphSlot glyph,
+ FT_UInt glyph_index );
+
+
+ /**************************************************************************
+ *
+ * @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_Set_SBit_Strike_Func)( TT_Face face,
- FT_Int x_ppem,
- FT_Int y_ppem,
- FT_ULong *astrike_index );
-
-
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* TT_Get_PS_Name_Func */
- /* */
- /* <Description> */
- /* Gets 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. */
- /* */
+ (*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> */
- /* Loads the horizontal or vertical header in a face object. */
- /* */
- /* <Input> */
- /* face :: A handle to the target face object. */
- /* */
- /* stream :: The input stream. */
- /* */
- /* vertical :: A boolean flag. If set, load vertical metrics. */
- /* */
- /* <Return> */
- /* FreeType error code. 0 means success. */
- /* */
+ /**************************************************************************
+ *
+ * @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_CharMap_Load_Func */
- /* */
- /* <Description> */
- /* Loads a given TrueType character map into memory. */
- /* */
- /* <Input> */
- /* face :: A handle to the parent face object. */
- /* */
- /* stream :: A handle to the current stream object. */
- /* */
- /* <InOut> */
- /* cmap :: A pointer to a cmap object. */
- /* */
- /* <Return> */
- /* FreeType error code. 0 means success. */
- /* */
- /* <Note> */
- /* The function assumes that the stream is already in use (i.e., */
- /* opened). In case of error, all partially allocated tables are */
- /* released. */
- /* */
+ /**************************************************************************
+ *
+ * @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_Set_Palette_Func
+ *
+ * @description:
+ * Load the colors into `face->palette` for a given palette index.
+ *
+ * @input:
+ * face ::
+ * The target face object.
+ *
+ * idx ::
+ * The palette index.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ */
+ typedef FT_Error
+ (*TT_Set_Palette_Func)( TT_Face face,
+ FT_UInt idx );
+
+
+ /**************************************************************************
+ *
+ * @functype:
+ * TT_Get_Colr_Layer_Func
+ *
+ * @description:
+ * Iteratively get the color layer data of a given glyph index.
+ *
+ * @input:
+ * face ::
+ * The target face object.
+ *
+ * base_glyph ::
+ * The glyph index the colored glyph layers are associated with.
+ *
+ * @inout:
+ * iterator ::
+ * An @FT_LayerIterator object. For the first call you should set
+ * `iterator->p` to `NULL`. For all following calls, simply use the
+ * same object again.
+ *
+ * @output:
+ * aglyph_index ::
+ * The glyph index of the current layer.
+ *
+ * acolor_index ::
+ * The color index into the font face's color palette of the current
+ * layer. The value 0xFFFF is special; it doesn't reference a palette
+ * entry but indicates that the text foreground color should be used
+ * instead (to be set up by the application outside of FreeType).
+ *
+ * @return:
+ * Value~1 if everything is OK. If there are no more layers (or if there
+ * are no layers at all), value~0 gets returned. In case of an error,
+ * value~0 is returned also.
+ */
+ typedef FT_Bool
+ (*TT_Get_Colr_Layer_Func)( TT_Face face,
+ FT_UInt base_glyph,
+ FT_UInt *aglyph_index,
+ FT_UInt *acolor_index,
+ FT_LayerIterator* iterator );
+
+
+ /**************************************************************************
+ *
+ * @functype:
+ * TT_Get_Color_Glyph_Paint_Func
+ *
+ * @description:
+ * Find the root @FT_OpaquePaint object for a given glyph ID.
+ *
+ * @input:
+ * face ::
+ * The target face object.
+ *
+ * base_glyph ::
+ * The glyph index the colored glyph layers are associated with.
+ *
+ * @output:
+ * paint ::
+ * The root @FT_OpaquePaint object.
+ *
+ * @return:
+ * Value~1 if everything is OK. If no color glyph is found, or the root
+ * paint could not be retrieved, value~0 gets returned. In case of an
+ * error, value~0 is returned also.
+ */
+ typedef FT_Bool
+ ( *TT_Get_Color_Glyph_Paint_Func )( TT_Face face,
+ FT_UInt base_glyph,
+ FT_Color_Root_Transform root_transform,
+ FT_OpaquePaint *paint );
+
+
+ /**************************************************************************
+ *
+ * @functype:
+ * TT_Get_Color_Glyph_ClipBox_Func
+ *
+ * @description:
+ * Search for a 'COLR' v1 clip box for the specified `base_glyph` and
+ * fill the `clip_box` parameter with the 'COLR' v1 'ClipBox' information
+ * if one is found.
+ *
+ * @input:
+ * face ::
+ * A handle to the parent face object.
+ *
+ * base_glyph ::
+ * The glyph index for which to retrieve the clip box.
+ *
+ * @output:
+ * clip_box ::
+ * The clip box for the requested `base_glyph` if one is found. The
+ * clip box is computed taking scale and transformations configured on
+ * the @FT_Face into account. @FT_ClipBox contains @FT_Vector values
+ * in 26.6 format.
+ *
+ * @note:
+ * To retrieve the clip box in font units, reset scale to units-per-em
+ * and remove transforms configured using @FT_Set_Transform.
+ *
+ * @return:
+ * Value~1 if a ClipBox is found. If no clip box is found or an
+ * error occured, value~0 is returned.
+ */
+ typedef FT_Bool
+ ( *TT_Get_Color_Glyph_ClipBox_Func )( TT_Face face,
+ FT_UInt base_glyph,
+ FT_ClipBox* clip_box );
+
+
+ /**************************************************************************
+ *
+ * @functype:
+ * TT_Get_Paint_Layers_Func
+ *
+ * @description:
+ * Access the layers of a `PaintColrLayers` table.
+ *
+ * @input:
+ * face ::
+ * The target face object.
+ *
+ * @inout:
+ * iterator ::
+ * The @FT_LayerIterator from an @FT_PaintColrLayers object, for which
+ * the layers are to be retrieved. The internal state of the iterator
+ * is incremented after one call to this function for retrieving one
+ * layer.
+ *
+ * @output:
+ * paint ::
+ * The root @FT_OpaquePaint object referencing the actual paint table.
+ *
+ * @return:
+ * Value~1 if everything is OK. Value~0 gets returned when the paint
+ * object can not be retrieved or any other error occurs.
+ */
+ typedef FT_Bool
+ ( *TT_Get_Paint_Layers_Func )( TT_Face face,
+ FT_LayerIterator* iterator,
+ FT_OpaquePaint *paint );
+
+
+ /**************************************************************************
+ *
+ * @functype:
+ * TT_Get_Colorline_Stops_Func
+ *
+ * @description:
+ * Get the gradient and solid fill information for a given glyph.
+ *
+ * @input:
+ * face ::
+ * The target face object.
+ *
+ * @inout:
+ * iterator ::
+ * An @FT_ColorStopIterator object. For the first call you should set
+ * `iterator->p` to `NULL`. For all following calls, simply use the
+ * same object again.
+ *
+ * @output:
+ * color_stop ::
+ * Color index and alpha value for the retrieved color stop.
+ *
+ * @return:
+ * Value~1 if everything is OK. If there are no more color stops,
+ * value~0 gets returned. In case of an error, value~0 is returned
+ * also.
+ */
+ typedef FT_Bool
+ ( *TT_Get_Colorline_Stops_Func )( TT_Face face,
+ FT_ColorStop *color_stop,
+ FT_ColorStopIterator* iterator );
+
+
+ /**************************************************************************
+ *
+ * @functype:
+ * TT_Get_Paint_Func
+ *
+ * @description:
+ * Get the paint details for a given @FT_OpaquePaint object.
+ *
+ * @input:
+ * face ::
+ * The target face object.
+ *
+ * opaque_paint ::
+ * The @FT_OpaquePaint object.
+ *
+ * @output:
+ * paint ::
+ * An @FT_COLR_Paint object holding the details on `opaque_paint`.
+ *
+ * @return:
+ * Value~1 if everything is OK. Value~0 if no details can be found for
+ * this paint or any other error occured.
+ */
+ typedef FT_Bool
+ ( *TT_Get_Paint_Func )( TT_Face face,
+ FT_OpaquePaint opaque_paint,
+ FT_COLR_Paint *paint );
+
+
+ /**************************************************************************
+ *
+ * @functype:
+ * TT_Blend_Colr_Func
+ *
+ * @description:
+ * Blend the bitmap in `new_glyph` into `base_glyph` using the color
+ * specified by `color_index`. If `color_index` is 0xFFFF, use
+ * `face->foreground_color` if `face->have_foreground_color` is set.
+ * Otherwise check `face->palette_data.palette_flags`: If present and
+ * @FT_PALETTE_FOR_DARK_BACKGROUND is set, use BGRA value 0xFFFFFFFF
+ * (white opaque). Otherwise use BGRA value 0x000000FF (black opaque).
+ *
+ * @input:
+ * face ::
+ * The target face object.
+ *
+ * color_index ::
+ * Color index from the COLR table.
+ *
+ * base_glyph ::
+ * Slot for bitmap to be merged into. The underlying bitmap may get
+ * reallocated.
+ *
+ * new_glyph ::
+ * Slot to be incooperated into `base_glyph`.
+ *
+ * @return:
+ * FreeType error code. 0 means success. Returns an error if
+ * color_index is invalid or reallocation fails.
+ */
typedef FT_Error
- (*TT_CharMap_Load_Func)( TT_Face face,
- TT_CMapTable cmap,
- FT_Stream input );
-
-
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* TT_CharMap_Free_Func */
- /* */
- /* <Description> */
- /* Destroys a character mapping table. */
- /* */
- /* <Input> */
- /* face :: A handle to the parent face object. */
- /* */
- /* cmap :: A handle to a cmap object. */
- /* */
- /* <Return> */
- /* FreeType error code. 0 means success. */
- /* */
+ (*TT_Blend_Colr_Func)( TT_Face face,
+ FT_UInt color_index,
+ FT_GlyphSlot base_glyph,
+ FT_GlyphSlot new_glyph );
+
+
+ /**************************************************************************
+ *
+ * @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_CharMap_Free_Func)( TT_Face face,
- TT_CMapTable cmap );
-
-
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* TT_Load_Table_Func */
- /* */
- /* <Description> */
- /* Loads 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 will use `face->goto_table' to seek the stream to */
- /* the start of the table. */
- /* */
+ (*TT_Get_Name_Func)( TT_Face face,
+ FT_UShort nameid,
+ FT_String** name );
+
+
+ /**************************************************************************
+ *
+ * @functype:
+ * TT_Get_Name_ID_Func
+ *
+ * @description:
+ * Search whether an ENGLISH version for a given name ID is in the 'name'
+ * table.
+ *
+ * @input:
+ * face ::
+ * A handle to the source face object.
+ *
+ * nameid ::
+ * The name id of the name record to return.
+ *
+ * @output:
+ * win ::
+ * If non-negative, an index into the 'name' table with the
+ * corresponding (3,1) or (3,0) Windows entry.
+ *
+ * apple ::
+ * If non-negative, an index into the 'name' table with the
+ * corresponding (1,0) Apple entry.
+ *
+ * @return:
+ * 1 if there is either a win or apple entry (or both), 0 otheriwse.
+ */
+ typedef FT_Bool
+ (*TT_Get_Name_ID_Func)( TT_Face face,
+ FT_UShort nameid,
+ FT_Int *win,
+ FT_Int *apple );
+
+
+ /**************************************************************************
+ *
+ * @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> */
- /* Frees a given TrueType table. */
- /* */
- /* <Input> */
- /* face :: A handle to the target face object. */
- /* */
+ /**************************************************************************
+ *
+ * @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 );
- /*************************************************************************/
- /* */
- /* <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. */
- /* */
+ /*
+ * @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_Loader_GotoTableFunc goto_table;
- TT_Init_Face_Func init_face;
- TT_Load_Face_Func load_face;
- TT_Done_Face_Func done_face;
- SFNT_Get_Interface_Func get_interface;
+ 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;
- TT_Load_SFNT_HeaderRec_Func load_sfnt_header;
- TT_Load_Directory_Func load_directory;
+ 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_header;
- TT_Load_Metrics_Func load_metrics;
- TT_Load_Table_Func load_charmaps;
- TT_Load_Table_Func load_max_profile;
- TT_Load_Table_Func load_os2;
- TT_Load_Table_Func load_psnames;
+ 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_names;
- TT_Free_Table_Func free_names;
+ TT_Load_Table_Func load_name;
+ TT_Free_Table_Func free_name;
- /* optional tables */
- TT_Load_Table_Func load_hdmx;
- TT_Free_Table_Func free_hdmx;
+ /* this field was called `load_kerning' up to version 2.1.10 */
+ TT_Load_Table_Func load_kern;
- TT_Load_Table_Func load_kerning;
- TT_Load_Table_Func load_gasp;
- TT_Load_Table_Func load_pclt;
+ TT_Load_Table_Func load_gpos;
+ TT_Load_Table_Func load_gasp;
+ TT_Load_Table_Func load_pclt;
- /* see `ttload.h' */
- TT_Load_Table_Func load_bitmap_header;
+ /* see `ttload.h'; this field was called `load_bitmap_header' up to */
+ /* version 2.1.10 */
+ TT_Load_Table_Func load_bhed;
- /* see `ttsbit.h' */
- TT_Set_SBit_Strike_Func set_sbit_strike;
- TT_Load_Table_Func load_sbits;
- TT_Load_SBit_Image_Func load_sbit_image;
- TT_Free_Table_Func free_sbits;
+ TT_Load_SBit_Image_Func load_sbit_image;
/* see `ttpost.h' */
- TT_Get_PS_Name_Func get_psname;
- TT_Free_Table_Func free_psnames;
+ 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 */
+
+ TT_Face_GetKerningFunc get_gpos_kerning;
+
+ /* 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;
- /* see `ttcmap.h' */
- TT_CharMap_Load_Func load_charmap;
- TT_CharMap_Free_Func free_charmap;
+ TT_Set_SBit_Strike_Func set_sbit_strike;
+ TT_Load_Strike_Metrics_Func load_strike_metrics;
+
+ TT_Load_Table_Func load_cpal;
+ TT_Load_Table_Func load_colr;
+ TT_Free_Table_Func free_cpal;
+ TT_Free_Table_Func free_colr;
+ TT_Set_Palette_Func set_palette;
+ TT_Get_Colr_Layer_Func get_colr_layer;
+ TT_Get_Color_Glyph_Paint_Func get_colr_glyph_paint;
+ TT_Get_Color_Glyph_ClipBox_Func get_color_glyph_clipbox;
+ TT_Get_Paint_Layers_Func get_paint_layers;
+ TT_Get_Colorline_Stops_Func get_colorline_stops;
+ TT_Get_Paint_Func get_paint;
+ TT_Blend_Colr_Func colr_blend;
+
+ TT_Get_Metrics_Func get_metrics;
+
+ TT_Get_Name_Func get_name;
+ TT_Get_Name_ID_Func get_name_id;
+
+ /* OpenType SVG Support */
+ TT_Load_Table_Func load_svg;
+ TT_Free_Table_Func free_svg;
+ TT_Load_Svg_Doc_Func load_svg_doc;
} SFNT_Interface;
@@ -526,9 +988,112 @@ FT_BEGIN_HEADER
typedef SFNT_Interface* SFNT_Service;
+#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_gpos_, \
+ load_gasp_, \
+ load_pclt_, \
+ load_bhed_, \
+ load_sbit_image_, \
+ get_psname_, \
+ free_psnames_, \
+ get_kerning_, \
+ get_gpos_kerning_, \
+ load_font_dir_, \
+ load_hmtx_, \
+ load_eblc_, \
+ free_eblc_, \
+ set_sbit_strike_, \
+ load_strike_metrics_, \
+ load_cpal_, \
+ load_colr_, \
+ free_cpal_, \
+ free_colr_, \
+ set_palette_, \
+ get_colr_layer_, \
+ get_colr_glyph_paint_, \
+ get_color_glyph_clipbox, \
+ get_paint_layers_, \
+ get_colorline_stops_, \
+ get_paint_, \
+ colr_blend_, \
+ get_metrics_, \
+ get_name_, \
+ get_name_id_, \
+ load_svg_, \
+ free_svg_, \
+ load_svg_doc_ ) \
+ 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_gpos_, \
+ load_gasp_, \
+ load_pclt_, \
+ load_bhed_, \
+ load_sbit_image_, \
+ get_psname_, \
+ free_psnames_, \
+ get_kerning_, \
+ get_gpos_kerning_, \
+ load_font_dir_, \
+ load_hmtx_, \
+ load_eblc_, \
+ free_eblc_, \
+ set_sbit_strike_, \
+ load_strike_metrics_, \
+ load_cpal_, \
+ load_colr_, \
+ free_cpal_, \
+ free_colr_, \
+ set_palette_, \
+ get_colr_layer_, \
+ get_colr_glyph_paint_, \
+ get_color_glyph_clipbox, \
+ get_paint_layers_, \
+ get_colorline_stops_, \
+ get_paint_, \
+ colr_blend_, \
+ get_metrics_, \
+ get_name_, \
+ get_name_id_, \
+ load_svg_, \
+ free_svg_, \
+ load_svg_doc_ \
+ };
+
+
FT_END_HEADER
-#endif /* __SFNT_H__ */
+#endif /* SFNT_H_ */
/* END */
diff --git a/include/freetype/internal/svginterface.h b/include/freetype/internal/svginterface.h
new file mode 100644
index 00000000..68c99efb
--- /dev/null
+++ b/include/freetype/internal/svginterface.h
@@ -0,0 +1,46 @@
+/****************************************************************************
+ *
+ * svginterface.h
+ *
+ * Interface of ot-svg module (specification only).
+ *
+ * Copyright (C) 2022-2024 by
+ * David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 SVGINTERFACE_H_
+#define SVGINTERFACE_H_
+
+#include <ft2build.h>
+#include <freetype/otsvg.h>
+
+
+FT_BEGIN_HEADER
+
+ typedef FT_Error
+ (*Preset_Bitmap_Func)( FT_Module module,
+ FT_GlyphSlot slot,
+ FT_Bool cache );
+
+ typedef struct SVG_Interface_
+ {
+ Preset_Bitmap_Func preset_slot;
+
+ } SVG_Interface;
+
+ typedef SVG_Interface* SVG_Service;
+
+FT_END_HEADER
+
+#endif /* SVGINTERFACE_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/t1types.h b/include/freetype/internal/t1types.h
index 26253946..be63e4dc 100644
--- a/include/freetype/internal/t1types.h
+++ b/include/freetype/internal/t1types.h
@@ -1,30 +1,31 @@
-/***************************************************************************/
-/* */
-/* t1types.h */
-/* */
-/* Basic Type1/Type2 type definitions and interface (specification */
-/* only). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
-
-
-#ifndef __T1TYPES_H__
-#define __T1TYPES_H__
-
-
-#include <ft2build.h>
-#include FT_TYPE1_TABLES_H
-#include FT_INTERNAL_POSTSCRIPT_NAMES_H
-#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+/****************************************************************************
+ *
+ * t1types.h
+ *
+ * Basic Type1/Type2 type definitions and interface (specification
+ * only).
+ *
+ * Copyright (C) 1996-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/t1tables.h>
+#include <freetype/internal/pshints.h>
+#include <freetype/internal/ftserv.h>
+#include <freetype/internal/fthash.h>
+#include <freetype/internal/services/svpscmap.h>
FT_BEGIN_HEADER
@@ -43,54 +44,61 @@ FT_BEGIN_HEADER
/*************************************************************************/
- /*************************************************************************/
- /* */
- /* <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. */
- /* */
- /* char_index :: An array of corresponding glyph indices. */
- /* */
- /* char_name :: An array of corresponding glyph names. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
+ FT_UShort* char_index;
+ const FT_String** char_name;
} T1_EncodingRec, *T1_Encoding;
- typedef enum T1_EncodingType_
+ /* 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_
{
- T1_ENCODING_TYPE_NONE = 0,
- T1_ENCODING_TYPE_ARRAY,
- T1_ENCODING_TYPE_STANDARD,
- T1_ENCODING_TYPE_ISOLATIN1,
- T1_ENCODING_TYPE_EXPERT
+ FT_UShort fs_type;
- } T1_EncodingType;
+ } PS_FontExtraRec;
typedef struct T1_FontRec_
{
- PS_FontInfoRec font_info; /* font info dictionary */
- PS_PrivateRec private_dict; /* private dictionary */
- FT_String* font_name; /* top-level dictionary */
+ 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;
@@ -101,12 +109,13 @@ FT_BEGIN_HEADER
FT_Int num_subrs;
FT_Byte** subrs;
- FT_Int* subrs_len;
+ FT_UInt* subrs_len;
+ FT_Hash subrs_hash;
FT_Int num_glyphs;
FT_String** glyph_names; /* array of glyph names */
FT_Byte** charstrings; /* array of glyph charstrings */
- FT_Int* charstrings_len;
+ FT_UInt* charstrings_len;
FT_Byte paint_type;
FT_Byte font_type;
@@ -115,14 +124,14 @@ FT_BEGIN_HEADER
FT_BBox font_bbox;
FT_Long font_id;
- FT_Int stroke_width;
+ FT_Fixed stroke_width;
} T1_FontRec, *T1_Font;
typedef struct CID_SubrsRec_
{
- FT_UInt num_subrs;
+ FT_Int num_subrs;
FT_Byte** code;
} CID_SubrsRec, *CID_Subrs;
@@ -133,25 +142,59 @@ FT_BEGIN_HEADER
/*************************************************************************/
/*** ***/
/*** ***/
- /*** ORIGINAL T1_FACE CLASS DEFINITION ***/
+ /*** 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; /* optional, mind the zero */
+ FT_Fixed Descender; /* optional, mind the zero */
+ 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 ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
/*************************************************************************/
- /* */
- /* 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, TT_GlyphSlot, and TT_CharMap */
- /* are not shared between font drivers, and are thus defined normally in */
- /* `ttobjs.h'. */
- /* */
/*************************************************************************/
+
typedef struct T1_FaceRec_* T1_Face;
typedef struct CID_FaceRec_* CID_Face;
@@ -165,12 +208,22 @@ FT_BEGIN_HEADER
const void* afm_data;
FT_CharMapRec charmaprecs[2];
FT_CharMap charmaps[2];
- PS_Unicodes unicode_map;
/* support for Multiple Masters fonts */
PS_Blend blend;
-
- /* since FT 2.1 - interface to PostScript hinter */
+
+ /* 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;
@@ -182,18 +235,25 @@ FT_BEGIN_HEADER
void* psnames;
void* psaux;
CID_FaceInfoRec cid;
+ PS_FontExtraRec font_extra;
+#if 0
void* afm_data;
+#endif
CID_Subrs subrs;
-
- /* since FT 2.1 - interface to PostScript hinter */
+
+ /* 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__ */
+#endif /* T1TYPES_H_ */
/* END */
diff --git a/include/freetype/internal/t42types.h b/include/freetype/internal/t42types.h
deleted file mode 100644
index 7562252e..00000000
--- a/include/freetype/internal/t42types.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************/
-/* */
-/* t42types.h */
-/* */
-/* Type 42 font data types (specification only). */
-/* */
-/* Copyright 2002 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 <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_TYPE1_TABLES_H
-#include FT_INTERNAL_TYPE1_TYPES_H
-#include FT_INTERNAL_POSTSCRIPT_NAMES_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;
- const void* afm_data;
- FT_Byte* ttf_data;
- FT_ULong ttf_size;
- FT_Face ttf_face;
- FT_CharMapRec charmaprecs[2];
- FT_CharMap charmaps[2];
- PS_Unicodes unicode_map;
-
- } T42_FaceRec, *T42_Face;
-
-
-FT_END_HEADER
-
-#endif /* __T1TYPES_H__ */
-
-
-/* END */
diff --git a/include/freetype/internal/tttypes.h b/include/freetype/internal/tttypes.h
index 4097ac8f..44a0165c 100644
--- a/include/freetype/internal/tttypes.h
+++ b/include/freetype/internal/tttypes.h
@@ -1,29 +1,34 @@
-/***************************************************************************/
-/* */
-/* tttypes.h */
-/* */
-/* Basic SFNT/TrueType type definitions and interface (specification */
-/* only). */
-/* */
-/* Copyright 1996-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. */
-/* */
-/***************************************************************************/
-
-
-#ifndef __TTTYPES_H__
-#define __TTTYPES_H__
-
-
-#include <ft2build.h>
-#include FT_TRUETYPE_TABLES_H
-#include FT_INTERNAL_OBJECTS_H
+/****************************************************************************
+ *
+ * tttypes.h
+ *
+ * Basic SFNT/TrueType type definitions and interface (specification
+ * only).
+ *
+ * Copyright (C) 1996-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 <freetype/tttables.h>
+#include <freetype/internal/ftobjs.h>
+#include <freetype/ftcolor.h>
+#include "freetype/fttypes.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include <freetype/ftmm.h>
+#endif
FT_BEGIN_HEADER
@@ -42,27 +47,30 @@ FT_BEGIN_HEADER
/*************************************************************************/
- /*************************************************************************/
- /* */
- /* <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. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
@@ -73,25 +81,30 @@ FT_BEGIN_HEADER
} 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'. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
@@ -105,59 +118,28 @@ FT_BEGIN_HEADER
} SFNT_HeaderRec, *SFNT_Header;
- /*************************************************************************/
- /* */
- /* <Struct> */
- /* TT_TableDirRec */
- /* */
- /* <Description> */
- /* This structure models a TrueType table directory. It is used to */
- /* access the various tables of the font face. */
- /* */
- /* <Fields> */
- /* version :: The version number; starts with 0x00010000. */
- /* */
- /* numTables :: The number of tables. */
- /* */
- /* searchRange :: Unused. */
- /* */
- /* entrySelector :: Unused. */
- /* */
- /* rangeShift :: Unused. */
- /* */
- /* <Note> */
- /* This structure is only used during font opening. */
- /* */
- typedef struct TT_TableDirRec_
- {
- FT_Fixed version; /* should be 0x10000 */
- FT_UShort numTables; /* number of tables */
-
- FT_UShort searchRange; /* These parameters are only used */
- FT_UShort entrySelector; /* for a dichotomy search in the */
- FT_UShort rangeShift; /* directory. We ignore them. */
-
- } TT_TableDirRec;
-
-
- /*************************************************************************/
- /* */
- /* <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). */
- /* */
+ /**************************************************************************
+ *
+ * @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 */
@@ -168,75 +150,22 @@ FT_BEGIN_HEADER
} TT_TableRec, *TT_Table;
- /*************************************************************************/
- /* */
- /* <Struct> */
- /* TT_CMapDirRec */
- /* */
- /* <Description> */
- /* This structure describes the directory of the `cmap' table, */
- /* containing the font's character mappings table. */
- /* */
- /* <Fields> */
- /* tableVersionNumber :: The version number. */
- /* */
- /* numCMaps :: The number of charmaps in the font. */
- /* */
- /* <Note> */
- /* This structure is only used during font loading. */
- /* */
- typedef struct TT_CMapDirRec_
- {
- FT_UShort tableVersionNumber;
- FT_UShort numCMaps;
-
- } TT_CMapDirRec, *TT_CMapDir;
-
-
- /*************************************************************************/
- /* */
- /* <Struct> */
- /* TT_CMapDirEntryRec */
- /* */
- /* <Description> */
- /* This structure describes a charmap in a TrueType font. */
- /* */
- /* <Fields> */
- /* platformID :: An ID used to specify for which platform this */
- /* charmap is defined (FreeType manages all platforms). */
- /* */
- /* encodingID :: A platform-specific ID used to indicate which source */
- /* encoding is used in this charmap. */
- /* */
- /* offset :: The offset of the charmap relative to the start of */
- /* the `cmap' table. */
- /* */
- /* <Note> */
- /* This structure is only used during font loading. */
- /* */
- typedef struct TT_CMapDirEntryRec_
- {
- FT_UShort platformID;
- FT_UShort platformEncodingID;
- FT_Long offset;
-
- } TT_CMapDirEntryRec, *TT_CMapDirEntry;
-
-
- /*************************************************************************/
- /* */
- /* <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. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
@@ -245,46 +174,52 @@ FT_BEGIN_HEADER
} TT_LongMetricsRec, *TT_LongMetrics;
- /*************************************************************************/
- /* */
- /* <Type> */
- /* TT_ShortMetrics */
- /* */
- /* <Description> */
- /* A simple type to model the short metrics of the `hmtx' and `vmtx' */
- /* tables. */
- /* */
+ /**************************************************************************
+ *
+ * @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_
+ /**************************************************************************
+ *
+ * @struct:
+ * TT_NameRec
+ *
+ * @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_NameRec_
{
FT_UShort platformID;
FT_UShort encodingID;
@@ -296,38 +231,83 @@ FT_BEGIN_HEADER
/* this last field is not defined in the spec */
/* but used by the FreeType engine */
- FT_Byte* string;
-
- } TT_NameEntryRec, *TT_NameEntry;
+ FT_Byte* string;
+
+ } TT_NameRec, *TT_Name;
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * TT_LangTagRec
+ *
+ * @description:
+ * A structure modeling language tag records in SFNT 'name' tables,
+ * introduced in OpenType version 1.6.
+ *
+ * @fields:
+ * 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 UTF-16BE
+ * encoded characters.
+ */
+ typedef struct TT_LangTagRec_
+ {
+ FT_UShort stringLength;
+ FT_ULong stringOffset;
+ /* this last field is not defined in the spec */
+ /* but used by the FreeType engine */
- /*************************************************************************/
- /* */
- /* <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. */
- /* */
+ FT_Byte* string;
+
+ } TT_LangTagRec, *TT_LangTag;
+
+
+ /**************************************************************************
+ *
+ * @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.
+ *
+ * numLangTagRecords ::
+ * The number of language tags in table.
+ *
+ * langTags ::
+ * An array of language tag 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;
+ FT_UShort format;
+ FT_UInt numNameRecords;
+ FT_UInt storageOffset;
+ TT_NameRec* names;
+ FT_UInt numLangTagRecords;
+ TT_LangTagRec* langTags;
+ FT_Stream stream;
} TT_NameTableRec, *TT_NameTable;
@@ -345,21 +325,23 @@ FT_BEGIN_HEADER
/*************************************************************************/
- /*************************************************************************/
- /* */
- /* <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. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
@@ -372,22 +354,25 @@ FT_BEGIN_HEADER
#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. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
@@ -398,83 +383,6 @@ FT_BEGIN_HEADER
/*************************************************************************/
- /* */
- /* <Struct> */
- /* TT_HdmxEntryRec */
- /* */
- /* <Description> */
- /* A small structure used to model the pre-computed widths of a given */
- /* size. They are found in the `hdmx' table. */
- /* */
- /* <Fields> */
- /* ppem :: The pixels per EM value at which these metrics apply. */
- /* */
- /* max_width :: The maximum advance width for this metric. */
- /* */
- /* widths :: An array of widths. Note: These are 8-bit bytes. */
- /* */
- typedef struct TT_HdmxEntryRec_
- {
- FT_Byte ppem;
- FT_Byte max_width;
- FT_Byte* widths;
-
- } TT_HdmxEntryRec, *TT_HdmxEntry;
-
-
- /*************************************************************************/
- /* */
- /* <Struct> */
- /* TT_HdmxRec */
- /* */
- /* <Description> */
- /* A structure used to model the `hdmx' table, which contains */
- /* pre-computed widths for a set of given sizes/dimensions. */
- /* */
- /* <Fields> */
- /* version :: The version number. */
- /* */
- /* num_records :: The number of hdmx records. */
- /* */
- /* records :: An array of hdmx records. */
- /* */
- typedef struct TT_HdmxRec_
- {
- FT_UShort version;
- FT_Short num_records;
- TT_HdmxEntry records;
-
- } TT_HdmxRec, *TT_Hdmx;
-
-
- /*************************************************************************/
- /* */
- /* <Struct> */
- /* TT_Kern0_PairRec */
- /* */
- /* <Description> */
- /* A structure used to model a kerning pair for the kerning table */
- /* format 0. The engine now loads this table if it finds one in the */
- /* font file. */
- /* */
- /* <Fields> */
- /* left :: The index of the left glyph in pair. */
- /* */
- /* right :: The index of the right glyph in pair. */
- /* */
- /* value :: The kerning distance. A positive value spaces the */
- /* glyphs, a negative one makes them closer. */
- /* */
- typedef struct TT_Kern0_PairRec_
- {
- FT_UShort left; /* index of left glyph in pair */
- FT_UShort right; /* index of right glyph in pair */
- FT_FWord value; /* kerning value */
-
- } TT_Kern0_PairRec, *TT_Kern0_Pair;
-
-
- /*************************************************************************/
/*************************************************************************/
/*************************************************************************/
/*** ***/
@@ -487,70 +395,83 @@ FT_BEGIN_HEADER
/*************************************************************************/
- /*************************************************************************/
- /* */
- /* <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. */
- /* */
+ /**************************************************************************
+ *
+ * @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_Byte height;
- FT_Byte width;
+ FT_UShort height;
+ FT_UShort width;
- FT_Char horiBearingX;
- FT_Char horiBearingY;
- FT_Byte horiAdvance;
+ FT_Short horiBearingX;
+ FT_Short horiBearingY;
+ FT_UShort horiAdvance;
- FT_Char vertBearingX;
- FT_Char vertBearingY;
- FT_Byte vertAdvance;
+ 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
@@ -563,57 +484,60 @@ FT_BEGIN_HEADER
} 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
@@ -631,44 +555,54 @@ FT_BEGIN_HEADER
} 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
+ /**************************************************************************
+ *
+ * @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;
@@ -689,49 +623,55 @@ FT_BEGIN_HEADER
} 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 */
- /* */
- /* http://fonts.apple.com/ */
- /* TTRefMan/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 */
- /* */
- /* http://fonts.apple.com/ */
- /* TTRefMan/RM06/Chap6bloc.html */
- /* */
+ /**************************************************************************
+ *
+ * @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;
@@ -755,21 +695,24 @@ FT_BEGIN_HEADER
} 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
@@ -779,28 +722,34 @@ FT_BEGIN_HEADER
} 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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;
@@ -828,280 +777,124 @@ FT_BEGIN_HEADER
/*************************************************************************/
- /*************************************************************************/
- /* */
- /* <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_
+ /**************************************************************************
+ *
+ * @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.
+ *
+ * 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_NamesRec_
{
+ FT_Bool loaded;
FT_UShort num_glyphs;
FT_UShort num_names;
FT_UShort* glyph_indices;
- FT_Char** glyph_names;
+ FT_Byte** glyph_names;
- } TT_Post_20Rec, *TT_Post_20;
+ } TT_Post_NamesRec, *TT_Post_Names;
/*************************************************************************/
- /* */
- /* <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;
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** GX VARIATION TABLE SUPPORT ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
- } TT_Post_NamesRec, *TT_Post_Names;
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ typedef struct GX_BlendRec_ *GX_Blend;
+#endif
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
/*** ***/
/*** ***/
- /*** TRUETYPE CHARMAPS SUPPORT ***/
+ /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/
/*** ***/
/*** ***/
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
-
- /* format 0 */
-
- typedef struct TT_CMap0_
- {
- FT_ULong language; /* for Mac fonts (originally ushort) */
-
- FT_Byte* glyphIdArray;
-
- } TT_CMap0Rec, *TT_CMap0;
-
-
- /* format 2 */
-
- typedef struct TT_CMap2SubHeaderRec_
- {
- FT_UShort firstCode; /* first valid low byte */
- FT_UShort entryCount; /* number of valid low bytes */
- FT_Short idDelta; /* delta value to glyphIndex */
- FT_UShort idRangeOffset; /* offset from here to 1st code */
-
- } TT_CMap2SubHeaderRec, *TT_CMap2SubHeader;
-
-
- typedef struct TT_CMap2Rec_
- {
- FT_ULong language; /* for Mac fonts (originally ushort) */
-
- FT_UShort* subHeaderKeys; /* high byte mapping table */
- /* value = subHeader index * 8 */
- TT_CMap2SubHeader subHeaders;
- FT_UShort* glyphIdArray;
- FT_UShort numGlyphId; /* control value */
-
- } TT_CMap2Rec, *TT_CMap2;
-
-
- /* format 4 */
-
- typedef struct TT_CMap4Segment_
- {
- FT_UShort endCount;
- FT_UShort startCount;
- FT_Short idDelta;
- FT_UShort idRangeOffset;
-
- } TT_CMap4SegmentRec, *TT_CMap4Segment;
-
-
- typedef struct TT_CMap4Rec_
- {
- FT_ULong language; /* for Mac fonts (originally ushort) */
-
- FT_UShort segCountX2; /* number of segments * 2 */
- FT_UShort searchRange; /* these parameters can be used */
- FT_UShort entrySelector; /* for a binary search */
- FT_UShort rangeShift;
-
- TT_CMap4Segment segments;
- FT_UShort* glyphIdArray;
- FT_UShort numGlyphId; /* control value */
-
- TT_CMap4Segment last_segment; /* last used segment; this is a small */
- /* cache to potentially increase speed */
- } TT_CMap4Rec, *TT_CMap4;
-
-
- /* format 6 */
-
- typedef struct TT_CMap6_
- {
- FT_ULong language; /* for Mac fonts (originally ushort) */
-
- FT_UShort firstCode; /* first character code of subrange */
- FT_UShort entryCount; /* number of character codes in subrange */
-
- FT_UShort* glyphIdArray;
-
- } TT_CMap6Rec, *TT_CMap6;
-
-
- /* auxiliary table for format 8 and 12 */
-
- typedef struct TT_CMapGroupRec_
- {
- FT_ULong startCharCode;
- FT_ULong endCharCode;
- FT_ULong startGlyphID;
-
- } TT_CMapGroupRec, *TT_CMapGroup;
-
-
- /* FreeType handles format 8 and 12 identically. It is not necessary to
- cover mixed 16bit and 32bit codes since FreeType always uses FT_ULong
- for input character codes -- converting Unicode surrogates to 32bit
- character codes must be done by the application. */
-
- typedef struct TT_CMap8_12Rec_
- {
- FT_ULong language; /* for Mac fonts */
-
- FT_ULong nGroups;
- TT_CMapGroup groups;
-
- TT_CMapGroup last_group; /* last used group; this is a small */
- /* cache to potentially increase speed */
- } TT_CMap8_12Rec, *TT_CMap8_12;
-
-
- /* format 10 */
-
- typedef struct TT_CMap10Rec_
- {
- FT_ULong language; /* for Mac fonts */
-
- FT_ULong startCharCode; /* first character covered */
- FT_ULong numChars; /* number of characters covered */
-
- FT_UShort* glyphs;
-
- } TT_CMap10Rec, *TT_CMap10;
-
-
- typedef struct TT_CMapTableRec_* TT_CMapTable;
-
-
- typedef FT_UInt
- (*TT_CharMap_Func)( TT_CMapTable charmap,
- FT_ULong char_code );
-
- typedef FT_ULong
- (*TT_CharNext_Func)( TT_CMapTable charmap,
- FT_ULong char_code );
-
-
- /* charmap table */
- typedef struct TT_CMapTableRec_
+ /*
+ * 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_UShort platformID;
- FT_UShort platformEncodingID;
- FT_UShort format;
- FT_ULong length; /* must be ulong for formats 8, 10, and 12 */
-
+ FT_Byte* table;
+ FT_Byte* table_end;
+ FT_Byte* strings;
+ FT_ULong strings_size;
+ FT_UInt num_strikes;
FT_Bool loaded;
- FT_ULong offset;
-
- union
- {
- TT_CMap0Rec cmap0;
- TT_CMap2Rec cmap2;
- TT_CMap4Rec cmap4;
- TT_CMap6Rec cmap6;
- TT_CMap8_12Rec cmap8_12;
- TT_CMap10Rec cmap10;
- } c;
-
- TT_CharMap_Func get_index;
- TT_CharNext_Func get_next_char;
-
- } TT_CMapTableRec;
-
-
- /*************************************************************************/
- /* */
- /* <Struct> */
- /* TT_CharMapRec */
- /* */
- /* <Description> */
- /* The TrueType character map object type. */
- /* */
- /* <Fields> */
- /* root :: The parent character map structure. */
- /* */
- /* cmap :: The used character map. */
- /* */
- typedef struct TT_CharMapRec_
- {
- FT_CharMapRec root;
- TT_CMapTableRec cmap;
- } TT_CharMapRec;
+ } TT_BDFRec, *TT_BDF;
+#endif /* TT_CONFIG_OPTION_BDF */
/*************************************************************************/
/*************************************************************************/
@@ -1116,46 +909,33 @@ FT_BEGIN_HEADER
/*************************************************************************/
- /*************************************************************************/
- /* */
- /* 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, TT_GlyphSlot, and TT_CharMap */
- /* are not shared between font drivers, and are thus defined in */
- /* `ttobjs.h'. */
- /* */
- /*************************************************************************/
+ /**************************************************************************
+ *
+ * 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). */
- /* */
+ /**************************************************************************
+ *
+ * @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;
- /*************************************************************************/
- /* */
- /* <Type> */
- /* TT_CharMap */
- /* */
- /* <Description> */
- /* A handle to a TrueType character mapping object. */
- /* */
- typedef struct TT_CharMapRec_* TT_CharMap;
-
-
/* a function type used for the truetype bytecode interpreter hooks */
typedef FT_Error
(*TT_Interpreter)( void* exec_context );
@@ -1164,31 +944,34 @@ FT_BEGIN_HEADER
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. */
- /* */
+ /**************************************************************************
+ *
+ * @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,
@@ -1196,34 +979,36 @@ FT_BEGIN_HEADER
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. */
- /* */
+ /**************************************************************************
+ *
+ * @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,
@@ -1231,233 +1016,403 @@ FT_BEGIN_HEADER
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. */
- /* */
+ /**************************************************************************
+ *
+ * @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. */
- /* */
+ /**************************************************************************
+ *
+ * @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 );
- /*************************************************************************/
- /* */
- /* 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. */
- /* */
- /* max_components :: The maximum number of glyph components */
- /* required to load any composite glyph from */
- /* this font. Used to size the load stack. */
- /* */
- /* 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 `verticalInfo' 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. */
- /* */
- /* num_charmaps :: The number of character mappings in the */
- /* font. */
- /* */
- /* charmaps :: The array of charmap objects for this font */
- /* file. Note that this field is a typeless */
- /* pointer. The Reason is that the format of */
- /* charmaps varies with the underlying font */
- /* format and cannot be determined here. */
- /* */
- /* 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 `driver' interface. */
- /* */
- /* psnames :: A pointer to the `PSNames' module */
- /* interface. */
- /* */
- /* 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_strikes :: The number of sbit strikes, i.e., bitmap */
- /* sizes, embedded in this font. */
- /* */
- /* sbit_strikes :: An array of sbit strikes embedded in this */
- /* font. This table is optional in a */
- /* TrueType/OpenType font. */
- /* */
- /* 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. */
- /* */
- /* 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'. */
- /* */
- /* extra :: Reserved for third-party font drivers. */
- /* */
+ 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;
+
+
+ /* OpenType 1.8 brings new tables for variation font support; */
+ /* to make the old MM and GX fonts still work we need to check */
+ /* the presence (and validity) of the functionality provided */
+ /* by those tables. The following flag macros are for the */
+ /* field `variation_support'. */
+ /* */
+ /* Note that `fvar' gets checked immediately at font loading, */
+ /* while the other features are only loaded if MM support is */
+ /* actually requested. */
+
+ /* FVAR */
+#define TT_FACE_FLAG_VAR_FVAR ( 1 << 0 )
+
+ /* HVAR */
+#define TT_FACE_FLAG_VAR_HADVANCE ( 1 << 1 )
+#define TT_FACE_FLAG_VAR_LSB ( 1 << 2 )
+#define TT_FACE_FLAG_VAR_RSB ( 1 << 3 )
+
+ /* VVAR */
+#define TT_FACE_FLAG_VAR_VADVANCE ( 1 << 4 )
+#define TT_FACE_FLAG_VAR_TSB ( 1 << 5 )
+#define TT_FACE_FLAG_VAR_BSB ( 1 << 6 )
+#define TT_FACE_FLAG_VAR_VORG ( 1 << 7 )
+
+ /* MVAR */
+#define TT_FACE_FLAG_VAR_MVAR ( 1 << 8 )
+
+
+ /**************************************************************************
+ *
+ * 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.
+ *
+ * mm ::
+ * A pointer to the Multiple Masters service.
+ *
+ * tt_var ::
+ * A pointer to the Metrics Variations service for the "truetype"
+ * driver.
+ *
+ * face_var ::
+ * A pointer to the Metrics Variations service for this `TT_Face`'s
+ * driver.
+ *
+ * psaux ::
+ * A pointer to the PostScript Auxiliary service.
+ *
+ * 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.
+ *
+ * palette_data ::
+ * Some fields from the 'CPAL' table that are directly indexed.
+ *
+ * palette_index ::
+ * The current palette index, as set by @FT_Palette_Select.
+ *
+ * palette ::
+ * An array containing the current palette's colors.
+ *
+ * have_foreground_color ::
+ * There was a call to @FT_Palette_Set_Foreground_Color.
+ *
+ * foreground_color ::
+ * The current foreground color corresponding to 'CPAL' color index
+ * 0xFFFF. Only valid if `have_foreground_color` is set.
+ *
+ * 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 (in 26.6 format). Comes from the 'cvt~'
+ * table. Ignored for Type 2 fonts.
+ *
+ * If varied by the `CVAR' table, non-integer values are possible.
+ *
+ * interpreter ::
+ * A pointer to the TrueType bytecode interpreters field is also used
+ * to hook the debugger in 'ttdebug'.
+ *
+ * extra ::
+ * Reserved for third-party font drivers.
+ *
+ * postscript_name ::
+ * The PS name of the font. Used by the postscript name service.
+ *
+ * glyf_len ::
+ * The length of the 'glyf' table. Needed for malformed 'loca' tables.
+ *
+ * glyf_offset ::
+ * The file offset of the 'glyf' table.
+ *
+ * is_cff2 ::
+ * Set if the font format is CFF2.
+ *
+ * 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).
+ *
+ * variation_support ::
+ * Flags that indicate which OpenType functionality related to font
+ * variation support is present, valid, and usable. For example,
+ * TT_FACE_FLAG_VAR_FVAR is only set if we have at least one design
+ * axis.
+ *
+ * var_postscript_prefix ::
+ * The PostScript name prefix needed for constructing a variation font
+ * instance's PS name .
+ *
+ * var_postscript_prefix_len ::
+ * The length of the `var_postscript_prefix` string.
+ *
+ * var_default_named_instance ::
+ * The index of the default named instance.
+ *
+ * non_var_style_name ::
+ * The non-variation style name, used as a backup.
+ *
+ * horz_metrics_size ::
+ * The size of the 'hmtx' table.
+ *
+ * vert_metrics_size ::
+ * The size of the 'vmtx' table.
+ *
+ * num_locations ::
+ * The number of glyph locations in this TrueType file. This should be
+ * one more than 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.
+ *
+ * hdmx_table ::
+ * A pointer to the 'hdmx' table.
+ *
+ * hdmx_table_size ::
+ * The size of the 'hdmx' table.
+ *
+ * hdmx_record_count ::
+ * The number of hdmx records.
+ *
+ * hdmx_record_size ::
+ * The size of a single hdmx record.
+ *
+ * hdmx_records ::
+ * A array of pointers to the 'hdmx' table records sorted by ppem.
+ *
+ * sbit_table ::
+ * A pointer to the font's embedded bitmap location table.
+ *
+ * sbit_table_size ::
+ * The size of `sbit_table`.
+ *
+ * sbit_table_type ::
+ * The sbit table type (CBLC, sbix, etc.).
+ *
+ * sbit_num_strikes ::
+ * The number of sbit strikes exposed by FreeType's API, omitting
+ * invalid strikes.
+ *
+ * sbit_strike_map ::
+ * A mapping between the strike indices exposed by the API and the
+ * indices used in the font's sbit table.
+ *
+ * kern_table ::
+ * A pointer to the 'kern' table.
+ *
+ * kern_table_size ::
+ * The size of the 'kern' table.
+ *
+ * num_kern_tables ::
+ * The number of supported kern subtables (up to 32; FreeType
+ * recognizes only horizontal ones with format 0).
+ *
+ * kern_avail_bits ::
+ * The availability status of kern subtables; if bit n is set, table n
+ * is available.
+ *
+ * kern_order_bits ::
+ * The sortedness status of kern subtables; if bit n is set, table n is
+ * sorted.
+ *
+ * bdf ::
+ * Data related to an SFNT font's 'bdf' table; see `tttypes.h`.
+ *
+ * horz_metrics_offset ::
+ * The file offset of the 'hmtx' table.
+ *
+ * vert_metrics_offset ::
+ * The file offset of the 'vmtx' table.
+ *
+ * ebdt_start ::
+ * The file offset of the sbit data table (CBDT, bdat, etc.).
+ *
+ * ebdt_size ::
+ * The size of the sbit data table.
+ *
+ * cpal ::
+ * A pointer to data related to the 'CPAL' table. `NULL` if the table
+ * is not available.
+ *
+ * colr ::
+ * A pointer to data related to the 'COLR' table. `NULL` if the table
+ * is not available.
+ *
+ * svg ::
+ * A pointer to data related to the 'SVG' table. `NULL` if the table
+ * is not available.
+ */
typedef struct TT_FaceRec_
{
FT_FaceRec root;
@@ -1472,7 +1427,6 @@ FT_BEGIN_HEADER
TT_HoriHeader horizontal; /* TrueType horizontal header */
TT_MaxProfile max_profile;
- FT_ULong max_components;
FT_Bool vertical_info;
TT_VertHeader vertical; /* TT Vertical header, if present */
@@ -1483,7 +1437,7 @@ FT_BEGIN_HEADER
TT_OS2 os2; /* TrueType OS/2 table */
TT_Postscript postscript; /* TrueType Postscript table */
- FT_Byte* cmap_table; /* extracted 'cmap' table */
+ FT_Byte* cmap_table; /* extracted `cmap' table */
FT_ULong cmap_size;
TT_Loader_GotoTableFunc goto_table;
@@ -1494,22 +1448,39 @@ FT_BEGIN_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 */
+ /* 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 PSNames_Interface table used to */
- /* handle glyph names <-> unicode & Mac values */
+ /* a typeless pointer to the FT_Service_PsCMapsRec table used to */
+ /* handle glyph names <-> unicode & Mac values */
void* psnames;
- /***********************************************************************/
- /* */
- /* Optional TrueType/OpenType tables */
- /* */
- /***********************************************************************/
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ /* a typeless pointer to the FT_Service_MultiMasters table used to */
+ /* handle variation fonts */
+ void* mm;
- /* horizontal device metrics */
- TT_HdmxRec hdmx;
+ /* a typeless pointer to the FT_Service_MetricsVariationsRec table */
+ /* used to handle the HVAR, VVAR, and MVAR OpenType tables by the */
+ /* "truetype" driver */
+ void* tt_var;
+
+ /* a typeless pointer to the FT_Service_MetricsVariationsRec table */
+ /* used to handle the HVAR, VVAR, and MVAR OpenType tables by this */
+ /* TT_Face's driver */
+ void* face_var; /* since 2.13.1 */
+#endif
+
+ /* a typeless pointer to the PostScript Aux service */
+ void* psaux;
+
+
+ /************************************************************************
+ *
+ * Optional TrueType/OpenType tables
+ *
+ */
/* grid-fitting and scaling table */
TT_GaspRec gasp; /* the `gasp' table */
@@ -1518,25 +1489,25 @@ FT_BEGIN_HEADER
TT_PCLT pclt;
/* embedded bitmaps support */
- FT_ULong num_sbit_strikes;
- TT_SBit_Strike sbit_strikes;
-
FT_ULong num_sbit_scales;
TT_SBit_Scale sbit_scales;
/* postscript names table */
TT_Post_NamesRec postscript_names;
+ /* glyph colors */
+ FT_Palette_Data palette_data; /* since 2.10 */
+ FT_UShort palette_index;
+ FT_Color* palette;
+ FT_Bool have_foreground_color;
+ FT_Color foreground_color;
- /***********************************************************************/
- /* */
- /* TrueType-specific fields (ignored by the OTF-Type2 driver) */
- /* */
- /***********************************************************************/
- /* the glyph locations */
- FT_UShort num_locations;
- FT_Long* glyph_locations;
+ /************************************************************************
+ *
+ * TrueType-specific fields (ignored by the CFF driver)
+ *
+ */
/* the font program, if any */
FT_ULong font_program_size;
@@ -1548,72 +1519,154 @@ FT_BEGIN_HEADER
/* the original, unscaled, control value table */
FT_ULong cvt_size;
- FT_Short* cvt;
-
- /* the format 0 kerning table, if any */
- FT_Int num_kern_pairs;
- FT_Int kern_table_index;
- TT_Kern0_Pair kern_pairs;
+ FT_Int32* cvt;
/* A pointer to the bytecode interpreter to use. This is also */
/* used to hook the debugger for the `ttdebug' utility. */
TT_Interpreter interpreter;
- /***********************************************************************/
- /* */
- /* Other tables or fields. This is used by derivative formats like */
- /* OpenType. */
- /* */
- /***********************************************************************/
+ /************************************************************************
+ *
+ * Other tables or fields. This is used by derivative formats like
+ * OpenType.
+ *
+ */
FT_Generic extra;
+ const char* postscript_name;
+
+ FT_ULong glyf_len;
+ FT_ULong glyf_offset; /* since 2.7.1 */
+
+ FT_Bool is_cff2; /* since 2.7.1 */
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_Bool doblend;
+ GX_Blend blend;
+
+ FT_UInt32 variation_support; /* since 2.7.1 */
+
+ const char* var_postscript_prefix; /* since 2.7.2 */
+ FT_UInt var_postscript_prefix_len; /* since 2.7.2 */
+
+ FT_UInt var_default_named_instance; /* since 2.13.1 */
+
+ const char* non_var_style_name; /* since 2.13.1 */
+#endif
+
+ /* since version 2.2 */
+
+ FT_ULong horz_metrics_size;
+ FT_ULong vert_metrics_size;
+
+ FT_ULong num_locations; /* up to 0xFFFF + 1 */
+ 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_records;
+
+ FT_Byte* sbit_table;
+ FT_ULong sbit_table_size;
+ TT_SbitTableType sbit_table_type;
+ FT_UInt sbit_num_strikes;
+ FT_UInt* sbit_strike_map;
+
+ 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_GPOS_KERNING
+ FT_Byte* gpos_table;
+ FT_Bool gpos_kerning_available;
+#endif
+
+#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_EMBEDDED_BITMAPS
+ /* since 2.7 */
+ FT_ULong ebdt_start; /* either `CBDT', `EBDT', or `bdat' */
+ FT_ULong ebdt_size;
+#endif
+
+ /* since 2.10 */
+ void* cpal;
+ void* colr;
+
+ /* since 2.12 */
+ void* svg;
+
} 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 maximal size in points of the zone. */
- /* */
- /* max_contours :: Max size in links contours of thez one. */
- /* */
- /* 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. */
- /* */
+ /**************************************************************************
+ *
+ * @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_UShort max_contours;
- FT_UShort n_points; /* number of points in zone */
- FT_Short n_contours; /* number of contours */
+ 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* 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_Byte* tags; /* current touch flags */
+ FT_UShort* contours; /* contour end points */
+
+ FT_UShort first_point; /* offset of first (#0) point */
} TT_GlyphZoneRec, *TT_GlyphZone;
@@ -1621,11 +1674,23 @@ FT_BEGIN_HEADER
/* 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_
{
- FT_Face face;
- FT_Size size;
+ TT_Face face;
+ TT_Size size;
FT_GlyphSlot glyph;
FT_GlyphLoader gloader;
@@ -1633,7 +1698,7 @@ FT_BEGIN_HEADER
FT_UInt glyph_index;
FT_Stream stream;
- FT_Int byte_len;
+ FT_UInt byte_len;
FT_Short n_contours;
FT_BBox bbox;
@@ -1641,12 +1706,9 @@ FT_BEGIN_HEADER
FT_Int advance;
FT_Int linear;
FT_Bool linear_def;
- FT_Bool preserve_pps;
FT_Vector pp1;
FT_Vector pp2;
- FT_ULong glyf_offset;
-
/* the zone where we load our glyphs */
TT_GlyphZoneRec base;
TT_GlyphZoneRec zone;
@@ -1658,12 +1720,28 @@ FT_BEGIN_HEADER
/* 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;
+
+ /* since version 2.6.2 */
+ FT_ListRec composites;
+
+ /* since version 2.11.2 */
+ FT_Byte* widthp;
+
} TT_LoaderRec;
FT_END_HEADER
-#endif /* __TTTYPES_H__ */
+#endif /* TTTYPES_H_ */
/* END */
diff --git a/include/freetype/internal/wofftypes.h b/include/freetype/internal/wofftypes.h
new file mode 100644
index 00000000..4a169d12
--- /dev/null
+++ b/include/freetype/internal/wofftypes.h
@@ -0,0 +1,312 @@
+/****************************************************************************
+ *
+ * wofftypes.h
+ *
+ * Basic WOFF/WOFF2 type definitions and interface (specification
+ * only).
+ *
+ * Copyright (C) 1996-2024 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.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 WOFFTYPES_H_
+#define WOFFTYPES_H_
+
+
+#include <freetype/tttables.h>
+#include <freetype/internal/ftobjs.h>
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * WOFF_HeaderRec
+ *
+ * @description:
+ * WOFF file format header.
+ *
+ * @fields:
+ * See
+ *
+ * https://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 ::
+ * Uncompressed 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_Tag 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:
+ * WOFF2_TtcFontRec
+ *
+ * @description:
+ * Metadata for a TTC font entry in WOFF2.
+ *
+ * @fields:
+ * flavor ::
+ * TTC font flavor.
+ *
+ * num_tables ::
+ * Number of tables in TTC, indicating number of elements in
+ * `table_indices`.
+ *
+ * table_indices ::
+ * Array of table indices for each TTC font.
+ */
+ typedef struct WOFF2_TtcFontRec_
+ {
+ FT_ULong flavor;
+ FT_UShort num_tables;
+ FT_UShort* table_indices;
+
+ } WOFF2_TtcFontRec, *WOFF2_TtcFont;
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * WOFF2_HeaderRec
+ *
+ * @description:
+ * WOFF2 file format header.
+ *
+ * @fields:
+ * See
+ *
+ * https://www.w3.org/TR/WOFF2/#woff20Header
+ *
+ * @note:
+ * We don't care about the fields `reserved`, `majorVersion` and
+ * `minorVersion`, so they are not included. The `totalSfntSize` field
+ * does not necessarily represent the actual size of the uncompressed
+ * SFNT font stream, so that is used as a reference value instead.
+ */
+ typedef struct WOFF2_HeaderRec_
+ {
+ FT_ULong signature;
+ FT_ULong flavor;
+ FT_ULong length;
+ FT_UShort num_tables;
+ FT_ULong totalSfntSize;
+ FT_ULong totalCompressedSize;
+ FT_ULong metaOffset;
+ FT_ULong metaLength;
+ FT_ULong metaOrigLength;
+ FT_ULong privOffset;
+ FT_ULong privLength;
+
+ FT_ULong uncompressed_size; /* uncompressed brotli stream size */
+ FT_ULong compressed_offset; /* compressed stream offset */
+ FT_ULong header_version; /* version of original TTC Header */
+ FT_UShort num_fonts; /* number of fonts in TTC */
+ FT_ULong actual_sfnt_size; /* actual size of sfnt stream */
+
+ WOFF2_TtcFont ttc_fonts; /* metadata for fonts in a TTC */
+
+ } WOFF2_HeaderRec, *WOFF2_Header;
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * WOFF2_TableRec
+ *
+ * @description:
+ * This structure describes a given table of a WOFF2 font.
+ *
+ * @fields:
+ * See
+ *
+ * https://www.w3.org/TR/WOFF2/#table_dir_format
+ */
+ typedef struct WOFF2_TableRec_
+ {
+ FT_Byte FlagByte; /* table type and flags */
+ FT_Tag Tag; /* table file offset */
+ FT_ULong dst_length; /* uncompressed table length */
+ FT_ULong TransformLength; /* transformed length */
+
+ FT_ULong flags; /* calculated flags */
+ FT_ULong src_offset; /* compressed table offset */
+ FT_ULong src_length; /* compressed table length */
+ FT_ULong dst_offset; /* uncompressed table offset */
+
+ } WOFF2_TableRec, *WOFF2_Table;
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * WOFF2_InfoRec
+ *
+ * @description:
+ * Metadata for WOFF2 font that may be required for reconstruction of
+ * sfnt tables.
+ *
+ * @fields:
+ * header_checksum ::
+ * Checksum of SFNT offset table.
+ *
+ * num_glyphs ::
+ * Number of glyphs in the font.
+ *
+ * num_hmetrics ::
+ * `numberOfHMetrics` field in the 'hhea' table.
+ *
+ * x_mins ::
+ * `xMin` values of glyph bounding box.
+ *
+ * glyf_table ::
+ * A pointer to the `glyf' table record.
+ *
+ * loca_table ::
+ * A pointer to the `loca' table record.
+ *
+ * head_table ::
+ * A pointer to the `head' table record.
+ */
+ typedef struct WOFF2_InfoRec_
+ {
+ FT_ULong header_checksum;
+ FT_UShort num_glyphs;
+ FT_UShort num_hmetrics;
+ FT_Short* x_mins;
+
+ WOFF2_Table glyf_table;
+ WOFF2_Table loca_table;
+ WOFF2_Table head_table;
+
+ } WOFF2_InfoRec, *WOFF2_Info;
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * WOFF2_SubstreamRec
+ *
+ * @description:
+ * This structure stores information about a substream in the transformed
+ * 'glyf' table in a WOFF2 stream.
+ *
+ * @fields:
+ * start ::
+ * Beginning of the substream relative to uncompressed table stream.
+ *
+ * offset ::
+ * Offset of the substream relative to uncompressed table stream.
+ *
+ * size ::
+ * Size of the substream.
+ */
+ typedef struct WOFF2_SubstreamRec_
+ {
+ FT_ULong start;
+ FT_ULong offset;
+ FT_ULong size;
+
+ } WOFF2_SubstreamRec, *WOFF2_Substream;
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * WOFF2_PointRec
+ *
+ * @description:
+ * This structure stores information about a point in the transformed
+ * 'glyf' table in a WOFF2 stream.
+ *
+ * @fields:
+ * x ::
+ * x-coordinate of point.
+ *
+ * y ::
+ * y-coordinate of point.
+ *
+ * on_curve ::
+ * Set if point is on-curve.
+ */
+ typedef struct WOFF2_PointRec_
+ {
+ FT_Int x;
+ FT_Int y;
+ FT_Bool on_curve;
+
+ } WOFF2_PointRec, *WOFF2_Point;
+
+
+FT_END_HEADER
+
+#endif /* WOFFTYPES_H_ */
+
+
+/* END */