table.h revision 584bf6606b53bda8bf0810e7c0ad57e24cacb4f1
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#ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_TABLE_H_
18#define SFNTLY_CPP_SRC_SFNTLY_TABLE_TABLE_H_
19
20#include <set>
21#include <map>
22#include <vector>
23#include <utility>
24
25#include "sfntly/port/type.h"
26#include "sfntly/table/font_data_table.h"
27
28namespace sfntly {
29class Font;
30class Table : public FontDataTable, public FontDataTableBuilderContainer {
31 public:
32  class Header : public RefCounted<Header> {
33   public:
34    explicit Header(int32_t tag);
35    Header(int32_t tag, int32_t length);
36    Header(int32_t tag, int64_t checksum, int32_t offset, int32_t length);
37    virtual ~Header();
38
39    int32_t tag() { return tag_; }
40    int32_t offset() { return offset_; }
41    int32_t length() { return length_; }
42    bool offset_valid() { return offset_valid_; }
43    int64_t checksum() { return checksum_; }
44    bool checksum_valid() { return checksum_valid_; }
45
46   private:
47    int32_t tag_;
48    int32_t offset_;
49    int32_t length_;
50    bool offset_valid_;
51    int64_t checksum_;
52    bool checksum_valid_;
53
54    friend class TableHeaderComparator;
55  };
56
57  // Note: original version is Builder<T extends Table>
58  //       C++ template is not designed that way so plain old inheritance is
59  //       chosen.
60  class Builder : public FontDataTable::Builder,
61                  public FontDataTableBuilderContainer {
62   public:
63    virtual ~Builder();
64    virtual Header* header() { return header_; }
65    virtual void NotifyPostTableBuild(FontDataTable* table);
66    virtual WritableFontData* GetNewData(int32_t size);
67
68    static CALLER_ATTACH Builder*
69        GetBuilder(FontDataTableBuilderContainer* font_builder,
70                   Header* header,
71                   WritableFontData* table_data);
72
73   protected:
74    // Note: original version is Font.Builder font_builder. This results in
75    //       mutual inclusion happiness that Java solved for C++.  Therefore,
76    //       we need to avoid that happiness when we port it to C++.
77    Builder(FontDataTableBuilderContainer* font_builder,
78            Header* header,
79            WritableFontData* data);
80    Builder(FontDataTableBuilderContainer* font_builder,
81            Header* header,
82            ReadableFontData* data);
83    Builder(FontDataTableBuilderContainer* font_builder,
84            Header* header);
85
86   private:
87    Ptr<Header> header_;
88  };
89
90  class TableBasedTableBuilder : public Builder {
91   public:
92    virtual ~TableBasedTableBuilder();
93
94    virtual int32_t SubSerialize(WritableFontData* new_data);
95    virtual bool SubReadyToSerialize();
96    virtual int32_t SubDataSizeToSerialize();
97    virtual void SubDataSet();
98
99   protected:
100    TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
101                           Header* header,
102                           WritableFontData* data);
103    TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
104                           Header* header,
105                           ReadableFontData* data);
106    TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
107                           Header* header);
108
109    // C++ port: renamed table() to GetTable()
110    virtual Table* GetTable();
111
112    // TODO(arthurhsu): style guide violation: protected member, need refactor
113    Ptr<Table> table_;
114  };
115
116  class GenericTableBuilder : public TableBasedTableBuilder,
117                              public RefCounted<GenericTableBuilder> {
118   public:
119    GenericTableBuilder(FontDataTableBuilderContainer* font_builder,
120                        Header* header,
121                        WritableFontData* data);
122    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
123  };
124
125  class ArrayElementTableBuilder : public Builder {
126   public:
127    virtual ~ArrayElementTableBuilder();
128
129   protected:
130    ArrayElementTableBuilder(FontDataTableBuilderContainer* font_builder,
131                             Header* header,
132                             WritableFontData* data);
133    ArrayElementTableBuilder(FontDataTableBuilderContainer* font_builder,
134                             Header* header,
135                             ReadableFontData* data);
136  };
137
138  virtual ~Table();
139  virtual int64_t CalculatedChecksum();
140  virtual Header* header()          { return header_; }
141  virtual int32_t header_tag()      { return header_->tag(); }
142  virtual int32_t header_offset()   { return header_->offset(); }
143  virtual int32_t header_length()   { return header_->length(); }
144  virtual int64_t header_checksum() { return header_->checksum(); }
145  virtual WritableFontData* GetNewData(int32_t size);
146  virtual void SetFont(Font* font);
147
148 protected:
149  Table(Header* header, ReadableFontData* data);
150
151 private:
152  Ptr<Header> header_;
153  Ptr<Font> font_;
154};
155
156// C++ port only
157class GenericTable : public Table, public RefCounted<GenericTable> {
158 public:
159  GenericTable(Header* header, ReadableFontData* data) : Table(header, data) {}
160  virtual ~GenericTable() {}
161};
162
163typedef Ptr<Table> TablePtr;
164typedef Ptr<Table::Header> TableHeaderPtr;
165typedef std::vector<TableHeaderPtr> TableHeaderList;
166typedef Ptr<Table::Builder> TableBuilderPtr;
167typedef std::map<int32_t, TablePtr> TableMap;
168typedef std::pair<int32_t, TablePtr> TableMapEntry;
169
170typedef std::map<TableHeaderPtr, WritableFontDataPtr> DataBlockMap;
171typedef std::pair<TableHeaderPtr, WritableFontDataPtr> DataBlockEntry;
172typedef std::map<int32_t, TableBuilderPtr> TableBuilderMap;
173typedef std::pair<int32_t, TableBuilderPtr> TableBuilderEntry;
174
175class TableHeaderComparator {
176 public:
177  bool operator()(const TableHeaderPtr h1, const TableHeaderPtr h2);
178};
179typedef std::set<TableHeaderPtr, TableHeaderComparator> TableHeaderSortedSet;
180
181}  // namespace sfntly
182
183#endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_TABLE_H_
184