aboutsummaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorLei Zhang <leizleiz@users.noreply.github.com>2016-10-25 18:32:02 -0700
committerLei Zhang <leizleiz@users.noreply.github.com>2016-10-25 18:32:02 -0700
commitebaa364dd0e270b6954331dc5ffb5fe4462de372 (patch)
tree99b8999af17efcbd46a81c9b990a7b102aaaedd4 /cpp
parente33ba7a4092ecbe71b02aca49975c7e36d8cc002 (diff)
downloadsfntly-ebaa364dd0e270b6954331dc5ffb5fe4462de372.tar.gz
Fix breakage from commit 083b02b1.
While the previous commit fixed NULL pointer deferences, it also returned NULL pointers for some tables that needed to be set. As a result, sfntly failed to generate correct output, as seen in https://crbug.com/659006.
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/sfntly/font.cc35
1 files changed, 20 insertions, 15 deletions
diff --git a/cpp/src/sfntly/font.cc b/cpp/src/sfntly/font.cc
index 0c268cc..ca35048 100644
--- a/cpp/src/sfntly/font.cc
+++ b/cpp/src/sfntly/font.cc
@@ -400,7 +400,12 @@ static Table::Builder* GetBuilder(TableBuilderMap* builder_map, int32_t tag) {
if (target == builder_map->end())
return NULL;
- Table::Builder* builder = target->second.p_;
+ return target->second.p_;
+}
+
+// Like GetBuilder(), but the returned Builder must be able to support reads.
+static Table::Builder* GetReadBuilder(TableBuilderMap* builder_map, int32_t tag) {
+ Table::Builder* builder = GetBuilder(builder_map, tag);
if (!builder || !builder->InternalReadData())
return NULL;
@@ -408,46 +413,46 @@ static Table::Builder* GetBuilder(TableBuilderMap* builder_map, int32_t tag) {
}
void Font::Builder::InterRelateBuilders(TableBuilderMap* builder_map) {
- Table::Builder* raw_head_builder = GetBuilder(builder_map, Tag::head);
+ Table::Builder* raw_head_builder = GetReadBuilder(builder_map, Tag::head);
FontHeaderTableBuilderPtr header_table_builder;
if (raw_head_builder != NULL) {
- header_table_builder =
- down_cast<FontHeaderTable::Builder*>(raw_head_builder);
+ header_table_builder =
+ down_cast<FontHeaderTable::Builder*>(raw_head_builder);
}
- Table::Builder* raw_hhea_builder = GetBuilder(builder_map, Tag::hhea);
+ Table::Builder* raw_hhea_builder = GetReadBuilder(builder_map, Tag::hhea);
HorizontalHeaderTableBuilderPtr horizontal_header_builder;
if (raw_head_builder != NULL) {
- horizontal_header_builder =
- down_cast<HorizontalHeaderTable::Builder*>(raw_hhea_builder);
+ horizontal_header_builder =
+ down_cast<HorizontalHeaderTable::Builder*>(raw_hhea_builder);
}
- Table::Builder* raw_maxp_builder = GetBuilder(builder_map, Tag::maxp);
+ Table::Builder* raw_maxp_builder = GetReadBuilder(builder_map, Tag::maxp);
MaximumProfileTableBuilderPtr max_profile_builder;
if (raw_maxp_builder != NULL) {
- max_profile_builder =
- down_cast<MaximumProfileTable::Builder*>(raw_maxp_builder);
+ max_profile_builder =
+ down_cast<MaximumProfileTable::Builder*>(raw_maxp_builder);
}
Table::Builder* raw_loca_builder = GetBuilder(builder_map, Tag::loca);
LocaTableBuilderPtr loca_table_builder;
if (raw_loca_builder != NULL) {
- loca_table_builder = down_cast<LocaTable::Builder*>(raw_loca_builder);
+ loca_table_builder = down_cast<LocaTable::Builder*>(raw_loca_builder);
}
Table::Builder* raw_hmtx_builder = GetBuilder(builder_map, Tag::hmtx);
HorizontalMetricsTableBuilderPtr horizontal_metrics_builder;
if (raw_hmtx_builder != NULL) {
- horizontal_metrics_builder =
- down_cast<HorizontalMetricsTable::Builder*>(raw_hmtx_builder);
+ horizontal_metrics_builder =
+ down_cast<HorizontalMetricsTable::Builder*>(raw_hmtx_builder);
}
#if defined (SFNTLY_EXPERIMENTAL)
Table::Builder* raw_hdmx_builder = GetBuilder(builder_map, Tag::hdmx);
HorizontalDeviceMetricsTableBuilderPtr hdmx_table_builder;
if (raw_hdmx_builder != NULL) {
- hdmx_table_builder =
- down_cast<HorizontalDeviceMetricsTable::Builder*>(raw_hdmx_builder);
+ hdmx_table_builder =
+ down_cast<HorizontalDeviceMetricsTable::Builder*>(raw_hdmx_builder);
}
#endif