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 
24 namespace sfntly {
25 
26 // A Maximum Profile table - 'maxp'.
27 class 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 };
115 typedef Ptr<MaximumProfileTable> MaximumProfileTablePtr;
116 typedef Ptr<MaximumProfileTable::Builder> MaximumProfileTableBuilderPtr;
117 
118 }  // namespace sfntly
119 
120 #endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_MAXIMUM_PROFILE_TABLE_H_
121