Home | History | Annotate | Download | only in pfr
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  pfrtypes.h                                                             */
      4 /*                                                                         */
      5 /*    FreeType PFR data structures (specification only).                   */
      6 /*                                                                         */
      7 /*  Copyright 2002-2015 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 __PFRTYPES_H__
     20 #define __PFRTYPES_H__
     21 
     22 #include <ft2build.h>
     23 #include FT_INTERNAL_OBJECTS_H
     24 
     25 FT_BEGIN_HEADER
     26 
     27   /************************************************************************/
     28 
     29   /* the PFR Header structure */
     30   typedef struct  PFR_HeaderRec_
     31   {
     32     FT_UInt32  signature;
     33     FT_UInt    version;
     34     FT_UInt    signature2;
     35     FT_UInt    header_size;
     36 
     37     FT_UInt    log_dir_size;
     38     FT_UInt    log_dir_offset;
     39 
     40     FT_UInt    log_font_max_size;
     41     FT_UInt32  log_font_section_size;
     42     FT_UInt32  log_font_section_offset;
     43 
     44     FT_UInt32  phy_font_max_size;
     45     FT_UInt32  phy_font_section_size;
     46     FT_UInt32  phy_font_section_offset;
     47 
     48     FT_UInt    gps_max_size;
     49     FT_UInt32  gps_section_size;
     50     FT_UInt32  gps_section_offset;
     51 
     52     FT_UInt    max_blue_values;
     53     FT_UInt    max_x_orus;
     54     FT_UInt    max_y_orus;
     55 
     56     FT_UInt    phy_font_max_size_high;
     57     FT_UInt    color_flags;
     58 
     59     FT_UInt32  bct_max_size;
     60     FT_UInt32  bct_set_max_size;
     61     FT_UInt32  phy_bct_set_max_size;
     62 
     63     FT_UInt    num_phy_fonts;
     64     FT_UInt    max_vert_stem_snap;
     65     FT_UInt    max_horz_stem_snap;
     66     FT_UInt    max_chars;
     67 
     68   } PFR_HeaderRec, *PFR_Header;
     69 
     70 
     71   /* used in `color_flags' field of the PFR_Header */
     72   typedef enum  PFR_HeaderFlags_
     73   {
     74     PFR_FLAG_BLACK_PIXEL   = 1,
     75     PFR_FLAG_INVERT_BITMAP = 2
     76 
     77   } PFR_HeaderFlags;
     78 
     79 
     80   /************************************************************************/
     81 
     82   typedef struct  PFR_LogFontRec_
     83   {
     84     FT_UInt32  size;
     85     FT_UInt32  offset;
     86 
     87     FT_Int32   matrix[4];
     88     FT_UInt    stroke_flags;
     89     FT_Int     stroke_thickness;
     90     FT_Int     bold_thickness;
     91     FT_Int32   miter_limit;
     92 
     93     FT_UInt32  phys_size;
     94     FT_UInt32  phys_offset;
     95 
     96   } PFR_LogFontRec, *PFR_LogFont;
     97 
     98 
     99   typedef enum  PFR_LogFlags_
    100   {
    101     PFR_LOG_EXTRA_ITEMS  = 0x40,
    102     PFR_LOG_2BYTE_BOLD   = 0x20,
    103     PFR_LOG_BOLD         = 0x10,
    104     PFR_LOG_2BYTE_STROKE = 8,
    105     PFR_LOG_STROKE       = 4,
    106     PFR_LINE_JOIN_MASK   = 3
    107 
    108   } PFR_LogFlags;
    109 
    110 
    111   typedef enum  PFR_LineJoinFlags_
    112   {
    113     PFR_LINE_JOIN_MITER = 0,
    114     PFR_LINE_JOIN_ROUND = 1,
    115     PFR_LINE_JOIN_BEVEL = 2
    116 
    117   } PFR_LineJoinFlags;
    118 
    119 
    120   /************************************************************************/
    121 
    122   typedef enum  PFR_BitmapFlags_
    123   {
    124     PFR_BITMAP_3BYTE_OFFSET   = 4,
    125     PFR_BITMAP_2BYTE_SIZE     = 2,
    126     PFR_BITMAP_2BYTE_CHARCODE = 1
    127 
    128   } PFR_BitmapFlags;
    129 
    130 
    131   typedef struct  PFR_BitmapCharRec_
    132   {
    133     FT_UInt    char_code;
    134     FT_UInt    gps_size;
    135     FT_UInt32  gps_offset;
    136 
    137   } PFR_BitmapCharRec, *PFR_BitmapChar;
    138 
    139 
    140   typedef enum  PFR_StrikeFlags_
    141   {
    142     PFR_STRIKE_2BYTE_COUNT  = 0x10,
    143     PFR_STRIKE_3BYTE_OFFSET = 0x08,
    144     PFR_STRIKE_3BYTE_SIZE   = 0x04,
    145     PFR_STRIKE_2BYTE_YPPM   = 0x02,
    146     PFR_STRIKE_2BYTE_XPPM   = 0x01
    147 
    148   } PFR_StrikeFlags;
    149 
    150 
    151   typedef struct  PFR_StrikeRec_
    152   {
    153     FT_UInt         x_ppm;
    154     FT_UInt         y_ppm;
    155     FT_UInt         flags;
    156 
    157     FT_UInt32       gps_size;
    158     FT_UInt32       gps_offset;
    159 
    160     FT_UInt32       bct_size;
    161     FT_UInt32       bct_offset;
    162 
    163     /* optional */
    164     FT_UInt         num_bitmaps;
    165     PFR_BitmapChar  bitmaps;
    166 
    167   } PFR_StrikeRec, *PFR_Strike;
    168 
    169 
    170   /************************************************************************/
    171 
    172   typedef struct  PFR_CharRec_
    173   {
    174     FT_UInt    char_code;
    175     FT_Int     advance;
    176     FT_UInt    gps_size;
    177     FT_UInt32  gps_offset;
    178 
    179   } PFR_CharRec, *PFR_Char;
    180 
    181 
    182   /************************************************************************/
    183 
    184   typedef struct  PFR_DimensionRec_
    185   {
    186     FT_UInt  standard;
    187     FT_UInt  num_stem_snaps;
    188     FT_Int*  stem_snaps;
    189 
    190   } PFR_DimensionRec, *PFR_Dimension;
    191 
    192   /************************************************************************/
    193 
    194   typedef struct PFR_KernItemRec_*  PFR_KernItem;
    195 
    196   typedef struct  PFR_KernItemRec_
    197   {
    198     PFR_KernItem  next;
    199     FT_Byte       pair_count;
    200     FT_Byte       flags;
    201     FT_Short      base_adj;
    202     FT_UInt       pair_size;
    203     FT_Offset     offset;
    204     FT_UInt32     pair1;
    205     FT_UInt32     pair2;
    206 
    207   } PFR_KernItemRec;
    208 
    209 
    210 #define PFR_KERN_INDEX( g1, g2 )                          \
    211           ( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) )
    212 
    213 #define PFR_KERN_PAIR_INDEX( pair )                        \
    214           PFR_KERN_INDEX( (pair)->glyph1, (pair)->glyph2 )
    215 
    216 #define PFR_NEXT_KPAIR( p )  ( p += 2,                              \
    217                                ( (FT_UInt32)p[-2] << 16 ) | p[-1] )
    218 
    219 
    220   /************************************************************************/
    221 
    222   typedef struct  PFR_PhyFontRec_
    223   {
    224     FT_Memory          memory;
    225     FT_UInt32          offset;
    226 
    227     FT_UInt            font_ref_number;
    228     FT_UInt            outline_resolution;
    229     FT_UInt            metrics_resolution;
    230     FT_BBox            bbox;
    231     FT_UInt            flags;
    232     FT_Int             standard_advance;
    233 
    234     FT_Int             ascent;   /* optional, bbox.yMax if not present */
    235     FT_Int             descent;  /* optional, bbox.yMin if not present */
    236     FT_Int             leading;  /* optional, 0 if not present         */
    237 
    238     PFR_DimensionRec   horizontal;
    239     PFR_DimensionRec   vertical;
    240 
    241     FT_String*         font_id;
    242     FT_String*         family_name;
    243     FT_String*         style_name;
    244 
    245     FT_UInt            num_strikes;
    246     FT_UInt            max_strikes;
    247     PFR_StrikeRec*     strikes;
    248 
    249     FT_UInt            num_blue_values;
    250     FT_Int            *blue_values;
    251     FT_UInt            blue_fuzz;
    252     FT_UInt            blue_scale;
    253 
    254     FT_UInt            num_chars;
    255     FT_Offset          chars_offset;
    256     PFR_Char           chars;
    257 
    258     FT_UInt            num_kern_pairs;
    259     PFR_KernItem       kern_items;
    260     PFR_KernItem*      kern_items_tail;
    261 
    262     /* not part of the spec, but used during load */
    263     FT_ULong           bct_offset;
    264     FT_Byte*           cursor;
    265 
    266   } PFR_PhyFontRec, *PFR_PhyFont;
    267 
    268 
    269   typedef enum  PFR_PhyFlags_
    270   {
    271     PFR_PHY_EXTRA_ITEMS      = 0x80,
    272     PFR_PHY_3BYTE_GPS_OFFSET = 0x20,
    273     PFR_PHY_2BYTE_GPS_SIZE   = 0x10,
    274     PFR_PHY_ASCII_CODE       = 0x08,
    275     PFR_PHY_PROPORTIONAL     = 0x04,
    276     PFR_PHY_2BYTE_CHARCODE   = 0x02,
    277     PFR_PHY_VERTICAL         = 0x01
    278 
    279   } PFR_PhyFlags;
    280 
    281 
    282   typedef enum PFR_KernFlags_
    283   {
    284     PFR_KERN_2BYTE_CHAR  = 0x01,
    285     PFR_KERN_2BYTE_ADJ   = 0x02
    286 
    287   } PFR_KernFlags;
    288 
    289 
    290   /************************************************************************/
    291 
    292   typedef enum  PFR_GlyphFlags_
    293   {
    294     PFR_GLYPH_IS_COMPOUND   = 0x80,
    295     PFR_GLYPH_EXTRA_ITEMS   = 0x08,
    296     PFR_GLYPH_1BYTE_XYCOUNT = 0x04,
    297     PFR_GLYPH_XCOUNT        = 0x02,
    298     PFR_GLYPH_YCOUNT        = 0x01
    299 
    300   } PFR_GlyphFlags;
    301 
    302 
    303   /* controlled coordinate */
    304   typedef struct  PFR_CoordRec_
    305   {
    306     FT_UInt  org;
    307     FT_UInt  cur;
    308 
    309   } PFR_CoordRec, *PFR_Coord;
    310 
    311 
    312   typedef struct  PFR_SubGlyphRec_
    313   {
    314     FT_Fixed   x_scale;
    315     FT_Fixed   y_scale;
    316     FT_Int     x_delta;
    317     FT_Int     y_delta;
    318     FT_UInt32  gps_offset;
    319     FT_UInt    gps_size;
    320 
    321   } PFR_SubGlyphRec, *PFR_SubGlyph;
    322 
    323 
    324   typedef enum  PFR_SubgGlyphFlags_
    325   {
    326     PFR_SUBGLYPH_3BYTE_OFFSET = 0x80,
    327     PFR_SUBGLYPH_2BYTE_SIZE   = 0x40,
    328     PFR_SUBGLYPH_YSCALE       = 0x20,
    329     PFR_SUBGLYPH_XSCALE       = 0x10
    330 
    331   } PFR_SubGlyphFlags;
    332 
    333 
    334   typedef struct  PFR_GlyphRec_
    335   {
    336     FT_Byte           format;
    337 
    338 #if 0
    339     FT_UInt           num_x_control;
    340     FT_UInt           num_y_control;
    341 #endif
    342     FT_UInt           max_xy_control;
    343     FT_Pos*           x_control;
    344     FT_Pos*           y_control;
    345 
    346 
    347     FT_UInt           num_subs;
    348     FT_UInt           max_subs;
    349     PFR_SubGlyphRec*  subs;
    350 
    351     FT_GlyphLoader    loader;
    352     FT_Bool           path_begun;
    353 
    354   } PFR_GlyphRec, *PFR_Glyph;
    355 
    356 
    357 FT_END_HEADER
    358 
    359 #endif /* __PFRTYPES_H__ */
    360 
    361 
    362 /* END */
    363