/*
|
* Copyright 2012 Google Inc.
|
*
|
* Use of this source code is governed by a BSD-style license that can be
|
* found in the LICENSE file.
|
*/
|
|
#ifndef SkOTTable_head_DEFINED
|
#define SkOTTable_head_DEFINED
|
|
#include "SkEndian.h"
|
#include "SkOTTableTypes.h"
|
|
#pragma pack(push, 1)
|
|
struct SkOTTableHead {
|
static const SK_OT_CHAR TAG0 = 'h';
|
static const SK_OT_CHAR TAG1 = 'e';
|
static const SK_OT_CHAR TAG2 = 'a';
|
static const SK_OT_CHAR TAG3 = 'd';
|
static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableHead>::value;
|
|
SK_OT_Fixed version;
|
static const SK_OT_Fixed version1 = SkTEndian_SwapBE32(0x00010000);
|
SK_OT_Fixed fontRevision;
|
static const uint32_t fontChecksum = 0xB1B0AFBA; //checksum of all TT fonts
|
SK_OT_ULONG checksumAdjustment;
|
SK_OT_ULONG magicNumber;
|
static const SK_OT_ULONG magicNumberConst = SkTEndian_SwapBE32(0x5F0F3CF5);
|
union Flags {
|
struct Field {
|
//8-15
|
SK_OT_BYTE_BITFIELD(
|
GXMetamorphosis_Apple,
|
HasStrongRTL_Apple,
|
HasIndicStyleRearrangement,
|
AgfaMicroTypeExpressProcessed,
|
FontConverted,
|
DesignedForClearType,
|
LastResort,
|
Reserved15)
|
//0-7
|
SK_OT_BYTE_BITFIELD(
|
BaselineAtY0,
|
LeftSidebearingAtX0,
|
InstructionsDependOnPointSize,
|
IntegerScaling,
|
InstructionsAlterAdvanceWidth,
|
VerticalCenteredGlyphs_Apple,
|
Reserved06,
|
RequiresLayout_Apple)
|
} field;
|
struct Raw {
|
static const SK_OT_USHORT BaselineAtY0Mask = SkTEndian_SwapBE16(1 << 0);
|
static const SK_OT_USHORT LeftSidebearingAtX0Mask = SkTEndian_SwapBE16(1 << 1);
|
static const SK_OT_USHORT InstructionsDependOnPointSizeMask = SkTEndian_SwapBE16(1 << 2);
|
static const SK_OT_USHORT IntegerScalingMask = SkTEndian_SwapBE16(1 << 3);
|
static const SK_OT_USHORT InstructionsAlterAdvanceWidthMask = SkTEndian_SwapBE16(1 << 4);
|
static const SK_OT_USHORT VerticalCenteredGlyphs_AppleMask = SkTEndian_SwapBE16(1 << 5);
|
//Reserved
|
static const SK_OT_USHORT RequiresLayout_AppleMask = SkTEndian_SwapBE16(1 << 7);
|
|
static const SK_OT_USHORT GXMetamorphosis_AppleMask = SkTEndian_SwapBE16(1 << 8);
|
static const SK_OT_USHORT HasStrongRTL_AppleMask = SkTEndian_SwapBE16(1 << 9);
|
static const SK_OT_USHORT HasIndicStyleRearrangementMask = SkTEndian_SwapBE16(1 << 10);
|
static const SK_OT_USHORT AgfaMicroTypeExpressProcessedMask = SkTEndian_SwapBE16(1 << 11);
|
static const SK_OT_USHORT FontConvertedMask = SkTEndian_SwapBE16(1 << 12);
|
static const SK_OT_USHORT DesignedForClearTypeMask = SkTEndian_SwapBE16(1 << 13);
|
static const SK_OT_USHORT LastResortMask = SkTEndian_SwapBE16(1 << 14);
|
//Reserved
|
SK_OT_USHORT value;
|
} raw;
|
} flags;
|
SK_OT_USHORT unitsPerEm;
|
SK_OT_LONGDATETIME created;
|
SK_OT_LONGDATETIME modified;
|
SK_OT_SHORT xMin;
|
SK_OT_SHORT yMin;
|
SK_OT_SHORT xMax;
|
SK_OT_SHORT yMax;
|
union MacStyle {
|
struct Field {
|
//8-15
|
SK_OT_BYTE_BITFIELD(
|
Reserved08,
|
Reserved09,
|
Reserved10,
|
Reserved11,
|
Reserved12,
|
Reserved13,
|
Reserved14,
|
Reserved15)
|
//0-7
|
SK_OT_BYTE_BITFIELD(
|
Bold,
|
Italic,
|
Underline,
|
Outline,
|
Shadow,
|
Condensed,
|
Extended,
|
Reserved07)
|
} field;
|
struct Raw {
|
static const SK_OT_USHORT BoldMask = SkTEndian_SwapBE16(1);
|
static const SK_OT_USHORT ItalicMask = SkTEndian_SwapBE16(1 << 1);
|
static const SK_OT_USHORT UnderlineMask = SkTEndian_SwapBE16(1 << 2);
|
static const SK_OT_USHORT OutlineMask = SkTEndian_SwapBE16(1 << 3);
|
static const SK_OT_USHORT ShadowMask = SkTEndian_SwapBE16(1 << 4);
|
static const SK_OT_USHORT CondensedMask = SkTEndian_SwapBE16(1 << 5);
|
static const SK_OT_USHORT ExtendedMask = SkTEndian_SwapBE16(1 << 6);
|
|
SK_OT_USHORT value;
|
} raw;
|
} macStyle;
|
SK_OT_USHORT lowestRecPPEM;
|
struct FontDirectionHint {
|
enum Value : SK_OT_SHORT {
|
FullyMixedDirectionalGlyphs = SkTEndian_SwapBE16(0),
|
OnlyStronglyLTR = SkTEndian_SwapBE16(1),
|
StronglyLTR = SkTEndian_SwapBE16(2),
|
OnlyStronglyRTL = static_cast<SK_OT_SHORT>(SkTEndian_SwapBE16((uint16_t)-1)),
|
StronglyRTL = static_cast<SK_OT_SHORT>(SkTEndian_SwapBE16((uint16_t)-2)),
|
} value;
|
} fontDirectionHint;
|
struct IndexToLocFormat {
|
enum Value : SK_OT_SHORT {
|
ShortOffsets = SkTEndian_SwapBE16(0),
|
LongOffsets = SkTEndian_SwapBE16(1),
|
} value;
|
} indexToLocFormat;
|
struct GlyphDataFormat {
|
enum Value : SK_OT_SHORT {
|
CurrentFormat = SkTEndian_SwapBE16(0),
|
} value;
|
} glyphDataFormat;
|
};
|
|
#pragma pack(pop)
|
|
|
#include <stddef.h>
|
static_assert(offsetof(SkOTTableHead, glyphDataFormat) == 52, "SkOTTableHead_glyphDataFormat_not_at_52");
|
static_assert(sizeof(SkOTTableHead) == 54, "sizeof_SkOTTableHead_not_54");
|
|
#endif
|