Line data Source code
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_BITMAP_BITMAP_SIZE_TABLE_H_
18 : #define SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_BITMAP_SIZE_TABLE_H_
19 :
20 : #include "sfntly/port/lock.h"
21 : #include "sfntly/table/bitmap/bitmap_glyph_info.h"
22 : #include "sfntly/table/bitmap/index_sub_table.h"
23 :
24 : namespace sfntly {
25 : // Binary search would be faster but many fonts have index subtables that
26 : // aren't sorted.
27 : // Note: preprocessor define is used to avoid const expression warnings in C++
28 : // code.
29 : #define SFNTLY_BITMAPSIZE_USE_BINARY_SEARCH 0
30 :
31 : class BitmapSizeTable : public SubTable,
32 : public RefCounted<BitmapSizeTable> {
33 : public:
34 : class Builder : public SubTable::Builder,
35 : public RefCounted<Builder> {
36 : public:
37 : class BitmapGlyphInfoIterator :
38 : public RefIterator<BitmapGlyphInfo, Builder> {
39 : public:
40 : explicit BitmapGlyphInfoIterator(Builder* container);
41 0 : virtual ~BitmapGlyphInfoIterator() {}
42 :
43 : virtual bool HasNext();
44 : CALLER_ATTACH virtual BitmapGlyphInfo* Next();
45 :
46 : private:
47 : bool HasNext(BitmapGlyphInfoIter* iterator_base);
48 : CALLER_ATTACH BitmapGlyphInfo* Next(BitmapGlyphInfoIter* iterator_base);
49 :
50 : IndexSubTableBuilderList::iterator sub_table_iter_;
51 : BitmapGlyphInfoIterPtr sub_table_glyph_info_iter_;
52 : };
53 :
54 : virtual ~Builder();
55 :
56 : virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
57 : virtual void SubDataSet();
58 : virtual int32_t SubDataSizeToSerialize();
59 : virtual bool SubReadyToSerialize();
60 : virtual int32_t SubSerialize(WritableFontData* new_data);
61 :
62 : static CALLER_ATTACH Builder* CreateBuilder(WritableFontData* data,
63 : ReadableFontData* master_data);
64 : static CALLER_ATTACH Builder* CreateBuilder(ReadableFontData* data,
65 : ReadableFontData* master_data);
66 : // Gets the subtable array offset as set in the original table as read from
67 : // the font file. This value cannot be explicitly set and will be generated
68 : // during table building.
69 : // @return the subtable array offset
70 : int32_t IndexSubTableArrayOffset();
71 :
72 : // Sets the subtable array offset. This is used only during the building
73 : // process when the objects are being serialized.
74 : // @param offset the offset to the index subtable array
75 : void SetIndexSubTableArrayOffset(int32_t offset);
76 :
77 : // Gets the subtable array size as set in the original table as read from
78 : // the font file. This value cannot be explicitly set and will be generated
79 : // during table building.
80 : // @return the subtable array size
81 : int32_t IndexTableSize();
82 :
83 : // Sets the subtable size. This is used only during the building process
84 : // when the objects are being serialized.
85 : // @param size the offset to the index subtable array
86 : void SetIndexTableSize(int32_t size);
87 :
88 : int32_t NumberOfIndexSubTables();
89 : int32_t ColorRef();
90 : // TODO(stuartg): SBitLineMetrics hori();
91 : // TODO(stuartg): SBitLineMetrics vert();
92 : int32_t StartGlyphIndex();
93 : int32_t EndGlyphIndex();
94 : int32_t PpemX();
95 : int32_t PpemY();
96 : int32_t BitDepth();
97 : int32_t FlagsAsInt();
98 :
99 : IndexSubTable::Builder* IndexSubTableBuilder(int32_t index);
100 : CALLER_ATTACH BitmapGlyphInfo* GlyphInfo(int32_t glyph_id);
101 : int32_t GlyphOffset(int32_t glyph_id);
102 : int32_t GlyphLength(int32_t glyph_id);
103 : int32_t GlyphFormat(int32_t glyph_id);
104 : IndexSubTableBuilderList* IndexSubTableBuilders();
105 : // Note: renamed from iterator(), type is the derived type.
106 : CALLER_ATTACH BitmapGlyphInfoIterator* GetIterator();
107 : void GenerateLocaMap(BitmapGlyphInfoMap* output);
108 :
109 : protected:
110 : void Revert();
111 :
112 : private:
113 : Builder(WritableFontData* data, ReadableFontData* master_data);
114 : Builder(ReadableFontData* data, ReadableFontData* master_data);
115 :
116 : void SetNumberOfIndexSubTables(int32_t count);
117 : IndexSubTable::Builder* SearchIndexSubTables(int32_t glyph_id);
118 : IndexSubTable::Builder* LinearSearchIndexSubTables(int32_t glyph_id);
119 : IndexSubTable::Builder* BinarySearchIndexSubTables(int32_t glyph_id);
120 : IndexSubTableBuilderList* GetIndexSubTableBuilders();
121 : void Initialize(ReadableFontData* data);
122 : CALLER_ATTACH IndexSubTable::Builder* CreateIndexSubTableBuilder(
123 : int32_t index);
124 :
125 : IndexSubTableBuilderList index_sub_tables_;
126 : };
127 :
128 : virtual ~BitmapSizeTable();
129 :
130 : int32_t IndexSubTableArrayOffset();
131 : int32_t IndexTableSize();
132 : int32_t NumberOfIndexSubTables();
133 : int32_t ColorRef();
134 : // TODO(stuartg): SBitLineMetrics hori();
135 : // TODO(stuartg): SBitLineMetrics vert();
136 : int32_t StartGlyphIndex();
137 : int32_t EndGlyphIndex();
138 : int32_t PpemX();
139 : int32_t PpemY();
140 : int32_t BitDepth();
141 : int32_t FlagsAsInt();
142 :
143 : // Note: renamed from indexSubTable()
144 : IndexSubTable* GetIndexSubTable(int32_t index);
145 : int32_t GlyphOffset(int32_t glyph_id);
146 : int32_t GlyphLength(int32_t glyph_id);
147 : CALLER_ATTACH BitmapGlyphInfo* GlyphInfo(int32_t glyph_id);
148 : int32_t GlyphFormat(int32_t glyph_id);
149 :
150 : protected:
151 : BitmapSizeTable(ReadableFontData* data,
152 : ReadableFontData* master_data);
153 :
154 : private:
155 : static int32_t NumberOfIndexSubTables(ReadableFontData* data,
156 : int32_t table_offset);
157 : IndexSubTable* SearchIndexSubTables(int32_t glyph_id);
158 : IndexSubTable* LinearSearchIndexSubTables(int32_t glyph_id);
159 : IndexSubTable* BinarySearchIndexSubTables(int32_t glyph_id);
160 : CALLER_ATTACH IndexSubTable* CreateIndexSubTable(int32_t index);
161 : IndexSubTableList* GetIndexSubTableList();
162 :
163 : Lock index_subtables_lock_;
164 : IndexSubTableList index_subtables_;
165 : };
166 : typedef Ptr<BitmapSizeTable> BitmapSizeTablePtr;
167 : typedef std::vector<BitmapSizeTablePtr> BitmapSizeTableList;
168 : typedef Ptr<BitmapSizeTable::Builder> BitmapSizeTableBuilderPtr;
169 : typedef std::vector<BitmapSizeTableBuilderPtr> BitmapSizeTableBuilderList;
170 :
171 : } // namespace sfntly
172 :
173 : #endif // SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_BITMAP_SIZE_TABLE_H_
|