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#include "sfntly/table/bitmap/bitmap_size_table.h" 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <stdio.h> 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <stdlib.h> 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/math/font_math.h" 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/bitmap/eblc_table.h" 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/bitmap/index_sub_table_format1.h" 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/bitmap/index_sub_table_format2.h" 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/bitmap/index_sub_table_format3.h" 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/bitmap/index_sub_table_format4.h" 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/bitmap/index_sub_table_format5.h" 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly { 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/****************************************************************************** 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * BitmapSizeTable class 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ******************************************************************************/ 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunBitmapSizeTable::~BitmapSizeTable() { 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::IndexSubTableArrayOffset() { 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return data_->ReadULongAsInt( 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_indexSubTableArrayOffset); 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::IndexTableSize() { 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return data_->ReadULongAsInt( 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_indexTableSize); 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::NumberOfIndexSubTables() { 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NumberOfIndexSubTables(data_, 0); 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::ColorRef() { 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return data_->ReadULongAsInt(EblcTable::Offset::kBitmapSizeTable_colorRef); 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::StartGlyphIndex() { 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return data_->ReadUShort(EblcTable::Offset::kBitmapSizeTable_startGlyphIndex); 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::EndGlyphIndex() { 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return data_->ReadUShort(EblcTable::Offset::kBitmapSizeTable_endGlyphIndex); 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::PpemX() { 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return data_->ReadByte(EblcTable::Offset::kBitmapSizeTable_ppemX); 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::PpemY() { 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return data_->ReadByte(EblcTable::Offset::kBitmapSizeTable_ppemY); 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::BitDepth() { 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return data_->ReadByte(EblcTable::Offset::kBitmapSizeTable_bitDepth); 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::FlagsAsInt() { 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return data_->ReadChar(EblcTable::Offset::kBitmapSizeTable_flags); 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTable* BitmapSizeTable::GetIndexSubTable(int32_t index) { 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableList* subtable_list = GetIndexSubTableList(); 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (index >= 0 && (size_t)index < subtable_list->size()) { 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return (*subtable_list)[index]; 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NULL; 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::GlyphOffset(int32_t glyph_id) { 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable* subtable = SearchIndexSubTables(glyph_id); 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (subtable == NULL) { 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return -1; 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return subtable->GlyphOffset(glyph_id); 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::GlyphLength(int32_t glyph_id) { 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable* subtable = SearchIndexSubTables(glyph_id); 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (subtable == NULL) { 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return -1; 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return subtable->GlyphLength(glyph_id); 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH BitmapGlyphInfo* BitmapSizeTable::GlyphInfo(int32_t glyph_id) { 10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable* sub_table = SearchIndexSubTables(glyph_id); 10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (sub_table == NULL) { 10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NULL; 10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return sub_table->GlyphInfo(glyph_id); 10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::GlyphFormat(int32_t glyph_id) { 11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable* subtable = SearchIndexSubTables(glyph_id); 11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (subtable == NULL) { 11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return -1; 11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return subtable->image_format(); 11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunBitmapSizeTable::BitmapSizeTable(ReadableFontData* data, 12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontData* master_data) 12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun : SubTable(data, master_data) { 12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// static 12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::NumberOfIndexSubTables(ReadableFontData* data, 12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t table_offset) { 12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return data->ReadULongAsInt(table_offset + 12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_numberOfIndexSubTables); 12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTable* BitmapSizeTable::SearchIndexSubTables(int32_t glyph_id) { 13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // would be faster to binary search but too many size tables don't have 13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // sorted subtables 13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if (SFNTLY_BITMAPSIZE_USE_BINARY_SEARCH) 13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return BinarySearchIndexSubTables(glyph_id); 13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else 13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return LinearSearchIndexSubTables(glyph_id); 13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTable* BitmapSizeTable::LinearSearchIndexSubTables(int32_t glyph_id) { 14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableList* subtable_list = GetIndexSubTableList(); 14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (IndexSubTableList::iterator b = subtable_list->begin(), 14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun e = subtable_list->end(); b != e; b++) { 14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ((*b)->first_glyph_index() <= glyph_id && 14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun (*b)->last_glyph_index() >= glyph_id) { 14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return *b; 14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NULL; 15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTable* BitmapSizeTable::BinarySearchIndexSubTables(int32_t glyph_id) { 15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableList* subtable_list = GetIndexSubTableList(); 15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t index = 0; 15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t bottom = 0; 15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t top = subtable_list->size(); 15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun while (top != bottom) { 15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun index = (top + bottom) / 2; 16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable* subtable = (*subtable_list)[index]; 16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (glyph_id < subtable->first_glyph_index()) { 16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Location beow current location 16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun top = index; 16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } else { 16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (glyph_id <= subtable->last_glyph_index()) { 16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return subtable; 16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } else { 16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bottom = index + 1; 16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NULL; 17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 17430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH 17630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTable* BitmapSizeTable::CreateIndexSubTable(int32_t index) { 17730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return IndexSubTable::CreateIndexSubTable(master_read_data(), 17830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableArrayOffset(), 17930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun index); 18030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 18130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 18230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableList* BitmapSizeTable::GetIndexSubTableList() { 18330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun AutoLock lock(index_subtables_lock_); 18430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (index_subtables_.empty()) { 18530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (int32_t i = 0; i < NumberOfIndexSubTables(); ++i) { 18630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTablePtr table; 18730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun table.Attach(CreateIndexSubTable(i)); 18830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun index_subtables_.push_back(table); 18930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 19030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 19130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return &index_subtables_; 19230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 19330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 19430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/****************************************************************************** 19530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * BitmapSizeTable::Builder class 19630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ******************************************************************************/ 19730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunBitmapSizeTable::Builder::~Builder() { 19830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 19930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 20030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH 20130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunFontDataTable* BitmapSizeTable::Builder::SubBuildTable(ReadableFontData* data) { 20230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BitmapSizeTablePtr output = new BitmapSizeTable(data, master_read_data()); 20330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return output.Detach(); 20430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 20530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 20630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid BitmapSizeTable::Builder::SubDataSet() { 20730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Revert(); 20830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 20930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 21030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::SubDataSizeToSerialize() { 21130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableBuilderList* builders = IndexSubTableBuilders(); 21230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (builders->empty()) { 21330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return 0; 21430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 21530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t size = EblcTable::Offset::kBitmapSizeTableLength; 21630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool variable = false; 21730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (IndexSubTableBuilderList::iterator b = builders->begin(), 21830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun e = builders->end(); b != e; b++) { 21930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun size += EblcTable::Offset::kIndexSubTableEntryLength; 22030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t sub_table_size = (*b)->SubDataSizeToSerialize(); 22130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t padding = FontMath::PaddingRequired(abs(sub_table_size), 22230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun DataSize::kULONG); 22330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (SFNTLY_DEBUG_BITMAP) 22430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun fprintf(stderr, "subtable size=%d\n", sub_table_size); 22530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 22630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun variable = (sub_table_size > 0) ? variable : true; 22730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun size += abs(sub_table_size) + padding; 22830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 22930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (SFNTLY_DEBUG_BITMAP) 23030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun fprintf(stderr, "bitmap table size=%d\n", variable ? -size : size); 23130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 23230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return variable ? -size : size; 23330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 23430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 23530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool BitmapSizeTable::Builder::SubReadyToSerialize() { 23630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (IndexSubTableBuilders()->empty()) { 23730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return false; 23830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 23930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return true; 24030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 24130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 24230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::SubSerialize(WritableFontData* new_data) { 24330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SetNumberOfIndexSubTables(IndexSubTableBuilders()->size()); 24430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t size = InternalReadData()->CopyTo(new_data); 24530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return size; 24630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 24730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 24830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH BitmapSizeTable::Builder* 24930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunBitmapSizeTable::Builder::CreateBuilder(WritableFontData* data, 25030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontData* master_data) { 25130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BitmapSizeTableBuilderPtr output = 25230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun new BitmapSizeTable::Builder(data, master_data); 25330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return output.Detach(); 25430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 25530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 25630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH BitmapSizeTable::Builder* 25730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunBitmapSizeTable::Builder::CreateBuilder(ReadableFontData* data, 25830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontData* master_data) { 25930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BitmapSizeTableBuilderPtr output = 26030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun new BitmapSizeTable::Builder(data, master_data); 26130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return output.Detach(); 26230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 26330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 26430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::IndexSubTableArrayOffset() { 26530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return InternalReadData()->ReadULongAsInt( 26630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_indexSubTableArrayOffset); 26730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 26830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 26930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid BitmapSizeTable::Builder::SetIndexSubTableArrayOffset(int32_t offset) { 27030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun InternalWriteData()->WriteULong( 27130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_indexSubTableArrayOffset, offset); 27230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 27330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 27430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::IndexTableSize() { 27530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return InternalReadData()->ReadULongAsInt( 27630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_indexTableSize); 27730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 27830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 27930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid BitmapSizeTable::Builder::SetIndexTableSize(int32_t size) { 28030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun InternalWriteData()->WriteULong( 28130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_indexTableSize, size); 28230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 28330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 28430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::NumberOfIndexSubTables() { 28530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return GetIndexSubTableBuilders()->size(); 28630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 28730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 28830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::ColorRef() { 28930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return InternalReadData()->ReadULongAsInt( 29030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_colorRef); 29130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 29230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 29330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::StartGlyphIndex() { 29430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return InternalReadData()->ReadUShort( 29530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_startGlyphIndex); 29630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 29730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 29830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::EndGlyphIndex() { 29930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return InternalReadData()->ReadUShort( 30030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_endGlyphIndex); 30130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 30230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 30330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::PpemX() { 30430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return InternalReadData()->ReadByte( 30530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_ppemX); 30630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 30730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 30830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::PpemY() { 30930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return InternalReadData()->ReadByte( 31030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_ppemY); 31130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 31230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 31330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::BitDepth() { 31430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return InternalReadData()->ReadByte( 31530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_bitDepth); 31630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 31730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 31830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::FlagsAsInt() { 31930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return InternalReadData()->ReadChar( 32030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_flags); 32130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 32230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 32330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTable::Builder* BitmapSizeTable::Builder::IndexSubTableBuilder( 32430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t index) { 32530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableBuilderList* sub_table_list = GetIndexSubTableBuilders(); 32630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return sub_table_list->at(index); 32730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 32830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 32930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH BitmapGlyphInfo* BitmapSizeTable::Builder::GlyphInfo( 33030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t glyph_id) { 33130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable::Builder* sub_table = SearchIndexSubTables(glyph_id); 33230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (sub_table == NULL) { 33330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NULL; 33430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 33530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return sub_table->GlyphInfo(glyph_id); 33630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 33730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 33830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::GlyphOffset(int32_t glyph_id) { 33930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable::Builder* subtable = SearchIndexSubTables(glyph_id); 34030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (subtable == NULL) { 34130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return -1; 34230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 34330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return subtable->GlyphOffset(glyph_id); 34430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 34530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 34630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::GlyphLength(int32_t glyph_id) { 34730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable::Builder* subtable = SearchIndexSubTables(glyph_id); 34830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (subtable == NULL) { 34930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return -1; 35030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 35130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return subtable->GlyphLength(glyph_id); 35230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 35330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 35430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t BitmapSizeTable::Builder::GlyphFormat(int32_t glyph_id) { 35530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable::Builder* subtable = SearchIndexSubTables(glyph_id); 35630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (subtable == NULL) { 35730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return -1; 35830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 35930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return subtable->image_format(); 36030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 36130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 36230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableBuilderList* BitmapSizeTable::Builder::IndexSubTableBuilders() { 36330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return GetIndexSubTableBuilders(); 36430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 36530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 36630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH BitmapSizeTable::Builder::BitmapGlyphInfoIterator* 36730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunBitmapSizeTable::Builder::GetIterator() { 36830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Ptr<BitmapSizeTable::Builder::BitmapGlyphInfoIterator> output = 36930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun new BitmapSizeTable::Builder::BitmapGlyphInfoIterator(this); 37030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return output.Detach(); 37130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 37230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 37330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid BitmapSizeTable::Builder::GenerateLocaMap(BitmapGlyphInfoMap* output) { 37430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun assert(output); 37530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Ptr<BitmapSizeTable::Builder::BitmapGlyphInfoIterator> it; 37630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun it.Attach(GetIterator()); 37730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun while (it->HasNext()) { 37830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BitmapGlyphInfoPtr info; 37930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun info.Attach(it->Next()); 38030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun (*output)[info->glyph_id()] = info; 38130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 38230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 38330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 38430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid BitmapSizeTable::Builder::Revert() { 38530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun index_sub_tables_.clear(); 38630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun set_model_changed(false); 38730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 38830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 38930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunBitmapSizeTable::Builder::Builder(WritableFontData* data, 39030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontData* master_data) 39130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun : SubTable::Builder(data, master_data) { 39230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 39330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 39430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunBitmapSizeTable::Builder::Builder(ReadableFontData* data, 39530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontData* master_data) 39630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun : SubTable::Builder(data, master_data) { 39730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 39830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 39930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid BitmapSizeTable::Builder::SetNumberOfIndexSubTables(int32_t count) { 40030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun InternalWriteData()->WriteULong( 40130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kBitmapSizeTable_numberOfIndexSubTables, count); 40230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 40330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 40430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTable::Builder* BitmapSizeTable::Builder::SearchIndexSubTables( 40530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t glyph_id) { 40630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // would be faster to binary search but too many size tables don't have 40730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // sorted subtables 40830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if (SFNTLY_BITMAPSIZE_USE_BINARY_SEARCH) 40930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return BinarySearchIndexSubTables(glyph_id); 41030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else 41130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return LinearSearchIndexSubTables(glyph_id); 41230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 41330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 41430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 41530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTable::Builder* BitmapSizeTable::Builder::LinearSearchIndexSubTables( 41630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t glyph_id) { 41730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableBuilderList* subtable_list = GetIndexSubTableBuilders(); 41830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (IndexSubTableBuilderList::iterator b = subtable_list->begin(), 41930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun e = subtable_list->end(); 42030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun b != e; b++) { 42130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ((*b)->first_glyph_index() <= glyph_id && 42230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun (*b)->last_glyph_index() >= glyph_id) { 42330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return *b; 42430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 42530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 42630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NULL; 42730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 42830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 42930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTable::Builder* BitmapSizeTable::Builder::BinarySearchIndexSubTables( 43030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t glyph_id) { 43130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableBuilderList* subtable_list = GetIndexSubTableBuilders(); 43230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t index = 0; 43330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t bottom = 0; 43430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t top = subtable_list->size(); 43530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun while (top != bottom) { 43630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun index = (top + bottom) / 2; 43730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable::Builder* subtable = subtable_list->at(index); 43830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (glyph_id < subtable->first_glyph_index()) { 43930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Location beow current location 44030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun top = index; 44130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } else { 44230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (glyph_id <= subtable->last_glyph_index()) { 44330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return subtable; 44430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } else { 44530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bottom = index + 1; 44630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 44730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 44830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 44930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NULL; 45030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 45130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 45230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableBuilderList* BitmapSizeTable::Builder::GetIndexSubTableBuilders() { 45330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (index_sub_tables_.empty()) { 45430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Initialize(InternalReadData()); 45530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun set_model_changed(); 45630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 45730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return &index_sub_tables_; 45830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 45930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 46030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid BitmapSizeTable::Builder::Initialize(ReadableFontData* data) { 46130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun index_sub_tables_.clear(); 46230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (data) { 46330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t number_of_index_subtables = 46430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BitmapSizeTable::NumberOfIndexSubTables(data, 0); 46530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun index_sub_tables_.resize(number_of_index_subtables); 46630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (int32_t i = 0; i < number_of_index_subtables; ++i) { 46730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun index_sub_tables_[i].Attach(CreateIndexSubTableBuilder(i)); 46830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 46930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 47030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 47130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 47230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH IndexSubTable::Builder* 47330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunBitmapSizeTable::Builder::CreateIndexSubTableBuilder(int32_t index) { 47430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return IndexSubTable::Builder::CreateBuilder(master_read_data(), 47530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableArrayOffset(), 47630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun index); 47730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 47830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 47930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/****************************************************************************** 48030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * BitmapSizeTable::Builder::BitmapGlyphInfoIterator class 48130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ******************************************************************************/ 48230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunBitmapSizeTable::Builder::BitmapGlyphInfoIterator::BitmapGlyphInfoIterator( 48330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BitmapSizeTable::Builder* container) 48430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun : RefIterator<BitmapGlyphInfo, BitmapSizeTable::Builder>(container) { 48530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun sub_table_iter_ = container->IndexSubTableBuilders()->begin(); 48630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun sub_table_glyph_info_iter_.Attach((*sub_table_iter_)->GetIterator()); 48730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 48830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 48930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool BitmapSizeTable::Builder::BitmapGlyphInfoIterator::HasNext() { 49030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (sub_table_glyph_info_iter_ && HasNext(sub_table_glyph_info_iter_)) { 49130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return true; 49230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 49330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun while (++sub_table_iter_ != container()->IndexSubTableBuilders()->end()) { 49430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun sub_table_glyph_info_iter_.Attach((*sub_table_iter_)->GetIterator()); 49530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (HasNext(sub_table_glyph_info_iter_)) { 49630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return true; 49730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 49830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 49930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return false; 50030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 50130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 50230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH 50330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunBitmapGlyphInfo* BitmapSizeTable::Builder::BitmapGlyphInfoIterator::Next() { 50430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (!HasNext()) { 50530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Note: In C++, we do not throw exception when there's no element. 50630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NULL; 50730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 50830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return Next(sub_table_glyph_info_iter_); 50930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 51030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 51130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool BitmapSizeTable::Builder::BitmapGlyphInfoIterator::HasNext( 51230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BitmapGlyphInfoIter* iterator_base) { 51330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (iterator_base) { 51430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun switch (iterator_base->container_base()->index_format()) { 51530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun case 1: { 51630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat1::Builder::BitmapGlyphInfoIterator* it = 51730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun down_cast<IndexSubTableFormat1::Builder::BitmapGlyphInfoIterator*>( 51830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun iterator_base); 51930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return it->HasNext(); 52030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 52130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 52230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun case 2: { 52330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator* it = 52430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun down_cast<IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator*>( 52530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun iterator_base); 52630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return it->HasNext(); 52730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 52830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 52930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun case 3: { 53030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat3::Builder::BitmapGlyphInfoIterator* it = 53130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun down_cast<IndexSubTableFormat3::Builder::BitmapGlyphInfoIterator*>( 53230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun iterator_base); 53330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return it->HasNext(); 53430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 53530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 53630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun case 4: { 53730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat4::Builder::BitmapGlyphInfoIterator* it = 53830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun down_cast<IndexSubTableFormat4::Builder::BitmapGlyphInfoIterator*>( 53930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun iterator_base); 54030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return it->HasNext(); 54130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 54230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 54330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun case 5: { 54430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator* it = 54530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun down_cast<IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator*>( 54630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun iterator_base); 54730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return it->HasNext(); 54830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 54930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 55030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun default: 55130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun break; 55230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 55330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 55430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return false; 55530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 55630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 55730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH 55830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunBitmapGlyphInfo* BitmapSizeTable::Builder::BitmapGlyphInfoIterator::Next( 55930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BitmapGlyphInfoIter* iterator_base) { 56030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (iterator_base) { 56130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun switch (iterator_base->container_base()->index_format()) { 56230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun case 1: { 56330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat1::Builder::BitmapGlyphInfoIterator* it = 56430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun down_cast<IndexSubTableFormat1::Builder::BitmapGlyphInfoIterator*>( 56530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun iterator_base); 56630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return it->Next(); 56730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 56830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 56930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun case 2: { 57030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator* it = 57130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun down_cast<IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator*>( 57230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun iterator_base); 57330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return it->Next(); 57430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 57530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 57630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun case 3: { 57730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat3::Builder::BitmapGlyphInfoIterator* it = 57830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun down_cast<IndexSubTableFormat3::Builder::BitmapGlyphInfoIterator*>( 57930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun iterator_base); 58030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return it->Next(); 58130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 58230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 58330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun case 4: { 58430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat4::Builder::BitmapGlyphInfoIterator* it = 58530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun down_cast<IndexSubTableFormat4::Builder::BitmapGlyphInfoIterator*>( 58630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun iterator_base); 58730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return it->Next(); 58830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 58930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 59030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun case 5: { 59130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator* it = 59230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun down_cast<IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator*>( 59330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun iterator_base); 59430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return it->Next(); 59530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 59630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 59730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun default: 59830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun break; 59930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 60030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 60130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NULL; 60230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 60330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 60430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} // namespace sfntly 605