summaryrefslogtreecommitdiff
path: root/sfntly/table
diff options
context:
space:
mode:
Diffstat (limited to 'sfntly/table')
-rw-r--r--sfntly/table/bitmap/bitmap_size_table.cc34
-rw-r--r--sfntly/table/bitmap/bitmap_size_table.h3
-rw-r--r--sfntly/table/bitmap/ebdt_table.cc2
-rw-r--r--sfntly/table/bitmap/index_sub_table.cc11
-rw-r--r--sfntly/table/bitmap/index_sub_table.h5
5 files changed, 54 insertions, 1 deletions
diff --git a/sfntly/table/bitmap/bitmap_size_table.cc b/sfntly/table/bitmap/bitmap_size_table.cc
index 5e0c237..bde903a 100644
--- a/sfntly/table/bitmap/bitmap_size_table.cc
+++ b/sfntly/table/bitmap/bitmap_size_table.cc
@@ -316,6 +316,15 @@ IndexSubTable::Builder* BitmapSizeTable::Builder::GetIndexSubTable(
return sub_table_list->at(index);
}
+CALLER_ATTACH BitmapGlyphInfo* BitmapSizeTable::Builder::GlyphInfo(
+ int32_t glyph_id) {
+ IndexSubTable::Builder* sub_table = SearchIndexSubTables(glyph_id);
+ if (sub_table == NULL) {
+ return NULL;
+ }
+ return sub_table->GlyphInfo(glyph_id);
+}
+
int32_t BitmapSizeTable::Builder::GlyphOffset(int32_t glyph_id) {
IndexSubTable::Builder* subtable = SearchIndexSubTables(glyph_id);
if (subtable == NULL) {
@@ -384,6 +393,31 @@ void BitmapSizeTable::Builder::SetNumberOfIndexSubTables(int32_t count) {
IndexSubTable::Builder* BitmapSizeTable::Builder::SearchIndexSubTables(
int32_t glyph_id) {
+ // would be faster to binary search but too many size tables don't have
+ // sorted subtables
+#if (SFNTLY_BITMAPSIZE_USE_BINARY_SEARCH)
+ return BinarySearchIndexSubTables(glyph_id);
+#else
+ return LinearSearchIndexSubTables(glyph_id);
+#endif
+}
+
+IndexSubTable::Builder* BitmapSizeTable::Builder::LinearSearchIndexSubTables(
+ int32_t glyph_id) {
+ IndexSubTableBuilderList* subtable_list = GetIndexSubTableBuilders();
+ for (IndexSubTableBuilderList::iterator b = subtable_list->begin(),
+ e = subtable_list->end();
+ b != e; b++) {
+ if ((*b)->first_glyph_index() <= glyph_id &&
+ (*b)->last_glyph_index() >= glyph_id) {
+ return *b;
+ }
+ }
+ return NULL;
+}
+
+IndexSubTable::Builder* BitmapSizeTable::Builder::BinarySearchIndexSubTables(
+ int32_t glyph_id) {
IndexSubTableBuilderList* subtable_list = GetIndexSubTableBuilders();
int32_t index = 0;
int32_t bottom = 0;
diff --git a/sfntly/table/bitmap/bitmap_size_table.h b/sfntly/table/bitmap/bitmap_size_table.h
index 2bc91da..4f4a961 100644
--- a/sfntly/table/bitmap/bitmap_size_table.h
+++ b/sfntly/table/bitmap/bitmap_size_table.h
@@ -98,6 +98,7 @@ class BitmapSizeTable : public SubTable,
// Note: renamed from indexSubTable()
IndexSubTable::Builder* GetIndexSubTable(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);
@@ -115,6 +116,8 @@ class BitmapSizeTable : public SubTable,
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(
diff --git a/sfntly/table/bitmap/ebdt_table.cc b/sfntly/table/bitmap/ebdt_table.cc
index 19e5e55..eeb1fa0 100644
--- a/sfntly/table/bitmap/ebdt_table.cc
+++ b/sfntly/table/bitmap/ebdt_table.cc
@@ -222,7 +222,7 @@ void EbdtTable::Builder::Initialize(ReadableFontData* data,
BitmapGlyphInfoPtr info = entry->second;
ReadableFontDataPtr slice;
slice.Attach(down_cast<ReadableFontData*>(data->Slice(
- info->start_offset(), info->length())));
+ info->offset(), info->length())));
BitmapGlyphBuilderPtr glyph_builder;
glyph_builder.Attach(BitmapGlyph::Builder::CreateGlyphBuilder(
slice, info->format()));
diff --git a/sfntly/table/bitmap/index_sub_table.cc b/sfntly/table/bitmap/index_sub_table.cc
index 66d2d83..80c0ffe 100644
--- a/sfntly/table/bitmap/index_sub_table.cc
+++ b/sfntly/table/bitmap/index_sub_table.cc
@@ -104,6 +104,17 @@ void IndexSubTable::Builder::Revert() {
Initialize(InternalReadData());
}
+CALLER_ATTACH BitmapGlyphInfo* IndexSubTable::Builder::GlyphInfo(
+ int32_t glyph_id) {
+ BitmapGlyphInfoPtr glyph_info =
+ new BitmapGlyphInfo(glyph_id,
+ image_data_offset(),
+ GlyphStartOffset(glyph_id),
+ GlyphLength(glyph_id),
+ image_format());
+ return glyph_info.Detach();
+}
+
int32_t IndexSubTable::Builder::GlyphOffset(int32_t glyph_id) {
return image_data_offset() + GlyphStartOffset(glyph_id);
}
diff --git a/sfntly/table/bitmap/index_sub_table.h b/sfntly/table/bitmap/index_sub_table.h
index c2be7d1..0993e76 100644
--- a/sfntly/table/bitmap/index_sub_table.h
+++ b/sfntly/table/bitmap/index_sub_table.h
@@ -45,6 +45,11 @@ class IndexSubTable : public SubTable {
virtual int32_t NumGlyphs() = 0;
+ // Gets the glyph info for the specified glyph id.
+ // @param glyphId the glyph id to look up
+ // @return the glyph info
+ CALLER_ATTACH virtual BitmapGlyphInfo* GlyphInfo(int32_t glyph_id);
+
// Gets the full offset of the glyph within the EBDT table.
// @param glyphId the glyph id
// @return the glyph offset