15e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka/* 25e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka * Copyright (C) 2016 The Android Open Source Project 35e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka * 45e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License"); 55e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka * you may not use this file except in compliance with the License. 65e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka * You may obtain a copy of the License at 75e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka * 85e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka * http://www.apache.org/licenses/LICENSE-2.0 95e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka * 105e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka * Unless required by applicable law or agreed to in writing, software 115e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS, 125e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka * See the License for the specific language governing permissions and 145e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka * limitations under the License. 155e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka */ 161d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka 171d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include "minikin/FontCollection.h" 185e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 19dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka#include <memory> 20dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka 211d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include <benchmark/benchmark.h> 221d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka 23b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka#include "minikin/LocaleList.h" 246c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka 251d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include "FontTestUtils.h" 261d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include "MinikinInternal.h" 276c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka#include "UnicodeUtils.h" 285e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 295e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonakanamespace minikin { 305e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 315e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonakaconst char* SYSTEM_FONT_PATH = "/system/fonts/"; 325e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonakaconst char* SYSTEM_FONT_XML = "/system/etc/fonts.xml"; 335e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 3480a9239d6943878f28a898537e060f821b9aa603Seigo Nonakastatic void BM_FontCollection_construct(benchmark::State& state) { 3580a9239d6943878f28a898537e060f821b9aa603Seigo Nonaka std::vector<std::shared_ptr<FontFamily>> families = 3680a9239d6943878f28a898537e060f821b9aa603Seigo Nonaka getFontFamilies(SYSTEM_FONT_PATH, SYSTEM_FONT_XML); 3780a9239d6943878f28a898537e060f821b9aa603Seigo Nonaka while (state.KeepRunning()) { 3880a9239d6943878f28a898537e060f821b9aa603Seigo Nonaka std::make_shared<FontCollection>(families); 3980a9239d6943878f28a898537e060f821b9aa603Seigo Nonaka } 4080a9239d6943878f28a898537e060f821b9aa603Seigo Nonaka} 4180a9239d6943878f28a898537e060f821b9aa603Seigo Nonaka 4280a9239d6943878f28a898537e060f821b9aa603Seigo NonakaBENCHMARK(BM_FontCollection_construct); 4380a9239d6943878f28a898537e060f821b9aa603Seigo Nonaka 445e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonakastatic void BM_FontCollection_hasVariationSelector(benchmark::State& state) { 4554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka auto collection = 4654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka std::make_shared<FontCollection>(getFontFamilies(SYSTEM_FONT_PATH, SYSTEM_FONT_XML)); 475e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 48815bc4a8fed3670682f4af3bff7df7b582bb2f4bMartijn Coenen uint32_t baseCp = state.range(0); 49815bc4a8fed3670682f4af3bff7df7b582bb2f4bMartijn Coenen uint32_t vsCp = state.range(1); 505e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 515e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka char titleBuffer[64]; 525e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka snprintf(titleBuffer, 64, "hasVariationSelector U+%04X,U+%04X", baseCp, vsCp); 535e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka state.SetLabel(titleBuffer); 545e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 555e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka while (state.KeepRunning()) { 565e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka collection->hasVariationSelector(baseCp, vsCp); 575e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka } 585e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka} 595e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 605e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka// TODO: Rewrite with BENCHMARK_CAPTURE for better test name. 615e6bc85d69a97d8db6c068e56614aaac02da347aSeigo NonakaBENCHMARK(BM_FontCollection_hasVariationSelector) 626c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka ->ArgPair(0x2708, 0xFE0F) 636c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka ->ArgPair(0x2708, 0xFE0E) 646c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka ->ArgPair(0x3402, 0xE0100); 655e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 665e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonakastruct ItemizeTestCases { 675e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka std::string itemizeText; 685e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka std::string languageTag; 695e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka std::string labelText; 705e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka} ITEMIZE_TEST_CASES[] = { 716c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka {"'A' 'n' 'd' 'r' 'o' 'i' 'd'", "en", "English"}, 726c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka {"U+4E16", "zh-Hans", "CJK Ideograph"}, 736c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka {"U+4E16", "zh-Hans,zh-Hant,ja,en,es,pt,fr,de", 746c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka "CJK Ideograph with many language fallback"}, 756c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka {"U+3402 U+E0100", "ja", "CJK Ideograph with variation selector"}, 766c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka {"'A' 'n' U+0E1A U+0E31 U+0645 U+062D U+0648", "en", "Mixture of English, Thai and Arabic"}, 776c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka {"U+2708 U+FE0E", "en", "Emoji with variation selector"}, 786c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka {"U+0031 U+FE0F U+20E3", "en", "KEYCAP"}, 795e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka}; 805e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 815e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonakastatic void BM_FontCollection_itemize(benchmark::State& state) { 8254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka auto collection = 8354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka std::make_shared<FontCollection>(getFontFamilies(SYSTEM_FONT_PATH, SYSTEM_FONT_XML)); 845e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 85815bc4a8fed3670682f4af3bff7df7b582bb2f4bMartijn Coenen size_t testIndex = state.range(0); 869bf01f0fe114bf62fe5edaf7467d47b130690845Chih-hung Hsieh state.SetLabel("Itemize: " + ITEMIZE_TEST_CASES[testIndex].labelText); 875e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 885e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka uint16_t buffer[64]; 895e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka size_t utf16_length = 0; 906c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka ParseUnicode(buffer, 64, ITEMIZE_TEST_CASES[testIndex].itemizeText.c_str(), &utf16_length, 916c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka nullptr); 925e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka std::vector<FontCollection::Run> result; 9337dd6e7493f372fd04dadf94351ca522b56b4119Seigo Nonaka MinikinPaint paint(collection); 94538122d159ef845767ea430a5541248e85e43717Seigo Nonaka paint.localeListId = registerLocaleList(ITEMIZE_TEST_CASES[testIndex].languageTag); 955e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 965e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka while (state.KeepRunning()) { 975e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka result.clear(); 98538122d159ef845767ea430a5541248e85e43717Seigo Nonaka collection->itemize(buffer, utf16_length, paint, &result); 995e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka } 1005e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka} 1015e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 1025e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka// TODO: Rewrite with BENCHMARK_CAPTURE once it is available in Android. 1036c8722e217ff5238f0b849152d7936959a728103Seigo NonakaBENCHMARK(BM_FontCollection_itemize)->Arg(0)->Arg(1)->Arg(2)->Arg(3)->Arg(4)->Arg(5)->Arg(6); 1045e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka 1055e6bc85d69a97d8db6c068e56614aaac02da347aSeigo Nonaka} // namespace minikin 106