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_BITMAP_BITMAP_SIZE_TABLE_H_ 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_BITMAP_SIZE_TABLE_H_ 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/lock.h" 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/bitmap/bitmap_glyph_info.h" 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/bitmap/index_sub_table.h" 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly { 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Binary search would be faster but many fonts have index subtables that 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// aren't sorted. 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Note: preprocessor define is used to avoid const expression warnings in C++ 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// code. 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_BITMAPSIZE_USE_BINARY_SEARCH 0 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass BitmapSizeTable : public SubTable, 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public RefCounted<BitmapSizeTable> { 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun class Builder : public SubTable::Builder, 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public RefCounted<Builder> { 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun class BitmapGlyphInfoIterator : 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public RefIterator<BitmapGlyphInfo, Builder> { 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun explicit BitmapGlyphInfoIterator(Builder* container); 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~BitmapGlyphInfoIterator() {} 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool HasNext(); 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH virtual BitmapGlyphInfo* Next(); 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool HasNext(BitmapGlyphInfoIter* iterator_base); 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH BitmapGlyphInfo* Next(BitmapGlyphInfoIter* iterator_base); 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableBuilderList::iterator sub_table_iter_; 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BitmapGlyphInfoIterPtr sub_table_glyph_info_iter_; 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~Builder(); 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data); 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SubDataSet(); 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t SubDataSizeToSerialize(); 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool SubReadyToSerialize(); 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t SubSerialize(WritableFontData* new_data); 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static CALLER_ATTACH Builder* CreateBuilder(WritableFontData* data, 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontData* master_data); 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static CALLER_ATTACH Builder* CreateBuilder(ReadableFontData* data, 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontData* master_data); 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Gets the subtable array offset as set in the original table as read from 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // the font file. This value cannot be explicitly set and will be generated 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // during table building. 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @return the subtable array offset 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t IndexSubTableArrayOffset(); 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Sets the subtable array offset. This is used only during the building 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // process when the objects are being serialized. 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param offset the offset to the index subtable array 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetIndexSubTableArrayOffset(int32_t offset); 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Gets the subtable array size as set in the original table as read from 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // the font file. This value cannot be explicitly set and will be generated 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // during table building. 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @return the subtable array size 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t IndexTableSize(); 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Sets the subtable size. This is used only during the building process 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // when the objects are being serialized. 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param size the offset to the index subtable array 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetIndexTableSize(int32_t size); 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t NumberOfIndexSubTables(); 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t ColorRef(); 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TODO(stuartg): SBitLineMetrics hori(); 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TODO(stuartg): SBitLineMetrics vert(); 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t StartGlyphIndex(); 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t EndGlyphIndex(); 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t PpemX(); 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t PpemY(); 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t BitDepth(); 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t FlagsAsInt(); 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable::Builder* IndexSubTableBuilder(int32_t index); 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH BitmapGlyphInfo* GlyphInfo(int32_t glyph_id); 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t GlyphOffset(int32_t glyph_id); 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t GlyphLength(int32_t glyph_id); 10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t GlyphFormat(int32_t glyph_id); 10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableBuilderList* IndexSubTableBuilders(); 10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Note: renamed from iterator(), type is the derived type. 10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH BitmapGlyphInfoIterator* GetIterator(); 10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void GenerateLocaMap(BitmapGlyphInfoMap* output); 10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun protected: 11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void Revert(); 11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Builder(WritableFontData* data, ReadableFontData* master_data); 11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Builder(ReadableFontData* data, ReadableFontData* master_data); 11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetNumberOfIndexSubTables(int32_t count); 11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable::Builder* SearchIndexSubTables(int32_t glyph_id); 11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable::Builder* LinearSearchIndexSubTables(int32_t glyph_id); 11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable::Builder* BinarySearchIndexSubTables(int32_t glyph_id); 12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableBuilderList* GetIndexSubTableBuilders(); 12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void Initialize(ReadableFontData* data); 12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH IndexSubTable::Builder* CreateIndexSubTableBuilder( 12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t index); 12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableBuilderList index_sub_tables_; 12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~BitmapSizeTable(); 12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t IndexSubTableArrayOffset(); 13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t IndexTableSize(); 13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t NumberOfIndexSubTables(); 13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t ColorRef(); 13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TODO(stuartg): SBitLineMetrics hori(); 13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TODO(stuartg): SBitLineMetrics vert(); 13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t StartGlyphIndex(); 13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t EndGlyphIndex(); 13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t PpemX(); 13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t PpemY(); 14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t BitDepth(); 14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t FlagsAsInt(); 14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Note: renamed from indexSubTable() 14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable* GetIndexSubTable(int32_t index); 14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t GlyphOffset(int32_t glyph_id); 14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t GlyphLength(int32_t glyph_id); 14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH BitmapGlyphInfo* GlyphInfo(int32_t glyph_id); 14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t GlyphFormat(int32_t glyph_id); 14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun protected: 15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BitmapSizeTable(ReadableFontData* data, 15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontData* master_data); 15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static int32_t NumberOfIndexSubTables(ReadableFontData* data, 15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t table_offset); 15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable* SearchIndexSubTables(int32_t glyph_id); 15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable* LinearSearchIndexSubTables(int32_t glyph_id); 15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable* BinarySearchIndexSubTables(int32_t glyph_id); 16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH IndexSubTable* CreateIndexSubTable(int32_t index); 16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableList* GetIndexSubTableList(); 16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Lock index_subtables_lock_; 16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableList index_subtables_; 16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<BitmapSizeTable> BitmapSizeTablePtr; 16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::vector<BitmapSizeTablePtr> BitmapSizeTableList; 16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<BitmapSizeTable::Builder> BitmapSizeTableBuilderPtr; 16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::vector<BitmapSizeTableBuilderPtr> BitmapSizeTableBuilderList; 17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} // namespace sfntly 17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif // SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_BITMAP_SIZE_TABLE_H_ 174