Home | History | Annotate | Download | only in sfnt
      1 /*
      2  * Copyright 2012 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkOTTable_head_DEFINED
      9 #define SkOTTable_head_DEFINED
     10 
     11 #include "SkEndian.h"
     12 #include "SkOTTableTypes.h"
     13 #include "SkTypedEnum.h"
     14 
     15 #pragma pack(push, 1)
     16 
     17 struct SkOTTableHead {
     18     static const SK_OT_CHAR TAG0 = 'h';
     19     static const SK_OT_CHAR TAG1 = 'e';
     20     static const SK_OT_CHAR TAG2 = 'a';
     21     static const SK_OT_CHAR TAG3 = 'd';
     22     static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableHead>::value;
     23 
     24     SK_OT_Fixed version;
     25     static const SK_OT_Fixed version1 = SkTEndian_SwapBE32(0x00010000);
     26     SK_OT_Fixed fontRevision;
     27     static const uint32_t fontChecksum = 0xB1B0AFBA; //checksum of all TT fonts
     28     SK_OT_ULONG checksumAdjustment;
     29     SK_OT_ULONG magicNumber;
     30     static const SK_OT_ULONG magicNumberConst = SkTEndian_SwapBE32(0x5F0F3CF5);
     31     union Flags {
     32         struct Field {
     33             //8-15
     34             SK_OT_BYTE_BITFIELD(
     35                 GXMetamorphosis_Apple,
     36                 HasStrongRTL_Apple,
     37                 HasIndicStyleRearrangement,
     38                 AgfaMicroTypeExpressProcessed,
     39                 FontConverted,
     40                 DesignedForClearType,
     41                 LastResort,
     42                 Reserved15)
     43             //0-7
     44             SK_OT_BYTE_BITFIELD(
     45                 BaselineAtY0,
     46                 LeftSidebearingAtX0,
     47                 InstructionsDependOnPointSize,
     48                 IntegerScaling,
     49                 InstructionsAlterAdvanceWidth,
     50                 VerticalCenteredGlyphs_Apple,
     51                 Reserved06,
     52                 RequiresLayout_Apple)
     53         } field;
     54         struct Raw {
     55             static const SK_OT_USHORT BaselineAtY0Mask = SkTEndian_SwapBE16(1 << 0);
     56             static const SK_OT_USHORT LeftSidebearingAtX0Mask = SkTEndian_SwapBE16(1 << 1);
     57             static const SK_OT_USHORT InstructionsDependOnPointSizeMask = SkTEndian_SwapBE16(1 << 2);
     58             static const SK_OT_USHORT IntegerScalingMask = SkTEndian_SwapBE16(1 << 3);
     59             static const SK_OT_USHORT InstructionsAlterAdvanceWidthMask = SkTEndian_SwapBE16(1 << 4);
     60             static const SK_OT_USHORT VerticalCenteredGlyphs_AppleMask = SkTEndian_SwapBE16(1 << 5);
     61             //Reserved
     62             static const SK_OT_USHORT RequiresLayout_AppleMask = SkTEndian_SwapBE16(1 << 7);
     63 
     64             static const SK_OT_USHORT GXMetamorphosis_AppleMask = SkTEndian_SwapBE16(1 << 8);
     65             static const SK_OT_USHORT HasStrongRTL_AppleMask = SkTEndian_SwapBE16(1 << 9);
     66             static const SK_OT_USHORT HasIndicStyleRearrangementMask = SkTEndian_SwapBE16(1 << 10);
     67             static const SK_OT_USHORT AgfaMicroTypeExpressProcessedMask = SkTEndian_SwapBE16(1 << 11);
     68             static const SK_OT_USHORT FontConvertedMask = SkTEndian_SwapBE16(1 << 12);
     69             static const SK_OT_USHORT DesignedForClearTypeMask = SkTEndian_SwapBE16(1 << 13);
     70             static const SK_OT_USHORT LastResortMask = SkTEndian_SwapBE16(1 << 14);
     71             //Reserved
     72             SK_OT_USHORT value;
     73         } raw;
     74     } flags;
     75     SK_OT_USHORT unitsPerEm;
     76     SK_OT_LONGDATETIME created;
     77     SK_OT_LONGDATETIME modified;
     78     SK_OT_SHORT xMin;
     79     SK_OT_SHORT yMin;
     80     SK_OT_SHORT xMax;
     81     SK_OT_SHORT yMax;
     82     union MacStyle {
     83         struct Field {
     84             //8-15
     85             SK_OT_BYTE_BITFIELD(
     86                 Reserved08,
     87                 Reserved09,
     88                 Reserved10,
     89                 Reserved11,
     90                 Reserved12,
     91                 Reserved13,
     92                 Reserved14,
     93                 Reserved15)
     94             //0-7
     95             SK_OT_BYTE_BITFIELD(
     96                 Bold,
     97                 Italic,
     98                 Underline,
     99                 Outline,
    100                 Shadow,
    101                 Condensed,
    102                 Extended,
    103                 Reserved07)
    104         } field;
    105         struct Raw {
    106             static const SK_OT_USHORT BoldMask = SkTEndian_SwapBE16(1);
    107             static const SK_OT_USHORT ItalicMask = SkTEndian_SwapBE16(1 << 1);
    108             static const SK_OT_USHORT UnderlineMask = SkTEndian_SwapBE16(1 << 2);
    109             static const SK_OT_USHORT OutlineMask = SkTEndian_SwapBE16(1 << 3);
    110             static const SK_OT_USHORT ShadowMask = SkTEndian_SwapBE16(1 << 4);
    111             static const SK_OT_USHORT CondensedMask = SkTEndian_SwapBE16(1 << 5);
    112             static const SK_OT_USHORT ExtendedMask = SkTEndian_SwapBE16(1 << 6);
    113 
    114             SK_OT_USHORT value;
    115         } raw;
    116     } macStyle;
    117     SK_OT_USHORT lowestRecPPEM;
    118     struct FontDirectionHint {
    119         SK_TYPED_ENUM(Value, SK_OT_SHORT,
    120             ((FullyMixedDirectionalGlyphs, SkTEndian_SwapBE16(0)))
    121             ((OnlyStronglyLTR, SkTEndian_SwapBE16(1)))
    122             ((StronglyLTR, SkTEndian_SwapBE16(2)))
    123             ((OnlyStronglyRTL, static_cast<SK_OT_SHORT>(SkTEndian_SwapBE16((uint16_t)-1))))
    124             ((StronglyRTL, static_cast<SK_OT_SHORT>(SkTEndian_SwapBE16((uint16_t)-2))))
    125             SK_SEQ_END,
    126         (value)SK_SEQ_END)
    127     } fontDirectionHint;
    128     struct IndexToLocFormat {
    129         SK_TYPED_ENUM(Value, SK_OT_SHORT,
    130             ((ShortOffsets, SkTEndian_SwapBE16(0)))
    131             ((LongOffsets, SkTEndian_SwapBE16(1)))
    132             SK_SEQ_END,
    133         (value)SK_SEQ_END)
    134     } indexToLocFormat;
    135     struct GlyphDataFormat {
    136         SK_TYPED_ENUM(Value, SK_OT_SHORT,
    137             ((CurrentFormat, SkTEndian_SwapBE16(0)))
    138             SK_SEQ_END,
    139         (value)SK_SEQ_END)
    140     } glyphDataFormat;
    141 };
    142 
    143 #pragma pack(pop)
    144 
    145 
    146 #include <stddef.h>
    147 SK_COMPILE_ASSERT(offsetof(SkOTTableHead, glyphDataFormat) == 52, SkOTTableHead_glyphDataFormat_not_at_52);
    148 SK_COMPILE_ASSERT(sizeof(SkOTTableHead) == 54, sizeof_SkOTTableHead_not_54);
    149 
    150 #endif
    151