tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ftglyph.h (20912B)


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