1464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com/* 2464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Copyright 2011 Google Inc. All Rights Reserved. 3464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * 4464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Licensed under the Apache License, Version 2.0 (the "License"); 5464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * you may not use this file except in compliance with the License. 6464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * You may obtain a copy of the License at 7464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * 8464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * http://www.apache.org/licenses/LICENSE-2.0 9464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * 10464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Unless required by applicable law or agreed to in writing, software 11464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * distributed under the License is distributed on an "AS IS" BASIS, 12464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * See the License for the specific language governing permissions and 14464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * limitations under the License. 15464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com */ 16464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 17464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com#include "gtest/gtest.h" 18464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com#include "sfntly/font.h" 19464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com#include "sfntly/font_factory.h" 205af34fd773f8cfee82321393504f558ddf67c628arthurhsu@google.com#include "sfntly/table/core/font_header_table.h" 21464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com#include "sfntly/tag.h" 22ed8406cf320973d04bbe348c681090b1feba3d68arthurhsu@google.com#include "sfntly/data/memory_byte_array.h" 23ed8406cf320973d04bbe348c681090b1feba3d68arthurhsu@google.com#include "sfntly/port/endian.h" 24ed8406cf320973d04bbe348c681090b1feba3d68arthurhsu@google.com#include "sfntly/port/file_input_stream.h" 25ed8406cf320973d04bbe348c681090b1feba3d68arthurhsu@google.com#include "sfntly/port/memory_output_stream.h" 26ed8406cf320973d04bbe348c681090b1feba3d68arthurhsu@google.com#include "test/test_data.h" 27ed8406cf320973d04bbe348c681090b1feba3d68arthurhsu@google.com#include "test/test_font_utils.h" 28464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 29464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.comnamespace sfntly { 30464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 31246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.combool TestOTFBasicEditing() { 326a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com FontFactoryPtr factory; 336a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com factory.Attach(FontFactory::GetInstance()); 34464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com FontBuilderArray font_builder_array; 35246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com BuilderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array); 36464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com FontBuilderPtr font_builder = font_builder_array[0]; 37464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 38464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com // ensure the builder is not bogus 39464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com EXPECT_TRUE(font_builder != NULL); 40246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com TableBuilderMap* builder_map = font_builder->table_builders(); 41464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com EXPECT_TRUE(builder_map != NULL); 42b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com IntegerSet builder_tags; 43464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com for (TableBuilderMap::iterator i = builder_map->begin(), 44464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com e = builder_map->end(); i != e; ++i) { 45464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com EXPECT_TRUE(i->second != NULL); 46464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com if (i->second == NULL) { 47464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com char tag[5] = {0}; 48246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com int32_t value = ToBE32(i->first); 49ed8406cf320973d04bbe348c681090b1feba3d68arthurhsu@google.com memcpy(tag, &value, 4); 50464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com fprintf(stderr, "tag %s does not have valid builder\n", tag); 51b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com } else { 52b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com builder_tags.insert(i->first); 53464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } 54464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } 55464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 56464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com FontHeaderTableBuilderPtr header_builder = 57464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com down_cast<FontHeaderTable::Builder*>( 58246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com font_builder->GetTableBuilder(Tag::head)); 59246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com int64_t mod_date = header_builder->Modified(); 60246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com header_builder->SetModified(mod_date + 1); 61464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com FontPtr font; 62246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com font.Attach(font_builder->Build()); 63464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 64464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com // ensure every table had a builder 65b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com const TableMap* table_map = font->GetTableMap(); 66b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com for (TableMap::const_iterator i = table_map->begin(), e = table_map->end(); 67b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com i != e; ++i) { 68464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com TablePtr table = (*i).second; 696b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com HeaderPtr header = table->header(); 70464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com EXPECT_TRUE(builder_tags.find(header->tag()) != builder_tags.end()); 71464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com builder_tags.erase(header->tag()); 72464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } 73464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com EXPECT_TRUE(builder_tags.empty()); 74464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 75246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com FontHeaderTablePtr header = 76246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com down_cast<FontHeaderTable*>(font->GetTable(Tag::head)); 77246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com int64_t after_mod_date = header->Modified(); 78464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com EXPECT_EQ(mod_date + 1, after_mod_date); 79db6755301647bc1ad0616d7e370138bc822b4b06arthurhsu@google.com 80db6755301647bc1ad0616d7e370138bc822b4b06arthurhsu@google.com // Checksum correctness of builder. 81db6755301647bc1ad0616d7e370138bc822b4b06arthurhsu@google.com TablePtr post = font->GetTable(Tag::post); 82db6755301647bc1ad0616d7e370138bc822b4b06arthurhsu@google.com EXPECT_EQ(post->CalculatedChecksum(), TTF_CHECKSUM[SAMPLE_TTF_POST]); 83464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com return true; 84464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 85464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 86464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} // namespace sfntly 876a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com 886a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.comTEST(OTFBasicEditing, All) { 896a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com ASSERT_TRUE(sfntly::TestOTFBasicEditing()); 906a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com} 91