/* * 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" #include "SkTypedEnum.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::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 { SK_TYPED_ENUM(Value, SK_OT_SHORT, ((FullyMixedDirectionalGlyphs, SkTEndian_SwapBE16(0))) ((OnlyStronglyLTR, SkTEndian_SwapBE16(1))) ((StronglyLTR, SkTEndian_SwapBE16(2))) ((OnlyStronglyRTL, static_cast(SkTEndian_SwapBE16((uint16_t)-1)))) ((StronglyRTL, static_cast(SkTEndian_SwapBE16((uint16_t)-2)))) SK_SEQ_END, (value)SK_SEQ_END) } fontDirectionHint; struct IndexToLocFormat { SK_TYPED_ENUM(Value, SK_OT_SHORT, ((ShortOffsets, SkTEndian_SwapBE16(0))) ((LongOffsets, SkTEndian_SwapBE16(1))) SK_SEQ_END, (value)SK_SEQ_END) } indexToLocFormat; struct GlyphDataFormat { SK_TYPED_ENUM(Value, SK_OT_SHORT, ((CurrentFormat, SkTEndian_SwapBE16(0))) SK_SEQ_END, (value)SK_SEQ_END) } glyphDataFormat; }; #pragma pack(pop) #include SK_COMPILE_ASSERT(offsetof(SkOTTableHead, glyphDataFormat) == 52, SkOTTableHead_glyphDataFormat_not_at_52); SK_COMPILE_ASSERT(sizeof(SkOTTableHead) == 54, sizeof_SkOTTableHead_not_54); #endif