Readability clean up. The code conforms to Google C++ Coding Style.
git-svn-id: http://sfntly.googlecode.com/svn/trunk/cpp/src@30 672e30a5-4c29-85ac-ac6d-611c735e0a51
diff --git a/sample/subsetter/main.cc b/sample/subsetter/main.cc
index a9e1524..19a3e0e 100644
--- a/sample/subsetter/main.cc
+++ b/sample/subsetter/main.cc
@@ -34,7 +34,7 @@
}
sfntly::SubsetUtil subset_util;
- subset_util.subset(argv[1], argv[2]);
+ subset_util.Subset(argv[1], argv[2]);
#ifdef _CRTDBG_MAP_ALLOC
_CrtDumpMemoryLeaks();
diff --git a/sample/subsetter/subset_util.cc b/sample/subsetter/subset_util.cc
index 013a903..9e4e652 100644
--- a/sample/subsetter/subset_util.cc
+++ b/sample/subsetter/subset_util.cc
@@ -37,7 +37,7 @@
SubsetUtil::~SubsetUtil() {
}
-void SubsetUtil::subset(const char *input_file_path,
+void SubsetUtil::Subset(const char *input_file_path,
const char *output_file_path) {
UNREFERENCED_PARAMETER(output_file_path);
ByteVector input_buffer;
@@ -56,10 +56,10 @@
ByteArrayPtr ba = new MemoryByteArray(&(input_buffer[0]), file_size);
FontFactoryPtr factory;
- factory.attach(FontFactory::getInstance());
+ factory.Attach(FontFactory::GetInstance());
FontArray font_array;
- factory->loadFonts(ba, &font_array);
+ factory->LoadFonts(ba, &font_array);
if (font_array.empty() || font_array[0] == NULL)
return;
@@ -71,25 +71,25 @@
glyphs.push_back(10);
Ptr<Subsetter> subsetter = new Subsetter(font_array[0], factory);
- subsetter->setGlyphs(&glyphs);
+ subsetter->SetGlyphs(&glyphs);
IntegerSet remove_tables;
remove_tables.insert(Tag::DSIG);
- subsetter->setRemoveTables(&remove_tables);
+ subsetter->SetRemoveTables(&remove_tables);
FontBuilderPtr font_builder;
- font_builder.attach(subsetter->subset());
+ font_builder.Attach(subsetter->Subset());
FontPtr new_font;
- new_font.attach(font_builder->build());
+ new_font.Attach(font_builder->Build());
// TODO(arthurhsu): glyph renumbering/Loca table
// TODO(arthurhsu): alter CMaps
MemoryOutputStream output_stream;
- factory->serializeFont(new_font, &output_stream);
+ factory->SerializeFont(new_font, &output_stream);
FILE* output_file = fopen(output_file_path, "wb");
- fwrite(output_stream.get(), 1, output_stream.size(), output_file);
+ fwrite(output_stream.Get(), 1, output_stream.Size(), output_file);
fflush(output_file);
fclose(output_file);
}
diff --git a/sample/subsetter/subset_util.h b/sample/subsetter/subset_util.h
index bea28b8..109d63a 100644
--- a/sample/subsetter/subset_util.h
+++ b/sample/subsetter/subset_util.h
@@ -24,7 +24,7 @@
SubsetUtil();
virtual ~SubsetUtil();
- void subset(const char* input_file_path, const char* output_file_path);
+ void Subset(const char* input_file_path, const char* output_file_path);
};
} // namespace sfntly
diff --git a/sfntly/cmap_table.cc b/sfntly/cmap_table.cc
index 8cbc83e..668dc07 100644
--- a/sfntly/cmap_table.cc
+++ b/sfntly/cmap_table.cc
@@ -30,41 +30,43 @@
/******************************************************************************
* CMapTable class
******************************************************************************/
-CMapTable::CMapTable(Header* header, ReadableFontData* data)
- : Table(header, data) {}
CMapTable::~CMapTable() {}
-int32_t CMapTable::version() {
- return data_->readUShort(Offset::kVersion);
+int32_t CMapTable::Version() {
+ return data_->ReadUShort(Offset::kVersion);
}
-int32_t CMapTable::numCMaps() {
- return data_->readUShort(Offset::kNumTables);
+int32_t CMapTable::NumCMaps() {
+ return data_->ReadUShort(Offset::kNumTables);
}
-int32_t CMapTable::offsetForEncodingRecord(int32_t index) {
+CMapTable::CMapId CMapTable::GetCMapId(int32_t index) {
+ return CMapId(PlatformId(index), EncodingId(index));
+}
+
+int32_t CMapTable::PlatformId(int32_t index) {
+ return data_->ReadUShort(Offset::kEncodingRecordPlatformId +
+ OffsetForEncodingRecord(index));
+}
+
+int32_t CMapTable::EncodingId(int32_t index) {
+ return data_->ReadUShort(Offset::kEncodingRecordEncodingId +
+ OffsetForEncodingRecord(index));
+}
+
+int32_t CMapTable::Offset(int32_t index) {
+ return data_->ReadULongAsInt(Offset::kEncodingRecordOffset +
+ OffsetForEncodingRecord(index));
+}
+
+CMapTable::CMapTable(Header* header, ReadableFontData* data)
+ : Table(header, data) {
+}
+
+int32_t CMapTable::OffsetForEncodingRecord(int32_t index) {
return Offset::kEncodingRecordStart + index * Offset::kEncodingRecordSize;
}
-CMapTable::CMapId CMapTable::cmapId(int32_t index) {
- return CMapId(platformId(index), encodingId(index));
-}
-
-int32_t CMapTable::platformId(int32_t index) {
- return data_->readUShort(Offset::kEncodingRecordPlatformId +
- offsetForEncodingRecord(index));
-}
-
-int32_t CMapTable::encodingId(int32_t index) {
- return data_->readUShort(Offset::kEncodingRecordEncodingId +
- offsetForEncodingRecord(index));
-}
-
-int32_t CMapTable::offset(int32_t index) {
- return data_->readULongAsInt(Offset::kEncodingRecordOffset +
- offsetForEncodingRecord(index));
-}
-
/******************************************************************************
* CMapTable::CMapId class
******************************************************************************/
@@ -76,9 +78,6 @@
: platform_id_(obj.platform_id_), encoding_id_(obj.encoding_id_) {
}
-int32_t CMapTable::CMapId::platformId() { return platform_id_; }
-int32_t CMapTable::CMapId::encodingId() { return encoding_id_; }
-
bool CMapTable::CMapId::operator==(const CMapTable::CMapId& obj) {
return obj.platform_id_ == platform_id_ && obj.encoding_id_ == encoding_id_;
}
@@ -90,7 +89,7 @@
return *this;
}
-int CMapTable::CMapId::hashCode() const {
+int CMapTable::CMapId::HashCode() const {
return platform_id_ << 8 | encoding_id_;
}
@@ -106,7 +105,7 @@
bool CMapTable::CMapIdComparator::operator()(const CMapId& lhs,
const CMapId& rhs) {
- return lhs.hashCode() > rhs.hashCode();
+ return lhs.HashCode() > rhs.HashCode();
}
/******************************************************************************
@@ -117,101 +116,102 @@
: SubTable(data), format_(format), cmap_id_(cmap_id) {
}
-CMapTable::CMap::~CMap() {}
-int32_t CMapTable::CMap::format() { return format_; }
-CMapTable::CMapId CMapTable::CMap::cmapId() { return cmap_id_; }
-int32_t CMapTable::CMap::platformId() { return cmap_id_.platformId(); }
-int32_t CMapTable::CMap::encodingId() { return cmap_id_.encodingId(); }
+CMapTable::CMap::~CMap() {
+}
/******************************************************************************
* CMapTable::CMap::Builder class
******************************************************************************/
+CMapTable::CMap::Builder::~Builder() {
+}
+
+CALLER_ATTACH CMapTable::CMap::Builder*
+ CMapTable::CMap::Builder::GetBuilder(
+ FontDataTableBuilderContainer* container,
+ ReadableFontData* data,
+ int32_t offset,
+ const CMapId& cmap_id) {
+ // NOT IMPLEMENTED: Java enum value validation
+ int32_t format = data->ReadUShort(offset);
+ CMapBuilderPtr builder;
+ switch (format) {
+ case CMapFormat::kFormat0:
+ builder = new CMapFormat0::Builder(container, data, offset, cmap_id);
+ break;
+ case CMapFormat::kFormat2:
+ builder = new CMapFormat0::Builder(container, data, offset, cmap_id);
+ break;
+ default:
+ break;
+ }
+ return builder.Detach();
+}
+
CMapTable::CMap::Builder::Builder(FontDataTableBuilderContainer* container,
ReadableFontData* data, int32_t format,
const CMapId& cmap_id)
- : SubTable::Builder(container, data), format_(format), cmap_id_(cmap_id) {
+ : SubTable::Builder(container, data),
+ format_(format),
+ cmap_id_(cmap_id) {
}
CMapTable::CMap::Builder::Builder(FontDataTableBuilderContainer* container,
WritableFontData* data, int32_t format,
const CMapId& cmap_id)
- : SubTable::Builder(container, data), format_(format), cmap_id_(cmap_id) {
+ : SubTable::Builder(container, data),
+ format_(format),
+ cmap_id_(cmap_id) {
}
-CMapTable::CMap::Builder::~Builder() {}
-
-CMapTable::CMapId CMapTable::CMap::Builder::cmapId() {
- return cmap_id_;
+int32_t CMapTable::CMap::Builder::SubSerialize(WritableFontData* new_data) {
+ return InternalReadData()->CopyTo(new_data);
}
-int32_t CMapTable::CMap::Builder::platformId() {
- return cmap_id_.platformId();
-}
-
-int32_t CMapTable::CMap::Builder::encodingId() {
- return cmap_id_.encodingId();
-}
-
-int32_t CMapTable::CMap::Builder::subSerialize(WritableFontData* new_data) {
- return internalReadData()->copyTo(new_data);
-}
-
-bool CMapTable::CMap::Builder::subReadyToSerialize() {
+bool CMapTable::CMap::Builder::SubReadyToSerialize() {
return true;
}
-int32_t CMapTable::CMap::Builder::subDataSizeToSerialize() {
- return internalReadData()->length();
+int32_t CMapTable::CMap::Builder::SubDataSizeToSerialize() {
+ return InternalReadData()->Length();
}
-void CMapTable::CMap::Builder::subDataSet() {
+void CMapTable::CMap::Builder::SubDataSet() {
// NOP
}
-CALLER_ATTACH CMapTable::CMap::Builder* CMapTable::CMap::Builder::getBuilder(
- FontDataTableBuilderContainer* container, ReadableFontData* data,
- int32_t offset, const CMapId& cmap_id) {
- // NOT IMPLEMENTED: Java enum value validation
- int32_t format = data->readUShort(offset);
- CMapBuilderPtr builder;
- switch (format) {
- case CMapFormat::kFormat0:
- builder = new CMapFormat0::Builder(container, data, offset, cmap_id);
- case CMapFormat::kFormat2:
- builder = new CMapFormat0::Builder(container, data, offset, cmap_id);
- default:
- break;
- }
- return builder.detach();
+/******************************************************************************
+ * CMapTable::CMapFormat0
+ ******************************************************************************/
+CMapTable::CMapFormat0::~CMapFormat0() {
}
-/******************************************************************************
- * CMapTable::CMapFormat0 and CMapTable::CMapFormat0::Builder
- ******************************************************************************/
+int32_t CMapTable::CMapFormat0::Language() {
+ return 0;
+}
+
+int32_t CMapTable::CMapFormat0::GlyphId(int32_t character) {
+ if (character < 0 || character > 255) {
+ return CMapTable::NOTDEF;
+ }
+ return data_->ReadByte(character + Offset::kFormat0GlyphIdArray);
+}
+
CMapTable::CMapFormat0::CMapFormat0(ReadableFontData* data,
const CMapId& cmap_id)
: CMap(data, CMapFormat::kFormat0, cmap_id) {
}
-CMapTable::CMapFormat0::~CMapFormat0() {}
-
-int32_t CMapTable::CMapFormat0::glyphId(int32_t character) {
- if (character < 0 || character > 255) {
- return CMapTable::NOTDEF;
- }
- return data_->readByte(character + Offset::kFormat0GlyphIdArray);
-}
-
-int32_t CMapTable::CMapFormat0::language() {
- return 0;
-}
-
+/******************************************************************************
+ * CMapTable::CMapFormat0::Builder
+ ******************************************************************************/
CMapTable::CMapFormat0::Builder::Builder(
- FontDataTableBuilderContainer* container, WritableFontData* data,
- int32_t offset, const CMapId& cmap_id)
+ FontDataTableBuilderContainer* container,
+ WritableFontData* data,
+ int32_t offset,
+ const CMapId& cmap_id)
: CMapTable::CMap::Builder(container,
data ? down_cast<WritableFontData*>(
- data->slice(offset, data->readUShort(
+ data->Slice(offset, data->ReadUShort(
offset + Offset::kFormat0Length)))
: reinterpret_cast<WritableFontData*>(NULL),
CMapFormat::kFormat0, cmap_id) {
@@ -219,101 +219,68 @@
}
CMapTable::CMapFormat0::Builder::Builder(
- FontDataTableBuilderContainer* container, ReadableFontData* data,
- int32_t offset, const CMapId& cmap_id)
+ FontDataTableBuilderContainer* container,
+ ReadableFontData* data,
+ int32_t offset,
+ const CMapId& cmap_id)
: CMapTable::CMap::Builder(container,
data ? down_cast<ReadableFontData*>(
- data->slice(offset, data->readUShort(
+ data->Slice(offset, data->ReadUShort(
offset + Offset::kFormat0Length)))
: reinterpret_cast<WritableFontData*>(NULL),
CMapFormat::kFormat0, cmap_id) {
// TODO(arthurhsu): FIXIT: heavy lifting and leak, need fix.
}
-CMapTable::CMapFormat0::Builder::~Builder() {}
+CMapTable::CMapFormat0::Builder::~Builder() {
+}
-CALLER_ATTACH FontDataTable* CMapTable::CMapFormat0::Builder::subBuildTable(
- ReadableFontData* data) {
- FontDataTablePtr table = new CMapFormat0(data, cmapId());
- return table.detach();
+CALLER_ATTACH FontDataTable*
+ CMapTable::CMapFormat0::Builder::SubBuildTable(ReadableFontData* data) {
+ FontDataTablePtr table = new CMapFormat0(data, cmap_id());
+ return table.Detach();
}
/******************************************************************************
- * CMapTable::CMapFormat2 and CMapTable::CMapFormat2::Builder
+ * CMapTable::CMapFormat2
******************************************************************************/
-CMapTable::CMapFormat2::CMapFormat2(ReadableFontData* data,
- const CMapId& cmap_id)
- : CMap(data, CMapFormat::kFormat2, cmap_id) {
+CMapTable::CMapFormat2::~CMapFormat2() {
}
-CMapTable::CMapFormat2::~CMapFormat2() {}
-
-int32_t CMapTable::CMapFormat2::subHeaderOffset(int32_t sub_header_index) {
- return data_->readUShort(Offset::kFormat2SubHeaderKeys + sub_header_index *
- DataSize::kUSHORT);
+int32_t CMapTable::CMapFormat2::Language() {
+ return 0;
}
-int32_t CMapTable::CMapFormat2::firstCode(int32_t sub_header_index) {
- int32_t sub_header_offset = subHeaderOffset(sub_header_index);
- return data_->readUShort(sub_header_offset + Offset::kFormat2SubHeaderKeys +
- Offset::kFormat2SubHeader_firstCode);
-}
-
-int32_t CMapTable::CMapFormat2::entryCount(int32_t sub_header_index) {
- int32_t sub_header_offset = subHeaderOffset(sub_header_index);
- return data_->readUShort(sub_header_offset + Offset::kFormat2SubHeaderKeys +
- Offset::kFormat2SubHeader_entryCount);
-}
-
-int32_t CMapTable::CMapFormat2::idRangeOffset(int32_t sub_header_index) {
- int32_t sub_header_offset = subHeaderOffset(sub_header_index);
- return data_->readUShort(sub_header_offset + Offset::kFormat2SubHeaderKeys +
- Offset::kFormat2SubHeader_idRangeOffset);
-}
-
-int32_t CMapTable::CMapFormat2::idDelta(int32_t sub_header_index) {
- int32_t sub_header_offset = subHeaderOffset(sub_header_index);
- return data_->readUShort(sub_header_offset + Offset::kFormat2SubHeaderKeys +
- Offset::kFormat2SubHeader_idDelta);
-}
-
-int32_t CMapTable::CMapFormat2::bytesConsumed(int32_t character) {
- uint32_t c = toBE32(character);
- int32_t high_byte = (c >> 8) & 0xff;
- int32_t offset = subHeaderOffset(high_byte);
- return (offset == 0) ? 1 : 2;
-}
-
-int32_t CMapTable::CMapFormat2::glyphId(int32_t character) {
+int32_t CMapTable::CMapFormat2::GlyphId(int32_t character) {
if (character > 0xffff) {
return CMapTable::NOTDEF;
}
- uint32_t c = toBE32(character);
+ uint32_t c = ToBE32(character);
byte_t high_byte = (c >> 8) & 0xff;
byte_t low_byte = c & 0xff;
- int32_t offset = subHeaderOffset(high_byte);
+ int32_t offset = SubHeaderOffset(high_byte);
if (offset == 0) {
low_byte = high_byte;
high_byte = 0;
}
- int32_t first_code = firstCode(high_byte);
- int32_t entry_count = entryCount(high_byte);
+ int32_t first_code = FirstCode(high_byte);
+ int32_t entry_count = EntryCount(high_byte);
if (low_byte < first_code || low_byte >= first_code + entry_count) {
return CMapTable::NOTDEF;
}
- int32_t id_range_offset = idRangeOffset(high_byte);
+ int32_t id_range_offset = IdRangeOffset(high_byte);
// position of idRangeOffset + value of idRangeOffset + index for low byte
// = firstcode
int32_t p_location = (offset + Offset::kFormat2SubHeader_idRangeOffset) +
id_range_offset +
(low_byte - first_code) * DataSize::kUSHORT;
- int p = data_->readUShort(p_location);
+ int p = data_->ReadUShort(p_location);
if (p == 0) {
return CMapTable::NOTDEF;
}
@@ -321,20 +288,66 @@
if (offset == 0) {
return p;
}
- int id_delta = idDelta(high_byte);
+ int id_delta = IdDelta(high_byte);
return (p + id_delta) % 65536;
}
-int32_t CMapTable::CMapFormat2::language() {
- return 0;
+int32_t CMapTable::CMapFormat2::BytesConsumed(int32_t character) {
+ uint32_t c = ToBE32(character);
+ int32_t high_byte = (c >> 8) & 0xff;
+ int32_t offset = SubHeaderOffset(high_byte);
+ return (offset == 0) ? 1 : 2;
}
+CMapTable::CMapFormat2::CMapFormat2(ReadableFontData* data,
+ const CMapId& cmap_id)
+ : CMap(data, CMapFormat::kFormat2, cmap_id) {
+}
+
+int32_t CMapTable::CMapFormat2::SubHeaderOffset(int32_t sub_header_index) {
+ return data_->ReadUShort(Offset::kFormat2SubHeaderKeys +
+ sub_header_index * DataSize::kUSHORT);
+}
+
+int32_t CMapTable::CMapFormat2::FirstCode(int32_t sub_header_index) {
+ int32_t sub_header_offset = SubHeaderOffset(sub_header_index);
+ return data_->ReadUShort(sub_header_offset +
+ Offset::kFormat2SubHeaderKeys +
+ Offset::kFormat2SubHeader_firstCode);
+}
+
+int32_t CMapTable::CMapFormat2::EntryCount(int32_t sub_header_index) {
+ int32_t sub_header_offset = SubHeaderOffset(sub_header_index);
+ return data_->ReadUShort(sub_header_offset +
+ Offset::kFormat2SubHeaderKeys +
+ Offset::kFormat2SubHeader_entryCount);
+}
+
+int32_t CMapTable::CMapFormat2::IdRangeOffset(int32_t sub_header_index) {
+ int32_t sub_header_offset = SubHeaderOffset(sub_header_index);
+ return data_->ReadUShort(sub_header_offset +
+ Offset::kFormat2SubHeaderKeys +
+ Offset::kFormat2SubHeader_idRangeOffset);
+}
+
+int32_t CMapTable::CMapFormat2::IdDelta(int32_t sub_header_index) {
+ int32_t sub_header_offset = SubHeaderOffset(sub_header_index);
+ return data_->ReadUShort(sub_header_offset +
+ Offset::kFormat2SubHeaderKeys +
+ Offset::kFormat2SubHeader_idDelta);
+}
+
+/******************************************************************************
+ * CMapTable::CMapFormat2::Builder
+ ******************************************************************************/
CMapTable::CMapFormat2::Builder::Builder(
- FontDataTableBuilderContainer* container, WritableFontData* data,
- int32_t offset, const CMapId& cmap_id)
+ FontDataTableBuilderContainer* container,
+ WritableFontData* data,
+ int32_t offset,
+ const CMapId& cmap_id)
: CMapTable::CMap::Builder(container,
data ? down_cast<WritableFontData*>(
- data->slice(offset, data->readUShort(
+ data->Slice(offset, data->ReadUShort(
offset + Offset::kFormat0Length)))
: reinterpret_cast<WritableFontData*>(NULL),
CMapFormat::kFormat2, cmap_id) {
@@ -342,23 +355,26 @@
}
CMapTable::CMapFormat2::Builder::Builder(
- FontDataTableBuilderContainer* container, ReadableFontData* data,
- int32_t offset, const CMapId& cmap_id)
+ FontDataTableBuilderContainer* container,
+ ReadableFontData* data,
+ int32_t offset,
+ const CMapId& cmap_id)
: CMapTable::CMap::Builder(container,
data ? down_cast<ReadableFontData*>(
- data->slice(offset, data->readUShort(
+ data->Slice(offset, data->ReadUShort(
offset + Offset::kFormat0Length)))
: reinterpret_cast<ReadableFontData*>(NULL),
CMapFormat::kFormat2, cmap_id) {
// TODO(arthurhsu): FIXIT: heavy lifting and leak, need fix.
}
-CMapTable::CMapFormat2::Builder::~Builder() {}
+CMapTable::CMapFormat2::Builder::~Builder() {
+}
-CALLER_ATTACH FontDataTable* CMapTable::CMapFormat2::Builder::subBuildTable(
- ReadableFontData* data) {
- FontDataTablePtr table = new CMapFormat2(data, cmapId());
- return table.detach();
+CALLER_ATTACH FontDataTable*
+ CMapTable::CMapFormat2::Builder::SubBuildTable(ReadableFontData* data) {
+ FontDataTablePtr table = new CMapFormat2(data, cmap_id());
+ return table.Detach();
}
/******************************************************************************
@@ -367,16 +383,16 @@
CMapTable::CMapIterator::CMapIterator(CMapTable* table, CMapFilter* filter)
: table_index_(0), filter_(filter), table_(table) {}
-bool CMapTable::CMapIterator::hasNext() {
+bool CMapTable::CMapIterator::HasNext() {
if (!filter_) {
- if (table_index_ < table_->numCMaps()) {
+ if (table_index_ < table_->NumCMaps()) {
return true;
}
return false;
}
- for (; table_index_ < table_->numCMaps(); ++table_index_) {
- if (filter_->accept(table_->cmapId(table_index_))) {
+ for (; table_index_ < table_->NumCMaps(); ++table_index_) {
+ if (filter_->accept(table_->GetCMapId(table_index_))) {
return true;
}
}
@@ -387,105 +403,109 @@
* CMapTable::Builder class
******************************************************************************/
CMapTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
- Header* header, WritableFontData* data)
+ Header* header,
+ WritableFontData* data)
: Table::ArrayElementTableBuilder(font_builder, header, data) {
}
CMapTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
- Header* header, ReadableFontData* data)
+ Header* header,
+ ReadableFontData* data)
: Table::ArrayElementTableBuilder(font_builder, header, data) {
}
-int32_t CMapTable::Builder::subSerialize(WritableFontData* new_data) {
- int32_t size = new_data->writeUShort(CMapTable::Offset::kVersion,
+CMapTable::Builder::~Builder() {
+}
+
+int32_t CMapTable::Builder::SubSerialize(WritableFontData* new_data) {
+ int32_t size = new_data->WriteUShort(CMapTable::Offset::kVersion,
version_);
- size += new_data->writeUShort(CMapTable::Offset::kNumTables,
+ size += new_data->WriteUShort(CMapTable::Offset::kNumTables,
cmap_builders_.size());
int32_t index_offset = size;
size += cmap_builders_.size() * CMapTable::Offset::kEncodingRecordSize;
for (CMapBuilderMap::iterator it = cmap_builders_.begin(),
- e = cmap_builders_.end(); it != e; ++it) {
+ e = cmap_builders_.end(); it != e; ++it) {
CMapBuilderPtr b = it->second;
// header entry
- index_offset += new_data->writeUShort(index_offset, b->platformId());
- index_offset += new_data->writeUShort(index_offset, b->encodingId());
- index_offset += new_data->writeULong(index_offset, size);
+ index_offset += new_data->WriteUShort(index_offset, b->platform_id());
+ index_offset += new_data->WriteUShort(index_offset, b->encoding_id());
+ index_offset += new_data->WriteULong(index_offset, size);
// cmap
FontDataPtr slice;
- slice.attach(new_data->slice(size));
- size +=
- b->subSerialize(down_cast<WritableFontData*>(slice.p_));
+ slice.Attach(new_data->Slice(size));
+ size += b->SubSerialize(down_cast<WritableFontData*>(slice.p_));
}
return size;
}
-bool CMapTable::Builder::subReadyToSerialize() {
+bool CMapTable::Builder::SubReadyToSerialize() {
if (cmap_builders_.empty())
return false;
// check each table
for (CMapBuilderMap::iterator it = cmap_builders_.begin(),
- e = cmap_builders_.end(); it != e; ++it) {
- if (!it->second->subReadyToSerialize())
+ e = cmap_builders_.end(); it != e; ++it) {
+ if (!it->second->SubReadyToSerialize())
return false;
}
return true;
}
-int32_t CMapTable::Builder::subDataSizeToSerialize() {
+int32_t CMapTable::Builder::SubDataSizeToSerialize() {
if (cmap_builders_.empty())
return 0;
bool variable = false;
int32_t size = CMapTable::Offset::kEncodingRecordStart +
- cmap_builders_.size() * CMapTable::Offset::kEncodingRecordSize;
+ cmap_builders_.size() * CMapTable::Offset::kEncodingRecordSize;
// calculate size of each table
for (CMapBuilderMap::iterator it = cmap_builders_.begin(),
- e = cmap_builders_.end(); it != e; ++it) {
- int32_t cmap_size = it->second->subDataSizeToSerialize();
+ e = cmap_builders_.end(); it != e; ++it) {
+ int32_t cmap_size = it->second->SubDataSizeToSerialize();
size += abs(cmap_size);
variable |= cmap_size <= 0;
}
return variable ? -size : size;
}
-void CMapTable::Builder::subDataSet() {
+void CMapTable::Builder::SubDataSet() {
cmap_builders_.clear();
- Table::Builder::setModelChanged(false);
+ Table::Builder::set_model_changed(false);
}
-CALLER_ATTACH FontDataTable* CMapTable::Builder::subBuildTable(
- ReadableFontData* data) {
+CALLER_ATTACH FontDataTable*
+ CMapTable::Builder::SubBuildTable(ReadableFontData* data) {
FontDataTablePtr table = new CMapTable(header(), data);
- return table.detach();
+ return table.Detach();
}
-CALLER_ATTACH CMapTable::CMap::Builder* CMapTable::Builder::cmapBuilder(
+CALLER_ATTACH CMapTable::CMap::Builder* CMapTable::Builder::CMapBuilder(
FontDataTableBuilderContainer* container, ReadableFontData* data,
int32_t index) {
- if (index < 0 || index > numCMaps(data))
+ if (index < 0 || index > NumCMaps(data))
return NULL;
int32_t record_offset = Offset::kEncodingRecordOffset + index *
Offset::kEncodingRecordSize;
- int32_t platform_id = data->readUShort(Offset::kEncodingRecordPlatformId +
- record_offset);
- int32_t encoding_id = data->readUShort(Offset::kEncodingRecordEncodingId +
- record_offset);
+ int32_t platform_id =
+ data->ReadUShort(Offset::kEncodingRecordPlatformId + record_offset);
+ int32_t encoding_id =
+ data->ReadUShort(Offset::kEncodingRecordEncodingId + record_offset);
CMapId cmap_id(platform_id, encoding_id);
- int32_t offset = data->readULongAsInt(Offset::kEncodingRecordOffset +
- record_offset);
- return CMap::Builder::getBuilder(container, data, offset, cmap_id);
+ int32_t offset =
+ data->ReadULongAsInt(Offset::kEncodingRecordOffset + record_offset);
+ return CMap::Builder::GetBuilder(container, data, offset, cmap_id);
}
-int32_t CMapTable::Builder::numCMaps(ReadableFontData* data) {
+int32_t CMapTable::Builder::NumCMaps(ReadableFontData* data) {
if (data == NULL) {
return 0;
}
- return data->readUShort(Offset::kNumTables);
+ return data->ReadUShort(Offset::kNumTables);
}
} // namespace sfntly
diff --git a/sfntly/cmap_table.h b/sfntly/cmap_table.h
index a102b82..cdbcad8 100644
--- a/sfntly/cmap_table.h
+++ b/sfntly/cmap_table.h
@@ -44,6 +44,268 @@
// A CMap table
class CMapTable : public Table, public RefCounted<CMapTable> {
+public:
+ // CMapTable::CMapId
+ class CMapId {
+ public:
+ CMapId(int32_t platform_id, int32_t encoding_id);
+ CMapId(const CMapId& obj);
+
+ int32_t platform_id() { return platform_id_; }
+ int32_t encoding_id() { return encoding_id_; }
+
+ bool operator==(const CMapId& obj);
+ const CMapId& operator=(const CMapId& obj);
+ int HashCode() const;
+
+ friend class CMapIdComparator;
+
+ private:
+ int32_t platform_id_;
+ int32_t encoding_id_;
+ };
+ static CMapId WINDOWS_BMP;
+ static CMapId WINDOWS_UCS4;
+ static CMapId MAC_ROMAN;
+
+ // CMapTable::CMapIdComparator
+ class CMapIdComparator {
+ public:
+ bool operator()(const CMapId& lhs, const CMapId& rhs);
+ };
+
+ // A filter on cmap
+ // CMapTable::CMapFilter
+ class CMapFilter {
+ public:
+ // Test on whether the cmap is acceptable or not
+ // @param cmap_id the id of the cmap
+ // @return true if the cmap is acceptable; false otherwise
+ virtual bool accept(CMapId cmap_id) = 0;
+ // Make gcc -Wnon-virtual-dtor happy.
+ virtual ~CMapFilter() {}
+ };
+
+ // The abstract base class for all cmaps.
+ //
+ // CMap equality is based on the equality of the (@link {@link CMapId} that
+ // defines the CMap. In the cmap table for a font there can only be one cmap
+ // with a given cmap id (pair of platform and encoding ids) no matter what the
+ // type of the cmap is.
+ //
+ // The cmap implements {@code Iterable<Integer>} to allow iteration over
+ // characters that are mapped by the cmap. This iteration mostly returns the
+ // characters mapped by the cmap. It will return all characters mapped by the
+ // cmap to anything but .notdef <b>but</b> it may return some that are not
+ // mapped or are mapped to .notdef. Various cmap tables provide ranges and
+ // such to describe characters for lookup but without going the full way to
+ // mapping to the glyph id it isn't always possible to tell if a character
+ // will end up with a valid glyph id. So, some of the characters returned from
+ // the iterator may still end up pointing to the .notdef glyph. However, the
+ // number of such characters should be small in most cases with well designed
+ // cmaps.
+ class Builder;
+ class CMap : public SubTable {
+ public:
+ // CMapTable::CMap::Builder
+ class Builder : public SubTable::Builder {
+ public:
+ virtual ~Builder();
+
+ CALLER_ATTACH static Builder*
+ GetBuilder(FontDataTableBuilderContainer* container,
+ ReadableFontData* data,
+ int32_t offset,
+ const CMapId& cmap_id);
+
+ // Note: yes, an object is returned on stack since it's small enough.
+ virtual CMapId cmap_id() { return cmap_id_; }
+ virtual int32_t platform_id() { return cmap_id_.platform_id(); }
+ virtual int32_t encoding_id() { return cmap_id_.encoding_id(); }
+
+ protected:
+ Builder(FontDataTableBuilderContainer* container,
+ ReadableFontData* data,
+ int32_t format,
+ const CMapId& cmap_id);
+ Builder(FontDataTableBuilderContainer* container,
+ WritableFontData* data,
+ int32_t format,
+ const CMapId& cmap_id);
+
+ virtual int32_t SubSerialize(WritableFontData* new_data);
+ virtual bool SubReadyToSerialize();
+ virtual int32_t SubDataSizeToSerialize();
+ virtual void SubDataSet();
+
+ private:
+ int32_t format_;
+ CMapId cmap_id_;
+
+ friend class CMapTable::Builder;
+ };
+
+ CMap(ReadableFontData* data, int32_t format, const CMapId& cmap_id);
+ virtual ~CMap();
+ virtual int32_t format() { return format_; }
+ virtual CMapId cmap_id() { return cmap_id_; }
+ virtual int32_t platform_id() { return cmap_id_.platform_id(); }
+ virtual int32_t encoding_id() { return cmap_id_.encoding_id(); }
+
+ // Get the language of the cmap.
+ //
+ // Note on the language field in 'cmap' subtables: The language field must
+ // be set to zero for all cmap subtables whose platform IDs are other than
+ // Macintosh (platform ID 1). For cmap subtables whose platform IDs are
+ // Macintosh, set this field to the Macintosh language ID of the cmap
+ // subtable plus one, or to zero if the cmap subtable is not
+ // language-specific. For example, a Mac OS Turkish cmap subtable must set
+ // this field to 18, since the Macintosh language ID for Turkish is 17. A
+ // Mac OS Roman cmap subtable must set this field to 0, since Mac OS Roman
+ // is not a language-specific encoding.
+ //
+ // @return the language id
+ virtual int32_t Language() = 0;
+
+ // Gets the glyph id for the character code provided.
+ // The character code provided must be in the encoding used by the cmap
+ // table.
+ virtual int32_t GlyphId(int32_t character) = 0;
+
+ private:
+ int32_t format_;
+ CMapId cmap_id_;
+ };
+ typedef Ptr<CMap::Builder> CMapBuilderPtr;
+ typedef std::map<CMapId, CMapBuilderPtr, CMapIdComparator> CMapBuilderMap;
+
+ // A cmap format 0 sub table
+ class CMapFormat0 : public CMap, public RefCounted<CMapFormat0> {
+ public:
+ // CMapTable::CMapFormat0::Builder
+ class Builder : public CMap::Builder,
+ public RefCounted<Builder> {
+ public:
+ Builder(FontDataTableBuilderContainer* container,
+ ReadableFontData* data,
+ int32_t offset,
+ const CMapId& cmap_id);
+ Builder(FontDataTableBuilderContainer* container,
+ WritableFontData* data,
+ int32_t offset,
+ const CMapId& cmap_id);
+ virtual ~Builder();
+
+ protected:
+ virtual CALLER_ATTACH FontDataTable*
+ SubBuildTable(ReadableFontData* data);
+ };
+
+ virtual ~CMapFormat0();
+ virtual int32_t Language();
+ virtual int32_t GlyphId(int32_t character);
+
+ private:
+ CMapFormat0(ReadableFontData* data, const CMapId& cmap_id);
+ };
+
+ // A cmap format 2 sub table
+ // The format 2 cmap is used for multi-byte encodings such as SJIS,
+ // EUC-JP/KR/CN, Big5, etc.
+ class CMapFormat2 : public CMap, public RefCounted<CMapFormat2> {
+ public:
+ // CMapTable::CMapFormat2::Builder
+ class Builder : public CMap::Builder,
+ public RefCounted<Builder> {
+ public:
+ Builder(FontDataTableBuilderContainer* container,
+ ReadableFontData* data,
+ int32_t offset,
+ const CMapId& cmap_id);
+ Builder(FontDataTableBuilderContainer* container,
+ WritableFontData* data,
+ int32_t offset,
+ const CMapId& cmap_id);
+ virtual ~Builder();
+
+ protected:
+ virtual CALLER_ATTACH FontDataTable*
+ SubBuildTable(ReadableFontData* data);
+ };
+
+ virtual ~CMapFormat2();
+ virtual int32_t Language();
+ virtual int32_t GlyphId(int32_t character);
+
+ // Returns how many bytes would be consumed by a lookup of this character
+ // with this cmap. This comes about because the cmap format 2 table is
+ // designed around multi-byte encodings such as SJIS, EUC-JP, Big5, etc.
+ // return the number of bytes consumed from this "character" - either 1 or 2
+ virtual int32_t BytesConsumed(int32_t character);
+
+ private:
+ CMapFormat2(ReadableFontData* data, const CMapId& cmap_id);
+
+ int32_t SubHeaderOffset(int32_t sub_header_index);
+ int32_t FirstCode(int32_t sub_header_index);
+ int32_t EntryCount(int32_t sub_header_index);
+ int32_t IdRangeOffset(int32_t sub_header_index);
+ int32_t IdDelta(int32_t sub_header_index);
+ };
+
+ // CMapTable::Builder
+ class Builder : public Table::ArrayElementTableBuilder,
+ public RefCounted<Builder> {
+ public:
+ // Constructor scope altered to public because C++ does not allow base
+ // class to instantiate derived class with protected constructors.
+ Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data);
+ Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data);
+ virtual ~Builder();
+
+ virtual int32_t SubSerialize(WritableFontData* new_data);
+ virtual bool SubReadyToSerialize();
+ virtual int32_t SubDataSizeToSerialize();
+ virtual void SubDataSet();
+ virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+
+ protected:
+ static CALLER_ATTACH CMap::Builder*
+ CMapBuilder(FontDataTableBuilderContainer* container,
+ ReadableFontData* data,
+ int32_t index);
+
+ private:
+ static int32_t NumCMaps(ReadableFontData* data);
+
+ int32_t version_;
+ CMapBuilderMap cmap_builders_;
+ };
+
+ virtual ~CMapTable();
+
+ // Get the table version.
+ virtual int32_t Version();
+
+ // Get the number of cmaps within the CMap table.
+ virtual int32_t NumCMaps();
+
+ // Get the cmap id for the cmap with the given index.
+ // Note: yes, an object is returned on stack since it's small enough.
+ // This function is renamed from cmapId to GetCMapId().
+ virtual CMapId GetCMapId(int32_t index);
+
+ virtual int32_t PlatformId(int32_t index);
+ virtual int32_t EncodingId(int32_t index);
+
+ // Get the offset in the table data for the cmap table with the given index.
+ // The offset is from the beginning of the table.
+ virtual int32_t Offset(int32_t index);
+
private:
static const int32_t NOTDEF;
@@ -158,238 +420,12 @@
};
};
- public:
- // CMapTable::CMapId
- class CMapId {
- public:
- CMapId(int32_t platform_id, int32_t encoding_id);
- CMapId(const CMapId& obj);
- int32_t platformId();
- int32_t encodingId();
- bool operator==(const CMapId& obj);
- const CMapId& operator=(const CMapId& obj);
- int hashCode() const;
-
- friend class CMapIdComparator;
-
- private:
- int32_t platform_id_;
- int32_t encoding_id_;
- };
- static CMapId WINDOWS_BMP;
- static CMapId WINDOWS_UCS4;
- static CMapId MAC_ROMAN;
-
- // CMapTable::CMapIdComparator
- class CMapIdComparator {
- public:
- bool operator()(const CMapId& lhs, const CMapId& rhs);
- };
-
- // A filter on cmap
- // CMapTable::CMapFilter
- class CMapFilter {
- public:
- // Test on whether the cmap is acceptable or not
- // @param cmap_id the id of the cmap
- // @return true if the cmap is acceptable; false otherwise
- virtual bool accept(CMapId cmap_id) = 0;
- // Make gcc -Wnon-virtual-dtor happy.
- virtual ~CMapFilter() {}
- };
-
- // The abstract base class for all cmaps.
- //
- // CMap equality is based on the equality of the (@link {@link CMapId} that
- // defines the CMap. In the cmap table for a font there can only be one cmap
- // with a given cmap id (pair of platform and encoding ids) no matter what the
- // type of the cmap is.
- //
- // The cmap implements {@code Iterable<Integer>} to allow iteration over
- // characters that are mapped by the cmap. This iteration mostly returns the
- // characters mapped by the cmap. It will return all characters mapped by the
- // cmap to anything but .notdef <b>but</b> it may return some that are not
- // mapped or are mapped to .notdef. Various cmap tables provide ranges and
- // such to describe characters for lookup but without going the full way to
- // mapping to the glyph id it isn't always possible to tell if a character
- // will end up with a valid glyph id. So, some of the characters returned from
- // the iterator may still end up pointing to the .notdef glyph. However, the
- // number of such characters should be small in most cases with well designed
- // cmaps.
- class Builder;
- class CMap : public SubTable {
- public:
- CMap(ReadableFontData* data, int32_t format, const CMapId& cmap_id);
- virtual ~CMap();
- virtual int32_t format();
- virtual CMapId cmapId();
- virtual int32_t platformId();
- virtual int32_t encodingId();
-
- // Get the language of the cmap.
- //
- // Note on the language field in 'cmap' subtables: The language field must
- // be set to zero for all cmap subtables whose platform IDs are other than
- // Macintosh (platform ID 1). For cmap subtables whose platform IDs are
- // Macintosh, set this field to the Macintosh language ID of the cmap
- // subtable plus one, or to zero if the cmap subtable is not
- // language-specific. For example, a Mac OS Turkish cmap subtable must set
- // this field to 18, since the Macintosh language ID for Turkish is 17. A
- // Mac OS Roman cmap subtable must set this field to 0, since Mac OS Roman
- // is not a language-specific encoding.
- //
- // @return the language id
- virtual int32_t language() = 0;
-
- // Gets the glyph id for the character code provided.
- // The character code provided must be in the encoding used by the cmap
- // table.
- virtual int32_t glyphId(int32_t character) = 0;
-
- public:
- // CMapTable::CMap::Builder
- class Builder : public SubTable::Builder {
- public:
- friend class CMapTable::Builder;
-
- protected:
- Builder(FontDataTableBuilderContainer* container, ReadableFontData* data,
- int32_t format, const CMapId& cmap_id);
- Builder(FontDataTableBuilderContainer* container, WritableFontData* data,
- int32_t format, const CMapId& cmap_id);
-
- public:
- virtual ~Builder();
- CALLER_ATTACH static Builder*
- getBuilder(FontDataTableBuilderContainer* container,
- ReadableFontData* data, int32_t offset,
- const CMapId& cmap_id);
-
- // Note: yes, an object is returned on stack since it's small enough.
- virtual CMapId cmapId();
- virtual int32_t platformId();
- virtual int32_t encodingId();
-
- protected:
- virtual int32_t subSerialize(WritableFontData* new_data);
- virtual bool subReadyToSerialize();
- virtual int32_t subDataSizeToSerialize();
- virtual void subDataSet();
-
- private:
- int32_t format_;
- CMapId cmap_id_;
- };
-
- private:
- int32_t format_;
- CMapId cmap_id_;
- };
- typedef Ptr<CMap::Builder> CMapBuilderPtr;
- typedef std::map<CMapId, CMapBuilderPtr, CMapIdComparator> CMapBuilderMap;
-
- // A cmap format 0 sub table
- class CMapFormat0 : public CMap, public RefCounted<CMapFormat0> {
- protected:
- CMapFormat0(ReadableFontData* data, const CMapId& cmap_id);
-
- public:
- virtual ~CMapFormat0();
- virtual int32_t language();
- virtual int32_t glyphId(int32_t character);
-
- // CMapTable::CMapFormat0::Builder
- class Builder : public CMap::Builder,
- public RefCounted<Builder> {
- public:
- Builder(FontDataTableBuilderContainer* container, ReadableFontData* data,
- int32_t offset, const CMapId& cmap_id);
- Builder(FontDataTableBuilderContainer* container, WritableFontData* data,
- int32_t offset, const CMapId& cmap_id);
- virtual ~Builder();
- protected:
- virtual CALLER_ATTACH FontDataTable*
- subBuildTable(ReadableFontData* data);
- };
- };
-
- // A cmap format 2 sub table
- // The format 2 cmap is used for multi-byte encodings such as SJIS,
- // EUC-JP/KR/CN, Big5, etc.
- class CMapFormat2 : public CMap, public RefCounted<CMapFormat2> {
- protected:
- CMapFormat2(ReadableFontData* data, const CMapId& cmap_id);
-
- public:
- virtual ~CMapFormat2();
- virtual int32_t language();
- virtual int32_t glyphId(int32_t character);
-
- // Returns how many bytes would be consumed by a lookup of this character
- // with this cmap. This comes about because the cmap format 2 table is
- // designed around multi-byte encodings such as SJIS, EUC-JP, Big5, etc.
- // return the number of bytes consumed from this "character" - either 1 or 2
- virtual int32_t bytesConsumed(int32_t character);
-
- private:
- int32_t subHeaderOffset(int32_t sub_header_index);
- int32_t firstCode(int32_t sub_header_index);
- int32_t entryCount(int32_t sub_header_index);
- int32_t idRangeOffset(int32_t sub_header_index);
- int32_t idDelta(int32_t sub_header_index);
-
- // CMapTable::CMapFormat2::Builder
- class Builder : public CMap::Builder,
- public RefCounted<Builder> {
- public:
- Builder(FontDataTableBuilderContainer* container, ReadableFontData* data,
- int32_t offset, const CMapId& cmap_id);
- Builder(FontDataTableBuilderContainer* container, WritableFontData* data,
- int32_t offset, const CMapId& cmap_id);
- virtual ~Builder();
- protected:
- virtual CALLER_ATTACH FontDataTable*
- subBuildTable(ReadableFontData* data);
- };
- };
-
- // CMapTable::Builder
- class Builder : public Table::ArrayElementTableBuilder,
- public RefCounted<Builder> {
- public:
- // Constructor scope altered to public because C++ does not allow base
- // class to instantiate derived class with protected constructors.
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* data);
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
- ReadableFontData* data);
-
- virtual int32_t subSerialize(WritableFontData* new_data);
- virtual bool subReadyToSerialize();
- virtual int32_t subDataSizeToSerialize();
- virtual void subDataSet();
- virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
-
- protected:
- static CALLER_ATTACH CMap::Builder* cmapBuilder(
- FontDataTableBuilderContainer* container, ReadableFontData* data,
- int32_t index);
-
- private:
- static int32_t numCMaps(ReadableFontData* data);
-
- private:
- int32_t version_;
- CMapBuilderMap cmap_builders_;
- };
-
- private:
class CMapIterator {
public:
// If filter is NULL, filter through all tables.
CMapIterator(CMapTable* table, CMapFilter* filter);
- bool hasNext();
- CMap* next();
+ bool HasNext();
+ CMap* Next();
private:
int32_t table_index_;
@@ -397,33 +433,11 @@
CMapTable* table_;
};
- private:
CMapTable(Header* header, ReadableFontData* data);
- public:
- virtual ~CMapTable();
-
- // Get the table version.
- virtual int32_t version();
-
- // Get the number of cmaps within the CMap table.
- virtual int32_t numCMaps();
-
- // Get the cmap id for the cmap with the given index.
- // Note: yes, an object is returned on stack since it's small enough.
- virtual CMapId cmapId(int32_t index);
-
- virtual int32_t platformId(int32_t index);
- virtual int32_t encodingId(int32_t index);
-
- // Get the offset in the table data for the cmap table with the given index.
- // The offset is from the beginning of the table.
- virtual int32_t offset(int32_t index);
-
- private:
// Get the offset in the table data for the encoding record for the cmap with
// the given index. The offset is from the beginning of the table.
- int32_t offsetForEncodingRecord(int32_t index);
+ int32_t OffsetForEncodingRecord(int32_t index);
};
typedef std::vector<CMapTable::CMapId> CMapIdList;
typedef Ptr<CMapTable> CMapTablePtr;
diff --git a/sfntly/data/byte_array.cc b/sfntly/data/byte_array.cc
index b8c3717..5502185 100644
--- a/sfntly/data/byte_array.cc
+++ b/sfntly/data/byte_array.cc
@@ -14,52 +14,38 @@
* limitations under the License.
*/
+#include "sfntly/data/byte_array.h"
+
#include <algorithm>
-#include "sfntly/data/byte_array.h"
#include "sfntly/port/exception_type.h"
namespace sfntly {
const int32_t ByteArray::COPY_BUFFER_SIZE = 8192;
-void ByteArray::init(int32_t filled_length, int32_t storage_length,
- bool growable) {
- storage_length_ = storage_length;
- growable_ = growable;
- setFilledLength(filled_length);
-}
-
-ByteArray::ByteArray(int32_t filled_length, int32_t storage_length,
- bool growable) {
- init(filled_length, storage_length, growable);
-}
-
-ByteArray::ByteArray(int32_t filled_length, int32_t storage_length) {
- init(filled_length, storage_length, false);
-}
-
ByteArray::~ByteArray() {}
-int32_t ByteArray::length() { return filled_length_; }
-int32_t ByteArray::size() { return storage_length_; }
-bool ByteArray::growable() { return growable_; }
+int32_t ByteArray::Length() { return filled_length_; }
+int32_t ByteArray::Size() { return storage_length_; }
-int32_t ByteArray::setFilledLength(int32_t filled_length) {
+int32_t ByteArray::SetFilledLength(int32_t filled_length) {
filled_length_ = std::min<int32_t>(filled_length, storage_length_);
return filled_length_;
}
-byte_t ByteArray::get(int32_t index) {
- return internalGet(index);
+byte_t ByteArray::Get(int32_t index) {
+ return InternalGet(index);
}
-int32_t ByteArray::get(int32_t index, ByteVector* b) {
+int32_t ByteArray::Get(int32_t index, ByteVector* b) {
assert(b);
- return get(index, b, 0, b->size());
+ return Get(index, b, 0, b->size());
}
-int32_t ByteArray::get(int32_t index, ByteVector* b, int32_t offset,
+int32_t ByteArray::Get(int32_t index,
+ ByteVector* b,
+ int32_t offset,
int32_t length) {
assert(b);
if (index < 0 || index >= filled_length_) {
@@ -69,47 +55,49 @@
if (actual_length < 0) {
return -1;
}
- return internalGet(index, b, offset, actual_length);
+ return InternalGet(index, b, offset, actual_length);
}
-bool ByteArray::put(int32_t index, byte_t b) {
- if (index < 0 || index >= size()) {
+bool ByteArray::Put(int32_t index, byte_t b) {
+ if (index < 0 || index >= Size()) {
return false;
}
- bool result = internalPut(index, b);
+ bool result = InternalPut(index, b);
filled_length_ = std::max<int32_t>(filled_length_, index + 1);
return result;
}
-int32_t ByteArray::put(int index, ByteVector* b) {
+int32_t ByteArray::Put(int index, ByteVector* b) {
assert(b);
- return put(index, b, 0, b->size());
+ return Put(index, b, 0, b->size());
}
-int32_t ByteArray::put(int32_t index, ByteVector* b, int32_t offset,
+int32_t ByteArray::Put(int32_t index,
+ ByteVector* b,
+ int32_t offset,
int32_t length) {
assert(b);
- if (index < 0 || index >= size()) {
+ if (index < 0 || index >= Size()) {
return 0;
}
- int32_t actual_length = std::min<int32_t>(length, size() - index);
- int32_t bytes_written = internalPut(index, b, offset, actual_length);
+ int32_t actual_length = std::min<int32_t>(length, Size() - index);
+ int32_t bytes_written = InternalPut(index, b, offset, actual_length);
filled_length_ = std::max<int32_t>(filled_length_, index + bytes_written);
return bytes_written;
}
-int32_t ByteArray::copyTo(ByteArray* array) {
- return copyTo(array, 0, length());
+int32_t ByteArray::CopyTo(ByteArray* array) {
+ return CopyTo(array, 0, Length());
}
-int32_t ByteArray::copyTo(ByteArray* array, int32_t offset, int32_t length) {
- return copyTo(0, array, offset, length);
+int32_t ByteArray::CopyTo(ByteArray* array, int32_t offset, int32_t length) {
+ return CopyTo(0, array, offset, length);
}
-int32_t ByteArray::copyTo(int32_t dst_offset, ByteArray* array,
+int32_t ByteArray::CopyTo(int32_t dst_offset, ByteArray* array,
int32_t src_offset, int32_t length) {
assert(array);
- if (array->size() < dst_offset + length) { // insufficient space
+ if (array->Size() < dst_offset + length) { // insufficient space
return -1;
}
@@ -118,8 +106,8 @@
int32_t index = 0;
int32_t remaining_length = length;
int32_t buffer_length = std::min<int32_t>(COPY_BUFFER_SIZE, length);
- while ((bytes_read = get(index + src_offset, &b, 0, buffer_length)) > 0) {
- int bytes_written = array->put(index + dst_offset, &b, 0, bytes_read);
+ while ((bytes_read = Get(index + src_offset, &b, 0, buffer_length)) > 0) {
+ int bytes_written = array->Put(index + dst_offset, &b, 0, bytes_read);
if (bytes_written != bytes_read) {
#if defined (SFNTLY_NO_EXCEPTION)
return 0;
@@ -134,31 +122,30 @@
return index;
}
-int32_t ByteArray::copyTo(OutputStream* os) {
- return copyTo(os, 0, length());
+int32_t ByteArray::CopyTo(OutputStream* os) {
+ return CopyTo(os, 0, Length());
}
-int32_t ByteArray::copyTo(OutputStream* os, int32_t offset, int32_t length) {
+int32_t ByteArray::CopyTo(OutputStream* os, int32_t offset, int32_t length) {
ByteVector b(COPY_BUFFER_SIZE);
int32_t bytes_read = 0;
int32_t index = 0;
int32_t buffer_length = std::min<int32_t>(COPY_BUFFER_SIZE, length);
- while ((bytes_read = get(index + offset, &b, 0, buffer_length)) > 0) {
- os->write(&b, 0, bytes_read);
+ while ((bytes_read = Get(index + offset, &b, 0, buffer_length)) > 0) {
+ os->Write(&b, 0, bytes_read);
index += bytes_read;
buffer_length = std::min<int32_t>(b.size(), length - index);
}
return index;
}
-bool ByteArray::copyFrom(InputStream* is, int32_t length) {
+bool ByteArray::CopyFrom(InputStream* is, int32_t length) {
ByteVector b(COPY_BUFFER_SIZE);
int32_t bytes_read = 0;
int32_t index = 0;
int32_t buffer_length = std::min<int32_t>(COPY_BUFFER_SIZE, length);
- while ((bytes_read =
- is->read(&b, 0, buffer_length)) > 0) {
- if (put(index, &b, 0, bytes_read) != bytes_read) {
+ while ((bytes_read = is->Read(&b, 0, buffer_length)) > 0) {
+ if (Put(index, &b, 0, bytes_read) != bytes_read) {
#if defined (SFNTLY_NO_EXCEPTION)
return 0;
#else
@@ -172,14 +159,13 @@
return true;
}
-bool ByteArray::copyFrom(InputStream* is) {
+bool ByteArray::CopyFrom(InputStream* is) {
ByteVector b(COPY_BUFFER_SIZE);
int32_t bytes_read = 0;
int32_t index = 0;
int32_t buffer_length = COPY_BUFFER_SIZE;
- while ((bytes_read =
- is->read(&b, 0, buffer_length)) > 0) {
- if (put(index, &b, 0, bytes_read) != bytes_read) {
+ while ((bytes_read = is->Read(&b, 0, buffer_length)) > 0) {
+ if (Put(index, &b, 0, bytes_read) != bytes_read) {
#if defined (SFNTLY_NO_EXCEPTION)
return 0;
#else
@@ -191,4 +177,22 @@
return true;
}
+ByteArray::ByteArray(int32_t filled_length,
+ int32_t storage_length,
+ bool growable) {
+ Init(filled_length, storage_length, growable);
+}
+
+ByteArray::ByteArray(int32_t filled_length, int32_t storage_length) {
+ Init(filled_length, storage_length, false);
+}
+
+void ByteArray::Init(int32_t filled_length,
+ int32_t storage_length,
+ bool growable) {
+ storage_length_ = storage_length;
+ growable_ = growable;
+ SetFilledLength(filled_length);
+}
+
} // namespace sfntly
diff --git a/sfntly/data/byte_array.h b/sfntly/data/byte_array.h
index edb4633..9ac56c0 100644
--- a/sfntly/data/byte_array.h
+++ b/sfntly/data/byte_array.h
@@ -29,38 +29,27 @@
// C++ port of this class assumes that the data are stored in a linear region
// like std::vector.
class ByteArray : virtual public RefCount {
- protected:
- // filledLength the length that is "filled" and readable counting from offset
- // storageLength the maximum storage size of the underlying data
- // growable is the storage growable - storageLength is the max growable size
- ByteArray(int32_t filled_length, int32_t storage_length, bool growable);
- ByteArray(int32_t filled_length, int32_t storage_length);
- void init(int32_t filled_length, int32_t storage_length, bool growable);
-
- static const int32_t COPY_BUFFER_SIZE;
-
public:
virtual ~ByteArray();
// Get the current filled and readable length of the array.
- int32_t length();
+ int32_t Length();
// Get the maximum size of the array. This is the maximum number of bytes that
// the array can hold and all of it may not be filled with data or even fully
// allocated yet.
- int32_t size();
+ int32_t Size();
- bool growable();
- int32_t setFilledLength(int32_t filled_length);
+ bool growable() { return growable_; }
+ int32_t SetFilledLength(int32_t filled_length);
- public:
// Get the byte from the given index.
- virtual byte_t get(int32_t index);
+ virtual byte_t Get(int32_t index);
// Get the bytes from the given index and fill the buffer with them. As many
// bytes as will fit into the buffer are read unless that would go past the
// end of the array.
- virtual int32_t get(int32_t index, ByteVector* b);
+ virtual int32_t Get(int32_t index, ByteVector* b);
// Get the bytes from the given index and fill the buffer with them starting
// at the offset given. As many bytes as the specified length are read unless
@@ -70,17 +59,19 @@
// @param offset the location in the buffer to start putting the bytes
// @param length the number of bytes to put into the buffer
// @return the number of bytes put into the buffer
- virtual int32_t get(int32_t index, ByteVector* b, int32_t offset,
+ virtual int32_t Get(int32_t index,
+ ByteVector* b,
+ int32_t offset,
int32_t length);
// Put the specified byte into the array at the given index unless that would
// be beyond the length of the array and it isn't growable.
- virtual bool put(int32_t index, byte_t b);
+ virtual bool Put(int32_t index, byte_t b);
// Put the specified bytes into the array at the given index. The entire
// buffer is put into the array unless that would extend beyond the length and
// the array isn't growable.
- virtual int32_t put(int32_t index, ByteVector* b);
+ virtual int32_t Put(int32_t index, ByteVector* b);
// Put the specified bytes into the array at the given index. All of the bytes
// specified are put into the array unless that would extend beyond the length
@@ -91,19 +82,21 @@
// @param offset the offset in the bytes to start copying from
// @param length the number of bytes to copy into the array
// @return the number of bytes actually written
- virtual int32_t put(int32_t index, ByteVector* b, int32_t offset,
+ virtual int32_t Put(int32_t index,
+ ByteVector* b,
+ int32_t offset,
int32_t length);
// Fully copy this ByteArray to another ByteArray to the extent that the
// destination array has storage for the data copied.
- virtual int32_t copyTo(ByteArray* array);
+ virtual int32_t CopyTo(ByteArray* array);
// Copy a segment of this ByteArray to another ByteArray.
// @param array the destination
// @param offset the offset in this ByteArray to start copying from
// @param length the maximum length in bytes to copy
// @return the number of bytes copied
- virtual int32_t copyTo(ByteArray* array, int32_t offset, int32_t length);
+ virtual int32_t CopyTo(ByteArray* array, int32_t offset, int32_t length);
// Copy this ByteArray to another ByteArray.
// @param dstOffset the offset in the destination array to start copying to
@@ -111,25 +104,40 @@
// @param srcOffset the offset in this ByteArray to start copying from
// @param length the maximum length in bytes to copy
// @return the number of bytes copied
- virtual int32_t copyTo(int32_t dst_offset, ByteArray* array,
- int32_t src_offset, int32_t length);
+ virtual int32_t CopyTo(int32_t dst_offset,
+ ByteArray* array,
+ int32_t src_offset,
+ int32_t length);
- virtual int32_t copyTo(OutputStream* os);
- virtual int32_t copyTo(OutputStream* os, int32_t offset, int32_t length);
- virtual bool copyFrom(InputStream* is, int32_t length);
- virtual bool copyFrom(InputStream* is);
+ virtual int32_t CopyTo(OutputStream* os);
+ virtual int32_t CopyTo(OutputStream* os, int32_t offset, int32_t length);
+ virtual bool CopyFrom(InputStream* is, int32_t length);
+ virtual bool CopyFrom(InputStream* is);
protected:
- virtual bool internalPut(int32_t index, byte_t b) = 0;
- virtual int32_t internalPut(int32_t index, ByteVector* b, int32_t offset,
- int32_t length) = 0;
- virtual byte_t internalGet(int32_t index) = 0;
- virtual int32_t internalGet(int32_t index, ByteVector* b, int32_t offset,
- int32_t length) = 0;
- virtual void close() = 0;
+ // filledLength the length that is "filled" and readable counting from offset.
+ // storageLength the maximum storage size of the underlying data.
+ // growable is the storage growable - storageLength is the max growable size.
+ ByteArray(int32_t filled_length, int32_t storage_length, bool growable);
+ ByteArray(int32_t filled_length, int32_t storage_length);
+ void Init(int32_t filled_length, int32_t storage_length, bool growable);
- // C++ port only, raw pointer to the first element of storage
- virtual byte_t* begin() = 0;
+ virtual bool InternalPut(int32_t index, byte_t b) = 0;
+ virtual int32_t InternalPut(int32_t index,
+ ByteVector* b,
+ int32_t offset,
+ int32_t length) = 0;
+ virtual byte_t InternalGet(int32_t index) = 0;
+ virtual int32_t InternalGet(int32_t index,
+ ByteVector* b,
+ int32_t offset,
+ int32_t length) = 0;
+ virtual void Close() = 0;
+
+ // C++ port only, raw pointer to the first element of storage.
+ virtual byte_t* Begin() = 0;
+
+ static const int32_t COPY_BUFFER_SIZE;
private:
int32_t filled_length_;
diff --git a/sfntly/data/font_data.cc b/sfntly/data/font_data.cc
index fdba5f8..437a810 100644
--- a/sfntly/data/font_data.cc
+++ b/sfntly/data/font_data.cc
@@ -22,30 +22,12 @@
namespace sfntly {
-FontData::~FontData() {}
-
-void FontData::init(ByteArray* ba) {
- array_ = ba;
- bound_offset_ = 0;
- bound_length_ = INT_MAX;
+int32_t FontData::Size() const {
+ return std::min<int32_t>(array_->Size() - bound_offset_, bound_length_);
}
-FontData::FontData(ByteArray* ba) {
- init(ba);
-}
-
-FontData::FontData(FontData* data, int32_t offset, int32_t length) {
- init(data->array_);
- bound(data->bound_offset_ + offset, length);
-}
-
-FontData::FontData(FontData* data, int32_t offset) {
- init(data->array_);
- bound(offset);
-}
-
-bool FontData::bound(int32_t offset, int32_t length) {
- if (offset + length > size() || offset < 0 || length < 0)
+bool FontData::Bound(int32_t offset, int32_t length) {
+ if (offset + length > Size() || offset < 0 || length < 0)
return false;
bound_offset_ += offset;
@@ -53,27 +35,45 @@
return true;
}
-bool FontData::bound(int32_t offset) {
-if (offset > size() || offset < 0)
+bool FontData::Bound(int32_t offset) {
+if (offset > Size() || offset < 0)
return false;
bound_offset_ += offset;
return true;
}
-int32_t FontData::length() const {
- return std::min<int32_t>(array_->length() - bound_offset_, bound_length_);
+int32_t FontData::Length() const {
+ return std::min<int32_t>(array_->Length() - bound_offset_, bound_length_);
}
-int32_t FontData::size() const {
- return std::min<int32_t>(array_->size() - bound_offset_, bound_length_);
+FontData::FontData(ByteArray* ba) {
+ Init(ba);
}
-int32_t FontData::boundOffset(int32_t offset) {
+FontData::FontData(FontData* data, int32_t offset, int32_t length) {
+ Init(data->array_);
+ Bound(data->bound_offset_ + offset, length);
+}
+
+FontData::FontData(FontData* data, int32_t offset) {
+ Init(data->array_);
+ Bound(offset);
+}
+
+FontData::~FontData() {}
+
+void FontData::Init(ByteArray* ba) {
+ array_ = ba;
+ bound_offset_ = 0;
+ bound_length_ = INT_MAX;
+}
+
+int32_t FontData::BoundOffset(int32_t offset) {
return offset + bound_offset_;
}
-int32_t FontData::boundLength(int32_t offset, int32_t length) {
+int32_t FontData::BoundLength(int32_t offset, int32_t length) {
return std::min<int32_t>(length, bound_length_ - offset);
}
diff --git a/sfntly/data/font_data.h b/sfntly/data/font_data.h
index 6bcdb73..ab5cf54 100644
--- a/sfntly/data/font_data.h
+++ b/sfntly/data/font_data.h
@@ -18,6 +18,7 @@
#define TYPOGRAPHY_FONT_SFNTLY_SRC_SFNTLY_DATA_FONT_DATA_H_
#include <vector>
+
#include "sfntly/port/type.h"
#include "sfntly/data/byte_array.h"
#include "sfntly/port/refcount.h"
@@ -51,13 +52,13 @@
// that the font data can hold and all of it may not be filled with data or
// even fully allocated yet.
// @return the size of this array
- virtual int32_t size() const;
+ virtual int32_t Size() const;
// Sets limits on the size of the FontData. The font data is
// @param offset the start of the new bounds
// @param length the number of bytes in the bounded array
// @return true if the bounding range was successful; false otherwise
- virtual bool bound(int32_t offset, int32_t length);
+ virtual bool Bound(int32_t offset, int32_t length);
// Sets limits on the size of the FontData. This is a offset bound only so if
// the FontData is writable and growable then there is no limit to that growth
@@ -65,28 +66,25 @@
// @param offset the start of the new bounds which must be within the current
// size of the FontData
// @return true if the bounding range was successful; false otherwise
- virtual bool bound(int32_t offset);
+ virtual bool Bound(int32_t offset);
// Makes a slice of this FontData. The returned slice will share the data with
// the original FontData.
// @param offset the start of the slice
// @param length the number of bytes in the slice
// @return a slice of the original FontData
- virtual CALLER_ATTACH FontData* slice(int32_t offset, int32_t length) = 0;
+ virtual CALLER_ATTACH FontData* Slice(int32_t offset, int32_t length) = 0;
// Makes a bottom bound only slice of this array. The returned slice will
// share the data with the original FontData.
// @param offset the start of the slice
// @return a slice of the original FontData
- virtual CALLER_ATTACH FontData* slice(int32_t offset) = 0;
+ virtual CALLER_ATTACH FontData* Slice(int32_t offset) = 0;
// Get the length of the data.
- virtual int32_t length() const;
-
+ virtual int32_t Length() const;
protected:
- virtual ~FontData();
-
// Constructor.
// @param ba the byte array to use for the backing data
explicit FontData(ByteArray* ba);
@@ -101,12 +99,13 @@
// @param data the data to wrap
// @param offset the offset to start the wrap from
FontData(FontData* data, int32_t offset);
+ virtual ~FontData();
- void init(ByteArray* ba);
- int32_t boundOffset(int32_t offset);
- int32_t boundLength(int32_t offset, int32_t length);
+ void Init(ByteArray* ba);
+ int32_t BoundOffset(int32_t offset);
+ int32_t BoundLength(int32_t offset, int32_t length);
- protected:
+ // TODO(arthurhsu): style guide violation: refactor this protected member
ByteArrayPtr array_;
private:
diff --git a/sfntly/data/font_input_stream.cc b/sfntly/data/font_input_stream.cc
index b9eccdb..a1fbe44 100644
--- a/sfntly/data/font_input_stream.cc
+++ b/sfntly/data/font_input_stream.cc
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-#include <algorithm>
-
#include "sfntly/data/font_input_stream.h"
+#include <algorithm>
+
namespace sfntly {
FontInputStream::FontInputStream(InputStream* is)
@@ -32,50 +32,50 @@
// Do not close here, underlying InputStream will close themselves.
}
-int32_t FontInputStream::available() {
+int32_t FontInputStream::Available() {
if (stream_) {
- return stream_->available();
+ return stream_->Available();
}
return 0;
}
-void FontInputStream::close() {
+void FontInputStream::Close() {
if (stream_) {
- stream_->close();
+ stream_->Close();
}
}
-void FontInputStream::mark(int32_t readlimit) {
+void FontInputStream::Mark(int32_t readlimit) {
if (stream_) {
- stream_->mark(readlimit);
+ stream_->Mark(readlimit);
}
}
-bool FontInputStream::markSupported() {
+bool FontInputStream::MarkSupported() {
if (stream_) {
- return stream_->markSupported();
+ return stream_->MarkSupported();
}
return false;
}
-void FontInputStream::reset() {
+void FontInputStream::Reset() {
if (stream_) {
- stream_->reset();
+ stream_->Reset();
}
}
-int32_t FontInputStream::read() {
+int32_t FontInputStream::Read() {
if (!stream_ || (bounded_ && position_ >= length_)) {
return -1;
}
- int32_t b = stream_->read();
+ int32_t b = stream_->Read();
if (b >= 0) {
position_++;
}
return b;
}
-int32_t FontInputStream::read(ByteVector* b, int32_t offset, int32_t length) {
+int32_t FontInputStream::Read(ByteVector* b, int32_t offset, int32_t length) {
if (!stream_ || offset < 0 || length < 0 ||
(bounded_ && position_ >= length_)) {
return -1;
@@ -83,59 +83,55 @@
int32_t bytes_to_read =
bounded_ ? std::min<int32_t>(length, (int32_t)(length_ - position_)) :
length;
- int32_t bytes_read = stream_->read(b, offset, bytes_to_read);
+ int32_t bytes_read = stream_->Read(b, offset, bytes_to_read);
position_ += bytes_read;
return bytes_read;
}
-int32_t FontInputStream::read(ByteVector* b) {
- return read(b, 0, b->size());
+int32_t FontInputStream::Read(ByteVector* b) {
+ return Read(b, 0, b->size());
}
-int64_t FontInputStream::position() {
- return position_;
+int32_t FontInputStream::ReadChar() {
+ return Read();
}
-int32_t FontInputStream::readChar() {
- return read();
+int32_t FontInputStream::ReadUShort() {
+ return 0xffff & (Read() << 8 | Read());
}
-int32_t FontInputStream::readUShort() {
- return 0xffff & (read() << 8 | read());
+int32_t FontInputStream::ReadShort() {
+ return ((Read() << 8 | Read()) << 16) >> 16;
}
-int32_t FontInputStream::readShort() {
- return ((read() << 8 | read()) << 16) >> 16;
+int32_t FontInputStream::ReadUInt24() {
+ return 0xffffff & (Read() << 16 | Read() << 8 | Read());
}
-int32_t FontInputStream::readUInt24() {
- return 0xffffff & (read() << 16 | read() << 8 | read());
+int64_t FontInputStream::ReadULong() {
+ return 0xffffffffL & ReadLong();
}
-int64_t FontInputStream::readULong() {
- return 0xffffffffL & readLong();
-}
-
-int32_t FontInputStream::readULongAsInt() {
- int64_t ulong = readULong();
+int32_t FontInputStream::ReadULongAsInt() {
+ int64_t ulong = ReadULong();
return ((int32_t)ulong) & ~0x80000000;
}
-int32_t FontInputStream::readLong() {
- return read() << 24 | read() << 16 | read() << 8 | read();
+int32_t FontInputStream::ReadLong() {
+ return Read() << 24 | Read() << 16 | Read() << 8 | Read();
}
-int32_t FontInputStream::readFixed() {
- return readLong();
+int32_t FontInputStream::ReadFixed() {
+ return ReadLong();
}
-int64_t FontInputStream::readDateTimeAsLong() {
- return (int64_t)readULong() << 32 | readULong();
+int64_t FontInputStream::ReadDateTimeAsLong() {
+ return (int64_t)ReadULong() << 32 | ReadULong();
}
-int64_t FontInputStream::skip(int64_t n) {
+int64_t FontInputStream::Skip(int64_t n) {
if (stream_) {
- int64_t skipped = stream_->skip(n);
+ int64_t skipped = stream_->Skip(n);
position_ += skipped;
return skipped;
}
diff --git a/sfntly/data/font_input_stream.h b/sfntly/data/font_input_stream.h
index ed8d364..7404825 100644
--- a/sfntly/data/font_input_stream.h
+++ b/sfntly/data/font_input_stream.h
@@ -33,33 +33,33 @@
FontInputStream(InputStream* is, size_t length);
virtual ~FontInputStream();
- virtual int32_t available();
- virtual void close();
- virtual void mark(int32_t readlimit);
- virtual bool markSupported();
- virtual void reset();
+ virtual int32_t Available();
+ virtual void Close();
+ virtual void Mark(int32_t readlimit);
+ virtual bool MarkSupported();
+ virtual void Reset();
- virtual int32_t read();
- virtual int32_t read(ByteVector* buffer);
- virtual int32_t read(ByteVector* buffer, int32_t offset, int32_t length);
+ virtual int32_t Read();
+ virtual int32_t Read(ByteVector* buffer);
+ virtual int32_t Read(ByteVector* buffer, int32_t offset, int32_t length);
- virtual int64_t position();
+ virtual int64_t position() { return position_; }
- virtual int32_t readChar();
- virtual int32_t readUShort();
- virtual int32_t readShort();
- virtual int32_t readUInt24();
- virtual int64_t readULong();
- virtual int32_t readULongAsInt();
- virtual int32_t readLong();
- virtual int32_t readFixed();
- virtual int64_t readDateTimeAsLong();
- virtual int64_t skip(int64_t n); // n can be negative
+ virtual int32_t ReadChar();
+ virtual int32_t ReadUShort();
+ virtual int32_t ReadShort();
+ virtual int32_t ReadUInt24();
+ virtual int64_t ReadULong();
+ virtual int32_t ReadULongAsInt();
+ virtual int32_t ReadLong();
+ virtual int32_t ReadFixed();
+ virtual int64_t ReadDateTimeAsLong();
+ virtual int64_t Skip(int64_t n); // n can be negative.
private:
InputStream* stream_;
int64_t position_;
- int64_t length_; // bound on length of data to read
+ int64_t length_; // Bound on length of data to read.
bool bounded_;
};
diff --git a/sfntly/data/font_output_stream.cc b/sfntly/data/font_output_stream.cc
index f0f4744..a88a29e 100644
--- a/sfntly/data/font_output_stream.cc
+++ b/sfntly/data/font_output_stream.cc
@@ -14,95 +14,91 @@
* limitations under the License.
*/
-#include <algorithm>
-
#include "sfntly/data/font_output_stream.h"
-#include "sfntly/port/endian.h"
+
+#include <algorithm>
namespace sfntly {
FontOutputStream::FontOutputStream(OutputStream* os)
- : stream_(os), position_(0) {
+ : stream_(os),
+ position_(0) {
}
FontOutputStream::~FontOutputStream() {
// Do not close, underlying stream shall clean up themselves.
}
-size_t FontOutputStream::position() {
- return position_;
-}
-
-void FontOutputStream::write(byte_t b) {
+void FontOutputStream::Write(byte_t b) {
if (stream_) {
- stream_->write(b);
+ stream_->Write(b);
position_++;
}
}
-void FontOutputStream::write(ByteVector* b) {
+void FontOutputStream::Write(ByteVector* b) {
if (b) {
- write(b, 0, b->size());
+ Write(b, 0, b->size());
position_ += b->size();
}
}
-void FontOutputStream::write(ByteVector* b, int32_t offset, int32_t length) {
+void FontOutputStream::Write(ByteVector* b, int32_t offset, int32_t length) {
if (stream_ && b) {
- stream_->write(b, offset, length);
+ stream_->Write(b, offset, length);
position_ += length;
}
}
-void FontOutputStream::writeChar(byte_t c) {
- write(c);
+void FontOutputStream::WriteChar(byte_t c) {
+ Write(c);
}
-void FontOutputStream::writeUShort(int32_t us) {
- write((byte_t)((us >> 8) & 0xff));
- write((byte_t)(us & 0xff));
+void FontOutputStream::WriteUShort(int32_t us) {
+ Write((byte_t)((us >> 8) & 0xff));
+ Write((byte_t)(us & 0xff));
}
-void FontOutputStream::writeShort(int32_t s) {
- writeUShort(s);
+void FontOutputStream::WriteShort(int32_t s) {
+ WriteUShort(s);
}
-void FontOutputStream::writeUInt24(int32_t ui) {
- write((byte_t)(ui >> 16) & 0xff);
- write((byte_t)(ui >> 8) & 0xff);
- write((byte_t)ui & 0xff);
+void FontOutputStream::WriteUInt24(int32_t ui) {
+ Write((byte_t)(ui >> 16) & 0xff);
+ Write((byte_t)(ui >> 8) & 0xff);
+ Write((byte_t)ui & 0xff);
}
-void FontOutputStream::writeULong(int64_t ul) {
- write((byte_t)((ul >> 24) & 0xff));
- write((byte_t)((ul >> 16) & 0xff));
- write((byte_t)((ul >> 8) & 0xff));
- write((byte_t)(ul & 0xff));
+void FontOutputStream::WriteULong(int64_t ul) {
+ Write((byte_t)((ul >> 24) & 0xff));
+ Write((byte_t)((ul >> 16) & 0xff));
+ Write((byte_t)((ul >> 8) & 0xff));
+ Write((byte_t)(ul & 0xff));
}
-void FontOutputStream::writeLong(int64_t l) {
- writeULong(l);
+void FontOutputStream::WriteLong(int64_t l) {
+ WriteULong(l);
}
-void FontOutputStream::writeFixed(int32_t f) {
- writeULong(f);
+void FontOutputStream::WriteFixed(int32_t f) {
+ WriteULong(f);
}
-void FontOutputStream::writeDateTime(int64_t date) {
- writeULong((date >> 32) & 0xffffffff);
- writeULong(date & 0xffffffff);
+void FontOutputStream::WriteDateTime(int64_t date) {
+ WriteULong((date >> 32) & 0xffffffff);
+ WriteULong(date & 0xffffffff);
}
-void FontOutputStream::flush() {
+void FontOutputStream::Flush() {
if (stream_) {
- stream_->flush();
+ stream_->Flush();
}
}
-void FontOutputStream::close() {
+void FontOutputStream::Close() {
if (stream_) {
- stream_->flush();
- stream_->close();
+ stream_->Flush();
+ stream_->Close();
position_ = 0;
}
}
diff --git a/sfntly/data/font_output_stream.h b/sfntly/data/font_output_stream.h
index 4bb923d..6938b66 100644
--- a/sfntly/data/font_output_stream.h
+++ b/sfntly/data/font_output_stream.h
@@ -32,22 +32,22 @@
explicit FontOutputStream(OutputStream* os);
virtual ~FontOutputStream();
- virtual size_t position();
+ virtual size_t position() { return position_; }
- virtual void write(byte_t b);
- virtual void write(ByteVector* b);
- virtual void write(ByteVector* b, int32_t offset, int32_t len);
- virtual void writeChar(byte_t c);
- virtual void writeUShort(int32_t us);
- virtual void writeShort(int32_t s);
- virtual void writeUInt24(int32_t ui);
- virtual void writeULong(int64_t ul);
- virtual void writeLong(int64_t l);
- virtual void writeFixed(int32_t l);
- virtual void writeDateTime(int64_t date);
+ virtual void Write(byte_t b);
+ virtual void Write(ByteVector* b);
+ virtual void Write(ByteVector* b, int32_t offset, int32_t len);
+ virtual void WriteChar(byte_t c);
+ virtual void WriteUShort(int32_t us);
+ virtual void WriteShort(int32_t s);
+ virtual void WriteUInt24(int32_t ui);
+ virtual void WriteULong(int64_t ul);
+ virtual void WriteLong(int64_t l);
+ virtual void WriteFixed(int32_t l);
+ virtual void WriteDateTime(int64_t date);
- virtual void flush();
- virtual void close();
+ virtual void Flush();
+ virtual void Close();
private:
OutputStream* stream_;
diff --git a/sfntly/data/growable_memory_byte_array.cc b/sfntly/data/growable_memory_byte_array.cc
index 0821321..9e1a043 100644
--- a/sfntly/data/growable_memory_byte_array.cc
+++ b/sfntly/data/growable_memory_byte_array.cc
@@ -14,11 +14,12 @@
* limitations under the License.
*/
-#include <limits.h>
-#include <algorithm>
-
#include "sfntly/data/growable_memory_byte_array.h"
+#include <limits.h>
+
+#include <algorithm>
+
namespace sfntly {
GrowableMemoryByteArray::GrowableMemoryByteArray()
@@ -27,40 +28,46 @@
GrowableMemoryByteArray::~GrowableMemoryByteArray() {}
-bool GrowableMemoryByteArray::internalPut(int32_t index, byte_t b) {
+bool GrowableMemoryByteArray::InternalPut(int32_t index, byte_t b) {
if ((size_t)index >= b_.capacity()) {
- b_.resize((size_t)(index + 1) << 2); // grow exponentially
+ b_.resize((size_t)(index + 1) << 2); // Grow exponentially.
}
b_[index] = b;
return true;
}
-int32_t GrowableMemoryByteArray::internalPut(int32_t index, ByteVector* b,
- int32_t offset, int32_t length) {
+int32_t GrowableMemoryByteArray::InternalPut(int32_t index,
+ ByteVector* b,
+ int32_t offset,
+ int32_t length) {
if ((size_t)index + length >= b_.capacity()) {
b_.resize((size_t)(index + length + 1) << 2);
}
- std::copy(b->begin() + offset, b->begin() + (offset + length),
+ std::copy(b->begin() + offset,
+ b->begin() + (offset + length),
b_.begin() + index);
return length;
}
-byte_t GrowableMemoryByteArray::internalGet(int32_t index) {
+byte_t GrowableMemoryByteArray::InternalGet(int32_t index) {
return b_[index];
}
-int32_t GrowableMemoryByteArray::internalGet(int32_t index, ByteVector* b,
- int32_t offset, int32_t length) {
- std::copy(b_.begin() + index, b_.begin() + (index + length),
+int32_t GrowableMemoryByteArray::InternalGet(int32_t index,
+ ByteVector* b,
+ int32_t offset,
+ int32_t length) {
+ std::copy(b_.begin() + index,
+ b_.begin() + (index + length),
b->begin() + offset);
return length;
}
-void GrowableMemoryByteArray::close() {
+void GrowableMemoryByteArray::Close() {
b_.clear();
}
-byte_t* GrowableMemoryByteArray::begin() {
+byte_t* GrowableMemoryByteArray::Begin() {
return &(b_[0]);
}
diff --git a/sfntly/data/growable_memory_byte_array.h b/sfntly/data/growable_memory_byte_array.h
index 3c9d4f0..dc59f62 100644
--- a/sfntly/data/growable_memory_byte_array.h
+++ b/sfntly/data/growable_memory_byte_array.h
@@ -30,14 +30,18 @@
virtual ~GrowableMemoryByteArray();
protected:
- virtual bool internalPut(int32_t index, byte_t b);
- virtual int32_t internalPut(int32_t index, ByteVector* b, int32_t offset,
+ virtual bool InternalPut(int32_t index, byte_t b);
+ virtual int32_t InternalPut(int32_t index,
+ ByteVector* b,
+ int32_t offset,
int32_t length);
- virtual byte_t internalGet(int32_t index);
- virtual int32_t internalGet(int32_t index, ByteVector* b, int32_t offset,
+ virtual byte_t InternalGet(int32_t index);
+ virtual int32_t InternalGet(int32_t index,
+ ByteVector* b,
+ int32_t offset,
int32_t length);
- virtual void close();
- virtual byte_t* begin();
+ virtual void Close();
+ virtual byte_t* Begin();
private:
ByteVector b_;
diff --git a/sfntly/data/memory_byte_array.cc b/sfntly/data/memory_byte_array.cc
index 528979a..0138b21 100644
--- a/sfntly/data/memory_byte_array.cc
+++ b/sfntly/data/memory_byte_array.cc
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-#include <string.h>
-
#include "sfntly/data/memory_byte_array.h"
+#include <string.h>
+
namespace sfntly {
-// Note: this constructor can fail under low-memory situation
+// Note: this constructor can fail under low-memory situation.
MemoryByteArray::MemoryByteArray(int32_t length)
: ByteArray(0, length), b_(NULL), allocated_(true) {
}
@@ -29,56 +29,61 @@
: ByteArray(buffer_length, buffer_length), b_(b), allocated_(false) {
}
-MemoryByteArray::MemoryByteArray(byte_t* b, int32_t buffer_length,
+MemoryByteArray::MemoryByteArray(byte_t* b,
+ int32_t buffer_length,
int32_t filled_length)
: ByteArray(filled_length, buffer_length), b_(b), allocated_(false) {
}
MemoryByteArray::~MemoryByteArray() {
- close();
+ Close();
}
-void MemoryByteArray::init() {
+void MemoryByteArray::Init() {
if (allocated_ && b_ == NULL) {
- b_ = new byte_t[size()];
- memset(b_, 0, size());
+ b_ = new byte_t[Size()];
+ memset(b_, 0, Size());
}
}
-bool MemoryByteArray::internalPut(int32_t index, byte_t b) {
- init();
+bool MemoryByteArray::InternalPut(int32_t index, byte_t b) {
+ Init();
b_[index] = b;
return true;
}
-int32_t MemoryByteArray::internalPut(int32_t index, ByteVector* b,
- int32_t offset, int32_t length) {
- init();
+int32_t MemoryByteArray::InternalPut(int32_t index,
+ ByteVector* b,
+ int32_t offset,
+ int32_t length) {
+ Init();
memcpy(b_ + index, &((*b)[offset]), length);
return length;
}
-byte_t MemoryByteArray::internalGet(int32_t index) {
- init();
+byte_t MemoryByteArray::InternalGet(int32_t index) {
+ Init();
return b_[index];
}
-int32_t MemoryByteArray::internalGet(int32_t index, ByteVector* b,
- int32_t offset, int32_t length) {
- init();
+int32_t MemoryByteArray::InternalGet(int32_t index,
+ ByteVector* b,
+ int32_t offset,
+ int32_t length) {
+ Init();
memcpy(&((*b)[offset]), b_ + index, length);
return length;
}
-void MemoryByteArray::close() {
+void MemoryByteArray::Close() {
if (allocated_ && b_) {
delete[] b_;
}
b_ = NULL;
}
-byte_t* MemoryByteArray::begin() {
- init();
+byte_t* MemoryByteArray::Begin() {
+ Init();
return b_;
}
diff --git a/sfntly/data/memory_byte_array.h b/sfntly/data/memory_byte_array.h
index 34b26a6..171dcc7 100644
--- a/sfntly/data/memory_byte_array.h
+++ b/sfntly/data/memory_byte_array.h
@@ -29,17 +29,21 @@
virtual ~MemoryByteArray();
protected:
- virtual bool internalPut(int32_t index, byte_t b);
- virtual int32_t internalPut(int32_t index, ByteVector* b, int32_t offset,
+ virtual bool InternalPut(int32_t index, byte_t b);
+ virtual int32_t InternalPut(int32_t index,
+ ByteVector* b,
+ int32_t offset,
int32_t length);
- virtual byte_t internalGet(int32_t index);
- virtual int32_t internalGet(int32_t index, ByteVector* b, int32_t offset,
+ virtual byte_t InternalGet(int32_t index);
+ virtual int32_t InternalGet(int32_t index,
+ ByteVector* b,
+ int32_t offset,
int32_t length);
- virtual void close();
- virtual byte_t* begin();
+ virtual void Close();
+ virtual byte_t* Begin();
private:
- void init(); // C++ port only, used to allocate memory outside constructor.
+ void Init(); // C++ port only, used to allocate memory outside constructor.
byte_t* b_;
bool allocated_;
diff --git a/sfntly/data/readable_font_data.cc b/sfntly/data/readable_font_data.cc
index fa7279e..5f8478d 100644
--- a/sfntly/data/readable_font_data.cc
+++ b/sfntly/data/readable_font_data.cc
@@ -20,27 +20,148 @@
namespace sfntly {
+ReadableFontData::ReadableFontData(ByteArray* array)
+ : FontData(array),
+ checksum_set_(false),
+ checksum_(0) {
+}
+
ReadableFontData::~ReadableFontData() {}
-ReadableFontData::ReadableFontData(ByteArray* array)
- : FontData(array), checksum_set_(false), checksum_(0) {
+int64_t ReadableFontData::Checksum() {
+ // TODO(arthurhsu): IMPLEMENT: atomicity
+ if (!checksum_set_) {
+ ComputeChecksum();
+ }
+ return checksum_;
+}
+
+void ReadableFontData::SetCheckSumRanges(const IntegerList& ranges) {
+ checksum_range_ = ranges;
+ checksum_set_ = false; // UNIMPLEMENTED: atomicity
+}
+
+int32_t ReadableFontData::ReadUByte(int32_t index) {
+ return 0xff & array_->Get(BoundOffset(index));
+}
+
+int32_t ReadableFontData::ReadByte(int32_t index) {
+ return (array_->Get(BoundOffset(index)) << 24) >> 24;
+}
+
+int32_t ReadableFontData::ReadBytes(int32_t index,
+ ByteVector* b,
+ int32_t offset,
+ int32_t length) {
+ return array_->Get(BoundOffset(index), b, offset, BoundLength(index, length));
+}
+
+int32_t ReadableFontData::ReadChar(int32_t index) {
+ return ReadUByte(index);
+}
+
+int32_t ReadableFontData::ReadUShort(int32_t index) {
+ return 0xffff & (ReadUByte(index) << 8 | ReadUByte(index + 1));
+}
+
+int32_t ReadableFontData::ReadShort(int32_t index) {
+ return ((ReadByte(index) << 8 | ReadUByte(index + 1)) << 16) >> 16;
+}
+
+int32_t ReadableFontData::ReadUInt24(int32_t index) {
+ return 0xffffff & (ReadUByte(index) << 16 |
+ ReadUByte(index + 1) << 8 |
+ ReadUByte(index + 2));
+}
+
+int64_t ReadableFontData::ReadULong(int32_t index) {
+ return 0xffffffffL & (ReadUByte(index) << 24 |
+ ReadUByte(index + 1) << 16 |
+ ReadUByte(index + 2) << 8 |
+ ReadUByte(index + 3));
+}
+
+int32_t ReadableFontData::ReadULongAsInt(int32_t index) {
+ int64_t ulong = ReadULong(index);
+#if !defined (SFNTLY_NO_EXCEPTION)
+ if ((ulong & 0x80000000) == 0x80000000) {
+ throw ArithmeticException("Long value too large to fit into an integer.");
+ }
+#endif
+ return ((int32_t)ulong) & ~0x80000000;
+}
+
+int32_t ReadableFontData::ReadLong(int32_t index) {
+ return ReadByte(index) << 24 |
+ ReadUByte(index + 1) << 16 |
+ ReadUByte(index + 2) << 8 |
+ ReadUByte(index + 3);
+}
+
+int32_t ReadableFontData::ReadFixed(int32_t index) {
+ return ReadLong(index);
+}
+
+int64_t ReadableFontData::ReadDateTimeAsLong(int32_t index) {
+ return (int64_t)ReadULong(index) << 32 | ReadULong(index + 4);
+}
+
+int32_t ReadableFontData::ReadFWord(int32_t index) {
+ return ReadShort(index);
+}
+
+int32_t ReadableFontData::ReadFUFWord(int32_t index) {
+ return ReadUShort(index);
+}
+
+int32_t ReadableFontData::CopyTo(OutputStream* os) {
+ return array_->CopyTo(os, BoundOffset(0), Length());
+}
+
+int32_t ReadableFontData::CopyTo(WritableFontData* wfd) {
+ return array_->CopyTo(wfd->BoundOffset(0),
+ wfd->array_,
+ BoundOffset(0),
+ Length());
+}
+
+int32_t ReadableFontData::CopyTo(ByteArray* ba) {
+ return array_->CopyTo(ba, BoundOffset(0), Length());
+}
+
+CALLER_ATTACH FontData* ReadableFontData::Slice(int32_t offset,
+ int32_t length) {
+ if (offset < 0 || offset + length > Size()) {
+ return NULL;
+ }
+ FontDataPtr slice = new ReadableFontData(this, offset, length);
+ // Note: exception not ported because the condition is always false in C++.
+ // if (slice == null) { throw new IndexOutOfBoundsException( ...
+ return slice.Detach();
+}
+
+CALLER_ATTACH FontData* ReadableFontData::Slice(int32_t offset) {
+ if (offset < 0 || offset > Size()) {
+ return NULL;
+ }
+ FontDataPtr slice = new ReadableFontData(this, offset);
+ // Note: exception not ported because the condition is always false in C++.
+ // if (slice == null) { throw new IndexOutOfBoundsException( ...
+ return slice.Detach();
}
ReadableFontData::ReadableFontData(ReadableFontData* data, int32_t offset)
- : FontData(data, offset), checksum_set_(false), checksum_(0) {
+ : FontData(data, offset),
+ checksum_set_(false),
+ checksum_(0) {
}
-ReadableFontData::ReadableFontData(ReadableFontData* data, int32_t offset,
+ReadableFontData::ReadableFontData(ReadableFontData* data,
+ int32_t offset,
int32_t length)
- : FontData(data, offset, length), checksum_set_(false), checksum_(0) {
-}
-
-int64_t ReadableFontData::checksum() {
- // TODO(arthurhsu): IMPLEMENT: atomicity
- if (!checksum_set_) {
- computeChecksum();
- }
- return checksum_;
+ : FontData(data, offset, length),
+ checksum_set_(false),
+ checksum_(0) {
}
/* OpenType checksum
@@ -54,19 +175,19 @@
return Sum;
}
*/
-void ReadableFontData::computeChecksum() {
+void ReadableFontData::ComputeChecksum() {
// TODO(arthurhsu): IMPLEMENT: synchronization/atomicity
int64_t sum = 0;
if (checksum_range_.empty()) {
- sum = computeCheckSum(0, length());
+ sum = ComputeCheckSum(0, Length());
} else {
for (uint32_t low_bound_index = 0; low_bound_index < checksum_range_.size();
low_bound_index += 2) {
int32_t low_bound = checksum_range_[low_bound_index];
int32_t high_bound = (low_bound_index == checksum_range_.size() - 1) ?
- length() :
+ Length() :
checksum_range_[low_bound_index + 1];
- sum += computeCheckSum(low_bound, high_bound);
+ sum += ComputeCheckSum(low_bound, high_bound);
}
}
@@ -74,126 +195,21 @@
checksum_set_ = true;
}
-int64_t ReadableFontData::computeCheckSum(int32_t low_bound,
+int64_t ReadableFontData::ComputeCheckSum(int32_t low_bound,
int32_t high_bound) {
int64_t sum = 0;
for (int32_t i = low_bound; i < high_bound; i += 4) {
- int32_t b3 = readUByte(i);
+ int32_t b3 = ReadUByte(i);
b3 = (b3 == -1) ? 0 : b3;
- int32_t b2 = readUByte(i + 1);
+ int32_t b2 = ReadUByte(i + 1);
b2 = (b2 == -1) ? 0 : b2;
- int32_t b1 = readUByte(i + 2);
+ int32_t b1 = ReadUByte(i + 2);
b1 = (b1 == -1) ? 0 : b1;
- int32_t b0 = readUByte(i + 3);
+ int32_t b0 = ReadUByte(i + 3);
b0 = (b0 == -1) ? 0 : b0;
sum += (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
}
return sum;
}
-void ReadableFontData::setCheckSumRanges(const IntegerList& ranges) {
- checksum_range_ = ranges;
- checksum_set_ = false; // UNIMPLEMENTED: atomicity
-}
-
-int32_t ReadableFontData::readUByte(int32_t index) {
- return 0xff & array_->get(boundOffset(index));
-}
-
-int32_t ReadableFontData::readByte(int32_t index) {
- return (array_->get(boundOffset(index)) << 24) >> 24;
-}
-
-int32_t ReadableFontData::readBytes(int32_t index, ByteVector* b,
- int32_t offset, int32_t length) {
- return array_->get(boundOffset(index), b, offset, boundLength(index, length));
-}
-
-int32_t ReadableFontData::readChar(int32_t index) {
- return readUByte(index);
-}
-
-int32_t ReadableFontData::readUShort(int32_t index) {
- return 0xffff & (readUByte(index) << 8 | readUByte(index + 1));
-}
-
-int32_t ReadableFontData::readShort(int32_t index) {
- return ((readByte(index) << 8 | readUByte(index + 1)) << 16) >> 16;
-}
-
-int32_t ReadableFontData::readUInt24(int32_t index) {
- return 0xffffff & (readUByte(index) << 16 |
- readUByte(index + 1) << 8 | readUByte(index + 2));
-}
-
-int64_t ReadableFontData::readULong(int32_t index) {
- return 0xffffffffL & (readUByte(index) << 24 | readUByte(index + 1) << 16 |
- readUByte(index + 2) << 8 | readUByte(index + 3));
-}
-
-int32_t ReadableFontData::readULongAsInt(int32_t index) {
- int64_t ulong = readULong(index);
-#if !defined (SFNTLY_NO_EXCEPTION)
- if ((ulong & 0x80000000) == 0x80000000) {
- throw ArithmeticException("Long value too large to fit into an integer.");
- }
-#endif
- return ((int32_t)ulong) & ~0x80000000;
-}
-
-int32_t ReadableFontData::readLong(int32_t index) {
- return readByte(index) << 24 | readUByte(index + 1) << 16 |
- readUByte(index + 2) << 8 | readUByte(index + 3);
-}
-
-int32_t ReadableFontData::readFixed(int32_t index) {
- return readLong(index);
-}
-
-int64_t ReadableFontData::readDateTimeAsLong(int32_t index) {
- return (int64_t)readULong(index) << 32 | readULong(index + 4);
-}
-
-int32_t ReadableFontData::readFWord(int32_t index) {
- return readShort(index);
-}
-
-int32_t ReadableFontData::readFUFWord(int32_t index) {
- return readUShort(index);
-}
-
-int32_t ReadableFontData::copyTo(OutputStream* os) {
- return array_->copyTo(os, boundOffset(0), length());
-}
-
-int32_t ReadableFontData::copyTo(WritableFontData* wfd) {
- return array_->copyTo(wfd->boundOffset(0), wfd->array_, boundOffset(0),
- length());
-}
-
-int32_t ReadableFontData::copyTo(ByteArray* ba) {
- return array_->copyTo(ba, boundOffset(0), length());
-}
-
-CALLER_ATTACH FontData* ReadableFontData::slice(int32_t offset,
- int32_t length) {
- if (offset < 0 || offset + length > size()) {
- return NULL;
- }
- FontDataPtr slice = new ReadableFontData(this, offset, length);
- // Note: exception not ported because the condition is always false in C++.
- // if (slice == null) { throw new IndexOutOfBoundsException( ...
- return slice.detach();
-}
-
-CALLER_ATTACH FontData* ReadableFontData::slice(int32_t offset) {
- if (offset < 0 || offset > size()) {
- return NULL;
- }
- FontDataPtr slice = new ReadableFontData(this, offset);
- // Note: exception not ported because the condition is always false in C++.
- // if (slice == null) { throw new IndexOutOfBoundsException( ...
- return slice.detach();
-}
-
} // namespace sfntly
diff --git a/sfntly/data/readable_font_data.h b/sfntly/data/readable_font_data.h
index be466de..b1ca846 100644
--- a/sfntly/data/readable_font_data.h
+++ b/sfntly/data/readable_font_data.h
@@ -30,6 +30,69 @@
explicit ReadableFontData(ByteArray* array);
virtual ~ReadableFontData();
+ // Get a computed checksum for the data. This checksum uses the OpenType spec
+ // calculation. Every ULong value (32 bit unsigned) in the data is summed and
+ // the resulting value is truncated to 32 bits. If the data length in bytes is
+ // not an integral multiple of 4 then any remaining bytes are treated as the
+ // start of a 4 byte sequence whose remaining bytes are zero.
+ // @return the checksum
+ int64_t Checksum();
+
+ // Sets the bounds to use for computing the checksum. These bounds are in
+ // begin and end pairs. If an odd number is given then the final range is
+ // assumed to extend to the end of the data. The lengths of each range must be
+ // a multiple of 4.
+ // @param ranges the range bounds to use for the checksum
+ void SetCheckSumRanges(const IntegerList& ranges);
+
+ virtual int32_t ReadUByte(int32_t index);
+ virtual int32_t ReadByte(int32_t index);
+ virtual int32_t ReadBytes(int32_t index, ByteVector* b, int32_t offset,
+ int32_t length);
+ virtual int32_t ReadChar(int32_t index);
+ virtual int32_t ReadUShort(int32_t index);
+ virtual int32_t ReadShort(int32_t index);
+ virtual int32_t ReadUInt24(int32_t index);
+ virtual int64_t ReadULong(int32_t index);
+ virtual int32_t ReadULongAsInt(int32_t index);
+ virtual int32_t ReadLong(int32_t index);
+ virtual int32_t ReadFixed(int32_t index);
+ virtual int64_t ReadDateTimeAsLong(int32_t index);
+
+ virtual int32_t ReadFWord(int32_t index);
+ virtual int32_t ReadFUFWord(int32_t index);
+
+ virtual int32_t CopyTo(OutputStream* os);
+ virtual int32_t CopyTo(WritableFontData* wfd);
+ virtual int32_t CopyTo(ByteArray* ba);
+
+ // TODO(arthurhsu): IMPLEMENT
+ /*
+ virtual int32_t ReadFUnit(int32_t index);
+ virtual int64_t ReadF2Dot14(int32_t index);
+ virtual int64_t ReadLongDateTime(int32_t index);
+ virtual int32_t SearchUShort(int32_t start, int32_t length, int32_t key);
+ virtual int32_t SearchUShort(int32_t start_index, int32_t start_offset,
+ int32_t count_index, int32_t count_offset,
+ int32_t length, int32_t key);
+ virtual int32_t SearchULong(int32_t start_index, int32_t start_offset,
+ int32_t end_index, int32_t end_offset,
+ int32_t length, int32_t key);
+ */
+
+ // Makes a slice of this FontData. The returned slice will share the data with
+ // the original FontData.
+ // @param offset the start of the slice
+ // @param length the number of bytes in the slice
+ // @return a slice of the original FontData
+ virtual CALLER_ATTACH FontData* Slice(int32_t offset, int32_t length);
+
+ // Makes a bottom bound only slice of this array. The returned slice will
+ // share the data with the original FontData.
+ // @param offset the start of the slice
+ // @return a slice of the original FontData
+ virtual CALLER_ATTACH FontData* Slice(int32_t offset);
+
protected:
// Constructor. Creates a bounded wrapper of another ReadableFontData from the
// given offset until the end of the original ReadableFontData.
@@ -44,76 +107,10 @@
ReadableFontData(ReadableFontData* data, int32_t offset, int32_t length);
private:
- void computeChecksum();
- int64_t computeCheckSum(int32_t low_bound, int32_t high_bound);
+ void ComputeChecksum();
+ int64_t ComputeCheckSum(int32_t low_bound, int32_t high_bound);
- public:
- // Get a computed checksum for the data. This checksum uses the OpenType spec
- // calculation. Every ULong value (32 bit unsigned) in the data is summed and
- // the resulting value is truncated to 32 bits. If the data length in bytes is
- // not an integral multiple of 4 then any remaining bytes are treated as the
- // start of a 4 byte sequence whose remaining bytes are zero.
- // @return the checksum
- int64_t checksum();
-
- // Sets the bounds to use for computing the checksum. These bounds are in
- // begin and end pairs. If an odd number is given then the final range is
- // assumed to extend to the end of the data. The lengths of each range must be
- // a multiple of 4.
- // @param ranges the range bounds to use for the checksum
- void setCheckSumRanges(const IntegerList& ranges);
-
- public:
- virtual int32_t readUByte(int32_t index);
- virtual int32_t readByte(int32_t index);
- virtual int32_t readBytes(int32_t index, ByteVector* b, int32_t offset,
- int32_t length);
- virtual int32_t readChar(int32_t index);
- virtual int32_t readUShort(int32_t index);
- virtual int32_t readShort(int32_t index);
- virtual int32_t readUInt24(int32_t index);
- virtual int64_t readULong(int32_t index);
- virtual int32_t readULongAsInt(int32_t index);
- virtual int32_t readLong(int32_t index);
- virtual int32_t readFixed(int32_t index);
- virtual int64_t readDateTimeAsLong(int32_t index);
-
- virtual int32_t readFWord(int32_t index);
- virtual int32_t readFUFWord(int32_t index);
-
- virtual int32_t copyTo(OutputStream* os);
- virtual int32_t copyTo(WritableFontData* wfd);
- virtual int32_t copyTo(ByteArray* ba);
-
- // TODO(arthurhsu): IMPLEMENT
- /*
- virtual int32_t readFUnit(int32_t index);
- virtual int64_t readF2Dot14(int32_t index);
- virtual int64_t readLongDateTime(int32_t index);
- virtual int32_t searchUShort(int32_t start, int32_t length, int32_t key);
- virtual int32_t searchUShort(int32_t start_index, int32_t start_offset,
- int32_t count_index, int32_t count_offset,
- int32_t length, int32_t key);
- virtual int32_t searchULong(int32_t start_index, int32_t start_offset,
- int32_t end_index, int32_t end_offset,
- int32_t length, int32_t key);
- */
-
- // Makes a slice of this FontData. The returned slice will share the data with
- // the original FontData.
- // @param offset the start of the slice
- // @param length the number of bytes in the slice
- // @return a slice of the original FontData
- virtual CALLER_ATTACH FontData* slice(int32_t offset, int32_t length);
-
- // Makes a bottom bound only slice of this array. The returned slice will
- // share the data with the original FontData.
- // @param offset the start of the slice
- // @return a slice of the original FontData
- virtual CALLER_ATTACH FontData* slice(int32_t offset);
-
- private:
- bool checksum_set_; // TODO(arthurhsu): IMPLEMENT: must be set atomically
+ bool checksum_set_; // TODO(arthurhsu): IMPLEMENT: must be set atomically.
int64_t checksum_;
IntegerList checksum_range_;
};
diff --git a/sfntly/data/writable_font_data.cc b/sfntly/data/writable_font_data.cc
index 8588acb..586acc1 100644
--- a/sfntly/data/writable_font_data.cc
+++ b/sfntly/data/writable_font_data.cc
@@ -18,111 +18,116 @@
namespace sfntly {
+WritableFontData::WritableFontData(ByteArray* ba) : ReadableFontData(ba) {
+}
+
WritableFontData::~WritableFontData() {}
-WritableFontData::WritableFontData(ByteArray* ba) : ReadableFontData(ba) {
+int32_t WritableFontData::WriteByte(int32_t index, byte_t b) {
+ array_->Put(BoundOffset(index), b);
+ return 1;
+}
+
+int32_t WritableFontData::WriteBytes(int32_t offset,
+ ByteVector* b,
+ int32_t index,
+ int32_t length) {
+ return array_->Put(BoundOffset(offset),
+ b,
+ index,
+ BoundLength(offset, length));
+}
+
+int32_t WritableFontData::WriteBytes(int32_t index, ByteVector* b) {
+ return WriteBytes(index, b, 0, b->size());
+}
+
+int32_t WritableFontData::WriteChar(int32_t index, byte_t c) {
+ return WriteByte(index, c);
+}
+
+int32_t WritableFontData::WriteUShort(int32_t index, int32_t us) {
+ WriteByte(index, (byte_t)((us >> 8) & 0xff));
+ WriteByte(index + 1, (byte_t)(us & 0xff));
+ return 2;
+}
+
+int32_t WritableFontData::WriteUShortLE(int32_t index, int32_t us) {
+ WriteByte(index, (byte_t)(us & 0xff));
+ WriteByte(index + 1, (byte_t)((us >> 8) & 0xff));
+ return 2;
+}
+
+int32_t WritableFontData::WriteShort(int32_t index, int32_t s) {
+ return WriteUShort(index, s);
+}
+
+int32_t WritableFontData::WriteUInt24(int32_t index, int32_t ui) {
+ WriteByte(index, (byte_t)((ui >> 16) & 0xff));
+ WriteByte(index + 1, (byte_t)((ui >> 8) & 0xff));
+ WriteByte(index + 2, (byte_t)(ui & 0xff));
+ return 3;
+}
+
+int32_t WritableFontData::WriteULong(int32_t index, int64_t ul) {
+ WriteByte(index, (byte_t)((ul >> 24) & 0xff));
+ WriteByte(index + 1, (byte_t)((ul >> 16) & 0xff));
+ WriteByte(index + 2, (byte_t)((ul >> 8) & 0xff));
+ WriteByte(index + 3, (byte_t)(ul & 0xff));
+ return 4;
+}
+
+int32_t WritableFontData::WriteULongLE(int32_t index, int64_t ul) {
+ WriteByte(index, (byte_t)(ul & 0xff));
+ WriteByte(index + 1, (byte_t)((ul >> 8) & 0xff));
+ WriteByte(index + 2, (byte_t)((ul >> 16) & 0xff));
+ WriteByte(index + 3, (byte_t)((ul >> 24) & 0xff));
+ return 4;
+}
+
+int32_t WritableFontData::WriteLong(int32_t index, int64_t l) {
+ return WriteULong(index, l);
+}
+
+int32_t WritableFontData::WriteFixed(int32_t index, int32_t l) {
+ return WriteLong(index, l);
+}
+
+int32_t WritableFontData::WriteDateTime(int32_t index, int64_t date) {
+ WriteULong(index, (date >> 32) & 0xffffffff);
+ WriteULong(index + 4, date & 0xffffffff);
+ return 8;
+}
+
+CALLER_ATTACH FontData* WritableFontData::Slice(int32_t offset,
+ int32_t length) {
+ if (offset < 0 || offset + length > Size()) {
+ return NULL;
+ }
+ FontDataPtr slice = new WritableFontData(this, offset, length);
+ // Note: exception not ported because the condition is always false in C++.
+ // if (slice == null) { throw new IndexOutOfBoundsException( ...
+ return slice.Detach();
+}
+
+CALLER_ATTACH FontData* WritableFontData::Slice(int32_t offset) {
+ if (offset > Size()) {
+ return NULL;
+ }
+ FontDataPtr slice = new WritableFontData(this, offset);
+ // Note: exception not ported because the condition is always false in C++.
+ // if (slice == null) { throw new IndexOutOfBoundsException( ...
+ return slice.Detach();
}
WritableFontData::WritableFontData(WritableFontData* data, int32_t offset)
: ReadableFontData(data, offset) {
}
-WritableFontData::WritableFontData(WritableFontData* data, int32_t offset,
+WritableFontData::WritableFontData(WritableFontData* data,
+ int32_t offset,
int32_t length)
: ReadableFontData(data, offset, length) {
}
-int32_t WritableFontData::writeByte(int32_t index, byte_t b) {
- array_->put(boundOffset(index), b);
- return 1;
-}
-
-int32_t WritableFontData::writeBytes(int32_t offset, ByteVector* b,
- int32_t index, int32_t length) {
- return array_->put(boundOffset(offset), b, index,
- boundLength(offset, length));
-}
-
-int32_t WritableFontData::writeBytes(int32_t index, ByteVector* b) {
- return writeBytes(index, b, 0, b->size());
-}
-
-int32_t WritableFontData::writeChar(int32_t index, byte_t c) {
- return writeByte(index, c);
-}
-
-int32_t WritableFontData::writeUShort(int32_t index, int32_t us) {
- writeByte(index, (byte_t)((us >> 8) & 0xff));
- writeByte(index + 1, (byte_t)(us & 0xff));
- return 2;
-}
-
-int32_t WritableFontData::writeUShortLE(int32_t index, int32_t us) {
- writeByte(index, (byte_t)(us & 0xff));
- writeByte(index + 1, (byte_t)((us >> 8) & 0xff));
- return 2;
-}
-
-int32_t WritableFontData::writeShort(int32_t index, int32_t s) {
- return writeUShort(index, s);
-}
-
-int32_t WritableFontData::writeUInt24(int32_t index, int32_t ui) {
- writeByte(index, (byte_t)((ui >> 16) & 0xff));
- writeByte(index + 1, (byte_t)((ui >> 8) & 0xff));
- writeByte(index + 2, (byte_t)(ui & 0xff));
- return 3;
-}
-
-int32_t WritableFontData::writeULong(int32_t index, int64_t ul) {
- writeByte(index, (byte_t)((ul >> 24) & 0xff));
- writeByte(index + 1, (byte_t)((ul >> 16) & 0xff));
- writeByte(index + 2, (byte_t)((ul >> 8) & 0xff));
- writeByte(index + 3, (byte_t)(ul & 0xff));
- return 4;
-}
-
-int32_t WritableFontData::writeULongLE(int32_t index, int64_t ul) {
- writeByte(index, (byte_t)(ul & 0xff));
- writeByte(index + 1, (byte_t)((ul >> 8) & 0xff));
- writeByte(index + 2, (byte_t)((ul >> 16) & 0xff));
- writeByte(index + 3, (byte_t)((ul >> 24) & 0xff));
- return 4;
-}
-
-int32_t WritableFontData::writeLong(int32_t index, int64_t l) {
- return writeULong(index, l);
-}
-
-int32_t WritableFontData::writeFixed(int32_t index, int32_t l) {
- return writeLong(index, l);
-}
-
-int32_t WritableFontData::writeDateTime(int32_t index, int64_t date) {
- writeULong(index, (date >> 32) & 0xffffffff);
- writeULong(index + 4, date & 0xffffffff);
- return 8;
-}
-
-CALLER_ATTACH FontData* WritableFontData::slice(int32_t offset,
- int32_t length) {
- if (offset < 0 || offset + length > size()) {
- return NULL;
- }
- FontDataPtr slice = new WritableFontData(this, offset, length);
- // Note: exception not ported because the condition is always false in C++.
- // if (slice == null) { throw new IndexOutOfBoundsException( ...
- return slice.detach();
-}
-
-CALLER_ATTACH FontData* WritableFontData::slice(int32_t offset) {
- if (offset > size()) {
- return NULL;
- }
- FontDataPtr slice = new WritableFontData(this, offset);
- // Note: exception not ported because the condition is always false in C++.
- // if (slice == null) { throw new IndexOutOfBoundsException( ...
- return slice.detach();
-}
-
} // namespace sfntly
diff --git a/sfntly/data/writable_font_data.h b/sfntly/data/writable_font_data.h
index 9542cd0..98c9204 100644
--- a/sfntly/data/writable_font_data.h
+++ b/sfntly/data/writable_font_data.h
@@ -26,38 +26,39 @@
explicit WritableFontData(ByteArray* ba);
virtual ~WritableFontData();
- private:
- WritableFontData(WritableFontData* data, int32_t offset);
- WritableFontData(WritableFontData* data, int32_t offset, int32_t length);
-
- public:
- virtual int32_t writeByte(int32_t index, byte_t b);
- virtual int32_t writeBytes(int32_t offset, ByteVector* b, int32_t index,
+ virtual int32_t WriteByte(int32_t index, byte_t b);
+ virtual int32_t WriteBytes(int32_t offset,
+ ByteVector* b,
+ int32_t index,
int32_t length);
- virtual int32_t writeBytes(int32_t index, ByteVector* b);
- virtual int32_t writeChar(int32_t index, byte_t c);
- virtual int32_t writeUShort(int32_t index, int32_t us);
- virtual int32_t writeUShortLE(int32_t index, int32_t us);
- virtual int32_t writeShort(int32_t index, int32_t s);
- virtual int32_t writeUInt24(int32_t index, int32_t ui);
- virtual int32_t writeULong(int32_t index, int64_t ul);
- virtual int32_t writeULongLE(int32_t index, int64_t ul);
- virtual int32_t writeLong(int32_t index, int64_t l);
- virtual int32_t writeFixed(int32_t index, int32_t l);
- virtual int32_t writeDateTime(int32_t index, int64_t date);
+ virtual int32_t WriteBytes(int32_t index, ByteVector* b);
+ virtual int32_t WriteChar(int32_t index, byte_t c);
+ virtual int32_t WriteUShort(int32_t index, int32_t us);
+ virtual int32_t WriteUShortLE(int32_t index, int32_t us);
+ virtual int32_t WriteShort(int32_t index, int32_t s);
+ virtual int32_t WriteUInt24(int32_t index, int32_t ui);
+ virtual int32_t WriteULong(int32_t index, int64_t ul);
+ virtual int32_t WriteULongLE(int32_t index, int64_t ul);
+ virtual int32_t WriteLong(int32_t index, int64_t l);
+ virtual int32_t WriteFixed(int32_t index, int32_t l);
+ virtual int32_t WriteDateTime(int32_t index, int64_t date);
// Makes a slice of this FontData. The returned slice will share the data with
// the original FontData.
// @param offset the start of the slice
// @param length the number of bytes in the slice
// @return a slice of the original FontData
- virtual CALLER_ATTACH FontData* slice(int32_t offset, int32_t length);
+ virtual CALLER_ATTACH FontData* Slice(int32_t offset, int32_t length);
// Makes a bottom bound only slice of this array. The returned slice will
// share the data with the original FontData.
// @param offset the start of the slice
// @return a slice of the original FontData
- virtual CALLER_ATTACH FontData* slice(int32_t offset);
+ virtual CALLER_ATTACH FontData* Slice(int32_t offset);
+
+ private:
+ WritableFontData(WritableFontData* data, int32_t offset);
+ WritableFontData(WritableFontData* data, int32_t offset, int32_t length);
};
typedef Ptr<WritableFontData> WritableFontDataPtr;
diff --git a/sfntly/font.cc b/sfntly/font.cc
index bd5614f..fefa17e 100644
--- a/sfntly/font.cc
+++ b/sfntly/font.cc
@@ -14,95 +14,85 @@
* limitations under the License.
*/
+#include "sfntly/font.h"
+
#include <functional>
#include <algorithm>
#include <map>
#include <typeinfo>
-#include "sfntly/font.h"
+#include "sfntly/data/font_input_stream.h"
#include "sfntly/font_factory.h"
-#include "sfntly/tag.h"
#include "sfntly/math/fixed1616.h"
#include "sfntly/math/font_math.h"
-#include "sfntly/data/font_input_stream.h"
#include "sfntly/font_header_table.h"
#include "sfntly/horizontal_header_table.h"
#include "sfntly/horizontal_metrics_table.h"
-#include "sfntly/maximum_profile_table.h"
#include "sfntly/loca_table.h"
+#include "sfntly/maximum_profile_table.h"
#include "sfntly/port/exception_type.h"
+#include "sfntly/tag.h"
namespace sfntly {
-const int32_t SFNTVERSION_1 = Fixed1616::fixed(1, 0);
+const int32_t SFNTVERSION_1 = Fixed1616::Fixed(1, 0);
/******************************************************************************
* Font class
******************************************************************************/
Font::~Font() {}
+bool Font::HasTable(int32_t tag) {
+ TableMap::const_iterator result = tables_.find(tag);
+ TableMap::const_iterator end = tables_.end();
+ return (result != end);
+}
+
+Table* Font::GetTable(int32_t tag) {
+ if (!HasTable(tag)) {
+ return NULL;
+ }
+ return tables_[tag];
+}
+
+TableMap* Font::Tables() {
+ return &tables_;
+}
+
+void Font::Serialize(OutputStream* os, IntegerList* table_ordering) {
+ assert(table_ordering);
+ IntegerList final_table_ordering;
+ TableOrdering(table_ordering, &final_table_ordering);
+ TableHeaderList table_records;
+ BuildTableHeadersForSerialization(&final_table_ordering, &table_records);
+
+ FontOutputStream fos(os);
+ SerializeHeader(&fos, &table_records);
+ SerializeTables(&fos, &table_records);
+}
+
+CALLER_ATTACH WritableFontData* Font::GetNewData(int32_t size) {
+ return factory_->GetNewData(size);
+}
+
Font::Font(FontFactory* factory, int32_t sfnt_version, ByteVector* digest,
TableMap* tables)
- : factory_(factory), sfnt_version_(sfnt_version) {
+ : factory_(factory),
+ sfnt_version_(sfnt_version) {
// non-trivial assignments that makes debugging hard if placed in
// initialization list
digest_ = *digest;
tables_ = *tables;
}
-int32_t Font::version() {
- return sfnt_version_;
-}
-
-ByteVector* Font::digest() {
- return &digest_;
-}
-
-int64_t Font::checksum() {
- return checksum_;
-}
-
-int32_t Font::numTables() {
- return (int32_t)tables_.size();
-}
-
-bool Font::hasTable(int32_t tag) {
- TableMap::const_iterator result = tables_.find(tag);
- TableMap::const_iterator end = tables_.end();
- return (result != end);
-}
-
-Table* Font::table(int32_t tag) {
- if (!hasTable(tag)) {
- return NULL;
- }
- return tables_[tag];
-}
-
-TableMap* Font::tables() {
- return &tables_;
-}
-
-void Font::serialize(OutputStream* os, IntegerList* table_ordering) {
- assert(table_ordering);
- IntegerList final_table_ordering;
- tableOrdering(table_ordering, &final_table_ordering);
- TableHeaderList table_records;
- buildTableHeadersForSerialization(&final_table_ordering, &table_records);
-
- FontOutputStream fos(os);
- serializeHeader(&fos, &table_records);
- serializeTables(&fos, &table_records);
-}
-
-void Font::buildTableHeadersForSerialization(IntegerList* table_ordering,
+void Font::BuildTableHeadersForSerialization(IntegerList* table_ordering,
TableHeaderList* table_headers) {
assert(table_headers);
assert(table_ordering);
IntegerList final_table_ordering;
- tableOrdering(table_ordering, &final_table_ordering);
- int32_t table_offset = Offset::kTableRecordBegin + numTables() *
+ TableOrdering(table_ordering, &final_table_ordering);
+ int32_t table_offset = Offset::kTableRecordBegin + num_tables() *
Offset::kTableRecordSize;
for (IntegerList::iterator tag = final_table_ordering.begin(),
tag_end = final_table_ordering.end();
@@ -110,42 +100,42 @@
TablePtr table = tables_[*tag];
if (table != NULL) {
TableHeaderPtr header =
- new Table::Header(*tag, table->calculatedChecksum(), table_offset,
- table->length());
+ new Table::Header(*tag, table->CalculatedChecksum(), table_offset,
+ table->Length());
table_headers->push_back(header);
- table_offset += (table->length() + 3) & ~3;
+ table_offset += (table->Length() + 3) & ~3;
}
}
}
-void Font::serializeHeader(FontOutputStream* fos,
+void Font::SerializeHeader(FontOutputStream* fos,
TableHeaderList* table_headers) {
- fos->writeFixed(sfnt_version_);
- fos->writeUShort(table_headers->size());
- int32_t log2_of_max_power_of_2 = FontMath::log2(table_headers->size());
+ fos->WriteFixed(sfnt_version_);
+ fos->WriteUShort(table_headers->size());
+ int32_t log2_of_max_power_of_2 = FontMath::Log2(table_headers->size());
int32_t search_range = 2 << (log2_of_max_power_of_2 - 1 + 4);
- fos->writeUShort(search_range);
- fos->writeUShort(log2_of_max_power_of_2);
- fos->writeUShort((table_headers->size() * 16) - search_range);
+ fos->WriteUShort(search_range);
+ fos->WriteUShort(log2_of_max_power_of_2);
+ fos->WriteUShort((table_headers->size() * 16) - search_range);
for (TableHeaderList::iterator record = table_headers->begin(),
record_end = table_headers->end();
record != record_end; ++record) {
- fos->writeULong((*record)->tag());
- fos->writeULong((int32_t)((*record)->checksum()));
- fos->writeULong((*record)->offset());
- fos->writeULong((*record)->length());
+ fos->WriteULong((*record)->tag());
+ fos->WriteULong((int32_t)((*record)->checksum()));
+ fos->WriteULong((*record)->offset());
+ fos->WriteULong((*record)->length());
}
}
-void Font::serializeTables(FontOutputStream* fos,
+void Font::SerializeTables(FontOutputStream* fos,
TableHeaderList* table_headers) {
ByteVector SERIALIZATION_FILLER(3);
std::fill(SERIALIZATION_FILLER.begin(), SERIALIZATION_FILLER.end(), 0);
for (TableHeaderList::iterator record = table_headers->begin(),
end_of_headers = table_headers->end();
record != end_of_headers; ++record) {
- TablePtr target_table = table((*record)->tag());
+ TablePtr target_table = GetTable((*record)->tag());
if (target_table == NULL) {
#if defined (SFNTLY_NO_EXCEPTION)
return;
@@ -153,22 +143,22 @@
throw IOException("Table out of sync with font header.");
#endif
}
- int32_t table_size = target_table->serialize(fos);
+ int32_t table_size = target_table->Serialize(fos);
if (table_size != (*record)->length()) {
assert(false);
}
int32_t filler_size = ((table_size + 3) & ~3) - table_size;
- fos->write(&SERIALIZATION_FILLER, 0, filler_size);
+ fos->Write(&SERIALIZATION_FILLER, 0, filler_size);
}
}
-void Font::tableOrdering(IntegerList* default_table_ordering,
+void Font::TableOrdering(IntegerList* default_table_ordering,
IntegerList* table_ordering) {
assert(default_table_ordering);
assert(table_ordering);
table_ordering->clear();
if (default_table_ordering->empty()) {
- defaultTableOrdering(default_table_ordering);
+ DefaultTableOrdering(default_table_ordering);
}
typedef std::map<int32_t, bool> Int2Bool;
@@ -181,7 +171,7 @@
for (IntegerList::iterator tag = default_table_ordering->begin(),
tag_end = default_table_ordering->end();
tag != tag_end; ++tag) {
- if (hasTable(*tag)) {
+ if (HasTable(*tag)) {
table_ordering->push_back(*tag);
tables_in_font[*tag] = true;
}
@@ -194,10 +184,10 @@
}
}
-void Font::defaultTableOrdering(IntegerList* default_table_ordering) {
+void Font::DefaultTableOrdering(IntegerList* default_table_ordering) {
assert(default_table_ordering);
default_table_ordering->clear();
- if (hasTable(Tag::CFF)) {
+ if (HasTable(Tag::CFF)) {
default_table_ordering->resize(CFF_TABLE_ORDERING_SIZE);
std::copy(CFF_TABLE_ORDERING, CFF_TABLE_ORDERING + CFF_TABLE_ORDERING_SIZE,
default_table_ordering->begin());
@@ -209,62 +199,32 @@
default_table_ordering->begin());
}
-CALLER_ATTACH WritableFontData* Font::getNewData(int32_t size) {
- return factory_->getNewData(size);
-}
-
/******************************************************************************
* Font::Builder class
******************************************************************************/
Font::Builder::~Builder() {}
-Font::Builder::Builder(FontFactory* factory)
- : factory_(factory), sfnt_version_(SFNTVERSION_1) {
-}
-
-void Font::Builder::loadFont(InputStream* is) {
- // Note: we do not throw exception here for is. This is more of an assertion.
- assert(is);
- FontInputStream font_is(is);
- TableHeaderSortedSet records;
- readHeader(&font_is, &records);
- loadTableData(&records, &font_is, &data_blocks_);
- buildAllTableBuilders(&data_blocks_, &table_builders_);
- font_is.close();
-}
-
-void Font::Builder::loadFont(ByteArray* ba,
- int32_t offset_to_offset_table) {
- // Note: we do not throw exception here for is. This is more of an assertion.
- assert(ba);
- WritableFontDataPtr fd = new WritableFontData(ba);
- TableHeaderSortedSet records;
- readHeader(fd, offset_to_offset_table, &records);
- loadTableData(&records, fd, &data_blocks_);
- buildAllTableBuilders(&data_blocks_, &table_builders_);
-}
-
-CALLER_ATTACH Font::Builder* Font::Builder::getOTFBuilder(
+CALLER_ATTACH Font::Builder* Font::Builder::GetOTFBuilder(
FontFactory* factory, InputStream* is) {
FontBuilderPtr builder = new Builder(factory);
- builder->loadFont(is);
- return builder.detach();
+ builder->LoadFont(is);
+ return builder.Detach();
}
-CALLER_ATTACH Font::Builder* Font::Builder::getOTFBuilder(
+CALLER_ATTACH Font::Builder* Font::Builder::GetOTFBuilder(
FontFactory* factory, ByteArray* ba, int32_t offset_to_offset_table) {
FontBuilderPtr builder = new Builder(factory);
- builder->loadFont(ba, offset_to_offset_table);
- return builder.detach();
+ builder->LoadFont(ba, offset_to_offset_table);
+ return builder.Detach();
}
-CALLER_ATTACH Font::Builder* Font::Builder::getOTFBuilder(
+CALLER_ATTACH Font::Builder* Font::Builder::GetOTFBuilder(
FontFactory* factory) {
FontBuilderPtr builder = new Builder(factory);
- return builder.detach();
+ return builder.Detach();
}
-bool Font::Builder::readyToBuild() {
+bool Font::Builder::ReadyToBuild() {
// just read in data with no manipulation
if (table_builders_.empty() && !data_blocks_.empty()) {
return true;
@@ -275,73 +235,69 @@
table_builder_end = table_builders_.end();
table_builder != table_builder_end;
++table_builder) {
- if (!table_builder->second->readyToBuild())
+ if (!table_builder->second->ReadyToBuild())
return false;
}
return true;
}
-CALLER_ATTACH Font* Font::Builder::build() {
+CALLER_ATTACH Font* Font::Builder::Build() {
TableMap tables;
if (!table_builders_.empty()) {
- buildTablesFromBuilders(&table_builders_, &tables);
+ BuildTablesFromBuilders(&table_builders_, &tables);
}
FontPtr font = new Font(factory_, sfnt_version_, &digest_, &tables);
table_builders_.clear();
data_blocks_.clear();
- return font.detach();
+ return font.Detach();
}
-CALLER_ATTACH WritableFontData* Font::Builder::getNewData(int32_t capacity) {
- return factory_->getNewData(capacity);
+CALLER_ATTACH WritableFontData* Font::Builder::GetNewData(int32_t capacity) {
+ return factory_->GetNewData(capacity);
}
-CALLER_ATTACH WritableFontData* Font::Builder::getNewGrowableData(
+CALLER_ATTACH WritableFontData* Font::Builder::GetNewGrowableData(
ReadableFontData* src_data) {
- return factory_->getNewGrowableData(src_data);
+ return factory_->GetNewGrowableData(src_data);
}
-void Font::Builder::setDigest(ByteVector* digest) {
+void Font::Builder::SetDigest(ByteVector* digest) {
digest_.clear();
digest_ = *digest;
}
-void Font::Builder::cleanTableBuilders() {
+void Font::Builder::CleanTableBuilders() {
table_builders_.clear();
}
-bool Font::Builder::hasTableBuilder(int32_t tag) {
+bool Font::Builder::HasTableBuilder(int32_t tag) {
return (table_builders_.find(tag) != table_builders_.end());
}
-Table::Builder* Font::Builder::getTableBuilder(int32_t tag) {
- if (hasTableBuilder(tag))
+Table::Builder* Font::Builder::GetTableBuilder(int32_t tag) {
+ if (HasTableBuilder(tag))
return table_builders_[tag];
return NULL;
}
-CALLER_ATTACH Table::Builder* Font::Builder::newTableBuilder(int32_t tag) {
+CALLER_ATTACH Table::Builder* Font::Builder::NewTableBuilder(int32_t tag) {
TableHeaderPtr header = new Table::Header(tag);
- TableBuilderPtr builder = Table::Builder::getBuilder(this, header, NULL);
+ TableBuilderPtr builder = Table::Builder::GetBuilder(this, header, NULL);
table_builders_.insert(TableBuilderEntry(header->tag(), builder));
return builder;
}
-CALLER_ATTACH Table::Builder* Font::Builder::newTableBuilder(
- int32_t tag, ReadableFontData* src_data) {
+CALLER_ATTACH Table::Builder*
+ Font::Builder::NewTableBuilder(int32_t tag, ReadableFontData* src_data) {
WritableFontDataPtr data;
- data.attach(getNewGrowableData(src_data));
+ data.Attach(GetNewGrowableData(src_data));
TableHeaderPtr header = new Table::Header(tag);
- TableBuilderPtr builder = Table::Builder::getBuilder(this, header, data);
+ TableBuilderPtr builder = Table::Builder::GetBuilder(this, header, data);
table_builders_.insert(TableBuilderEntry(tag, builder));
return builder;
}
-TableBuilderMap* Font::Builder::tableBuilders() {
- return &table_builders_;
-}
-
-void Font::Builder::tableBuilderTags(IntegerSet* key_set) {
+void Font::Builder::TableBuilderTags(IntegerSet* key_set) {
assert(key_set);
key_set->clear();
for (TableBuilderMap::iterator i = table_builders_.begin(),
@@ -350,53 +306,76 @@
}
}
-void Font::Builder::removeTableBuilder(int32_t tag) {
+void Font::Builder::RemoveTableBuilder(int32_t tag) {
TableBuilderMap::iterator target = table_builders_.find(tag);
if (target != table_builders_.end()) {
table_builders_.erase(target);
}
}
-int32_t Font::Builder::numberOfTableBuilders() {
- return (int32_t)table_builders_.size();
+Font::Builder::Builder(FontFactory* factory)
+ : factory_(factory), sfnt_version_(SFNTVERSION_1) {
}
-int32_t Font::Builder::sfntWrapperSize() {
+void Font::Builder::LoadFont(InputStream* is) {
+ // Note: we do not throw exception here for is. This is more of an assertion.
+ assert(is);
+ FontInputStream font_is(is);
+ TableHeaderSortedSet records;
+ ReadHeader(&font_is, &records);
+ LoadTableData(&records, &font_is, &data_blocks_);
+ BuildAllTableBuilders(&data_blocks_, &table_builders_);
+ font_is.Close();
+}
+
+void Font::Builder::LoadFont(ByteArray* ba,
+ int32_t offset_to_offset_table) {
+ // Note: we do not throw exception here for is. This is more of an assertion.
+ assert(ba);
+ WritableFontDataPtr fd = new WritableFontData(ba);
+ TableHeaderSortedSet records;
+ ReadHeader(fd, offset_to_offset_table, &records);
+ LoadTableData(&records, fd, &data_blocks_);
+ BuildAllTableBuilders(&data_blocks_, &table_builders_);
+}
+
+int32_t Font::Builder::SfntWrapperSize() {
return Offset::kSfntHeaderSize +
(Offset::kTableRecordSize * table_builders_.size());
}
-void Font::Builder::buildAllTableBuilders(DataBlockMap* table_data,
+void Font::Builder::BuildAllTableBuilders(DataBlockMap* table_data,
TableBuilderMap* builder_map) {
for (DataBlockMap::iterator record = table_data->begin(),
record_end = table_data->end();
record != record_end; ++record) {
TableBuilderPtr builder;
- builder.attach(getTableBuilder(record->first.p_, record->second.p_));
+ builder.Attach(GetTableBuilder(record->first.p_, record->second.p_));
builder_map->insert(TableBuilderEntry(record->first->tag(), builder));
}
- interRelateBuilders(&table_builders_);
+ InterRelateBuilders(&table_builders_);
}
-CALLER_ATTACH Table::Builder* Font::Builder::getTableBuilder(
- Table::Header* header, WritableFontData* data) {
- return Table::Builder::getBuilder(this, header, data);
+CALLER_ATTACH Table::Builder*
+ Font::Builder::GetTableBuilder(Table::Header* header,
+ WritableFontData* data) {
+ return Table::Builder::GetBuilder(this, header, data);
}
-void Font::Builder::buildTablesFromBuilders(TableBuilderMap* builder_map,
+void Font::Builder::BuildTablesFromBuilders(TableBuilderMap* builder_map,
TableMap* table_map) {
- interRelateBuilders(builder_map);
+ InterRelateBuilders(builder_map);
// Now build all the tables.
for (TableBuilderMap::iterator builder = builder_map->begin(),
builder_end = builder_map->end();
builder != builder_end; ++builder) {
TablePtr table;
- if (builder->second->readyToBuild()) {
+ if (builder->second->ReadyToBuild()) {
#if !defined (SFNTLY_NO_EXCEPTION)
try {
#endif
- table.attach(down_cast<Table*>(builder->second->build()));
+ table.Attach(down_cast<Table*>(builder->second->Build()));
#if !defined (SFNTLY_NO_EXCEPTION)
} catch(IOException& e) {
std::string builder_string = "Unable to build table - ";
@@ -419,7 +398,7 @@
}
}
-void Font::Builder::interRelateBuilders(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 =
@@ -435,87 +414,89 @@
// set the inter table data required to build certain tables
if (horizontal_metrics_builder != NULL) {
if (max_profile_builder != NULL) {
- horizontal_metrics_builder->setNumGlyphs(
- max_profile_builder->numGlyphs());
+ horizontal_metrics_builder->SetNumGlyphs(
+ max_profile_builder->NumGlyphs());
}
if (horizontal_header_builder != NULL) {
- horizontal_metrics_builder->setNumberOfHMetrics(
- horizontal_header_builder->numberOfHMetrics());
+ horizontal_metrics_builder->SetNumberOfHMetrics(
+ horizontal_header_builder->NumberOfHMetrics());
}
}
if (loca_table_builder != NULL) {
if (max_profile_builder != NULL) {
- loca_table_builder->setNumGlyphs(max_profile_builder->numGlyphs());
+ loca_table_builder->SetNumGlyphs(max_profile_builder->NumGlyphs());
}
if (header_table_builder != NULL) {
- loca_table_builder->setFormatVersion(
- header_table_builder->indexToLocFormat());
+ loca_table_builder->SetFormatVersion(
+ header_table_builder->IndexToLocFormat());
}
}
}
-void Font::Builder::readHeader(FontInputStream* is,
+void Font::Builder::ReadHeader(FontInputStream* is,
TableHeaderSortedSet* records) {
assert(records);
- sfnt_version_ = is->readFixed();
- num_tables_ = is->readUShort();
- search_range_ = is->readUShort();
- entry_selector_ = is->readUShort();
- range_shift_ = is->readUShort();
+ sfnt_version_ = is->ReadFixed();
+ num_tables_ = is->ReadUShort();
+ search_range_ = is->ReadUShort();
+ entry_selector_ = is->ReadUShort();
+ range_shift_ = is->ReadUShort();
for (int32_t table_number = 0; table_number < num_tables_; ++table_number) {
// Need to use temporary vars here. C++ evaluates function parameters from
// right to left and thus breaks the order of input stream.
- int32_t tag = is->readULongAsInt();
- int64_t checksum = is->readULong();
- int32_t offset = is->readULongAsInt();
- int32_t length = is->readULongAsInt();
+ int32_t tag = is->ReadULongAsInt();
+ int64_t checksum = is->ReadULong();
+ int32_t offset = is->ReadULongAsInt();
+ int32_t length = is->ReadULongAsInt();
TableHeaderPtr table = new Table::Header(tag, checksum, offset, length);
records->insert(table);
}
}
-void Font::Builder::loadTableData(TableHeaderSortedSet* headers,
+void Font::Builder::ReadHeader(ReadableFontData* fd,
+ int32_t offset,
+ TableHeaderSortedSet* records) {
+ assert(records);
+ sfnt_version_ = fd->ReadFixed(offset + Offset::kSfntVersion);
+ num_tables_ = fd->ReadUShort(offset + Offset::kNumTables);
+ search_range_ = fd->ReadUShort(offset + Offset::kSearchRange);
+ entry_selector_ = fd->ReadUShort(offset + Offset::kEntrySelector);
+ range_shift_ = fd->ReadUShort(offset + Offset::kRangeShift);
+
+ int32_t table_offset = offset + Offset::kTableRecordBegin;
+ for (int32_t table_number = 0;
+ table_number < num_tables_;
+ table_number++, table_offset += Offset::kTableRecordSize) {
+ int32_t tag = fd->ReadULongAsInt(table_offset + Offset::kTableTag);
+ int64_t checksum = fd->ReadULong(table_offset + Offset::kTableCheckSum);
+ int32_t offset = fd->ReadULongAsInt(table_offset + Offset::kTableOffset);
+ int32_t length = fd->ReadULongAsInt(table_offset + Offset::kTableLength);
+ TableHeaderPtr table = new Table::Header(tag, checksum, offset, length);
+ records->insert(table);
+ }
+}
+
+void Font::Builder::LoadTableData(TableHeaderSortedSet* headers,
FontInputStream* is,
DataBlockMap* table_data) {
assert(table_data);
for (TableHeaderSortedSet::iterator
table_header = headers->begin(), table_end = headers->end();
table_header != table_end; ++table_header) {
- is->skip((*table_header)->offset() - is->position());
+ 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);
- array->copyFrom(&table_is, (*table_header)->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));
}
}
-void Font::Builder::readHeader(ReadableFontData* fd, int32_t offset,
- TableHeaderSortedSet* records) {
- assert(records);
- sfnt_version_ = fd->readFixed(offset + Offset::kSfntVersion);
- num_tables_ = fd->readUShort(offset + Offset::kNumTables);
- search_range_ = fd->readUShort(offset + Offset::kSearchRange);
- entry_selector_ = fd->readUShort(offset + Offset::kEntrySelector);
- range_shift_ = fd->readUShort(offset + Offset::kRangeShift);
-
- int32_t table_offset = offset + Offset::kTableRecordBegin;
- for (int32_t table_number = 0;
- table_number < num_tables_;
- table_number++, table_offset += Offset::kTableRecordSize) {
- int32_t tag = fd->readULongAsInt(table_offset + Offset::kTableTag);
- int64_t checksum = fd->readULong(table_offset + Offset::kTableCheckSum);
- int32_t offset = fd->readULongAsInt(table_offset + Offset::kTableOffset);
- int32_t length = fd->readULongAsInt(table_offset + Offset::kTableLength);
- TableHeaderPtr table = new Table::Header(tag, checksum, offset, length);
- records->insert(table);
- }
-}
-
-void Font::Builder::loadTableData(TableHeaderSortedSet* headers,
+void Font::Builder::LoadTableData(TableHeaderSortedSet* headers,
WritableFontData* fd,
DataBlockMap* table_data) {
for (TableHeaderSortedSet::iterator
@@ -523,7 +504,7 @@
table_header != table_end; ++table_header) {
int32_t roundup_length = ((*table_header)->length() + 3) & ~3;
FontDataPtr sliced_data;
- sliced_data.attach(fd->slice((*table_header)->offset(), roundup_length));
+ sliced_data.Attach(fd->Slice((*table_header)->offset(), roundup_length));
WritableFontDataPtr data = down_cast<WritableFontData*>(sliced_data.p_);
table_data->insert(DataBlockEntry(*table_header, data));
}
diff --git a/sfntly/font.h b/sfntly/font.h
index cbd9607..5ce7f17 100644
--- a/sfntly/font.h
+++ b/sfntly/font.h
@@ -122,13 +122,132 @@
class FontFactory;
class Font : public RefCounted<Font> {
+ public:
+ class Builder : public FontDataTableBuilderContainer,
+ public RefCounted<Builder> {
+ public:
+ virtual ~Builder();
+
+ static CALLER_ATTACH Builder*
+ GetOTFBuilder(FontFactory* factory, InputStream* is);
+ static CALLER_ATTACH Builder*
+ GetOTFBuilder(FontFactory* factory,
+ ByteArray* ba,
+ int32_t offset_to_offset_table);
+ static CALLER_ATTACH Builder* GetOTFBuilder(FontFactory* factory);
+ virtual bool ReadyToBuild();
+ virtual CALLER_ATTACH Font* Build();
+ virtual CALLER_ATTACH WritableFontData* GetNewData(int32_t capacity);
+ virtual CALLER_ATTACH WritableFontData*
+ GetNewGrowableData(ReadableFontData* data);
+ virtual void SetDigest(ByteVector* digest);
+ virtual void CleanTableBuilders();
+ virtual bool HasTableBuilder(int32_t tag);
+ virtual Table::Builder* GetTableBuilder(int32_t tag);
+
+ // Creates a new table builder for the table type given by the table id tag.
+ // This new table has been added to the font and will replace any existing
+ // builder for that table.
+ // @return new empty table of the type specified by tag; if tag is not known
+ // then a generic OpenTypeTable is returned
+ virtual CALLER_ATTACH Table::Builder* NewTableBuilder(int32_t tag);
+ virtual CALLER_ATTACH Table::Builder*
+ NewTableBuilder(int32_t tag, ReadableFontData* src_data);
+ virtual TableBuilderMap* table_builders() { return &table_builders_; }
+ virtual void TableBuilderTags(IntegerSet* key_set);
+ // Note: different from Java: we don't return object in removeTableBuilder
+ virtual void RemoveTableBuilder(int32_t tag);
+ virtual int32_t number_of_table_builders() {
+ return (int32_t)table_builders_.size();
+ }
+
+ private:
+ explicit Builder(FontFactory* factory);
+ virtual void LoadFont(InputStream* is);
+ virtual void LoadFont(ByteArray* buffer, int32_t offset_to_offset_table);
+ int32_t SfntWrapperSize();
+ void BuildAllTableBuilders(DataBlockMap* table_data,
+ TableBuilderMap* builder_map);
+ CALLER_ATTACH Table::Builder*
+ GetTableBuilder(Table::Header* header, WritableFontData* data);
+ void BuildTablesFromBuilders(TableBuilderMap* builder_map,
+ TableMap* tables);
+ static void InterRelateBuilders(TableBuilderMap* builder_map);
+ void ReadHeader(FontInputStream* is, TableHeaderSortedSet* records);
+ void ReadHeader(ReadableFontData* fd,
+ int32_t offset,
+ TableHeaderSortedSet* records);
+ void LoadTableData(TableHeaderSortedSet* headers,
+ FontInputStream* is,
+ DataBlockMap* table_data);
+ void LoadTableData(TableHeaderSortedSet* headers,
+ WritableFontData* fd,
+ DataBlockMap* table_data);
+
+ TableBuilderMap table_builders_;
+ FontFactory* factory_; // dumb pointer, avoid circular refcounting
+ int32_t sfnt_version_;
+ int32_t num_tables_;
+ int32_t search_range_;
+ int32_t entry_selector_;
+ int32_t range_shift_;
+ DataBlockMap data_blocks_;
+ ByteVector digest_;
+ };
+
+ virtual ~Font();
+
+ // Gets the sfnt version set in the sfnt wrapper of the font.
+ int32_t version() { return sfnt_version_; }
+
+ // Gets a copy of the fonts digest that was created when the font was read. If
+ // no digest was set at creation time then the return result will be null.
+ ByteVector* digest() { return &digest_; }
+
+ // Get the checksum for this font.
+ int64_t checksum() { return checksum_; }
+
+ // Get the number of tables in this font.
+ int32_t num_tables() { return (int32_t)tables_.size(); }
+
+ // Whether the font has a particular table.
+ bool HasTable(int32_t tag);
+
+ // UNIMPLEMENTED: public Iterator<? extends Table> iterator
+
+ // Get the table in this font with the specified id.
+ // @param tag the identifier of the table
+ // @return the table specified if it exists; null otherwise
+ // C++ port: rename table() to GetTable()
+ Table* GetTable(int32_t tag);
+
+ // Get a map of the tables in this font accessed by table tag.
+ // @return an unmodifiable view of the tables in this font
+ TableMap* Tables();
+
+ // Serialize the font to the output stream.
+ // @param os the destination for the font serialization
+ // @param tableOrdering the table ordering to apply
+ void Serialize(OutputStream* os, IntegerList* table_ordering);
+
+ // Get a new data object. The size is a request for a data object and the
+ // returned data object will support at least that amount. A value greater
+ // than zero for the size is a request for a fixed size data object. A
+ // negative or zero value for the size is a request for a variable sized data
+ // object with the absolute value of the size being an estimate of the space
+ // required.
+ // @param size greater than zero is a request for a fixed size data object of
+ // the given size; less than or equal to zero is a request for a
+ // variable size data object with the absolute size as an estimate
+ CALLER_ATTACH WritableFontData* GetNewData(int32_t size);
+
private:
// Offsets to specific elements in the underlying data. These offsets are
// relative to the start of the table or the start of sub-blocks within the
// table.
struct Offset {
enum {
- // Offsets within the main directory
+ // Offsets within the main directory
kSfntVersion = 0,
kNumTables = 4,
kSearchRange = 6,
@@ -137,7 +256,7 @@
kTableRecordBegin = 12,
kSfntHeaderSize = 12,
- // Offsets within a specific table record
+ // Offsets within a specific table record
kTableTag = 0,
kTableCheckSum = 4,
kTableOffset = 8,
@@ -150,139 +269,17 @@
// static const int32_t CFF_TABLE_ORDERING[];
// static const int32_t TRUE_TYPE_TABLE_ORDERING[];
- public:
- virtual ~Font();
-
- private:
Font(FontFactory* factory, int32_t sfnt_version, ByteVector* digest,
TableMap* tables);
- public:
- // Gets the sfnt version set in the sfnt wrapper of the font.
- virtual int32_t version();
+ void BuildTableHeadersForSerialization(IntegerList* table_ordering,
+ TableHeaderList* table_headers);
+ void SerializeHeader(FontOutputStream* fos, TableHeaderList* table_headers);
+ void SerializeTables(FontOutputStream* fos, TableHeaderList* table_headers);
+ void TableOrdering(IntegerList* default_table_ordering,
+ IntegerList* table_ordering);
+ void DefaultTableOrdering(IntegerList* default_table_ordering);
- // Gets a copy of the fonts digest that was created when the font was read. If
- // no digest was set at creation time then the return result will be null.
- virtual ByteVector* digest();
-
- // Get the checksum for this font.
- virtual int64_t checksum();
-
- // Get the number of tables in this font.
- virtual int32_t numTables();
-
- // Whether the font has a particular table.
- virtual bool hasTable(int32_t tag);
-
- // UNIMPLEMENTED: public Iterator<? extends Table> iterator
-
- // Get the table in this font with the specified id.
- // @param tag the identifier of the table
- // @return the table specified if it exists; null otherwise
- virtual Table* table(int32_t tag);
-
- // Get a map of the tables in this font accessed by table tag.
- // @return an unmodifiable view of the tables in this font
- virtual TableMap* tables();
-
- // Serialize the font to the output stream.
- // @param os the destination for the font serialization
- // @param tableOrdering the table ordering to apply
- virtual void serialize(OutputStream* os, IntegerList* table_ordering);
-
- private:
- void buildTableHeadersForSerialization(IntegerList* table_ordering,
- TableHeaderList* table_headers);
- void serializeHeader(FontOutputStream* fos, TableHeaderList* table_headers);
- void serializeTables(FontOutputStream* fos, TableHeaderList* table_headers);
- void tableOrdering(IntegerList* default_table_ordering,
- IntegerList* table_ordering);
- void defaultTableOrdering(IntegerList* default_table_ordering);
-
- public:
- class Builder : public FontDataTableBuilderContainer,
- public RefCounted<Builder> {
- public:
- virtual ~Builder();
-
- private:
- explicit Builder(FontFactory* factory);
- virtual void loadFont(InputStream* is);
- virtual void loadFont(ByteArray* buffer, int32_t offset_to_offset_table);
-
- public:
- static CALLER_ATTACH Builder*
- getOTFBuilder(FontFactory* factory, InputStream* is);
- static CALLER_ATTACH Builder*
- getOTFBuilder(FontFactory* factory, ByteArray* ba,
- int32_t offset_to_offset_table);
- static CALLER_ATTACH Builder* getOTFBuilder(FontFactory* factory);
- virtual bool readyToBuild();
- virtual CALLER_ATTACH Font* build();
- virtual CALLER_ATTACH WritableFontData* getNewData(int32_t capacity);
- virtual CALLER_ATTACH WritableFontData*
- getNewGrowableData(ReadableFontData* data);
- virtual void setDigest(ByteVector* digest);
- virtual void cleanTableBuilders();
- virtual bool hasTableBuilder(int32_t tag);
- virtual Table::Builder* getTableBuilder(int32_t tag);
-
- // Creates a new table builder for the table type given by the table id tag.
- // This new table has been added to the font and will replace any existing
- // builder for that table.
- // @return new empty table of the type specified by tag; if tag is not known
- // then a generic OpenTypeTable is returned
- virtual CALLER_ATTACH Table::Builder* newTableBuilder(int32_t tag);
- virtual CALLER_ATTACH Table::Builder*
- newTableBuilder(int32_t tag, ReadableFontData* src_data);
- virtual TableBuilderMap* tableBuilders();
- virtual void tableBuilderTags(IntegerSet* key_set);
- // Note: different from Java: we don't return object in removeTableBuilder
- virtual void removeTableBuilder(int32_t tag);
- virtual int32_t numberOfTableBuilders();
-
- private:
- int32_t sfntWrapperSize();
- void buildAllTableBuilders(DataBlockMap* table_data,
- TableBuilderMap* builder_map);
- CALLER_ATTACH Table::Builder*
- getTableBuilder(Table::Header* header, WritableFontData* data);
- void buildTablesFromBuilders(TableBuilderMap* builder_map,
- TableMap* tables);
- static void interRelateBuilders(TableBuilderMap* builder_map);
- void readHeader(FontInputStream* is, TableHeaderSortedSet* records);
- void loadTableData(TableHeaderSortedSet* headers, FontInputStream* is,
- DataBlockMap* table_data);
- void readHeader(ReadableFontData* fd, int32_t offset,
- TableHeaderSortedSet* records);
- void loadTableData(TableHeaderSortedSet* headers, WritableFontData* fd,
- DataBlockMap* table_data);
-
- private:
- TableBuilderMap table_builders_;
- FontFactory* factory_; // dumb pointer, avoid circular refcounting
- int32_t sfnt_version_;
- int32_t num_tables_;
- int32_t search_range_;
- int32_t entry_selector_;
- int32_t range_shift_;
- DataBlockMap data_blocks_;
- ByteVector digest_;
- };
-
- public:
- // Get a new data object. The size is a request for a data object and the
- // returned data object will support at least that amount. A value greater
- // than zero for the size is a request for a fixed size data object. A
- // negative or zero value for the size is a request for a variable sized data
- // object with the absolute value of the size being an estimate of the space
- // required.
- // @param size greater than zero is a request for a fixed size data object of
- // the given size; less than or equal to zero is a request for a
- // variable size data object with the absolute size as an estimate
- CALLER_ATTACH WritableFontData* getNewData(int32_t size);
-
- private:
FontFactory* factory_; // dumb pointer, avoid circular ref-counting
int32_t sfnt_version_;
ByteVector digest_;
diff --git a/sfntly/font_data_table.cc b/sfntly/font_data_table.cc
index 9896b24..1f9d1cc 100644
--- a/sfntly/font_data_table.cc
+++ b/sfntly/font_data_table.cc
@@ -15,6 +15,7 @@
*/
#include "sfntly/font_data_table.h"
+
#include "sfntly/data/font_output_stream.h"
namespace sfntly {
@@ -29,158 +30,142 @@
FontDataTable::~FontDataTable() {}
-ReadableFontData* FontDataTable::readFontData() {
+ReadableFontData* FontDataTable::ReadFontData() {
return data_;
}
-int32_t FontDataTable::length() {
- return data_->length();
+int32_t FontDataTable::Length() {
+ return data_->Length();
}
-int32_t FontDataTable::padding() {
+int32_t FontDataTable::Padding() {
return -1;
}
-int32_t FontDataTable::dataLength() {
- int32_t paddings = padding();
- return (paddings == -1) ? length() : length() - paddings;
+int32_t FontDataTable::DataLength() {
+ int32_t paddings = Padding();
+ return (paddings == -1) ? Length() : Length() - paddings;
}
-int32_t FontDataTable::serialize(OutputStream* os) {
- return data_->copyTo(os);
+int32_t FontDataTable::Serialize(OutputStream* os) {
+ return data_->CopyTo(os);
}
/******************************************************************************
* FontDataTable::Builder class
******************************************************************************/
-void FontDataTable::Builder::init(FontDataTableBuilderContainer* container) {
- container_ = container;
- model_changed_ = false;
- data_changed_ = false;
+CALLER_ATTACH WritableFontData* FontDataTable::Builder::Data() {
+ WritableFontDataPtr new_data;
+ if (model_changed_) {
+ if (!SubReadyToSerialize()) {
+ return NULL;
+ }
+ int32_t size = SubDataSizeToSerialize();
+ new_data.Attach(container_->GetNewData(size));
+ SubSerialize(new_data);
+ } else {
+ ReadableFontDataPtr data = InternalReadData();
+ new_data.Attach(container_->GetNewData(data != NULL ? data->Length() : 0));
+ data->CopyTo(new_data);
+ }
+ return new_data.Detach();
+}
+
+void FontDataTable::Builder::SetData(ReadableFontData* data) {
+ InternalSetData(data, true);
+}
+
+
+CALLER_ATTACH FontDataTable* FontDataTable::Builder::Build() {
+ ReadableFontDataPtr data = InternalReadData();
+ if (model_changed_) {
+ // Let subclass serialize from model.
+ if (!SubReadyToSerialize()) {
+ return NULL;
+ }
+ int32_t size = SubDataSizeToSerialize();
+ WritableFontDataPtr new_data;
+ new_data.Attach(container_->GetNewData(size));
+ SubSerialize(new_data);
+ data = new_data;
+ }
+ FontDataTablePtr table = SubBuildTable(data);
+ NotifyPostTableBuild(table);
+ return table;
+}
+
+bool FontDataTable::Builder::ReadyToBuild() {
+ return true;
+}
+
+ReadableFontData* FontDataTable::Builder::InternalReadData() {
+ return (r_data_ != NULL) ? r_data_.p_ :
+ static_cast<ReadableFontData*>(w_data_.p_);
+}
+
+WritableFontData* FontDataTable::Builder::InternalWriteData() {
+ if (w_data_ == NULL) {
+ WritableFontDataPtr new_data;
+ new_data.Attach(container_->GetNewData(r_data_->Length()));
+ r_data_->CopyTo(new_data);
+ InternalSetData(new_data, false);
+ }
+ return w_data_.p_;
+}
+
+CALLER_ATTACH WritableFontData*
+ FontDataTable::Builder::InternalNewData(int32_t size) {
+ return container_->GetNewData(size);
}
FontDataTable::Builder::Builder(FontDataTableBuilderContainer* container) {
- init(container);
+ Init(container);
}
FontDataTable::Builder::Builder(FontDataTableBuilderContainer* container,
WritableFontData* data) {
- init(container);
+ Init(container);
w_data_ = data;
}
FontDataTable::Builder::Builder(FontDataTableBuilderContainer* container,
ReadableFontData* data) {
- init(container);
+ Init(container);
r_data_ = data;
}
FontDataTable::Builder::~Builder() {
}
-WritableFontData* FontDataTable::Builder::data() {
- WritableFontDataPtr new_data;
- if (model_changed_) {
- if (!subReadyToSerialize()) {
- return NULL;
- }
- int32_t size = subDataSizeToSerialize();
- new_data.attach(container_->getNewData(size));
- subSerialize(new_data);
- } else {
- ReadableFontDataPtr data = internalReadData();
- new_data.attach(container_->getNewData(data != NULL ? data->length() : 0));
- data->copyTo(new_data);
- }
- return new_data.detach();
+void FontDataTable::Builder::Init(FontDataTableBuilderContainer* container) {
+ container_ = container;
+ model_changed_ = false;
+ data_changed_ = false;
}
-void FontDataTable::Builder::setData(ReadableFontData* data) {
- internalSetData(data, true);
+void FontDataTable::Builder::NotifyPostTableBuild(FontDataTable* table) {
+ // Default: NOP.
+ UNREFERENCED_PARAMETER(table);
}
-void FontDataTable::Builder::internalSetData(WritableFontData* data,
+void FontDataTable::Builder::InternalSetData(WritableFontData* data,
bool data_changed) {
w_data_ = data;
r_data_ = NULL;
if (data_changed) {
data_changed_ = true;
- subDataSet();
+ SubDataSet();
}
}
-void FontDataTable::Builder::internalSetData(ReadableFontData* data,
+void FontDataTable::Builder::InternalSetData(ReadableFontData* data,
bool data_changed) {
w_data_ = NULL;
r_data_ = data;
if (data_changed) {
data_changed_ = true;
- subDataSet();
+ SubDataSet();
}
}
-CALLER_ATTACH FontDataTable* FontDataTable::Builder::build() {
- ReadableFontDataPtr data = internalReadData();
- if (model_changed_) {
- // Let subclass serialize from model.
- if (!subReadyToSerialize()) {
- return NULL;
- }
- int32_t size = subDataSizeToSerialize();
- WritableFontDataPtr new_data;
- new_data.attach(container_->getNewData(size));
- subSerialize(new_data);
- data = new_data;
- }
- FontDataTablePtr table = subBuildTable(data);
- notifyPostTableBuild(table);
- return table;
-}
-
-bool FontDataTable::Builder::readyToBuild() {
- return true;
-}
-
-ReadableFontData* FontDataTable::Builder::internalReadData() {
- return (r_data_ != NULL) ? r_data_.p_ :
- static_cast<ReadableFontData*>(w_data_.p_);
-}
-
-WritableFontData* FontDataTable::Builder::internalWriteData() {
- if (w_data_ == NULL) {
- WritableFontDataPtr new_data;
- new_data.attach(container_->getNewData(r_data_->length()));
- r_data_->copyTo(new_data);
- internalSetData(new_data, false);
- }
- return w_data_.p_;
-}
-
-WritableFontData* FontDataTable::Builder::internalNewData(int32_t size) {
- return container_->getNewData(size);
-}
-
-bool FontDataTable::Builder::dataChanged() {
- return data_changed_;
-}
-
-bool FontDataTable::Builder::modelChanged() {
- return model_changed_;
-}
-
-bool FontDataTable::Builder::setModelChanged() {
- return setModelChanged(true);
-}
-
-bool FontDataTable::Builder::setModelChanged(bool changed) {
- bool old = model_changed_;
- model_changed_ = changed;
- return old;
-}
-
-void FontDataTable::Builder::notifyPostTableBuild(FontDataTable* table) {
- // default: NOP
- UNREFERENCED_PARAMETER(table);
-}
-
} // namespace sfntly
diff --git a/sfntly/font_data_table.h b/sfntly/font_data_table.h
index 28bec15..9b3b467 100644
--- a/sfntly/font_data_table.h
+++ b/sfntly/font_data_table.h
@@ -25,75 +25,58 @@
class FontDataTable : virtual public RefCount {
public:
- explicit FontDataTable(ReadableFontData* data);
- virtual ~FontDataTable();
-
- // Get the readable font data for this table.
- ReadableFontData* readFontData();
-
- // Get the length of the data for this table in bytes. This is the full
- // allocated length of the data and may or may not include any padding.
- virtual int32_t length();
-
- // Get the number of bytes of padding used in the table. The padding bytes are
- // used to align the table length to a 4 byte boundary.
- virtual int32_t padding();
-
- // Return the number of bytes of non-padded data in the table. If the padding
- // is unknown or unknowable then the total number of bytes of data in the
- // tables is returned.
- virtual int32_t dataLength();
-
- virtual int32_t serialize(OutputStream* os);
-
- public:
// Note: original version is abstract Builder<T extends FontDataTable>
// C++ template is not designed that way so plain class is chosen.
class Builder : virtual public RefCount {
- protected:
- explicit Builder(FontDataTableBuilderContainer* container);
- Builder(FontDataTableBuilderContainer* container, WritableFontData* data);
- Builder(FontDataTableBuilderContainer* container, ReadableFontData* data);
- virtual ~Builder();
-
- void init(FontDataTableBuilderContainer* container);
-
public:
// Get a snapshot copy of the internal data of the builder.
// This causes any internal data structures to be serialized to a new data
// object. This data object belongs to the caller and must be properly
// disposed of. No changes are made to the builder and any changes to the
// data directly do not affect the internal state. To do that a subsequent
- // call must be made to {@link #setData(WritableFontData)}.
+ // call must be made to {@link #SetData(WritableFontData)}.
// @return a copy of the internal data of the builder
- WritableFontData* data();
- virtual void setData(ReadableFontData* data);
+ CALLER_ATTACH WritableFontData* Data();
+ virtual void SetData(ReadableFontData* data);
- private:
- void internalSetData(WritableFontData* data, bool data_changed);
- void internalSetData(ReadableFontData* data, bool data_changed);
+ // Note: changed from protected to avoid accessibility error in C++
+ virtual CALLER_ATTACH FontDataTable* Build();
+ virtual bool ReadyToBuild();
- public: // Note: changed from protected to avoid accessibility error in C++
- virtual FontDataTable* build();
- virtual bool readyToBuild();
- virtual ReadableFontData* internalReadData();
- virtual WritableFontData* internalWriteData();
- virtual WritableFontData* internalNewData(int32_t size);
- virtual bool dataChanged();
- virtual bool modelChanged();
- virtual bool setModelChanged();
- virtual bool setModelChanged(bool changed);
+ ReadableFontData* InternalReadData();
+ WritableFontData* InternalWriteData();
+ CALLER_ATTACH WritableFontData* InternalNewData(int32_t size);
- protected: // subclass API
- virtual void notifyPostTableBuild(FontDataTable* table);
- virtual int32_t subSerialize(WritableFontData* new_data) = 0;
- virtual bool subReadyToSerialize() = 0;
- virtual int32_t subDataSizeToSerialize() = 0;
- virtual void subDataSet() = 0;
+ bool data_changed() { return data_changed_; }
+ bool modelChanged() { return model_changed_; }
+ bool set_model_changed() { return set_model_changed(true); }
+ bool set_model_changed(bool changed) {
+ bool old = model_changed_;
+ model_changed_ = changed;
+ return old;
+ }
+
+ protected:
+ explicit Builder(FontDataTableBuilderContainer* container);
+ Builder(FontDataTableBuilderContainer* container, WritableFontData* data);
+ Builder(FontDataTableBuilderContainer* container, ReadableFontData* data);
+ virtual ~Builder();
+
+ void Init(FontDataTableBuilderContainer* container);
+
+ // subclass API
+ virtual void NotifyPostTableBuild(FontDataTable* table);
+ virtual int32_t SubSerialize(WritableFontData* new_data) = 0;
+ virtual bool SubReadyToSerialize() = 0;
+ virtual int32_t SubDataSizeToSerialize() = 0;
+ virtual void SubDataSet() = 0;
virtual CALLER_ATTACH FontDataTable*
- subBuildTable(ReadableFontData* data) = 0;
+ SubBuildTable(ReadableFontData* data) = 0;
private:
+ void InternalSetData(WritableFontData* data, bool data_changed);
+ void InternalSetData(ReadableFontData* data, bool data_changed);
+
FontDataTableBuilderContainer* container_; // avoid circular ref-counting
WritableFontDataPtr w_data_;
ReadableFontDataPtr r_data_;
@@ -101,7 +84,29 @@
bool data_changed_;
};
+ explicit FontDataTable(ReadableFontData* data);
+ virtual ~FontDataTable();
+
+ // Get the readable font data for this table.
+ ReadableFontData* ReadFontData();
+
+ // Get the length of the data for this table in bytes. This is the full
+ // allocated length of the data and may or may not include any padding.
+ virtual int32_t Length();
+
+ // Get the number of bytes of padding used in the table. The padding bytes are
+ // used to align the table length to a 4 byte boundary.
+ virtual int32_t Padding();
+
+ // Return the number of bytes of non-padded data in the table. If the padding
+ // is unknown or unknowable then the total number of bytes of data in the
+ // tables is returned.
+ virtual int32_t DataLength();
+
+ virtual int32_t Serialize(OutputStream* os);
+
protected:
+ // TODO(arthurhsu): style guide violation: protected member, need refactoring
ReadableFontDataPtr data_;
};
typedef Ptr<FontDataTable> FontDataTablePtr;
diff --git a/sfntly/font_data_table_builder_container.h b/sfntly/font_data_table_builder_container.h
index 7866a36..f3ccf61 100644
--- a/sfntly/font_data_table_builder_container.h
+++ b/sfntly/font_data_table_builder_container.h
@@ -23,7 +23,7 @@
class FontDataTableBuilderContainer {
public:
- virtual WritableFontData* getNewData(int32_t size) = 0;
+ virtual WritableFontData* GetNewData(int32_t size) = 0;
// Make gcc -Wnon-virtual-dtor happy.
virtual ~FontDataTableBuilderContainer() {}
};
diff --git a/sfntly/font_factory.cc b/sfntly/font_factory.cc
index b741f0a..d5b2397 100644
--- a/sfntly/font_factory.cc
+++ b/sfntly/font_factory.cc
@@ -14,229 +14,233 @@
* limitations under the License.
*/
+#include "sfntly/font_factory.h"
+
#include <string.h>
-#include "sfntly/font_factory.h"
#include "sfntly/tag.h"
#include "sfntly/data/memory_byte_array.h"
#include "sfntly/data/growable_memory_byte_array.h"
namespace sfntly {
-FontFactory::FontFactory() : fingerprint_(false) {
-}
-
FontFactory::~FontFactory() {
}
-CALLER_ATTACH FontFactory* FontFactory::getInstance() {
+CALLER_ATTACH FontFactory* FontFactory::GetInstance() {
FontFactoryPtr instance = new FontFactory();
- return instance.detach();
+ return instance.Detach();
}
-void FontFactory::fingerprintFont(bool fingerprint) {
+void FontFactory::FingerprintFont(bool fingerprint) {
fingerprint_ = fingerprint;
}
-bool FontFactory::fingerprintFont() {
+bool FontFactory::FingerprintFont() {
return fingerprint_;
}
-void FontFactory::loadFonts(InputStream* is, FontArray* output) {
+void FontFactory::LoadFonts(InputStream* is, FontArray* output) {
assert(output);
PushbackInputStream* pbis = down_cast<PushbackInputStream*>(is);
- if (isCollection(pbis)) {
- loadCollection(pbis, output);
+ if (IsCollection(pbis)) {
+ LoadCollection(pbis, output);
return;
}
- FontPtr font = loadSingleOTF(pbis);
+ FontPtr font = LoadSingleOTF(pbis);
if (font) {
output->push_back(font);
}
}
-void FontFactory::loadFontsForBuilding(InputStream* is,
+void FontFactory::LoadFonts(ByteArray* ba, FontArray* output) {
+ if (IsCollection(ba)) {
+ LoadCollection(ba, output);
+ return;
+ }
+ FontPtr font;
+ font.Attach(LoadSingleOTF(ba));
+ if (font) {
+ output->push_back(font);
+ }
+}
+
+void FontFactory::LoadFontsForBuilding(InputStream* is,
FontBuilderArray* output) {
PushbackInputStream* pbis = down_cast<PushbackInputStream*>(is);
- if (isCollection(pbis)) {
- loadCollectionForBuilding(pbis, output);
+ if (IsCollection(pbis)) {
+ LoadCollectionForBuilding(pbis, output);
return;
}
FontBuilderPtr builder;
- builder.attach(loadSingleOTFForBuilding(pbis));
+ builder.Attach(LoadSingleOTFForBuilding(pbis));
if (builder) {
output->push_back(builder);
}
}
-Font* FontFactory::loadSingleOTF(InputStream* is) {
+void FontFactory::LoadFontsForBuilding(ByteArray* ba,
+ FontBuilderArray* output) {
+ if (IsCollection(ba)) {
+ LoadCollectionForBuilding(ba, output);
+ return;
+ }
FontBuilderPtr builder;
- builder.attach(loadSingleOTFForBuilding(is));
- return builder->build();
+ builder.Attach(LoadSingleOTFForBuilding(ba, 0));
+ if (builder) {
+ output->push_back(builder);
+ }
}
-void FontFactory::loadCollection(InputStream* is, FontArray* output) {
+CALLER_ATTACH WritableFontData* FontFactory::GetNewData(int32_t capacity) {
+ // UNIMPLMENTED: if (capacity > 0) { this.GetNewFixedData(capacity); }
+ // Seems a no-op.
+ return GetNewGrowableData(capacity);
+}
+
+CALLER_ATTACH WritableFontData* FontFactory::GetNewFixedData(int32_t capacity) {
+ ByteArrayPtr buffer;
+ buffer.Attach(GetNewArray(capacity));
+ WritableFontDataPtr new_fixed_data = new WritableFontData(buffer);
+ return new_fixed_data.Detach();
+}
+
+CALLER_ATTACH WritableFontData* FontFactory::GetNewGrowableData(
+ int32_t capacity) {
+ ByteArrayPtr buffer;
+ buffer.Attach(GetNewGrowableArray(capacity));
+ WritableFontDataPtr new_growable_data = new WritableFontData(buffer);
+ return new_growable_data.Detach();
+}
+
+CALLER_ATTACH WritableFontData* FontFactory::GetNewGrowableData(
+ ReadableFontData* src_data) {
+ WritableFontDataPtr data;
+ data.Attach(GetNewGrowableData(src_data->Length()));
+ src_data->CopyTo(data);
+ return data.Detach();
+}
+
+CALLER_ATTACH ByteArray* FontFactory::GetNewArray(int32_t length) {
+ ByteArrayPtr new_fixed_array = new MemoryByteArray(length);
+ return new_fixed_array.Detach();
+}
+
+CALLER_ATTACH ByteArray* FontFactory::GetNewGrowableArray(int32_t length) {
+ UNREFERENCED_PARAMETER(length);
+ ByteArrayPtr new_growable_array = new GrowableMemoryByteArray();
+ return new_growable_array.Detach();
+}
+
+void FontFactory::SerializeFont(Font* font, OutputStream* os) {
+ font->Serialize(os, &table_ordering_);
+}
+
+void FontFactory::SetSerializationTableOrdering(
+ const IntegerList& table_ordering) {
+ table_ordering_ = table_ordering;
+}
+
+CALLER_ATTACH Font::Builder* FontFactory::NewFontBuilder() {
+ return Font::Builder::GetOTFBuilder(this);
+}
+
+CALLER_ATTACH Font* FontFactory::LoadSingleOTF(InputStream* is) {
+ FontBuilderPtr builder;
+ builder.Attach(LoadSingleOTFForBuilding(is));
+ return builder->Build();
+}
+
+CALLER_ATTACH Font* FontFactory::LoadSingleOTF(ByteArray* ba) {
+ FontBuilderPtr builder;
+ builder.Attach(LoadSingleOTFForBuilding(ba, 0));
+ return builder->Build();
+}
+
+void FontFactory::LoadCollection(InputStream* is, FontArray* output) {
FontBuilderArray ba;
- loadCollectionForBuilding(is, &ba);
+ LoadCollectionForBuilding(is, &ba);
output->reserve(ba.size());
for (FontBuilderArray::iterator builder = ba.begin(), builders_end = ba.end();
builder != builders_end; ++builder) {
FontPtr font;
- font.attach((*builder)->build());
+ font.Attach((*builder)->Build());
output->push_back(font);
}
}
-Font::Builder* FontFactory::loadSingleOTFForBuilding(InputStream* is) {
- // UNIMPLEMENTED: SHA-1 hash checking via Java DigestStream
- Font::Builder* builder = Font::Builder::getOTFBuilder(this, is);
- // UNIMPLEMENTED: setDigest
- return builder;
-}
-
-void FontFactory::loadCollectionForBuilding(InputStream* is,
- FontBuilderArray* builders) {
- ByteArrayPtr ba = new GrowableMemoryByteArray();
- ba->copyFrom(is);
- loadCollectionForBuilding(ba, builders);
-}
-
-bool FontFactory::isCollection(PushbackInputStream* pbis) {
- ByteVector tag(4);
- pbis->read(&tag);
- pbis->unread(&tag);
- return Tag::ttcf == generate_tag(tag[0], tag[1], tag[2], tag[3]);
-}
-
-void FontFactory::loadFonts(ByteArray* ba, FontArray* output) {
- if (isCollection(ba)) {
- loadCollection(ba, output);
- return;
- }
- FontPtr font;
- font.attach(loadSingleOTF(ba));
- if (font) {
- output->push_back(font);
- }
-}
-
-void FontFactory::loadFontsForBuilding(ByteArray* ba,
- FontBuilderArray* output) {
- if (isCollection(ba)) {
- loadCollectionForBuilding(ba, output);
- return;
- }
- FontBuilderPtr builder;
- builder.attach(loadSingleOTFForBuilding(ba, 0));
- if (builder) {
- output->push_back(builder);
- }
-}
-
-Font* FontFactory::loadSingleOTF(ByteArray* ba) {
- FontBuilderPtr builder;
- builder.attach(loadSingleOTFForBuilding(ba, 0));
- return builder->build();
-}
-
-void FontFactory::loadCollection(ByteArray* ba, FontArray* output) {
+void FontFactory::LoadCollection(ByteArray* ba, FontArray* output) {
FontBuilderArray builders;
- loadCollectionForBuilding(ba, &builders);
- output->reserve(ba->size());
+ LoadCollectionForBuilding(ba, &builders);
+ output->reserve(ba->Size());
for (FontBuilderArray::iterator
- builder = builders.begin(), builders_end = builders.end();
+ builder = builders.begin(), builders_end = builders.end();
builder != builders_end; ++builder) {
FontPtr font;
- font.attach((*builder)->build());
+ font.Attach((*builder)->Build());
output->push_back(font);
}
}
-Font::Builder* FontFactory::loadSingleOTFForBuilding(ByteArray* ba,
- int32_t offset_to_offset_table) {
+CALLER_ATTACH Font::Builder*
+ FontFactory::LoadSingleOTFForBuilding(InputStream* is) {
// UNIMPLEMENTED: SHA-1 hash checking via Java DigestStream
- Font::Builder* builder =
- Font::Builder::getOTFBuilder(this, ba, offset_to_offset_table);
+ Font::Builder* builder = Font::Builder::GetOTFBuilder(this, is);
// UNIMPLEMENTED: setDigest
return builder;
}
-void FontFactory::loadCollectionForBuilding(ByteArray* ba,
+CALLER_ATTACH Font::Builder*
+ FontFactory::LoadSingleOTFForBuilding(ByteArray* ba,
+ int32_t offset_to_offset_table) {
+ // UNIMPLEMENTED: SHA-1 hash checking via Java DigestStream
+ Font::Builder* builder =
+ Font::Builder::GetOTFBuilder(this, ba, offset_to_offset_table);
+ // UNIMPLEMENTED: setDigest
+ return builder;
+}
+
+void FontFactory::LoadCollectionForBuilding(InputStream* is,
+ FontBuilderArray* builders) {
+ ByteArrayPtr ba = new GrowableMemoryByteArray();
+ ba->CopyFrom(is);
+ LoadCollectionForBuilding(ba, builders);
+}
+
+void FontFactory::LoadCollectionForBuilding(ByteArray* ba,
FontBuilderArray* builders) {
ReadableFontDataPtr rfd = new ReadableFontData(ba);
- int32_t ttc_tag = rfd->readULongAsInt(Offset::kTTCTag);
+ int32_t ttc_tag = rfd->ReadULongAsInt(Offset::kTTCTag);
UNREFERENCED_PARAMETER(ttc_tag);
- int32_t version = rfd->readFixed(Offset::kVersion);
+ int32_t version = rfd->ReadFixed(Offset::kVersion);
UNREFERENCED_PARAMETER(version);
- int32_t num_fonts = rfd->readULongAsInt(Offset::kNumFonts);
+ int32_t num_fonts = rfd->ReadULongAsInt(Offset::kNumFonts);
builders->reserve(num_fonts);
int32_t offset_table_offset = Offset::kOffsetTable;
for (int32_t font_number = 0; font_number < num_fonts;
font_number++, offset_table_offset += DataSize::kULONG) {
- int32_t offset = rfd->readULongAsInt(offset_table_offset);
+ int32_t offset = rfd->ReadULongAsInt(offset_table_offset);
FontBuilderPtr builder;
- builder.attach(loadSingleOTFForBuilding(ba, offset));
+ builder.Attach(LoadSingleOTFForBuilding(ba, offset));
builders->push_back(builder);
}
}
-bool FontFactory::isCollection(ByteArray* ba) {
+bool FontFactory::IsCollection(PushbackInputStream* pbis) {
+ ByteVector tag(4);
+ pbis->Read(&tag);
+ pbis->Unread(&tag);
+ return Tag::ttcf == GenerateTag(tag[0], tag[1], tag[2], tag[3]);
+}
+
+bool FontFactory::IsCollection(ByteArray* ba) {
return Tag::ttcf ==
- generate_tag(ba->get(0), ba->get(1), ba->get(2), ba->get(3));
+ GenerateTag(ba->Get(0), ba->Get(1), ba->Get(2), ba->Get(3));
}
-CALLER_ATTACH WritableFontData* FontFactory::getNewData(int32_t capacity) {
- // UNIMPLMENTED: if (capacity > 0) { this.getNewFixedData(capacity); }
- // seems a no-op
- return getNewGrowableData(capacity);
-}
-
-CALLER_ATTACH WritableFontData* FontFactory::getNewFixedData(int32_t capacity) {
- ByteArrayPtr buffer;
- buffer.attach(getNewArray(capacity));
- WritableFontDataPtr new_fixed_data = new WritableFontData(buffer);
- return new_fixed_data.detach();
-}
-
-CALLER_ATTACH WritableFontData* FontFactory::getNewGrowableData(
- int32_t capacity) {
- ByteArrayPtr buffer;
- buffer.attach(getNewGrowableArray(capacity));
- WritableFontDataPtr new_growable_data = new WritableFontData(buffer);
- return new_growable_data.detach();
-}
-
-CALLER_ATTACH WritableFontData* FontFactory::getNewGrowableData(
- ReadableFontData* src_data) {
- WritableFontDataPtr data;
- data.attach(getNewGrowableData(src_data->length()));
- src_data->copyTo(data);
- return data.detach();
-}
-
-CALLER_ATTACH ByteArray* FontFactory::getNewArray(int32_t length) {
- ByteArrayPtr new_fixed_array = new MemoryByteArray(length);
- return new_fixed_array.detach();
-}
-
-CALLER_ATTACH ByteArray* FontFactory::getNewGrowableArray(int32_t length) {
- UNREFERENCED_PARAMETER(length);
- ByteArrayPtr new_growable_array = new GrowableMemoryByteArray();
- return new_growable_array.detach();
-}
-
-void FontFactory::serializeFont(Font* font, OutputStream* os) {
- font->serialize(os, &table_ordering_);
-}
-
-void FontFactory::setSerializationTableOrdering(
- const IntegerList& table_ordering) {
- table_ordering_ = table_ordering;
-}
-
-CALLER_ATTACH Font::Builder* FontFactory::newFontBuilder() {
- return Font::Builder::getOTFBuilder(this);
+FontFactory::FontFactory()
+ : fingerprint_(false) {
}
} // namespace sfntly
diff --git a/sfntly/font_factory.h b/sfntly/font_factory.h
index 907ea66..7be0841 100644
--- a/sfntly/font_factory.h
+++ b/sfntly/font_factory.h
@@ -26,20 +26,92 @@
namespace sfntly {
class FontFactory : public RefCounted<FontFactory> {
+ public:
+ virtual ~FontFactory();
+
+ // Factory method for the construction of a font factory.
+ static CALLER_ATTACH FontFactory* GetInstance();
+
+ // Toggle whether fonts that are loaded are fingerprinted with a SHA-1 hash.
+ // If a font is fingerprinted then a SHA-1 hash is generated at load time and
+ // stored in the font. This is useful for uniquely identifying fonts. By
+ // default this is turned on.
+ // @param fingerprint whether fingerprinting should be turned on or off
+ // TODO(arthurhsu): IMPLEMENT: C++ port currently don't do any SHA-1
+ void FingerprintFont(bool fingerprint);
+ bool FingerprintFont();
+
+ // Load the font(s) from the input stream. The current settings on the factory
+ // are used during the loading process. One or more fonts are returned if the
+ // stream contains valid font data. Some font container formats may have more
+ // than one font and in this case multiple font objects will be returned. If
+ // the data in the stream cannot be parsed or is invalid an array of size zero
+ // will be returned.
+ void LoadFonts(InputStream* is, FontArray* output);
+
+ // ByteArray font loading
+ // Load the font(s) from the byte array. The current settings on the factory
+ // are used during the loading process. One or more fonts are returned if the
+ // stream contains valid font data. Some font container formats may have more
+ // than one font and in this case multiple font objects will be returned. If
+ // the data in the stream cannot be parsed or is invalid an array of size zero
+ // will be returned.
+ void LoadFonts(ByteArray* ba, FontArray* output);
+
+ // Load the font(s) from the input stream into font builders. The current
+ // settings on the factory are used during the loading process. One or more
+ // font builders are returned if the stream contains valid font data. Some
+ // font container formats may have more than one font and in this case
+ // multiple font builder objects will be returned. If the data in the stream
+ // cannot be parsed or is invalid an array of size zero will be returned.
+ void LoadFontsForBuilding(InputStream* is, FontBuilderArray* output);
+
+ // Load the font(s) from the byte array into font builders. The current
+ // settings on the factory are used during the loading process. One or more
+ // font builders are returned if the stream contains valid font data. Some
+ // font container formats may have more than one font and in this case
+ // multiple font builder objects will be returned. If the data in the stream
+ // cannot be parsed or is invalid an array of size zero will be returned.
+ void LoadFontsForBuilding(ByteArray* ba, FontBuilderArray* output);
+
+ CALLER_ATTACH WritableFontData* GetNewData(int32_t capacity);
+ CALLER_ATTACH WritableFontData* GetNewFixedData(int32_t capacity);
+ CALLER_ATTACH WritableFontData* GetNewGrowableData(int32_t capacity);
+ CALLER_ATTACH WritableFontData*
+ GetNewGrowableData(ReadableFontData* src_data);
+ CALLER_ATTACH ByteArray* GetNewArray(int32_t length);
+ CALLER_ATTACH ByteArray* GetNewGrowableArray(int32_t length);
+
+ // Font serialization
+ // Serialize the font to the output stream.
+ // NOTE: in this port we attempted not to implement I/O stream because dealing
+ // with cross-platform I/O stream itself is big enough as a project.
+ // Byte buffer it is.
+ void SerializeFont(Font* font, OutputStream* os);
+
+ // Set the table ordering to be used in serializing a font. The table ordering
+ // is an ordered list of table ids and tables will be serialized in the order
+ // given. Any tables whose id is not listed in the ordering will be placed in
+ // an unspecified order following those listed.
+ void SetSerializationTableOrdering(const IntegerList& table_ordering);
+
+ // Get an empty font builder for creating a new font from scratch.
+ CALLER_ATTACH Font::Builder* NewFontBuilder();
+
private:
// Offsets to specific elements in the underlying data. These offsets are
// relative to the start of the table or the start of sub-blocks within the
// table.
struct Offset {
enum {
- // Offsets within the main directory
+ // Offsets within the main directory.
kTTCTag = 0,
kVersion = 4,
kNumFonts = 8,
kOffsetTable = 12,
- // TTC Version 2.0 extensions
- // offsets from end of OffsetTable
+ // TTC Version 2.0 extensions.
+ // Offsets from end of OffsetTable.
kulDsigTag = 0,
kulDsigLength = 4,
kulDsigOffset = 8
@@ -48,97 +120,22 @@
FontFactory();
- public: // class is final, no virtual functions unless from parent
- virtual ~FontFactory();
+ CALLER_ATTACH Font* LoadSingleOTF(InputStream* is);
+ CALLER_ATTACH Font* LoadSingleOTF(ByteArray* ba);
- // Factory method for the construction of a font factory.
- static CALLER_ATTACH FontFactory* getInstance();
+ void LoadCollection(InputStream* is, FontArray* output);
+ void LoadCollection(ByteArray* ba, FontArray* output);
- // Toggle whether fonts that are loaded are fingerprinted with a SHA-1 hash.
- // If a font is fingerprinted then a SHA-1 hash is generated at load time and
- // stored in the font. This is useful for uniquely identifying fonts. By
- // default this is turned on.
- // @param fingerprint whether fingerprinting should be turned on or off
- // TODO(arthurhsu): IMPLEMENT: C++ port currently don't do any SHA-1
- void fingerprintFont(bool fingerprint);
- bool fingerprintFont();
-
- // Load the font(s) from the input stream. The current settings on the factory
- // are used during the loading process. One or more fonts are returned if the
- // stream contains valid font data. Some font container formats may have more
- // than one font and in this case multiple font objects will be returned. If
- // the data in the stream cannot be parsed or is invalid an array of size zero
- // will be returned.
- void loadFonts(InputStream* is, FontArray* output);
-
- // Load the font(s) from the input stream into font builders. The current
- // settings on the factory are used during the loading process. One or more
- // font builders are returned if the stream contains valid font data. Some
- // font container formats may have more than one font and in this case
- // multiple font builder objects will be returned. If the data in the stream
- // cannot be parsed or is invalid an array of size zero will be returned.
- void loadFontsForBuilding(InputStream* is, FontBuilderArray* output);
-
- private:
- Font* loadSingleOTF(InputStream* is);
- void loadCollection(InputStream* is, FontArray* output);
- Font::Builder* loadSingleOTFForBuilding(InputStream* is);
- void loadCollectionForBuilding(InputStream* is, FontBuilderArray* builders);
- static bool isCollection(PushbackInputStream* pbis);
-
- public:
- // ByteArray font loading
- // Load the font(s) from the byte array. The current settings on the factory
- // are used during the loading process. One or more fonts are returned if the
- // stream contains valid font data. Some font container formats may have more
- // than one font and in this case multiple font objects will be returned. If
- // the data in the stream cannot be parsed or is invalid an array of size zero
- // will be returned.
- void loadFonts(ByteArray* ba, FontArray* output);
-
- // Load the font(s) from the byte array into font builders. The current
- // settings on the factory are used during the loading process. One or more
- // font builders are returned if the stream contains valid font data. Some
- // font container formats may have more than one font and in this case
- // multiple font builder objects will be returned. If the data in the stream
- // cannot be parsed or is invalid an array of size zero will be returned.
- void loadFontsForBuilding(ByteArray* ba, FontBuilderArray* output);
-
- private:
- CALLER_ATTACH Font* loadSingleOTF(ByteArray* ba);
- void loadCollection(ByteArray* ba, FontArray* output);
+ CALLER_ATTACH Font::Builder* LoadSingleOTFForBuilding(InputStream* is);
CALLER_ATTACH Font::Builder*
- loadSingleOTFForBuilding(ByteArray* ba, int32_t offset_to_offset_table);
- void loadCollectionForBuilding(ByteArray* ba, FontBuilderArray* builders);
- static bool isCollection(ByteArray* ba);
+ LoadSingleOTFForBuilding(ByteArray* ba, int32_t offset_to_offset_table);
- public:
- CALLER_ATTACH WritableFontData* getNewData(int32_t capacity);
- CALLER_ATTACH WritableFontData* getNewFixedData(int32_t capacity);
- CALLER_ATTACH WritableFontData* getNewGrowableData(int32_t capacity);
- CALLER_ATTACH WritableFontData*
- getNewGrowableData(ReadableFontData* src_data);
- CALLER_ATTACH ByteArray* getNewArray(int32_t length);
- CALLER_ATTACH ByteArray* getNewGrowableArray(int32_t length);
+ void LoadCollectionForBuilding(InputStream* is, FontBuilderArray* builders);
+ void LoadCollectionForBuilding(ByteArray* ba, FontBuilderArray* builders);
- public:
- // Font serialization
- // Serialize the font to the output stream.
- // NOTE: in this port we attempted not to implement I/O stream because dealing
- // with cross-platform I/O stream itself is big enough as a project.
- // Byte buffer it is.
- void serializeFont(Font* font, OutputStream* os);
+ static bool IsCollection(PushbackInputStream* pbis);
+ static bool IsCollection(ByteArray* ba);
- // Set the table ordering to be used in serializing a font. The table ordering
- // is an ordered list of table ids and tables will be serialized in the order
- // given. Any tables whose id is not listed in the ordering will be placed in
- // an unspecified order following those listed.
- void setSerializationTableOrdering(const IntegerList& table_ordering);
-
- // Get an empty font builder for creating a new font from scratch.
- CALLER_ATTACH Font::Builder* newFontBuilder();
-
- private:
bool fingerprint_;
IntegerList table_ordering_;
};
diff --git a/sfntly/font_header_table.cc b/sfntly/font_header_table.cc
index 7710c5a..f896001 100644
--- a/sfntly/font_header_table.cc
+++ b/sfntly/font_header_table.cc
@@ -20,83 +20,83 @@
/******************************************************************************
* FontHeaderTable class
******************************************************************************/
+FontHeaderTable::~FontHeaderTable() {}
+
+int32_t FontHeaderTable::TableVersion() {
+ return data_->ReadFixed(Offset::kTableVersion);
+}
+
+int32_t FontHeaderTable::FontRevision() {
+ return data_->ReadFixed(Offset::kFontRevision);
+}
+
+int64_t FontHeaderTable::ChecksumAdjustment() {
+ return data_->ReadULong(Offset::kCheckSumAdjustment);
+}
+
+int64_t FontHeaderTable::MagicNumber() {
+ return data_->ReadULong(Offset::kMagicNumber);
+}
+
+int32_t FontHeaderTable::FlagsAsInt() {
+ return data_->ReadUShort(Offset::kFlags);
+}
+
+int32_t FontHeaderTable::UnitsPerEm() {
+ return data_->ReadUShort(Offset::kUnitsPerEm);
+}
+
+int64_t FontHeaderTable::Created() {
+ return data_->ReadDateTimeAsLong(Offset::kCreated);
+}
+
+int64_t FontHeaderTable::Modified() {
+ return data_->ReadDateTimeAsLong(Offset::kModified);
+}
+
+int32_t FontHeaderTable::XMin() {
+ return data_->ReadUShort(Offset::kXMin);
+}
+
+int32_t FontHeaderTable::YMin() {
+ return data_->ReadUShort(Offset::kYMin);
+}
+
+int32_t FontHeaderTable::XMax() {
+ return data_->ReadUShort(Offset::kXMax);
+}
+
+int32_t FontHeaderTable::YMax() {
+ return data_->ReadUShort(Offset::kYMax);
+}
+
+int32_t FontHeaderTable::MacStyleAsInt() {
+ return data_->ReadUShort(Offset::kMacStyle);
+}
+
+int32_t FontHeaderTable::LowestRecPPEM() {
+ return data_->ReadUShort(Offset::kLowestRecPPEM);
+}
+
+int32_t FontHeaderTable::FontDirectionHint() {
+ return data_->ReadShort(Offset::kFontDirectionHint);
+}
+
+int32_t FontHeaderTable::IndexToLocFormat() {
+ return data_->ReadShort(Offset::kIndexToLocFormat);
+}
+
+int32_t FontHeaderTable::GlyphDataFormat() {
+ return data_->ReadShort(Offset::kGlyphDataFormat);
+}
+
FontHeaderTable::FontHeaderTable(Header* header, ReadableFontData* data)
: Table(header, data) {
IntegerList checksum_ranges;
checksum_ranges.push_back(0);
checksum_ranges.push_back(Offset::kCheckSumAdjustment);
checksum_ranges.push_back(Offset::kMagicNumber);
- data_->setCheckSumRanges(checksum_ranges);
-}
-
-FontHeaderTable::~FontHeaderTable() {}
-
-int32_t FontHeaderTable::tableVersion() {
- return data_->readFixed(Offset::kTableVersion);
-}
-
-int32_t FontHeaderTable::fontRevision() {
- return data_->readFixed(Offset::kFontRevision);
-}
-
-int64_t FontHeaderTable::checksumAdjustment() {
- return data_->readULong(Offset::kCheckSumAdjustment);
-}
-
-int64_t FontHeaderTable::magicNumber() {
- return data_->readULong(Offset::kMagicNumber);
-}
-
-int32_t FontHeaderTable::flagsAsInt() {
- return data_->readUShort(Offset::kFlags);
-}
-
-int32_t FontHeaderTable::unitsPerEm() {
- return data_->readUShort(Offset::kUnitsPerEm);
-}
-
-int64_t FontHeaderTable::created() {
- return data_->readDateTimeAsLong(Offset::kCreated);
-}
-
-int64_t FontHeaderTable::modified() {
- return data_->readDateTimeAsLong(Offset::kModified);
-}
-
-int32_t FontHeaderTable::xMin() {
- return data_->readUShort(Offset::kXMin);
-}
-
-int32_t FontHeaderTable::yMin() {
- return data_->readUShort(Offset::kYMin);
-}
-
-int32_t FontHeaderTable::xMax() {
- return data_->readUShort(Offset::kXMax);
-}
-
-int32_t FontHeaderTable::yMax() {
- return data_->readUShort(Offset::kYMax);
-}
-
-int32_t FontHeaderTable::macStyleAsInt() {
- return data_->readUShort(Offset::kMacStyle);
-}
-
-int32_t FontHeaderTable::lowestRecPPEM() {
- return data_->readUShort(Offset::kLowestRecPPEM);
-}
-
-int32_t FontHeaderTable::fontDirectionHint() {
- return data_->readShort(Offset::kFontDirectionHint);
-}
-
-int32_t FontHeaderTable::indexToLocFormat() {
- return data_->readShort(Offset::kIndexToLocFormat);
-}
-
-int32_t FontHeaderTable::glyphDataFormat() {
- return data_->readShort(Offset::kGlyphDataFormat);
+ data_->SetCheckSumRanges(checksum_ranges);
}
/******************************************************************************
@@ -114,146 +114,146 @@
FontHeaderTable::Builder::~Builder() {}
-CALLER_ATTACH FontDataTable* FontHeaderTable::Builder::subBuildTable(
+CALLER_ATTACH FontDataTable* FontHeaderTable::Builder::SubBuildTable(
ReadableFontData* data) {
FontDataTablePtr table = new FontHeaderTable(header(), data);
- return table.detach();
+ return table.Detach();
}
-int32_t FontHeaderTable::Builder::tableVersion() {
- return down_cast<FontHeaderTable*>(table())->tableVersion();
+int32_t FontHeaderTable::Builder::TableVersion() {
+ return down_cast<FontHeaderTable*>(GetTable())->TableVersion();
}
-void FontHeaderTable::Builder::setTableVersion(int32_t version) {
- internalWriteData()->writeFixed(Offset::kTableVersion, version);
+void FontHeaderTable::Builder::SetTableVersion(int32_t version) {
+ InternalWriteData()->WriteFixed(Offset::kTableVersion, version);
}
-int32_t FontHeaderTable::Builder::fontRevision() {
- return down_cast<FontHeaderTable*>(table())->fontRevision();
+int32_t FontHeaderTable::Builder::FontRevision() {
+ return down_cast<FontHeaderTable*>(GetTable())->FontRevision();
}
-void FontHeaderTable::Builder::setFontRevision(int32_t revision) {
- internalWriteData()->writeFixed(Offset::kFontRevision, revision);
+void FontHeaderTable::Builder::SetFontRevision(int32_t revision) {
+ InternalWriteData()->WriteFixed(Offset::kFontRevision, revision);
}
-int64_t FontHeaderTable::Builder::checksumAdjustment() {
- return down_cast<FontHeaderTable*>(table())->checksumAdjustment();
+int64_t FontHeaderTable::Builder::ChecksumAdjustment() {
+ return down_cast<FontHeaderTable*>(GetTable())->ChecksumAdjustment();
}
-void FontHeaderTable::Builder::setChecksumAdjustment(int64_t adjustment) {
- internalWriteData()->writeULong(Offset::kCheckSumAdjustment, adjustment);
+void FontHeaderTable::Builder::SetChecksumAdjustment(int64_t adjustment) {
+ InternalWriteData()->WriteULong(Offset::kCheckSumAdjustment, adjustment);
}
-int64_t FontHeaderTable::Builder::magicNumber() {
- return down_cast<FontHeaderTable*>(table())->magicNumber();
+int64_t FontHeaderTable::Builder::MagicNumber() {
+ return down_cast<FontHeaderTable*>(GetTable())->MagicNumber();
}
-void FontHeaderTable::Builder::setMagicNumber(int64_t magic_number) {
- internalWriteData()->writeULong(Offset::kMagicNumber, magic_number);
+void FontHeaderTable::Builder::SetMagicNumber(int64_t magic_number) {
+ InternalWriteData()->WriteULong(Offset::kMagicNumber, magic_number);
}
-int32_t FontHeaderTable::Builder::flagsAsInt() {
- return down_cast<FontHeaderTable*>(table())->flagsAsInt();
+int32_t FontHeaderTable::Builder::FlagsAsInt() {
+ return down_cast<FontHeaderTable*>(GetTable())->FlagsAsInt();
}
-void FontHeaderTable::Builder::setFlagsAsInt(int32_t flags) {
- internalWriteData()->writeUShort(Offset::kFlags, flags);
+void FontHeaderTable::Builder::SetFlagsAsInt(int32_t flags) {
+ InternalWriteData()->WriteUShort(Offset::kFlags, flags);
}
-int32_t FontHeaderTable::Builder::unitsPerEm() {
- return down_cast<FontHeaderTable*>(table())->unitsPerEm();
+int32_t FontHeaderTable::Builder::UnitsPerEm() {
+ return down_cast<FontHeaderTable*>(GetTable())->UnitsPerEm();
}
-void FontHeaderTable::Builder::setUnitsPerEm(int32_t units) {
- internalWriteData()->writeUShort(Offset::kUnitsPerEm, units);
+void FontHeaderTable::Builder::SetUnitsPerEm(int32_t units) {
+ InternalWriteData()->WriteUShort(Offset::kUnitsPerEm, units);
}
-int64_t FontHeaderTable::Builder::created() {
- return down_cast<FontHeaderTable*>(table())->modified();
+int64_t FontHeaderTable::Builder::Created() {
+ return down_cast<FontHeaderTable*>(GetTable())->Created();
}
-void FontHeaderTable::Builder::setCreated(int64_t date) {
- internalWriteData()->writeDateTime(Offset::kCreated, date);
+void FontHeaderTable::Builder::SetCreated(int64_t date) {
+ InternalWriteData()->WriteDateTime(Offset::kCreated, date);
}
-int64_t FontHeaderTable::Builder::modified() {
- return down_cast<FontHeaderTable*>(table())->modified();
+int64_t FontHeaderTable::Builder::Modified() {
+ return down_cast<FontHeaderTable*>(GetTable())->Modified();
}
-void FontHeaderTable::Builder::setModified(int64_t date) {
- internalWriteData()->writeDateTime(Offset::kModified, date);
+void FontHeaderTable::Builder::SetModified(int64_t date) {
+ InternalWriteData()->WriteDateTime(Offset::kModified, date);
}
-int32_t FontHeaderTable::Builder::xMin() {
- return down_cast<FontHeaderTable*>(table())->xMin();
+int32_t FontHeaderTable::Builder::XMin() {
+ return down_cast<FontHeaderTable*>(GetTable())->XMin();
}
-void FontHeaderTable::Builder::setXMin(int32_t xmin) {
- internalWriteData()->writeShort(Offset::kXMin, xmin);
+void FontHeaderTable::Builder::SetXMin(int32_t xmin) {
+ InternalWriteData()->WriteShort(Offset::kXMin, xmin);
}
-int32_t FontHeaderTable::Builder::yMin() {
- return down_cast<FontHeaderTable*>(table())->yMin();
+int32_t FontHeaderTable::Builder::YMin() {
+ return down_cast<FontHeaderTable*>(GetTable())->YMin();
}
-void FontHeaderTable::Builder::setYMin(int32_t ymin) {
- internalWriteData()->writeShort(Offset::kYMin, ymin);
+void FontHeaderTable::Builder::SetYMin(int32_t ymin) {
+ InternalWriteData()->WriteShort(Offset::kYMin, ymin);
}
-int32_t FontHeaderTable::Builder::xMax() {
- return down_cast<FontHeaderTable*>(table())->xMax();
+int32_t FontHeaderTable::Builder::XMax() {
+ return down_cast<FontHeaderTable*>(GetTable())->XMax();
}
-void FontHeaderTable::Builder::setXMax(int32_t xmax) {
- internalWriteData()->writeShort(Offset::kXMax, xmax);
+void FontHeaderTable::Builder::SetXMax(int32_t xmax) {
+ InternalWriteData()->WriteShort(Offset::kXMax, xmax);
}
-int32_t FontHeaderTable::Builder::yMax() {
- return down_cast<FontHeaderTable*>(table())->yMax();
+int32_t FontHeaderTable::Builder::YMax() {
+ return down_cast<FontHeaderTable*>(GetTable())->YMax();
}
-void FontHeaderTable::Builder::setYMax(int32_t ymax) {
- internalWriteData()->writeShort(Offset::kYMax, ymax);
+void FontHeaderTable::Builder::SetYMax(int32_t ymax) {
+ InternalWriteData()->WriteShort(Offset::kYMax, ymax);
}
-int32_t FontHeaderTable::Builder::macStyleAsInt() {
- return down_cast<FontHeaderTable*>(table())->macStyleAsInt();
+int32_t FontHeaderTable::Builder::MacStyleAsInt() {
+ return down_cast<FontHeaderTable*>(GetTable())->MacStyleAsInt();
}
-void FontHeaderTable::Builder::setMacStyleAsInt(int32_t style) {
- internalWriteData()->writeUShort(Offset::kMacStyle, style);
+void FontHeaderTable::Builder::SetMacStyleAsInt(int32_t style) {
+ InternalWriteData()->WriteUShort(Offset::kMacStyle, style);
}
-int32_t FontHeaderTable::Builder::lowestRecPPEM() {
- return down_cast<FontHeaderTable*>(table())->lowestRecPPEM();
+int32_t FontHeaderTable::Builder::LowestRecPPEM() {
+ return down_cast<FontHeaderTable*>(GetTable())->LowestRecPPEM();
}
-void FontHeaderTable::Builder::setLowestRecPPEM(int32_t size) {
- internalWriteData()->writeUShort(Offset::kLowestRecPPEM, size);
+void FontHeaderTable::Builder::SetLowestRecPPEM(int32_t size) {
+ InternalWriteData()->WriteUShort(Offset::kLowestRecPPEM, size);
}
-int32_t FontHeaderTable::Builder::fontDirectionHint() {
- return down_cast<FontHeaderTable*>(table())->fontDirectionHint();
+int32_t FontHeaderTable::Builder::FontDirectionHint() {
+ return down_cast<FontHeaderTable*>(GetTable())->FontDirectionHint();
}
-void FontHeaderTable::Builder::setFontDirectionHint(int32_t hint) {
- internalWriteData()->writeShort(Offset::kFontDirectionHint, hint);
+void FontHeaderTable::Builder::SetFontDirectionHint(int32_t hint) {
+ InternalWriteData()->WriteShort(Offset::kFontDirectionHint, hint);
}
-int32_t FontHeaderTable::Builder::indexToLocFormat() {
- return down_cast<FontHeaderTable*>(table())->indexToLocFormat();
+int32_t FontHeaderTable::Builder::IndexToLocFormat() {
+ return down_cast<FontHeaderTable*>(GetTable())->IndexToLocFormat();
}
-void FontHeaderTable::Builder::setIndexToLocFormat(int32_t format) {
- internalWriteData()->writeShort(Offset::kIndexToLocFormat, format);
+void FontHeaderTable::Builder::SetIndexToLocFormat(int32_t format) {
+ InternalWriteData()->WriteShort(Offset::kIndexToLocFormat, format);
}
-int32_t FontHeaderTable::Builder::glyphDataFormat() {
- return down_cast<FontHeaderTable*>(table())->glyphDataFormat();
+int32_t FontHeaderTable::Builder::GlyphDataFormat() {
+ return down_cast<FontHeaderTable*>(GetTable())->GlyphDataFormat();
}
-void FontHeaderTable::Builder::setGlyphDataFormat(int32_t format) {
- internalWriteData()->writeShort(Offset::kGlyphDataFormat, format);
+void FontHeaderTable::Builder::SetGlyphDataFormat(int32_t format) {
+ InternalWriteData()->WriteShort(Offset::kGlyphDataFormat, format);
}
} // namespace sfntly
diff --git a/sfntly/font_header_table.h b/sfntly/font_header_table.h
index c8aa9fe..dd6f593 100644
--- a/sfntly/font_header_table.h
+++ b/sfntly/font_header_table.h
@@ -39,6 +39,101 @@
};
class FontHeaderTable : public Table, public RefCounted<FontHeaderTable> {
+ public:
+ class Builder : public Table::TableBasedTableBuilder,
+ public RefCounted<Builder> {
+ public:
+ // Constructor scope altered to public because C++ does not allow base
+ // class to instantiate derived class with protected constructors.
+ Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+ WritableFontData* data);
+ Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+ ReadableFontData* data);
+ virtual ~Builder();
+ virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+
+ virtual int32_t TableVersion();
+ virtual void SetTableVersion(int32_t version);
+ virtual int32_t FontRevision();
+ virtual void SetFontRevision(int32_t revision);
+ virtual int64_t ChecksumAdjustment();
+ virtual void SetChecksumAdjustment(int64_t adjustment);
+ virtual int64_t MagicNumber();
+ virtual void SetMagicNumber(int64_t magic_number);
+ virtual int32_t FlagsAsInt();
+ virtual void SetFlagsAsInt(int32_t flags);
+ // TODO(arthurhsu): IMPLEMENT EnumSet<Flags> Flags()
+ // TODO(arthurhsu): IMPLEMENT setFlags(EnumSet<Flags> flags)
+ virtual int32_t UnitsPerEm();
+ virtual void SetUnitsPerEm(int32_t units);
+ virtual int64_t Created();
+ virtual void SetCreated(int64_t date);
+ virtual int64_t Modified();
+ virtual void SetModified(int64_t date);
+ virtual int32_t XMin();
+ virtual void SetXMin(int32_t xmin);
+ virtual int32_t YMin();
+ virtual void SetYMin(int32_t ymin);
+ virtual int32_t XMax();
+ virtual void SetXMax(int32_t xmax);
+ virtual int32_t YMax();
+ virtual void SetYMax(int32_t ymax);
+ virtual int32_t MacStyleAsInt();
+ virtual void SetMacStyleAsInt(int32_t style);
+ // TODO(arthurhsu): IMPLEMENT EnumSet<MacStyle> macStyle()
+ // TODO(arthurhsu): IMPLEMENT setMacStyle(EnumSet<MacStyle> style)
+ virtual int32_t LowestRecPPEM();
+ virtual void SetLowestRecPPEM(int32_t size);
+ virtual int32_t FontDirectionHint();
+ virtual void SetFontDirectionHint(int32_t hint);
+ virtual int32_t IndexToLocFormat();
+ virtual void SetIndexToLocFormat(int32_t format);
+ virtual int32_t GlyphDataFormat();
+ virtual void SetGlyphDataFormat(int32_t format);
+ };
+
+ virtual ~FontHeaderTable();
+ int32_t TableVersion();
+ int32_t FontRevision();
+
+ // Get the checksum adjustment. To compute: set it to 0, sum the entire font
+ // as ULONG, then store 0xB1B0AFBA - sum.
+ int64_t ChecksumAdjustment();
+
+ // Get the magic number. Set to 0x5F0F3CF5.
+ int64_t MagicNumber();
+
+ // TODO(arthurhsu): IMPLEMENT: EnumSet<Flags>
+ int32_t FlagsAsInt();
+ // TODO(arthurhsu): IMPLEMENT: Flags() returning EnumSet<Flags>
+
+ int32_t UnitsPerEm();
+
+ // Get the created date. Number of seconds since 12:00 midnight, January 1,
+ // 1904. 64-bit integer.
+ int64_t Created();
+ // Get the modified date. Number of seconds since 12:00 midnight, January 1,
+ // 1904. 64-bit integer.
+ int64_t Modified();
+
+ // Get the x min. For all glyph bounding boxes.
+ int32_t XMin();
+ // Get the y min. For all glyph bounding boxes.
+ int32_t YMin();
+ // Get the x max. For all glyph bounding boxes.
+ int32_t XMax();
+ // Get the y max. For all glyph bounding boxes.
+ int32_t YMax();
+
+ // TODO(arthurhsu): IMPLEMENT: EnumSet<MacStyle>
+ int32_t MacStyleAsInt();
+ // TODO(arthurhsu): IMPLEMENT: macStyle() returning EnumSet<MacStyle>
+
+ int32_t LowestRecPPEM();
+ int32_t FontDirectionHint(); // Note: no AsInt() form, already int
+ int32_t IndexToLocFormat(); // Note: no AsInt() form, already int
+ int32_t GlyphDataFormat();
+
private:
struct Offset {
enum {
@@ -62,104 +157,7 @@
};
};
- private:
FontHeaderTable(Header* header, ReadableFontData* data);
-
- public: // class is final, no virtual functions unless from parent
- virtual ~FontHeaderTable();
- int32_t tableVersion();
- int32_t fontRevision();
-
- // Get the checksum adjustment. To compute: set it to 0, sum the entire font
- // as ULONG, then store 0xB1B0AFBA - sum.
- int64_t checksumAdjustment();
-
- // Get the magic number. Set to 0x5F0F3CF5.
- int64_t magicNumber();
-
- // TODO(arthurhsu): IMPLEMENT: EnumSet<Flags>
- int32_t flagsAsInt();
- // TODO(arthurhsu): IMPLEMENT: flags() returning EnumSet<Flags>
-
- int32_t unitsPerEm();
-
- // Get the created date. Number of seconds since 12:00 midnight, January 1,
- // 1904. 64-bit integer.
- int64_t created();
- // Get the modified date. Number of seconds since 12:00 midnight, January 1,
- // 1904. 64-bit integer.
- int64_t modified();
-
- // Get the x min. For all glyph bounding boxes.
- int32_t xMin();
- // Get the y min. For all glyph bounding boxes.
- int32_t yMin();
- // Get the x max. For all glyph bounding boxes.
- int32_t xMax();
- // Get the y max. For all glyph bounding boxes.
- int32_t yMax();
-
- // TODO(arthurhsu): IMPLEMENT: EnumSet<MacStyle>
- int32_t macStyleAsInt();
- // TODO(arthurhsu): IMPLEMENT: macStyle() returning EnumSet<MacStyle>
-
- int32_t lowestRecPPEM();
- int32_t fontDirectionHint(); // Note: no AsInt() form, already int
- int32_t indexToLocFormat(); // Note: no AsInt() form, already int
- int32_t glyphDataFormat();
-
- public:
- class Builder : public Table::TableBasedTableBuilder,
- public RefCounted<Builder> {
- public:
- // Constructor scope altered to public because C++ does not allow base
- // class to instantiate derived class with protected constructors.
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* data);
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
- ReadableFontData* data);
- virtual ~Builder();
- virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
-
- virtual int32_t tableVersion();
- virtual void setTableVersion(int32_t version);
- virtual int32_t fontRevision();
- virtual void setFontRevision(int32_t revision);
- virtual int64_t checksumAdjustment();
- virtual void setChecksumAdjustment(int64_t adjustment);
- virtual int64_t magicNumber();
- virtual void setMagicNumber(int64_t magic_number);
- virtual int32_t flagsAsInt();
- virtual void setFlagsAsInt(int32_t flags);
- // TODO(arthurhsu): IMPLEMENT EnumSet<Flags> flags()
- // TODO(arthurhsu): IMPLEMENT setFlags(EnumSet<Flags> flags)
- virtual int32_t unitsPerEm();
- virtual void setUnitsPerEm(int32_t units);
- virtual int64_t created();
- virtual void setCreated(int64_t date);
- virtual int64_t modified();
- virtual void setModified(int64_t date);
- virtual int32_t xMin();
- virtual void setXMin(int32_t xmin);
- virtual int32_t yMin();
- virtual void setYMin(int32_t ymin);
- virtual int32_t xMax();
- virtual void setXMax(int32_t xmax);
- virtual int32_t yMax();
- virtual void setYMax(int32_t ymax);
- virtual int32_t macStyleAsInt();
- virtual void setMacStyleAsInt(int32_t style);
- // TODO(arthurhsu): IMPLEMENT EnumSet<MacStyle> macStyle()
- // TODO(arthurhsu): IMPLEMENT setMacStyle(EnumSet<MacStyle> style)
- virtual int32_t lowestRecPPEM();
- virtual void setLowestRecPPEM(int32_t size);
- virtual int32_t fontDirectionHint();
- virtual void setFontDirectionHint(int32_t hint);
- virtual int32_t indexToLocFormat();
- virtual void setIndexToLocFormat(int32_t format);
- virtual int32_t glyphDataFormat();
- virtual void setGlyphDataFormat(int32_t format);
- };
};
typedef Ptr<FontHeaderTable> FontHeaderTablePtr;
typedef Ptr<FontHeaderTable::Builder> FontHeaderTableBuilderPtr;
diff --git a/sfntly/glyph_table.cc b/sfntly/glyph_table.cc
index 3ff6d97..99e7c06 100644
--- a/sfntly/glyph_table.cc
+++ b/sfntly/glyph_table.cc
@@ -14,9 +14,10 @@
* limitations under the License.
*/
+#include "sfntly/glyph_table.h"
+
#include <stdlib.h>
-#include "sfntly/glyph_table.h"
#include "sfntly/port/exception_type.h"
namespace sfntly {
@@ -47,33 +48,38 @@
/******************************************************************************
* GlyphTable class
******************************************************************************/
+GlyphTable::~GlyphTable() {
+}
+
+GlyphTable::Glyph* GlyphTable::GetGlyph(int32_t offset, int32_t length) {
+ return GlyphTable::Glyph::GetGlyph(data_, offset, length);
+}
+
GlyphTable::GlyphTable(Header* header, ReadableFontData* data)
- : Table(header, data) {}
-
-GlyphTable::~GlyphTable() {}
-
-GlyphTable::Glyph* GlyphTable::glyph(int32_t offset, int32_t length) {
- return GlyphTable::Glyph::getGlyph(data_, offset, length);
+ : Table(header, data) {
}
/******************************************************************************
* GlyphTable::Builder class
******************************************************************************/
GlyphTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
- Header* header, WritableFontData* data) :
- Table::ArrayElementTableBuilder(font_builder, header, data) {}
+ Header* header,
+ WritableFontData* data)
+ : Table::ArrayElementTableBuilder(font_builder, header, data) {
+}
-GlyphTable::Builder::~Builder() {}
+GlyphTable::Builder::~Builder() {
+}
-void GlyphTable::Builder::setLoca(const IntegerList& loca) {
+void GlyphTable::Builder::SetLoca(const IntegerList& loca) {
loca_ = loca;
- setModelChanged(false);
+ set_model_changed(false);
glyph_builders_.clear();
}
-void GlyphTable::Builder::generateLocaList(IntegerList* locas) {
+void GlyphTable::Builder::GenerateLocaList(IntegerList* locas) {
assert(locas);
- GlyphBuilderList* glyph_builders = getGlyphBuilders();
+ GlyphBuilderList* glyph_builders = GetGlyphBuilders();
locas->resize(glyph_builders->size());
locas->push_back(0);
if (glyph_builders->size() == 0) {
@@ -83,14 +89,71 @@
for (GlyphBuilderList::iterator b = glyph_builders->begin(),
b_end = glyph_builders->end();
b != b_end; ++b) {
- int32_t size = (*b)->subDataSizeToSerialize();
+ int32_t size = (*b)->SubDataSizeToSerialize();
locas->push_back(total + size);
total += size;
}
}
}
-void GlyphTable::Builder::initialize(ReadableFontData* data,
+GlyphTable::GlyphBuilderList* GlyphTable::Builder::GlyphBuilders() {
+ return GetGlyphBuilders();
+}
+
+void GlyphTable::Builder::SetGlyphBuilders(GlyphBuilderList* glyph_builders) {
+ glyph_builders_ = *glyph_builders;
+ set_model_changed();
+}
+
+CALLER_ATTACH GlyphTable::Glyph::Builder*
+ GlyphTable::Builder::GlyphBuilder(ReadableFontData* data) {
+ return Glyph::Builder::GetBuilder(this, data);
+}
+
+CALLER_ATTACH FontDataTable*
+ GlyphTable::Builder::SubBuildTable(ReadableFontData* data) {
+ FontDataTablePtr table = new GlyphTable(header(), data);
+ return table.Detach();
+}
+
+void GlyphTable::Builder::SubDataSet() {
+ glyph_builders_.clear();
+ set_model_changed(false);
+}
+
+int32_t GlyphTable::Builder::SubDataSizeToSerialize() {
+ if (glyph_builders_.empty())
+ return 0;
+
+ bool variable = false;
+ int32_t size = 0;
+
+ // Calculate size of each table.
+ for (GlyphBuilderList::iterator b = glyph_builders_.begin(),
+ end = glyph_builders_.end(); b != end; ++b) {
+ int32_t glyph_size = (*b)->SubDataSizeToSerialize();
+ size += abs(glyph_size);
+ variable |= glyph_size <= 0;
+ }
+ return variable ? -size : size;
+}
+
+bool GlyphTable::Builder::SubReadyToSerialize() {
+ return !glyph_builders_.empty();
+}
+
+int32_t GlyphTable::Builder::SubSerialize(WritableFontData* new_data) {
+ int32_t size = 0;
+ for (GlyphBuilderList::iterator b = glyph_builders_.begin(),
+ end = glyph_builders_.end(); b != end; ++b) {
+ FontDataPtr data;
+ data.Attach(new_data->Slice(size));
+ size += (*b)->SubSerialize(down_cast<WritableFontData*>(data.p_));
+ }
+ return size;
+}
+
+void GlyphTable::Builder::Initialize(ReadableFontData* data,
const IntegerList& loca) {
if (data != NULL) {
if (loca_.empty()) {
@@ -106,222 +169,211 @@
for (size_t i = 1; i < loca.size(); ++i) {
loca_value = loca[i];
GlyphBuilderPtr builder;
- builder.attach(Glyph::Builder::getBuilder(this, data,
- last_loca_value /*offset*/, loca_value - last_loca_value /*length*/));
+ builder.Attach(
+ Glyph::Builder::GetBuilder(this,
+ data,
+ last_loca_value /*offset*/,
+ loca_value - last_loca_value /*length*/));
glyph_builders_.push_back(builder);
last_loca_value = loca_value;
}
}
}
-GlyphTable::GlyphBuilderList* GlyphTable::Builder::getGlyphBuilders() {
+GlyphTable::GlyphBuilderList* GlyphTable::Builder::GetGlyphBuilders() {
if (glyph_builders_.empty()) {
- initialize(internalReadData(), loca_);
- setModelChanged();
+ Initialize(InternalReadData(), loca_);
+ set_model_changed();
}
return &glyph_builders_;
}
-void GlyphTable::Builder::revert() {
+void GlyphTable::Builder::Revert() {
glyph_builders_.clear();
- setModelChanged(false);
-}
-
-GlyphTable::GlyphBuilderList* GlyphTable::Builder::glyphBuilders() {
- return getGlyphBuilders();
-}
-
-void GlyphTable::Builder::setGlyphBuilders(GlyphBuilderList* glyph_builders) {
- glyph_builders_ = *glyph_builders;
- setModelChanged();
-}
-
-CALLER_ATTACH GlyphTable::Glyph::Builder* GlyphTable::Builder::glyphBuilder(
- ReadableFontData* data) {
- return Glyph::Builder::getBuilder(this, data);
-}
-
-CALLER_ATTACH FontDataTable* GlyphTable::Builder::subBuildTable(
- ReadableFontData* data) {
- FontDataTablePtr table = new GlyphTable(header(), data);
- return table.detach();
-}
-
-void GlyphTable::Builder::subDataSet() {
- glyph_builders_.clear();
- setModelChanged(false);
-}
-
-int32_t GlyphTable::Builder::subDataSizeToSerialize() {
- if (glyph_builders_.empty())
- return 0;
-
- bool variable = false;
- int32_t size = 0;
-
- // Calculate size of each table.
- for (GlyphBuilderList::iterator b = glyph_builders_.begin(),
- end = glyph_builders_.end(); b != end; ++b) {
- int32_t glyph_size = (*b)->subDataSizeToSerialize();
- size += abs(glyph_size);
- variable |= glyph_size <= 0;
- }
- return variable ? -size : size;
-}
-
-bool GlyphTable::Builder::subReadyToSerialize() {
- return !glyph_builders_.empty();
-}
-
-int32_t GlyphTable::Builder::subSerialize(WritableFontData* new_data) {
- int32_t size = 0;
- for (GlyphBuilderList::iterator b = glyph_builders_.begin(),
- end = glyph_builders_.end(); b != end; ++b) {
- FontDataPtr data;
- data.attach(new_data->slice(size));
- size += (*b)->subSerialize(down_cast<WritableFontData*>(data.p_));
- }
- return size;
+ set_model_changed(false);
}
/******************************************************************************
* GlyphTable::Glyph class
******************************************************************************/
+GlyphTable::Glyph::~Glyph() {}
+
+CALLER_ATTACH GlyphTable::Glyph*
+ GlyphTable::Glyph::GetGlyph(ReadableFontData* data,
+ int32_t offset,
+ int32_t length) {
+ int32_t type = GlyphType(data, offset, length);
+ GlyphPtr glyph;
+
+ ReadableFontDataPtr sliced_data;
+ sliced_data.Attach(down_cast<ReadableFontData*>(data->Slice(offset, length)));
+ if (type == GlyphType::kSimple) {
+ glyph = new SimpleGlyph(sliced_data);
+ }
+ glyph = new CompositeGlyph(sliced_data);
+ return glyph.Detach();
+}
+
+int32_t GlyphTable::Glyph::GlyphType() {
+ return glyph_type_;
+}
+
+int32_t GlyphTable::Glyph::NumberOfContours() {
+ return number_of_contours_;
+}
+
+int32_t GlyphTable::Glyph::XMin() {
+ return data_->ReadShort(Offset::kXMin);
+}
+
+int32_t GlyphTable::Glyph::XMax() {
+ return data_->ReadShort(Offset::kXMax);
+}
+
+int32_t GlyphTable::Glyph::YMin() {
+ return data_->ReadShort(Offset::kYMin);
+}
+
+int32_t GlyphTable::Glyph::YMax() {
+ return data_->ReadShort(Offset::kYMax);
+}
+
+int32_t GlyphTable::Glyph::Padding() {
+ return padding_;
+}
+
GlyphTable::Glyph::Glyph(ReadableFontData* data, int32_t glyph_type)
- : SubTable(data), glyph_type_(glyph_type) {
- if (data_->length() == 0) {
+ : SubTable(data),
+ glyph_type_(glyph_type) {
+ if (data_->Length() == 0) {
number_of_contours_ = 0;
} else {
// -1 if composite
- number_of_contours_ = data_->readShort(Offset::kNumberOfContours);
+ number_of_contours_ = data_->ReadShort(Offset::kNumberOfContours);
}
}
-GlyphTable::Glyph::~Glyph() {}
-
-int32_t GlyphTable::Glyph::glyphType(ReadableFontData* data, int32_t offset,
+int32_t GlyphTable::Glyph::GlyphType(ReadableFontData* data,
+ int32_t offset,
int32_t length) {
if (length == 0) {
return GlyphType::kSimple;
}
- int32_t number_of_contours = data->readShort(offset);
+ int32_t number_of_contours = data->ReadShort(offset);
if (number_of_contours >= 0) {
return GlyphType::kSimple;
}
return GlyphType::kComposite;
}
-CALLER_ATTACH GlyphTable::Glyph* GlyphTable::Glyph::getGlyph(
- ReadableFontData* data, int32_t offset, int32_t length) {
- int32_t type = glyphType(data, offset, length);
- GlyphPtr glyph;
-
- ReadableFontDataPtr sliced_data;
- sliced_data.attach(down_cast<ReadableFontData*>(data->slice(offset, length)));
- if (type == GlyphType::kSimple) {
- glyph = new SimpleGlyph(sliced_data);
- }
- glyph = new CompositeGlyph(sliced_data);
- return glyph.detach();
-}
-
-int32_t GlyphTable::Glyph::glyphType() {
- return glyph_type_;
-}
-
-int32_t GlyphTable::Glyph::numberOfContours() {
- return number_of_contours_;
-}
-
-int32_t GlyphTable::Glyph::xMin() {
- return data_->readShort(Offset::kXMin);
-}
-
-int32_t GlyphTable::Glyph::xMax() {
- return data_->readShort(Offset::kXMax);
-}
-
-int32_t GlyphTable::Glyph::yMin() {
- return data_->readShort(Offset::kYMin);
-}
-
-int32_t GlyphTable::Glyph::yMax() {
- return data_->readShort(Offset::kYMax);
-}
-
-int32_t GlyphTable::Glyph::padding() {
- return padding_;
-}
-
/******************************************************************************
* GlyphTable::Glyph::Builder class
******************************************************************************/
-GlyphTable::Glyph::Builder::Builder(FontDataTableBuilderContainer* font_builder,
- WritableFontData* data) :
- SubTable::Builder(font_builder, data) {
+GlyphTable::Glyph::Builder::~Builder() {
}
GlyphTable::Glyph::Builder::Builder(FontDataTableBuilderContainer* font_builder,
- ReadableFontData* data) :
- SubTable::Builder(font_builder, data) {
+ WritableFontData* data)
+ : SubTable::Builder(font_builder, data) {
}
-GlyphTable::Glyph::Builder::~Builder() {}
-
-CALLER_ATTACH GlyphTable::Glyph::Builder*
- GlyphTable::Glyph::Builder::getBuilder(
- FontDataTableBuilderContainer* table_builder, ReadableFontData* data) {
- return getBuilder(table_builder, data, 0, data->length());
+GlyphTable::Glyph::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+ ReadableFontData* data)
+ : SubTable::Builder(font_builder, data) {
}
CALLER_ATTACH GlyphTable::Glyph::Builder*
- GlyphTable::Glyph::Builder::getBuilder(
- FontDataTableBuilderContainer* table_builder, ReadableFontData* data,
- int32_t offset, int32_t length) {
- int32_t type = Glyph::glyphType(data, offset, length);
+ GlyphTable::Glyph::Builder::GetBuilder(
+ FontDataTableBuilderContainer* table_builder,
+ ReadableFontData* data) {
+ return GetBuilder(table_builder, data, 0, data->Length());
+}
+
+CALLER_ATTACH GlyphTable::Glyph::Builder*
+ GlyphTable::Glyph::Builder::GetBuilder(
+ FontDataTableBuilderContainer* table_builder,
+ ReadableFontData* data,
+ int32_t offset,
+ int32_t length) {
+ int32_t type = Glyph::GlyphType(data, offset, length);
GlyphBuilderPtr builder;
ReadableFontDataPtr sliced_data;
- sliced_data.attach(down_cast<ReadableFontData*>(data->slice(offset, length)));
+ sliced_data.Attach(down_cast<ReadableFontData*>(data->Slice(offset, length)));
if (type == GlyphType::kSimple) {
builder = new SimpleGlyph::SimpleGlyphBuilder(table_builder, sliced_data);
} else {
builder = new CompositeGlyph::CompositeGlyphBuilder(table_builder,
sliced_data);
}
- return builder.detach();
+ return builder.Detach();
}
-void GlyphTable::Glyph::Builder::subDataSet() {
+void GlyphTable::Glyph::Builder::SubDataSet() {
// NOP
}
-int32_t GlyphTable::Glyph::Builder::subDataSizeToSerialize() {
- return internalReadData()->length();
+int32_t GlyphTable::Glyph::Builder::SubDataSizeToSerialize() {
+ return InternalReadData()->Length();
}
-bool GlyphTable::Glyph::Builder::subReadyToSerialize() {
+bool GlyphTable::Glyph::Builder::SubReadyToSerialize() {
return true;
}
-int32_t GlyphTable::Glyph::Builder::subSerialize(WritableFontData* new_data) {
- return internalReadData()->copyTo(new_data);
+int32_t GlyphTable::Glyph::Builder::SubSerialize(WritableFontData* new_data) {
+ return InternalReadData()->CopyTo(new_data);
}
/******************************************************************************
- * GlyphTable::SimpleGlyph and its builder
+ * GlyphTable::SimpleGlyph
******************************************************************************/
GlyphTable::SimpleGlyph::SimpleGlyph(ReadableFontData* data)
: GlyphTable::Glyph(data, GlyphType::kSimple) {
}
-GlyphTable::SimpleGlyph::~SimpleGlyph() {}
+GlyphTable::SimpleGlyph::~SimpleGlyph() {
+}
-void GlyphTable::SimpleGlyph::initialize() {
+int32_t GlyphTable::SimpleGlyph::InstructionSize() {
+ Initialize();
+ return instruction_size_;
+}
+
+CALLER_ATTACH ReadableFontData* GlyphTable::SimpleGlyph::Instructions() {
+ Initialize();
+ return down_cast<ReadableFontData*>(
+ data_->Slice(instructions_offset_, InstructionSize()));
+}
+
+int32_t GlyphTable::SimpleGlyph::NumberOfPoints(int32_t contour) {
+ Initialize();
+ if (contour >= NumberOfContours()) {
+ return 0;
+ }
+ return contour_index_[contour + 1] - contour_index_[contour];
+}
+
+int32_t GlyphTable::SimpleGlyph::XCoordinate(int32_t contour, int32_t point) {
+ Initialize();
+ return x_coordinates_[contour_index_[contour] + point];
+}
+
+int32_t GlyphTable::SimpleGlyph::YCoordinate(int32_t contour, int32_t point) {
+ Initialize();
+ return y_coordinates_[contour_index_[contour] + point];
+}
+
+bool GlyphTable::SimpleGlyph::OnCurve(int32_t contour, int32_t point) {
+ Initialize();
+ return on_curve_[contour_index_[contour] + point];
+}
+
+void GlyphTable::SimpleGlyph::Initialize() {
if (initialized_) {
return;
}
- if (readFontData()->length() == 0) {
+ if (ReadFontData()->Length() == 0) {
instruction_size_ = 0;
number_of_points_ = 0;
instructions_offset_ = 0;
@@ -331,38 +383,38 @@
return;
}
- instruction_size_ = data_->readUShort(Offset::kSimpleEndPtsOfCountours +
- numberOfContours() * DataSize::kUSHORT);
+ instruction_size_ = data_->ReadUShort(Offset::kSimpleEndPtsOfCountours +
+ NumberOfContours() * DataSize::kUSHORT);
instructions_offset_ = Offset::kSimpleEndPtsOfCountours +
- (numberOfContours() + 1) * DataSize::kUSHORT;
+ (NumberOfContours() + 1) * DataSize::kUSHORT;
flags_offset_ = instructions_offset_ + instruction_size_ * DataSize::kBYTE;
- number_of_points_ = contourEndPoint(numberOfContours() - 1) + 1;
+ number_of_points_ = ContourEndPoint(NumberOfContours() - 1) + 1;
x_coordinates_.resize(number_of_points_);
y_coordinates_.resize(number_of_points_);
on_curve_.resize(number_of_points_);
- parseData(false);
+ ParseData(false);
x_coordinates_offset_ = flags_offset_ + flag_byte_count_ * DataSize::kBYTE;
y_coordinates_offset_ = x_coordinates_offset_ + x_byte_count_ *
DataSize::kBYTE;
- contour_index_.resize(numberOfContours() + 1);
+ contour_index_.resize(NumberOfContours() + 1);
contour_index_[0] = 0;
for (uint32_t contour = 0; contour < contour_index_.size() - 1; ++contour) {
- contour_index_[contour + 1] = contourEndPoint(contour) + 1;
+ contour_index_[contour + 1] = ContourEndPoint(contour) + 1;
}
- parseData(true);
+ ParseData(true);
int32_t non_padded_data_length =
5 * DataSize::kSHORT +
- (numberOfContours() * DataSize::kUSHORT) +
+ (NumberOfContours() * DataSize::kUSHORT) +
DataSize::kUSHORT +
(instruction_size_ * DataSize::kBYTE) +
(flag_byte_count_ * DataSize::kBYTE) +
(x_byte_count_ * DataSize::kBYTE) +
(y_byte_count_ * DataSize::kBYTE);
- padding_ = length() - non_padded_data_length;
+ padding_ = Length() - non_padded_data_length;
initialized_ = true;
}
-void GlyphTable::SimpleGlyph::parseData(bool fill_arrays) {
+void GlyphTable::SimpleGlyph::ParseData(bool fill_arrays) {
int32_t flag = 0;
int32_t flag_repeat = 0;
int32_t flag_index = 0;
@@ -373,9 +425,9 @@
++point_index) {
// get the flag for the current point
if (flag_repeat == 0) {
- flag = flagAsInt(flag_index++);
+ flag = FlagAsInt(flag_index++);
if ((flag & kFLAG_REPEAT) == kFLAG_REPEAT) {
- flag_repeat = flagAsInt(flag_index++);
+ flag_repeat = FlagAsInt(flag_index++);
}
} else {
flag_repeat--;
@@ -390,7 +442,7 @@
// single byte x coord value
if (fill_arrays) {
x_coordinates_[point_index] =
- data_->readUByte(x_coordinates_offset_ + x_byte_index);
+ data_->ReadUByte(x_coordinates_offset_ + x_byte_index);
x_coordinates_[point_index] *=
((flag & kFLAG_XREPEATSIGN) == kFLAG_XREPEATSIGN) ? 1 : -1;
}
@@ -400,7 +452,7 @@
if (!((flag & kFLAG_XREPEATSIGN) == kFLAG_XREPEATSIGN)) {
if (fill_arrays) {
x_coordinates_[point_index] =
- data_->readShort(x_coordinates_offset_ + x_byte_index);
+ data_->ReadShort(x_coordinates_offset_ + x_byte_index);
}
x_byte_index += 2;
}
@@ -413,7 +465,7 @@
if ((flag & kFLAG_YSHORT) == kFLAG_YSHORT) {
if (fill_arrays) {
y_coordinates_[point_index] =
- data_->readUByte(y_coordinates_offset_ + y_byte_index);
+ data_->ReadUByte(y_coordinates_offset_ + y_byte_index);
y_coordinates_[point_index] *=
((flag & kFLAG_YREPEATSIGN) == kFLAG_YREPEATSIGN) ? 1 : -1;
}
@@ -422,7 +474,7 @@
if (!((flag & kFLAG_YREPEATSIGN) == kFLAG_YREPEATSIGN)) {
if (fill_arrays) {
y_coordinates_[point_index] =
- data_->readShort(y_coordinates_offset_ + y_byte_index);
+ data_->ReadShort(y_coordinates_offset_ + y_byte_index);
}
y_byte_index += 2;
}
@@ -436,86 +488,130 @@
y_byte_count_ = y_byte_index;
}
-int32_t GlyphTable::SimpleGlyph::flagAsInt(int32_t index) {
- return data_->readUByte(flags_offset_ + index * DataSize::kBYTE);
+int32_t GlyphTable::SimpleGlyph::FlagAsInt(int32_t index) {
+ return data_->ReadUByte(flags_offset_ + index * DataSize::kBYTE);
}
-int32_t GlyphTable::SimpleGlyph::contourEndPoint(int32_t contour) {
- return data_->readUShort(contour * DataSize::kUSHORT +
+int32_t GlyphTable::SimpleGlyph::ContourEndPoint(int32_t contour) {
+ return data_->ReadUShort(contour * DataSize::kUSHORT +
Offset::kSimpleEndPtsOfCountours);
}
-int32_t GlyphTable::SimpleGlyph::instructionSize() {
- initialize();
- return instruction_size_;
-}
-
-CALLER_ATTACH ReadableFontData* GlyphTable::SimpleGlyph::instructions() {
- initialize();
- return down_cast<ReadableFontData*>(
- data_->slice(instructions_offset_, instructionSize()));
-}
-
-int32_t GlyphTable::SimpleGlyph::numberOfPoints(int32_t contour) {
- initialize();
- if (contour >= numberOfContours()) {
- return 0;
- }
- return contour_index_[contour + 1] - contour_index_[contour];
-}
-
-int32_t GlyphTable::SimpleGlyph::xCoordinate(int32_t contour, int32_t point) {
- initialize();
- return x_coordinates_[contour_index_[contour] + point];
-}
-
-int32_t GlyphTable::SimpleGlyph::yCoordinate(int32_t contour, int32_t point) {
- initialize();
- return y_coordinates_[contour_index_[contour] + point];
-}
-
-bool GlyphTable::SimpleGlyph::onCurve(int32_t contour, int32_t point) {
- initialize();
- return on_curve_[contour_index_[contour] + point];
+/******************************************************************************
+ * GlyphTable::SimpleGlyph::Builder
+ ******************************************************************************/
+GlyphTable::SimpleGlyph::SimpleGlyphBuilder::~SimpleGlyphBuilder() {
}
GlyphTable::SimpleGlyph::SimpleGlyphBuilder::SimpleGlyphBuilder(
- FontDataTableBuilderContainer* table_builder, WritableFontData* data) :
- Glyph::Builder(table_builder, data) {
+ FontDataTableBuilderContainer* table_builder,
+ WritableFontData* data)
+ : Glyph::Builder(table_builder, data) {
}
GlyphTable::SimpleGlyph::SimpleGlyphBuilder::SimpleGlyphBuilder(
- FontDataTableBuilderContainer* table_builder, ReadableFontData* data) :
- Glyph::Builder(table_builder, data) {
+ FontDataTableBuilderContainer* table_builder,
+ ReadableFontData* data)
+ : Glyph::Builder(table_builder, data) {
}
-GlyphTable::SimpleGlyph::SimpleGlyphBuilder::~SimpleGlyphBuilder() {}
-
CALLER_ATTACH FontDataTable*
- GlyphTable::SimpleGlyph::SimpleGlyphBuilder::subBuildTable(
+ GlyphTable::SimpleGlyph::SimpleGlyphBuilder::SubBuildTable(
ReadableFontData* data) {
FontDataTablePtr table = new SimpleGlyph(data);
- return table.detach();
+ return table.Detach();
}
/******************************************************************************
- * GlyphTable::CompositeGlyph and its builder
+ * GlyphTable::CompositeGlyph
******************************************************************************/
GlyphTable::CompositeGlyph::CompositeGlyph(ReadableFontData* data)
: GlyphTable::Glyph(data, GlyphType::kComposite),
- instruction_size_(0), instructions_offset_(0) {
- parseData();
+ instruction_size_(0),
+ instructions_offset_(0) {
+ ParseData();
}
-GlyphTable::CompositeGlyph::~CompositeGlyph() {}
+GlyphTable::CompositeGlyph::~CompositeGlyph() {
+}
-void GlyphTable::CompositeGlyph::parseData() {
+int32_t GlyphTable::CompositeGlyph::Flags(int32_t contour) {
+ return data_->ReadUShort(contour_index_[contour]);
+}
+
+int32_t GlyphTable::CompositeGlyph::NumGlyphs() {
+ return contour_index_.size();
+}
+
+int32_t GlyphTable::CompositeGlyph::GlyphIndex(int32_t contour) {
+ return data_->ReadUShort(DataSize::kUSHORT + contour_index_[contour]);
+}
+
+int32_t GlyphTable::CompositeGlyph::Argument1(int32_t contour) {
+ int32_t index = 2 * DataSize::kUSHORT + contour_index_[contour];
+ int32_t contour_flags = Flags(contour);
+ if ((contour_flags & kFLAG_ARG_1_AND_2_ARE_WORDS) ==
+ kFLAG_ARG_1_AND_2_ARE_WORDS) {
+ return data_->ReadUShort(index);
+ }
+ return data_->ReadByte(index);
+}
+
+int32_t GlyphTable::CompositeGlyph::Argument2(int32_t contour) {
+ int32_t index = 2 * DataSize::kUSHORT + contour_index_[contour];
+ int32_t contour_flags = Flags(contour);
+ if ((contour_flags & kFLAG_ARG_1_AND_2_ARE_WORDS) ==
+ kFLAG_ARG_1_AND_2_ARE_WORDS) {
+ return data_->ReadUShort(index + DataSize::kUSHORT);
+ }
+ return data_->ReadByte(index + DataSize::kUSHORT);
+}
+
+int32_t GlyphTable::CompositeGlyph::TransformationSize(int32_t contour) {
+ int32_t contour_flags = Flags(contour);
+ if ((contour_flags & kFLAG_WE_HAVE_A_SCALE) == kFLAG_WE_HAVE_A_SCALE) {
+ return DataSize::kF2DOT14;
+ } else if ((contour_flags & kFLAG_WE_HAVE_AN_X_AND_Y_SCALE) ==
+ kFLAG_WE_HAVE_AN_X_AND_Y_SCALE) {
+ return 2 * DataSize::kF2DOT14;
+ } else if ((contour_flags & kFLAG_WE_HAVE_A_TWO_BY_TWO) ==
+ kFLAG_WE_HAVE_A_TWO_BY_TWO) {
+ return 4 * DataSize::kF2DOT14;
+ }
+ return 0;
+}
+
+void GlyphTable::CompositeGlyph::Transformation(int32_t contour,
+ ByteVector* transformation) {
+ int32_t contour_flags = Flags(contour);
+ int32_t index = contour_index_[contour] + 2 * DataSize::kUSHORT;
+ if ((contour_flags & kFLAG_ARG_1_AND_2_ARE_WORDS) ==
+ kFLAG_ARG_1_AND_2_ARE_WORDS) {
+ index += 2 * DataSize::kSHORT;
+ } else {
+ index += 2 * DataSize::kBYTE;
+ }
+ int32_t tsize = TransformationSize(contour);
+ transformation->resize(tsize);
+ data_->ReadBytes(index, transformation, 0, tsize);
+}
+
+int32_t GlyphTable::CompositeGlyph::InstructionSize() {
+ return instruction_size_;
+}
+
+CALLER_ATTACH ReadableFontData* GlyphTable::CompositeGlyph::Instructions() {
+ return down_cast<ReadableFontData*>(
+ data_->Slice(instructions_offset_, InstructionSize()));
+}
+
+void GlyphTable::CompositeGlyph::ParseData() {
int32_t index = 5 * DataSize::kUSHORT;
int32_t flags = kFLAG_MORE_COMPONENTS;
while ((flags & kFLAG_MORE_COMPONENTS) == kFLAG_MORE_COMPONENTS) {
contour_index_.push_back(index);
- flags = data_->readUShort(index);
+ flags = data_->ReadUShort(index);
index += 2 * DataSize::kUSHORT; // flags and glyphIndex
if ((flags & kFLAG_ARG_1_AND_2_ARE_WORDS) == kFLAG_ARG_1_AND_2_ARE_WORDS) {
index += 2 * DataSize::kSHORT;
@@ -533,102 +629,38 @@
}
int32_t non_padded_data_length = index;
if ((flags & kFLAG_WE_HAVE_INSTRUCTIONS) == kFLAG_WE_HAVE_INSTRUCTIONS) {
- instruction_size_ = data_->readUShort(index);
+ instruction_size_ = data_->ReadUShort(index);
index += DataSize::kUSHORT;
instructions_offset_ = index;
non_padded_data_length = index + (instruction_size_ * DataSize::kBYTE);
}
- padding_ = length() - non_padded_data_length;
+ padding_ = Length() - non_padded_data_length;
}
}
-int32_t GlyphTable::CompositeGlyph::flags(int32_t contour) {
- return data_->readUShort(contour_index_[contour]);
-}
-
-int32_t GlyphTable::CompositeGlyph::numGlyphs() {
- return contour_index_.size();
-}
-
-int32_t GlyphTable::CompositeGlyph::glyphIndex(int32_t contour) {
- return data_->readUShort(DataSize::kUSHORT + contour_index_[contour]);
-}
-
-int32_t GlyphTable::CompositeGlyph::argument1(int32_t contour) {
- int32_t index = 2 * DataSize::kUSHORT + contour_index_[contour];
- int32_t contour_flags = flags(contour);
- if ((contour_flags & kFLAG_ARG_1_AND_2_ARE_WORDS) ==
- kFLAG_ARG_1_AND_2_ARE_WORDS) {
- return data_->readUShort(index);
- }
- return data_->readByte(index);
-}
-
-int32_t GlyphTable::CompositeGlyph::argument2(int32_t contour) {
- int32_t index = 2 * DataSize::kUSHORT + contour_index_[contour];
- int32_t contour_flags = flags(contour);
- if ((contour_flags & kFLAG_ARG_1_AND_2_ARE_WORDS) ==
- kFLAG_ARG_1_AND_2_ARE_WORDS) {
- return data_->readUShort(index + DataSize::kUSHORT);
- }
- return data_->readByte(index + DataSize::kUSHORT);
-}
-
-int32_t GlyphTable::CompositeGlyph::transformationSize(int32_t contour) {
- int32_t contour_flags = flags(contour);
- if ((contour_flags & kFLAG_WE_HAVE_A_SCALE) == kFLAG_WE_HAVE_A_SCALE) {
- return DataSize::kF2DOT14;
- } else if ((contour_flags & kFLAG_WE_HAVE_AN_X_AND_Y_SCALE) ==
- kFLAG_WE_HAVE_AN_X_AND_Y_SCALE) {
- return 2 * DataSize::kF2DOT14;
- } else if ((contour_flags & kFLAG_WE_HAVE_A_TWO_BY_TWO) ==
- kFLAG_WE_HAVE_A_TWO_BY_TWO) {
- return 4 * DataSize::kF2DOT14;
- }
- return 0;
-}
-
-void GlyphTable::CompositeGlyph::transformation(int32_t contour,
- ByteVector* transformation) {
- int32_t contour_flags = flags(contour);
- int32_t index = contour_index_[contour] + 2 * DataSize::kUSHORT;
- if ((contour_flags & kFLAG_ARG_1_AND_2_ARE_WORDS) ==
- kFLAG_ARG_1_AND_2_ARE_WORDS) {
- index += 2 * DataSize::kSHORT;
- } else {
- index += 2 * DataSize::kBYTE;
- }
- int32_t tsize = transformationSize(contour);
- transformation->resize(tsize);
- data_->readBytes(index, transformation, 0, tsize);
-}
-
-int32_t GlyphTable::CompositeGlyph::instructionSize() {
- return instruction_size_;
-}
-
-CALLER_ATTACH ReadableFontData* GlyphTable::CompositeGlyph::instructions() {
- return down_cast<ReadableFontData*>(
- data_->slice(instructions_offset_, instructionSize()));
+/******************************************************************************
+ * GlyphTable::CompositeGlyph::Builder
+ ******************************************************************************/
+GlyphTable::CompositeGlyph::CompositeGlyphBuilder::~CompositeGlyphBuilder() {
}
GlyphTable::CompositeGlyph::CompositeGlyphBuilder::CompositeGlyphBuilder(
- FontDataTableBuilderContainer* table_builder, WritableFontData* data) :
- Glyph::Builder(table_builder, data) {
+ FontDataTableBuilderContainer* table_builder,
+ WritableFontData* data)
+ : Glyph::Builder(table_builder, data) {
}
GlyphTable::CompositeGlyph::CompositeGlyphBuilder::CompositeGlyphBuilder(
- FontDataTableBuilderContainer* table_builder, ReadableFontData* data) :
- Glyph::Builder(table_builder, data) {
+ FontDataTableBuilderContainer* table_builder,
+ ReadableFontData* data)
+ : Glyph::Builder(table_builder, data) {
}
-GlyphTable::CompositeGlyph::CompositeGlyphBuilder::~CompositeGlyphBuilder() {}
-
CALLER_ATTACH FontDataTable*
- GlyphTable::CompositeGlyph::CompositeGlyphBuilder::subBuildTable(
+ GlyphTable::CompositeGlyph::CompositeGlyphBuilder::SubBuildTable(
ReadableFontData* data) {
FontDataTablePtr table = new CompositeGlyph(data);
- return table.detach();
+ return table.Detach();
}
} // namespace sfntly
diff --git a/sfntly/glyph_table.h b/sfntly/glyph_table.h
index 8a7a8aa..c066d47 100644
--- a/sfntly/glyph_table.h
+++ b/sfntly/glyph_table.h
@@ -36,66 +36,9 @@
// before GlyphTable::Builder to avoid compilation errors.
class GlyphTable : public Table, public RefCounted<GlyphTable> {
public:
- struct Offset {
- enum {
- // header
- kNumberOfContours = 0,
- kXMin = 2,
- kYMin = 4,
- kXMax = 6,
- kYMax = 8,
-
- // Simple Glyph Description
- kSimpleEndPtsOfCountours = 10,
- // offset from the end of the contours array
- kSimpleInstructionLength = 0,
- kSimpleInstructions = 2,
- // flags
- // xCoordinates
- // yCoordinates
-
- // Composite Glyph Description
- kCompositeFlags = 0,
- kCompositeGyphIndexWithoutFlag = 0,
- kCompositeGlyphIndexWithFlag = 2,
- };
- };
-
- private:
- GlyphTable(Header* header, ReadableFontData* data);
-
- public:
- virtual ~GlyphTable();
-
- class Glyph;
- Glyph* glyph(int32_t offset, int32_t length);
-
class Builder;
class Glyph : public SubTable {
- protected:
- // Note: constructor refactored in C++ to avoid heavy lifting.
- // caller need to do data->slice(offset, length) beforehand.
- Glyph(ReadableFontData* data, int32_t glyph_type);
-
- private:
- static int32_t glyphType(ReadableFontData* data, int32_t offset,
- int32_t length);
-
public:
- virtual ~Glyph();
- static CALLER_ATTACH Glyph* getGlyph(ReadableFontData* data, int32_t offset,
- int32_t length);
- virtual int32_t glyphType();
- virtual int32_t numberOfContours();
- virtual int32_t xMin();
- virtual int32_t xMax();
- virtual int32_t yMin();
- virtual int32_t yMax();
- virtual int32_t padding(); // override FontDataTable::padding()
-
- virtual int32_t instructionSize() = 0;
- virtual ReadableFontData* instructions() = 0;
-
// Note: Contour is an empty class for the version ported
class Contour {
protected:
@@ -104,42 +47,67 @@
};
class Builder : public SubTable::Builder {
+ public:
+ virtual ~Builder();
+
protected:
// Incoming table_builder is GlyphTable::Builder*.
// Note: constructor refactored in C++ to avoid heavy lifting.
- // caller need to do data->slice(offset, length) beforehand.
+ // caller need to do data->Slice(offset, length) beforehand.
Builder(FontDataTableBuilderContainer* table_builder,
WritableFontData* data);
Builder(FontDataTableBuilderContainer* table_builder,
ReadableFontData* data);
- public:
- virtual ~Builder();
+ static CALLER_ATTACH Builder*
+ GetBuilder(FontDataTableBuilderContainer* table_builder,
+ ReadableFontData* data);
+ static CALLER_ATTACH Builder*
+ GetBuilder(FontDataTableBuilderContainer* table_builder,
+ ReadableFontData* data,
+ int32_t offset,
+ int32_t length);
+ virtual void SubDataSet();
+ virtual int32_t SubDataSizeToSerialize();
+ virtual bool SubReadyToSerialize();
+ virtual int32_t SubSerialize(WritableFontData* new_data);
- protected:
- static CALLER_ATTACH Builder* getBuilder(
- FontDataTableBuilderContainer* table_builder, ReadableFontData* data);
- static CALLER_ATTACH Builder* getBuilder(
- FontDataTableBuilderContainer* table_builder, ReadableFontData* data,
- int32_t offset, int32_t length);
- virtual void subDataSet();
- virtual int32_t subDataSizeToSerialize();
- virtual bool subReadyToSerialize();
- virtual int32_t subSerialize(WritableFontData* new_data);
-
- protected:
+ private:
int32_t format_;
friend class GlyphTable::Builder;
};
- private:
- int32_t glyph_type_;
- int32_t number_of_contours_;
+ virtual ~Glyph();
+ static CALLER_ATTACH Glyph* GetGlyph(ReadableFontData* data,
+ int32_t offset,
+ int32_t length);
+ virtual int32_t GlyphType();
+ virtual int32_t NumberOfContours();
+ virtual int32_t XMin();
+ virtual int32_t XMax();
+ virtual int32_t YMin();
+ virtual int32_t YMax();
+ virtual int32_t Padding(); // override FontDataTable::Padding()
+
+ virtual int32_t InstructionSize() = 0;
+ virtual ReadableFontData* Instructions() = 0;
protected:
- int32_t padding_;
- };
+ // Note: constructor refactored in C++ to avoid heavy lifting.
+ // caller need to do data->Slice(offset, length) beforehand.
+ Glyph(ReadableFontData* data, int32_t glyph_type);
+ // TODO(arthurhsu): violating C++ style guide, need refactoring.
+ int32_t padding_;
+
+ private:
+ static int32_t GlyphType(ReadableFontData* data,
+ int32_t offset,
+ int32_t length);
+
+ int32_t glyph_type_;
+ int32_t number_of_contours_;
+ }; // class GlyphTable::Glyph
typedef Ptr<GlyphTable::Glyph::Builder> GlyphBuilderPtr;
typedef std::vector<GlyphBuilderPtr> GlyphBuilderList;
@@ -147,19 +115,14 @@
public RefCounted<GlyphTable::Builder> {
public:
// Note: Constructor scope altered to public for base class to instantiate.
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+ Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
WritableFontData* data);
virtual ~Builder();
- virtual void setLoca(const IntegerList& loca);
- virtual void generateLocaList(IntegerList* locas);
+ virtual void SetLoca(const IntegerList& loca);
+ virtual void GenerateLocaList(IntegerList* locas);
- private:
- void initialize(ReadableFontData* data, const IntegerList& loca);
- GlyphBuilderList* getGlyphBuilders();
- void revert();
-
- public:
// Gets the List of glyph builders for the glyph table builder. These may be
// manipulated in any way by the caller and the changes will be reflected in
// the final glyph table produced.
@@ -168,22 +131,26 @@
// List. If there is current data (i.e. data read from an existing font) and
// the <code>loca</code> list has not been set or is null, empty, or
// invalid, then an empty glyph builder List will be returned.
- GlyphBuilderList* glyphBuilders();
+ GlyphBuilderList* GlyphBuilders();
// Replace the internal glyph builders with the one provided.
- void setGlyphBuilders(GlyphBuilderList* glyph_builders);
+ void SetGlyphBuilders(GlyphBuilderList* glyph_builders);
// Glyph builder factories
- CALLER_ATTACH Glyph::Builder* glyphBuilder(ReadableFontData* data);
+ CALLER_ATTACH Glyph::Builder* GlyphBuilder(ReadableFontData* data);
protected: // internal API for building
- virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
- virtual void subDataSet();
- virtual int32_t subDataSizeToSerialize();
- virtual bool subReadyToSerialize();
- virtual int32_t subSerialize(WritableFontData* new_data);
+ virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+ virtual void SubDataSet();
+ virtual int32_t SubDataSizeToSerialize();
+ virtual bool SubReadyToSerialize();
+ virtual int32_t SubSerialize(WritableFontData* new_data);
private:
+ void Initialize(ReadableFontData* data, const IntegerList& loca);
+ GlyphBuilderList* GetGlyphBuilders();
+ void Revert();
+
GlyphBuilderList glyph_builders_;
IntegerList loca_;
};
@@ -197,34 +164,12 @@
static const int32_t kFLAG_XREPEATSIGN;
static const int32_t kFLAG_YREPEATSIGN;
- public:
- // Note: constructor refactored in C++ to avoid heavy lifting.
- // caller need to do data->slice(offset, length) beforehand.
- explicit SimpleGlyph(ReadableFontData* data);
- virtual ~SimpleGlyph();
-
- public:
class SimpleContour : public Glyph::Contour {
protected:
SimpleContour() {}
virtual ~SimpleContour() {}
};
- private:
- void initialize();
- void parseData(bool fill_arrays);
- int32_t flagAsInt(int32_t index);
- int32_t contourEndPoint(int32_t contour);
-
- public: // class is final, , no virtual functions unless from parent
- virtual int32_t instructionSize();
- virtual CALLER_ATTACH ReadableFontData* instructions();
- int32_t numberOfPoints(int32_t contour);
- int32_t xCoordinate(int32_t contour, int32_t point);
- int32_t yCoordinate(int32_t contour, int32_t point);
- bool onCurve(int32_t contour, int32_t point);
-
- public:
class SimpleGlyphBuilder : public Glyph::Builder,
public RefCounted<SimpleGlyphBuilder> {
public:
@@ -232,17 +177,36 @@
protected:
// Note: constructor refactored in C++ to avoid heavy lifting.
- // caller need to do data->slice(offset, length) beforehand.
+ // caller need to do data->Slice(offset, length) beforehand.
SimpleGlyphBuilder(FontDataTableBuilderContainer* table_builder,
WritableFontData* data);
SimpleGlyphBuilder(FontDataTableBuilderContainer* table_builder,
ReadableFontData* data);
virtual CALLER_ATTACH FontDataTable*
- subBuildTable(ReadableFontData* data);
+ SubBuildTable(ReadableFontData* data);
+
+ private:
friend class Glyph::Builder;
};
+ // Note: constructor refactored in C++ to avoid heavy lifting.
+ // caller need to do data->Slice(offset, length) beforehand.
+ explicit SimpleGlyph(ReadableFontData* data);
+ virtual ~SimpleGlyph();
+
+ virtual int32_t InstructionSize();
+ virtual CALLER_ATTACH ReadableFontData* Instructions();
+ int32_t NumberOfPoints(int32_t contour);
+ int32_t XCoordinate(int32_t contour, int32_t point);
+ int32_t YCoordinate(int32_t contour, int32_t point);
+ bool OnCurve(int32_t contour, int32_t point);
+
private:
+ void Initialize();
+ void ParseData(bool fill_arrays);
+ int32_t FlagAsInt(int32_t index);
+ int32_t ContourEndPoint(int32_t contour);
+
bool initialized_;
int32_t instruction_size_;
int32_t number_of_points_;
@@ -279,27 +243,6 @@
static const int32_t kFLAG_SCALED_COMPONENT_OFFSET;
static const int32_t kFLAG_UNSCALED_COMPONENT_OFFSET;
- public:
- // Note: constructor refactored in C++ to avoid heavy lifting.
- // caller need to do data->slice(offset, length) beforehand.
- explicit CompositeGlyph(ReadableFontData* data);
- virtual ~CompositeGlyph();
-
- private:
- void parseData();
-
- public: // class is final, no virtual functions unless from parent
- int32_t flags(int32_t contour);
- int32_t numGlyphs();
- int32_t glyphIndex(int32_t contour);
- int32_t argument1(int32_t contour);
- int32_t argument2(int32_t contour);
- int32_t transformationSize(int32_t contour);
- void transformation(int32_t contour, ByteVector* transformation);
- virtual int32_t instructionSize();
- virtual CALLER_ATTACH ReadableFontData* instructions();
-
- public:
class CompositeGlyphBuilder : public Glyph::Builder,
public RefCounted<CompositeGlyphBuilder> {
public:
@@ -307,22 +250,74 @@
protected:
// Note: constructor refactored in C++ to avoid heavy lifting.
- // caller need to do data->slice(offset, length) beforehand.
+ // caller need to do data->Slice(offset, length) beforehand.
CompositeGlyphBuilder(FontDataTableBuilderContainer* table_builder,
WritableFontData* data);
CompositeGlyphBuilder(FontDataTableBuilderContainer* table_builder,
ReadableFontData* data);
virtual CALLER_ATTACH FontDataTable*
- subBuildTable(ReadableFontData* data);
+ SubBuildTable(ReadableFontData* data);
+
+ private:
friend class Glyph::Builder;
};
+ // Note: constructor refactored in C++ to avoid heavy lifting.
+ // caller need to do data->Slice(offset, length) beforehand.
+ explicit CompositeGlyph(ReadableFontData* data);
+ virtual ~CompositeGlyph();
+
+ int32_t Flags(int32_t contour);
+ int32_t NumGlyphs();
+ int32_t GlyphIndex(int32_t contour);
+ int32_t Argument1(int32_t contour);
+ int32_t Argument2(int32_t contour);
+ int32_t TransformationSize(int32_t contour);
+ void Transformation(int32_t contour, ByteVector* transformation);
+ virtual int32_t InstructionSize();
+ virtual CALLER_ATTACH ReadableFontData* Instructions();
+
private:
+ void ParseData();
+
IntegerList contour_index_;
int32_t instruction_size_;
int32_t instructions_offset_;
};
+
+ virtual ~GlyphTable();
+
+ // C++ port: rename glyph() to GetGlyph().
+ Glyph* GetGlyph(int32_t offset, int32_t length);
+
+ private:
+ struct Offset {
+ enum {
+ // header
+ kNumberOfContours = 0,
+ kXMin = 2,
+ kYMin = 4,
+ kXMax = 6,
+ kYMax = 8,
+
+ // Simple Glyph Description
+ kSimpleEndPtsOfCountours = 10,
+ // offset from the end of the contours array
+ kSimpleInstructionLength = 0,
+ kSimpleInstructions = 2,
+ // flags
+ // xCoordinates
+ // yCoordinates
+
+ // Composite Glyph Description
+ kCompositeFlags = 0,
+ kCompositeGyphIndexWithoutFlag = 0,
+ kCompositeGlyphIndexWithFlag = 2,
+ };
+ };
+
+ GlyphTable(Header* header, ReadableFontData* data);
};
typedef Ptr<GlyphTable> GlyphTablePtr;
typedef Ptr<GlyphTable::Builder> GlyphTableBuilderPtr;
diff --git a/sfntly/horizontal_header_table.cc b/sfntly/horizontal_header_table.cc
index f30e8db..a987d70 100644
--- a/sfntly/horizontal_header_table.cc
+++ b/sfntly/horizontal_header_table.cc
@@ -24,189 +24,192 @@
/******************************************************************************
* HorizontalHeaderTable class
******************************************************************************/
-HorizontalHeaderTable:: HorizontalHeaderTable(Header* header,
- ReadableFontData* data) :
- Table(header, data) {}
-
HorizontalHeaderTable:: ~HorizontalHeaderTable() {}
-int32_t HorizontalHeaderTable::version() {
- return data_->readFixed(Offset::kVersion);
+int32_t HorizontalHeaderTable::Version() {
+ return data_->ReadFixed(Offset::kVersion);
}
-int32_t HorizontalHeaderTable::ascender() {
- return data_->readShort(Offset::kAscender);
+int32_t HorizontalHeaderTable::Ascender() {
+ return data_->ReadShort(Offset::kAscender);
}
-int32_t HorizontalHeaderTable::descender() {
- return data_->readShort(Offset::kDescender);
+int32_t HorizontalHeaderTable::Descender() {
+ return data_->ReadShort(Offset::kDescender);
}
-int32_t HorizontalHeaderTable::lineGap() {
- return data_->readShort(Offset::kLineGap);
+int32_t HorizontalHeaderTable::LineGap() {
+ return data_->ReadShort(Offset::kLineGap);
}
-int32_t HorizontalHeaderTable::advanceWidthMax() {
- return data_->readUShort(Offset::kAdvanceWidthMax);
+int32_t HorizontalHeaderTable::AdvanceWidthMax() {
+ return data_->ReadUShort(Offset::kAdvanceWidthMax);
}
-int32_t HorizontalHeaderTable::minLeftSideBearing() {
- return data_->readShort(Offset::kMinLeftSideBearing);
+int32_t HorizontalHeaderTable::MinLeftSideBearing() {
+ return data_->ReadShort(Offset::kMinLeftSideBearing);
}
-int32_t HorizontalHeaderTable::minRightSideBearing() {
- return data_->readShort(Offset::kMinRightSideBearing);
+int32_t HorizontalHeaderTable::MinRightSideBearing() {
+ return data_->ReadShort(Offset::kMinRightSideBearing);
}
-int32_t HorizontalHeaderTable::xMaxExtent() {
- return data_->readShort(Offset::kXMaxExtent);
+int32_t HorizontalHeaderTable::XMaxExtent() {
+ return data_->ReadShort(Offset::kXMaxExtent);
}
-int32_t HorizontalHeaderTable::caretSlopeRise() {
- return data_->readShort(Offset::kCaretSlopeRise);
+int32_t HorizontalHeaderTable::CaretSlopeRise() {
+ return data_->ReadShort(Offset::kCaretSlopeRise);
}
-int32_t HorizontalHeaderTable::caretSlopeRun() {
- return data_->readShort(Offset::kCaretSlopeRun);
+int32_t HorizontalHeaderTable::CaretSlopeRun() {
+ return data_->ReadShort(Offset::kCaretSlopeRun);
}
-int32_t HorizontalHeaderTable::caretOffset() {
- return data_->readShort(Offset::kCaretOffset);
+int32_t HorizontalHeaderTable::CaretOffset() {
+ return data_->ReadShort(Offset::kCaretOffset);
}
-int32_t HorizontalHeaderTable::metricDataFormat() {
- return data_->readShort(Offset::kMetricDataFormat);
+int32_t HorizontalHeaderTable::MetricDataFormat() {
+ return data_->ReadShort(Offset::kMetricDataFormat);
}
-int32_t HorizontalHeaderTable::numberOfHMetrics() {
- return data_->readUShort(Offset::kNumberOfHMetrics);
+int32_t HorizontalHeaderTable::NumberOfHMetrics() {
+ return data_->ReadUShort(Offset::kNumberOfHMetrics);
+}
+
+HorizontalHeaderTable:: HorizontalHeaderTable(Header* header,
+ ReadableFontData* data)
+ : Table(header, data) {
}
/******************************************************************************
* HorizontalHeaderTable::Builder class
******************************************************************************/
HorizontalHeaderTable::Builder::Builder(
- FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* data) :
- Table::TableBasedTableBuilder(font_builder, header, data) {
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data)
+ : Table::TableBasedTableBuilder(font_builder, header, data) {
}
HorizontalHeaderTable::Builder::Builder(
- FontDataTableBuilderContainer* font_builder, Header* header,
- ReadableFontData* data) :
- Table::TableBasedTableBuilder(font_builder, header, data) {
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data)
+ : Table::TableBasedTableBuilder(font_builder, header, data) {
}
HorizontalHeaderTable::Builder::~Builder() {}
-CALLER_ATTACH FontDataTable* HorizontalHeaderTable::Builder::subBuildTable(
- ReadableFontData* data) {
+CALLER_ATTACH FontDataTable*
+ HorizontalHeaderTable::Builder::SubBuildTable(ReadableFontData* data) {
FontDataTablePtr table = new HorizontalHeaderTable(header(), data);
- return table.detach();
+ return table.Detach();
}
-int32_t HorizontalHeaderTable::Builder::version() {
- return internalReadData()->readFixed(Offset::kVersion);
+int32_t HorizontalHeaderTable::Builder::Version() {
+ return InternalReadData()->ReadFixed(Offset::kVersion);
}
-void HorizontalHeaderTable::Builder::setVersion(int32_t version) {
- internalWriteData()->writeFixed(Offset::kVersion, version);
+void HorizontalHeaderTable::Builder::SetVersion(int32_t version) {
+ InternalWriteData()->WriteFixed(Offset::kVersion, version);
}
-int32_t HorizontalHeaderTable::Builder::ascender() {
- return internalReadData()->readUShort(Offset::kAscender);
+int32_t HorizontalHeaderTable::Builder::Ascender() {
+ return InternalReadData()->ReadUShort(Offset::kAscender);
}
-void HorizontalHeaderTable::Builder::setAscender(int32_t ascender) {
- internalWriteData()->writeUShort(Offset::kVersion, ascender);
+void HorizontalHeaderTable::Builder::SetAscender(int32_t ascender) {
+ InternalWriteData()->WriteUShort(Offset::kVersion, ascender);
}
-int32_t HorizontalHeaderTable::Builder::descender() {
- return internalReadData()->readUShort(Offset::kDescender);
+int32_t HorizontalHeaderTable::Builder::Descender() {
+ return InternalReadData()->ReadUShort(Offset::kDescender);
}
-void HorizontalHeaderTable::Builder::setDescender(int32_t descender) {
- internalWriteData()->writeUShort(Offset::kDescender, descender);
+void HorizontalHeaderTable::Builder::SetDescender(int32_t descender) {
+ InternalWriteData()->WriteUShort(Offset::kDescender, descender);
}
-int32_t HorizontalHeaderTable::Builder::lineGap() {
- return internalReadData()->readUShort(Offset::kLineGap);
+int32_t HorizontalHeaderTable::Builder::LineGap() {
+ return InternalReadData()->ReadUShort(Offset::kLineGap);
}
-void HorizontalHeaderTable::Builder::setLineGap(int32_t line_gap) {
- internalWriteData()->writeUShort(Offset::kLineGap, line_gap);
+void HorizontalHeaderTable::Builder::SetLineGap(int32_t line_gap) {
+ InternalWriteData()->WriteUShort(Offset::kLineGap, line_gap);
}
-int32_t HorizontalHeaderTable::Builder::advanceWidthMax() {
- return internalReadData()->readUShort(Offset::kAdvanceWidthMax);
+int32_t HorizontalHeaderTable::Builder::AdvanceWidthMax() {
+ return InternalReadData()->ReadUShort(Offset::kAdvanceWidthMax);
}
-void HorizontalHeaderTable::Builder::setAdvanceWidthMax(int32_t value) {
- internalWriteData()->writeUShort(Offset::kAdvanceWidthMax, value);
+void HorizontalHeaderTable::Builder::SetAdvanceWidthMax(int32_t value) {
+ InternalWriteData()->WriteUShort(Offset::kAdvanceWidthMax, value);
}
-int32_t HorizontalHeaderTable::Builder::minLeftSideBearing() {
- return internalReadData()->readUShort(Offset::kMinLeftSideBearing);
+int32_t HorizontalHeaderTable::Builder::MinLeftSideBearing() {
+ return InternalReadData()->ReadUShort(Offset::kMinLeftSideBearing);
}
-void HorizontalHeaderTable::Builder::setMinLeftSideBearing(int32_t value) {
- internalWriteData()->writeUShort(Offset::kMinLeftSideBearing, value);
+void HorizontalHeaderTable::Builder::SetMinLeftSideBearing(int32_t value) {
+ InternalWriteData()->WriteUShort(Offset::kMinLeftSideBearing, value);
}
-int32_t HorizontalHeaderTable::Builder::minRightSideBearing() {
- return internalReadData()->readUShort(Offset::kMinRightSideBearing);
+int32_t HorizontalHeaderTable::Builder::MinRightSideBearing() {
+ return InternalReadData()->ReadUShort(Offset::kMinRightSideBearing);
}
-void HorizontalHeaderTable::Builder::setMinRightSideBearing(int32_t value) {
- internalWriteData()->writeUShort(Offset::kMinRightSideBearing, value);
+void HorizontalHeaderTable::Builder::SetMinRightSideBearing(int32_t value) {
+ InternalWriteData()->WriteUShort(Offset::kMinRightSideBearing, value);
}
-int32_t HorizontalHeaderTable::Builder::xMaxExtent() {
- return internalReadData()->readUShort(Offset::kXMaxExtent);
+int32_t HorizontalHeaderTable::Builder::XMaxExtent() {
+ return InternalReadData()->ReadUShort(Offset::kXMaxExtent);
}
-void HorizontalHeaderTable::Builder::setXMaxExtent(int32_t value) {
- internalWriteData()->writeUShort(Offset::kXMaxExtent, value);
+void HorizontalHeaderTable::Builder::SetXMaxExtent(int32_t value) {
+ InternalWriteData()->WriteUShort(Offset::kXMaxExtent, value);
}
-int32_t HorizontalHeaderTable::Builder::caretSlopeRise() {
- return internalReadData()->readUShort(Offset::kCaretSlopeRise);
+int32_t HorizontalHeaderTable::Builder::CaretSlopeRise() {
+ return InternalReadData()->ReadUShort(Offset::kCaretSlopeRise);
}
-void HorizontalHeaderTable::Builder::setCaretSlopeRise(int32_t value) {
- internalWriteData()->writeUShort(Offset::kCaretSlopeRise, value);
+void HorizontalHeaderTable::Builder::SetCaretSlopeRise(int32_t value) {
+ InternalWriteData()->WriteUShort(Offset::kCaretSlopeRise, value);
}
-int32_t HorizontalHeaderTable::Builder::caretSlopeRun() {
- return internalReadData()->readUShort(Offset::kCaretSlopeRun);
+int32_t HorizontalHeaderTable::Builder::CaretSlopeRun() {
+ return InternalReadData()->ReadUShort(Offset::kCaretSlopeRun);
}
-void HorizontalHeaderTable::Builder::setCaretSlopeRun(int32_t value) {
- internalWriteData()->writeUShort(Offset::kCaretSlopeRun, value);
+void HorizontalHeaderTable::Builder::SetCaretSlopeRun(int32_t value) {
+ InternalWriteData()->WriteUShort(Offset::kCaretSlopeRun, value);
}
-int32_t HorizontalHeaderTable::Builder::caretOffset() {
- return internalReadData()->readUShort(Offset::kCaretOffset);
+int32_t HorizontalHeaderTable::Builder::CaretOffset() {
+ return InternalReadData()->ReadUShort(Offset::kCaretOffset);
}
-void HorizontalHeaderTable::Builder::setCaretOffset(int32_t value) {
- internalWriteData()->writeUShort(Offset::kCaretOffset, value);
+void HorizontalHeaderTable::Builder::SetCaretOffset(int32_t value) {
+ InternalWriteData()->WriteUShort(Offset::kCaretOffset, value);
}
-int32_t HorizontalHeaderTable::Builder::metricDataFormat() {
- return internalReadData()->readUShort(Offset::kMetricDataFormat);
+int32_t HorizontalHeaderTable::Builder::MetricDataFormat() {
+ return InternalReadData()->ReadUShort(Offset::kMetricDataFormat);
}
-void HorizontalHeaderTable::Builder::setMetricDataFormat(int32_t value) {
- internalWriteData()->writeUShort(Offset::kMetricDataFormat, value);
+void HorizontalHeaderTable::Builder::SetMetricDataFormat(int32_t value) {
+ InternalWriteData()->WriteUShort(Offset::kMetricDataFormat, value);
}
-int32_t HorizontalHeaderTable::Builder::numberOfHMetrics() {
- return internalReadData()->readUShort(Offset::kNumberOfHMetrics);
+int32_t HorizontalHeaderTable::Builder::NumberOfHMetrics() {
+ return InternalReadData()->ReadUShort(Offset::kNumberOfHMetrics);
}
-void HorizontalHeaderTable::Builder::setNumberOfHMetrics(int32_t value) {
- internalWriteData()->writeUShort(Offset::kNumberOfHMetrics, value);
+void HorizontalHeaderTable::Builder::SetNumberOfHMetrics(int32_t value) {
+ InternalWriteData()->WriteUShort(Offset::kNumberOfHMetrics, value);
}
} // namespace sfntly
diff --git a/sfntly/horizontal_header_table.h b/sfntly/horizontal_header_table.h
index 704391c..e8a3534 100644
--- a/sfntly/horizontal_header_table.h
+++ b/sfntly/horizontal_header_table.h
@@ -23,6 +23,64 @@
class HorizontalHeaderTable : public Table,
public RefCounted<HorizontalHeaderTable> {
+ public:
+ class Builder : public Table::TableBasedTableBuilder,
+ public RefCounted<Builder> {
+ public:
+ // Constructor scope altered to public because C++ does not allow base
+ // class to instantiate derived class with protected constructors.
+ Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data);
+ Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data);
+ virtual ~Builder();
+ virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+
+ int32_t Version();
+ void SetVersion(int32_t version);
+ int32_t Ascender();
+ void SetAscender(int32_t ascender);
+ int32_t Descender();
+ void SetDescender(int32_t descender);
+ int32_t LineGap();
+ void SetLineGap(int32_t line_gap);
+ int32_t AdvanceWidthMax();
+ void SetAdvanceWidthMax(int32_t value);
+ int32_t MinLeftSideBearing();
+ void SetMinLeftSideBearing(int32_t value);
+ int32_t MinRightSideBearing();
+ void SetMinRightSideBearing(int32_t value);
+ int32_t XMaxExtent();
+ void SetXMaxExtent(int32_t value);
+ int32_t CaretSlopeRise();
+ void SetCaretSlopeRise(int32_t value);
+ int32_t CaretSlopeRun();
+ void SetCaretSlopeRun(int32_t value);
+ int32_t CaretOffset();
+ void SetCaretOffset(int32_t value);
+ int32_t MetricDataFormat();
+ void SetMetricDataFormat(int32_t value);
+ int32_t NumberOfHMetrics();
+ void SetNumberOfHMetrics(int32_t value);
+ };
+
+ virtual ~HorizontalHeaderTable();
+ int32_t Version();
+ int32_t Ascender();
+ int32_t Descender();
+ int32_t LineGap();
+ int32_t AdvanceWidthMax();
+ int32_t MinLeftSideBearing();
+ int32_t MinRightSideBearing();
+ int32_t XMaxExtent();
+ int32_t CaretSlopeRise();
+ int32_t CaretSlopeRun();
+ int32_t CaretOffset();
+ int32_t MetricDataFormat();
+ int32_t NumberOfHMetrics();
+
private:
struct Offset {
enum {
@@ -42,65 +100,7 @@
};
};
- private:
HorizontalHeaderTable(Header* header, ReadableFontData* data);
-
- public:
- virtual ~HorizontalHeaderTable();
- int32_t version();
- int32_t ascender();
- int32_t descender();
- int32_t lineGap();
- int32_t advanceWidthMax();
- int32_t minLeftSideBearing();
- int32_t minRightSideBearing();
- int32_t xMaxExtent();
- int32_t caretSlopeRise();
- int32_t caretSlopeRun();
- int32_t caretOffset();
- int32_t metricDataFormat();
- int32_t numberOfHMetrics();
-
- public:
- class Builder : public Table::TableBasedTableBuilder,
- public RefCounted<Builder> {
- public:
- // Constructor scope altered to public because C++ does not allow base
- // class to instantiate derived class with protected constructors.
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* data);
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
- ReadableFontData* data);
- virtual ~Builder();
- virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
-
- int32_t version();
- void setVersion(int32_t version);
- int32_t ascender();
- void setAscender(int32_t ascender);
- int32_t descender();
- void setDescender(int32_t descender);
- int32_t lineGap();
- void setLineGap(int32_t line_gap);
- int32_t advanceWidthMax();
- void setAdvanceWidthMax(int32_t value);
- int32_t minLeftSideBearing();
- void setMinLeftSideBearing(int32_t value);
- int32_t minRightSideBearing();
- void setMinRightSideBearing(int32_t value);
- int32_t xMaxExtent();
- void setXMaxExtent(int32_t value);
- int32_t caretSlopeRise();
- void setCaretSlopeRise(int32_t value);
- int32_t caretSlopeRun();
- void setCaretSlopeRun(int32_t value);
- int32_t caretOffset();
- void setCaretOffset(int32_t value);
- int32_t metricDataFormat();
- void setMetricDataFormat(int32_t value);
- int32_t numberOfHMetrics();
- void setNumberOfHMetrics(int32_t value);
- };
};
typedef Ptr<HorizontalHeaderTable> HorizontalHeaderTablePtr;
typedef Ptr<HorizontalHeaderTable::Builder> HorizontalHeaderTableBuilderPtr;
diff --git a/sfntly/horizontal_metrics_table.cc b/sfntly/horizontal_metrics_table.cc
index c151e18..921d8bc 100644
--- a/sfntly/horizontal_metrics_table.cc
+++ b/sfntly/horizontal_metrics_table.cc
@@ -21,29 +21,17 @@
/******************************************************************************
* HorizontalMetricsTable class
******************************************************************************/
-HorizontalMetricsTable::HorizontalMetricsTable(Header* header,
- ReadableFontData* data) :
- Table(header, data) {
-}
-
-HorizontalMetricsTable::HorizontalMetricsTable(Header* header,
- ReadableFontData* data,
- int32_t num_hmetrics,
- int32_t num_glyphs) :
- Table(header, data), num_hmetrics_(num_hmetrics), num_glyphs_(num_glyphs) {
-}
-
HorizontalMetricsTable::~HorizontalMetricsTable() {}
-int32_t HorizontalMetricsTable::numberOfHMetrics() {
+int32_t HorizontalMetricsTable::NumberOfHMetrics() {
return num_hmetrics_;
}
-int32_t HorizontalMetricsTable::numberOfLSBs() {
+int32_t HorizontalMetricsTable::NumberOfLSBs() {
return num_glyphs_ - num_hmetrics_;
}
-int32_t HorizontalMetricsTable::hMetricAdvanceWidth(int32_t entry) {
+int32_t HorizontalMetricsTable::HMetricAdvanceWidth(int32_t entry) {
if (entry > num_hmetrics_) {
#if defined (SFNTLY_NO_EXCEPTION)
return 0;
@@ -53,10 +41,10 @@
}
int32_t offset = Offset::kHMetricsStart + (entry * Offset::kHMetricsSize) +
Offset::kHMetricsAdvanceWidth;
- return data_->readUShort(offset);
+ return data_->ReadUShort(offset);
}
-int32_t HorizontalMetricsTable::hMetricLSB(int32_t entry) {
+int32_t HorizontalMetricsTable::HMetricLSB(int32_t entry) {
if (entry > num_hmetrics_) {
#if defined (SFNTLY_NO_EXCEPTION)
return 0;
@@ -66,10 +54,10 @@
}
int32_t offset = Offset::kHMetricsStart + (entry * Offset::kHMetricsSize) +
Offset::kHMetricsLeftSideBearing;
- return data_->readShort(offset);
+ return data_->ReadShort(offset);
}
-int32_t HorizontalMetricsTable::lsbTableEntry(int32_t entry) {
+int32_t HorizontalMetricsTable::LsbTableEntry(int32_t entry) {
if (entry > num_hmetrics_) {
#if defined (SFNTLY_NO_EXCEPTION)
return 0;
@@ -79,62 +67,78 @@
}
int32_t offset = Offset::kHMetricsStart + (entry * Offset::kHMetricsSize) +
Offset::kLeftSideBearingSize;
- return data_->readShort(offset);
+ return data_->ReadShort(offset);
}
-int32_t HorizontalMetricsTable::advanceWidth(int32_t glyph_id) {
+int32_t HorizontalMetricsTable::AdvanceWidth(int32_t glyph_id) {
if (glyph_id < num_hmetrics_) {
- return hMetricAdvanceWidth(glyph_id);
+ return HMetricAdvanceWidth(glyph_id);
}
- return hMetricAdvanceWidth(glyph_id - num_hmetrics_);
+ return HMetricAdvanceWidth(glyph_id - num_hmetrics_);
+}
+
+HorizontalMetricsTable::HorizontalMetricsTable(Header* header,
+ ReadableFontData* data)
+ : Table(header, data) {
+}
+
+HorizontalMetricsTable::HorizontalMetricsTable(Header* header,
+ ReadableFontData* data,
+ int32_t num_hmetrics,
+ int32_t num_glyphs)
+ : Table(header, data),
+ num_hmetrics_(num_hmetrics),
+ num_glyphs_(num_glyphs) {
}
/******************************************************************************
* HorizontalMetricsTable::Builder class
******************************************************************************/
-void HorizontalMetricsTable::Builder::init() {
- num_hmetrics_ = -1;
- num_glyphs_ = -1;
+HorizontalMetricsTable::Builder::Builder(
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data)
+ : Table::TableBasedTableBuilder(font_builder, header, data) {
+ Init();
}
HorizontalMetricsTable::Builder::Builder(
- FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* data) :
- Table::TableBasedTableBuilder(font_builder, header, data) {
- init();
-}
-
-HorizontalMetricsTable::Builder::Builder(
- FontDataTableBuilderContainer* font_builder, Header* header,
- ReadableFontData* data) :
- Table::TableBasedTableBuilder(font_builder, header, data) {
- init();
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data)
+ : Table::TableBasedTableBuilder(font_builder, header, data) {
+ Init();
}
HorizontalMetricsTable::Builder::~Builder() {}
-CALLER_ATTACH FontDataTable* HorizontalMetricsTable::Builder::subBuildTable(
- ReadableFontData* data) {
+CALLER_ATTACH FontDataTable*
+ HorizontalMetricsTable::Builder::SubBuildTable(ReadableFontData* data) {
FontDataTablePtr table =
new HorizontalMetricsTable(header(), data, num_hmetrics_, num_glyphs_);
- return table.detach();
+ return table.Detach();
}
-void HorizontalMetricsTable::Builder::setNumberOfHMetrics(
- int32_t num_hmetrics) {
+void HorizontalMetricsTable::Builder::SetNumberOfHMetrics(
+ int32_t num_hmetrics) {
assert(num_hmetrics >= 0);
num_hmetrics_ = num_hmetrics;
- HorizontalMetricsTable* table = down_cast<HorizontalMetricsTable*>(
- this->table());
+ HorizontalMetricsTable* table =
+ down_cast<HorizontalMetricsTable*>(this->GetTable());
table->num_hmetrics_ = num_hmetrics;
}
-void HorizontalMetricsTable::Builder::setNumGlyphs(int32_t num_glyphs) {
+void HorizontalMetricsTable::Builder::SetNumGlyphs(int32_t num_glyphs) {
assert(num_glyphs >= 0);
num_glyphs_ = num_glyphs;
- HorizontalMetricsTable* table = down_cast<HorizontalMetricsTable*>(
- this->table());
+ HorizontalMetricsTable* table =
+ down_cast<HorizontalMetricsTable*>(this->GetTable());
table->num_glyphs_ = num_glyphs;
}
+void HorizontalMetricsTable::Builder::Init() {
+ num_hmetrics_ = -1;
+ num_glyphs_ = -1;
+}
+
} // namespace sfntly
diff --git a/sfntly/horizontal_metrics_table.h b/sfntly/horizontal_metrics_table.h
index c393fee..aead6fa 100644
--- a/sfntly/horizontal_metrics_table.h
+++ b/sfntly/horizontal_metrics_table.h
@@ -23,6 +23,39 @@
class HorizontalMetricsTable : public Table,
public RefCounted<HorizontalMetricsTable> {
+ public:
+ class Builder : public Table::TableBasedTableBuilder,
+ public RefCounted<Builder> {
+ public:
+ // Constructor scope altered to public because C++ does not allow base
+ // class to instantiate derived class with protected constructors.
+ Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data);
+ Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data);
+ virtual ~Builder();
+
+ virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+ void SetNumberOfHMetrics(int32_t num_hmetrics);
+ void SetNumGlyphs(int32_t num_glyphs);
+
+ private:
+ void Init();
+
+ int32_t num_hmetrics_;
+ int32_t num_glyphs_;
+ };
+
+ virtual ~HorizontalMetricsTable();
+ int32_t NumberOfHMetrics();
+ int32_t NumberOfLSBs();
+ int32_t HMetricAdvanceWidth(int32_t entry);
+ int32_t HMetricLSB(int32_t entry);
+ int32_t LsbTableEntry(int32_t entry);
+ int32_t AdvanceWidth(int32_t glyph_id);
+
private:
struct Offset {
enum {
@@ -38,43 +71,12 @@
};
};
- private:
HorizontalMetricsTable(Header* header, ReadableFontData* data);
- HorizontalMetricsTable(Header* header, ReadableFontData* data,
- int32_t num_hmetrics, int32_t num_glyphs);
+ HorizontalMetricsTable(Header* header,
+ ReadableFontData* data,
+ int32_t num_hmetrics,
+ int32_t num_glyphs);
- public: // class is final, no virtual functions unless inherited from parent.
- virtual ~HorizontalMetricsTable();
- int32_t numberOfHMetrics();
- int32_t numberOfLSBs();
- int32_t hMetricAdvanceWidth(int32_t entry);
- int32_t hMetricLSB(int32_t entry);
- int32_t lsbTableEntry(int32_t entry);
- int32_t advanceWidth(int32_t glyph_id);
-
- public:
- class Builder : public Table::TableBasedTableBuilder,
- public RefCounted<Builder> {
- public:
- // Constructor scope altered to public because C++ does not allow base
- // class to instantiate derived class with protected constructors.
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* data);
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
- ReadableFontData* data);
- virtual ~Builder();
- void init();
-
- virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
- void setNumberOfHMetrics(int32_t num_hmetrics);
- void setNumGlyphs(int32_t num_glyphs);
-
- private:
- int32_t num_hmetrics_;
- int32_t num_glyphs_;
- };
-
- private:
int32_t num_hmetrics_;
int32_t num_glyphs_;
};
diff --git a/sfntly/loca_table.cc b/sfntly/loca_table.cc
index 1cd1d92..e82f709 100644
--- a/sfntly/loca_table.cc
+++ b/sfntly/loca_table.cc
@@ -21,20 +21,13 @@
/******************************************************************************
* LocaTable class
******************************************************************************/
-LocaTable::LocaTable(Header* header, ReadableFontData* data)
- : Table(header, data) {}
-
-LocaTable::LocaTable(Header* header, ReadableFontData* data, int32_t version,
- int32_t num_glyphs)
- : Table(header, data), version_(version), num_glyphs_(num_glyphs) {}
-
LocaTable::~LocaTable() {}
-int32_t LocaTable::numGlyphs() {
+int32_t LocaTable::NumGlyphs() {
return num_glyphs_;
}
-int32_t LocaTable::glyphOffset(int32_t glyph_id) {
+int32_t LocaTable::GlyphOffset(int32_t glyph_id) {
if (glyph_id < 0 || glyph_id >= num_glyphs_) {
#if defined (SFNTLY_NO_EXCEPTION)
return 0;
@@ -42,10 +35,10 @@
throw IndexOutOfBoundException("Glyph ID is out of bounds.");
#endif
}
- return loca(glyph_id);
+ return Loca(glyph_id);
}
-int32_t LocaTable::glyphLength(int32_t glyph_id) {
+int32_t LocaTable::GlyphLength(int32_t glyph_id) {
if (glyph_id < 0 || glyph_id >= num_glyphs_) {
#if defined (SFNTLY_NO_EXCEPTION)
return 0;
@@ -53,14 +46,14 @@
throw IndexOutOfBoundException("Glyph ID is out of bounds.");
#endif
}
- return loca(glyph_id + 1) - loca(glyph_id);
+ return Loca(glyph_id + 1) - Loca(glyph_id);
}
-int32_t LocaTable::numLocas() {
+int32_t LocaTable::NumLocas() {
return num_glyphs_ + 1;
}
-int32_t LocaTable::loca(int32_t index) {
+int32_t LocaTable::Loca(int32_t index) {
if (index > num_glyphs_) {
#if defined (SFNTLY_NO_EXCEPTION)
return 0;
@@ -69,92 +62,73 @@
#endif
}
if (version_ == IndexToLocFormat::kShortOffset) {
- return 2 * data_->readShort(index * DataSize::kUSHORT);
+ return 2 * data_->ReadShort(index * DataSize::kUSHORT);
}
- return data_->readULongAsInt(index * DataSize::kULONG);
+ return data_->ReadULongAsInt(index * DataSize::kULONG);
+}
+
+LocaTable::LocaTable(Header* header, ReadableFontData* data)
+ : Table(header, data) {
+}
+
+LocaTable::LocaTable(Header* header,
+ ReadableFontData* data,
+ int32_t version,
+ int32_t num_glyphs)
+ : Table(header, data), version_(version), num_glyphs_(num_glyphs) {
}
/******************************************************************************
- * LocaTable::Builder class
+ * LocaTable::Iterator class
******************************************************************************/
-LocaTable::LocaIterator::LocaIterator(LocaTable* table) : index_(-1) {
+LocaTable::LocaIterator::LocaIterator(LocaTable* table)
+ : index_(-1) {
table_ = table;
}
-bool LocaTable::LocaIterator::hasNext() {
+bool LocaTable::LocaIterator::HasNext() {
return index_ <= table_->num_glyphs_;
}
-int32_t LocaTable::LocaIterator::next() {
- return table_->loca(index_++);
+int32_t LocaTable::LocaIterator::Next() {
+ return table_->Loca(index_++);
}
/******************************************************************************
* LocaTable::Builder class
******************************************************************************/
-void LocaTable::Builder::init() {
- num_glyphs_ = -1;
- format_version_ = IndexToLocFormat::kLongOffset;
-}
-
LocaTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
Header* header, WritableFontData* data) :
Table::ArrayElementTableBuilder(font_builder, header, data) {
- init();
+ Init();
}
LocaTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
Header* header, ReadableFontData* data) :
Table::ArrayElementTableBuilder(font_builder, header, data) {
- init();
+ Init();
}
LocaTable::Builder::~Builder() {}
-void LocaTable::Builder::initialize(ReadableFontData* data) {
- if (data) {
- if (numGlyphs() < 0) {
-#if defined (SFNTLY_NO_EXCEPTION)
- return;
-#else
- throw IllegalStateException("numglyphs not set on LocaTable Builder.");
-#endif
- }
- LocaTablePtr table =
- new LocaTable(header(), data, format_version_, num_glyphs_);
- LocaTable::LocaIterator loca_iter(table);
- while (loca_iter.hasNext()) {
- loca_.push_back(loca_iter.next());
- }
- }
-}
-
-IntegerList* LocaTable::Builder::getLocaList() {
- if (loca_.empty()) {
- initialize(internalReadData());
- setModelChanged();
- }
- return &loca_;
-}
-
-void LocaTable::Builder::setFormatVersion(int32_t format_version) {
+void LocaTable::Builder::SetFormatVersion(int32_t format_version) {
format_version_ = format_version;
}
-IntegerList* LocaTable::Builder::locaList() {
- return getLocaList();
+IntegerList* LocaTable::Builder::LocaList() {
+ return GetLocaList();
}
-void LocaTable::Builder::setLocaList(IntegerList* list) {
+void LocaTable::Builder::SetLocaList(IntegerList* list) {
loca_.clear();
if (list) {
loca_ = *list;
num_glyphs_ = loca_.size();
- setModelChanged();
+ set_model_changed();
}
}
-int32_t LocaTable::Builder::glyphOffset(int32_t glyph_id) {
+int32_t LocaTable::Builder::GlyphOffset(int32_t glyph_id) {
if (glyph_id < 0 || glyph_id > (num_glyphs_ + 1)) {
#if defined (SFNTLY_NO_EXCEPTION)
return 0;
@@ -162,10 +136,10 @@
throw IndexOutOfBoundException("Glyph ID is out of bounds.");
#endif
}
- return loca(glyph_id);
+ return Loca(glyph_id);
}
-int32_t LocaTable::Builder::glyphLength(int32_t glyph_id) {
+int32_t LocaTable::Builder::GlyphLength(int32_t glyph_id) {
if (glyph_id < 0 || glyph_id > (num_glyphs_ + 1)) {
#if defined (SFNTLY_NO_EXCEPTION)
return 0;
@@ -173,49 +147,49 @@
throw IndexOutOfBoundException("Glyph ID is out of bounds.");
#endif
}
- return loca(glyph_id + 1) - loca(glyph_id);
+ return Loca(glyph_id + 1) - Loca(glyph_id);
}
-void LocaTable::Builder::setNumGlyphs(int32_t num_glyphs) {
+void LocaTable::Builder::SetNumGlyphs(int32_t num_glyphs) {
num_glyphs_ = num_glyphs;
}
-int32_t LocaTable::Builder::numGlyphs() {
+int32_t LocaTable::Builder::NumGlyphs() {
if (!loca_.empty()) {
return loca_.size() - 1;
}
return num_glyphs_;
}
-void LocaTable::Builder::revert() {
+void LocaTable::Builder::Revert() {
loca_.clear();
- setModelChanged(false);
+ set_model_changed(false);
}
-void LocaTable::Builder::clear() {
- getLocaList()->clear();
+void LocaTable::Builder::Clear() {
+ GetLocaList()->clear();
}
-int32_t LocaTable::Builder::numLocas() {
- return getLocaList()->size();
+int32_t LocaTable::Builder::NumLocas() {
+ return GetLocaList()->size();
}
-int32_t LocaTable::Builder::loca(int32_t index) {
- return getLocaList()->at(index);
+int32_t LocaTable::Builder::Loca(int32_t index) {
+ return GetLocaList()->at(index);
}
-CALLER_ATTACH FontDataTable* LocaTable::Builder::subBuildTable(
+CALLER_ATTACH FontDataTable* LocaTable::Builder::SubBuildTable(
ReadableFontData* data) {
FontDataTablePtr table =
new LocaTable(header(), data, format_version_, num_glyphs_);
- return table.detach();
+ return table.Detach();
}
-void LocaTable::Builder::subDataSet() {
- initialize(internalReadData());
+void LocaTable::Builder::SubDataSet() {
+ Initialize(InternalReadData());
}
-int32_t LocaTable::Builder::subDataSizeToSerialize() {
+int32_t LocaTable::Builder::SubDataSizeToSerialize() {
if (loca_.empty()) {
return 0;
}
@@ -225,21 +199,52 @@
return loca_.size() * DataSize::kUSHORT;
}
-bool LocaTable::Builder::subReadyToSerialize() {
+bool LocaTable::Builder::SubReadyToSerialize() {
return !loca_.empty();
}
-int32_t LocaTable::Builder::subSerialize(WritableFontData* new_data) {
+int32_t LocaTable::Builder::SubSerialize(WritableFontData* new_data) {
int32_t size = 0;
for (IntegerList::iterator l = loca_.begin(), end = loca_.end();
l != end; ++l) {
if (format_version_ == IndexToLocFormat::kLongOffset) {
- size += new_data->writeULong(size, *l);
+ size += new_data->WriteULong(size, *l);
} else {
- size += new_data->writeUShort(size, *l / 2);
+ size += new_data->WriteUShort(size, *l / 2);
}
}
return 0;
}
+void LocaTable::Builder::Init() {
+ num_glyphs_ = -1;
+ format_version_ = IndexToLocFormat::kLongOffset;
+}
+
+void LocaTable::Builder::Initialize(ReadableFontData* data) {
+ if (data) {
+ if (NumGlyphs() < 0) {
+#if defined (SFNTLY_NO_EXCEPTION)
+ return;
+#else
+ throw IllegalStateException("numglyphs not set on LocaTable Builder.");
+#endif
+ }
+ LocaTablePtr table =
+ new LocaTable(header(), data, format_version_, num_glyphs_);
+ LocaTable::LocaIterator loca_iter(table);
+ while (loca_iter.HasNext()) {
+ loca_.push_back(loca_iter.Next());
+ }
+ }
+}
+
+IntegerList* LocaTable::Builder::GetLocaList() {
+ if (loca_.empty()) {
+ Initialize(InternalReadData());
+ set_model_changed();
+ }
+ return &loca_;
+}
+
} // namespace sfntly
diff --git a/sfntly/loca_table.h b/sfntly/loca_table.h
index 741cb56..dcf9715 100644
--- a/sfntly/loca_table.h
+++ b/sfntly/loca_table.h
@@ -23,50 +23,19 @@
namespace sfntly {
class LocaTable : public Table, public RefCounted<LocaTable> {
- private:
- LocaTable(Header* header, ReadableFontData* data);
- LocaTable(Header* header, ReadableFontData* data, int32_t version,
- int32_t num_glyphs);
-
- public: // class is final, no virtual unless inherited from parents.
- virtual ~LocaTable();
- int32_t numGlyphs();
-
- // Return the offset for the given glyph id. Valid glyph ids are from 0 to the
- // one less than the number of glyphs. The zero entry is the special entry for
- // the notdef glyph. The final entry beyond the last glyph id is used to
- // calculate the size of the last glyph.
- // @param glyphId the glyph id to get the offset for; must be less than or
- // equal to one more than the number of glyph ids
- // @return the offset in the glyph table to the specified glyph id
- int32_t glyphOffset(int32_t glyph_id);
-
- // Get the length of the data in the glyph table for the specified glyph id.
- int32_t glyphLength(int32_t glyph_id);
-
- // Get the number of locations or locas. This will be one more than the number
- // of glyphs for this table since the last loca position is used to indicate
- // the size of the final glyph.
- int32_t numLocas();
-
- // Get the value from the loca table for the index specified. Valid index
- // values run from 0 to the number of glyphs in the font.
- int32_t loca(int32_t index);
-
public:
// Note: different implementation than Java, caller to instantiate this class
// object directly from stack instead of calling LocaTable::iterator().
class LocaIterator {
public:
explicit LocaIterator(LocaTable* table);
- bool hasNext();
- int32_t next();
+ bool HasNext();
+ int32_t Next();
private:
int32_t index_;
LocaTable* table_; // use dumb pointer since it's a composition object
};
- friend class LocaIterator;
class Builder : public Table::ArrayElementTableBuilder,
public RefCounted<Builder> {
@@ -78,21 +47,15 @@
ReadableFontData* data);
virtual ~Builder();
- private:
- void init(); // short hand for common code in ctors, C++ port only
- void initialize(ReadableFontData* data); // ported from Java
- IntegerList* getLocaList();
-
- public: // static class, no virtual function unless inherited from parent.
- void setFormatVersion(int32_t format_version);
+ void SetFormatVersion(int32_t format_version);
// Gets the List of locas for loca table builder. These may be manipulated
// in any way by the caller and the changes will be reflected in the final
// loca table produced.
// If there is no current data for the loca table builder or the loca list
// have not been previously set then this will return an empty List.
- IntegerList* locaList();
- void setLocaList(IntegerList* list);
+ IntegerList* LocaList();
+ void SetLocaList(IntegerList* list);
// Return the offset for the given glyph id. Valid glyph ids are from 0 to
// one less than the number of glyphs. The zero entry is the special entry
@@ -101,43 +64,79 @@
// @param glyphId the glyph id to get the offset for; must be less than or
// equal to one more than the number of glyph ids
// @return the offset in the glyph table to the specified glyph id
- int32_t glyphOffset(int32_t glyph_id);
+ int32_t GlyphOffset(int32_t glyph_id);
// Get the length of the data in the glyph table for the specified glyph id.
- int32_t glyphLength(int32_t glyph_id);
+ int32_t GlyphLength(int32_t glyph_id);
// Set the number of glyphs.
// This method sets the number of glyphs that the builder will attempt to
// parse location data for from the raw binary data. This method only needs
// to be called (and <b>must</b> be) when the raw data for this builder has
// been changed.
- void setNumGlyphs(int32_t num_glyphs);
- int numGlyphs();
+ void SetNumGlyphs(int32_t num_glyphs);
+ int NumGlyphs();
- void revert();
- void clear();
+ void Revert();
+ void Clear();
// Get the number of locations or locas. This will be one more than the
// number of glyphs for this table since the last loca position is used to
// indicate the size of the final glyph.
- int32_t numLocas();
- int32_t loca(int32_t index);
+ int32_t NumLocas();
+ int32_t Loca(int32_t index);
- virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
- virtual void subDataSet();
- virtual int32_t subDataSizeToSerialize();
- virtual bool subReadyToSerialize();
- virtual int32_t subSerialize(WritableFontData* new_data);
+ virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+ virtual void SubDataSet();
+ virtual int32_t SubDataSizeToSerialize();
+ virtual bool SubReadyToSerialize();
+ virtual int32_t SubSerialize(WritableFontData* new_data);
private:
+ void Init(); // short hand for common code in ctors, C++ port only
+ void Initialize(ReadableFontData* data); // ported from Java
+ IntegerList* GetLocaList();
+
int32_t format_version_; // Note: IndexToLocFormat
int32_t num_glyphs_;
IntegerList loca_;
};
+ virtual ~LocaTable();
+ int32_t NumGlyphs();
+
+ // Return the offset for the given glyph id. Valid glyph ids are from 0 to the
+ // one less than the number of glyphs. The zero entry is the special entry for
+ // the notdef glyph. The final entry beyond the last glyph id is used to
+ // calculate the size of the last glyph.
+ // @param glyphId the glyph id to get the offset for; must be less than or
+ // equal to one more than the number of glyph ids
+ // @return the offset in the glyph table to the specified glyph id
+ int32_t GlyphOffset(int32_t glyph_id);
+
+ // Get the length of the data in the glyph table for the specified glyph id.
+ int32_t GlyphLength(int32_t glyph_id);
+
+ // Get the number of locations or locas. This will be one more than the number
+ // of glyphs for this table since the last loca position is used to indicate
+ // the size of the final glyph.
+ int32_t NumLocas();
+
+ // Get the value from the loca table for the index specified. Valid index
+ // values run from 0 to the number of glyphs in the font.
+ int32_t Loca(int32_t index);
+
private:
+ LocaTable(Header* header, ReadableFontData* data);
+ LocaTable(Header* header,
+ ReadableFontData* data,
+ int32_t version,
+ int32_t num_glyphs);
+
int32_t version_; // Note: IndexToLocFormat
int32_t num_glyphs_;
+
+ friend class LocaIterator;
};
typedef Ptr<LocaTable> LocaTablePtr;
typedef Ptr<LocaTable::Builder> LocaTableBuilderPtr;
diff --git a/sfntly/math/fixed1616.h b/sfntly/math/fixed1616.h
index aa3a62b..843da51 100644
--- a/sfntly/math/fixed1616.h
+++ b/sfntly/math/fixed1616.h
@@ -23,15 +23,15 @@
class Fixed1616 {
public:
- static inline int32_t integral(int32_t fixed) {
+ static inline int32_t Integral(int32_t fixed) {
return (fixed >> 16);
}
- static inline int32_t fractional(int32_t fixed) {
+ static inline int32_t Fractional(int32_t fixed) {
return (fixed & 0xffff);
}
- static inline int32_t fixed(int32_t integral, int32_t fractional) {
+ static inline int32_t Fixed(int32_t integral, int32_t fractional) {
return ((integral & 0xffff) << 16) | (fractional & 0xffff);
}
};
diff --git a/sfntly/math/font_math.h b/sfntly/math/font_math.h
index 78b9e51..f15a786 100644
--- a/sfntly/math/font_math.h
+++ b/sfntly/math/font_math.h
@@ -23,7 +23,7 @@
class FontMath {
public:
- static int32_t log2(int32_t a) {
+ static int32_t Log2(int32_t a) {
int r = 0; // r will be lg(a)
while (a != 0) {
a >>= 1;
diff --git a/sfntly/maximum_profile_table.cc b/sfntly/maximum_profile_table.cc
index 61a176e..0ab2aaf 100644
--- a/sfntly/maximum_profile_table.cc
+++ b/sfntly/maximum_profile_table.cc
@@ -20,202 +20,204 @@
/******************************************************************************
* MaximumProfileTable class
******************************************************************************/
-MaximumProfileTable::MaximumProfileTable(Header* header,
- ReadableFontData* data) :
- Table(header, data) {
-}
-
MaximumProfileTable::~MaximumProfileTable() {}
-int32_t MaximumProfileTable::version() {
- return data_->readFixed(Offset::kVersion);
+int32_t MaximumProfileTable::Version() {
+ return data_->ReadFixed(Offset::kVersion);
}
-int32_t MaximumProfileTable::numGlyphs() {
- return data_->readUShort(Offset::kNumGlyphs);
+int32_t MaximumProfileTable::NumGlyphs() {
+ return data_->ReadUShort(Offset::kNumGlyphs);
}
-int32_t MaximumProfileTable::maxPoints() {
- return data_->readUShort(Offset::kMaxPoints);
+int32_t MaximumProfileTable::MaxPoints() {
+ return data_->ReadUShort(Offset::kMaxPoints);
}
-int32_t MaximumProfileTable::maxContours() {
- return data_->readUShort(Offset::kMaxContours);
+int32_t MaximumProfileTable::MaxContours() {
+ return data_->ReadUShort(Offset::kMaxContours);
}
-int32_t MaximumProfileTable::maxCompositePoints() {
- return data_->readUShort(Offset::kMaxCompositePoints);
+int32_t MaximumProfileTable::MaxCompositePoints() {
+ return data_->ReadUShort(Offset::kMaxCompositePoints);
}
-int32_t MaximumProfileTable::maxZones() {
- return data_->readUShort(Offset::kMaxZones);
+int32_t MaximumProfileTable::MaxZones() {
+ return data_->ReadUShort(Offset::kMaxZones);
}
-int32_t MaximumProfileTable::maxTwilightPoints() {
- return data_->readUShort(Offset::kMaxTwilightPoints);
+int32_t MaximumProfileTable::MaxTwilightPoints() {
+ return data_->ReadUShort(Offset::kMaxTwilightPoints);
}
-int32_t MaximumProfileTable::maxStorage() {
- return data_->readUShort(Offset::kMaxStorage);
+int32_t MaximumProfileTable::MaxStorage() {
+ return data_->ReadUShort(Offset::kMaxStorage);
}
-int32_t MaximumProfileTable::maxFunctionDefs() {
- return data_->readUShort(Offset::kMaxFunctionDefs);
+int32_t MaximumProfileTable::MaxFunctionDefs() {
+ return data_->ReadUShort(Offset::kMaxFunctionDefs);
}
-int32_t MaximumProfileTable::maxStackElements() {
- return data_->readUShort(Offset::kMaxStackElements);
+int32_t MaximumProfileTable::MaxStackElements() {
+ return data_->ReadUShort(Offset::kMaxStackElements);
}
-int32_t MaximumProfileTable::maxSizeOfInstructions() {
- return data_->readUShort(Offset::kMaxSizeOfInstructions);
+int32_t MaximumProfileTable::MaxSizeOfInstructions() {
+ return data_->ReadUShort(Offset::kMaxSizeOfInstructions);
}
-int32_t MaximumProfileTable::maxComponentElements() {
- return data_->readUShort(Offset::kMaxComponentElements);
+int32_t MaximumProfileTable::MaxComponentElements() {
+ return data_->ReadUShort(Offset::kMaxComponentElements);
}
-int32_t MaximumProfileTable::maxComponentDepth() {
- return data_->readUShort(Offset::kMaxComponentDepth);
+int32_t MaximumProfileTable::MaxComponentDepth() {
+ return data_->ReadUShort(Offset::kMaxComponentDepth);
+}
+
+MaximumProfileTable::MaximumProfileTable(Header* header,
+ ReadableFontData* data)
+ : Table(header, data) {
}
/******************************************************************************
* MaximumProfileTable::Builder class
******************************************************************************/
MaximumProfileTable::Builder::Builder(
- FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* data) :
- Table::TableBasedTableBuilder(font_builder, header, data) {
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data)
+ : Table::TableBasedTableBuilder(font_builder, header, data) {
}
MaximumProfileTable::Builder::Builder(
- FontDataTableBuilderContainer* font_builder, Header* header,
- ReadableFontData* data) :
- Table::TableBasedTableBuilder(font_builder, header, data) {
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data)
+ : Table::TableBasedTableBuilder(font_builder, header, data) {
}
MaximumProfileTable::Builder::~Builder() {}
-CALLER_ATTACH FontDataTable* MaximumProfileTable::Builder::subBuildTable(
- ReadableFontData* data) {
+CALLER_ATTACH FontDataTable*
+ MaximumProfileTable::Builder::SubBuildTable(ReadableFontData* data) {
FontDataTablePtr table = new MaximumProfileTable(header(), data);
- return table.detach();
+ return table.Detach();
}
-int32_t MaximumProfileTable::Builder::version() {
- return internalReadData()->readUShort(Offset::kVersion);
+int32_t MaximumProfileTable::Builder::Version() {
+ return InternalReadData()->ReadUShort(Offset::kVersion);
}
-void MaximumProfileTable::Builder::setVersion(int32_t version) {
- internalWriteData()->writeUShort(Offset::kVersion, version);
+void MaximumProfileTable::Builder::SetVersion(int32_t version) {
+ InternalWriteData()->WriteUShort(Offset::kVersion, version);
}
-int32_t MaximumProfileTable::Builder::numGlyphs() {
- return internalReadData()->readUShort(Offset::kNumGlyphs);
+int32_t MaximumProfileTable::Builder::NumGlyphs() {
+ return InternalReadData()->ReadUShort(Offset::kNumGlyphs);
}
-void MaximumProfileTable::Builder::setNumGlyphs(int32_t num_glyphs) {
- internalWriteData()->writeUShort(Offset::kNumGlyphs, num_glyphs);
+void MaximumProfileTable::Builder::SetNumGlyphs(int32_t num_glyphs) {
+ InternalWriteData()->WriteUShort(Offset::kNumGlyphs, num_glyphs);
}
-int32_t MaximumProfileTable::Builder::maxPoints() {
- return internalReadData()->readUShort(Offset::kMaxPoints);
+int32_t MaximumProfileTable::Builder::MaxPoints() {
+ return InternalReadData()->ReadUShort(Offset::kMaxPoints);
}
-void MaximumProfileTable::Builder::setMaxPoints(int32_t max_points) {
- internalWriteData()->writeUShort(Offset::kMaxPoints, max_points);
+void MaximumProfileTable::Builder::SetMaxPoints(int32_t max_points) {
+ InternalWriteData()->WriteUShort(Offset::kMaxPoints, max_points);
}
-int32_t MaximumProfileTable::Builder::maxContours() {
- return internalReadData()->readUShort(Offset::kMaxContours);
+int32_t MaximumProfileTable::Builder::MaxContours() {
+ return InternalReadData()->ReadUShort(Offset::kMaxContours);
}
-void MaximumProfileTable::Builder::setMaxContours(int32_t max_contours) {
- internalWriteData()->writeUShort(Offset::kMaxContours, max_contours);
+void MaximumProfileTable::Builder::SetMaxContours(int32_t max_contours) {
+ InternalWriteData()->WriteUShort(Offset::kMaxContours, max_contours);
}
-int32_t MaximumProfileTable::Builder::maxCompositePoints() {
- return internalReadData()->readUShort(Offset::kMaxCompositePoints);
+int32_t MaximumProfileTable::Builder::MaxCompositePoints() {
+ return InternalReadData()->ReadUShort(Offset::kMaxCompositePoints);
}
-void MaximumProfileTable::Builder::setMaxCompositePoints(
+void MaximumProfileTable::Builder::SetMaxCompositePoints(
int32_t max_composite_points) {
- internalWriteData()->writeUShort(Offset::kMaxCompositePoints,
+ InternalWriteData()->WriteUShort(Offset::kMaxCompositePoints,
max_composite_points);
}
-int32_t MaximumProfileTable::Builder::maxZones() {
- return internalReadData()->readUShort(Offset::kMaxZones);
+int32_t MaximumProfileTable::Builder::MaxZones() {
+ return InternalReadData()->ReadUShort(Offset::kMaxZones);
}
-void MaximumProfileTable::Builder::setMaxZones(int32_t max_zones) {
- internalWriteData()->writeUShort(Offset::kMaxZones, max_zones);
+void MaximumProfileTable::Builder::SetMaxZones(int32_t max_zones) {
+ InternalWriteData()->WriteUShort(Offset::kMaxZones, max_zones);
}
-int32_t MaximumProfileTable::Builder::maxTwilightPoints() {
- return internalReadData()->readUShort(Offset::kMaxTwilightPoints);
+int32_t MaximumProfileTable::Builder::MaxTwilightPoints() {
+ return InternalReadData()->ReadUShort(Offset::kMaxTwilightPoints);
}
-void MaximumProfileTable::Builder::setMaxTwilightPoints(
+void MaximumProfileTable::Builder::SetMaxTwilightPoints(
int32_t max_twilight_points) {
- internalWriteData()->writeUShort(Offset::kMaxTwilightPoints,
+ InternalWriteData()->WriteUShort(Offset::kMaxTwilightPoints,
max_twilight_points);
}
-int32_t MaximumProfileTable::Builder::maxStorage() {
- return internalReadData()->readUShort(Offset::kMaxStorage);
+int32_t MaximumProfileTable::Builder::MaxStorage() {
+ return InternalReadData()->ReadUShort(Offset::kMaxStorage);
}
-void MaximumProfileTable::Builder::setMaxStorage(int32_t max_storage) {
- internalWriteData()->writeUShort(Offset::kMaxStorage, max_storage);
+void MaximumProfileTable::Builder::SetMaxStorage(int32_t max_storage) {
+ InternalWriteData()->WriteUShort(Offset::kMaxStorage, max_storage);
}
-int32_t MaximumProfileTable::Builder::maxFunctionDefs() {
- return internalReadData()->readUShort(Offset::kMaxFunctionDefs);
+int32_t MaximumProfileTable::Builder::MaxFunctionDefs() {
+ return InternalReadData()->ReadUShort(Offset::kMaxFunctionDefs);
}
-void MaximumProfileTable::Builder::setMaxFunctionDefs(
+void MaximumProfileTable::Builder::SetMaxFunctionDefs(
int32_t max_function_defs) {
- internalWriteData()->writeUShort(Offset::kMaxFunctionDefs, max_function_defs);
+ InternalWriteData()->WriteUShort(Offset::kMaxFunctionDefs, max_function_defs);
}
-int32_t MaximumProfileTable::Builder::maxStackElements() {
- return internalReadData()->readUShort(Offset::kMaxStackElements);
+int32_t MaximumProfileTable::Builder::MaxStackElements() {
+ return InternalReadData()->ReadUShort(Offset::kMaxStackElements);
}
-void MaximumProfileTable::Builder::setMaxStackElements(
+void MaximumProfileTable::Builder::SetMaxStackElements(
int32_t max_stack_elements) {
- internalWriteData()->writeUShort(Offset::kMaxStackElements,
+ InternalWriteData()->WriteUShort(Offset::kMaxStackElements,
max_stack_elements);
}
-int32_t MaximumProfileTable::Builder::maxSizeOfInstructions() {
- return internalReadData()->readUShort(Offset::kMaxSizeOfInstructions);
+int32_t MaximumProfileTable::Builder::MaxSizeOfInstructions() {
+ return InternalReadData()->ReadUShort(Offset::kMaxSizeOfInstructions);
}
-void MaximumProfileTable::Builder::setMaxSizeOfInstructions(
+void MaximumProfileTable::Builder::SetMaxSizeOfInstructions(
int32_t max_size_of_instructions) {
- internalWriteData()->writeUShort(Offset::kMaxSizeOfInstructions,
+ InternalWriteData()->WriteUShort(Offset::kMaxSizeOfInstructions,
max_size_of_instructions);
}
-int32_t MaximumProfileTable::Builder::maxComponentElements() {
- return internalReadData()->readUShort(Offset::kMaxComponentElements);
+int32_t MaximumProfileTable::Builder::MaxComponentElements() {
+ return InternalReadData()->ReadUShort(Offset::kMaxComponentElements);
}
-void MaximumProfileTable::Builder::setMaxComponentElements(
+void MaximumProfileTable::Builder::SetMaxComponentElements(
int32_t max_component_elements) {
- internalWriteData()->writeUShort(Offset::kMaxComponentElements,
+ InternalWriteData()->WriteUShort(Offset::kMaxComponentElements,
max_component_elements);
}
-int32_t MaximumProfileTable::Builder::maxComponentDepth() {
- return internalReadData()->readUShort(Offset::kMaxComponentDepth);
+int32_t MaximumProfileTable::Builder::MaxComponentDepth() {
+ return InternalReadData()->ReadUShort(Offset::kMaxComponentDepth);
}
-void MaximumProfileTable::Builder::setMaxComponentDepth(
+void MaximumProfileTable::Builder::SetMaxComponentDepth(
int32_t max_component_depth) {
- internalWriteData()->writeUShort(Offset::kMaxComponentDepth,
+ InternalWriteData()->WriteUShort(Offset::kMaxComponentDepth,
max_component_depth);
}
diff --git a/sfntly/maximum_profile_table.h b/sfntly/maximum_profile_table.h
index 044eccf..9e0d0a6 100644
--- a/sfntly/maximum_profile_table.h
+++ b/sfntly/maximum_profile_table.h
@@ -24,6 +24,63 @@
class MaximumProfileTable : public Table,
public RefCounted<MaximumProfileTable> {
+ public:
+ class Builder : public Table::TableBasedTableBuilder,
+ public RefCounted<Builder> {
+ public:
+ // Constructor scope altered to public because C++ does not allow base
+ // class to instantiate derived class with protected constructors.
+ Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+ WritableFontData* data);
+ Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+ ReadableFontData* data);
+ virtual ~Builder();
+
+ virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+
+ int32_t Version();
+ void SetVersion(int32_t version);
+ int32_t NumGlyphs();
+ void SetNumGlyphs(int32_t num_glyphs);
+ int32_t MaxPoints();
+ void SetMaxPoints(int32_t max_points);
+ int32_t MaxContours();
+ void SetMaxContours(int32_t max_contours);
+ int32_t MaxCompositePoints();
+ void SetMaxCompositePoints(int32_t max_composite_points);
+ int32_t MaxZones();
+ void SetMaxZones(int32_t max_zones);
+ int32_t MaxTwilightPoints();
+ void SetMaxTwilightPoints(int32_t max_twilight_points);
+ int32_t MaxStorage();
+ void SetMaxStorage(int32_t max_storage);
+ int32_t MaxFunctionDefs();
+ void SetMaxFunctionDefs(int32_t max_function_defs);
+ int32_t MaxStackElements();
+ void SetMaxStackElements(int32_t max_stack_elements);
+ int32_t MaxSizeOfInstructions();
+ void SetMaxSizeOfInstructions(int32_t max_size_of_instructions);
+ int32_t MaxComponentElements();
+ void SetMaxComponentElements(int32_t max_component_elements);
+ int32_t MaxComponentDepth();
+ void SetMaxComponentDepth(int32_t max_component_depth);
+ };
+
+ virtual ~MaximumProfileTable();
+ int32_t Version();
+ int32_t NumGlyphs();
+ int32_t MaxPoints();
+ int32_t MaxContours();
+ int32_t MaxCompositePoints();
+ int32_t MaxZones();
+ int32_t MaxTwilightPoints();
+ int32_t MaxStorage();
+ int32_t MaxFunctionDefs();
+ int32_t MaxStackElements();
+ int32_t MaxSizeOfInstructions();
+ int32_t MaxComponentElements();
+ int32_t MaxComponentDepth();
+
private:
struct Offset {
enum {
@@ -48,67 +105,7 @@
};
};
- private:
MaximumProfileTable(Header* header, ReadableFontData* data);
-
- public: // Class is final, no virtual functions unless derived from parent.
- virtual ~MaximumProfileTable();
- int32_t version();
- int32_t numGlyphs();
- int32_t maxPoints();
- int32_t maxContours();
- int32_t maxCompositePoints();
- int32_t maxZones();
- int32_t maxTwilightPoints();
- int32_t maxStorage();
- int32_t maxFunctionDefs();
- int32_t maxStackElements();
- int32_t maxSizeOfInstructions();
- int32_t maxComponentElements();
- int32_t maxComponentDepth();
-
- public:
- class Builder : public Table::TableBasedTableBuilder,
- public RefCounted<Builder> {
- public:
- // Constructor scope altered to public because C++ does not allow base
- // class to instantiate derived class with protected constructors.
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* data);
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
- ReadableFontData* data);
- virtual ~Builder();
-
- virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
-
- public: // Class is static, no virtual functions unless derived from parent.
- int32_t version();
- void setVersion(int32_t version);
- int32_t numGlyphs();
- void setNumGlyphs(int32_t num_glyphs);
- int32_t maxPoints();
- void setMaxPoints(int32_t max_points);
- int32_t maxContours();
- void setMaxContours(int32_t max_contours);
- int32_t maxCompositePoints();
- void setMaxCompositePoints(int32_t max_composite_points);
- int32_t maxZones();
- void setMaxZones(int32_t max_zones);
- int32_t maxTwilightPoints();
- void setMaxTwilightPoints(int32_t max_twilight_points);
- int32_t maxStorage();
- void setMaxStorage(int32_t max_storage);
- int32_t maxFunctionDefs();
- void setMaxFunctionDefs(int32_t max_function_defs);
- int32_t maxStackElements();
- void setMaxStackElements(int32_t max_stack_elements);
- int32_t maxSizeOfInstructions();
- void setMaxSizeOfInstructions(int32_t max_size_of_instructions);
- int32_t maxComponentElements();
- void setMaxComponentElements(int32_t max_component_elements);
- int32_t maxComponentDepth();
- void setMaxComponentDepth(int32_t max_component_depth);
- };
};
typedef Ptr<MaximumProfileTable> MaximumProfileTablePtr;
typedef Ptr<MaximumProfileTable::Builder> MaximumProfileTableBuilderPtr;
diff --git a/sfntly/name_table.cc b/sfntly/name_table.cc
index 0858603..19c299c 100644
--- a/sfntly/name_table.cc
+++ b/sfntly/name_table.cc
@@ -14,142 +14,558 @@
* limitations under the License.
*/
-#include "port/type.h"
+#include "sfntly/name_table.h"
#include <stdio.h>
#include <string.h>
#include <unicode/unistr.h>
-#include "sfntly/name_table.h"
#include "sfntly/font.h"
#include "sfntly/port/exception_type.h"
namespace sfntly {
/******************************************************************************
+ * NameTable::NameEntryId class
+ ******************************************************************************/
+NameTable::NameEntryId::NameEntryId()
+ : platform_id_(0),
+ encoding_id_(0),
+ language_id_(0),
+ name_id_(0) {
+}
+
+NameTable::NameEntryId::NameEntryId(int32_t platform_id,
+ int32_t encoding_id,
+ int32_t language_id,
+ int32_t name_id)
+ : platform_id_(platform_id),
+ encoding_id_(encoding_id),
+ language_id_(language_id),
+ name_id_(name_id) {
+}
+
+NameTable::NameEntryId::NameEntryId(const NameTable::NameEntryId& rhs) {
+ *this = rhs;
+}
+
+const NameTable::NameEntryId&
+ NameTable::NameEntryId::operator=(const NameTable::NameEntryId& rhs) const {
+ platform_id_ = rhs.platform_id_;
+ encoding_id_ = rhs.encoding_id_;
+ language_id_ = rhs.language_id_;
+ name_id_ = rhs.name_id_;
+ return *this;
+}
+
+bool NameTable::NameEntryId::operator==(const NameEntryId& rhs) const {
+ return platform_id_ == rhs.platform_id_ &&
+ encoding_id_ == rhs.encoding_id_ &&
+ language_id_ == rhs.language_id_ &&
+ name_id_ == rhs.name_id_;
+}
+
+bool NameTable::NameEntryId::operator<(const NameEntryId& rhs) const {
+ if (platform_id_ != rhs.platform_id_) return platform_id_ < rhs.platform_id_;
+ if (encoding_id_ != rhs.encoding_id_) return encoding_id_ < rhs.encoding_id_;
+ if (language_id_ != rhs.language_id_) return language_id_ < rhs.language_id_;
+ return name_id_ < rhs.name_id_;
+}
+
+/******************************************************************************
+ * NameTable::NameEntry class
+ ******************************************************************************/
+NameTable::NameEntry::NameEntry() {
+ Init(0, 0, 0, 0, NULL);
+}
+
+NameTable::NameEntry::NameEntry(const NameEntryId& name_entry_id,
+ const ByteVector& name_bytes) {
+ Init(name_entry_id.platform_id(),
+ name_entry_id.encoding_id(),
+ name_entry_id.language_id(),
+ name_entry_id.name_id(),
+ &name_bytes);
+}
+
+NameTable::NameEntry::NameEntry(int32_t platform_id,
+ int32_t encoding_id,
+ int32_t language_id,
+ int32_t name_id,
+ const ByteVector& name_bytes) {
+ Init(platform_id, encoding_id, language_id, name_id, &name_bytes);
+}
+
+NameTable::NameEntry::~NameEntry() {}
+
+ByteVector* NameTable::NameEntry::NameAsBytes() {
+ return &name_bytes_;
+}
+
+int32_t NameTable::NameEntry::NameBytesLength() {
+ return name_bytes_.size();
+}
+
+UChar* NameTable::NameEntry::Name() {
+ return NameTable::ConvertFromNameBytes(&name_bytes_,
+ platform_id(),
+ encoding_id());
+}
+
+bool NameTable::NameEntry::operator==(const NameEntry& rhs) const {
+ return (name_entry_id_ == rhs.name_entry_id_ &&
+ name_bytes_ == rhs.name_bytes_);
+}
+
+void NameTable::NameEntry::Init(int32_t platform_id,
+ int32_t encoding_id,
+ int32_t language_id,
+ int32_t name_id,
+ const ByteVector* name_bytes) {
+ name_entry_id_ = NameEntryId(platform_id, encoding_id, language_id, name_id);
+ if (name_bytes) {
+ name_bytes_ = *name_bytes;
+ } else {
+ name_bytes_.clear();
+ }
+}
+
+/******************************************************************************
+ * NameTable::NameEntryBuilder class
+ ******************************************************************************/
+NameTable::NameEntryBuilder::NameEntryBuilder() {
+ Init(0, 0, 0, 0, NULL);
+}
+
+NameTable::NameEntryBuilder::NameEntryBuilder(
+ const NameEntryId& name_entry_id, const ByteVector& name_bytes) {
+ Init(name_entry_id.platform_id(),
+ name_entry_id.encoding_id(),
+ name_entry_id.language_id(),
+ name_entry_id.name_id(),
+ &name_bytes);
+}
+
+NameTable::NameEntryBuilder::NameEntryBuilder(
+ const NameEntryId& name_entry_id) {
+ Init(name_entry_id.platform_id(),
+ name_entry_id.encoding_id(),
+ name_entry_id.language_id(),
+ name_entry_id.name_id(),
+ NULL);
+}
+
+NameTable::NameEntryBuilder::NameEntryBuilder(NameEntry* b) {
+ Init(b->platform_id(),
+ b->encoding_id(),
+ b->language_id(),
+ b->name_id(),
+ b->NameAsBytes());
+}
+
+NameTable::NameEntryBuilder::~NameEntryBuilder() {}
+
+void NameTable::NameEntryBuilder::SetName(const UChar* name) {
+ if (name == NULL) {
+ name_entry_->name_bytes_.clear();
+ return;
+ }
+ NameTable::ConvertToNameBytes(name,
+ name_entry_->platform_id(),
+ name_entry_->encoding_id(),
+ &name_entry_->name_bytes_);
+}
+
+void NameTable::NameEntryBuilder::SetName(const ByteVector& name_bytes) {
+ name_entry_->name_bytes_.clear();
+ std::copy(name_bytes.begin(),
+ name_bytes.end(),
+ name_entry_->name_bytes_.begin());
+}
+
+void NameTable::NameEntryBuilder::SetName(const ByteVector& name_bytes,
+ int32_t offset,
+ int32_t length) {
+ name_entry_->name_bytes_.clear();
+ std::copy(name_bytes.begin() + offset,
+ name_bytes.begin() + offset + length,
+ name_entry_->name_bytes_.begin());
+}
+
+void NameTable::NameEntryBuilder::Init(int32_t platform_id,
+ int32_t encoding_id,
+ int32_t language_id,
+ int32_t name_id,
+ const ByteVector* name_bytes) {
+ name_entry_ = new NameEntry();
+ name_entry_->Init(platform_id, encoding_id, language_id, name_id, name_bytes);
+}
+
+/******************************************************************************
+ * NameTable::NameEntryFilterInPlace class (C++ port only)
+ ******************************************************************************/
+NameTable::NameEntryFilterInPlace::NameEntryFilterInPlace(int32_t platform_id,
+ int32_t encoding_id,
+ int32_t language_id,
+ int32_t name_id)
+ : platform_id_(platform_id),
+ encoding_id_(encoding_id),
+ language_id_(language_id),
+ name_id_(name_id) {
+}
+
+bool NameTable::NameEntryFilterInPlace::Accept(int32_t platform_id,
+ int32_t encoding_id,
+ int32_t language_id,
+ int32_t name_id) {
+ return (platform_id_ == platform_id &&
+ encoding_id_ == encoding_id &&
+ language_id_ == language_id &&
+ name_id_ == name_id);
+}
+
+/******************************************************************************
+ * NameTable::NameEntryIterator class
+ ******************************************************************************/
+NameTable::NameEntryIterator::NameEntryIterator(NameTable* table) {
+ Init(table, NULL);
+}
+
+NameTable::NameEntryIterator::NameEntryIterator(NameTable* table,
+ NameEntryFilter* filter) {
+ Init(table, filter);
+}
+
+bool NameTable::NameEntryIterator::HasNext() {
+ if (!filter_) {
+ if (name_index_ < table_->NameCount()) {
+ return true;
+ }
+ return false;
+ }
+ for (; name_index_ < table_->NameCount(); ++name_index_) {
+ if (filter_->Accept(table_->PlatformId(name_index_),
+ table_->EncodingId(name_index_),
+ table_->LanguageId(name_index_),
+ table_->NameId(name_index_))) {
+ return true;
+ }
+ }
+ return false;
+}
+
+CALLER_ATTACH NameTable::NameEntry* NameTable::NameEntryIterator::Next() {
+ if (!HasNext())
+ return NULL;
+ return table_->GetNameEntry(name_index_++);
+}
+
+void NameTable::NameEntryIterator::Remove() {
+#if !defined (SFNTLY_NO_EXCEPTION)
+ throw UnsupportedOperationException(
+ "Cannot remove a CMap table from an existing font.");
+#endif
+}
+
+void NameTable::NameEntryIterator::Init(NameTable* table,
+ NameEntryFilter* filter) {
+ table_ = table;
+ filter_ = filter;
+ name_index_ = 0;
+}
+
+/******************************************************************************
+ * NameTable::Builder class
+ ******************************************************************************/
+NameTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data)
+ : Table::ArrayElementTableBuilder(font_builder, header, data) {
+}
+
+NameTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data)
+ : Table::ArrayElementTableBuilder(font_builder, header, data) {
+}
+
+void NameTable::Builder::RevertNames() {
+ name_entry_map_.clear();
+ set_model_changed(false);
+}
+
+int32_t NameTable::Builder::BuilderCount() {
+ GetNameBuilders(); // Ensure name_entry_map_ is built.
+ return (int32_t)name_entry_map_.size();
+}
+
+bool NameTable::Builder::Has(int32_t platform_id,
+ int32_t encoding_id,
+ int32_t language_id,
+ int32_t name_id) {
+ NameEntryId probe(platform_id, encoding_id, language_id, name_id);
+ GetNameBuilders(); // Ensure name_entry_map_ is built.
+ return (name_entry_map_.find(probe) != name_entry_map_.end());
+}
+
+CALLER_ATTACH NameTable::NameEntryBuilder*
+ NameTable::Builder::NameBuilder(int32_t platform_id,
+ int32_t encoding_id,
+ int32_t language_id,
+ int32_t name_id) {
+ NameEntryId probe(platform_id, encoding_id, language_id, name_id);
+ NameEntryBuilderMap builders;
+ GetNameBuilders(); // Ensure name_entry_map_ is built.
+ if (name_entry_map_.find(probe) != name_entry_map_.end()) {
+ return name_entry_map_[probe];
+ }
+ NameEntryBuilderPtr builder = new NameEntryBuilder(probe);
+ name_entry_map_[probe] = builder;
+ return builder.Detach();
+}
+
+bool NameTable::Builder::Remove(int32_t platform_id,
+ int32_t encoding_id,
+ int32_t language_id,
+ int32_t name_id) {
+ NameEntryId probe(platform_id, encoding_id, language_id, name_id);
+ GetNameBuilders(); // Ensure name_entry_map_ is built.
+ NameEntryBuilderMap::iterator position = name_entry_map_.find(probe);
+ if (position != name_entry_map_.end()) {
+ name_entry_map_.erase(position);
+ return true;
+ }
+ return false;
+}
+
+CALLER_ATTACH FontDataTable*
+ NameTable::Builder::SubBuildTable(ReadableFontData* data) {
+ FontDataTablePtr table = new NameTable(header(), data);
+ return table.Detach();
+}
+
+void NameTable::Builder::SubDataSet() {
+ name_entry_map_.clear();
+ set_model_changed(false);
+}
+
+int32_t NameTable::Builder::SubDataSizeToSerialize() {
+ if (name_entry_map_.empty()) {
+ return 0;
+ }
+
+ int32_t size = NameTable::Offset::kNameRecordStart +
+ name_entry_map_.size() * NameTable::Offset::kNameRecordSize;
+ for (NameEntryBuilderMap::iterator b = name_entry_map_.begin(),
+ end = name_entry_map_.end();
+ b != end; ++b) {
+ NameEntryBuilderPtr p = b->second;
+ NameEntry* entry = p->name_entry();
+ size += entry->NameBytesLength();
+ }
+ return size;
+}
+
+bool NameTable::Builder::SubReadyToSerialize() {
+ return !name_entry_map_.empty();
+}
+
+int32_t NameTable::Builder::SubSerialize(WritableFontData* new_data) {
+ int32_t string_table_start_offset =
+ NameTable::Offset::kNameRecordStart +
+ name_entry_map_.size() * NameTable::Offset::kNameRecordSize;
+
+ // Header
+ new_data->WriteUShort(NameTable::Offset::kFormat, 0);
+ new_data->WriteUShort(NameTable::Offset::kCount, name_entry_map_.size());
+ new_data->WriteUShort(NameTable::Offset::kStringOffset,
+ string_table_start_offset);
+ int32_t name_record_offset = NameTable::Offset::kNameRecordStart;
+ int32_t string_offset = 0;
+ // Note: we offered operator< in NameEntryId, which will be used by std::less,
+ // and therefore our map will act like TreeMap in Java to provide
+ // sorted key set.
+ for (NameEntryBuilderMap::iterator b = name_entry_map_.begin(),
+ end = name_entry_map_.end();
+ b != end; ++b) {
+ new_data->WriteUShort(
+ name_record_offset + NameTable::Offset::kNameRecordPlatformId,
+ b->first.platform_id());
+ new_data->WriteUShort(
+ name_record_offset + NameTable::Offset::kNameRecordEncodingId,
+ b->first.encoding_id());
+ new_data->WriteUShort(
+ name_record_offset + NameTable::Offset::kNameRecordLanguageId,
+ b->first.language_id());
+ new_data->WriteUShort(
+ name_record_offset + NameTable::Offset::kNameRecordNameId,
+ b->first.name_id());
+ NameEntry* builder_entry = b->second->name_entry();
+ new_data->WriteUShort(
+ name_record_offset + NameTable::Offset::kNameRecordStringLength,
+ builder_entry->NameBytesLength());
+ new_data->WriteUShort(
+ name_record_offset + NameTable::Offset::kNameRecordStringOffset,
+ string_offset);
+ name_record_offset += NameTable::Offset::kNameRecordSize;
+ string_offset += new_data->WriteBytes(
+ string_offset + string_table_start_offset,
+ builder_entry->NameAsBytes());
+ }
+
+ return string_offset + string_table_start_offset;
+}
+
+void NameTable::Builder::Initialize(ReadableFontData* data) {
+ if (data) {
+ NameTablePtr table = new NameTable(header(), data);
+ NameEntryIterator name_iter(table, NULL);
+ while (name_iter.HasNext()) {
+ NameEntryPtr name_entry = name_iter.Next();
+ NameEntryBuilderPtr name_entry_builder = new NameEntryBuilder(name_entry);
+ NameEntry* builder_entry = name_entry_builder->name_entry();
+ NameEntryId probe = builder_entry->name_entry_id();
+ name_entry_map_[probe] = name_entry_builder;
+ }
+ }
+}
+
+NameTable::NameEntryBuilderMap* NameTable::Builder::GetNameBuilders() {
+ if (name_entry_map_.empty()) {
+ Initialize(InternalReadData());
+ }
+ set_model_changed();
+ return &name_entry_map_;
+}
+
+/******************************************************************************
* NameTable class
******************************************************************************/
-NameTable::NameTable(Header* header, ReadableFontData* data)
- : Table(header, data) {}
-
NameTable::~NameTable() {}
-int32_t NameTable::format() {
- return data_->readUShort(Offset::kFormat);
+int32_t NameTable::Format() {
+ return data_->ReadUShort(Offset::kFormat);
}
-int32_t NameTable::nameCount() {
- return data_->readUShort(Offset::kCount);
+int32_t NameTable::NameCount() {
+ return data_->ReadUShort(Offset::kCount);
}
-int32_t NameTable::stringOffset() {
- return data_->readUShort(Offset::kStringOffset);
+int32_t NameTable::PlatformId(int32_t index) {
+ return data_->ReadUShort(Offset::kNameRecordPlatformId +
+ OffsetForNameRecord(index));
}
-int32_t NameTable::offsetForNameRecord(int32_t index) {
- return Offset::kNameRecordStart + index * Offset::kNameRecordSize;
+int32_t NameTable::EncodingId(int32_t index) {
+ return data_->ReadUShort(Offset::kNameRecordEncodingId +
+ OffsetForNameRecord(index));
}
-int32_t NameTable::platformId(int32_t index) {
- return data_->readUShort(Offset::kNameRecordPlatformId +
- offsetForNameRecord(index));
+int32_t NameTable::LanguageId(int32_t index) {
+ return data_->ReadUShort(Offset::kNameRecordLanguageId +
+ OffsetForNameRecord(index));
}
-int32_t NameTable::encodingId(int32_t index) {
- return data_->readUShort(Offset::kNameRecordEncodingId +
- offsetForNameRecord(index));
+int32_t NameTable::NameId(int32_t index) {
+ return data_->ReadUShort(Offset::kNameRecordNameId +
+ OffsetForNameRecord(index));
}
-int32_t NameTable::languageId(int32_t index) {
- return data_->readUShort(Offset::kNameRecordLanguageId +
- offsetForNameRecord(index));
-}
-
-int32_t NameTable::nameId(int32_t index) {
- return data_->readUShort(Offset::kNameRecordNameId +
- offsetForNameRecord(index));
-}
-
-int32_t NameTable::nameLength(int32_t index) {
- return data_->readUShort(Offset::kNameRecordStringLength +
- offsetForNameRecord(index));
-}
-
-int32_t NameTable::nameOffset(int32_t index) {
- return data_->readUShort(Offset::kNameRecordStringOffset +
- offsetForNameRecord(index)) + stringOffset();
-}
-
-void NameTable::nameAsBytes(int32_t index, ByteVector* b) {
+void NameTable::NameAsBytes(int32_t index, ByteVector* b) {
assert(b);
- int32_t length = nameLength(index);
+ int32_t length = NameLength(index);
b->clear();
b->resize(length);
- data_->readBytes(nameOffset(index), b, 0, length);
+ data_->ReadBytes(NameOffset(index), b, 0, length);
}
-void NameTable::nameAsBytes(int32_t platform_id, int32_t encoding_id,
- int32_t language_id, int32_t name_id,
+void NameTable::NameAsBytes(int32_t platform_id,
+ int32_t encoding_id,
+ int32_t language_id,
+ int32_t name_id,
ByteVector* b) {
assert(b);
NameEntryPtr entry;
- entry.attach(nameEntry(platform_id, encoding_id, language_id, name_id));
+ entry.Attach(GetNameEntry(platform_id, encoding_id, language_id, name_id));
if (entry) {
- ByteVector* name = entry->nameAsBytes();
+ ByteVector* name = entry->NameAsBytes();
std::copy(name->begin(), name->end(), b->begin());
}
}
-UChar* NameTable::name(int index) {
+UChar* NameTable::Name(int index) {
ByteVector b;
- nameAsBytes(index, &b);
- return convertFromNameBytes(&b, platformId(index), encodingId(index));
+ NameAsBytes(index, &b);
+ return ConvertFromNameBytes(&b, PlatformId(index), EncodingId(index));
}
-UChar* NameTable::name(int32_t platform_id, int32_t encoding_id,
- int32_t language_id, int32_t name_id) {
+UChar* NameTable::Name(int32_t platform_id,
+ int32_t encoding_id,
+ int32_t language_id,
+ int32_t name_id) {
NameEntryPtr entry;
- entry.attach(nameEntry(platform_id, encoding_id, language_id, name_id));
+ entry.Attach(GetNameEntry(platform_id, encoding_id, language_id, name_id));
if (entry) {
- return entry->name();
+ return entry->Name();
}
return NULL;
}
-CALLER_ATTACH NameTable::NameEntry* NameTable::nameEntry(int32_t index) {
+CALLER_ATTACH NameTable::NameEntry* NameTable::GetNameEntry(int32_t index) {
ByteVector b;
- nameAsBytes(index, &b);
- NameEntryPtr instance = new NameEntry(platformId(index), encodingId(index),
- languageId(index), nameId(index), b);
- return instance.detach();
+ NameAsBytes(index, &b);
+ NameEntryPtr instance = new NameEntry(PlatformId(index),
+ EncodingId(index),
+ LanguageId(index),
+ NameId(index), b);
+ return instance.Detach();
}
-CALLER_ATTACH NameTable::NameEntry* NameTable::nameEntry(int32_t platform_id,
- int32_t encoding_id,
- int32_t language_id,
- int32_t name_id) {
- NameTable::NameEntryFilterInPlace filter(platform_id, encoding_id,
- language_id, name_id);
- NameTable::NameEntryIterator* name_entry_iter = iterator(&filter);
+CALLER_ATTACH NameTable::NameEntry* NameTable::GetNameEntry(int32_t platform_id,
+ int32_t encoding_id,
+ int32_t language_id,
+ int32_t name_id) {
+ NameTable::NameEntryFilterInPlace
+ filter(platform_id, encoding_id, language_id, name_id);
+ NameTable::NameEntryIterator* name_entry_iter = Iterator(&filter);
NameEntryPtr result;
- if (name_entry_iter->hasNext()) {
- result = name_entry_iter->next();
- delete name_entry_iter;
- return result;
+ if (name_entry_iter->HasNext()) {
+ result = name_entry_iter->Next();
}
delete name_entry_iter;
- return NULL;
+ return result;
}
-NameTable::NameEntryIterator* NameTable::iterator() {
+NameTable::NameEntryIterator* NameTable::Iterator() {
return new NameTable::NameEntryIterator(this);
}
-NameTable::NameEntryIterator* NameTable::iterator(NameEntryFilter* filter) {
+NameTable::NameEntryIterator* NameTable::Iterator(NameEntryFilter* filter) {
return new NameTable::NameEntryIterator(this, filter);
}
-const char* NameTable::getEncodingName(int32_t platform_id,
+NameTable::NameTable(Header* header, ReadableFontData* data)
+ : Table(header, data) {}
+
+int32_t NameTable::StringOffset() {
+ return data_->ReadUShort(Offset::kStringOffset);
+}
+
+int32_t NameTable::OffsetForNameRecord(int32_t index) {
+ return Offset::kNameRecordStart + index * Offset::kNameRecordSize;
+}
+
+int32_t NameTable::NameLength(int32_t index) {
+ return data_->ReadUShort(Offset::kNameRecordStringLength +
+ OffsetForNameRecord(index));
+}
+
+int32_t NameTable::NameOffset(int32_t index) {
+ return data_->ReadUShort(Offset::kNameRecordStringOffset +
+ OffsetForNameRecord(index)) + StringOffset();
+}
+
+const char* NameTable::GetEncodingName(int32_t platform_id,
int32_t encoding_id) {
switch (platform_id) {
case PlatformId::kUnicode:
@@ -178,7 +594,7 @@
return "MacThai";
case MacintoshEncodingId::kChineseSimplified:
return "EUC-CN";
- default: // unknown/unconfirmed cases are not ported
+ default: // Note: unknown/unconfirmed cases are not ported.
break;
}
break;
@@ -211,9 +627,9 @@
return NULL;
}
-UConverter* NameTable::getCharset(int32_t platform_id, int32_t encoding_id) {
+UConverter* NameTable::GetCharset(int32_t platform_id, int32_t encoding_id) {
UErrorCode error_code = U_ZERO_ERROR;
- UConverter* conv = ucnv_open(getEncodingName(platform_id, encoding_id),
+ UConverter* conv = ucnv_open(GetEncodingName(platform_id, encoding_id),
&error_code);
if (U_SUCCESS(error_code)) {
return conv;
@@ -225,12 +641,14 @@
return NULL;
}
-void NameTable::convertToNameBytes(const UChar* name, int32_t platform_id,
- int32_t encoding_id, ByteVector* b) {
+void NameTable::ConvertToNameBytes(const UChar* name,
+ int32_t platform_id,
+ int32_t encoding_id,
+ ByteVector* b) {
assert(b);
assert(name);
b->clear();
- UConverter* cs = getCharset(platform_id, encoding_id);
+ UConverter* cs = GetCharset(platform_id, encoding_id);
if (cs == NULL) {
return;
}
@@ -238,23 +656,28 @@
// Preflight to get buffer size.
UErrorCode error_code = U_ZERO_ERROR;
int32_t length = ucnv_fromUChars(cs, NULL, 0, name, -1, &error_code);
- b->resize(length + 4); // the longest termination "\0" is 4 bytes
+ b->resize(length + 4); // The longest termination "\0" is 4 bytes.
memset(&((*b)[0]), 0, length + 4);
error_code = U_ZERO_ERROR;
- ucnv_fromUChars(cs, reinterpret_cast<char*>(&((*b)[0])), length + 4, name,
- -1, &error_code);
+ ucnv_fromUChars(cs,
+ reinterpret_cast<char*>(&((*b)[0])),
+ length + 4,
+ name,
+ -1,
+ &error_code);
if (!U_SUCCESS(error_code)) {
b->clear();
}
ucnv_close(cs);
}
-UChar* NameTable::convertFromNameBytes(ByteVector* name_bytes,
- int32_t platform_id, int32_t encoding_id) {
+UChar* NameTable::ConvertFromNameBytes(ByteVector* name_bytes,
+ int32_t platform_id,
+ int32_t encoding_id) {
if (name_bytes == NULL) {
return NULL;
}
- UConverter* cs = getCharset(platform_id, encoding_id);
+ UConverter* cs = GetCharset(platform_id, encoding_id);
UErrorCode error_code = U_ZERO_ERROR;
if (cs == NULL) {
char buffer[11] = {0};
@@ -280,9 +703,12 @@
// No preflight needed here, we will be bigger.
UChar* output_buffer = new UChar[name_bytes->size() + 1];
memset(output_buffer, 0, sizeof(UChar) * (name_bytes->size() + 1));
- int32_t length = ucnv_toUChars(cs, output_buffer, name_bytes->size(),
+ int32_t length = ucnv_toUChars(cs,
+ output_buffer,
+ name_bytes->size(),
reinterpret_cast<char*>(&((*name_bytes)[0])),
- name_bytes->size(), &error_code);
+ name_bytes->size(),
+ &error_code);
ucnv_close(cs);
if (length > 0) {
return output_buffer;
@@ -292,413 +718,4 @@
return NULL;
}
-/******************************************************************************
- * NameTable::NameEntryId class
- ******************************************************************************/
-NameTable::NameEntryId::NameEntryId()
- : platform_id_(0), encoding_id_(0), language_id_(0), name_id_(0) {
-}
-
-NameTable::NameEntryId::NameEntryId(int32_t platform_id, int32_t encoding_id,
- int32_t language_id, int32_t name_id)
- : platform_id_(platform_id), encoding_id_(encoding_id),
- language_id_(language_id), name_id_(name_id) {
-}
-
-NameTable::NameEntryId::NameEntryId(const NameTable::NameEntryId& rhs) {
- *this = rhs;
-}
-
-NameTable::NameEntryId::~NameEntryId() {}
-
-int32_t NameTable::NameEntryId::getPlatformId() const {
- return platform_id_;
-}
-
-int32_t NameTable::NameEntryId::getEncodingId() const {
- return encoding_id_;
-}
-
-int32_t NameTable::NameEntryId::getLanguageId() const {
- return language_id_;
-}
-
-int32_t NameTable::NameEntryId::getNameId() const {
- return name_id_;
-}
-
-const NameTable::NameEntryId& NameTable::NameEntryId::operator=(
- const NameTable::NameEntryId& rhs) const {
- platform_id_ = rhs.platform_id_;
- encoding_id_ = rhs.encoding_id_;
- language_id_ = rhs.language_id_;
- name_id_ = rhs.name_id_;
- return *this;
-}
-
-bool NameTable::NameEntryId::operator==(const NameEntryId& rhs) const {
- return platform_id_ == rhs.platform_id_ && encoding_id_ == rhs.encoding_id_ &&
- language_id_ == rhs.language_id_ && name_id_ == rhs.name_id_;
-}
-
-bool NameTable::NameEntryId::operator<(const NameEntryId& rhs) const {
- if (platform_id_ != rhs.platform_id_) return platform_id_ < rhs.platform_id_;
- if (encoding_id_ != rhs.encoding_id_) return encoding_id_ < rhs.encoding_id_;
- if (language_id_ != rhs.language_id_) return language_id_ < rhs.language_id_;
- return name_id_ < rhs.name_id_;
-}
-
-/******************************************************************************
- * NameTable::NameEntry class
- ******************************************************************************/
-void NameTable::NameEntry::init(int32_t platform_id, int32_t encoding_id,
- int32_t language_id, int32_t name_id,
- const ByteVector* name_bytes) {
- name_entry_id_ = NameEntryId(platform_id, encoding_id, language_id, name_id);
- if (name_bytes) {
- name_bytes_ = *name_bytes;
- } else {
- name_bytes_.clear();
- }
-}
-
-NameTable::NameEntry::NameEntry() {
- init(0, 0, 0, 0, NULL);
-}
-
-NameTable::NameEntry::NameEntry(const NameEntryId& name_entry_id,
- const ByteVector& name_bytes) {
- init(name_entry_id.getPlatformId(), name_entry_id.getEncodingId(),
- name_entry_id.getLanguageId(), name_entry_id.getNameId(), &name_bytes);
-}
-
-NameTable::NameEntry::NameEntry(int32_t platform_id, int32_t encoding_id,
- int32_t language_id, int32_t name_id,
- const ByteVector& name_bytes) {
- init(platform_id, encoding_id, language_id, name_id, &name_bytes);
-}
-
-NameTable::NameEntry::~NameEntry() {}
-
-NameTable::NameEntryId& NameTable::NameEntry::getNameEntryId() {
- return name_entry_id_;
-}
-
-int32_t NameTable::NameEntry::platformId() {
- return name_entry_id_.getPlatformId();
-}
-
-int32_t NameTable::NameEntry::encodingId() {
- return name_entry_id_.getEncodingId();
-}
-
-int32_t NameTable::NameEntry::languageId() {
- return name_entry_id_.getLanguageId();
-}
-
-int32_t NameTable::NameEntry::nameId() {
- return name_entry_id_.getNameId();
-}
-
-int32_t NameTable::NameEntry::nameBytesLength() {
- return name_bytes_.size();
-}
-
-ByteVector* NameTable::NameEntry::nameAsBytes() {
- return &name_bytes_;
-}
-
-UChar* NameTable::NameEntry::name() {
- return NameTable::convertFromNameBytes(&name_bytes_, platformId(),
- encodingId());
-}
-
-bool NameTable::NameEntry::operator==(const NameEntry& rhs) const {
- return (name_entry_id_ == rhs.name_entry_id_ &&
- name_bytes_ == rhs.name_bytes_);
-}
-
-/******************************************************************************
- * NameTable::NameEntryBuilder class
- ******************************************************************************/
-NameTable::NameEntryBuilder::NameEntryBuilder() {
- init(0, 0, 0, 0, NULL);
-}
-
-NameTable::NameEntryBuilder::NameEntryBuilder(
- const NameEntryId& name_entry_id, const ByteVector& name_bytes) {
- init(name_entry_id.getPlatformId(), name_entry_id.getEncodingId(),
- name_entry_id.getLanguageId(), name_entry_id.getNameId(), &name_bytes);
-}
-
-NameTable::NameEntryBuilder::NameEntryBuilder(
- const NameEntryId& name_entry_id) {
- init(name_entry_id.getPlatformId(), name_entry_id.getEncodingId(),
- name_entry_id.getLanguageId(), name_entry_id.getNameId(), NULL);
-}
-
-NameTable::NameEntryBuilder::NameEntryBuilder(NameEntry* b) {
- init(b->platformId(), b->encodingId(), b->languageId(), b->nameId(),
- b->nameAsBytes());
-}
-
-NameTable::NameEntryBuilder::~NameEntryBuilder() {}
-
-void NameTable::NameEntryBuilder::setName(const UChar* name) {
- if (name == NULL) {
- name_entry_->name_bytes_.clear();
- return;
- }
- NameTable::convertToNameBytes(name, name_entry_->platformId(),
- name_entry_->encodingId(),
- &name_entry_->name_bytes_);
-}
-
-void NameTable::NameEntryBuilder::setName(const ByteVector& name_bytes) {
- name_entry_->name_bytes_.clear();
- std::copy(name_bytes.begin(), name_bytes.end(),
- name_entry_->name_bytes_.begin());
-}
-
-void NameTable::NameEntryBuilder::setName(const ByteVector& name_bytes,
- int32_t offset, int32_t length) {
- name_entry_->name_bytes_.clear();
- std::copy(name_bytes.begin() + offset, name_bytes.begin() + offset + length,
- name_entry_->name_bytes_.begin());
-}
-
-CALLER_ATTACH NameTable::NameEntry* NameTable::NameEntryBuilder::entry() {
- return name_entry_;
-}
-
-void NameTable::NameEntryBuilder::init(int32_t platform_id, int32_t encoding_id,
- int32_t language_id, int32_t name_id, const ByteVector* name_bytes) {
- name_entry_ = new NameEntry();
- name_entry_->init(platform_id, encoding_id, language_id, name_id, name_bytes);
-}
-
-/******************************************************************************
- * NameTable::NameEntryFilterInPlace class (C++ port only)
- ******************************************************************************/
-NameTable::NameEntryFilterInPlace::NameEntryFilterInPlace(int32_t platform_id,
- int32_t encoding_id, int32_t language_id, int32_t name_id)
- : platform_id_(platform_id), encoding_id_(encoding_id),
- language_id_(language_id), name_id_(name_id) {
-}
-
-bool NameTable::NameEntryFilterInPlace::accept(int32_t platform_id,
- int32_t encoding_id, int32_t language_id, int32_t name_id) {
- return (platform_id_ == platform_id && encoding_id_ == encoding_id &&
- language_id_ == language_id && name_id_ == name_id);
-}
-
-/******************************************************************************
- * NameTable::NameEntryIterator class
- ******************************************************************************/
-void NameTable::NameEntryIterator::init(NameTable* table,
- NameEntryFilter* filter) {
- table_ = table;
- filter_ = filter;
- name_index_ = 0;
-}
-
-NameTable::NameEntryIterator::NameEntryIterator(NameTable* table) {
- init(table, NULL);
-}
-
-NameTable::NameEntryIterator::NameEntryIterator(NameTable* table,
- NameEntryFilter* filter) {
- init(table, filter);
-}
-
-NameTable::NameEntryIterator::~NameEntryIterator() {
-}
-
-bool NameTable::NameEntryIterator::hasNext() {
- if (!filter_) {
- if (name_index_ < table_->nameCount()) {
- return true;
- }
- return false;
- }
- for (; name_index_ < table_->nameCount(); ++name_index_) {
- if (filter_->accept(table_->platformId(name_index_),
- table_->encodingId(name_index_),
- table_->languageId(name_index_),
- table_->nameId(name_index_))) {
- return true;
- }
- }
- return false;
-}
-
-CALLER_ATTACH NameTable::NameEntry* NameTable::NameEntryIterator::next() {
- if (!hasNext())
- return NULL;
- return table_->nameEntry(name_index_++);
-}
-
-void NameTable::NameEntryIterator::remove() {
-#if !defined (SFNTLY_NO_EXCEPTION)
- throw UnsupportedOperationException(
- "Cannot remove a CMap table from an existing font.");
-#endif
-}
-
-/******************************************************************************
- * NameTable::Builder class
- ******************************************************************************/
-NameTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
- Header* header, WritableFontData* data) :
- Table::ArrayElementTableBuilder(font_builder, header, data) {
-}
-
-NameTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
- Header* header, ReadableFontData* data) :
- Table::ArrayElementTableBuilder(font_builder, header, data) {
-}
-
-void NameTable::Builder::initialize(ReadableFontData* data) {
- if (data) {
- NameTablePtr table = new NameTable(header(), data);
- NameEntryIterator name_iter(table, NULL);
- while (name_iter.hasNext()) {
- NameEntryPtr name_entry = name_iter.next();
- NameEntryBuilderPtr name_entry_builder = new NameEntryBuilder(name_entry);
- NameEntry* builder_entry = name_entry_builder->entry();
- NameEntryId probe = builder_entry->getNameEntryId();
- name_entry_map_[probe] = name_entry_builder;
- }
- }
-}
-
-NameTable::NameEntryBuilderMap* NameTable::Builder::getNameBuilders() {
- if (name_entry_map_.empty()) {
- initialize(internalReadData());
- }
- setModelChanged();
- return &name_entry_map_;
-}
-
-void NameTable::Builder::revertNames() {
- name_entry_map_.clear();
- setModelChanged(false);
-}
-
-int32_t NameTable::Builder::builderCount() {
- getNameBuilders(); // ensure name_entry_map_ is built
- return (int32_t)name_entry_map_.size();
-}
-
-bool NameTable::Builder::has(int32_t platform_id, int32_t encoding_id,
- int32_t language_id, int32_t name_id) {
- NameEntryId probe(platform_id, encoding_id, language_id, name_id);
- getNameBuilders(); // ensure name_entry_map_ is built
- return (name_entry_map_.find(probe) != name_entry_map_.end());
-}
-
-CALLER_ATTACH NameTable::NameEntryBuilder* NameTable::Builder::nameBuilder(
- int32_t platform_id, int32_t encoding_id, int32_t language_id,
- int32_t name_id) {
- NameEntryId probe(platform_id, encoding_id, language_id, name_id);
- NameEntryBuilderMap builders;
- getNameBuilders(); // ensure name_entry_map_ is built
- if (name_entry_map_.find(probe) != name_entry_map_.end()) {
- return name_entry_map_[probe];
- }
- NameEntryBuilderPtr builder = new NameEntryBuilder(probe);
- name_entry_map_[probe] = builder;
- return builder.detach();
-}
-
-bool NameTable::Builder::remove(int32_t platform_id, int32_t encoding_id,
- int32_t language_id, int32_t name_id) {
- NameEntryId probe(platform_id, encoding_id, language_id, name_id);
- getNameBuilders(); // ensure name_entry_map_ is built
- NameEntryBuilderMap::iterator position = name_entry_map_.find(probe);
- if (position != name_entry_map_.end()) {
- name_entry_map_.erase(position);
- return true;
- }
- return false;
-}
-
-CALLER_ATTACH FontDataTable* NameTable::Builder::subBuildTable(
- ReadableFontData* data) {
- FontDataTablePtr table = new NameTable(header(), data);
- return table.detach();
-}
-
-void NameTable::Builder::subDataSet() {
- name_entry_map_.clear();
- setModelChanged(false);
-}
-
-int32_t NameTable::Builder::subDataSizeToSerialize() {
- if (name_entry_map_.empty()) {
- return 0;
- }
-
- int32_t size = NameTable::Offset::kNameRecordStart + name_entry_map_.size() *
- NameTable::Offset::kNameRecordSize;
- for (NameEntryBuilderMap::iterator b = name_entry_map_.begin(),
- end = name_entry_map_.end();
- b != end; ++b) {
- NameEntryBuilderPtr p = b->second;
- NameEntry* entry = p->entry();
- size += entry->nameBytesLength();
- }
- return size;
-}
-
-bool NameTable::Builder::subReadyToSerialize() {
- return !name_entry_map_.empty();
-}
-
-int32_t NameTable::Builder::subSerialize(WritableFontData* new_data) {
- int32_t string_table_start_offset =
- NameTable::Offset::kNameRecordStart + name_entry_map_.size() *
- NameTable::Offset::kNameRecordSize;
-
- // header
- new_data->writeUShort(NameTable::Offset::kFormat, 0);
- new_data->writeUShort(NameTable::Offset::kCount, name_entry_map_.size());
- new_data->writeUShort(NameTable::Offset::kStringOffset,
- string_table_start_offset);
- int32_t name_record_offset = NameTable::Offset::kNameRecordStart;
- int32_t string_offset = 0;
- // Note: we offered operator< in NameEntryId, which will be used by std::less,
- // and therefore our map will act like TreeMap in Java to provide
- // sorted key set.
- for (NameEntryBuilderMap::iterator b = name_entry_map_.begin(),
- end = name_entry_map_.end();
- b != end; ++b) {
- new_data->writeUShort(
- name_record_offset + NameTable::Offset::kNameRecordPlatformId,
- b->first.getPlatformId());
- new_data->writeUShort(
- name_record_offset + NameTable::Offset::kNameRecordEncodingId,
- b->first.getEncodingId());
- new_data->writeUShort(
- name_record_offset + NameTable::Offset::kNameRecordLanguageId,
- b->first.getLanguageId());
- new_data->writeUShort(
- name_record_offset + NameTable::Offset::kNameRecordNameId,
- b->first.getNameId());
- NameEntry* builder_entry = b->second->entry();
- new_data->writeUShort(
- name_record_offset + NameTable::Offset::kNameRecordStringLength,
- builder_entry->nameBytesLength());
- new_data->writeUShort(
- name_record_offset + NameTable::Offset::kNameRecordStringOffset,
- string_offset);
- name_record_offset += NameTable::Offset::kNameRecordSize;
- string_offset += new_data->writeBytes(
- string_offset + string_table_start_offset,
- builder_entry->nameAsBytes());
- }
-
- return string_offset + string_table_start_offset;
-}
-
} // namespace sfntly
diff --git a/sfntly/name_table.h b/sfntly/name_table.h
index 6d5df2b..d0dd345 100644
--- a/sfntly/name_table.h
+++ b/sfntly/name_table.h
@@ -34,6 +34,10 @@
namespace sfntly {
+// The following code implements the name table defined in TTF/OTF spec, which
+// can be found at http://www.microsoft.com/typography/otspec/name.htm.
+
+// Name IDs defined in TTF/OTF spec.
struct NameId {
enum {
kUnknown = -1,
@@ -63,6 +67,7 @@
};
};
+// Unicode language IDs used in Name Records.
struct UnicodeLanguageId {
enum {
kUnknown = -1,
@@ -408,6 +413,266 @@
};
class NameTable : public Table, public RefCounted<NameTable> {
+ public:
+ // Unique identifier for a given name record.
+ class NameEntryId {
+ public:
+ NameEntryId(); // C++ port only, must provide default constructor.
+ NameEntryId(int32_t platform_id, int32_t encoding_id, int32_t language_id,
+ int32_t name_id);
+ NameEntryId(const NameEntryId&);
+ // Make gcc -Wnon-virtual-dtor happy.
+ virtual ~NameEntryId() {}
+
+ int32_t platform_id() const { return platform_id_; }
+ int32_t encoding_id() const { return encoding_id_; }
+ int32_t language_id() const { return language_id_; }
+ int32_t name_id() const { return name_id_; }
+
+ const NameEntryId& operator=(const NameEntryId& rhs) const;
+ bool operator==(const NameEntryId& rhs) const;
+ bool operator<(const NameEntryId& rhs) const;
+
+ private:
+ mutable int32_t platform_id_;
+ mutable int32_t encoding_id_;
+ mutable int32_t language_id_;
+ mutable int32_t name_id_;
+ };
+
+ class NameEntryBuilder;
+
+ // Class to represent a name entry in the name table.
+ class NameEntry : public RefCounted<NameEntry> {
+ public:
+ NameEntry();
+ NameEntry(const NameEntryId& name_entry_id, const ByteVector& name_bytes);
+ NameEntry(int32_t platform_id, int32_t encoding_id, int32_t language_id,
+ int32_t name_id, const ByteVector& name_bytes);
+ virtual ~NameEntry();
+
+ NameEntryId& name_entry_id() { return name_entry_id_; }
+ int32_t platform_id() const { return name_entry_id_.platform_id(); }
+ int32_t encoding_id() const { return name_entry_id_.encoding_id(); }
+ int32_t language_id() const { return name_entry_id_.language_id(); };
+ int32_t name_id() const { return name_entry_id_.name_id(); }
+
+ // Get the bytes for name. Returned pointer is the address of private
+ // member of this class, do not attempt to delete.
+ ByteVector* NameAsBytes();
+
+ // C++ port only: get the length of NameAsBytes.
+ int32_t NameBytesLength();
+
+ // Returns the name in Unicode as UChar array.
+ // Note: ICU UChar* convention requires caller to delete[] it.
+ UChar* Name();
+ bool operator==(const NameEntry& rhs) const;
+
+ private:
+ void Init(int32_t platform_id, int32_t encoding_id, int32_t language_id,
+ int32_t name_id, const ByteVector* name_bytes);
+
+ NameEntryId name_entry_id_;
+ int32_t length_;
+ ByteVector name_bytes_;
+
+ friend class NameEntryBuilder;
+ };
+
+ // Builder of a name entry.
+ // C++ port: original Java hierarchy inherits from NameEntry. In C++ port, we
+ // opted not doing so to avoid ref count issues and nasty protected members.
+ class NameEntryBuilder : public RefCounted<NameEntryBuilder> {
+ public:
+ NameEntryBuilder();
+ NameEntryBuilder(const NameEntryId& name_entry_id,
+ const ByteVector& name_bytes);
+ explicit NameEntryBuilder(const NameEntryId& name_entry_id);
+ explicit NameEntryBuilder(NameEntry* entry);
+ virtual ~NameEntryBuilder();
+
+ virtual void SetName(const UChar* name);
+ virtual void SetName(const ByteVector& name_bytes);
+ virtual void SetName(const ByteVector& name_bytes, int32_t offset,
+ int32_t length);
+
+ // C++ port only. CALLER_ATTACH is not added because the lifetime shall be
+ // controlled by this class, therefore the caller shall not increase the ref
+ // count.
+ NameEntry* name_entry() { return name_entry_; }
+
+ private:
+ void Init(int32_t platform_id, int32_t encoding_id, int32_t language_id,
+ int32_t name_id, const ByteVector* name_bytes);
+
+ Ptr<NameEntry> name_entry_;
+ };
+ typedef std::map<NameEntryId, Ptr<NameEntryBuilder> > NameEntryBuilderMap;
+
+ // An interface for a filter to use with the name entry iterator. This allows
+ // name entries to be iterated and only those acceptable to the filter will be
+ // returned.
+ class NameEntryFilter {
+ public:
+ virtual bool Accept(int32_t platform_id, int32_t encoding_id,
+ int32_t language_id, int32_t name_id) = 0;
+ // Make gcc -Wnon-virtual-dtor happy.
+ virtual ~NameEntryFilter() {}
+ };
+
+ // C++ port only: an in-place filter to mimic Java Iterator's filtering.
+ class NameEntryFilterInPlace : public NameEntryFilter {
+ public:
+ NameEntryFilterInPlace(int32_t platform_id, int32_t encoding_id,
+ int32_t language_id, int32_t name_id);
+ // Make gcc -Wnon-virtual-dtor happy.
+ virtual ~NameEntryFilterInPlace() {}
+
+ virtual bool Accept(int32_t platform_id, int32_t encoding_id,
+ int32_t language_id, int32_t name_id);
+
+ private:
+ int32_t platform_id_;
+ int32_t encoding_id_;
+ int32_t language_id_;
+ int32_t name_id_;
+ };
+
+ // Mimic Java's iterator to iterate through the entries within the name table.
+ class NameEntryIterator {
+ public:
+ // If filter is NULL, filter through all tables.
+ explicit NameEntryIterator(NameTable* table);
+ NameEntryIterator(NameTable* table, NameEntryFilter* filter);
+ // Make gcc -Wnon-virtual-dtor happy.
+ virtual ~NameEntryIterator() {}
+
+ virtual bool HasNext();
+ virtual CALLER_ATTACH NameEntry* Next();
+ virtual void Remove();
+
+ private:
+ void Init(NameTable* table, NameEntryFilter* filter);
+
+ NameTable* table_; // Use dumb pointer since it's a composition object.
+ int32_t name_index_;
+ NameEntryFilter* filter_;
+ };
+
+ // The builder to construct name table for outputting.
+ class Builder : public Table::ArrayElementTableBuilder,
+ public RefCounted<Builder> {
+ public:
+ // Constructor scope altered to public because C++ does not allow base
+ // class to instantiate derived class with protected constructors.
+ Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+ WritableFontData* data);
+ Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+ ReadableFontData* data);
+
+ // Revert the name builders for the name table to the last version that came
+ // from data.
+ void RevertNames();
+
+ // Number of name entry builders contained.
+ int32_t BuilderCount();
+
+ // Note: For C++ port, clear() is not implemented. The clear() function
+ // implies completely remove name entry builders, which is easy in
+ // Java but will take a lot of efforts in C++ to release the builders
+ // nicely and correctly.
+ // TODO(arthurhsu): IMPLEMENT
+ // Clear the name builders for the name table.
+ // void clear();
+
+ // Check the existance of a name entry builder by key.
+ bool Has(int32_t platform_id, int32_t encoding_id, int32_t language_id,
+ int32_t name_id);
+
+ // Get name entry builder by key.
+ CALLER_ATTACH NameEntryBuilder* NameBuilder(int32_t platform_id,
+ int32_t encoding_id, int32_t language_id, int32_t name_id);
+
+ // Remove name entry builder by key.
+ bool Remove(int32_t platform_id, int32_t encoding_id, int32_t language_id,
+ int32_t name_id);
+
+ // FontDataTable::Builder API implementation
+ virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+ virtual void SubDataSet();
+ virtual int32_t SubDataSizeToSerialize();
+ virtual bool SubReadyToSerialize();
+ virtual int32_t SubSerialize(WritableFontData* new_data);
+
+ private:
+ void Initialize(ReadableFontData* data);
+ NameEntryBuilderMap* GetNameBuilders();
+
+ // Note: callers should use the getter funtion provided above to ensure that
+ // this is lazily initialized instead of accessing directly.
+ NameEntryBuilderMap name_entry_map_;
+ };
+
+ /****************************************************************************
+ * public methods of NameTable class
+ ****************************************************************************/
+ virtual ~NameTable();
+
+ // Get the format used in the name table.
+ virtual int32_t Format();
+
+ // Get the number of names in the name table.
+ virtual int32_t NameCount();
+
+ // Get the platform id for the given name record.
+ virtual int32_t PlatformId(int32_t index);
+
+ // Get the encoding id for the given name record.
+ // see MacintoshEncodingId, WindowsEncodingId, UnicodeEncodingId
+ virtual int32_t EncodingId(int32_t index);
+
+ // Get the language id for the given name record.
+ virtual int32_t LanguageId(int32_t index);
+
+ // Get the name id for given name record.
+ virtual int32_t NameId(int32_t index);
+
+ // Get the name as bytes for the specified name. If there is no entry for the
+ // requested name, then empty vector is returned.
+ virtual void NameAsBytes(int32_t index, ByteVector* b);
+ virtual void NameAsBytes(int32_t platform_id, int32_t encoding_id,
+ int32_t language_id, int32_t name_id,
+ ByteVector* b);
+
+ // Get the name as a UChar* for the given name record. If there is no
+ // encoding conversion available for the name record then a best attempt
+ // UChar* will be returned.
+ // Note: ICU UChar* convention requires caller to delete[] it.
+ virtual UChar* Name(int index);
+
+ // Get the name as a UChar* for the specified name. If there is no entry for
+ // the requested name then NULL is returned. If there is no encoding
+ // conversion available for the name then a best attempt UChar* will be
+ // returned.
+ // Note: ICU UChar* convention requires caller to delete[] it.
+ virtual UChar* Name(int32_t platform_id, int32_t encoding_id,
+ int32_t language_id, int32_t name_id);
+
+ // Note: These functions are renamed in C++ port. Their original Java name is
+ // nameEntry().
+ virtual CALLER_ATTACH NameEntry* GetNameEntry(int32_t index);
+ virtual CALLER_ATTACH NameEntry* GetNameEntry(int32_t platform_id,
+ int32_t encoding_id, int32_t language_id, int32_t name_id);
+
+ // Note: Not implemented in C++ port due to complexity and low usage.
+ // virtual void names(std::set<NameEntryPtr>*);
+
+ // Get the iterator to iterate through all name entries.
+ // Note: Caller delete the returned object.
+ virtual NameEntryIterator* Iterator();
+ virtual NameEntryIterator* Iterator(NameEntryFilter* filter);
+
private:
struct Offset {
enum {
@@ -416,7 +681,7 @@
kStringOffset = 4,
kNameRecordStart = 6,
- // format 1 - offset from the end of the name records
+ // Format 1 - offset from the end of the name records
kLangTagCount = 0,
kLangTagRecord = 2,
@@ -431,254 +696,36 @@
};
};
+ // The table shall be constructed using Builder, no direct instantiation.
NameTable(Header* header, ReadableFontData* data);
- public:
- virtual ~NameTable();
- virtual int32_t format();
-
- // Get the number of names in the name table.
- virtual int32_t nameCount();
-
- private:
// Get the offset to the string data in the name table.
- int32_t stringOffset();
+ int32_t StringOffset();
// Get the offset for the given name record.
- int32_t offsetForNameRecord(int32_t index);
+ int32_t OffsetForNameRecord(int32_t index);
- public:
- // Get the platform id for the given name record.
- virtual int32_t platformId(int32_t index);
-
- // Get the encoding id for the given name record.
- // see MacintoshEncodingId, WindowsEncodingId, UnicodeEncodingId
- virtual int32_t encodingId(int32_t index);
-
- // Get the language id for the given name record.
- virtual int32_t languageId(int32_t index);
-
- // Get the name id for given name record.
- virtual int32_t nameId(int32_t index);
-
- private:
// Get the length of the string data for the given name record.
- int32_t nameLength(int32_t index);
+ int32_t NameLength(int32_t index);
// Get the offset of the string data for the given name record.
- int32_t nameOffset(int32_t index);
+ int32_t NameOffset(int32_t index);
- public:
- // Get the name as bytes for the specified name. If there is no entry for the
- // requested name, then empty vector is returned.
- virtual void nameAsBytes(int32_t index, ByteVector* b);
- virtual void nameAsBytes(int32_t platform_id, int32_t encoding_id,
- int32_t language_id, int32_t name_id,
- ByteVector* b);
+ // Note: string literals are returned. Caller shall not attempt to manipulate
+ // the returned pointer.
+ static const char* GetEncodingName(int32_t platform_id, int32_t encoding_id);
- // Get the name as a UChar* for the given name record. If there is no
- // encoding conversion available for the name record then a best attempt
- // UChar* will be returned.
- // Note: ICU UChar* convention requires caller to delete[] it.
- virtual UChar* name(int index);
+ // Note: ICU UConverter* convention requires caller to ucnv_close() it.
+ static UConverter* GetCharset(int32_t platform_id, int32_t encoding_id);
- // Get the name as a UChar* for the specified name. If there is no entry for
- // the requested name then NULL is returned. If there is no encoding
- // conversion available for the name then a best attempt UChar* will be
- // returned.
- // Note: ICU UChar* convention requires caller to delete[] it.
- virtual UChar* name(int32_t platform_id, int32_t encoding_id,
- int32_t language_id, int32_t name_id);
-
- class NameEntry;
- virtual CALLER_ATTACH NameEntry* nameEntry(int32_t index);
- virtual CALLER_ATTACH NameEntry* nameEntry(int32_t platform_id,
- int32_t encoding_id, int32_t language_id, int32_t name_id);
-
- // Note: Not implemented in C++ port due to complexity and low usage.
- // virtual void names(std::set<NameEntryPtr>*);
-
- class NameEntryId {
- protected:
- mutable int32_t platform_id_;
- mutable int32_t encoding_id_;
- mutable int32_t language_id_;
- mutable int32_t name_id_;
-
- public:
- NameEntryId(); // C++ port only, must provide default constructor.
- NameEntryId(int32_t platform_id, int32_t encoding_id, int32_t language_id,
- int32_t name_id);
- NameEntryId(const NameEntryId&);
- virtual ~NameEntryId();
- virtual int32_t getPlatformId() const;
- virtual int32_t getEncodingId() const;
- virtual int32_t getLanguageId() const;
- virtual int32_t getNameId() const;
- virtual const NameEntryId& operator=(const NameEntryId& rhs) const;
- virtual bool operator==(const NameEntryId& rhs) const;
- virtual bool operator<(const NameEntryId& rhs) const;
- };
-
- // Class to represent a name entry in the name table.
- class NameEntryBuilder;
- class NameEntry : public RefCounted<NameEntry> {
- public:
- NameEntry();
- NameEntry(const NameEntryId& name_entry_id, const ByteVector& name_bytes);
- NameEntry(int32_t platform_id, int32_t encoding_id, int32_t language_id,
- int32_t name_id, const ByteVector& name_bytes);
- virtual ~NameEntry();
- virtual NameEntryId& getNameEntryId();
- virtual int32_t platformId();
- virtual int32_t encodingId();
- virtual int32_t languageId();
- virtual int32_t nameId();
- virtual int32_t nameBytesLength(); // C++ port only
- virtual ByteVector* nameAsBytes();
- virtual UChar* name();
- virtual bool operator==(const NameEntry& rhs) const;
-
- private:
- void init(int32_t platform_id, int32_t encoding_id, int32_t language_id,
- int32_t name_id, const ByteVector* name_bytes);
-
- NameEntryId name_entry_id_;
- int32_t length_;
- ByteVector name_bytes_;
-
- friend class NameEntryBuilder;
- };
-
- // C++ port: we don't use original Java hierarchy to avoid ref count issues
- // and nasty protected members.
- class NameEntryBuilder : public RefCounted<NameEntryBuilder> {
- public:
- NameEntryBuilder();
- NameEntryBuilder(const NameEntryId& name_entry_id,
- const ByteVector& name_bytes);
- explicit NameEntryBuilder(const NameEntryId& name_entry_id);
- explicit NameEntryBuilder(NameEntry* entry);
- virtual ~NameEntryBuilder();
-
- virtual void setName(const UChar* name);
- virtual void setName(const ByteVector& name_bytes);
- virtual void setName(const ByteVector& name_bytes, int32_t offset,
- int32_t length);
-
- // C++ port only member functions. CALLER_ATTACH is not added because the
- // lifetime shall be controlled by build, therefore the caller shall not
- // increase the ref count.
- NameEntry* entry();
-
- private:
- void init(int32_t platform_id, int32_t encoding_id, int32_t language_id,
- int32_t name_id, const ByteVector* name_bytes);
-
- Ptr<NameEntry> name_entry_;
- };
-
- class NameEntryFilter {
- public:
- virtual bool accept(int32_t platform_id, int32_t encoding_id,
- int32_t language_id, int32_t name_id) = 0;
- // Make gcc -Wnon-virtual-dtor happy.
- virtual ~NameEntryFilter() {}
- };
-
- // C++ port only
- class NameEntryFilterInPlace : public NameEntryFilter {
- public:
- NameEntryFilterInPlace(int32_t platform_id, int32_t encoding_id,
- int32_t language_id, int32_t name_id);
- // Make gcc -Wnon-virtual-dtor happy.
- virtual ~NameEntryFilterInPlace() {}
- virtual bool accept(int32_t platform_id, int32_t encoding_id,
- int32_t language_id, int32_t name_id);
-
- private:
- int32_t platform_id_;
- int32_t encoding_id_;
- int32_t language_id_;
- int32_t name_id_;
- };
-
- class NameEntryIterator {
- public:
- // If filter is NULL, filter through all tables.
- explicit NameEntryIterator(NameTable* table);
- NameEntryIterator(NameTable* table, NameEntryFilter* filter);
- // Make gcc -Wnon-virtual-dtor happy.
- virtual ~NameEntryIterator();
- virtual bool hasNext();
- virtual CALLER_ATTACH NameEntry* next();
- virtual void remove();
-
- private:
- void init(NameTable* table, NameEntryFilter* filter);
-
- NameTable* table_; // use dumb pointer since it's a composition object
- int32_t name_index_;
- NameEntryFilter* filter_;
- };
-
- // caller delete the object
- virtual NameEntryIterator* iterator();
- virtual NameEntryIterator* iterator(NameEntryFilter* filter);
-
- private:
- static const char* getEncodingName(int32_t platform_id, int32_t encoding_id);
- static UConverter* getCharset(int32_t platform_id, int32_t encoding_id);
- static void convertToNameBytes(const UChar* name, int32_t platform_id,
+ // Note: Output will be stored in ByteVector* b. Original data in b will be
+ // erased and replaced with converted name bytes.
+ static void ConvertToNameBytes(const UChar* name, int32_t platform_id,
int32_t encoding_id, ByteVector* b);
- static UChar* convertFromNameBytes(ByteVector* name_bytes,
+
+ // Note: ICU UChar* convention requires caller to delete[] it.
+ static UChar* ConvertFromNameBytes(ByteVector* name_bytes,
int32_t platform_id, int32_t encoding_id);
-
- public:
- typedef std::map<NameEntryId, Ptr<NameEntryBuilder> > NameEntryBuilderMap;
-
- class Builder : public Table::ArrayElementTableBuilder,
- public RefCounted<Builder> {
- public:
- // Constructor scope altered to public because C++ does not allow base
- // class to instantiate derived class with protected constructors.
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* data);
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
- ReadableFontData* data);
-
- private:
- void initialize(ReadableFontData* data);
- NameEntryBuilderMap* getNameBuilders();
-
- public: // static class in Java, functions are not virtual unless inherited
- void revertNames();
- int32_t builderCount();
-
- // Note: For C++ port, this is not implemented so far. The clear() function
- // implies completely remove name entry builders, which is easy in
- // Java but will take a lot of efforts in C++ to release the builders
- // nicely and correctly.
- // TODO(arthurhsu): IMPLEMENT
- // Clear the name builders for the name table.
- // void clear();
-
- bool has(int32_t platform_id, int32_t encoding_id, int32_t language_id,
- int32_t name_id);
- CALLER_ATTACH NameEntryBuilder* nameBuilder(int32_t platform_id,
- int32_t encoding_id, int32_t language_id, int32_t name_id);
- bool remove(int32_t platform_id, int32_t encoding_id, int32_t language_id,
- int32_t name_id);
-
- virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
- virtual void subDataSet();
- virtual int32_t subDataSizeToSerialize();
- virtual bool subReadyToSerialize();
- virtual int32_t subSerialize(WritableFontData* new_data);
-
- private:
- NameEntryBuilderMap name_entry_map_;
- };
}; // class NameTable
typedef Ptr<NameTable> NameTablePtr;
typedef Ptr<NameTable::NameEntry> NameEntryPtr;
diff --git a/sfntly/os2_table.cc b/sfntly/os2_table.cc
index 4e7189d..6d6d338 100644
--- a/sfntly/os2_table.cc
+++ b/sfntly/os2_table.cc
@@ -98,163 +98,164 @@
/******************************************************************************
* class OS2Table
******************************************************************************/
-OS2Table::OS2Table(Header* header, ReadableFontData* data)
- : Table(header, data) {
-}
-
OS2Table::~OS2Table() {}
-int32_t OS2Table::version() {
- return data_->readUShort(Offset::kVersion);
+int32_t OS2Table::Version() {
+ return data_->ReadUShort(Offset::kVersion);
}
-int32_t OS2Table::xAvgCharWidth() {
- return data_->readShort(Offset::kXAvgCharWidth);
+int32_t OS2Table::XAvgCharWidth() {
+ return data_->ReadShort(Offset::kXAvgCharWidth);
}
-int32_t OS2Table::usWeightClass() {
- return data_->readUShort(Offset::kUsWeightClass);
+int32_t OS2Table::UsWeightClass() {
+ return data_->ReadUShort(Offset::kUsWeightClass);
}
-int32_t OS2Table::usWidthClass() {
- return data_->readUShort(Offset::kUsWidthClass);
+int32_t OS2Table::UsWidthClass() {
+ return data_->ReadUShort(Offset::kUsWidthClass);
}
-int32_t OS2Table::fsType() {
- return data_->readUShort(Offset::kFsType);
+int32_t OS2Table::FsType() {
+ return data_->ReadUShort(Offset::kFsType);
}
-int32_t OS2Table::ySubscriptXSize() {
- return data_->readShort(Offset::kYSubscriptXSize);
+int32_t OS2Table::YSubscriptXSize() {
+ return data_->ReadShort(Offset::kYSubscriptXSize);
}
-int32_t OS2Table::ySubscriptYSize() {
- return data_->readShort(Offset::kYSubscriptYSize);
+int32_t OS2Table::YSubscriptYSize() {
+ return data_->ReadShort(Offset::kYSubscriptYSize);
}
-int32_t OS2Table::ySubscriptXOffset() {
- return data_->readShort(Offset::kYSubscriptXOffset);
+int32_t OS2Table::YSubscriptXOffset() {
+ return data_->ReadShort(Offset::kYSubscriptXOffset);
}
-int32_t OS2Table::ySubscriptYOffset() {
- return data_->readShort(Offset::kYSubscriptYOffset);
+int32_t OS2Table::YSubscriptYOffset() {
+ return data_->ReadShort(Offset::kYSubscriptYOffset);
}
-int32_t OS2Table::ySuperscriptXSize() {
- return data_->readShort(Offset::kYSuperscriptXSize);
+int32_t OS2Table::YSuperscriptXSize() {
+ return data_->ReadShort(Offset::kYSuperscriptXSize);
}
-int32_t OS2Table::ySuperscriptYSize() {
- return data_->readShort(Offset::kYSuperscriptYSize);
+int32_t OS2Table::YSuperscriptYSize() {
+ return data_->ReadShort(Offset::kYSuperscriptYSize);
}
-int32_t OS2Table::ySuperscriptXOffset() {
- return data_->readShort(Offset::kYSuperscriptXOffset);
+int32_t OS2Table::YSuperscriptXOffset() {
+ return data_->ReadShort(Offset::kYSuperscriptXOffset);
}
-int32_t OS2Table::ySuperscriptYOffset() {
- return data_->readShort(Offset::kYSuperscriptYOffset);
+int32_t OS2Table::YSuperscriptYOffset() {
+ return data_->ReadShort(Offset::kYSuperscriptYOffset);
}
-int32_t OS2Table::yStrikeoutSize() {
- return data_->readShort(Offset::kYStrikeoutSize);
+int32_t OS2Table::YStrikeoutSize() {
+ return data_->ReadShort(Offset::kYStrikeoutSize);
}
-int32_t OS2Table::yStrikeoutPosition() {
- return data_->readShort(Offset::kYStrikeoutPosition);
+int32_t OS2Table::YStrikeoutPosition() {
+ return data_->ReadShort(Offset::kYStrikeoutPosition);
}
-int32_t OS2Table::sFamilyClass() {
- return data_->readShort(Offset::kSFamilyClass);
+int32_t OS2Table::SFamilyClass() {
+ return data_->ReadShort(Offset::kSFamilyClass);
}
-void OS2Table::panose(ByteVector* value) {
+void OS2Table::Panose(ByteVector* value) {
value->clear();
value->resize(10);
- data_->readBytes(Offset::kPanose, value, 0, 10);
+ data_->ReadBytes(Offset::kPanose, value, 0, 10);
}
-int64_t OS2Table::ulUnicodeRange1() {
- return data_->readULong(Offset::kUlUnicodeRange1);
+int64_t OS2Table::UlUnicodeRange1() {
+ return data_->ReadULong(Offset::kUlUnicodeRange1);
}
-int64_t OS2Table::ulUnicodeRange2() {
- return data_->readULong(Offset::kUlUnicodeRange2);
+int64_t OS2Table::UlUnicodeRange2() {
+ return data_->ReadULong(Offset::kUlUnicodeRange2);
}
-int64_t OS2Table::ulUnicodeRange3() {
- return data_->readULong(Offset::kUlUnicodeRange3);
+int64_t OS2Table::UlUnicodeRange3() {
+ return data_->ReadULong(Offset::kUlUnicodeRange3);
}
-int64_t OS2Table::ulUnicodeRange4() {
- return data_->readULong(Offset::kUlUnicodeRange4);
+int64_t OS2Table::UlUnicodeRange4() {
+ return data_->ReadULong(Offset::kUlUnicodeRange4);
}
-void OS2Table::achVendId(ByteVector* b) {
+void OS2Table::AchVendId(ByteVector* b) {
b->clear();
b->resize(4);
- data_->readBytes(Offset::kAchVendId, b, 0, 4);
+ data_->ReadBytes(Offset::kAchVendId, b, 0, 4);
}
-int32_t OS2Table::fsSelection() {
- return data_->readUShort(Offset::kFsSelection);
+int32_t OS2Table::FsSelection() {
+ return data_->ReadUShort(Offset::kFsSelection);
}
-int32_t OS2Table::usFirstCharIndex() {
- return data_->readUShort(Offset::kUsFirstCharIndex);
+int32_t OS2Table::UsFirstCharIndex() {
+ return data_->ReadUShort(Offset::kUsFirstCharIndex);
}
-int32_t OS2Table::usLastCharIndex() {
- return data_->readUShort(Offset::kUsLastCharIndex);
+int32_t OS2Table::UsLastCharIndex() {
+ return data_->ReadUShort(Offset::kUsLastCharIndex);
}
-int32_t OS2Table::sTypoAscender() {
- return data_->readShort(Offset::kSTypoAscender);
+int32_t OS2Table::STypoAscender() {
+ return data_->ReadShort(Offset::kSTypoAscender);
}
-int32_t OS2Table::sTypoDecender() {
- return data_->readShort(Offset::kSTypoDescender);
+int32_t OS2Table::STypoDecender() {
+ return data_->ReadShort(Offset::kSTypoDescender);
}
-int32_t OS2Table::sTypoLineGap() {
- return data_->readShort(Offset::kSTypoLineGap);
+int32_t OS2Table::STypoLineGap() {
+ return data_->ReadShort(Offset::kSTypoLineGap);
}
-int32_t OS2Table::usWinAscent() {
- return data_->readUShort(Offset::kUsWinAscent);
+int32_t OS2Table::UsWinAscent() {
+ return data_->ReadUShort(Offset::kUsWinAscent);
}
-int32_t OS2Table::usWinDescent() {
- return data_->readUShort(Offset::kUsWinDescent);
+int32_t OS2Table::UsWinDescent() {
+ return data_->ReadUShort(Offset::kUsWinDescent);
}
-int64_t OS2Table::ulCodePageRange1() {
- return data_->readULong(Offset::kUlCodePageRange1);
+int64_t OS2Table::UlCodePageRange1() {
+ return data_->ReadULong(Offset::kUlCodePageRange1);
}
-int64_t OS2Table::ulCodePageRange2() {
- return data_->readULong(Offset::kUlCodePageRange2);
+int64_t OS2Table::UlCodePageRange2() {
+ return data_->ReadULong(Offset::kUlCodePageRange2);
}
-int64_t OS2Table::ulCodePageRange() {
- return ((0xffffffff & ulCodePageRange2()) << 32) |
- (0xffffffff & ulCodePageRange1());
+int64_t OS2Table::UlCodePageRange() {
+ // TODO(arthurhsu): Possible bug point, check with stuartg.
+ return ((0xffffffff & UlCodePageRange2()) << 32) |
+ (0xffffffff & UlCodePageRange1());
}
-int32_t OS2Table::sxHeight() {
- return data_->readShort(Offset::kSxHeight);
+int32_t OS2Table::SxHeight() {
+ return data_->ReadShort(Offset::kSxHeight);
}
-int32_t OS2Table::usDefaultChar() {
- return data_->readUShort(Offset::kUsDefaultChar);
+int32_t OS2Table::UsDefaultChar() {
+ return data_->ReadUShort(Offset::kUsDefaultChar);
}
-int32_t OS2Table::usBreakChar() {
- return data_->readUShort(Offset::kUsBreakChar);
+int32_t OS2Table::UsBreakChar() {
+ return data_->ReadUShort(Offset::kUsBreakChar);
}
-int32_t OS2Table::usMaxContext() {
- return data_->readUShort(Offset::kUsMaxContext);
+int32_t OS2Table::UsMaxContext() {
+ return data_->ReadUShort(Offset::kUsMaxContext);
+}
+
+OS2Table::OS2Table(Header* header, ReadableFontData* data)
+ : Table(header, data) {
}
/******************************************************************************
@@ -267,10 +268,10 @@
OS2Table::Builder::~Builder() {}
-CALLER_ATTACH FontDataTable* OS2Table::Builder::subBuildTable(
+CALLER_ATTACH FontDataTable* OS2Table::Builder::SubBuildTable(
ReadableFontData* data) {
FontDataTablePtr table = new OS2Table(header(), data);
- return table.detach();
+ return table.Detach();
}
} // namespace sfntly
diff --git a/sfntly/os2_table.h b/sfntly/os2_table.h
index 9bf33c2..058435a 100644
--- a/sfntly/os2_table.h
+++ b/sfntly/os2_table.h
@@ -300,6 +300,61 @@
};
class OS2Table : public Table, public RefCounted<OS2Table> {
+ public:
+ class Builder : public Table::TableBasedTableBuilder,
+ public RefCounted<Builder> {
+ public:
+ Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+ WritableFontData* data);
+ virtual ~Builder();
+ virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+ };
+
+ ~OS2Table();
+
+ int32_t Version();
+ int32_t XAvgCharWidth();
+ int32_t UsWeightClass();
+ int32_t UsWidthClass();
+ // UNIMPLEMENTED: public EnumSet<EmbeddingFlags> fsType()
+ int32_t FsType();
+ int32_t YSubscriptXSize();
+ int32_t YSubscriptYSize();
+ int32_t YSubscriptXOffset();
+ int32_t YSubscriptYOffset();
+ int32_t YSuperscriptXSize();
+ int32_t YSuperscriptYSize();
+ int32_t YSuperscriptXOffset();
+ int32_t YSuperscriptYOffset();
+ int32_t YStrikeoutSize();
+ int32_t YStrikeoutPosition();
+ int32_t SFamilyClass();
+ void Panose(ByteVector* value);
+ int64_t UlUnicodeRange1();
+ int64_t UlUnicodeRange2();
+ int64_t UlUnicodeRange3();
+ int64_t UlUnicodeRange4();
+ // UNIMPLEMENTED: public EnumSet<UnicodeRange> UlUnicodeRange()
+ void AchVendId(ByteVector* b);
+ // UNIMPLEMENTED: public EnumSet<FsSelection> fsSelection()
+ int32_t FsSelection();
+ int32_t UsFirstCharIndex();
+ int32_t UsLastCharIndex();
+ int32_t STypoAscender();
+ int32_t STypoDecender();
+ int32_t STypoLineGap();
+ int32_t UsWinAscent();
+ int32_t UsWinDescent();
+ int64_t UlCodePageRange1();
+ int64_t UlCodePageRange2();
+ // UNIMPLEMENTED: public EnumSet<CodePageRange> ulCodePageRange()
+ int64_t UlCodePageRange();
+ int32_t SxHeight();
+ int32_t SCapHeight();
+ int32_t UsDefaultChar();
+ int32_t UsBreakChar();
+ int32_t UsMaxContext();
+
private:
struct Offset {
enum {
@@ -344,62 +399,6 @@
};
OS2Table(Header* header, ReadableFontData* data);
-
- public:
- ~OS2Table();
-
- int32_t version();
- int32_t xAvgCharWidth();
- int32_t usWeightClass();
- int32_t usWidthClass();
- // UNIMPLEMENTED: public EnumSet<EmbeddingFlags> fsType()
- int32_t fsType();
- int32_t ySubscriptXSize();
- int32_t ySubscriptYSize();
- int32_t ySubscriptXOffset();
- int32_t ySubscriptYOffset();
- int32_t ySuperscriptXSize();
- int32_t ySuperscriptYSize();
- int32_t ySuperscriptXOffset();
- int32_t ySuperscriptYOffset();
- int32_t yStrikeoutSize();
- int32_t yStrikeoutPosition();
- int32_t sFamilyClass();
- void panose(ByteVector* value);
- int64_t ulUnicodeRange1();
- int64_t ulUnicodeRange2();
- int64_t ulUnicodeRange3();
- int64_t ulUnicodeRange4();
- // UNIMPLEMENTED: public EnumSet<UnicodeRange> ulUnicodeRange()
- void achVendId(ByteVector* b);
- // UNIMPLEMENTED: public EnumSet<FsSelection> fsSelection()
- int32_t fsSelection();
- int32_t usFirstCharIndex();
- int32_t usLastCharIndex();
- int32_t sTypoAscender();
- int32_t sTypoDecender();
- int32_t sTypoLineGap();
- int32_t usWinAscent();
- int32_t usWinDescent();
- int64_t ulCodePageRange1();
- int64_t ulCodePageRange2();
- // UNIMPLEMENTED: public EnumSet<CodePageRange> ulCodePageRange()
- int64_t ulCodePageRange();
- int32_t sxHeight();
- int32_t sCapHeight();
- int32_t usDefaultChar();
- int32_t usBreakChar();
- int32_t usMaxContext();
-
- public:
- class Builder : public Table::TableBasedTableBuilder,
- public RefCounted<Builder> {
- public:
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* data);
- virtual ~Builder();
- virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
- };
};
} // namespace sfntly
diff --git a/sfntly/port/atomic.h b/sfntly/port/atomic.h
index 4c2d65b..abfc429 100644
--- a/sfntly/port/atomic.h
+++ b/sfntly/port/atomic.h
@@ -21,7 +21,7 @@
#include <windows.h>
-static inline size_t atomicIncrement(size_t* address) {
+static inline size_t AtomicIncrement(size_t* address) {
#if defined (_WIN64)
return InterlockedIncrement64(reinterpret_cast<LONGLONG*>(address));
#else
@@ -29,7 +29,7 @@
#endif
}
-static inline size_t atomicDecrement(size_t* address) {
+static inline size_t AtomicDecrement(size_t* address) {
#if defined (_WIN64)
return InterlockedDecrement64(reinterpret_cast<LONGLONG*>(address));
#else
@@ -41,11 +41,11 @@
#include <libkern/OSAtomic.h>
-static inline size_t atomicIncrement(size_t* address) {
+static inline size_t AtomicIncrement(size_t* address) {
return OSAtomicIncrement32Barrier(reinterpret_cast<int32_t*>(address));
}
-static inline size_t atomicDecrement(size_t* address) {
+static inline size_t AtomicDecrement(size_t* address) {
return OSAtomicDecrement32Barrier(reinterpret_cast<int32_t*>(address));
}
@@ -58,11 +58,11 @@
#include <stddef.h>
-static inline size_t atomicIncrement(size_t* address) {
+static inline size_t AtomicIncrement(size_t* address) {
return __sync_add_and_fetch(address, 1);
}
-static inline size_t atomicDecrement(size_t* address) {
+static inline size_t AtomicDecrement(size_t* address) {
return __sync_sub_and_fetch(address, 1);
}
diff --git a/sfntly/port/endian.h b/sfntly/port/endian.h
index c6898ee..1364e42 100644
--- a/sfntly/port/endian.h
+++ b/sfntly/port/endian.h
@@ -22,18 +22,18 @@
namespace sfntly {
-static inline uint16_t endian_swap16(uint16_t value) {
+static inline uint16_t EndianSwap16(uint16_t value) {
return (uint16_t)((value >> 8) | (value << 8));
}
-static inline int32_t endian_swap32(int32_t value) {
+static inline int32_t EndianSwap32(int32_t value) {
return (((value & 0x000000ff) << 24) |
((value & 0x0000ff00) << 8) |
((value & 0x00ff0000) >> 8) |
((value & 0xff000000) >> 24));
}
-static inline uint64_t endian_swap64(uint64_t value) {
+static inline uint64_t EndianSwap64(uint64_t value) {
return (((value & 0x00000000000000ffLL) << 56) |
((value & 0x000000000000ff00LL) << 40) |
((value & 0x0000000000ff0000LL) << 24) |
@@ -45,31 +45,31 @@
}
#ifdef SFNTLY_LITTLE_ENDIAN
- #define toBE16(n) endian_swap16(n)
- #define toBE32(n) endian_swap32(n)
- #define toBE64(n) endian_swap64(n)
- #define toLE16(n) (n)
- #define toLE32(n) (n)
- #define toLE64(n) (n)
- #define fromBE16(n) endian_swap16(n)
- #define fromBE32(n) endian_swap32(n)
- #define fromBE64(n) endian_swap64(n)
- #define fromLE16(n) (n)
- #define fromLE32(n) (n)
- #define fromLE64(n) (n)
+ #define ToBE16(n) EndianSwap16(n)
+ #define ToBE32(n) EndianSwap32(n)
+ #define ToBE64(n) EndianSwap64(n)
+ #define ToLE16(n) (n)
+ #define ToLE32(n) (n)
+ #define ToLE64(n) (n)
+ #define FromBE16(n) EndianSwap16(n)
+ #define FromBE32(n) EndianSwap32(n)
+ #define FromBE64(n) EndianSwap64(n)
+ #define FromLE16(n) (n)
+ #define FromLE32(n) (n)
+ #define FromLE64(n) (n)
#else // SFNTLY_BIG_ENDIAN
- #define toBE16(n) (n)
- #define toBE32(n) (n)
- #define toBE64(n) (n)
- #define toLE16(n) endian_swap16(n)
- #define toLE32(n) endian_swap32(n)
- #define toLE64(n) endian_swap64(n)
- #define fromBE16(n) (n)
- #define fromBE32(n) (n)
- #define fromBE64(n) (n)
- #define fromLE16(n) endian_swap16(n)
- #define fromLE32(n) endian_swap32(n)
- #define fromLE64(n) endian_swap64(n)
+ #define ToBE16(n) (n)
+ #define ToBE32(n) (n)
+ #define ToBE64(n) (n)
+ #define ToLE16(n) EndianSwap16(n)
+ #define ToLE32(n) EndianSwap32(n)
+ #define ToLE64(n) EndianSwap64(n)
+ #define FromBE16(n) (n)
+ #define FromBE32(n) (n)
+ #define FromBE64(n) (n)
+ #define FromLE16(n) EndianSwap16(n)
+ #define FromLE32(n) EndianSwap32(n)
+ #define FromLE64(n) EndianSwap64(n)
#endif
} // namespace sfntly
diff --git a/sfntly/port/file_input_stream.cc b/sfntly/port/file_input_stream.cc
index 04a0fd6..661b6fd 100644
--- a/sfntly/port/file_input_stream.cc
+++ b/sfntly/port/file_input_stream.cc
@@ -23,38 +23,21 @@
namespace sfntly {
-FileInputStream::FileInputStream() : file_(NULL), position_(0), length_(0) {
+FileInputStream::FileInputStream()
+ : file_(NULL),
+ position_(0),
+ length_(0) {
}
FileInputStream::~FileInputStream() {
- close();
+ Close();
}
-int32_t FileInputStream::available() {
+int32_t FileInputStream::Available() {
return length_ - position_;
}
-bool FileInputStream::open(const char* file_path) {
- assert(file_path);
- if (file_) {
- close();
- }
-#if defined (WIN32)
- fopen_s(&file_, file_path, "rb");
-#else
- file_ = fopen(file_path, "rb");
-#endif
- if (file_ == NULL) {
- return false;
- }
-
- fseek(file_, 0, SEEK_END);
- length_ = ftell(file_);
- fseek(file_, 0, SEEK_SET);
- return true;
-}
-
-void FileInputStream::close() {
+void FileInputStream::Close() {
if (file_) {
fclose(file_);
length_ = 0;
@@ -63,16 +46,16 @@
}
}
-void FileInputStream::mark(int32_t readlimit) {
+void FileInputStream::Mark(int32_t readlimit) {
// NOP
UNREFERENCED_PARAMETER(readlimit);
}
-bool FileInputStream::markSupported() {
+bool FileInputStream::MarkSupported() {
return false;
}
-int32_t FileInputStream::read() {
+int32_t FileInputStream::Read() {
if (!file_) {
#if defined (SFNTLY_NO_EXCEPTION)
return 0;
@@ -93,11 +76,11 @@
return value;
}
-int32_t FileInputStream::read(ByteVector* b) {
- return read(b, 0, b->capacity());
+int32_t FileInputStream::Read(ByteVector* b) {
+ return Read(b, 0, b->capacity());
}
-int32_t FileInputStream::read(ByteVector* b, int32_t offset, int32_t length) {
+int32_t FileInputStream::Read(ByteVector* b, int32_t offset, int32_t length) {
assert(b);
if (!file_) {
#if defined (SFNTLY_NO_EXCEPTION)
@@ -122,11 +105,11 @@
return actual_read;
}
-void FileInputStream::reset() {
+void FileInputStream::Reset() {
// NOP
}
-int64_t FileInputStream::skip(int64_t n) {
+int64_t FileInputStream::Skip(int64_t n) {
if (!file_) {
#if defined (SFNTLY_NO_EXCEPTION)
return 0;
@@ -147,11 +130,11 @@
return skip_count;
}
-void FileInputStream::unread(ByteVector* b) {
- unread(b, 0, b->capacity());
+void FileInputStream::Unread(ByteVector* b) {
+ Unread(b, 0, b->capacity());
}
-void FileInputStream::unread(ByteVector* b, int32_t offset, int32_t length) {
+void FileInputStream::Unread(ByteVector* b, int32_t offset, int32_t length) {
assert(b);
assert(b->size() >= size_t(offset + length));
if (!file_) {
@@ -164,9 +147,29 @@
size_t unread_count = std::min<size_t>(position_, length);
fseek(file_, position_ - unread_count, SEEK_SET);
position_ -= unread_count;
- read(b, offset, length);
+ Read(b, offset, length);
fseek(file_, position_ - unread_count, SEEK_SET);
position_ -= unread_count;
}
+bool FileInputStream::Open(const char* file_path) {
+ assert(file_path);
+ if (file_) {
+ Close();
+ }
+#if defined (WIN32)
+ fopen_s(&file_, file_path, "rb");
+#else
+ file_ = fopen(file_path, "rb");
+#endif
+ if (file_ == NULL) {
+ return false;
+ }
+
+ fseek(file_, 0, SEEK_END);
+ length_ = ftell(file_);
+ fseek(file_, 0, SEEK_SET);
+ return true;
+}
+
} // namespace sfntly
diff --git a/sfntly/port/file_input_stream.h b/sfntly/port/file_input_stream.h
index 0ec85b6..a63726f 100644
--- a/sfntly/port/file_input_stream.h
+++ b/sfntly/port/file_input_stream.h
@@ -29,22 +29,22 @@
virtual ~FileInputStream();
// InputStream methods
- virtual int32_t available();
- virtual void close();
- virtual void mark(int32_t readlimit);
- virtual bool markSupported();
- virtual int32_t read();
- virtual int32_t read(ByteVector* b);
- virtual int32_t read(ByteVector* b, int32_t offset, int32_t length);
- virtual void reset();
- virtual int64_t skip(int64_t n);
+ virtual int32_t Available();
+ virtual void Close();
+ virtual void Mark(int32_t readlimit);
+ virtual bool MarkSupported();
+ virtual int32_t Read();
+ virtual int32_t Read(ByteVector* b);
+ virtual int32_t Read(ByteVector* b, int32_t offset, int32_t length);
+ virtual void Reset();
+ virtual int64_t Skip(int64_t n);
// PushbackInputStream methods
- virtual void unread(ByteVector* b);
- virtual void unread(ByteVector* b, int32_t offset, int32_t length);
+ virtual void Unread(ByteVector* b);
+ virtual void Unread(ByteVector* b, int32_t offset, int32_t length);
// Own methods
- virtual bool open(const char* file_path);
+ virtual bool Open(const char* file_path);
private:
FILE* file_;
diff --git a/sfntly/port/input_stream.h b/sfntly/port/input_stream.h
index ebbccf0..a56afb9 100644
--- a/sfntly/port/input_stream.h
+++ b/sfntly/port/input_stream.h
@@ -24,23 +24,24 @@
// C++ equivalent to Java's OutputStream class
class InputStream {
public:
- virtual int32_t available() = 0;
- virtual void close() = 0;
- virtual void mark(int32_t readlimit) = 0;
- virtual bool markSupported() = 0;
- virtual int32_t read() = 0;
- virtual int32_t read(ByteVector* b) = 0;
- virtual int32_t read(ByteVector* b, int32_t offset, int32_t length) = 0;
- virtual void reset() = 0;
- virtual int64_t skip(int64_t n) = 0;
// Make gcc -Wnon-virtual-dtor happy.
virtual ~InputStream() {}
+
+ virtual int32_t Available() = 0;
+ virtual void Close() = 0;
+ virtual void Mark(int32_t readlimit) = 0;
+ virtual bool MarkSupported() = 0;
+ virtual int32_t Read() = 0;
+ virtual int32_t Read(ByteVector* b) = 0;
+ virtual int32_t Read(ByteVector* b, int32_t offset, int32_t length) = 0;
+ virtual void Reset() = 0;
+ virtual int64_t Skip(int64_t n) = 0;
};
class PushbackInputStream : public InputStream {
public:
- virtual void unread(ByteVector* b) = 0;
- virtual void unread(ByteVector* b, int32_t offset, int32_t length) = 0;
+ virtual void Unread(ByteVector* b) = 0;
+ virtual void Unread(ByteVector* b, int32_t offset, int32_t length) = 0;
};
} // namespace sfntly
diff --git a/sfntly/port/memory_output_stream.cc b/sfntly/port/memory_output_stream.cc
index 1f3ecd4..5ddeec2 100644
--- a/sfntly/port/memory_output_stream.cc
+++ b/sfntly/port/memory_output_stream.cc
@@ -24,25 +24,27 @@
MemoryOutputStream::~MemoryOutputStream() {
}
-void MemoryOutputStream::write(ByteVector* buffer) {
+void MemoryOutputStream::Write(ByteVector* buffer) {
store_.insert(store_.end(), buffer->begin(), buffer->end());
}
-void MemoryOutputStream::write(ByteVector* buffer, int32_t offset,
+void MemoryOutputStream::Write(ByteVector* buffer,
+ int32_t offset,
int32_t length) {
- store_.insert(store_.end(), buffer->begin() + offset,
+ store_.insert(store_.end(),
+ buffer->begin() + offset,
buffer->begin() + offset + length);
}
-void MemoryOutputStream::write(byte_t b) {
+void MemoryOutputStream::Write(byte_t b) {
store_.push_back(b);
}
-byte_t* MemoryOutputStream::get() {
+byte_t* MemoryOutputStream::Get() {
return &(store_[0]);
}
-size_t MemoryOutputStream::size() {
+size_t MemoryOutputStream::Size() {
return store_.size();
}
diff --git a/sfntly/port/memory_output_stream.h b/sfntly/port/memory_output_stream.h
index 4a7cb74..a0befea 100644
--- a/sfntly/port/memory_output_stream.h
+++ b/sfntly/port/memory_output_stream.h
@@ -32,14 +32,14 @@
MemoryOutputStream();
virtual ~MemoryOutputStream();
- virtual void close() {} // no-op
- virtual void flush() {} // no-op
- virtual void write(ByteVector* buffer);
- virtual void write(ByteVector* buffer, int32_t offset, int32_t length);
- virtual void write(byte_t b);
+ virtual void Close() {} // no-op
+ virtual void Flush() {} // no-op
+ virtual void Write(ByteVector* buffer);
+ virtual void Write(ByteVector* buffer, int32_t offset, int32_t length);
+ virtual void Write(byte_t b);
- byte_t* get();
- size_t size();
+ byte_t* Get();
+ size_t Size();
private:
std::vector<byte_t> store_;
diff --git a/sfntly/port/output_stream.h b/sfntly/port/output_stream.h
index 0b232e2..c5d71cf 100644
--- a/sfntly/port/output_stream.h
+++ b/sfntly/port/output_stream.h
@@ -24,13 +24,14 @@
// C++ equivalent to Java's OutputStream class
class OutputStream {
public:
- virtual void close() = 0;
- virtual void flush() = 0;
- virtual void write(ByteVector* buffer) = 0;
- virtual void write(ByteVector* buffer, int32_t offset, int32_t length) = 0;
- virtual void write(byte_t b) = 0;
// Make gcc -Wnon-virtual-dtor happy.
virtual ~OutputStream() {}
+
+ virtual void Close() = 0;
+ virtual void Flush() = 0;
+ virtual void Write(ByteVector* buffer) = 0;
+ virtual void Write(ByteVector* buffer, int32_t offset, int32_t length) = 0;
+ virtual void Write(byte_t b) = 0;
};
} // namespace sfntly
diff --git a/sfntly/port/refcount.h b/sfntly/port/refcount.h
index ed1fa96..6ac09bb 100644
--- a/sfntly/port/refcount.h
+++ b/sfntly/port/refcount.h
@@ -27,16 +27,16 @@
// public:
// static Foo* CreateInstance() {
// Ptr<Foo> obj = new Foo(); // ref count = 1
-// return obj.detach();
+// return obj.Detach();
// }
// };
// typedef Ptr<Foo> FooPtr; // common short-hand notation
// FooPtr obj;
-// obj.attach(Foo::CreatedInstance()); // ref count = 1
+// obj.Attach(Foo::CreatedInstance()); // ref count = 1
// {
// FooPtr obj2 = obj; // ref count = 2
// } // ref count = 1, obj2 out of scope
-// obj.release(); // ref count = 0, object destroyed
+// obj.Release(); // ref count = 0, object destroyed
// Notes on usage:
// 1. Virtual inherit from RefCount interface in base class if smart pointers
@@ -57,10 +57,10 @@
// VC++ will generate SEH which is not handled well in VC++ debugger. One
// can use WinDBG to run it and get the faulting stack.
// 6. Idioms for heap object as return value
-// Foo* createFoo() { FooPtr obj = new Foo(); return obj.detach(); }
+// Foo* createFoo() { FooPtr obj = new Foo(); return obj.Detach(); }
// Foo* passthru() { FooPtr obj = createFoo(), return obj; }
// FooPtr end_scope_pointer;
-// end_scope_pointer.attach(passThrough);
+// end_scope_pointer.Attach(passThrough);
// If you are not passing that object back, you are the end of scope.
#ifndef TYPOGRAPHY_FONT_SFNTLY_SRC_SFNTLY_PORT_REFCOUNT_H_
@@ -101,10 +101,11 @@
class RefCount {
public:
- virtual size_t addRef() const = 0;
- virtual size_t release() const = 0;
// Make gcc -Wnon-virtual-dtor happy.
virtual ~RefCount() {}
+
+ virtual size_t AddRef() const = 0;
+ virtual size_t Release() const = 0;
};
template <typename T>
@@ -114,8 +115,8 @@
~NoAddRefRelease();
private:
- virtual size_t addRef() const = 0;
- virtual size_t release() const = 0;
+ virtual size_t AddRef() const = 0;
+ virtual size_t Release() const = 0;
};
template <typename TDerived>
@@ -123,15 +124,15 @@
public:
RefCounted() : ref_count_(0) {
#if defined (ENABLE_OBJECT_COUNTER)
- object_id_ = atomicIncrement(&next_id_);
- atomicIncrement(&object_counter_);
+ object_id_ = AtomicIncrement(&next_id_);
+ AtomicIncrement(&object_counter_);
DEBUG_OUTPUT("C ");
#endif
}
RefCounted(const RefCounted<TDerived>&) : ref_count_(0) {}
virtual ~RefCounted() {
#if defined (ENABLE_OBJECT_COUNTER)
- atomicDecrement(&object_counter_);
+ AtomicDecrement(&object_counter_);
DEBUG_OUTPUT("D ");
#endif
}
@@ -141,14 +142,14 @@
return *this;
}
- virtual size_t addRef() const {
- size_t new_count = atomicIncrement(&ref_count_);
+ virtual size_t AddRef() const {
+ size_t new_count = AtomicIncrement(&ref_count_);
DEBUG_OUTPUT("A ");
return new_count;
}
- virtual size_t release() const {
- size_t new_ref_count = atomicDecrement(&ref_count_);
+ virtual size_t Release() const {
+ size_t new_ref_count = AtomicDecrement(&ref_count_);
DEBUG_OUTPUT("R ");
if (new_ref_count == 0) {
// A C-style is used to cast away const-ness and to derived.
@@ -189,7 +190,7 @@
}
~Ptr() {
- release();
+ Release();
}
T* operator=(T* pT) {
@@ -201,9 +202,9 @@
if (p == NULL) {
return NULL;
}
- p->addRef(); // always addRef() before release()
+ p->AddRef(); // always AddRef() before Release()
}
- release();
+ Release();
p_ = pT;
return p_;
}
@@ -243,26 +244,26 @@
return (p_ == pT);
}
- size_t release() const {
+ size_t Release() const {
size_t ref_count = 0;
if (p_) {
RefCount* p = static_cast<RefCount*>(p_);
if (p) {
- ref_count = p->release();
+ ref_count = p->Release();
}
p_ = NULL;
}
return ref_count;
}
- void attach(T* pT) {
+ void Attach(T* pT) {
if (p_ != pT) {
- release();
+ Release();
p_ = pT;
}
}
- T* detach() {
+ T* Detach() {
T* pT = p_;
p_ = NULL;
return pT;
diff --git a/sfntly/subtable.cc b/sfntly/subtable.cc
index 9ca94f3..782fd80 100644
--- a/sfntly/subtable.cc
+++ b/sfntly/subtable.cc
@@ -20,24 +20,25 @@
/******************************************************************************
* SubTable class
******************************************************************************/
-SubTable::SubTable(ReadableFontData* data) : FontDataTable(data) {
-}
-
SubTable::~SubTable() {}
+SubTable::SubTable(ReadableFontData* data)
+ : FontDataTable(data) {
+}
+
/******************************************************************************
* SubTable::Builder class
******************************************************************************/
-SubTable::Builder::Builder(FontDataTableBuilderContainer* container,
- WritableFontData* data) :
- FontDataTable::Builder(container, data) {
-}
-
-SubTable::Builder::Builder(FontDataTableBuilderContainer* container,
- ReadableFontData* data) :
- FontDataTable::Builder(container, data) {
-}
-
SubTable::Builder::~Builder() {}
+SubTable::Builder::Builder(FontDataTableBuilderContainer* container,
+ WritableFontData* data)
+ : FontDataTable::Builder(container, data) {
+}
+
+SubTable::Builder::Builder(FontDataTableBuilderContainer* container,
+ ReadableFontData* data)
+ : FontDataTable::Builder(container, data) {
+}
+
} // namespace sfntly
diff --git a/sfntly/subtable.h b/sfntly/subtable.h
index 23e1e42..30ecf66 100644
--- a/sfntly/subtable.h
+++ b/sfntly/subtable.h
@@ -26,23 +26,22 @@
// of these are the CMap subtables within CMap table (cmap) or a glyph within
// the glyph table (glyf).
class SubTable : public FontDataTable {
- protected:
- // Note: constructor refactored in C++ to avoid heavy lifting.
- // caller need to do data->slice(offset, length) beforehand.
- explicit SubTable(ReadableFontData* data);
-
- public:
- virtual ~SubTable();
-
public:
class Builder : public FontDataTable::Builder {
+ public:
+ virtual ~Builder();
+
protected:
Builder(FontDataTableBuilderContainer* container, WritableFontData* data);
Builder(FontDataTableBuilderContainer* container, ReadableFontData* data);
-
- public:
- virtual ~Builder();
};
+
+ virtual ~SubTable();
+
+ protected:
+ // Note: constructor refactored in C++ to avoid heavy lifting.
+ // caller need to do data->Slice(offset, length) beforehand.
+ explicit SubTable(ReadableFontData* data);
};
} // namespace sfntly
diff --git a/sfntly/table.cc b/sfntly/table.cc
index 8a1ec02..a11177e 100644
--- a/sfntly/table.cc
+++ b/sfntly/table.cc
@@ -15,6 +15,7 @@
*/
#include "sfntly/table.h"
+
#include "sfntly/font.h"
#include "sfntly/tag.h"
#include "sfntly/cmap_table.h"
@@ -32,61 +33,56 @@
/******************************************************************************
* Table class
******************************************************************************/
-Table::Table(Header* header, ReadableFontData* data) : FontDataTable(data) {
- header_ = header;
-}
-
Table::~Table() {}
-int64_t Table::calculatedChecksum() {
- return data_->checksum();
+int64_t Table::CalculatedChecksum() {
+ return data_->Checksum();
}
-Table::Header* Table::header() {
- return header_;
+WritableFontData* Table::GetNewData(int32_t size) {
+ return font_->GetNewData(size);
}
-int32_t Table::headerTag() {
- return header_->tag();
-}
-
-int32_t Table::headerOffset() {
- return header_->offset();
-}
-
-int32_t Table::headerLength() {
- return header_->length();
-}
-
-int64_t Table::headerChecksum() {
- return header_->checksum();
-}
-
-WritableFontData* Table::getNewData(int32_t size) {
- return font_->getNewData(size);
-}
-
-void Table::setFont(Font* font) {
+void Table::SetFont(Font* font) {
font_ = font;
}
+Table::Table(Header* header, ReadableFontData* data)
+ : FontDataTable(data) {
+ header_ = header;
+}
+
/******************************************************************************
* Table::Header class
******************************************************************************/
Table::Header::Header(int32_t tag)
- : tag_(tag), offset_(0), length_(0), offset_valid_(false), checksum_(0),
+ : tag_(tag),
+ offset_(0),
+ length_(0),
+ offset_valid_(false),
+ checksum_(0),
checksum_valid_(false) {
}
Table::Header::Header(int32_t tag, int32_t length)
- : tag_(tag), offset_(0), length_(length), offset_valid_(false),
- checksum_(0), checksum_valid_(false) {
+ : tag_(tag),
+ offset_(0),
+ length_(length),
+ offset_valid_(false),
+ checksum_(0),
+ checksum_valid_(false) {
}
-Table::Header::Header(int32_t tag, int64_t checksum, int32_t offset,
+Table::Header::Header(int32_t tag,
+ int64_t checksum,
+ int32_t offset,
int32_t length)
- : tag_(tag), offset_(offset), length_(length), offset_valid_(true),
- checksum_(checksum), checksum_valid_(true) {
+ : tag_(tag),
+ offset_(offset),
+ length_(length),
+ offset_valid_(true),
+ checksum_(checksum),
+ checksum_valid_(true) {
}
Table::Header::~Header() {}
@@ -96,58 +92,30 @@
return lhs->offset_ > rhs->offset_;
}
-int32_t Table::Header::tag() { return tag_; }
-int32_t Table::Header::offset() { return offset_; }
-int32_t Table::Header::length() { return length_; }
-bool Table::Header::offsetValid() { return offset_valid_; }
-int64_t Table::Header::checksum() { return checksum_; }
-bool Table::Header::checksumValid() { return checksum_valid_; }
-
/******************************************************************************
* Table::Builder class
******************************************************************************/
-Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
- Header* header, WritableFontData* data) :
- FontDataTable::Builder(font_builder, data) {
- header_ = header;
-}
-
-Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
- Header* header, ReadableFontData* data) :
- FontDataTable::Builder(font_builder, data) {
- header_ = header;
-}
-
-Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
- Header* header) :
- FontDataTable::Builder(font_builder) {
- header_ = header;
-}
-
Table::Builder::~Builder() {
- header_.release();
+ header_.Release();
}
-Table::Header* Table::Builder::header() {
- return header_;
-}
-
-void Table::Builder::notifyPostTableBuild(FontDataTable* table) {
- if (modelChanged() || dataChanged()) {
+void Table::Builder::NotifyPostTableBuild(FontDataTable* table) {
+ if (modelChanged() || data_changed()) {
Table* derived_table = down_cast<Table*>(table);
header_ = new Header(header()->tag(),
- derived_table->readFontData()->length());
+ derived_table->ReadFontData()->Length());
}
}
-WritableFontData* Table::Builder::getNewData(int32_t size) {
+WritableFontData* Table::Builder::GetNewData(int32_t size) {
UNREFERENCED_PARAMETER(size);
- return internalWriteData();
+ return InternalWriteData();
}
-CALLER_ATTACH Table::Builder* Table::Builder::getBuilder(
- FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* table_data) {
+CALLER_ATTACH Table::Builder*
+ Table::Builder::GetBuilder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* table_data) {
int32_t tag = header->tag();
TableBuilderPtr builder;
Table::Builder* builder_raw = NULL;
@@ -199,77 +167,113 @@
}
builder = builder_raw;
- return builder.detach();
+ return builder.Detach();
+}
+
+Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data)
+ : FontDataTable::Builder(font_builder, data) {
+ header_ = header;
+}
+
+Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data)
+ : FontDataTable::Builder(font_builder, data) {
+ header_ = header;
+}
+
+Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header)
+ : FontDataTable::Builder(font_builder) {
+ header_ = header;
}
/******************************************************************************
* Table::TableBasedTableBuilder class
******************************************************************************/
-Table::TableBasedTableBuilder::TableBasedTableBuilder(
- FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* data) : Builder(font_builder, header, data) {}
-
-Table::TableBasedTableBuilder::TableBasedTableBuilder(
- FontDataTableBuilderContainer* font_builder, Header* header,
- ReadableFontData* data) : Builder(font_builder, header, data) {}
-
-Table::TableBasedTableBuilder::TableBasedTableBuilder(
- FontDataTableBuilderContainer* font_builder, Header* header) :
- Builder(font_builder, header) {}
-
Table::TableBasedTableBuilder::~TableBasedTableBuilder() {}
-Table* Table::TableBasedTableBuilder::table() {
- if (table_ == NULL) {
- table_.attach(down_cast<Table*>(subBuildTable(internalReadData())));
- }
- return table_;
-}
-
-void Table::TableBasedTableBuilder::subDataSet() {
- table_ = NULL;
-}
-
-int32_t Table::TableBasedTableBuilder::subDataSizeToSerialize() {
+int32_t Table::TableBasedTableBuilder::SubSerialize(WritableFontData* data) {
+ UNREFERENCED_PARAMETER(data);
return 0;
}
-bool Table::TableBasedTableBuilder::subReadyToSerialize() {
+bool Table::TableBasedTableBuilder::SubReadyToSerialize() {
return false;
}
-int32_t Table::TableBasedTableBuilder::subSerialize(WritableFontData* data) {
- UNREFERENCED_PARAMETER(data);
+int32_t Table::TableBasedTableBuilder::SubDataSizeToSerialize() {
return 0;
}
+void Table::TableBasedTableBuilder::SubDataSet() {
+ table_ = NULL;
+}
+
+Table::TableBasedTableBuilder::TableBasedTableBuilder(
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data)
+ : Builder(font_builder, header, data) {
+}
+
+Table::TableBasedTableBuilder::TableBasedTableBuilder(
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data)
+ : Builder(font_builder, header, data) {
+}
+
+Table::TableBasedTableBuilder::TableBasedTableBuilder(
+ FontDataTableBuilderContainer* font_builder,
+ Header* header)
+ : Builder(font_builder, header) {
+}
+
+Table* Table::TableBasedTableBuilder::GetTable() {
+ if (table_ == NULL) {
+ table_.Attach(down_cast<Table*>(SubBuildTable(InternalReadData())));
+ }
+ return table_;
+}
+
/******************************************************************************
* Table::GenericTableBuilder class
******************************************************************************/
Table::GenericTableBuilder::GenericTableBuilder(
- FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* data) :
- TableBasedTableBuilder(font_builder, header, data) {}
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data)
+ : TableBasedTableBuilder(font_builder, header, data) {
+}
-CALLER_ATTACH FontDataTable* Table::GenericTableBuilder::subBuildTable(
- ReadableFontData* data) {
+CALLER_ATTACH FontDataTable*
+ Table::GenericTableBuilder::SubBuildTable(ReadableFontData* data) {
// Note: In C++ port, we use GenericTable, the ref-counted version of Table
UNREFERENCED_PARAMETER(data);
- FontDataTablePtr table = new GenericTable(this->header(), internalReadData());
- return table.detach();
+ FontDataTablePtr table = new GenericTable(this->header(), InternalReadData());
+ return table.Detach();
}
/******************************************************************************
* Table::ArrayElementTableBuilder class
******************************************************************************/
-Table::ArrayElementTableBuilder::ArrayElementTableBuilder(
- FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* data) : Builder(font_builder, header, data) {}
-
-Table::ArrayElementTableBuilder::ArrayElementTableBuilder(
- FontDataTableBuilderContainer* font_builder, Header* header,
- ReadableFontData* data) : Builder(font_builder, header, data) {}
-
Table::ArrayElementTableBuilder::~ArrayElementTableBuilder() {}
+Table::ArrayElementTableBuilder::ArrayElementTableBuilder(
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data)
+ : Builder(font_builder, header, data) {
+}
+
+Table::ArrayElementTableBuilder::ArrayElementTableBuilder(
+ FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data)
+ : Builder(font_builder, header, data) {
+}
+
} // namespace sfntly
diff --git a/sfntly/table.h b/sfntly/table.h
index 9f05ef5..217abcd 100644
--- a/sfntly/table.h
+++ b/sfntly/table.h
@@ -36,13 +36,12 @@
Header(int32_t tag, int64_t checksum, int32_t offset, int32_t length);
virtual ~Header();
- public: // class is final, no virtual functions unless from parent
- int32_t tag();
- int32_t offset();
- int32_t length();
- bool offsetValid();
- int64_t checksum();
- bool checksumValid();
+ int32_t tag() { return tag_; }
+ int32_t offset() { return offset_; }
+ int32_t length() { return length_; }
+ bool offset_valid() { return offset_valid_; }
+ int64_t checksum() { return checksum_; }
+ bool checksum_valid() { return checksum_valid_; }
private:
int32_t tag_;
@@ -60,89 +59,95 @@
// chosen.
class Builder : public FontDataTable::Builder,
public FontDataTableBuilderContainer {
+ public:
+ virtual ~Builder();
+ virtual Header* header() { return header_; }
+ virtual void NotifyPostTableBuild(FontDataTable* table);
+ virtual WritableFontData* GetNewData(int32_t size);
+
+ static CALLER_ATTACH Builder*
+ GetBuilder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* table_data);
+
protected:
// Note: original version is Font.Builder font_builder. This results in
// mutual inclusion happiness that Java solved for C++. Therefore,
// we need to avoid that happiness when we port it to C++.
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+ Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
WritableFontData* data);
- Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+ Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
ReadableFontData* data);
- Builder(FontDataTableBuilderContainer* font_builder, Header* header);
-
- public:
- virtual ~Builder();
- virtual Header* header();
- virtual void notifyPostTableBuild(FontDataTable* table);
- virtual WritableFontData* getNewData(int32_t size);
-
- public:
- static CALLER_ATTACH Builder* getBuilder(
- FontDataTableBuilderContainer* font_builder, Header* header,
- WritableFontData* table_data);
+ Builder(FontDataTableBuilderContainer* font_builder,
+ Header* header);
private:
Ptr<Header> header_;
};
class TableBasedTableBuilder : public Builder {
- protected:
- TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
- Header* header, WritableFontData* data);
- TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
- Header* header, ReadableFontData* data);
- TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
- Header* header);
public:
virtual ~TableBasedTableBuilder();
- protected:
- virtual Table* table();
-
- public:
- virtual int32_t subSerialize(WritableFontData* new_data);
- virtual bool subReadyToSerialize();
- virtual int32_t subDataSizeToSerialize();
- virtual void subDataSet();
+ virtual int32_t SubSerialize(WritableFontData* new_data);
+ virtual bool SubReadyToSerialize();
+ virtual int32_t SubDataSizeToSerialize();
+ virtual void SubDataSet();
protected:
+ TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data);
+ TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data);
+ TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
+ Header* header);
+
+ // C++ port: renamed table() to GetTable()
+ virtual Table* GetTable();
+
+ // TODO(arthurhsu): style guide violation: protected member, need refactor
Ptr<Table> table_;
};
class GenericTableBuilder : public TableBasedTableBuilder,
- public RefCounted<GenericTableBuilder> {
+ public RefCounted<GenericTableBuilder> {
public:
GenericTableBuilder(FontDataTableBuilderContainer* font_builder,
- Header* header, WritableFontData* data);
- virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
+ Header* header,
+ WritableFontData* data);
+ virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
};
class ArrayElementTableBuilder : public Builder {
- protected:
- ArrayElementTableBuilder(FontDataTableBuilderContainer* font_builder,
- Header* header, WritableFontData* data);
- ArrayElementTableBuilder(FontDataTableBuilderContainer* font_builder,
- Header* header, ReadableFontData* data);
public:
virtual ~ArrayElementTableBuilder();
+
+ protected:
+ ArrayElementTableBuilder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ WritableFontData* data);
+ ArrayElementTableBuilder(FontDataTableBuilderContainer* font_builder,
+ Header* header,
+ ReadableFontData* data);
};
+ virtual ~Table();
+ virtual int64_t CalculatedChecksum();
+ virtual Header* header() { return header_; }
+ virtual int32_t header_tag() { return header_->tag(); }
+ virtual int32_t header_offset() { return header_->offset(); }
+ virtual int32_t header_length() { return header_->length(); }
+ virtual int64_t header_checksum() { return header_->checksum(); }
+ virtual WritableFontData* GetNewData(int32_t size);
+ virtual void SetFont(Font* font);
+
protected:
Table(Header* header, ReadableFontData* data);
- public:
- virtual ~Table();
- virtual int64_t calculatedChecksum();
- virtual Header* header();
- virtual int32_t headerTag();
- virtual int32_t headerOffset();
- virtual int32_t headerLength();
- virtual int64_t headerChecksum();
-
- public: // FontDataTableBuilderContainer, deprecated
- virtual WritableFontData* getNewData(int32_t size);
- virtual void setFont(Font* font);
-
private:
Ptr<Header> header_;
Ptr<Font> font_;
diff --git a/sfntly/tag.cc b/sfntly/tag.cc
index 257e65f..e3c11cd 100644
--- a/sfntly/tag.cc
+++ b/sfntly/tag.cc
@@ -19,42 +19,42 @@
namespace sfntly {
-const int32_t Tag::ttcf = generate_tag('t', 't', 'c', 'f');
-const int32_t Tag::cmap = generate_tag('c', 'm', 'a', 'p');
-const int32_t Tag::head = generate_tag('h', 'e', 'a', 'd');
-const int32_t Tag::hhea = generate_tag('h', 'h', 'e', 'a');
-const int32_t Tag::hmtx = generate_tag('h', 'm', 't', 'x');
-const int32_t Tag::maxp = generate_tag('m', 'a', 'x', 'p');
-const int32_t Tag::name = generate_tag('n', 'a', 'm', 'e');
-const int32_t Tag::OS_2 = generate_tag('O', 'S', '/', '2');
-const int32_t Tag::post = generate_tag('p', 'o', 's', 't');
-const int32_t Tag::cvt = generate_tag('c', 'v', 't', ' ');
-const int32_t Tag::fpgm = generate_tag('f', 'p', 'g', 'm');
-const int32_t Tag::glyf = generate_tag('g', 'l', 'y', 'f');
-const int32_t Tag::loca = generate_tag('l', 'o', 'c', 'a');
-const int32_t Tag::prep = generate_tag('p', 'r', 'e', 'p');
-const int32_t Tag::CFF = generate_tag('C', 'F', 'F', ' ');
-const int32_t Tag::VORG = generate_tag('V', 'O', 'R', 'G');
-const int32_t Tag::EBDT = generate_tag('E', 'B', 'D', 'T');
-const int32_t Tag::EBLC = generate_tag('E', 'B', 'L', 'C');
-const int32_t Tag::EBSC = generate_tag('E', 'B', 'S', 'C');
-const int32_t Tag::BASE = generate_tag('B', 'A', 'S', 'E');
-const int32_t Tag::GDEF = generate_tag('G', 'D', 'E', 'F');
-const int32_t Tag::GPOS = generate_tag('G', 'P', 'O', 'S');
-const int32_t Tag::GSUB = generate_tag('G', 'S', 'U', 'B');
-const int32_t Tag::JSTF = generate_tag('J', 'S', 'T', 'F');
-const int32_t Tag::DSIG = generate_tag('D', 'S', 'I', 'G');
-const int32_t Tag::gasp = generate_tag('g', 'a', 's', 'p');
-const int32_t Tag::hdmx = generate_tag('h', 'd', 'm', 'x');
-const int32_t Tag::kern = generate_tag('k', 'e', 'r', 'n');
-const int32_t Tag::LTSH = generate_tag('L', 'T', 'S', 'H');
-const int32_t Tag::PCLT = generate_tag('P', 'C', 'L', 'T');
-const int32_t Tag::VDMX = generate_tag('V', 'D', 'M', 'X');
-const int32_t Tag::vhea = generate_tag('v', 'h', 'e', 'a');
-const int32_t Tag::vmtx = generate_tag('v', 'm', 't', 'x');
-const int32_t Tag::bhed = generate_tag('b', 'h', 'e', 'd');
-const int32_t Tag::bdat = generate_tag('b', 'd', 'a', 't');
-const int32_t Tag::bloc = generate_tag('b', 'l', 'o', 'c');
+const int32_t Tag::ttcf = GenerateTag('t', 't', 'c', 'f');
+const int32_t Tag::cmap = GenerateTag('c', 'm', 'a', 'p');
+const int32_t Tag::head = GenerateTag('h', 'e', 'a', 'd');
+const int32_t Tag::hhea = GenerateTag('h', 'h', 'e', 'a');
+const int32_t Tag::hmtx = GenerateTag('h', 'm', 't', 'x');
+const int32_t Tag::maxp = GenerateTag('m', 'a', 'x', 'p');
+const int32_t Tag::name = GenerateTag('n', 'a', 'm', 'e');
+const int32_t Tag::OS_2 = GenerateTag('O', 'S', '/', '2');
+const int32_t Tag::post = GenerateTag('p', 'o', 's', 't');
+const int32_t Tag::cvt = GenerateTag('c', 'v', 't', ' ');
+const int32_t Tag::fpgm = GenerateTag('f', 'p', 'g', 'm');
+const int32_t Tag::glyf = GenerateTag('g', 'l', 'y', 'f');
+const int32_t Tag::loca = GenerateTag('l', 'o', 'c', 'a');
+const int32_t Tag::prep = GenerateTag('p', 'r', 'e', 'p');
+const int32_t Tag::CFF = GenerateTag('C', 'F', 'F', ' ');
+const int32_t Tag::VORG = GenerateTag('V', 'O', 'R', 'G');
+const int32_t Tag::EBDT = GenerateTag('E', 'B', 'D', 'T');
+const int32_t Tag::EBLC = GenerateTag('E', 'B', 'L', 'C');
+const int32_t Tag::EBSC = GenerateTag('E', 'B', 'S', 'C');
+const int32_t Tag::BASE = GenerateTag('B', 'A', 'S', 'E');
+const int32_t Tag::GDEF = GenerateTag('G', 'D', 'E', 'F');
+const int32_t Tag::GPOS = GenerateTag('G', 'P', 'O', 'S');
+const int32_t Tag::GSUB = GenerateTag('G', 'S', 'U', 'B');
+const int32_t Tag::JSTF = GenerateTag('J', 'S', 'T', 'F');
+const int32_t Tag::DSIG = GenerateTag('D', 'S', 'I', 'G');
+const int32_t Tag::gasp = GenerateTag('g', 'a', 's', 'p');
+const int32_t Tag::hdmx = GenerateTag('h', 'd', 'm', 'x');
+const int32_t Tag::kern = GenerateTag('k', 'e', 'r', 'n');
+const int32_t Tag::LTSH = GenerateTag('L', 'T', 'S', 'H');
+const int32_t Tag::PCLT = GenerateTag('P', 'C', 'L', 'T');
+const int32_t Tag::VDMX = GenerateTag('V', 'D', 'M', 'X');
+const int32_t Tag::vhea = GenerateTag('v', 'h', 'e', 'a');
+const int32_t Tag::vmtx = GenerateTag('v', 'm', 't', 'x');
+const int32_t Tag::bhed = GenerateTag('b', 'h', 'e', 'd');
+const int32_t Tag::bdat = GenerateTag('b', 'd', 'a', 't');
+const int32_t Tag::bloc = GenerateTag('b', 'l', 'o', 'c');
const int32_t CFF_TABLE_ORDERING[] = {
Tag::head,
diff --git a/sfntly/tag.h b/sfntly/tag.h
index fe6da46..9e73007 100644
--- a/sfntly/tag.h
+++ b/sfntly/tag.h
@@ -82,7 +82,7 @@
static const int32_t bloc;
};
-inline int32_t generate_tag(char a, char b, char c, char d) {
+inline int32_t GenerateTag(char a, char b, char c, char d) {
return (((int32_t)(a) << 24) |
((int32_t)(b) << 16) |
((int32_t)(c) << 8) |
diff --git a/sfntly/tools/subsetter.cc b/sfntly/tools/subsetter.cc
index 44ba22e..c234a1e 100644
--- a/sfntly/tools/subsetter.cc
+++ b/sfntly/tools/subsetter.cc
@@ -14,10 +14,11 @@
* limitations under the License.
*/
+#include "sfntly/tools/subsetter/subsetter.h"
+
#include <algorithm>
#include <iterator>
-#include "sfntly/tools/subsetter/subsetter.h"
#include "sfntly/tools/subsetter/glyph_table_subsetter.h"
namespace sfntly {
@@ -31,32 +32,32 @@
}
Subsetter::~Subsetter() {
- font_factory_.release();
- font_.release();
+ font_factory_.Release();
+ font_.Release();
table_subsetters_.clear();
}
-void Subsetter::setGlyphs(IntegerList* glyphs) {
+void Subsetter::SetGlyphs(IntegerList* glyphs) {
new_to_old_glyphs_ = *glyphs;
}
-void Subsetter::setCMaps(CMapIdList* cmap_ids, int32_t number) {
+void Subsetter::SetCMaps(CMapIdList* cmap_ids, int32_t number) {
UNREFERENCED_PARAMETER(cmap_ids);
UNREFERENCED_PARAMETER(number);
// TODO(arthurhsu): IMPLEMENT
}
-void Subsetter::setRemoveTables(IntegerSet* remove_tables) {
+void Subsetter::SetRemoveTables(IntegerSet* remove_tables) {
remove_tables_ = *remove_tables;
}
-CALLER_ATTACH Font::Builder* Subsetter::subset() {
+CALLER_ATTACH Font::Builder* Subsetter::Subset() {
FontBuilderPtr font_builder;
- font_builder.attach(font_factory_->newFontBuilder());
+ font_builder.Attach(font_factory_->NewFontBuilder());
IntegerSet table_tags;
- for (TableMap::iterator i = font_->tables()->begin(),
- e = font_->tables()->end(); i != e; ++i) {
+ for (TableMap::iterator i = font_->Tables()->begin(),
+ e = font_->Tables()->end(); i != e; ++i) {
table_tags.insert(i->first);
}
if (!remove_tables_.empty()) {
@@ -70,9 +71,9 @@
table_subsetter = table_subsetters_.begin(),
table_subsetter_end = table_subsetters_.end();
table_subsetter != table_subsetter_end; ++table_subsetter) {
- bool handled = (*table_subsetter)->subset(this, font_, font_builder);
+ bool handled = (*table_subsetter)->Subset(this, font_, font_builder);
if (handled) {
- IntegerSet* handled_tags = (*table_subsetter)->tagsHandled();
+ IntegerSet* handled_tags = (*table_subsetter)->TagsHandled();
IntegerSet result;
std::set_difference(table_tags.begin(), table_tags.end(),
handled_tags->begin(), handled_tags->end(),
@@ -82,24 +83,24 @@
}
for (IntegerSet::iterator tag = table_tags.begin(),
tag_end = table_tags.end(); tag != tag_end; ++tag) {
- Table* table = font_->table(*tag);
+ Table* table = font_->GetTable(*tag);
if (table) {
- // The newTableBuilder() call will alter internal state of font_builder
+ // The NewTableBuilder() call will alter internal state of font_builder
// AND the reference count of returned object. Therefore we need to
// dereference it.
TableBuilderPtr dereference;
- dereference.attach(
- font_builder->newTableBuilder(*tag, table->readFontData()));
+ dereference.Attach(
+ font_builder->NewTableBuilder(*tag, table->ReadFontData()));
}
}
- return font_builder.detach();
+ return font_builder.Detach();
}
-IntegerList* Subsetter::glyphPermutationTable() {
+IntegerList* Subsetter::GlyphPermutationTable() {
return &new_to_old_glyphs_;
}
-CMapIdList* Subsetter::cmapId() {
+CMapIdList* Subsetter::CMapId() {
return &cmap_ids_;
}
diff --git a/sfntly/tools/subsetter/glyph_table_subsetter.cc b/sfntly/tools/subsetter/glyph_table_subsetter.cc
index 04d0c48..7609f74 100644
--- a/sfntly/tools/subsetter/glyph_table_subsetter.cc
+++ b/sfntly/tools/subsetter/glyph_table_subsetter.cc
@@ -14,11 +14,12 @@
* limitations under the License.
*/
+#include "sfntly/tools/subsetter/glyph_table_subsetter.h"
+
#include "sfntly/tag.h"
#include "sfntly/glyph_table.h"
#include "sfntly/loca_table.h"
#include "sfntly/tools/subsetter/subsetter.h"
-#include "sfntly/tools/subsetter/glyph_table_subsetter.h"
#include "sfntly/port/exception_type.h"
namespace sfntly {
@@ -31,18 +32,19 @@
GlyphTableSubsetter::~GlyphTableSubsetter() {}
-bool GlyphTableSubsetter::subset(Subsetter* subsetter, Font* font,
+bool GlyphTableSubsetter::Subset(Subsetter* subsetter,
+ Font* font,
Font::Builder* font_builder) {
assert(font);
assert(subsetter);
assert(font_builder);
- IntegerList* permutation_table = subsetter->glyphPermutationTable();
+ IntegerList* permutation_table = subsetter->GlyphPermutationTable();
if (!permutation_table || permutation_table->empty())
return false;
- GlyphTablePtr glyph_table = down_cast<GlyphTable*>(font->table(Tag::glyf));
- LocaTablePtr loca_table = down_cast<LocaTable*>(font->table(Tag::loca));
+ GlyphTablePtr glyph_table = down_cast<GlyphTable*>(font->GetTable(Tag::glyf));
+ LocaTablePtr loca_table = down_cast<LocaTable*>(font->GetTable(Tag::loca));
if (glyph_table == NULL || loca_table == NULL) {
#if defined (SFNTLY_NO_EXCEPTION)
return false;
@@ -52,11 +54,11 @@
}
GlyphTableBuilderPtr glyph_table_builder;
- glyph_table_builder.attach(down_cast<GlyphTable::Builder*>(
- font_builder->newTableBuilder(Tag::glyf)));
+ glyph_table_builder.Attach(down_cast<GlyphTable::Builder*>(
+ font_builder->NewTableBuilder(Tag::glyf)));
LocaTableBuilderPtr loca_table_builder;
- loca_table_builder.attach(down_cast<LocaTable::Builder*>(
- font_builder->newTableBuilder(Tag::loca)));
+ loca_table_builder.Attach(down_cast<LocaTable::Builder*>(
+ font_builder->NewTableBuilder(Tag::loca)));
if (glyph_table_builder == NULL || loca_table_builder == NULL) {
#if defined (SFNTLY_NO_EXCEPTION)
return false;
@@ -65,25 +67,25 @@
#endif
}
GlyphTable::GlyphBuilderList* glyph_builders =
- glyph_table_builder->glyphBuilders();
+ glyph_table_builder->GlyphBuilders();
for (IntegerList::iterator old_glyph_id = permutation_table->begin(),
old_glyph_id_end = permutation_table->end();
old_glyph_id != old_glyph_id_end; ++old_glyph_id) {
- int old_offset = loca_table->glyphOffset(*old_glyph_id);
- int old_length = loca_table->glyphLength(*old_glyph_id);
+ int old_offset = loca_table->GlyphOffset(*old_glyph_id);
+ int old_length = loca_table->GlyphLength(*old_glyph_id);
GlyphPtr glyph;
- glyph.attach(glyph_table->glyph(old_offset, old_length));
- ReadableFontDataPtr data = glyph->readFontData();
+ glyph.Attach(glyph_table->GetGlyph(old_offset, old_length));
+ ReadableFontDataPtr data = glyph->ReadFontData();
WritableFontDataPtr copy_data;
- copy_data.attach(font_builder->getNewData(data->length()));
- data->copyTo(copy_data);
+ copy_data.Attach(font_builder->GetNewData(data->Length()));
+ data->CopyTo(copy_data);
GlyphBuilderPtr glyph_builder;
- glyph_builder.attach(glyph_table_builder->glyphBuilder(copy_data));
+ glyph_builder.Attach(glyph_table_builder->GlyphBuilder(copy_data));
glyph_builders->push_back(glyph_builder);
}
IntegerList loca_list;
- glyph_table_builder->generateLocaList(&loca_list);
- loca_table_builder->setLocaList(&loca_list);
+ glyph_table_builder->GenerateLocaList(&loca_list);
+ loca_table_builder->SetLocaList(&loca_list);
return true;
}
diff --git a/sfntly/tools/subsetter/glyph_table_subsetter.h b/sfntly/tools/subsetter/glyph_table_subsetter.h
index 14e3c3d..3687e27 100644
--- a/sfntly/tools/subsetter/glyph_table_subsetter.h
+++ b/sfntly/tools/subsetter/glyph_table_subsetter.h
@@ -27,7 +27,8 @@
GlyphTableSubsetter();
virtual ~GlyphTableSubsetter();
- virtual bool subset(Subsetter* subsetter, Font* font,
+ virtual bool Subset(Subsetter* subsetter,
+ Font* font,
Font::Builder* font_builder);
};
diff --git a/sfntly/tools/subsetter/subsetter.h b/sfntly/tools/subsetter/subsetter.h
index 01308b5..df417ad 100644
--- a/sfntly/tools/subsetter/subsetter.h
+++ b/sfntly/tools/subsetter/subsetter.h
@@ -31,7 +31,7 @@
Subsetter(Font* font, FontFactory* font_factory);
virtual ~Subsetter();
- virtual void setGlyphs(IntegerList* glyphs);
+ virtual void SetGlyphs(IntegerList* glyphs);
// Set the cmaps to be used in the subsetted font. The cmaps are listed in
// order of priority and the number parameter gives a count of how many of the
@@ -49,12 +49,12 @@
// into the subsetted font.
// @param cmapIds the cmap ids to use for the subsetted font
// @param number the maximum number of cmaps to place in the subsetted font
- virtual void setCMaps(CMapIdList* cmap_ids, int32_t number);
+ virtual void SetCMaps(CMapIdList* cmap_ids, int32_t number);
- virtual void setRemoveTables(IntegerSet* remove_tables);
- virtual CALLER_ATTACH Font::Builder* subset();
- virtual IntegerList* glyphPermutationTable();
- virtual CMapIdList* cmapId();
+ virtual void SetRemoveTables(IntegerSet* remove_tables);
+ virtual CALLER_ATTACH Font::Builder* Subset();
+ virtual IntegerList* GlyphPermutationTable();
+ virtual CMapIdList* CMapId();
private:
FontPtr font_;
diff --git a/sfntly/tools/subsetter/table_subsetter.h b/sfntly/tools/subsetter/table_subsetter.h
index 9565da6..437705c 100644
--- a/sfntly/tools/subsetter/table_subsetter.h
+++ b/sfntly/tools/subsetter/table_subsetter.h
@@ -26,9 +26,9 @@
class Subsetter;
class TableSubsetter : virtual public RefCount {
public:
- virtual IntegerSet* tagsHandled() = 0;
- virtual bool tagHandled(int32_t tag) = 0;
- virtual bool subset(Subsetter* subsetter, Font* font,
+ virtual IntegerSet* TagsHandled() = 0;
+ virtual bool TagHandled(int32_t tag) = 0;
+ virtual bool Subset(Subsetter* subsetter, Font* font,
Font::Builder* font_builder) = 0;
};
typedef Ptr<TableSubsetter> TableSubsetterPtr;
diff --git a/sfntly/tools/subsetter/table_subsetter_impl.cc b/sfntly/tools/subsetter/table_subsetter_impl.cc
index 481f10f..f239c78 100644
--- a/sfntly/tools/subsetter/table_subsetter_impl.cc
+++ b/sfntly/tools/subsetter/table_subsetter_impl.cc
@@ -27,11 +27,11 @@
TableSubsetterImpl::~TableSubsetterImpl() {}
-bool TableSubsetterImpl::tagHandled(int32_t tag) {
+bool TableSubsetterImpl::TagHandled(int32_t tag) {
return tags_.find(tag) != tags_.end();
}
-IntegerSet* TableSubsetterImpl::tagsHandled() {
+IntegerSet* TableSubsetterImpl::TagsHandled() {
return &tags_;
}
diff --git a/sfntly/tools/subsetter/table_subsetter_impl.h b/sfntly/tools/subsetter/table_subsetter_impl.h
index 7fabba8..162464a 100644
--- a/sfntly/tools/subsetter/table_subsetter_impl.h
+++ b/sfntly/tools/subsetter/table_subsetter_impl.h
@@ -25,8 +25,8 @@
public:
TableSubsetterImpl(const int32_t* tags, size_t tags_length);
virtual ~TableSubsetterImpl();
- virtual bool tagHandled(int32_t tag);
- virtual IntegerSet* tagsHandled();
+ virtual bool TagHandled(int32_t tag);
+ virtual IntegerSet* TagsHandled();
protected:
IntegerSet tags_;
diff --git a/test/byte_array_test.cc b/test/byte_array_test.cc
index 7c6efa9..89478f4 100644
--- a/test/byte_array_test.cc
+++ b/test/byte_array_test.cc
@@ -27,50 +27,50 @@
const int32_t BYTE_ARRAY_SIZES[] =
{1, 7, 127, 128, 129, 255, 256, 257, 666, 1023, 10000, 0xffff, 0x10000};
-void fillTestByteArray(ByteArray* ba, int32_t size) {
+void FillTestByteArray(ByteArray* ba, int32_t size) {
for (int32_t i = 0; i < size; ++i) {
- ba->put(i, (byte_t)(i % 256));
+ ba->Put(i, (byte_t)(i % 256));
}
}
-void readByteArrayWithBuffer(ByteArray* ba, ByteVector* buffer, ByteVector* b) {
- b->resize(ba->length());
+void ReadByteArrayWithBuffer(ByteArray* ba, ByteVector* buffer, ByteVector* b) {
+ b->resize(ba->Length());
int32_t index = 0;
- while (index < ba->length()) {
- int32_t bytes_read = ba->get(index, buffer);
+ while (index < ba->Length()) {
+ int32_t bytes_read = ba->Get(index, buffer);
std::copy(buffer->begin(), buffer->begin() + bytes_read,
b->begin() + index);
index += bytes_read;
}
}
-void readByteArrayWithSlidingWindow(ByteArray* ba, int window_size,
+void ReadByteArrayWithSlidingWindow(ByteArray* ba, int window_size,
ByteVector* b) {
- b->resize(ba->length());
+ b->resize(ba->Length());
int32_t index = 0;
int32_t actual_window_size = window_size;
- while (index < ba->length()) {
+ while (index < ba->Length()) {
actual_window_size =
std::min<int32_t>(actual_window_size, b->size() - index);
- int32_t bytes_read = ba->get(index, b, index, actual_window_size);
+ int32_t bytes_read = ba->Get(index, b, index, actual_window_size);
index += bytes_read;
}
}
-bool readComparison(ByteArray* ba1, ByteArray* ba2) {
+bool ReadComparison(ByteArray* ba1, ByteArray* ba2) {
// single byte reads
- for (int i = 0; i < ba1->length(); ++i) {
- EXPECT_EQ(ba1->get(i), ba2->get(i));
+ for (int i = 0; i < ba1->Length(); ++i) {
+ EXPECT_EQ(ba1->Get(i), ba2->Get(i));
}
ByteVector b1, b2;
// buffer reads
- int increments = std::max<int32_t>(ba1->length() / 11, 1);
- for (int buffer_size = 1; buffer_size < ba1->length();
+ int increments = std::max<int32_t>(ba1->Length() / 11, 1);
+ for (int buffer_size = 1; buffer_size < ba1->Length();
buffer_size += increments) {
ByteVector buffer(buffer_size);
- readByteArrayWithBuffer(ba1, &buffer, &b1);
- readByteArrayWithBuffer(ba2, &buffer, &b2);
+ ReadByteArrayWithBuffer(ba1, &buffer, &b1);
+ ReadByteArrayWithBuffer(ba2, &buffer, &b2);
EXPECT_GT(b1.size(), static_cast<size_t>(0));
EXPECT_EQ(b1.size(), b2.size());
EXPECT_TRUE(std::equal(b1.begin(), b1.end(), b2.begin()));
@@ -79,10 +79,10 @@
// sliding window reads
b1.clear();
b2.clear();
- for (int window_size = 1; window_size < ba1->length();
+ for (int window_size = 1; window_size < ba1->Length();
window_size += increments) {
- readByteArrayWithSlidingWindow(ba1, window_size, &b1);
- readByteArrayWithSlidingWindow(ba2, window_size, &b2);
+ ReadByteArrayWithSlidingWindow(ba1, window_size, &b1);
+ ReadByteArrayWithSlidingWindow(ba2, window_size, &b2);
EXPECT_GT(b1.size(), static_cast<size_t>(0));
EXPECT_EQ(b1.size(), b2.size());
EXPECT_TRUE(std::equal(b1.begin(), b1.end(), b2.begin()));
@@ -91,46 +91,46 @@
return true;
}
-bool copyTest(ByteArray* ba) {
- ByteArrayPtr fixed_copy = new MemoryByteArray(ba->length());
- ba->copyTo(fixed_copy);
- EXPECT_EQ(ba->length(), fixed_copy->length());
- EXPECT_TRUE(readComparison(ba, fixed_copy));
+bool CopyTest(ByteArray* ba) {
+ ByteArrayPtr fixed_copy = new MemoryByteArray(ba->Length());
+ ba->CopyTo(fixed_copy);
+ EXPECT_EQ(ba->Length(), fixed_copy->Length());
+ EXPECT_TRUE(ReadComparison(ba, fixed_copy));
ByteArrayPtr growable_copy = new GrowableMemoryByteArray();
- ba->copyTo(growable_copy);
- EXPECT_EQ(ba->length(), growable_copy->length());
- EXPECT_TRUE(readComparison(ba, growable_copy));
+ ba->CopyTo(growable_copy);
+ EXPECT_EQ(ba->Length(), growable_copy->Length());
+ EXPECT_TRUE(ReadComparison(ba, growable_copy));
return true;
}
-bool byteArrayTester(ByteArray* ba) {
- return copyTest(ba);
+bool ByteArrayTester(ByteArray* ba) {
+ return CopyTest(ba);
}
} // namespace byte_array_test
-bool testMemoryByteArray() {
+bool TestMemoryByteArray() {
for (size_t i = 0;
i < sizeof(byte_array_test::BYTE_ARRAY_SIZES) / sizeof(int32_t); ++i) {
int32_t size = byte_array_test::BYTE_ARRAY_SIZES[i];
fprintf(stderr, "fixed mem: iteration %ld, size %d\n", i, size);
ByteArrayPtr ba = new MemoryByteArray(size);
- byte_array_test::fillTestByteArray(ba, size);
- EXPECT_TRUE(byte_array_test::byteArrayTester(ba));
+ byte_array_test::FillTestByteArray(ba, size);
+ EXPECT_TRUE(byte_array_test::ByteArrayTester(ba));
}
return true;
}
-bool testGrowableMemoryByteArray() {
+bool TestGrowableMemoryByteArray() {
for (size_t i = 0;
i < sizeof(byte_array_test::BYTE_ARRAY_SIZES) / sizeof(int32_t); ++i) {
int32_t size = byte_array_test::BYTE_ARRAY_SIZES[i];
fprintf(stderr, "growable mem: iteration %ld, size %d\n", i, size);
ByteArrayPtr ba = new GrowableMemoryByteArray();
- byte_array_test::fillTestByteArray(ba, size);
- EXPECT_TRUE(byte_array_test::byteArrayTester(ba));
+ byte_array_test::FillTestByteArray(ba, size);
+ EXPECT_TRUE(byte_array_test::ByteArrayTester(ba));
}
return true;
}
diff --git a/test/byte_array_test.h b/test/byte_array_test.h
index 0d67ca8..88e8ce8 100644
--- a/test/byte_array_test.h
+++ b/test/byte_array_test.h
@@ -19,8 +19,8 @@
namespace sfntly {
-bool testMemoryByteArray();
-bool testGrowableMemoryByteArray();
+bool TestMemoryByteArray();
+bool TestGrowableMemoryByteArray();
} // namespace sfntly
diff --git a/test/endian_test.cc b/test/endian_test.cc
index 887fed5..50beeeb 100644
--- a/test/endian_test.cc
+++ b/test/endian_test.cc
@@ -25,7 +25,7 @@
namespace sfntly {
-bool testEndian() {
+bool TestEndian() {
byte_t test_data[] = {
0x68, 0x65, 0x61, 0x64, // 0: head
0xca, 0xca, 0xca, 0xca, // 4: ubyte, byte, char
@@ -38,35 +38,35 @@
ByteArrayPtr ba1 = new GrowableMemoryByteArray();
for (size_t i = 0; i < sizeof(test_data); ++i) {
- ba1->put(i, test_data[i]);
+ ba1->Put(i, test_data[i]);
}
ReadableFontDataPtr rfd = new ReadableFontData(ba1);
- EXPECT_EQ(rfd->readULongAsInt(0), Tag::head);
- EXPECT_EQ(rfd->readUByte(4), 202);
- EXPECT_EQ(rfd->readByte(5), -54);
- EXPECT_EQ(rfd->readChar(6), 202);
- EXPECT_EQ(rfd->readUShort(8), 24);
- EXPECT_EQ(rfd->readShort(10), -32744);
- EXPECT_EQ(rfd->readUInt24(12), 24);
- EXPECT_EQ(rfd->readULong(16), 24);
- EXPECT_EQ(rfd->readLong(20), -256);
- EXPECT_EQ(rfd->readFixed(24), Fixed1616::fixed(1, 0));
+ EXPECT_EQ(rfd->ReadULongAsInt(0), Tag::head);
+ EXPECT_EQ(rfd->ReadUByte(4), 202);
+ EXPECT_EQ(rfd->ReadByte(5), -54);
+ EXPECT_EQ(rfd->ReadChar(6), 202);
+ EXPECT_EQ(rfd->ReadUShort(8), 24);
+ EXPECT_EQ(rfd->ReadShort(10), -32744);
+ EXPECT_EQ(rfd->ReadUInt24(12), 24);
+ EXPECT_EQ(rfd->ReadULong(16), 24);
+ EXPECT_EQ(rfd->ReadLong(20), -256);
+ EXPECT_EQ(rfd->ReadFixed(24), Fixed1616::Fixed(1, 0));
MemoryOutputStream os;
FontOutputStream fos(&os);
- fos.writeULong(Tag::head);
- fos.write(202);
- fos.write(202);
- fos.write(202);
- fos.write(202);
- fos.writeUShort(24);
- fos.writeShort(-32744);
- fos.writeUInt24(24);
- fos.writeChar(0);
- fos.writeULong(24);
- fos.writeLong(-256);
- fos.writeFixed(Fixed1616::fixed(1, 0));
- EXPECT_EQ(memcmp(os.get(), test_data, sizeof(test_data)), 0);
+ fos.WriteULong(Tag::head);
+ fos.Write(202);
+ fos.Write(202);
+ fos.Write(202);
+ fos.Write(202);
+ fos.WriteUShort(24);
+ fos.WriteShort(-32744);
+ fos.WriteUInt24(24);
+ fos.WriteChar(0);
+ fos.WriteULong(24);
+ fos.WriteLong(-256);
+ fos.WriteFixed(Fixed1616::Fixed(1, 0));
+ EXPECT_EQ(memcmp(os.Get(), test_data, sizeof(test_data)), 0);
return true;
}
diff --git a/test/endian_test.h b/test/endian_test.h
index ce96251..8fc36ff 100644
--- a/test/endian_test.h
+++ b/test/endian_test.h
@@ -19,7 +19,7 @@
namespace sfntly {
-bool testEndian();
+bool TestEndian();
} // namespace sfntly
diff --git a/test/file_io_test.cc b/test/file_io_test.cc
index 1c02b0a..6c48a27 100644
--- a/test/file_io_test.cc
+++ b/test/file_io_test.cc
@@ -23,7 +23,7 @@
namespace sfntly {
-bool testFileInputStream() {
+bool TestFileInputStream() {
FILE* file_handle = NULL;
#if defined (WIN32)
fopen_s(&file_handle, SAMPLE_TTF_FILE, "rb");
@@ -44,47 +44,47 @@
// Full file reading test
FileInputStream is;
- is.open(SAMPLE_TTF_FILE);
- EXPECT_EQ(length, (size_t)is.available());
+ is.Open(SAMPLE_TTF_FILE);
+ EXPECT_EQ(length, (size_t)is.Available());
ByteVector b2;
- is.read(&b2, 0, length);
- is.close();
+ is.Read(&b2, 0, length);
+ is.Close();
EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), length), 0);
b2.clear();
// Partial reading test
- is.open(SAMPLE_TTF_FILE);
- is.skip(89);
- is.read(&b2, 0, 100);
+ is.Open(SAMPLE_TTF_FILE);
+ is.Skip(89);
+ is.Read(&b2, 0, 100);
EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0);
b2.clear();
// Skip test
- is.skip(-89);
- is.read(&b2, 0, 100);
+ is.Skip(-89);
+ is.Read(&b2, 0, 100);
EXPECT_EQ(memcmp(&(b1[100]), &(b2[0]), 100), 0);
b2.clear();
- is.skip(100);
- is.read(&b2, 0, 100);
+ is.Skip(100);
+ is.Read(&b2, 0, 100);
EXPECT_EQ(memcmp(&(b1[300]), &(b2[0]), 100), 0);
- is.skip(-400);
+ is.Skip(-400);
b2.clear();
// Offset test
- is.read(&b2, 0, 100);
- is.read(&b2, 100, 100);
+ is.Read(&b2, 0, 100);
+ is.Read(&b2, 100, 100);
EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), 200), 0);
// Unread test
ByteVector b3;
b3.resize(200);
- is.unread(&b3);
+ is.Unread(&b3);
EXPECT_EQ(memcmp(&(b3[0]), &(b2[0]), 200), 0);
return true;
}
-bool testFontInputStreamBasic() {
+bool TestFontInputStreamBasic() {
FILE* file_handle = NULL;
#if defined (WIN32)
fopen_s(&file_handle, SAMPLE_TTF_FILE, "rb");
@@ -104,47 +104,47 @@
fclose(file_handle);
FileInputStream is;
- is.open(SAMPLE_TTF_FILE);
+ is.Open(SAMPLE_TTF_FILE);
FontInputStream font_is1(&is);
- EXPECT_EQ((size_t)font_is1.available(), length);
+ EXPECT_EQ((size_t)font_is1.Available(), length);
ByteVector b2;
- font_is1.read(&b2, 0, length);
- font_is1.close();
+ font_is1.Read(&b2, 0, length);
+ font_is1.Close();
EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), length), 0);
b2.clear();
- is.open(SAMPLE_TTF_FILE);
- is.skip(89);
+ is.Open(SAMPLE_TTF_FILE);
+ is.Skip(89);
FontInputStream font_is2(&is, 200);
- font_is2.read(&b2, 0, 100);
+ font_is2.Read(&b2, 0, 100);
EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0);
- font_is2.read(&b2, 100, 100);
+ font_is2.Read(&b2, 100, 100);
EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 200), 0);
b2.clear();
- font_is2.skip(-200);
- font_is2.read(&b2, 0, 100);
+ font_is2.Skip(-200);
+ font_is2.Read(&b2, 0, 100);
EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0);
return true;
}
-bool testFontInputStreamTableLoading() {
+bool TestFontInputStreamTableLoading() {
FileInputStream is;
- is.open(SAMPLE_TTF_FILE);
+ is.Open(SAMPLE_TTF_FILE);
FontInputStream font_is(&is);
- font_is.skip(TTF_OFFSET[SAMPLE_TTF_GDEF]);
+ font_is.Skip(TTF_OFFSET[SAMPLE_TTF_GDEF]);
FontInputStream gdef_is(&font_is, TTF_LENGTH[SAMPLE_TTF_GDEF]);
ByteVector gdef_data;
- gdef_is.read(&gdef_data, 0, TTF_LENGTH[SAMPLE_TTF_GDEF]);
+ gdef_is.Read(&gdef_data, 0, TTF_LENGTH[SAMPLE_TTF_GDEF]);
EXPECT_EQ(memcmp(&(gdef_data[0]), TTF_GDEF_DATA,
TTF_LENGTH[SAMPLE_TTF_GDEF]), 0);
- font_is.skip(TTF_OFFSET[SAMPLE_TTF_HEAD] - font_is.position());
+ font_is.Skip(TTF_OFFSET[SAMPLE_TTF_HEAD] - font_is.position());
FontInputStream head_is(&font_is, TTF_LENGTH[SAMPLE_TTF_HEAD]);
ByteVector head_data;
- head_is.read(&head_data, 0, TTF_LENGTH[SAMPLE_TTF_HEAD]);
+ head_is.Read(&head_data, 0, TTF_LENGTH[SAMPLE_TTF_HEAD]);
EXPECT_EQ(memcmp(&(head_data[0]), TTF_HEAD_DATA,
TTF_LENGTH[SAMPLE_TTF_HEAD]), 0);
diff --git a/test/file_io_test.h b/test/file_io_test.h
index ab5c109..9ff1972 100644
--- a/test/file_io_test.h
+++ b/test/file_io_test.h
@@ -19,9 +19,9 @@
namespace sfntly {
-bool testFileInputStream();
-bool testFontInputStreamBasic();
-bool testFontInputStreamTableLoading();
+bool TestFileInputStream();
+bool TestFontInputStreamBasic();
+bool TestFontInputStreamTableLoading();
} // namespace sfntly
diff --git a/test/font_data_test.cc b/test/font_data_test.cc
index ad30522..3686856 100644
--- a/test/font_data_test.cc
+++ b/test/font_data_test.cc
@@ -28,87 +28,91 @@
const int32_t BYTE_ARRAY_SIZES[] =
{1, 7, 127, 128, 129, 255, 256, 257, 666, 1023, 0x10000};
-void fillTestByteArray(ByteArray* ba, int32_t size) {
+void FillTestByteArray(ByteArray* ba, int32_t size) {
for (int32_t i = 0; i < size; ++i) {
- ba->put(i, (byte_t)(i % 256));
+ ba->Put(i, (byte_t)(i % 256));
}
}
-void readFontDataWithSingleByte(ReadableFontData* rfd, ByteVector* buffer) {
- buffer->resize(rfd->length());
- for (int32_t index = 0; index < rfd->length(); ++index) {
- (*buffer)[index] = (byte_t)(rfd->readByte(index));
+void ReadFontDataWithSingleByte(ReadableFontData* rfd, ByteVector* buffer) {
+ buffer->resize(rfd->Length());
+ for (int32_t index = 0; index < rfd->Length(); ++index) {
+ (*buffer)[index] = (byte_t)(rfd->ReadByte(index));
}
}
-void readFontDataWithBuffer(ReadableFontData* rfd, int32_t buffer_size,
+void ReadFontDataWithBuffer(ReadableFontData* rfd,
+ int32_t buffer_size,
ByteVector* b) {
ByteVector buffer(buffer_size);
- b->resize(rfd->length());
+ b->resize(rfd->Length());
int32_t index = 0;
- while (index < rfd->length()) {
- int32_t bytes_read = rfd->readBytes(index, &buffer, 0, buffer.size());
+ while (index < rfd->Length()) {
+ int32_t bytes_read = rfd->ReadBytes(index, &buffer, 0, buffer.size());
EXPECT_GE(bytes_read, 0);
std::copy(buffer.begin(), buffer.begin() + bytes_read, b->begin() + index);
index += bytes_read;
}
}
-void readFontDataWithSlidingWindow(ReadableFontData* rfd, int32_t window_size,
+void ReadFontDataWithSlidingWindow(ReadableFontData* rfd, int32_t window_size,
ByteVector* b) {
- b->resize(rfd->length());
+ b->resize(rfd->Length());
int32_t index = 0;
- while (index < rfd->length()) {
+ while (index < rfd->Length()) {
int32_t actual_window_size =
std::min<int32_t>(window_size, b->size() - index);
- int32_t bytes_read = rfd->readBytes(index, b, index, actual_window_size);
+ int32_t bytes_read = rfd->ReadBytes(index, b, index, actual_window_size);
EXPECT_GE(bytes_read, 0);
index += bytes_read;
}
}
-void writeFontDataWithSingleByte(ReadableFontData* rfd, WritableFontData* wfd) {
- for (int32_t index = 0; index < rfd->length(); ++index) {
- byte_t b = (byte_t)(rfd->readByte(index));
- wfd->writeByte(index, b);
+void WriteFontDataWithSingleByte(ReadableFontData* rfd, WritableFontData* wfd) {
+ for (int32_t index = 0; index < rfd->Length(); ++index) {
+ byte_t b = (byte_t)(rfd->ReadByte(index));
+ wfd->WriteByte(index, b);
}
}
-void writeFontDataWithBuffer(ReadableFontData* rfd, WritableFontData* wfd,
+void WriteFontDataWithBuffer(ReadableFontData* rfd,
+ WritableFontData* wfd,
int32_t buffer_size) {
ByteVector buffer(buffer_size);
int32_t index = 0;
- while (index < rfd->length()) {
- int32_t bytesRead = rfd->readBytes(index, &buffer, 0, buffer.size());
- wfd->writeBytes(index, &buffer, 0, buffer.size());
+ while (index < rfd->Length()) {
+ int32_t bytesRead = rfd->ReadBytes(index, &buffer, 0, buffer.size());
+ wfd->WriteBytes(index, &buffer, 0, buffer.size());
index += bytesRead;
}
}
-void writeFontDataWithSlidingWindow(ReadableFontData* rfd,
+void WriteFontDataWithSlidingWindow(ReadableFontData* rfd,
WritableFontData* wfd,
int32_t window_size) {
- ByteVector b(rfd->length());
+ ByteVector b(rfd->Length());
int32_t index = 0;
- while (index < rfd->length()) {
+ while (index < rfd->Length()) {
int32_t sliding_size = std::min<int32_t>(window_size, b.size() - index);
- int32_t bytes_read = rfd->readBytes(index, &b, index, sliding_size);
- wfd->writeBytes(index, &b, index, sliding_size);
+ int32_t bytes_read = rfd->ReadBytes(index, &b, index, sliding_size);
+ wfd->WriteBytes(index, &b, index, sliding_size);
index += bytes_read;
}
}
-bool readComparison(int32_t offset, int32_t length, ReadableFontData* rfd1,
+bool ReadComparison(int32_t offset,
+ int32_t length,
+ ReadableFontData* rfd1,
ReadableFontData* rfd2) {
- EXPECT_TRUE(length == rfd2->length());
+ EXPECT_TRUE(length == rfd2->Length());
ByteVector b1, b2;
b1.resize(length);
b2.resize(length);
// single byte reads
- readFontDataWithSingleByte(rfd1, &b1);
- readFontDataWithSingleByte(rfd2, &b2);
+ ReadFontDataWithSingleByte(rfd1, &b1);
+ ReadFontDataWithSingleByte(rfd2, &b2);
EXPECT_EQ(memcmp(&(b1[offset]), &(b2[0]), length), 0);
// buffer reads
@@ -119,8 +123,8 @@
b2.clear();
b1.resize(length);
b2.resize(length);
- readFontDataWithBuffer(rfd1, buffer_size, &b1);
- readFontDataWithBuffer(rfd2, buffer_size, &b2);
+ ReadFontDataWithBuffer(rfd1, buffer_size, &b1);
+ ReadFontDataWithBuffer(rfd2, buffer_size, &b2);
int result = memcmp(&(b1[offset]), &(b2[0]), length);
EXPECT_EQ(result, 0);
}
@@ -132,80 +136,80 @@
b2.clear();
b1.resize(length);
b2.resize(length);
- readFontDataWithSlidingWindow(rfd1, window_size, &b1);
- readFontDataWithSlidingWindow(rfd2, window_size, &b2);
+ ReadFontDataWithSlidingWindow(rfd1, window_size, &b1);
+ ReadFontDataWithSlidingWindow(rfd2, window_size, &b2);
int result = memcmp(&(b1[offset]), &(b2[0]), length);
EXPECT_EQ(result, 0);
}
return true;
}
-void slicingReadTest(ReadableFontData* rfd) {
- for (int32_t trim = 0; trim < (rfd->length() / 2) + 1;
- trim += (rfd->length() / 21) + 1) {
+void SlicingReadTest(ReadableFontData* rfd) {
+ for (int32_t trim = 0; trim < (rfd->Length() / 2) + 1;
+ trim += (rfd->Length() / 21) + 1) {
fprintf(stderr, "\tread - trim = %d\n", trim);
- int32_t length = rfd->length() - 2 * trim;
+ int32_t length = rfd->Length() - 2 * trim;
ReadableFontDataPtr slice;
- slice.attach(down_cast<ReadableFontData*>(rfd->slice(trim, length)));
- EXPECT_TRUE(readComparison(trim, length, rfd, slice));
+ slice.Attach(down_cast<ReadableFontData*>(rfd->Slice(trim, length)));
+ EXPECT_TRUE(ReadComparison(trim, length, rfd, slice));
}
}
-void slicingWriteTest(ReadableFontData* rfd, WritableFontData* wfd) {
- for (int32_t trim = 0; trim < (rfd->length() / 2) + 1;
- trim += (rfd->length() / 21) + 1) {
+void SlicingWriteTest(ReadableFontData* rfd, WritableFontData* wfd) {
+ for (int32_t trim = 0; trim < (rfd->Length() / 2) + 1;
+ trim += (rfd->Length() / 21) + 1) {
fprintf(stderr, "\twrite - trim = %d\n", trim);
- int32_t length = rfd->length() - 2 * trim;
+ int32_t length = rfd->Length() - 2 * trim;
WritableFontDataPtr w_slice;
ReadableFontDataPtr r_slice;
// single byte writes
- w_slice.attach(down_cast<WritableFontData*>(wfd->slice(trim, length)));
- r_slice.attach(down_cast<ReadableFontData*>(rfd->slice(trim, length)));
- writeFontDataWithSingleByte(r_slice, w_slice);
- EXPECT_TRUE(readComparison(trim, length, rfd, w_slice));
+ w_slice.Attach(down_cast<WritableFontData*>(wfd->Slice(trim, length)));
+ r_slice.Attach(down_cast<ReadableFontData*>(rfd->Slice(trim, length)));
+ WriteFontDataWithSingleByte(r_slice, w_slice);
+ EXPECT_TRUE(ReadComparison(trim, length, rfd, w_slice));
// buffer writes
int32_t increments = std::max<int32_t>(length / 11, 1);
for (int32_t buffer_size = 1; buffer_size < length;
buffer_size += increments) {
- w_slice.attach(down_cast<WritableFontData*>(wfd->slice(trim, length)));
- r_slice.attach(down_cast<ReadableFontData*>(rfd->slice(trim, length)));
- writeFontDataWithBuffer(r_slice, w_slice, buffer_size);
- EXPECT_TRUE(readComparison(trim, length, rfd, w_slice));
+ w_slice.Attach(down_cast<WritableFontData*>(wfd->Slice(trim, length)));
+ r_slice.Attach(down_cast<ReadableFontData*>(rfd->Slice(trim, length)));
+ WriteFontDataWithBuffer(r_slice, w_slice, buffer_size);
+ EXPECT_TRUE(ReadComparison(trim, length, rfd, w_slice));
}
// sliding window writes
for (int window_size = 1; window_size < length; window_size += increments) {
- w_slice.attach(down_cast<WritableFontData*>(wfd->slice(trim, length)));
- r_slice.attach(down_cast<ReadableFontData*>(rfd->slice(trim, length)));
- writeFontDataWithSlidingWindow(r_slice, w_slice, window_size);
- EXPECT_TRUE(readComparison(trim, length, rfd, w_slice));
+ w_slice.Attach(down_cast<WritableFontData*>(wfd->Slice(trim, length)));
+ r_slice.Attach(down_cast<ReadableFontData*>(rfd->Slice(trim, length)));
+ WriteFontDataWithSlidingWindow(r_slice, w_slice, window_size);
+ EXPECT_TRUE(ReadComparison(trim, length, rfd, w_slice));
}
}
}
-bool testReadableFontData() {
+bool TestReadableFontData() {
for (size_t i = 0; i < sizeof(BYTE_ARRAY_SIZES) / sizeof(int32_t); ++i) {
int32_t size = BYTE_ARRAY_SIZES[i];
ByteArrayPtr ba = new MemoryByteArray(size);
- fillTestByteArray(ba, size);
+ FillTestByteArray(ba, size);
ReadableFontDataPtr rfd = new ReadableFontData(ba);
- slicingReadTest(rfd);
+ SlicingReadTest(rfd);
}
return true;
}
-bool testWritableFontData() {
+bool TestWritableFontData() {
for (size_t i = 0; i < sizeof(BYTE_ARRAY_SIZES) / sizeof(int32_t); ++i) {
int32_t size = BYTE_ARRAY_SIZES[i];
ByteArrayPtr ba = new MemoryByteArray(size);
- fillTestByteArray(ba, size);
+ FillTestByteArray(ba, size);
WritableFontDataPtr wfd = new WritableFontData(ba);
- slicingReadTest(wfd);
+ SlicingReadTest(wfd);
ByteArrayPtr temp = new MemoryByteArray(size);
WritableFontDataPtr wfd_copy = new WritableFontData(temp);
- slicingWriteTest(wfd, wfd_copy);
+ SlicingWriteTest(wfd, wfd_copy);
}
return true;
}
diff --git a/test/font_data_test.h b/test/font_data_test.h
index 78e910d..bca1924 100644
--- a/test/font_data_test.h
+++ b/test/font_data_test.h
@@ -18,8 +18,8 @@
#define TYPOGRAPHY_FONT_SFNTLY_SRC_TEST_FONT_DATA_TEST_H_
namespace sfntly {
- bool testReadableFontData();
- bool testWritableFontData();
+ bool TestReadableFontData();
+ bool TestWritableFontData();
}
#endif // TYPOGRAPHY_FONT_SFNTLY_SRC_TEST_FONT_DATA_TEST_H_
diff --git a/test/font_parsing_test.cc b/test/font_parsing_test.cc
index 3c9f732..71446ec 100644
--- a/test/font_parsing_test.cc
+++ b/test/font_parsing_test.cc
@@ -30,52 +30,52 @@
namespace sfntly {
-bool testFontParsing() {
+bool TestFontParsing() {
ByteVector input_buffer;
- loadFile(SAMPLE_TTF_FILE, &input_buffer);
+ LoadFile(SAMPLE_TTF_FILE, &input_buffer);
ByteArrayPtr ba = new MemoryByteArray(&(input_buffer[0]),
input_buffer.size());
- FontFactoryPtr factory = FontFactory::getInstance();
+ FontFactoryPtr factory = FontFactory::GetInstance();
// File based
FontBuilderArray font_builder_array;
- builderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array);
+ BuilderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array);
FontBuilderPtr font_builder = font_builder_array[0];
// Memory based
FontBuilderArray font_builder_array2;
- factory->loadFontsForBuilding(ba, &font_builder_array2);
+ factory->LoadFontsForBuilding(ba, &font_builder_array2);
FontBuilderPtr font_builder2 = font_builder_array2[0];
for (size_t i = 0; i < SAMPLE_TTF_KNOWN_TAGS; ++i) {
- EXPECT_TRUE(font_builder->hasTableBuilder(TTF_KNOWN_TAGS[i]));
- EXPECT_TRUE(font_builder2->hasTableBuilder(TTF_KNOWN_TAGS[i]));
+ EXPECT_TRUE(font_builder->HasTableBuilder(TTF_KNOWN_TAGS[i]));
+ EXPECT_TRUE(font_builder2->HasTableBuilder(TTF_KNOWN_TAGS[i]));
}
// Generic table
Ptr<Table::GenericTableBuilder> gdef_builder =
down_cast<Table::GenericTableBuilder*>(
- font_builder->getTableBuilder(Tag::GDEF));
+ font_builder->GetTableBuilder(Tag::GDEF));
Ptr<Table::Header> gdef_header = gdef_builder->header();
EXPECT_EQ(gdef_header->length(), TTF_LENGTH[SAMPLE_TTF_GDEF]);
EXPECT_EQ(gdef_header->offset(), TTF_OFFSET[SAMPLE_TTF_GDEF]);
EXPECT_EQ(gdef_header->checksum(), TTF_CHECKSUM[SAMPLE_TTF_GDEF]);
- EXPECT_TRUE(gdef_header->checksumValid());
+ EXPECT_TRUE(gdef_header->checksum_valid());
- WritableFontDataPtr wfd = gdef_builder->data();
+ WritableFontDataPtr wfd = gdef_builder->Data();
ByteVector b;
b.resize(TTF_LENGTH[SAMPLE_TTF_GDEF]);
- wfd->readBytes(0, &b, 0, TTF_LENGTH[SAMPLE_TTF_GDEF]);
+ wfd->ReadBytes(0, &b, 0, TTF_LENGTH[SAMPLE_TTF_GDEF]);
EXPECT_EQ(memcmp(&(b[0]), TTF_GDEF_DATA, TTF_LENGTH[SAMPLE_TTF_GDEF]), 0);
// Header table
FontHeaderTableBuilderPtr header_builder =
down_cast<FontHeaderTable::Builder*>(
- font_builder->getTableBuilder(Tag::head));
+ font_builder->GetTableBuilder(Tag::head));
Ptr<Table::Header> header_header = header_builder->header();
EXPECT_EQ(header_header->length(), TTF_LENGTH[SAMPLE_TTF_HEAD]);
EXPECT_EQ(header_header->offset(), TTF_OFFSET[SAMPLE_TTF_HEAD]);
EXPECT_EQ(header_header->checksum(), TTF_CHECKSUM[SAMPLE_TTF_HEAD]);
- EXPECT_TRUE(header_header->checksumValid());
+ EXPECT_TRUE(header_header->checksum_valid());
// Data conformance
for (size_t i = 0; i < SAMPLE_TTF_KNOWN_TAGS; ++i) {
@@ -83,46 +83,46 @@
b1.resize(TTF_LENGTH[i]);
b2.resize(TTF_LENGTH[i]);
TableBuilderPtr builder1 =
- font_builder->getTableBuilder(TTF_KNOWN_TAGS[i]);
+ font_builder->GetTableBuilder(TTF_KNOWN_TAGS[i]);
TableBuilderPtr builder2 =
- font_builder2->getTableBuilder(TTF_KNOWN_TAGS[i]);
- WritableFontDataPtr wfd1 = builder1->data();
- WritableFontDataPtr wfd2 = builder2->data();
- wfd1->readBytes(0, &b1, 0, TTF_LENGTH[i]);
- wfd2->readBytes(0, &b2, 0, TTF_LENGTH[i]);
+ font_builder2->GetTableBuilder(TTF_KNOWN_TAGS[i]);
+ WritableFontDataPtr wfd1 = builder1->Data();
+ WritableFontDataPtr wfd2 = builder2->Data();
+ wfd1->ReadBytes(0, &b1, 0, TTF_LENGTH[i]);
+ wfd2->ReadBytes(0, &b2, 0, TTF_LENGTH[i]);
EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), TTF_LENGTH[i]), 0);
}
return true;
}
-bool testTTFReadWrite() {
- FontFactoryPtr factory = FontFactory::getInstance();
+bool TestTTFReadWrite() {
+ FontFactoryPtr factory = FontFactory::GetInstance();
FontBuilderArray font_builder_array;
- builderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array);
+ BuilderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array);
FontBuilderPtr font_builder = font_builder_array[0];
- FontPtr font = font_builder->build();
+ FontPtr font = font_builder->Build();
MemoryOutputStream output_stream;
- factory->serializeFont(font, &output_stream);
- EXPECT_GE(output_stream.size(), SAMPLE_TTF_SIZE);
+ factory->SerializeFont(font, &output_stream);
+ EXPECT_GE(output_stream.Size(), SAMPLE_TTF_SIZE);
return true;
}
-bool testTTFMemoryBasedReadWrite() {
+bool TestTTFMemoryBasedReadWrite() {
ByteVector input_buffer;
- loadFile(SAMPLE_TTF_FILE, &input_buffer);
+ LoadFile(SAMPLE_TTF_FILE, &input_buffer);
- FontFactoryPtr factory = FontFactory::getInstance();
+ FontFactoryPtr factory = FontFactory::GetInstance();
FontBuilderArray font_builder_array;
ByteArrayPtr ba = new MemoryByteArray(&(input_buffer[0]),
input_buffer.size());
- factory->loadFontsForBuilding(ba, &font_builder_array);
+ factory->LoadFontsForBuilding(ba, &font_builder_array);
FontBuilderPtr font_builder = font_builder_array[0];
- FontPtr font = font_builder->build();
+ FontPtr font = font_builder->Build();
MemoryOutputStream output_stream;
- factory->serializeFont(font, &output_stream);
- EXPECT_GE(output_stream.size(), input_buffer.size());
+ factory->SerializeFont(font, &output_stream);
+ EXPECT_GE(output_stream.Size(), input_buffer.size());
return true;
}
diff --git a/test/font_parsing_test.h b/test/font_parsing_test.h
index d66689f..7b69a27 100644
--- a/test/font_parsing_test.h
+++ b/test/font_parsing_test.h
@@ -19,9 +19,9 @@
namespace sfntly {
-bool testFontParsing();
-bool testTTFReadWrite();
-bool testTTFMemoryBasedReadWrite();
+bool TestFontParsing();
+bool TestTTFReadWrite();
+bool TestTTFMemoryBasedReadWrite();
} // namespace sfntly
diff --git a/test/main.cc b/test/main.cc
index 0838b94..2c77eda 100644
--- a/test/main.cc
+++ b/test/main.cc
@@ -35,60 +35,60 @@
namespace sfntly {
TEST(SmartPointer, All) {
- EXPECT_TRUE(testSmartPointer());
+ EXPECT_TRUE(TestSmartPointer());
}
TEST(Endian, All) {
- EXPECT_TRUE(sfntly::testEndian());
+ EXPECT_TRUE(sfntly::TestEndian());
}
#if defined RUN_LENGTHY_TESTS
TEST(ByteArray, All) {
- EXPECT_TRUE(sfntly::testMemoryByteArray());
- EXPECT_TRUE(sfntly::testGrowableMemoryByteArray());
+ EXPECT_TRUE(sfntly::TestMemoryByteArray());
+ EXPECT_TRUE(sfntly::TestGrowableMemoryByteArray());
}
#endif
#if defined RUN_LENGTHY_TESTS
TEST(FontData, All) {
- EXPECT_TRUE(sfntly::testReadableFontData());
- EXPECT_TRUE(sfntly::testWritableFontData());
+ EXPECT_TRUE(sfntly::TestReadableFontData());
+ EXPECT_TRUE(sfntly::TestWritableFontData());
}
#endif
TEST(FileIO, All) {
- EXPECT_TRUE(sfntly::testFileInputStream());
- EXPECT_TRUE(sfntly::testFontInputStreamBasic());
- EXPECT_TRUE(sfntly::testFontInputStreamTableLoading());
+ EXPECT_TRUE(sfntly::TestFileInputStream());
+ EXPECT_TRUE(sfntly::TestFontInputStreamBasic());
+ EXPECT_TRUE(sfntly::TestFontInputStreamTableLoading());
}
TEST(OpenTypeData, All) {
- EXPECT_TRUE(sfntly::testOTFRead());
- EXPECT_TRUE(sfntly::testOTFCopy());
+ EXPECT_TRUE(sfntly::TestOTFRead());
+ EXPECT_TRUE(sfntly::TestOTFCopy());
}
TEST(FontParsing, All) {
- EXPECT_TRUE(sfntly::testFontParsing());
- EXPECT_TRUE(sfntly::testTTFReadWrite());
- EXPECT_TRUE(sfntly::testTTFMemoryBasedReadWrite());
+ EXPECT_TRUE(sfntly::TestFontParsing());
+ EXPECT_TRUE(sfntly::TestTTFReadWrite());
+ EXPECT_TRUE(sfntly::TestTTFMemoryBasedReadWrite());
}
TEST(OTFBasicEditing, All) {
- EXPECT_TRUE(sfntly::testOTFBasicEditing());
+ EXPECT_TRUE(sfntly::TestOTFBasicEditing());
}
TEST(NameEditing, All) {
- EXPECT_TRUE(sfntly::testChangeOneName());
- EXPECT_TRUE(sfntly::testModifyNameTableAndRevert());
- EXPECT_TRUE(sfntly::testRemoveOneName());
+ EXPECT_TRUE(sfntly::TestChangeOneName());
+ EXPECT_TRUE(sfntly::TestModifyNameTableAndRevert());
+ EXPECT_TRUE(sfntly::TestRemoveOneName());
}
TEST(TestUtils, Extension) {
- EXPECT_TRUE(sfntly::testExtension());
+ EXPECT_TRUE(sfntly::TestExtension());
}
TEST(TestUtils, Encoding) {
- EXPECT_TRUE(sfntly::testEncoding());
+ EXPECT_TRUE(sfntly::TestEncoding());
}
} // namespace sfntly
diff --git a/test/name_editing_test.cc b/test/name_editing_test.cc
index 7b87b78..6822bf0 100644
--- a/test/name_editing_test.cc
+++ b/test/name_editing_test.cc
@@ -36,49 +36,49 @@
static ByteVector input_buffer;
static ByteArrayPtr ba;
-void loadTestFile(FontFactory* factory, FontBuilderArray* font_builders) {
+void LoadTestFile(FontFactory* factory, FontBuilderArray* font_builders) {
assert(factory);
assert(font_builders);
if (ba == NULL) {
- loadFile(SAMPLE_TTF_FILE, &input_buffer);
+ LoadFile(SAMPLE_TTF_FILE, &input_buffer);
ba = new MemoryByteArray(&(input_buffer[0]), input_buffer.size());
}
- factory->loadFontsForBuilding(ba, font_builders);
+ factory->LoadFontsForBuilding(ba, font_builders);
}
-bool testChangeOneName() {
- FontFactoryPtr factory = FontFactory::getInstance();
+bool TestChangeOneName() {
+ FontFactoryPtr factory = FontFactory::GetInstance();
FontBuilderArray font_builder_array;
- loadTestFile(factory, &font_builder_array);
+ LoadTestFile(factory, &font_builder_array);
FontBuilderPtr font_builder = font_builder_array[0];
NameTableBuilderPtr name_builder = down_cast<NameTable::Builder*>(
- font_builder->getTableBuilder(Tag::name));
+ font_builder->GetTableBuilder(Tag::name));
// Change the font name.
NameEntryBuilderPtr neb =
- name_builder->nameBuilder(PlatformId::kWindows,
+ name_builder->NameBuilder(PlatformId::kWindows,
WindowsEncodingId::kUnicodeUCS2,
WindowsLanguageId::kEnglish_UnitedStates,
NameId::kFontFamilyName);
U_STRING_DECL(new_name, "Timothy", 7);
- neb->setName(new_name);
+ neb->SetName(new_name);
// Build the font.
- FontPtr font = font_builder->build();
+ FontPtr font = font_builder->Build();
// Serialize and reload the serialized font.
MemoryOutputStream os;
- factory->serializeFont(font, &os);
+ factory->SerializeFont(font, &os);
FontArray font_array;
- ByteArrayPtr new_ba = new MemoryByteArray(os.get(), os.size());
- factory->loadFonts(new_ba, &font_array);
+ ByteArrayPtr new_ba = new MemoryByteArray(os.Get(), os.Size());
+ factory->LoadFonts(new_ba, &font_array);
FontPtr new_font = font_array[0];
// Check the font name.
- NameTablePtr name_table = down_cast<NameTable*>(font->table(Tag::name));
- UChar* name = name_table->name(PlatformId::kWindows,
+ NameTablePtr name_table = down_cast<NameTable*>(font->GetTable(Tag::name));
+ UChar* name = name_table->Name(PlatformId::kWindows,
WindowsEncodingId::kUnicodeUCS2,
WindowsLanguageId::kEnglish_UnitedStates,
NameId::kFontFamilyName);
@@ -88,86 +88,86 @@
return true;
}
-bool testModifyNameTableAndRevert() {
- FontFactoryPtr factory = FontFactory::getInstance();
+bool TestModifyNameTableAndRevert() {
+ FontFactoryPtr factory = FontFactory::GetInstance();
FontBuilderArray font_builder_array;
- loadTestFile(factory, &font_builder_array);
+ LoadTestFile(factory, &font_builder_array);
FontBuilderPtr font_builder = font_builder_array[0];
NameTableBuilderPtr name_builder = down_cast<NameTable::Builder*>(
- font_builder->getTableBuilder(Tag::name));
+ font_builder->GetTableBuilder(Tag::name));
// Change the font name.
NameEntryBuilderPtr neb =
- name_builder->nameBuilder(PlatformId::kWindows,
+ name_builder->NameBuilder(PlatformId::kWindows,
WindowsEncodingId::kUnicodeUCS2,
WindowsLanguageId::kEnglish_UnitedStates,
NameId::kFontFamilyName);
- NameTable::NameEntry* neb_entry = neb->entry();
- UChar* original_name = neb_entry->name();
+ NameTable::NameEntry* neb_entry = neb->name_entry();
+ UChar* original_name = neb_entry->Name();
EXPECT_TRUE(original_name != NULL);
U_STRING_DECL(new_name, "Timothy", 7);
- neb->setName(new_name);
- name_builder->revertNames();
+ neb->SetName(new_name);
+ name_builder->RevertNames();
// Build the font.
- FontPtr font = font_builder->build();
+ FontPtr font = font_builder->Build();
// Serialize and reload the serialized font.
MemoryOutputStream os;
- factory->serializeFont(font, &os);
+ factory->SerializeFont(font, &os);
FontArray font_array;
- ByteArrayPtr new_ba = new MemoryByteArray(os.get(), os.size());
- factory->loadFonts(new_ba, &font_array);
+ ByteArrayPtr new_ba = new MemoryByteArray(os.Get(), os.Size());
+ factory->LoadFonts(new_ba, &font_array);
FontPtr new_font = font_array[0];
// Check the font name.
- NameTablePtr name_table = down_cast<NameTable*>(font->table(Tag::name));
- UChar* name = name_table->name(PlatformId::kWindows,
+ NameTablePtr name_table = down_cast<NameTable*>(font->GetTable(Tag::name));
+ UChar* name = name_table->Name(PlatformId::kWindows,
WindowsEncodingId::kUnicodeUCS2,
WindowsLanguageId::kEnglish_UnitedStates,
NameId::kFontFamilyName);
EXPECT_EQ(u_strcmp(name, original_name), 0);
- delete name;
- delete original_name;
+ delete[] name;
+ delete[] original_name;
return true;
}
-bool testRemoveOneName() {
- FontFactoryPtr factory = FontFactory::getInstance();
+bool TestRemoveOneName() {
+ FontFactoryPtr factory = FontFactory::GetInstance();
FontBuilderArray font_builder_array;
- loadTestFile(factory, &font_builder_array);
+ LoadTestFile(factory, &font_builder_array);
FontBuilderPtr font_builder = font_builder_array[0];
NameTableBuilderPtr name_builder = down_cast<NameTable::Builder*>(
- font_builder->getTableBuilder(Tag::name));
+ font_builder->GetTableBuilder(Tag::name));
- EXPECT_TRUE(name_builder->has(PlatformId::kWindows,
+ EXPECT_TRUE(name_builder->Has(PlatformId::kWindows,
WindowsEncodingId::kUnicodeUCS2,
WindowsLanguageId::kEnglish_UnitedStates,
NameId::kFontFamilyName));
- EXPECT_TRUE(name_builder->remove(PlatformId::kWindows,
+ EXPECT_TRUE(name_builder->Remove(PlatformId::kWindows,
WindowsEncodingId::kUnicodeUCS2,
WindowsLanguageId::kEnglish_UnitedStates,
NameId::kFontFamilyName));
// Build the font.
- FontPtr font = font_builder->build();
+ FontPtr font = font_builder->Build();
// Serialize and reload the serialized font.
MemoryOutputStream os;
- factory->serializeFont(font, &os);
+ factory->SerializeFont(font, &os);
FontArray font_array;
- ByteArrayPtr new_ba = new MemoryByteArray(os.get(), os.size());
- factory->loadFonts(new_ba, &font_array);
+ ByteArrayPtr new_ba = new MemoryByteArray(os.Get(), os.Size());
+ factory->LoadFonts(new_ba, &font_array);
FontPtr new_font = font_array[0];
// Check the font name.
- NameTablePtr name_table = down_cast<NameTable*>(font->table(Tag::name));
- UChar* name = name_table->name(PlatformId::kWindows,
+ NameTablePtr name_table = down_cast<NameTable*>(font->GetTable(Tag::name));
+ UChar* name = name_table->Name(PlatformId::kWindows,
WindowsEncodingId::kUnicodeUCS2,
WindowsLanguageId::kEnglish_UnitedStates,
NameId::kFontFamilyName);
@@ -179,14 +179,14 @@
// Note: Function is not implemented but the test case is built. Uncomment
// when NameTable::clear() is implemented.
/*
-bool testClearAllNamesAndSetOne() {
- FontFactoryPtr factory = FontFactory::getInstance();
+bool TestClearAllNamesAndSetOne() {
+ FontFactoryPtr factory = FontFactory::GetInstance();
FontBuilderArray font_builder_array;
- loadTestFile(factory, &font_builder_array);
+ LoadTestFile(factory, &font_builder_array);
FontBuilderPtr font_builder = font_builder_array[0];
NameTableBuilderPtr name_builder = down_cast<NameTable::Builder*>(
- font_builder->getTableBuilder(Tag::name));
+ font_builder->GetTableBuilder(Tag::name));
EXPECT_GT(name_builder->builderCount(), 0);
name_builder->clear();
@@ -194,32 +194,34 @@
// Change the font name.
NameEntryBuilderPtr neb =
- name_builder->nameBuilder(PlatformId::kWindows,
+ name_builder->NameBuilder(PlatformId::kWindows,
WindowsEncodingId::kUnicodeUCS2,
WindowsLanguageId::kEnglish_UnitedStates,
NameId::kFontFamilyName);
U_STRING_DECL(new_name, "Fred", 4);
- neb->setName(new_name);
+ neb->SetName(new_name);
// Build the font.
- FontPtr font = font_builder->build();
+ FontPtr font = font_builder->Build();
// Serialize and reload the serialized font.
MemoryOutputStream os;
- factory->serializeFont(font, &os);
+ factory->SerializeFont(font, &os);
FontArray font_array;
- ByteArrayPtr new_ba = new MemoryByteArray(os.get(), os.size());
- factory->loadFonts(new_ba, &font_array);
+ ByteArrayPtr new_ba = new MemoryByteArray(os.Get(), os.Size());
+ factory->LoadFonts(new_ba, &font_array);
FontPtr new_font = font_array[0];
// Check the font name.
NameTablePtr name_table = down_cast<NameTable*>(font->table(Tag::name));
- UChar* name = name_table->name(PlatformId::kWindows,
+ UChar* name = name_table->Name(PlatformId::kWindows,
WindowsEncodingId::kUnicodeUCS2,
WindowsLanguageId::kEnglish_UnitedStates,
NameId::kFontFamilyName);
- EXPECT_EQ(name_table->nameCount(), 1);
+ EXPECT_EQ(name_table->NameCount(), 1);
EXPECT_EQ(u_strcmp(name, new_name), 0);
+
+ delete[] name;
return true;
}
*/
diff --git a/test/name_editing_test.h b/test/name_editing_test.h
index b5edf0f..dff38d8 100644
--- a/test/name_editing_test.h
+++ b/test/name_editing_test.h
@@ -19,12 +19,12 @@
namespace sfntly {
-bool testChangeOneName();
-bool testModifyNameTableAndRevert();
-bool testRemoveOneName();
+bool TestChangeOneName();
+bool TestModifyNameTableAndRevert();
+bool TestRemoveOneName();
// Note: Function is not implemented but the test case is built. Uncomment
// when NameTable::clear() is implemented.
-// bool testClearAllNamesAndSetOne();
+// bool TestClearAllNamesAndSetOne();
} // namespace sfntly
diff --git a/test/open_type_data_test.cc b/test/open_type_data_test.cc
index ef1d390..da07e69 100644
--- a/test/open_type_data_test.cc
+++ b/test/open_type_data_test.cc
@@ -24,7 +24,7 @@
const byte_t TEST_OTF_DATA[] =
{0xff, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
-bool testOTFRead() {
+bool TestOTFRead() {
ByteVector bytes;
for (size_t i = 0; i < sizeof(TEST_OTF_DATA) / sizeof(byte_t); ++i) {
bytes.push_back(TEST_OTF_DATA[i]);
@@ -32,18 +32,18 @@
ByteArrayPtr array = new MemoryByteArray(&(bytes[0]), bytes.size());
ReadableFontDataPtr data = new ReadableFontData(array);
- EXPECT_EQ(-1, data->readByte(0));
- EXPECT_EQ(0xff, data->readUByte(0));
- EXPECT_EQ(0x01, data->readByte(1));
- EXPECT_EQ(65281, data->readUShort(0));
- EXPECT_EQ(-255, data->readShort(0));
- EXPECT_EQ(16711937, data->readUInt24(0));
- EXPECT_EQ(4278255873LL, data->readULong(0));
- EXPECT_EQ(-16711423, data->readLong(0));
+ EXPECT_EQ(-1, data->ReadByte(0));
+ EXPECT_EQ(0xff, data->ReadUByte(0));
+ EXPECT_EQ(0x01, data->ReadByte(1));
+ EXPECT_EQ(65281, data->ReadUShort(0));
+ EXPECT_EQ(-255, data->ReadShort(0));
+ EXPECT_EQ(16711937, data->ReadUInt24(0));
+ EXPECT_EQ(4278255873LL, data->ReadULong(0));
+ EXPECT_EQ(-16711423, data->ReadLong(0));
return true;
}
-bool testOTFCopy() {
+bool TestOTFCopy() {
ByteVector source_bytes(1024);
for (size_t i = 0; i < source_bytes.size(); ++i) {
source_bytes[i] = (byte_t)(i & 0xff);
@@ -56,7 +56,7 @@
new MemoryByteArray(&(destination_bytes[0]), 1024);
WritableFontDataPtr destination = new WritableFontData(destination_array);
- int32_t length = source->copyTo(destination);
+ int32_t length = source->CopyTo(destination);
EXPECT_EQ(1024, length);
EXPECT_TRUE(std::equal(source_bytes.begin(), source_bytes.end(),
destination_bytes.begin()));
diff --git a/test/open_type_data_test.h b/test/open_type_data_test.h
index 99bd422..30d8a54 100644
--- a/test/open_type_data_test.h
+++ b/test/open_type_data_test.h
@@ -19,8 +19,8 @@
namespace sfntly {
-bool testOTFRead();
-bool testOTFCopy();
+bool TestOTFRead();
+bool TestOTFCopy();
} // namespace sfntly
diff --git a/test/otf_basic_editing_test.cc b/test/otf_basic_editing_test.cc
index 6c8bde9..e9f4bcd 100644
--- a/test/otf_basic_editing_test.cc
+++ b/test/otf_basic_editing_test.cc
@@ -29,39 +29,39 @@
namespace sfntly {
-bool testOTFBasicEditing() {
- FontFactoryPtr factory = FontFactory::getInstance();
+bool TestOTFBasicEditing() {
+ FontFactoryPtr factory = FontFactory::GetInstance();
FontBuilderArray font_builder_array;
- builderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array);
+ BuilderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array);
FontBuilderPtr font_builder = font_builder_array[0];
// ensure the builder is not bogus
EXPECT_TRUE(font_builder != NULL);
- TableBuilderMap* builder_map = font_builder->tableBuilders();
+ TableBuilderMap* builder_map = font_builder->table_builders();
EXPECT_TRUE(builder_map != NULL);
for (TableBuilderMap::iterator i = builder_map->begin(),
e = builder_map->end(); i != e; ++i) {
EXPECT_TRUE(i->second != NULL);
if (i->second == NULL) {
char tag[5] = {0};
- int32_t value = toBE32(i->first);
+ int32_t value = ToBE32(i->first);
memcpy(tag, &value, 4);
fprintf(stderr, "tag %s does not have valid builder\n", tag);
}
}
IntegerSet builder_tags;
- font_builder->tableBuilderTags(&builder_tags);
+ font_builder->TableBuilderTags(&builder_tags);
FontHeaderTableBuilderPtr header_builder =
down_cast<FontHeaderTable::Builder*>(
- font_builder->getTableBuilder(Tag::head));
- int64_t mod_date = header_builder->modified();
- header_builder->setModified(mod_date + 1);
+ font_builder->GetTableBuilder(Tag::head));
+ int64_t mod_date = header_builder->Modified();
+ header_builder->SetModified(mod_date + 1);
FontPtr font;
- font.attach(font_builder->build());
+ font.Attach(font_builder->Build());
// ensure every table had a builder
- TableMap* table_map = font->tables();
+ TableMap* table_map = font->Tables();
for (TableMap::iterator i = table_map->begin(), e = table_map->end();
i != e; ++i) {
TablePtr table = (*i).second;
@@ -71,9 +71,9 @@
}
EXPECT_TRUE(builder_tags.empty());
- FontHeaderTablePtr header = down_cast<FontHeaderTable*>(
- font->table(Tag::head));
- int64_t after_mod_date = header->modified();
+ FontHeaderTablePtr header =
+ down_cast<FontHeaderTable*>(font->GetTable(Tag::head));
+ int64_t after_mod_date = header->Modified();
EXPECT_EQ(mod_date + 1, after_mod_date);
return true;
}
diff --git a/test/otf_basic_editing_test.h b/test/otf_basic_editing_test.h
index b3abfad..483ed90 100644
--- a/test/otf_basic_editing_test.h
+++ b/test/otf_basic_editing_test.h
@@ -19,7 +19,7 @@
namespace sfntly {
-bool testOTFBasicEditing();
+bool TestOTFBasicEditing();
} // namespace sfntly
diff --git a/test/smart_pointer_test.cc b/test/smart_pointer_test.cc
index a35e289..7eac019 100644
--- a/test/smart_pointer_test.cc
+++ b/test/smart_pointer_test.cc
@@ -28,7 +28,7 @@
int foo() { return foo_; }
};
-bool testSmartPointer() {
+bool TestSmartPointer() {
// scope out allocation
{
Ptr<Foo> p1;
@@ -55,7 +55,7 @@
EXPECT_EQ(size_t(2), p3->ref_count_);
EXPECT_EQ(size_t(2), RefCounted<Foo>::object_counter_);
- p3.release();
+ p3.Release();
EXPECT_EQ(size_t(1), p1->ref_count_);
EXPECT_EQ(NULL, p3.p_);
EXPECT_EQ(size_t(2), RefCounted<Foo>::object_counter_);
diff --git a/test/smart_pointer_test.h b/test/smart_pointer_test.h
index ebc0a1f..b57f614 100644
--- a/test/smart_pointer_test.h
+++ b/test/smart_pointer_test.h
@@ -17,6 +17,6 @@
#ifndef TYPOGRAPHY_FONT_SFNTLY_SRC_TEST_SMART_POINTER_TEST_H_
#define TYPOGRAPHY_FONT_SFNTLY_SRC_TEST_SMART_POINTER_TEST_H_
-bool testSmartPointer();
+bool TestSmartPointer();
#endif // TYPOGRAPHY_FONT_SFNTLY_SRC_TEST_SMART_POINTER_TEST_H_
diff --git a/test/test_font_utils.cc b/test/test_font_utils.cc
index 830f96e..2c7e1fe 100644
--- a/test/test_font_utils.cc
+++ b/test/test_font_utils.cc
@@ -23,32 +23,32 @@
namespace sfntly {
-void builderForFontFile(const char* font_path, FontFactory* factory,
+void BuilderForFontFile(const char* font_path, FontFactory* factory,
FontBuilderArray* builders) {
assert(factory);
FileInputStream is;
- is.open(font_path);
- factory->loadFontsForBuilding(&is, builders);
+ is.Open(font_path);
+ factory->LoadFontsForBuilding(&is, builders);
EXPECT_GT(builders->size(), static_cast<size_t>(0));
}
-void serializeFont(const char* font_path, FontFactory* factory, Font* font) {
+void SerializeFont(const char* font_path, FontFactory* factory, Font* font) {
assert(font_path);
assert(factory);
assert(font);
MemoryOutputStream output_stream;
- factory->serializeFont(font, &output_stream);
- serializeToFile(&output_stream, font_path);
+ factory->SerializeFont(font, &output_stream);
+ SerializeToFile(&output_stream, font_path);
}
-void loadFont(const char* font_path, FontFactory* factory, FontArray* fonts) {
+void LoadFont(const char* font_path, FontFactory* factory, FontArray* fonts) {
FileInputStream is;
- is.open(font_path);
- factory->loadFonts(&is, fonts);
- is.close();
+ is.Open(font_path);
+ factory->LoadFonts(&is, fonts);
+ is.Close();
}
-void loadFile(const char* input_file_path, ByteVector* input_buffer) {
+void LoadFile(const char* input_file_path, ByteVector* input_buffer) {
assert(input_file_path);
assert(input_buffer);
@@ -68,7 +68,7 @@
fclose(input_file);
}
-void serializeToFile(MemoryOutputStream* output_stream, const char* file_path) {
+void SerializeToFile(MemoryOutputStream* output_stream, const char* file_path) {
assert(file_path);
assert(output_stream);
@@ -79,12 +79,12 @@
output_file = fopen(file_path, "wb");
#endif
EXPECT_NE(output_file, reinterpret_cast<FILE*>(NULL));
- fwrite(output_stream->get(), 1, output_stream->size(), output_file);
+ fwrite(output_stream->Get(), 1, output_stream->Size(), output_file);
fflush(output_file);
fclose(output_file);
}
-void hexDump(const unsigned char* byte_data, size_t length) {
+void HexDump(const unsigned char* byte_data, size_t length) {
if (byte_data == NULL || length == 0) {
fprintf(stderr, "<NULL>\n");
return;
diff --git a/test/test_font_utils.h b/test/test_font_utils.h
index b0c5696..6c70edc 100644
--- a/test/test_font_utils.h
+++ b/test/test_font_utils.h
@@ -23,15 +23,15 @@
namespace sfntly {
-void builderForFontFile(const char* font_path, FontFactory* factory,
+void BuilderForFontFile(const char* font_path, FontFactory* factory,
FontBuilderArray* builders);
-void serializeFont(const char* font_path, FontFactory* factory, Font* font);
-void loadFont(const char* font_path, FontFactory* factory, FontArray* fonts);
+void SerializeFont(const char* font_path, FontFactory* factory, Font* font);
+void LoadFont(const char* font_path, FontFactory* factory, FontArray* fonts);
-void loadFile(const char* input_file_path, ByteVector* input_buffer);
-void serializeToFile(MemoryOutputStream* output_stream, const char* file_path);
+void LoadFile(const char* input_file_path, ByteVector* input_buffer);
+void SerializeToFile(MemoryOutputStream* output_stream, const char* file_path);
-void hexDump(const unsigned char* byte_data, size_t length);
+void HexDump(const unsigned char* byte_data, size_t length);
} // namespace sfntly
diff --git a/test/test_utils.cc b/test/test_utils.cc
index 4b4644e..4751b92 100644
--- a/test/test_utils.cc
+++ b/test/test_utils.cc
@@ -30,15 +30,15 @@
TestUtils::TestUtils() {}
// static
-// OutputStream createOutputStream(const char *file_path) {
+// OutputStream CreateOutputStream(const char *file_path) {
// }
// static
-// void TestUtils::createNewFile(const char* file_path) {
+// void TestUtils::CreateNewFile(const char* file_path) {
// }
// static
-int32_t TestUtils::encodeOneChar(UConverter* encoder, int16_t uchar) {
+int32_t TestUtils::EncodeOneChar(UConverter* encoder, int16_t uchar) {
char* target = new char[ucnv_getMaxCharSize(encoder) * 2];
char* target_end;
UChar* source = new UChar[2];
@@ -69,7 +69,7 @@
}
// static
-UConverter* TestUtils::getEncoder(const char* charset_name) {
+UConverter* TestUtils::GetEncoder(const char* charset_name) {
if (charset_name == NULL || strcmp(charset_name, "") == 0)
return NULL;
UErrorCode status = U_ZERO_ERROR;
@@ -81,7 +81,7 @@
// Get a file's extension
// static
-const char* TestUtils::extension(const char* file_path) {
+const char* TestUtils::Extension(const char* file_path) {
if (!file_path)
return NULL;
return strrchr(file_path, EXTENSION_SEPARATOR);
diff --git a/test/test_utils.h b/test/test_utils.h
index 6aa4d99..4d692e1 100644
--- a/test/test_utils.h
+++ b/test/test_utils.h
@@ -40,8 +40,10 @@
// @param length the length of the byte arrays to compare
// @return true if the array segments are equal; false otherwise
// TODO(dfilimon): implement
- static bool equals(ByteArray* b1, int32_t offset1,
- ByteArray* b2, int32_t offset2);
+ static bool Equals(ByteArray* b1,
+ int32_t offset1,
+ ByteArray* b2,
+ int32_t offset2);
// @param offset1 offset to start comparing the first ByteArray from
// @param ba1 the first ByteArray
@@ -50,8 +52,11 @@
// @param length the number of bytes to compare
// @return true if all bytes in the ranges given are equal; false otherwise
// TODO(dfilimon): implement
- static bool equals(ByteArray* b1, int32_t offset1,
- ByteArray* b2, int32_t offset2, int32_t length);
+ static bool Equals(ByteArray* b1,
+ int32_t offset1,
+ ByteArray* b2,
+ int32_t offset2,
+ int32_t length);
// TODO(dfilimon): implement FileOutputStream in port/file_output_stream.*
// static OutputStream createOutputStream(const char* file_path);
@@ -62,13 +67,13 @@
// Creates a new file including deleting an already existing file with the
// same path and name and creating any needed directories.
// TODO(dfilimon): implement
- static void createNewFile(const char* file_path);
+ static void CreateNewFile(const char* file_path);
// Converts an integer into a 4 character string using the ASCII encoding.
// @param i the value to convert
// @return the String based on the number
// TODO(dfilimon): implement
- static void dumpLongAsString(int32_t i, std::string* result);
+ static void DumpLongAsString(int32_t i, std::string* result);
// Calculate an OpenType checksum from the array.
// @param b the array to calculate checksum on
@@ -76,20 +81,20 @@
// @param length the number of bytes to check; must be a multiple of 4
// @return checksum
// TODO(dfilimon): implement
- static int64_t checkSum(ByteArray* b, int32_t offset, int32_t length);
+ static int64_t CheckSum(ByteArray* b, int32_t offset, int32_t length);
// Encode a single character in UTF-16.
// We only support the BMP for now
// @param encoder the encoder to use for the encoding
// @param uchar the Unicode character to encode
// @return the encoded character
- static int32_t encodeOneChar(UConverter* encoder, int16_t uchar);
+ static int32_t EncodeOneChar(UConverter* encoder, int16_t uchar);
// Get an encoder for the charset name.
// If the name is null or the empty string then just return null.
// @param charsetName the charset to get an encoder for
// @return an encoder or null if no encoder available for charset name
- static UConverter* getEncoder(const char* charsetName);
+ static UConverter* GetEncoder(const char* charsetName);
private:
static const char EXTENSION_SEPARATOR = '.';
@@ -99,7 +104,7 @@
// @param file the whose name to process
// @return string containing the extension or an empty string if
// there is no extension
- static const char* extension(const char* file_path);
+ static const char* Extension(const char* file_path);
};
}
#endif // TYPOGRAPHY_FONT_SFNTLY_SRC_TEST_TEST_UTILS_H_
diff --git a/test/test_utils_test.cc b/test/test_utils_test.cc
index 12c5512..41ba905 100644
--- a/test/test_utils_test.cc
+++ b/test/test_utils_test.cc
@@ -27,8 +27,8 @@
// Check if proper encoding is being performed
// Conversion is done from UTF16 to UTF8, SJIS
-bool testEncoding() {
- UConverter* conv = TestUtils::getEncoder("utf8");
+bool TestEncoding() {
+ UConverter* conv = TestUtils::GetEncoder("utf8");
EXPECT_TRUE(conv != NULL);
// Ūnĭcōde̽
UChar from[8] = {0x016A, 0x006E, 0x012D, 0x0063, 0x014D, 0x0064, 0x0065,
@@ -37,7 +37,7 @@
0x65, 0xcc, 0xbd};
int32_t i, j = 0;
for (i = 0; i < 7; ++i) {
- int32_t encoded = TestUtils::encodeOneChar(conv, (int16_t)from[i]);
+ int32_t encoded = TestUtils::EncodeOneChar(conv, (int16_t)from[i]);
for (; encoded; encoded <<= 8) {
byte_t b = (encoded & 0xff000000) >> 24;
if (!b)
@@ -54,22 +54,22 @@
}
// Check if the proper extension is obtained
-bool testExtension() {
+bool TestExtension() {
// usual file name
const char *result;
- result = TestUtils::extension("../data/ext/arial.ttf");
+ result = TestUtils::Extension("../data/ext/tuffy.ttf");
EXPECT_EQ(strcmp(result, ".ttf"), 0);
// more than one 'extension'
- result = TestUtils::extension("arial.ttf.fake");
+ result = TestUtils::Extension("tuffy.ttf.fake");
EXPECT_EQ(strcmp(result, ".fake"), 0);
// no extension
- result = TestUtils::extension("arial");
+ result = TestUtils::Extension("tuffy");
EXPECT_STREQ(result, NULL);
// bogus extension
- result = TestUtils::extension("arial.");
+ result = TestUtils::Extension("tuffy.");
EXPECT_EQ(strcmp(result, "."), 0);
return true;
diff --git a/test/test_utils_test.h b/test/test_utils_test.h
index 1b4649e..c830ed1 100644
--- a/test/test_utils_test.h
+++ b/test/test_utils_test.h
@@ -21,9 +21,9 @@
namespace sfntly {
-bool testEncoding();
-bool testExtension();
-bool testReadFile();
+bool TestEncoding();
+bool TestExtension();
+bool TestReadFile();
} // namespace sfntly