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/index_sub_table_format5.h" 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <algorithm> 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/bitmap/eblc_table.h" 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly { 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/****************************************************************************** 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * IndexSubTableFormat5 class 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ******************************************************************************/ 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableFormat5::~IndexSubTableFormat5() { 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t IndexSubTableFormat5::NumGlyphs() { 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NumGlyphs(data_, 0); 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t IndexSubTableFormat5::GlyphStartOffset(int32_t glyph_id) { 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t check = CheckGlyphRange(glyph_id); 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (check == -1) { 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return -1; 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t loca = ReadFontData()->SearchUShort( 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kIndexSubTable5_glyphArray, 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun DataSize::kUSHORT, 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun NumGlyphs(), 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun glyph_id); 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (loca == -1) { 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return loca; 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return loca * ImageSize(); 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t IndexSubTableFormat5::GlyphLength(int32_t glyph_id) { 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t check = CheckGlyphRange(glyph_id); 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (check == -1) { 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return 0; 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return image_size_; 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t IndexSubTableFormat5::ImageSize() { 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return data_->ReadULongAsInt(EblcTable::Offset::kIndexSubTable5_imageSize); 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH BigGlyphMetrics* IndexSubTableFormat5::BigMetrics() { 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontDataPtr data; 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun data.Attach(down_cast<ReadableFontData*>(data_->Slice( 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kIndexSubTable5_bigGlyphMetrics, 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BigGlyphMetrics::Offset::kMetricsLength))); 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BigGlyphMetricsPtr output = new BigGlyphMetrics(data); 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return output.Detach(); 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableFormat5::IndexSubTableFormat5(ReadableFontData* data, 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t first_glyph_index, 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t last_glyph_index) 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun : IndexSubTable(data, first_glyph_index, last_glyph_index) { 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun image_size_ = data_->ReadULongAsInt( 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kIndexSubTable5_imageSize); 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// static 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t IndexSubTableFormat5::NumGlyphs(ReadableFontData* data, 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t table_offset) { 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t num_glyphs = data->ReadULongAsInt(table_offset + 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kIndexSubTable5_numGlyphs); 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return num_glyphs; 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/****************************************************************************** 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * IndexSubTableFormat5::Builder class 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ******************************************************************************/ 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableFormat5::Builder::~Builder() { 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t IndexSubTableFormat5::Builder::NumGlyphs() { 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return GetGlyphArray()->size(); 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t IndexSubTableFormat5::Builder::GlyphLength(int32_t glyph_id) { 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun UNREFERENCED_PARAMETER(glyph_id); 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return ImageSize(); 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t IndexSubTableFormat5::Builder::GlyphStartOffset(int32_t glyph_id) { 10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t check = CheckGlyphRange(glyph_id); 10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (check == -1) { 10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return -1; 10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IntegerList* glyph_array = GetGlyphArray(); 10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IntegerList::iterator it = std::find(glyph_array->begin(), 10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun glyph_array->end(), 11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun glyph_id); 11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (it == glyph_array->end()) { 11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return -1; 11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return (it - glyph_array->begin()) * ImageSize(); 11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator* 11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat5::Builder::GetIterator() { 11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Ptr<IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator> it = 12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun new IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator(this); 12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return it.Detach(); 12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// static 12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH IndexSubTableFormat5::Builder* 12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableFormat5::Builder::CreateBuilder() { 12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat5BuilderPtr output = new IndexSubTableFormat5::Builder(); 12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return output.Detach(); 12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// static 13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH IndexSubTableFormat5::Builder* 13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableFormat5::Builder::CreateBuilder(ReadableFontData* data, 13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t index_sub_table_offset, 13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t first_glyph_index, 13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t last_glyph_index) { 13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t length = Builder::DataLength(data, 13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun index_sub_table_offset, 13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun first_glyph_index, 14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun last_glyph_index); 14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontDataPtr new_data; 14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun new_data.Attach(down_cast<ReadableFontData*>( 14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun data->Slice(index_sub_table_offset, length))); 14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (new_data == NULL) { 14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NULL; 14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat5BuilderPtr output = 14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun new IndexSubTableFormat5::Builder(new_data, 14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun first_glyph_index, 15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun last_glyph_index); 15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return output.Detach(); 15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// static 15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH IndexSubTableFormat5::Builder* 15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableFormat5::Builder::CreateBuilder(WritableFontData* data, 15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t index_sub_table_offset, 15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t first_glyph_index, 15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t last_glyph_index) { 16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t length = Builder::DataLength(data, 16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun index_sub_table_offset, 16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun first_glyph_index, 16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun last_glyph_index); 16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun WritableFontDataPtr new_data; 16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun new_data.Attach(down_cast<WritableFontData*>( 16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun data->Slice(index_sub_table_offset, length))); 16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat5BuilderPtr output = 16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun new IndexSubTableFormat5::Builder(new_data, 16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun first_glyph_index, 17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun last_glyph_index); 17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return output.Detach(); 17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH FontDataTable* IndexSubTableFormat5::Builder::SubBuildTable( 17530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontData* data) { 17630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat5Ptr output = new IndexSubTableFormat5( 17730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun data, first_glyph_index(), last_glyph_index()); 17830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return output.Detach(); 17930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 18030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 18130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid IndexSubTableFormat5::Builder::SubDataSet() { 18230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Revert(); 18330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 18430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 18530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t IndexSubTableFormat5::Builder::SubDataSizeToSerialize() { 18630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (glyph_array_.empty()) { 18730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return InternalReadData()->Length(); 18830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 18930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return EblcTable::Offset::kIndexSubTable5_builderDataSize + 19030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun glyph_array_.size() * DataSize::kUSHORT; 19130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 19230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 19330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool IndexSubTableFormat5::Builder::SubReadyToSerialize() { 19430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (!glyph_array_.empty()) { 19530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return true; 19630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 19730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return false; 19830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 19930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 20030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t IndexSubTableFormat5::Builder::SubSerialize( 20130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun WritableFontData* new_data) { 20230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t size = SerializeIndexSubHeader(new_data); 20330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (!model_changed()) { 20430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontDataPtr source; 20530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun WritableFontDataPtr target; 20630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun source.Attach(down_cast<ReadableFontData*>(InternalReadData()->Slice( 20730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kIndexSubTable5_imageSize))); 20830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun target.Attach(down_cast<WritableFontData*>(new_data->Slice( 20930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kIndexSubTable5_imageSize))); 21030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun size += source->CopyTo(target); 21130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } else { 21230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun size += new_data->WriteULong(EblcTable::Offset::kIndexSubTable5_imageSize, 21330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ImageSize()); 21430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun WritableFontDataPtr slice; 21530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun slice.Attach(down_cast<WritableFontData*>(new_data->Slice(size))); 21630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun size += BigMetrics()->SubSerialize(slice); 21730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun size += new_data->WriteULong(size, glyph_array_.size()); 21830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (IntegerList::iterator b = glyph_array_.begin(), e = glyph_array_.end(); 21930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun b != e; b++) { 22030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun size += new_data->WriteUShort(size, *b); 22130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 22230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 22330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return size; 22430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 22530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 22630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t IndexSubTableFormat5::Builder::ImageSize() { 22730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return InternalReadData()->ReadULongAsInt( 22830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kIndexSubTable5_imageSize); 22930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 23030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 23130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid IndexSubTableFormat5::Builder::SetImageSize(int32_t image_size) { 23230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun InternalWriteData()->WriteULong( 23330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kIndexSubTable5_imageSize, image_size); 23430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 23530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 23630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunBigGlyphMetrics::Builder* IndexSubTableFormat5::Builder::BigMetrics() { 23730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (metrics_ == NULL) { 23830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun WritableFontDataPtr data; 23930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun data.Attach(down_cast<WritableFontData*>(InternalWriteData()->Slice( 24030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kIndexSubTable5_bigGlyphMetrics, 24130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BigGlyphMetrics::Offset::kMetricsLength))); 24230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun metrics_ = new BigGlyphMetrics::Builder(data); 24330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun set_model_changed(); 24430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 24530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return metrics_; 24630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 24730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 24830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIntegerList* IndexSubTableFormat5::Builder::GlyphArray() { 24930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return GetGlyphArray(); 25030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 25130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 25230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid IndexSubTableFormat5::Builder::SetGlyphArray(const IntegerList& v) { 25330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun glyph_array_.clear(); 25430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun glyph_array_ = v; 25530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun set_model_changed(); 25630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 25730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 25830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid IndexSubTableFormat5::Builder::Revert() { 25930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun glyph_array_.clear(); 26030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable::Builder::Revert(); 26130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 26230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 26330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableFormat5::Builder::Builder() 26430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun : IndexSubTable::Builder(EblcTable::Offset::kIndexSubTable5_builderDataSize, 26530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable::Format::FORMAT_5) { 26630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 26730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 26830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableFormat5::Builder::Builder(WritableFontData* data, 26930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t first_glyph_index, 27030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t last_glyph_index) 27130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun : IndexSubTable::Builder(data, first_glyph_index, last_glyph_index) { 27230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 27330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 27430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableFormat5::Builder::Builder(ReadableFontData* data, 27530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t first_glyph_index, 27630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t last_glyph_index) 27730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun : IndexSubTable::Builder(data, first_glyph_index, last_glyph_index) { 27830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 27930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 28030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIntegerList* IndexSubTableFormat5::Builder::GetGlyphArray() { 28130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (glyph_array_.empty()) { 28230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Initialize(InternalReadData()); 28330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun set_model_changed(); 28430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 28530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return &glyph_array_; 28630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 28730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 28830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid IndexSubTableFormat5::Builder::Initialize(ReadableFontData* data) { 28930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun glyph_array_.clear(); 29030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (data) { 29130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t num_glyphs = IndexSubTableFormat5::NumGlyphs(data, 0); 29230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (int32_t i = 0; i < num_glyphs; ++i) { 29330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun glyph_array_.push_back(data->ReadUShort( 29430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun EblcTable::Offset::kIndexSubTable5_glyphArray + 29530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun i * DataSize::kUSHORT)); 29630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 29730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 29830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 29930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 30030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// static 30130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t IndexSubTableFormat5::Builder::DataLength( 30230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontData* data, 30330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t index_sub_table_offset, 30430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t first_glyph_index, 30530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t last_glyph_index) { 30630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t num_glyphs = IndexSubTableFormat5::NumGlyphs(data, 30730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun index_sub_table_offset); 30830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun UNREFERENCED_PARAMETER(first_glyph_index); 30930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun UNREFERENCED_PARAMETER(last_glyph_index); 31030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return EblcTable::Offset::kIndexSubTable5_glyphArray + 31130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun num_glyphs * DataSize::kUSHORT; 31230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 31330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 31430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/****************************************************************************** 31530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator class 31630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ******************************************************************************/ 31730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableFormat5::Builder::BitmapGlyphInfoIterator::BitmapGlyphInfoIterator( 31830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTableFormat5::Builder* container) 31930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun : RefIterator<BitmapGlyphInfo, IndexSubTableFormat5::Builder, 32030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IndexSubTable::Builder>(container), 32130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun offset_index_(0) { 32230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 32330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 32430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator::HasNext() { 32530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (offset_index_ < (int32_t)(container()->GetGlyphArray()->size())) { 32630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return true; 32730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 32830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return false; 32930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 33030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 33130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCALLER_ATTACH BitmapGlyphInfo* 33230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunIndexSubTableFormat5::Builder::BitmapGlyphInfoIterator::Next() { 33330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun BitmapGlyphInfoPtr output; 33430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (!HasNext()) { 33530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Note: In C++, we do not throw exception when there's no element. 33630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NULL; 33730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 33830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun output = new BitmapGlyphInfo(container()->GetGlyphArray()->at(offset_index_), 33930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun container()->image_data_offset(), 34030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun offset_index_ * container()->ImageSize(), 34130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun container()->ImageSize(), 34230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun container()->image_format()); 34330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun offset_index_++; 34430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return output.Detach(); 34530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 34630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 34730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} // namespace sfntly 348