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