/* * 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/font.h" #include "sfntly/font_factory.h" #include "sfntly/port/memory_input_stream.h" #include "sfntly/port/memory_output_stream.h" #include "test/test_data.h" #include "test/test_font_utils.h" #include "test/serialization_test.h" namespace sfntly { bool TestSerialization() { FontFactoryPtr factory1, factory2, factory3; factory1.Attach(FontFactory::GetInstance()); FontArray font_array; LoadFont(SAMPLE_TTF_FILE, factory1, &font_array); FontPtr original = font_array[0]; factory2.Attach(FontFactory::GetInstance()); FontBuilderArray font_builder_array; BuilderForFontFile(SAMPLE_TTF_FILE, factory2, &font_builder_array); FontBuilderPtr font_builder = font_builder_array[0]; FontPtr intermediate; intermediate.Attach(font_builder->Build()); MemoryOutputStream os; factory2->SerializeFont(intermediate, &os); factory3.Attach(FontFactory::GetInstance()); FontArray new_font_array; MemoryInputStream is; is.Attach(os.Get(), os.Size()); factory3->LoadFonts(&is, &new_font_array); FontPtr serialized = new_font_array[0]; // Check number of tables EXPECT_EQ(original->num_tables(), serialized->num_tables()); // Check if same set of tables const TableMap* original_tables = original->GetTableMap(); const TableMap* serialized_tables = serialized->GetTableMap(); EXPECT_EQ(original_tables->size(), serialized_tables->size()); TableMap::const_iterator not_found = serialized_tables->end(); for (TableMap::const_iterator b = original_tables->begin(), e = original_tables->end(); b != e; ++b) { EXPECT_TRUE((serialized_tables->find(b->first) != not_found)); } // TODO(arthurhsu): check cmap equivalence // Check checksum equivalence for (size_t i = 0; i < SAMPLE_TTF_KNOWN_TAGS; ++i) { TablePtr original_table = original->GetTable(TTF_KNOWN_TAGS[i]); TablePtr serialized_table = serialized->GetTable(TTF_KNOWN_TAGS[i]); EXPECT_EQ(original_table->CalculatedChecksum(), serialized_table->CalculatedChecksum()); EXPECT_EQ(original_table->DataLength(), serialized_table->DataLength()); if (TTF_KNOWN_TAGS[i] == Tag::hhea) { EXPECT_TRUE(VerifyHHEA(original_table, serialized_table)); } else if (TTF_KNOWN_TAGS[i] == Tag::glyf) { EXPECT_TRUE(VerifyGLYF(original_table, serialized_table)); } else if (TTF_KNOWN_TAGS[i] == Tag::hmtx) { EXPECT_TRUE(VerifyHMTX(original_table, serialized_table)); } else if (TTF_KNOWN_TAGS[i] == Tag::loca) { EXPECT_TRUE(VerifyLOCA(original_table, serialized_table)); } else if (TTF_KNOWN_TAGS[i] == Tag::maxp) { EXPECT_TRUE(VerifyMAXP(original_table, serialized_table)); } else if (TTF_KNOWN_TAGS[i] == Tag::name) { EXPECT_TRUE(VerifyNAME(original_table, serialized_table)); } else if (TTF_KNOWN_TAGS[i] == Tag::OS_2) { EXPECT_TRUE(VerifyOS_2(original_table, serialized_table)); } } return true; } bool TestSerializationBitmap() { FontFactoryPtr factory1, factory2, factory3; factory1.Attach(FontFactory::GetInstance()); FontArray font_array; LoadFont(SAMPLE_BITMAP_FONT, factory1, &font_array); FontPtr original = font_array[0]; factory2.Attach(FontFactory::GetInstance()); FontBuilderArray font_builder_array; BuilderForFontFile(SAMPLE_BITMAP_FONT, factory2, &font_builder_array); FontBuilderPtr font_builder = font_builder_array[0]; FontPtr intermediate; intermediate.Attach(font_builder->Build()); MemoryOutputStream os; factory2->SerializeFont(intermediate, &os); factory3.Attach(FontFactory::GetInstance()); FontArray new_font_array; MemoryInputStream is; is.Attach(os.Get(), os.Size()); factory3->LoadFonts(&is, &new_font_array); FontPtr serialized = new_font_array[0]; // Check number of tables EXPECT_EQ(original->num_tables(), serialized->num_tables()); // Check if same set of tables const TableMap* original_tables = original->GetTableMap(); const TableMap* serialized_tables = serialized->GetTableMap(); EXPECT_EQ(original_tables->size(), serialized_tables->size()); TableMap::const_iterator not_found = serialized_tables->end(); for (TableMap::const_iterator b = original_tables->begin(), e = original_tables->end(); b != e; ++b) { EXPECT_TRUE((serialized_tables->find(b->first) != not_found)); } // Check checksum equivalence for (size_t i = 0; i < SAMPLE_BITMAP_KNOWN_TAGS; ++i) { TablePtr original_table = original->GetTable(BITMAP_KNOWN_TAGS[i]); TablePtr serialized_table = serialized->GetTable(BITMAP_KNOWN_TAGS[i]); EXPECT_EQ(original_table->CalculatedChecksum(), serialized_table->CalculatedChecksum()); EXPECT_EQ(original_table->DataLength(), serialized_table->DataLength()); } return true; } } // namespace sfntly TEST(Serialization, Simple) { ASSERT_TRUE(sfntly::TestSerialization()); } TEST(Serialization, Bitmap) { ASSERT_TRUE(sfntly::TestSerializationBitmap()); }