1464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com/* 2464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Copyright 2011 Google Inc. All Rights Reserved. 3464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * 4464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Licensed under the Apache License, Version 2.0 (the "License"); 5464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * you may not use this file except in compliance with the License. 6464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * You may obtain a copy of the License at 7464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * 8464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * http://www.apache.org/licenses/LICENSE-2.0 9464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * 10464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Unless required by applicable law or agreed to in writing, software 11464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * distributed under the License is distributed on an "AS IS" BASIS, 12464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * See the License for the specific language governing permissions and 14464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * limitations under the License. 15464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com */ 16464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 1779fe62d80f2ab09a217c5948a9adbcd019f4455ddfilimon@google.com// type.h needs to be included first because of building issues on Windows 1879fe62d80f2ab09a217c5948a9adbcd019f4455ddfilimon@google.com// Type aliases we delcare are defined in other headers and make the build 1979fe62d80f2ab09a217c5948a9adbcd019f4455ddfilimon@google.com// fail otherwise. 2079fe62d80f2ab09a217c5948a9adbcd019f4455ddfilimon@google.com#include "sfntly/port/type.h" 215af34fd773f8cfee82321393504f558ddf67c628arthurhsu@google.com#include "sfntly/table/table.h" 22246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com 23464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com#include "sfntly/font.h" 24464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com#include "sfntly/tag.h" 256b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#include "sfntly/table/bitmap/ebdt_table.h" 266b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#include "sfntly/table/bitmap/eblc_table.h" 27a7acde600e171e08e75138318308de83f38b3097arthurhsu@google.com#include "sfntly/table/bitmap/ebsc_table.h" 285af34fd773f8cfee82321393504f558ddf67c628arthurhsu@google.com#include "sfntly/table/core/cmap_table.h" 295af34fd773f8cfee82321393504f558ddf67c628arthurhsu@google.com#include "sfntly/table/core/font_header_table.h" 30a7acde600e171e08e75138318308de83f38b3097arthurhsu@google.com#include "sfntly/table/core/horizontal_device_metrics_table.h" 315af34fd773f8cfee82321393504f558ddf67c628arthurhsu@google.com#include "sfntly/table/core/horizontal_header_table.h" 325af34fd773f8cfee82321393504f558ddf67c628arthurhsu@google.com#include "sfntly/table/core/horizontal_metrics_table.h" 335af34fd773f8cfee82321393504f558ddf67c628arthurhsu@google.com#include "sfntly/table/core/maximum_profile_table.h" 345af34fd773f8cfee82321393504f558ddf67c628arthurhsu@google.com#include "sfntly/table/core/name_table.h" 355af34fd773f8cfee82321393504f558ddf67c628arthurhsu@google.com#include "sfntly/table/core/os2_table.h" 36333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include "sfntly/table/generic_table_builder.h" 376b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#include "sfntly/table/table_based_table_builder.h" 385af34fd773f8cfee82321393504f558ddf67c628arthurhsu@google.com#include "sfntly/table/truetype/glyph_table.h" 395af34fd773f8cfee82321393504f558ddf67c628arthurhsu@google.com#include "sfntly/table/truetype/loca_table.h" 40464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 41464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.comnamespace sfntly { 42464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 43464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com/****************************************************************************** 44464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Table class 45464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com ******************************************************************************/ 46464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.comTable::~Table() {} 47464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 48246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comint64_t Table::CalculatedChecksum() { 49246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com return data_->Checksum(); 50464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 51464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 52246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comvoid Table::SetFont(Font* font) { 53246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com font_ = font; 54464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 55464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 56246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comTable::Table(Header* header, ReadableFontData* data) 57246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com : FontDataTable(data) { 58246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com header_ = header; 59464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 60464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 61464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com/****************************************************************************** 62464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Table::Builder class 63464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com ******************************************************************************/ 64464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.comTable::Builder::~Builder() { 65246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com header_.Release(); 66464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 67464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 68246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comvoid Table::Builder::NotifyPostTableBuild(FontDataTable* table) { 698427926b2267e501fa38649cffeb9d62a550af56dfilimon@google.com if (model_changed() || data_changed()) { 70464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com Table* derived_table = down_cast<Table*>(table); 71b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com derived_table->header_ = new Header(header()->tag(), 72b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com derived_table->DataLength()); 73464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } 74464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 75464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 76b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.comCALLER_ATTACH 77b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.comTable::Builder* Table::Builder::GetBuilder(Header* header, 78b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com WritableFontData* table_data) { 79464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com int32_t tag = header->tag(); 80464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com Table::Builder* builder_raw = NULL; 81464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 82464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com // Note: Tables are commented out when they are not used/ported. 83464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com // TODO(arthurhsu): IMPLEMENT: finish tables that are not ported. 84dc47db9a1c26e13a4e8be6185bd0ecf89c0d1f81arthurhsu@google.com if (tag == Tag::head) { 85464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 86b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com FontHeaderTable::Builder::CreateBuilder(header, table_data)); 87a7acde600e171e08e75138318308de83f38b3097arthurhsu@google.com#if defined (SFNTLY_EXPERIMENTAL) 88dc47db9a1c26e13a4e8be6185bd0ecf89c0d1f81arthurhsu@google.com } else if (tag == Tag::cmap) { 89dc47db9a1c26e13a4e8be6185bd0ecf89c0d1f81arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 90dc47db9a1c26e13a4e8be6185bd0ecf89c0d1f81arthurhsu@google.com CMapTable::Builder::CreateBuilder(header, table_data)); 91a7acde600e171e08e75138318308de83f38b3097arthurhsu@google.com#endif // SFNTLY_EXPERIMENTAL 92464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } else if (tag == Tag::hhea) { 93464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 94b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com HorizontalHeaderTable::Builder::CreateBuilder(header, table_data)); 95464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } else if (tag == Tag::hmtx) { 96464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 97b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com HorizontalMetricsTable::Builder::CreateBuilder(header, table_data)); 98464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } else if (tag == Tag::maxp) { 99464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 100b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com MaximumProfileTable::Builder::CreateBuilder(header, table_data)); 101090ea9e59646e627865c40f9758cfed067a575a1arthurhsu@google.com } else if (tag == Tag::name) { 102464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 103b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com NameTable::Builder::CreateBuilder(header, table_data)); 104090ea9e59646e627865c40f9758cfed067a575a1arthurhsu@google.com } else if (tag == Tag::OS_2) { 105464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 106b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com OS2Table::Builder::CreateBuilder(header, table_data)); 107464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com }/* else if (tag == Tag::PostScript) { 108464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 109b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com PostScriptTable::Builder::CreateBuilder(header, table_data)); 110464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } else if (tag == Tag::cvt) { 111464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 112b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com ControlValueTable::Builder::CreateBuilder(header, table_data)); 113464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com }*/ else if (tag == Tag::glyf) { 114464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 115b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com GlyphTable::Builder::CreateBuilder(header, table_data)); 116464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } else if (tag == Tag::loca) { 117464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 118b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com LocaTable::Builder::CreateBuilder(header, table_data)); 119dc47db9a1c26e13a4e8be6185bd0ecf89c0d1f81arthurhsu@google.com } else if (tag == Tag::EBDT || tag == Tag::bdat) { 1206b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 1216b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com EbdtTable::Builder::CreateBuilder(header, table_data)); 1226b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com } else if (tag == Tag::EBLC || tag == Tag::bloc) { 1236b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 1246b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com EblcTable::Builder::CreateBuilder(header, table_data)); 125a7acde600e171e08e75138318308de83f38b3097arthurhsu@google.com } else if (tag == Tag::EBSC) { 1266b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 1276b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com EbscTable::Builder::CreateBuilder(header, table_data)); 128a7acde600e171e08e75138318308de83f38b3097arthurhsu@google.com } /* else if (tag == Tag::prep) { 129dc47db9a1c26e13a4e8be6185bd0ecf89c0d1f81arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 130dc47db9a1c26e13a4e8be6185bd0ecf89c0d1f81arthurhsu@google.com ControlProgramTable::Builder::CreateBuilder(header, table_data)); 131464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com }*/ else if (tag == Tag::bhed) { 132464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 133b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com FontHeaderTable::Builder::CreateBuilder(header, table_data)); 134a7acde600e171e08e75138318308de83f38b3097arthurhsu@google.com#if defined (SFNTLY_EXPERIMENTAL) 135a7acde600e171e08e75138318308de83f38b3097arthurhsu@google.com } else if (tag == Tag::hdmx) { 136a7acde600e171e08e75138318308de83f38b3097arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 137a7acde600e171e08e75138318308de83f38b3097arthurhsu@google.com HorizontalDeviceMetricsTable::Builder::CreateBuilder(header, 138a7acde600e171e08e75138318308de83f38b3097arthurhsu@google.com table_data)); 139a7acde600e171e08e75138318308de83f38b3097arthurhsu@google.com#endif // SFNTLY_EXPERIMENTAL 140464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } else { 141464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com builder_raw = static_cast<Table::Builder*>( 1426b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com GenericTableBuilder::CreateBuilder(header, table_data)); 143464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } 144464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 145b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com return builder_raw; 146246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com} 147246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com 148b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.comTable::Builder::Builder(Header* header, WritableFontData* data) 149b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com : FontDataTable::Builder(data) { 150246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com header_ = header; 151246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com} 152246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com 153b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.comTable::Builder::Builder(Header* header, ReadableFontData* data) 154b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com : FontDataTable::Builder(data) { 155246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com header_ = header; 156246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com} 157246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com 158b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.comTable::Builder::Builder(Header* header) { 159246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com header_ = header; 160464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 161464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 162464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} // namespace sfntly 163