1a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com/*
2a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com * Copyright 2011 Google Inc. All Rights Reserved.
3a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com *
4a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com * Licensed under the Apache License, Version 2.0 (the "License");
5a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com * you may not use this file except in compliance with the License.
6a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com * You may obtain a copy of the License at
7a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com *
8a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com *      http://www.apache.org/licenses/LICENSE-2.0
9a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com *
10a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com * Unless required by applicable law or agreed to in writing, software
11a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com * distributed under the License is distributed on an "AS IS" BASIS,
12a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com * See the License for the specific language governing permissions and
14a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com * limitations under the License.
15a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com */
16a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com
17a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include <map>
18a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include <algorithm>
19a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com
20a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include "sfntly/font.h"
21a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include "sfntly/font_factory.h"
22a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include "sfntly/table/core/font_header_table.h"
23a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include "sfntly/tag.h"
24a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include "sfntly/data/memory_byte_array.h"
25a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include "sfntly/port/endian.h"
26a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include "sfntly/port/file_input_stream.h"
27a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include "sfntly/port/memory_output_stream.h"
28a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include "test/test_data.h"
29a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include "test/test_font_utils.h"
30a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include "sfntly/table/core/cmap_table.h"
31a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include "sfntly/port/refcount.h"
32a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com#include "gtest/gtest.h"
33a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com
34a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.comnamespace sfntly {
35a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.comTEST(CMapEditingTest, RemoveAllButOneCMap) {
36a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  FontBuilderArray builders;
37a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  FontFactoryPtr font_factory;
38a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  font_factory.Attach(FontFactory::GetInstance());
39a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  BuilderForFontFile(SAMPLE_TTF_FILE, font_factory, &builders);
40a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  ASSERT_FALSE(builders.empty());
41a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  FontBuilderPtr font_builder = builders[0];
42a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  Ptr<CMapTable::Builder> cmap_table_builder =
43a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com      (CMapTable::Builder*)font_builder->GetTableBuilder(Tag::cmap);
44a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  ASSERT_NE(cmap_table_builder, reinterpret_cast<CMapTable::Builder*>(NULL));
45a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  CMapTable::CMapBuilderMap*
46a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com      cmap_builders = cmap_table_builder->GetCMapBuilders();
47a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  ASSERT_FALSE(cmap_builders->empty());
48a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com
49a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  for (CMapTable::CMapBuilderMap::iterator
50a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com           it = cmap_builders->begin(); it != cmap_builders->end();) {
51a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com    if (it->second->cmap_id() == CMapTable::WINDOWS_BMP) {
52a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com      ++it;
53a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com    } else {
54a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com      cmap_builders->erase(it++);
55a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com    }
56a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  }
57a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  ASSERT_EQ(cmap_builders->size(), (uint32_t)1);
58a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  Font* font = font_builder->Build();
59a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  CMapTablePtr cmap_table = down_cast<CMapTable*>(font->GetTable(Tag::cmap));
60a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  ASSERT_EQ(1, cmap_table->NumCMaps());
61a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  CMapTable::CMapPtr cmap;
62a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  cmap.Attach(cmap_table->GetCMap(CMapTable::WINDOWS_BMP));
63a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  ASSERT_EQ(CMapTable::WINDOWS_BMP, cmap->cmap_id());
64a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  delete font;
65a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com}
66a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com
67a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.comTEST(CMapEditingTest, CopyAllCMapsToNewFont) {
68a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  FontArray fonts;
69a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  FontFactoryPtr font_factory;
70a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  font_factory.Attach(FontFactory::GetInstance());
71a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  LoadFont(SAMPLE_TTF_FILE, font_factory, &fonts);
72a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com
73a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  ASSERT_FALSE(fonts.empty());
74a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  ASSERT_FALSE(fonts[0] == NULL);
75a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  FontPtr font = fonts[0];
76a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  CMapTablePtr cmap_table = down_cast<CMapTable*>(font->GetTable(Tag::cmap));
77a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  FontBuilderPtr font_builder;
78a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  font_builder.Attach(font_factory->NewFontBuilder());
79a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  Ptr<CMapTable::Builder> cmap_table_builder =
80a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com      (CMapTable::Builder*)font_builder->NewTableBuilder(Tag::cmap);
81a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com
82a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  CMapTable::CMapIterator cmap_iter(cmap_table, NULL);
83a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  while (cmap_iter.HasNext()) {
84a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com    CMapTable::CMapPtr cmap;
85a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com    cmap.Attach(cmap_iter.Next());
86a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com    if (!cmap)
87a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com      continue;
88a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com    cmap_table_builder->NewCMapBuilder(cmap->cmap_id(), cmap->ReadFontData());
89a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  }
90a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com
91a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  FontPtr new_font;
92a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  new_font.Attach(font_builder->Build());
93a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  CMapTablePtr new_cmap_table =
94a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com      down_cast<CMapTable*>(font->GetTable(Tag::cmap));
95a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  ASSERT_EQ(cmap_table->NumCMaps(), new_cmap_table->NumCMaps());
96a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  CMapTable::CMapPtr cmap;
97a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  cmap.Attach(cmap_table->GetCMap(CMapTable::WINDOWS_BMP));
98a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  ASSERT_NE(cmap, reinterpret_cast<CMapTable::CMap*>(NULL));
99a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com  ASSERT_EQ(CMapTable::WINDOWS_BMP, cmap->cmap_id());
100a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com}
101a8be98eb7c7b56644732b866346cf8b852592170dfilimon@google.com}
102