16b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com/* 26b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * Copyright 2011 Google Inc. All Rights Reserved. 36b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * 46b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * Licensed under the Apache License, Version 2.0 = the "License"); 56b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * you may not use this file except in compliance with the License. 66b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * You may obtain a copy of the License at 76b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * 86b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * http://www.apache.org/licenses/LICENSE-2.0 96b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * 106b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * Unless required by applicable law or agreed to in writing, software 116b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * distributed under the License is distributed on an "AS IS" BASIS, 126b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * See the License for the specific language governing permissions and 146b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * limitations under the License. 156b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com */ 166b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 176b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#include "sfntly/table/bitmap/bitmap_size_table.h" 186b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 1953847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com#include <stdio.h> 20333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include <stdlib.h> 21333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 2253847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com#include "sfntly/math/font_math.h" 236b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#include "sfntly/table/bitmap/eblc_table.h" 24333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include "sfntly/table/bitmap/index_sub_table_format1.h" 25333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include "sfntly/table/bitmap/index_sub_table_format2.h" 26333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include "sfntly/table/bitmap/index_sub_table_format3.h" 27333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include "sfntly/table/bitmap/index_sub_table_format4.h" 28333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include "sfntly/table/bitmap/index_sub_table_format5.h" 296b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 306b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comnamespace sfntly { 31333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com/****************************************************************************** 32333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * BitmapSizeTable class 33333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ******************************************************************************/ 346b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comBitmapSizeTable::~BitmapSizeTable() { 356b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 366b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 376b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::IndexSubTableArrayOffset() { 386b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return data_->ReadULongAsInt( 396b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_indexSubTableArrayOffset); 406b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 416b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 426b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::IndexTableSize() { 436b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return data_->ReadULongAsInt( 446b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_indexTableSize); 456b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 466b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 476b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::NumberOfIndexSubTables() { 48333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return NumberOfIndexSubTables(data_, 0); 496b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 506b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 516b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::ColorRef() { 526b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return data_->ReadULongAsInt(EblcTable::Offset::kBitmapSizeTable_colorRef); 536b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 546b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 556b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::StartGlyphIndex() { 566b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return data_->ReadUShort(EblcTable::Offset::kBitmapSizeTable_startGlyphIndex); 576b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 586b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 596b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::EndGlyphIndex() { 606b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return data_->ReadUShort(EblcTable::Offset::kBitmapSizeTable_endGlyphIndex); 616b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 626b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 636b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::PpemX() { 646b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return data_->ReadByte(EblcTable::Offset::kBitmapSizeTable_ppemX); 656b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 666b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 676b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::PpemY() { 686b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return data_->ReadByte(EblcTable::Offset::kBitmapSizeTable_ppemY); 696b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 706b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 716b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::BitDepth() { 726b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return data_->ReadByte(EblcTable::Offset::kBitmapSizeTable_bitDepth); 736b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 746b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 756b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::FlagsAsInt() { 766b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return data_->ReadChar(EblcTable::Offset::kBitmapSizeTable_flags); 776b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 786b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 796b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comIndexSubTable* BitmapSizeTable::GetIndexSubTable(int32_t index) { 806b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com IndexSubTableList* subtable_list = GetIndexSubTableList(); 816b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com if (index >= 0 && (size_t)index < subtable_list->size()) { 826b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return (*subtable_list)[index]; 836b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } 846b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return NULL; 856b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 866b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 876b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::GlyphOffset(int32_t glyph_id) { 886b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com IndexSubTable* subtable = SearchIndexSubTables(glyph_id); 896b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com if (subtable == NULL) { 906b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return -1; 916b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } 926b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return subtable->GlyphOffset(glyph_id); 936b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 946b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 956b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::GlyphLength(int32_t glyph_id) { 966b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com IndexSubTable* subtable = SearchIndexSubTables(glyph_id); 976b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com if (subtable == NULL) { 986b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return -1; 996b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } 1006b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return subtable->GlyphLength(glyph_id); 1016b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 1026b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 103333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH BitmapGlyphInfo* BitmapSizeTable::GlyphInfo(int32_t glyph_id) { 104333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTable* sub_table = SearchIndexSubTables(glyph_id); 105333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (sub_table == NULL) { 106333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return NULL; 107333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 108333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return sub_table->GlyphInfo(glyph_id); 109333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 110333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 1116b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::GlyphFormat(int32_t glyph_id) { 1126b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com IndexSubTable* subtable = SearchIndexSubTables(glyph_id); 1136b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com if (subtable == NULL) { 1146b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return -1; 1156b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } 1166b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return subtable->image_format(); 1176b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 1186b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 119333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::BitmapSizeTable(ReadableFontData* data, 120333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ReadableFontData* master_data) 121333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com : SubTable(data, master_data) { 122333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 123333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 124333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com// static 125333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::NumberOfIndexSubTables(ReadableFontData* data, 126333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t table_offset) { 127333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return data->ReadULongAsInt(table_offset + 128333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_numberOfIndexSubTables); 129333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 130333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 1316b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comIndexSubTable* BitmapSizeTable::SearchIndexSubTables(int32_t glyph_id) { 132333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com // would be faster to binary search but too many size tables don't have 133333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com // sorted subtables 134333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#if (SFNTLY_BITMAPSIZE_USE_BINARY_SEARCH) 135333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return BinarySearchIndexSubTables(glyph_id); 136333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#else 137333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return LinearSearchIndexSubTables(glyph_id); 138333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#endif 139333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 140333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 141333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTable* BitmapSizeTable::LinearSearchIndexSubTables(int32_t glyph_id) { 142333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableList* subtable_list = GetIndexSubTableList(); 143333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com for (IndexSubTableList::iterator b = subtable_list->begin(), 144333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com e = subtable_list->end(); b != e; b++) { 145333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if ((*b)->first_glyph_index() <= glyph_id && 146333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com (*b)->last_glyph_index() >= glyph_id) { 147333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return *b; 148333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 149333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 150333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return NULL; 151333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 152333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 153333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTable* BitmapSizeTable::BinarySearchIndexSubTables(int32_t glyph_id) { 1546b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com IndexSubTableList* subtable_list = GetIndexSubTableList(); 1556b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com int32_t index = 0; 1566b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com int32_t bottom = 0; 1576b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com int32_t top = subtable_list->size(); 1586b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com while (top != bottom) { 1596b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com index = (top + bottom) / 2; 1606b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com IndexSubTable* subtable = (*subtable_list)[index]; 1616b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com if (glyph_id < subtable->first_glyph_index()) { 1626b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com // Location beow current location 1636b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com top = index; 1646b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } else { 1656b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com if (glyph_id <= subtable->last_glyph_index()) { 1666b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return subtable; 1676b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } else { 1686b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com bottom = index + 1; 1696b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } 1706b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } 1716b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } 1726b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return NULL; 1736b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 1746b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 1756b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comCALLER_ATTACH 1766b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comIndexSubTable* BitmapSizeTable::CreateIndexSubTable(int32_t index) { 177333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return IndexSubTable::CreateIndexSubTable(master_read_data(), 1786b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com IndexSubTableArrayOffset(), 1796b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com index); 1806b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 1816b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 1826b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comIndexSubTableList* BitmapSizeTable::GetIndexSubTableList() { 183333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com AutoLock lock(index_subtables_lock_); 184333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (index_subtables_.empty()) { 1856b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com for (int32_t i = 0; i < NumberOfIndexSubTables(); ++i) { 1866b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com IndexSubTablePtr table; 1876b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com table.Attach(CreateIndexSubTable(i)); 188333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com index_subtables_.push_back(table); 189333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 190333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 191333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return &index_subtables_; 192333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 193333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 194333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com/****************************************************************************** 195333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * BitmapSizeTable::Builder class 196333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ******************************************************************************/ 197333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::~Builder() { 198333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 199333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 200333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH 201333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comFontDataTable* BitmapSizeTable::Builder::SubBuildTable(ReadableFontData* data) { 202333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapSizeTablePtr output = new BitmapSizeTable(data, master_read_data()); 203333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return output.Detach(); 204333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 205333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 206333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::SubDataSet() { 207333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com Revert(); 208333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 209333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 210333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::SubDataSizeToSerialize() { 211333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableBuilderList* builders = IndexSubTableBuilders(); 212333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (builders->empty()) { 213333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return 0; 214333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 215333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t size = EblcTable::Offset::kBitmapSizeTableLength; 216333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com bool variable = false; 217333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com for (IndexSubTableBuilderList::iterator b = builders->begin(), 218333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com e = builders->end(); b != e; b++) { 219333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com size += EblcTable::Offset::kIndexSubTableEntryLength; 220333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t sub_table_size = (*b)->SubDataSizeToSerialize(); 22153847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com int32_t padding = FontMath::PaddingRequired(abs(sub_table_size), 22253847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com DataSize::kULONG); 22353847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com#if defined (SFNTLY_DEBUG_BITMAP) 22453847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com fprintf(stderr, "subtable size=%d\n", sub_table_size); 22553847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com#endif 226333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com variable = (sub_table_size > 0) ? variable : true; 22753847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com size += abs(sub_table_size) + padding; 228333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 22953847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com#if defined (SFNTLY_DEBUG_BITMAP) 23053847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com fprintf(stderr, "bitmap table size=%d\n", variable ? -size : size); 23153847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com#endif 23253847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com return variable ? -size : size; 233333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 234333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 235333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.combool BitmapSizeTable::Builder::SubReadyToSerialize() { 236333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (IndexSubTableBuilders()->empty()) { 237333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return false; 238333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 239333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return true; 240333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 241333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 242333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::SubSerialize(WritableFontData* new_data) { 243333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com SetNumberOfIndexSubTables(IndexSubTableBuilders()->size()); 244333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t size = InternalReadData()->CopyTo(new_data); 245333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return size; 246333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 247333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 248333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH BitmapSizeTable::Builder* 249333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::CreateBuilder(WritableFontData* data, 250333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ReadableFontData* master_data) { 251333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapSizeTableBuilderPtr output = 252333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com new BitmapSizeTable::Builder(data, master_data); 253333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return output.Detach(); 254333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 255333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 256333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH BitmapSizeTable::Builder* 257333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::CreateBuilder(ReadableFontData* data, 258333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ReadableFontData* master_data) { 259333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapSizeTableBuilderPtr output = 260333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com new BitmapSizeTable::Builder(data, master_data); 261333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return output.Detach(); 262333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 263333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 264333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::IndexSubTableArrayOffset() { 265333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return InternalReadData()->ReadULongAsInt( 266333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_indexSubTableArrayOffset); 267333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 268333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 269333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::SetIndexSubTableArrayOffset(int32_t offset) { 270333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com InternalWriteData()->WriteULong( 271333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_indexSubTableArrayOffset, offset); 272333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 273333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 274333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::IndexTableSize() { 275333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return InternalReadData()->ReadULongAsInt( 276333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_indexTableSize); 277333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 278333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 279333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::SetIndexTableSize(int32_t size) { 280333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com InternalWriteData()->WriteULong( 281333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_indexTableSize, size); 282333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 283333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 284333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::NumberOfIndexSubTables() { 285333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return GetIndexSubTableBuilders()->size(); 286333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 287333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 288333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::ColorRef() { 289333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return InternalReadData()->ReadULongAsInt( 290333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_colorRef); 291333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 292333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 293333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::StartGlyphIndex() { 294333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return InternalReadData()->ReadUShort( 295333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_startGlyphIndex); 296333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 297333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 298333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::EndGlyphIndex() { 299333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return InternalReadData()->ReadUShort( 300333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_endGlyphIndex); 301333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 302333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 303333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::PpemX() { 304333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return InternalReadData()->ReadByte( 305333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_ppemX); 306333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 307333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 308333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::PpemY() { 309333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return InternalReadData()->ReadByte( 310333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_ppemY); 311333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 312333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 313333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::BitDepth() { 314333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return InternalReadData()->ReadByte( 315333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_bitDepth); 316333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 317333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 318333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::FlagsAsInt() { 319333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return InternalReadData()->ReadChar( 320333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_flags); 321333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 322333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 32353847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.comIndexSubTable::Builder* BitmapSizeTable::Builder::IndexSubTableBuilder( 324333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t index) { 325333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableBuilderList* sub_table_list = GetIndexSubTableBuilders(); 326333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return sub_table_list->at(index); 327333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 328333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 329144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.comCALLER_ATTACH BitmapGlyphInfo* BitmapSizeTable::Builder::GlyphInfo( 330144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com int32_t glyph_id) { 331144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com IndexSubTable::Builder* sub_table = SearchIndexSubTables(glyph_id); 332144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com if (sub_table == NULL) { 333144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com return NULL; 334144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com } 335144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com return sub_table->GlyphInfo(glyph_id); 336144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com} 337144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com 338333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::GlyphOffset(int32_t glyph_id) { 339333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTable::Builder* subtable = SearchIndexSubTables(glyph_id); 340333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (subtable == NULL) { 341333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return -1; 342333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 343333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return subtable->GlyphOffset(glyph_id); 344333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 345333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 346333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::GlyphLength(int32_t glyph_id) { 347333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTable::Builder* subtable = SearchIndexSubTables(glyph_id); 348333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (subtable == NULL) { 349333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return -1; 350333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 351333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return subtable->GlyphLength(glyph_id); 352333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 353333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 354333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::GlyphFormat(int32_t glyph_id) { 355333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTable::Builder* subtable = SearchIndexSubTables(glyph_id); 356333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (subtable == NULL) { 357333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return -1; 358333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 359333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return subtable->image_format(); 360333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 361333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 362333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTableBuilderList* BitmapSizeTable::Builder::IndexSubTableBuilders() { 363333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return GetIndexSubTableBuilders(); 364333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 365333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 366333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH BitmapSizeTable::Builder::BitmapGlyphInfoIterator* 367333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::GetIterator() { 368333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com Ptr<BitmapSizeTable::Builder::BitmapGlyphInfoIterator> output = 369333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com new BitmapSizeTable::Builder::BitmapGlyphInfoIterator(this); 370333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return output.Detach(); 371333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 372333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 373333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::GenerateLocaMap(BitmapGlyphInfoMap* output) { 374333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com assert(output); 375333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com Ptr<BitmapSizeTable::Builder::BitmapGlyphInfoIterator> it; 376333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com it.Attach(GetIterator()); 377333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com while (it->HasNext()) { 378333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapGlyphInfoPtr info; 379333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com info.Attach(it->Next()); 380333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com (*output)[info->glyph_id()] = info; 381333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 382333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 383333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 384333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::Revert() { 385333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com index_sub_tables_.clear(); 386333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com set_model_changed(false); 387333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 388333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 389333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::Builder(WritableFontData* data, 390333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ReadableFontData* master_data) 391333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com : SubTable::Builder(data, master_data) { 392333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 393333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 394333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::Builder(ReadableFontData* data, 395333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ReadableFontData* master_data) 396333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com : SubTable::Builder(data, master_data) { 397333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 398333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 399333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::SetNumberOfIndexSubTables(int32_t count) { 400333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com InternalWriteData()->WriteULong( 401333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kBitmapSizeTable_numberOfIndexSubTables, count); 402333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 403333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 404333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTable::Builder* BitmapSizeTable::Builder::SearchIndexSubTables( 405333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t glyph_id) { 406144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com // would be faster to binary search but too many size tables don't have 407144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com // sorted subtables 408144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com#if (SFNTLY_BITMAPSIZE_USE_BINARY_SEARCH) 409144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com return BinarySearchIndexSubTables(glyph_id); 410144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com#else 411144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com return LinearSearchIndexSubTables(glyph_id); 412144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com#endif 413144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com} 414144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com 415144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.comIndexSubTable::Builder* BitmapSizeTable::Builder::LinearSearchIndexSubTables( 416144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com int32_t glyph_id) { 417144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com IndexSubTableBuilderList* subtable_list = GetIndexSubTableBuilders(); 418144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com for (IndexSubTableBuilderList::iterator b = subtable_list->begin(), 419144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com e = subtable_list->end(); 420144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com b != e; b++) { 421144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com if ((*b)->first_glyph_index() <= glyph_id && 422144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com (*b)->last_glyph_index() >= glyph_id) { 423144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com return *b; 424144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com } 425144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com } 426144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com return NULL; 427144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com} 428144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com 429144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.comIndexSubTable::Builder* BitmapSizeTable::Builder::BinarySearchIndexSubTables( 430144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com int32_t glyph_id) { 431333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableBuilderList* subtable_list = GetIndexSubTableBuilders(); 432333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t index = 0; 433333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t bottom = 0; 434333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t top = subtable_list->size(); 435333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com while (top != bottom) { 436333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com index = (top + bottom) / 2; 437333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTable::Builder* subtable = subtable_list->at(index); 438333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (glyph_id < subtable->first_glyph_index()) { 439333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com // Location beow current location 440333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com top = index; 441333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } else { 442333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (glyph_id <= subtable->last_glyph_index()) { 443333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return subtable; 444333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } else { 445333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com bottom = index + 1; 446333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 447333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 448333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 449333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return NULL; 450333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 451333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 452333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTableBuilderList* BitmapSizeTable::Builder::GetIndexSubTableBuilders() { 453333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (index_sub_tables_.empty()) { 454333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com Initialize(InternalReadData()); 455333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com set_model_changed(); 456333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 457333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return &index_sub_tables_; 458333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 459333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 460333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::Initialize(ReadableFontData* data) { 461333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com index_sub_tables_.clear(); 462333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (data) { 463333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t number_of_index_subtables = 464333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapSizeTable::NumberOfIndexSubTables(data, 0); 465be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com index_sub_tables_.resize(number_of_index_subtables); 466333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com for (int32_t i = 0; i < number_of_index_subtables; ++i) { 467be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com index_sub_tables_[i].Attach(CreateIndexSubTableBuilder(i)); 468333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 469333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 470333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 471333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 472333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH IndexSubTable::Builder* 473333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::CreateIndexSubTableBuilder(int32_t index) { 474333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return IndexSubTable::Builder::CreateBuilder(master_read_data(), 475333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableArrayOffset(), 476333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com index); 477333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 478333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 479333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com/****************************************************************************** 480333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * BitmapSizeTable::Builder::BitmapGlyphInfoIterator class 481333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ******************************************************************************/ 482333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::BitmapGlyphInfoIterator::BitmapGlyphInfoIterator( 483333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapSizeTable::Builder* container) 484333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com : RefIterator<BitmapGlyphInfo, BitmapSizeTable::Builder>(container) { 485333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com sub_table_iter_ = container->IndexSubTableBuilders()->begin(); 486333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com sub_table_glyph_info_iter_.Attach((*sub_table_iter_)->GetIterator()); 487333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 488333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 489333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.combool BitmapSizeTable::Builder::BitmapGlyphInfoIterator::HasNext() { 490333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (sub_table_glyph_info_iter_ && HasNext(sub_table_glyph_info_iter_)) { 491333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return true; 492333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 493333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com while (++sub_table_iter_ != container()->IndexSubTableBuilders()->end()) { 494333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com sub_table_glyph_info_iter_.Attach((*sub_table_iter_)->GetIterator()); 495333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (HasNext(sub_table_glyph_info_iter_)) { 496333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return true; 497333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 498333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 499333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return false; 500333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 501333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 502333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH 503333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapGlyphInfo* BitmapSizeTable::Builder::BitmapGlyphInfoIterator::Next() { 504333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (!HasNext()) { 505333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com // Note: In C++, we do not throw exception when there's no element. 506333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return NULL; 507333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 508333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return Next(sub_table_glyph_info_iter_); 509333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 510333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 511333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.combool BitmapSizeTable::Builder::BitmapGlyphInfoIterator::HasNext( 512333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapGlyphInfoIter* iterator_base) { 513333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (iterator_base) { 514333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com switch (iterator_base->container_base()->index_format()) { 515333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com case 1: { 516333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat1::Builder::BitmapGlyphInfoIterator* it = 517333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com down_cast<IndexSubTableFormat1::Builder::BitmapGlyphInfoIterator*>( 518333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com iterator_base); 519333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return it->HasNext(); 520333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 521333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 522333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com case 2: { 523333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator* it = 524333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com down_cast<IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator*>( 525333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com iterator_base); 526333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return it->HasNext(); 527333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 528333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 529333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com case 3: { 530333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat3::Builder::BitmapGlyphInfoIterator* it = 531333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com down_cast<IndexSubTableFormat3::Builder::BitmapGlyphInfoIterator*>( 532333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com iterator_base); 533333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return it->HasNext(); 534333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 535333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 536333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com case 4: { 537333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat4::Builder::BitmapGlyphInfoIterator* it = 538333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com down_cast<IndexSubTableFormat4::Builder::BitmapGlyphInfoIterator*>( 539333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com iterator_base); 540333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return it->HasNext(); 541333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 542333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 543333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com case 5: { 544333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator* it = 545333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com down_cast<IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator*>( 546333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com iterator_base); 547333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return it->HasNext(); 548333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 549333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 550333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com default: 551333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com break; 552333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 553333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 554333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return false; 555333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 556333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 557333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH 558333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapGlyphInfo* BitmapSizeTable::Builder::BitmapGlyphInfoIterator::Next( 559333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapGlyphInfoIter* iterator_base) { 560333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (iterator_base) { 561333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com switch (iterator_base->container_base()->index_format()) { 562333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com case 1: { 563333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat1::Builder::BitmapGlyphInfoIterator* it = 564333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com down_cast<IndexSubTableFormat1::Builder::BitmapGlyphInfoIterator*>( 565333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com iterator_base); 566333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return it->Next(); 567333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 568333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 569333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com case 2: { 570333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator* it = 571333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com down_cast<IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator*>( 572333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com iterator_base); 573333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return it->Next(); 574333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 575333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 576333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com case 3: { 577333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat3::Builder::BitmapGlyphInfoIterator* it = 578333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com down_cast<IndexSubTableFormat3::Builder::BitmapGlyphInfoIterator*>( 579333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com iterator_base); 580333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return it->Next(); 581333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 582333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 583333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com case 4: { 584333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat4::Builder::BitmapGlyphInfoIterator* it = 585333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com down_cast<IndexSubTableFormat4::Builder::BitmapGlyphInfoIterator*>( 586333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com iterator_base); 587333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return it->Next(); 588333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 589333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 590333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com case 5: { 591333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator* it = 592333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com down_cast<IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator*>( 593333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com iterator_base); 594333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return it->Next(); 595333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 596333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 597333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com default: 598333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com break; 5996b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } 6006b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } 601333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return NULL; 6026b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 6036b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 6046b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} // namespace sfntly 605