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