Home | History | Annotate | Download | only in freetype
      1 /****************************************************************************
      2  *
      3  * ftglyph.h
      4  *
      5  *   FreeType convenience functions to handle glyphs (specification).
      6  *
      7  * Copyright 1996-2018 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   /**************************************************************************
     20    *
     21    * This file contains the definition of several convenience functions
     22    * that can be used by client applications to easily retrieve glyph
     23    * bitmaps and outlines from a given face.
     24    *
     25    * These functions should be optional if you are writing a font server
     26    * or text layout engine on top of FreeType.  However, they are pretty
     27    * handy for many other simple uses of the library.
     28    *
     29    */
     30 
     31 
     32 #ifndef FTGLYPH_H_
     33 #define FTGLYPH_H_
     34 
     35 
     36 #include <ft2build.h>
     37 #include FT_FREETYPE_H
     38 
     39 #ifdef FREETYPE_H
     40 #error "freetype.h of FreeType 1 has been loaded!"
     41 #error "Please fix the directory search order for header files"
     42 #error "so that freetype.h of FreeType 2 is found first."
     43 #endif
     44 
     45 
     46 FT_BEGIN_HEADER
     47 
     48 
     49   /**************************************************************************
     50    *
     51    * @section:
     52    *   glyph_management
     53    *
     54    * @title:
     55    *   Glyph Management
     56    *
     57    * @abstract:
     58    *   Generic interface to manage individual glyph data.
     59    *
     60    * @description:
     61    *   This section contains definitions used to manage glyph data
     62    *   through generic FT_Glyph objects.  Each of them can contain a
     63    *   bitmap, a vector outline, or even images in other formats.
     64    *
     65    */
     66 
     67 
     68   /* forward declaration to a private type */
     69   typedef struct FT_Glyph_Class_  FT_Glyph_Class;
     70 
     71 
     72   /**************************************************************************
     73    *
     74    * @type:
     75    *   FT_Glyph
     76    *
     77    * @description:
     78    *   Handle to an object used to model generic glyph images.  It is a
     79    *   pointer to the @FT_GlyphRec structure and can contain a glyph
     80    *   bitmap or pointer.
     81    *
     82    * @note:
     83    *   Glyph objects are not owned by the library.  You must thus release
     84    *   them manually (through @FT_Done_Glyph) _before_ calling
     85    *   @FT_Done_FreeType.
     86    */
     87   typedef struct FT_GlyphRec_*  FT_Glyph;
     88 
     89 
     90   /**************************************************************************
     91    *
     92    * @struct:
     93    *   FT_GlyphRec
     94    *
     95    * @description:
     96    *   The root glyph structure contains a given glyph image plus its
     97    *   advance width in 16.16 fixed-point format.
     98    *
     99    * @fields:
    100    *   library ::
    101    *     A handle to the FreeType library object.
    102    *
    103    *   clazz ::
    104    *     A pointer to the glyph's class.  Private.
    105    *
    106    *   format ::
    107    *     The format of the glyph's image.
    108    *
    109    *   advance ::
    110    *     A 16.16 vector that gives the glyph's advance width.
    111    */
    112   typedef struct  FT_GlyphRec_
    113   {
    114     FT_Library             library;
    115     const FT_Glyph_Class*  clazz;
    116     FT_Glyph_Format        format;
    117     FT_Vector              advance;
    118 
    119   } FT_GlyphRec;
    120 
    121 
    122   /**************************************************************************
    123    *
    124    * @type:
    125    *   FT_BitmapGlyph
    126    *
    127    * @description:
    128    *   A handle to an object used to model a bitmap glyph image.  This is
    129    *   a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec.
    130    */
    131   typedef struct FT_BitmapGlyphRec_*  FT_BitmapGlyph;
    132 
    133 
    134   /**************************************************************************
    135    *
    136    * @struct:
    137    *   FT_BitmapGlyphRec
    138    *
    139    * @description:
    140    *   A structure used for bitmap glyph images.  This really is a
    141    *   `sub-class' of @FT_GlyphRec.
    142    *
    143    * @fields:
    144    *   root ::
    145    *     The root @FT_Glyph fields.
    146    *
    147    *   left ::
    148    *     The left-side bearing, i.e., the horizontal distance
    149    *     from the current pen position to the left border of the
    150    *     glyph bitmap.
    151    *
    152    *   top ::
    153    *     The top-side bearing, i.e., the vertical distance from
    154    *     the current pen position to the top border of the glyph
    155    *     bitmap.  This distance is positive for upwards~y!
    156    *
    157    *   bitmap ::
    158    *     A descriptor for the bitmap.
    159    *
    160    * @note:
    161    *   You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have
    162    *   `glyph->format == FT_GLYPH_FORMAT_BITMAP'.  This lets you access
    163    *   the bitmap's contents easily.
    164    *
    165    *   The corresponding pixel buffer is always owned by @FT_BitmapGlyph
    166    *   and is thus created and destroyed with it.
    167    */
    168   typedef struct  FT_BitmapGlyphRec_
    169   {
    170     FT_GlyphRec  root;
    171     FT_Int       left;
    172     FT_Int       top;
    173     FT_Bitmap    bitmap;
    174 
    175   } FT_BitmapGlyphRec;
    176 
    177 
    178   /**************************************************************************
    179    *
    180    * @type:
    181    *   FT_OutlineGlyph
    182    *
    183    * @description:
    184    *   A handle to an object used to model an outline glyph image.  This
    185    *   is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec.
    186    */
    187   typedef struct FT_OutlineGlyphRec_*  FT_OutlineGlyph;
    188 
    189 
    190   /**************************************************************************
    191    *
    192    * @struct:
    193    *   FT_OutlineGlyphRec
    194    *
    195    * @description:
    196    *   A structure used for outline (vectorial) glyph images.  This
    197    *   really is a `sub-class' of @FT_GlyphRec.
    198    *
    199    * @fields:
    200    *   root ::
    201    *     The root @FT_Glyph fields.
    202    *
    203    *   outline ::
    204    *     A descriptor for the outline.
    205    *
    206    * @note:
    207    *   You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have
    208    *   `glyph->format == FT_GLYPH_FORMAT_OUTLINE'.  This lets you access
    209    *   the outline's content easily.
    210    *
    211    *   As the outline is extracted from a glyph slot, its coordinates are
    212    *   expressed normally in 26.6 pixels, unless the flag
    213    *   @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char().
    214    *
    215    *   The outline's tables are always owned by the object and are
    216    *   destroyed with it.
    217    */
    218   typedef struct  FT_OutlineGlyphRec_
    219   {
    220     FT_GlyphRec  root;
    221     FT_Outline   outline;
    222 
    223   } FT_OutlineGlyphRec;
    224 
    225 
    226   /**************************************************************************
    227    *
    228    * @function:
    229    *   FT_New_Glyph
    230    *
    231    * @description:
    232    *   A function used to create a new empty glyph image.  Note that the
    233    *   created @FT_Glyph object must be released with @FT_Done_Glyph.
    234    *
    235    * @input:
    236    *   library ::
    237    *     A handle to the FreeType library object.
    238    *
    239    *   format ::
    240    *     The format of the glyph's image.
    241    *
    242    * @output:
    243    *   aglyph ::
    244    *     A handle to the glyph object.
    245    *
    246    * @return:
    247    *   FreeType error code.  0~means success.
    248    *
    249    * @since:
    250    *   2.10
    251    */
    252   FT_EXPORT( FT_Error )
    253   FT_New_Glyph( FT_Library       library,
    254                 FT_Glyph_Format  format,
    255                 FT_Glyph         *aglyph );
    256 
    257 
    258   /**************************************************************************
    259    *
    260    * @function:
    261    *   FT_Get_Glyph
    262    *
    263    * @description:
    264    *   A function used to extract a glyph image from a slot.  Note that
    265    *   the created @FT_Glyph object must be released with @FT_Done_Glyph.
    266    *
    267    * @input:
    268    *   slot ::
    269    *     A handle to the source glyph slot.
    270    *
    271    * @output:
    272    *   aglyph ::
    273    *     A handle to the glyph object.
    274    *
    275    * @return:
    276    *   FreeType error code.  0~means success.
    277    *
    278    * @note:
    279    *   Because `*aglyph->advance.x' and `*aglyph->advance.y' are 16.16
    280    *   fixed-point numbers, `slot->advance.x' and `slot->advance.y'
    281    *   (which are in 26.6 fixed-point format) must be in the range
    282    *   ]-32768;32768[.
    283    */
    284   FT_EXPORT( FT_Error )
    285   FT_Get_Glyph( FT_GlyphSlot  slot,
    286                 FT_Glyph     *aglyph );
    287 
    288 
    289   /**************************************************************************
    290    *
    291    * @function:
    292    *   FT_Glyph_Copy
    293    *
    294    * @description:
    295    *   A function used to copy a glyph image.  Note that the created
    296    *   @FT_Glyph object must be released with @FT_Done_Glyph.
    297    *
    298    * @input:
    299    *   source ::
    300    *     A handle to the source glyph object.
    301    *
    302    * @output:
    303    *   target ::
    304    *     A handle to the target glyph object.  0~in case of
    305    *     error.
    306    *
    307    * @return:
    308    *   FreeType error code.  0~means success.
    309    */
    310   FT_EXPORT( FT_Error )
    311   FT_Glyph_Copy( FT_Glyph   source,
    312                  FT_Glyph  *target );
    313 
    314 
    315   /**************************************************************************
    316    *
    317    * @function:
    318    *   FT_Glyph_Transform
    319    *
    320    * @description:
    321    *   Transform a glyph image if its format is scalable.
    322    *
    323    * @inout:
    324    *   glyph ::
    325    *     A handle to the target glyph object.
    326    *
    327    * @input:
    328    *   matrix ::
    329    *     A pointer to a 2x2 matrix to apply.
    330    *
    331    *   delta ::
    332    *     A pointer to a 2d vector to apply.  Coordinates are
    333    *     expressed in 1/64th of a pixel.
    334    *
    335    * @return:
    336    *   FreeType error code (if not 0, the glyph format is not scalable).
    337    *
    338    * @note:
    339    *   The 2x2 transformation matrix is also applied to the glyph's
    340    *   advance vector.
    341    */
    342   FT_EXPORT( FT_Error )
    343   FT_Glyph_Transform( FT_Glyph    glyph,
    344                       FT_Matrix*  matrix,
    345                       FT_Vector*  delta );
    346 
    347 
    348   /**************************************************************************
    349    *
    350    * @enum:
    351    *   FT_Glyph_BBox_Mode
    352    *
    353    * @description:
    354    *   The mode how the values of @FT_Glyph_Get_CBox are returned.
    355    *
    356    * @values:
    357    *   FT_GLYPH_BBOX_UNSCALED ::
    358    *     Return unscaled font units.
    359    *
    360    *   FT_GLYPH_BBOX_SUBPIXELS ::
    361    *     Return unfitted 26.6 coordinates.
    362    *
    363    *   FT_GLYPH_BBOX_GRIDFIT ::
    364    *     Return grid-fitted 26.6 coordinates.
    365    *
    366    *   FT_GLYPH_BBOX_TRUNCATE ::
    367    *     Return coordinates in integer pixels.
    368    *
    369    *   FT_GLYPH_BBOX_PIXELS ::
    370    *     Return grid-fitted pixel coordinates.
    371    */
    372   typedef enum  FT_Glyph_BBox_Mode_
    373   {
    374     FT_GLYPH_BBOX_UNSCALED  = 0,
    375     FT_GLYPH_BBOX_SUBPIXELS = 0,
    376     FT_GLYPH_BBOX_GRIDFIT   = 1,
    377     FT_GLYPH_BBOX_TRUNCATE  = 2,
    378     FT_GLYPH_BBOX_PIXELS    = 3
    379 
    380   } FT_Glyph_BBox_Mode;
    381 
    382 
    383   /* these constants are deprecated; use the corresponding */
    384   /* `FT_Glyph_BBox_Mode' values instead                   */
    385 #define ft_glyph_bbox_unscaled   FT_GLYPH_BBOX_UNSCALED
    386 #define ft_glyph_bbox_subpixels  FT_GLYPH_BBOX_SUBPIXELS
    387 #define ft_glyph_bbox_gridfit    FT_GLYPH_BBOX_GRIDFIT
    388 #define ft_glyph_bbox_truncate   FT_GLYPH_BBOX_TRUNCATE
    389 #define ft_glyph_bbox_pixels     FT_GLYPH_BBOX_PIXELS
    390 
    391 
    392   /**************************************************************************
    393    *
    394    * @function:
    395    *   FT_Glyph_Get_CBox
    396    *
    397    * @description:
    398    *   Return a glyph's `control box'.  The control box encloses all the
    399    *   outline's points, including Bezier control points.  Though it
    400    *   coincides with the exact bounding box for most glyphs, it can be
    401    *   slightly larger in some situations (like when rotating an outline
    402    *   that contains Bezier outside arcs).
    403    *
    404    *   Computing the control box is very fast, while getting the bounding
    405    *   box can take much more time as it needs to walk over all segments
    406    *   and arcs in the outline.  To get the latter, you can use the
    407    *   `ftbbox' component, which is dedicated to this single task.
    408    *
    409    * @input:
    410    *   glyph ::
    411    *     A handle to the source glyph object.
    412    *
    413    *   mode ::
    414    *     The mode that indicates how to interpret the returned
    415    *     bounding box values.
    416    *
    417    * @output:
    418    *   acbox ::
    419    *     The glyph coordinate bounding box.  Coordinates are
    420    *     expressed in 1/64th of pixels if it is grid-fitted.
    421    *
    422    * @note:
    423    *   Coordinates are relative to the glyph origin, using the y~upwards
    424    *   convention.
    425    *
    426    *   If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode'
    427    *   must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font
    428    *   units in 26.6 pixel format.  The value @FT_GLYPH_BBOX_SUBPIXELS
    429    *   is another name for this constant.
    430    *
    431    *   If the font is tricky and the glyph has been loaded with
    432    *   @FT_LOAD_NO_SCALE, the resulting CBox is meaningless.  To get
    433    *   reasonable values for the CBox it is necessary to load the glyph
    434    *   at a large ppem value (so that the hinting instructions can
    435    *   properly shift and scale the subglyphs), then extracting the CBox,
    436    *   which can be eventually converted back to font units.
    437    *
    438    *   Note that the maximum coordinates are exclusive, which means that
    439    *   one can compute the width and height of the glyph image (be it in
    440    *   integer or 26.6 pixels) as:
    441    *
    442    *   {
    443    *     width  = bbox.xMax - bbox.xMin;
    444    *     height = bbox.yMax - bbox.yMin;
    445    *   }
    446    *
    447    *   Note also that for 26.6 coordinates, if `bbox_mode' is set to
    448    *   @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted,
    449    *   which corresponds to:
    450    *
    451    *   {
    452    *     bbox.xMin = FLOOR(bbox.xMin);
    453    *     bbox.yMin = FLOOR(bbox.yMin);
    454    *     bbox.xMax = CEILING(bbox.xMax);
    455    *     bbox.yMax = CEILING(bbox.yMax);
    456    *   }
    457    *
    458    *   To get the bbox in pixel coordinates, set `bbox_mode' to
    459    *   @FT_GLYPH_BBOX_TRUNCATE.
    460    *
    461    *   To get the bbox in grid-fitted pixel coordinates, set `bbox_mode'
    462    *   to @FT_GLYPH_BBOX_PIXELS.
    463    */
    464   FT_EXPORT( void )
    465   FT_Glyph_Get_CBox( FT_Glyph  glyph,
    466                      FT_UInt   bbox_mode,
    467                      FT_BBox  *acbox );
    468 
    469 
    470   /**************************************************************************
    471    *
    472    * @function:
    473    *   FT_Glyph_To_Bitmap
    474    *
    475    * @description:
    476    *   Convert a given glyph object to a bitmap glyph object.
    477    *
    478    * @inout:
    479    *   the_glyph ::
    480    *     A pointer to a handle to the target glyph.
    481    *
    482    * @input:
    483    *   render_mode ::
    484    *     An enumeration that describes how the data is
    485    *     rendered.
    486    *
    487    *   origin ::
    488    *     A pointer to a vector used to translate the glyph
    489    *     image before rendering.  Can be~0 (if no
    490    *     translation).  The origin is expressed in
    491    *     26.6 pixels.
    492    *
    493    *   destroy ::
    494    *     A boolean that indicates that the original glyph
    495    *     image should be destroyed by this function.  It is
    496    *     never destroyed in case of error.
    497    *
    498    * @return:
    499    *   FreeType error code.  0~means success.
    500    *
    501    * @note:
    502    *   This function does nothing if the glyph format isn't scalable.
    503    *
    504    *   The glyph image is translated with the `origin' vector before
    505    *   rendering.
    506    *
    507    *   The first parameter is a pointer to an @FT_Glyph handle, that will
    508    *   be _replaced_ by this function (with newly allocated data).
    509    *   Typically, you would use (omitting error handling):
    510    *
    511    *   {
    512    *     FT_Glyph        glyph;
    513    *     FT_BitmapGlyph  glyph_bitmap;
    514    *
    515    *
    516    *     // load glyph
    517    *     error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAULT );
    518    *
    519    *     // extract glyph image
    520    *     error = FT_Get_Glyph( face->glyph, &glyph );
    521    *
    522    *     // convert to a bitmap (default render mode + destroying old)
    523    *     if ( glyph->format != FT_GLYPH_FORMAT_BITMAP )
    524    *     {
    525    *       error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL,
    526    *                                     0, 1 );
    527    *       if ( error ) // `glyph' unchanged
    528    *         ...
    529    *     }
    530    *
    531    *     // access bitmap content by typecasting
    532    *     glyph_bitmap = (FT_BitmapGlyph)glyph;
    533    *
    534    *     // do funny stuff with it, like blitting/drawing
    535    *     ...
    536    *
    537    *     // discard glyph image (bitmap or not)
    538    *     FT_Done_Glyph( glyph );
    539    *   }
    540    *
    541    *   Here another example, again without error handling:
    542    *
    543    *   {
    544    *     FT_Glyph  glyphs[MAX_GLYPHS]
    545    *
    546    *
    547    *     ...
    548    *
    549    *     for ( idx = 0; i < MAX_GLYPHS; i++ )
    550    *       error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) ||
    551    *               FT_Get_Glyph ( face->glyph, &glyphs[idx] );
    552    *
    553    *     ...
    554    *
    555    *     for ( idx = 0; i < MAX_GLYPHS; i++ )
    556    *     {
    557    *       FT_Glyph  bitmap = glyphs[idx];
    558    *
    559    *
    560    *       ...
    561    *
    562    *       // after this call, `bitmap' no longer points into
    563    *       // the `glyphs' array (and the old value isn't destroyed)
    564    *       FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 );
    565    *
    566    *       ...
    567    *
    568    *       FT_Done_Glyph( bitmap );
    569    *     }
    570    *
    571    *     ...
    572    *
    573    *     for ( idx = 0; i < MAX_GLYPHS; i++ )
    574    *       FT_Done_Glyph( glyphs[idx] );
    575    *   }
    576    */
    577   FT_EXPORT( FT_Error )
    578   FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,
    579                       FT_Render_Mode  render_mode,
    580                       FT_Vector*      origin,
    581                       FT_Bool         destroy );
    582 
    583 
    584   /**************************************************************************
    585    *
    586    * @function:
    587    *   FT_Done_Glyph
    588    *
    589    * @description:
    590    *   Destroy a given glyph.
    591    *
    592    * @input:
    593    *   glyph ::
    594    *     A handle to the target glyph object.
    595    */
    596   FT_EXPORT( void )
    597   FT_Done_Glyph( FT_Glyph  glyph );
    598 
    599   /* */
    600 
    601 
    602   /* other helpful functions */
    603 
    604   /**************************************************************************
    605    *
    606    * @section:
    607    *   computations
    608    *
    609    */
    610 
    611 
    612   /**************************************************************************
    613    *
    614    * @function:
    615    *   FT_Matrix_Multiply
    616    *
    617    * @description:
    618    *   Perform the matrix operation `b = a*b'.
    619    *
    620    * @input:
    621    *   a ::
    622    *     A pointer to matrix `a'.
    623    *
    624    * @inout:
    625    *   b ::
    626    *     A pointer to matrix `b'.
    627    *
    628    * @note:
    629    *   The result is undefined if either `a' or `b' is zero.
    630    *
    631    *   Since the function uses wrap-around arithmetic, results become
    632    *   meaningless if the arguments are very large.
    633    */
    634   FT_EXPORT( void )
    635   FT_Matrix_Multiply( const FT_Matrix*  a,
    636                       FT_Matrix*        b );
    637 
    638 
    639   /**************************************************************************
    640    *
    641    * @function:
    642    *   FT_Matrix_Invert
    643    *
    644    * @description:
    645    *   Invert a 2x2 matrix.  Return an error if it can't be inverted.
    646    *
    647    * @inout:
    648    *   matrix ::
    649    *     A pointer to the target matrix.  Remains untouched in
    650    *     case of error.
    651    *
    652    * @return:
    653    *   FreeType error code.  0~means success.
    654    */
    655   FT_EXPORT( FT_Error )
    656   FT_Matrix_Invert( FT_Matrix*  matrix );
    657 
    658   /* */
    659 
    660 
    661 FT_END_HEADER
    662 
    663 #endif /* FTGLYPH_H_ */
    664 
    665 
    666 /* END */
    667 
    668 
    669 /* Local Variables: */
    670 /* coding: utf-8    */
    671 /* End:             */
    672