Home | History | Annotate | Download | only in table
      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