summaryrefslogtreecommitdiff
path: root/sfntly/table/table.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sfntly/table/table.cc')
-rw-r--r--sfntly/table/table.cc279
1 files changed, 279 insertions, 0 deletions
diff --git a/sfntly/table/table.cc b/sfntly/table/table.cc
new file mode 100644
index 0000000..568f889
--- /dev/null
+++ b/sfntly/table/table.cc
@@ -0,0 +1,279 @@
+/*
+ * Copyright 2011 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "sfntly/table/table.h"
+
+#include "sfntly/font.h"
+#include "sfntly/tag.h"
+#include "sfntly/table/core/cmap_table.h"
+#include "sfntly/table/core/font_header_table.h"
+#include "sfntly/table/core/horizontal_header_table.h"
+#include "sfntly/table/core/horizontal_metrics_table.h"
+#include "sfntly/table/core/maximum_profile_table.h"
+#include "sfntly/table/core/name_table.h"
+#include "sfntly/table/core/os2_table.h"
+#include "sfntly/table/truetype/glyph_table.h"
+#include "sfntly/table/truetype/loca_table.h"
+
+namespace sfntly {
+
+/******************************************************************************
+ * Table class
+ ******************************************************************************/
+Table::~Table() {}
+
+int64_t Table::CalculatedChecksum() {
+ return data_->Checksum();
+}
+
+WritableFontData* Table::GetNewData(int32_t size) {
+ return font_->GetNewData(size);
+}
+
+void Table::SetFont(Font* font) {
+ font_ = font;
+}
+
+Table::Table(Header* header, ReadableFontData* data)
+ : FontDataTable(data) {
+ header_ = header;
+}
+
+/******************************************************************************
+ * Table::Header class
+ ******************************************************************************/
+Table::Header::Header(int32_t tag)
+ : tag_(tag),
+ offset_(0),
+ length_(0),
+ offset_valid_(false),
+ checksum_(0),
+ checksum_valid_(false) {
+}
+
+Table::Header::Header(int32_t tag, int32_t length)
+ : tag_(tag),
+ offset_(0),
+ length_(length),
+ offset_valid_(false),
+ checksum_(0),
+ checksum_valid_(false) {
+}
+
+Table::Header::Header(int32_t tag,
+ int64_t checksum,
+ int32_t offset,
+ int32_t length)
+ : tag_(tag),
+ offset_(offset),
+ length_(length),
+ offset_valid_(true),
+ checksum_(checksum),
+ checksum_valid_(true) {
+}
+
+Table::Header::~Header() {}
+
+bool TableHeaderComparator::operator() (const TableHeaderPtr lhs,
+ const TableHeaderPtr rhs) {
+ return lhs->offset_ > rhs->offset_;
+}
+
+/******************************************************************************
+ * Table::Builder class
+ ******************************************************************************/
+Table::Builder::~Builder() {
+ header_.Release();
+}
+
+void Table::Builder::NotifyPostTableBuild(FontDataTable* table) {
+ if (model_changed() || data_changed()) {
+ Table* derived_table = down_cast<Table*>(table);
+ header_ = new Header(header()->tag(),
+ derived_table->ReadFontData()->Length());
+ }
+}
+
+WritableFontData* Table::Builder::GetNewData(int32_t size) {
+ UNREFERENCED_PARAMETER(size);
+ return InternalWriteData();
+}
+
+CALLER_ATTACH Table::Builder*
+ Table::Builder::GetBuilder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* table_data) {
+ int32_t tag = header->tag();
+ TableBuilderPtr builder;
+ Table::Builder* builder_raw = NULL;
+
+ // Note: Tables are commented out when they are not used/ported.
+ // TODO(arthurhsu): IMPLEMENT: finish tables that are not ported.
+ /*if (tag == Tag::cmap) {
+ builder_raw = static_cast<Table::Builder*>(
+ new CMapTable::Builder(font_builder, header, table_data));
+ } else*/ if (tag == Tag::head) {
+ builder_raw = static_cast<Table::Builder*>(
+ new FontHeaderTable::Builder(font_builder, header, table_data));
+ } else if (tag == Tag::hhea) {
+ builder_raw = static_cast<Table::Builder*>(
+ new HorizontalHeaderTable::Builder(font_builder, header, table_data));
+ } else if (tag == Tag::hmtx) {
+ builder_raw = static_cast<Table::Builder*>(
+ new HorizontalMetricsTable::Builder(font_builder, header, table_data));
+ } else if (tag == Tag::maxp) {
+ builder_raw = static_cast<Table::Builder*>(
+ new MaximumProfileTable::Builder(font_builder, header, table_data));
+ } else if (tag == Tag::name) {
+ builder_raw = static_cast<Table::Builder*>(
+ new NameTable::Builder(font_builder, header, table_data));
+ } else if (tag == Tag::OS_2) {
+ builder_raw = static_cast<Table::Builder*>(
+ new OS2Table::Builder(font_builder, header, table_data));
+ }/* else if (tag == Tag::PostScript) {
+ builder_raw = static_cast<Table::Builder*>(
+ new PostScriptTable::Builder(font_builder, header, table_data));
+ } else if (tag == Tag::cvt) {
+ builder_raw = static_cast<Table::Builder*>(
+ new ControlValueTable::Builder(font_builder, header, table_data));
+ }*/ else if (tag == Tag::glyf) {
+ builder_raw = static_cast<Table::Builder*>(
+ new GlyphTable::Builder(font_builder, header, table_data));
+ } else if (tag == Tag::loca) {
+ builder_raw = static_cast<Table::Builder*>(
+ new LocaTable::Builder(font_builder, header, table_data));
+ }/* else if (tag == Tag::prep) {
+ builder_raw = static_cast<Table::Builder*>(
+ new ControlProgramTable::Builder(font_builder, header, table_data));
+ }*/ else if (tag == Tag::bhed) {
+ builder_raw = static_cast<Table::Builder*>(
+ new FontHeaderTable::Builder(font_builder, header, table_data));
+ } else {
+ builder_raw = static_cast<Table::Builder*>(
+ new Table::GenericTableBuilder(font_builder, header, table_data));
+ }
+
+ builder = builder_raw;
+ return builder.Detach();
+}
+
+Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data)
+ : FontDataTable::Builder(font_builder, data) {
+ header_ = header;
+}
+
+Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data)
+ : FontDataTable::Builder(font_builder, data) {
+ header_ = header;
+}
+
+Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header)
+ : FontDataTable::Builder(font_builder) {
+ header_ = header;
+}
+
+/******************************************************************************
+ * Table::TableBasedTableBuilder class
+ ******************************************************************************/
+Table::TableBasedTableBuilder::~TableBasedTableBuilder() {}
+
+int32_t Table::TableBasedTableBuilder::SubSerialize(WritableFontData* data) {
+ UNREFERENCED_PARAMETER(data);
+ return 0;
+}
+
+bool Table::TableBasedTableBuilder::SubReadyToSerialize() {
+ return false;
+}
+
+int32_t Table::TableBasedTableBuilder::SubDataSizeToSerialize() {
+ return 0;
+}
+
+void Table::TableBasedTableBuilder::SubDataSet() {
+ table_ = NULL;
+}
+
+Table::TableBasedTableBuilder::TableBasedTableBuilder(
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data)
+ : Builder(font_builder, header, data) {
+}
+
+Table::TableBasedTableBuilder::TableBasedTableBuilder(
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data)
+ : Builder(font_builder, header, data) {
+}
+
+Table::TableBasedTableBuilder::TableBasedTableBuilder(
+ FontDataTableBuilderContainer* font_builder,
+ Header* header)
+ : Builder(font_builder, header) {
+}
+
+Table* Table::TableBasedTableBuilder::GetTable() {
+ if (table_ == NULL) {
+ table_.Attach(down_cast<Table*>(SubBuildTable(InternalReadData())));
+ }
+ return table_;
+}
+
+/******************************************************************************
+ * Table::GenericTableBuilder class
+ ******************************************************************************/
+Table::GenericTableBuilder::GenericTableBuilder(
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data)
+ : TableBasedTableBuilder(font_builder, header, data) {
+}
+
+CALLER_ATTACH FontDataTable*
+ Table::GenericTableBuilder::SubBuildTable(ReadableFontData* data) {
+ // Note: In C++ port, we use GenericTable, the ref-counted version of Table
+ UNREFERENCED_PARAMETER(data);
+ FontDataTablePtr table = new GenericTable(this->header(), InternalReadData());
+ return table.Detach();
+}
+
+/******************************************************************************
+ * Table::ArrayElementTableBuilder class
+ ******************************************************************************/
+Table::ArrayElementTableBuilder::~ArrayElementTableBuilder() {}
+
+Table::ArrayElementTableBuilder::ArrayElementTableBuilder(
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data)
+ : Builder(font_builder, header, data) {
+}
+
+Table::ArrayElementTableBuilder::ArrayElementTableBuilder(
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data)
+ : Builder(font_builder, header, data) {
+}
+
+} // namespace sfntly