summaryrefslogtreecommitdiff
path: root/test/font_parsing_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/font_parsing_test.cc')
-rw-r--r--test/font_parsing_test.cc140
1 files changed, 140 insertions, 0 deletions
diff --git a/test/font_parsing_test.cc b/test/font_parsing_test.cc
new file mode 100644
index 0000000..6fd5c3b
--- /dev/null
+++ b/test/font_parsing_test.cc
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2011 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gtest/gtest.h"
+
+#include "sfntly/data/font_input_stream.h"
+#include "sfntly/data/memory_byte_array.h"
+#include "sfntly/font.h"
+#include "sfntly/font_factory.h"
+#include "sfntly/table/core/font_header_table.h"
+#include "sfntly/table/table.h"
+#include "sfntly/table/generic_table_builder.h"
+#include "sfntly/table/table_based_table_builder.h"
+#include "sfntly/tag.h"
+#include "sfntly/port/file_input_stream.h"
+#include "test/test_data.h"
+#include "test/test_font_utils.h"
+
+namespace sfntly {
+
+bool TestFontParsing() {
+ ByteVector input_buffer;
+ LoadFile(SAMPLE_TTF_FILE, &input_buffer);
+
+ FontFactoryPtr factory;
+ factory.Attach(FontFactory::GetInstance());
+ // File based
+ FontBuilderArray 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(&input_buffer, &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]));
+ }
+
+ // Generic table
+ Ptr<GenericTableBuilder> gdef_builder =
+ down_cast<GenericTableBuilder*>(font_builder->GetTableBuilder(Tag::feat));
+ HeaderPtr gdef_header = gdef_builder->header();
+ EXPECT_EQ(gdef_header->length(), TTF_LENGTH[SAMPLE_TTF_FEAT]);
+ EXPECT_EQ(gdef_header->offset(), TTF_OFFSET[SAMPLE_TTF_FEAT]);
+ EXPECT_EQ(gdef_header->checksum(), TTF_CHECKSUM[SAMPLE_TTF_FEAT]);
+ EXPECT_TRUE(gdef_header->checksum_valid());
+
+ WritableFontDataPtr wfd;
+ wfd.Attach(gdef_builder->Data());
+ ByteVector b;
+ b.resize(TTF_LENGTH[SAMPLE_TTF_FEAT]);
+ wfd->ReadBytes(0, &(b[0]), 0, TTF_LENGTH[SAMPLE_TTF_FEAT]);
+ EXPECT_EQ(memcmp(&(b[0]), TTF_FEAT_DATA, TTF_LENGTH[SAMPLE_TTF_FEAT]), 0);
+
+ // Header table
+ FontHeaderTableBuilderPtr header_builder =
+ down_cast<FontHeaderTable::Builder*>(
+ font_builder->GetTableBuilder(Tag::head));
+ HeaderPtr 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->checksum_valid());
+
+ // Data conformance
+ for (size_t i = 0; i < SAMPLE_TTF_KNOWN_TAGS; ++i) {
+ ByteVector b1, b2;
+ b1.resize(TTF_LENGTH[i]);
+ b2.resize(TTF_LENGTH[i]);
+ TableBuilderPtr builder1 =
+ font_builder->GetTableBuilder(TTF_KNOWN_TAGS[i]);
+ TableBuilderPtr builder2 =
+ font_builder2->GetTableBuilder(TTF_KNOWN_TAGS[i]);
+ WritableFontDataPtr wfd1;
+ wfd1.Attach(builder1->Data());
+ WritableFontDataPtr wfd2;
+ wfd2.Attach(builder2->Data());
+ wfd1->ReadBytes(0, &(b1[0]), 0, TTF_LENGTH[i]);
+ wfd2->ReadBytes(0, &(b2[0]), 0, TTF_LENGTH[i]);
+ EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), TTF_LENGTH[i]), 0);
+ }
+
+ return true;
+}
+
+bool TestTTFReadWrite() {
+ FontFactoryPtr factory;
+ factory.Attach(FontFactory::GetInstance());
+ FontBuilderArray font_builder_array;
+ BuilderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array);
+ FontBuilderPtr font_builder = font_builder_array[0];
+ FontPtr font;
+ font.Attach(font_builder->Build());
+ MemoryOutputStream output_stream;
+ factory->SerializeFont(font, &output_stream);
+ EXPECT_GE(output_stream.Size(), SAMPLE_TTF_SIZE);
+
+ return true;
+}
+
+bool TestTTFMemoryBasedReadWrite() {
+ ByteVector input_buffer;
+ LoadFile(SAMPLE_TTF_FILE, &input_buffer);
+
+ FontFactoryPtr factory;
+ factory.Attach(FontFactory::GetInstance());
+ FontBuilderArray font_builder_array;
+ factory->LoadFontsForBuilding(&input_buffer, &font_builder_array);
+ FontBuilderPtr font_builder = font_builder_array[0];
+ FontPtr font;
+ font.Attach(font_builder->Build());
+ MemoryOutputStream output_stream;
+ factory->SerializeFont(font, &output_stream);
+ EXPECT_GE(output_stream.Size(), input_buffer.size());
+
+ return true;
+}
+
+} // namespace sfntly
+
+TEST(FontParsing, All) {
+ ASSERT_TRUE(sfntly::TestFontParsing());
+ ASSERT_TRUE(sfntly::TestTTFReadWrite());
+ ASSERT_TRUE(sfntly::TestTTFMemoryBasedReadWrite());
+}