aboutsummaryrefslogtreecommitdiff
path: root/cpp/src/sfntly/font.cc
diff options
context:
space:
mode:
authordfilimon <dfilimon@google.com>2011-07-26 20:25:35 +0000
committerdfilimon <dfilimon@google.com>2011-07-26 20:25:35 +0000
commitfdfaf586f9b3a7f948c9951204f246959efd9cf4 (patch)
treee8f0b2189f4f7c87e96c9cb12a329f1badef0715 /cpp/src/sfntly/font.cc
parentd3384178942afa12bcae41095e0199b79d25e08b (diff)
downloadsfntly-fdfaf586f9b3a7f948c9951204f246959efd9cf4.tar.gz
Fixed a memory leak in font.cc:520 caused by not attaching to a pointer
returned by getNewArray that would not ever get deleted. Also fixed the cmap builder map bug.
Diffstat (limited to 'cpp/src/sfntly/font.cc')
-rw-r--r--cpp/src/sfntly/font.cc42
1 files changed, 29 insertions, 13 deletions
diff --git a/cpp/src/sfntly/font.cc b/cpp/src/sfntly/font.cc
index bd5614f..3df3d5b 100644
--- a/cpp/src/sfntly/font.cc
+++ b/cpp/src/sfntly/font.cc
@@ -392,7 +392,7 @@ void Font::Builder::buildTablesFromBuilders(TableBuilderMap* builder_map,
builder_end = builder_map->end();
builder != builder_end; ++builder) {
TablePtr table;
- if (builder->second->readyToBuild()) {
+ if (builder->second && builder->second->readyToBuild()) {
#if !defined (SFNTLY_NO_EXCEPTION)
try {
#endif
@@ -420,17 +420,32 @@ void Font::Builder::buildTablesFromBuilders(TableBuilderMap* builder_map,
}
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_);
+ TableBuilderMap::iterator end_iterator = builder_map->end(),
+ header_iterator = builder_map->find(Tag::head),
+ horizontal_header_iterator = builder_map->find(Tag::hhea),
+ max_profile_iterator = builder_map->find(Tag::maxp),
+ loca_table_iterator = builder_map->find(Tag::loca),
+ horizontal_metrics_iterator = builder_map->find(Tag::hmtx);
+ FontHeaderTableBuilderPtr header_table_builder;
+ HorizontalHeaderTableBuilderPtr horizontal_header_builder;
+ MaximumProfileTableBuilderPtr max_profile_builder;
+ LocaTableBuilderPtr loca_table_builder;
+ HorizontalMetricsTableBuilderPtr horizontal_metrics_builder;
+ header_table_builder = (header_iterator != end_iterator) ?
+ down_cast<FontHeaderTable::Builder*>
+ (header_iterator->second.p_) : NULL;
+ horizontal_header_builder = (horizontal_header_iterator != end_iterator) ?
+ down_cast<HorizontalHeaderTable::Builder*>
+ (horizontal_header_iterator->second.p_) : NULL;
+ max_profile_builder = (max_profile_iterator != end_iterator) ?
+ down_cast<MaximumProfileTable::Builder*>
+ (max_profile_iterator->second.p_) : NULL;
+ loca_table_builder = (loca_table_iterator != end_iterator) ?
+ down_cast<LocaTable::Builder*>
+ (loca_table_iterator->second.p_) : NULL;
+ horizontal_metrics_builder = (horizontal_metrics_iterator != end_iterator) ?
+ down_cast<HorizontalMetricsTable::Builder*>
+ (horizontal_metrics_iterator->second.p_) : NULL;
// set the inter table data required to build certain tables
if (horizontal_metrics_builder != NULL) {
@@ -486,7 +501,8 @@ void Font::Builder::loadTableData(TableHeaderSortedSet* headers,
is->skip((*table_header)->offset() - is->position());
FontInputStream table_is(is, (*table_header)->length());
int32_t roundup_length = ((*table_header)->length() + 3) & ~3;
- ByteArrayPtr array = factory_->getNewArray(roundup_length);
+ ByteArrayPtr array;
+ array.attach(factory_->getNewArray(roundup_length));
array->copyFrom(&table_is, (*table_header)->length());
WritableFontDataPtr data = new WritableFontData(array);
table_data->insert(DataBlockEntry(*table_header, data));