16b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com/*
26b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * Copyright 2011 Google Inc. All Rights Reserved.
36b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com *
46b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * Licensed under the Apache License, Version 2.0  = the "License");
56b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * you may not use this file except in compliance with the License.
66b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * You may obtain a copy of the License at
76b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com *
86b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com *      http://www.apache.org/licenses/LICENSE-2.0
96b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com *
106b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * Unless required by applicable law or agreed to in writing, software
116b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * distributed under the License is distributed on an "AS IS" BASIS,
126b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * See the License for the specific language governing permissions and
146b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * limitations under the License.
156b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com */
166b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
176b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#include "sfntly/table/bitmap/bitmap_size_table.h"
186b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
1953847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com#include <stdio.h>
20333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include <stdlib.h>
21333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
2253847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com#include "sfntly/math/font_math.h"
236b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#include "sfntly/table/bitmap/eblc_table.h"
24333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include "sfntly/table/bitmap/index_sub_table_format1.h"
25333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include "sfntly/table/bitmap/index_sub_table_format2.h"
26333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include "sfntly/table/bitmap/index_sub_table_format3.h"
27333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include "sfntly/table/bitmap/index_sub_table_format4.h"
28333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include "sfntly/table/bitmap/index_sub_table_format5.h"
296b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
306b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comnamespace sfntly {
31333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com/******************************************************************************
32333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * BitmapSizeTable class
33333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ******************************************************************************/
346b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comBitmapSizeTable::~BitmapSizeTable() {
356b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
366b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
376b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::IndexSubTableArrayOffset() {
386b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return data_->ReadULongAsInt(
396b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_indexSubTableArrayOffset);
406b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
416b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
426b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::IndexTableSize() {
436b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return data_->ReadULongAsInt(
446b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_indexTableSize);
456b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
466b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
476b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::NumberOfIndexSubTables() {
48333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return NumberOfIndexSubTables(data_, 0);
496b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
506b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
516b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::ColorRef() {
526b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return data_->ReadULongAsInt(EblcTable::Offset::kBitmapSizeTable_colorRef);
536b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
546b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
556b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::StartGlyphIndex() {
566b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return data_->ReadUShort(EblcTable::Offset::kBitmapSizeTable_startGlyphIndex);
576b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
586b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
596b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::EndGlyphIndex() {
606b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return data_->ReadUShort(EblcTable::Offset::kBitmapSizeTable_endGlyphIndex);
616b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
626b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
636b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::PpemX() {
646b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return data_->ReadByte(EblcTable::Offset::kBitmapSizeTable_ppemX);
656b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
666b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
676b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::PpemY() {
686b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return data_->ReadByte(EblcTable::Offset::kBitmapSizeTable_ppemY);
696b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
706b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
716b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::BitDepth() {
726b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return data_->ReadByte(EblcTable::Offset::kBitmapSizeTable_bitDepth);
736b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
746b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
756b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::FlagsAsInt() {
766b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return data_->ReadChar(EblcTable::Offset::kBitmapSizeTable_flags);
776b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
786b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
796b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comIndexSubTable* BitmapSizeTable::GetIndexSubTable(int32_t index) {
806b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  IndexSubTableList* subtable_list = GetIndexSubTableList();
816b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  if (index >= 0 && (size_t)index < subtable_list->size()) {
826b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    return (*subtable_list)[index];
836b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  }
846b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return NULL;
856b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
866b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
876b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::GlyphOffset(int32_t glyph_id) {
886b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  IndexSubTable* subtable = SearchIndexSubTables(glyph_id);
896b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  if (subtable == NULL) {
906b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    return -1;
916b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  }
926b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return subtable->GlyphOffset(glyph_id);
936b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
946b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
956b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::GlyphLength(int32_t glyph_id) {
966b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  IndexSubTable* subtable = SearchIndexSubTables(glyph_id);
976b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  if (subtable == NULL) {
986b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    return -1;
996b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  }
1006b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return subtable->GlyphLength(glyph_id);
1016b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
1026b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
103333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH BitmapGlyphInfo* BitmapSizeTable::GlyphInfo(int32_t glyph_id) {
104333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  IndexSubTable* sub_table = SearchIndexSubTables(glyph_id);
105333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  if (sub_table == NULL) {
106333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    return NULL;
107333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
108333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return sub_table->GlyphInfo(glyph_id);
109333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
110333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
1116b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t BitmapSizeTable::GlyphFormat(int32_t glyph_id) {
1126b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  IndexSubTable* subtable = SearchIndexSubTables(glyph_id);
1136b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  if (subtable == NULL) {
1146b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    return -1;
1156b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  }
1166b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return subtable->image_format();
1176b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
1186b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
119333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::BitmapSizeTable(ReadableFontData* data,
120333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                                 ReadableFontData* master_data)
121333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    : SubTable(data, master_data) {
122333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
123333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
124333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com// static
125333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::NumberOfIndexSubTables(ReadableFontData* data,
126333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                                                int32_t table_offset) {
127333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return data->ReadULongAsInt(table_offset +
128333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_numberOfIndexSubTables);
129333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
130333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
1316b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comIndexSubTable* BitmapSizeTable::SearchIndexSubTables(int32_t glyph_id) {
132333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  // would be faster to binary search but too many size tables don't have
133333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  // sorted subtables
134333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#if (SFNTLY_BITMAPSIZE_USE_BINARY_SEARCH)
135333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return BinarySearchIndexSubTables(glyph_id);
136333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#else
137333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return LinearSearchIndexSubTables(glyph_id);
138333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#endif
139333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
140333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
141333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTable* BitmapSizeTable::LinearSearchIndexSubTables(int32_t glyph_id) {
142333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  IndexSubTableList* subtable_list = GetIndexSubTableList();
143333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  for (IndexSubTableList::iterator b = subtable_list->begin(),
144333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                                   e = subtable_list->end(); b != e; b++) {
145333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    if ((*b)->first_glyph_index() <= glyph_id &&
146333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        (*b)->last_glyph_index() >= glyph_id) {
147333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      return *b;
148333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    }
149333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
150333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return NULL;
151333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
152333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
153333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTable* BitmapSizeTable::BinarySearchIndexSubTables(int32_t glyph_id) {
1546b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  IndexSubTableList* subtable_list = GetIndexSubTableList();
1556b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  int32_t index = 0;
1566b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  int32_t bottom = 0;
1576b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  int32_t top = subtable_list->size();
1586b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  while (top != bottom) {
1596b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    index = (top + bottom) / 2;
1606b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    IndexSubTable* subtable = (*subtable_list)[index];
1616b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    if (glyph_id < subtable->first_glyph_index()) {
1626b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      // Location beow current location
1636b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      top = index;
1646b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    } else {
1656b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      if (glyph_id <= subtable->last_glyph_index()) {
1666b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com        return subtable;
1676b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      } else {
1686b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com        bottom = index + 1;
1696b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      }
1706b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    }
1716b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  }
1726b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return NULL;
1736b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
1746b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
1756b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comCALLER_ATTACH
1766b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comIndexSubTable* BitmapSizeTable::CreateIndexSubTable(int32_t index) {
177333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return IndexSubTable::CreateIndexSubTable(master_read_data(),
1786b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com                                            IndexSubTableArrayOffset(),
1796b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com                                            index);
1806b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
1816b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
1826b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comIndexSubTableList* BitmapSizeTable::GetIndexSubTableList() {
183333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  AutoLock lock(index_subtables_lock_);
184333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  if (index_subtables_.empty()) {
1856b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    for (int32_t i = 0; i < NumberOfIndexSubTables(); ++i) {
1866b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      IndexSubTablePtr table;
1876b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      table.Attach(CreateIndexSubTable(i));
188333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      index_subtables_.push_back(table);
189333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    }
190333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
191333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return &index_subtables_;
192333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
193333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
194333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com/******************************************************************************
195333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * BitmapSizeTable::Builder class
196333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ******************************************************************************/
197333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::~Builder() {
198333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
199333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
200333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH
201333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comFontDataTable* BitmapSizeTable::Builder::SubBuildTable(ReadableFontData* data) {
202333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  BitmapSizeTablePtr output = new BitmapSizeTable(data, master_read_data());
203333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return output.Detach();
204333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
205333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
206333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::SubDataSet() {
207333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  Revert();
208333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
209333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
210333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::SubDataSizeToSerialize() {
211333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  IndexSubTableBuilderList* builders = IndexSubTableBuilders();
212333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  if (builders->empty()) {
213333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    return 0;
214333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
215333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  int32_t size = EblcTable::Offset::kBitmapSizeTableLength;
216333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  bool variable = false;
217333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  for (IndexSubTableBuilderList::iterator b = builders->begin(),
218333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                                          e = builders->end(); b != e; b++) {
219333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    size += EblcTable::Offset::kIndexSubTableEntryLength;
220333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    int32_t sub_table_size = (*b)->SubDataSizeToSerialize();
22153847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com    int32_t padding = FontMath::PaddingRequired(abs(sub_table_size),
22253847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com                                                DataSize::kULONG);
22353847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com#if defined (SFNTLY_DEBUG_BITMAP)
22453847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com    fprintf(stderr, "subtable size=%d\n", sub_table_size);
22553847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com#endif
226333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    variable = (sub_table_size > 0) ? variable : true;
22753847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com    size += abs(sub_table_size) + padding;
228333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
22953847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com#if defined (SFNTLY_DEBUG_BITMAP)
23053847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com  fprintf(stderr, "bitmap table size=%d\n", variable ? -size : size);
23153847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com#endif
23253847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com  return variable ? -size : size;
233333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
234333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
235333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.combool BitmapSizeTable::Builder::SubReadyToSerialize() {
236333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  if (IndexSubTableBuilders()->empty()) {
237333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    return false;
238333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
239333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return true;
240333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
241333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
242333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::SubSerialize(WritableFontData* new_data) {
243333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  SetNumberOfIndexSubTables(IndexSubTableBuilders()->size());
244333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  int32_t size = InternalReadData()->CopyTo(new_data);
245333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return size;
246333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
247333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
248333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH BitmapSizeTable::Builder*
249333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::CreateBuilder(WritableFontData* data,
250333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                                        ReadableFontData* master_data) {
251333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  BitmapSizeTableBuilderPtr output =
252333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      new BitmapSizeTable::Builder(data, master_data);
253333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return output.Detach();
254333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
255333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
256333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH BitmapSizeTable::Builder*
257333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::CreateBuilder(ReadableFontData* data,
258333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                                        ReadableFontData* master_data) {
259333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  BitmapSizeTableBuilderPtr output =
260333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      new BitmapSizeTable::Builder(data, master_data);
261333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return output.Detach();
262333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
263333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
264333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::IndexSubTableArrayOffset() {
265333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return InternalReadData()->ReadULongAsInt(
266333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_indexSubTableArrayOffset);
267333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
268333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
269333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::SetIndexSubTableArrayOffset(int32_t offset) {
270333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  InternalWriteData()->WriteULong(
271333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_indexSubTableArrayOffset, offset);
272333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
273333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
274333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::IndexTableSize() {
275333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return InternalReadData()->ReadULongAsInt(
276333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_indexTableSize);
277333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
278333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
279333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::SetIndexTableSize(int32_t size) {
280333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  InternalWriteData()->WriteULong(
281333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_indexTableSize, size);
282333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
283333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
284333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::NumberOfIndexSubTables() {
285333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return GetIndexSubTableBuilders()->size();
286333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
287333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
288333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::ColorRef() {
289333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return InternalReadData()->ReadULongAsInt(
290333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_colorRef);
291333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
292333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
293333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::StartGlyphIndex() {
294333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return InternalReadData()->ReadUShort(
295333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_startGlyphIndex);
296333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
297333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
298333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::EndGlyphIndex() {
299333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return InternalReadData()->ReadUShort(
300333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_endGlyphIndex);
301333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
302333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
303333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::PpemX() {
304333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return InternalReadData()->ReadByte(
305333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_ppemX);
306333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
307333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
308333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::PpemY() {
309333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return InternalReadData()->ReadByte(
310333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_ppemY);
311333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
312333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
313333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::BitDepth() {
314333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return InternalReadData()->ReadByte(
315333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_bitDepth);
316333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
317333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
318333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::FlagsAsInt() {
319333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return InternalReadData()->ReadChar(
320333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_flags);
321333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
322333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
32353847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.comIndexSubTable::Builder* BitmapSizeTable::Builder::IndexSubTableBuilder(
324333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    int32_t index) {
325333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  IndexSubTableBuilderList* sub_table_list = GetIndexSubTableBuilders();
326333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return sub_table_list->at(index);
327333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
328333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
329144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.comCALLER_ATTACH BitmapGlyphInfo* BitmapSizeTable::Builder::GlyphInfo(
330144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com    int32_t glyph_id) {
331144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com  IndexSubTable::Builder* sub_table = SearchIndexSubTables(glyph_id);
332144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com  if (sub_table == NULL) {
333144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com    return NULL;
334144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com  }
335144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com  return sub_table->GlyphInfo(glyph_id);
336144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com}
337144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com
338333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::GlyphOffset(int32_t glyph_id) {
339333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  IndexSubTable::Builder* subtable = SearchIndexSubTables(glyph_id);
340333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  if (subtable == NULL) {
341333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    return -1;
342333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
343333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return subtable->GlyphOffset(glyph_id);
344333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
345333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
346333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::GlyphLength(int32_t glyph_id) {
347333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  IndexSubTable::Builder* subtable = SearchIndexSubTables(glyph_id);
348333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  if (subtable == NULL) {
349333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    return -1;
350333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
351333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return subtable->GlyphLength(glyph_id);
352333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
353333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
354333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comint32_t BitmapSizeTable::Builder::GlyphFormat(int32_t glyph_id) {
355333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  IndexSubTable::Builder* subtable = SearchIndexSubTables(glyph_id);
356333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  if (subtable == NULL) {
357333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    return -1;
358333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
359333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return subtable->image_format();
360333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
361333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
362333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTableBuilderList* BitmapSizeTable::Builder::IndexSubTableBuilders() {
363333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return GetIndexSubTableBuilders();
364333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
365333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
366333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH BitmapSizeTable::Builder::BitmapGlyphInfoIterator*
367333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::GetIterator() {
368333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  Ptr<BitmapSizeTable::Builder::BitmapGlyphInfoIterator> output =
369333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      new BitmapSizeTable::Builder::BitmapGlyphInfoIterator(this);
370333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return output.Detach();
371333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
372333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
373333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::GenerateLocaMap(BitmapGlyphInfoMap* output) {
374333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  assert(output);
375333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  Ptr<BitmapSizeTable::Builder::BitmapGlyphInfoIterator> it;
376333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  it.Attach(GetIterator());
377333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  while (it->HasNext()) {
378333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    BitmapGlyphInfoPtr info;
379333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    info.Attach(it->Next());
380333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    (*output)[info->glyph_id()] = info;
381333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
382333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
383333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
384333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::Revert() {
385333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  index_sub_tables_.clear();
386333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  set_model_changed(false);
387333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
388333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
389333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::Builder(WritableFontData* data,
390333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                                  ReadableFontData* master_data)
391333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    : SubTable::Builder(data, master_data) {
392333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
393333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
394333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::Builder(ReadableFontData* data,
395333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                                  ReadableFontData* master_data)
396333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    : SubTable::Builder(data, master_data) {
397333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
398333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
399333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::SetNumberOfIndexSubTables(int32_t count) {
400333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  InternalWriteData()->WriteULong(
401333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      EblcTable::Offset::kBitmapSizeTable_numberOfIndexSubTables, count);
402333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
403333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
404333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTable::Builder* BitmapSizeTable::Builder::SearchIndexSubTables(
405333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    int32_t glyph_id) {
406144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com  // would be faster to binary search but too many size tables don't have
407144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com  // sorted subtables
408144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com#if (SFNTLY_BITMAPSIZE_USE_BINARY_SEARCH)
409144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com  return BinarySearchIndexSubTables(glyph_id);
410144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com#else
411144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com  return LinearSearchIndexSubTables(glyph_id);
412144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com#endif
413144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com}
414144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com
415144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.comIndexSubTable::Builder* BitmapSizeTable::Builder::LinearSearchIndexSubTables(
416144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com    int32_t glyph_id) {
417144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com  IndexSubTableBuilderList* subtable_list = GetIndexSubTableBuilders();
418144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com  for (IndexSubTableBuilderList::iterator b = subtable_list->begin(),
419144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com                                          e = subtable_list->end();
420144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com                                          b != e; b++) {
421144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com    if ((*b)->first_glyph_index() <= glyph_id &&
422144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com        (*b)->last_glyph_index() >= glyph_id) {
423144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com      return *b;
424144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com    }
425144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com  }
426144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com  return NULL;
427144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com}
428144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com
429144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.comIndexSubTable::Builder* BitmapSizeTable::Builder::BinarySearchIndexSubTables(
430144e5cb2b372c30d8a4b90267b52646368dd89fcarthurhsu@google.com    int32_t glyph_id) {
431333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  IndexSubTableBuilderList* subtable_list = GetIndexSubTableBuilders();
432333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  int32_t index = 0;
433333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  int32_t bottom = 0;
434333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  int32_t top = subtable_list->size();
435333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  while (top != bottom) {
436333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    index = (top + bottom) / 2;
437333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    IndexSubTable::Builder* subtable = subtable_list->at(index);
438333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    if (glyph_id < subtable->first_glyph_index()) {
439333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      // Location beow current location
440333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      top = index;
441333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    } else {
442333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      if (glyph_id <= subtable->last_glyph_index()) {
443333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        return subtable;
444333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      } else {
445333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        bottom = index + 1;
446333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      }
447333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    }
448333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
449333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return NULL;
450333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
451333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
452333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comIndexSubTableBuilderList* BitmapSizeTable::Builder::GetIndexSubTableBuilders() {
453333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  if (index_sub_tables_.empty()) {
454333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    Initialize(InternalReadData());
455333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    set_model_changed();
456333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
457333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return &index_sub_tables_;
458333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
459333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
460333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comvoid BitmapSizeTable::Builder::Initialize(ReadableFontData* data) {
461333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  index_sub_tables_.clear();
462333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  if (data) {
463333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    int32_t number_of_index_subtables =
464333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        BitmapSizeTable::NumberOfIndexSubTables(data, 0);
465be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    index_sub_tables_.resize(number_of_index_subtables);
466333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    for (int32_t i = 0; i < number_of_index_subtables; ++i) {
467be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com      index_sub_tables_[i].Attach(CreateIndexSubTableBuilder(i));
468333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    }
469333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
470333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
471333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
472333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH IndexSubTable::Builder*
473333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::CreateIndexSubTableBuilder(int32_t index) {
474333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return IndexSubTable::Builder::CreateBuilder(master_read_data(),
475333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                                               IndexSubTableArrayOffset(),
476333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                                               index);
477333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
478333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
479333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com/******************************************************************************
480333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * BitmapSizeTable::Builder::BitmapGlyphInfoIterator class
481333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ******************************************************************************/
482333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapSizeTable::Builder::BitmapGlyphInfoIterator::BitmapGlyphInfoIterator(
483333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    BitmapSizeTable::Builder* container)
484333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    : RefIterator<BitmapGlyphInfo, BitmapSizeTable::Builder>(container) {
485333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  sub_table_iter_ = container->IndexSubTableBuilders()->begin();
486333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  sub_table_glyph_info_iter_.Attach((*sub_table_iter_)->GetIterator());
487333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
488333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
489333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.combool BitmapSizeTable::Builder::BitmapGlyphInfoIterator::HasNext() {
490333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  if (sub_table_glyph_info_iter_ && HasNext(sub_table_glyph_info_iter_)) {
491333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    return true;
492333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
493333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  while (++sub_table_iter_ != container()->IndexSubTableBuilders()->end()) {
494333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    sub_table_glyph_info_iter_.Attach((*sub_table_iter_)->GetIterator());
495333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    if (HasNext(sub_table_glyph_info_iter_)) {
496333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      return true;
497333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    }
498333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
499333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return false;
500333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
501333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
502333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH
503333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapGlyphInfo* BitmapSizeTable::Builder::BitmapGlyphInfoIterator::Next() {
504333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  if (!HasNext()) {
505333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    // Note: In C++, we do not throw exception when there's no element.
506333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    return NULL;
507333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
508333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return Next(sub_table_glyph_info_iter_);
509333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
510333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
511333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.combool BitmapSizeTable::Builder::BitmapGlyphInfoIterator::HasNext(
512333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    BitmapGlyphInfoIter* iterator_base) {
513333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  if (iterator_base) {
514333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    switch (iterator_base->container_base()->index_format()) {
515333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      case 1: {
516333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        IndexSubTableFormat1::Builder::BitmapGlyphInfoIterator* it =
517333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com            down_cast<IndexSubTableFormat1::Builder::BitmapGlyphInfoIterator*>(
518333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                iterator_base);
519333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        return it->HasNext();
520333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      }
521333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
522333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      case 2: {
523333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator* it =
524333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com            down_cast<IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator*>(
525333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                iterator_base);
526333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        return it->HasNext();
527333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      }
528333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
529333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      case 3: {
530333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        IndexSubTableFormat3::Builder::BitmapGlyphInfoIterator* it =
531333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com            down_cast<IndexSubTableFormat3::Builder::BitmapGlyphInfoIterator*>(
532333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                iterator_base);
533333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        return it->HasNext();
534333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      }
535333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
536333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      case 4: {
537333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        IndexSubTableFormat4::Builder::BitmapGlyphInfoIterator* it =
538333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com            down_cast<IndexSubTableFormat4::Builder::BitmapGlyphInfoIterator*>(
539333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                iterator_base);
540333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        return it->HasNext();
541333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      }
542333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
543333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      case 5: {
544333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator* it =
545333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com            down_cast<IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator*>(
546333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                iterator_base);
547333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        return it->HasNext();
548333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      }
549333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
550333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      default:
551333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        break;
552333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    }
553333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
554333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return false;
555333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
556333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
557333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH
558333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comBitmapGlyphInfo* BitmapSizeTable::Builder::BitmapGlyphInfoIterator::Next(
559333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    BitmapGlyphInfoIter* iterator_base) {
560333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  if (iterator_base) {
561333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    switch (iterator_base->container_base()->index_format()) {
562333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      case 1: {
563333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        IndexSubTableFormat1::Builder::BitmapGlyphInfoIterator* it =
564333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com            down_cast<IndexSubTableFormat1::Builder::BitmapGlyphInfoIterator*>(
565333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                iterator_base);
566333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        return it->Next();
567333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      }
568333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
569333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      case 2: {
570333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator* it =
571333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com            down_cast<IndexSubTableFormat2::Builder::BitmapGlyphInfoIterator*>(
572333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                iterator_base);
573333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        return it->Next();
574333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      }
575333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
576333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      case 3: {
577333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        IndexSubTableFormat3::Builder::BitmapGlyphInfoIterator* it =
578333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com            down_cast<IndexSubTableFormat3::Builder::BitmapGlyphInfoIterator*>(
579333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                iterator_base);
580333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        return it->Next();
581333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      }
582333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
583333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      case 4: {
584333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        IndexSubTableFormat4::Builder::BitmapGlyphInfoIterator* it =
585333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com            down_cast<IndexSubTableFormat4::Builder::BitmapGlyphInfoIterator*>(
586333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                iterator_base);
587333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        return it->Next();
588333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      }
589333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
590333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      case 5: {
591333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator* it =
592333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com            down_cast<IndexSubTableFormat5::Builder::BitmapGlyphInfoIterator*>(
593333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                iterator_base);
594333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        return it->Next();
595333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      }
596333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
597333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com      default:
598333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com        break;
5996b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    }
6006b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  }
601333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return NULL;
6026b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
6036b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
6046b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}  // namespace sfntly
605