Correct decoder output table ordering

This commit is contained in:
Rod Sheeter
2015-03-03 09:30:12 -08:00
parent 538b401b77
commit 498c637024
4 changed files with 34 additions and 18 deletions
+9 -15
View File
@@ -217,7 +217,7 @@ size_t FontCollectionFileSize(const FontCollection& font_collection) {
bool WriteFont(const Font& font, uint8_t* dst, size_t dst_size) { bool WriteFont(const Font& font, uint8_t* dst, size_t dst_size) {
size_t offset = 0; size_t offset = 0;
return WriteFont(font, &offset, dst, dst_size, true); return WriteFont(font, &offset, dst, dst_size);
} }
bool WriteTable(const Font::Table& table, size_t* offset, uint8_t* dst, bool WriteTable(const Font::Table& table, size_t* offset, uint8_t* dst,
@@ -246,7 +246,7 @@ bool WriteTable(const Font::Table& table, size_t* offset, uint8_t* dst,
} }
bool WriteFont(const Font& font, size_t* offset, uint8_t* dst, bool WriteFont(const Font& font, size_t* offset, uint8_t* dst,
size_t dst_size, bool reorder_tables) { size_t dst_size) {
if (dst_size < 12ULL + 16ULL * font.num_tables) { if (dst_size < 12ULL + 16ULL * font.num_tables) {
return FONT_COMPRESSION_FAILURE(); return FONT_COMPRESSION_FAILURE();
} }
@@ -258,19 +258,13 @@ bool WriteFont(const Font& font, size_t* offset, uint8_t* dst,
Store16(search_range, offset, dst); Store16(search_range, offset, dst);
Store16(max_pow2, offset, dst); Store16(max_pow2, offset, dst);
Store16(range_shift, offset, dst); Store16(range_shift, offset, dst);
if (reorder_tables) {
for (const auto tag : font.OutputOrderedTags()) { for (const auto& i : font.tables) {
if (!WriteTable(font.tables.at(tag), offset, dst, dst_size)) { if (!WriteTable(i.second, offset, dst, dst_size)) {
return false; return false;
}
}
} else {
for (const auto& i : font.tables) {
if (!WriteTable(i.second, offset, dst, dst_size)) {
return false;
}
} }
} }
return true; return true;
} }
@@ -280,7 +274,7 @@ bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst,
// It's simpler if this just a simple sfnt // It's simpler if this just a simple sfnt
if (font_collection.fonts.size() == 1) { if (font_collection.fonts.size() == 1) {
return WriteFont(font_collection.fonts[0], &offset, dst, dst_size, true); return WriteFont(font_collection.fonts[0], &offset, dst, dst_size);
} }
// Write TTC header // Write TTC header
@@ -304,7 +298,7 @@ bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst,
for (int i = 0; i < font_collection.fonts.size(); i++) { for (int i = 0; i < font_collection.fonts.size(); i++) {
const auto& font = font_collection.fonts[i]; const auto& font = font_collection.fonts[i];
StoreU32(offset, &offset_table, dst); StoreU32(offset, &offset_table, dst);
if (!WriteFont(font, &offset, dst, dst_size, false)) { if (!WriteFont(font, &offset, dst, dst_size)) {
return false; return false;
} }
} }
+2 -3
View File
@@ -83,9 +83,8 @@ size_t FontCollectionFileSize(const FontCollection& font);
// same as returned by FontFileSize(). Returns false upon buffer overflow (which // same as returned by FontFileSize(). Returns false upon buffer overflow (which
// should not happen if dst_size was computed by FontFileSize()). // should not happen if dst_size was computed by FontFileSize()).
bool WriteFont(const Font& font, uint8_t* dst, size_t dst_size); bool WriteFont(const Font& font, uint8_t* dst, size_t dst_size);
// Write the font at a specific offset, optionally reordering tables // Write the font at a specific offset
bool WriteFont(const Font& font, size_t* offset, uint8_t* dst, size_t dst_size, bool WriteFont(const Font& font, size_t* offset, uint8_t* dst, size_t dst_size);
bool reorder_tables);
bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst, bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst,
size_t dst_size); size_t dst_size);
+4
View File
@@ -52,6 +52,10 @@ struct Table {
uint32_t dst_offset; uint32_t dst_offset;
uint32_t dst_length; uint32_t dst_length;
const uint8_t* dst_data; const uint8_t* dst_data;
bool operator<(const Table& other) const {
return tag < other.tag;
}
}; };
+19
View File
@@ -17,6 +17,7 @@
#include "./woff2_dec.h" #include "./woff2_dec.h"
#include <stdlib.h> #include <stdlib.h>
#include <algorithm>
#include <complex> #include <complex>
#include <cstring> #include <cstring>
#include <limits> #include <limits>
@@ -932,6 +933,24 @@ bool ConvertWOFF2ToTTF(uint8_t* result, size_t result_length,
return FONT_COMPRESSION_FAILURE(); return FONT_COMPRESSION_FAILURE();
} }
// Re-order tables in output (OTSpec) order
if (header_version) {
// collection; we have to sort the table offset vector in each font
for (auto& ttc_font : ttc_fonts) {
std::map<uint32_t, uint16_t> sorted_index_by_tag;
for (auto table_index : ttc_font.table_indices) {
sorted_index_by_tag[tables[table_index].tag] = table_index;
}
uint16_t index = 0;
for (auto& i : sorted_index_by_tag) {
ttc_font.table_indices[index++] = i.second;
}
}
} else {
// non-collection; we can just sort the tables
std::sort(tables.begin(), tables.end());
}
// Start building the font // Start building the font
size_t offset = 0; size_t offset = 0;
size_t offset_table = 0; size_t offset_table = 0;