aboutsummaryrefslogtreecommitdiff
path: root/cpp/src/sfntly/table/bitmap/bitmap_size_table.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/sfntly/table/bitmap/bitmap_size_table.h')
-rw-r--r--cpp/src/sfntly/table/bitmap/bitmap_size_table.h173
1 files changed, 173 insertions, 0 deletions
diff --git a/cpp/src/sfntly/table/bitmap/bitmap_size_table.h b/cpp/src/sfntly/table/bitmap/bitmap_size_table.h
new file mode 100644
index 0000000..6733e20
--- /dev/null
+++ b/cpp/src/sfntly/table/bitmap/bitmap_size_table.h
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2011 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 = the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_BITMAP_SIZE_TABLE_H_
+#define SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_BITMAP_SIZE_TABLE_H_
+
+#include "sfntly/port/lock.h"
+#include "sfntly/table/bitmap/bitmap_glyph_info.h"
+#include "sfntly/table/bitmap/index_sub_table.h"
+
+namespace sfntly {
+// Binary search would be faster but many fonts have index subtables that
+// aren't sorted.
+// Note: preprocessor define is used to avoid const expression warnings in C++
+// code.
+#define SFNTLY_BITMAPSIZE_USE_BINARY_SEARCH 0
+
+class BitmapSizeTable : public SubTable,
+ public RefCounted<BitmapSizeTable> {
+ public:
+ class Builder : public SubTable::Builder,
+ public RefCounted<Builder> {
+ public:
+ class BitmapGlyphInfoIterator :
+ public RefIterator<BitmapGlyphInfo, Builder> {
+ public:
+ explicit BitmapGlyphInfoIterator(Builder* container);
+ virtual ~BitmapGlyphInfoIterator() {}
+
+ virtual bool HasNext();
+ CALLER_ATTACH virtual BitmapGlyphInfo* Next();
+
+ private:
+ bool HasNext(BitmapGlyphInfoIter* iterator_base);
+ CALLER_ATTACH BitmapGlyphInfo* Next(BitmapGlyphInfoIter* iterator_base);
+
+ IndexSubTableBuilderList::iterator sub_table_iter_;
+ BitmapGlyphInfoIterPtr sub_table_glyph_info_iter_;
+ };
+
+ virtual ~Builder();
+
+ virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+ virtual void SubDataSet();
+ virtual int32_t SubDataSizeToSerialize();
+ virtual bool SubReadyToSerialize();
+ virtual int32_t SubSerialize(WritableFontData* new_data);
+
+ static CALLER_ATTACH Builder* CreateBuilder(WritableFontData* data,
+ ReadableFontData* master_data);
+ static CALLER_ATTACH Builder* CreateBuilder(ReadableFontData* data,
+ ReadableFontData* master_data);
+ // Gets the subtable array offset as set in the original table as read from
+ // the font file. This value cannot be explicitly set and will be generated
+ // during table building.
+ // @return the subtable array offset
+ int32_t IndexSubTableArrayOffset();
+
+ // Sets the subtable array offset. This is used only during the building
+ // process when the objects are being serialized.
+ // @param offset the offset to the index subtable array
+ void SetIndexSubTableArrayOffset(int32_t offset);
+
+ // Gets the subtable array size as set in the original table as read from
+ // the font file. This value cannot be explicitly set and will be generated
+ // during table building.
+ // @return the subtable array size
+ int32_t IndexTableSize();
+
+ // Sets the subtable size. This is used only during the building process
+ // when the objects are being serialized.
+ // @param size the offset to the index subtable array
+ void SetIndexTableSize(int32_t size);
+
+ int32_t NumberOfIndexSubTables();
+ int32_t ColorRef();
+ // TODO(stuartg): SBitLineMetrics hori();
+ // TODO(stuartg): SBitLineMetrics vert();
+ int32_t StartGlyphIndex();
+ int32_t EndGlyphIndex();
+ int32_t PpemX();
+ int32_t PpemY();
+ int32_t BitDepth();
+ int32_t FlagsAsInt();
+
+ IndexSubTable::Builder* IndexSubTableBuilder(int32_t index);
+ CALLER_ATTACH BitmapGlyphInfo* GlyphInfo(int32_t glyph_id);
+ int32_t GlyphOffset(int32_t glyph_id);
+ int32_t GlyphLength(int32_t glyph_id);
+ int32_t GlyphFormat(int32_t glyph_id);
+ IndexSubTableBuilderList* IndexSubTableBuilders();
+ // Note: renamed from iterator(), type is the derived type.
+ CALLER_ATTACH BitmapGlyphInfoIterator* GetIterator();
+ void GenerateLocaMap(BitmapGlyphInfoMap* output);
+
+ protected:
+ void Revert();
+
+ private:
+ Builder(WritableFontData* data, ReadableFontData* master_data);
+ Builder(ReadableFontData* data, ReadableFontData* master_data);
+
+ void SetNumberOfIndexSubTables(int32_t count);
+ IndexSubTable::Builder* SearchIndexSubTables(int32_t glyph_id);
+ IndexSubTable::Builder* LinearSearchIndexSubTables(int32_t glyph_id);
+ IndexSubTable::Builder* BinarySearchIndexSubTables(int32_t glyph_id);
+ IndexSubTableBuilderList* GetIndexSubTableBuilders();
+ void Initialize(ReadableFontData* data);
+ CALLER_ATTACH IndexSubTable::Builder* CreateIndexSubTableBuilder(
+ int32_t index);
+
+ IndexSubTableBuilderList index_sub_tables_;
+ };
+
+ virtual ~BitmapSizeTable();
+
+ int32_t IndexSubTableArrayOffset();
+ int32_t IndexTableSize();
+ int32_t NumberOfIndexSubTables();
+ int32_t ColorRef();
+ // TODO(stuartg): SBitLineMetrics hori();
+ // TODO(stuartg): SBitLineMetrics vert();
+ int32_t StartGlyphIndex();
+ int32_t EndGlyphIndex();
+ int32_t PpemX();
+ int32_t PpemY();
+ int32_t BitDepth();
+ int32_t FlagsAsInt();
+
+ // Note: renamed from indexSubTable()
+ IndexSubTable* GetIndexSubTable(int32_t index);
+ int32_t GlyphOffset(int32_t glyph_id);
+ int32_t GlyphLength(int32_t glyph_id);
+ CALLER_ATTACH BitmapGlyphInfo* GlyphInfo(int32_t glyph_id);
+ int32_t GlyphFormat(int32_t glyph_id);
+
+ protected:
+ BitmapSizeTable(ReadableFontData* data,
+ ReadableFontData* master_data);
+
+ private:
+ static int32_t NumberOfIndexSubTables(ReadableFontData* data,
+ int32_t table_offset);
+ IndexSubTable* SearchIndexSubTables(int32_t glyph_id);
+ IndexSubTable* LinearSearchIndexSubTables(int32_t glyph_id);
+ IndexSubTable* BinarySearchIndexSubTables(int32_t glyph_id);
+ CALLER_ATTACH IndexSubTable* CreateIndexSubTable(int32_t index);
+ IndexSubTableList* GetIndexSubTableList();
+
+ Lock index_subtables_lock_;
+ IndexSubTableList index_subtables_;
+};
+typedef Ptr<BitmapSizeTable> BitmapSizeTablePtr;
+typedef std::vector<BitmapSizeTablePtr> BitmapSizeTableList;
+typedef Ptr<BitmapSizeTable::Builder> BitmapSizeTableBuilderPtr;
+typedef std::vector<BitmapSizeTableBuilderPtr> BitmapSizeTableBuilderList;
+
+} // namespace sfntly
+
+#endif // SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_BITMAP_SIZE_TABLE_H_