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_INDEX_SUBTABLE_FORMAT5_H_
18 #define SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_INDEX_SUBTABLE_FORMAT5_H_
19 
20 #include "sfntly/table/bitmap/big_glyph_metrics.h"
21 #include "sfntly/table/bitmap/index_sub_table.h"
22 
23 namespace sfntly {
24 
25 class IndexSubTableFormat5 : public IndexSubTable,
26                              public RefCounted<IndexSubTableFormat5> {
27  public:
28   class Builder : public IndexSubTable::Builder,
29                   public RefCounted<Builder> {
30    public:
31     class BitmapGlyphInfoIterator
32         : public RefIterator<BitmapGlyphInfo, Builder, IndexSubTable::Builder> {
33      public:
34       explicit BitmapGlyphInfoIterator(Builder* container);
~BitmapGlyphInfoIterator()35       virtual ~BitmapGlyphInfoIterator() {}
36 
37       virtual bool HasNext();
38       CALLER_ATTACH virtual BitmapGlyphInfo* Next();
39 
40      private:
41       int32_t offset_index_;
42     };
43     virtual ~Builder();
44     virtual int32_t NumGlyphs();
45     virtual int32_t GlyphLength(int32_t glyph_id);
46     virtual int32_t GlyphStartOffset(int32_t glyph_id);
47     CALLER_ATTACH virtual BitmapGlyphInfoIterator* GetIterator();
48 
49     virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
50     virtual void SubDataSet();
51     virtual int32_t SubDataSizeToSerialize();
52     virtual bool SubReadyToSerialize();
53     virtual int32_t SubSerialize(WritableFontData* new_data);
54 
55     int32_t ImageSize();
56     void SetImageSize(int32_t image_size);
57     BigGlyphMetrics::Builder* BigMetrics();
58     std::vector<int32_t>* GlyphArray();
59     void SetGlyphArray(const std::vector<int32_t>& v);
60 
61     static CALLER_ATTACH Builder* CreateBuilder();
62     static CALLER_ATTACH Builder* CreateBuilder(ReadableFontData* data,
63                                                 int32_t index_sub_table_offset,
64                                                 int32_t first_glyph_index,
65                                                 int32_t last_glyph_index);
66     static CALLER_ATTACH Builder* CreateBuilder(WritableFontData* data,
67                                                 int32_t index_sub_table_offset,
68                                                 int32_t first_glyph_index,
69                                                 int32_t last_glyph_index);
70    protected:
71     void Revert();
72 
73    private:
74     Builder();
75     Builder(WritableFontData* data,
76             int32_t first_glyph_index,
77             int32_t last_glyph_index);
78     Builder(ReadableFontData* data,
79             int32_t first_glyph_index,
80             int32_t last_glyph_index);
81 
82     std::vector<int32_t>* GetGlyphArray();
83     void Initialize(ReadableFontData* data);
84 
85     static int32_t DataLength(ReadableFontData* data,
86                               int32_t index_sub_table_offset,
87                               int32_t first_glyph_index,
88                               int32_t last_glyph_index);
89 
90     std::vector<int32_t> glyph_array_;
91     BigGlyphMetricsBuilderPtr metrics_;
92   };
93   virtual ~IndexSubTableFormat5();
94 
95   virtual int32_t NumGlyphs();
96   virtual int32_t GlyphStartOffset(int32_t glyph_id);
97   virtual int32_t GlyphLength(int32_t glyph_id);
98 
99   int32_t ImageSize();
100   CALLER_ATTACH BigGlyphMetrics* BigMetrics();
101 
102  private:
103   IndexSubTableFormat5(ReadableFontData* data,
104                        int32_t first_glyph_index,
105                        int32_t last_glyph_index);
106 
107   static int32_t NumGlyphs(ReadableFontData* dta, int32_t table_offset);
108 
109   int32_t image_size_;
110 
111   friend class Builder;
112 };
113 typedef Ptr<IndexSubTableFormat5> IndexSubTableFormat5Ptr;
114 typedef Ptr<IndexSubTableFormat5::Builder> IndexSubTableFormat5BuilderPtr;
115 
116 }  // namespace sfntly
117 
118 #endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_INDEX_SUBTABLE_FORMAT5_H_
119