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