130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/* 230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved. 330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License"); 530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License. 630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at 730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * http://www.apache.org/licenses/LICENSE-2.0 930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software 1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS, 1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and 1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License. 1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// type.h needs to be included first because of building issues on Windows 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Type aliases we delcare are defined in other headers and make the build 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// fail otherwise. 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/type.h" 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <assert.h> 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <stdio.h> 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <unicode/ucnv.h> 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <iostream> 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <string> 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "gtest/gtest.h" 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/memory_byte_array.h" 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/font.h" 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/font_factory.h" 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/core/cmap_table.h" 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/core/font_header_table.h" 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/tag.h" 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "test/autogenerated/cmap_test_data.h" 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "test/test_font_utils.h" 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "test/test_utils.h" 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "test/test_xml_utils.h" 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly { 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if GTEST_HAS_PARAM_TEST 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunusing ::testing::TestWithParam; 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunusing ::testing::Values; 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass CMapBasicTests : public :: testing::TestWithParam<const char*> { 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CMapBasicTests() {} 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SetUp(); 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void TearDown() {} 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Ptr<CMapTable> cmap_table_; 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDocument document_; 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CMapBasicTests::SetUp() { 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Loading the font 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Ptr<FontFactory> font_factory; 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun font_factory.Attach(FontFactory::GetInstance()); 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontArray font_array; 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun std::string font_name = "../../"; 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (WIN32) 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun font_name += "../"; 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun font_name += std::string(GetParam()); 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun LoadFont(font_name.c_str(), font_factory, &font_array); 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ASSERT_FALSE(font_array.empty()); 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Ptr<Font> font = font_array.at(0); 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ASSERT_NE(font, reinterpret_cast<Font*>(NULL)); 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun cmap_table_ = down_cast<CMapTable*>(font->GetTable(Tag::cmap)); 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (!cmap_table_) 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun fprintf(stderr, "No CMap: %s\n", font_name.c_str()); 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ASSERT_NE(cmap_table_, reinterpret_cast<CMapTable*>(NULL)); 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Loading the XML file 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun document_ = TiXmlDocument((font_name + ".xml").c_str()); 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ASSERT_TRUE(document_.LoadFile()); 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTEST_P(CMapBasicTests, BasicTest) { 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNodeVector* cmap_table = GetNodesWithName(&document_, "cmap_table"); 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // A font can only have one CMap table 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ASSERT_EQ(cmap_table->size(), (size_t)1); 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNodeVector* cmaps = GetNodesWithName(cmap_table->at(0), "cmap"); 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlAttribute* num_cmaps_attr = GetAttribute(cmap_table->at(0), 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun "num_cmaps"); 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ASSERT_NE(num_cmaps_attr, reinterpret_cast<TiXmlAttribute*>(NULL)); 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // But there may be more than one CMap in this table 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ASSERT_LE(cmaps->size(), (size_t)num_cmaps_attr->IntValue()); 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (TiXmlNodeVector::iterator it = cmaps->begin(); 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun it != cmaps->end(); ++it) { 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t platform_id = GetAttribute(*it, "platform_id")->IntValue(); 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t encoding_id = GetAttribute(*it, "encoding_id")->IntValue(); 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Ptr<CMapTable::CMap> cmap; 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun cmap.Attach(cmap_table_->GetCMap(platform_id, encoding_id)); 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (!cmap) { 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun fprintf(stderr, "Cannot test unsupported CMapFormat%d\n", 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun GetAttribute(*it, "format")->IntValue()); 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun continue; 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ASSERT_EQ(cmap->platform_id(), platform_id); 10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ASSERT_EQ(cmap->encoding_id(), encoding_id); 10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNodeVector* maps = GetNodesWithName(*it, "map"); 10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (TiXmlNodeVector::iterator jt = maps->begin(); 10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun jt != maps->end(); ++jt) { 10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t character; 10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (WIN32) 10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun sscanf_s(GetAttribute(*jt, "char")->Value(), "%x", &character); 11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else 11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun sscanf(GetAttribute(*jt, "char")->Value(), "%x", &character); 11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t glyph_id = GetAttribute(*jt, "gid")->IntValue(); 11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ASSERT_EQ(cmap->GlyphId(character), glyph_id); 11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun delete maps; 11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun delete cmaps; 11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun delete cmap_table; 12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunINSTANTIATE_TEST_CASE_P(CMapBasicTests, 12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CMapBasicTests, 12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ::testing::ValuesIn(cmap_test_data::kAllTests)); 12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else 12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTEST(DummyTest, ValueParameterizedTestsAreNotSupportedOnThisPlatform) {} 12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif // GTEST_HAS_PARAM 13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 132