130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/* 230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved. 330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License"); 530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License. 630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at 730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * http://www.apache.org/licenses/LICENSE-2.0 930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software 1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS, 1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and 1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License. 1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_TABLE_H_ 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_SFNTLY_TABLE_TABLE_H_ 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <set> 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <map> 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <vector> 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <utility> 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/type.h" 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/font_data_table.h" 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/header.h" 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly { 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass Font; 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// A concrete implementation of a root level table in the font. This is the base 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// class used for all specific table implementations and is used as the generic 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// table for all tables which have no specific implementations. 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass Table : public FontDataTable { 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Note: original version is Builder<T extends Table> 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // C++ template is not designed that way so plain old inheritance is 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // chosen. 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun class Builder : public FontDataTable::Builder { 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~Builder(); 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual Header* header() { return header_; } 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void NotifyPostTableBuild(FontDataTable* table); 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get a builder for the table type specified by the data in the header. 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param header the header for the table 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param tableData the data to be used to build the table from 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @return builder for the table specified 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static CALLER_ATTACH Builder* GetBuilder(Header* header, 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun WritableFontData* table_data); 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // UNIMPLEMENTED: toString() 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun protected: 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Builder(Header* header, WritableFontData* data); 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Builder(Header* header, ReadableFontData* data); 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Builder(Header* header); 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Ptr<Header> header_; 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Note: GenericTableBuilder moved to table_based_table_builder.h to avoid 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // circular inclusion. 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~Table(); 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the calculated checksum for the data in the table. 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int64_t CalculatedChecksum(); 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the header for the table. 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual Header* header() { return header_; } 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the tag for the table from the record header. 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t header_tag() { return header_->tag(); } 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the offset for the table from the record header. 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t header_offset() { return header_->offset(); } 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the length of the table from the record header. 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t header_length() { return header_->length(); } 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the checksum for the table from the record header. 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int64_t header_checksum() { return header_->checksum(); } 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // UNIMPLEMENTED: toString() 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetFont(Font* font); 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun protected: 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Table(Header* header, ReadableFontData* data); 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Ptr<Header> header_; 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Ptr<Font> font_; 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// C++ port only 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass GenericTable : public Table, public RefCounted<GenericTable> { 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun GenericTable(Header* header, ReadableFontData* data) : Table(header, data) {} 10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~GenericTable() {} 10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<Table> TablePtr; 10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::vector<HeaderPtr> TableHeaderList; 10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<Table::Builder> TableBuilderPtr; 10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::map<int32_t, TablePtr> TableMap; 11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::pair<int32_t, TablePtr> TableMapEntry; 11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::map<HeaderPtr, WritableFontDataPtr> DataBlockMap; 11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::pair<HeaderPtr, WritableFontDataPtr> DataBlockEntry; 11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::map<int32_t, TableBuilderPtr> TableBuilderMap; 11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::pair<int32_t, TableBuilderPtr> TableBuilderEntry; 11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} // namespace sfntly 11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif // SFNTLY_CPP_SRC_SFNTLY_TABLE_TABLE_H_ 120