Home | History | Annotate | Download | only in freetype2
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  ftoutln.h                                                              */
      4 /*                                                                         */
      5 /*    Support for the FT_Outline type used to store glyph shapes of        */
      6 /*    most scalable font formats (specification).                          */
      7 /*                                                                         */
      8 /*  Copyright 1996-2015 by                                                 */
      9 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
     10 /*                                                                         */
     11 /*  This file is part of the FreeType project, and may only be used,       */
     12 /*  modified, and distributed under the terms of the FreeType project      */
     13 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
     14 /*  this file you indicate that you have read the license and              */
     15 /*  understand and accept it fully.                                        */
     16 /*                                                                         */
     17 /***************************************************************************/
     18 
     19 
     20 #ifndef __FTOUTLN_H__
     21 #define __FTOUTLN_H__
     22 
     23 
     24 #include <ft2build.h>
     25 #include FT_FREETYPE_H
     26 
     27 #ifdef FREETYPE_H
     28 #error "freetype.h of FreeType 1 has been loaded!"
     29 #error "Please fix the directory search order for header files"
     30 #error "so that freetype.h of FreeType 2 is found first."
     31 #endif
     32 
     33 
     34 FT_BEGIN_HEADER
     35 
     36 
     37   /*************************************************************************/
     38   /*                                                                       */
     39   /* <Section>                                                             */
     40   /*    outline_processing                                                 */
     41   /*                                                                       */
     42   /* <Title>                                                               */
     43   /*    Outline Processing                                                 */
     44   /*                                                                       */
     45   /* <Abstract>                                                            */
     46   /*    Functions to create, transform, and render vectorial glyph images. */
     47   /*                                                                       */
     48   /* <Description>                                                         */
     49   /*    This section contains routines used to create and destroy scalable */
     50   /*    glyph images known as `outlines'.  These can also be measured,     */
     51   /*    transformed, and converted into bitmaps and pixmaps.               */
     52   /*                                                                       */
     53   /* <Order>                                                               */
     54   /*    FT_Outline                                                         */
     55   /*    FT_Outline_New                                                     */
     56   /*    FT_Outline_Done                                                    */
     57   /*    FT_Outline_Copy                                                    */
     58   /*    FT_Outline_Translate                                               */
     59   /*    FT_Outline_Transform                                               */
     60   /*    FT_Outline_Embolden                                                */
     61   /*    FT_Outline_EmboldenXY                                              */
     62   /*    FT_Outline_Reverse                                                 */
     63   /*    FT_Outline_Check                                                   */
     64   /*                                                                       */
     65   /*    FT_Outline_Get_CBox                                                */
     66   /*    FT_Outline_Get_BBox                                                */
     67   /*                                                                       */
     68   /*    FT_Outline_Get_Bitmap                                              */
     69   /*    FT_Outline_Render                                                  */
     70   /*    FT_Outline_Decompose                                               */
     71   /*    FT_Outline_Funcs                                                   */
     72   /*    FT_Outline_MoveToFunc                                              */
     73   /*    FT_Outline_LineToFunc                                              */
     74   /*    FT_Outline_ConicToFunc                                             */
     75   /*    FT_Outline_CubicToFunc                                             */
     76   /*                                                                       */
     77   /*    FT_Orientation                                                     */
     78   /*    FT_Outline_Get_Orientation                                         */
     79   /*                                                                       */
     80   /*    FT_OUTLINE_XXX                                                     */
     81   /*                                                                       */
     82   /*************************************************************************/
     83 
     84 
     85   /*************************************************************************/
     86   /*                                                                       */
     87   /* <Function>                                                            */
     88   /*    FT_Outline_Decompose                                               */
     89   /*                                                                       */
     90   /* <Description>                                                         */
     91   /*    Walk over an outline's structure to decompose it into individual   */
     92   /*    segments and Bzier arcs.  This function also emits `move to'      */
     93   /*    operations to indicate the start of new contours in the outline.   */
     94   /*                                                                       */
     95   /* <Input>                                                               */
     96   /*    outline        :: A pointer to the source target.                  */
     97   /*                                                                       */
     98   /*    func_interface :: A table of `emitters', i.e., function pointers   */
     99   /*                      called during decomposition to indicate path     */
    100   /*                      operations.                                      */
    101   /*                                                                       */
    102   /* <InOut>                                                               */
    103   /*    user           :: A typeless pointer that is passed to each        */
    104   /*                      emitter during the decomposition.  It can be     */
    105   /*                      used to store the state during the               */
    106   /*                      decomposition.                                   */
    107   /*                                                                       */
    108   /* <Return>                                                              */
    109   /*    FreeType error code.  0~means success.                             */
    110   /*                                                                       */
    111   /* <Note>                                                                */
    112   /*    A contour that contains a single point only is represented by a    */
    113   /*    `move to' operation followed by `line to' to the same point.  In   */
    114   /*    most cases, it is best to filter this out before using the         */
    115   /*    outline for stroking purposes (otherwise it would result in a      */
    116   /*    visible dot when round caps are used).                             */
    117   /*                                                                       */
    118   FT_EXPORT( FT_Error )
    119   FT_Outline_Decompose( FT_Outline*              outline,
    120                         const FT_Outline_Funcs*  func_interface,
    121                         void*                    user );
    122 
    123 
    124   /*************************************************************************/
    125   /*                                                                       */
    126   /* <Function>                                                            */
    127   /*    FT_Outline_New                                                     */
    128   /*                                                                       */
    129   /* <Description>                                                         */
    130   /*    Create a new outline of a given size.                              */
    131   /*                                                                       */
    132   /* <Input>                                                               */
    133   /*    library     :: A handle to the library object from where the       */
    134   /*                   outline is allocated.  Note however that the new    */
    135   /*                   outline will *not* necessarily be *freed*, when     */
    136   /*                   destroying the library, by @FT_Done_FreeType.       */
    137   /*                                                                       */
    138   /*    numPoints   :: The maximum number of points within the outline.    */
    139   /*                   Must be smaller than or equal to 0xFFFF (65535).    */
    140   /*                                                                       */
    141   /*    numContours :: The maximum number of contours within the outline.  */
    142   /*                   This value must be in the range 0 to `numPoints'.   */
    143   /*                                                                       */
    144   /* <Output>                                                              */
    145   /*    anoutline   :: A handle to the new outline.                        */
    146   /*                                                                       */
    147   /* <Return>                                                              */
    148   /*    FreeType error code.  0~means success.                             */
    149   /*                                                                       */
    150   /* <Note>                                                                */
    151   /*    The reason why this function takes a `library' parameter is simply */
    152   /*    to use the library's memory allocator.                             */
    153   /*                                                                       */
    154   FT_EXPORT( FT_Error )
    155   FT_Outline_New( FT_Library   library,
    156                   FT_UInt      numPoints,
    157                   FT_Int       numContours,
    158                   FT_Outline  *anoutline );
    159 
    160 
    161   FT_EXPORT( FT_Error )
    162   FT_Outline_New_Internal( FT_Memory    memory,
    163                            FT_UInt      numPoints,
    164                            FT_Int       numContours,
    165                            FT_Outline  *anoutline );
    166 
    167 
    168   /*************************************************************************/
    169   /*                                                                       */
    170   /* <Function>                                                            */
    171   /*    FT_Outline_Done                                                    */
    172   /*                                                                       */
    173   /* <Description>                                                         */
    174   /*    Destroy an outline created with @FT_Outline_New.                   */
    175   /*                                                                       */
    176   /* <Input>                                                               */
    177   /*    library :: A handle of the library object used to allocate the     */
    178   /*               outline.                                                */
    179   /*                                                                       */
    180   /*    outline :: A pointer to the outline object to be discarded.        */
    181   /*                                                                       */
    182   /* <Return>                                                              */
    183   /*    FreeType error code.  0~means success.                             */
    184   /*                                                                       */
    185   /* <Note>                                                                */
    186   /*    If the outline's `owner' field is not set, only the outline        */
    187   /*    descriptor will be released.                                       */
    188   /*                                                                       */
    189   /*    The reason why this function takes an `library' parameter is       */
    190   /*    simply to use ft_mem_free().                                       */
    191   /*                                                                       */
    192   FT_EXPORT( FT_Error )
    193   FT_Outline_Done( FT_Library   library,
    194                    FT_Outline*  outline );
    195 
    196 
    197   FT_EXPORT( FT_Error )
    198   FT_Outline_Done_Internal( FT_Memory    memory,
    199                             FT_Outline*  outline );
    200 
    201 
    202   /*************************************************************************/
    203   /*                                                                       */
    204   /* <Function>                                                            */
    205   /*    FT_Outline_Check                                                   */
    206   /*                                                                       */
    207   /* <Description>                                                         */
    208   /*    Check the contents of an outline descriptor.                       */
    209   /*                                                                       */
    210   /* <Input>                                                               */
    211   /*    outline :: A handle to a source outline.                           */
    212   /*                                                                       */
    213   /* <Return>                                                              */
    214   /*    FreeType error code.  0~means success.                             */
    215   /*                                                                       */
    216   FT_EXPORT( FT_Error )
    217   FT_Outline_Check( FT_Outline*  outline );
    218 
    219 
    220   /*************************************************************************/
    221   /*                                                                       */
    222   /* <Function>                                                            */
    223   /*    FT_Outline_Get_CBox                                                */
    224   /*                                                                       */
    225   /* <Description>                                                         */
    226   /*    Return an outline's `control box'.  The control box encloses all   */
    227   /*    the outline's points, including Bzier control points.  Though it  */
    228   /*    coincides with the exact bounding box for most glyphs, it can be   */
    229   /*    slightly larger in some situations (like when rotating an outline  */
    230   /*    that contains Bzier outside arcs).                                */
    231   /*                                                                       */
    232   /*    Computing the control box is very fast, while getting the bounding */
    233   /*    box can take much more time as it needs to walk over all segments  */
    234   /*    and arcs in the outline.  To get the latter, you can use the       */
    235   /*    `ftbbox' component, which is dedicated to this single task.        */
    236   /*                                                                       */
    237   /* <Input>                                                               */
    238   /*    outline :: A pointer to the source outline descriptor.             */
    239   /*                                                                       */
    240   /* <Output>                                                              */
    241   /*    acbox   :: The outline's control box.                              */
    242   /*                                                                       */
    243   /* <Note>                                                                */
    244   /*    See @FT_Glyph_Get_CBox for a discussion of tricky fonts.           */
    245   /*                                                                       */
    246   FT_EXPORT( void )
    247   FT_Outline_Get_CBox( const FT_Outline*  outline,
    248                        FT_BBox           *acbox );
    249 
    250 
    251   /*************************************************************************/
    252   /*                                                                       */
    253   /* <Function>                                                            */
    254   /*    FT_Outline_Translate                                               */
    255   /*                                                                       */
    256   /* <Description>                                                         */
    257   /*    Apply a simple translation to the points of an outline.            */
    258   /*                                                                       */
    259   /* <InOut>                                                               */
    260   /*    outline :: A pointer to the target outline descriptor.             */
    261   /*                                                                       */
    262   /* <Input>                                                               */
    263   /*    xOffset :: The horizontal offset.                                  */
    264   /*                                                                       */
    265   /*    yOffset :: The vertical offset.                                    */
    266   /*                                                                       */
    267   FT_EXPORT( void )
    268   FT_Outline_Translate( const FT_Outline*  outline,
    269                         FT_Pos             xOffset,
    270                         FT_Pos             yOffset );
    271 
    272 
    273   /*************************************************************************/
    274   /*                                                                       */
    275   /* <Function>                                                            */
    276   /*    FT_Outline_Copy                                                    */
    277   /*                                                                       */
    278   /* <Description>                                                         */
    279   /*    Copy an outline into another one.  Both objects must have the      */
    280   /*    same sizes (number of points & number of contours) when this       */
    281   /*    function is called.                                                */
    282   /*                                                                       */
    283   /* <Input>                                                               */
    284   /*    source :: A handle to the source outline.                          */
    285   /*                                                                       */
    286   /* <Output>                                                              */
    287   /*    target :: A handle to the target outline.                          */
    288   /*                                                                       */
    289   /* <Return>                                                              */
    290   /*    FreeType error code.  0~means success.                             */
    291   /*                                                                       */
    292   FT_EXPORT( FT_Error )
    293   FT_Outline_Copy( const FT_Outline*  source,
    294                    FT_Outline        *target );
    295 
    296 
    297   /*************************************************************************/
    298   /*                                                                       */
    299   /* <Function>                                                            */
    300   /*    FT_Outline_Transform                                               */
    301   /*                                                                       */
    302   /* <Description>                                                         */
    303   /*    Apply a simple 2x2 matrix to all of an outline's points.  Useful   */
    304   /*    for applying rotations, slanting, flipping, etc.                   */
    305   /*                                                                       */
    306   /* <InOut>                                                               */
    307   /*    outline :: A pointer to the target outline descriptor.             */
    308   /*                                                                       */
    309   /* <Input>                                                               */
    310   /*    matrix  :: A pointer to the transformation matrix.                 */
    311   /*                                                                       */
    312   /* <Note>                                                                */
    313   /*    You can use @FT_Outline_Translate if you need to translate the     */
    314   /*    outline's points.                                                  */
    315   /*                                                                       */
    316   FT_EXPORT( void )
    317   FT_Outline_Transform( const FT_Outline*  outline,
    318                         const FT_Matrix*   matrix );
    319 
    320 
    321   /*************************************************************************/
    322   /*                                                                       */
    323   /* <Function>                                                            */
    324   /*    FT_Outline_Embolden                                                */
    325   /*                                                                       */
    326   /* <Description>                                                         */
    327   /*    Embolden an outline.  The new outline will be at most 4~times      */
    328   /*    `strength' pixels wider and higher.  You may think of the left and */
    329   /*    bottom borders as unchanged.                                       */
    330   /*                                                                       */
    331   /*    Negative `strength' values to reduce the outline thickness are     */
    332   /*    possible also.                                                     */
    333   /*                                                                       */
    334   /* <InOut>                                                               */
    335   /*    outline  :: A handle to the target outline.                        */
    336   /*                                                                       */
    337   /* <Input>                                                               */
    338   /*    strength :: How strong the glyph is emboldened.  Expressed in      */
    339   /*                26.6 pixel format.                                     */
    340   /*                                                                       */
    341   /* <Return>                                                              */
    342   /*    FreeType error code.  0~means success.                             */
    343   /*                                                                       */
    344   /* <Note>                                                                */
    345   /*    The used algorithm to increase or decrease the thickness of the    */
    346   /*    glyph doesn't change the number of points; this means that certain */
    347   /*    situations like acute angles or intersections are sometimes        */
    348   /*    handled incorrectly.                                               */
    349   /*                                                                       */
    350   /*    If you need `better' metrics values you should call                */
    351   /*    @FT_Outline_Get_CBox or @FT_Outline_Get_BBox.                      */
    352   /*                                                                       */
    353   /*    Example call:                                                      */
    354   /*                                                                       */
    355   /*    {                                                                  */
    356   /*      FT_Load_Glyph( face, index, FT_LOAD_DEFAULT );                   */
    357   /*      if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE )             */
    358   /*        FT_Outline_Embolden( &face->slot->outline, strength );         */
    359   /*    }                                                                  */
    360   /*                                                                       */
    361   /*    To get meaningful results, font scaling values must be set with    */
    362   /*    functions like @FT_Set_Char_Size before calling FT_Render_Glyph.   */
    363   /*                                                                       */
    364   FT_EXPORT( FT_Error )
    365   FT_Outline_Embolden( FT_Outline*  outline,
    366                        FT_Pos       strength );
    367 
    368 
    369   /*************************************************************************/
    370   /*                                                                       */
    371   /* <Function>                                                            */
    372   /*    FT_Outline_EmboldenXY                                              */
    373   /*                                                                       */
    374   /* <Description>                                                         */
    375   /*    Embolden an outline.  The new outline will be `xstrength' pixels   */
    376   /*    wider and `ystrength' pixels higher.  Otherwise, it is similar to  */
    377   /*    @FT_Outline_Embolden, which uses the same strength in both         */
    378   /*    directions.                                                        */
    379   /*                                                                       */
    380   FT_EXPORT( FT_Error )
    381   FT_Outline_EmboldenXY( FT_Outline*  outline,
    382                          FT_Pos       xstrength,
    383                          FT_Pos       ystrength );
    384 
    385 
    386   /*************************************************************************/
    387   /*                                                                       */
    388   /* <Function>                                                            */
    389   /*    FT_Outline_Reverse                                                 */
    390   /*                                                                       */
    391   /* <Description>                                                         */
    392   /*    Reverse the drawing direction of an outline.  This is used to      */
    393   /*    ensure consistent fill conventions for mirrored glyphs.            */
    394   /*                                                                       */
    395   /* <InOut>                                                               */
    396   /*    outline :: A pointer to the target outline descriptor.             */
    397   /*                                                                       */
    398   /* <Note>                                                                */
    399   /*    This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in     */
    400   /*    the outline's `flags' field.                                       */
    401   /*                                                                       */
    402   /*    It shouldn't be used by a normal client application, unless it     */
    403   /*    knows what it is doing.                                            */
    404   /*                                                                       */
    405   FT_EXPORT( void )
    406   FT_Outline_Reverse( FT_Outline*  outline );
    407 
    408 
    409   /*************************************************************************/
    410   /*                                                                       */
    411   /* <Function>                                                            */
    412   /*    FT_Outline_Get_Bitmap                                              */
    413   /*                                                                       */
    414   /* <Description>                                                         */
    415   /*    Render an outline within a bitmap.  The outline's image is simply  */
    416   /*    OR-ed to the target bitmap.                                        */
    417   /*                                                                       */
    418   /* <Input>                                                               */
    419   /*    library :: A handle to a FreeType library object.                  */
    420   /*                                                                       */
    421   /*    outline :: A pointer to the source outline descriptor.             */
    422   /*                                                                       */
    423   /* <InOut>                                                               */
    424   /*    abitmap :: A pointer to the target bitmap descriptor.              */
    425   /*                                                                       */
    426   /* <Return>                                                              */
    427   /*    FreeType error code.  0~means success.                             */
    428   /*                                                                       */
    429   /* <Note>                                                                */
    430   /*    This function does NOT CREATE the bitmap, it only renders an       */
    431   /*    outline image within the one you pass to it!  Consequently, the    */
    432   /*    various fields in `abitmap' should be set accordingly.             */
    433   /*                                                                       */
    434   /*    It will use the raster corresponding to the default glyph format.  */
    435   /*                                                                       */
    436   /*    The value of the `num_grays' field in `abitmap' is ignored.  If    */
    437   /*    you select the gray-level rasterizer, and you want less than 256   */
    438   /*    gray levels, you have to use @FT_Outline_Render directly.          */
    439   /*                                                                       */
    440   FT_EXPORT( FT_Error )
    441   FT_Outline_Get_Bitmap( FT_Library        library,
    442                          FT_Outline*       outline,
    443                          const FT_Bitmap  *abitmap );
    444 
    445 
    446   /*************************************************************************/
    447   /*                                                                       */
    448   /* <Function>                                                            */
    449   /*    FT_Outline_Render                                                  */
    450   /*                                                                       */
    451   /* <Description>                                                         */
    452   /*    Render an outline within a bitmap using the current scan-convert.  */
    453   /*    This function uses an @FT_Raster_Params structure as an argument,  */
    454   /*    allowing advanced features like direct composition, translucency,  */
    455   /*    etc.                                                               */
    456   /*                                                                       */
    457   /* <Input>                                                               */
    458   /*    library :: A handle to a FreeType library object.                  */
    459   /*                                                                       */
    460   /*    outline :: A pointer to the source outline descriptor.             */
    461   /*                                                                       */
    462   /* <InOut>                                                               */
    463   /*    params  :: A pointer to an @FT_Raster_Params structure used to     */
    464   /*               describe the rendering operation.                       */
    465   /*                                                                       */
    466   /* <Return>                                                              */
    467   /*    FreeType error code.  0~means success.                             */
    468   /*                                                                       */
    469   /* <Note>                                                                */
    470   /*    You should know what you are doing and how @FT_Raster_Params works */
    471   /*    to use this function.                                              */
    472   /*                                                                       */
    473   /*    The field `params.source' will be set to `outline' before the scan */
    474   /*    converter is called, which means that the value you give to it is  */
    475   /*    actually ignored.                                                  */
    476   /*                                                                       */
    477   /*    The gray-level rasterizer always uses 256 gray levels.  If you     */
    478   /*    want less gray levels, you have to provide your own span callback. */
    479   /*    See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the   */
    480   /*    @FT_Raster_Params structure for more details.                      */
    481   /*                                                                       */
    482   FT_EXPORT( FT_Error )
    483   FT_Outline_Render( FT_Library         library,
    484                      FT_Outline*        outline,
    485                      FT_Raster_Params*  params );
    486 
    487 
    488  /**************************************************************************
    489   *
    490   * @enum:
    491   *   FT_Orientation
    492   *
    493   * @description:
    494   *   A list of values used to describe an outline's contour orientation.
    495   *
    496   *   The TrueType and PostScript specifications use different conventions
    497   *   to determine whether outline contours should be filled or unfilled.
    498   *
    499   * @values:
    500   *   FT_ORIENTATION_TRUETYPE ::
    501   *     According to the TrueType specification, clockwise contours must
    502   *     be filled, and counter-clockwise ones must be unfilled.
    503   *
    504   *   FT_ORIENTATION_POSTSCRIPT ::
    505   *     According to the PostScript specification, counter-clockwise contours
    506   *     must be filled, and clockwise ones must be unfilled.
    507   *
    508   *   FT_ORIENTATION_FILL_RIGHT ::
    509   *     This is identical to @FT_ORIENTATION_TRUETYPE, but is used to
    510   *     remember that in TrueType, everything that is to the right of
    511   *     the drawing direction of a contour must be filled.
    512   *
    513   *   FT_ORIENTATION_FILL_LEFT ::
    514   *     This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to
    515   *     remember that in PostScript, everything that is to the left of
    516   *     the drawing direction of a contour must be filled.
    517   *
    518   *   FT_ORIENTATION_NONE ::
    519   *     The orientation cannot be determined.  That is, different parts of
    520   *     the glyph have different orientation.
    521   *
    522   */
    523   typedef enum  FT_Orientation_
    524   {
    525     FT_ORIENTATION_TRUETYPE   = 0,
    526     FT_ORIENTATION_POSTSCRIPT = 1,
    527     FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE,
    528     FT_ORIENTATION_FILL_LEFT  = FT_ORIENTATION_POSTSCRIPT,
    529     FT_ORIENTATION_NONE
    530 
    531   } FT_Orientation;
    532 
    533 
    534  /**************************************************************************
    535   *
    536   * @function:
    537   *   FT_Outline_Get_Orientation
    538   *
    539   * @description:
    540   *   This function analyzes a glyph outline and tries to compute its
    541   *   fill orientation (see @FT_Orientation).  This is done by integrating
    542   *   the total area covered by the outline. The positive integral
    543   *   corresponds to the clockwise orientation and @FT_ORIENTATION_POSTSCRIPT
    544   *   is returned. The negative integral corresponds to the counter-clockwise
    545   *   orientation and @FT_ORIENTATION_TRUETYPE is returned.
    546   *
    547   *   Note that this will return @FT_ORIENTATION_TRUETYPE for empty
    548   *   outlines.
    549   *
    550   * @input:
    551   *   outline ::
    552   *     A handle to the source outline.
    553   *
    554   * @return:
    555   *   The orientation.
    556   *
    557   */
    558   FT_EXPORT( FT_Orientation )
    559   FT_Outline_Get_Orientation( FT_Outline*  outline );
    560 
    561   /* */
    562 
    563 
    564 FT_END_HEADER
    565 
    566 #endif /* __FTOUTLN_H__ */
    567 
    568 
    569 /* END */
    570 
    571 
    572 /* Local Variables: */
    573 /* coding: utf-8    */
    574 /* End:             */
    575