• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_TRUETYPE_LOCA_TABLE_H_
18 #define SFNTLY_CPP_SRC_SFNTLY_TABLE_TRUETYPE_LOCA_TABLE_H_
19 
20 #include "sfntly/port/java_iterator.h"
21 #include "sfntly/table/table.h"
22 #include "sfntly/table/core/font_header_table.h"
23 
24 namespace sfntly {
25 
26 // A Loca table - 'loca'.
27 class LocaTable : public Table, public RefCounted<LocaTable> {
28  public:
29   class LocaIterator : public PODIterator<int32_t, LocaTable> {
30    public:
31     explicit LocaIterator(LocaTable* table);
~LocaIterator()32     virtual ~LocaIterator() {}
33 
34     virtual bool HasNext();
35     virtual int32_t Next();
36 
37    private:
38     int32_t index_;
39   };
40 
41   class Builder : public Table::Builder, public RefCounted<Builder> {
42    public:
43     // Constructor scope altered to public for base class to instantiate.
44     Builder(Header* header, WritableFontData* data);
45     Builder(Header* header, ReadableFontData* data);
46     virtual ~Builder();
47 
48     static CALLER_ATTACH Builder* CreateBuilder(Header* header,
49                                                 WritableFontData* data);
50 
51     // Get the format version that will be used when the loca table is
52     // generated.
53     // @return the loca table format version
format_version()54     int32_t format_version() { return format_version_; }
set_format_version(int32_t value)55     void set_format_version(int32_t value) { format_version_ = value; }
56 
57     // Gets the List of locas for loca table builder. These may be manipulated
58     // in any way by the caller and the changes will be reflected in the final
59     // loca table produced as long as no subsequent call is made to the
60     // SetLocaList(List) method.
61     // If there is no current data for the loca table builder or the loca list
62     // have not been previously set then this will return an empty List.
63     IntegerList* LocaList();
64 
65     // Set the list of locas to be used for building this table. If any existing
66     // list was already retrieved with the LocaList() method then the
67     // connection of that previous list to this builder will be broken.
68     void SetLocaList(IntegerList* list);
69 
70     // Return the offset for the given glyph id. Valid glyph ids are from 0 to
71     // one less than the number of glyphs. The zero entry is the special entry
72     // for the notdef glyph. The final entry beyond the last glyph id is used to
73     // calculate the size of the last glyph.
74     // @param glyphId the glyph id to get the offset for; must be less than or
75     //        equal to one more than the number of glyph ids
76     // @return the offset in the glyph table to the specified glyph id
77     int32_t GlyphOffset(int32_t glyph_id);
78 
79     // Get the length of the data in the glyph table for the specified glyph id.
80     int32_t GlyphLength(int32_t glyph_id);
81 
82     // Set the number of glyphs.
83     // This method sets the number of glyphs that the builder will attempt to
84     // parse location data for from the raw binary data. This method only needs
85     // to be called (and <b>must</b> be) when the raw data for this builder has
86     // been changed. It does not by itself reset the data or clear any set loca
87     // list.
88     void SetNumGlyphs(int32_t num_glyphs);
89 
90     // Get the number of glyphs that this builder has support for.
91     int NumGlyphs();
92 
93     // Revert the loca table builder to the state contained in the last raw data
94     // set on the builder. That raw data may be that read from a font file when
95     // the font builder was created, that set by a user of the loca table
96     // builder, or null data if this builder was created as a new empty builder.
97     void Revert();
98 
99     // Get the number of locations or locas. This will be one more than the
100     // number of glyphs for this table since the last loca position is used to
101     // indicate the size of the final glyph.
102     int32_t NumLocas();
103 
104     // Get the value from the loca table for the index specified. These are the
105     // raw values from the table that are used to compute the offset and size of
106     // a glyph in the glyph table. Valid index values run from 0 to the number
107     // of glyphs in the font.
108     int32_t Loca(int32_t index);
109 
110     virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
111     virtual void SubDataSet();
112     virtual int32_t SubDataSizeToSerialize();
113     virtual bool SubReadyToSerialize();
114     virtual int32_t SubSerialize(WritableFontData* new_data);
115 
116    private:
117     // Initialize the internal state from the data. Done lazily since in many
118     // cases the builder will be just creating a table object with no parsing
119     // required.
120     // @param data the data to initialize from
121     void Initialize(ReadableFontData* data);
122 
123     // Checks that the glyph id is within the correct range.
124     // @return glyph_id if correct, -1 otherwise.
125     int32_t CheckGlyphRange(int32_t glyph_id);
126 
127     int32_t LastGlyphIndex();
128 
129     // Internal method to get the loca list if already generated and if not to
130     // initialize the state of the builder.
131     // @return the loca list
132     IntegerList* GetLocaList();
133 
134     void ClearLoca(bool nullify);
135 
136     int32_t format_version_;  // Note: IndexToLocFormat
137     int32_t num_glyphs_;
138     IntegerList loca_;
139   };
140 
141   virtual ~LocaTable();
142 
format_version()143   int32_t format_version() { return format_version_; }
num_glyphs()144   int32_t num_glyphs() { return num_glyphs_; }
145 
146   // Return the offset for the given glyph id. Valid glyph ids are from 0 to the
147   // one less than the number of glyphs. The zero entry is the special entry for
148   // the notdef glyph. The final entry beyond the last glyph id is used to
149   // calculate the size of the last glyph.
150   // @param glyphId the glyph id to get the offset for; must be less than or
151   //        equal to one more than the number of glyph ids
152   // @return the offset in the glyph table to the specified glyph id
153   int32_t GlyphOffset(int32_t glyph_id);
154 
155   // Get the length of the data in the glyph table for the specified glyph id.
156   int32_t GlyphLength(int32_t glyph_id);
157 
158   // Get the number of locations or locas. This will be one more than the number
159   // of glyphs for this table since the last loca position is used to indicate
160   // the size of the final glyph.
161   int32_t NumLocas();
162 
163   // Get the value from the loca table for the index specified. Valid index
164   // values run from 0 to the number of glyphs in the font.
165   int32_t Loca(int32_t index);
166 
167  private:
168   LocaTable(Header* header,
169             ReadableFontData* data,
170             int32_t format_version,
171             int32_t num_glyphs);
172 
173   int32_t format_version_;  // Note: Java's version, renamed to format_version_
174   int32_t num_glyphs_;
175 
176   friend class LocaIterator;
177 };
178 typedef Ptr<LocaTable> LocaTablePtr;
179 typedef Ptr<LocaTable::Builder> LocaTableBuilderPtr;
180 
181 }  // namespace sfntly
182 
183 #endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_TRUETYPE_LOCA_TABLE_H_
184