summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarthurhsu@google.com <arthurhsu@google.com@672e30a5-4c29-85ac-ac6d-611c735e0a51>2011-08-01 23:35:27 +0000
committerarthurhsu@google.com <arthurhsu@google.com@672e30a5-4c29-85ac-ac6d-611c735e0a51>2011-08-01 23:35:27 +0000
commit335643ef4bbe8029047fec80feaa5912a05b84f0 (patch)
tree536203c4b92883cfbcdfaed859d9273ba49dda3b
parentbd74f6c542ef6b6d279edf08d6d7e5952bc4980e (diff)
downloadsrc-335643ef4bbe8029047fec80feaa5912a05b84f0.tar.gz
Original change by dfilimon
Redo since the readability CL invalidated it. Fix bad usage of STL map that created NULL pointers in table builder map. git-svn-id: http://sfntly.googlecode.com/svn/trunk/cpp/src@33 672e30a5-4c29-85ac-ac6d-611c735e0a51
-rw-r--r--sfntly/font.cc55
1 files changed, 44 insertions, 11 deletions
diff --git a/sfntly/font.cc b/sfntly/font.cc
index 86030a8..814e2ee 100644
--- a/sfntly/font.cc
+++ b/sfntly/font.cc
@@ -398,18 +398,51 @@ void Font::Builder::BuildTablesFromBuilders(TableBuilderMap* builder_map,
}
}
+static Table::Builder* GetBuilder(TableBuilderMap* builder_map, int32_t tag) {
+ if (builder_map) {
+ TableBuilderMap::iterator target = builder_map->find(tag);
+ if (target != builder_map->end()) {
+ return target->second.p_;
+ }
+ }
+
+ return NULL;
+}
+
void Font::Builder::InterRelateBuilders(TableBuilderMap* builder_map) {
- FontHeaderTableBuilderPtr header_table_builder =
- down_cast<FontHeaderTable::Builder*>((*builder_map)[Tag::head].p_);
- HorizontalHeaderTableBuilderPtr horizontal_header_builder =
- down_cast<HorizontalHeaderTable::Builder*>((*builder_map)[Tag::hhea].p_);
- MaximumProfileTableBuilderPtr max_profile_builder =
- down_cast<MaximumProfileTable::Builder*>((*builder_map)[Tag::maxp].p_);
- LocaTableBuilderPtr loca_table_builder =
- down_cast<LocaTable::Builder*>((*builder_map)[Tag::loca].p_);
- HorizontalMetricsTableBuilderPtr horizontal_metrics_builder =
- down_cast<HorizontalMetricsTable::Builder*>(
- (*builder_map)[Tag::hmtx].p_);
+ Table::Builder* raw_head_builder = GetBuilder(builder_map, Tag::head);
+ FontHeaderTableBuilderPtr header_table_builder;
+ if (raw_head_builder != NULL) {
+ header_table_builder =
+ down_cast<FontHeaderTable::Builder*>(raw_head_builder);
+ }
+
+ Table::Builder* raw_hhea_builder = GetBuilder(builder_map, Tag::hhea);
+ HorizontalHeaderTableBuilderPtr horizontal_header_builder;
+ if (raw_head_builder != NULL) {
+ horizontal_header_builder =
+ down_cast<HorizontalHeaderTable::Builder*>(raw_hhea_builder);
+ }
+
+ Table::Builder* raw_maxp_builder = GetBuilder(builder_map, Tag::maxp);
+ MaximumProfileTableBuilderPtr max_profile_builder;
+ if (raw_maxp_builder != NULL) {
+ 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);
+ }
+
+ 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);
+ }
// set the inter table data required to build certain tables
if (horizontal_metrics_builder != NULL) {