130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved.
330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0  = the "License");
530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License.
630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at
730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *      http://www.apache.org/licenses/LICENSE-2.0
930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software
1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS,
1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and
1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License.
1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */
1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_BITMAP_SIZE_TABLE_H_
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_BITMAP_SIZE_TABLE_H_
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/lock.h"
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/bitmap/bitmap_glyph_info.h"
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/bitmap/index_sub_table.h"
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Binary search would be faster but many fonts have index subtables that
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// aren't sorted.
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Note: preprocessor define is used to avoid const expression warnings in C++
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//       code.
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_BITMAPSIZE_USE_BINARY_SEARCH 0
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass BitmapSizeTable : public SubTable,
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                        public RefCounted<BitmapSizeTable> {
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public:
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  class Builder : public SubTable::Builder,
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                  public RefCounted<Builder> {
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun   public:
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    class BitmapGlyphInfoIterator :
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        public RefIterator<BitmapGlyphInfo, Builder> {
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun     public:
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      explicit BitmapGlyphInfoIterator(Builder* container);
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      virtual ~BitmapGlyphInfoIterator() {}
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      virtual bool HasNext();
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      CALLER_ATTACH virtual BitmapGlyphInfo* Next();
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun     private:
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      bool HasNext(BitmapGlyphInfoIter* iterator_base);
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      CALLER_ATTACH BitmapGlyphInfo* Next(BitmapGlyphInfoIter* iterator_base);
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      IndexSubTableBuilderList::iterator sub_table_iter_;
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      BitmapGlyphInfoIterPtr sub_table_glyph_info_iter_;
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    };
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual ~Builder();
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual void SubDataSet();
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual int32_t SubDataSizeToSerialize();
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual bool SubReadyToSerialize();
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual int32_t SubSerialize(WritableFontData* new_data);
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    static CALLER_ATTACH Builder* CreateBuilder(WritableFontData* data,
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                                ReadableFontData* master_data);
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    static CALLER_ATTACH Builder* CreateBuilder(ReadableFontData* data,
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                                ReadableFontData* master_data);
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // Gets the subtable array offset as set in the original table as read from
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // the font file. This value cannot be explicitly set and will be generated
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // during table building.
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // @return the subtable array offset
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t IndexSubTableArrayOffset();
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // Sets the subtable array offset. This is used only during the building
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // process when the objects are being serialized.
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // @param offset the offset to the index subtable array
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetIndexSubTableArrayOffset(int32_t offset);
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // Gets the subtable array size as set in the original table as read from
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // the font file. This value cannot be explicitly set and will be generated
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // during table building.
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // @return the subtable array size
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t IndexTableSize();
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // Sets the subtable size. This is used only during the building process
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // when the objects are being serialized.
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // @param size the offset to the index subtable array
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetIndexTableSize(int32_t size);
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t NumberOfIndexSubTables();
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t ColorRef();
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // TODO(stuartg): SBitLineMetrics hori();
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // TODO(stuartg): SBitLineMetrics vert();
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t StartGlyphIndex();
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t EndGlyphIndex();
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t PpemX();
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t PpemY();
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t BitDepth();
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t FlagsAsInt();
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    IndexSubTable::Builder* IndexSubTableBuilder(int32_t index);
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    CALLER_ATTACH BitmapGlyphInfo* GlyphInfo(int32_t glyph_id);
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t GlyphOffset(int32_t glyph_id);
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t GlyphLength(int32_t glyph_id);
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t GlyphFormat(int32_t glyph_id);
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    IndexSubTableBuilderList* IndexSubTableBuilders();
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // Note: renamed from iterator(), type is the derived type.
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    CALLER_ATTACH BitmapGlyphInfoIterator* GetIterator();
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void GenerateLocaMap(BitmapGlyphInfoMap* output);
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun   protected:
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void Revert();
11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun   private:
11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    Builder(WritableFontData* data, ReadableFontData* master_data);
11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    Builder(ReadableFontData* data, ReadableFontData* master_data);
11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetNumberOfIndexSubTables(int32_t count);
11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    IndexSubTable::Builder* SearchIndexSubTables(int32_t glyph_id);
11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    IndexSubTable::Builder* LinearSearchIndexSubTables(int32_t glyph_id);
11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    IndexSubTable::Builder* BinarySearchIndexSubTables(int32_t glyph_id);
12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    IndexSubTableBuilderList* GetIndexSubTableBuilders();
12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void Initialize(ReadableFontData* data);
12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    CALLER_ATTACH IndexSubTable::Builder* CreateIndexSubTableBuilder(
12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        int32_t index);
12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    IndexSubTableBuilderList index_sub_tables_;
12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  };
12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual ~BitmapSizeTable();
12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t IndexSubTableArrayOffset();
13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t IndexTableSize();
13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t NumberOfIndexSubTables();
13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t ColorRef();
13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // TODO(stuartg): SBitLineMetrics hori();
13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // TODO(stuartg): SBitLineMetrics vert();
13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t StartGlyphIndex();
13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t EndGlyphIndex();
13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t PpemX();
13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t PpemY();
14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t BitDepth();
14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t FlagsAsInt();
14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Note: renamed from indexSubTable()
14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  IndexSubTable* GetIndexSubTable(int32_t index);
14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t GlyphOffset(int32_t glyph_id);
14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t GlyphLength(int32_t glyph_id);
14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  CALLER_ATTACH BitmapGlyphInfo* GlyphInfo(int32_t glyph_id);
14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t GlyphFormat(int32_t glyph_id);
14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun protected:
15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  BitmapSizeTable(ReadableFontData* data,
15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                  ReadableFontData* master_data);
15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private:
15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static int32_t NumberOfIndexSubTables(ReadableFontData* data,
15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                        int32_t table_offset);
15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  IndexSubTable* SearchIndexSubTables(int32_t glyph_id);
15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  IndexSubTable* LinearSearchIndexSubTables(int32_t glyph_id);
15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  IndexSubTable* BinarySearchIndexSubTables(int32_t glyph_id);
16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  CALLER_ATTACH IndexSubTable* CreateIndexSubTable(int32_t index);
16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  IndexSubTableList* GetIndexSubTableList();
16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  Lock index_subtables_lock_;
16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  IndexSubTableList index_subtables_;
16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<BitmapSizeTable> BitmapSizeTablePtr;
16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::vector<BitmapSizeTablePtr> BitmapSizeTableList;
16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<BitmapSizeTable::Builder> BitmapSizeTableBuilderPtr;
16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::vector<BitmapSizeTableBuilderPtr> BitmapSizeTableBuilderList;
17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_BITMAP_SIZE_TABLE_H_
174