19196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka/* 29196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * Copyright (C) 2017 The Android Open Source Project 39196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * 49196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License"); 59196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * you may not use this file except in compliance with the License. 69196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * You may obtain a copy of the License at 79196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * 89196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * http://www.apache.org/licenses/LICENSE-2.0 99196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * 109196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * Unless required by applicable law or agreed to in writing, software 119196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS, 129196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * See the License for the specific language governing permissions and 149196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * limitations under the License. 159196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka */ 169196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka 179196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include <gtest/gtest.h> 189196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka 199196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include "../util/FontTestUtils.h" 209196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include "../util/MinikinFontForTest.h" 219196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include "HbFontCache.h" 229196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include "MinikinInternal.h" 239196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include "minikin/FontCollection.h" 249196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include "minikin/Layout.h" 259196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka 269196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonakanamespace minikin { 279196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka 289196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonakatypedef std::pair<std::string, int> TestParam; 299196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka 309196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonakaclass FontFamilyHarfBuzzCompatibilityTest : public ::testing::TestWithParam<TestParam> {}; 319196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka 329196194d76e4325c5bb0c23f22a5787a717067edSeigo NonakaTEST_P(FontFamilyHarfBuzzCompatibilityTest, CoverageTest) { 339196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka const std::string& fontPath = GetParam().first; 349196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka int ttcIndex = GetParam().second; 359196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka 369196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka std::shared_ptr<MinikinFont> font(new MinikinFontForTest(fontPath, ttcIndex)); 379196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka std::shared_ptr<FontFamily> family = 389196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka std::make_shared<FontFamily>(std::vector<Font>({Font(font, FontStyle())})); 399196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka 409196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka android::AutoMutex _l(gMinikinLock); 419196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka hb_font_t* hbFont = getHbFontLocked(font.get()); 429196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka 439196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka for (uint32_t codePoint = 0; codePoint < MAX_UNICODE_CODE_POINT; ++codePoint) { 449196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka uint32_t unusedGlyph; 459196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka EXPECT_EQ(family->hasGlyph(codePoint, 0 /* variation selector */), 469196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka static_cast<bool>(hb_font_get_glyph(hbFont, codePoint, 0 /* variation selector */, 479196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka &unusedGlyph))); 489196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka } 499196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka 509196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka for (uint32_t vs = VS1; vs < VS256; ++vs) { 519196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka // Move to variation selectors supplements after variation selectors. 529196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka if (vs == VS16 + 1) { 539196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka vs = VS17; 549196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka } 559196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka for (uint32_t codePoint = 0; codePoint < MAX_UNICODE_CODE_POINT; ++codePoint) { 569196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka uint32_t unusedGlyph; 579196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka ASSERT_EQ(family->hasGlyph(codePoint, vs), 589196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka static_cast<bool>(hb_font_get_glyph(hbFont, codePoint, vs, &unusedGlyph))) 599196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka << "Inconsistent Result: " << fontPath << "#" << ttcIndex 609196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka << ": U+" << std::hex << codePoint << " U+" << std::hex << vs 619196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka << " Minikin: " << family->hasGlyph(codePoint, vs) 629196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka << " HarfBuzz: " 639196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka << static_cast<bool>(hb_font_get_glyph(hbFont, codePoint, vs, &unusedGlyph)); 649196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka 659196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka } 669196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka } 679196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka hb_font_destroy(hbFont); 689196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka} 699196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka 709196194d76e4325c5bb0c23f22a5787a717067edSeigo NonakaINSTANTIATE_TEST_CASE_P(FontFamilyTest, 719196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka FontFamilyHarfBuzzCompatibilityTest, 729196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka ::testing::Values( 739196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka TestParam("/system/fonts/NotoSansCJK-Regular.ttc", 0), 749196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka TestParam("/system/fonts/NotoColorEmoji.ttf", 0))); 759196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka} // namespace minikin 76