diff options
Diffstat (limited to 'gfx/sfntly/cpp/src/test/font_parsing_test.cc')
-rw-r--r-- | gfx/sfntly/cpp/src/test/font_parsing_test.cc | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/gfx/sfntly/cpp/src/test/font_parsing_test.cc b/gfx/sfntly/cpp/src/test/font_parsing_test.cc new file mode 100644 index 0000000000..6fd5c3b29e --- /dev/null +++ b/gfx/sfntly/cpp/src/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()); +} |