/* * Copyright 2011 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBLC_TABLE_H_ #define SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBLC_TABLE_H_ #include "sfntly/port/lock.h" #include "sfntly/table/bitmap/big_glyph_metrics.h" #include "sfntly/table/bitmap/bitmap_glyph.h" #include "sfntly/table/bitmap/bitmap_size_table.h" #include "sfntly/table/subtable_container_table.h" namespace sfntly { class EblcTable : public SubTableContainerTable, public RefCounted { public: struct Offset { enum { // header kVersion = 0, kNumSizes = 4, kHeaderLength = kNumSizes + DataSize::kULONG, // bitmapSizeTable kBitmapSizeTableArrayStart = kHeaderLength, kBitmapSizeTableLength = 48, kBitmapSizeTable_indexSubTableArrayOffset = 0, kBitmapSizeTable_indexTableSize = 4, kBitmapSizeTable_numberOfIndexSubTables = 8, kBitmapSizeTable_colorRef = 12, kBitmapSizeTable_hori = 16, kBitmapSizeTable_vert = 28, kBitmapSizeTable_startGlyphIndex = 40, kBitmapSizeTable_endGlyphIndex = 42, kBitmapSizeTable_ppemX = 44, kBitmapSizeTable_ppemY = 45, kBitmapSizeTable_bitDepth = 46, kBitmapSizeTable_flags = 47, // sbitLineMetrics kSbitLineMetricsLength = 12, kSbitLineMetrics_ascender = 0, kSbitLineMetrics_descender = 1, kSbitLineMetrics_widthMax = 2, kSbitLineMetrics_caretSlopeNumerator = 3, kSbitLineMetrics_caretSlopeDenominator = 4, kSbitLineMetrics_caretOffset = 5, kSbitLineMetrics_minOriginSB = 6, kSbitLineMetrics_minAdvanceSB = 7, kSbitLineMetrics_maxBeforeBL = 8, kSbitLineMetrics_minAfterBL = 9, kSbitLineMetrics_pad1 = 10, kSbitLineMetrics_pad2 = 11, // indexSubTable kIndexSubTableEntryLength = 8, kIndexSubTableEntry_firstGlyphIndex = 0, kIndexSubTableEntry_lastGlyphIndex = 2, kIndexSubTableEntry_additionalOffsetToIndexSubTable = 4, // indexSubHeader kIndexSubHeaderLength = 8, kIndexSubHeader_indexFormat = 0, kIndexSubHeader_imageFormat = 2, kIndexSubHeader_imageDataOffset = 4, // indexSubTable - all offset relative to the subtable start // indexSubTable1 kIndexSubTable1_offsetArray = kIndexSubHeaderLength, kIndexSubTable1_builderDataSize = kIndexSubHeaderLength, // kIndexSubTable2 kIndexSubTable2Length = kIndexSubHeaderLength + DataSize::kULONG + BitmapGlyph::Offset::kBigGlyphMetricsLength, kIndexSubTable2_imageSize = kIndexSubHeaderLength, kIndexSubTable2_bigGlyphMetrics = kIndexSubTable2_imageSize + DataSize::kULONG, kIndexSubTable2_builderDataSize = kIndexSubTable2_bigGlyphMetrics + BigGlyphMetrics::Offset::kMetricsLength, // kIndexSubTable3 kIndexSubTable3_offsetArray = kIndexSubHeaderLength, kIndexSubTable3_builderDataSize = kIndexSubTable3_offsetArray, // kIndexSubTable4 kIndexSubTable4_numGlyphs = kIndexSubHeaderLength, kIndexSubTable4_glyphArray = kIndexSubTable4_numGlyphs + DataSize::kULONG, kIndexSubTable4_codeOffsetPairLength = 2 * DataSize::kUSHORT, kIndexSubTable4_codeOffsetPair_glyphCode = 0, kIndexSubTable4_codeOffsetPair_offset = DataSize::kUSHORT, kIndexSubTable4_builderDataSize = kIndexSubTable4_glyphArray, // kIndexSubTable5 kIndexSubTable5_imageSize = kIndexSubHeaderLength, kIndexSubTable5_bigGlyphMetrics = kIndexSubTable5_imageSize + DataSize::kULONG, kIndexSubTable5_numGlyphs = kIndexSubTable5_bigGlyphMetrics + BitmapGlyph::Offset::kBigGlyphMetricsLength, kIndexSubTable5_glyphArray = kIndexSubTable5_numGlyphs + DataSize::kULONG, kIndexSubTable5_builderDataSize = kIndexSubTable5_glyphArray, // codeOffsetPair kCodeOffsetPairLength = 2 * DataSize::kUSHORT, kCodeOffsetPair_glyphCode = 0, kCodeOffsetPair_offset = DataSize::kUSHORT, }; }; class Builder : public SubTableContainerTable::Builder, public RefCounted { public: // Constructor scope altered to public because C++ does not allow base // class to instantiate derived class with protected constructors. Builder(Header* header, WritableFontData* data); Builder(Header* header, ReadableFontData* data); virtual ~Builder(); virtual int32_t SubSerialize(WritableFontData* new_data); virtual bool SubReadyToSerialize(); virtual int32_t SubDataSizeToSerialize(); virtual void SubDataSet(); virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data); BitmapSizeTableBuilderList* BitmapSizeBuilders(); void Revert(); // Generates the loca list for the EBDT table. The list is intended to be // used by the EBDT to allow it to parse the glyph data and generate glyph // objects. After returning from this method the list belongs to the caller. // The list entries are in the same order as the size table builders are at // the time of this call. // @return the list of loca maps with one for each size table builder void GenerateLocaList(BitmapLocaList* output); // Create a new builder using the header information and data provided. // @param header the header information // @param data the data holding the table static CALLER_ATTACH Builder* CreateBuilder(Header* header, WritableFontData* data); static CALLER_ATTACH Builder* CreateBuilder(Header* header, ReadableFontData* data); private: BitmapSizeTableBuilderList* GetSizeList(); void Initialize(ReadableFontData* data, BitmapSizeTableBuilderList* output); static const int32_t kVersion = 0x00020000; BitmapSizeTableBuilderList size_table_builders_; }; int32_t Version(); int32_t NumSizes(); // UNIMPLEMENTED: toString() BitmapSizeTable* GetBitmapSizeTable(int32_t index); static const int32_t NOTDEF = -1; protected: EblcTable(Header* header, ReadableFontData* data); private: BitmapSizeTableList* GetBitmapSizeTableList(); static void CreateBitmapSizeTable(ReadableFontData* data, int32_t num_sizes, BitmapSizeTableList* output); Lock bitmap_size_table_lock_; BitmapSizeTableList bitmap_size_table_; }; typedef Ptr EblcTablePtr; typedef Ptr EblcTableBuilderPtr; } #endif // SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBLC_TABLE_H_