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/ebdt_table.h" 186b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 19333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include <stdlib.h> 20333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 216b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#include "sfntly/table/bitmap/composite_bitmap_glyph.h" 226b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#include "sfntly/table/bitmap/simple_bitmap_glyph.h" 236b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 246b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comnamespace sfntly { 256b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com/****************************************************************************** 266b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * EbdtTable class 276b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com ******************************************************************************/ 286b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comEbdtTable::~EbdtTable() { 296b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 306b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 316b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t EbdtTable::Version() { 326b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return data_->ReadFixed(Offset::kVersion); 336b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 346b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 356b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comCALLER_ATTACH 366b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comBitmapGlyph* EbdtTable::Glyph(int32_t offset, int32_t length, int32_t format) { 37333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ReadableFontDataPtr glyph_data; 38333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_data.Attach(down_cast<ReadableFontData*>(data_->Slice(offset, length))); 39333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return BitmapGlyph::CreateGlyph(glyph_data, format); 406b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 416b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 426b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comEbdtTable::EbdtTable(Header* header, ReadableFontData* data) 436b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com : SubTableContainerTable(header, data) { 446b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 456b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 466b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com/****************************************************************************** 476b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * EbdtTable::Builder class 486b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com ******************************************************************************/ 496b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comEbdtTable::Builder::Builder(Header* header, WritableFontData* data) 506b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com : SubTableContainerTable::Builder(header, data) { 516b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 526b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 536b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comEbdtTable::Builder::Builder(Header* header, ReadableFontData* data) 546b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com : SubTableContainerTable::Builder(header, data) { 556b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 566b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 576b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comEbdtTable::Builder::~Builder() { 586b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 596b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 606b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comCALLER_ATTACH FontDataTable* 616b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com EbdtTable::Builder::SubBuildTable(ReadableFontData* data) { 626b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com FontDataTablePtr table = new EbdtTable(header(), data); 636b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return table.Detach(); 646b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 656b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 666b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comvoid EbdtTable::Builder::SubDataSet() { 67333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com Revert(); 686b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 696b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 706b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t EbdtTable::Builder::SubDataSizeToSerialize() { 71333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (glyph_builders_.empty()) { 72333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return 0; 73333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 74333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com bool fixed = true; 75333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t size = Offset::kHeaderLength; 76333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com for (BitmapGlyphBuilderList::iterator builder_map = glyph_builders_.begin(), 77333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com builder_end = glyph_builders_.end(); 78333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com builder_map != builder_end; 79333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com builder_map++) { 80333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com for (BitmapGlyphBuilderMap::iterator glyph_entry = builder_map->begin(), 81333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_entry_end = builder_map->end(); 82333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_entry != glyph_entry_end; 83333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_entry++) { 84333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t glyph_size = glyph_entry->second->SubDataSizeToSerialize(); 85333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com size += abs(glyph_size); 86333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com fixed = (glyph_size <= 0) ? false : fixed; 87333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 88333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 89333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return (fixed ? 1 : -1) * size; 906b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 916b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 926b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.combool EbdtTable::Builder::SubReadyToSerialize() { 93333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (glyph_builders_.empty()) { 94333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return false; 95333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 96333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return true; 976b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 986b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 996b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t EbdtTable::Builder::SubSerialize(WritableFontData* new_data) { 100333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t size = 0; 101333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com size += new_data->WriteFixed(Offset::kVersion, kVersion); 102333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com for (BitmapGlyphBuilderList::iterator builder_map = glyph_builders_.begin(), 103333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com builder_end = glyph_builders_.end(); 104333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com builder_map != builder_end; 105333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com builder_map++) { 106333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com for (BitmapGlyphBuilderMap::iterator glyph_entry = builder_map->begin(), 107333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_entry_end = builder_map->end(); 108333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_entry != glyph_entry_end; 109333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_entry++) { 110333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com WritableFontDataPtr slice; 111333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com slice.Attach(down_cast<WritableFontData*>(new_data->Slice(size))); 112333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com size += glyph_entry->second->SubSerialize(slice); 113333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 114333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 115333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return size; 116333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 117333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 118333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid EbdtTable::Builder::SetLoca(BitmapLocaList* loca_list) { 119333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com assert(loca_list); 120333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com Revert(); 121be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com glyph_loca_.resize(loca_list->size()); 122333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com std::copy(loca_list->begin(), loca_list->end(), glyph_loca_.begin()); 123333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 124333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 125333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid EbdtTable::Builder::GenerateLocaList(BitmapLocaList* output) { 126333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com assert(output); 127333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com output->clear(); 128333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 129333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (glyph_builders_.empty()) { 130333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (glyph_loca_.empty()) { 131333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return; 132333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 133333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 134333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 135333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int start_offset = Offset::kHeaderLength; 136333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com for (BitmapGlyphBuilderList::iterator builder_map = glyph_builders_.begin(), 137333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com builder_end = glyph_builders_.end(); 138333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com builder_map != builder_end; 139333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com builder_map++) { 140333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapGlyphInfoMap new_loca_map; 141333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t glyph_offset = 0; 142333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com for (BitmapGlyphBuilderMap::iterator glyph_entry = builder_map->begin(), 143333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_end = builder_map->end(); 144333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_entry != glyph_end; 145333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_entry++) { 146333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapGlyphBuilderPtr builder = glyph_entry->second; 147333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com int32_t size = builder->SubDataSizeToSerialize(); 148333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapGlyphInfoPtr info = new BitmapGlyphInfo(glyph_entry->first, 149333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com start_offset + glyph_offset, size, builder->format()); 150333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com new_loca_map[glyph_entry->first] = info; 151333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_offset += size; 152333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 153333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com start_offset += glyph_offset; 154333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com output->push_back(new_loca_map); 155333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 156333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 157333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 158333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapGlyphBuilderList* EbdtTable::Builder::GlyphBuilders() { 159333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return GetGlyphBuilders(); 160333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 161333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 162333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid EbdtTable::Builder::SetGlyphBuilders( 163333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapGlyphBuilderList* glyph_builders) { 164333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_builders_.clear(); 165333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com std::copy(glyph_builders->begin(), glyph_builders->end(), 166333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_builders_.begin()); 167333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com set_model_changed(); 168333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 169333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 170333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid EbdtTable::Builder::Revert() { 171333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_loca_.clear(); 172333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_builders_.clear(); 173333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com set_model_changed(false); 1746b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 1756b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 1766b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comCALLER_ATTACH 1776b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comEbdtTable::Builder* EbdtTable::Builder::CreateBuilder(Header* header, 1786b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com WritableFontData* data) { 1796b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com Ptr<EbdtTable::Builder> builder; 1806b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com builder = new Builder(header, data); 1816b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com return builder.Detach(); 1826b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} 1836b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 184333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH 185333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comEbdtTable::Builder* EbdtTable::Builder::CreateBuilder(Header* header, 186333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ReadableFontData* data) { 187333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com Ptr<EbdtTable::Builder> builder; 188333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com builder = new Builder(header, data); 189333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return builder.Detach(); 190333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 191333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 192333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapGlyphBuilderList* EbdtTable::Builder::GetGlyphBuilders() { 193333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (glyph_builders_.empty()) { 194333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (glyph_loca_.empty()) { 195333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#if !defined (SFNTLY_NO_EXCEPTION) 196333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com throw IllegalStateException( 197333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com "Loca values not set - unable to parse glyph data."); 198333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#endif 199333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return NULL; 200333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 201333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com Initialize(InternalReadData(), &glyph_loca_, &glyph_builders_); 202333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com set_model_changed(); 203333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 204333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com return &glyph_builders_; 205333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 206333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 207333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid EbdtTable::Builder::Initialize(ReadableFontData* data, 208333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapLocaList* loca_list, 209333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapGlyphBuilderList* output) { 210333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com assert(loca_list); 211333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com assert(output); 212333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com 213333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com output->clear(); 214333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com if (data) { 215333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com for (BitmapLocaList::iterator loca_map = loca_list->begin(), 216333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com loca_end = loca_list->end(); 217333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com loca_map != loca_end; loca_map++) { 218333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapGlyphBuilderMap glyph_builder_map; 219333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com for (BitmapGlyphInfoMap::iterator entry = loca_map->begin(), 220333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com entry_end = loca_map->end(); 221333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com entry != entry_end; entry++) { 222333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapGlyphInfoPtr info = entry->second; 223333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ReadableFontDataPtr slice; 224333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com slice.Attach(down_cast<ReadableFontData*>(data->Slice( 225144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com info->offset(), info->length()))); 226333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com BitmapGlyphBuilderPtr glyph_builder; 227333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_builder.Attach(BitmapGlyph::Builder::CreateGlyphBuilder( 228333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com slice, info->format())); 229333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com glyph_builder_map[entry->first] = glyph_builder; 230333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 231333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com output->push_back(glyph_builder_map); 232333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 233333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com } 234333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com} 2356b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com 2366b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com} // namespace sfntly 237