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