(root)/
freetype-2.13.2/
src/
psaux/
pshints.h
       1  /****************************************************************************
       2   *
       3   * pshints.h
       4   *
       5   *   Adobe's code for handling CFF hints (body).
       6   *
       7   * Copyright 2007-2013 Adobe Systems Incorporated.
       8   *
       9   * This software, and all works of authorship, whether in source or
      10   * object code form as indicated by the copyright notice(s) included
      11   * herein (collectively, the "Work") is made available, and may only be
      12   * used, modified, and distributed under the FreeType Project License,
      13   * LICENSE.TXT.  Additionally, subject to the terms and conditions of the
      14   * FreeType Project License, each contributor to the Work hereby grants
      15   * to any individual or legal entity exercising permissions granted by
      16   * the FreeType Project License and this section (hereafter, "You" or
      17   * "Your") a perpetual, worldwide, non-exclusive, no-charge,
      18   * royalty-free, irrevocable (except as stated in this section) patent
      19   * license to make, have made, use, offer to sell, sell, import, and
      20   * otherwise transfer the Work, where such license applies only to those
      21   * patent claims licensable by such contributor that are necessarily
      22   * infringed by their contribution(s) alone or by combination of their
      23   * contribution(s) with the Work to which such contribution(s) was
      24   * submitted.  If You institute patent litigation against any entity
      25   * (including a cross-claim or counterclaim in a lawsuit) alleging that
      26   * the Work or a contribution incorporated within the Work constitutes
      27   * direct or contributory patent infringement, then any patent licenses
      28   * granted to You under this License for that Work shall terminate as of
      29   * the date such litigation is filed.
      30   *
      31   * By using, modifying, or distributing the Work you indicate that you
      32   * have read and understood the terms and conditions of the
      33   * FreeType Project License as well as those provided in this section,
      34   * and you accept them fully.
      35   *
      36   */
      37  
      38  
      39  #ifndef PSHINT_H_
      40  #define PSHINT_H_
      41  
      42  FT_BEGIN_HEADER
      43  
      44  
      45    enum
      46    {
      47      CF2_MAX_HINTS = 96    /* maximum # of hints */
      48    };
      49  
      50  
      51    /*
      52     * A HintMask object stores a bit mask that specifies which hints in the
      53     * charstring are active at a given time.  Hints in CFF must be declared
      54     * at the start, before any drawing operators, with horizontal hints
      55     * preceding vertical hints.  The HintMask is ordered the same way, with
      56     * horizontal hints immediately followed by vertical hints.  Clients are
      57     * responsible for knowing how many of each type are present.
      58     *
      59     * The maximum total number of hints is 96, as specified by the CFF
      60     * specification.
      61     *
      62     * A HintMask is built 0 or more times while interpreting a charstring, by
      63     * the HintMask operator.  There is only one HintMask, but it is built or
      64     * rebuilt each time there is a hint substitution (HintMask operator) in
      65     * the charstring.  A default HintMask with all bits set is built if there
      66     * has been no HintMask operator prior to the first drawing operator.
      67     *
      68     */
      69  
      70    typedef struct  CF2_HintMaskRec_
      71    {
      72      FT_Error*  error;
      73  
      74      FT_Bool  isValid;
      75      FT_Bool  isNew;
      76  
      77      size_t  bitCount;
      78      size_t  byteCount;
      79  
      80      FT_Byte  mask[( CF2_MAX_HINTS + 7 ) / 8];
      81  
      82    } CF2_HintMaskRec, *CF2_HintMask;
      83  
      84  
      85    typedef struct  CF2_StemHintRec_
      86    {
      87      FT_Bool  used;     /* DS positions are valid         */
      88  
      89      CF2_Fixed  min;    /* original character space value */
      90      CF2_Fixed  max;
      91  
      92      CF2_Fixed  minDS;  /* DS position after first use    */
      93      CF2_Fixed  maxDS;
      94  
      95    } CF2_StemHintRec, *CF2_StemHint;
      96  
      97  
      98    /*
      99     * A HintMap object stores a piecewise linear function for mapping
     100     * y-coordinates from character space to device space, providing
     101     * appropriate pixel alignment to stem edges.
     102     *
     103     * The map is implemented as an array of `CF2_Hint' elements, each
     104     * representing an edge.  When edges are paired, as from stem hints, the
     105     * bottom edge must immediately precede the top edge in the array.
     106     * Element character space AND device space positions must both increase
     107     * monotonically in the array.  `CF2_Hint' elements are also used as
     108     * parameters to `cf2_blues_capture'.
     109     *
     110     * The `cf2_hintmap_build' method must be called before any drawing
     111     * operation (beginning with a Move operator) and at each hint
     112     * substitution (HintMask operator).
     113     *
     114     * The `cf2_hintmap_map' method is called to transform y-coordinates at
     115     * each drawing operation (move, line, curve).
     116     *
     117     */
     118  
     119    /* TODO: make this a CF2_ArrStack and add a deep copy method */
     120    enum
     121    {
     122      CF2_MAX_HINT_EDGES = CF2_MAX_HINTS * 2
     123    };
     124  
     125  
     126    typedef struct  CF2_HintMapRec_
     127    {
     128      CF2_Font  font;
     129  
     130      /* initial map based on blue zones */
     131      struct CF2_HintMapRec_*  initialHintMap;
     132  
     133      /* working storage for 2nd pass adjustHints */
     134      CF2_ArrStack  hintMoves;
     135  
     136      FT_Bool  isValid;
     137      FT_Bool  hinted;
     138  
     139      CF2_Fixed  scale;
     140      CF2_UInt   count;
     141  
     142      /* start search from this index */
     143      CF2_UInt  lastIndex;
     144  
     145      CF2_HintRec  edge[CF2_MAX_HINT_EDGES]; /* 192 */
     146  
     147    } CF2_HintMapRec, *CF2_HintMap;
     148  
     149  
     150    FT_LOCAL( FT_Bool )
     151    cf2_hint_isValid( const CF2_Hint  hint );
     152    FT_LOCAL( FT_Bool )
     153    cf2_hint_isTop( const CF2_Hint  hint );
     154    FT_LOCAL( FT_Bool )
     155    cf2_hint_isBottom( const CF2_Hint  hint );
     156    FT_LOCAL( void )
     157    cf2_hint_lock( CF2_Hint  hint );
     158  
     159  
     160    FT_LOCAL( void )
     161    cf2_hintmap_init( CF2_HintMap   hintmap,
     162                      CF2_Font      font,
     163                      CF2_HintMap   initialMap,
     164                      CF2_ArrStack  hintMoves,
     165                      CF2_Fixed     scale );
     166    FT_LOCAL( void )
     167    cf2_hintmap_build( CF2_HintMap   hintmap,
     168                       CF2_ArrStack  hStemHintArray,
     169                       CF2_ArrStack  vStemHintArray,
     170                       CF2_HintMask  hintMask,
     171                       CF2_Fixed     hintOrigin,
     172                       FT_Bool       initialMap );
     173  
     174  
     175    /*
     176     * GlyphPath is a wrapper for drawing operations that scales the
     177     * coordinates according to the render matrix and HintMap.  It also tracks
     178     * open paths to control ClosePath and to insert MoveTo for broken fonts.
     179     *
     180     */
     181    typedef struct  CF2_GlyphPathRec_
     182    {
     183      /* TODO: gather some of these into a hinting context */
     184  
     185      CF2_Font              font;           /* font instance    */
     186      CF2_OutlineCallbacks  callbacks;      /* outline consumer */
     187  
     188  
     189      CF2_HintMapRec  hintMap;        /* current hint map            */
     190      CF2_HintMapRec  firstHintMap;   /* saved copy                  */
     191      CF2_HintMapRec  initialHintMap; /* based on all captured hints */
     192  
     193      CF2_ArrStackRec  hintMoves;  /* list of hint moves for 2nd pass */
     194  
     195      CF2_Fixed  scaleX;         /* matrix a */
     196      CF2_Fixed  scaleC;         /* matrix c */
     197      CF2_Fixed  scaleY;         /* matrix d */
     198  
     199      FT_Vector  fractionalTranslation;  /* including deviceXScale */
     200  #if 0
     201      CF2_Fixed  hShift;    /* character space horizontal shift */
     202                            /* (for fauxing)                    */
     203  #endif
     204  
     205      FT_Bool  pathIsOpen;     /* true after MoveTo                     */
     206      FT_Bool  pathIsClosing;  /* true when synthesizing closepath line */
     207      FT_Bool  darken;         /* true if stem darkening                */
     208      FT_Bool  moveIsPending;  /* true between MoveTo and offset MoveTo */
     209  
     210      /* references used to call `cf2_hintmap_build', if necessary */
     211      CF2_ArrStack         hStemHintArray;
     212      CF2_ArrStack         vStemHintArray;
     213      CF2_HintMask         hintMask;     /* ptr to the current mask */
     214      CF2_Fixed            hintOriginY;  /* copy of current origin  */
     215      const CF2_BluesRec*  blues;
     216  
     217      CF2_Fixed  xOffset;        /* character space offsets */
     218      CF2_Fixed  yOffset;
     219  
     220      /* character space miter limit threshold */
     221      CF2_Fixed  miterLimit;
     222      /* vertical/horizontal snap distance in character space */
     223      CF2_Fixed  snapThreshold;
     224  
     225      FT_Vector  offsetStart0;  /* first and second points of first */
     226      FT_Vector  offsetStart1;  /* element with offset applied      */
     227  
     228      /* current point, character space, before offset */
     229      FT_Vector  currentCS;
     230      /* current point, device space */
     231      FT_Vector  currentDS;
     232      /* start point of subpath, character space */
     233      FT_Vector  start;
     234  
     235      /* the following members constitute the `queue' of one element */
     236      FT_Bool  elemIsQueued;
     237      CF2_Int  prevElemOp;
     238  
     239      FT_Vector  prevElemP0;
     240      FT_Vector  prevElemP1;
     241      FT_Vector  prevElemP2;
     242      FT_Vector  prevElemP3;
     243  
     244    } CF2_GlyphPathRec, *CF2_GlyphPath;
     245  
     246  
     247    FT_LOCAL( void )
     248    cf2_glyphpath_init( CF2_GlyphPath         glyphpath,
     249                        CF2_Font              font,
     250                        CF2_OutlineCallbacks  callbacks,
     251                        CF2_Fixed             scaleY,
     252                        /* CF2_Fixed hShift, */
     253                        CF2_ArrStack          hStemHintArray,
     254                        CF2_ArrStack          vStemHintArray,
     255                        CF2_HintMask          hintMask,
     256                        CF2_Fixed             hintOrigin,
     257                        const CF2_Blues       blues,
     258                        const FT_Vector*      fractionalTranslation );
     259    FT_LOCAL( void )
     260    cf2_glyphpath_finalize( CF2_GlyphPath  glyphpath );
     261  
     262    FT_LOCAL( void )
     263    cf2_glyphpath_moveTo( CF2_GlyphPath  glyphpath,
     264                          CF2_Fixed      x,
     265                          CF2_Fixed      y );
     266    FT_LOCAL( void )
     267    cf2_glyphpath_lineTo( CF2_GlyphPath  glyphpath,
     268                          CF2_Fixed      x,
     269                          CF2_Fixed      y );
     270    FT_LOCAL( void )
     271    cf2_glyphpath_curveTo( CF2_GlyphPath  glyphpath,
     272                           CF2_Fixed      x1,
     273                           CF2_Fixed      y1,
     274                           CF2_Fixed      x2,
     275                           CF2_Fixed      y2,
     276                           CF2_Fixed      x3,
     277                           CF2_Fixed      y3 );
     278    FT_LOCAL( void )
     279    cf2_glyphpath_closeOpenPath( CF2_GlyphPath  glyphpath );
     280  
     281  
     282  FT_END_HEADER
     283  
     284  
     285  #endif /* PSHINT_H_ */
     286  
     287  
     288  /* END */