(root)/
freetype-2.13.2/
include/
freetype/
ftdriver.h
       1  /****************************************************************************
       2   *
       3   * ftdriver.h
       4   *
       5   *   FreeType API for controlling driver modules (specification only).
       6   *
       7   * Copyright (C) 2017-2023 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  #ifndef FTDRIVER_H_
      20  #define FTDRIVER_H_
      21  
      22  #include <freetype/freetype.h>
      23  #include <freetype/ftparams.h>
      24  
      25  #ifdef FREETYPE_H
      26  #error "freetype.h of FreeType 1 has been loaded!"
      27  #error "Please fix the directory search order for header files"
      28  #error "so that freetype.h of FreeType 2 is found first."
      29  #endif
      30  
      31  
      32  FT_BEGIN_HEADER
      33  
      34  
      35    /**************************************************************************
      36     *
      37     * @section:
      38     *   auto_hinter
      39     *
      40     * @title:
      41     *   The auto-hinter
      42     *
      43     * @abstract:
      44     *   Controlling the auto-hinting module.
      45     *
      46     * @description:
      47     *   While FreeType's auto-hinter doesn't expose API functions by itself,
      48     *   it is possible to control its behaviour with @FT_Property_Set and
      49     *   @FT_Property_Get.  The following lists the available properties
      50     *   together with the necessary macros and structures.
      51     *
      52     *   Note that the auto-hinter's module name is 'autofitter' for historical
      53     *   reasons.
      54     *
      55     *   Available properties are @increase-x-height, @no-stem-darkening
      56     *   (experimental), @darkening-parameters (experimental),
      57     *   @glyph-to-script-map (experimental), @fallback-script (experimental),
      58     *   and @default-script (experimental), as documented in the @properties
      59     *   section.
      60     *
      61     */
      62  
      63  
      64    /**************************************************************************
      65     *
      66     * @section:
      67     *   cff_driver
      68     *
      69     * @title:
      70     *   The CFF driver
      71     *
      72     * @abstract:
      73     *   Controlling the CFF driver module.
      74     *
      75     * @description:
      76     *   While FreeType's CFF driver doesn't expose API functions by itself, it
      77     *   is possible to control its behaviour with @FT_Property_Set and
      78     *   @FT_Property_Get.
      79     *
      80     *   The CFF driver's module name is 'cff'.
      81     *
      82     *   Available properties are @hinting-engine, @no-stem-darkening,
      83     *   @darkening-parameters, and @random-seed, as documented in the
      84     *   @properties section.
      85     *
      86     *
      87     *   **Hinting and anti-aliasing principles of the new engine**
      88     *
      89     *   The rasterizer is positioning horizontal features (e.g., ascender
      90     *   height & x-height, or crossbars) on the pixel grid and minimizing the
      91     *   amount of anti-aliasing applied to them, while placing vertical
      92     *   features (vertical stems) on the pixel grid without hinting, thus
      93     *   representing the stem position and weight accurately.  Sometimes the
      94     *   vertical stems may be only partially black.  In this context,
      95     *   'anti-aliasing' means that stems are not positioned exactly on pixel
      96     *   borders, causing a fuzzy appearance.
      97     *
      98     *   There are two principles behind this approach.
      99     *
     100     *   1) No hinting in the horizontal direction: Unlike 'superhinted'
     101     *   TrueType, which changes glyph widths to accommodate regular
     102     *   inter-glyph spacing, Adobe's approach is 'faithful to the design' in
     103     *   representing both the glyph width and the inter-glyph spacing designed
     104     *   for the font.  This makes the screen display as close as it can be to
     105     *   the result one would get with infinite resolution, while preserving
     106     *   what is considered the key characteristics of each glyph.  Note that
     107     *   the distances between unhinted and grid-fitted positions at small
     108     *   sizes are comparable to kerning values and thus would be noticeable
     109     *   (and distracting) while reading if hinting were applied.
     110     *
     111     *   One of the reasons to not hint horizontally is anti-aliasing for LCD
     112     *   screens: The pixel geometry of modern displays supplies three vertical
     113     *   subpixels as the eye moves horizontally across each visible pixel.  On
     114     *   devices where we can be certain this characteristic is present a
     115     *   rasterizer can take advantage of the subpixels to add increments of
     116     *   weight.  In Western writing systems this turns out to be the more
     117     *   critical direction anyway; the weights and spacing of vertical stems
     118     *   (see above) are central to Armenian, Cyrillic, Greek, and Latin type
     119     *   designs.  Even when the rasterizer uses greyscale anti-aliasing instead
     120     *   of color (a necessary compromise when one doesn't know the screen
     121     *   characteristics), the unhinted vertical features preserve the design's
     122     *   weight and spacing much better than aliased type would.
     123     *
     124     *   2) Alignment in the vertical direction: Weights and spacing along the
     125     *   y~axis are less critical; what is much more important is the visual
     126     *   alignment of related features (like cap-height and x-height).  The
     127     *   sense of alignment for these is enhanced by the sharpness of grid-fit
     128     *   edges, while the cruder vertical resolution (full pixels instead of
     129     *   1/3 pixels) is less of a problem.
     130     *
     131     *   On the technical side, horizontal alignment zones for ascender,
     132     *   x-height, and other important height values (traditionally called
     133     *   'blue zones') as defined in the font are positioned independently,
     134     *   each being rounded to the nearest pixel edge, taking care of overshoot
     135     *   suppression at small sizes, stem darkening, and scaling.
     136     *
     137     *   Hstems (that is, hint values defined in the font to help align
     138     *   horizontal features) that fall within a blue zone are said to be
     139     *   'captured' and are aligned to that zone.  Uncaptured stems are moved
     140     *   in one of four ways, top edge up or down, bottom edge up or down.
     141     *   Unless there are conflicting hstems, the smallest movement is taken to
     142     *   minimize distortion.
     143     *
     144     */
     145  
     146  
     147    /**************************************************************************
     148     *
     149     * @section:
     150     *   pcf_driver
     151     *
     152     * @title:
     153     *   The PCF driver
     154     *
     155     * @abstract:
     156     *   Controlling the PCF driver module.
     157     *
     158     * @description:
     159     *   While FreeType's PCF driver doesn't expose API functions by itself, it
     160     *   is possible to control its behaviour with @FT_Property_Set and
     161     *   @FT_Property_Get.  Right now, there is a single property
     162     *   @no-long-family-names available if FreeType is compiled with
     163     *   PCF_CONFIG_OPTION_LONG_FAMILY_NAMES.
     164     *
     165     *   The PCF driver's module name is 'pcf'.
     166     *
     167     */
     168  
     169  
     170    /**************************************************************************
     171     *
     172     * @section:
     173     *   t1_cid_driver
     174     *
     175     * @title:
     176     *   The Type 1 and CID drivers
     177     *
     178     * @abstract:
     179     *   Controlling the Type~1 and CID driver modules.
     180     *
     181     * @description:
     182     *   It is possible to control the behaviour of FreeType's Type~1 and
     183     *   Type~1 CID drivers with @FT_Property_Set and @FT_Property_Get.
     184     *
     185     *   Behind the scenes, both drivers use the Adobe CFF engine for hinting;
     186     *   however, the used properties must be specified separately.
     187     *
     188     *   The Type~1 driver's module name is 'type1'; the CID driver's module
     189     *   name is 't1cid'.
     190     *
     191     *   Available properties are @hinting-engine, @no-stem-darkening,
     192     *   @darkening-parameters, and @random-seed, as documented in the
     193     *   @properties section.
     194     *
     195     *   Please see the @cff_driver section for more details on the new hinting
     196     *   engine.
     197     *
     198     */
     199  
     200  
     201    /**************************************************************************
     202     *
     203     * @section:
     204     *   tt_driver
     205     *
     206     * @title:
     207     *   The TrueType driver
     208     *
     209     * @abstract:
     210     *   Controlling the TrueType driver module.
     211     *
     212     * @description:
     213     *   While FreeType's TrueType driver doesn't expose API functions by
     214     *   itself, it is possible to control its behaviour with @FT_Property_Set
     215     *   and @FT_Property_Get.
     216     *
     217     *   The TrueType driver's module name is 'truetype'; a single property
     218     *   @interpreter-version is available, as documented in the @properties
     219     *   section.
     220     *
     221     *   To help understand the differences between interpreter versions, we
     222     *   introduce a list of definitions, kindly provided by Greg Hitchcock.
     223     *
     224     *   _Bi-Level Rendering_
     225     *
     226     *   Monochromatic rendering, exclusively used in the early days of
     227     *   TrueType by both Apple and Microsoft.  Microsoft's GDI interface
     228     *   supported hinting of the right-side bearing point, such that the
     229     *   advance width could be non-linear.  Most often this was done to
     230     *   achieve some level of glyph symmetry.  To enable reasonable
     231     *   performance (e.g., not having to run hinting on all glyphs just to get
     232     *   the widths) there was a bit in the head table indicating if the side
     233     *   bearing was hinted, and additional tables, 'hdmx' and 'LTSH', to cache
     234     *   hinting widths across multiple sizes and device aspect ratios.
     235     *
     236     *   _Font Smoothing_
     237     *
     238     *   Microsoft's GDI implementation of anti-aliasing.  Not traditional
     239     *   anti-aliasing as the outlines were hinted before the sampling.  The
     240     *   widths matched the bi-level rendering.
     241     *
     242     *   _ClearType Rendering_
     243     *
     244     *   Technique that uses physical subpixels to improve rendering on LCD
     245     *   (and other) displays.  Because of the higher resolution, many methods
     246     *   of improving symmetry in glyphs through hinting the right-side bearing
     247     *   were no longer necessary.  This lead to what GDI calls 'natural
     248     *   widths' ClearType, see
     249     *   http://rastertragedy.com/RTRCh4.htm#Sec21.  Since hinting
     250     *   has extra resolution, most non-linearity went away, but it is still
     251     *   possible for hints to change the advance widths in this mode.
     252     *
     253     *   _ClearType Compatible Widths_
     254     *
     255     *   One of the earliest challenges with ClearType was allowing the
     256     *   implementation in GDI to be selected without requiring all UI and
     257     *   documents to reflow.  To address this, a compatible method of
     258     *   rendering ClearType was added where the font hints are executed once
     259     *   to determine the width in bi-level rendering, and then re-run in
     260     *   ClearType, with the difference in widths being absorbed in the font
     261     *   hints for ClearType (mostly in the white space of hints); see
     262     *   http://rastertragedy.com/RTRCh4.htm#Sec20.  Somewhat by
     263     *   definition, compatible width ClearType allows for non-linear widths,
     264     *   but only when the bi-level version has non-linear widths.
     265     *
     266     *   _ClearType Subpixel Positioning_
     267     *
     268     *   One of the nice benefits of ClearType is the ability to more crisply
     269     *   display fractional widths; unfortunately, the GDI model of integer
     270     *   bitmaps did not support this.  However, the WPF and Direct Write
     271     *   frameworks do support fractional widths.  DWrite calls this 'natural
     272     *   mode', not to be confused with GDI's 'natural widths'.  Subpixel
     273     *   positioning, in the current implementation of Direct Write,
     274     *   unfortunately does not support hinted advance widths, see
     275     *   http://rastertragedy.com/RTRCh4.htm#Sec22.  Note that the
     276     *   TrueType interpreter fully allows the advance width to be adjusted in
     277     *   this mode, just the DWrite client will ignore those changes.
     278     *
     279     *   _ClearType Backward Compatibility_
     280     *
     281     *   This is a set of exceptions made in the TrueType interpreter to
     282     *   minimize hinting techniques that were problematic with the extra
     283     *   resolution of ClearType; see
     284     *   http://rastertragedy.com/RTRCh4.htm#Sec1 and
     285     *   https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx.
     286     *   This technique is not to be confused with ClearType compatible widths.
     287     *   ClearType backward compatibility has no direct impact on changing
     288     *   advance widths, but there might be an indirect impact on disabling
     289     *   some deltas.  This could be worked around in backward compatibility
     290     *   mode.
     291     *
     292     *   _Native ClearType Mode_
     293     *
     294     *   (Not to be confused with 'natural widths'.)  This mode removes all the
     295     *   exceptions in the TrueType interpreter when running with ClearType.
     296     *   Any issues on widths would still apply, though.
     297     *
     298     */
     299  
     300  
     301    /**************************************************************************
     302     *
     303     * @section:
     304     *   ot_svg_driver
     305     *
     306     * @title:
     307     *   The SVG driver
     308     *
     309     * @abstract:
     310     *   Controlling the external rendering of OT-SVG glyphs.
     311     *
     312     * @description:
     313     *   By default, FreeType can only load the 'SVG~' table of OpenType fonts
     314     *   if configuration macro `FT_CONFIG_OPTION_SVG` is defined.  To make it
     315     *   render SVG glyphs, an external SVG rendering library is needed.  All
     316     *   details on the interface between FreeType and the external library
     317     *   via function hooks can be found in section @svg_fonts.
     318     *
     319     *   The OT-SVG driver's module name is 'ot-svg'; it supports a single
     320     *   property called @svg-hooks, documented below in the @properties
     321     *   section.
     322     *
     323     */
     324  
     325  
     326    /**************************************************************************
     327     *
     328     * @section:
     329     *   properties
     330     *
     331     * @title:
     332     *   Driver properties
     333     *
     334     * @abstract:
     335     *   Controlling driver modules.
     336     *
     337     * @description:
     338     *   Driver modules can be controlled by setting and unsetting properties,
     339     *   using the functions @FT_Property_Set and @FT_Property_Get.  This
     340     *   section documents the available properties, together with auxiliary
     341     *   macros and structures.
     342     *
     343     */
     344  
     345  
     346    /**************************************************************************
     347     *
     348     * @enum:
     349     *   FT_HINTING_XXX
     350     *
     351     * @description:
     352     *   A list of constants used for the @hinting-engine property to select
     353     *   the hinting engine for CFF, Type~1, and CID fonts.
     354     *
     355     * @values:
     356     *   FT_HINTING_FREETYPE ::
     357     *     Use the old FreeType hinting engine.
     358     *
     359     *   FT_HINTING_ADOBE ::
     360     *     Use the hinting engine contributed by Adobe.
     361     *
     362     * @since:
     363     *   2.9
     364     *
     365     */
     366  #define FT_HINTING_FREETYPE  0
     367  #define FT_HINTING_ADOBE     1
     368  
     369    /* these constants (introduced in 2.4.12) are deprecated */
     370  #define FT_CFF_HINTING_FREETYPE  FT_HINTING_FREETYPE
     371  #define FT_CFF_HINTING_ADOBE     FT_HINTING_ADOBE
     372  
     373  
     374    /**************************************************************************
     375     *
     376     * @property:
     377     *   hinting-engine
     378     *
     379     * @description:
     380     *   Thanks to Adobe, which contributed a new hinting (and parsing) engine,
     381     *   an application can select between 'freetype' and 'adobe' if compiled
     382     *   with `CFF_CONFIG_OPTION_OLD_ENGINE`.  If this configuration macro
     383     *   isn't defined, 'hinting-engine' does nothing.
     384     *
     385     *   The same holds for the Type~1 and CID modules if compiled with
     386     *   `T1_CONFIG_OPTION_OLD_ENGINE`.
     387     *
     388     *   For the 'cff' module, the default engine is 'adobe'.  For both the
     389     *   'type1' and 't1cid' modules, the default engine is 'adobe', too.
     390     *
     391     * @note:
     392     *   This property can be used with @FT_Property_Get also.
     393     *
     394     *   This property can be set via the `FREETYPE_PROPERTIES` environment
     395     *   variable (using values 'adobe' or 'freetype').
     396     *
     397     * @example:
     398     *   The following example code demonstrates how to select Adobe's hinting
     399     *   engine for the 'cff' module (omitting the error handling).
     400     *
     401     *   ```
     402     *     FT_Library  library;
     403     *     FT_UInt     hinting_engine = FT_HINTING_ADOBE;
     404     *
     405     *
     406     *     FT_Init_FreeType( &library );
     407     *
     408     *     FT_Property_Set( library, "cff",
     409     *                               "hinting-engine", &hinting_engine );
     410     *   ```
     411     *
     412     * @since:
     413     *   2.4.12 (for 'cff' module)
     414     *
     415     *   2.9 (for 'type1' and 't1cid' modules)
     416     *
     417     */
     418  
     419  
     420    /**************************************************************************
     421     *
     422     * @property:
     423     *   no-stem-darkening
     424     *
     425     * @description:
     426     *   All glyphs that pass through the auto-hinter will be emboldened unless
     427     *   this property is set to TRUE.  The same is true for the CFF, Type~1,
     428     *   and CID font modules if the 'Adobe' engine is selected (which is the
     429     *   default).
     430     *
     431     *   Stem darkening emboldens glyphs at smaller sizes to make them more
     432     *   readable on common low-DPI screens when using linear alpha blending
     433     *   and gamma correction, see @FT_Render_Glyph.  When not using linear
     434     *   alpha blending and gamma correction, glyphs will appear heavy and
     435     *   fuzzy!
     436     *
     437     *   Gamma correction essentially lightens fonts since shades of grey are
     438     *   shifted to higher pixel values (=~higher brightness) to match the
     439     *   original intention to the reality of our screens.  The side-effect is
     440     *   that glyphs 'thin out'.  Mac OS~X and Adobe's proprietary font
     441     *   rendering library implement a counter-measure: stem darkening at
     442     *   smaller sizes where shades of gray dominate.  By emboldening a glyph
     443     *   slightly in relation to its pixel size, individual pixels get higher
     444     *   coverage of filled-in outlines and are therefore 'blacker'.  This
     445     *   counteracts the 'thinning out' of glyphs, making text remain readable
     446     *   at smaller sizes.
     447     *
     448     *   For the auto-hinter, stem-darkening is experimental currently and thus
     449     *   switched off by default (that is, `no-stem-darkening` is set to TRUE
     450     *   by default).  Total consistency with the CFF driver is not achieved
     451     *   right now because the emboldening method differs and glyphs must be
     452     *   scaled down on the Y-axis to keep outline points inside their
     453     *   precomputed blue zones.  The smaller the size (especially 9ppem and
     454     *   down), the higher the loss of emboldening versus the CFF driver.
     455     *
     456     *   Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set.
     457     *
     458     * @note:
     459     *   This property can be used with @FT_Property_Get also.
     460     *
     461     *   This property can be set via the `FREETYPE_PROPERTIES` environment
     462     *   variable (using values 1 and 0 for 'on' and 'off', respectively).  It
     463     *   can also be set per face using @FT_Face_Properties with
     464     *   @FT_PARAM_TAG_STEM_DARKENING.
     465     *
     466     * @example:
     467     *   ```
     468     *     FT_Library  library;
     469     *     FT_Bool     no_stem_darkening = TRUE;
     470     *
     471     *
     472     *     FT_Init_FreeType( &library );
     473     *
     474     *     FT_Property_Set( library, "cff",
     475     *                               "no-stem-darkening", &no_stem_darkening );
     476     *   ```
     477     *
     478     * @since:
     479     *   2.4.12 (for 'cff' module)
     480     *
     481     *   2.6.2 (for 'autofitter' module)
     482     *
     483     *   2.9 (for 'type1' and 't1cid' modules)
     484     *
     485     */
     486  
     487  
     488    /**************************************************************************
     489     *
     490     * @property:
     491     *   darkening-parameters
     492     *
     493     * @description:
     494     *   By default, the Adobe hinting engine, as used by the CFF, Type~1, and
     495     *   CID font drivers, darkens stems as follows (if the `no-stem-darkening`
     496     *   property isn't set):
     497     *
     498     *   ```
     499     *     stem width <= 0.5px:   darkening amount = 0.4px
     500     *     stem width  = 1px:     darkening amount = 0.275px
     501     *     stem width  = 1.667px: darkening amount = 0.275px
     502     *     stem width >= 2.333px: darkening amount = 0px
     503     *   ```
     504     *
     505     *   and piecewise linear in-between.  At configuration time, these four
     506     *   control points can be set with the macro
     507     *   `CFF_CONFIG_OPTION_DARKENING_PARAMETERS`; the CFF, Type~1, and CID
     508     *   drivers share these values.  At runtime, the control points can be
     509     *   changed using the `darkening-parameters` property (see the example
     510     *   below that demonstrates this for the Type~1 driver).
     511     *
     512     *   The x~values give the stem width, and the y~values the darkening
     513     *   amount.  The unit is 1000th of pixels.  All coordinate values must be
     514     *   positive; the x~values must be monotonically increasing; the y~values
     515     *   must be monotonically decreasing and smaller than or equal to 500
     516     *   (corresponding to half a pixel); the slope of each linear piece must
     517     *   be shallower than -1 (e.g., -.4).
     518     *
     519     *   The auto-hinter provides this property, too, as an experimental
     520     *   feature.  See @no-stem-darkening for more.
     521     *
     522     * @note:
     523     *   This property can be used with @FT_Property_Get also.
     524     *
     525     *   This property can be set via the `FREETYPE_PROPERTIES` environment
     526     *   variable, using eight comma-separated integers without spaces.  Here
     527     *   the above example, using `\` to break the line for readability.
     528     *
     529     *   ```
     530     *     FREETYPE_PROPERTIES=\
     531     *     type1:darkening-parameters=500,300,1000,200,1500,100,2000,0
     532     *   ```
     533     *
     534     * @example:
     535     *   ```
     536     *     FT_Library  library;
     537     *     FT_Int      darken_params[8] = {  500, 300,   // x1, y1
     538     *                                      1000, 200,   // x2, y2
     539     *                                      1500, 100,   // x3, y3
     540     *                                      2000,   0 }; // x4, y4
     541     *
     542     *
     543     *     FT_Init_FreeType( &library );
     544     *
     545     *     FT_Property_Set( library, "type1",
     546     *                               "darkening-parameters", darken_params );
     547     *   ```
     548     *
     549     * @since:
     550     *   2.5.1 (for 'cff' module)
     551     *
     552     *   2.6.2 (for 'autofitter' module)
     553     *
     554     *   2.9 (for 'type1' and 't1cid' modules)
     555     *
     556     */
     557  
     558  
     559    /**************************************************************************
     560     *
     561     * @property:
     562     *   random-seed
     563     *
     564     * @description:
     565     *   By default, the seed value for the CFF 'random' operator and the
     566     *   similar '0 28 callothersubr pop' command for the Type~1 and CID
     567     *   drivers is set to a random value.  However, mainly for debugging
     568     *   purposes, it is often necessary to use a known value as a seed so that
     569     *   the pseudo-random number sequences generated by 'random' are
     570     *   repeatable.
     571     *
     572     *   The `random-seed` property does that.  Its argument is a signed 32bit
     573     *   integer; if the value is zero or negative, the seed given by the
     574     *   `intitialRandomSeed` private DICT operator in a CFF file gets used (or
     575     *   a default value if there is no such operator).  If the value is
     576     *   positive, use it instead of `initialRandomSeed`, which is consequently
     577     *   ignored.
     578     *
     579     * @note:
     580     *   This property can be set via the `FREETYPE_PROPERTIES` environment
     581     *   variable.  It can also be set per face using @FT_Face_Properties with
     582     *   @FT_PARAM_TAG_RANDOM_SEED.
     583     *
     584     * @since:
     585     *   2.8 (for 'cff' module)
     586     *
     587     *   2.9 (for 'type1' and 't1cid' modules)
     588     *
     589     */
     590  
     591  
     592    /**************************************************************************
     593     *
     594     * @property:
     595     *   no-long-family-names
     596     *
     597     * @description:
     598     *   If `PCF_CONFIG_OPTION_LONG_FAMILY_NAMES` is active while compiling
     599     *   FreeType, the PCF driver constructs long family names.
     600     *
     601     *   There are many PCF fonts just called 'Fixed' which look completely
     602     *   different, and which have nothing to do with each other.  When
     603     *   selecting 'Fixed' in KDE or Gnome one gets results that appear rather
     604     *   random, the style changes often if one changes the size and one cannot
     605     *   select some fonts at all.  The improve this situation, the PCF module
     606     *   prepends the foundry name (plus a space) to the family name.  It also
     607     *   checks whether there are 'wide' characters; all put together, family
     608     *   names like 'Sony Fixed' or 'Misc Fixed Wide' are constructed.
     609     *
     610     *   If `no-long-family-names` is set, this feature gets switched off.
     611     *
     612     * @note:
     613     *   This property can be used with @FT_Property_Get also.
     614     *
     615     *   This property can be set via the `FREETYPE_PROPERTIES` environment
     616     *   variable (using values 1 and 0 for 'on' and 'off', respectively).
     617     *
     618     * @example:
     619     *   ```
     620     *     FT_Library  library;
     621     *     FT_Bool     no_long_family_names = TRUE;
     622     *
     623     *
     624     *     FT_Init_FreeType( &library );
     625     *
     626     *     FT_Property_Set( library, "pcf",
     627     *                               "no-long-family-names",
     628     *                               &no_long_family_names );
     629     *   ```
     630     *
     631     * @since:
     632     *   2.8
     633     */
     634  
     635  
     636    /**************************************************************************
     637     *
     638     * @enum:
     639     *   TT_INTERPRETER_VERSION_XXX
     640     *
     641     * @description:
     642     *   A list of constants used for the @interpreter-version property to
     643     *   select the hinting engine for Truetype fonts.
     644     *
     645     *   The numeric value in the constant names represents the version number
     646     *   as returned by the 'GETINFO' bytecode instruction.
     647     *
     648     * @values:
     649     *   TT_INTERPRETER_VERSION_35 ::
     650     *     Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in
     651     *     Windows~98; only grayscale and B/W rasterizing is supported.
     652     *
     653     *   TT_INTERPRETER_VERSION_38 ::
     654     *     Version~38 is the same Version~40. The original 'Infinality' code is
     655     *     no longer available.
     656     *
     657     *   TT_INTERPRETER_VERSION_40 ::
     658     *     Version~40 corresponds to MS rasterizer v.2.1; it is roughly
     659     *     equivalent to the hinting provided by DirectWrite ClearType (as can
     660     *     be found, for example, in Microsoft's Edge Browser on Windows~10).
     661     *     It is used in FreeType to select the 'minimal' subpixel hinting
     662     *     code, a stripped-down and higher performance version of the
     663     *     'Infinality' code.
     664     *
     665     * @note:
     666     *   This property controls the behaviour of the bytecode interpreter and
     667     *   thus how outlines get hinted.  It does **not** control how glyph get
     668     *   rasterized!  In particular, it does not control subpixel color
     669     *   filtering.
     670     *
     671     *   If FreeType has not been compiled with the configuration option
     672     *   `TT_CONFIG_OPTION_SUBPIXEL_HINTING`, selecting version~38 or~40 causes
     673     *   an `FT_Err_Unimplemented_Feature` error.
     674     *
     675     *   Depending on the graphics framework, Microsoft uses different bytecode
     676     *   and rendering engines.  As a consequence, the version numbers returned
     677     *   by a call to the 'GETINFO' bytecode instruction are more convoluted
     678     *   than desired.
     679     *
     680     *   Here are two tables that try to shed some light on the possible values
     681     *   for the MS rasterizer engine, together with the additional features
     682     *   introduced by it.
     683     *
     684     *   ```
     685     *     GETINFO framework               version feature
     686     *     -------------------------------------------------------------------
     687     *         3   GDI (Win 3.1),            v1.0  16-bit, first version
     688     *             TrueImage
     689     *        33   GDI (Win NT 3.1),         v1.5  32-bit
     690     *             HP Laserjet
     691     *        34   GDI (Win 95)              v1.6  font smoothing,
     692     *                                             new SCANTYPE opcode
     693     *        35   GDI (Win 98/2000)         v1.7  (UN)SCALED_COMPONENT_OFFSET
     694     *                                               bits in composite glyphs
     695     *        36   MGDI (Win CE 2)           v1.6+ classic ClearType
     696     *        37   GDI (XP and later),       v1.8  ClearType
     697     *             GDI+ old (before Vista)
     698     *        38   GDI+ old (Vista, Win 7),  v1.9  subpixel ClearType,
     699     *             WPF                             Y-direction ClearType,
     700     *                                             additional error checking
     701     *        39   DWrite (before Win 8)     v2.0  subpixel ClearType flags
     702     *                                               in GETINFO opcode,
     703     *                                             bug fixes
     704     *        40   GDI+ (after Win 7),       v2.1  Y-direction ClearType flag
     705     *             DWrite (Win 8)                    in GETINFO opcode,
     706     *                                             Gray ClearType
     707     *   ```
     708     *
     709     *   The 'version' field gives a rough orientation only, since some
     710     *   applications provided certain features much earlier (as an example,
     711     *   Microsoft Reader used subpixel and Y-direction ClearType already in
     712     *   Windows 2000).  Similarly, updates to a given framework might include
     713     *   improved hinting support.
     714     *
     715     *   ```
     716     *      version   sampling          rendering        comment
     717     *               x        y       x           y
     718     *     --------------------------------------------------------------
     719     *       v1.0   normal  normal  B/W           B/W    bi-level
     720     *       v1.6   high    high    gray          gray   grayscale
     721     *       v1.8   high    normal  color-filter  B/W    (GDI) ClearType
     722     *       v1.9   high    high    color-filter  gray   Color ClearType
     723     *       v2.1   high    normal  gray          B/W    Gray ClearType
     724     *       v2.1   high    high    gray          gray   Gray ClearType
     725     *   ```
     726     *
     727     *   Color and Gray ClearType are the two available variants of
     728     *   'Y-direction ClearType', meaning grayscale rasterization along the
     729     *   Y-direction; the name used in the TrueType specification for this
     730     *   feature is 'symmetric smoothing'.  'Classic ClearType' is the original
     731     *   algorithm used before introducing a modified version in Win~XP.
     732     *   Another name for v1.6's grayscale rendering is 'font smoothing', and
     733     *   'Color ClearType' is sometimes also called 'DWrite ClearType'.  To
     734     *   differentiate between today's Color ClearType and the earlier
     735     *   ClearType variant with B/W rendering along the vertical axis, the
     736     *   latter is sometimes called 'GDI ClearType'.
     737     *
     738     *   'Normal' and 'high' sampling describe the (virtual) resolution to
     739     *   access the rasterized outline after the hinting process.  'Normal'
     740     *   means 1 sample per grid line (i.e., B/W).  In the current Microsoft
     741     *   implementation, 'high' means an extra virtual resolution of 16x16 (or
     742     *   16x1) grid lines per pixel for bytecode instructions like 'MIRP'.
     743     *   After hinting, these 16 grid lines are mapped to 6x5 (or 6x1) grid
     744     *   lines for color filtering if Color ClearType is activated.
     745     *
     746     *   Note that 'Gray ClearType' is essentially the same as v1.6's grayscale
     747     *   rendering.  However, the GETINFO instruction handles it differently:
     748     *   v1.6 returns bit~12 (hinting for grayscale), while v2.1 returns
     749     *   bits~13 (hinting for ClearType), 18 (symmetrical smoothing), and~19
     750     *   (Gray ClearType).  Also, this mode respects bits 2 and~3 for the
     751     *   version~1 gasp table exclusively (like Color ClearType), while v1.6
     752     *   only respects the values of version~0 (bits 0 and~1).
     753     *
     754     *   Keep in mind that the features of the above interpreter versions might
     755     *   not map exactly to FreeType features or behavior because it is a
     756     *   fundamentally different library with different internals.
     757     *
     758     */
     759  #define TT_INTERPRETER_VERSION_35  35
     760  #define TT_INTERPRETER_VERSION_38  38
     761  #define TT_INTERPRETER_VERSION_40  40
     762  
     763  
     764    /**************************************************************************
     765     *
     766     * @property:
     767     *   interpreter-version
     768     *
     769     * @description:
     770     *   Currently, three versions are available, two representing the bytecode
     771     *   interpreter with subpixel hinting support (old 'Infinality' code and
     772     *   new stripped-down and higher performance 'minimal' code) and one
     773     *   without, respectively.  The default is subpixel support if
     774     *   `TT_CONFIG_OPTION_SUBPIXEL_HINTING` is defined, and no subpixel
     775     *   support otherwise (since it isn't available then).
     776     *
     777     *   If subpixel hinting is on, many TrueType bytecode instructions behave
     778     *   differently compared to B/W or grayscale rendering (except if 'native
     779     *   ClearType' is selected by the font).  Microsoft's main idea is to
     780     *   render at a much increased horizontal resolution, then sampling down
     781     *   the created output to subpixel precision.  However, many older fonts
     782     *   are not suited to this and must be specially taken care of by applying
     783     *   (hardcoded) tweaks in Microsoft's interpreter.
     784     *
     785     *   Details on subpixel hinting and some of the necessary tweaks can be
     786     *   found in Greg Hitchcock's whitepaper at
     787     *   'https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'.
     788     *   Note that FreeType currently doesn't really 'subpixel hint' (6x1, 6x2,
     789     *   or 6x5 supersampling) like discussed in the paper.  Depending on the
     790     *   chosen interpreter, it simply ignores instructions on vertical stems
     791     *   to arrive at very similar results.
     792     *
     793     * @note:
     794     *   This property can be used with @FT_Property_Get also.
     795     *
     796     *   This property can be set via the `FREETYPE_PROPERTIES` environment
     797     *   variable (using values '35', '38', or '40').
     798     *
     799     * @example:
     800     *   The following example code demonstrates how to deactivate subpixel
     801     *   hinting (omitting the error handling).
     802     *
     803     *   ```
     804     *     FT_Library  library;
     805     *     FT_Face     face;
     806     *     FT_UInt     interpreter_version = TT_INTERPRETER_VERSION_35;
     807     *
     808     *
     809     *     FT_Init_FreeType( &library );
     810     *
     811     *     FT_Property_Set( library, "truetype",
     812     *                               "interpreter-version",
     813     *                               &interpreter_version );
     814     *   ```
     815     *
     816     * @since:
     817     *   2.5
     818     */
     819  
     820    /**************************************************************************
     821     *
     822     * @property:
     823     *   svg-hooks
     824     *
     825     * @description:
     826     *   Set up the interface between FreeType and an extern SVG rendering
     827     *   library like 'librsvg'.  All details on the function hooks can be
     828     *   found in section @svg_fonts.
     829     *
     830     * @example:
     831     *   The following example code expects that the four hook functions
     832     *   `svg_*` are defined elsewhere.  Error handling is omitted, too.
     833     *
     834     *   ```
     835     *     FT_Library  library;
     836     *     SVG_RendererHooks  hooks = {
     837     *                          (SVG_Lib_Init_Func)svg_init,
     838     *                          (SVG_Lib_Free_Func)svg_free,
     839     *                          (SVG_Lib_Render_Func)svg_render,
     840     *                          (SVG_Lib_Preset_Slot_Func)svg_preset_slot };
     841     *
     842     *
     843     *     FT_Init_FreeType( &library );
     844     *
     845     *     FT_Property_Set( library, "ot-svg",
     846     *                               "svg-hooks", &hooks );
     847     *   ```
     848     *
     849     * @since:
     850     *   2.12
     851     */
     852  
     853  
     854    /**************************************************************************
     855     *
     856     * @property:
     857     *   glyph-to-script-map
     858     *
     859     * @description:
     860     *   **Experimental only**
     861     *
     862     *   The auto-hinter provides various script modules to hint glyphs.
     863     *   Examples of supported scripts are Latin or CJK.  Before a glyph is
     864     *   auto-hinted, the Unicode character map of the font gets examined, and
     865     *   the script is then determined based on Unicode character ranges, see
     866     *   below.
     867     *
     868     *   OpenType fonts, however, often provide much more glyphs than character
     869     *   codes (small caps, superscripts, ligatures, swashes, etc.), to be
     870     *   controlled by so-called 'features'.  Handling OpenType features can be
     871     *   quite complicated and thus needs a separate library on top of
     872     *   FreeType.
     873     *
     874     *   The mapping between glyph indices and scripts (in the auto-hinter
     875     *   sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an array
     876     *   with `num_glyphs` elements, as found in the font's @FT_Face structure.
     877     *   The `glyph-to-script-map` property returns a pointer to this array,
     878     *   which can be modified as needed.  Note that the modification should
     879     *   happen before the first glyph gets processed by the auto-hinter so
     880     *   that the global analysis of the font shapes actually uses the modified
     881     *   mapping.
     882     *
     883     * @example:
     884     *   The following example code demonstrates how to access it (omitting the
     885     *   error handling).
     886     *
     887     *   ```
     888     *     FT_Library                library;
     889     *     FT_Face                   face;
     890     *     FT_Prop_GlyphToScriptMap  prop;
     891     *
     892     *
     893     *     FT_Init_FreeType( &library );
     894     *     FT_New_Face( library, "foo.ttf", 0, &face );
     895     *
     896     *     prop.face = face;
     897     *
     898     *     FT_Property_Get( library, "autofitter",
     899     *                               "glyph-to-script-map", &prop );
     900     *
     901     *     // adjust `prop.map' as needed right here
     902     *
     903     *     FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
     904     *   ```
     905     *
     906     * @since:
     907     *   2.4.11
     908     *
     909     */
     910  
     911  
     912    /**************************************************************************
     913     *
     914     * @enum:
     915     *   FT_AUTOHINTER_SCRIPT_XXX
     916     *
     917     * @description:
     918     *   **Experimental only**
     919     *
     920     *   A list of constants used for the @glyph-to-script-map property to
     921     *   specify the script submodule the auto-hinter should use for hinting a
     922     *   particular glyph.
     923     *
     924     * @values:
     925     *   FT_AUTOHINTER_SCRIPT_NONE ::
     926     *     Don't auto-hint this glyph.
     927     *
     928     *   FT_AUTOHINTER_SCRIPT_LATIN ::
     929     *     Apply the latin auto-hinter.  For the auto-hinter, 'latin' is a very
     930     *     broad term, including Cyrillic and Greek also since characters from
     931     *     those scripts share the same design constraints.
     932     *
     933     *     By default, characters from the following Unicode ranges are
     934     *     assigned to this submodule.
     935     *
     936     *     ```
     937     *       U+0020 - U+007F  // Basic Latin (no control characters)
     938     *       U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)
     939     *       U+0100 - U+017F  // Latin Extended-A
     940     *       U+0180 - U+024F  // Latin Extended-B
     941     *       U+0250 - U+02AF  // IPA Extensions
     942     *       U+02B0 - U+02FF  // Spacing Modifier Letters
     943     *       U+0300 - U+036F  // Combining Diacritical Marks
     944     *       U+0370 - U+03FF  // Greek and Coptic
     945     *       U+0400 - U+04FF  // Cyrillic
     946     *       U+0500 - U+052F  // Cyrillic Supplement
     947     *       U+1D00 - U+1D7F  // Phonetic Extensions
     948     *       U+1D80 - U+1DBF  // Phonetic Extensions Supplement
     949     *       U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement
     950     *       U+1E00 - U+1EFF  // Latin Extended Additional
     951     *       U+1F00 - U+1FFF  // Greek Extended
     952     *       U+2000 - U+206F  // General Punctuation
     953     *       U+2070 - U+209F  // Superscripts and Subscripts
     954     *       U+20A0 - U+20CF  // Currency Symbols
     955     *       U+2150 - U+218F  // Number Forms
     956     *       U+2460 - U+24FF  // Enclosed Alphanumerics
     957     *       U+2C60 - U+2C7F  // Latin Extended-C
     958     *       U+2DE0 - U+2DFF  // Cyrillic Extended-A
     959     *       U+2E00 - U+2E7F  // Supplemental Punctuation
     960     *       U+A640 - U+A69F  // Cyrillic Extended-B
     961     *       U+A720 - U+A7FF  // Latin Extended-D
     962     *       U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)
     963     *      U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
     964     *      U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
     965     *     ```
     966     *
     967     *   FT_AUTOHINTER_SCRIPT_CJK ::
     968     *     Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old
     969     *     Vietnamese, and some other scripts.
     970     *
     971     *     By default, characters from the following Unicode ranges are
     972     *     assigned to this submodule.
     973     *
     974     *     ```
     975     *       U+1100 - U+11FF  // Hangul Jamo
     976     *       U+2E80 - U+2EFF  // CJK Radicals Supplement
     977     *       U+2F00 - U+2FDF  // Kangxi Radicals
     978     *       U+2FF0 - U+2FFF  // Ideographic Description Characters
     979     *       U+3000 - U+303F  // CJK Symbols and Punctuation
     980     *       U+3040 - U+309F  // Hiragana
     981     *       U+30A0 - U+30FF  // Katakana
     982     *       U+3100 - U+312F  // Bopomofo
     983     *       U+3130 - U+318F  // Hangul Compatibility Jamo
     984     *       U+3190 - U+319F  // Kanbun
     985     *       U+31A0 - U+31BF  // Bopomofo Extended
     986     *       U+31C0 - U+31EF  // CJK Strokes
     987     *       U+31F0 - U+31FF  // Katakana Phonetic Extensions
     988     *       U+3200 - U+32FF  // Enclosed CJK Letters and Months
     989     *       U+3300 - U+33FF  // CJK Compatibility
     990     *       U+3400 - U+4DBF  // CJK Unified Ideographs Extension A
     991     *       U+4DC0 - U+4DFF  // Yijing Hexagram Symbols
     992     *       U+4E00 - U+9FFF  // CJK Unified Ideographs
     993     *       U+A960 - U+A97F  // Hangul Jamo Extended-A
     994     *       U+AC00 - U+D7AF  // Hangul Syllables
     995     *       U+D7B0 - U+D7FF  // Hangul Jamo Extended-B
     996     *       U+F900 - U+FAFF  // CJK Compatibility Ideographs
     997     *       U+FE10 - U+FE1F  // Vertical forms
     998     *       U+FE30 - U+FE4F  // CJK Compatibility Forms
     999     *       U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms
    1000     *      U+1B000 - U+1B0FF // Kana Supplement
    1001     *      U+1D300 - U+1D35F // Tai Xuan Hing Symbols
    1002     *      U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
    1003     *      U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
    1004     *      U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
    1005     *      U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
    1006     *      U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
    1007     *     ```
    1008     *
    1009     *   FT_AUTOHINTER_SCRIPT_INDIC ::
    1010     *     Apply the indic auto-hinter, covering all major scripts from the
    1011     *     Indian sub-continent and some other related scripts like Thai, Lao,
    1012     *     or Tibetan.
    1013     *
    1014     *     By default, characters from the following Unicode ranges are
    1015     *     assigned to this submodule.
    1016     *
    1017     *     ```
    1018     *       U+0900 - U+0DFF  // Indic Range
    1019     *       U+0F00 - U+0FFF  // Tibetan
    1020     *       U+1900 - U+194F  // Limbu
    1021     *       U+1B80 - U+1BBF  // Sundanese
    1022     *       U+A800 - U+A82F  // Syloti Nagri
    1023     *       U+ABC0 - U+ABFF  // Meetei Mayek
    1024     *      U+11800 - U+118DF // Sharada
    1025     *     ```
    1026     *
    1027     *     Note that currently Indic support is rudimentary only, missing blue
    1028     *     zone support.
    1029     *
    1030     * @since:
    1031     *   2.4.11
    1032     *
    1033     */
    1034  #define FT_AUTOHINTER_SCRIPT_NONE   0
    1035  #define FT_AUTOHINTER_SCRIPT_LATIN  1
    1036  #define FT_AUTOHINTER_SCRIPT_CJK    2
    1037  #define FT_AUTOHINTER_SCRIPT_INDIC  3
    1038  
    1039  
    1040    /**************************************************************************
    1041     *
    1042     * @struct:
    1043     *   FT_Prop_GlyphToScriptMap
    1044     *
    1045     * @description:
    1046     *   **Experimental only**
    1047     *
    1048     *   The data exchange structure for the @glyph-to-script-map property.
    1049     *
    1050     * @since:
    1051     *   2.4.11
    1052     *
    1053     */
    1054    typedef struct  FT_Prop_GlyphToScriptMap_
    1055    {
    1056      FT_Face     face;
    1057      FT_UShort*  map;
    1058  
    1059    } FT_Prop_GlyphToScriptMap;
    1060  
    1061  
    1062    /**************************************************************************
    1063     *
    1064     * @property:
    1065     *   fallback-script
    1066     *
    1067     * @description:
    1068     *   **Experimental only**
    1069     *
    1070     *   If no auto-hinter script module can be assigned to a glyph, a fallback
    1071     *   script gets assigned to it (see also the @glyph-to-script-map
    1072     *   property).  By default, this is @FT_AUTOHINTER_SCRIPT_CJK.  Using the
    1073     *   `fallback-script` property, this fallback value can be changed.
    1074     *
    1075     * @note:
    1076     *   This property can be used with @FT_Property_Get also.
    1077     *
    1078     *   It's important to use the right timing for changing this value: The
    1079     *   creation of the glyph-to-script map that eventually uses the fallback
    1080     *   script value gets triggered either by setting or reading a
    1081     *   face-specific property like @glyph-to-script-map, or by auto-hinting
    1082     *   any glyph from that face.  In particular, if you have already created
    1083     *   an @FT_Face structure but not loaded any glyph (using the
    1084     *   auto-hinter), a change of the fallback script will affect this face.
    1085     *
    1086     * @example:
    1087     *   ```
    1088     *     FT_Library  library;
    1089     *     FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
    1090     *
    1091     *
    1092     *     FT_Init_FreeType( &library );
    1093     *
    1094     *     FT_Property_Set( library, "autofitter",
    1095     *                               "fallback-script", &fallback_script );
    1096     *   ```
    1097     *
    1098     * @since:
    1099     *   2.4.11
    1100     *
    1101     */
    1102  
    1103  
    1104    /**************************************************************************
    1105     *
    1106     * @property:
    1107     *   default-script
    1108     *
    1109     * @description:
    1110     *   **Experimental only**
    1111     *
    1112     *   If FreeType gets compiled with `FT_CONFIG_OPTION_USE_HARFBUZZ` to make
    1113     *   the HarfBuzz library access OpenType features for getting better glyph
    1114     *   coverages, this property sets the (auto-fitter) script to be used for
    1115     *   the default (OpenType) script data of a font's GSUB table.  Features
    1116     *   for the default script are intended for all scripts not explicitly
    1117     *   handled in GSUB; an example is a 'dlig' feature, containing the
    1118     *   combination of the characters 'T', 'E', and 'L' to form a 'TEL'
    1119     *   ligature.
    1120     *
    1121     *   By default, this is @FT_AUTOHINTER_SCRIPT_LATIN.  Using the
    1122     *   `default-script` property, this default value can be changed.
    1123     *
    1124     * @note:
    1125     *   This property can be used with @FT_Property_Get also.
    1126     *
    1127     *   It's important to use the right timing for changing this value: The
    1128     *   creation of the glyph-to-script map that eventually uses the default
    1129     *   script value gets triggered either by setting or reading a
    1130     *   face-specific property like @glyph-to-script-map, or by auto-hinting
    1131     *   any glyph from that face.  In particular, if you have already created
    1132     *   an @FT_Face structure but not loaded any glyph (using the
    1133     *   auto-hinter), a change of the default script will affect this face.
    1134     *
    1135     * @example:
    1136     *   ```
    1137     *     FT_Library  library;
    1138     *     FT_UInt     default_script = FT_AUTOHINTER_SCRIPT_NONE;
    1139     *
    1140     *
    1141     *     FT_Init_FreeType( &library );
    1142     *
    1143     *     FT_Property_Set( library, "autofitter",
    1144     *                               "default-script", &default_script );
    1145     *   ```
    1146     *
    1147     * @since:
    1148     *   2.5.3
    1149     *
    1150     */
    1151  
    1152  
    1153    /**************************************************************************
    1154     *
    1155     * @property:
    1156     *   increase-x-height
    1157     *
    1158     * @description:
    1159     *   For ppem values in the range 6~<= ppem <= `increase-x-height`, round
    1160     *   up the font's x~height much more often than normally.  If the value is
    1161     *   set to~0, which is the default, this feature is switched off.  Use
    1162     *   this property to improve the legibility of small font sizes if
    1163     *   necessary.
    1164     *
    1165     * @note:
    1166     *   This property can be used with @FT_Property_Get also.
    1167     *
    1168     *   Set this value right after calling @FT_Set_Char_Size, but before
    1169     *   loading any glyph (using the auto-hinter).
    1170     *
    1171     * @example:
    1172     *   ```
    1173     *     FT_Library               library;
    1174     *     FT_Face                  face;
    1175     *     FT_Prop_IncreaseXHeight  prop;
    1176     *
    1177     *
    1178     *     FT_Init_FreeType( &library );
    1179     *     FT_New_Face( library, "foo.ttf", 0, &face );
    1180     *     FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
    1181     *
    1182     *     prop.face  = face;
    1183     *     prop.limit = 14;
    1184     *
    1185     *     FT_Property_Set( library, "autofitter",
    1186     *                               "increase-x-height", &prop );
    1187     *   ```
    1188     *
    1189     * @since:
    1190     *   2.4.11
    1191     *
    1192     */
    1193  
    1194  
    1195    /**************************************************************************
    1196     *
    1197     * @struct:
    1198     *   FT_Prop_IncreaseXHeight
    1199     *
    1200     * @description:
    1201     *   The data exchange structure for the @increase-x-height property.
    1202     *
    1203     */
    1204    typedef struct  FT_Prop_IncreaseXHeight_
    1205    {
    1206      FT_Face  face;
    1207      FT_UInt  limit;
    1208  
    1209    } FT_Prop_IncreaseXHeight;
    1210  
    1211  
    1212    /**************************************************************************
    1213     *
    1214     * @property:
    1215     *   warping
    1216     *
    1217     * @description:
    1218     *   **Obsolete**
    1219     *
    1220     *   This property was always experimental and probably never worked
    1221     *   correctly.  It was entirely removed from the FreeType~2 sources.  This
    1222     *   entry is only here for historical reference.
    1223     *
    1224     *   Warping only worked in 'normal' auto-hinting mode replacing it.  The
    1225     *   idea of the code was to slightly scale and shift a glyph along the
    1226     *   non-hinted dimension (which is usually the horizontal axis) so that as
    1227     *   much of its segments were aligned (more or less) to the grid.  To find
    1228     *   out a glyph's optimal scaling and shifting value, various parameter
    1229     *   combinations were tried and scored.
    1230     *
    1231     * @since:
    1232     *   2.6
    1233     *
    1234     */
    1235  
    1236  
    1237   /* */
    1238  
    1239  
    1240  FT_END_HEADER
    1241  
    1242  
    1243  #endif /* FTDRIVER_H_ */
    1244  
    1245  
    1246  /* END */