1 /* 2 * Copyright 2011 Google Inc. All Rights Reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 // type.h needs to be included first because of building issues on Windows 18 // Type aliases we delcare are defined in other headers and make the build 19 // fail otherwise. 20 #include "sfntly/port/type.h" 21 #include "sfntly/table/table.h" 22 23 #include "sfntly/font.h" 24 #include "sfntly/tag.h" 25 #include "sfntly/table/bitmap/ebdt_table.h" 26 #include "sfntly/table/bitmap/eblc_table.h" 27 #include "sfntly/table/bitmap/ebsc_table.h" 28 #include "sfntly/table/core/cmap_table.h" 29 #include "sfntly/table/core/font_header_table.h" 30 #include "sfntly/table/core/horizontal_device_metrics_table.h" 31 #include "sfntly/table/core/horizontal_header_table.h" 32 #include "sfntly/table/core/horizontal_metrics_table.h" 33 #include "sfntly/table/core/maximum_profile_table.h" 34 #include "sfntly/table/core/name_table.h" 35 #include "sfntly/table/core/os2_table.h" 36 #include "sfntly/table/generic_table_builder.h" 37 #include "sfntly/table/table_based_table_builder.h" 38 #include "sfntly/table/truetype/glyph_table.h" 39 #include "sfntly/table/truetype/loca_table.h" 40 41 namespace sfntly { 42 43 /****************************************************************************** 44 * Table class 45 ******************************************************************************/ 46 Table::~Table() {} 47 48 int64_t Table::CalculatedChecksum() { 49 return data_->Checksum(); 50 } 51 52 void Table::SetFont(Font* font) { 53 font_ = font; 54 } 55 56 Table::Table(Header* header, ReadableFontData* data) 57 : FontDataTable(data) { 58 header_ = header; 59 } 60 61 /****************************************************************************** 62 * Table::Builder class 63 ******************************************************************************/ 64 Table::Builder::~Builder() { 65 header_.Release(); 66 } 67 68 void Table::Builder::NotifyPostTableBuild(FontDataTable* table) { 69 if (model_changed() || data_changed()) { 70 Table* derived_table = down_cast<Table*>(table); 71 derived_table->header_ = new Header(header()->tag(), 72 derived_table->DataLength()); 73 } 74 } 75 76 CALLER_ATTACH 77 Table::Builder* Table::Builder::GetBuilder(Header* header, 78 WritableFontData* table_data) { 79 int32_t tag = header->tag(); 80 Table::Builder* builder_raw = NULL; 81 82 // Note: Tables are commented out when they are not used/ported. 83 // TODO(arthurhsu): IMPLEMENT: finish tables that are not ported. 84 if (tag == Tag::head) { 85 builder_raw = static_cast<Table::Builder*>( 86 FontHeaderTable::Builder::CreateBuilder(header, table_data)); 87 #if defined (SFNTLY_EXPERIMENTAL) 88 } else if (tag == Tag::cmap) { 89 builder_raw = static_cast<Table::Builder*>( 90 CMapTable::Builder::CreateBuilder(header, table_data)); 91 #endif // SFNTLY_EXPERIMENTAL 92 } else if (tag == Tag::hhea) { 93 builder_raw = static_cast<Table::Builder*>( 94 HorizontalHeaderTable::Builder::CreateBuilder(header, table_data)); 95 } else if (tag == Tag::hmtx) { 96 builder_raw = static_cast<Table::Builder*>( 97 HorizontalMetricsTable::Builder::CreateBuilder(header, table_data)); 98 } else if (tag == Tag::maxp) { 99 builder_raw = static_cast<Table::Builder*>( 100 MaximumProfileTable::Builder::CreateBuilder(header, table_data)); 101 } else if (tag == Tag::name) { 102 builder_raw = static_cast<Table::Builder*>( 103 NameTable::Builder::CreateBuilder(header, table_data)); 104 } else if (tag == Tag::OS_2) { 105 builder_raw = static_cast<Table::Builder*>( 106 OS2Table::Builder::CreateBuilder(header, table_data)); 107 }/* else if (tag == Tag::PostScript) { 108 builder_raw = static_cast<Table::Builder*>( 109 PostScriptTable::Builder::CreateBuilder(header, table_data)); 110 } else if (tag == Tag::cvt) { 111 builder_raw = static_cast<Table::Builder*>( 112 ControlValueTable::Builder::CreateBuilder(header, table_data)); 113 }*/ else if (tag == Tag::glyf) { 114 builder_raw = static_cast<Table::Builder*>( 115 GlyphTable::Builder::CreateBuilder(header, table_data)); 116 } else if (tag == Tag::loca) { 117 builder_raw = static_cast<Table::Builder*>( 118 LocaTable::Builder::CreateBuilder(header, table_data)); 119 } else if (tag == Tag::EBDT || tag == Tag::bdat) { 120 builder_raw = static_cast<Table::Builder*>( 121 EbdtTable::Builder::CreateBuilder(header, table_data)); 122 } else if (tag == Tag::EBLC || tag == Tag::bloc) { 123 builder_raw = static_cast<Table::Builder*>( 124 EblcTable::Builder::CreateBuilder(header, table_data)); 125 } else if (tag == Tag::EBSC) { 126 builder_raw = static_cast<Table::Builder*>( 127 EbscTable::Builder::CreateBuilder(header, table_data)); 128 } /* else if (tag == Tag::prep) { 129 builder_raw = static_cast<Table::Builder*>( 130 ControlProgramTable::Builder::CreateBuilder(header, table_data)); 131 }*/ else if (tag == Tag::bhed) { 132 builder_raw = static_cast<Table::Builder*>( 133 FontHeaderTable::Builder::CreateBuilder(header, table_data)); 134 #if defined (SFNTLY_EXPERIMENTAL) 135 } else if (tag == Tag::hdmx) { 136 builder_raw = static_cast<Table::Builder*>( 137 HorizontalDeviceMetricsTable::Builder::CreateBuilder(header, 138 table_data)); 139 #endif // SFNTLY_EXPERIMENTAL 140 } else { 141 builder_raw = static_cast<Table::Builder*>( 142 GenericTableBuilder::CreateBuilder(header, table_data)); 143 } 144 145 return builder_raw; 146 } 147 148 Table::Builder::Builder(Header* header, WritableFontData* data) 149 : FontDataTable::Builder(data) { 150 header_ = header; 151 } 152 153 Table::Builder::Builder(Header* header, ReadableFontData* data) 154 : FontDataTable::Builder(data) { 155 header_ = header; 156 } 157 158 Table::Builder::Builder(Header* header) { 159 header_ = header; 160 } 161 162 } // namespace sfntly 163