1705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka/* 2705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * Copyright (C) 2018 The Android Open Source Project 3705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * 4705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License"); 5705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * you may not use this file except in compliance with the License. 6705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * You may obtain a copy of the License at 7705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * 8705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * http://www.apache.org/licenses/LICENSE-2.0 9705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * 10705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * Unless required by applicable law or agreed to in writing, software 11705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS, 12705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * See the License for the specific language governing permissions and 14705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * limitations under the License. 15705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka */ 16705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 17705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka#include "minikin/Layout.h" 18705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 19705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka#include <gtest/gtest.h> 20705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 213da4269e6097e0dafdb438c760dafdde13feda95Seigo Nonaka#include "minikin/LayoutCache.h" 223da4269e6097e0dafdb438c760dafdde13feda95Seigo Nonaka 23705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka#include "FontTestUtils.h" 243da4269e6097e0dafdb438c760dafdde13feda95Seigo Nonaka#include "LocaleListCache.h" 25705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka#include "UnicodeUtils.h" 26705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 27705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonakanamespace minikin { 28705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 29705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonakaclass TestableLayoutCache : public LayoutCache { 30705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonakapublic: 31705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka TestableLayoutCache(uint32_t maxEntries) : LayoutCache(maxEntries) {} 32705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka}; 33705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 34705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonakaclass LayoutCapture { 35705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonakapublic: 36705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka LayoutCapture() {} 37705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 38705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka void operator()(const Layout& layout) { mLayout = &layout; } 39705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 40705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka const Layout* get() const { return mLayout; } 41705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 42705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonakaprivate: 43705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka const Layout* mLayout; 44705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka}; 45705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 46705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo NonakaTEST(LayoutCacheTest, cacheHitTest) { 47705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto text = utf8ToUtf16("android"); 48705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka Range range(0, text.size()); 49705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint(buildFontCollection("Ascii.ttf")); 50705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 51705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka TestableLayoutCache layoutCache(10); 52705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 53705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka LayoutCapture layout1; 54705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text, range, paint, false /* LTR */, StartHyphenEdit::NO_EDIT, 55705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EndHyphenEdit::NO_EDIT, layout1); 56705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 57705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka LayoutCapture layout2; 58705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text, range, paint, false /* LTR */, StartHyphenEdit::NO_EDIT, 59705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EndHyphenEdit::NO_EDIT, layout2); 60705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 61705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_EQ(layout1.get(), layout2.get()); 62705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka} 63705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 64705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo NonakaTEST(LayoutCacheTest, cacheMissTest) { 65705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto text1 = utf8ToUtf16("android"); 66705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto text2 = utf8ToUtf16("ANDROID"); 67705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint(buildFontCollection("Ascii.ttf")); 68705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 69705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka TestableLayoutCache layoutCache(10); 70705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 71705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka LayoutCapture layout1; 72705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka LayoutCapture layout2; 73705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 74705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 75705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different text"); 76705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */, 77705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 78705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text2, Range(0, text2.size()), paint, false /* LTR */, 79705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 80705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 81705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 82705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 83705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different range"); 84705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */, 85705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 86705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(1, text1.size()), paint, false /* LTR */, 87705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 88705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 89705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 90705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 91705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different text"); 92705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */, 93705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 94705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text2, Range(0, text2.size()), paint, false /* LTR */, 95705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 96705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 97705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 98705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 99705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different direction"); 100705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */, 101705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 102705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, true /* RTL */, 103705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 104705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 105705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 106705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 107705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different start hyphenation"); 108705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */, 109705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 110705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */, 111705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::INSERT_HYPHEN, EndHyphenEdit::NO_EDIT, layout2); 112705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 113705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 114705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 115705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different end hyphen"); 116705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */, 117705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 118705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */, 119705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::INSERT_HYPHEN, layout2); 120705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 121705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 122705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 123705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different collection"); 124705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint1(buildFontCollection("Ascii.ttf")); 125705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */, 126705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 127705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint2(buildFontCollection("Emoji.ttf")); 128705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */, 129705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 130705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 131705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 132705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 133705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different size"); 134705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto collection = buildFontCollection("Ascii.ttf"); 135705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint1(collection); 136705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint1.size = 10.0f; 137705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */, 138705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 139705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint2(collection); 140705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint2.size = 20.0f; 141705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */, 142705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 143705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 144705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 145705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 146705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different scale X"); 147705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto collection = buildFontCollection("Ascii.ttf"); 148705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint1(collection); 149705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint1.scaleX = 1.0f; 150705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */, 151705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 152705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint2(collection); 153705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint2.scaleX = 2.0f; 154705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */, 155705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 156705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 157705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 158705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 159705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different skew X"); 160705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto collection = buildFontCollection("Ascii.ttf"); 161705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint1(collection); 162705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint1.skewX = 1.0f; 163705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */, 164705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 165705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint2(collection); 166705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint2.skewX = 2.0f; 167705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */, 168705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 169705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 170705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 171705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 172705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different letter spacing"); 173705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto collection = buildFontCollection("Ascii.ttf"); 174705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint1(collection); 175705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint1.letterSpacing = 0.0f; 176705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */, 177705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 178705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint2(collection); 179705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint2.letterSpacing = 1.0f; 180705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */, 181705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 182705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 183705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 184705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 185705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different word spacing"); 186705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto collection = buildFontCollection("Ascii.ttf"); 187705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint1(collection); 188705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint1.wordSpacing = 0.0f; 189705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */, 190705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 191705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint2(collection); 192705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint2.wordSpacing = 1.0f; 193705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */, 194705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 195705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 196705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 197705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 198705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different paint flags"); 199705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto collection = buildFontCollection("Ascii.ttf"); 200705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint1(collection); 201705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint1.paintFlags = 0; 202705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */, 203705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 204705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint2(collection); 205705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint2.paintFlags = LinearTextFlag; 206705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */, 207705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 208705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 209705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 210705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 211705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different locale list ID"); 212705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto collection = buildFontCollection("Ascii.ttf"); 213705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint1(collection); 214705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint1.localeListId = LocaleListCache::getId("en-US"); 215705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */, 216705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 217705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint2(collection); 218705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint2.localeListId = LocaleListCache::getId("ja-JP"); 219705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */, 220705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 221705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 222705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 223705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 224705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different family variant"); 225705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto collection = buildFontCollection("Ascii.ttf"); 226705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint1(collection); 227705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint1.familyVariant = FontFamily::Variant::DEFAULT; 228705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */, 229705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 230705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint2(collection); 231705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint2.familyVariant = FontFamily::Variant::COMPACT; 232705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */, 233705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 234705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 235705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 236705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka { 237705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka SCOPED_TRACE("Different font feature settings"); 238705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto collection = buildFontCollection("Ascii.ttf"); 239705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint1(collection); 240705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint1.fontFeatureSettings = ""; 241705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */, 242705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1); 243705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint2(collection); 244705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka paint2.fontFeatureSettings = "'liga' on"; 245705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */, 246705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 247705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout2.get()); 248705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 249705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka} 250705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 251705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo NonakaTEST(LayoutCacheTest, cacheOverflowTest) { 252705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto text = utf8ToUtf16("android"); 253705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka Range range(0, text.size()); 254705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka MinikinPaint paint(buildFontCollection("Ascii.ttf")); 255705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 256705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka TestableLayoutCache layoutCache(5); 257705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 258705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka LayoutCapture layout1; 259705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text, range, paint, false /* LTR */, StartHyphenEdit::NO_EDIT, 260705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EndHyphenEdit::NO_EDIT, layout1); 261705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 262705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka for (char c = 'a'; c <= 'z'; c++) { 263705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka auto text1 = utf8ToUtf16(std::string(c, 10)); 264705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka LayoutCapture layout2; 265705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */, 266705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2); 267705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka } 268705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 269705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka LayoutCapture layout3; 270705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka layoutCache.getOrCreate(text, range, paint, false /* LTR */, StartHyphenEdit::NO_EDIT, 271705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EndHyphenEdit::NO_EDIT, layout3); 272705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka EXPECT_NE(layout1.get(), layout3.get()); 273705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka} 274705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka 275705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka} // namespace minikin 276