Imported Upstream version 2.13.2
[platform/upstream/freetype2.git] / include / freetype / internal / ftgloadr.h
1 /****************************************************************************
2  *
3  * ftgloadr.h
4  *
5  *   The FreeType glyph loader (specification).
6  *
7  * Copyright (C) 2002-2023 by
8  * David Turner, Robert Wilhelm, and Werner Lemberg
9  *
10  * This file is part of the FreeType project, and may only be used,
11  * modified, and distributed under the terms of the FreeType project
12  * license, LICENSE.TXT.  By continuing to use, modify, or distribute
13  * this file you indicate that you have read the license and
14  * understand and accept it fully.
15  *
16  */
17
18
19 #ifndef FTGLOADR_H_
20 #define FTGLOADR_H_
21
22
23 #include <freetype/freetype.h>
24
25 #include "compiler-macros.h"
26
27 FT_BEGIN_HEADER
28
29
30   /**************************************************************************
31    *
32    * @struct:
33    *   FT_GlyphLoader
34    *
35    * @description:
36    *   The glyph loader is an internal object used to load several glyphs
37    *   together (for example, in the case of composites).
38    */
39   typedef struct  FT_SubGlyphRec_
40   {
41     FT_Int     index;
42     FT_UShort  flags;
43     FT_Int     arg1;
44     FT_Int     arg2;
45     FT_Matrix  transform;
46
47   } FT_SubGlyphRec;
48
49
50   typedef struct  FT_GlyphLoadRec_
51   {
52     FT_Outline   outline;       /* outline                   */
53     FT_Vector*   extra_points;  /* extra points table        */
54     FT_Vector*   extra_points2; /* second extra points table */
55     FT_UInt      num_subglyphs; /* number of subglyphs       */
56     FT_SubGlyph  subglyphs;     /* subglyphs                 */
57
58   } FT_GlyphLoadRec, *FT_GlyphLoad;
59
60
61   typedef struct  FT_GlyphLoaderRec_
62   {
63     FT_Memory        memory;
64     FT_UInt          max_points;
65     FT_UInt          max_contours;
66     FT_UInt          max_subglyphs;
67     FT_Bool          use_extra;
68
69     FT_GlyphLoadRec  base;
70     FT_GlyphLoadRec  current;
71
72     void*            other;            /* for possible future extension? */
73
74   } FT_GlyphLoaderRec, *FT_GlyphLoader;
75
76
77   /* create new empty glyph loader */
78   FT_BASE( FT_Error )
79   FT_GlyphLoader_New( FT_Memory        memory,
80                       FT_GlyphLoader  *aloader );
81
82   /* add an extra points table to a glyph loader */
83   FT_BASE( FT_Error )
84   FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader );
85
86   /* destroy a glyph loader */
87   FT_BASE( void )
88   FT_GlyphLoader_Done( FT_GlyphLoader  loader );
89
90   /* reset a glyph loader (frees everything int it) */
91   FT_BASE( void )
92   FT_GlyphLoader_Reset( FT_GlyphLoader  loader );
93
94   /* rewind a glyph loader */
95   FT_BASE( void )
96   FT_GlyphLoader_Rewind( FT_GlyphLoader  loader );
97
98   /* check that there is enough space to add `n_points' and `n_contours' */
99   /* to the glyph loader                                                 */
100   FT_BASE( FT_Error )
101   FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,
102                               FT_UInt         n_points,
103                               FT_UInt         n_contours );
104
105
106 #define FT_GLYPHLOADER_CHECK_P( _loader, _count )       \
107   ( (_count) == 0                                    || \
108     ( (FT_UInt)(_loader)->base.outline.n_points    +    \
109       (FT_UInt)(_loader)->current.outline.n_points +    \
110       (FT_UInt)(_count) ) <= (_loader)->max_points   )
111
112 #define FT_GLYPHLOADER_CHECK_C( _loader, _count )         \
113   ( (_count) == 0                                      || \
114     ( (FT_UInt)(_loader)->base.outline.n_contours    +    \
115       (FT_UInt)(_loader)->current.outline.n_contours +    \
116       (FT_UInt)(_count) ) <= (_loader)->max_contours   )
117
118 #define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points, _contours ) \
119   ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points )   &&              \
120       FT_GLYPHLOADER_CHECK_C( _loader, _contours ) )               \
121     ? 0                                                            \
122     : FT_GlyphLoader_CheckPoints( (_loader),                       \
123                                   (FT_UInt)(_points),              \
124                                   (FT_UInt)(_contours) ) )
125
126
127   /* check that there is enough space to add `n_subs' sub-glyphs to */
128   /* a glyph loader                                                 */
129   FT_BASE( FT_Error )
130   FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,
131                                  FT_UInt         n_subs );
132
133   /* prepare a glyph loader, i.e. empty the current glyph */
134   FT_BASE( void )
135   FT_GlyphLoader_Prepare( FT_GlyphLoader  loader );
136
137   /* add the current glyph to the base glyph */
138   FT_BASE( void )
139   FT_GlyphLoader_Add( FT_GlyphLoader  loader );
140
141
142 FT_END_HEADER
143
144 #endif /* FTGLOADR_H_ */
145
146
147 /* END */