Home | History | Annotate | Line # | Download | only in internal
      1 /****************************************************************************
      2  *
      3  * ftgloadr.h
      4  *
      5  *   The FreeType glyph loader (specification).
      6  *
      7  * Copyright (C) 2002-2020 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 
     26 FT_BEGIN_HEADER
     27 
     28 
     29   /**************************************************************************
     30    *
     31    * @struct:
     32    *   FT_GlyphLoader
     33    *
     34    * @description:
     35    *   The glyph loader is an internal object used to load several glyphs
     36    *   together (for example, in the case of composites).
     37    */
     38   typedef struct  FT_SubGlyphRec_
     39   {
     40     FT_Int     index;
     41     FT_UShort  flags;
     42     FT_Int     arg1;
     43     FT_Int     arg2;
     44     FT_Matrix  transform;
     45 
     46   } FT_SubGlyphRec;
     47 
     48 
     49   typedef struct  FT_GlyphLoadRec_
     50   {
     51     FT_Outline   outline;       /* outline                   */
     52     FT_Vector*   extra_points;  /* extra points table        */
     53     FT_Vector*   extra_points2; /* second extra points table */
     54     FT_UInt      num_subglyphs; /* number of subglyphs       */
     55     FT_SubGlyph  subglyphs;     /* subglyphs                 */
     56 
     57   } FT_GlyphLoadRec, *FT_GlyphLoad;
     58 
     59 
     60   typedef struct  FT_GlyphLoaderRec_
     61   {
     62     FT_Memory        memory;
     63     FT_UInt          max_points;
     64     FT_UInt          max_contours;
     65     FT_UInt          max_subglyphs;
     66     FT_Bool          use_extra;
     67 
     68     FT_GlyphLoadRec  base;
     69     FT_GlyphLoadRec  current;
     70 
     71     void*            other;            /* for possible future extension? */
     72 
     73   } FT_GlyphLoaderRec, *FT_GlyphLoader;
     74 
     75 
     76   /* create new empty glyph loader */
     77   FT_BASE( FT_Error )
     78   FT_GlyphLoader_New( FT_Memory        memory,
     79                       FT_GlyphLoader  *aloader );
     80 
     81   /* add an extra points table to a glyph loader */
     82   FT_BASE( FT_Error )
     83   FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader );
     84 
     85   /* destroy a glyph loader */
     86   FT_BASE( void )
     87   FT_GlyphLoader_Done( FT_GlyphLoader  loader );
     88 
     89   /* reset a glyph loader (frees everything int it) */
     90   FT_BASE( void )
     91   FT_GlyphLoader_Reset( FT_GlyphLoader  loader );
     92 
     93   /* rewind a glyph loader */
     94   FT_BASE( void )
     95   FT_GlyphLoader_Rewind( FT_GlyphLoader  loader );
     96 
     97   /* check that there is enough space to add `n_points' and `n_contours' */
     98   /* to the glyph loader                                                 */
     99   FT_BASE( FT_Error )
    100   FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,
    101                               FT_UInt         n_points,
    102                               FT_UInt         n_contours );
    103 
    104 
    105 #define FT_GLYPHLOADER_CHECK_P( _loader, _count )       \
    106   ( (_count) == 0                                    || \
    107     ( (FT_UInt)(_loader)->base.outline.n_points    +    \
    108       (FT_UInt)(_loader)->current.outline.n_points +    \
    109       (FT_UInt)(_count) ) <= (_loader)->max_points   )
    110 
    111 #define FT_GLYPHLOADER_CHECK_C( _loader, _count )         \
    112   ( (_count) == 0                                      || \
    113     ( (FT_UInt)(_loader)->base.outline.n_contours    +    \
    114       (FT_UInt)(_loader)->current.outline.n_contours +    \
    115       (FT_UInt)(_count) ) <= (_loader)->max_contours   )
    116 
    117 #define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points, _contours ) \
    118   ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points )   &&              \
    119       FT_GLYPHLOADER_CHECK_C( _loader, _contours ) )               \
    120     ? 0                                                            \
    121     : FT_GlyphLoader_CheckPoints( (_loader),                       \
    122                                   (FT_UInt)(_points),              \
    123                                   (FT_UInt)(_contours) ) )
    124 
    125 
    126   /* check that there is enough space to add `n_subs' sub-glyphs to */
    127   /* a glyph loader                                                 */
    128   FT_BASE( FT_Error )
    129   FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,
    130                                  FT_UInt         n_subs );
    131 
    132   /* prepare a glyph loader, i.e. empty the current glyph */
    133   FT_BASE( void )
    134   FT_GlyphLoader_Prepare( FT_GlyphLoader  loader );
    135 
    136   /* add the current glyph to the base glyph */
    137   FT_BASE( void )
    138   FT_GlyphLoader_Add( FT_GlyphLoader  loader );
    139 
    140 
    141 FT_END_HEADER
    142 
    143 #endif /* FTGLOADR_H_ */
    144 
    145 
    146 /* END */
    147