130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/* 230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved. 330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License"); 530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License. 630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at 730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * http://www.apache.org/licenses/LICENSE-2.0 930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software 1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS, 1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and 1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License. 1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_FONT_HEADER_TABLE_H_ 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_FONT_HEADER_TABLE_H_ 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/table.h" 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/table_based_table_builder.h" 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly { 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct IndexToLocFormat { 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enum { 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kShortOffset = 0, 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kLongOffset = 1 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct FontDirectionHint { 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enum { 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kFullyMixed = 0, 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kOnlyStrongLTR = 1, 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kStrongLTRAndNeutral = 2, 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kOnlyStrongRTL = -1, 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kStrongRTLAndNeutral = -2 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass FontHeaderTable : public Table, public RefCounted<FontHeaderTable> { 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun class Builder : public TableBasedTableBuilder, public RefCounted<Builder> { 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Constructor scope altered to public because C++ does not allow base 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // class to instantiate derived class with protected constructors. 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Builder(Header* header, WritableFontData* data); 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Builder(Header* header, ReadableFontData* data); 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~Builder(); 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data); 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t TableVersion(); 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetTableVersion(int32_t version); 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t FontRevision(); 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetFontRevision(int32_t revision); 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int64_t ChecksumAdjustment(); 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetChecksumAdjustment(int64_t adjustment); 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int64_t MagicNumber(); 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetMagicNumber(int64_t magic_number); 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t FlagsAsInt(); 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetFlagsAsInt(int32_t flags); 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TODO(arthurhsu): IMPLEMENT EnumSet<Flags> Flags() 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TODO(arthurhsu): IMPLEMENT setFlags(EnumSet<Flags> flags) 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t UnitsPerEm(); 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetUnitsPerEm(int32_t units); 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int64_t Created(); 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetCreated(int64_t date); 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int64_t Modified(); 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetModified(int64_t date); 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t XMin(); 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetXMin(int32_t xmin); 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t YMin(); 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetYMin(int32_t ymin); 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t XMax(); 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetXMax(int32_t xmax); 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t YMax(); 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetYMax(int32_t ymax); 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t MacStyleAsInt(); 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetMacStyleAsInt(int32_t style); 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TODO(arthurhsu): IMPLEMENT EnumSet<MacStyle> macStyle() 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TODO(arthurhsu): IMPLEMENT setMacStyle(EnumSet<MacStyle> style) 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t LowestRecPPEM(); 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetLowestRecPPEM(int32_t size); 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t FontDirectionHint(); 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetFontDirectionHint(int32_t hint); 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t IndexToLocFormat(); 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetIndexToLocFormat(int32_t format); 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t GlyphDataFormat(); 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetGlyphDataFormat(int32_t format); 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static CALLER_ATTACH Builder* CreateBuilder(Header* header, 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun WritableFontData* data); 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~FontHeaderTable(); 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t TableVersion(); 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t FontRevision(); 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the checksum adjustment. To compute: set it to 0, sum the entire font 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // as ULONG, then store 0xB1B0AFBA - sum. 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int64_t ChecksumAdjustment(); 10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the magic number. Set to 0x5F0F3CF5. 10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int64_t MagicNumber(); 10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TODO(arthurhsu): IMPLEMENT: EnumSet<Flags> 10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t FlagsAsInt(); 10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TODO(arthurhsu): IMPLEMENT: Flags() returning EnumSet<Flags> 11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t UnitsPerEm(); 11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the created date. Number of seconds since 12:00 midnight, January 1, 11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // 1904. 64-bit integer. 11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int64_t Created(); 11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the modified date. Number of seconds since 12:00 midnight, January 1, 11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // 1904. 64-bit integer. 11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int64_t Modified(); 11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the x min. For all glyph bounding boxes. 12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t XMin(); 12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the y min. For all glyph bounding boxes. 12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t YMin(); 12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the x max. For all glyph bounding boxes. 12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t XMax(); 12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the y max. For all glyph bounding boxes. 12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t YMax(); 12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TODO(arthurhsu): IMPLEMENT: EnumSet<MacStyle> 13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t MacStyleAsInt(); 13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TODO(arthurhsu): IMPLEMENT: macStyle() returning EnumSet<MacStyle> 13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t LowestRecPPEM(); 13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t FontDirectionHint(); // Note: no AsInt() form, already int 13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t IndexToLocFormat(); // Note: no AsInt() form, already int 13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t GlyphDataFormat(); 13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun struct Offset { 14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enum { 14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kTableVersion = 0, 14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kFontRevision = 4, 14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kCheckSumAdjustment = 8, 14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kMagicNumber = 12, 14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kFlags = 16, 14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUnitsPerEm = 18, 14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kCreated = 20, 14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kModified = 28, 14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kXMin = 36, 15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kYMin = 38, 15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kXMax = 40, 15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kYMax = 42, 15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kMacStyle = 44, 15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kLowestRecPPEM = 46, 15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kFontDirectionHint = 48, 15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kIndexToLocFormat = 50, 15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kGlyphDataFormat = 52 15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontHeaderTable(Header* header, ReadableFontData* data); 16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<FontHeaderTable> FontHeaderTablePtr; 16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<FontHeaderTable::Builder> FontHeaderTableBuilderPtr; 16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} // namespace sfntly 16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif // SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_FONT_HEADER_TABLE_H_ 169