| /* |
| * 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()); |
| } |