/* * 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 <map> #include <algorithm> #include "sfntly/font.h" #include "sfntly/font_factory.h" #include "sfntly/table/core/font_header_table.h" #include "sfntly/tag.h" #include "sfntly/data/memory_byte_array.h" #include "sfntly/port/endian.h" #include "sfntly/port/file_input_stream.h" #include "sfntly/port/memory_output_stream.h" #include "test/test_data.h" #include "test/test_font_utils.h" #include "sfntly/table/core/cmap_table.h" #include "sfntly/port/refcount.h" #include "gtest/gtest.h" namespace sfntly { TEST(CMapEditingTest, RemoveAllButOneCMap) { FontBuilderArray builders; FontFactoryPtr font_factory; font_factory.Attach(FontFactory::GetInstance()); BuilderForFontFile(SAMPLE_TTF_FILE, font_factory, &builders); ASSERT_FALSE(builders.empty()); FontBuilderPtr font_builder = builders[0]; Ptr<CMapTable::Builder> cmap_table_builder = (CMapTable::Builder*)font_builder->GetTableBuilder(Tag::cmap); ASSERT_NE(cmap_table_builder, reinterpret_cast<CMapTable::Builder*>(NULL)); CMapTable::CMapBuilderMap* cmap_builders = cmap_table_builder->GetCMapBuilders(); ASSERT_FALSE(cmap_builders->empty()); for (CMapTable::CMapBuilderMap::iterator it = cmap_builders->begin(); it != cmap_builders->end();) { if (it->second->cmap_id() == CMapTable::WINDOWS_BMP) { ++it; } else { cmap_builders->erase(it++); } } ASSERT_EQ(cmap_builders->size(), (uint32_t)1); Font* font = font_builder->Build(); CMapTablePtr cmap_table = down_cast<CMapTable*>(font->GetTable(Tag::cmap)); ASSERT_EQ(1, cmap_table->NumCMaps()); CMapTable::CMapPtr cmap; cmap.Attach(cmap_table->GetCMap(CMapTable::WINDOWS_BMP)); ASSERT_EQ(CMapTable::WINDOWS_BMP, cmap->cmap_id()); delete font; } TEST(CMapEditingTest, CopyAllCMapsToNewFont) { FontArray fonts; FontFactoryPtr font_factory; font_factory.Attach(FontFactory::GetInstance()); LoadFont(SAMPLE_TTF_FILE, font_factory, &fonts); ASSERT_FALSE(fonts.empty()); ASSERT_FALSE(fonts[0] == NULL); FontPtr font = fonts[0]; CMapTablePtr cmap_table = down_cast<CMapTable*>(font->GetTable(Tag::cmap)); FontBuilderPtr font_builder; font_builder.Attach(font_factory->NewFontBuilder()); Ptr<CMapTable::Builder> cmap_table_builder = (CMapTable::Builder*)font_builder->NewTableBuilder(Tag::cmap); CMapTable::CMapIterator cmap_iter(cmap_table, NULL); while (cmap_iter.HasNext()) { CMapTable::CMapPtr cmap; cmap.Attach(cmap_iter.Next()); if (!cmap) continue; cmap_table_builder->NewCMapBuilder(cmap->cmap_id(), cmap->ReadFontData()); } FontPtr new_font; new_font.Attach(font_builder->Build()); CMapTablePtr new_cmap_table = down_cast<CMapTable*>(font->GetTable(Tag::cmap)); ASSERT_EQ(cmap_table->NumCMaps(), new_cmap_table->NumCMaps()); CMapTable::CMapPtr cmap; cmap.Attach(cmap_table->GetCMap(CMapTable::WINDOWS_BMP)); ASSERT_NE(cmap, reinterpret_cast<CMapTable::CMap*>(NULL)); ASSERT_EQ(CMapTable::WINDOWS_BMP, cmap->cmap_id()); } }