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_CORE_MAXIMUM_PROFILE_TABLE_H_
18#define SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_MAXIMUM_PROFILE_TABLE_H_
19
20#include "sfntly/port/refcount.h"
21#include "sfntly/table/table.h"
22#include "sfntly/table/table_based_table_builder.h"
23
24namespace sfntly {
25
26// A Maximum Profile table - 'maxp'.
27class MaximumProfileTable : public Table,
28                            public RefCounted<MaximumProfileTable> {
29 public:
30  // Builder for a Maximum Profile table - 'maxp'.
31  class Builder : public TableBasedTableBuilder, public RefCounted<Builder> {
32   public:
33    // Constructor scope altered to public because C++ does not allow base
34    // class to instantiate derived class with protected constructors.
35    Builder(Header* header, WritableFontData* data);
36    Builder(Header* header, ReadableFontData* data);
37    virtual ~Builder();
38
39    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
40    static CALLER_ATTACH Builder* CreateBuilder(Header* header,
41                                                WritableFontData* data);
42
43    int32_t TableVersion();
44    void SetTableVersion(int32_t version);
45    int32_t NumGlyphs();
46    void SetNumGlyphs(int32_t num_glyphs);
47    int32_t MaxPoints();
48    void SetMaxPoints(int32_t max_points);
49    int32_t MaxContours();
50    void SetMaxContours(int32_t max_contours);
51    int32_t MaxCompositePoints();
52    void SetMaxCompositePoints(int32_t max_composite_points);
53    int32_t MaxCompositeContours();
54    void SetMaxCompositeContours(int32_t max_composite_contours);
55    int32_t MaxZones();
56    void SetMaxZones(int32_t max_zones);
57    int32_t MaxTwilightPoints();
58    void SetMaxTwilightPoints(int32_t max_twilight_points);
59    int32_t MaxStorage();
60    void SetMaxStorage(int32_t max_storage);
61    int32_t MaxFunctionDefs();
62    void SetMaxFunctionDefs(int32_t max_function_defs);
63    int32_t MaxStackElements();
64    void SetMaxStackElements(int32_t max_stack_elements);
65    int32_t MaxSizeOfInstructions();
66    void SetMaxSizeOfInstructions(int32_t max_size_of_instructions);
67    int32_t MaxComponentElements();
68    void SetMaxComponentElements(int32_t max_component_elements);
69    int32_t MaxComponentDepth();
70    void SetMaxComponentDepth(int32_t max_component_depth);
71  };
72
73  virtual ~MaximumProfileTable();
74  int32_t TableVersion();
75  int32_t NumGlyphs();
76  int32_t MaxPoints();
77  int32_t MaxContours();
78  int32_t MaxCompositePoints();
79  int32_t MaxCompositeContours();
80  int32_t MaxZones();
81  int32_t MaxTwilightPoints();
82  int32_t MaxStorage();
83  int32_t MaxFunctionDefs();
84  int32_t MaxStackElements();
85  int32_t MaxSizeOfInstructions();
86  int32_t MaxComponentElements();
87  int32_t MaxComponentDepth();
88
89 private:
90  struct Offset {
91    enum {
92      // version 0.5 and 1.0
93      kVersion = 0,
94      kNumGlyphs = 4,
95
96      // version 1.0
97      kMaxPoints = 6,
98      kMaxContours = 8,
99      kMaxCompositePoints = 10,
100      kMaxCompositeContours = 12,
101      kMaxZones = 14,
102      kMaxTwilightPoints = 16,
103      kMaxStorage = 18,
104      kMaxFunctionDefs = 20,
105      kMaxInstructionDefs = 22,
106      kMaxStackElements = 24,
107      kMaxSizeOfInstructions = 26,
108      kMaxComponentElements = 28,
109      kMaxComponentDepth = 30,
110    };
111  };
112
113  MaximumProfileTable(Header* header, ReadableFontData* data);
114};
115typedef Ptr<MaximumProfileTable> MaximumProfileTablePtr;
116typedef Ptr<MaximumProfileTable::Builder> MaximumProfileTableBuilderPtr;
117
118}  // namespace sfntly
119
120#endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_MAXIMUM_PROFILE_TABLE_H_
121