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