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/index_sub_table_format2.h" 186b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 196b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#include "sfntly/table/bitmap/eblc_table.h" 206b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 216b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comnamespace sfntly { 22333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com/****************************************************************************** 23333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * IndexSubTableFormat2 class 24333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ******************************************************************************/ 25333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTableFormat2::~IndexSubTableFormat2() { 26333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 276b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 2853847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.comint32_t IndexSubTableFormat2::ImageSize() { 2953847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com return data_->ReadULongAsInt(EblcTable::Offset::kIndexSubTable2_imageSize); 3053847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com} 3153847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com 3253847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.comCALLER_ATTACH BigGlyphMetrics* IndexSubTableFormat2::BigMetrics() { 3353847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com ReadableFontDataPtr slice; 3453847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com slice.Attach(down_cast<ReadableFontData*>( 3553847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com data_->Slice(EblcTable::Offset::kIndexSubTable2_bigGlyphMetrics, 3653847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com BigGlyphMetrics::Offset::kMetricsLength))); 3753847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com BigGlyphMetricsPtr output = new BigGlyphMetrics(slice); 3853847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com return output.Detach(); 3953847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com} 4053847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com 41333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t IndexSubTableFormat2::NumGlyphs() { 42333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return last_glyph_index() - first_glyph_index() + 1; 43333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 44333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 45333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t IndexSubTableFormat2::GlyphStartOffset(int32_t glyph_id) { 46333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t loca = CheckGlyphRange(glyph_id); 47333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (loca == -1) { 48333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return -1; 49333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 50333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return loca * image_size_; 51333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 52333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 53333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t IndexSubTableFormat2::GlyphLength(int32_t glyph_id) { 54333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (CheckGlyphRange(glyph_id) == -1) { 55333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return 0; 56333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 57333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return image_size_; 586b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 596b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 606b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comIndexSubTableFormat2::IndexSubTableFormat2(ReadableFontData* data, 616b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com int32_t first, 626b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com int32_t last) 636b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com : IndexSubTable(data, first, last) { 646b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com image_size_ = 656b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com data_->ReadULongAsInt(EblcTable::Offset::kIndexSubTable2_imageSize); 666b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 676b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 68333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com/****************************************************************************** 69333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * IndexSubTableFormat2::Builder class 70333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ******************************************************************************/ 71333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTableFormat2::Builder::~Builder() { 726b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 736b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 74333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t IndexSubTableFormat2::Builder::NumGlyphs() { 756b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return last_glyph_index() - first_glyph_index() + 1; 766b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 776b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 78333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t IndexSubTableFormat2::Builder::GlyphStartOffset(int32_t glyph_id) { 79333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t loca = CheckGlyphRange(glyph_id); 80333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (loca == -1) { 81333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return -1; 826b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } 83333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return loca * ImageSize(); 846b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 856b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 86333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t IndexSubTableFormat2::Builder::GlyphLength(int32_t glyph_id) { 87333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t loca = CheckGlyphRange(glyph_id); 88333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (loca == -1) { 89333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return 0; 90333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 91333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return ImageSize(); 92333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 93333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 94be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.comCALLER_ATTACH IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator* 95be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com IndexSubTableFormat2::Builder::GetIterator() { 96333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com Ptr<IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator> it = 97333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com new IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator(this); 98333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return it.Detach(); 99333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 100333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 101333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t IndexSubTableFormat2::Builder::ImageSize() { 102333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return InternalReadData()->ReadULongAsInt( 103333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com EblcTable::Offset::kIndexSubTable2_imageSize); 104333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 105333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 106333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid IndexSubTableFormat2::Builder::SetImageSize(int32_t image_size) { 107333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com InternalWriteData()->WriteULong(EblcTable::Offset::kIndexSubTable2_imageSize, 108333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com image_size); 109333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 110333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 11153847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.comBigGlyphMetrics::Builder* IndexSubTableFormat2::Builder::BigMetrics() { 11253847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com if (metrics_ == NULL) { 11353847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com WritableFontDataPtr data; 11453847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com data.Attach(down_cast<WritableFontData*>(InternalWriteData()->Slice( 11553847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com EblcTable::Offset::kIndexSubTable2_bigGlyphMetrics, 11653847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com BigGlyphMetrics::Offset::kMetricsLength))); 11753847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com metrics_ = new BigGlyphMetrics::Builder(data); 11853847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com } 11953847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com return metrics_; 12053847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com} 12153847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com 12253847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com// static 12353847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.comCALLER_ATTACH IndexSubTableFormat2::Builder* 12453847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.comIndexSubTableFormat2::Builder::CreateBuilder() { 12553847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com IndexSubTableFormat2BuilderPtr output = new IndexSubTableFormat2::Builder(); 126333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return output.Detach(); 127333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 128333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 129333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com// static 130333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH IndexSubTableFormat2::Builder* 131333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTableFormat2::Builder::CreateBuilder(ReadableFontData* data, 132333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t index_sub_table_offset, 133333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t first_glyph_index, 134333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t last_glyph_index) { 135333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t length = Builder::DataLength(data, 136333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com index_sub_table_offset, 137333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com first_glyph_index, 138333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com last_glyph_index); 139333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ReadableFontDataPtr new_data; 140333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com new_data.Attach(down_cast<ReadableFontData*>( 141333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com data->Slice(index_sub_table_offset, length))); 142127cef2a54a5b6e6777761d550c1ec90e736383farthurhsu@google.com if (new_data == NULL) { 143127cef2a54a5b6e6777761d550c1ec90e736383farthurhsu@google.com return NULL; 144127cef2a54a5b6e6777761d550c1ec90e736383farthurhsu@google.com } 145333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat2BuilderPtr output = 146333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com new IndexSubTableFormat2::Builder(new_data, 147333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com first_glyph_index, 148333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com last_glyph_index); 149333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return output.Detach(); 150333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 151333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 152333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com// static 153333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH IndexSubTableFormat2::Builder* 154333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTableFormat2::Builder::CreateBuilder(WritableFontData* data, 155333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t index_sub_table_offset, 156333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t first_glyph_index, 157333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t last_glyph_index) { 158333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t length = Builder::DataLength(data, 159333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com index_sub_table_offset, 160333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com first_glyph_index, 161333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com last_glyph_index); 162333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com WritableFontDataPtr new_data; 163333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com new_data.Attach(down_cast<WritableFontData*>( 164333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com data->Slice(index_sub_table_offset, length))); 165333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat2BuilderPtr output = 166333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com new IndexSubTableFormat2::Builder(new_data, 167333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com first_glyph_index, 168333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com last_glyph_index); 169333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return output.Detach(); 170333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 171333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 172333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH FontDataTable* IndexSubTableFormat2::Builder::SubBuildTable( 173333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ReadableFontData* data) { 174333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat2Ptr output = new IndexSubTableFormat2( 175333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com data, first_glyph_index(), last_glyph_index()); 176333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return output.Detach(); 177333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 178333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 179333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid IndexSubTableFormat2::Builder::SubDataSet() { 18053847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com Revert(); 181333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 182333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 183333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t IndexSubTableFormat2::Builder::SubDataSizeToSerialize() { 184333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return EblcTable::Offset::kIndexSubTable2Length; 185333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 186333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 187333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.combool IndexSubTableFormat2::Builder::SubReadyToSerialize() { 188333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return true; 189333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 190333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 191333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t IndexSubTableFormat2::Builder::SubSerialize( 192333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com WritableFontData* new_data) { 193333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t size = SerializeIndexSubHeader(new_data); 19453847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com if (metrics_ == NULL) { 19553847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com ReadableFontDataPtr source; 19653847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com WritableFontDataPtr target; 19753847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com source.Attach(down_cast<ReadableFontData*>( 19853847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com InternalReadData()->Slice(size))); 19953847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com target.Attach(down_cast<WritableFontData*>(new_data->Slice(size))); 20053847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com size += source->CopyTo(target); 20153847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com } else { 20253847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com WritableFontDataPtr slice; 20353847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com size += new_data->WriteLong(EblcTable::Offset::kIndexSubTable2_imageSize, 20453847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com ImageSize()); 20553847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com slice.Attach(down_cast<WritableFontData*>(new_data->Slice(size))); 20653847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com size += metrics_->SubSerialize(slice); 20753847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com } 208333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return size; 209333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 210333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 21153847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.comIndexSubTableFormat2::Builder::Builder() 21253847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com : IndexSubTable::Builder(EblcTable::Offset::kIndexSubTable3_builderDataSize, 21353847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com IndexSubTable::Format::FORMAT_2) { 21453847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com metrics_.Attach(BigGlyphMetrics::Builder::CreateBuilder()); 21553847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com} 21653847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com 217333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTableFormat2::Builder::Builder(WritableFontData* data, 218333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t first_glyph_index, 219333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t last_glyph_index) 220333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com : IndexSubTable::Builder(data, first_glyph_index, last_glyph_index) { 221333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 222333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 223333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTableFormat2::Builder::Builder(ReadableFontData* data, 224333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t first_glyph_index, 225333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t last_glyph_index) 226333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com : IndexSubTable::Builder(data, first_glyph_index, last_glyph_index) { 227333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 228333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 229333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com// static 230333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t IndexSubTableFormat2::Builder::DataLength( 231333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ReadableFontData* data, 232333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t index_sub_table_offset, 233333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t first_glyph_index, 234333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t last_glyph_index) { 235333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com UNREFERENCED_PARAMETER(data); 236333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com UNREFERENCED_PARAMETER(index_sub_table_offset); 237333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com UNREFERENCED_PARAMETER(first_glyph_index); 238333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com UNREFERENCED_PARAMETER(last_glyph_index); 239333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return EblcTable::Offset::kIndexSubTable2Length; 240333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 241333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 242333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com/****************************************************************************** 243333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator class 244333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ******************************************************************************/ 245333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTableFormat2::Builder::BitmapGlyphInfoIterator::BitmapGlyphInfoIterator( 246333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTableFormat2::Builder* container) 247333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com : RefIterator<BitmapGlyphInfo, IndexSubTableFormat2::Builder, 248333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com IndexSubTable::Builder>(container) { 249333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_id_ = container->first_glyph_index(); 250333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 251333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 252333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.combool IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator::HasNext() { 253333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (glyph_id_ <= container()->last_glyph_index()) { 254333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return true; 255333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 256333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return false; 257333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 258333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 259333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH BitmapGlyphInfo* 260333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTableFormat2::Builder::BitmapGlyphInfoIterator::Next() { 261333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapGlyphInfoPtr output; 262333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (!HasNext()) { 263333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com // Note: In C++, we do not throw exception when there's no element. 264333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return NULL; 2656b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } 266333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com output = new BitmapGlyphInfo(glyph_id_, 267333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com container()->image_data_offset(), 268333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com container()->GlyphStartOffset(glyph_id_), 269333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com container()->GlyphLength(glyph_id_), 270333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com container()->image_format()); 271333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_id_++; 272333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return output.Detach(); 2736b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 2746b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 2756b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} // namespace sfntly 276