summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarthurhsu@google.com <arthurhsu@google.com@672e30a5-4c29-85ac-ac6d-611c735e0a51>2011-08-17 01:29:17 +0000
committerarthurhsu@google.com <arthurhsu@google.com@672e30a5-4c29-85ac-ac6d-611c735e0a51>2011-08-17 01:29:17 +0000
commitc10c3d53cd1401f158e89697b7fe019b6828fa00 (patch)
tree2d47856193d6824369a7b413a98add463d84379f
parent633131f1440aad16805eefd9ff04455f93429433 (diff)
downloadsrc-c10c3d53cd1401f158e89697b7fe019b6828fa00.tar.gz
Bug fix: when table is located at the end of file, original code will determine the wrong size and refuse to read it.
Also reverted changes in r48 due to its test nature. git-svn-id: http://sfntly.googlecode.com/svn/trunk/cpp/src@54 672e30a5-4c29-85ac-ac6d-611c735e0a51
-rw-r--r--sfntly/data/readable_font_data.cc21
-rw-r--r--sfntly/data/writable_font_data.cc8
-rw-r--r--sfntly/data/writable_font_data.h3
-rw-r--r--sfntly/font.cc13
-rwxr-xr-xtest/serialization_test.cc3
-rw-r--r--test/test_utils.h2
6 files changed, 31 insertions, 19 deletions
diff --git a/sfntly/data/readable_font_data.cc b/sfntly/data/readable_font_data.cc
index 5f8478d..904e7db 100644
--- a/sfntly/data/readable_font_data.cc
+++ b/sfntly/data/readable_font_data.cc
@@ -198,15 +198,18 @@ void ReadableFontData::ComputeChecksum() {
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);
- b3 = (b3 == -1) ? 0 : b3;
- int32_t b2 = ReadUByte(i + 1);
- b2 = (b2 == -1) ? 0 : b2;
- int32_t b1 = ReadUByte(i + 2);
- b1 = (b1 == -1) ? 0 : b1;
- int32_t b0 = ReadUByte(i + 3);
- b0 = (b0 == -1) ? 0 : b0;
+ // Checksum all whole 4-byte chunks.
+ for (int32_t i = low_bound; i <= high_bound - 4; i += 4) {
+ sum += ReadULong(i);
+ }
+
+ // Add last fragment if not 4-byte multiple
+ int32_t off = high_bound & -4;
+ if (off < high_bound) {
+ int32_t b3 = ReadUByte(off);
+ int32_t b2 = (off + 1 < high_bound) ? ReadUByte(off + 1) : 0;
+ int32_t b1 = (off + 2 < high_bound) ? ReadUByte(off + 2) : 0;
+ int32_t b0 = 0;
sum += (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
}
return sum;
diff --git a/sfntly/data/writable_font_data.cc b/sfntly/data/writable_font_data.cc
index bf03516..5f694be 100644
--- a/sfntly/data/writable_font_data.cc
+++ b/sfntly/data/writable_font_data.cc
@@ -125,6 +125,14 @@ int32_t WritableFontData::WriteDateTime(int32_t index, int64_t date) {
return 8;
}
+void WritableFontData::CopyFrom(InputStream* is, int32_t length) {
+ array_->CopyFrom(is, length);
+}
+
+void WritableFontData::CopyFrom(InputStream* is) {
+ array_->CopyFrom(is);
+}
+
CALLER_ATTACH FontData* WritableFontData::Slice(int32_t offset,
int32_t length) {
if (offset < 0 || offset + length > Size()) {
diff --git a/sfntly/data/writable_font_data.h b/sfntly/data/writable_font_data.h
index ec74da7..ceefb30 100644
--- a/sfntly/data/writable_font_data.h
+++ b/sfntly/data/writable_font_data.h
@@ -61,6 +61,9 @@ class WritableFontData : public ReadableFontData {
virtual int32_t WriteFixed(int32_t index, int32_t l);
virtual int32_t WriteDateTime(int32_t index, int64_t date);
+ virtual void CopyFrom(InputStream* is, int32_t length);
+ virtual void CopyFrom(InputStream* is);
+
// Makes a slice of this FontData. The returned slice will share the data with
// the original FontData.
// @param offset the start of the slice
diff --git a/sfntly/font.cc b/sfntly/font.cc
index 32ecca7..8d264b5 100644
--- a/sfntly/font.cc
+++ b/sfntly/font.cc
@@ -521,11 +521,10 @@ void Font::Builder::LoadTableData(TableHeaderSortedSet* headers,
table_header != table_end; ++table_header) {
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;
- array.Attach(factory_->GetNewArray(roundup_length));
- array->CopyFrom(&table_is, (*table_header)->length());
- WritableFontDataPtr data = new WritableFontData(array);
+ WritableFontDataPtr data;
+ data.Attach(
+ WritableFontData::CreateWritableFontData((*table_header)->length()));
+ data->CopyFrom(&table_is, (*table_header)->length());
table_data->insert(DataBlockEntry(*table_header, data));
}
}
@@ -536,9 +535,9 @@ void Font::Builder::LoadTableData(TableHeaderSortedSet* headers,
for (TableHeaderSortedSet::iterator
table_header = headers->begin(), table_end = headers->end();
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(), (*table_header)->length()));
WritableFontDataPtr data = down_cast<WritableFontData*>(sliced_data.p_);
table_data->insert(DataBlockEntry(*table_header, data));
}
diff --git a/test/serialization_test.cc b/test/serialization_test.cc
index 507a98c..08c8288 100755
--- a/test/serialization_test.cc
+++ b/test/serialization_test.cc
@@ -67,8 +67,7 @@ bool TestSerialization() {
TablePtr serialized_table = serialized->GetTable(TTF_KNOWN_TAGS[i]);
EXPECT_EQ(original_table->CalculatedChecksum(),
serialized_table->CalculatedChecksum());
- EXPECT_EQ(((original_table->Length() + 3) & ~3),
- ((serialized_table->Length() + 3) & ~3));
+ EXPECT_EQ(original_table->Length(), serialized_table->Length());
if (TTF_KNOWN_TAGS[i] == Tag::hhea) {
EXPECT_TRUE(VerifyHHEA(original_table, serialized_table));
diff --git a/test/test_utils.h b/test/test_utils.h
index a92cd5b..4d692e1 100644
--- a/test/test_utils.h
+++ b/test/test_utils.h
@@ -39,7 +39,7 @@ class TestUtils {
// @param offset2 offset for comparison in byte array 2
// @param length the length of the byte arrays to compare
// @return true if the array segments are equal; false otherwise
- // TODO(dfilimon): implement sometime in the future :)
+ // TODO(dfilimon): implement
static bool Equals(ByteArray* b1,
int32_t offset1,
ByteArray* b2,