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